diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2016-08-01 16:49:13 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-08-01 16:49:13 -0400 |
commit | 2790aed095fe50b21ab7ed94dc34a0f410a3872c (patch) | |
tree | 842f28c60c19d52029b71d9b623393b2057b7c34 /drivers/hwmon/adt7411.c | |
parent | f38d2e5313f0af9d9b66c02a5d49c71deb994b85 (diff) | |
parent | 601807bbb7b422012492611b283bdf3647d3742c (diff) | |
download | linux-2790aed095fe50b21ab7ed94dc34a0f410a3872c.tar.bz2 |
Merge tag 'hwmon-for-linus-v4.8-2' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging
Pull more hwmon updates from Guenter Roeck:
- Improved error handling in tmp102, lm75, and lm90 drivers
- Bug fixes in sht3x, ftsteutates, iio_hwmon, and adt7411 drivers
* tag 'hwmon-for-linus-v4.8-2' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging:
hwmon: (adt7411) set sane values for CFG1 and CFG3
hwmon: (iio_hwmon) fix memory leak in name attribute
hwmon: (ftsteutates) Fix potential memory access error
hwmon: (tmp102) Improve error handling
hwmon: (lm75) Improve error handling
hwmon: (lm90) Improve error handling
hwmon: (lm90) Add missing assignment
hwmon: (sht3x) set initial jiffies to last_update
Diffstat (limited to 'drivers/hwmon/adt7411.c')
-rw-r--r-- | drivers/hwmon/adt7411.c | 48 |
1 files changed, 44 insertions, 4 deletions
diff --git a/drivers/hwmon/adt7411.c b/drivers/hwmon/adt7411.c index a7f886961830..fc1e65a263a4 100644 --- a/drivers/hwmon/adt7411.c +++ b/drivers/hwmon/adt7411.c @@ -30,6 +30,7 @@ #define ADT7411_REG_CFG1 0x18 #define ADT7411_CFG1_START_MONITOR (1 << 0) +#define ADT7411_CFG1_RESERVED_BIT1 (1 << 1) #define ADT7411_CFG1_RESERVED_BIT3 (1 << 3) #define ADT7411_REG_CFG2 0x19 @@ -37,6 +38,9 @@ #define ADT7411_REG_CFG3 0x1a #define ADT7411_CFG3_ADC_CLK_225 (1 << 0) +#define ADT7411_CFG3_RESERVED_BIT1 (1 << 1) +#define ADT7411_CFG3_RESERVED_BIT2 (1 << 2) +#define ADT7411_CFG3_RESERVED_BIT3 (1 << 3) #define ADT7411_CFG3_REF_VDD (1 << 4) #define ADT7411_REG_DEVICE_ID 0x4d @@ -280,6 +284,45 @@ static int adt7411_detect(struct i2c_client *client, return 0; } +static int adt7411_init_device(struct adt7411_data *data) +{ + int ret; + u8 val; + + ret = i2c_smbus_read_byte_data(data->client, ADT7411_REG_CFG3); + if (ret < 0) + return ret; + + /* + * We must only write zero to bit 1 and bit 2 and only one to bit 3 + * according to the datasheet. + */ + val = ret; + val &= ~(ADT7411_CFG3_RESERVED_BIT1 | ADT7411_CFG3_RESERVED_BIT2); + val |= ADT7411_CFG3_RESERVED_BIT3; + + ret = i2c_smbus_write_byte_data(data->client, ADT7411_REG_CFG3, val); + if (ret < 0) + return ret; + + ret = i2c_smbus_read_byte_data(data->client, ADT7411_REG_CFG1); + if (ret < 0) + return ret; + + /* + * We must only write zero to bit 1 and only one to bit 3 according to + * the datasheet. + */ + val = ret; + val &= ~ADT7411_CFG1_RESERVED_BIT1; + val |= ADT7411_CFG1_RESERVED_BIT3; + + /* enable monitoring */ + val |= ADT7411_CFG1_START_MONITOR; + + return i2c_smbus_write_byte_data(data->client, ADT7411_REG_CFG1, val); +} + static int adt7411_probe(struct i2c_client *client, const struct i2c_device_id *id) { @@ -297,10 +340,7 @@ static int adt7411_probe(struct i2c_client *client, mutex_init(&data->device_lock); mutex_init(&data->update_lock); - /* According to the datasheet, we must only write 1 to bit 3 */ - ret = adt7411_modify_bit(client, ADT7411_REG_CFG1, - ADT7411_CFG1_RESERVED_BIT3 - | ADT7411_CFG1_START_MONITOR, 1); + ret = adt7411_init_device(data); if (ret < 0) return ret; |