diff options
author | Axel Lin <axel.lin@ingics.com> | 2014-07-19 10:29:44 -0400 |
---|---|---|
committer | Guenter Roeck <linux@roeck-us.net> | 2014-08-04 10:01:40 -0400 |
commit | 398e16db62620dd80a237c5043bec5c9335ac92c (patch) | |
tree | 1b136ff99062a7319f6cfb58611e57ca7fb3ec4b | |
parent | 9dd304f86b4b1921c0b7601b3e88a07b257fc2d2 (diff) |
hwmon: (g762) Convert to hwmon_device_register_with_groups
Use ATTRIBUTE_GROUPS macro and hwmon_device_register_with_groups() to simplify
the code a bit.
Use hwmon_device_register_with_groups rather than the device managed version to
ensure g762_of_clock_disable() is called after hwmon_device_unregister().
Signed-off-by: Axel Lin <axel.lin@ingics.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
-rw-r--r-- | drivers/hwmon/g762.c | 71 |
1 files changed, 27 insertions, 44 deletions
diff --git a/drivers/hwmon/g762.c b/drivers/hwmon/g762.c index 98a8618d8fbf..7dbc8c988b59 100644 --- a/drivers/hwmon/g762.c +++ b/drivers/hwmon/g762.c | |||
@@ -128,8 +128,8 @@ enum g762_regs { | |||
128 | G762_REG_FAN_CMD2_GEAR_MODE_1)) >> 2)) | 128 | G762_REG_FAN_CMD2_GEAR_MODE_1)) >> 2)) |
129 | 129 | ||
130 | struct g762_data { | 130 | struct g762_data { |
131 | struct i2c_client *client; | ||
132 | struct device *hwmon_dev; | 131 | struct device *hwmon_dev; |
132 | struct i2c_client *client; | ||
133 | struct clk *clk; | 133 | struct clk *clk; |
134 | 134 | ||
135 | /* update mutex */ | 135 | /* update mutex */ |
@@ -206,8 +206,8 @@ static inline unsigned char cnt_from_rpm(u32 rpm, u32 clk_freq, u16 p, | |||
206 | /* helper to grab and cache data, at most one time per second */ | 206 | /* helper to grab and cache data, at most one time per second */ |
207 | static struct g762_data *g762_update_client(struct device *dev) | 207 | static struct g762_data *g762_update_client(struct device *dev) |
208 | { | 208 | { |
209 | struct i2c_client *client = to_i2c_client(dev); | 209 | struct g762_data *data = dev_get_drvdata(dev); |
210 | struct g762_data *data = i2c_get_clientdata(client); | 210 | struct i2c_client *client = data->client; |
211 | int ret = 0; | 211 | int ret = 0; |
212 | 212 | ||
213 | mutex_lock(&data->update_lock); | 213 | mutex_lock(&data->update_lock); |
@@ -266,8 +266,7 @@ static struct g762_data *g762_update_client(struct device *dev) | |||
266 | */ | 266 | */ |
267 | static int do_set_clk_freq(struct device *dev, unsigned long val) | 267 | static int do_set_clk_freq(struct device *dev, unsigned long val) |
268 | { | 268 | { |
269 | struct i2c_client *client = to_i2c_client(dev); | 269 | struct g762_data *data = dev_get_drvdata(dev); |
270 | struct g762_data *data = i2c_get_clientdata(client); | ||
271 | 270 | ||
272 | if (val > 0xffffff) | 271 | if (val > 0xffffff) |
273 | return -EINVAL; | 272 | return -EINVAL; |
@@ -282,7 +281,6 @@ static int do_set_clk_freq(struct device *dev, unsigned long val) | |||
282 | /* Set pwm mode. Accepts either 0 (PWM mode) or 1 (DC mode) */ | 281 | /* Set pwm mode. Accepts either 0 (PWM mode) or 1 (DC mode) */ |
283 | static int do_set_pwm_mode(struct device *dev, unsigned long val) | 282 | static int do_set_pwm_mode(struct device *dev, unsigned long val) |
284 | { | 283 | { |
285 | struct i2c_client *client = to_i2c_client(dev); | ||
286 | struct g762_data *data = g762_update_client(dev); | 284 | struct g762_data *data = g762_update_client(dev); |
287 | int ret; | 285 | int ret; |
288 | 286 | ||
@@ -301,7 +299,7 @@ static int do_set_pwm_mode(struct device *dev, unsigned long val) | |||
301 | ret = -EINVAL; | 299 | ret = -EINVAL; |
302 | goto out; | 300 | goto out; |
303 | } | 301 | } |
304 | ret = i2c_smbus_write_byte_data(client, G762_REG_FAN_CMD1, | 302 | ret = i2c_smbus_write_byte_data(data->client, G762_REG_FAN_CMD1, |
305 | data->fan_cmd1); | 303 | data->fan_cmd1); |
306 | data->valid = false; | 304 | data->valid = false; |
307 | out: | 305 | out: |
@@ -313,7 +311,6 @@ static int do_set_pwm_mode(struct device *dev, unsigned long val) | |||
313 | /* Set fan clock divisor. Accepts either 1, 2, 4 or 8. */ | 311 | /* Set fan clock divisor. Accepts either 1, 2, 4 or 8. */ |
314 | static int do_set_fan_div(struct device *dev, unsigned long val) | 312 | static int do_set_fan_div(struct device *dev, unsigned long val) |
315 | { | 313 | { |
316 | struct i2c_client *client = to_i2c_client(dev); | ||
317 | struct g762_data *data = g762_update_client(dev); | 314 | struct g762_data *data = g762_update_client(dev); |
318 | int ret; | 315 | int ret; |
319 | 316 | ||
@@ -342,7 +339,7 @@ static int do_set_fan_div(struct device *dev, unsigned long val) | |||
342 | ret = -EINVAL; | 339 | ret = -EINVAL; |
343 | goto out; | 340 | goto out; |
344 | } | 341 | } |
345 | ret = i2c_smbus_write_byte_data(client, G762_REG_FAN_CMD1, | 342 | ret = i2c_smbus_write_byte_data(data->client, G762_REG_FAN_CMD1, |
346 | data->fan_cmd1); | 343 | data->fan_cmd1); |
347 | data->valid = false; | 344 | data->valid = false; |
348 | out: | 345 | out: |
@@ -354,7 +351,6 @@ static int do_set_fan_div(struct device *dev, unsigned long val) | |||
354 | /* Set fan gear mode. Accepts either 0, 1 or 2. */ | 351 | /* Set fan gear mode. Accepts either 0, 1 or 2. */ |
355 | static int do_set_fan_gear_mode(struct device *dev, unsigned long val) | 352 | static int do_set_fan_gear_mode(struct device *dev, unsigned long val) |
356 | { | 353 | { |
357 | struct i2c_client *client = to_i2c_client(dev); | ||
358 | struct g762_data *data = g762_update_client(dev); | 354 | struct g762_data *data = g762_update_client(dev); |
359 | int ret; | 355 | int ret; |
360 | 356 | ||
@@ -379,7 +375,7 @@ static int do_set_fan_gear_mode(struct device *dev, unsigned long val) | |||
379 | ret = -EINVAL; | 375 | ret = -EINVAL; |
380 | goto out; | 376 | goto out; |
381 | } | 377 | } |
382 | ret = i2c_smbus_write_byte_data(client, G762_REG_FAN_CMD2, | 378 | ret = i2c_smbus_write_byte_data(data->client, G762_REG_FAN_CMD2, |
383 | data->fan_cmd2); | 379 | data->fan_cmd2); |
384 | data->valid = false; | 380 | data->valid = false; |
385 | out: | 381 | out: |
@@ -391,7 +387,6 @@ static int do_set_fan_gear_mode(struct device *dev, unsigned long val) | |||
391 | /* Set number of fan pulses per revolution. Accepts either 2 or 4. */ | 387 | /* Set number of fan pulses per revolution. Accepts either 2 or 4. */ |
392 | static int do_set_fan_pulses(struct device *dev, unsigned long val) | 388 | static int do_set_fan_pulses(struct device *dev, unsigned long val) |
393 | { | 389 | { |
394 | struct i2c_client *client = to_i2c_client(dev); | ||
395 | struct g762_data *data = g762_update_client(dev); | 390 | struct g762_data *data = g762_update_client(dev); |
396 | int ret; | 391 | int ret; |
397 | 392 | ||
@@ -410,7 +405,7 @@ static int do_set_fan_pulses(struct device *dev, unsigned long val) | |||
410 | ret = -EINVAL; | 405 | ret = -EINVAL; |
411 | goto out; | 406 | goto out; |
412 | } | 407 | } |
413 | ret = i2c_smbus_write_byte_data(client, G762_REG_FAN_CMD1, | 408 | ret = i2c_smbus_write_byte_data(data->client, G762_REG_FAN_CMD1, |
414 | data->fan_cmd1); | 409 | data->fan_cmd1); |
415 | data->valid = false; | 410 | data->valid = false; |
416 | out: | 411 | out: |
@@ -422,7 +417,6 @@ static int do_set_fan_pulses(struct device *dev, unsigned long val) | |||
422 | /* Set fan mode. Accepts either 1 (open-loop) or 2 (closed-loop). */ | 417 | /* Set fan mode. Accepts either 1 (open-loop) or 2 (closed-loop). */ |
423 | static int do_set_pwm_enable(struct device *dev, unsigned long val) | 418 | static int do_set_pwm_enable(struct device *dev, unsigned long val) |
424 | { | 419 | { |
425 | struct i2c_client *client = to_i2c_client(dev); | ||
426 | struct g762_data *data = g762_update_client(dev); | 420 | struct g762_data *data = g762_update_client(dev); |
427 | int ret; | 421 | int ret; |
428 | 422 | ||
@@ -444,15 +438,15 @@ static int do_set_pwm_enable(struct device *dev, unsigned long val) | |||
444 | * value of 254 if it is 255 when switching to open-loop. | 438 | * value of 254 if it is 255 when switching to open-loop. |
445 | */ | 439 | */ |
446 | if (data->set_cnt == 0xff) | 440 | if (data->set_cnt == 0xff) |
447 | i2c_smbus_write_byte_data(client, G762_REG_SET_CNT, | 441 | i2c_smbus_write_byte_data(data->client, |
448 | 254); | 442 | G762_REG_SET_CNT, 254); |
449 | break; | 443 | break; |
450 | default: | 444 | default: |
451 | ret = -EINVAL; | 445 | ret = -EINVAL; |
452 | goto out; | 446 | goto out; |
453 | } | 447 | } |
454 | 448 | ||
455 | ret = i2c_smbus_write_byte_data(client, G762_REG_FAN_CMD1, | 449 | ret = i2c_smbus_write_byte_data(data->client, G762_REG_FAN_CMD1, |
456 | data->fan_cmd1); | 450 | data->fan_cmd1); |
457 | data->valid = false; | 451 | data->valid = false; |
458 | out: | 452 | out: |
@@ -464,7 +458,6 @@ static int do_set_pwm_enable(struct device *dev, unsigned long val) | |||
464 | /* Set PWM polarity. Accepts either 0 (positive duty) or 1 (negative duty) */ | 458 | /* Set PWM polarity. Accepts either 0 (positive duty) or 1 (negative duty) */ |
465 | static int do_set_pwm_polarity(struct device *dev, unsigned long val) | 459 | static int do_set_pwm_polarity(struct device *dev, unsigned long val) |
466 | { | 460 | { |
467 | struct i2c_client *client = to_i2c_client(dev); | ||
468 | struct g762_data *data = g762_update_client(dev); | 461 | struct g762_data *data = g762_update_client(dev); |
469 | int ret; | 462 | int ret; |
470 | 463 | ||
@@ -483,7 +476,7 @@ static int do_set_pwm_polarity(struct device *dev, unsigned long val) | |||
483 | ret = -EINVAL; | 476 | ret = -EINVAL; |
484 | goto out; | 477 | goto out; |
485 | } | 478 | } |
486 | ret = i2c_smbus_write_byte_data(client, G762_REG_FAN_CMD1, | 479 | ret = i2c_smbus_write_byte_data(data->client, G762_REG_FAN_CMD1, |
487 | data->fan_cmd1); | 480 | data->fan_cmd1); |
488 | data->valid = false; | 481 | data->valid = false; |
489 | out: | 482 | out: |
@@ -498,8 +491,8 @@ static int do_set_pwm_polarity(struct device *dev, unsigned long val) | |||
498 | */ | 491 | */ |
499 | static int do_set_pwm(struct device *dev, unsigned long val) | 492 | static int do_set_pwm(struct device *dev, unsigned long val) |
500 | { | 493 | { |
501 | struct i2c_client *client = to_i2c_client(dev); | 494 | struct g762_data *data = dev_get_drvdata(dev); |
502 | struct g762_data *data = i2c_get_clientdata(client); | 495 | struct i2c_client *client = data->client; |
503 | int ret; | 496 | int ret; |
504 | 497 | ||
505 | if (val > 255) | 498 | if (val > 255) |
@@ -519,7 +512,6 @@ static int do_set_pwm(struct device *dev, unsigned long val) | |||
519 | */ | 512 | */ |
520 | static int do_set_fan_target(struct device *dev, unsigned long val) | 513 | static int do_set_fan_target(struct device *dev, unsigned long val) |
521 | { | 514 | { |
522 | struct i2c_client *client = to_i2c_client(dev); | ||
523 | struct g762_data *data = g762_update_client(dev); | 515 | struct g762_data *data = g762_update_client(dev); |
524 | int ret; | 516 | int ret; |
525 | 517 | ||
@@ -531,7 +523,7 @@ static int do_set_fan_target(struct device *dev, unsigned long val) | |||
531 | G762_PULSE_FROM_REG(data->fan_cmd1), | 523 | G762_PULSE_FROM_REG(data->fan_cmd1), |
532 | G762_CLKDIV_FROM_REG(data->fan_cmd1), | 524 | G762_CLKDIV_FROM_REG(data->fan_cmd1), |
533 | G762_GEARMULT_FROM_REG(data->fan_cmd2)); | 525 | G762_GEARMULT_FROM_REG(data->fan_cmd2)); |
534 | ret = i2c_smbus_write_byte_data(client, G762_REG_SET_CNT, | 526 | ret = i2c_smbus_write_byte_data(data->client, G762_REG_SET_CNT, |
535 | data->set_cnt); | 527 | data->set_cnt); |
536 | data->valid = false; | 528 | data->valid = false; |
537 | mutex_unlock(&data->update_lock); | 529 | mutex_unlock(&data->update_lock); |
@@ -542,7 +534,6 @@ static int do_set_fan_target(struct device *dev, unsigned long val) | |||
542 | /* Set fan startup voltage. Accepted values are either 0, 1, 2 or 3. */ | 534 | /* Set fan startup voltage. Accepted values are either 0, 1, 2 or 3. */ |
543 | static int do_set_fan_startv(struct device *dev, unsigned long val) | 535 | static int do_set_fan_startv(struct device *dev, unsigned long val) |
544 | { | 536 | { |
545 | struct i2c_client *client = to_i2c_client(dev); | ||
546 | struct g762_data *data = g762_update_client(dev); | 537 | struct g762_data *data = g762_update_client(dev); |
547 | int ret; | 538 | int ret; |
548 | 539 | ||
@@ -571,7 +562,7 @@ static int do_set_fan_startv(struct device *dev, unsigned long val) | |||
571 | ret = -EINVAL; | 562 | ret = -EINVAL; |
572 | goto out; | 563 | goto out; |
573 | } | 564 | } |
574 | ret = i2c_smbus_write_byte_data(client, G762_REG_FAN_CMD2, | 565 | ret = i2c_smbus_write_byte_data(data->client, G762_REG_FAN_CMD2, |
575 | data->fan_cmd2); | 566 | data->fan_cmd2); |
576 | data->valid = false; | 567 | data->valid = false; |
577 | out: | 568 | out: |
@@ -1026,7 +1017,7 @@ static DEVICE_ATTR(fan1_pulses, S_IWUSR | S_IRUGO, | |||
1026 | get_fan_pulses, set_fan_pulses); | 1017 | get_fan_pulses, set_fan_pulses); |
1027 | 1018 | ||
1028 | /* Driver data */ | 1019 | /* Driver data */ |
1029 | static struct attribute *g762_attributes[] = { | 1020 | static struct attribute *g762_attrs[] = { |
1030 | &dev_attr_fan1_input.attr, | 1021 | &dev_attr_fan1_input.attr, |
1031 | &dev_attr_fan1_alarm.attr, | 1022 | &dev_attr_fan1_alarm.attr, |
1032 | &dev_attr_fan1_fault.attr, | 1023 | &dev_attr_fan1_fault.attr, |
@@ -1039,9 +1030,7 @@ static struct attribute *g762_attributes[] = { | |||
1039 | NULL | 1030 | NULL |
1040 | }; | 1031 | }; |
1041 | 1032 | ||
1042 | static const struct attribute_group g762_group = { | 1033 | ATTRIBUTE_GROUPS(g762); |
1043 | .attrs = g762_attributes, | ||
1044 | }; | ||
1045 | 1034 | ||
1046 | /* | 1035 | /* |
1047 | * Enable both fan failure detection and fan out of control protection. The | 1036 | * Enable both fan failure detection and fan out of control protection. The |
@@ -1050,7 +1039,6 @@ static const struct attribute_group g762_group = { | |||
1050 | */ | 1039 | */ |
1051 | static inline int g762_fan_init(struct device *dev) | 1040 | static inline int g762_fan_init(struct device *dev) |
1052 | { | 1041 | { |
1053 | struct i2c_client *client = to_i2c_client(dev); | ||
1054 | struct g762_data *data = g762_update_client(dev); | 1042 | struct g762_data *data = g762_update_client(dev); |
1055 | 1043 | ||
1056 | if (IS_ERR(data)) | 1044 | if (IS_ERR(data)) |
@@ -1060,12 +1048,13 @@ static inline int g762_fan_init(struct device *dev) | |||
1060 | data->fan_cmd1 |= G762_REG_FAN_CMD1_DET_FAN_OOC; | 1048 | data->fan_cmd1 |= G762_REG_FAN_CMD1_DET_FAN_OOC; |
1061 | data->valid = false; | 1049 | data->valid = false; |
1062 | 1050 | ||
1063 | return i2c_smbus_write_byte_data(client, G762_REG_FAN_CMD1, | 1051 | return i2c_smbus_write_byte_data(data->client, G762_REG_FAN_CMD1, |
1064 | data->fan_cmd1); | 1052 | data->fan_cmd1); |
1065 | } | 1053 | } |
1066 | 1054 | ||
1067 | static int g762_probe(struct i2c_client *client, const struct i2c_device_id *id) | 1055 | static int g762_probe(struct i2c_client *client, const struct i2c_device_id *id) |
1068 | { | 1056 | { |
1057 | struct device *dev = &client->dev; | ||
1069 | struct g762_data *data; | 1058 | struct g762_data *data; |
1070 | int ret; | 1059 | int ret; |
1071 | 1060 | ||
@@ -1073,7 +1062,7 @@ static int g762_probe(struct i2c_client *client, const struct i2c_device_id *id) | |||
1073 | I2C_FUNC_SMBUS_BYTE_DATA)) | 1062 | I2C_FUNC_SMBUS_BYTE_DATA)) |
1074 | return -ENODEV; | 1063 | return -ENODEV; |
1075 | 1064 | ||
1076 | data = devm_kzalloc(&client->dev, sizeof(struct g762_data), GFP_KERNEL); | 1065 | data = devm_kzalloc(dev, sizeof(struct g762_data), GFP_KERNEL); |
1077 | if (!data) | 1066 | if (!data) |
1078 | return -ENOMEM; | 1067 | return -ENOMEM; |
1079 | 1068 | ||
@@ -1082,7 +1071,7 @@ static int g762_probe(struct i2c_client *client, const struct i2c_device_id *id) | |||
1082 | mutex_init(&data->update_lock); | 1071 | mutex_init(&data->update_lock); |
1083 | 1072 | ||
1084 | /* Enable fan failure detection and fan out of control protection */ | 1073 | /* Enable fan failure detection and fan out of control protection */ |
1085 | ret = g762_fan_init(&client->dev); | 1074 | ret = g762_fan_init(dev); |
1086 | if (ret) | 1075 | if (ret) |
1087 | return ret; | 1076 | return ret; |
1088 | 1077 | ||
@@ -1098,22 +1087,17 @@ static int g762_probe(struct i2c_client *client, const struct i2c_device_id *id) | |||
1098 | if (ret) | 1087 | if (ret) |
1099 | goto clock_dis; | 1088 | goto clock_dis; |
1100 | 1089 | ||
1101 | /* Register sysfs hooks */ | 1090 | data->hwmon_dev = devm_hwmon_device_register_with_groups(dev, |
1102 | ret = sysfs_create_group(&client->dev.kobj, &g762_group); | 1091 | client->name, |
1103 | if (ret) | 1092 | data, |
1104 | goto clock_dis; | 1093 | g762_groups); |
1105 | |||
1106 | data->hwmon_dev = hwmon_device_register(&client->dev); | ||
1107 | if (IS_ERR(data->hwmon_dev)) { | 1094 | if (IS_ERR(data->hwmon_dev)) { |
1108 | ret = PTR_ERR(data->hwmon_dev); | 1095 | ret = PTR_ERR(data->hwmon_dev); |
1109 | goto sysfs_rem; | 1096 | goto clock_dis; |
1110 | } | 1097 | } |
1111 | 1098 | ||
1112 | return 0; | 1099 | return 0; |
1113 | 1100 | ||
1114 | sysfs_rem: | ||
1115 | sysfs_remove_group(&client->dev.kobj, &g762_group); | ||
1116 | |||
1117 | clock_dis: | 1101 | clock_dis: |
1118 | g762_of_clock_disable(client); | 1102 | g762_of_clock_disable(client); |
1119 | 1103 | ||
@@ -1125,7 +1109,6 @@ static int g762_remove(struct i2c_client *client) | |||
1125 | struct g762_data *data = i2c_get_clientdata(client); | 1109 | struct g762_data *data = i2c_get_clientdata(client); |
1126 | 1110 | ||
1127 | hwmon_device_unregister(data->hwmon_dev); | 1111 | hwmon_device_unregister(data->hwmon_dev); |
1128 | sysfs_remove_group(&client->dev.kobj, &g762_group); | ||
1129 | g762_of_clock_disable(client); | 1112 | g762_of_clock_disable(client); |
1130 | 1113 | ||
1131 | return 0; | 1114 | return 0; |