APPLIED: [SRU][B][PATCH] UBUNTU: SAUCE: iio: humidity: hts221: Fix sensor reads after resume

Khaled Elmously khalid.elmously at canonical.com
Wed Mar 11 04:50:40 UTC 2020


On 2020-02-18 18:28:05 , Shrirang Bagul wrote:
> BugLink: https://bugs.launchpad.net/bugs/1863732
> 
> AV_CONF register (RH & TEMP. oversampling ratio's) and CTRL1 register
> (ODR & BDU settings) values are lost after suspend.
> 
> While the change in AV_CONF updates the sensor resolution modes
> (overriding the user configuration before the device went to suspend);
> loss of the contents of the CTRL1 register leads to failure in reading
> sensor output.
> 
> This patch restores the AV_CONF & CTRL1 registers after resume.
> 
> Already submitted upstream for both 4.17.y and 4.14.y (LTS) and under
> review:
> 4.17.y: https://marc.info/?t=152455871600007&r=1&w=2
> 4.14.y: https://marc.info/?t=152506242000001&r=1&w=2
> 
> However, the issue is only affecting the Dell GW and not ST micro devel. boards.
> 
> Fixes: ffebe74b7c95 (iio: humidity: hts221: avoid useless ODR reconfiguration)
> 
> linux-oem buglink: https://bugs.launchpad.net/bugs/1769658
> 
> Signed-off-by: Shrirang Bagul <shrirang.bagul at canonical.com>
> ---
>  drivers/iio/humidity/hts221_core.c | 31 ++++++++++++++++++++++++++++--
>  1 file changed, 29 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/iio/humidity/hts221_core.c b/drivers/iio/humidity/hts221_core.c
> index daef177219b6..7d24e3d8fbdf 100644
> --- a/drivers/iio/humidity/hts221_core.c
> +++ b/drivers/iio/humidity/hts221_core.c
> @@ -671,13 +671,40 @@ static int __maybe_unused hts221_resume(struct device *dev)
>  {
>  	struct iio_dev *iio_dev = dev_get_drvdata(dev);
>  	struct hts221_hw *hw = iio_priv(iio_dev);
> +	const struct hts221_avg *avg;
> +	u8 data, idx;
>  	int err = 0;
>  
> +	/* Restore contents of AV_CONF (RH & TEMP. oversampling ratio's) */
> +	avg = &hts221_avg_list[HTS221_SENSOR_H];
> +	idx = hw->sensors[HTS221_SENSOR_H].cur_avg_idx;
> +	data = avg->avg_avl[idx];
> +	err = hts221_update_avg(hw, HTS221_SENSOR_H, data);
> +	if (err < 0)
> +		goto fail_err;
> +
> +	avg = &hts221_avg_list[HTS221_SENSOR_T];
> +	idx = hw->sensors[HTS221_SENSOR_T].cur_avg_idx;
> +	data = avg->avg_avl[idx];
> +	err = hts221_update_avg(hw, HTS221_SENSOR_T, data);
> +	if (err < 0)
> +		goto fail_err;
> +
> +	/* Restore contents of CTRL1 (BDU & ODR) */
> +	err = hts221_write_with_mask(hw, HTS221_REG_CNTRL1_ADDR,
> +				     HTS221_BDU_MASK, 1);
> +	if (err < 0)
> +		goto fail_err;
> +
> +	err = hts221_update_odr(hw, hw->odr);
> +	if (err < 0)
> +		goto fail_err;
> +
>  	if (hw->enabled)
>  		err = hts221_write_with_mask(hw, HTS221_REG_CNTRL1_ADDR,
>  					     HTS221_ENABLE_MASK, true);
> -
> -	return err;
> +fail_err:
> +	return err < 0 ? err : 0;
>  }
>  
>  const struct dev_pm_ops hts221_pm_ops = {
> -- 
> 2.17.1
> 
> 
> -- 
> kernel-team mailing list
> kernel-team at lists.ubuntu.com
> https://lists.ubuntu.com/mailman/listinfo/kernel-team



More information about the kernel-team mailing list