|
@@ -366,6 +366,7 @@ enum lm90_temp11_reg_index {
|
|
|
|
|
|
struct lm90_data {
|
|
|
struct device *hwmon_dev;
|
|
|
+ const struct attribute_group *groups[6];
|
|
|
struct mutex update_lock;
|
|
|
struct regulator *regulator;
|
|
|
char valid; /* zero until following fields are valid */
|
|
@@ -1402,22 +1403,6 @@ static int lm90_detect(struct i2c_client *client,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static void lm90_remove_files(struct i2c_client *client, struct lm90_data *data)
|
|
|
-{
|
|
|
- struct device *dev = &client->dev;
|
|
|
-
|
|
|
- if (data->flags & LM90_HAVE_TEMP3)
|
|
|
- sysfs_remove_group(&dev->kobj, &lm90_temp3_group);
|
|
|
- if (data->flags & LM90_HAVE_EMERGENCY_ALARM)
|
|
|
- sysfs_remove_group(&dev->kobj, &lm90_emergency_alarm_group);
|
|
|
- if (data->flags & LM90_HAVE_EMERGENCY)
|
|
|
- sysfs_remove_group(&dev->kobj, &lm90_emergency_group);
|
|
|
- if (data->flags & LM90_HAVE_OFFSET)
|
|
|
- sysfs_remove_group(&dev->kobj, &lm90_temp2_offset_group);
|
|
|
- device_remove_file(dev, &dev_attr_pec);
|
|
|
- sysfs_remove_group(&dev->kobj, &lm90_group);
|
|
|
-}
|
|
|
-
|
|
|
static void lm90_restore_conf(struct i2c_client *client, struct lm90_data *data)
|
|
|
{
|
|
|
/* Restore initial configuration */
|
|
@@ -1528,6 +1513,7 @@ static int lm90_probe(struct i2c_client *client,
|
|
|
struct i2c_adapter *adapter = to_i2c_adapter(dev->parent);
|
|
|
struct lm90_data *data;
|
|
|
struct regulator *regulator;
|
|
|
+ int groups = 0;
|
|
|
int err;
|
|
|
|
|
|
regulator = devm_regulator_get(dev, "vcc");
|
|
@@ -1573,36 +1559,30 @@ static int lm90_probe(struct i2c_client *client,
|
|
|
lm90_init_client(client);
|
|
|
|
|
|
/* Register sysfs hooks */
|
|
|
- err = sysfs_create_group(&dev->kobj, &lm90_group);
|
|
|
- if (err)
|
|
|
- goto exit_restore;
|
|
|
+ data->groups[groups++] = &lm90_group;
|
|
|
+
|
|
|
+ if (data->flags & LM90_HAVE_OFFSET)
|
|
|
+ data->groups[groups++] = &lm90_temp2_offset_group;
|
|
|
+
|
|
|
+ if (data->flags & LM90_HAVE_EMERGENCY)
|
|
|
+ data->groups[groups++] = &lm90_emergency_group;
|
|
|
+
|
|
|
+ if (data->flags & LM90_HAVE_EMERGENCY_ALARM)
|
|
|
+ data->groups[groups++] = &lm90_emergency_alarm_group;
|
|
|
+
|
|
|
+ if (data->flags & LM90_HAVE_TEMP3)
|
|
|
+ data->groups[groups++] = &lm90_temp3_group;
|
|
|
+
|
|
|
if (client->flags & I2C_CLIENT_PEC) {
|
|
|
err = device_create_file(dev, &dev_attr_pec);
|
|
|
if (err)
|
|
|
- goto exit_remove_files;
|
|
|
- }
|
|
|
- if (data->flags & LM90_HAVE_OFFSET) {
|
|
|
- err = sysfs_create_group(&dev->kobj, &lm90_temp2_offset_group);
|
|
|
- if (err)
|
|
|
- goto exit_remove_files;
|
|
|
- }
|
|
|
- if (data->flags & LM90_HAVE_EMERGENCY) {
|
|
|
- err = sysfs_create_group(&dev->kobj, &lm90_emergency_group);
|
|
|
- if (err)
|
|
|
- goto exit_remove_files;
|
|
|
- }
|
|
|
- if (data->flags & LM90_HAVE_EMERGENCY_ALARM) {
|
|
|
- err = sysfs_create_group(&dev->kobj,
|
|
|
- &lm90_emergency_alarm_group);
|
|
|
- if (err)
|
|
|
- goto exit_remove_files;
|
|
|
- }
|
|
|
- if (data->flags & LM90_HAVE_TEMP3) {
|
|
|
- err = sysfs_create_group(&dev->kobj, &lm90_temp3_group);
|
|
|
- if (err)
|
|
|
- goto exit_remove_files;
|
|
|
+ goto exit_restore;
|
|
|
}
|
|
|
|
|
|
+ err = sysfs_create_groups(&dev->kobj, data->groups);
|
|
|
+ if (err)
|
|
|
+ goto exit_remove_pec;
|
|
|
+
|
|
|
data->hwmon_dev = hwmon_device_register(dev);
|
|
|
if (IS_ERR(data->hwmon_dev)) {
|
|
|
err = PTR_ERR(data->hwmon_dev);
|
|
@@ -1626,7 +1606,9 @@ static int lm90_probe(struct i2c_client *client,
|
|
|
exit_unregister:
|
|
|
hwmon_device_unregister(data->hwmon_dev);
|
|
|
exit_remove_files:
|
|
|
- lm90_remove_files(client, data);
|
|
|
+ sysfs_remove_groups(&dev->kobj, data->groups);
|
|
|
+exit_remove_pec:
|
|
|
+ device_remove_file(dev, &dev_attr_pec);
|
|
|
exit_restore:
|
|
|
lm90_restore_conf(client, data);
|
|
|
regulator_disable(data->regulator);
|
|
@@ -1639,7 +1621,8 @@ static int lm90_remove(struct i2c_client *client)
|
|
|
struct lm90_data *data = i2c_get_clientdata(client);
|
|
|
|
|
|
hwmon_device_unregister(data->hwmon_dev);
|
|
|
- lm90_remove_files(client, data);
|
|
|
+ sysfs_remove_groups(&client->dev.kobj, data->groups);
|
|
|
+ device_remove_file(&client->dev, &dev_attr_pec);
|
|
|
lm90_restore_conf(client, data);
|
|
|
regulator_disable(data->regulator);
|
|
|
|