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; |