aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon/lineage-pem.c
diff options
context:
space:
mode:
authorAxel Lin <axel.lin@ingics.com>2014-07-04 23:22:44 -0400
committerGuenter Roeck <linux@roeck-us.net>2014-08-04 10:01:37 -0400
commit8280325288176694a3c22e2f10fdab6d8de5bd99 (patch)
tree1f6c6c1514515c89df1d42d8db3010574cc0ef5a /drivers/hwmon/lineage-pem.c
parent781126a0c8debc713a07da16c790253dadb33184 (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.c66
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
127struct pem_data { 127struct 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
161static struct pem_data *pem_update_device(struct device *dev) 162static 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);
536out_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
543static 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
556static const struct i2c_device_id pem_id[] = { 529static 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