diff options
| -rw-r--r-- | drivers/hwmon/adm1031.c | 325 |
1 files changed, 132 insertions, 193 deletions
diff --git a/drivers/hwmon/adm1031.c b/drivers/hwmon/adm1031.c index b3e358c65d02..53210555441a 100644 --- a/drivers/hwmon/adm1031.c +++ b/drivers/hwmon/adm1031.c | |||
| @@ -27,6 +27,7 @@ | |||
| 27 | #include <linux/jiffies.h> | 27 | #include <linux/jiffies.h> |
| 28 | #include <linux/i2c.h> | 28 | #include <linux/i2c.h> |
| 29 | #include <linux/hwmon.h> | 29 | #include <linux/hwmon.h> |
| 30 | #include <linux/hwmon-sysfs.h> | ||
| 30 | #include <linux/err.h> | 31 | #include <linux/err.h> |
| 31 | #include <linux/mutex.h> | 32 | #include <linux/mutex.h> |
| 32 | 33 | ||
| @@ -245,17 +246,21 @@ get_fan_auto_nearest(struct adm1031_data *data, | |||
| 245 | return 0; | 246 | return 0; |
| 246 | } | 247 | } |
| 247 | 248 | ||
| 248 | static ssize_t show_fan_auto_channel(struct device *dev, char *buf, int nr) | 249 | static ssize_t show_fan_auto_channel(struct device *dev, |
| 250 | struct device_attribute *attr, char *buf) | ||
| 249 | { | 251 | { |
| 252 | int nr = to_sensor_dev_attr(attr)->index; | ||
| 250 | struct adm1031_data *data = adm1031_update_device(dev); | 253 | struct adm1031_data *data = adm1031_update_device(dev); |
| 251 | return sprintf(buf, "%d\n", GET_FAN_AUTO_BITFIELD(data, nr)); | 254 | return sprintf(buf, "%d\n", GET_FAN_AUTO_BITFIELD(data, nr)); |
| 252 | } | 255 | } |
| 253 | 256 | ||
| 254 | static ssize_t | 257 | static ssize_t |
| 255 | set_fan_auto_channel(struct device *dev, const char *buf, size_t count, int nr) | 258 | set_fan_auto_channel(struct device *dev, struct device_attribute *attr, |
| 259 | const char *buf, size_t count) | ||
| 256 | { | 260 | { |
| 257 | struct i2c_client *client = to_i2c_client(dev); | 261 | struct i2c_client *client = to_i2c_client(dev); |
| 258 | struct adm1031_data *data = i2c_get_clientdata(client); | 262 | struct adm1031_data *data = i2c_get_clientdata(client); |
| 263 | int nr = to_sensor_dev_attr(attr)->index; | ||
| 259 | int val = simple_strtol(buf, NULL, 10); | 264 | int val = simple_strtol(buf, NULL, 10); |
| 260 | u8 reg; | 265 | u8 reg; |
| 261 | int ret; | 266 | int ret; |
| @@ -294,41 +299,35 @@ set_fan_auto_channel(struct device *dev, const char *buf, size_t count, int nr) | |||
| 294 | return count; | 299 | return count; |
| 295 | } | 300 | } |
| 296 | 301 | ||
| 297 | #define fan_auto_channel_offset(offset) \ | 302 | static SENSOR_DEVICE_ATTR(auto_fan1_channel, S_IRUGO | S_IWUSR, |
| 298 | static ssize_t show_fan_auto_channel_##offset (struct device *dev, struct device_attribute *attr, char *buf) \ | 303 | show_fan_auto_channel, set_fan_auto_channel, 0); |
| 299 | { \ | 304 | static SENSOR_DEVICE_ATTR(auto_fan2_channel, S_IRUGO | S_IWUSR, |
| 300 | return show_fan_auto_channel(dev, buf, offset - 1); \ | 305 | show_fan_auto_channel, set_fan_auto_channel, 1); |
| 301 | } \ | ||
| 302 | static ssize_t set_fan_auto_channel_##offset (struct device *dev, struct device_attribute *attr, \ | ||
| 303 | const char *buf, size_t count) \ | ||
| 304 | { \ | ||
| 305 | return set_fan_auto_channel(dev, buf, count, offset - 1); \ | ||
| 306 | } \ | ||
| 307 | static DEVICE_ATTR(auto_fan##offset##_channel, S_IRUGO | S_IWUSR, \ | ||
| 308 | show_fan_auto_channel_##offset, \ | ||
| 309 | set_fan_auto_channel_##offset) | ||
| 310 | |||
| 311 | fan_auto_channel_offset(1); | ||
| 312 | fan_auto_channel_offset(2); | ||
| 313 | 306 | ||
| 314 | /* Auto Temps */ | 307 | /* Auto Temps */ |
| 315 | static ssize_t show_auto_temp_off(struct device *dev, char *buf, int nr) | 308 | static ssize_t show_auto_temp_off(struct device *dev, |
| 309 | struct device_attribute *attr, char *buf) | ||
| 316 | { | 310 | { |
| 311 | int nr = to_sensor_dev_attr(attr)->index; | ||
| 317 | struct adm1031_data *data = adm1031_update_device(dev); | 312 | struct adm1031_data *data = adm1031_update_device(dev); |
| 318 | return sprintf(buf, "%d\n", | 313 | return sprintf(buf, "%d\n", |
| 319 | AUTO_TEMP_OFF_FROM_REG(data->auto_temp[nr])); | 314 | AUTO_TEMP_OFF_FROM_REG(data->auto_temp[nr])); |
| 320 | } | 315 | } |
| 321 | static ssize_t show_auto_temp_min(struct device *dev, char *buf, int nr) | 316 | static ssize_t show_auto_temp_min(struct device *dev, |
| 317 | struct device_attribute *attr, char *buf) | ||
| 322 | { | 318 | { |
| 319 | int nr = to_sensor_dev_attr(attr)->index; | ||
| 323 | struct adm1031_data *data = adm1031_update_device(dev); | 320 | struct adm1031_data *data = adm1031_update_device(dev); |
| 324 | return sprintf(buf, "%d\n", | 321 | return sprintf(buf, "%d\n", |
| 325 | AUTO_TEMP_MIN_FROM_REG(data->auto_temp[nr])); | 322 | AUTO_TEMP_MIN_FROM_REG(data->auto_temp[nr])); |
| 326 | } | 323 | } |
| 327 | static ssize_t | 324 | static ssize_t |
| 328 | set_auto_temp_min(struct device *dev, const char *buf, size_t count, int nr) | 325 | set_auto_temp_min(struct device *dev, struct device_attribute *attr, |
| 326 | const char *buf, size_t count) | ||
| 329 | { | 327 | { |
| 330 | struct i2c_client *client = to_i2c_client(dev); | 328 | struct i2c_client *client = to_i2c_client(dev); |
| 331 | struct adm1031_data *data = i2c_get_clientdata(client); | 329 | struct adm1031_data *data = i2c_get_clientdata(client); |
| 330 | int nr = to_sensor_dev_attr(attr)->index; | ||
| 332 | int val = simple_strtol(buf, NULL, 10); | 331 | int val = simple_strtol(buf, NULL, 10); |
| 333 | 332 | ||
| 334 | mutex_lock(&data->update_lock); | 333 | mutex_lock(&data->update_lock); |
| @@ -338,17 +337,21 @@ set_auto_temp_min(struct device *dev, const char *buf, size_t count, int nr) | |||
| 338 | mutex_unlock(&data->update_lock); | 337 | mutex_unlock(&data->update_lock); |
| 339 | return count; | 338 | return count; |
| 340 | } | 339 | } |
| 341 | static ssize_t show_auto_temp_max(struct device *dev, char *buf, int nr) | 340 | static ssize_t show_auto_temp_max(struct device *dev, |
| 341 | struct device_attribute *attr, char *buf) | ||
| 342 | { | 342 | { |
| 343 | int nr = to_sensor_dev_attr(attr)->index; | ||
| 343 | struct adm1031_data *data = adm1031_update_device(dev); | 344 | struct adm1031_data *data = adm1031_update_device(dev); |
| 344 | return sprintf(buf, "%d\n", | 345 | return sprintf(buf, "%d\n", |
| 345 | AUTO_TEMP_MAX_FROM_REG(data->auto_temp[nr])); | 346 | AUTO_TEMP_MAX_FROM_REG(data->auto_temp[nr])); |
| 346 | } | 347 | } |
| 347 | static ssize_t | 348 | static ssize_t |
| 348 | set_auto_temp_max(struct device *dev, const char *buf, size_t count, int nr) | 349 | set_auto_temp_max(struct device *dev, struct device_attribute *attr, |
| 350 | const char *buf, size_t count) | ||
| 349 | { | 351 | { |
| 350 | struct i2c_client *client = to_i2c_client(dev); | 352 | struct i2c_client *client = to_i2c_client(dev); |
| 351 | struct adm1031_data *data = i2c_get_clientdata(client); | 353 | struct adm1031_data *data = i2c_get_clientdata(client); |
| 354 | int nr = to_sensor_dev_attr(attr)->index; | ||
| 352 | int val = simple_strtol(buf, NULL, 10); | 355 | int val = simple_strtol(buf, NULL, 10); |
| 353 | 356 | ||
| 354 | mutex_lock(&data->update_lock); | 357 | mutex_lock(&data->update_lock); |
| @@ -359,51 +362,32 @@ set_auto_temp_max(struct device *dev, const char *buf, size_t count, int nr) | |||
| 359 | return count; | 362 | return count; |
| 360 | } | 363 | } |
| 361 | 364 | ||
| 362 | #define auto_temp_reg(offset) \ | 365 | #define auto_temp_reg(offset) \ |
| 363 | static ssize_t show_auto_temp_##offset##_off (struct device *dev, struct device_attribute *attr, char *buf) \ | 366 | static SENSOR_DEVICE_ATTR(auto_temp##offset##_off, S_IRUGO, \ |
| 364 | { \ | 367 | show_auto_temp_off, NULL, offset - 1); \ |
| 365 | return show_auto_temp_off(dev, buf, offset - 1); \ | 368 | static SENSOR_DEVICE_ATTR(auto_temp##offset##_min, S_IRUGO | S_IWUSR, \ |
| 366 | } \ | 369 | show_auto_temp_min, set_auto_temp_min, offset - 1); \ |
| 367 | static ssize_t show_auto_temp_##offset##_min (struct device *dev, struct device_attribute *attr, char *buf) \ | 370 | static SENSOR_DEVICE_ATTR(auto_temp##offset##_max, S_IRUGO | S_IWUSR, \ |
| 368 | { \ | 371 | show_auto_temp_max, set_auto_temp_max, offset - 1) |
| 369 | return show_auto_temp_min(dev, buf, offset - 1); \ | ||
| 370 | } \ | ||
| 371 | static ssize_t show_auto_temp_##offset##_max (struct device *dev, struct device_attribute *attr, char *buf) \ | ||
| 372 | { \ | ||
| 373 | return show_auto_temp_max(dev, buf, offset - 1); \ | ||
| 374 | } \ | ||
| 375 | static ssize_t set_auto_temp_##offset##_min (struct device *dev, struct device_attribute *attr, \ | ||
| 376 | const char *buf, size_t count) \ | ||
| 377 | { \ | ||
| 378 | return set_auto_temp_min(dev, buf, count, offset - 1); \ | ||
| 379 | } \ | ||
| 380 | static ssize_t set_auto_temp_##offset##_max (struct device *dev, struct device_attribute *attr, \ | ||
| 381 | const char *buf, size_t count) \ | ||
| 382 | { \ | ||
| 383 | return set_auto_temp_max(dev, buf, count, offset - 1); \ | ||
| 384 | } \ | ||
| 385 | static DEVICE_ATTR(auto_temp##offset##_off, S_IRUGO, \ | ||
| 386 | show_auto_temp_##offset##_off, NULL); \ | ||
| 387 | static DEVICE_ATTR(auto_temp##offset##_min, S_IRUGO | S_IWUSR, \ | ||
| 388 | show_auto_temp_##offset##_min, set_auto_temp_##offset##_min);\ | ||
| 389 | static DEVICE_ATTR(auto_temp##offset##_max, S_IRUGO | S_IWUSR, \ | ||
| 390 | show_auto_temp_##offset##_max, set_auto_temp_##offset##_max) | ||
| 391 | 372 | ||
| 392 | auto_temp_reg(1); | 373 | auto_temp_reg(1); |
| 393 | auto_temp_reg(2); | 374 | auto_temp_reg(2); |
| 394 | auto_temp_reg(3); | 375 | auto_temp_reg(3); |
| 395 | 376 | ||
| 396 | /* pwm */ | 377 | /* pwm */ |
| 397 | static ssize_t show_pwm(struct device *dev, char *buf, int nr) | 378 | static ssize_t show_pwm(struct device *dev, |
| 379 | struct device_attribute *attr, char *buf) | ||
| 398 | { | 380 | { |
| 381 | int nr = to_sensor_dev_attr(attr)->index; | ||
| 399 | struct adm1031_data *data = adm1031_update_device(dev); | 382 | struct adm1031_data *data = adm1031_update_device(dev); |
| 400 | return sprintf(buf, "%d\n", PWM_FROM_REG(data->pwm[nr])); | 383 | return sprintf(buf, "%d\n", PWM_FROM_REG(data->pwm[nr])); |
| 401 | } | 384 | } |
| 402 | static ssize_t | 385 | static ssize_t set_pwm(struct device *dev, struct device_attribute *attr, |
| 403 | set_pwm(struct device *dev, const char *buf, size_t count, int nr) | 386 | const char *buf, size_t count) |
| 404 | { | 387 | { |
| 405 | struct i2c_client *client = to_i2c_client(dev); | 388 | struct i2c_client *client = to_i2c_client(dev); |
| 406 | struct adm1031_data *data = i2c_get_clientdata(client); | 389 | struct adm1031_data *data = i2c_get_clientdata(client); |
| 390 | int nr = to_sensor_dev_attr(attr)->index; | ||
| 407 | int val = simple_strtol(buf, NULL, 10); | 391 | int val = simple_strtol(buf, NULL, 10); |
| 408 | int reg; | 392 | int reg; |
| 409 | 393 | ||
| @@ -423,21 +407,12 @@ set_pwm(struct device *dev, const char *buf, size_t count, int nr) | |||
| 423 | return count; | 407 | return count; |
| 424 | } | 408 | } |
| 425 | 409 | ||
| 426 | #define pwm_reg(offset) \ | 410 | static SENSOR_DEVICE_ATTR(pwm1, S_IRUGO | S_IWUSR, show_pwm, set_pwm, 0); |
| 427 | static ssize_t show_pwm_##offset (struct device *dev, struct device_attribute *attr, char *buf) \ | 411 | static SENSOR_DEVICE_ATTR(pwm2, S_IRUGO | S_IWUSR, show_pwm, set_pwm, 1); |
| 428 | { \ | 412 | static SENSOR_DEVICE_ATTR(auto_fan1_min_pwm, S_IRUGO | S_IWUSR, |
| 429 | return show_pwm(dev, buf, offset - 1); \ | 413 | show_pwm, set_pwm, 0); |
| 430 | } \ | 414 | static SENSOR_DEVICE_ATTR(auto_fan2_min_pwm, S_IRUGO | S_IWUSR, |
| 431 | static ssize_t set_pwm_##offset (struct device *dev, struct device_attribute *attr, \ | 415 | show_pwm, set_pwm, 1); |
| 432 | const char *buf, size_t count) \ | ||
| 433 | { \ | ||
| 434 | return set_pwm(dev, buf, count, offset - 1); \ | ||
| 435 | } \ | ||
| 436 | static DEVICE_ATTR(pwm##offset, S_IRUGO | S_IWUSR, \ | ||
| 437 | show_pwm_##offset, set_pwm_##offset) | ||
| 438 | |||
| 439 | pwm_reg(1); | ||
| 440 | pwm_reg(2); | ||
| 441 | 416 | ||
| 442 | /* Fans */ | 417 | /* Fans */ |
| 443 | 418 | ||
| @@ -484,8 +459,10 @@ static int trust_fan_readings(struct adm1031_data *data, int chan) | |||
| 484 | } | 459 | } |
| 485 | 460 | ||
| 486 | 461 | ||
| 487 | static ssize_t show_fan(struct device *dev, char *buf, int nr) | 462 | static ssize_t show_fan(struct device *dev, |
| 463 | struct device_attribute *attr, char *buf) | ||
| 488 | { | 464 | { |
| 465 | int nr = to_sensor_dev_attr(attr)->index; | ||
| 489 | struct adm1031_data *data = adm1031_update_device(dev); | 466 | struct adm1031_data *data = adm1031_update_device(dev); |
| 490 | int value; | 467 | int value; |
| 491 | 468 | ||
| @@ -494,23 +471,28 @@ static ssize_t show_fan(struct device *dev, char *buf, int nr) | |||
| 494 | return sprintf(buf, "%d\n", value); | 471 | return sprintf(buf, "%d\n", value); |
| 495 | } | 472 | } |
| 496 | 473 | ||
| 497 | static ssize_t show_fan_div(struct device *dev, char *buf, int nr) | 474 | static ssize_t show_fan_div(struct device *dev, |
| 475 | struct device_attribute *attr, char *buf) | ||
| 498 | { | 476 | { |
| 477 | int nr = to_sensor_dev_attr(attr)->index; | ||
| 499 | struct adm1031_data *data = adm1031_update_device(dev); | 478 | struct adm1031_data *data = adm1031_update_device(dev); |
| 500 | return sprintf(buf, "%d\n", FAN_DIV_FROM_REG(data->fan_div[nr])); | 479 | return sprintf(buf, "%d\n", FAN_DIV_FROM_REG(data->fan_div[nr])); |
| 501 | } | 480 | } |
| 502 | static ssize_t show_fan_min(struct device *dev, char *buf, int nr) | 481 | static ssize_t show_fan_min(struct device *dev, |
| 482 | struct device_attribute *attr, char *buf) | ||
| 503 | { | 483 | { |
| 484 | int nr = to_sensor_dev_attr(attr)->index; | ||
| 504 | struct adm1031_data *data = adm1031_update_device(dev); | 485 | struct adm1031_data *data = adm1031_update_device(dev); |
| 505 | return sprintf(buf, "%d\n", | 486 | return sprintf(buf, "%d\n", |
| 506 | FAN_FROM_REG(data->fan_min[nr], | 487 | FAN_FROM_REG(data->fan_min[nr], |
| 507 | FAN_DIV_FROM_REG(data->fan_div[nr]))); | 488 | FAN_DIV_FROM_REG(data->fan_div[nr]))); |
| 508 | } | 489 | } |
| 509 | static ssize_t | 490 | static ssize_t set_fan_min(struct device *dev, struct device_attribute *attr, |
| 510 | set_fan_min(struct device *dev, const char *buf, size_t count, int nr) | 491 | const char *buf, size_t count) |
| 511 | { | 492 | { |
| 512 | struct i2c_client *client = to_i2c_client(dev); | 493 | struct i2c_client *client = to_i2c_client(dev); |
| 513 | struct adm1031_data *data = i2c_get_clientdata(client); | 494 | struct adm1031_data *data = i2c_get_clientdata(client); |
| 495 | int nr = to_sensor_dev_attr(attr)->index; | ||
| 514 | int val = simple_strtol(buf, NULL, 10); | 496 | int val = simple_strtol(buf, NULL, 10); |
| 515 | 497 | ||
| 516 | mutex_lock(&data->update_lock); | 498 | mutex_lock(&data->update_lock); |
| @@ -524,11 +506,12 @@ set_fan_min(struct device *dev, const char *buf, size_t count, int nr) | |||
| 524 | mutex_unlock(&data->update_lock); | 506 | mutex_unlock(&data->update_lock); |
| 525 | return count; | 507 | return count; |
| 526 | } | 508 | } |
| 527 | static ssize_t | 509 | static ssize_t set_fan_div(struct device *dev, struct device_attribute *attr, |
| 528 | set_fan_div(struct device *dev, const char *buf, size_t count, int nr) | 510 | const char *buf, size_t count) |
| 529 | { | 511 | { |
| 530 | struct i2c_client *client = to_i2c_client(dev); | 512 | struct i2c_client *client = to_i2c_client(dev); |
| 531 | struct adm1031_data *data = i2c_get_clientdata(client); | 513 | struct adm1031_data *data = i2c_get_clientdata(client); |
| 514 | int nr = to_sensor_dev_attr(attr)->index; | ||
| 532 | int val = simple_strtol(buf, NULL, 10); | 515 | int val = simple_strtol(buf, NULL, 10); |
| 533 | u8 tmp; | 516 | u8 tmp; |
| 534 | int old_div; | 517 | int old_div; |
| @@ -567,44 +550,22 @@ set_fan_div(struct device *dev, const char *buf, size_t count, int nr) | |||
| 567 | } | 550 | } |
| 568 | 551 | ||
| 569 | #define fan_offset(offset) \ | 552 | #define fan_offset(offset) \ |
| 570 | static ssize_t show_fan_##offset (struct device *dev, struct device_attribute *attr, char *buf) \ | 553 | static SENSOR_DEVICE_ATTR(fan##offset##_input, S_IRUGO, \ |
| 571 | { \ | 554 | show_fan, NULL, offset - 1); \ |
| 572 | return show_fan(dev, buf, offset - 1); \ | 555 | static SENSOR_DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \ |
| 573 | } \ | 556 | show_fan_min, set_fan_min, offset - 1); \ |
| 574 | static ssize_t show_fan_##offset##_min (struct device *dev, struct device_attribute *attr, char *buf) \ | 557 | static SENSOR_DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR, \ |
| 575 | { \ | 558 | show_fan_div, set_fan_div, offset - 1) |
| 576 | return show_fan_min(dev, buf, offset - 1); \ | ||
| 577 | } \ | ||
| 578 | static ssize_t show_fan_##offset##_div (struct device *dev, struct device_attribute *attr, char *buf) \ | ||
| 579 | { \ | ||
| 580 | return show_fan_div(dev, buf, offset - 1); \ | ||
| 581 | } \ | ||
| 582 | static ssize_t set_fan_##offset##_min (struct device *dev, struct device_attribute *attr, \ | ||
| 583 | const char *buf, size_t count) \ | ||
| 584 | { \ | ||
| 585 | return set_fan_min(dev, buf, count, offset - 1); \ | ||
| 586 | } \ | ||
| 587 | static ssize_t set_fan_##offset##_div (struct device *dev, struct device_attribute *attr, \ | ||
| 588 | const char *buf, size_t count) \ | ||
| 589 | { \ | ||
| 590 | return set_fan_div(dev, buf, count, offset - 1); \ | ||
| 591 | } \ | ||
| 592 | static DEVICE_ATTR(fan##offset##_input, S_IRUGO, show_fan_##offset, \ | ||
| 593 | NULL); \ | ||
| 594 | static DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \ | ||
| 595 | show_fan_##offset##_min, set_fan_##offset##_min); \ | ||
| 596 | static DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR, \ | ||
| 597 | show_fan_##offset##_div, set_fan_##offset##_div); \ | ||
| 598 | static DEVICE_ATTR(auto_fan##offset##_min_pwm, S_IRUGO | S_IWUSR, \ | ||
| 599 | show_pwm_##offset, set_pwm_##offset) | ||
| 600 | 559 | ||
| 601 | fan_offset(1); | 560 | fan_offset(1); |
| 602 | fan_offset(2); | 561 | fan_offset(2); |
| 603 | 562 | ||
| 604 | 563 | ||
| 605 | /* Temps */ | 564 | /* Temps */ |
| 606 | static ssize_t show_temp(struct device *dev, char *buf, int nr) | 565 | static ssize_t show_temp(struct device *dev, |
| 566 | struct device_attribute *attr, char *buf) | ||
| 607 | { | 567 | { |
| 568 | int nr = to_sensor_dev_attr(attr)->index; | ||
| 608 | struct adm1031_data *data = adm1031_update_device(dev); | 569 | struct adm1031_data *data = adm1031_update_device(dev); |
| 609 | int ext; | 570 | int ext; |
| 610 | ext = nr == 0 ? | 571 | ext = nr == 0 ? |
| @@ -612,26 +573,33 @@ static ssize_t show_temp(struct device *dev, char *buf, int nr) | |||
| 612 | (((data->ext_temp[nr] >> ((nr - 1) * 3)) & 7)); | 573 | (((data->ext_temp[nr] >> ((nr - 1) * 3)) & 7)); |
| 613 | return sprintf(buf, "%d\n", TEMP_FROM_REG_EXT(data->temp[nr], ext)); | 574 | return sprintf(buf, "%d\n", TEMP_FROM_REG_EXT(data->temp[nr], ext)); |
| 614 | } | 575 | } |
| 615 | static ssize_t show_temp_min(struct device *dev, char *buf, int nr) | 576 | static ssize_t show_temp_min(struct device *dev, |
| 577 | struct device_attribute *attr, char *buf) | ||
| 616 | { | 578 | { |
| 579 | int nr = to_sensor_dev_attr(attr)->index; | ||
| 617 | struct adm1031_data *data = adm1031_update_device(dev); | 580 | struct adm1031_data *data = adm1031_update_device(dev); |
| 618 | return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_min[nr])); | 581 | return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_min[nr])); |
| 619 | } | 582 | } |
| 620 | static ssize_t show_temp_max(struct device *dev, char *buf, int nr) | 583 | static ssize_t show_temp_max(struct device *dev, |
| 584 | struct device_attribute *attr, char *buf) | ||
| 621 | { | 585 | { |
| 586 | int nr = to_sensor_dev_attr(attr)->index; | ||
| 622 | struct adm1031_data *data = adm1031_update_device(dev); | 587 | struct adm1031_data *data = adm1031_update_device(dev); |
| 623 | return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_max[nr])); | 588 | return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_max[nr])); |
| 624 | } | 589 | } |
| 625 | static ssize_t show_temp_crit(struct device *dev, char *buf, int nr) | 590 | static ssize_t show_temp_crit(struct device *dev, |
| 591 | struct device_attribute *attr, char *buf) | ||
| 626 | { | 592 | { |
| 593 | int nr = to_sensor_dev_attr(attr)->index; | ||
| 627 | struct adm1031_data *data = adm1031_update_device(dev); | 594 | struct adm1031_data *data = adm1031_update_device(dev); |
| 628 | return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_crit[nr])); | 595 | return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_crit[nr])); |
| 629 | } | 596 | } |
| 630 | static ssize_t | 597 | static ssize_t set_temp_min(struct device *dev, struct device_attribute *attr, |
| 631 | set_temp_min(struct device *dev, const char *buf, size_t count, int nr) | 598 | const char *buf, size_t count) |
| 632 | { | 599 | { |
| 633 | struct i2c_client *client = to_i2c_client(dev); | 600 | struct i2c_client *client = to_i2c_client(dev); |
| 634 | struct adm1031_data *data = i2c_get_clientdata(client); | 601 | struct adm1031_data *data = i2c_get_clientdata(client); |
| 602 | int nr = to_sensor_dev_attr(attr)->index; | ||
| 635 | int val; | 603 | int val; |
| 636 | 604 | ||
| 637 | val = simple_strtol(buf, NULL, 10); | 605 | val = simple_strtol(buf, NULL, 10); |
| @@ -643,11 +611,12 @@ set_temp_min(struct device *dev, const char *buf, size_t count, int nr) | |||
| 643 | mutex_unlock(&data->update_lock); | 611 | mutex_unlock(&data->update_lock); |
| 644 | return count; | 612 | return count; |
| 645 | } | 613 | } |
| 646 | static ssize_t | 614 | static ssize_t set_temp_max(struct device *dev, struct device_attribute *attr, |
| 647 | set_temp_max(struct device *dev, const char *buf, size_t count, int nr) | 615 | const char *buf, size_t count) |
| 648 | { | 616 | { |
| 649 | struct i2c_client *client = to_i2c_client(dev); | 617 | struct i2c_client *client = to_i2c_client(dev); |
| 650 | struct adm1031_data *data = i2c_get_clientdata(client); | 618 | struct adm1031_data *data = i2c_get_clientdata(client); |
| 619 | int nr = to_sensor_dev_attr(attr)->index; | ||
| 651 | int val; | 620 | int val; |
| 652 | 621 | ||
| 653 | val = simple_strtol(buf, NULL, 10); | 622 | val = simple_strtol(buf, NULL, 10); |
| @@ -659,11 +628,12 @@ set_temp_max(struct device *dev, const char *buf, size_t count, int nr) | |||
| 659 | mutex_unlock(&data->update_lock); | 628 | mutex_unlock(&data->update_lock); |
| 660 | return count; | 629 | return count; |
| 661 | } | 630 | } |
| 662 | static ssize_t | 631 | static ssize_t set_temp_crit(struct device *dev, struct device_attribute *attr, |
| 663 | set_temp_crit(struct device *dev, const char *buf, size_t count, int nr) | 632 | const char *buf, size_t count) |
| 664 | { | 633 | { |
| 665 | struct i2c_client *client = to_i2c_client(dev); | 634 | struct i2c_client *client = to_i2c_client(dev); |
| 666 | struct adm1031_data *data = i2c_get_clientdata(client); | 635 | struct adm1031_data *data = i2c_get_clientdata(client); |
| 636 | int nr = to_sensor_dev_attr(attr)->index; | ||
| 667 | int val; | 637 | int val; |
| 668 | 638 | ||
| 669 | val = simple_strtol(buf, NULL, 10); | 639 | val = simple_strtol(buf, NULL, 10); |
| @@ -676,46 +646,15 @@ set_temp_crit(struct device *dev, const char *buf, size_t count, int nr) | |||
| 676 | return count; | 646 | return count; |
| 677 | } | 647 | } |
| 678 | 648 | ||
| 679 | #define temp_reg(offset) \ | 649 | #define temp_reg(offset) \ |
| 680 | static ssize_t show_temp_##offset (struct device *dev, struct device_attribute *attr, char *buf) \ | 650 | static SENSOR_DEVICE_ATTR(temp##offset##_input, S_IRUGO, \ |
| 681 | { \ | 651 | show_temp, NULL, offset - 1); \ |
| 682 | return show_temp(dev, buf, offset - 1); \ | 652 | static SENSOR_DEVICE_ATTR(temp##offset##_min, S_IRUGO | S_IWUSR, \ |
| 683 | } \ | 653 | show_temp_min, set_temp_min, offset - 1); \ |
| 684 | static ssize_t show_temp_##offset##_min (struct device *dev, struct device_attribute *attr, char *buf) \ | 654 | static SENSOR_DEVICE_ATTR(temp##offset##_max, S_IRUGO | S_IWUSR, \ |
| 685 | { \ | 655 | show_temp_max, set_temp_max, offset - 1); \ |
| 686 | return show_temp_min(dev, buf, offset - 1); \ | 656 | static SENSOR_DEVICE_ATTR(temp##offset##_crit, S_IRUGO | S_IWUSR, \ |
| 687 | } \ | 657 | show_temp_crit, set_temp_crit, offset - 1) |
| 688 | static ssize_t show_temp_##offset##_max (struct device *dev, struct device_attribute *attr, char *buf) \ | ||
| 689 | { \ | ||
| 690 | return show_temp_max(dev, buf, offset - 1); \ | ||
| 691 | } \ | ||
| 692 | static ssize_t show_temp_##offset##_crit (struct device *dev, struct device_attribute *attr, char *buf) \ | ||
| 693 | { \ | ||
| 694 | return show_temp_crit(dev, buf, offset - 1); \ | ||
| 695 | } \ | ||
| 696 | static ssize_t set_temp_##offset##_min (struct device *dev, struct device_attribute *attr, \ | ||
| 697 | const char *buf, size_t count) \ | ||
| 698 | { \ | ||
| 699 | return set_temp_min(dev, buf, count, offset - 1); \ | ||
| 700 | } \ | ||
| 701 | static ssize_t set_temp_##offset##_max (struct device *dev, struct device_attribute *attr, \ | ||
| 702 | const char *buf, size_t count) \ | ||
| 703 | { \ | ||
| 704 | return set_temp_max(dev, buf, count, offset - 1); \ | ||
| 705 | } \ | ||
| 706 | static ssize_t set_temp_##offset##_crit (struct device *dev, struct device_attribute *attr, \ | ||
| 707 | const char *buf, size_t count) \ | ||
| 708 | { \ | ||
| 709 | return set_temp_crit(dev, buf, count, offset - 1); \ | ||
| 710 | } \ | ||
| 711 | static DEVICE_ATTR(temp##offset##_input, S_IRUGO, show_temp_##offset, \ | ||
| 712 | NULL); \ | ||
| 713 | static DEVICE_ATTR(temp##offset##_min, S_IRUGO | S_IWUSR, \ | ||
| 714 | show_temp_##offset##_min, set_temp_##offset##_min); \ | ||
| 715 | static DEVICE_ATTR(temp##offset##_max, S_IRUGO | S_IWUSR, \ | ||
| 716 | show_temp_##offset##_max, set_temp_##offset##_max); \ | ||
| 717 | static DEVICE_ATTR(temp##offset##_crit, S_IRUGO | S_IWUSR, \ | ||
| 718 | show_temp_##offset##_crit, set_temp_##offset##_crit) | ||
| 719 | 658 | ||
| 720 | temp_reg(1); | 659 | temp_reg(1); |
| 721 | temp_reg(2); | 660 | temp_reg(2); |
| @@ -739,29 +678,29 @@ static int adm1031_attach_adapter(struct i2c_adapter *adapter) | |||
| 739 | } | 678 | } |
| 740 | 679 | ||
| 741 | static struct attribute *adm1031_attributes[] = { | 680 | static struct attribute *adm1031_attributes[] = { |
| 742 | &dev_attr_fan1_input.attr, | 681 | &sensor_dev_attr_fan1_input.dev_attr.attr, |
| 743 | &dev_attr_fan1_div.attr, | 682 | &sensor_dev_attr_fan1_div.dev_attr.attr, |
| 744 | &dev_attr_fan1_min.attr, | 683 | &sensor_dev_attr_fan1_min.dev_attr.attr, |
| 745 | &dev_attr_pwm1.attr, | 684 | &sensor_dev_attr_pwm1.dev_attr.attr, |
| 746 | &dev_attr_auto_fan1_channel.attr, | 685 | &sensor_dev_attr_auto_fan1_channel.dev_attr.attr, |
| 747 | &dev_attr_temp1_input.attr, | 686 | &sensor_dev_attr_temp1_input.dev_attr.attr, |
| 748 | &dev_attr_temp1_min.attr, | 687 | &sensor_dev_attr_temp1_min.dev_attr.attr, |
| 749 | &dev_attr_temp1_max.attr, | 688 | &sensor_dev_attr_temp1_max.dev_attr.attr, |
| 750 | &dev_attr_temp1_crit.attr, | 689 | &sensor_dev_attr_temp1_crit.dev_attr.attr, |
| 751 | &dev_attr_temp2_input.attr, | 690 | &sensor_dev_attr_temp2_input.dev_attr.attr, |
| 752 | &dev_attr_temp2_min.attr, | 691 | &sensor_dev_attr_temp2_min.dev_attr.attr, |
| 753 | &dev_attr_temp2_max.attr, | 692 | &sensor_dev_attr_temp2_max.dev_attr.attr, |
| 754 | &dev_attr_temp2_crit.attr, | 693 | &sensor_dev_attr_temp2_crit.dev_attr.attr, |
| 755 | 694 | ||
| 756 | &dev_attr_auto_temp1_off.attr, | 695 | &sensor_dev_attr_auto_temp1_off.dev_attr.attr, |
| 757 | &dev_attr_auto_temp1_min.attr, | 696 | &sensor_dev_attr_auto_temp1_min.dev_attr.attr, |
| 758 | &dev_attr_auto_temp1_max.attr, | 697 | &sensor_dev_attr_auto_temp1_max.dev_attr.attr, |
| 759 | 698 | ||
| 760 | &dev_attr_auto_temp2_off.attr, | 699 | &sensor_dev_attr_auto_temp2_off.dev_attr.attr, |
| 761 | &dev_attr_auto_temp2_min.attr, | 700 | &sensor_dev_attr_auto_temp2_min.dev_attr.attr, |
| 762 | &dev_attr_auto_temp2_max.attr, | 701 | &sensor_dev_attr_auto_temp2_max.dev_attr.attr, |
| 763 | 702 | ||
| 764 | &dev_attr_auto_fan1_min_pwm.attr, | 703 | &sensor_dev_attr_auto_fan1_min_pwm.dev_attr.attr, |
| 765 | 704 | ||
| 766 | &dev_attr_alarms.attr, | 705 | &dev_attr_alarms.attr, |
| 767 | 706 | ||
| @@ -773,19 +712,19 @@ static const struct attribute_group adm1031_group = { | |||
| 773 | }; | 712 | }; |
| 774 | 713 | ||
| 775 | static struct attribute *adm1031_attributes_opt[] = { | 714 | static struct attribute *adm1031_attributes_opt[] = { |
| 776 | &dev_attr_fan2_input.attr, | 715 | &sensor_dev_attr_fan2_input.dev_attr.attr, |
| 777 | &dev_attr_fan2_div.attr, | 716 | &sensor_dev_attr_fan2_div.dev_attr.attr, |
| 778 | &dev_attr_fan2_min.attr, | 717 | &sensor_dev_attr_fan2_min.dev_attr.attr, |
| 779 | &dev_attr_pwm2.attr, | 718 | &sensor_dev_attr_pwm2.dev_attr.attr, |
| 780 | &dev_attr_auto_fan2_channel.attr, | 719 | &sensor_dev_attr_auto_fan2_channel.dev_attr.attr, |
| 781 | &dev_attr_temp3_input.attr, | 720 | &sensor_dev_attr_temp3_input.dev_attr.attr, |
| 782 | &dev_attr_temp3_min.attr, | 721 | &sensor_dev_attr_temp3_min.dev_attr.attr, |
| 783 | &dev_attr_temp3_max.attr, | 722 | &sensor_dev_attr_temp3_max.dev_attr.attr, |
| 784 | &dev_attr_temp3_crit.attr, | 723 | &sensor_dev_attr_temp3_crit.dev_attr.attr, |
| 785 | &dev_attr_auto_temp3_off.attr, | 724 | &sensor_dev_attr_auto_temp3_off.dev_attr.attr, |
| 786 | &dev_attr_auto_temp3_min.attr, | 725 | &sensor_dev_attr_auto_temp3_min.dev_attr.attr, |
| 787 | &dev_attr_auto_temp3_max.attr, | 726 | &sensor_dev_attr_auto_temp3_max.dev_attr.attr, |
| 788 | &dev_attr_auto_fan2_min_pwm.attr, | 727 | &sensor_dev_attr_auto_fan2_min_pwm.dev_attr.attr, |
| 789 | NULL | 728 | NULL |
| 790 | }; | 729 | }; |
| 791 | 730 | ||
