linux/drivers/staging/iio/adc/ad7192.c
<<
>>
Prefs
   1/*
   2 * AD7190 AD7192 AD7193 AD7195 SPI ADC driver
   3 *
   4 * Copyright 2011-2015 Analog Devices Inc.
   5 *
   6 * Licensed under the GPL-2.
   7 */
   8
   9#include <linux/interrupt.h>
  10#include <linux/device.h>
  11#include <linux/kernel.h>
  12#include <linux/slab.h>
  13#include <linux/sysfs.h>
  14#include <linux/spi/spi.h>
  15#include <linux/regulator/consumer.h>
  16#include <linux/err.h>
  17#include <linux/sched.h>
  18#include <linux/delay.h>
  19
  20#include <linux/iio/iio.h>
  21#include <linux/iio/sysfs.h>
  22#include <linux/iio/buffer.h>
  23#include <linux/iio/trigger.h>
  24#include <linux/iio/trigger_consumer.h>
  25#include <linux/iio/triggered_buffer.h>
  26#include <linux/iio/adc/ad_sigma_delta.h>
  27
  28#include "ad7192.h"
  29
  30/* Registers */
  31#define AD7192_REG_COMM         0 /* Communications Register (WO, 8-bit) */
  32#define AD7192_REG_STAT         0 /* Status Register         (RO, 8-bit) */
  33#define AD7192_REG_MODE         1 /* Mode Register           (RW, 24-bit */
  34#define AD7192_REG_CONF         2 /* Configuration Register  (RW, 24-bit) */
  35#define AD7192_REG_DATA         3 /* Data Register           (RO, 24/32-bit) */
  36#define AD7192_REG_ID           4 /* ID Register             (RO, 8-bit) */
  37#define AD7192_REG_GPOCON       5 /* GPOCON Register         (RO, 8-bit) */
  38#define AD7192_REG_OFFSET       6 /* Offset Register         (RW, 16-bit */
  39                                  /* (AD7792)/24-bit (AD7192)) */
  40#define AD7192_REG_FULLSALE     7 /* Full-Scale Register */
  41                                  /* (RW, 16-bit (AD7792)/24-bit (AD7192)) */
  42
  43/* Communications Register Bit Designations (AD7192_REG_COMM) */
  44#define AD7192_COMM_WEN         BIT(7) /* Write Enable */
  45#define AD7192_COMM_WRITE       0 /* Write Operation */
  46#define AD7192_COMM_READ        BIT(6) /* Read Operation */
  47#define AD7192_COMM_ADDR(x)     (((x) & 0x7) << 3) /* Register Address */
  48#define AD7192_COMM_CREAD       BIT(2) /* Continuous Read of Data Register */
  49
  50/* Status Register Bit Designations (AD7192_REG_STAT) */
  51#define AD7192_STAT_RDY         BIT(7) /* Ready */
  52#define AD7192_STAT_ERR         BIT(6) /* Error (Overrange, Underrange) */
  53#define AD7192_STAT_NOREF       BIT(5) /* Error no external reference */
  54#define AD7192_STAT_PARITY      BIT(4) /* Parity */
  55#define AD7192_STAT_CH3         BIT(2) /* Channel 3 */
  56#define AD7192_STAT_CH2         BIT(1) /* Channel 2 */
  57#define AD7192_STAT_CH1         BIT(0) /* Channel 1 */
  58
  59/* Mode Register Bit Designations (AD7192_REG_MODE) */
  60#define AD7192_MODE_SEL(x)      (((x) & 0x7) << 21) /* Operation Mode Select */
  61#define AD7192_MODE_SEL_MASK    (0x7 << 21) /* Operation Mode Select Mask */
  62#define AD7192_MODE_DAT_STA     BIT(20) /* Status Register transmission */
  63#define AD7192_MODE_CLKSRC(x)   (((x) & 0x3) << 18) /* Clock Source Select */
  64#define AD7192_MODE_SINC3       BIT(15) /* SINC3 Filter Select */
  65#define AD7192_MODE_ACX         BIT(14) /* AC excitation enable(AD7195 only)*/
  66#define AD7192_MODE_ENPAR       BIT(13) /* Parity Enable */
  67#define AD7192_MODE_CLKDIV      BIT(12) /* Clock divide by 2 (AD7190/2 only)*/
  68#define AD7192_MODE_SCYCLE      BIT(11) /* Single cycle conversion */
  69#define AD7192_MODE_REJ60       BIT(10) /* 50/60Hz notch filter */
  70#define AD7192_MODE_RATE(x)     ((x) & 0x3FF) /* Filter Update Rate Select */
  71
  72/* Mode Register: AD7192_MODE_SEL options */
  73#define AD7192_MODE_CONT                0 /* Continuous Conversion Mode */
  74#define AD7192_MODE_SINGLE              1 /* Single Conversion Mode */
  75#define AD7192_MODE_IDLE                2 /* Idle Mode */
  76#define AD7192_MODE_PWRDN               3 /* Power-Down Mode */
  77#define AD7192_MODE_CAL_INT_ZERO        4 /* Internal Zero-Scale Calibration */
  78#define AD7192_MODE_CAL_INT_FULL        5 /* Internal Full-Scale Calibration */
  79#define AD7192_MODE_CAL_SYS_ZERO        6 /* System Zero-Scale Calibration */
  80#define AD7192_MODE_CAL_SYS_FULL        7 /* System Full-Scale Calibration */
  81
  82/* Mode Register: AD7192_MODE_CLKSRC options */
  83#define AD7192_CLK_EXT_MCLK1_2          0 /* External 4.92 MHz Clock connected*/
  84                                          /* from MCLK1 to MCLK2 */
  85#define AD7192_CLK_EXT_MCLK2            1 /* External Clock applied to MCLK2 */
  86#define AD7192_CLK_INT                  2 /* Internal 4.92 MHz Clock not */
  87                                          /* available at the MCLK2 pin */
  88#define AD7192_CLK_INT_CO               3 /* Internal 4.92 MHz Clock available*/
  89                                          /* at the MCLK2 pin */
  90
  91/* Configuration Register Bit Designations (AD7192_REG_CONF) */
  92
  93#define AD7192_CONF_CHOP        BIT(23) /* CHOP enable */
  94#define AD7192_CONF_REFSEL      BIT(20) /* REFIN1/REFIN2 Reference Select */
  95#define AD7192_CONF_CHAN(x)     ((x) << 8) /* Channel select */
  96#define AD7192_CONF_CHAN_MASK   (0x7FF << 8) /* Channel select mask */
  97#define AD7192_CONF_BURN        BIT(7) /* Burnout current enable */
  98#define AD7192_CONF_REFDET      BIT(6) /* Reference detect enable */
  99#define AD7192_CONF_BUF         BIT(4) /* Buffered Mode Enable */
 100#define AD7192_CONF_UNIPOLAR    BIT(3) /* Unipolar/Bipolar Enable */
 101#define AD7192_CONF_GAIN(x)     ((x) & 0x7) /* Gain Select */
 102
 103#define AD7192_CH_AIN1P_AIN2M   BIT(0) /* AIN1(+) - AIN2(-) */
 104#define AD7192_CH_AIN3P_AIN4M   BIT(1) /* AIN3(+) - AIN4(-) */
 105#define AD7192_CH_TEMP          BIT(2) /* Temp Sensor */
 106#define AD7192_CH_AIN2P_AIN2M   BIT(3) /* AIN2(+) - AIN2(-) */
 107#define AD7192_CH_AIN1          BIT(4) /* AIN1 - AINCOM */
 108#define AD7192_CH_AIN2          BIT(5) /* AIN2 - AINCOM */
 109#define AD7192_CH_AIN3          BIT(6) /* AIN3 - AINCOM */
 110#define AD7192_CH_AIN4          BIT(7) /* AIN4 - AINCOM */
 111
 112#define AD7193_CH_AIN1P_AIN2M   0x000  /* AIN1(+) - AIN2(-) */
 113#define AD7193_CH_AIN3P_AIN4M   0x001  /* AIN3(+) - AIN4(-) */
 114#define AD7193_CH_AIN5P_AIN6M   0x002  /* AIN5(+) - AIN6(-) */
 115#define AD7193_CH_AIN7P_AIN8M   0x004  /* AIN7(+) - AIN8(-) */
 116#define AD7193_CH_TEMP          0x100 /* Temp senseor */
 117#define AD7193_CH_AIN2P_AIN2M   0x200 /* AIN2(+) - AIN2(-) */
 118#define AD7193_CH_AIN1          0x401 /* AIN1 - AINCOM */
 119#define AD7193_CH_AIN2          0x402 /* AIN2 - AINCOM */
 120#define AD7193_CH_AIN3          0x404 /* AIN3 - AINCOM */
 121#define AD7193_CH_AIN4          0x408 /* AIN4 - AINCOM */
 122#define AD7193_CH_AIN5          0x410 /* AIN5 - AINCOM */
 123#define AD7193_CH_AIN6          0x420 /* AIN6 - AINCOM */
 124#define AD7193_CH_AIN7          0x440 /* AIN7 - AINCOM */
 125#define AD7193_CH_AIN8          0x480 /* AIN7 - AINCOM */
 126#define AD7193_CH_AINCOM        0x600 /* AINCOM - AINCOM */
 127
 128/* ID Register Bit Designations (AD7192_REG_ID) */
 129#define ID_AD7190               0x4
 130#define ID_AD7192               0x0
 131#define ID_AD7193               0x2
 132#define ID_AD7195               0x6
 133#define AD7192_ID_MASK          0x0F
 134
 135/* GPOCON Register Bit Designations (AD7192_REG_GPOCON) */
 136#define AD7192_GPOCON_BPDSW     BIT(6) /* Bridge power-down switch enable */
 137#define AD7192_GPOCON_GP32EN    BIT(5) /* Digital Output P3 and P2 enable */
 138#define AD7192_GPOCON_GP10EN    BIT(4) /* Digital Output P1 and P0 enable */
 139#define AD7192_GPOCON_P3DAT     BIT(3) /* P3 state */
 140#define AD7192_GPOCON_P2DAT     BIT(2) /* P2 state */
 141#define AD7192_GPOCON_P1DAT     BIT(1) /* P1 state */
 142#define AD7192_GPOCON_P0DAT     BIT(0) /* P0 state */
 143
 144#define AD7192_EXT_FREQ_MHZ_MIN 2457600
 145#define AD7192_EXT_FREQ_MHZ_MAX 5120000
 146#define AD7192_INT_FREQ_MHZ     4915200
 147
 148/* NOTE:
 149 * The AD7190/2/5 features a dual use data out ready DOUT/RDY output.
 150 * In order to avoid contentions on the SPI bus, it's therefore necessary
 151 * to use spi bus locking.
 152 *
 153 * The DOUT/RDY output must also be wired to an interrupt capable GPIO.
 154 */
 155
 156struct ad7192_state {
 157        struct regulator                *avdd;
 158        struct regulator                *dvdd;
 159        u16                             int_vref_mv;
 160        u32                             mclk;
 161        u32                             f_order;
 162        u32                             mode;
 163        u32                             conf;
 164        u32                             scale_avail[8][2];
 165        u8                              gpocon;
 166        u8                              devid;
 167        struct mutex                    lock;   /* protect sensor state */
 168
 169        struct ad_sigma_delta           sd;
 170};
 171
 172static struct ad7192_state *ad_sigma_delta_to_ad7192(struct ad_sigma_delta *sd)
 173{
 174        return container_of(sd, struct ad7192_state, sd);
 175}
 176
 177static int ad7192_set_channel(struct ad_sigma_delta *sd, unsigned int channel)
 178{
 179        struct ad7192_state *st = ad_sigma_delta_to_ad7192(sd);
 180
 181        st->conf &= ~AD7192_CONF_CHAN_MASK;
 182        st->conf |= AD7192_CONF_CHAN(channel);
 183
 184        return ad_sd_write_reg(&st->sd, AD7192_REG_CONF, 3, st->conf);
 185}
 186
 187static int ad7192_set_mode(struct ad_sigma_delta *sd,
 188                           enum ad_sigma_delta_mode mode)
 189{
 190        struct ad7192_state *st = ad_sigma_delta_to_ad7192(sd);
 191
 192        st->mode &= ~AD7192_MODE_SEL_MASK;
 193        st->mode |= AD7192_MODE_SEL(mode);
 194
 195        return ad_sd_write_reg(&st->sd, AD7192_REG_MODE, 3, st->mode);
 196}
 197
 198static const struct ad_sigma_delta_info ad7192_sigma_delta_info = {
 199        .set_channel = ad7192_set_channel,
 200        .set_mode = ad7192_set_mode,
 201        .has_registers = true,
 202        .addr_shift = 3,
 203        .read_mask = BIT(6),
 204};
 205
 206static const struct ad_sd_calib_data ad7192_calib_arr[8] = {
 207        {AD7192_MODE_CAL_INT_ZERO, AD7192_CH_AIN1},
 208        {AD7192_MODE_CAL_INT_FULL, AD7192_CH_AIN1},
 209        {AD7192_MODE_CAL_INT_ZERO, AD7192_CH_AIN2},
 210        {AD7192_MODE_CAL_INT_FULL, AD7192_CH_AIN2},
 211        {AD7192_MODE_CAL_INT_ZERO, AD7192_CH_AIN3},
 212        {AD7192_MODE_CAL_INT_FULL, AD7192_CH_AIN3},
 213        {AD7192_MODE_CAL_INT_ZERO, AD7192_CH_AIN4},
 214        {AD7192_MODE_CAL_INT_FULL, AD7192_CH_AIN4}
 215};
 216
 217static int ad7192_calibrate_all(struct ad7192_state *st)
 218{
 219                return ad_sd_calibrate_all(&st->sd, ad7192_calib_arr,
 220                                ARRAY_SIZE(ad7192_calib_arr));
 221}
 222
 223static inline bool ad7192_valid_external_frequency(u32 freq)
 224{
 225        return (freq >= AD7192_EXT_FREQ_MHZ_MIN &&
 226                freq <= AD7192_EXT_FREQ_MHZ_MAX);
 227}
 228
 229static int ad7192_setup(struct ad7192_state *st,
 230                        const struct ad7192_platform_data *pdata)
 231{
 232        struct iio_dev *indio_dev = spi_get_drvdata(st->sd.spi);
 233        unsigned long long scale_uv;
 234        int i, ret, id;
 235
 236        /* reset the serial interface */
 237        ret = ad_sd_reset(&st->sd, 48);
 238        if (ret < 0)
 239                goto out;
 240        usleep_range(500, 1000); /* Wait for at least 500us */
 241
 242        /* write/read test for device presence */
 243        ret = ad_sd_read_reg(&st->sd, AD7192_REG_ID, 1, &id);
 244        if (ret)
 245                goto out;
 246
 247        id &= AD7192_ID_MASK;
 248
 249        if (id != st->devid)
 250                dev_warn(&st->sd.spi->dev, "device ID query failed (0x%X)\n",
 251                         id);
 252
 253        switch (pdata->clock_source_sel) {
 254        case AD7192_CLK_INT:
 255        case AD7192_CLK_INT_CO:
 256                st->mclk = AD7192_INT_FREQ_MHZ;
 257                break;
 258        case AD7192_CLK_EXT_MCLK1_2:
 259        case AD7192_CLK_EXT_MCLK2:
 260                if (ad7192_valid_external_frequency(pdata->ext_clk_hz)) {
 261                        st->mclk = pdata->ext_clk_hz;
 262                        break;
 263                }
 264                dev_err(&st->sd.spi->dev, "Invalid frequency setting %u\n",
 265                        pdata->ext_clk_hz);
 266                ret = -EINVAL;
 267                goto out;
 268        default:
 269                ret = -EINVAL;
 270                goto out;
 271        }
 272
 273        st->mode = AD7192_MODE_SEL(AD7192_MODE_IDLE) |
 274                AD7192_MODE_CLKSRC(pdata->clock_source_sel) |
 275                AD7192_MODE_RATE(480);
 276
 277        st->conf = AD7192_CONF_GAIN(0);
 278
 279        if (pdata->rej60_en)
 280                st->mode |= AD7192_MODE_REJ60;
 281
 282        if (pdata->sinc3_en)
 283                st->mode |= AD7192_MODE_SINC3;
 284
 285        if (pdata->refin2_en && st->devid != ID_AD7195)
 286                st->conf |= AD7192_CONF_REFSEL;
 287
 288        if (pdata->chop_en) {
 289                st->conf |= AD7192_CONF_CHOP;
 290                if (pdata->sinc3_en)
 291                        st->f_order = 3; /* SINC 3rd order */
 292                else
 293                        st->f_order = 4; /* SINC 4th order */
 294        } else {
 295                st->f_order = 1;
 296        }
 297
 298        if (pdata->buf_en)
 299                st->conf |= AD7192_CONF_BUF;
 300
 301        if (pdata->unipolar_en)
 302                st->conf |= AD7192_CONF_UNIPOLAR;
 303
 304        if (pdata->burnout_curr_en && pdata->buf_en && !pdata->chop_en) {
 305                st->conf |= AD7192_CONF_BURN;
 306        } else if (pdata->burnout_curr_en) {
 307                dev_warn(&st->sd.spi->dev,
 308                         "Can't enable burnout currents: see CHOP or buffer\n");
 309        }
 310
 311        ret = ad_sd_write_reg(&st->sd, AD7192_REG_MODE, 3, st->mode);
 312        if (ret)
 313                goto out;
 314
 315        ret = ad_sd_write_reg(&st->sd, AD7192_REG_CONF, 3, st->conf);
 316        if (ret)
 317                goto out;
 318
 319        ret = ad7192_calibrate_all(st);
 320        if (ret)
 321                goto out;
 322
 323        /* Populate available ADC input ranges */
 324        for (i = 0; i < ARRAY_SIZE(st->scale_avail); i++) {
 325                scale_uv = ((u64)st->int_vref_mv * 100000000)
 326                        >> (indio_dev->channels[0].scan_type.realbits -
 327                        ((st->conf & AD7192_CONF_UNIPOLAR) ? 0 : 1));
 328                scale_uv >>= i;
 329
 330                st->scale_avail[i][1] = do_div(scale_uv, 100000000) * 10;
 331                st->scale_avail[i][0] = scale_uv;
 332        }
 333
 334        return 0;
 335out:
 336        dev_err(&st->sd.spi->dev, "setup failed\n");
 337        return ret;
 338}
 339
 340static ssize_t
 341ad7192_show_scale_available(struct device *dev,
 342                            struct device_attribute *attr, char *buf)
 343{
 344        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
 345        struct ad7192_state *st = iio_priv(indio_dev);
 346        int i, len = 0;
 347
 348        for (i = 0; i < ARRAY_SIZE(st->scale_avail); i++)
 349                len += sprintf(buf + len, "%d.%09u ", st->scale_avail[i][0],
 350                               st->scale_avail[i][1]);
 351
 352        len += sprintf(buf + len, "\n");
 353
 354        return len;
 355}
 356
 357static IIO_DEVICE_ATTR_NAMED(in_v_m_v_scale_available,
 358                             in_voltage-voltage_scale_available,
 359                             0444, ad7192_show_scale_available, NULL, 0);
 360
 361static IIO_DEVICE_ATTR(in_voltage_scale_available, 0444,
 362                       ad7192_show_scale_available, NULL, 0);
 363
 364static ssize_t ad7192_show_ac_excitation(struct device *dev,
 365                                         struct device_attribute *attr,
 366                                         char *buf)
 367{
 368        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
 369        struct ad7192_state *st = iio_priv(indio_dev);
 370
 371        return sprintf(buf, "%d\n", !!(st->mode & AD7192_MODE_ACX));
 372}
 373
 374static ssize_t ad7192_show_bridge_switch(struct device *dev,
 375                                         struct device_attribute *attr,
 376                                         char *buf)
 377{
 378        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
 379        struct ad7192_state *st = iio_priv(indio_dev);
 380
 381        return sprintf(buf, "%d\n", !!(st->gpocon & AD7192_GPOCON_BPDSW));
 382}
 383
 384static ssize_t ad7192_set(struct device *dev,
 385                          struct device_attribute *attr,
 386                          const char *buf,
 387                          size_t len)
 388{
 389        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
 390        struct ad7192_state *st = iio_priv(indio_dev);
 391        struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
 392        int ret;
 393        bool val;
 394
 395        ret = strtobool(buf, &val);
 396        if (ret < 0)
 397                return ret;
 398
 399        ret = iio_device_claim_direct_mode(indio_dev);
 400        if (ret)
 401                return ret;
 402
 403        switch ((u32)this_attr->address) {
 404        case AD7192_REG_GPOCON:
 405                if (val)
 406                        st->gpocon |= AD7192_GPOCON_BPDSW;
 407                else
 408                        st->gpocon &= ~AD7192_GPOCON_BPDSW;
 409
 410                ad_sd_write_reg(&st->sd, AD7192_REG_GPOCON, 1, st->gpocon);
 411                break;
 412        case AD7192_REG_MODE:
 413                if (val)
 414                        st->mode |= AD7192_MODE_ACX;
 415                else
 416                        st->mode &= ~AD7192_MODE_ACX;
 417
 418                ad_sd_write_reg(&st->sd, AD7192_REG_MODE, 3, st->mode);
 419                break;
 420        default:
 421                ret = -EINVAL;
 422        }
 423
 424        iio_device_release_direct_mode(indio_dev);
 425
 426        return ret ? ret : len;
 427}
 428
 429static IIO_DEVICE_ATTR(bridge_switch_en, 0644,
 430                       ad7192_show_bridge_switch, ad7192_set,
 431                       AD7192_REG_GPOCON);
 432
 433static IIO_DEVICE_ATTR(ac_excitation_en, 0644,
 434                       ad7192_show_ac_excitation, ad7192_set,
 435                       AD7192_REG_MODE);
 436
 437static struct attribute *ad7192_attributes[] = {
 438        &iio_dev_attr_in_v_m_v_scale_available.dev_attr.attr,
 439        &iio_dev_attr_in_voltage_scale_available.dev_attr.attr,
 440        &iio_dev_attr_bridge_switch_en.dev_attr.attr,
 441        &iio_dev_attr_ac_excitation_en.dev_attr.attr,
 442        NULL
 443};
 444
 445static const struct attribute_group ad7192_attribute_group = {
 446        .attrs = ad7192_attributes,
 447};
 448
 449static struct attribute *ad7195_attributes[] = {
 450        &iio_dev_attr_in_v_m_v_scale_available.dev_attr.attr,
 451        &iio_dev_attr_in_voltage_scale_available.dev_attr.attr,
 452        &iio_dev_attr_bridge_switch_en.dev_attr.attr,
 453        NULL
 454};
 455
 456static const struct attribute_group ad7195_attribute_group = {
 457        .attrs = ad7195_attributes,
 458};
 459
 460static unsigned int ad7192_get_temp_scale(bool unipolar)
 461{
 462        return unipolar ? 2815 * 2 : 2815;
 463}
 464
 465static int ad7192_read_raw(struct iio_dev *indio_dev,
 466                           struct iio_chan_spec const *chan,
 467                           int *val,
 468                           int *val2,
 469                           long m)
 470{
 471        struct ad7192_state *st = iio_priv(indio_dev);
 472        bool unipolar = !!(st->conf & AD7192_CONF_UNIPOLAR);
 473
 474        switch (m) {
 475        case IIO_CHAN_INFO_RAW:
 476                return ad_sigma_delta_single_conversion(indio_dev, chan, val);
 477        case IIO_CHAN_INFO_SCALE:
 478                switch (chan->type) {
 479                case IIO_VOLTAGE:
 480                        mutex_lock(&st->lock);
 481                        *val = st->scale_avail[AD7192_CONF_GAIN(st->conf)][0];
 482                        *val2 = st->scale_avail[AD7192_CONF_GAIN(st->conf)][1];
 483                        mutex_unlock(&st->lock);
 484                        return IIO_VAL_INT_PLUS_NANO;
 485                case IIO_TEMP:
 486                        *val = 0;
 487                        *val2 = 1000000000 / ad7192_get_temp_scale(unipolar);
 488                        return IIO_VAL_INT_PLUS_NANO;
 489                default:
 490                        return -EINVAL;
 491                }
 492        case IIO_CHAN_INFO_OFFSET:
 493                if (!unipolar)
 494                        *val = -(1 << (chan->scan_type.realbits - 1));
 495                else
 496                        *val = 0;
 497                /* Kelvin to Celsius */
 498                if (chan->type == IIO_TEMP)
 499                        *val -= 273 * ad7192_get_temp_scale(unipolar);
 500                return IIO_VAL_INT;
 501        case IIO_CHAN_INFO_SAMP_FREQ:
 502                *val = st->mclk /
 503                        (st->f_order * 1024 * AD7192_MODE_RATE(st->mode));
 504                return IIO_VAL_INT;
 505        }
 506
 507        return -EINVAL;
 508}
 509
 510static int ad7192_write_raw(struct iio_dev *indio_dev,
 511                            struct iio_chan_spec const *chan,
 512                            int val,
 513                            int val2,
 514                            long mask)
 515{
 516        struct ad7192_state *st = iio_priv(indio_dev);
 517        int ret, i, div;
 518        unsigned int tmp;
 519
 520        ret = iio_device_claim_direct_mode(indio_dev);
 521        if (ret)
 522                return ret;
 523
 524        switch (mask) {
 525        case IIO_CHAN_INFO_SCALE:
 526                ret = -EINVAL;
 527                mutex_lock(&st->lock);
 528                for (i = 0; i < ARRAY_SIZE(st->scale_avail); i++)
 529                        if (val2 == st->scale_avail[i][1]) {
 530                                ret = 0;
 531                                tmp = st->conf;
 532                                st->conf &= ~AD7192_CONF_GAIN(-1);
 533                                st->conf |= AD7192_CONF_GAIN(i);
 534                                if (tmp == st->conf)
 535                                        break;
 536                                ad_sd_write_reg(&st->sd, AD7192_REG_CONF,
 537                                                3, st->conf);
 538                                ad7192_calibrate_all(st);
 539                                break;
 540                        }
 541                mutex_unlock(&st->lock);
 542                break;
 543        case IIO_CHAN_INFO_SAMP_FREQ:
 544                if (!val) {
 545                        ret = -EINVAL;
 546                        break;
 547                }
 548
 549                div = st->mclk / (val * st->f_order * 1024);
 550                if (div < 1 || div > 1023) {
 551                        ret = -EINVAL;
 552                        break;
 553                }
 554
 555                st->mode &= ~AD7192_MODE_RATE(-1);
 556                st->mode |= AD7192_MODE_RATE(div);
 557                ad_sd_write_reg(&st->sd, AD7192_REG_MODE, 3, st->mode);
 558                break;
 559        default:
 560                ret = -EINVAL;
 561        }
 562
 563        iio_device_release_direct_mode(indio_dev);
 564
 565        return ret;
 566}
 567
 568static int ad7192_write_raw_get_fmt(struct iio_dev *indio_dev,
 569                                    struct iio_chan_spec const *chan,
 570                                    long mask)
 571{
 572        switch (mask) {
 573        case IIO_CHAN_INFO_SCALE:
 574                return IIO_VAL_INT_PLUS_NANO;
 575        case IIO_CHAN_INFO_SAMP_FREQ:
 576                return IIO_VAL_INT;
 577        default:
 578                return -EINVAL;
 579        }
 580}
 581
 582static const struct iio_info ad7192_info = {
 583        .read_raw = ad7192_read_raw,
 584        .write_raw = ad7192_write_raw,
 585        .write_raw_get_fmt = ad7192_write_raw_get_fmt,
 586        .attrs = &ad7192_attribute_group,
 587        .validate_trigger = ad_sd_validate_trigger,
 588};
 589
 590static const struct iio_info ad7195_info = {
 591        .read_raw = ad7192_read_raw,
 592        .write_raw = ad7192_write_raw,
 593        .write_raw_get_fmt = ad7192_write_raw_get_fmt,
 594        .attrs = &ad7195_attribute_group,
 595        .validate_trigger = ad_sd_validate_trigger,
 596};
 597
 598static const struct iio_chan_spec ad7192_channels[] = {
 599        AD_SD_DIFF_CHANNEL(0, 1, 2, AD7192_CH_AIN1P_AIN2M, 24, 32, 0),
 600        AD_SD_DIFF_CHANNEL(1, 3, 4, AD7192_CH_AIN3P_AIN4M, 24, 32, 0),
 601        AD_SD_TEMP_CHANNEL(2, AD7192_CH_TEMP, 24, 32, 0),
 602        AD_SD_SHORTED_CHANNEL(3, 2, AD7192_CH_AIN2P_AIN2M, 24, 32, 0),
 603        AD_SD_CHANNEL(4, 1, AD7192_CH_AIN1, 24, 32, 0),
 604        AD_SD_CHANNEL(5, 2, AD7192_CH_AIN2, 24, 32, 0),
 605        AD_SD_CHANNEL(6, 3, AD7192_CH_AIN3, 24, 32, 0),
 606        AD_SD_CHANNEL(7, 4, AD7192_CH_AIN4, 24, 32, 0),
 607        IIO_CHAN_SOFT_TIMESTAMP(8),
 608};
 609
 610static const struct iio_chan_spec ad7193_channels[] = {
 611        AD_SD_DIFF_CHANNEL(0, 1, 2, AD7193_CH_AIN1P_AIN2M, 24, 32, 0),
 612        AD_SD_DIFF_CHANNEL(1, 3, 4, AD7193_CH_AIN3P_AIN4M, 24, 32, 0),
 613        AD_SD_DIFF_CHANNEL(2, 5, 6, AD7193_CH_AIN5P_AIN6M, 24, 32, 0),
 614        AD_SD_DIFF_CHANNEL(3, 7, 8, AD7193_CH_AIN7P_AIN8M, 24, 32, 0),
 615        AD_SD_TEMP_CHANNEL(4, AD7193_CH_TEMP, 24, 32, 0),
 616        AD_SD_SHORTED_CHANNEL(5, 2, AD7193_CH_AIN2P_AIN2M, 24, 32, 0),
 617        AD_SD_CHANNEL(6, 1, AD7193_CH_AIN1, 24, 32, 0),
 618        AD_SD_CHANNEL(7, 2, AD7193_CH_AIN2, 24, 32, 0),
 619        AD_SD_CHANNEL(8, 3, AD7193_CH_AIN3, 24, 32, 0),
 620        AD_SD_CHANNEL(9, 4, AD7193_CH_AIN4, 24, 32, 0),
 621        AD_SD_CHANNEL(10, 5, AD7193_CH_AIN5, 24, 32, 0),
 622        AD_SD_CHANNEL(11, 6, AD7193_CH_AIN6, 24, 32, 0),
 623        AD_SD_CHANNEL(12, 7, AD7193_CH_AIN7, 24, 32, 0),
 624        AD_SD_CHANNEL(13, 8, AD7193_CH_AIN8, 24, 32, 0),
 625        IIO_CHAN_SOFT_TIMESTAMP(14),
 626};
 627
 628static int ad7192_probe(struct spi_device *spi)
 629{
 630        const struct ad7192_platform_data *pdata = dev_get_platdata(&spi->dev);
 631        struct ad7192_state *st;
 632        struct iio_dev *indio_dev;
 633        int ret, voltage_uv = 0;
 634
 635        if (!pdata) {
 636                dev_err(&spi->dev, "no platform data?\n");
 637                return -ENODEV;
 638        }
 639
 640        if (!spi->irq) {
 641                dev_err(&spi->dev, "no IRQ?\n");
 642                return -ENODEV;
 643        }
 644
 645        indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
 646        if (!indio_dev)
 647                return -ENOMEM;
 648
 649        st = iio_priv(indio_dev);
 650
 651        mutex_init(&st->lock);
 652
 653        st->avdd = devm_regulator_get(&spi->dev, "avdd");
 654        if (IS_ERR(st->avdd))
 655                return PTR_ERR(st->avdd);
 656
 657        ret = regulator_enable(st->avdd);
 658        if (ret) {
 659                dev_err(&spi->dev, "Failed to enable specified AVdd supply\n");
 660                return ret;
 661        }
 662
 663        st->dvdd = devm_regulator_get(&spi->dev, "dvdd");
 664        if (IS_ERR(st->dvdd)) {
 665                ret = PTR_ERR(st->dvdd);
 666                goto error_disable_avdd;
 667        }
 668
 669        ret = regulator_enable(st->dvdd);
 670        if (ret) {
 671                dev_err(&spi->dev, "Failed to enable specified DVdd supply\n");
 672                goto error_disable_avdd;
 673        }
 674
 675        voltage_uv = regulator_get_voltage(st->avdd);
 676
 677        if (pdata->vref_mv)
 678                st->int_vref_mv = pdata->vref_mv;
 679        else if (voltage_uv)
 680                st->int_vref_mv = voltage_uv / 1000;
 681        else
 682                dev_warn(&spi->dev, "reference voltage undefined\n");
 683
 684        spi_set_drvdata(spi, indio_dev);
 685        st->devid = spi_get_device_id(spi)->driver_data;
 686        indio_dev->dev.parent = &spi->dev;
 687        indio_dev->name = spi_get_device_id(spi)->name;
 688        indio_dev->modes = INDIO_DIRECT_MODE;
 689
 690        switch (st->devid) {
 691        case ID_AD7193:
 692                indio_dev->channels = ad7193_channels;
 693                indio_dev->num_channels = ARRAY_SIZE(ad7193_channels);
 694                break;
 695        default:
 696                indio_dev->channels = ad7192_channels;
 697                indio_dev->num_channels = ARRAY_SIZE(ad7192_channels);
 698                break;
 699        }
 700
 701        if (st->devid == ID_AD7195)
 702                indio_dev->info = &ad7195_info;
 703        else
 704                indio_dev->info = &ad7192_info;
 705
 706        ad_sd_init(&st->sd, indio_dev, spi, &ad7192_sigma_delta_info);
 707
 708        ret = ad_sd_setup_buffer_and_trigger(indio_dev);
 709        if (ret)
 710                goto error_disable_dvdd;
 711
 712        ret = ad7192_setup(st, pdata);
 713        if (ret)
 714                goto error_remove_trigger;
 715
 716        ret = iio_device_register(indio_dev);
 717        if (ret < 0)
 718                goto error_remove_trigger;
 719        return 0;
 720
 721error_remove_trigger:
 722        ad_sd_cleanup_buffer_and_trigger(indio_dev);
 723error_disable_dvdd:
 724        regulator_disable(st->dvdd);
 725error_disable_avdd:
 726        regulator_disable(st->avdd);
 727
 728        return ret;
 729}
 730
 731static int ad7192_remove(struct spi_device *spi)
 732{
 733        struct iio_dev *indio_dev = spi_get_drvdata(spi);
 734        struct ad7192_state *st = iio_priv(indio_dev);
 735
 736        iio_device_unregister(indio_dev);
 737        ad_sd_cleanup_buffer_and_trigger(indio_dev);
 738
 739        regulator_disable(st->dvdd);
 740        regulator_disable(st->avdd);
 741
 742        return 0;
 743}
 744
 745static const struct spi_device_id ad7192_id[] = {
 746        {"ad7190", ID_AD7190},
 747        {"ad7192", ID_AD7192},
 748        {"ad7193", ID_AD7193},
 749        {"ad7195", ID_AD7195},
 750        {}
 751};
 752MODULE_DEVICE_TABLE(spi, ad7192_id);
 753
 754static struct spi_driver ad7192_driver = {
 755        .driver = {
 756                .name   = "ad7192",
 757        },
 758        .probe          = ad7192_probe,
 759        .remove         = ad7192_remove,
 760        .id_table       = ad7192_id,
 761};
 762module_spi_driver(ad7192_driver);
 763
 764MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
 765MODULE_DESCRIPTION("Analog Devices AD7190, AD7192, AD7193, AD7195 ADC");
 766MODULE_LICENSE("GPL v2");
 767