]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
iio: dln2-adc: fix iio_triggered_buffer_postenable() position
authorAlexandru Ardelean <alexandru.ardelean@analog.com>
Wed, 23 Oct 2019 08:26:34 +0000 (11:26 +0300)
committerKhalid Elmously <khalid.elmously@canonical.com>
Wed, 29 Jan 2020 04:45:21 +0000 (23:45 -0500)
BugLink: https://bugs.launchpad.net/bugs/1859712
[ Upstream commit a7bddfe2dfce1d8859422124abe1964e0ecd386e ]

The iio_triggered_buffer_postenable() hook should be called first to
attach the poll function. The iio_triggered_buffer_predisable() hook is
called last (as is it should).

This change moves iio_triggered_buffer_postenable() to be called first. It
adds iio_triggered_buffer_predisable() on the error paths of the postenable
hook.
For the predisable hook, some code-paths have been changed to make sure
that the iio_triggered_buffer_predisable() hook gets called in case there
is an error before it.

Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Khalid Elmously <khalid.elmously@canonical.com>
drivers/iio/adc/dln2-adc.c

index c64c6675cae6005a8634a1346ccb74d2cbed2ded..4ab052d76d9f521570de6f58eca99ae0bbfb684d 100644 (file)
@@ -527,6 +527,10 @@ static int dln2_adc_triggered_buffer_postenable(struct iio_dev *indio_dev)
        u16 conflict;
        unsigned int trigger_chan;
 
+       ret = iio_triggered_buffer_postenable(indio_dev);
+       if (ret)
+               return ret;
+
        mutex_lock(&dln2->mutex);
 
        /* Enable ADC */
@@ -540,6 +544,7 @@ static int dln2_adc_triggered_buffer_postenable(struct iio_dev *indio_dev)
                                (int)conflict);
                        ret = -EBUSY;
                }
+               iio_triggered_buffer_predisable(indio_dev);
                return ret;
        }
 
@@ -553,6 +558,7 @@ static int dln2_adc_triggered_buffer_postenable(struct iio_dev *indio_dev)
                mutex_unlock(&dln2->mutex);
                if (ret < 0) {
                        dev_dbg(&dln2->pdev->dev, "Problem in %s\n", __func__);
+                       iio_triggered_buffer_predisable(indio_dev);
                        return ret;
                }
        } else {
@@ -560,12 +566,12 @@ static int dln2_adc_triggered_buffer_postenable(struct iio_dev *indio_dev)
                mutex_unlock(&dln2->mutex);
        }
 
-       return iio_triggered_buffer_postenable(indio_dev);
+       return 0;
 }
 
 static int dln2_adc_triggered_buffer_predisable(struct iio_dev *indio_dev)
 {
-       int ret;
+       int ret, ret2;
        struct dln2_adc *dln2 = iio_priv(indio_dev);
 
        mutex_lock(&dln2->mutex);
@@ -580,12 +586,14 @@ static int dln2_adc_triggered_buffer_predisable(struct iio_dev *indio_dev)
        ret = dln2_adc_set_port_enabled(dln2, false, NULL);
 
        mutex_unlock(&dln2->mutex);
-       if (ret < 0) {
+       if (ret < 0)
                dev_dbg(&dln2->pdev->dev, "Problem in %s\n", __func__);
-               return ret;
-       }
 
-       return iio_triggered_buffer_predisable(indio_dev);
+       ret2 = iio_triggered_buffer_predisable(indio_dev);
+       if (ret == 0)
+               ret = ret2;
+
+       return ret;
 }
 
 static const struct iio_buffer_setup_ops dln2_adc_buffer_setup_ops = {