iio: adc: ad7606: Move spi dependent features to spi file
authorBeniamin Bia <beniamin.bia@analog.com>
Thu, 18 Jul 2019 06:27:31 +0000 (09:27 +0300)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sun, 28 Jul 2019 07:53:59 +0000 (08:53 +0100)
Because software mode and register access are only available in spi, they
were moved in spi file and are accessbile via bops structure.
The write_os/scale will be overwritten by sw_mode_config function.
This patch was made in order to support devices in software mode without
making the driver dependent to spi and increase the abstraction of the
core.

Signed-off-by: Beniamin Bia <beniamin.bia@analog.com>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/adc/ad7606.c
drivers/iio/adc/ad7606.h

index a49dc10..9eec3db 100644 (file)
@@ -597,7 +597,7 @@ int ad7606_probe(struct device *dev, int irq, void __iomem *base_address,
        st->write_scale = ad7606_write_scale_hw;
        st->write_os = ad7606_write_os_hw;
 
-       if (st->chip_info->sw_mode_config)
+       if (st->bops->sw_mode_config)
                st->sw_mode_en = device_property_present(st->dev,
                                                         "adi,sw-mode");
 
@@ -606,23 +606,7 @@ int ad7606_probe(struct device *dev, int irq, void __iomem *base_address,
                memset32(st->range, 2, ARRAY_SIZE(st->range));
                indio_dev->info = &ad7606_info_os_and_range;
 
-               /*
-                * In software mode, the range gpio has no longer its function.
-                * Instead, the scale can be configured individually for each
-                * channel from the range registers.
-                */
-               if (st->chip_info->write_scale_sw)
-                       st->write_scale = st->chip_info->write_scale_sw;
-
-               /*
-                * In software mode, the oversampling is no longer configured
-                * with GPIO pins. Instead, the oversampling can be configured
-                * in configuratiion register.
-                */
-               if (st->chip_info->write_os_sw)
-                       st->write_os = st->chip_info->write_os_sw;
-
-               ret = st->chip_info->sw_mode_config(indio_dev);
+               ret = st->bops->sw_mode_config(indio_dev);
                if (ret < 0)
                        return ret;
        }
index d547e88..a6aac33 100644 (file)
  *                     oversampling ratios.
  * @oversampling_num   number of elements stored in oversampling_avail array
  * @os_req_reset       some devices require a reset to update oversampling
- * @write_scale_sw     pointer to the function which writes the scale via spi
-                       in software mode
- * @write_os_sw                pointer to the function which writes the os via spi
-                       in software mode
- * @sw_mode_config:    pointer to a function which configured the device
- *                     for software mode
  */
 struct ad7606_chip_info {
        const struct iio_chan_spec      *channels;
@@ -52,9 +46,6 @@ struct ad7606_chip_info {
        const unsigned int              *oversampling_avail;
        unsigned int                    oversampling_num;
        bool                            os_req_reset;
-       int (*write_scale_sw)(struct iio_dev *indio_dev, int ch, int val);
-       int (*write_os_sw)(struct iio_dev *indio_dev, int val);
-       int (*sw_mode_config)(struct iio_dev *indio_dev);
 };
 
 /**
@@ -124,10 +115,13 @@ struct ad7606_state {
 /**
  * struct ad7606_bus_ops - driver bus operations
  * @read_block         function pointer for reading blocks of data
+ * @sw_mode_config:    pointer to a function which configured the device
+ *                     for software mode
  */
 struct ad7606_bus_ops {
        /* more methods added in future? */
        int (*read_block)(struct device *dev, int num, void *data);
+       int (*sw_mode_config)(struct iio_dev *indio_dev);
 };
 
 int ad7606_probe(struct device *dev, int irq, void __iomem *base_address,