On Thu, 18 Jul 2019 09:27:31 +0300 Beniamin Bia <beniamin.bia@xxxxxxxxxx> wrote: > 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@xxxxxxxxxx> > Acked-by: Jonathan Cameron <jic23@xxxxxxxxxx> Applied. thanks, Jonathan > --- > Changes in v2: > -nothing changed > > drivers/iio/adc/ad7606.c | 20 ++------------------ > drivers/iio/adc/ad7606.h | 12 +++--------- > 2 files changed, 5 insertions(+), 27 deletions(-) > > diff --git a/drivers/iio/adc/ad7606.c b/drivers/iio/adc/ad7606.c > index a49dc106a21c..9eec3db01a17 100644 > --- a/drivers/iio/adc/ad7606.c > +++ b/drivers/iio/adc/ad7606.c > @@ -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; > } > diff --git a/drivers/iio/adc/ad7606.h b/drivers/iio/adc/ad7606.h > index d547e88f4c9d..a6aac33aa33c 100644 > --- a/drivers/iio/adc/ad7606.h > +++ b/drivers/iio/adc/ad7606.h > @@ -39,12 +39,6 @@ > * 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,