lkml.org 
[lkml]   [2023]   [Dec]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 07/13] iio: adc: ad7091r: Set device mode through chip_info callback
    Date
    AD7091R-5 devices have a few modes of operation (sample, command,
    autocycle) which are set by writing to configuration register fields.
    Follow up patches will add support for AD7091R-2/-4/-8 which don't have
    those operation modes nor the register fields for setting them.
    Make ad7091r_set_mode() a callback function of AD7091R chip_info struct
    so the base driver can appropriately handle each design without having
    to check which actual chip is connected.

    Signed-off-by: Marcelo Schmitt <marcelo.schmitt@analog.com>
    ---
    drivers/iio/adc/ad7091r-base.c | 38 +---------------------------------
    drivers/iio/adc/ad7091r-base.h | 9 ++++++++
    drivers/iio/adc/ad7091r5.c | 30 +++++++++++++++++++++++++++
    3 files changed, 40 insertions(+), 37 deletions(-)

    diff --git a/drivers/iio/adc/ad7091r-base.c b/drivers/iio/adc/ad7091r-base.c
    index 90470b4a98c5..f2cb638b8d77 100644
    --- a/drivers/iio/adc/ad7091r-base.c
    +++ b/drivers/iio/adc/ad7091r-base.c
    @@ -19,14 +19,6 @@
    #define AD7091R_REG_RESULT_CH_ID(x) (((x) >> 13) & 0x3)
    #define AD7091R_REG_RESULT_CONV_RESULT(x) ((x) & 0xfff)

    -/* AD7091R_REG_CONF */
    -#define AD7091R_REG_CONF_ALERT_EN BIT(4)
    -#define AD7091R_REG_CONF_AUTO BIT(8)
    -#define AD7091R_REG_CONF_CMD BIT(10)
    -
    -#define AD7091R_REG_CONF_MODE_MASK \
    - (AD7091R_REG_CONF_AUTO | AD7091R_REG_CONF_CMD)
    -
    const struct iio_event_spec ad7091r_events[] = {
    {
    .type = IIO_EV_TYPE_THRESH,
    @@ -48,34 +40,6 @@ const struct iio_event_spec ad7091r_events[] = {
    };
    EXPORT_SYMBOL_NS_GPL(ad7091r_events, IIO_AD7091R);

    -static int ad7091r_set_mode(struct ad7091r_state *st, enum ad7091r_mode mode)
    -{
    - int ret, conf;
    -
    - switch (mode) {
    - case AD7091R_MODE_SAMPLE:
    - conf = 0;
    - break;
    - case AD7091R_MODE_COMMAND:
    - conf = AD7091R_REG_CONF_CMD;
    - break;
    - case AD7091R_MODE_AUTOCYCLE:
    - conf = AD7091R_REG_CONF_AUTO;
    - break;
    - default:
    - return -EINVAL;
    - }
    -
    - ret = regmap_update_bits(st->map, AD7091R_REG_CONF,
    - AD7091R_REG_CONF_MODE_MASK, conf);
    - if (ret)
    - return ret;
    -
    - st->mode = mode;
    -
    - return 0;
    -}
    -
    static int ad7091r_set_channel(struct ad7091r_state *st, unsigned int channel)
    {
    unsigned int dummy;
    @@ -265,7 +229,7 @@ int ad7091r_probe(struct device *dev, const char *name,
    }

    /* Use command mode by default to convert only desired channels*/
    - ret = ad7091r_set_mode(st, AD7091R_MODE_COMMAND);
    + ret = st->chip_info->ad7091r_set_mode(st, AD7091R_MODE_COMMAND);
    if (ret)
    return ret;

    diff --git a/drivers/iio/adc/ad7091r-base.h b/drivers/iio/adc/ad7091r-base.h
    index d58e2b08015a..9546d0bf1da7 100644
    --- a/drivers/iio/adc/ad7091r-base.h
    +++ b/drivers/iio/adc/ad7091r-base.h
    @@ -19,6 +19,14 @@
    #define AD7091R_REG_CH_HIGH_LIMIT(ch) ((ch) * 3 + 5)
    #define AD7091R_REG_CH_HYSTERESIS(ch) ((ch) * 3 + 6)

    +/* AD7091R_REG_CONF */
    +#define AD7091R_REG_CONF_ALERT_EN BIT(4)
    +#define AD7091R_REG_CONF_AUTO BIT(8)
    +#define AD7091R_REG_CONF_CMD BIT(10)
    +
    +#define AD7091R_REG_CONF_MODE_MASK \
    + (AD7091R_REG_CONF_AUTO | AD7091R_REG_CONF_CMD)
    +
    #define AD7091R_CHANNEL(idx, bits, ev, num_ev) { \
    .type = IIO_VOLTAGE, \
    .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
    @@ -52,6 +60,7 @@ struct ad7091r_chip_info {
    unsigned int num_channels;
    const struct iio_chan_spec *channels;
    unsigned int vref_mV;
    + int (*ad7091r_set_mode)(struct ad7091r_state *st, enum ad7091r_mode mode);
    };

    struct ad7091r_init_info {
    diff --git a/drivers/iio/adc/ad7091r5.c b/drivers/iio/adc/ad7091r5.c
    index 51aad8df7f3a..ed5e00cc82e2 100644
    --- a/drivers/iio/adc/ad7091r5.c
    +++ b/drivers/iio/adc/ad7091r5.c
    @@ -26,11 +26,40 @@ static const struct iio_chan_spec ad7091r5_channels_noirq[] = {
    AD7091R_CHANNEL(3, 12, NULL, 0),
    };

    +static int ad7091r_set_mode(struct ad7091r_state *st, enum ad7091r_mode mode)
    +{
    + int ret, conf;
    +
    + switch (mode) {
    + case AD7091R_MODE_SAMPLE:
    + conf = 0;
    + break;
    + case AD7091R_MODE_COMMAND:
    + conf = AD7091R_REG_CONF_CMD;
    + break;
    + case AD7091R_MODE_AUTOCYCLE:
    + conf = AD7091R_REG_CONF_AUTO;
    + break;
    + default:
    + return -EINVAL;
    + }
    +
    + ret = regmap_update_bits(st->map, AD7091R_REG_CONF,
    + AD7091R_REG_CONF_MODE_MASK, conf);
    + if (ret)
    + return ret;
    +
    + st->mode = mode;
    +
    + return 0;
    +}
    +
    static const struct ad7091r_chip_info ad7091r5_chip_info_irq = {
    .name = "ad7091r-5",
    .channels = ad7091r5_channels_irq,
    .num_channels = ARRAY_SIZE(ad7091r5_channels_irq),
    .vref_mV = 2500,
    + .ad7091r_set_mode = &ad7091r_set_mode,
    };

    static const struct ad7091r_chip_info ad7091r5_chip_info_noirq = {
    @@ -38,6 +67,7 @@ static const struct ad7091r_chip_info ad7091r5_chip_info_noirq = {
    .channels = ad7091r5_channels_noirq,
    .num_channels = ARRAY_SIZE(ad7091r5_channels_noirq),
    .vref_mV = 2500,
    + .ad7091r_set_mode = &ad7091r_set_mode,
    };

    static const struct regmap_config ad7091r_regmap_config = {
    --
    2.42.0
    \
     
     \ /
      Last update: 2023-12-07 19:43    [W:3.929 / U:0.116 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site