diff options
-rw-r--r-- | drivers/hwmon/it87.c | 201 |
1 files changed, 187 insertions, 14 deletions
diff --git a/drivers/hwmon/it87.c b/drivers/hwmon/it87.c index 5adb269918fb..e3fbcf49afdb 100644 --- a/drivers/hwmon/it87.c +++ b/drivers/hwmon/it87.c | |||
@@ -252,8 +252,10 @@ static const u8 IT87_REG_VIN[] = { 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, | |||
252 | 252 | ||
253 | #define IT87_REG_CHIPID 0x58 | 253 | #define IT87_REG_CHIPID 0x58 |
254 | 254 | ||
255 | #define IT87_REG_AUTO_TEMP(nr, i) (0x60 + (nr) * 8 + (i)) | 255 | static const u8 IT87_REG_AUTO_BASE[] = { 0x60, 0x68, 0x70, 0x78, 0xa0, 0xa8 }; |
256 | #define IT87_REG_AUTO_PWM(nr, i) (0x65 + (nr) * 8 + (i)) | 256 | |
257 | #define IT87_REG_AUTO_TEMP(nr, i) (IT87_REG_AUTO_BASE[nr] + (i)) | ||
258 | #define IT87_REG_AUTO_PWM(nr, i) (IT87_REG_AUTO_BASE[nr] + 5 + (i)) | ||
257 | 259 | ||
258 | #define IT87_REG_TEMP456_ENABLE 0x77 | 260 | #define IT87_REG_TEMP456_ENABLE 0x77 |
259 | 261 | ||
@@ -673,6 +675,30 @@ static void it87_update_pwm_ctrl(struct it87_data *data, int nr) | |||
673 | for (i = 0; i < 3 ; i++) | 675 | for (i = 0; i < 3 ; i++) |
674 | data->auto_pwm[nr][i] = it87_read_value(data, | 676 | data->auto_pwm[nr][i] = it87_read_value(data, |
675 | IT87_REG_AUTO_PWM(nr, i)); | 677 | IT87_REG_AUTO_PWM(nr, i)); |
678 | } else if (has_newer_autopwm(data)) { | ||
679 | int i; | ||
680 | |||
681 | /* | ||
682 | * 0: temperature hysteresis (base + 5) | ||
683 | * 1: fan off temperature (base + 0) | ||
684 | * 2: fan start temperature (base + 1) | ||
685 | * 3: fan max temperature (base + 2) | ||
686 | */ | ||
687 | data->auto_temp[nr][0] = | ||
688 | it87_read_value(data, IT87_REG_AUTO_TEMP(nr, 5)); | ||
689 | |||
690 | for (i = 0; i < 3 ; i++) | ||
691 | data->auto_temp[nr][i + 1] = | ||
692 | it87_read_value(data, | ||
693 | IT87_REG_AUTO_TEMP(nr, i)); | ||
694 | /* | ||
695 | * 0: start pwm value (base + 3) | ||
696 | * 1: pwm slope (base + 4, 1/8th pwm) | ||
697 | */ | ||
698 | data->auto_pwm[nr][0] = | ||
699 | it87_read_value(data, IT87_REG_AUTO_TEMP(nr, 3)); | ||
700 | data->auto_pwm[nr][1] = | ||
701 | it87_read_value(data, IT87_REG_AUTO_TEMP(nr, 4)); | ||
676 | } | 702 | } |
677 | } | 703 | } |
678 | 704 | ||
@@ -1216,6 +1242,11 @@ static int check_trip_points(struct device *dev, int nr) | |||
1216 | if (data->auto_pwm[nr][i] > data->auto_pwm[nr][i + 1]) | 1242 | if (data->auto_pwm[nr][i] > data->auto_pwm[nr][i + 1]) |
1217 | err = -EINVAL; | 1243 | err = -EINVAL; |
1218 | } | 1244 | } |
1245 | } else if (has_newer_autopwm(data)) { | ||
1246 | for (i = 1; i < 3; i++) { | ||
1247 | if (data->auto_temp[nr][i] > data->auto_temp[nr][i + 1]) | ||
1248 | err = -EINVAL; | ||
1249 | } | ||
1219 | } | 1250 | } |
1220 | 1251 | ||
1221 | if (err) { | 1252 | if (err) { |
@@ -1441,6 +1472,7 @@ static ssize_t set_auto_pwm(struct device *dev, struct device_attribute *attr, | |||
1441 | to_sensor_dev_attr_2(attr); | 1472 | to_sensor_dev_attr_2(attr); |
1442 | int nr = sensor_attr->nr; | 1473 | int nr = sensor_attr->nr; |
1443 | int point = sensor_attr->index; | 1474 | int point = sensor_attr->index; |
1475 | int regaddr; | ||
1444 | long val; | 1476 | long val; |
1445 | 1477 | ||
1446 | if (kstrtol(buf, 10, &val) < 0 || val < 0 || val > 255) | 1478 | if (kstrtol(buf, 10, &val) < 0 || val < 0 || val > 255) |
@@ -1448,8 +1480,41 @@ static ssize_t set_auto_pwm(struct device *dev, struct device_attribute *attr, | |||
1448 | 1480 | ||
1449 | mutex_lock(&data->update_lock); | 1481 | mutex_lock(&data->update_lock); |
1450 | data->auto_pwm[nr][point] = pwm_to_reg(data, val); | 1482 | data->auto_pwm[nr][point] = pwm_to_reg(data, val); |
1451 | it87_write_value(data, IT87_REG_AUTO_PWM(nr, point), | 1483 | if (has_newer_autopwm(data)) |
1452 | data->auto_pwm[nr][point]); | 1484 | regaddr = IT87_REG_AUTO_TEMP(nr, 3); |
1485 | else | ||
1486 | regaddr = IT87_REG_AUTO_PWM(nr, point); | ||
1487 | it87_write_value(data, regaddr, data->auto_pwm[nr][point]); | ||
1488 | mutex_unlock(&data->update_lock); | ||
1489 | return count; | ||
1490 | } | ||
1491 | |||
1492 | static ssize_t show_auto_pwm_slope(struct device *dev, | ||
1493 | struct device_attribute *attr, char *buf) | ||
1494 | { | ||
1495 | struct it87_data *data = it87_update_device(dev); | ||
1496 | struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); | ||
1497 | int nr = sensor_attr->index; | ||
1498 | |||
1499 | return sprintf(buf, "%d\n", data->auto_pwm[nr][1] & 0x7f); | ||
1500 | } | ||
1501 | |||
1502 | static ssize_t set_auto_pwm_slope(struct device *dev, | ||
1503 | struct device_attribute *attr, | ||
1504 | const char *buf, size_t count) | ||
1505 | { | ||
1506 | struct it87_data *data = dev_get_drvdata(dev); | ||
1507 | struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); | ||
1508 | int nr = sensor_attr->index; | ||
1509 | unsigned long val; | ||
1510 | |||
1511 | if (kstrtoul(buf, 10, &val) < 0 || val > 127) | ||
1512 | return -EINVAL; | ||
1513 | |||
1514 | mutex_lock(&data->update_lock); | ||
1515 | data->auto_pwm[nr][1] = (data->auto_pwm[nr][1] & 0x80) | val; | ||
1516 | it87_write_value(data, IT87_REG_AUTO_TEMP(nr, 4), | ||
1517 | data->auto_pwm[nr][1]); | ||
1453 | mutex_unlock(&data->update_lock); | 1518 | mutex_unlock(&data->update_lock); |
1454 | return count; | 1519 | return count; |
1455 | } | 1520 | } |
@@ -1462,8 +1527,14 @@ static ssize_t show_auto_temp(struct device *dev, struct device_attribute *attr, | |||
1462 | to_sensor_dev_attr_2(attr); | 1527 | to_sensor_dev_attr_2(attr); |
1463 | int nr = sensor_attr->nr; | 1528 | int nr = sensor_attr->nr; |
1464 | int point = sensor_attr->index; | 1529 | int point = sensor_attr->index; |
1530 | int reg; | ||
1531 | |||
1532 | if (has_old_autopwm(data) || point) | ||
1533 | reg = data->auto_temp[nr][point]; | ||
1534 | else | ||
1535 | reg = data->auto_temp[nr][1] - (data->auto_temp[nr][0] & 0x1f); | ||
1465 | 1536 | ||
1466 | return sprintf(buf, "%d\n", TEMP_FROM_REG(data->auto_temp[nr][point])); | 1537 | return sprintf(buf, "%d\n", TEMP_FROM_REG(reg)); |
1467 | } | 1538 | } |
1468 | 1539 | ||
1469 | static ssize_t set_auto_temp(struct device *dev, struct device_attribute *attr, | 1540 | static ssize_t set_auto_temp(struct device *dev, struct device_attribute *attr, |
@@ -1475,14 +1546,24 @@ static ssize_t set_auto_temp(struct device *dev, struct device_attribute *attr, | |||
1475 | int nr = sensor_attr->nr; | 1546 | int nr = sensor_attr->nr; |
1476 | int point = sensor_attr->index; | 1547 | int point = sensor_attr->index; |
1477 | long val; | 1548 | long val; |
1549 | int reg; | ||
1478 | 1550 | ||
1479 | if (kstrtol(buf, 10, &val) < 0 || val < -128000 || val > 127000) | 1551 | if (kstrtol(buf, 10, &val) < 0 || val < -128000 || val > 127000) |
1480 | return -EINVAL; | 1552 | return -EINVAL; |
1481 | 1553 | ||
1482 | mutex_lock(&data->update_lock); | 1554 | mutex_lock(&data->update_lock); |
1483 | data->auto_temp[nr][point] = TEMP_TO_REG(val); | 1555 | if (has_newer_autopwm(data) && !point) { |
1484 | it87_write_value(data, IT87_REG_AUTO_TEMP(nr, point), | 1556 | reg = data->auto_temp[nr][1] - TEMP_TO_REG(val); |
1485 | data->auto_temp[nr][point]); | 1557 | reg = clamp_val(reg, 0, 0x1f) | (data->auto_temp[nr][0] & 0xe0); |
1558 | data->auto_temp[nr][0] = reg; | ||
1559 | it87_write_value(data, IT87_REG_AUTO_TEMP(nr, 5), reg); | ||
1560 | } else { | ||
1561 | reg = TEMP_TO_REG(val); | ||
1562 | data->auto_temp[nr][point] = reg; | ||
1563 | if (has_newer_autopwm(data)) | ||
1564 | point--; | ||
1565 | it87_write_value(data, IT87_REG_AUTO_TEMP(nr, point), reg); | ||
1566 | } | ||
1486 | mutex_unlock(&data->update_lock); | 1567 | mutex_unlock(&data->update_lock); |
1487 | return count; | 1568 | return count; |
1488 | } | 1569 | } |
@@ -1542,6 +1623,10 @@ static SENSOR_DEVICE_ATTR_2(pwm1_auto_point3_temp, S_IRUGO | S_IWUSR, | |||
1542 | show_auto_temp, set_auto_temp, 0, 3); | 1623 | show_auto_temp, set_auto_temp, 0, 3); |
1543 | static SENSOR_DEVICE_ATTR_2(pwm1_auto_point4_temp, S_IRUGO | S_IWUSR, | 1624 | static SENSOR_DEVICE_ATTR_2(pwm1_auto_point4_temp, S_IRUGO | S_IWUSR, |
1544 | show_auto_temp, set_auto_temp, 0, 4); | 1625 | show_auto_temp, set_auto_temp, 0, 4); |
1626 | static SENSOR_DEVICE_ATTR_2(pwm1_auto_start, S_IRUGO | S_IWUSR, | ||
1627 | show_auto_pwm, set_auto_pwm, 0, 0); | ||
1628 | static SENSOR_DEVICE_ATTR(pwm1_auto_slope, S_IRUGO | S_IWUSR, | ||
1629 | show_auto_pwm_slope, set_auto_pwm_slope, 0); | ||
1545 | 1630 | ||
1546 | static SENSOR_DEVICE_ATTR(pwm2_enable, S_IRUGO | S_IWUSR, | 1631 | static SENSOR_DEVICE_ATTR(pwm2_enable, S_IRUGO | S_IWUSR, |
1547 | show_pwm_enable, set_pwm_enable, 1); | 1632 | show_pwm_enable, set_pwm_enable, 1); |
@@ -1567,6 +1652,10 @@ static SENSOR_DEVICE_ATTR_2(pwm2_auto_point3_temp, S_IRUGO | S_IWUSR, | |||
1567 | show_auto_temp, set_auto_temp, 1, 3); | 1652 | show_auto_temp, set_auto_temp, 1, 3); |
1568 | static SENSOR_DEVICE_ATTR_2(pwm2_auto_point4_temp, S_IRUGO | S_IWUSR, | 1653 | static SENSOR_DEVICE_ATTR_2(pwm2_auto_point4_temp, S_IRUGO | S_IWUSR, |
1569 | show_auto_temp, set_auto_temp, 1, 4); | 1654 | show_auto_temp, set_auto_temp, 1, 4); |
1655 | static SENSOR_DEVICE_ATTR_2(pwm2_auto_start, S_IRUGO | S_IWUSR, | ||
1656 | show_auto_pwm, set_auto_pwm, 1, 0); | ||
1657 | static SENSOR_DEVICE_ATTR(pwm2_auto_slope, S_IRUGO | S_IWUSR, | ||
1658 | show_auto_pwm_slope, set_auto_pwm_slope, 1); | ||
1570 | 1659 | ||
1571 | static SENSOR_DEVICE_ATTR(pwm3_enable, S_IRUGO | S_IWUSR, | 1660 | static SENSOR_DEVICE_ATTR(pwm3_enable, S_IRUGO | S_IWUSR, |
1572 | show_pwm_enable, set_pwm_enable, 2); | 1661 | show_pwm_enable, set_pwm_enable, 2); |
@@ -1592,6 +1681,10 @@ static SENSOR_DEVICE_ATTR_2(pwm3_auto_point3_temp, S_IRUGO | S_IWUSR, | |||
1592 | show_auto_temp, set_auto_temp, 2, 3); | 1681 | show_auto_temp, set_auto_temp, 2, 3); |
1593 | static SENSOR_DEVICE_ATTR_2(pwm3_auto_point4_temp, S_IRUGO | S_IWUSR, | 1682 | static SENSOR_DEVICE_ATTR_2(pwm3_auto_point4_temp, S_IRUGO | S_IWUSR, |
1594 | show_auto_temp, set_auto_temp, 2, 4); | 1683 | show_auto_temp, set_auto_temp, 2, 4); |
1684 | static SENSOR_DEVICE_ATTR_2(pwm3_auto_start, S_IRUGO | S_IWUSR, | ||
1685 | show_auto_pwm, set_auto_pwm, 2, 0); | ||
1686 | static SENSOR_DEVICE_ATTR(pwm3_auto_slope, S_IRUGO | S_IWUSR, | ||
1687 | show_auto_pwm_slope, set_auto_pwm_slope, 2); | ||
1595 | 1688 | ||
1596 | static SENSOR_DEVICE_ATTR(pwm4_enable, S_IRUGO | S_IWUSR, | 1689 | static SENSOR_DEVICE_ATTR(pwm4_enable, S_IRUGO | S_IWUSR, |
1597 | show_pwm_enable, set_pwm_enable, 3); | 1690 | show_pwm_enable, set_pwm_enable, 3); |
@@ -1599,6 +1692,18 @@ static SENSOR_DEVICE_ATTR(pwm4, S_IRUGO | S_IWUSR, show_pwm, set_pwm, 3); | |||
1599 | static SENSOR_DEVICE_ATTR(pwm4_freq, S_IRUGO, show_pwm_freq, NULL, 3); | 1692 | static SENSOR_DEVICE_ATTR(pwm4_freq, S_IRUGO, show_pwm_freq, NULL, 3); |
1600 | static SENSOR_DEVICE_ATTR(pwm4_auto_channels_temp, S_IRUGO, | 1693 | static SENSOR_DEVICE_ATTR(pwm4_auto_channels_temp, S_IRUGO, |
1601 | show_pwm_temp_map, set_pwm_temp_map, 3); | 1694 | show_pwm_temp_map, set_pwm_temp_map, 3); |
1695 | static SENSOR_DEVICE_ATTR_2(pwm4_auto_point1_temp, S_IRUGO | S_IWUSR, | ||
1696 | show_auto_temp, set_auto_temp, 2, 1); | ||
1697 | static SENSOR_DEVICE_ATTR_2(pwm4_auto_point1_temp_hyst, S_IRUGO | S_IWUSR, | ||
1698 | show_auto_temp, set_auto_temp, 2, 0); | ||
1699 | static SENSOR_DEVICE_ATTR_2(pwm4_auto_point2_temp, S_IRUGO | S_IWUSR, | ||
1700 | show_auto_temp, set_auto_temp, 2, 2); | ||
1701 | static SENSOR_DEVICE_ATTR_2(pwm4_auto_point3_temp, S_IRUGO | S_IWUSR, | ||
1702 | show_auto_temp, set_auto_temp, 2, 3); | ||
1703 | static SENSOR_DEVICE_ATTR_2(pwm4_auto_start, S_IRUGO | S_IWUSR, | ||
1704 | show_auto_pwm, set_auto_pwm, 3, 0); | ||
1705 | static SENSOR_DEVICE_ATTR(pwm4_auto_slope, S_IRUGO | S_IWUSR, | ||
1706 | show_auto_pwm_slope, set_auto_pwm_slope, 3); | ||
1602 | 1707 | ||
1603 | static SENSOR_DEVICE_ATTR(pwm5_enable, S_IRUGO | S_IWUSR, | 1708 | static SENSOR_DEVICE_ATTR(pwm5_enable, S_IRUGO | S_IWUSR, |
1604 | show_pwm_enable, set_pwm_enable, 4); | 1709 | show_pwm_enable, set_pwm_enable, 4); |
@@ -1606,6 +1711,18 @@ static SENSOR_DEVICE_ATTR(pwm5, S_IRUGO | S_IWUSR, show_pwm, set_pwm, 4); | |||
1606 | static SENSOR_DEVICE_ATTR(pwm5_freq, S_IRUGO, show_pwm_freq, NULL, 4); | 1711 | static SENSOR_DEVICE_ATTR(pwm5_freq, S_IRUGO, show_pwm_freq, NULL, 4); |
1607 | static SENSOR_DEVICE_ATTR(pwm5_auto_channels_temp, S_IRUGO, | 1712 | static SENSOR_DEVICE_ATTR(pwm5_auto_channels_temp, S_IRUGO, |
1608 | show_pwm_temp_map, set_pwm_temp_map, 4); | 1713 | show_pwm_temp_map, set_pwm_temp_map, 4); |
1714 | static SENSOR_DEVICE_ATTR_2(pwm5_auto_point1_temp, S_IRUGO | S_IWUSR, | ||
1715 | show_auto_temp, set_auto_temp, 2, 1); | ||
1716 | static SENSOR_DEVICE_ATTR_2(pwm5_auto_point1_temp_hyst, S_IRUGO | S_IWUSR, | ||
1717 | show_auto_temp, set_auto_temp, 2, 0); | ||
1718 | static SENSOR_DEVICE_ATTR_2(pwm5_auto_point2_temp, S_IRUGO | S_IWUSR, | ||
1719 | show_auto_temp, set_auto_temp, 2, 2); | ||
1720 | static SENSOR_DEVICE_ATTR_2(pwm5_auto_point3_temp, S_IRUGO | S_IWUSR, | ||
1721 | show_auto_temp, set_auto_temp, 2, 3); | ||
1722 | static SENSOR_DEVICE_ATTR_2(pwm5_auto_start, S_IRUGO | S_IWUSR, | ||
1723 | show_auto_pwm, set_auto_pwm, 4, 0); | ||
1724 | static SENSOR_DEVICE_ATTR(pwm5_auto_slope, S_IRUGO | S_IWUSR, | ||
1725 | show_auto_pwm_slope, set_auto_pwm_slope, 4); | ||
1609 | 1726 | ||
1610 | static SENSOR_DEVICE_ATTR(pwm6_enable, S_IRUGO | S_IWUSR, | 1727 | static SENSOR_DEVICE_ATTR(pwm6_enable, S_IRUGO | S_IWUSR, |
1611 | show_pwm_enable, set_pwm_enable, 5); | 1728 | show_pwm_enable, set_pwm_enable, 5); |
@@ -1613,6 +1730,18 @@ static SENSOR_DEVICE_ATTR(pwm6, S_IRUGO | S_IWUSR, show_pwm, set_pwm, 5); | |||
1613 | static SENSOR_DEVICE_ATTR(pwm6_freq, S_IRUGO, show_pwm_freq, NULL, 5); | 1730 | static SENSOR_DEVICE_ATTR(pwm6_freq, S_IRUGO, show_pwm_freq, NULL, 5); |
1614 | static SENSOR_DEVICE_ATTR(pwm6_auto_channels_temp, S_IRUGO, | 1731 | static SENSOR_DEVICE_ATTR(pwm6_auto_channels_temp, S_IRUGO, |
1615 | show_pwm_temp_map, set_pwm_temp_map, 5); | 1732 | show_pwm_temp_map, set_pwm_temp_map, 5); |
1733 | static SENSOR_DEVICE_ATTR_2(pwm6_auto_point1_temp, S_IRUGO | S_IWUSR, | ||
1734 | show_auto_temp, set_auto_temp, 2, 1); | ||
1735 | static SENSOR_DEVICE_ATTR_2(pwm6_auto_point1_temp_hyst, S_IRUGO | S_IWUSR, | ||
1736 | show_auto_temp, set_auto_temp, 2, 0); | ||
1737 | static SENSOR_DEVICE_ATTR_2(pwm6_auto_point2_temp, S_IRUGO | S_IWUSR, | ||
1738 | show_auto_temp, set_auto_temp, 2, 2); | ||
1739 | static SENSOR_DEVICE_ATTR_2(pwm6_auto_point3_temp, S_IRUGO | S_IWUSR, | ||
1740 | show_auto_temp, set_auto_temp, 2, 3); | ||
1741 | static SENSOR_DEVICE_ATTR_2(pwm6_auto_start, S_IRUGO | S_IWUSR, | ||
1742 | show_auto_pwm, set_auto_pwm, 5, 0); | ||
1743 | static SENSOR_DEVICE_ATTR(pwm6_auto_slope, S_IRUGO | S_IWUSR, | ||
1744 | show_auto_pwm_slope, set_auto_pwm_slope, 5); | ||
1616 | 1745 | ||
1617 | /* Alarms */ | 1746 | /* Alarms */ |
1618 | static ssize_t show_alarms(struct device *dev, struct device_attribute *attr, | 1747 | static ssize_t show_alarms(struct device *dev, struct device_attribute *attr, |
@@ -2050,8 +2179,8 @@ static umode_t it87_pwm_is_visible(struct kobject *kobj, | |||
2050 | if (!(data->has_pwm & BIT(i))) | 2179 | if (!(data->has_pwm & BIT(i))) |
2051 | return 0; | 2180 | return 0; |
2052 | 2181 | ||
2053 | /* pwmX_auto_channels_temp is only writable for old auto pwm */ | 2182 | /* pwmX_auto_channels_temp is only writable if auto pwm is supported */ |
2054 | if (a == 3 && has_old_autopwm(data)) | 2183 | if (a == 3 && (has_old_autopwm(data) || has_newer_autopwm(data))) |
2055 | return attr->mode | S_IWUSR; | 2184 | return attr->mode | S_IWUSR; |
2056 | 2185 | ||
2057 | /* pwm2_freq is writable if there are two pwm frequency selects */ | 2186 | /* pwm2_freq is writable if there are two pwm frequency selects */ |
@@ -2105,11 +2234,28 @@ static umode_t it87_auto_pwm_is_visible(struct kobject *kobj, | |||
2105 | { | 2234 | { |
2106 | struct device *dev = container_of(kobj, struct device, kobj); | 2235 | struct device *dev = container_of(kobj, struct device, kobj); |
2107 | struct it87_data *data = dev_get_drvdata(dev); | 2236 | struct it87_data *data = dev_get_drvdata(dev); |
2108 | int i = index / 9; /* pwm index */ | 2237 | int i = index / 11; /* pwm index */ |
2238 | int a = index % 11; /* attribute index */ | ||
2239 | |||
2240 | if (index >= 33) { /* pwm 4..6 */ | ||
2241 | i = (index - 33) / 6 + 3; | ||
2242 | a = (index - 33) % 6 + 4; | ||
2243 | } | ||
2109 | 2244 | ||
2110 | if (!(data->has_pwm & BIT(i))) | 2245 | if (!(data->has_pwm & BIT(i))) |
2111 | return 0; | 2246 | return 0; |
2112 | 2247 | ||
2248 | if (has_newer_autopwm(data)) { | ||
2249 | if (a < 4) /* no auto point pwm */ | ||
2250 | return 0; | ||
2251 | if (a == 8) /* no auto_point4 */ | ||
2252 | return 0; | ||
2253 | } | ||
2254 | if (has_old_autopwm(data)) { | ||
2255 | if (a >= 9) /* no pwm_auto_start, pwm_auto_slope */ | ||
2256 | return 0; | ||
2257 | } | ||
2258 | |||
2113 | return attr->mode; | 2259 | return attr->mode; |
2114 | } | 2260 | } |
2115 | 2261 | ||
@@ -2123,8 +2269,10 @@ static struct attribute *it87_attributes_auto_pwm[] = { | |||
2123 | &sensor_dev_attr_pwm1_auto_point2_temp.dev_attr.attr, | 2269 | &sensor_dev_attr_pwm1_auto_point2_temp.dev_attr.attr, |
2124 | &sensor_dev_attr_pwm1_auto_point3_temp.dev_attr.attr, | 2270 | &sensor_dev_attr_pwm1_auto_point3_temp.dev_attr.attr, |
2125 | &sensor_dev_attr_pwm1_auto_point4_temp.dev_attr.attr, | 2271 | &sensor_dev_attr_pwm1_auto_point4_temp.dev_attr.attr, |
2272 | &sensor_dev_attr_pwm1_auto_start.dev_attr.attr, | ||
2273 | &sensor_dev_attr_pwm1_auto_slope.dev_attr.attr, | ||
2126 | 2274 | ||
2127 | &sensor_dev_attr_pwm2_auto_point1_pwm.dev_attr.attr, | 2275 | &sensor_dev_attr_pwm2_auto_point1_pwm.dev_attr.attr, /* 11 */ |
2128 | &sensor_dev_attr_pwm2_auto_point2_pwm.dev_attr.attr, | 2276 | &sensor_dev_attr_pwm2_auto_point2_pwm.dev_attr.attr, |
2129 | &sensor_dev_attr_pwm2_auto_point3_pwm.dev_attr.attr, | 2277 | &sensor_dev_attr_pwm2_auto_point3_pwm.dev_attr.attr, |
2130 | &sensor_dev_attr_pwm2_auto_point4_pwm.dev_attr.attr, | 2278 | &sensor_dev_attr_pwm2_auto_point4_pwm.dev_attr.attr, |
@@ -2133,8 +2281,10 @@ static struct attribute *it87_attributes_auto_pwm[] = { | |||
2133 | &sensor_dev_attr_pwm2_auto_point2_temp.dev_attr.attr, | 2281 | &sensor_dev_attr_pwm2_auto_point2_temp.dev_attr.attr, |
2134 | &sensor_dev_attr_pwm2_auto_point3_temp.dev_attr.attr, | 2282 | &sensor_dev_attr_pwm2_auto_point3_temp.dev_attr.attr, |
2135 | &sensor_dev_attr_pwm2_auto_point4_temp.dev_attr.attr, | 2283 | &sensor_dev_attr_pwm2_auto_point4_temp.dev_attr.attr, |
2284 | &sensor_dev_attr_pwm2_auto_start.dev_attr.attr, | ||
2285 | &sensor_dev_attr_pwm2_auto_slope.dev_attr.attr, | ||
2136 | 2286 | ||
2137 | &sensor_dev_attr_pwm3_auto_point1_pwm.dev_attr.attr, | 2287 | &sensor_dev_attr_pwm3_auto_point1_pwm.dev_attr.attr, /* 22 */ |
2138 | &sensor_dev_attr_pwm3_auto_point2_pwm.dev_attr.attr, | 2288 | &sensor_dev_attr_pwm3_auto_point2_pwm.dev_attr.attr, |
2139 | &sensor_dev_attr_pwm3_auto_point3_pwm.dev_attr.attr, | 2289 | &sensor_dev_attr_pwm3_auto_point3_pwm.dev_attr.attr, |
2140 | &sensor_dev_attr_pwm3_auto_point4_pwm.dev_attr.attr, | 2290 | &sensor_dev_attr_pwm3_auto_point4_pwm.dev_attr.attr, |
@@ -2143,6 +2293,29 @@ static struct attribute *it87_attributes_auto_pwm[] = { | |||
2143 | &sensor_dev_attr_pwm3_auto_point2_temp.dev_attr.attr, | 2293 | &sensor_dev_attr_pwm3_auto_point2_temp.dev_attr.attr, |
2144 | &sensor_dev_attr_pwm3_auto_point3_temp.dev_attr.attr, | 2294 | &sensor_dev_attr_pwm3_auto_point3_temp.dev_attr.attr, |
2145 | &sensor_dev_attr_pwm3_auto_point4_temp.dev_attr.attr, | 2295 | &sensor_dev_attr_pwm3_auto_point4_temp.dev_attr.attr, |
2296 | &sensor_dev_attr_pwm3_auto_start.dev_attr.attr, | ||
2297 | &sensor_dev_attr_pwm3_auto_slope.dev_attr.attr, | ||
2298 | |||
2299 | &sensor_dev_attr_pwm4_auto_point1_temp.dev_attr.attr, /* 33 */ | ||
2300 | &sensor_dev_attr_pwm4_auto_point1_temp_hyst.dev_attr.attr, | ||
2301 | &sensor_dev_attr_pwm4_auto_point2_temp.dev_attr.attr, | ||
2302 | &sensor_dev_attr_pwm4_auto_point3_temp.dev_attr.attr, | ||
2303 | &sensor_dev_attr_pwm4_auto_start.dev_attr.attr, | ||
2304 | &sensor_dev_attr_pwm4_auto_slope.dev_attr.attr, | ||
2305 | |||
2306 | &sensor_dev_attr_pwm5_auto_point1_temp.dev_attr.attr, | ||
2307 | &sensor_dev_attr_pwm5_auto_point1_temp_hyst.dev_attr.attr, | ||
2308 | &sensor_dev_attr_pwm5_auto_point2_temp.dev_attr.attr, | ||
2309 | &sensor_dev_attr_pwm5_auto_point3_temp.dev_attr.attr, | ||
2310 | &sensor_dev_attr_pwm5_auto_start.dev_attr.attr, | ||
2311 | &sensor_dev_attr_pwm5_auto_slope.dev_attr.attr, | ||
2312 | |||
2313 | &sensor_dev_attr_pwm6_auto_point1_temp.dev_attr.attr, | ||
2314 | &sensor_dev_attr_pwm6_auto_point1_temp_hyst.dev_attr.attr, | ||
2315 | &sensor_dev_attr_pwm6_auto_point2_temp.dev_attr.attr, | ||
2316 | &sensor_dev_attr_pwm6_auto_point3_temp.dev_attr.attr, | ||
2317 | &sensor_dev_attr_pwm6_auto_start.dev_attr.attr, | ||
2318 | &sensor_dev_attr_pwm6_auto_slope.dev_attr.attr, | ||
2146 | 2319 | ||
2147 | NULL, | 2320 | NULL, |
2148 | }; | 2321 | }; |
@@ -2839,7 +3012,7 @@ static int it87_probe(struct platform_device *pdev) | |||
2839 | data->has_pwm &= ~sio_data->skip_pwm; | 3012 | data->has_pwm &= ~sio_data->skip_pwm; |
2840 | 3013 | ||
2841 | data->groups[4] = &it87_group_pwm; | 3014 | data->groups[4] = &it87_group_pwm; |
2842 | if (has_old_autopwm(data)) | 3015 | if (has_old_autopwm(data) || has_newer_autopwm(data)) |
2843 | data->groups[5] = &it87_group_auto_pwm; | 3016 | data->groups[5] = &it87_group_auto_pwm; |
2844 | } | 3017 | } |
2845 | 3018 | ||