Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ad774285 authored by Jeremy Fertic's avatar Jeremy Fertic Committed by Greg Kroah-Hartman
Browse files

staging: iio: adt7316: fix the dac read calculation



commit 45130fb030aec26ac28b4bb23344901df3ec3b7f upstream.

The calculation of the current dac value is using the wrong bits of the
dac lsb register. Create two macros to shift the lsb register value into
lsb position, depending on whether the dac is 10 or 12 bit. Initialize
data to 0 so, with an 8 bit dac, the msb register value can be bitwise
ORed with data.

Fixes: 35f6b6b8 ("staging: iio: new ADT7316/7/8 and ADT7516/7/9 driver")
Signed-off-by: default avatarJeremy Fertic <jeremyfertic@gmail.com>
Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 7041e3d6
Loading
Loading
Loading
Loading
+8 −2
Original line number Original line Diff line number Diff line
@@ -47,6 +47,8 @@
#define ADT7516_MSB_AIN3		0xA
#define ADT7516_MSB_AIN3		0xA
#define ADT7516_MSB_AIN4		0xB
#define ADT7516_MSB_AIN4		0xB
#define ADT7316_DA_DATA_BASE		0x10
#define ADT7316_DA_DATA_BASE		0x10
#define ADT7316_DA_10_BIT_LSB_SHIFT	6
#define ADT7316_DA_12_BIT_LSB_SHIFT	4
#define ADT7316_DA_MSB_DATA_REGS	4
#define ADT7316_DA_MSB_DATA_REGS	4
#define ADT7316_LSB_DAC_A		0x10
#define ADT7316_LSB_DAC_A		0x10
#define ADT7316_MSB_DAC_A		0x11
#define ADT7316_MSB_DAC_A		0x11
@@ -1408,7 +1410,7 @@ static IIO_DEVICE_ATTR(ex_analog_temp_offset, 0644,
static ssize_t adt7316_show_DAC(struct adt7316_chip_info *chip,
static ssize_t adt7316_show_DAC(struct adt7316_chip_info *chip,
		int channel, char *buf)
		int channel, char *buf)
{
{
	u16 data;
	u16 data = 0;
	u8 msb, lsb, offset;
	u8 msb, lsb, offset;
	int ret;
	int ret;


@@ -1433,7 +1435,11 @@ static ssize_t adt7316_show_DAC(struct adt7316_chip_info *chip,
	if (ret)
	if (ret)
		return -EIO;
		return -EIO;


	data = (msb << offset) + (lsb & ((1 << offset) - 1));
	if (chip->dac_bits == 12)
		data = lsb >> ADT7316_DA_12_BIT_LSB_SHIFT;
	else if (chip->dac_bits == 10)
		data = lsb >> ADT7316_DA_10_BIT_LSB_SHIFT;
	data |= msb << offset;


	return sprintf(buf, "%d\n", data);
	return sprintf(buf, "%d\n", data);
}
}