diff options
author | Axel Lin <axel.lin@ingics.com> | 2014-07-17 07:21:44 -0400 |
---|---|---|
committer | Guenter Roeck <linux@roeck-us.net> | 2014-08-04 10:01:39 -0400 |
commit | 166f72966d69334a68774abb7eaa73eece54d464 (patch) | |
tree | ab668a745540adcd12ec6167848a8a7e9f88ca33 /drivers/hwmon/smsc47m192.c | |
parent | 94314e259333892e7b085cd343720bbdc2fa67c5 (diff) |
hwmon: (smsc47m192) Convert to devm_hwmon_device_register_with_groups
Use devm_hwmon_device_register_with_groups() to simplify the code a bit.
Signed-off-by: Axel Lin <axel.lin@ingics.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Diffstat (limited to 'drivers/hwmon/smsc47m192.c')
-rw-r--r-- | drivers/hwmon/smsc47m192.c | 77 |
1 files changed, 25 insertions, 52 deletions
diff --git a/drivers/hwmon/smsc47m192.c b/drivers/hwmon/smsc47m192.c index fcada5db86fc..6ac7cda72d4c 100644 --- a/drivers/hwmon/smsc47m192.c +++ b/drivers/hwmon/smsc47m192.c | |||
@@ -95,7 +95,8 @@ static inline int TEMP_FROM_REG(s8 val) | |||
95 | } | 95 | } |
96 | 96 | ||
97 | struct smsc47m192_data { | 97 | struct smsc47m192_data { |
98 | struct device *hwmon_dev; | 98 | struct i2c_client *client; |
99 | const struct attribute_group *groups[3]; | ||
99 | struct mutex update_lock; | 100 | struct mutex update_lock; |
100 | char valid; /* !=0 if following fields are valid */ | 101 | char valid; /* !=0 if following fields are valid */ |
101 | unsigned long last_updated; /* In jiffies */ | 102 | unsigned long last_updated; /* In jiffies */ |
@@ -114,8 +115,8 @@ struct smsc47m192_data { | |||
114 | 115 | ||
115 | static struct smsc47m192_data *smsc47m192_update_device(struct device *dev) | 116 | static struct smsc47m192_data *smsc47m192_update_device(struct device *dev) |
116 | { | 117 | { |
117 | struct i2c_client *client = to_i2c_client(dev); | 118 | struct smsc47m192_data *data = dev_get_drvdata(dev); |
118 | struct smsc47m192_data *data = i2c_get_clientdata(client); | 119 | struct i2c_client *client = data->client; |
119 | int i, config; | 120 | int i, config; |
120 | 121 | ||
121 | mutex_lock(&data->update_lock); | 122 | mutex_lock(&data->update_lock); |
@@ -209,8 +210,8 @@ static ssize_t set_in_min(struct device *dev, struct device_attribute *attr, | |||
209 | { | 210 | { |
210 | struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); | 211 | struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); |
211 | int nr = sensor_attr->index; | 212 | int nr = sensor_attr->index; |
212 | struct i2c_client *client = to_i2c_client(dev); | 213 | struct smsc47m192_data *data = dev_get_drvdata(dev); |
213 | struct smsc47m192_data *data = i2c_get_clientdata(client); | 214 | struct i2c_client *client = data->client; |
214 | unsigned long val; | 215 | unsigned long val; |
215 | int err; | 216 | int err; |
216 | 217 | ||
@@ -231,8 +232,8 @@ static ssize_t set_in_max(struct device *dev, struct device_attribute *attr, | |||
231 | { | 232 | { |
232 | struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); | 233 | struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); |
233 | int nr = sensor_attr->index; | 234 | int nr = sensor_attr->index; |
234 | struct i2c_client *client = to_i2c_client(dev); | 235 | struct smsc47m192_data *data = dev_get_drvdata(dev); |
235 | struct smsc47m192_data *data = i2c_get_clientdata(client); | 236 | struct i2c_client *client = data->client; |
236 | unsigned long val; | 237 | unsigned long val; |
237 | int err; | 238 | int err; |
238 | 239 | ||
@@ -298,8 +299,8 @@ static ssize_t set_temp_min(struct device *dev, struct device_attribute *attr, | |||
298 | { | 299 | { |
299 | struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); | 300 | struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); |
300 | int nr = sensor_attr->index; | 301 | int nr = sensor_attr->index; |
301 | struct i2c_client *client = to_i2c_client(dev); | 302 | struct smsc47m192_data *data = dev_get_drvdata(dev); |
302 | struct smsc47m192_data *data = i2c_get_clientdata(client); | 303 | struct i2c_client *client = data->client; |
303 | long val; | 304 | long val; |
304 | int err; | 305 | int err; |
305 | 306 | ||
@@ -320,8 +321,8 @@ static ssize_t set_temp_max(struct device *dev, struct device_attribute *attr, | |||
320 | { | 321 | { |
321 | struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); | 322 | struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); |
322 | int nr = sensor_attr->index; | 323 | int nr = sensor_attr->index; |
323 | struct i2c_client *client = to_i2c_client(dev); | 324 | struct smsc47m192_data *data = dev_get_drvdata(dev); |
324 | struct smsc47m192_data *data = i2c_get_clientdata(client); | 325 | struct i2c_client *client = data->client; |
325 | long val; | 326 | long val; |
326 | int err; | 327 | int err; |
327 | 328 | ||
@@ -351,8 +352,8 @@ static ssize_t set_temp_offset(struct device *dev, struct device_attribute | |||
351 | { | 352 | { |
352 | struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); | 353 | struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); |
353 | int nr = sensor_attr->index; | 354 | int nr = sensor_attr->index; |
354 | struct i2c_client *client = to_i2c_client(dev); | 355 | struct smsc47m192_data *data = dev_get_drvdata(dev); |
355 | struct smsc47m192_data *data = i2c_get_clientdata(client); | 356 | struct i2c_client *client = data->client; |
356 | u8 sfr = i2c_smbus_read_byte_data(client, SMSC47M192_REG_SFR); | 357 | u8 sfr = i2c_smbus_read_byte_data(client, SMSC47M192_REG_SFR); |
357 | long val; | 358 | long val; |
358 | int err; | 359 | int err; |
@@ -591,59 +592,32 @@ static int smsc47m192_detect(struct i2c_client *client, | |||
591 | static int smsc47m192_probe(struct i2c_client *client, | 592 | static int smsc47m192_probe(struct i2c_client *client, |
592 | const struct i2c_device_id *id) | 593 | const struct i2c_device_id *id) |
593 | { | 594 | { |
595 | struct device *dev = &client->dev; | ||
596 | struct device *hwmon_dev; | ||
594 | struct smsc47m192_data *data; | 597 | struct smsc47m192_data *data; |
595 | int config; | 598 | int config; |
596 | int err; | ||
597 | 599 | ||
598 | data = devm_kzalloc(&client->dev, sizeof(struct smsc47m192_data), | 600 | data = devm_kzalloc(dev, sizeof(struct smsc47m192_data), GFP_KERNEL); |
599 | GFP_KERNEL); | ||
600 | if (!data) | 601 | if (!data) |
601 | return -ENOMEM; | 602 | return -ENOMEM; |
602 | 603 | ||
603 | i2c_set_clientdata(client, data); | 604 | data->client = client; |
604 | data->vrm = vid_which_vrm(); | 605 | data->vrm = vid_which_vrm(); |
605 | mutex_init(&data->update_lock); | 606 | mutex_init(&data->update_lock); |
606 | 607 | ||
607 | /* Initialize the SMSC47M192 chip */ | 608 | /* Initialize the SMSC47M192 chip */ |
608 | smsc47m192_init_client(client); | 609 | smsc47m192_init_client(client); |
609 | 610 | ||
610 | /* Register sysfs hooks */ | 611 | /* sysfs hooks */ |
611 | err = sysfs_create_group(&client->dev.kobj, &smsc47m192_group); | 612 | data->groups[0] = &smsc47m192_group; |
612 | if (err) | ||
613 | return err; | ||
614 | |||
615 | /* Pin 110 is either in4 (+12V) or VID4 */ | 613 | /* Pin 110 is either in4 (+12V) or VID4 */ |
616 | config = i2c_smbus_read_byte_data(client, SMSC47M192_REG_CONFIG); | 614 | config = i2c_smbus_read_byte_data(client, SMSC47M192_REG_CONFIG); |
617 | if (!(config & 0x20)) { | 615 | if (!(config & 0x20)) |
618 | err = sysfs_create_group(&client->dev.kobj, | 616 | data->groups[1] = &smsc47m192_group_in4; |
619 | &smsc47m192_group_in4); | ||
620 | if (err) | ||
621 | goto exit_remove_files; | ||
622 | } | ||
623 | |||
624 | data->hwmon_dev = hwmon_device_register(&client->dev); | ||
625 | if (IS_ERR(data->hwmon_dev)) { | ||
626 | err = PTR_ERR(data->hwmon_dev); | ||
627 | goto exit_remove_files; | ||
628 | } | ||
629 | 617 | ||
630 | return 0; | 618 | hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name, |
631 | 619 | data, data->groups); | |
632 | exit_remove_files: | 620 | return PTR_ERR_OR_ZERO(hwmon_dev); |
633 | sysfs_remove_group(&client->dev.kobj, &smsc47m192_group); | ||
634 | sysfs_remove_group(&client->dev.kobj, &smsc47m192_group_in4); | ||
635 | return err; | ||
636 | } | ||
637 | |||
638 | static int smsc47m192_remove(struct i2c_client *client) | ||
639 | { | ||
640 | struct smsc47m192_data *data = i2c_get_clientdata(client); | ||
641 | |||
642 | hwmon_device_unregister(data->hwmon_dev); | ||
643 | sysfs_remove_group(&client->dev.kobj, &smsc47m192_group); | ||
644 | sysfs_remove_group(&client->dev.kobj, &smsc47m192_group_in4); | ||
645 | |||
646 | return 0; | ||
647 | } | 621 | } |
648 | 622 | ||
649 | static const struct i2c_device_id smsc47m192_id[] = { | 623 | static const struct i2c_device_id smsc47m192_id[] = { |
@@ -658,7 +632,6 @@ static struct i2c_driver smsc47m192_driver = { | |||
658 | .name = "smsc47m192", | 632 | .name = "smsc47m192", |
659 | }, | 633 | }, |
660 | .probe = smsc47m192_probe, | 634 | .probe = smsc47m192_probe, |
661 | .remove = smsc47m192_remove, | ||
662 | .id_table = smsc47m192_id, | 635 | .id_table = smsc47m192_id, |
663 | .detect = smsc47m192_detect, | 636 | .detect = smsc47m192_detect, |
664 | .address_list = normal_i2c, | 637 | .address_list = normal_i2c, |