From 964f945b5e51c58f48ce21fd529a0ec3697b18b0 Mon Sep 17 00:00:00 2001 From: Jean Delvare Date: Fri, 4 Apr 2014 18:01:32 +0200 Subject: hwmon: (f71805f) Fix author's address The original address was incomplete, and this caused it to be missed by the recent update to my new address. Signed-off-by: Jean Delvare --- drivers/hwmon/f71805f.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/hwmon') diff --git a/drivers/hwmon/f71805f.c b/drivers/hwmon/f71805f.c index 1a8aa1265262..32f5132c4652 100644 --- a/drivers/hwmon/f71805f.c +++ b/drivers/hwmon/f71805f.c @@ -1648,7 +1648,7 @@ static void __exit f71805f_exit(void) platform_driver_unregister(&f71805f_driver); } -MODULE_AUTHOR("Jean Delvare "); +MODULE_AUTHOR("Jean Delvare "); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("F71805F/F71872F hardware monitoring driver"); -- cgit v1.2.3-55-g7522 From 0dcb28a1520f1a058058886b5c7510bb1cc0ef60 Mon Sep 17 00:00:00 2001 From: Guenter Roeck Date: Fri, 4 Apr 2014 18:01:32 +0200 Subject: hwmon: (lm63) Add additional sysfs group for temp2_type attribute With the new hwmon API, we can only add groups of attributes, not individual attributes. To prepare for the use of the new API, add an additional sensor group for the temp2_type attribute and register it with sysfs_create_group instead of device_create_file. Signed-off-by: Guenter Roeck Signed-off-by: Jean Delvare --- drivers/hwmon/lm63.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) (limited to 'drivers/hwmon') diff --git a/drivers/hwmon/lm63.c b/drivers/hwmon/lm63.c index b4ad598feb6c..7ff4fc7c6dbd 100644 --- a/drivers/hwmon/lm63.c +++ b/drivers/hwmon/lm63.c @@ -915,6 +915,15 @@ static struct attribute *lm63_attributes[] = { NULL }; +static struct attribute *lm63_attributes_temp2_type[] = { + &dev_attr_temp2_type.attr, + NULL +}; + +static const struct attribute_group lm63_group_temp2_type = { + .attrs = lm63_attributes_temp2_type, +}; + static struct attribute *lm63_attributes_extra_lut[] = { &sensor_dev_attr_pwm1_auto_point9_pwm.dev_attr.attr, &sensor_dev_attr_pwm1_auto_point9_temp.dev_attr.attr, @@ -1133,7 +1142,8 @@ static int lm63_probe(struct i2c_client *client, goto exit_remove_files; } if (data->kind == lm96163) { - err = device_create_file(&client->dev, &dev_attr_temp2_type); + err = sysfs_create_group(&client->dev.kobj, + &lm63_group_temp2_type); if (err) goto exit_remove_files; @@ -1155,7 +1165,7 @@ exit_remove_files: sysfs_remove_group(&client->dev.kobj, &lm63_group); sysfs_remove_group(&client->dev.kobj, &lm63_group_fan1); if (data->kind == lm96163) { - device_remove_file(&client->dev, &dev_attr_temp2_type); + sysfs_remove_group(&client->dev.kobj, &lm63_group_temp2_type); sysfs_remove_group(&client->dev.kobj, &lm63_group_extra_lut); } return err; @@ -1169,7 +1179,7 @@ static int lm63_remove(struct i2c_client *client) sysfs_remove_group(&client->dev.kobj, &lm63_group); sysfs_remove_group(&client->dev.kobj, &lm63_group_fan1); if (data->kind == lm96163) { - device_remove_file(&client->dev, &dev_attr_temp2_type); + sysfs_remove_group(&client->dev.kobj, &lm63_group_temp2_type); sysfs_remove_group(&client->dev.kobj, &lm63_group_extra_lut); } -- cgit v1.2.3-55-g7522 From 2fd638feb6b39cbbc10989a57a25c868fe65b118 Mon Sep 17 00:00:00 2001 From: Guenter Roeck Date: Fri, 4 Apr 2014 18:01:33 +0200 Subject: hwmon: (lm63) Introduce 'dev' variable to point to client->dev client->dev is used multiple times in several functions. Introduce dev variable pointing to it to simplify the code. Signed-off-by: Guenter Roeck Signed-off-by: Jean Delvare --- drivers/hwmon/lm63.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) (limited to 'drivers/hwmon') diff --git a/drivers/hwmon/lm63.c b/drivers/hwmon/lm63.c index 7ff4fc7c6dbd..55b7d98cb742 100644 --- a/drivers/hwmon/lm63.c +++ b/drivers/hwmon/lm63.c @@ -1038,6 +1038,7 @@ static int lm63_detect(struct i2c_client *client, static void lm63_init_client(struct i2c_client *client) { struct lm63_data *data = i2c_get_clientdata(client); + struct device *dev = &client->dev; u8 convrate; data->config = i2c_smbus_read_byte_data(client, LM63_REG_CONFIG1); @@ -1046,7 +1047,7 @@ static void lm63_init_client(struct i2c_client *client) /* Start converting if needed */ if (data->config & 0x40) { /* standby */ - dev_dbg(&client->dev, "Switching to operational mode\n"); + dev_dbg(dev, "Switching to operational mode\n"); data->config &= 0xA7; i2c_smbus_write_byte_data(client, LM63_REG_CONFIG1, data->config); @@ -1099,13 +1100,13 @@ static void lm63_init_client(struct i2c_client *client) /* Show some debug info about the LM63 configuration */ if (data->kind == lm63) - dev_dbg(&client->dev, "Alert/tach pin configured for %s\n", + dev_dbg(dev, "Alert/tach pin configured for %s\n", (data->config & 0x04) ? "tachometer input" : "alert output"); - dev_dbg(&client->dev, "PWM clock %s kHz, output frequency %u Hz\n", + dev_dbg(dev, "PWM clock %s kHz, output frequency %u Hz\n", (data->config_fan & 0x08) ? "1.4" : "360", ((data->config_fan & 0x08) ? 700 : 180000) / data->pwm1_freq); - dev_dbg(&client->dev, "PWM output active %s, %s mode\n", + dev_dbg(dev, "PWM output active %s, %s mode\n", (data->config_fan & 0x10) ? "low" : "high", (data->config_fan & 0x20) ? "manual" : "auto"); } @@ -1113,10 +1114,11 @@ static void lm63_init_client(struct i2c_client *client) static int lm63_probe(struct i2c_client *client, const struct i2c_device_id *id) { + struct device *dev = &client->dev; struct lm63_data *data; int err; - data = devm_kzalloc(&client->dev, sizeof(struct lm63_data), GFP_KERNEL); + data = devm_kzalloc(dev, sizeof(struct lm63_data), GFP_KERNEL); if (!data) return -ENOMEM; @@ -1133,27 +1135,25 @@ static int lm63_probe(struct i2c_client *client, lm63_init_client(client); /* Register sysfs hooks */ - err = sysfs_create_group(&client->dev.kobj, &lm63_group); + err = sysfs_create_group(&dev->kobj, &lm63_group); if (err) return err; if (data->config & 0x04) { /* tachometer enabled */ - err = sysfs_create_group(&client->dev.kobj, &lm63_group_fan1); + err = sysfs_create_group(&dev->kobj, &lm63_group_fan1); if (err) goto exit_remove_files; } if (data->kind == lm96163) { - err = sysfs_create_group(&client->dev.kobj, - &lm63_group_temp2_type); + err = sysfs_create_group(&dev->kobj, &lm63_group_temp2_type); if (err) goto exit_remove_files; - err = sysfs_create_group(&client->dev.kobj, - &lm63_group_extra_lut); + err = sysfs_create_group(&dev->kobj, &lm63_group_extra_lut); if (err) goto exit_remove_files; } - data->hwmon_dev = hwmon_device_register(&client->dev); + data->hwmon_dev = hwmon_device_register(dev); if (IS_ERR(data->hwmon_dev)) { err = PTR_ERR(data->hwmon_dev); goto exit_remove_files; @@ -1162,11 +1162,11 @@ static int lm63_probe(struct i2c_client *client, return 0; exit_remove_files: - sysfs_remove_group(&client->dev.kobj, &lm63_group); - sysfs_remove_group(&client->dev.kobj, &lm63_group_fan1); + sysfs_remove_group(&dev->kobj, &lm63_group); + sysfs_remove_group(&dev->kobj, &lm63_group_fan1); if (data->kind == lm96163) { - sysfs_remove_group(&client->dev.kobj, &lm63_group_temp2_type); - sysfs_remove_group(&client->dev.kobj, &lm63_group_extra_lut); + sysfs_remove_group(&dev->kobj, &lm63_group_temp2_type); + sysfs_remove_group(&dev->kobj, &lm63_group_extra_lut); } return err; } -- cgit v1.2.3-55-g7522 From b76552b310645fddd76dad5e87d0e8eb3d15e4de Mon Sep 17 00:00:00 2001 From: Guenter Roeck Date: Fri, 4 Apr 2014 18:01:33 +0200 Subject: hwmon: (lm63) Create all sysfs groups in one call We can create all sysfs groups in one call by using sysfs_create_groups instead of using sysfs_create_group individually for each group. Signed-off-by: Guenter Roeck Signed-off-by: Jean Delvare --- drivers/hwmon/lm63.c | 42 ++++++++++++++---------------------------- 1 file changed, 14 insertions(+), 28 deletions(-) (limited to 'drivers/hwmon') diff --git a/drivers/hwmon/lm63.c b/drivers/hwmon/lm63.c index 55b7d98cb742..7dc4873b343f 100644 --- a/drivers/hwmon/lm63.c +++ b/drivers/hwmon/lm63.c @@ -157,6 +157,7 @@ enum chips { lm63, lm64, lm96163 }; struct lm63_data { struct device *hwmon_dev; struct mutex update_lock; + const struct attribute_group *groups[5]; char valid; /* zero until following fields are valid */ char lut_valid; /* zero until lut fields are valid */ unsigned long last_updated; /* in jiffies */ @@ -1116,6 +1117,7 @@ static int lm63_probe(struct i2c_client *client, { struct device *dev = &client->dev; struct lm63_data *data; + int groups = 0; int err; data = devm_kzalloc(dev, sizeof(struct lm63_data), GFP_KERNEL); @@ -1135,24 +1137,19 @@ static int lm63_probe(struct i2c_client *client, lm63_init_client(client); /* Register sysfs hooks */ - err = sysfs_create_group(&dev->kobj, &lm63_group); - if (err) - return err; - if (data->config & 0x04) { /* tachometer enabled */ - err = sysfs_create_group(&dev->kobj, &lm63_group_fan1); - if (err) - goto exit_remove_files; - } - if (data->kind == lm96163) { - err = sysfs_create_group(&dev->kobj, &lm63_group_temp2_type); - if (err) - goto exit_remove_files; + data->groups[groups++] = &lm63_group; + if (data->config & 0x04) /* tachometer enabled */ + data->groups[groups++] = &lm63_group_fan1; - err = sysfs_create_group(&dev->kobj, &lm63_group_extra_lut); - if (err) - goto exit_remove_files; + if (data->kind == lm96163) { + data->groups[groups++] = &lm63_group_temp2_type; + data->groups[groups++] = &lm63_group_extra_lut; } + err = sysfs_create_groups(&dev->kobj, data->groups); + if (err) + return err; + data->hwmon_dev = hwmon_device_register(dev); if (IS_ERR(data->hwmon_dev)) { err = PTR_ERR(data->hwmon_dev); @@ -1162,12 +1159,7 @@ static int lm63_probe(struct i2c_client *client, return 0; exit_remove_files: - sysfs_remove_group(&dev->kobj, &lm63_group); - sysfs_remove_group(&dev->kobj, &lm63_group_fan1); - if (data->kind == lm96163) { - sysfs_remove_group(&dev->kobj, &lm63_group_temp2_type); - sysfs_remove_group(&dev->kobj, &lm63_group_extra_lut); - } + sysfs_remove_groups(&dev->kobj, data->groups); return err; } @@ -1176,13 +1168,7 @@ static int lm63_remove(struct i2c_client *client) struct lm63_data *data = i2c_get_clientdata(client); hwmon_device_unregister(data->hwmon_dev); - sysfs_remove_group(&client->dev.kobj, &lm63_group); - sysfs_remove_group(&client->dev.kobj, &lm63_group_fan1); - if (data->kind == lm96163) { - sysfs_remove_group(&client->dev.kobj, &lm63_group_temp2_type); - sysfs_remove_group(&client->dev.kobj, &lm63_group_extra_lut); - } - + sysfs_remove_groups(&client->dev.kobj, data->groups); return 0; } -- cgit v1.2.3-55-g7522 From e19eea84078dfa5ab63c661b3d4367c8621590e0 Mon Sep 17 00:00:00 2001 From: Guenter Roeck Date: Fri, 4 Apr 2014 18:01:33 +0200 Subject: hwmon: (lm63) Convert to use devm_hwmon_device_register_with_groups Simplify code, reduce code size, attach hwmon attributes to hwmon device. Signed-off-by: Guenter Roeck Signed-off-by: Jean Delvare --- drivers/hwmon/lm63.c | 106 +++++++++++++++++++-------------------------------- 1 file changed, 40 insertions(+), 66 deletions(-) (limited to 'drivers/hwmon') diff --git a/drivers/hwmon/lm63.c b/drivers/hwmon/lm63.c index 7dc4873b343f..c5291645e5dc 100644 --- a/drivers/hwmon/lm63.c +++ b/drivers/hwmon/lm63.c @@ -155,7 +155,7 @@ enum chips { lm63, lm64, lm96163 }; */ struct lm63_data { - struct device *hwmon_dev; + struct i2c_client *client; struct mutex update_lock; const struct attribute_group *groups[5]; char valid; /* zero until following fields are valid */ @@ -219,9 +219,9 @@ static inline int lut_temp_to_reg(struct lm63_data *data, long val) * Update the lookup table register cache. * client->update_lock must be held when calling this function. */ -static void lm63_update_lut(struct i2c_client *client) +static void lm63_update_lut(struct lm63_data *data) { - struct lm63_data *data = i2c_get_clientdata(client); + struct i2c_client *client = data->client; int i; if (time_after(jiffies, data->lut_last_updated + 5 * HZ) || @@ -242,8 +242,8 @@ static void lm63_update_lut(struct i2c_client *client) static struct lm63_data *lm63_update_device(struct device *dev) { - struct i2c_client *client = to_i2c_client(dev); - struct lm63_data *data = i2c_get_clientdata(client); + struct lm63_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->client; unsigned long next_update; mutex_lock(&data->update_lock); @@ -311,7 +311,7 @@ static struct lm63_data *lm63_update_device(struct device *dev) data->valid = 1; } - lm63_update_lut(client); + lm63_update_lut(data); mutex_unlock(&data->update_lock); @@ -322,18 +322,17 @@ static struct lm63_data *lm63_update_device(struct device *dev) * Trip points in the lookup table should be in ascending order for both * temperatures and PWM output values. */ -static int lm63_lut_looks_bad(struct i2c_client *client) +static int lm63_lut_looks_bad(struct device *dev, struct lm63_data *data) { - struct lm63_data *data = i2c_get_clientdata(client); int i; mutex_lock(&data->update_lock); - lm63_update_lut(client); + lm63_update_lut(data); for (i = 1; i < data->lut_size; i++) { if (data->pwm1[1 + i - 1] > data->pwm1[1 + i] || data->temp8[3 + i - 1] > data->temp8[3 + i]) { - dev_warn(&client->dev, + dev_warn(dev, "Lookup table doesn't look sane (check entries %d and %d)\n", i, i + 1); break; @@ -359,8 +358,8 @@ static ssize_t show_fan(struct device *dev, struct device_attribute *devattr, static ssize_t set_fan(struct device *dev, struct device_attribute *dummy, const char *buf, size_t count) { - struct i2c_client *client = to_i2c_client(dev); - struct lm63_data *data = i2c_get_clientdata(client); + struct lm63_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->client; unsigned long val; int err; @@ -400,8 +399,8 @@ static ssize_t set_pwm1(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count) { struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); - struct i2c_client *client = to_i2c_client(dev); - struct lm63_data *data = i2c_get_clientdata(client); + struct lm63_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->client; int nr = attr->index; unsigned long val; int err; @@ -436,8 +435,8 @@ static ssize_t set_pwm1_enable(struct device *dev, struct device_attribute *dummy, const char *buf, size_t count) { - struct i2c_client *client = to_i2c_client(dev); - struct lm63_data *data = i2c_get_clientdata(client); + struct lm63_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->client; unsigned long val; int err; @@ -451,7 +450,7 @@ static ssize_t set_pwm1_enable(struct device *dev, * Only let the user switch to automatic mode if the lookup table * looks sane. */ - if (val == 2 && lm63_lut_looks_bad(client)) + if (val == 2 && lm63_lut_looks_bad(dev, data)) return -EPERM; mutex_lock(&data->update_lock); @@ -462,7 +461,7 @@ static ssize_t set_pwm1_enable(struct device *dev, else data->config_fan &= ~0x20; i2c_smbus_write_byte_data(client, LM63_REG_CONFIG_FAN, - data->config_fan); + data->config_fan); mutex_unlock(&data->update_lock); return count; } @@ -506,8 +505,8 @@ static ssize_t set_temp8(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count) { struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); - struct i2c_client *client = to_i2c_client(dev); - struct lm63_data *data = i2c_get_clientdata(client); + struct lm63_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->client; int nr = attr->index; long val; int err; @@ -580,8 +579,8 @@ static ssize_t set_temp11(struct device *dev, struct device_attribute *devattr, }; struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); - struct i2c_client *client = to_i2c_client(dev); - struct lm63_data *data = i2c_get_clientdata(client); + struct lm63_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->client; long val; int err; int nr = attr->index; @@ -636,8 +635,8 @@ static ssize_t set_temp2_crit_hyst(struct device *dev, struct device_attribute *dummy, const char *buf, size_t count) { - struct i2c_client *client = to_i2c_client(dev); - struct lm63_data *data = i2c_get_clientdata(client); + struct lm63_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->client; long val; int err; long hyst; @@ -658,11 +657,11 @@ static ssize_t set_temp2_crit_hyst(struct device *dev, * Set conversion rate. * client->update_lock must be held when calling this function. */ -static void lm63_set_convrate(struct i2c_client *client, struct lm63_data *data, - unsigned int interval) +static void lm63_set_convrate(struct lm63_data *data, unsigned int interval) { - int i; + struct i2c_client *client = data->client; unsigned int update_interval; + int i; /* Shift calculations to avoid rounding errors */ interval <<= 6; @@ -690,8 +689,7 @@ static ssize_t set_update_interval(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { - struct i2c_client *client = to_i2c_client(dev); - struct lm63_data *data = i2c_get_clientdata(client); + struct lm63_data *data = dev_get_drvdata(dev); unsigned long val; int err; @@ -700,7 +698,7 @@ static ssize_t set_update_interval(struct device *dev, return err; mutex_lock(&data->update_lock); - lm63_set_convrate(client, data, clamp_val(val, 0, 100000)); + lm63_set_convrate(data, clamp_val(val, 0, 100000)); mutex_unlock(&data->update_lock); return count; @@ -709,8 +707,7 @@ static ssize_t set_update_interval(struct device *dev, static ssize_t show_type(struct device *dev, struct device_attribute *attr, char *buf) { - struct i2c_client *client = to_i2c_client(dev); - struct lm63_data *data = i2c_get_clientdata(client); + struct lm63_data *data = dev_get_drvdata(dev); return sprintf(buf, data->trutherm ? "1\n" : "2\n"); } @@ -718,8 +715,8 @@ static ssize_t show_type(struct device *dev, struct device_attribute *attr, static ssize_t set_type(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { - struct i2c_client *client = to_i2c_client(dev); - struct lm63_data *data = i2c_get_clientdata(client); + struct lm63_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->client; unsigned long val; int ret; u8 reg; @@ -956,8 +953,7 @@ static umode_t lm63_attribute_mode(struct kobject *kobj, struct attribute *attr, int index) { struct device *dev = container_of(kobj, struct device, kobj); - struct i2c_client *client = to_i2c_client(dev); - struct lm63_data *data = i2c_get_clientdata(client); + struct lm63_data *data = dev_get_drvdata(dev); if (attr == &sensor_dev_attr_temp2_crit.dev_attr.attr && (data->kind == lm64 || @@ -1036,9 +1032,9 @@ static int lm63_detect(struct i2c_client *client, * Ideally we shouldn't have to initialize anything, since the BIOS * should have taken care of everything */ -static void lm63_init_client(struct i2c_client *client) +static void lm63_init_client(struct lm63_data *data) { - struct lm63_data *data = i2c_get_clientdata(client); + struct i2c_client *client = data->client; struct device *dev = &client->dev; u8 convrate; @@ -1116,15 +1112,15 @@ static int lm63_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct device *dev = &client->dev; + struct device *hwmon_dev; struct lm63_data *data; int groups = 0; - int err; data = devm_kzalloc(dev, sizeof(struct lm63_data), GFP_KERNEL); if (!data) return -ENOMEM; - i2c_set_clientdata(client, data); + data->client = client; data->valid = 0; mutex_init(&data->update_lock); @@ -1134,7 +1130,7 @@ static int lm63_probe(struct i2c_client *client, data->temp2_offset = 16000; /* Initialize chip */ - lm63_init_client(client); + lm63_init_client(data); /* Register sysfs hooks */ data->groups[groups++] = &lm63_group; @@ -1146,30 +1142,9 @@ static int lm63_probe(struct i2c_client *client, data->groups[groups++] = &lm63_group_extra_lut; } - err = sysfs_create_groups(&dev->kobj, data->groups); - if (err) - return err; - - data->hwmon_dev = hwmon_device_register(dev); - if (IS_ERR(data->hwmon_dev)) { - err = PTR_ERR(data->hwmon_dev); - goto exit_remove_files; - } - - return 0; - -exit_remove_files: - sysfs_remove_groups(&dev->kobj, data->groups); - return err; -} - -static int lm63_remove(struct i2c_client *client) -{ - struct lm63_data *data = i2c_get_clientdata(client); - - hwmon_device_unregister(data->hwmon_dev); - sysfs_remove_groups(&client->dev.kobj, data->groups); - return 0; + hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name, + data, data->groups); + return PTR_ERR_OR_ZERO(hwmon_dev); } /* @@ -1190,7 +1165,6 @@ static struct i2c_driver lm63_driver = { .name = "lm63", }, .probe = lm63_probe, - .remove = lm63_remove, .id_table = lm63_id, .detect = lm63_detect, .address_list = normal_i2c, -- cgit v1.2.3-55-g7522 From 5ec25c93e0397a02a37cb2f091da0e28fe284566 Mon Sep 17 00:00:00 2001 From: Jean Delvare Date: Fri, 4 Apr 2014 18:01:33 +0200 Subject: hwmon: (lm63) Avoid initializing the same field twice data is kzalloc'd, so data->valid is already 0. Signed-off-by: Jean Delvare Reviewed-by: Guenter Roeck --- drivers/hwmon/lm63.c | 1 - 1 file changed, 1 deletion(-) (limited to 'drivers/hwmon') diff --git a/drivers/hwmon/lm63.c b/drivers/hwmon/lm63.c index c5291645e5dc..848b9611151f 100644 --- a/drivers/hwmon/lm63.c +++ b/drivers/hwmon/lm63.c @@ -1121,7 +1121,6 @@ static int lm63_probe(struct i2c_client *client, return -ENOMEM; data->client = client; - data->valid = 0; mutex_init(&data->update_lock); /* Set the device type */ -- cgit v1.2.3-55-g7522 From c669ec8039e22fbbf0ac291d1c38eedf0a9b4b7a Mon Sep 17 00:00:00 2001 From: Guenter Roeck Date: Fri, 4 Apr 2014 18:01:34 +0200 Subject: hwmon: (adm1021) Convert to use devm_hwmon_device_register_with_groups Simplify code, reduce code size, and attach hwmon attributes to hwmon device. Signed-off-by: Guenter Roeck Signed-off-by: Jean Delvare --- drivers/hwmon/adm1021.c | 70 ++++++++++++++++--------------------------------- 1 file changed, 22 insertions(+), 48 deletions(-) (limited to 'drivers/hwmon') diff --git a/drivers/hwmon/adm1021.c b/drivers/hwmon/adm1021.c index 29dd9f746dfa..3eb4281689b5 100644 --- a/drivers/hwmon/adm1021.c +++ b/drivers/hwmon/adm1021.c @@ -79,9 +79,11 @@ enum chips { /* Each client has this additional data */ struct adm1021_data { - struct device *hwmon_dev; + struct i2c_client *client; enum chips type; + const struct attribute_group *groups[3]; + struct mutex update_lock; char valid; /* !=0 if following fields are valid */ char low_power; /* !=0 if device in low power mode */ @@ -101,7 +103,6 @@ static int adm1021_probe(struct i2c_client *client, static int adm1021_detect(struct i2c_client *client, struct i2c_board_info *info); static void adm1021_init_client(struct i2c_client *client); -static int adm1021_remove(struct i2c_client *client); static struct adm1021_data *adm1021_update_device(struct device *dev); /* (amalysh) read only mode, otherwise any limit's writing confuse BIOS */ @@ -128,7 +129,6 @@ static struct i2c_driver adm1021_driver = { .name = "adm1021", }, .probe = adm1021_probe, - .remove = adm1021_remove, .id_table = adm1021_id, .detect = adm1021_detect, .address_list = normal_i2c, @@ -182,8 +182,8 @@ static ssize_t set_temp_max(struct device *dev, const char *buf, size_t count) { int index = to_sensor_dev_attr(devattr)->index; - struct i2c_client *client = to_i2c_client(dev); - struct adm1021_data *data = i2c_get_clientdata(client); + struct adm1021_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->client; long temp; int err; @@ -207,8 +207,8 @@ static ssize_t set_temp_min(struct device *dev, const char *buf, size_t count) { int index = to_sensor_dev_attr(devattr)->index; - struct i2c_client *client = to_i2c_client(dev); - struct adm1021_data *data = i2c_get_clientdata(client); + struct adm1021_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->client; long temp; int err; @@ -238,8 +238,8 @@ static ssize_t set_low_power(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count) { - struct i2c_client *client = to_i2c_client(dev); - struct adm1021_data *data = i2c_get_clientdata(client); + struct adm1021_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->client; char low_power; unsigned long val; int err; @@ -412,15 +412,15 @@ static int adm1021_detect(struct i2c_client *client, static int adm1021_probe(struct i2c_client *client, const struct i2c_device_id *id) { + struct device *dev = &client->dev; struct adm1021_data *data; - int err; + struct device *hwmon_dev; - data = devm_kzalloc(&client->dev, sizeof(struct adm1021_data), - GFP_KERNEL); + data = devm_kzalloc(dev, sizeof(struct adm1021_data), GFP_KERNEL); if (!data) return -ENOMEM; - i2c_set_clientdata(client, data); + data->client = client; data->type = id->driver_data; mutex_init(&data->update_lock); @@ -428,29 +428,14 @@ static int adm1021_probe(struct i2c_client *client, if (data->type != lm84 && !read_only) adm1021_init_client(client); - /* Register sysfs hooks */ - err = sysfs_create_group(&client->dev.kobj, &adm1021_group); - if (err) - return err; - - if (data->type != lm84) { - err = sysfs_create_group(&client->dev.kobj, &adm1021_min_group); - if (err) - goto error; - } + data->groups[0] = &adm1021_group; + if (data->type != lm84) + data->groups[1] = &adm1021_min_group; - data->hwmon_dev = hwmon_device_register(&client->dev); - if (IS_ERR(data->hwmon_dev)) { - err = PTR_ERR(data->hwmon_dev); - goto error; - } + hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name, + data, data->groups); - return 0; - -error: - sysfs_remove_group(&client->dev.kobj, &adm1021_min_group); - sysfs_remove_group(&client->dev.kobj, &adm1021_group); - return err; + return PTR_ERR_OR_ZERO(hwmon_dev); } static void adm1021_init_client(struct i2c_client *client) @@ -462,21 +447,10 @@ static void adm1021_init_client(struct i2c_client *client) i2c_smbus_write_byte_data(client, ADM1021_REG_CONV_RATE_W, 0x04); } -static int adm1021_remove(struct i2c_client *client) -{ - struct adm1021_data *data = i2c_get_clientdata(client); - - hwmon_device_unregister(data->hwmon_dev); - sysfs_remove_group(&client->dev.kobj, &adm1021_min_group); - sysfs_remove_group(&client->dev.kobj, &adm1021_group); - - return 0; -} - static struct adm1021_data *adm1021_update_device(struct device *dev) { - struct i2c_client *client = to_i2c_client(dev); - struct adm1021_data *data = i2c_get_clientdata(client); + struct adm1021_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->client; mutex_lock(&data->update_lock); @@ -484,7 +458,7 @@ static struct adm1021_data *adm1021_update_device(struct device *dev) || !data->valid) { int i; - dev_dbg(&client->dev, "Starting adm1021 update\n"); + dev_dbg(dev, "Starting adm1021 update\n"); for (i = 0; i < 2; i++) { data->temp[i] = 1000 * -- cgit v1.2.3-55-g7522 From 118c9a61f158c8f2e3694ed2a3681c217328a2c1 Mon Sep 17 00:00:00 2001 From: Guenter Roeck Date: Fri, 4 Apr 2014 18:01:34 +0200 Subject: hwmon: (lm80) Convert to use devm_hwmon_device_register_with_groups Simplify code, reduce code size, and attach hwmon attributes to hwmon device. Signed-off-by: Guenter Roeck Signed-off-by: Jean Delvare --- drivers/hwmon/lm80.c | 70 +++++++++++++++++----------------------------------- 1 file changed, 22 insertions(+), 48 deletions(-) (limited to 'drivers/hwmon') diff --git a/drivers/hwmon/lm80.c b/drivers/hwmon/lm80.c index eba89aac3ece..bd0a1ebbf867 100644 --- a/drivers/hwmon/lm80.c +++ b/drivers/hwmon/lm80.c @@ -112,7 +112,7 @@ static inline long TEMP_FROM_REG(u16 temp) */ struct lm80_data { - struct device *hwmon_dev; + struct i2c_client *client; struct mutex update_lock; char error; /* !=0 if error occurred during last update */ char valid; /* !=0 if following fields are valid */ @@ -140,7 +140,6 @@ static int lm80_probe(struct i2c_client *client, const struct i2c_device_id *id); static int lm80_detect(struct i2c_client *client, struct i2c_board_info *info); static void lm80_init_client(struct i2c_client *client); -static int lm80_remove(struct i2c_client *client); static struct lm80_data *lm80_update_device(struct device *dev); static int lm80_read_value(struct i2c_client *client, u8 reg); static int lm80_write_value(struct i2c_client *client, u8 reg, u8 value); @@ -162,7 +161,6 @@ static struct i2c_driver lm80_driver = { .name = "lm80", }, .probe = lm80_probe, - .remove = lm80_remove, .id_table = lm80_id, .detect = lm80_detect, .address_list = normal_i2c, @@ -191,8 +189,8 @@ static ssize_t set_in_##suffix(struct device *dev, \ struct device_attribute *attr, const char *buf, size_t count) \ { \ int nr = to_sensor_dev_attr(attr)->index; \ - struct i2c_client *client = to_i2c_client(dev); \ - struct lm80_data *data = i2c_get_clientdata(client); \ + struct lm80_data *data = dev_get_drvdata(dev); \ + struct i2c_client *client = data->client; \ long val; \ int err = kstrtol(buf, 10, &val); \ if (err < 0) \ @@ -235,8 +233,8 @@ static ssize_t set_fan_min(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { int nr = to_sensor_dev_attr(attr)->index; - struct i2c_client *client = to_i2c_client(dev); - struct lm80_data *data = i2c_get_clientdata(client); + struct lm80_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->client; unsigned long val; int err = kstrtoul(buf, 10, &val); if (err < 0) @@ -259,8 +257,8 @@ static ssize_t set_fan_div(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { int nr = to_sensor_dev_attr(attr)->index; - struct i2c_client *client = to_i2c_client(dev); - struct lm80_data *data = i2c_get_clientdata(client); + struct lm80_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->client; unsigned long min, val; u8 reg; int err = kstrtoul(buf, 10, &val); @@ -286,7 +284,7 @@ static ssize_t set_fan_div(struct device *dev, struct device_attribute *attr, data->fan_div[nr] = 3; break; default: - dev_err(&client->dev, + dev_err(dev, "fan_div value %ld not supported. Choose one of 1, 2, 4 or 8!\n", val); mutex_unlock(&data->update_lock); @@ -332,8 +330,8 @@ show_temp(os_hyst, temp_os_hyst); static ssize_t set_temp_##suffix(struct device *dev, \ struct device_attribute *attr, const char *buf, size_t count) \ { \ - struct i2c_client *client = to_i2c_client(dev); \ - struct lm80_data *data = i2c_get_clientdata(client); \ + struct lm80_data *data = dev_get_drvdata(dev); \ + struct i2c_client *client = data->client; \ long val; \ int err = kstrtol(buf, 10, &val); \ if (err < 0) \ @@ -440,7 +438,7 @@ static SENSOR_DEVICE_ATTR(temp1_crit_alarm, S_IRUGO, show_alarm, NULL, 13); * Real code */ -static struct attribute *lm80_attributes[] = { +static struct attribute *lm80_attrs[] = { &sensor_dev_attr_in0_min.dev_attr.attr, &sensor_dev_attr_in1_min.dev_attr.attr, &sensor_dev_attr_in2_min.dev_attr.attr, @@ -487,10 +485,7 @@ static struct attribute *lm80_attributes[] = { &sensor_dev_attr_temp1_crit_alarm.dev_attr.attr, NULL }; - -static const struct attribute_group lm80_group = { - .attrs = lm80_attributes, -}; +ATTRIBUTE_GROUPS(lm80); /* Return 0 if detection is successful, -ENODEV otherwise */ static int lm80_detect(struct i2c_client *client, struct i2c_board_info *info) @@ -541,14 +536,15 @@ static int lm80_detect(struct i2c_client *client, struct i2c_board_info *info) static int lm80_probe(struct i2c_client *client, const struct i2c_device_id *id) { + struct device *dev = &client->dev; + struct device *hwmon_dev; struct lm80_data *data; - int err; - data = devm_kzalloc(&client->dev, sizeof(struct lm80_data), GFP_KERNEL); + data = devm_kzalloc(dev, sizeof(struct lm80_data), GFP_KERNEL); if (!data) return -ENOMEM; - i2c_set_clientdata(client, data); + data->client = client; mutex_init(&data->update_lock); /* Initialize the LM80 chip */ @@ -558,32 +554,10 @@ static int lm80_probe(struct i2c_client *client, data->fan_min[0] = lm80_read_value(client, LM80_REG_FAN_MIN(1)); data->fan_min[1] = lm80_read_value(client, LM80_REG_FAN_MIN(2)); - /* Register sysfs hooks */ - err = sysfs_create_group(&client->dev.kobj, &lm80_group); - if (err) - return err; - - data->hwmon_dev = hwmon_device_register(&client->dev); - if (IS_ERR(data->hwmon_dev)) { - err = PTR_ERR(data->hwmon_dev); - goto error_remove; - } + hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name, + data, lm80_groups); - return 0; - -error_remove: - sysfs_remove_group(&client->dev.kobj, &lm80_group); - return err; -} - -static int lm80_remove(struct i2c_client *client) -{ - struct lm80_data *data = i2c_get_clientdata(client); - - hwmon_device_unregister(data->hwmon_dev); - sysfs_remove_group(&client->dev.kobj, &lm80_group); - - return 0; + return PTR_ERR_OR_ZERO(hwmon_dev); } static int lm80_read_value(struct i2c_client *client, u8 reg) @@ -614,8 +588,8 @@ static void lm80_init_client(struct i2c_client *client) static struct lm80_data *lm80_update_device(struct device *dev) { - struct i2c_client *client = to_i2c_client(dev); - struct lm80_data *data = i2c_get_clientdata(client); + struct lm80_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->client; int i; int rv; int prev_rv; @@ -627,7 +601,7 @@ static struct lm80_data *lm80_update_device(struct device *dev) lm80_init_client(client); if (time_after(jiffies, data->last_updated + 2 * HZ) || !data->valid) { - dev_dbg(&client->dev, "Starting lm80 update\n"); + dev_dbg(dev, "Starting lm80 update\n"); for (i = 0; i <= 6; i++) { rv = lm80_read_value(client, LM80_REG_IN(i)); if (rv < 0) -- cgit v1.2.3-55-g7522 From 5b58157598f93089ccda90aabd98f27865b344da Mon Sep 17 00:00:00 2001 From: Jean Delvare Date: Fri, 4 Apr 2014 18:01:34 +0200 Subject: hwmon: (pc87360) Avoid initializing the same field twice data is kzalloc'd, so data->valid, data->innr and data->tempnr are already 0. Also rework the initialization path to only set name and data->fannr once. Signed-off-by: Jean Delvare Reviewed-by: Guenter Roeck --- drivers/hwmon/pc87360.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'drivers/hwmon') diff --git a/drivers/hwmon/pc87360.c b/drivers/hwmon/pc87360.c index 330fe117e219..988181e4cfcd 100644 --- a/drivers/hwmon/pc87360.c +++ b/drivers/hwmon/pc87360.c @@ -1225,7 +1225,7 @@ static int pc87360_probe(struct platform_device *pdev) int i; struct pc87360_data *data; int err = 0; - const char *name = "pc87360"; + const char *name; int use_thermistors = 0; struct device *dev = &pdev->dev; @@ -1233,13 +1233,14 @@ static int pc87360_probe(struct platform_device *pdev) if (!data) return -ENOMEM; - data->fannr = 2; - data->innr = 0; - data->tempnr = 0; - switch (devid) { + default: + name = "pc87360"; + data->fannr = 2; + break; case 0xe8: name = "pc87363"; + data->fannr = 2; break; case 0xe4: name = "pc87364"; @@ -1260,7 +1261,6 @@ static int pc87360_probe(struct platform_device *pdev) } data->name = name; - data->valid = 0; mutex_init(&data->lock); mutex_init(&data->update_lock); platform_set_drvdata(pdev, data); -- cgit v1.2.3-55-g7522 From 6cf0a91ebe11cee1df871619af4eb58c9af32666 Mon Sep 17 00:00:00 2001 From: Jean Delvare Date: Fri, 4 Apr 2014 18:01:34 +0200 Subject: hwmon: Avoid initializing the same field twice All hwmon drivers allocate their data structure with some form of kzalloc, so setting data fields to zero explicitly is a waste of time. Signed-off-by: Jean Delvare Reviewed-by: Guenter Roeck --- drivers/hwmon/asc7621.c | 1 - drivers/hwmon/atxp1.c | 2 -- drivers/hwmon/lm77.c | 1 - drivers/hwmon/lm83.c | 1 - drivers/hwmon/lm87.c | 1 - drivers/hwmon/lm92.c | 1 - drivers/hwmon/lm93.c | 1 - drivers/hwmon/max1619.c | 1 - drivers/hwmon/w83792d.c | 1 - drivers/hwmon/w83l785ts.c | 4 ---- 10 files changed, 14 deletions(-) (limited to 'drivers/hwmon') diff --git a/drivers/hwmon/asc7621.c b/drivers/hwmon/asc7621.c index 8d9f2a0e8efe..71463689d163 100644 --- a/drivers/hwmon/asc7621.c +++ b/drivers/hwmon/asc7621.c @@ -1115,7 +1115,6 @@ asc7621_probe(struct i2c_client *client, const struct i2c_device_id *id) return -ENOMEM; i2c_set_clientdata(client, data); - data->valid = 0; mutex_init(&data->update_lock); /* Initialize the asc7621 chip */ diff --git a/drivers/hwmon/atxp1.c b/drivers/hwmon/atxp1.c index ddff02e3e66f..6edce42c61d5 100644 --- a/drivers/hwmon/atxp1.c +++ b/drivers/hwmon/atxp1.c @@ -353,8 +353,6 @@ static int atxp1_probe(struct i2c_client *new_client, data->vrm = vid_which_vrm(); i2c_set_clientdata(new_client, data); - data->valid = 0; - mutex_init(&data->update_lock); /* Register sysfs hooks */ diff --git a/drivers/hwmon/lm77.c b/drivers/hwmon/lm77.c index f17beb5e6dd6..502771c06fd9 100644 --- a/drivers/hwmon/lm77.c +++ b/drivers/hwmon/lm77.c @@ -348,7 +348,6 @@ static int lm77_probe(struct i2c_client *client, const struct i2c_device_id *id) return -ENOMEM; i2c_set_clientdata(client, data); - data->valid = 0; mutex_init(&data->update_lock); /* Initialize the LM77 chip */ diff --git a/drivers/hwmon/lm83.c b/drivers/hwmon/lm83.c index abd270243ba7..be02155788c3 100644 --- a/drivers/hwmon/lm83.c +++ b/drivers/hwmon/lm83.c @@ -349,7 +349,6 @@ static int lm83_probe(struct i2c_client *new_client, return -ENOMEM; i2c_set_clientdata(new_client, data); - data->valid = 0; mutex_init(&data->update_lock); /* diff --git a/drivers/hwmon/lm87.c b/drivers/hwmon/lm87.c index 4c5f20231c1a..ba1d83d48056 100644 --- a/drivers/hwmon/lm87.c +++ b/drivers/hwmon/lm87.c @@ -903,7 +903,6 @@ static int lm87_probe(struct i2c_client *client, const struct i2c_device_id *id) return -ENOMEM; i2c_set_clientdata(client, data); - data->valid = 0; mutex_init(&data->update_lock); /* Initialize the LM87 chip */ diff --git a/drivers/hwmon/lm92.c b/drivers/hwmon/lm92.c index 9d0e87a4f0cb..b9022db6511a 100644 --- a/drivers/hwmon/lm92.c +++ b/drivers/hwmon/lm92.c @@ -380,7 +380,6 @@ static int lm92_probe(struct i2c_client *new_client, return -ENOMEM; i2c_set_clientdata(new_client, data); - data->valid = 0; mutex_init(&data->update_lock); /* Initialize the chipset */ diff --git a/drivers/hwmon/lm93.c b/drivers/hwmon/lm93.c index 6f1c6c0dbaf5..adf23165a6a7 100644 --- a/drivers/hwmon/lm93.c +++ b/drivers/hwmon/lm93.c @@ -2754,7 +2754,6 @@ static int lm93_probe(struct i2c_client *client, i2c_set_clientdata(client, data); /* housekeeping */ - data->valid = 0; data->update = update; mutex_init(&data->update_lock); diff --git a/drivers/hwmon/max1619.c b/drivers/hwmon/max1619.c index 6638e997f83f..4c23afe113e2 100644 --- a/drivers/hwmon/max1619.c +++ b/drivers/hwmon/max1619.c @@ -273,7 +273,6 @@ static int max1619_probe(struct i2c_client *new_client, return -ENOMEM; i2c_set_clientdata(new_client, data); - data->valid = 0; mutex_init(&data->update_lock); /* Initialize the MAX1619 chip */ diff --git a/drivers/hwmon/w83792d.c b/drivers/hwmon/w83792d.c index df585808adb6..4068db4d9580 100644 --- a/drivers/hwmon/w83792d.c +++ b/drivers/hwmon/w83792d.c @@ -1376,7 +1376,6 @@ w83792d_probe(struct i2c_client *client, const struct i2c_device_id *id) return -ENOMEM; i2c_set_clientdata(client, data); - data->valid = 0; mutex_init(&data->update_lock); err = w83792d_detect_subclients(client); diff --git a/drivers/hwmon/w83l785ts.c b/drivers/hwmon/w83l785ts.c index 6384b268f590..ac3043122011 100644 --- a/drivers/hwmon/w83l785ts.c +++ b/drivers/hwmon/w83l785ts.c @@ -188,12 +188,8 @@ static int w83l785ts_probe(struct i2c_client *client, return -ENOMEM; i2c_set_clientdata(client, data); - data->valid = 0; mutex_init(&data->update_lock); - /* Default values in case the first read fails (unlikely). */ - data->temp[1] = data->temp[0] = 0; - /* * Initialize the W83L785TS chip * Nothing yet, assume it is already started. -- cgit v1.2.3-55-g7522 From 742192f546ae710dd9bc8ddea2354636eac33b57 Mon Sep 17 00:00:00 2001 From: Guenter Roeck Date: Fri, 4 Apr 2014 18:01:34 +0200 Subject: hwmon: (lm90) Create most optional attributes with sysfs_create_group With the new hwmon API, all attributes have to be created as groups. Use sysfs_create_group and sysfs_remove_group instead of device_create_file and device_remove_file to prepare for the new API. Exception is the 'pec' attribute which will stay with the i2c device. Signed-off-by: Guenter Roeck Signed-off-by: Jean Delvare --- drivers/hwmon/lm90.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) (limited to 'drivers/hwmon') diff --git a/drivers/hwmon/lm90.c b/drivers/hwmon/lm90.c index 701e952ae523..733b42e8b2d1 100644 --- a/drivers/hwmon/lm90.c +++ b/drivers/hwmon/lm90.c @@ -1057,6 +1057,15 @@ static const struct attribute_group lm90_group = { .attrs = lm90_attributes, }; +static struct attribute *lm90_temp2_offset_attributes[] = { + &sensor_dev_attr_temp2_offset.dev_attr.attr, + NULL +}; + +static const struct attribute_group lm90_temp2_offset_group = { + .attrs = lm90_temp2_offset_attributes, +}; + /* * Additional attributes for devices with emergency sensors */ @@ -1404,7 +1413,7 @@ static void lm90_remove_files(struct i2c_client *client, struct lm90_data *data) if (data->flags & LM90_HAVE_EMERGENCY) sysfs_remove_group(&dev->kobj, &lm90_emergency_group); if (data->flags & LM90_HAVE_OFFSET) - device_remove_file(dev, &sensor_dev_attr_temp2_offset.dev_attr); + sysfs_remove_group(&dev->kobj, &lm90_temp2_offset_group); device_remove_file(dev, &dev_attr_pec); sysfs_remove_group(&dev->kobj, &lm90_group); } @@ -1574,8 +1583,7 @@ static int lm90_probe(struct i2c_client *client, goto exit_remove_files; } if (data->flags & LM90_HAVE_OFFSET) { - err = device_create_file(dev, - &sensor_dev_attr_temp2_offset.dev_attr); + err = sysfs_create_group(&dev->kobj, &lm90_temp2_offset_group); if (err) goto exit_remove_files; } -- cgit v1.2.3-55-g7522 From d89fa6867d39ccf589799da50b1e1ee1c0713c4d Mon Sep 17 00:00:00 2001 From: Guenter Roeck Date: Fri, 4 Apr 2014 18:01:35 +0200 Subject: hwmon: (lm90) Always use the dev variable in the probe function Signed-off-by: Guenter Roeck Signed-off-by: Jean Delvare --- drivers/hwmon/lm90.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'drivers/hwmon') diff --git a/drivers/hwmon/lm90.c b/drivers/hwmon/lm90.c index 733b42e8b2d1..07ffd1061e35 100644 --- a/drivers/hwmon/lm90.c +++ b/drivers/hwmon/lm90.c @@ -1536,12 +1536,11 @@ static int lm90_probe(struct i2c_client *client, err = regulator_enable(regulator); if (err < 0) { - dev_err(&client->dev, - "Failed to enable regulator: %d\n", err); + dev_err(dev, "Failed to enable regulator: %d\n", err); return err; } - data = devm_kzalloc(&client->dev, sizeof(struct lm90_data), GFP_KERNEL); + data = devm_kzalloc(dev, sizeof(struct lm90_data), GFP_KERNEL); if (!data) return -ENOMEM; -- cgit v1.2.3-55-g7522 From 084489e64cad50b2a3927abafc69b6fd72eb56bc Mon Sep 17 00:00:00 2001 From: Guenter Roeck Date: Fri, 4 Apr 2014 18:01:35 +0200 Subject: hwmon: (lm90) Create all sysfs groups in one call Create all sysfs groups in one call by using sysfs_create_groups instead of calling sysfs_create_group individually for each group. Signed-off-by: Guenter Roeck Signed-off-by: Jean Delvare --- drivers/hwmon/lm90.c | 69 ++++++++++++++++++++-------------------------------- 1 file changed, 26 insertions(+), 43 deletions(-) (limited to 'drivers/hwmon') diff --git a/drivers/hwmon/lm90.c b/drivers/hwmon/lm90.c index 07ffd1061e35..9ad7401f3b2c 100644 --- a/drivers/hwmon/lm90.c +++ b/drivers/hwmon/lm90.c @@ -366,6 +366,7 @@ enum lm90_temp11_reg_index { struct lm90_data { struct device *hwmon_dev; + const struct attribute_group *groups[6]; struct mutex update_lock; struct regulator *regulator; char valid; /* zero until following fields are valid */ @@ -1402,22 +1403,6 @@ static int lm90_detect(struct i2c_client *client, return 0; } -static void lm90_remove_files(struct i2c_client *client, struct lm90_data *data) -{ - struct device *dev = &client->dev; - - if (data->flags & LM90_HAVE_TEMP3) - sysfs_remove_group(&dev->kobj, &lm90_temp3_group); - if (data->flags & LM90_HAVE_EMERGENCY_ALARM) - sysfs_remove_group(&dev->kobj, &lm90_emergency_alarm_group); - if (data->flags & LM90_HAVE_EMERGENCY) - sysfs_remove_group(&dev->kobj, &lm90_emergency_group); - if (data->flags & LM90_HAVE_OFFSET) - sysfs_remove_group(&dev->kobj, &lm90_temp2_offset_group); - device_remove_file(dev, &dev_attr_pec); - sysfs_remove_group(&dev->kobj, &lm90_group); -} - static void lm90_restore_conf(struct i2c_client *client, struct lm90_data *data) { /* Restore initial configuration */ @@ -1528,6 +1513,7 @@ static int lm90_probe(struct i2c_client *client, struct i2c_adapter *adapter = to_i2c_adapter(dev->parent); struct lm90_data *data; struct regulator *regulator; + int groups = 0; int err; regulator = devm_regulator_get(dev, "vcc"); @@ -1573,36 +1559,30 @@ static int lm90_probe(struct i2c_client *client, lm90_init_client(client); /* Register sysfs hooks */ - err = sysfs_create_group(&dev->kobj, &lm90_group); - if (err) - goto exit_restore; + data->groups[groups++] = &lm90_group; + + if (data->flags & LM90_HAVE_OFFSET) + data->groups[groups++] = &lm90_temp2_offset_group; + + if (data->flags & LM90_HAVE_EMERGENCY) + data->groups[groups++] = &lm90_emergency_group; + + if (data->flags & LM90_HAVE_EMERGENCY_ALARM) + data->groups[groups++] = &lm90_emergency_alarm_group; + + if (data->flags & LM90_HAVE_TEMP3) + data->groups[groups++] = &lm90_temp3_group; + if (client->flags & I2C_CLIENT_PEC) { err = device_create_file(dev, &dev_attr_pec); if (err) - goto exit_remove_files; - } - if (data->flags & LM90_HAVE_OFFSET) { - err = sysfs_create_group(&dev->kobj, &lm90_temp2_offset_group); - if (err) - goto exit_remove_files; - } - if (data->flags & LM90_HAVE_EMERGENCY) { - err = sysfs_create_group(&dev->kobj, &lm90_emergency_group); - if (err) - goto exit_remove_files; - } - if (data->flags & LM90_HAVE_EMERGENCY_ALARM) { - err = sysfs_create_group(&dev->kobj, - &lm90_emergency_alarm_group); - if (err) - goto exit_remove_files; - } - if (data->flags & LM90_HAVE_TEMP3) { - err = sysfs_create_group(&dev->kobj, &lm90_temp3_group); - if (err) - goto exit_remove_files; + goto exit_restore; } + err = sysfs_create_groups(&dev->kobj, data->groups); + if (err) + goto exit_remove_pec; + data->hwmon_dev = hwmon_device_register(dev); if (IS_ERR(data->hwmon_dev)) { err = PTR_ERR(data->hwmon_dev); @@ -1626,7 +1606,9 @@ static int lm90_probe(struct i2c_client *client, exit_unregister: hwmon_device_unregister(data->hwmon_dev); exit_remove_files: - lm90_remove_files(client, data); + sysfs_remove_groups(&dev->kobj, data->groups); +exit_remove_pec: + device_remove_file(dev, &dev_attr_pec); exit_restore: lm90_restore_conf(client, data); regulator_disable(data->regulator); @@ -1639,7 +1621,8 @@ static int lm90_remove(struct i2c_client *client) struct lm90_data *data = i2c_get_clientdata(client); hwmon_device_unregister(data->hwmon_dev); - lm90_remove_files(client, data); + sysfs_remove_groups(&client->dev.kobj, data->groups); + device_remove_file(&client->dev, &dev_attr_pec); lm90_restore_conf(client, data); regulator_disable(data->regulator); -- cgit v1.2.3-55-g7522 From 1de8b250f6b243f78b5d01db56d2435448797e08 Mon Sep 17 00:00:00 2001 From: Guenter Roeck Date: Fri, 4 Apr 2014 18:01:35 +0200 Subject: hwmon: (lm90) Convert to use hwmon_device_register_with_groups Simplify code, reduce code size, and attach hwmon attributes to hwmon device. Signed-off-by: Guenter Roeck Signed-off-by: Jean Delvare --- drivers/hwmon/lm90.c | 39 +++++++++++++++++---------------------- 1 file changed, 17 insertions(+), 22 deletions(-) (limited to 'drivers/hwmon') diff --git a/drivers/hwmon/lm90.c b/drivers/hwmon/lm90.c index 9ad7401f3b2c..c9ff08dbe10c 100644 --- a/drivers/hwmon/lm90.c +++ b/drivers/hwmon/lm90.c @@ -365,6 +365,7 @@ enum lm90_temp11_reg_index { */ struct lm90_data { + struct i2c_client *client; struct device *hwmon_dev; const struct attribute_group *groups[6]; struct mutex update_lock; @@ -514,8 +515,8 @@ static void lm90_set_convrate(struct i2c_client *client, struct lm90_data *data, static struct lm90_data *lm90_update_device(struct device *dev) { - struct i2c_client *client = to_i2c_client(dev); - struct lm90_data *data = i2c_get_clientdata(client); + struct lm90_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->client; unsigned long next_update; mutex_lock(&data->update_lock); @@ -794,8 +795,8 @@ static ssize_t set_temp8(struct device *dev, struct device_attribute *devattr, }; struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); - struct i2c_client *client = to_i2c_client(dev); - struct lm90_data *data = i2c_get_clientdata(client); + struct lm90_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->client; int nr = attr->index; long val; int err; @@ -861,8 +862,8 @@ static ssize_t set_temp11(struct device *dev, struct device_attribute *devattr, }; struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr); - struct i2c_client *client = to_i2c_client(dev); - struct lm90_data *data = i2c_get_clientdata(client); + struct lm90_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->client; int nr = attr->nr; int index = attr->index; long val; @@ -923,8 +924,8 @@ static ssize_t show_temphyst(struct device *dev, static ssize_t set_temphyst(struct device *dev, struct device_attribute *dummy, const char *buf, size_t count) { - struct i2c_client *client = to_i2c_client(dev); - struct lm90_data *data = i2c_get_clientdata(client); + struct lm90_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->client; long val; int err; int temp; @@ -977,8 +978,8 @@ static ssize_t set_update_interval(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { - struct i2c_client *client = to_i2c_client(dev); - struct lm90_data *data = i2c_get_clientdata(client); + struct lm90_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->client; unsigned long val; int err; @@ -1412,10 +1413,9 @@ static void lm90_restore_conf(struct i2c_client *client, struct lm90_data *data) data->config_orig); } -static void lm90_init_client(struct i2c_client *client) +static void lm90_init_client(struct i2c_client *client, struct lm90_data *data) { u8 config, convrate; - struct lm90_data *data = i2c_get_clientdata(client); if (lm90_read_reg(client, LM90_REG_R_CONVRATE, &convrate) < 0) { dev_warn(&client->dev, "Failed to read convrate register!\n"); @@ -1530,6 +1530,7 @@ static int lm90_probe(struct i2c_client *client, if (!data) return -ENOMEM; + data->client = client; i2c_set_clientdata(client, data); mutex_init(&data->update_lock); @@ -1556,7 +1557,7 @@ static int lm90_probe(struct i2c_client *client, data->max_convrate = lm90_params[data->kind].max_convrate; /* Initialize the LM90 chip */ - lm90_init_client(client); + lm90_init_client(client, data); /* Register sysfs hooks */ data->groups[groups++] = &lm90_group; @@ -1579,14 +1580,11 @@ static int lm90_probe(struct i2c_client *client, goto exit_restore; } - err = sysfs_create_groups(&dev->kobj, data->groups); - if (err) - goto exit_remove_pec; - - data->hwmon_dev = hwmon_device_register(dev); + data->hwmon_dev = hwmon_device_register_with_groups(dev, client->name, + data, data->groups); if (IS_ERR(data->hwmon_dev)) { err = PTR_ERR(data->hwmon_dev); - goto exit_remove_files; + goto exit_remove_pec; } if (client->irq) { @@ -1605,8 +1603,6 @@ static int lm90_probe(struct i2c_client *client, exit_unregister: hwmon_device_unregister(data->hwmon_dev); -exit_remove_files: - sysfs_remove_groups(&dev->kobj, data->groups); exit_remove_pec: device_remove_file(dev, &dev_attr_pec); exit_restore: @@ -1621,7 +1617,6 @@ static int lm90_remove(struct i2c_client *client) struct lm90_data *data = i2c_get_clientdata(client); hwmon_device_unregister(data->hwmon_dev); - sysfs_remove_groups(&client->dev.kobj, data->groups); device_remove_file(&client->dev, &dev_attr_pec); lm90_restore_conf(client, data); regulator_disable(data->regulator); -- cgit v1.2.3-55-g7522 From 7183ae8c203f81d1727cfaf430a9f6fa8a07c99c Mon Sep 17 00:00:00 2001 From: Rudolf Marek Date: Fri, 4 Apr 2014 18:01:35 +0200 Subject: hwmon: (it87) Fix IT8603E define name Fix small typo in the define name for IT8603E. Signed-off-by: Rudolf Marek Signed-off-by: Jean Delvare --- drivers/hwmon/it87.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'drivers/hwmon') diff --git a/drivers/hwmon/it87.c b/drivers/hwmon/it87.c index 70749fc15a4f..3c88ace9b4a4 100644 --- a/drivers/hwmon/it87.c +++ b/drivers/hwmon/it87.c @@ -147,7 +147,7 @@ static inline void superio_exit(void) #define IT8772E_DEVID 0x8772 #define IT8782F_DEVID 0x8782 #define IT8783E_DEVID 0x8783 -#define IT8306E_DEVID 0x8603 +#define IT8603E_DEVID 0x8603 #define IT87_ACT_REG 0x30 #define IT87_BASE_REG 0x60 @@ -1431,7 +1431,7 @@ static ssize_t show_label(struct device *dev, struct device_attribute *attr, static SENSOR_DEVICE_ATTR(in3_label, S_IRUGO, show_label, NULL, 0); static SENSOR_DEVICE_ATTR(in7_label, S_IRUGO, show_label, NULL, 1); static SENSOR_DEVICE_ATTR(in8_label, S_IRUGO, show_label, NULL, 2); -/* special AVCC3 IT8306E in9 */ +/* special AVCC3 IT8603E in9 */ static SENSOR_DEVICE_ATTR(in9_label, S_IRUGO, show_label, NULL, 0); static ssize_t show_name(struct device *dev, struct device_attribute @@ -1766,7 +1766,7 @@ static int __init it87_find(unsigned short *address, case IT8783E_DEVID: sio_data->type = it8783; break; - case IT8306E_DEVID: + case IT8603E_DEVID: sio_data->type = it8603; break; case 0xffff: /* No device at all */ -- cgit v1.2.3-55-g7522 From 574e9bd8fa44d8c6d90a46d97d1a75257a89b424 Mon Sep 17 00:00:00 2001 From: Rudolf Marek Date: Fri, 4 Apr 2014 18:01:35 +0200 Subject: hwmon: (it87) Add support for IT8623E Add support for the IT8623E found on Asus motherboards. It has same hardware monitoring block as IT8603E. Signed-off-by: Rudolf Marek Signed-off-by: Jean Delvare --- Documentation/hwmon/it87 | 10 +++++----- drivers/hwmon/it87.c | 3 +++ 2 files changed, 8 insertions(+), 5 deletions(-) (limited to 'drivers/hwmon') diff --git a/Documentation/hwmon/it87 b/Documentation/hwmon/it87 index 0c1635082c99..fe80e9adebfa 100644 --- a/Documentation/hwmon/it87 +++ b/Documentation/hwmon/it87 @@ -2,7 +2,7 @@ Kernel driver it87 ================== Supported chips: - * IT8603E + * IT8603E/IT8623E Prefix: 'it8603' Addresses scanned: from Super I/O config space (8 I/O ports) Datasheet: Not publicly available @@ -94,9 +94,9 @@ motherboard models. Description ----------- -This driver implements support for the IT8603E, IT8705F, IT8712F, IT8716F, -IT8718F, IT8720F, IT8721F, IT8726F, IT8728F, IT8758E, IT8771E, IT8772E, -IT8782F, IT8783E/F, and SiS950 chips. +This driver implements support for the IT8603E, IT8623E, IT8705F, IT8712F, +IT8716F, IT8718F, IT8720F, IT8721F, IT8726F, IT8728F, IT8758E, IT8771E, +IT8772E, IT8782F, IT8783E/F, and SiS950 chips. These chips are 'Super I/O chips', supporting floppy disks, infrared ports, joysticks and other miscellaneous stuff. For hardware monitoring, they @@ -133,7 +133,7 @@ to userspace applications. The IT8728F, IT8771E, and IT8772E are considered compatible with the IT8721F, until a datasheet becomes available (hopefully.) -The IT8603E is a custom design, hardware monitoring part is similar to +The IT8603E/IT8623E is a custom design, hardware monitoring part is similar to IT8728F. It only supports 16-bit fan mode, the full speed mode of the fan is not supported (value 0 of pwmX_enable). diff --git a/drivers/hwmon/it87.c b/drivers/hwmon/it87.c index 3c88ace9b4a4..a327fd3402a7 100644 --- a/drivers/hwmon/it87.c +++ b/drivers/hwmon/it87.c @@ -11,6 +11,7 @@ * similar parts. The other devices are supported by different drivers. * * Supports: IT8603E Super I/O chip w/LPC interface + * IT8623E Super I/O chip w/LPC interface * IT8705F Super I/O chip w/LPC interface * IT8712F Super I/O chip w/LPC interface * IT8716F Super I/O chip w/LPC interface @@ -148,6 +149,7 @@ static inline void superio_exit(void) #define IT8782F_DEVID 0x8782 #define IT8783E_DEVID 0x8783 #define IT8603E_DEVID 0x8603 +#define IT8623E_DEVID 0x8623 #define IT87_ACT_REG 0x30 #define IT87_BASE_REG 0x60 @@ -1767,6 +1769,7 @@ static int __init it87_find(unsigned short *address, sio_data->type = it8783; break; case IT8603E_DEVID: + case IT8623E_DEVID: sio_data->type = it8603; break; case 0xffff: /* No device at all */ -- cgit v1.2.3-55-g7522