Merge tag 'kbuild-v5.2' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy...
[linux-2.6-microblaze.git] / drivers / iio / adc / ad_sigma_delta.c
index 54d9978..a431060 100644 (file)
@@ -62,7 +62,7 @@ int ad_sd_write_reg(struct ad_sigma_delta *sigma_delta, unsigned int reg,
        struct spi_transfer t = {
                .tx_buf         = data,
                .len            = size + 1,
-               .cs_change      = sigma_delta->bus_locked,
+               .cs_change      = sigma_delta->keep_cs_asserted,
        };
        struct spi_message m;
        int ret;
@@ -218,6 +218,7 @@ static int ad_sd_calibrate(struct ad_sigma_delta *sigma_delta,
 
        spi_bus_lock(sigma_delta->spi->master);
        sigma_delta->bus_locked = true;
+       sigma_delta->keep_cs_asserted = true;
        reinit_completion(&sigma_delta->completion);
 
        ret = ad_sigma_delta_set_mode(sigma_delta, mode);
@@ -235,9 +236,10 @@ static int ad_sd_calibrate(struct ad_sigma_delta *sigma_delta,
                ret = 0;
        }
 out:
+       sigma_delta->keep_cs_asserted = false;
+       ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_IDLE);
        sigma_delta->bus_locked = false;
        spi_bus_unlock(sigma_delta->spi->master);
-       ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_IDLE);
 
        return ret;
 }
@@ -290,6 +292,7 @@ int ad_sigma_delta_single_conversion(struct iio_dev *indio_dev,
 
        spi_bus_lock(sigma_delta->spi->master);
        sigma_delta->bus_locked = true;
+       sigma_delta->keep_cs_asserted = true;
        reinit_completion(&sigma_delta->completion);
 
        ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_SINGLE);
@@ -299,9 +302,6 @@ int ad_sigma_delta_single_conversion(struct iio_dev *indio_dev,
        ret = wait_for_completion_interruptible_timeout(
                        &sigma_delta->completion, HZ);
 
-       sigma_delta->bus_locked = false;
-       spi_bus_unlock(sigma_delta->spi->master);
-
        if (ret == 0)
                ret = -EIO;
        if (ret < 0)
@@ -322,7 +322,10 @@ out:
                sigma_delta->irq_dis = true;
        }
 
+       sigma_delta->keep_cs_asserted = false;
        ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_IDLE);
+       sigma_delta->bus_locked = false;
+       spi_bus_unlock(sigma_delta->spi->master);
        mutex_unlock(&indio_dev->mlock);
 
        if (ret)
@@ -359,6 +362,8 @@ static int ad_sd_buffer_postenable(struct iio_dev *indio_dev)
 
        spi_bus_lock(sigma_delta->spi->master);
        sigma_delta->bus_locked = true;
+       sigma_delta->keep_cs_asserted = true;
+
        ret = ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_CONTINUOUS);
        if (ret)
                goto err_unlock;
@@ -387,6 +392,7 @@ static int ad_sd_buffer_postdisable(struct iio_dev *indio_dev)
                sigma_delta->irq_dis = true;
        }
 
+       sigma_delta->keep_cs_asserted = false;
        ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_IDLE);
 
        sigma_delta->bus_locked = false;