diff options
| author | Guenter Roeck <linux@roeck-us.net> | 2014-02-15 20:50:48 -0500 |
|---|---|---|
| committer | Guenter Roeck <linux@roeck-us.net> | 2014-03-03 11:01:04 -0500 |
| commit | 5230551a26f9f4ab41929b81bf4de96a37eb0ae5 (patch) | |
| tree | 8b7d5e02cf4d2b18a64b9af2b9ad97f1121f9718 /drivers | |
| parent | c5a706697f79b2aa5a2000f8024602320e37658f (diff) | |
hwmon: (max1668) 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 <linux@roeck-us.net>
Reviewed-by: Jean Delvare <jdelvare@suse.de>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/hwmon/max1668.c | 67 |
1 files changed, 18 insertions, 49 deletions
diff --git a/drivers/hwmon/max1668.c b/drivers/hwmon/max1668.c index bbbe340332b9..e3ed0a5b6d94 100644 --- a/drivers/hwmon/max1668.c +++ b/drivers/hwmon/max1668.c | |||
| @@ -66,7 +66,8 @@ MODULE_PARM_DESC(read_only, "Don't set any values, read only mode"); | |||
| 66 | enum chips { max1668, max1805, max1989 }; | 66 | enum chips { max1668, max1805, max1989 }; |
| 67 | 67 | ||
| 68 | struct max1668_data { | 68 | struct max1668_data { |
| 69 | struct device *hwmon_dev; | 69 | struct i2c_client *client; |
| 70 | const struct attribute_group *groups[3]; | ||
| 70 | enum chips type; | 71 | enum chips type; |
| 71 | 72 | ||
| 72 | struct mutex update_lock; | 73 | struct mutex update_lock; |
| @@ -82,8 +83,8 @@ struct max1668_data { | |||
| 82 | 83 | ||
| 83 | static struct max1668_data *max1668_update_device(struct device *dev) | 84 | static struct max1668_data *max1668_update_device(struct device *dev) |
| 84 | { | 85 | { |
| 85 | struct i2c_client *client = to_i2c_client(dev); | 86 | struct max1668_data *data = dev_get_drvdata(dev); |
| 86 | struct max1668_data *data = i2c_get_clientdata(client); | 87 | struct i2c_client *client = data->client; |
| 87 | struct max1668_data *ret = data; | 88 | struct max1668_data *ret = data; |
| 88 | s32 val; | 89 | s32 val; |
| 89 | int i; | 90 | int i; |
| @@ -205,8 +206,8 @@ static ssize_t set_temp_max(struct device *dev, | |||
| 205 | const char *buf, size_t count) | 206 | const char *buf, size_t count) |
| 206 | { | 207 | { |
| 207 | int index = to_sensor_dev_attr(devattr)->index; | 208 | int index = to_sensor_dev_attr(devattr)->index; |
| 208 | struct i2c_client *client = to_i2c_client(dev); | 209 | struct max1668_data *data = dev_get_drvdata(dev); |
| 209 | struct max1668_data *data = i2c_get_clientdata(client); | 210 | struct i2c_client *client = data->client; |
| 210 | long temp; | 211 | long temp; |
| 211 | int ret; | 212 | int ret; |
| 212 | 213 | ||
| @@ -231,8 +232,8 @@ static ssize_t set_temp_min(struct device *dev, | |||
| 231 | const char *buf, size_t count) | 232 | const char *buf, size_t count) |
| 232 | { | 233 | { |
| 233 | int index = to_sensor_dev_attr(devattr)->index; | 234 | int index = to_sensor_dev_attr(devattr)->index; |
| 234 | struct i2c_client *client = to_i2c_client(dev); | 235 | struct max1668_data *data = dev_get_drvdata(dev); |
| 235 | struct max1668_data *data = i2c_get_clientdata(client); | 236 | struct i2c_client *client = data->client; |
| 236 | long temp; | 237 | long temp; |
| 237 | int ret; | 238 | int ret; |
| 238 | 239 | ||
| @@ -407,60 +408,29 @@ static int max1668_probe(struct i2c_client *client, | |||
| 407 | const struct i2c_device_id *id) | 408 | const struct i2c_device_id *id) |
| 408 | { | 409 | { |
| 409 | struct i2c_adapter *adapter = client->adapter; | 410 | struct i2c_adapter *adapter = client->adapter; |
| 411 | struct device *dev = &client->dev; | ||
| 412 | struct device *hwmon_dev; | ||
| 410 | struct max1668_data *data; | 413 | struct max1668_data *data; |
| 411 | int err; | ||
| 412 | 414 | ||
| 413 | if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) | 415 | if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) |
| 414 | return -ENODEV; | 416 | return -ENODEV; |
| 415 | 417 | ||
| 416 | data = devm_kzalloc(&client->dev, sizeof(struct max1668_data), | 418 | data = devm_kzalloc(dev, sizeof(struct max1668_data), GFP_KERNEL); |
| 417 | GFP_KERNEL); | ||
| 418 | if (!data) | 419 | if (!data) |
| 419 | return -ENOMEM; | 420 | return -ENOMEM; |
| 420 | 421 | ||
| 421 | i2c_set_clientdata(client, data); | 422 | data->client = client; |
| 422 | data->type = id->driver_data; | 423 | data->type = id->driver_data; |
| 423 | mutex_init(&data->update_lock); | 424 | mutex_init(&data->update_lock); |
| 424 | 425 | ||
| 425 | /* Register sysfs hooks */ | 426 | /* sysfs hooks */ |
| 426 | err = sysfs_create_group(&client->dev.kobj, &max1668_group_common); | 427 | data->groups[0] = &max1668_group_common; |
| 427 | if (err) | ||
| 428 | return err; | ||
| 429 | |||
| 430 | if (data->type == max1668 || data->type == max1989) { | ||
| 431 | err = sysfs_create_group(&client->dev.kobj, | ||
| 432 | &max1668_group_unique); | ||
| 433 | if (err) | ||
| 434 | goto error_sysrem0; | ||
| 435 | } | ||
| 436 | |||
| 437 | data->hwmon_dev = hwmon_device_register(&client->dev); | ||
| 438 | if (IS_ERR(data->hwmon_dev)) { | ||
| 439 | err = PTR_ERR(data->hwmon_dev); | ||
| 440 | goto error_sysrem1; | ||
| 441 | } | ||
| 442 | |||
| 443 | return 0; | ||
| 444 | |||
| 445 | error_sysrem1: | ||
| 446 | if (data->type == max1668 || data->type == max1989) | ||
| 447 | sysfs_remove_group(&client->dev.kobj, &max1668_group_unique); | ||
| 448 | error_sysrem0: | ||
| 449 | sysfs_remove_group(&client->dev.kobj, &max1668_group_common); | ||
| 450 | return err; | ||
| 451 | } | ||
| 452 | |||
| 453 | static int max1668_remove(struct i2c_client *client) | ||
| 454 | { | ||
| 455 | struct max1668_data *data = i2c_get_clientdata(client); | ||
| 456 | |||
| 457 | hwmon_device_unregister(data->hwmon_dev); | ||
| 458 | if (data->type == max1668 || data->type == max1989) | 428 | if (data->type == max1668 || data->type == max1989) |
| 459 | sysfs_remove_group(&client->dev.kobj, &max1668_group_unique); | 429 | data->groups[1] = &max1668_group_unique; |
| 460 | 430 | ||
| 461 | sysfs_remove_group(&client->dev.kobj, &max1668_group_common); | 431 | hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name, |
| 462 | 432 | data, data->groups); | |
| 463 | return 0; | 433 | return PTR_ERR_OR_ZERO(hwmon_dev); |
| 464 | } | 434 | } |
| 465 | 435 | ||
| 466 | static const struct i2c_device_id max1668_id[] = { | 436 | static const struct i2c_device_id max1668_id[] = { |
| @@ -478,7 +448,6 @@ static struct i2c_driver max1668_driver = { | |||
| 478 | .name = "max1668", | 448 | .name = "max1668", |
| 479 | }, | 449 | }, |
| 480 | .probe = max1668_probe, | 450 | .probe = max1668_probe, |
| 481 | .remove = max1668_remove, | ||
| 482 | .id_table = max1668_id, | 451 | .id_table = max1668_id, |
| 483 | .detect = max1668_detect, | 452 | .detect = max1668_detect, |
| 484 | .address_list = max1668_addr_list, | 453 | .address_list = max1668_addr_list, |
