linux/drivers/iio/adc/max1241.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * MAX1241 low-power, 12-bit serial ADC
   4 *
   5 * Datasheet: https://datasheets.maximintegrated.com/en/ds/MAX1240-MAX1241.pdf
   6 */
   7
   8#include <linux/delay.h>
   9#include <linux/gpio/consumer.h>
  10#include <linux/iio/iio.h>
  11#include <linux/module.h>
  12#include <linux/regulator/consumer.h>
  13#include <linux/spi/spi.h>
  14
  15#define MAX1241_VAL_MASK GENMASK(11, 0)
  16#define MAX1241_SHUTDOWN_DELAY_USEC 4
  17
  18enum max1241_id {
  19        max1241,
  20};
  21
  22struct max1241 {
  23        struct spi_device *spi;
  24        struct mutex lock;
  25        struct regulator *vdd;
  26        struct regulator *vref;
  27        struct gpio_desc *shutdown;
  28
  29        __be16 data ____cacheline_aligned;
  30};
  31
  32static const struct iio_chan_spec max1241_channels[] = {
  33        {
  34                .type = IIO_VOLTAGE,
  35                .indexed = 1,
  36                .channel = 0,
  37                .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
  38                                BIT(IIO_CHAN_INFO_SCALE),
  39        },
  40};
  41
  42static int max1241_read(struct max1241 *adc)
  43{
  44        struct spi_transfer xfers[] = {
  45                /*
  46                 * Begin conversion by bringing /CS low for at least
  47                 * tconv us.
  48                 */
  49                {
  50                        .len = 0,
  51                        .delay.value = 8,
  52                        .delay.unit = SPI_DELAY_UNIT_USECS,
  53                },
  54                /*
  55                 * Then read two bytes of data in our RX buffer.
  56                 */
  57                {
  58                        .rx_buf = &adc->data,
  59                        .len = 2,
  60                },
  61        };
  62
  63        return spi_sync_transfer(adc->spi, xfers, ARRAY_SIZE(xfers));
  64}
  65
  66static int max1241_read_raw(struct iio_dev *indio_dev,
  67                        struct iio_chan_spec const *chan,
  68                        int *val, int *val2, long mask)
  69{
  70        int ret, vref_uV;
  71        struct max1241 *adc = iio_priv(indio_dev);
  72
  73        switch (mask) {
  74        case IIO_CHAN_INFO_RAW:
  75                mutex_lock(&adc->lock);
  76
  77                if (adc->shutdown) {
  78                        gpiod_set_value(adc->shutdown, 0);
  79                        udelay(MAX1241_SHUTDOWN_DELAY_USEC);
  80                        ret = max1241_read(adc);
  81                        gpiod_set_value(adc->shutdown, 1);
  82                } else
  83                        ret = max1241_read(adc);
  84
  85                if (ret) {
  86                        mutex_unlock(&adc->lock);
  87                        return ret;
  88                }
  89
  90                *val = (be16_to_cpu(adc->data) >> 3) & MAX1241_VAL_MASK;
  91
  92                mutex_unlock(&adc->lock);
  93                return IIO_VAL_INT;
  94        case IIO_CHAN_INFO_SCALE:
  95                vref_uV = regulator_get_voltage(adc->vref);
  96
  97                if (vref_uV < 0)
  98                        return vref_uV;
  99
 100                *val = vref_uV / 1000;
 101                *val2 = 12;
 102
 103                return IIO_VAL_FRACTIONAL_LOG2;
 104        default:
 105                return -EINVAL;
 106        }
 107}
 108
 109static const struct iio_info max1241_info = {
 110        .read_raw = max1241_read_raw,
 111};
 112
 113static void max1241_disable_vdd_action(void *data)
 114{
 115        struct max1241 *adc = data;
 116        struct device *dev = &adc->spi->dev;
 117        int err;
 118
 119        err = regulator_disable(adc->vdd);
 120        if (err)
 121                dev_err(dev, "could not disable vdd regulator.\n");
 122}
 123
 124static void max1241_disable_vref_action(void *data)
 125{
 126        struct max1241 *adc = data;
 127        struct device *dev = &adc->spi->dev;
 128        int err;
 129
 130        err = regulator_disable(adc->vref);
 131        if (err)
 132                dev_err(dev, "could not disable vref regulator.\n");
 133}
 134
 135static int max1241_probe(struct spi_device *spi)
 136{
 137        struct device *dev = &spi->dev;
 138        struct iio_dev *indio_dev;
 139        struct max1241 *adc;
 140        int ret;
 141
 142        indio_dev = devm_iio_device_alloc(dev, sizeof(*adc));
 143        if (!indio_dev)
 144                return -ENOMEM;
 145
 146        adc = iio_priv(indio_dev);
 147        adc->spi = spi;
 148        mutex_init(&adc->lock);
 149
 150        adc->vdd = devm_regulator_get(dev, "vdd");
 151        if (IS_ERR(adc->vdd)) {
 152                dev_err(dev, "failed to get vdd regulator\n");
 153                return PTR_ERR(adc->vdd);
 154        }
 155
 156        ret = regulator_enable(adc->vdd);
 157        if (ret)
 158                return ret;
 159
 160        ret = devm_add_action_or_reset(dev, max1241_disable_vdd_action, adc);
 161        if (ret) {
 162                dev_err(dev, "could not set up vdd regulator cleanup action\n");
 163                return ret;
 164        }
 165
 166        adc->vref = devm_regulator_get(dev, "vref");
 167        if (IS_ERR(adc->vref)) {
 168                dev_err(dev, "failed to get vref regulator\n");
 169                return PTR_ERR(adc->vref);
 170        }
 171
 172        ret = regulator_enable(adc->vref);
 173        if (ret)
 174                return ret;
 175
 176        ret = devm_add_action_or_reset(dev, max1241_disable_vref_action, adc);
 177        if (ret) {
 178                dev_err(dev, "could not set up vref regulator cleanup action\n");
 179                return ret;
 180        }
 181
 182        adc->shutdown = devm_gpiod_get_optional(dev, "shutdown",
 183                                                GPIOD_OUT_HIGH);
 184        if (IS_ERR(adc->shutdown))
 185                return PTR_ERR(adc->shutdown);
 186
 187        if (adc->shutdown)
 188                dev_dbg(dev, "shutdown pin passed, low-power mode enabled");
 189        else
 190                dev_dbg(dev, "no shutdown pin passed, low-power mode disabled");
 191
 192        indio_dev->name = spi_get_device_id(spi)->name;
 193        indio_dev->info = &max1241_info;
 194        indio_dev->modes = INDIO_DIRECT_MODE;
 195        indio_dev->channels = max1241_channels;
 196        indio_dev->num_channels = ARRAY_SIZE(max1241_channels);
 197
 198        return devm_iio_device_register(dev, indio_dev);
 199}
 200
 201static const struct spi_device_id max1241_id[] = {
 202        { "max1241", max1241 },
 203        {}
 204};
 205
 206static const struct of_device_id max1241_dt_ids[] = {
 207        { .compatible = "maxim,max1241" },
 208        {}
 209};
 210MODULE_DEVICE_TABLE(of, max1241_dt_ids);
 211
 212static struct spi_driver max1241_spi_driver = {
 213        .driver = {
 214                .name = "max1241",
 215                .of_match_table = max1241_dt_ids,
 216        },
 217        .probe = max1241_probe,
 218        .id_table = max1241_id,
 219};
 220module_spi_driver(max1241_spi_driver);
 221
 222MODULE_AUTHOR("Alexandru Lazar <alazar@startmail.com>");
 223MODULE_DESCRIPTION("MAX1241 ADC driver");
 224MODULE_LICENSE("GPL v2");
 225