diff options
author | Axel Lin <axel.lin@ingics.com> | 2014-07-04 23:22:44 -0400 |
---|---|---|
committer | Guenter Roeck <linux@roeck-us.net> | 2014-08-04 10:01:37 -0400 |
commit | 8280325288176694a3c22e2f10fdab6d8de5bd99 (patch) | |
tree | 1f6c6c1514515c89df1d42d8db3010574cc0ef5a /drivers/hwmon/lineage-pem.c | |
parent | 781126a0c8debc713a07da16c790253dadb33184 (diff) |
hwmon: (lineage-pem) 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.
Signed-off-by: Axel Lin <axel.lin@ingics.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Diffstat (limited to 'drivers/hwmon/lineage-pem.c')
-rw-r--r-- | drivers/hwmon/lineage-pem.c | 66 |
1 files changed, 19 insertions, 47 deletions
diff --git a/drivers/hwmon/lineage-pem.c b/drivers/hwmon/lineage-pem.c index ebbb9f4f27a3..84d791bdb62d 100644 --- a/drivers/hwmon/lineage-pem.c +++ b/drivers/hwmon/lineage-pem.c | |||
@@ -125,7 +125,8 @@ | |||
125 | #define FAN_SPEED_LEN 5 | 125 | #define FAN_SPEED_LEN 5 |
126 | 126 | ||
127 | struct pem_data { | 127 | struct pem_data { |
128 | struct device *hwmon_dev; | 128 | struct i2c_client *client; |
129 | const struct attribute_group *groups[4]; | ||
129 | 130 | ||
130 | struct mutex update_lock; | 131 | struct mutex update_lock; |
131 | bool valid; | 132 | bool valid; |
@@ -160,8 +161,8 @@ abort: | |||
160 | 161 | ||
161 | static struct pem_data *pem_update_device(struct device *dev) | 162 | static struct pem_data *pem_update_device(struct device *dev) |
162 | { | 163 | { |
163 | struct i2c_client *client = to_i2c_client(dev); | 164 | struct pem_data *data = dev_get_drvdata(dev); |
164 | struct pem_data *data = i2c_get_clientdata(client); | 165 | struct i2c_client *client = data->client; |
165 | struct pem_data *ret = data; | 166 | struct pem_data *ret = data; |
166 | 167 | ||
167 | mutex_lock(&data->update_lock); | 168 | mutex_lock(&data->update_lock); |
@@ -444,18 +445,20 @@ static int pem_probe(struct i2c_client *client, | |||
444 | const struct i2c_device_id *id) | 445 | const struct i2c_device_id *id) |
445 | { | 446 | { |
446 | struct i2c_adapter *adapter = client->adapter; | 447 | struct i2c_adapter *adapter = client->adapter; |
448 | struct device *dev = &client->dev; | ||
449 | struct device *hwmon_dev; | ||
447 | struct pem_data *data; | 450 | struct pem_data *data; |
448 | int ret; | 451 | int ret, idx = 0; |
449 | 452 | ||
450 | if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BLOCK_DATA | 453 | if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BLOCK_DATA |
451 | | I2C_FUNC_SMBUS_WRITE_BYTE)) | 454 | | I2C_FUNC_SMBUS_WRITE_BYTE)) |
452 | return -ENODEV; | 455 | return -ENODEV; |
453 | 456 | ||
454 | data = devm_kzalloc(&client->dev, sizeof(*data), GFP_KERNEL); | 457 | data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); |
455 | if (!data) | 458 | if (!data) |
456 | return -ENOMEM; | 459 | return -ENOMEM; |
457 | 460 | ||
458 | i2c_set_clientdata(client, data); | 461 | data->client = client; |
459 | mutex_init(&data->update_lock); | 462 | mutex_init(&data->update_lock); |
460 | 463 | ||
461 | /* | 464 | /* |
@@ -471,14 +474,12 @@ static int pem_probe(struct i2c_client *client, | |||
471 | if (ret < 0) | 474 | if (ret < 0) |
472 | return ret; | 475 | return ret; |
473 | 476 | ||
474 | dev_info(&client->dev, "Firmware revision %d.%d.%d\n", | 477 | dev_info(dev, "Firmware revision %d.%d.%d\n", |
475 | data->firmware_rev[0], data->firmware_rev[1], | 478 | data->firmware_rev[0], data->firmware_rev[1], |
476 | data->firmware_rev[2]); | 479 | data->firmware_rev[2]); |
477 | 480 | ||
478 | /* Register sysfs hooks */ | 481 | /* sysfs hooks */ |
479 | ret = sysfs_create_group(&client->dev.kobj, &pem_group); | 482 | data->groups[idx++] = &pem_group; |
480 | if (ret) | ||
481 | return ret; | ||
482 | 483 | ||
483 | /* | 484 | /* |
484 | * Check if input readings are supported. | 485 | * Check if input readings are supported. |
@@ -501,12 +502,9 @@ static int pem_probe(struct i2c_client *client, | |||
501 | data->input_string[2] || data->input_string[3])) | 502 | data->input_string[2] || data->input_string[3])) |
502 | data->input_length = sizeof(data->input_string); | 503 | data->input_length = sizeof(data->input_string); |
503 | } | 504 | } |
504 | ret = 0; | 505 | |
505 | if (data->input_length) { | 506 | if (data->input_length) |
506 | ret = sysfs_create_group(&client->dev.kobj, &pem_input_group); | 507 | data->groups[idx++] = &pem_input_group; |
507 | if (ret) | ||
508 | goto out_remove_groups; | ||
509 | } | ||
510 | 508 | ||
511 | /* | 509 | /* |
512 | * Check if fan speed readings are supported. | 510 | * Check if fan speed readings are supported. |
@@ -520,37 +518,12 @@ static int pem_probe(struct i2c_client *client, | |||
520 | if (!ret && (data->fan_speed[0] || data->fan_speed[1] || | 518 | if (!ret && (data->fan_speed[0] || data->fan_speed[1] || |
521 | data->fan_speed[2] || data->fan_speed[3])) { | 519 | data->fan_speed[2] || data->fan_speed[3])) { |
522 | data->fans_supported = true; | 520 | data->fans_supported = true; |
523 | ret = sysfs_create_group(&client->dev.kobj, &pem_fan_group); | 521 | data->groups[idx++] = &pem_fan_group; |
524 | if (ret) | ||
525 | goto out_remove_groups; | ||
526 | } | ||
527 | |||
528 | data->hwmon_dev = hwmon_device_register(&client->dev); | ||
529 | if (IS_ERR(data->hwmon_dev)) { | ||
530 | ret = PTR_ERR(data->hwmon_dev); | ||
531 | goto out_remove_groups; | ||
532 | } | 522 | } |
533 | 523 | ||
534 | return 0; | 524 | hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name, |
535 | 525 | data, data->groups); | |
536 | out_remove_groups: | 526 | return PTR_ERR_OR_ZERO(hwmon_dev); |
537 | sysfs_remove_group(&client->dev.kobj, &pem_input_group); | ||
538 | sysfs_remove_group(&client->dev.kobj, &pem_fan_group); | ||
539 | sysfs_remove_group(&client->dev.kobj, &pem_group); | ||
540 | return ret; | ||
541 | } | ||
542 | |||
543 | static int pem_remove(struct i2c_client *client) | ||
544 | { | ||
545 | struct pem_data *data = i2c_get_clientdata(client); | ||
546 | |||
547 | hwmon_device_unregister(data->hwmon_dev); | ||
548 | |||
549 | sysfs_remove_group(&client->dev.kobj, &pem_input_group); | ||
550 | sysfs_remove_group(&client->dev.kobj, &pem_fan_group); | ||
551 | sysfs_remove_group(&client->dev.kobj, &pem_group); | ||
552 | |||
553 | return 0; | ||
554 | } | 527 | } |
555 | 528 | ||
556 | static const struct i2c_device_id pem_id[] = { | 529 | static const struct i2c_device_id pem_id[] = { |
@@ -564,7 +537,6 @@ static struct i2c_driver pem_driver = { | |||
564 | .name = "lineage_pem", | 537 | .name = "lineage_pem", |
565 | }, | 538 | }, |
566 | .probe = pem_probe, | 539 | .probe = pem_probe, |
567 | .remove = pem_remove, | ||
568 | .id_table = pem_id, | 540 | .id_table = pem_id, |
569 | }; | 541 | }; |
570 | 542 | ||