diff options
Diffstat (limited to 'drivers/hwmon/ds1621.c')
| -rw-r--r-- | drivers/hwmon/ds1621.c | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/drivers/hwmon/ds1621.c b/drivers/hwmon/ds1621.c index 478eb4bb8570..c849c0c6ee9c 100644 --- a/drivers/hwmon/ds1621.c +++ b/drivers/hwmon/ds1621.c | |||
| @@ -29,6 +29,7 @@ | |||
| 29 | #include <linux/hwmon.h> | 29 | #include <linux/hwmon.h> |
| 30 | #include <linux/err.h> | 30 | #include <linux/err.h> |
| 31 | #include <linux/mutex.h> | 31 | #include <linux/mutex.h> |
| 32 | #include <linux/sysfs.h> | ||
| 32 | #include "lm75.h" | 33 | #include "lm75.h" |
| 33 | 34 | ||
| 34 | /* Addresses to scan */ | 35 | /* Addresses to scan */ |
| @@ -178,6 +179,18 @@ static DEVICE_ATTR(temp1_input, S_IRUGO , show_temp, NULL); | |||
| 178 | static DEVICE_ATTR(temp1_min, S_IWUSR | S_IRUGO , show_temp_min, set_temp_min); | 179 | static DEVICE_ATTR(temp1_min, S_IWUSR | S_IRUGO , show_temp_min, set_temp_min); |
| 179 | static DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, show_temp_max, set_temp_max); | 180 | static DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, show_temp_max, set_temp_max); |
| 180 | 181 | ||
| 182 | static struct attribute *ds1621_attributes[] = { | ||
| 183 | &dev_attr_temp1_input.attr, | ||
| 184 | &dev_attr_temp1_min.attr, | ||
| 185 | &dev_attr_temp1_max.attr, | ||
| 186 | &dev_attr_alarms.attr, | ||
| 187 | NULL | ||
| 188 | }; | ||
| 189 | |||
| 190 | static const struct attribute_group ds1621_group = { | ||
| 191 | .attrs = ds1621_attributes, | ||
| 192 | }; | ||
| 193 | |||
| 181 | 194 | ||
| 182 | static int ds1621_attach_adapter(struct i2c_adapter *adapter) | 195 | static int ds1621_attach_adapter(struct i2c_adapter *adapter) |
| 183 | { | 196 | { |
| @@ -253,21 +266,19 @@ static int ds1621_detect(struct i2c_adapter *adapter, int address, | |||
| 253 | ds1621_init_client(new_client); | 266 | ds1621_init_client(new_client); |
| 254 | 267 | ||
| 255 | /* Register sysfs hooks */ | 268 | /* Register sysfs hooks */ |
| 269 | if ((err = sysfs_create_group(&new_client->dev.kobj, &ds1621_group))) | ||
| 270 | goto exit_detach; | ||
| 271 | |||
| 256 | data->class_dev = hwmon_device_register(&new_client->dev); | 272 | data->class_dev = hwmon_device_register(&new_client->dev); |
| 257 | if (IS_ERR(data->class_dev)) { | 273 | if (IS_ERR(data->class_dev)) { |
| 258 | err = PTR_ERR(data->class_dev); | 274 | err = PTR_ERR(data->class_dev); |
| 259 | goto exit_detach; | 275 | goto exit_remove_files; |
| 260 | } | 276 | } |
| 261 | 277 | ||
| 262 | device_create_file(&new_client->dev, &dev_attr_alarms); | ||
| 263 | device_create_file(&new_client->dev, &dev_attr_temp1_input); | ||
| 264 | device_create_file(&new_client->dev, &dev_attr_temp1_min); | ||
| 265 | device_create_file(&new_client->dev, &dev_attr_temp1_max); | ||
| 266 | |||
| 267 | return 0; | 278 | return 0; |
| 268 | 279 | ||
| 269 | /* OK, this is not exactly good programming practice, usually. But it is | 280 | exit_remove_files: |
| 270 | very code-efficient in this case. */ | 281 | sysfs_remove_group(&new_client->dev.kobj, &ds1621_group); |
| 271 | exit_detach: | 282 | exit_detach: |
| 272 | i2c_detach_client(new_client); | 283 | i2c_detach_client(new_client); |
| 273 | exit_free: | 284 | exit_free: |
| @@ -282,6 +293,7 @@ static int ds1621_detach_client(struct i2c_client *client) | |||
| 282 | int err; | 293 | int err; |
| 283 | 294 | ||
| 284 | hwmon_device_unregister(data->class_dev); | 295 | hwmon_device_unregister(data->class_dev); |
| 296 | sysfs_remove_group(&client->dev.kobj, &ds1621_group); | ||
| 285 | 297 | ||
| 286 | if ((err = i2c_detach_client(client))) | 298 | if ((err = i2c_detach_client(client))) |
| 287 | return err; | 299 | return err; |
