diff mbox series

[v2,2/4] staging: iio: adt7316: fix handling of dac high resolution option

Message ID 20181223045743.10716-3-jeremyfertic@gmail.com (mailing list archive)
State New, archived
Headers show
Series staging: iio: adt7316: dac fixes | expand

Commit Message

Jeremy Fertic Dec. 23, 2018, 4:57 a.m. UTC
The adt7316/7 and adt7516/7 have the option to output voltage proportional
to temperature on dac a and/or dac b. The default dac resolution in this
mode is 8 bits with the dac high resolution option enabling 10 bits. None
of these settings affect dacs c and d. Remove the "1 (12 bits)" output from
the show function since that is not an option for this mode. Return
"1 (10 bits)" if the device is one of the above mentioned chips and the dac
high resolution mode is enabled.

In the store function, the driver currently allows the user to write to the
ADT7316_DA_HIGH_RESOLUTION bit regardless of the device in use. Add a check
to return an error in the case of an adt7318 or adt7519. Remove the else
statement that clears the ADT7316_DA_HIGH_RESOLUTION bit. Instead, clear it
before conditionally enabling it, depending on user input. This matches the
typical pattern in the driver when an attribute is a boolean.

Fixes: 35f6b6b86ede ("staging: iio: new ADT7316/7/8 and ADT7516/7/9 driver")
Signed-off-by: Jeremy Fertic <jeremyfertic@gmail.com>
---
 drivers/staging/iio/addac/adt7316.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

Comments

Jonathan Cameron Jan. 5, 2019, 5:53 p.m. UTC | #1
On Sat, 22 Dec 2018 21:57:41 -0700
Jeremy Fertic <jeremyfertic@gmail.com> wrote:

> The adt7316/7 and adt7516/7 have the option to output voltage proportional
> to temperature on dac a and/or dac b. The default dac resolution in this
> mode is 8 bits with the dac high resolution option enabling 10 bits. None
> of these settings affect dacs c and d. Remove the "1 (12 bits)" output from
> the show function since that is not an option for this mode. Return
> "1 (10 bits)" if the device is one of the above mentioned chips and the dac
> high resolution mode is enabled.
> 
> In the store function, the driver currently allows the user to write to the
> ADT7316_DA_HIGH_RESOLUTION bit regardless of the device in use. Add a check
> to return an error in the case of an adt7318 or adt7519. Remove the else
> statement that clears the ADT7316_DA_HIGH_RESOLUTION bit. Instead, clear it
> before conditionally enabling it, depending on user input. This matches the
> typical pattern in the driver when an attribute is a boolean.
> 
> Fixes: 35f6b6b86ede ("staging: iio: new ADT7316/7/8 and ADT7516/7/9 driver")
> Signed-off-by: Jeremy Fertic <jeremyfertic@gmail.com>
Applied to the togreg branch of iio.git and pushed out as testing for
the autobuilders to play with it.

Thanks,

Jonathan

> ---
>  drivers/staging/iio/addac/adt7316.c | 12 ++++++------
>  1 file changed, 6 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/staging/iio/addac/adt7316.c b/drivers/staging/iio/addac/adt7316.c
> index e17c1cb12c94..80cc3420036b 100644
> --- a/drivers/staging/iio/addac/adt7316.c
> +++ b/drivers/staging/iio/addac/adt7316.c
> @@ -633,9 +633,7 @@ static ssize_t adt7316_show_da_high_resolution(struct device *dev,
>  	struct adt7316_chip_info *chip = iio_priv(dev_info);
>  
>  	if (chip->config3 & ADT7316_DA_HIGH_RESOLUTION) {
> -		if (chip->id == ID_ADT7316 || chip->id == ID_ADT7516)
> -			return sprintf(buf, "1 (12 bits)\n");
> -		if (chip->id == ID_ADT7317 || chip->id == ID_ADT7517)
> +		if (chip->id != ID_ADT7318 && chip->id != ID_ADT7519)
>  			return sprintf(buf, "1 (10 bits)\n");
>  	}
>  
> @@ -652,10 +650,12 @@ static ssize_t adt7316_store_da_high_resolution(struct device *dev,
>  	u8 config3;
>  	int ret;
>  
> +	if (chip->id == ID_ADT7318 || chip->id == ID_ADT7519)
> +		return -EPERM;
> +
> +	config3 = chip->config3 & (~ADT7316_DA_HIGH_RESOLUTION);
>  	if (buf[0] == '1')
> -		config3 = chip->config3 | ADT7316_DA_HIGH_RESOLUTION;
> -	else
> -		config3 = chip->config3 & (~ADT7316_DA_HIGH_RESOLUTION);
> +		config3 |= ADT7316_DA_HIGH_RESOLUTION;
>  
>  	ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG3, config3);
>  	if (ret)
diff mbox series

Patch

diff --git a/drivers/staging/iio/addac/adt7316.c b/drivers/staging/iio/addac/adt7316.c
index e17c1cb12c94..80cc3420036b 100644
--- a/drivers/staging/iio/addac/adt7316.c
+++ b/drivers/staging/iio/addac/adt7316.c
@@ -633,9 +633,7 @@  static ssize_t adt7316_show_da_high_resolution(struct device *dev,
 	struct adt7316_chip_info *chip = iio_priv(dev_info);
 
 	if (chip->config3 & ADT7316_DA_HIGH_RESOLUTION) {
-		if (chip->id == ID_ADT7316 || chip->id == ID_ADT7516)
-			return sprintf(buf, "1 (12 bits)\n");
-		if (chip->id == ID_ADT7317 || chip->id == ID_ADT7517)
+		if (chip->id != ID_ADT7318 && chip->id != ID_ADT7519)
 			return sprintf(buf, "1 (10 bits)\n");
 	}
 
@@ -652,10 +650,12 @@  static ssize_t adt7316_store_da_high_resolution(struct device *dev,
 	u8 config3;
 	int ret;
 
+	if (chip->id == ID_ADT7318 || chip->id == ID_ADT7519)
+		return -EPERM;
+
+	config3 = chip->config3 & (~ADT7316_DA_HIGH_RESOLUTION);
 	if (buf[0] == '1')
-		config3 = chip->config3 | ADT7316_DA_HIGH_RESOLUTION;
-	else
-		config3 = chip->config3 & (~ADT7316_DA_HIGH_RESOLUTION);
+		config3 |= ADT7316_DA_HIGH_RESOLUTION;
 
 	ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG3, config3);
 	if (ret)