hwmon: (w83l786ng) Convert to devm_hwmon_device_register_with_groups
PATCH 1/1 hwmon: (w83l786ng) Convert to devm_hwmon_device_register_with_groups
Use ATTRIBUTE_GROUPS macro and devm_hwmon_device_register_with_groups() to simplify the code a bit.
The 'sensors' command never worked with this driver, fixed with this conversion.
---
Hi,
I think the 'sensors' command never worked with this driver, but I don't have the h/w to test. I'd appreciate if someone can test it.
Thanks,
Axel
drivers/hwmon/w83l786ng.c | 87 ++++++++++++++++------------------------------- 1 file changed, 29 insertions(+), 58 deletions(-)
drivers/hwmon/w83l786ng.c +29 -58
@@ -124,7 +124,7 @@ DIV_TO_REG(long val) }struct w83l786ng_data { -struct device *hwmon_dev; +struct i2c_client *client;struct mutex update_lock;char valid;/* !=0 if following fields are valid */ unsigned long last_updated;/* In jiffies */
@@ -152,7 +152,6 @@ static int w83l786ng_probe(struct i2c_client *client, const struct i2c_device_id *id);static int w83l786ng_detect (struct i2c_client *client,struct i2c_board_info *info); -static int w83l786ng_remove (struct i2c_client *client);static void w83l786ng_init_client (struct i2c_client *client);static struct w83l786ng_data *w83l786ng_update_device (struct device *dev);
@@ -168,7 +167,6 @@ static struct i2c_driver w83l786ng_driver = { .name = "w83l786ng", }, .probe = w83l786ng_probe, - .remove = w83l786ng_remove, .id_table = w83l786ng_id, .detect = w83l786ng_detect, .address_list = normal_i2c,
@@ -207,8 +205,8 @@ store_in_##reg(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 w83l786ng_data *data =i2c_get_clientdata (client); \ +struct w83l786ng_data *data =dev_get_drvdata (dev); \ +struct i2c_client *client = data->client; \unsigned long val; \int err =kstrtoul (buf,10 , &val); \if (err) \
@@ -260,8 +258,8 @@ store_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 w83l786ng_data *data =i2c_get_clientdata (client); +struct w83l786ng_data *data =dev_get_drvdata (dev); +struct i2c_client *client = data->client;unsigned long val;int err;
@@ -298,8 +296,8 @@ store_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 w83l786ng_data *data =i2c_get_clientdata (client); +struct w83l786ng_data *data =dev_get_drvdata (dev); +struct i2c_client *client = data->client;unsigned long min;u8 tmp_fan_div;
@@ -389,8 +387,8 @@ store_temp(struct device *dev, struct device_attribute *attr,to_sensor_dev_attr_2 (attr);int nr = sensor_attr->nr;int index = sensor_attr->index; -struct i2c_client *client =to_i2c_client (dev); -struct w83l786ng_data *data =i2c_get_clientdata (client); +struct w83l786ng_data *data =dev_get_drvdata (dev); +struct i2c_client *client = data->client;long val;int err;
@@ -444,8 +442,8 @@ store_pwm_mode(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 w83l786ng_data *data =i2c_get_clientdata (client); +struct w83l786ng_data *data =dev_get_drvdata (dev); +struct i2c_client *client = data->client;u8 reg;unsigned long val;int err;
@@ -472,8 +470,8 @@ store_pwm(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 w83l786ng_data *data =i2c_get_clientdata (client); +struct w83l786ng_data *data =dev_get_drvdata (dev); +struct i2c_client *client = data->client;unsigned long val;int err;
@@ -496,8 +494,8 @@ store_pwm_enable(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 w83l786ng_data *data =i2c_get_clientdata (client); +struct w83l786ng_data *data =dev_get_drvdata (dev); +struct i2c_client *client = data->client;u8 reg;unsigned long val;int err;
@@ -552,8 +550,8 @@ store_tolerance(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 w83l786ng_data *data =i2c_get_clientdata (client); +struct w83l786ng_data *data =dev_get_drvdata (dev); +struct i2c_client *client = data->client;u8 tol_tmp, tol_mask;unsigned long val;int err;
@@ -608,7 +606,7 @@ static struct sensor_device_attribute sda_tolerance[] = {#define TOLERANCE_UNIT_ATTRS (X ) \ &sda_tolerance[X].dev_attr.attr -static struct attribute *w83l786ng_attributes[] = { +static struct attribute *w83l786ng_attrs[] = {IN_UNIT_ATTRS (0 ),IN_UNIT_ATTRS (1 ),IN_UNIT_ATTRS (2 ),
@@ -623,9 +621,7 @@ static struct attribute *w83l786ng_attributes[] = { NULL }; -static const struct attribute_group w83l786ng_group = { - .attrs = w83l786ng_attributes, -}; +ATTRIBUTE_GROUPS (w83l786ng);static int w83l786ng_detect (struct i2c_client *client,struct i2c_board_info *info)
@@ -667,15 +663,15 @@ w83l786ng_probe(struct i2c_client *client, const struct i2c_device_id *id) {struct device *dev = &client->dev;struct w83l786ng_data *data; -int i, err =0 ; +struct device *hwmon_dev; +int i;u8 reg_tmp; - data =devm_kzalloc (&client->dev,sizeof (struct w83l786ng_data ), -GFP_KERNEL ); + data =devm_kzalloc (dev,sizeof (struct w83l786ng_data ),GFP_KERNEL );if (!data)return -ENOMEM ; -i2c_set_clientdata (client, data); + data->client = client;mutex_init (&data->update_lock);/* Initialize the chip */
@@ -692,35 +688,10 @@ w83l786ng_probe(struct i2c_client *client, const struct i2c_device_id *id) data->fan_div[0 ] = reg_tmp &0x07 ; data->fan_div[1 ] = (reg_tmp >>4 ) &0x07 ; -/* Register sysfs hooks */ - err =sysfs_create_group (&client->dev.kobj, &w83l786ng_group); -if (err) - goto exit_remove; - - data->hwmon_dev =hwmon_device_register (dev); -if (IS_ERR (data->hwmon_dev)) { - err =PTR_ERR (data->hwmon_dev); - goto exit_remove; - } - -return 0 ; - -/* Unregister sysfs hooks */ - -exit_remove: -sysfs_remove_group (&client->dev.kobj, &w83l786ng_group); -return err; -} - -static int -w83l786ng_remove (struct i2c_client *client) -{ -struct w83l786ng_data *data =i2c_get_clientdata (client); - -hwmon_device_unregister (data->hwmon_dev); -sysfs_remove_group (&client->dev.kobj, &w83l786ng_group); - -return 0 ; + hwmon_dev =devm_hwmon_device_register_with_groups (dev, client->name, + data, + w83l786ng_groups); +return PTR_ERR_OR_ZERO (hwmon_dev); } static void
@@ -739,8 +710,8 @@ w83l786ng_init_client(struct i2c_client *client)static struct w83l786ng_data *w83l786ng_update_device (struct device *dev) { -struct i2c_client *client =to_i2c_client (dev); -struct w83l786ng_data *data =i2c_get_clientdata (client); +struct w83l786ng_data *data =dev_get_drvdata (dev); +struct i2c_client *client = data->client;int i, j;u8 reg_tmp, pwmcfg;
Signature · 9 lines
1.8.3.2 _______________________________________________ lm-sensors mailing list [email protected] http://lists.lm-sensors.org/mailman/listinfo/lm-sensors
Guenter Roeck
maintainerQuoted 5 lines · Axel Lin
Use
ATTRIBUTE_GROUPSmacro anddevm_hwmon_device_register_with_groups()to simplify the code a bit.The 'sensors' command never worked with this driver, fixed with this conversion.
Hi Axel,
You'd have to be a bit more specific here. Why ? It is not obvious to me. If you mean the 'name' attribute, that is created by the i2c subsystem.
The driver is buggy, though. It shows the current fan speed as minimum fan speed. Typical bug that can happen easily with function macros. But that is a different problem.
The driver could also benefit from some cleanup. It wastes code space by using function macros instead of SENSOR_ATTR_2, and functions should be reordered to get rid of forward declarations. Difficult to do without HW or at least simulation, though. Jean, do you have a register dump, by any chance ?
Thanks,
Guenter
_______________________________________________
lm-sensors mailing list
[email protected]
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors
2014-06-24 22:38 GMT+08:00 Guenter Roeck <[email protected]>:
Quoted 5 lines · Axel Lin
Quoted 4 lines
Use
ATTRIBUTE_GROUPSmacro anddevm_hwmon_device_register_with_groups()to simplify the code a bit.
Quoted 7 lines
Quoted 3 lines
The 'sensors' command never worked with this driver, fixed with this conversion.
Hi Axel,
You'd have to be a bit more specific here. Why ? It is not obvious to me. If you mean the 'name' attribute, that is created by the i2c subsystem.
I thought the 'name' attribute was missing, but since it's created by the i2c subsystem, that would be fine.
Quoted 3 lines
The driver is buggy, though. It shows the current fan speed as minimum fan speed.
I just sent a patch to fix this.
Quoted 8 lines
Typical bug that can happen easily with function macros. But that is a different
problem.The driver could also benefit from some cleanup. It wastes code space by using
function macros instead ofSENSOR_ATTR_2, and functions should be reordered to get rid of forward declarations.
ok. I'll address these issues.
Thanks for your review,
Axel
_______________________________________________
lm-sensors mailing list
[email protected]
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors
Quoted 27 lines · Axel Lin
2014-06-24 22:38 GMT+08:00 Guenter Roeck <[email protected]>:
Quoted 5 lines · Axel Lin
Quoted 4 lines
Use
ATTRIBUTE_GROUPSmacro anddevm_hwmon_device_register_with_groups()to simplify the code a bit.Quoted 7 lines
Quoted 3 lines
The 'sensors' command never worked with this driver, fixed with this conversion.
Hi Axel,
You'd have to be a bit more specific here. Why ? It is not obvious to me. If you mean the 'name' attribute, that is created by the i2c subsystem.
I thought the 'name' attribute was missing, but since it's created by the i2c subsystem, that would be fine.
Quoted 3 lines
The driver is buggy, though. It shows the current fan speed as minimum fan speed.
I just sent a patch to fix this.
Quoted 4 lines
Typical bug that can happen easily with function macros. But that is a different
problem.
Quoted 7 lines
Quoted 4 lines
The driver could also benefit from some cleanup. It wastes code space by using
function macros instead ofSENSOR_ATTR_2, and functions should be reordered to get rid of forward declarations.ok. I'll address these issues.
Thanks for your review,
Thank you for taking the time to fix issues.
Since I've had no w83l786ng chips available for testing, I couldn't verify that your patch works or not.
Quoted 1 line
Axel
Kevin
_______________________________________________
lm-sensors mailing list
[email protected]
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors
Hi Guenter,
Quoted 4 lines · Guenter Roeck
The driver could also benefit from some cleanup. It wastes code space by using function macros instead of
SENSOR_ATTR_2, and functions should be reordered to get rid of forward declarations. Difficult to do without HW or at least simulation, though. Jean, do you have a register dump, by any chance ?
I have the following:
0 1 2 3 4 5 6 7 8 9 a b c d e f
20: c0 c1 c2 XX XX 25 26 XX 88 89 XX ff 00 ff 00 ff 30: 00 XX XX XX XX 50 4b 50 4b XX XX ff ff f0 f0 XX 40: 01 00 00 de fe 00 00 00 XX 00 00 00 a3 5c 80 XX 50: XX 00 04 41 11 XX XX XX XX XX XX XX XX XX XX XX 80: 3c ff ff 00 00 00 00 ff ff 00 00 00 00 33 XX 22 90: 00 14 0a 00 00 00 19 19 XX XX XX XX XX XX XX XX
It was stored under the name w83l786ng-powerup.dump, so it is likely that I generated it based on the default register values in the datasheet and this isn't an real chip dump. Hope that helps anyway.
Signature · 7 lines
Jean Delvare SUSE L3 Support _______________________________________________ lm-sensors mailing list [email protected] http://lists.lm-sensors.org/mailman/listinfo/lm-sensors
Guenter Roeck
maintainerQuoted 18 lines · Jean Delvare
Hi Guenter,
Quoted 4 lines · Guenter Roeck
The driver could also benefit from some cleanup. It wastes code space by using function macros instead of
SENSOR_ATTR_2, and functions should be reordered to get rid of forward declarations. Difficult to do without HW or at least simulation, though. Jean, do you have a register dump, by any chance ?I have the following:
0 1 2 3 4 5 6 7 8 9 a b c d e f
20: c0 c1 c2 XX XX 25 26 XX 88 89 XX ff 00 ff 00 ff 30: 00 XX XX XX XX 50 4b 50 4b XX XX ff ff f0 f0 XX 40: 01 00 00 de fe 00 00 00 XX 00 00 00 a3 5c 80 XX 50: XX 00 04 41 11 XX XX XX XX XX XX XX XX XX XX XX 80: 3c ff ff 00 00 00 00 ff ff 00 00 00 00 33 XX 22 90: 00 14 0a 00 00 00 19 19 XX XX XX XX XX XX XX XX
Quoted 4 lines
It was stored under the name w83l786ng-powerup.dump, so it is likely that I generated it based on the default register values in the datasheet and this isn't an real chip dump. Hope that helps anyway.
Seems to be working. This is what I get after applying the patches:
w83l786ng-i2c-7-2e
Adapter: SMBus stub driver in0: +1.54 V (min = +0.00 V, max = +2.04 V) in1: +1.54 V (min = +0.00 V, max = +2.04 V) in2: +1.55 V (min = +0.00 V, max = +2.04 V) fan1: 4963 RPM (min = 0 RPM, div = 2) fan2: 4927 RPM (min = 0 RPM, div = 2) temp1: +37.0°C (high = +80.0°C, hyst = +75.0°C) temp2: +38.0°C (high = +80.0°C, hyst = +75.0°C)
Do you have all those register dumps online, by any chance ? That would be quite valuable.
Thanks,
Guenter
_______________________________________________
lm-sensors mailing list
[email protected]
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors
Quoted 2 lines · Guenter Roeck
Do you have all those register dumps online, by any chance ? That would be quite valuable.
I do not, but I can certainly setup something. Just give me a moment to clean up my collection into something I can share publicly.
Signature · 7 lines
Jean Delvare SUSE L3 Support _______________________________________________ lm-sensors mailing list [email protected] http://lists.lm-sensors.org/mailman/listinfo/lm-sensors
Guenter Roeck
maintainerQuoted 7 lines · Jean Delvare
Quoted 2 lines · Guenter Roeck
Do you have all those register dumps online, by any chance ? That would be quite valuable.
I do not, but I can certainly setup something. Just give me a moment to clean up my collection into something I can share publicly.
That would be great - thanks a lot!
Guenter
_______________________________________________
lm-sensors mailing list
[email protected]
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors
Hi Guenter,
Quoted 2 lines · Guenter Roeck
Do you have all those register dumps online, by any chance ? That would be quite valuable.
I'm done cleaning up my 200 hwmon dump file collection, you can find it all online at:
http://jdelvare.nerim.net/devel/lm-sensors/dumps/
Note: some I got from you ;-)
I've also packed them for easier download:
http://jdelvare.nerim.net/devel/lm-sensors/dumps/hwmon-dumps.tar.gz
Signature · 7 lines
Jean Delvare SUSE L3 Support _______________________________________________ lm-sensors mailing list [email protected] http://lists.lm-sensors.org/mailman/listinfo/lm-sensors
Guenter Roeck
maintainerQuoted 6 lines · Jean Delvare
Hi Guenter,
Quoted 2 lines · Guenter Roeck
Do you have all those register dumps online, by any chance ? That would be quite valuable.
Quoted 9 lines
I'm done cleaning up my 200 hwmon dump file collection, you can find it all online at:
http://jdelvare.nerim.net/devel/lm-sensors/dumps/Note: some I got from you ;-)
I've also packed them for easier download:
http://jdelvare.nerim.net/devel/lm-sensors/dumps/hwmon-dumps.tar.gz
Thanks a lot!
Guenter
_______________________________________________
lm-sensors mailing list
[email protected]
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors