iio: imu: adis_buffer: split trigger handling
authorNuno Sa <nuno.sa@analog.com>
Tue, 18 Jun 2024 13:32:04 +0000 (15:32 +0200)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Tue, 25 Jun 2024 20:04:49 +0000 (21:04 +0100)
Split trigger handling for devices that have paging and need to
select the correct page to get the data. Although this actually
introduces more LOC, it makes the code and the locking clear. It will
also make the following move to the cleanup magic cleaner.

Signed-off-by: Nuno Sa <nuno.sa@analog.com>
Link: https://patch.msgid.link/20240618-dev-iio-adis-cleanup-v1-1-bd93ce7845c7@analog.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/imu/adis_buffer.c

index 871b78b225e253dfcafa761a16bdc87cde0806fd..5bde698cce1898fae96448f52fe805c12b904c16 100644 (file)
@@ -126,32 +126,41 @@ int adis_update_scan_mode(struct iio_dev *indio_dev,
 }
 EXPORT_SYMBOL_NS_GPL(adis_update_scan_mode, IIO_ADISLIB);
 
-static irqreturn_t adis_trigger_handler(int irq, void *p)
+static int adis_paging_trigger_handler(struct adis *adis)
 {
-       struct iio_poll_func *pf = p;
-       struct iio_dev *indio_dev = pf->indio_dev;
-       struct adis *adis = iio_device_get_drvdata(indio_dev);
        int ret;
 
-       if (adis->data->has_paging) {
-               mutex_lock(&adis->state_lock);
-               if (adis->current_page != 0) {
-                       adis->tx[0] = ADIS_WRITE_REG(ADIS_REG_PAGE_ID);
-                       adis->tx[1] = 0;
-                       ret = spi_write(adis->spi, adis->tx, 2);
-                       if (ret) {
-                               dev_err(&adis->spi->dev, "Failed to change device page: %d\n", ret);
-                               mutex_unlock(&adis->state_lock);
-                               goto irq_done;
-                       }
-
-                       adis->current_page = 0;
+       mutex_lock(&adis->state_lock);
+       if (adis->current_page != 0) {
+               adis->tx[0] = ADIS_WRITE_REG(ADIS_REG_PAGE_ID);
+               adis->tx[1] = 0;
+               ret = spi_write(adis->spi, adis->tx, 2);
+               if (ret) {
+                       dev_err(&adis->spi->dev, "Failed to change device page: %d\n", ret);
+                       mutex_unlock(&adis->state_lock);
+                       return ret;
                }
+
+               adis->current_page = 0;
        }
 
        ret = spi_sync(adis->spi, &adis->msg);
+       mutex_unlock(&adis->state_lock);
+
+       return ret;
+}
+
+static irqreturn_t adis_trigger_handler(int irq, void *p)
+{
+       struct iio_poll_func *pf = p;
+       struct iio_dev *indio_dev = pf->indio_dev;
+       struct adis *adis = iio_device_get_drvdata(indio_dev);
+       int ret;
+
        if (adis->data->has_paging)
-               mutex_unlock(&adis->state_lock);
+               ret = adis_paging_trigger_handler(adis);
+       else
+               ret = spi_sync(adis->spi, &adis->msg);
        if (ret) {
                dev_err(&adis->spi->dev, "Failed to read data: %d", ret);
                goto irq_done;