diff options
| -rw-r--r-- | drivers/hwmon/adt7470.c | 75 |
1 files changed, 62 insertions, 13 deletions
diff --git a/drivers/hwmon/adt7470.c b/drivers/hwmon/adt7470.c index d368d8f845e1..1311a595147e 100644 --- a/drivers/hwmon/adt7470.c +++ b/drivers/hwmon/adt7470.c | |||
| @@ -137,6 +137,8 @@ I2C_CLIENT_INSMOD_1(adt7470); | |||
| 137 | #define FAN_PERIOD_INVALID 65535 | 137 | #define FAN_PERIOD_INVALID 65535 |
| 138 | #define FAN_DATA_VALID(x) ((x) && (x) != FAN_PERIOD_INVALID) | 138 | #define FAN_DATA_VALID(x) ((x) && (x) != FAN_PERIOD_INVALID) |
| 139 | 139 | ||
| 140 | #define ROUND_DIV(x, divisor) (((x) + ((divisor) / 2)) / (divisor)) | ||
| 141 | |||
| 140 | struct adt7470_data { | 142 | struct adt7470_data { |
| 141 | struct device *hwmon_dev; | 143 | struct device *hwmon_dev; |
| 142 | struct attribute_group attrs; | 144 | struct attribute_group attrs; |
| @@ -353,7 +355,13 @@ static ssize_t set_temp_min(struct device *dev, | |||
| 353 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 355 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
| 354 | struct i2c_client *client = to_i2c_client(dev); | 356 | struct i2c_client *client = to_i2c_client(dev); |
| 355 | struct adt7470_data *data = i2c_get_clientdata(client); | 357 | struct adt7470_data *data = i2c_get_clientdata(client); |
| 356 | int temp = simple_strtol(buf, NULL, 10) / 1000; | 358 | long temp; |
| 359 | |||
| 360 | if (strict_strtol(buf, 10, &temp)) | ||
| 361 | return -EINVAL; | ||
| 362 | |||
| 363 | temp = ROUND_DIV(temp, 1000); | ||
| 364 | temp = SENSORS_LIMIT(temp, 0, 255); | ||
| 357 | 365 | ||
| 358 | mutex_lock(&data->lock); | 366 | mutex_lock(&data->lock); |
| 359 | data->temp_min[attr->index] = temp; | 367 | data->temp_min[attr->index] = temp; |
| @@ -381,7 +389,13 @@ static ssize_t set_temp_max(struct device *dev, | |||
| 381 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 389 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
| 382 | struct i2c_client *client = to_i2c_client(dev); | 390 | struct i2c_client *client = to_i2c_client(dev); |
| 383 | struct adt7470_data *data = i2c_get_clientdata(client); | 391 | struct adt7470_data *data = i2c_get_clientdata(client); |
| 384 | int temp = simple_strtol(buf, NULL, 10) / 1000; | 392 | long temp; |
| 393 | |||
| 394 | if (strict_strtol(buf, 10, &temp)) | ||
| 395 | return -EINVAL; | ||
| 396 | |||
| 397 | temp = ROUND_DIV(temp, 1000); | ||
| 398 | temp = SENSORS_LIMIT(temp, 0, 255); | ||
| 385 | 399 | ||
| 386 | mutex_lock(&data->lock); | 400 | mutex_lock(&data->lock); |
| 387 | data->temp_max[attr->index] = temp; | 401 | data->temp_max[attr->index] = temp; |
| @@ -430,11 +444,13 @@ static ssize_t set_fan_max(struct device *dev, | |||
| 430 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 444 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
| 431 | struct i2c_client *client = to_i2c_client(dev); | 445 | struct i2c_client *client = to_i2c_client(dev); |
| 432 | struct adt7470_data *data = i2c_get_clientdata(client); | 446 | struct adt7470_data *data = i2c_get_clientdata(client); |
| 433 | int temp = simple_strtol(buf, NULL, 10); | 447 | long temp; |
| 434 | 448 | ||
| 435 | if (!temp) | 449 | if (strict_strtol(buf, 10, &temp) || !temp) |
| 436 | return -EINVAL; | 450 | return -EINVAL; |
| 451 | |||
| 437 | temp = FAN_RPM_TO_PERIOD(temp); | 452 | temp = FAN_RPM_TO_PERIOD(temp); |
| 453 | temp = SENSORS_LIMIT(temp, 1, 65534); | ||
| 438 | 454 | ||
| 439 | mutex_lock(&data->lock); | 455 | mutex_lock(&data->lock); |
| 440 | data->fan_max[attr->index] = temp; | 456 | data->fan_max[attr->index] = temp; |
| @@ -465,11 +481,13 @@ static ssize_t set_fan_min(struct device *dev, | |||
| 465 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 481 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
| 466 | struct i2c_client *client = to_i2c_client(dev); | 482 | struct i2c_client *client = to_i2c_client(dev); |
| 467 | struct adt7470_data *data = i2c_get_clientdata(client); | 483 | struct adt7470_data *data = i2c_get_clientdata(client); |
| 468 | int temp = simple_strtol(buf, NULL, 10); | 484 | long temp; |
| 469 | 485 | ||
| 470 | if (!temp) | 486 | if (strict_strtol(buf, 10, &temp) || !temp) |
| 471 | return -EINVAL; | 487 | return -EINVAL; |
| 488 | |||
| 472 | temp = FAN_RPM_TO_PERIOD(temp); | 489 | temp = FAN_RPM_TO_PERIOD(temp); |
| 490 | temp = SENSORS_LIMIT(temp, 1, 65534); | ||
| 473 | 491 | ||
| 474 | mutex_lock(&data->lock); | 492 | mutex_lock(&data->lock); |
| 475 | data->fan_min[attr->index] = temp; | 493 | data->fan_min[attr->index] = temp; |
| @@ -507,9 +525,12 @@ static ssize_t set_force_pwm_max(struct device *dev, | |||
| 507 | { | 525 | { |
| 508 | struct i2c_client *client = to_i2c_client(dev); | 526 | struct i2c_client *client = to_i2c_client(dev); |
| 509 | struct adt7470_data *data = i2c_get_clientdata(client); | 527 | struct adt7470_data *data = i2c_get_clientdata(client); |
| 510 | int temp = simple_strtol(buf, NULL, 10); | 528 | long temp; |
| 511 | u8 reg; | 529 | u8 reg; |
| 512 | 530 | ||
| 531 | if (strict_strtol(buf, 10, &temp)) | ||
| 532 | return -EINVAL; | ||
| 533 | |||
| 513 | mutex_lock(&data->lock); | 534 | mutex_lock(&data->lock); |
| 514 | data->force_pwm_max = temp; | 535 | data->force_pwm_max = temp; |
| 515 | reg = i2c_smbus_read_byte_data(client, ADT7470_REG_CFG); | 536 | reg = i2c_smbus_read_byte_data(client, ADT7470_REG_CFG); |
| @@ -537,7 +558,12 @@ static ssize_t set_pwm(struct device *dev, struct device_attribute *devattr, | |||
| 537 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 558 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
| 538 | struct i2c_client *client = to_i2c_client(dev); | 559 | struct i2c_client *client = to_i2c_client(dev); |
| 539 | struct adt7470_data *data = i2c_get_clientdata(client); | 560 | struct adt7470_data *data = i2c_get_clientdata(client); |
| 540 | int temp = simple_strtol(buf, NULL, 10); | 561 | long temp; |
| 562 | |||
| 563 | if (strict_strtol(buf, 10, &temp)) | ||
| 564 | return -EINVAL; | ||
| 565 | |||
| 566 | temp = SENSORS_LIMIT(temp, 0, 255); | ||
| 541 | 567 | ||
| 542 | mutex_lock(&data->lock); | 568 | mutex_lock(&data->lock); |
| 543 | data->pwm[attr->index] = temp; | 569 | data->pwm[attr->index] = temp; |
| @@ -564,7 +590,12 @@ static ssize_t set_pwm_max(struct device *dev, | |||
| 564 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 590 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
| 565 | struct i2c_client *client = to_i2c_client(dev); | 591 | struct i2c_client *client = to_i2c_client(dev); |
| 566 | struct adt7470_data *data = i2c_get_clientdata(client); | 592 | struct adt7470_data *data = i2c_get_clientdata(client); |
| 567 | int temp = simple_strtol(buf, NULL, 10); | 593 | long temp; |
| 594 | |||
| 595 | if (strict_strtol(buf, 10, &temp)) | ||
| 596 | return -EINVAL; | ||
| 597 | |||
| 598 | temp = SENSORS_LIMIT(temp, 0, 255); | ||
| 568 | 599 | ||
| 569 | mutex_lock(&data->lock); | 600 | mutex_lock(&data->lock); |
| 570 | data->pwm_max[attr->index] = temp; | 601 | data->pwm_max[attr->index] = temp; |
| @@ -592,7 +623,12 @@ static ssize_t set_pwm_min(struct device *dev, | |||
| 592 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 623 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
| 593 | struct i2c_client *client = to_i2c_client(dev); | 624 | struct i2c_client *client = to_i2c_client(dev); |
| 594 | struct adt7470_data *data = i2c_get_clientdata(client); | 625 | struct adt7470_data *data = i2c_get_clientdata(client); |
| 595 | int temp = simple_strtol(buf, NULL, 10); | 626 | long temp; |
| 627 | |||
| 628 | if (strict_strtol(buf, 10, &temp)) | ||
| 629 | return -EINVAL; | ||
| 630 | |||
| 631 | temp = SENSORS_LIMIT(temp, 0, 255); | ||
| 596 | 632 | ||
| 597 | mutex_lock(&data->lock); | 633 | mutex_lock(&data->lock); |
| 598 | data->pwm_min[attr->index] = temp; | 634 | data->pwm_min[attr->index] = temp; |
| @@ -630,7 +666,13 @@ static ssize_t set_pwm_tmin(struct device *dev, | |||
| 630 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 666 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
| 631 | struct i2c_client *client = to_i2c_client(dev); | 667 | struct i2c_client *client = to_i2c_client(dev); |
| 632 | struct adt7470_data *data = i2c_get_clientdata(client); | 668 | struct adt7470_data *data = i2c_get_clientdata(client); |
| 633 | int temp = simple_strtol(buf, NULL, 10) / 1000; | 669 | long temp; |
| 670 | |||
| 671 | if (strict_strtol(buf, 10, &temp)) | ||
| 672 | return -EINVAL; | ||
| 673 | |||
| 674 | temp = ROUND_DIV(temp, 1000); | ||
| 675 | temp = SENSORS_LIMIT(temp, 0, 255); | ||
| 634 | 676 | ||
| 635 | mutex_lock(&data->lock); | 677 | mutex_lock(&data->lock); |
| 636 | data->pwm_tmin[attr->index] = temp; | 678 | data->pwm_tmin[attr->index] = temp; |
| @@ -658,11 +700,14 @@ static ssize_t set_pwm_auto(struct device *dev, | |||
| 658 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 700 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
| 659 | struct i2c_client *client = to_i2c_client(dev); | 701 | struct i2c_client *client = to_i2c_client(dev); |
| 660 | struct adt7470_data *data = i2c_get_clientdata(client); | 702 | struct adt7470_data *data = i2c_get_clientdata(client); |
| 661 | int temp = simple_strtol(buf, NULL, 10); | ||
| 662 | int pwm_auto_reg = ADT7470_REG_PWM_CFG(attr->index); | 703 | int pwm_auto_reg = ADT7470_REG_PWM_CFG(attr->index); |
| 663 | int pwm_auto_reg_mask; | 704 | int pwm_auto_reg_mask; |
| 705 | long temp; | ||
| 664 | u8 reg; | 706 | u8 reg; |
| 665 | 707 | ||
| 708 | if (strict_strtol(buf, 10, &temp)) | ||
| 709 | return -EINVAL; | ||
| 710 | |||
| 666 | if (attr->index % 2) | 711 | if (attr->index % 2) |
| 667 | pwm_auto_reg_mask = ADT7470_PWM2_AUTO_MASK; | 712 | pwm_auto_reg_mask = ADT7470_PWM2_AUTO_MASK; |
| 668 | else | 713 | else |
| @@ -716,10 +761,14 @@ static ssize_t set_pwm_auto_temp(struct device *dev, | |||
| 716 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 761 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
| 717 | struct i2c_client *client = to_i2c_client(dev); | 762 | struct i2c_client *client = to_i2c_client(dev); |
| 718 | struct adt7470_data *data = i2c_get_clientdata(client); | 763 | struct adt7470_data *data = i2c_get_clientdata(client); |
| 719 | int temp = cvt_auto_temp(simple_strtol(buf, NULL, 10)); | ||
| 720 | int pwm_auto_reg = ADT7470_REG_PWM_AUTO_TEMP(attr->index); | 764 | int pwm_auto_reg = ADT7470_REG_PWM_AUTO_TEMP(attr->index); |
| 765 | long temp; | ||
| 721 | u8 reg; | 766 | u8 reg; |
| 722 | 767 | ||
| 768 | if (strict_strtol(buf, 10, &temp)) | ||
| 769 | return -EINVAL; | ||
| 770 | |||
| 771 | temp = cvt_auto_temp(temp); | ||
| 723 | if (temp < 0) | 772 | if (temp < 0) |
| 724 | return temp; | 773 | return temp; |
| 725 | 774 | ||
