]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
iio: dac: ad5686: create bus ops struct
authorRodrigo Alencar <rodrigo.alencar@analog.com>
Sun, 24 May 2026 10:17:08 +0000 (11:17 +0100)
committerJonathan Cameron <jic23@kernel.org>
Tue, 2 Jun 2026 14:24:48 +0000 (15:24 +0100)
Create struct with bus operations, which will be used to extend bus
implementation features. Auxiliary functions ad5686_write() and
ad5686_read() are created and ad5686_probe() now receives an ops struct
pointer rather than individual read and write functions.

Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com>
Signed-off-by: Rodrigo Alencar <rodrigo.alencar@analog.com>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
drivers/iio/dac/ad5686-spi.c
drivers/iio/dac/ad5686.c
drivers/iio/dac/ad5686.h
drivers/iio/dac/ad5696-i2c.c

index 7eddffe86c00bf449a308d2f622b0d37f80107e6..6b6ef1d7071fe8ee81078cb2b9d5627a1a5c4b46 100644 (file)
@@ -92,10 +92,15 @@ static int ad5686_spi_read(struct ad5686_state *st, u8 addr)
        return be32_to_cpu(st->data[2].d32);
 }
 
+static const struct ad5686_bus_ops ad5686_spi_ops = {
+       .write = ad5686_spi_write,
+       .read = ad5686_spi_read,
+};
+
 static int ad5686_spi_probe(struct spi_device *spi)
 {
        return ad5686_probe(&spi->dev, spi_get_device_match_data(spi),
-                           spi->modalias, ad5686_spi_write, ad5686_spi_read);
+                           spi->modalias, &ad5686_spi_ops);
 }
 
 static const struct spi_device_id ad5686_spi_id[] = {
index 86bc944a1acd9b8c8507cd9b562617b6e09e4174..5840fda4b0118e01b45edc597dd42bb0c6f3da52 100644 (file)
@@ -30,18 +30,18 @@ static int ad5310_control_sync(struct ad5686_state *st)
 {
        unsigned int pd_val = st->pwr_down_mask & st->pwr_down_mode;
 
-       return st->write(st, AD5686_CMD_CONTROL_REG, 0,
-                        FIELD_PREP(AD5310_PD_MSK, pd_val & AD5686_PD_MSK) |
-                        FIELD_PREP(AD5310_REF_BIT_MSK, st->use_internal_vref ? 0 : 1));
+       return ad5686_write(st, AD5686_CMD_CONTROL_REG, 0,
+                           FIELD_PREP(AD5310_PD_MSK, pd_val & AD5686_PD_MSK) |
+                           FIELD_PREP(AD5310_REF_BIT_MSK, st->use_internal_vref ? 0 : 1));
 }
 
 static int ad5683_control_sync(struct ad5686_state *st)
 {
        unsigned int pd_val = st->pwr_down_mask & st->pwr_down_mode;
 
-       return st->write(st, AD5686_CMD_CONTROL_REG, 0,
-                        FIELD_PREP(AD5683_PD_MSK, pd_val & AD5686_PD_MSK) |
-                        FIELD_PREP(AD5683_REF_BIT_MSK, st->use_internal_vref ? 0 : 1));
+       return ad5686_write(st, AD5686_CMD_CONTROL_REG, 0,
+                           FIELD_PREP(AD5683_PD_MSK, pd_val & AD5686_PD_MSK) |
+                           FIELD_PREP(AD5683_REF_BIT_MSK, st->use_internal_vref ? 0 : 1));
 }
 
 static inline unsigned int ad5686_pd_mask_shift(const struct iio_chan_spec *chan)
@@ -153,7 +153,7 @@ static ssize_t ad5686_write_dac_powerdown(struct iio_dev *indio_dev,
                        address = 0x0;
                        val = lower_16_bits(val);
                }
-               ret = st->write(st, AD5686_CMD_POWERDOWN_DAC, address, val);
+               ret = ad5686_write(st, AD5686_CMD_POWERDOWN_DAC, address, val);
                if (ret)
                        return ret;
                break;
@@ -176,7 +176,7 @@ static int ad5686_read_raw(struct iio_dev *indio_dev,
        switch (m) {
        case IIO_CHAN_INFO_RAW:
                mutex_lock(&st->lock);
-               ret = st->read(st, chan->address);
+               ret = ad5686_read(st, chan->address);
                mutex_unlock(&st->lock);
                if (ret < 0)
                        return ret;
@@ -206,10 +206,8 @@ static int ad5686_write_raw(struct iio_dev *indio_dev,
                        return -EINVAL;
 
                mutex_lock(&st->lock);
-               ret = st->write(st,
-                               AD5686_CMD_WRITE_INPUT_N_UPDATE_N,
-                               chan->address,
-                               val << chan->scan_type.shift);
+               ret = ad5686_write(st, AD5686_CMD_WRITE_INPUT_N_UPDATE_N,
+                                  chan->address, val << chan->scan_type.shift);
                mutex_unlock(&st->lock);
                break;
        default:
@@ -470,8 +468,7 @@ EXPORT_SYMBOL_NS_GPL(ad5679r_chip_info, "IIO_AD5686");
 
 int ad5686_probe(struct device *dev,
                 const struct ad5686_chip_info *chip_info,
-                const char *name, ad5686_write_func write,
-                ad5686_read_func read)
+                const char *name, const struct ad5686_bus_ops *ops)
 {
        struct ad5686_state *st;
        struct iio_dev *indio_dev;
@@ -484,8 +481,7 @@ int ad5686_probe(struct device *dev,
        st = iio_priv(indio_dev);
 
        st->dev = dev;
-       st->write = write;
-       st->read = read;
+       st->ops = ops;
        st->chip_info = chip_info;
 
        ret = devm_regulator_get_enable_read_voltage(dev, "vcc");
@@ -529,8 +525,8 @@ int ad5686_probe(struct device *dev,
                        return ret;
                break;
        case AD5686_REGMAP:
-               ret = st->write(st, AD5686_CMD_INTERNAL_REFER_SETUP, 0,
-                               st->use_internal_vref ? 0 : AD5686_REF_BIT_MSK);
+               ret = ad5686_write(st, AD5686_CMD_INTERNAL_REFER_SETUP, 0,
+                                  st->use_internal_vref ? 0 : AD5686_REF_BIT_MSK);
                if (ret)
                        return ret;
                break;
index 3945f5fb6b7e251f79712d475e6ab315b66c39c1..a06fe7d893057ed58358ce816075f56615980fa2 100644 (file)
@@ -62,10 +62,15 @@ enum ad5686_regmap_type {
 
 struct ad5686_state;
 
-typedef int (*ad5686_write_func)(struct ad5686_state *st,
-                                u8 cmd, u8 addr, u16 val);
-
-typedef int (*ad5686_read_func)(struct ad5686_state *st, u8 addr);
+/**
+ * struct ad5686_bus_ops - bus specific read/write operations
+ * @read: read a register value at the given address
+ * @write: write a command, address and value to the device
+ */
+struct ad5686_bus_ops {
+       int (*read)(struct ad5686_state *st, u8 addr);
+       int (*write)(struct ad5686_state *st, u8 cmd, u8 addr, u16 val);
+};
 
 /**
  * struct ad5686_chip_info - chip specific information
@@ -113,6 +118,7 @@ extern const struct ad5686_chip_info ad5679r_chip_info;
  * struct ad5686_state - driver instance specific data
  * @dev:               device instance
  * @chip_info:         chip model specific constants, available modes etc
+ * @ops:               bus specific operations
  * @vref_mv:           actual reference voltage used
  * @pwr_down_mask:     power down mask
  * @pwr_down_mode:     current power down mode
@@ -124,11 +130,10 @@ extern const struct ad5686_chip_info ad5679r_chip_info;
 struct ad5686_state {
        struct device                   *dev;
        const struct ad5686_chip_info   *chip_info;
+       const struct ad5686_bus_ops     *ops;
        unsigned short                  vref_mv;
        unsigned int                    pwr_down_mask;
        unsigned int                    pwr_down_mode;
-       ad5686_write_func               write;
-       ad5686_read_func                read;
        bool                            use_internal_vref;
        struct mutex                    lock;
 
@@ -147,8 +152,16 @@ struct ad5686_state {
 
 int ad5686_probe(struct device *dev,
                 const struct ad5686_chip_info *chip_info,
-                const char *name, ad5686_write_func write,
-                ad5686_read_func read);
+                const char *name, const struct ad5686_bus_ops *ops);
+
+static inline int ad5686_write(struct ad5686_state *st, u8 cmd, u8 addr, u16 val)
+{
+       return st->ops->write(st, cmd, addr, val);
+}
 
+static inline int ad5686_read(struct ad5686_state *st, u8 addr)
+{
+       return st->ops->read(st, addr);
+}
 
 #endif /* __DRIVERS_IIO_DAC_AD5686_H__ */
index c1f3cebabaf809991ac2d758b71b1e7630e5396a..279309329b64b0f7ffecd688dc8576abcbb8e19c 100644 (file)
@@ -62,10 +62,15 @@ static int ad5686_i2c_write(struct ad5686_state *st,
        return (ret != 3) ? -EIO : 0;
 }
 
+static const struct ad5686_bus_ops ad5686_i2c_ops = {
+       .write = ad5686_i2c_write,
+       .read = ad5686_i2c_read,
+};
+
 static int ad5686_i2c_probe(struct i2c_client *i2c)
 {
        return ad5686_probe(&i2c->dev, i2c_get_match_data(i2c),
-                           i2c->name, ad5686_i2c_write, ad5686_i2c_read);
+                           i2c->name, &ad5686_i2c_ops);
 }
 
 static const struct i2c_device_id ad5686_i2c_id[] = {