diff options
| -rw-r--r-- | drivers/hwmon/lm77.c | 33 | ||||
| -rw-r--r-- | drivers/hwmon/lm80.c | 85 | ||||
| -rw-r--r-- | drivers/hwmon/lm85.c | 173 | ||||
| -rw-r--r-- | drivers/hwmon/lm87.c | 191 | ||||
| -rw-r--r-- | drivers/hwmon/lm92.c | 34 |
5 files changed, 338 insertions, 178 deletions
diff --git a/drivers/hwmon/lm77.c b/drivers/hwmon/lm77.c index 459cc977380a..dd969f1e8415 100644 --- a/drivers/hwmon/lm77.c +++ b/drivers/hwmon/lm77.c | |||
| @@ -212,6 +212,23 @@ static int lm77_attach_adapter(struct i2c_adapter *adapter) | |||
| 212 | return i2c_probe(adapter, &addr_data, lm77_detect); | 212 | return i2c_probe(adapter, &addr_data, lm77_detect); |
| 213 | } | 213 | } |
| 214 | 214 | ||
| 215 | static struct attribute *lm77_attributes[] = { | ||
| 216 | &dev_attr_temp1_input.attr, | ||
| 217 | &dev_attr_temp1_crit.attr, | ||
| 218 | &dev_attr_temp1_min.attr, | ||
| 219 | &dev_attr_temp1_max.attr, | ||
| 220 | &dev_attr_temp1_crit_hyst.attr, | ||
| 221 | &dev_attr_temp1_min_hyst.attr, | ||
| 222 | &dev_attr_temp1_max_hyst.attr, | ||
| 223 | &dev_attr_alarms.attr, | ||
| 224 | |||
| 225 | NULL | ||
| 226 | }; | ||
| 227 | |||
| 228 | static const struct attribute_group lm77_group = { | ||
| 229 | .attrs = lm77_attributes, | ||
| 230 | }; | ||
| 231 | |||
| 215 | /* This function is called by i2c_probe */ | 232 | /* This function is called by i2c_probe */ |
| 216 | static int lm77_detect(struct i2c_adapter *adapter, int address, int kind) | 233 | static int lm77_detect(struct i2c_adapter *adapter, int address, int kind) |
| 217 | { | 234 | { |
| @@ -317,22 +334,19 @@ static int lm77_detect(struct i2c_adapter *adapter, int address, int kind) | |||
| 317 | lm77_init_client(new_client); | 334 | lm77_init_client(new_client); |
| 318 | 335 | ||
| 319 | /* Register sysfs hooks */ | 336 | /* Register sysfs hooks */ |
| 337 | if ((err = sysfs_create_group(&new_client->dev.kobj, &lm77_group))) | ||
| 338 | goto exit_detach; | ||
| 339 | |||
| 320 | data->class_dev = hwmon_device_register(&new_client->dev); | 340 | data->class_dev = hwmon_device_register(&new_client->dev); |
| 321 | if (IS_ERR(data->class_dev)) { | 341 | if (IS_ERR(data->class_dev)) { |
| 322 | err = PTR_ERR(data->class_dev); | 342 | err = PTR_ERR(data->class_dev); |
| 323 | goto exit_detach; | 343 | goto exit_remove; |
| 324 | } | 344 | } |
| 325 | 345 | ||
| 326 | device_create_file(&new_client->dev, &dev_attr_temp1_input); | ||
| 327 | device_create_file(&new_client->dev, &dev_attr_temp1_crit); | ||
| 328 | device_create_file(&new_client->dev, &dev_attr_temp1_min); | ||
| 329 | device_create_file(&new_client->dev, &dev_attr_temp1_max); | ||
| 330 | device_create_file(&new_client->dev, &dev_attr_temp1_crit_hyst); | ||
| 331 | device_create_file(&new_client->dev, &dev_attr_temp1_min_hyst); | ||
| 332 | device_create_file(&new_client->dev, &dev_attr_temp1_max_hyst); | ||
| 333 | device_create_file(&new_client->dev, &dev_attr_alarms); | ||
| 334 | return 0; | 346 | return 0; |
| 335 | 347 | ||
| 348 | exit_remove: | ||
| 349 | sysfs_remove_group(&new_client->dev.kobj, &lm77_group); | ||
| 336 | exit_detach: | 350 | exit_detach: |
| 337 | i2c_detach_client(new_client); | 351 | i2c_detach_client(new_client); |
| 338 | exit_free: | 352 | exit_free: |
| @@ -345,6 +359,7 @@ static int lm77_detach_client(struct i2c_client *client) | |||
| 345 | { | 359 | { |
| 346 | struct lm77_data *data = i2c_get_clientdata(client); | 360 | struct lm77_data *data = i2c_get_clientdata(client); |
| 347 | hwmon_device_unregister(data->class_dev); | 361 | hwmon_device_unregister(data->class_dev); |
| 362 | sysfs_remove_group(&client->dev.kobj, &lm77_group); | ||
| 348 | i2c_detach_client(client); | 363 | i2c_detach_client(client); |
| 349 | kfree(data); | 364 | kfree(data); |
| 350 | return 0; | 365 | return 0; |
diff --git a/drivers/hwmon/lm80.c b/drivers/hwmon/lm80.c index b4ccdfc01203..064516d824ad 100644 --- a/drivers/hwmon/lm80.c +++ b/drivers/hwmon/lm80.c | |||
| @@ -394,6 +394,48 @@ static int lm80_attach_adapter(struct i2c_adapter *adapter) | |||
| 394 | return i2c_probe(adapter, &addr_data, lm80_detect); | 394 | return i2c_probe(adapter, &addr_data, lm80_detect); |
| 395 | } | 395 | } |
| 396 | 396 | ||
| 397 | static struct attribute *lm80_attributes[] = { | ||
| 398 | &dev_attr_in0_min.attr, | ||
| 399 | &dev_attr_in1_min.attr, | ||
| 400 | &dev_attr_in2_min.attr, | ||
| 401 | &dev_attr_in3_min.attr, | ||
| 402 | &dev_attr_in4_min.attr, | ||
| 403 | &dev_attr_in5_min.attr, | ||
| 404 | &dev_attr_in6_min.attr, | ||
| 405 | &dev_attr_in0_max.attr, | ||
| 406 | &dev_attr_in1_max.attr, | ||
| 407 | &dev_attr_in2_max.attr, | ||
| 408 | &dev_attr_in3_max.attr, | ||
| 409 | &dev_attr_in4_max.attr, | ||
| 410 | &dev_attr_in5_max.attr, | ||
| 411 | &dev_attr_in6_max.attr, | ||
| 412 | &dev_attr_in0_input.attr, | ||
| 413 | &dev_attr_in1_input.attr, | ||
| 414 | &dev_attr_in2_input.attr, | ||
| 415 | &dev_attr_in3_input.attr, | ||
| 416 | &dev_attr_in4_input.attr, | ||
| 417 | &dev_attr_in5_input.attr, | ||
| 418 | &dev_attr_in6_input.attr, | ||
| 419 | &dev_attr_fan1_min.attr, | ||
| 420 | &dev_attr_fan2_min.attr, | ||
| 421 | &dev_attr_fan1_input.attr, | ||
| 422 | &dev_attr_fan2_input.attr, | ||
| 423 | &dev_attr_fan1_div.attr, | ||
| 424 | &dev_attr_fan2_div.attr, | ||
| 425 | &dev_attr_temp1_input.attr, | ||
| 426 | &dev_attr_temp1_max.attr, | ||
| 427 | &dev_attr_temp1_max_hyst.attr, | ||
| 428 | &dev_attr_temp1_crit.attr, | ||
| 429 | &dev_attr_temp1_crit_hyst.attr, | ||
| 430 | &dev_attr_alarms.attr, | ||
| 431 | |||
| 432 | NULL | ||
| 433 | }; | ||
| 434 | |||
| 435 | static const struct attribute_group lm80_group = { | ||
| 436 | .attrs = lm80_attributes, | ||
| 437 | }; | ||
| 438 | |||
| 397 | static int lm80_detect(struct i2c_adapter *adapter, int address, int kind) | 439 | static int lm80_detect(struct i2c_adapter *adapter, int address, int kind) |
| 398 | { | 440 | { |
| 399 | int i, cur; | 441 | int i, cur; |
| @@ -452,48 +494,19 @@ static int lm80_detect(struct i2c_adapter *adapter, int address, int kind) | |||
| 452 | data->fan_min[1] = lm80_read_value(new_client, LM80_REG_FAN_MIN(2)); | 494 | data->fan_min[1] = lm80_read_value(new_client, LM80_REG_FAN_MIN(2)); |
| 453 | 495 | ||
| 454 | /* Register sysfs hooks */ | 496 | /* Register sysfs hooks */ |
| 497 | if ((err = sysfs_create_group(&new_client->dev.kobj, &lm80_group))) | ||
| 498 | goto error_detach; | ||
| 499 | |||
| 455 | data->class_dev = hwmon_device_register(&new_client->dev); | 500 | data->class_dev = hwmon_device_register(&new_client->dev); |
| 456 | if (IS_ERR(data->class_dev)) { | 501 | if (IS_ERR(data->class_dev)) { |
| 457 | err = PTR_ERR(data->class_dev); | 502 | err = PTR_ERR(data->class_dev); |
| 458 | goto error_detach; | 503 | goto error_remove; |
| 459 | } | 504 | } |
| 460 | 505 | ||
| 461 | device_create_file(&new_client->dev, &dev_attr_in0_min); | ||
| 462 | device_create_file(&new_client->dev, &dev_attr_in1_min); | ||
| 463 | device_create_file(&new_client->dev, &dev_attr_in2_min); | ||
| 464 | device_create_file(&new_client->dev, &dev_attr_in3_min); | ||
| 465 | device_create_file(&new_client->dev, &dev_attr_in4_min); | ||
| 466 | device_create_file(&new_client->dev, &dev_attr_in5_min); | ||
| 467 | device_create_file(&new_client->dev, &dev_attr_in6_min); | ||
| 468 | device_create_file(&new_client->dev, &dev_attr_in0_max); | ||
| 469 | device_create_file(&new_client->dev, &dev_attr_in1_max); | ||
| 470 | device_create_file(&new_client->dev, &dev_attr_in2_max); | ||
| 471 | device_create_file(&new_client->dev, &dev_attr_in3_max); | ||
| 472 | device_create_file(&new_client->dev, &dev_attr_in4_max); | ||
| 473 | device_create_file(&new_client->dev, &dev_attr_in5_max); | ||
| 474 | device_create_file(&new_client->dev, &dev_attr_in6_max); | ||
| 475 | device_create_file(&new_client->dev, &dev_attr_in0_input); | ||
| 476 | device_create_file(&new_client->dev, &dev_attr_in1_input); | ||
| 477 | device_create_file(&new_client->dev, &dev_attr_in2_input); | ||
| 478 | device_create_file(&new_client->dev, &dev_attr_in3_input); | ||
| 479 | device_create_file(&new_client->dev, &dev_attr_in4_input); | ||
| 480 | device_create_file(&new_client->dev, &dev_attr_in5_input); | ||
| 481 | device_create_file(&new_client->dev, &dev_attr_in6_input); | ||
| 482 | device_create_file(&new_client->dev, &dev_attr_fan1_min); | ||
| 483 | device_create_file(&new_client->dev, &dev_attr_fan2_min); | ||
| 484 | device_create_file(&new_client->dev, &dev_attr_fan1_input); | ||
| 485 | device_create_file(&new_client->dev, &dev_attr_fan2_input); | ||
| 486 | device_create_file(&new_client->dev, &dev_attr_fan1_div); | ||
| 487 | device_create_file(&new_client->dev, &dev_attr_fan2_div); | ||
| 488 | device_create_file(&new_client->dev, &dev_attr_temp1_input); | ||
| 489 | device_create_file(&new_client->dev, &dev_attr_temp1_max); | ||
| 490 | device_create_file(&new_client->dev, &dev_attr_temp1_max_hyst); | ||
| 491 | device_create_file(&new_client->dev, &dev_attr_temp1_crit); | ||
| 492 | device_create_file(&new_client->dev, &dev_attr_temp1_crit_hyst); | ||
| 493 | device_create_file(&new_client->dev, &dev_attr_alarms); | ||
| 494 | |||
| 495 | return 0; | 506 | return 0; |
| 496 | 507 | ||
| 508 | error_remove: | ||
| 509 | sysfs_remove_group(&new_client->dev.kobj, &lm80_group); | ||
| 497 | error_detach: | 510 | error_detach: |
| 498 | i2c_detach_client(new_client); | 511 | i2c_detach_client(new_client); |
| 499 | error_free: | 512 | error_free: |
| @@ -508,7 +521,7 @@ static int lm80_detach_client(struct i2c_client *client) | |||
| 508 | int err; | 521 | int err; |
| 509 | 522 | ||
| 510 | hwmon_device_unregister(data->class_dev); | 523 | hwmon_device_unregister(data->class_dev); |
| 511 | 524 | sysfs_remove_group(&client->dev.kobj, &lm80_group); | |
| 512 | if ((err = i2c_detach_client(client))) | 525 | if ((err = i2c_detach_client(client))) |
| 513 | return err; | 526 | return err; |
| 514 | 527 | ||
diff --git a/drivers/hwmon/lm85.c b/drivers/hwmon/lm85.c index 342e9663119d..2c3293cf69d1 100644 --- a/drivers/hwmon/lm85.c +++ b/drivers/hwmon/lm85.c | |||
| @@ -1025,6 +1025,89 @@ static int lm85_attach_adapter(struct i2c_adapter *adapter) | |||
| 1025 | return i2c_probe(adapter, &addr_data, lm85_detect); | 1025 | return i2c_probe(adapter, &addr_data, lm85_detect); |
| 1026 | } | 1026 | } |
| 1027 | 1027 | ||
| 1028 | static struct attribute *lm85_attributes[] = { | ||
| 1029 | &dev_attr_fan1_input.attr, | ||
| 1030 | &dev_attr_fan2_input.attr, | ||
| 1031 | &dev_attr_fan3_input.attr, | ||
| 1032 | &dev_attr_fan4_input.attr, | ||
| 1033 | &dev_attr_fan1_min.attr, | ||
| 1034 | &dev_attr_fan2_min.attr, | ||
| 1035 | &dev_attr_fan3_min.attr, | ||
| 1036 | &dev_attr_fan4_min.attr, | ||
| 1037 | &dev_attr_pwm1.attr, | ||
| 1038 | &dev_attr_pwm2.attr, | ||
| 1039 | &dev_attr_pwm3.attr, | ||
| 1040 | &dev_attr_pwm1_enable.attr, | ||
| 1041 | &dev_attr_pwm2_enable.attr, | ||
| 1042 | &dev_attr_pwm3_enable.attr, | ||
| 1043 | &dev_attr_in0_input.attr, | ||
| 1044 | &dev_attr_in1_input.attr, | ||
| 1045 | &dev_attr_in2_input.attr, | ||
| 1046 | &dev_attr_in3_input.attr, | ||
| 1047 | &dev_attr_in0_min.attr, | ||
| 1048 | &dev_attr_in1_min.attr, | ||
| 1049 | &dev_attr_in2_min.attr, | ||
| 1050 | &dev_attr_in3_min.attr, | ||
| 1051 | &dev_attr_in0_max.attr, | ||
| 1052 | &dev_attr_in1_max.attr, | ||
| 1053 | &dev_attr_in2_max.attr, | ||
| 1054 | &dev_attr_in3_max.attr, | ||
| 1055 | &dev_attr_temp1_input.attr, | ||
| 1056 | &dev_attr_temp2_input.attr, | ||
| 1057 | &dev_attr_temp3_input.attr, | ||
| 1058 | &dev_attr_temp1_min.attr, | ||
| 1059 | &dev_attr_temp2_min.attr, | ||
| 1060 | &dev_attr_temp3_min.attr, | ||
| 1061 | &dev_attr_temp1_max.attr, | ||
| 1062 | &dev_attr_temp2_max.attr, | ||
| 1063 | &dev_attr_temp3_max.attr, | ||
| 1064 | &dev_attr_vrm.attr, | ||
| 1065 | &dev_attr_cpu0_vid.attr, | ||
| 1066 | &dev_attr_alarms.attr, | ||
| 1067 | &dev_attr_pwm1_auto_channels.attr, | ||
| 1068 | &dev_attr_pwm2_auto_channels.attr, | ||
| 1069 | &dev_attr_pwm3_auto_channels.attr, | ||
| 1070 | &dev_attr_pwm1_auto_pwm_min.attr, | ||
| 1071 | &dev_attr_pwm2_auto_pwm_min.attr, | ||
| 1072 | &dev_attr_pwm3_auto_pwm_min.attr, | ||
| 1073 | &dev_attr_pwm1_auto_pwm_minctl.attr, | ||
| 1074 | &dev_attr_pwm2_auto_pwm_minctl.attr, | ||
| 1075 | &dev_attr_pwm3_auto_pwm_minctl.attr, | ||
| 1076 | &dev_attr_pwm1_auto_pwm_freq.attr, | ||
| 1077 | &dev_attr_pwm2_auto_pwm_freq.attr, | ||
| 1078 | &dev_attr_pwm3_auto_pwm_freq.attr, | ||
| 1079 | &dev_attr_temp1_auto_temp_off.attr, | ||
| 1080 | &dev_attr_temp2_auto_temp_off.attr, | ||
| 1081 | &dev_attr_temp3_auto_temp_off.attr, | ||
| 1082 | &dev_attr_temp1_auto_temp_min.attr, | ||
| 1083 | &dev_attr_temp2_auto_temp_min.attr, | ||
| 1084 | &dev_attr_temp3_auto_temp_min.attr, | ||
| 1085 | &dev_attr_temp1_auto_temp_max.attr, | ||
| 1086 | &dev_attr_temp2_auto_temp_max.attr, | ||
| 1087 | &dev_attr_temp3_auto_temp_max.attr, | ||
| 1088 | &dev_attr_temp1_auto_temp_crit.attr, | ||
| 1089 | &dev_attr_temp2_auto_temp_crit.attr, | ||
| 1090 | &dev_attr_temp3_auto_temp_crit.attr, | ||
| 1091 | |||
| 1092 | NULL | ||
| 1093 | }; | ||
| 1094 | |||
| 1095 | static const struct attribute_group lm85_group = { | ||
| 1096 | .attrs = lm85_attributes, | ||
| 1097 | }; | ||
| 1098 | |||
| 1099 | static struct attribute *lm85_attributes_opt[] = { | ||
| 1100 | &dev_attr_in4_input.attr, | ||
| 1101 | &dev_attr_in4_min.attr, | ||
| 1102 | &dev_attr_in4_max.attr, | ||
| 1103 | |||
| 1104 | NULL | ||
| 1105 | }; | ||
| 1106 | |||
| 1107 | static const struct attribute_group lm85_group_opt = { | ||
| 1108 | .attrs = lm85_attributes_opt, | ||
| 1109 | }; | ||
| 1110 | |||
| 1028 | static int lm85_detect(struct i2c_adapter *adapter, int address, | 1111 | static int lm85_detect(struct i2c_adapter *adapter, int address, |
| 1029 | int kind) | 1112 | int kind) |
| 1030 | { | 1113 | { |
| @@ -1163,87 +1246,33 @@ static int lm85_detect(struct i2c_adapter *adapter, int address, | |||
| 1163 | lm85_init_client(new_client); | 1246 | lm85_init_client(new_client); |
| 1164 | 1247 | ||
| 1165 | /* Register sysfs hooks */ | 1248 | /* Register sysfs hooks */ |
| 1166 | data->class_dev = hwmon_device_register(&new_client->dev); | 1249 | if ((err = sysfs_create_group(&new_client->dev.kobj, &lm85_group))) |
| 1167 | if (IS_ERR(data->class_dev)) { | ||
| 1168 | err = PTR_ERR(data->class_dev); | ||
| 1169 | goto ERROR2; | 1250 | goto ERROR2; |
| 1170 | } | ||
| 1171 | |||
| 1172 | device_create_file(&new_client->dev, &dev_attr_fan1_input); | ||
| 1173 | device_create_file(&new_client->dev, &dev_attr_fan2_input); | ||
| 1174 | device_create_file(&new_client->dev, &dev_attr_fan3_input); | ||
| 1175 | device_create_file(&new_client->dev, &dev_attr_fan4_input); | ||
| 1176 | device_create_file(&new_client->dev, &dev_attr_fan1_min); | ||
| 1177 | device_create_file(&new_client->dev, &dev_attr_fan2_min); | ||
| 1178 | device_create_file(&new_client->dev, &dev_attr_fan3_min); | ||
| 1179 | device_create_file(&new_client->dev, &dev_attr_fan4_min); | ||
| 1180 | device_create_file(&new_client->dev, &dev_attr_pwm1); | ||
| 1181 | device_create_file(&new_client->dev, &dev_attr_pwm2); | ||
| 1182 | device_create_file(&new_client->dev, &dev_attr_pwm3); | ||
| 1183 | device_create_file(&new_client->dev, &dev_attr_pwm1_enable); | ||
| 1184 | device_create_file(&new_client->dev, &dev_attr_pwm2_enable); | ||
| 1185 | device_create_file(&new_client->dev, &dev_attr_pwm3_enable); | ||
| 1186 | device_create_file(&new_client->dev, &dev_attr_in0_input); | ||
| 1187 | device_create_file(&new_client->dev, &dev_attr_in1_input); | ||
| 1188 | device_create_file(&new_client->dev, &dev_attr_in2_input); | ||
| 1189 | device_create_file(&new_client->dev, &dev_attr_in3_input); | ||
| 1190 | device_create_file(&new_client->dev, &dev_attr_in0_min); | ||
| 1191 | device_create_file(&new_client->dev, &dev_attr_in1_min); | ||
| 1192 | device_create_file(&new_client->dev, &dev_attr_in2_min); | ||
| 1193 | device_create_file(&new_client->dev, &dev_attr_in3_min); | ||
| 1194 | device_create_file(&new_client->dev, &dev_attr_in0_max); | ||
| 1195 | device_create_file(&new_client->dev, &dev_attr_in1_max); | ||
| 1196 | device_create_file(&new_client->dev, &dev_attr_in2_max); | ||
| 1197 | device_create_file(&new_client->dev, &dev_attr_in3_max); | ||
| 1198 | device_create_file(&new_client->dev, &dev_attr_temp1_input); | ||
| 1199 | device_create_file(&new_client->dev, &dev_attr_temp2_input); | ||
| 1200 | device_create_file(&new_client->dev, &dev_attr_temp3_input); | ||
| 1201 | device_create_file(&new_client->dev, &dev_attr_temp1_min); | ||
| 1202 | device_create_file(&new_client->dev, &dev_attr_temp2_min); | ||
| 1203 | device_create_file(&new_client->dev, &dev_attr_temp3_min); | ||
| 1204 | device_create_file(&new_client->dev, &dev_attr_temp1_max); | ||
| 1205 | device_create_file(&new_client->dev, &dev_attr_temp2_max); | ||
| 1206 | device_create_file(&new_client->dev, &dev_attr_temp3_max); | ||
| 1207 | device_create_file(&new_client->dev, &dev_attr_vrm); | ||
| 1208 | device_create_file(&new_client->dev, &dev_attr_cpu0_vid); | ||
| 1209 | device_create_file(&new_client->dev, &dev_attr_alarms); | ||
| 1210 | device_create_file(&new_client->dev, &dev_attr_pwm1_auto_channels); | ||
| 1211 | device_create_file(&new_client->dev, &dev_attr_pwm2_auto_channels); | ||
| 1212 | device_create_file(&new_client->dev, &dev_attr_pwm3_auto_channels); | ||
| 1213 | device_create_file(&new_client->dev, &dev_attr_pwm1_auto_pwm_min); | ||
| 1214 | device_create_file(&new_client->dev, &dev_attr_pwm2_auto_pwm_min); | ||
| 1215 | device_create_file(&new_client->dev, &dev_attr_pwm3_auto_pwm_min); | ||
| 1216 | device_create_file(&new_client->dev, &dev_attr_pwm1_auto_pwm_minctl); | ||
| 1217 | device_create_file(&new_client->dev, &dev_attr_pwm2_auto_pwm_minctl); | ||
| 1218 | device_create_file(&new_client->dev, &dev_attr_pwm3_auto_pwm_minctl); | ||
| 1219 | device_create_file(&new_client->dev, &dev_attr_pwm1_auto_pwm_freq); | ||
| 1220 | device_create_file(&new_client->dev, &dev_attr_pwm2_auto_pwm_freq); | ||
| 1221 | device_create_file(&new_client->dev, &dev_attr_pwm3_auto_pwm_freq); | ||
| 1222 | device_create_file(&new_client->dev, &dev_attr_temp1_auto_temp_off); | ||
| 1223 | device_create_file(&new_client->dev, &dev_attr_temp2_auto_temp_off); | ||
| 1224 | device_create_file(&new_client->dev, &dev_attr_temp3_auto_temp_off); | ||
| 1225 | device_create_file(&new_client->dev, &dev_attr_temp1_auto_temp_min); | ||
| 1226 | device_create_file(&new_client->dev, &dev_attr_temp2_auto_temp_min); | ||
| 1227 | device_create_file(&new_client->dev, &dev_attr_temp3_auto_temp_min); | ||
| 1228 | device_create_file(&new_client->dev, &dev_attr_temp1_auto_temp_max); | ||
| 1229 | device_create_file(&new_client->dev, &dev_attr_temp2_auto_temp_max); | ||
| 1230 | device_create_file(&new_client->dev, &dev_attr_temp3_auto_temp_max); | ||
| 1231 | device_create_file(&new_client->dev, &dev_attr_temp1_auto_temp_crit); | ||
| 1232 | device_create_file(&new_client->dev, &dev_attr_temp2_auto_temp_crit); | ||
| 1233 | device_create_file(&new_client->dev, &dev_attr_temp3_auto_temp_crit); | ||
| 1234 | 1251 | ||
| 1235 | /* The ADT7463 has an optional VRM 10 mode where pin 21 is used | 1252 | /* The ADT7463 has an optional VRM 10 mode where pin 21 is used |
| 1236 | as a sixth digital VID input rather than an analog input. */ | 1253 | as a sixth digital VID input rather than an analog input. */ |
| 1237 | data->vid = lm85_read_value(new_client, LM85_REG_VID); | 1254 | data->vid = lm85_read_value(new_client, LM85_REG_VID); |
| 1238 | if (!(kind == adt7463 && (data->vid & 0x80))) { | 1255 | if (!(kind == adt7463 && (data->vid & 0x80))) |
| 1239 | device_create_file(&new_client->dev, &dev_attr_in4_input); | 1256 | if ((err = device_create_file(&new_client->dev, |
| 1240 | device_create_file(&new_client->dev, &dev_attr_in4_min); | 1257 | &dev_attr_in4_input)) |
| 1241 | device_create_file(&new_client->dev, &dev_attr_in4_max); | 1258 | || (err = device_create_file(&new_client->dev, |
| 1259 | &dev_attr_in4_min)) | ||
| 1260 | || (err = device_create_file(&new_client->dev, | ||
| 1261 | &dev_attr_in4_max))) | ||
| 1262 | goto ERROR3; | ||
| 1263 | |||
| 1264 | data->class_dev = hwmon_device_register(&new_client->dev); | ||
| 1265 | if (IS_ERR(data->class_dev)) { | ||
| 1266 | err = PTR_ERR(data->class_dev); | ||
| 1267 | goto ERROR3; | ||
| 1242 | } | 1268 | } |
| 1243 | 1269 | ||
| 1244 | return 0; | 1270 | return 0; |
| 1245 | 1271 | ||
| 1246 | /* Error out and cleanup code */ | 1272 | /* Error out and cleanup code */ |
| 1273 | ERROR3: | ||
| 1274 | sysfs_remove_group(&new_client->dev.kobj, &lm85_group); | ||
| 1275 | sysfs_remove_group(&new_client->dev.kobj, &lm85_group_opt); | ||
| 1247 | ERROR2: | 1276 | ERROR2: |
| 1248 | i2c_detach_client(new_client); | 1277 | i2c_detach_client(new_client); |
| 1249 | ERROR1: | 1278 | ERROR1: |
| @@ -1256,6 +1285,8 @@ static int lm85_detach_client(struct i2c_client *client) | |||
| 1256 | { | 1285 | { |
| 1257 | struct lm85_data *data = i2c_get_clientdata(client); | 1286 | struct lm85_data *data = i2c_get_clientdata(client); |
| 1258 | hwmon_device_unregister(data->class_dev); | 1287 | hwmon_device_unregister(data->class_dev); |
| 1288 | sysfs_remove_group(&client->dev.kobj, &lm85_group); | ||
| 1289 | sysfs_remove_group(&client->dev.kobj, &lm85_group_opt); | ||
| 1259 | i2c_detach_client(client); | 1290 | i2c_detach_client(client); |
| 1260 | kfree(data); | 1291 | kfree(data); |
| 1261 | return 0; | 1292 | return 0; |
diff --git a/drivers/hwmon/lm87.c b/drivers/hwmon/lm87.c index e6c1b638c971..3ce825489e34 100644 --- a/drivers/hwmon/lm87.c +++ b/drivers/hwmon/lm87.c | |||
| @@ -542,6 +542,78 @@ static int lm87_attach_adapter(struct i2c_adapter *adapter) | |||
| 542 | return i2c_probe(adapter, &addr_data, lm87_detect); | 542 | return i2c_probe(adapter, &addr_data, lm87_detect); |
| 543 | } | 543 | } |
| 544 | 544 | ||
| 545 | static struct attribute *lm87_attributes[] = { | ||
| 546 | &dev_attr_in1_input.attr, | ||
| 547 | &dev_attr_in1_min.attr, | ||
| 548 | &dev_attr_in1_max.attr, | ||
| 549 | &dev_attr_in2_input.attr, | ||
| 550 | &dev_attr_in2_min.attr, | ||
| 551 | &dev_attr_in2_max.attr, | ||
| 552 | &dev_attr_in3_input.attr, | ||
| 553 | &dev_attr_in3_min.attr, | ||
| 554 | &dev_attr_in3_max.attr, | ||
| 555 | &dev_attr_in4_input.attr, | ||
| 556 | &dev_attr_in4_min.attr, | ||
| 557 | &dev_attr_in4_max.attr, | ||
| 558 | |||
| 559 | &dev_attr_temp1_input.attr, | ||
| 560 | &dev_attr_temp1_max.attr, | ||
| 561 | &dev_attr_temp1_min.attr, | ||
| 562 | &dev_attr_temp1_crit.attr, | ||
| 563 | &dev_attr_temp2_input.attr, | ||
| 564 | &dev_attr_temp2_max.attr, | ||
| 565 | &dev_attr_temp2_min.attr, | ||
| 566 | &dev_attr_temp2_crit.attr, | ||
| 567 | |||
| 568 | &dev_attr_alarms.attr, | ||
| 569 | &dev_attr_aout_output.attr, | ||
| 570 | |||
| 571 | NULL | ||
| 572 | }; | ||
| 573 | |||
| 574 | static const struct attribute_group lm87_group = { | ||
| 575 | .attrs = lm87_attributes, | ||
| 576 | }; | ||
| 577 | |||
| 578 | static struct attribute *lm87_attributes_opt[] = { | ||
| 579 | &dev_attr_in6_input.attr, | ||
| 580 | &dev_attr_in6_min.attr, | ||
| 581 | &dev_attr_in6_max.attr, | ||
| 582 | |||
| 583 | &dev_attr_fan1_input.attr, | ||
| 584 | &dev_attr_fan1_min.attr, | ||
| 585 | &dev_attr_fan1_div.attr, | ||
| 586 | |||
| 587 | &dev_attr_in7_input.attr, | ||
| 588 | &dev_attr_in7_min.attr, | ||
| 589 | &dev_attr_in7_max.attr, | ||
| 590 | |||
| 591 | &dev_attr_fan2_input.attr, | ||
| 592 | &dev_attr_fan2_min.attr, | ||
| 593 | &dev_attr_fan2_div.attr, | ||
| 594 | |||
| 595 | &dev_attr_temp3_input.attr, | ||
| 596 | &dev_attr_temp3_max.attr, | ||
| 597 | &dev_attr_temp3_min.attr, | ||
| 598 | &dev_attr_temp3_crit.attr, | ||
| 599 | |||
| 600 | &dev_attr_in0_input.attr, | ||
| 601 | &dev_attr_in0_min.attr, | ||
| 602 | &dev_attr_in0_max.attr, | ||
| 603 | &dev_attr_in5_input.attr, | ||
| 604 | &dev_attr_in5_min.attr, | ||
| 605 | &dev_attr_in5_max.attr, | ||
| 606 | |||
| 607 | &dev_attr_cpu0_vid.attr, | ||
| 608 | &dev_attr_vrm.attr, | ||
| 609 | |||
| 610 | NULL | ||
| 611 | }; | ||
| 612 | |||
| 613 | static const struct attribute_group lm87_group_opt = { | ||
| 614 | .attrs = lm87_attributes_opt, | ||
| 615 | }; | ||
| 616 | |||
| 545 | /* | 617 | /* |
| 546 | * The following function does more than just detection. If detection | 618 | * The following function does more than just detection. If detection |
| 547 | * succeeds, it also registers the new chip. | 619 | * succeeds, it also registers the new chip. |
| @@ -609,77 +681,90 @@ static int lm87_detect(struct i2c_adapter *adapter, int address, int kind) | |||
| 609 | data->in_scale[7] = 1875; | 681 | data->in_scale[7] = 1875; |
| 610 | 682 | ||
| 611 | /* Register sysfs hooks */ | 683 | /* Register sysfs hooks */ |
| 612 | data->class_dev = hwmon_device_register(&new_client->dev); | 684 | if ((err = sysfs_create_group(&new_client->dev.kobj, &lm87_group))) |
| 613 | if (IS_ERR(data->class_dev)) { | ||
| 614 | err = PTR_ERR(data->class_dev); | ||
| 615 | goto exit_detach; | 685 | goto exit_detach; |
| 616 | } | ||
| 617 | |||
| 618 | device_create_file(&new_client->dev, &dev_attr_in1_input); | ||
| 619 | device_create_file(&new_client->dev, &dev_attr_in1_min); | ||
| 620 | device_create_file(&new_client->dev, &dev_attr_in1_max); | ||
| 621 | device_create_file(&new_client->dev, &dev_attr_in2_input); | ||
| 622 | device_create_file(&new_client->dev, &dev_attr_in2_min); | ||
| 623 | device_create_file(&new_client->dev, &dev_attr_in2_max); | ||
| 624 | device_create_file(&new_client->dev, &dev_attr_in3_input); | ||
| 625 | device_create_file(&new_client->dev, &dev_attr_in3_min); | ||
| 626 | device_create_file(&new_client->dev, &dev_attr_in3_max); | ||
| 627 | device_create_file(&new_client->dev, &dev_attr_in4_input); | ||
| 628 | device_create_file(&new_client->dev, &dev_attr_in4_min); | ||
| 629 | device_create_file(&new_client->dev, &dev_attr_in4_max); | ||
| 630 | 686 | ||
| 631 | if (data->channel & CHAN_NO_FAN(0)) { | 687 | if (data->channel & CHAN_NO_FAN(0)) { |
| 632 | device_create_file(&new_client->dev, &dev_attr_in6_input); | 688 | if ((err = device_create_file(&new_client->dev, |
| 633 | device_create_file(&new_client->dev, &dev_attr_in6_min); | 689 | &dev_attr_in6_input)) |
| 634 | device_create_file(&new_client->dev, &dev_attr_in6_max); | 690 | || (err = device_create_file(&new_client->dev, |
| 691 | &dev_attr_in6_min)) | ||
| 692 | || (err = device_create_file(&new_client->dev, | ||
| 693 | &dev_attr_in6_max))) | ||
| 694 | goto exit_remove; | ||
| 635 | } else { | 695 | } else { |
| 636 | device_create_file(&new_client->dev, &dev_attr_fan1_input); | 696 | if ((err = device_create_file(&new_client->dev, |
| 637 | device_create_file(&new_client->dev, &dev_attr_fan1_min); | 697 | &dev_attr_fan1_input)) |
| 638 | device_create_file(&new_client->dev, &dev_attr_fan1_div); | 698 | || (err = device_create_file(&new_client->dev, |
| 699 | &dev_attr_fan1_min)) | ||
| 700 | || (err = device_create_file(&new_client->dev, | ||
| 701 | &dev_attr_fan1_div))) | ||
| 702 | goto exit_remove; | ||
| 639 | } | 703 | } |
| 704 | |||
| 640 | if (data->channel & CHAN_NO_FAN(1)) { | 705 | if (data->channel & CHAN_NO_FAN(1)) { |
| 641 | device_create_file(&new_client->dev, &dev_attr_in7_input); | 706 | if ((err = device_create_file(&new_client->dev, |
| 642 | device_create_file(&new_client->dev, &dev_attr_in7_min); | 707 | &dev_attr_in7_input)) |
| 643 | device_create_file(&new_client->dev, &dev_attr_in7_max); | 708 | || (err = device_create_file(&new_client->dev, |
| 709 | &dev_attr_in7_min)) | ||
| 710 | || (err = device_create_file(&new_client->dev, | ||
| 711 | &dev_attr_in7_max))) | ||
| 712 | goto exit_remove; | ||
| 644 | } else { | 713 | } else { |
| 645 | device_create_file(&new_client->dev, &dev_attr_fan2_input); | 714 | if ((err = device_create_file(&new_client->dev, |
| 646 | device_create_file(&new_client->dev, &dev_attr_fan2_min); | 715 | &dev_attr_fan2_input)) |
| 647 | device_create_file(&new_client->dev, &dev_attr_fan2_div); | 716 | || (err = device_create_file(&new_client->dev, |
| 717 | &dev_attr_fan2_min)) | ||
| 718 | || (err = device_create_file(&new_client->dev, | ||
| 719 | &dev_attr_fan2_div))) | ||
| 720 | goto exit_remove; | ||
| 648 | } | 721 | } |
| 649 | 722 | ||
| 650 | device_create_file(&new_client->dev, &dev_attr_temp1_input); | ||
| 651 | device_create_file(&new_client->dev, &dev_attr_temp1_max); | ||
| 652 | device_create_file(&new_client->dev, &dev_attr_temp1_min); | ||
| 653 | device_create_file(&new_client->dev, &dev_attr_temp1_crit); | ||
| 654 | device_create_file(&new_client->dev, &dev_attr_temp2_input); | ||
| 655 | device_create_file(&new_client->dev, &dev_attr_temp2_max); | ||
| 656 | device_create_file(&new_client->dev, &dev_attr_temp2_min); | ||
| 657 | device_create_file(&new_client->dev, &dev_attr_temp2_crit); | ||
| 658 | |||
| 659 | if (data->channel & CHAN_TEMP3) { | 723 | if (data->channel & CHAN_TEMP3) { |
| 660 | device_create_file(&new_client->dev, &dev_attr_temp3_input); | 724 | if ((err = device_create_file(&new_client->dev, |
| 661 | device_create_file(&new_client->dev, &dev_attr_temp3_max); | 725 | &dev_attr_temp3_input)) |
| 662 | device_create_file(&new_client->dev, &dev_attr_temp3_min); | 726 | || (err = device_create_file(&new_client->dev, |
| 663 | device_create_file(&new_client->dev, &dev_attr_temp3_crit); | 727 | &dev_attr_temp3_max)) |
| 728 | || (err = device_create_file(&new_client->dev, | ||
| 729 | &dev_attr_temp3_min)) | ||
| 730 | || (err = device_create_file(&new_client->dev, | ||
| 731 | &dev_attr_temp3_crit))) | ||
| 732 | goto exit_remove; | ||
| 664 | } else { | 733 | } else { |
| 665 | device_create_file(&new_client->dev, &dev_attr_in0_input); | 734 | if ((err = device_create_file(&new_client->dev, |
| 666 | device_create_file(&new_client->dev, &dev_attr_in0_min); | 735 | &dev_attr_in0_input)) |
| 667 | device_create_file(&new_client->dev, &dev_attr_in0_max); | 736 | || (err = device_create_file(&new_client->dev, |
| 668 | device_create_file(&new_client->dev, &dev_attr_in5_input); | 737 | &dev_attr_in0_min)) |
| 669 | device_create_file(&new_client->dev, &dev_attr_in5_min); | 738 | || (err = device_create_file(&new_client->dev, |
| 670 | device_create_file(&new_client->dev, &dev_attr_in5_max); | 739 | &dev_attr_in0_max)) |
| 740 | || (err = device_create_file(&new_client->dev, | ||
| 741 | &dev_attr_in5_input)) | ||
| 742 | || (err = device_create_file(&new_client->dev, | ||
| 743 | &dev_attr_in5_min)) | ||
| 744 | || (err = device_create_file(&new_client->dev, | ||
| 745 | &dev_attr_in5_max))) | ||
| 746 | goto exit_remove; | ||
| 671 | } | 747 | } |
| 672 | 748 | ||
| 673 | if (!(data->channel & CHAN_NO_VID)) { | 749 | if (!(data->channel & CHAN_NO_VID)) { |
| 674 | device_create_file(&new_client->dev, &dev_attr_cpu0_vid); | 750 | if ((err = device_create_file(&new_client->dev, |
| 675 | device_create_file(&new_client->dev, &dev_attr_vrm); | 751 | &dev_attr_cpu0_vid)) |
| 752 | || (err = device_create_file(&new_client->dev, | ||
| 753 | &dev_attr_vrm))) | ||
| 754 | goto exit_remove; | ||
| 676 | } | 755 | } |
| 677 | 756 | ||
| 678 | device_create_file(&new_client->dev, &dev_attr_alarms); | 757 | data->class_dev = hwmon_device_register(&new_client->dev); |
| 679 | device_create_file(&new_client->dev, &dev_attr_aout_output); | 758 | if (IS_ERR(data->class_dev)) { |
| 759 | err = PTR_ERR(data->class_dev); | ||
| 760 | goto exit_remove; | ||
| 761 | } | ||
| 680 | 762 | ||
| 681 | return 0; | 763 | return 0; |
| 682 | 764 | ||
| 765 | exit_remove: | ||
| 766 | sysfs_remove_group(&new_client->dev.kobj, &lm87_group); | ||
| 767 | sysfs_remove_group(&new_client->dev.kobj, &lm87_group_opt); | ||
| 683 | exit_detach: | 768 | exit_detach: |
| 684 | i2c_detach_client(new_client); | 769 | i2c_detach_client(new_client); |
| 685 | exit_free: | 770 | exit_free: |
| @@ -732,6 +817,8 @@ static int lm87_detach_client(struct i2c_client *client) | |||
| 732 | int err; | 817 | int err; |
| 733 | 818 | ||
| 734 | hwmon_device_unregister(data->class_dev); | 819 | hwmon_device_unregister(data->class_dev); |
| 820 | sysfs_remove_group(&client->dev.kobj, &lm87_group); | ||
| 821 | sysfs_remove_group(&client->dev.kobj, &lm87_group_opt); | ||
| 735 | 822 | ||
| 736 | if ((err = i2c_detach_client(client))) | 823 | if ((err = i2c_detach_client(client))) |
| 737 | return err; | 824 | return err; |
diff --git a/drivers/hwmon/lm92.c b/drivers/hwmon/lm92.c index 197f77226dc4..30b536333f14 100644 --- a/drivers/hwmon/lm92.c +++ b/drivers/hwmon/lm92.c | |||
| @@ -288,6 +288,23 @@ static int max6635_check(struct i2c_client *client) | |||
| 288 | return 1; | 288 | return 1; |
| 289 | } | 289 | } |
| 290 | 290 | ||
| 291 | static struct attribute *lm92_attributes[] = { | ||
| 292 | &dev_attr_temp1_input.attr, | ||
| 293 | &dev_attr_temp1_crit.attr, | ||
| 294 | &dev_attr_temp1_crit_hyst.attr, | ||
| 295 | &dev_attr_temp1_min.attr, | ||
| 296 | &dev_attr_temp1_min_hyst.attr, | ||
| 297 | &dev_attr_temp1_max.attr, | ||
| 298 | &dev_attr_temp1_max_hyst.attr, | ||
| 299 | &dev_attr_alarms.attr, | ||
| 300 | |||
| 301 | NULL | ||
| 302 | }; | ||
| 303 | |||
| 304 | static const struct attribute_group lm92_group = { | ||
| 305 | .attrs = lm92_attributes, | ||
| 306 | }; | ||
| 307 | |||
| 291 | /* The following function does more than just detection. If detection | 308 | /* The following function does more than just detection. If detection |
| 292 | succeeds, it also registers the new chip. */ | 309 | succeeds, it also registers the new chip. */ |
| 293 | static int lm92_detect(struct i2c_adapter *adapter, int address, int kind) | 310 | static int lm92_detect(struct i2c_adapter *adapter, int address, int kind) |
| @@ -359,23 +376,19 @@ static int lm92_detect(struct i2c_adapter *adapter, int address, int kind) | |||
| 359 | lm92_init_client(new_client); | 376 | lm92_init_client(new_client); |
| 360 | 377 | ||
| 361 | /* Register sysfs hooks */ | 378 | /* Register sysfs hooks */ |
| 379 | if ((err = sysfs_create_group(&new_client->dev.kobj, &lm92_group))) | ||
| 380 | goto exit_detach; | ||
| 381 | |||
| 362 | data->class_dev = hwmon_device_register(&new_client->dev); | 382 | data->class_dev = hwmon_device_register(&new_client->dev); |
| 363 | if (IS_ERR(data->class_dev)) { | 383 | if (IS_ERR(data->class_dev)) { |
| 364 | err = PTR_ERR(data->class_dev); | 384 | err = PTR_ERR(data->class_dev); |
| 365 | goto exit_detach; | 385 | goto exit_remove; |
| 366 | } | 386 | } |
| 367 | 387 | ||
| 368 | device_create_file(&new_client->dev, &dev_attr_temp1_input); | ||
| 369 | device_create_file(&new_client->dev, &dev_attr_temp1_crit); | ||
| 370 | device_create_file(&new_client->dev, &dev_attr_temp1_crit_hyst); | ||
| 371 | device_create_file(&new_client->dev, &dev_attr_temp1_min); | ||
| 372 | device_create_file(&new_client->dev, &dev_attr_temp1_min_hyst); | ||
| 373 | device_create_file(&new_client->dev, &dev_attr_temp1_max); | ||
| 374 | device_create_file(&new_client->dev, &dev_attr_temp1_max_hyst); | ||
| 375 | device_create_file(&new_client->dev, &dev_attr_alarms); | ||
| 376 | |||
| 377 | return 0; | 388 | return 0; |
| 378 | 389 | ||
| 390 | exit_remove: | ||
| 391 | sysfs_remove_group(&new_client->dev.kobj, &lm92_group); | ||
| 379 | exit_detach: | 392 | exit_detach: |
| 380 | i2c_detach_client(new_client); | 393 | i2c_detach_client(new_client); |
| 381 | exit_free: | 394 | exit_free: |
| @@ -397,6 +410,7 @@ static int lm92_detach_client(struct i2c_client *client) | |||
| 397 | int err; | 410 | int err; |
| 398 | 411 | ||
| 399 | hwmon_device_unregister(data->class_dev); | 412 | hwmon_device_unregister(data->class_dev); |
| 413 | sysfs_remove_group(&client->dev.kobj, &lm92_group); | ||
| 400 | 414 | ||
| 401 | if ((err = i2c_detach_client(client))) | 415 | if ((err = i2c_detach_client(client))) |
| 402 | return err; | 416 | return err; |
