From 2001f161f23edf9c79ce1d6e088a4f66ca48081c Mon Sep 17 00:00:00 2001 From: Simon Xue Date: Sat, 18 Sep 2021 17:04:49 +0800 Subject: [PATCH] iio: adc: rockchip_saradc: fix interrupt issue Saradc interrupt status may exist forever if read saradc when system suspending which disable clock that finally lead to interrupt system dead. Add mutex in suspend to avoid this issue. Change-Id: I6a83e4bd79db90a79985685b5e94df2209b5ae81 Signed-off-by: Simon Xue --- drivers/iio/adc/rockchip_saradc.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/drivers/iio/adc/rockchip_saradc.c b/drivers/iio/adc/rockchip_saradc.c index 4334e33df6c8..02028847aacf 100644 --- a/drivers/iio/adc/rockchip_saradc.c +++ b/drivers/iio/adc/rockchip_saradc.c @@ -59,6 +59,7 @@ struct rockchip_saradc { struct reset_control *reset; const struct rockchip_saradc_data *data; u16 last_val; + bool suspended; #ifdef CONFIG_ROCKCHIP_SARADC_TEST_CHN struct timer_list timer; bool test; @@ -81,6 +82,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; + } + reinit_completion(&info->completion); /* 8 clock periods as delay between power up and start cmd */ @@ -499,10 +505,17 @@ 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; } @@ -524,6 +537,8 @@ static int rockchip_saradc_resume(struct device *dev) if (ret) clk_disable_unprepare(info->pclk); + info->suspended = false; + return ret; } #endif