aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAxel Lin <axel.lin@ingics.com>2014-07-19 10:29:44 -0400
committerGuenter Roeck <linux@roeck-us.net>2014-08-04 10:01:40 -0400
commit398e16db62620dd80a237c5043bec5c9335ac92c (patch)
tree1b136ff99062a7319f6cfb58611e57ca7fb3ec4b
parent9dd304f86b4b1921c0b7601b3e88a07b257fc2d2 (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.c71
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
130struct g762_data { 130struct 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 */
207static struct g762_data *g762_update_client(struct device *dev) 207static 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 */
267static int do_set_clk_freq(struct device *dev, unsigned long val) 267static 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) */
283static int do_set_pwm_mode(struct device *dev, unsigned long val) 282static 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. */
314static int do_set_fan_div(struct device *dev, unsigned long val) 312static 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. */
355static int do_set_fan_gear_mode(struct device *dev, unsigned long val) 352static 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. */
392static int do_set_fan_pulses(struct device *dev, unsigned long val) 388static 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). */
423static int do_set_pwm_enable(struct device *dev, unsigned long val) 418static 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) */
465static int do_set_pwm_polarity(struct device *dev, unsigned long val) 459static 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 */
499static int do_set_pwm(struct device *dev, unsigned long val) 492static 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 */
520static int do_set_fan_target(struct device *dev, unsigned long val) 513static 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. */
543static int do_set_fan_startv(struct device *dev, unsigned long val) 535static 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 */
1029static struct attribute *g762_attributes[] = { 1020static 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
1042static const struct attribute_group g762_group = { 1033ATTRIBUTE_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 */
1051static inline int g762_fan_init(struct device *dev) 1040static 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
1067static int g762_probe(struct i2c_client *client, const struct i2c_device_id *id) 1055static 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;