iio: adc: at91-sama5d2_adc: disable/prepare buffer on suspend/resume
authorClaudiu Beznea <claudiu.beznea@microchip.com>
Wed, 3 Aug 2022 10:28:40 +0000 (13:28 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 26 Oct 2022 10:35:02 +0000 (12:35 +0200)
[ Upstream commit 808175e21d9b7f866eda742e8970f27b78afe5db ]

In case triggered buffers are enabled while system is suspended they will
not work anymore after resume. For this call at91_adc_buffer_postdisable()
on suspend and at91_adc_buffer_prepare() on resume. On tests it has been
seen that at91_adc_buffer_postdisable() call is not necessary but it has
been kept because it also does the book keeping for DMA. On resume path
there is no need to call at91_adc_configure_touch() as it is embedded in
at91_adc_buffer_prepare().

Fixes: 073c662017f2f ("iio: adc: at91-sama5d2_adc: add support for DMA")
Signed-off-by: Claudiu Beznea <claudiu.beznea@microchip.com>
Link: https://lore.kernel.org/r/20220803102855.2191070-5-claudiu.beznea@microchip.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/iio/adc/at91-sama5d2_adc.c

index 9cd6a77..403a29e 100644 (file)
@@ -1903,6 +1903,9 @@ static __maybe_unused int at91_adc_suspend(struct device *dev)
        struct iio_dev *indio_dev = dev_get_drvdata(dev);
        struct at91_adc_state *st = iio_priv(indio_dev);
 
+       if (iio_buffer_enabled(indio_dev))
+               at91_adc_buffer_postdisable(indio_dev);
+
        /*
         * Do a sofware reset of the ADC before we go to suspend.
         * this will ensure that all pins are free from being muxed by the ADC
@@ -1946,14 +1949,11 @@ static __maybe_unused int at91_adc_resume(struct device *dev)
        if (!iio_buffer_enabled(indio_dev))
                return 0;
 
-       /* check if we are enabling triggered buffer or the touchscreen */
-       if (at91_adc_current_chan_is_touch(indio_dev))
-               return at91_adc_configure_touch(st, true);
-       else
-               return at91_adc_configure_trigger(st->trig, true);
+       ret = at91_adc_buffer_prepare(indio_dev);
+       if (ret)
+               goto vref_disable_resume;
 
-       /* not needed but more explicit */
-       return 0;
+       return at91_adc_configure_trigger(st->trig, true);
 
 vref_disable_resume:
        regulator_disable(st->vref);