Commit 016983d1 authored by Chu Lin's avatar Chu Lin Committed by Guenter Roeck

hwmon: (max6697) Make sure the OVERT mask is set correctly

Per the datasheet for max6697, OVERT mask and ALERT mask are different.
For example, the 7th bit of OVERT is the local channel but for alert
mask, the 6th bit is the local channel. Therefore, we can't apply the
same mask for both registers. In addition to that, the max6697 driver
is supposed to be compatibale with different models. I manually went over
all the listed chips and made sure all chip types have the same layout.

Testing;
    mask value of 0x9 should map to 0x44 for ALERT and 0x84 for OVERT.
    I used iotool to read the reg value back to verify. I only tested this
    change on max6581.

Reference:
https://datasheets.maximintegrated.com/en/ds/MAX6581.pdf
https://datasheets.maximintegrated.com/en/ds/MAX6697.pdf
https://datasheets.maximintegrated.com/en/ds/MAX6699.pdfSigned-off-by: default avatarChu Lin <linchuyuan@google.com>
Fixes: 5372d2d7 ("hwmon: Driver for Maxim MAX6697 and compatibles")
Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
parent b4c8af4c
...@@ -38,8 +38,9 @@ static const u8 MAX6697_REG_CRIT[] = { ...@@ -38,8 +38,9 @@ static const u8 MAX6697_REG_CRIT[] = {
* Map device tree / platform data register bit map to chip bit map. * Map device tree / platform data register bit map to chip bit map.
* Applies to alert register and over-temperature register. * Applies to alert register and over-temperature register.
*/ */
#define MAX6697_MAP_BITS(reg) ((((reg) & 0x7e) >> 1) | \ #define MAX6697_ALERT_MAP_BITS(reg) ((((reg) & 0x7e) >> 1) | \
(((reg) & 0x01) << 6) | ((reg) & 0x80)) (((reg) & 0x01) << 6) | ((reg) & 0x80))
#define MAX6697_OVERT_MAP_BITS(reg) (((reg) >> 1) | (((reg) & 0x01) << 7))
#define MAX6697_REG_STAT(n) (0x44 + (n)) #define MAX6697_REG_STAT(n) (0x44 + (n))
...@@ -562,12 +563,12 @@ static int max6697_init_chip(struct max6697_data *data, ...@@ -562,12 +563,12 @@ static int max6697_init_chip(struct max6697_data *data,
return ret; return ret;
ret = i2c_smbus_write_byte_data(client, MAX6697_REG_ALERT_MASK, ret = i2c_smbus_write_byte_data(client, MAX6697_REG_ALERT_MASK,
MAX6697_MAP_BITS(pdata->alert_mask)); MAX6697_ALERT_MAP_BITS(pdata->alert_mask));
if (ret < 0) if (ret < 0)
return ret; return ret;
ret = i2c_smbus_write_byte_data(client, MAX6697_REG_OVERT_MASK, ret = i2c_smbus_write_byte_data(client, MAX6697_REG_OVERT_MASK,
MAX6697_MAP_BITS(pdata->over_temperature_mask)); MAX6697_OVERT_MAP_BITS(pdata->over_temperature_mask));
if (ret < 0) if (ret < 0)
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment