Commit 9c084dae authored by Jean Delvare's avatar Jean Delvare Committed by Jean Delvare

hwmon: (max6650) Properly support the MAX6650

The MAX6650 has only one fan input.
Signed-off-by: default avatarJean Delvare <khali@linux-fr.org>
Acked-by: default avatar"Hans J. Koch" <hjk@hansjkoch.de>
Acked-by: default avatarGuenter Roeck <guenter.roeck@ericsson.com>
parent 67b670ff
...@@ -2,10 +2,14 @@ Kernel driver max6650 ...@@ -2,10 +2,14 @@ Kernel driver max6650
===================== =====================
Supported chips: Supported chips:
* Maxim 6650 / 6651 * Maxim MAX6650
Prefix: 'max6650' Prefix: 'max6650'
Addresses scanned: none Addresses scanned: none
Datasheet: http://pdfserv.maxim-ic.com/en/ds/MAX6650-MAX6651.pdf Datasheet: http://pdfserv.maxim-ic.com/en/ds/MAX6650-MAX6651.pdf
* Maxim MAX6651
Prefix: 'max6651'
Addresses scanned: none
Datasheet: http://pdfserv.maxim-ic.com/en/ds/MAX6650-MAX6651.pdf
Authors: Authors:
Hans J. Koch <hjk@hansjkoch.de> Hans J. Koch <hjk@hansjkoch.de>
...@@ -15,10 +19,10 @@ Authors: ...@@ -15,10 +19,10 @@ Authors:
Description Description
----------- -----------
This driver implements support for the Maxim 6650/6651 This driver implements support for the Maxim MAX6650 and MAX6651.
The 2 devices are very similar, but the Maxim 6550 has a reduced feature The 2 devices are very similar, but the MAX6550 has a reduced feature
set, e.g. only one fan-input, instead of 4 for the 6651. set, e.g. only one fan-input, instead of 4 for the MAX6651.
The driver is not able to distinguish between the 2 devices. The driver is not able to distinguish between the 2 devices.
......
...@@ -116,7 +116,8 @@ static struct max6650_data *max6650_update_device(struct device *dev); ...@@ -116,7 +116,8 @@ static struct max6650_data *max6650_update_device(struct device *dev);
*/ */
static const struct i2c_device_id max6650_id[] = { static const struct i2c_device_id max6650_id[] = {
{ "max6650", 0 }, { "max6650", 1 },
{ "max6651", 4 },
{ } { }
}; };
MODULE_DEVICE_TABLE(i2c, max6650_id); MODULE_DEVICE_TABLE(i2c, max6650_id);
...@@ -138,6 +139,7 @@ struct max6650_data ...@@ -138,6 +139,7 @@ struct max6650_data
{ {
struct device *hwmon_dev; struct device *hwmon_dev;
struct mutex update_lock; struct mutex update_lock;
int nr_fans;
char valid; /* zero until following fields are valid */ char valid; /* zero until following fields are valid */
unsigned long last_updated; /* in jiffies */ unsigned long last_updated; /* in jiffies */
...@@ -489,9 +491,6 @@ static mode_t max6650_attrs_visible(struct kobject *kobj, struct attribute *a, ...@@ -489,9 +491,6 @@ static mode_t max6650_attrs_visible(struct kobject *kobj, struct attribute *a,
static struct attribute *max6650_attrs[] = { static struct attribute *max6650_attrs[] = {
&sensor_dev_attr_fan1_input.dev_attr.attr, &sensor_dev_attr_fan1_input.dev_attr.attr,
&sensor_dev_attr_fan2_input.dev_attr.attr,
&sensor_dev_attr_fan3_input.dev_attr.attr,
&sensor_dev_attr_fan4_input.dev_attr.attr,
&dev_attr_fan1_target.attr, &dev_attr_fan1_target.attr,
&dev_attr_fan1_div.attr, &dev_attr_fan1_div.attr,
&dev_attr_pwm1_enable.attr, &dev_attr_pwm1_enable.attr,
...@@ -509,6 +508,17 @@ static struct attribute_group max6650_attr_grp = { ...@@ -509,6 +508,17 @@ static struct attribute_group max6650_attr_grp = {
.is_visible = max6650_attrs_visible, .is_visible = max6650_attrs_visible,
}; };
static struct attribute *max6651_attrs[] = {
&sensor_dev_attr_fan2_input.dev_attr.attr,
&sensor_dev_attr_fan3_input.dev_attr.attr,
&sensor_dev_attr_fan4_input.dev_attr.attr,
NULL
};
static const struct attribute_group max6651_attr_grp = {
.attrs = max6651_attrs,
};
/* /*
* Real code * Real code
*/ */
...@@ -526,6 +536,7 @@ static int max6650_probe(struct i2c_client *client, ...@@ -526,6 +536,7 @@ static int max6650_probe(struct i2c_client *client,
i2c_set_clientdata(client, data); i2c_set_clientdata(client, data);
mutex_init(&data->update_lock); mutex_init(&data->update_lock);
data->nr_fans = id->driver_data;
/* /*
* Initialize the max6650 chip * Initialize the max6650 chip
...@@ -537,6 +548,12 @@ static int max6650_probe(struct i2c_client *client, ...@@ -537,6 +548,12 @@ static int max6650_probe(struct i2c_client *client,
err = sysfs_create_group(&client->dev.kobj, &max6650_attr_grp); err = sysfs_create_group(&client->dev.kobj, &max6650_attr_grp);
if (err) if (err)
goto err_free; goto err_free;
/* 3 additional fan inputs for the MAX6651 */
if (data->nr_fans == 4) {
err = sysfs_create_group(&client->dev.kobj, &max6651_attr_grp);
if (err)
goto err_remove;
}
data->hwmon_dev = hwmon_device_register(&client->dev); data->hwmon_dev = hwmon_device_register(&client->dev);
if (!IS_ERR(data->hwmon_dev)) if (!IS_ERR(data->hwmon_dev))
...@@ -544,6 +561,9 @@ static int max6650_probe(struct i2c_client *client, ...@@ -544,6 +561,9 @@ static int max6650_probe(struct i2c_client *client,
err = PTR_ERR(data->hwmon_dev); err = PTR_ERR(data->hwmon_dev);
dev_err(&client->dev, "error registering hwmon device.\n"); dev_err(&client->dev, "error registering hwmon device.\n");
if (data->nr_fans == 4)
sysfs_remove_group(&client->dev.kobj, &max6651_attr_grp);
err_remove:
sysfs_remove_group(&client->dev.kobj, &max6650_attr_grp); sysfs_remove_group(&client->dev.kobj, &max6650_attr_grp);
err_free: err_free:
kfree(data); kfree(data);
...@@ -554,8 +574,10 @@ static int max6650_remove(struct i2c_client *client) ...@@ -554,8 +574,10 @@ static int max6650_remove(struct i2c_client *client)
{ {
struct max6650_data *data = i2c_get_clientdata(client); struct max6650_data *data = i2c_get_clientdata(client);
sysfs_remove_group(&client->dev.kobj, &max6650_attr_grp);
hwmon_device_unregister(data->hwmon_dev); hwmon_device_unregister(data->hwmon_dev);
if (data->nr_fans == 4)
sysfs_remove_group(&client->dev.kobj, &max6651_attr_grp);
sysfs_remove_group(&client->dev.kobj, &max6650_attr_grp);
kfree(data); kfree(data);
return 0; return 0;
} }
...@@ -668,7 +690,7 @@ static struct max6650_data *max6650_update_device(struct device *dev) ...@@ -668,7 +690,7 @@ static struct max6650_data *max6650_update_device(struct device *dev)
MAX6650_REG_SPEED); MAX6650_REG_SPEED);
data->config = i2c_smbus_read_byte_data(client, data->config = i2c_smbus_read_byte_data(client,
MAX6650_REG_CONFIG); MAX6650_REG_CONFIG);
for (i = 0; i < 4; i++) { for (i = 0; i < data->nr_fans; i++) {
data->tach[i] = i2c_smbus_read_byte_data(client, data->tach[i] = i2c_smbus_read_byte_data(client,
tach_reg[i]); tach_reg[i]);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment