aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTokunori Ikegami <ikegami@allied-telesis.co.jp>2018-08-07 21:32:18 -0400
committerGuenter Roeck <linux@roeck-us.net>2018-08-10 12:13:01 -0400
commit702afead45e15407bea94ccee16b801bbe9db13e (patch)
treebf2011d8695e1155a60cda04a6f3e21614950954
parentb36fb17159adad16a724f0d298a5b50269839ead (diff)
hwmon: (adt7475) Change update functions to add error handling
I2C SMBus sometimes returns error codes. In the error case, measurement values are updated incorrectly. The sensor application then generates warning log messages and SNMP traps. To prevent this, add error handling into the update functions. Signed-off-by: Tokunori Ikegami <ikegami@allied-telesis.co.jp> Cc: Guenter Roeck <linux@roeck-us.net> Cc: Chris Packham <chris.packham@alliedtelesis.co.nz> [groeck: Update description] Signed-off-by: Guenter Roeck <linux@roeck-us.net>
-rw-r--r--drivers/hwmon/adt7475.c187
1 files changed, 145 insertions, 42 deletions
diff --git a/drivers/hwmon/adt7475.c b/drivers/hwmon/adt7475.c
index d90b31eb3472..9f7e1a5b08a5 100644
--- a/drivers/hwmon/adt7475.c
+++ b/drivers/hwmon/adt7475.c
@@ -1384,63 +1384,119 @@ static void adt7475_remove_files(struct i2c_client *client,
1384 sysfs_remove_group(&client->dev.kobj, &vid_attr_group); 1384 sysfs_remove_group(&client->dev.kobj, &vid_attr_group);
1385} 1385}
1386 1386
1387static void adt7475_update_limits(struct i2c_client *client) 1387static int adt7475_update_limits(struct i2c_client *client)
1388{ 1388{
1389 struct adt7475_data *data = i2c_get_clientdata(client); 1389 struct adt7475_data *data = i2c_get_clientdata(client);
1390 int i; 1390 int i;
1391 int ret;
1391 1392
1392 data->config4 = adt7475_read(REG_CONFIG4); 1393 ret = adt7475_read(REG_CONFIG4);
1393 data->config5 = adt7475_read(REG_CONFIG5); 1394 if (ret < 0)
1395 return ret;
1396 data->config4 = ret;
1397
1398 ret = adt7475_read(REG_CONFIG5);
1399 if (ret < 0)
1400 return ret;
1401 data->config5 = ret;
1394 1402
1395 for (i = 0; i < ADT7475_VOLTAGE_COUNT; i++) { 1403 for (i = 0; i < ADT7475_VOLTAGE_COUNT; i++) {
1396 if (!(data->has_voltage & (1 << i))) 1404 if (!(data->has_voltage & (1 << i)))
1397 continue; 1405 continue;
1398 /* Adjust values so they match the input precision */ 1406 /* Adjust values so they match the input precision */
1399 data->voltage[MIN][i] = 1407 ret = adt7475_read(VOLTAGE_MIN_REG(i));
1400 adt7475_read(VOLTAGE_MIN_REG(i)) << 2; 1408 if (ret < 0)
1401 data->voltage[MAX][i] = 1409 return ret;
1402 adt7475_read(VOLTAGE_MAX_REG(i)) << 2; 1410 data->voltage[MIN][i] = ret << 2;
1411
1412 ret = adt7475_read(VOLTAGE_MAX_REG(i));
1413 if (ret < 0)
1414 return ret;
1415 data->voltage[MAX][i] = ret << 2;
1403 } 1416 }
1404 1417
1405 if (data->has_voltage & (1 << 5)) { 1418 if (data->has_voltage & (1 << 5)) {
1406 data->voltage[MIN][5] = adt7475_read(REG_VTT_MIN) << 2; 1419 ret = adt7475_read(REG_VTT_MIN);
1407 data->voltage[MAX][5] = adt7475_read(REG_VTT_MAX) << 2; 1420 if (ret < 0)
1421 return ret;
1422 data->voltage[MIN][5] = ret << 2;
1423
1424 ret = adt7475_read(REG_VTT_MAX);
1425 if (ret < 0)
1426 return ret;
1427 data->voltage[MAX][5] = ret << 2;
1408 } 1428 }
1409 1429
1410 for (i = 0; i < ADT7475_TEMP_COUNT; i++) { 1430 for (i = 0; i < ADT7475_TEMP_COUNT; i++) {
1411 /* Adjust values so they match the input precision */ 1431 /* Adjust values so they match the input precision */
1412 data->temp[MIN][i] = 1432 ret = adt7475_read(TEMP_MIN_REG(i));
1413 adt7475_read(TEMP_MIN_REG(i)) << 2; 1433 if (ret < 0)
1414 data->temp[MAX][i] = 1434 return ret;
1415 adt7475_read(TEMP_MAX_REG(i)) << 2; 1435 data->temp[MIN][i] = ret << 2;
1416 data->temp[AUTOMIN][i] = 1436
1417 adt7475_read(TEMP_TMIN_REG(i)) << 2; 1437 ret = adt7475_read(TEMP_MAX_REG(i));
1418 data->temp[THERM][i] = 1438 if (ret < 0)
1419 adt7475_read(TEMP_THERM_REG(i)) << 2; 1439 return ret;
1420 data->temp[OFFSET][i] = 1440 data->temp[MAX][i] = ret << 2;
1421 adt7475_read(TEMP_OFFSET_REG(i)); 1441
1442 ret = adt7475_read(TEMP_TMIN_REG(i));
1443 if (ret < 0)
1444 return ret;
1445 data->temp[AUTOMIN][i] = ret << 2;
1446
1447 ret = adt7475_read(TEMP_THERM_REG(i));
1448 if (ret < 0)
1449 return ret;
1450 data->temp[THERM][i] = ret << 2;
1451
1452 ret = adt7475_read(TEMP_OFFSET_REG(i));
1453 if (ret < 0)
1454 return ret;
1455 data->temp[OFFSET][i] = ret;
1422 } 1456 }
1423 adt7475_read_hystersis(client); 1457 adt7475_read_hystersis(client);
1424 1458
1425 for (i = 0; i < ADT7475_TACH_COUNT; i++) { 1459 for (i = 0; i < ADT7475_TACH_COUNT; i++) {
1426 if (i == 3 && !data->has_fan4) 1460 if (i == 3 && !data->has_fan4)
1427 continue; 1461 continue;
1428 data->tach[MIN][i] = 1462 ret = adt7475_read_word(client, TACH_MIN_REG(i));
1429 adt7475_read_word(client, TACH_MIN_REG(i)); 1463 if (ret < 0)
1464 return ret;
1465 data->tach[MIN][i] = ret;
1430 } 1466 }
1431 1467
1432 for (i = 0; i < ADT7475_PWM_COUNT; i++) { 1468 for (i = 0; i < ADT7475_PWM_COUNT; i++) {
1433 if (i == 1 && !data->has_pwm2) 1469 if (i == 1 && !data->has_pwm2)
1434 continue; 1470 continue;
1435 data->pwm[MAX][i] = adt7475_read(PWM_MAX_REG(i)); 1471 ret = adt7475_read(PWM_MAX_REG(i));
1436 data->pwm[MIN][i] = adt7475_read(PWM_MIN_REG(i)); 1472 if (ret < 0)
1473 return ret;
1474 data->pwm[MAX][i] = ret;
1475
1476 ret = adt7475_read(PWM_MIN_REG(i));
1477 if (ret < 0)
1478 return ret;
1479 data->pwm[MIN][i] = ret;
1437 /* Set the channel and control information */ 1480 /* Set the channel and control information */
1438 adt7475_read_pwm(client, i); 1481 adt7475_read_pwm(client, i);
1439 } 1482 }
1440 1483
1441 data->range[0] = adt7475_read(TEMP_TRANGE_REG(0)); 1484 ret = adt7475_read(TEMP_TRANGE_REG(0));
1442 data->range[1] = adt7475_read(TEMP_TRANGE_REG(1)); 1485 if (ret < 0)
1443 data->range[2] = adt7475_read(TEMP_TRANGE_REG(2)); 1486 return ret;
1487 data->range[0] = ret;
1488
1489 ret = adt7475_read(TEMP_TRANGE_REG(1));
1490 if (ret < 0)
1491 return ret;
1492 data->range[1] = ret;
1493
1494 ret = adt7475_read(TEMP_TRANGE_REG(2));
1495 if (ret < 0)
1496 return ret;
1497 data->range[2] = ret;
1498
1499 return 0;
1444} 1500}
1445 1501
1446static int adt7475_probe(struct i2c_client *client, 1502static int adt7475_probe(struct i2c_client *client,
@@ -1719,54 +1775,101 @@ static void adt7475_read_pwm(struct i2c_client *client, int index)
1719 } 1775 }
1720} 1776}
1721 1777
1722static void adt7475_update_measure(struct device *dev) 1778static int adt7475_update_measure(struct device *dev)
1723{ 1779{
1724 struct i2c_client *client = to_i2c_client(dev); 1780 struct i2c_client *client = to_i2c_client(dev);
1725 struct adt7475_data *data = i2c_get_clientdata(client); 1781 struct adt7475_data *data = i2c_get_clientdata(client);
1726 u16 ext; 1782 u16 ext;
1727 int i; 1783 int i;
1784 int ret;
1785
1786 ret = adt7475_read(REG_STATUS2);
1787 if (ret < 0)
1788 return ret;
1789 data->alarms = ret << 8;
1728 1790
1729 data->alarms = adt7475_read(REG_STATUS2) << 8; 1791 ret = adt7475_read(REG_STATUS1);
1730 data->alarms |= adt7475_read(REG_STATUS1); 1792 if (ret < 0)
1793 return ret;
1794 data->alarms |= ret;
1795
1796 ret = adt7475_read(REG_EXTEND2);
1797 if (ret < 0)
1798 return ret;
1799
1800 ext = (ret << 8);
1801
1802 ret = adt7475_read(REG_EXTEND1);
1803 if (ret < 0)
1804 return ret;
1805
1806 ext |= ret;
1731 1807
1732 ext = (adt7475_read(REG_EXTEND2) << 8) |
1733 adt7475_read(REG_EXTEND1);
1734 for (i = 0; i < ADT7475_VOLTAGE_COUNT; i++) { 1808 for (i = 0; i < ADT7475_VOLTAGE_COUNT; i++) {
1735 if (!(data->has_voltage & (1 << i))) 1809 if (!(data->has_voltage & (1 << i)))
1736 continue; 1810 continue;
1811 ret = adt7475_read(VOLTAGE_REG(i));
1812 if (ret < 0)
1813 return ret;
1737 data->voltage[INPUT][i] = 1814 data->voltage[INPUT][i] =
1738 (adt7475_read(VOLTAGE_REG(i)) << 2) | 1815 (ret << 2) |
1739 ((ext >> (i * 2)) & 3); 1816 ((ext >> (i * 2)) & 3);
1740 } 1817 }
1741 1818
1742 for (i = 0; i < ADT7475_TEMP_COUNT; i++) 1819 for (i = 0; i < ADT7475_TEMP_COUNT; i++) {
1820 ret = adt7475_read(TEMP_REG(i));
1821 if (ret < 0)
1822 return ret;
1743 data->temp[INPUT][i] = 1823 data->temp[INPUT][i] =
1744 (adt7475_read(TEMP_REG(i)) << 2) | 1824 (ret << 2) |
1745 ((ext >> ((i + 5) * 2)) & 3); 1825 ((ext >> ((i + 5) * 2)) & 3);
1826 }
1746 1827
1747 if (data->has_voltage & (1 << 5)) { 1828 if (data->has_voltage & (1 << 5)) {
1748 data->alarms |= adt7475_read(REG_STATUS4) << 24; 1829 ret = adt7475_read(REG_STATUS4);
1749 ext = adt7475_read(REG_EXTEND3); 1830 if (ret < 0)
1750 data->voltage[INPUT][5] = adt7475_read(REG_VTT) << 2 | 1831 return ret;
1832 data->alarms |= ret << 24;
1833
1834 ret = adt7475_read(REG_EXTEND3);
1835 if (ret < 0)
1836 return ret;
1837 ext = ret;
1838
1839 ret = adt7475_read(REG_VTT);
1840 if (ret < 0)
1841 return ret;
1842 data->voltage[INPUT][5] = ret << 2 |
1751 ((ext >> 4) & 3); 1843 ((ext >> 4) & 3);
1752 } 1844 }
1753 1845
1754 for (i = 0; i < ADT7475_TACH_COUNT; i++) { 1846 for (i = 0; i < ADT7475_TACH_COUNT; i++) {
1755 if (i == 3 && !data->has_fan4) 1847 if (i == 3 && !data->has_fan4)
1756 continue; 1848 continue;
1757 data->tach[INPUT][i] = 1849 ret = adt7475_read_word(client, TACH_REG(i));
1758 adt7475_read_word(client, TACH_REG(i)); 1850 if (ret < 0)
1851 return ret;
1852 data->tach[INPUT][i] = ret;
1759 } 1853 }
1760 1854
1761 /* Updated by hw when in auto mode */ 1855 /* Updated by hw when in auto mode */
1762 for (i = 0; i < ADT7475_PWM_COUNT; i++) { 1856 for (i = 0; i < ADT7475_PWM_COUNT; i++) {
1763 if (i == 1 && !data->has_pwm2) 1857 if (i == 1 && !data->has_pwm2)
1764 continue; 1858 continue;
1765 data->pwm[INPUT][i] = adt7475_read(PWM_REG(i)); 1859 ret = adt7475_read(PWM_REG(i));
1860 if (ret < 0)
1861 return ret;
1862 data->pwm[INPUT][i] = ret;
1766 } 1863 }
1767 1864
1768 if (data->has_vid) 1865 if (data->has_vid) {
1769 data->vid = adt7475_read(REG_VID) & 0x3f; 1866 ret = adt7475_read(REG_VID);
1867 if (ret < 0)
1868 return ret;
1869 data->vid = ret & 0x3f;
1870 }
1871
1872 return 0;
1770} 1873}
1771 1874
1772static struct adt7475_data *adt7475_update_device(struct device *dev) 1875static struct adt7475_data *adt7475_update_device(struct device *dev)