iio: adc: ad7606: Move spi dependent features to spi file
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>
This commit is contained in:
parent
7677f73158
commit
a0c648c07c
|
@ -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_scale = ad7606_write_scale_hw;
|
||||||
st->write_os = ad7606_write_os_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,
|
st->sw_mode_en = device_property_present(st->dev,
|
||||||
"adi,sw-mode");
|
"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));
|
memset32(st->range, 2, ARRAY_SIZE(st->range));
|
||||||
indio_dev->info = &ad7606_info_os_and_range;
|
indio_dev->info = &ad7606_info_os_and_range;
|
||||||
|
|
||||||
/*
|
ret = st->bops->sw_mode_config(indio_dev);
|
||||||
* 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);
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,12 +39,6 @@
|
||||||
* oversampling ratios.
|
* oversampling ratios.
|
||||||
* @oversampling_num number of elements stored in oversampling_avail array
|
* @oversampling_num number of elements stored in oversampling_avail array
|
||||||
* @os_req_reset some devices require a reset to update oversampling
|
* @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 {
|
struct ad7606_chip_info {
|
||||||
const struct iio_chan_spec *channels;
|
const struct iio_chan_spec *channels;
|
||||||
|
@ -52,9 +46,6 @@ struct ad7606_chip_info {
|
||||||
const unsigned int *oversampling_avail;
|
const unsigned int *oversampling_avail;
|
||||||
unsigned int oversampling_num;
|
unsigned int oversampling_num;
|
||||||
bool os_req_reset;
|
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
|
* struct ad7606_bus_ops - driver bus operations
|
||||||
* @read_block function pointer for reading blocks of data
|
* @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 {
|
struct ad7606_bus_ops {
|
||||||
/* more methods added in future? */
|
/* more methods added in future? */
|
||||||
int (*read_block)(struct device *dev, int num, void *data);
|
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,
|
int ad7606_probe(struct device *dev, int irq, void __iomem *base_address,
|
||||||
|
|
Loading…
Reference in New Issue