diff --git a/drivers/iio/adc/rockchip_saradc.c b/drivers/iio/adc/rockchip_saradc.c index 9bceab71b565..5afaa7664ad1 100644 --- a/drivers/iio/adc/rockchip_saradc.c +++ b/drivers/iio/adc/rockchip_saradc.c @@ -71,6 +71,7 @@ struct rockchip_saradc { const struct rockchip_saradc_data *data; u16 last_val; const struct iio_chan_spec *last_chan; + bool suspended; #ifdef CONFIG_ROCKCHIP_SARADC_TEST_CHN struct timer_list timer; bool test; @@ -168,6 +169,11 @@ static int rockchip_saradc_read_raw(struct iio_dev *indio_dev, case IIO_CHAN_INFO_RAW: mutex_lock(&indio_dev->mlock); + if (info->suspended) { + mutex_unlock(&indio_dev->mlock); + return -EBUSY; + } + ret = rockchip_saradc_conversion(info, chan); if (ret) { rockchip_saradc_power_down(info); @@ -658,10 +664,16 @@ static int rockchip_saradc_suspend(struct device *dev) struct iio_dev *indio_dev = dev_get_drvdata(dev); struct rockchip_saradc *info = iio_priv(indio_dev); + /* Avoid reading saradc when suspending */ + mutex_lock(&indio_dev->mlock); + clk_disable_unprepare(info->clk); clk_disable_unprepare(info->pclk); regulator_disable(info->vref); + info->suspended = true; + mutex_unlock(&indio_dev->mlock); + return 0; } @@ -683,6 +695,8 @@ static int rockchip_saradc_resume(struct device *dev) if (ret) clk_disable_unprepare(info->pclk); + info->suspended = false; + return ret; } #endif