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 <xxm@rock-chips.com>
This commit is contained in:
Simon Xue
2021-09-18 17:04:49 +08:00
committed by Tao Huang
parent 55e6dba6c1
commit 2001f161f2

View File

@@ -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