linux/drivers/iio/adc/ad_sigma_delta.c
<<
>>
Prefs
   1/*
   2 * Support code for Analog Devices Sigma-Delta ADCs
   3 *
   4 * Copyright 2012 Analog Devices Inc.
   5 *  Author: Lars-Peter Clausen <lars@metafoo.de>
   6 *
   7 * Licensed under the GPL-2.
   8 */
   9
  10#include <linux/interrupt.h>
  11#include <linux/device.h>
  12#include <linux/kernel.h>
  13#include <linux/slab.h>
  14#include <linux/spi/spi.h>
  15#include <linux/err.h>
  16#include <linux/module.h>
  17
  18#include <linux/iio/iio.h>
  19#include <linux/iio/sysfs.h>
  20#include <linux/iio/buffer.h>
  21#include <linux/iio/trigger.h>
  22#include <linux/iio/trigger_consumer.h>
  23#include <linux/iio/triggered_buffer.h>
  24#include <linux/iio/adc/ad_sigma_delta.h>
  25
  26#include <asm/unaligned.h>
  27
  28
  29#define AD_SD_COMM_CHAN_MASK    0x3
  30
  31#define AD_SD_REG_COMM          0x00
  32#define AD_SD_REG_DATA          0x03
  33
  34/**
  35 * ad_sd_set_comm() - Set communications register
  36 *
  37 * @sigma_delta: The sigma delta device
  38 * @comm: New value for the communications register
  39 */
  40void ad_sd_set_comm(struct ad_sigma_delta *sigma_delta, uint8_t comm)
  41{
  42        /* Some variants use the lower two bits of the communications register
  43         * to select the channel */
  44        sigma_delta->comm = comm & AD_SD_COMM_CHAN_MASK;
  45}
  46EXPORT_SYMBOL_GPL(ad_sd_set_comm);
  47
  48/**
  49 * ad_sd_write_reg() - Write a register
  50 *
  51 * @sigma_delta: The sigma delta device
  52 * @reg: Address of the register
  53 * @size: Size of the register (0-3)
  54 * @val: Value to write to the register
  55 *
  56 * Returns 0 on success, an error code otherwise.
  57 **/
  58int ad_sd_write_reg(struct ad_sigma_delta *sigma_delta, unsigned int reg,
  59        unsigned int size, unsigned int val)
  60{
  61        uint8_t *data = sigma_delta->data;
  62        struct spi_transfer t = {
  63                .tx_buf         = data,
  64                .len            = size + 1,
  65                .cs_change      = sigma_delta->bus_locked,
  66        };
  67        struct spi_message m;
  68        int ret;
  69
  70        data[0] = (reg << sigma_delta->info->addr_shift) | sigma_delta->comm;
  71
  72        switch (size) {
  73        case 3:
  74                data[1] = val >> 16;
  75                data[2] = val >> 8;
  76                data[3] = val;
  77                break;
  78        case 2:
  79                put_unaligned_be16(val, &data[1]);
  80                break;
  81        case 1:
  82                data[1] = val;
  83                break;
  84        case 0:
  85                break;
  86        default:
  87                return -EINVAL;
  88        }
  89
  90        spi_message_init(&m);
  91        spi_message_add_tail(&t, &m);
  92
  93        if (sigma_delta->bus_locked)
  94                ret = spi_sync_locked(sigma_delta->spi, &m);
  95        else
  96                ret = spi_sync(sigma_delta->spi, &m);
  97
  98        return ret;
  99}
 100EXPORT_SYMBOL_GPL(ad_sd_write_reg);
 101
 102static int ad_sd_read_reg_raw(struct ad_sigma_delta *sigma_delta,
 103        unsigned int reg, unsigned int size, uint8_t *val)
 104{
 105        uint8_t *data = sigma_delta->data;
 106        int ret;
 107        struct spi_transfer t[] = {
 108                {
 109                        .tx_buf = data,
 110                        .len = 1,
 111                }, {
 112                        .rx_buf = val,
 113                        .len = size,
 114                        .cs_change = sigma_delta->bus_locked,
 115                },
 116        };
 117        struct spi_message m;
 118
 119        spi_message_init(&m);
 120
 121        if (sigma_delta->info->has_registers) {
 122                data[0] = reg << sigma_delta->info->addr_shift;
 123                data[0] |= sigma_delta->info->read_mask;
 124                spi_message_add_tail(&t[0], &m);
 125        }
 126        spi_message_add_tail(&t[1], &m);
 127
 128        if (sigma_delta->bus_locked)
 129                ret = spi_sync_locked(sigma_delta->spi, &m);
 130        else
 131                ret = spi_sync(sigma_delta->spi, &m);
 132
 133        return ret;
 134}
 135
 136/**
 137 * ad_sd_read_reg() - Read a register
 138 *
 139 * @sigma_delta: The sigma delta device
 140 * @reg: Address of the register
 141 * @size: Size of the register (1-4)
 142 * @val: Read value
 143 *
 144 * Returns 0 on success, an error code otherwise.
 145 **/
 146int ad_sd_read_reg(struct ad_sigma_delta *sigma_delta,
 147        unsigned int reg, unsigned int size, unsigned int *val)
 148{
 149        int ret;
 150
 151        ret = ad_sd_read_reg_raw(sigma_delta, reg, size, sigma_delta->data);
 152        if (ret < 0)
 153                goto out;
 154
 155        switch (size) {
 156        case 4:
 157                *val = get_unaligned_be32(sigma_delta->data);
 158                break;
 159        case 3:
 160                *val = (sigma_delta->data[0] << 16) |
 161                        (sigma_delta->data[1] << 8) |
 162                        sigma_delta->data[2];
 163                break;
 164        case 2:
 165                *val = get_unaligned_be16(sigma_delta->data);
 166                break;
 167        case 1:
 168                *val = sigma_delta->data[0];
 169                break;
 170        default:
 171                ret = -EINVAL;
 172                break;
 173        }
 174
 175out:
 176        return ret;
 177}
 178EXPORT_SYMBOL_GPL(ad_sd_read_reg);
 179
 180/**
 181 * ad_sd_reset() - Reset the serial interface
 182 *
 183 * @sigma_delta: The sigma delta device
 184 * @reset_length: Number of SCLKs with DIN = 1
 185 *
 186 * Returns 0 on success, an error code otherwise.
 187 **/
 188int ad_sd_reset(struct ad_sigma_delta *sigma_delta,
 189        unsigned int reset_length)
 190{
 191        uint8_t *buf;
 192        unsigned int size;
 193        int ret;
 194
 195        size = DIV_ROUND_UP(reset_length, 8);
 196        buf = kcalloc(size, sizeof(*buf), GFP_KERNEL);
 197        if (!buf)
 198                return -ENOMEM;
 199
 200        memset(buf, 0xff, size);
 201        ret = spi_write(sigma_delta->spi, buf, size);
 202        kfree(buf);
 203
 204        return ret;
 205}
 206EXPORT_SYMBOL_GPL(ad_sd_reset);
 207
 208static int ad_sd_calibrate(struct ad_sigma_delta *sigma_delta,
 209        unsigned int mode, unsigned int channel)
 210{
 211        int ret;
 212
 213        ret = ad_sigma_delta_set_channel(sigma_delta, channel);
 214        if (ret)
 215                return ret;
 216
 217        spi_bus_lock(sigma_delta->spi->master);
 218        sigma_delta->bus_locked = true;
 219        reinit_completion(&sigma_delta->completion);
 220
 221        ret = ad_sigma_delta_set_mode(sigma_delta, mode);
 222        if (ret < 0)
 223                goto out;
 224
 225        sigma_delta->irq_dis = false;
 226        enable_irq(sigma_delta->spi->irq);
 227        ret = wait_for_completion_timeout(&sigma_delta->completion, 2*HZ);
 228        if (ret == 0) {
 229                sigma_delta->irq_dis = true;
 230                disable_irq_nosync(sigma_delta->spi->irq);
 231                ret = -EIO;
 232        } else {
 233                ret = 0;
 234        }
 235out:
 236        sigma_delta->bus_locked = false;
 237        spi_bus_unlock(sigma_delta->spi->master);
 238        ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_IDLE);
 239
 240        return ret;
 241}
 242
 243/**
 244 * ad_sd_calibrate_all() - Performs channel calibration
 245 * @sigma_delta: The sigma delta device
 246 * @cb: Array of channels and calibration type to perform
 247 * @n: Number of items in cb
 248 *
 249 * Returns 0 on success, an error code otherwise.
 250 **/
 251int ad_sd_calibrate_all(struct ad_sigma_delta *sigma_delta,
 252        const struct ad_sd_calib_data *cb, unsigned int n)
 253{
 254        unsigned int i;
 255        int ret;
 256
 257        for (i = 0; i < n; i++) {
 258                ret = ad_sd_calibrate(sigma_delta, cb[i].mode, cb[i].channel);
 259                if (ret)
 260                        return ret;
 261        }
 262
 263        return 0;
 264}
 265EXPORT_SYMBOL_GPL(ad_sd_calibrate_all);
 266
 267/**
 268 * ad_sigma_delta_single_conversion() - Performs a single data conversion
 269 * @indio_dev: The IIO device
 270 * @chan: The conversion is done for this channel
 271 * @val: Pointer to the location where to store the read value
 272 *
 273 * Returns: 0 on success, an error value otherwise.
 274 */
 275int ad_sigma_delta_single_conversion(struct iio_dev *indio_dev,
 276        const struct iio_chan_spec *chan, int *val)
 277{
 278        struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev);
 279        unsigned int sample, raw_sample;
 280        int ret = 0;
 281
 282        if (iio_buffer_enabled(indio_dev))
 283                return -EBUSY;
 284
 285        mutex_lock(&indio_dev->mlock);
 286        ad_sigma_delta_set_channel(sigma_delta, chan->address);
 287
 288        spi_bus_lock(sigma_delta->spi->master);
 289        sigma_delta->bus_locked = true;
 290        reinit_completion(&sigma_delta->completion);
 291
 292        ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_SINGLE);
 293
 294        sigma_delta->irq_dis = false;
 295        enable_irq(sigma_delta->spi->irq);
 296        ret = wait_for_completion_interruptible_timeout(
 297                        &sigma_delta->completion, HZ);
 298
 299        sigma_delta->bus_locked = false;
 300        spi_bus_unlock(sigma_delta->spi->master);
 301
 302        if (ret == 0)
 303                ret = -EIO;
 304        if (ret < 0)
 305                goto out;
 306
 307        ret = ad_sd_read_reg(sigma_delta, AD_SD_REG_DATA,
 308                DIV_ROUND_UP(chan->scan_type.realbits + chan->scan_type.shift, 8),
 309                &raw_sample);
 310
 311out:
 312        if (!sigma_delta->irq_dis) {
 313                disable_irq_nosync(sigma_delta->spi->irq);
 314                sigma_delta->irq_dis = true;
 315        }
 316
 317        ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_IDLE);
 318        mutex_unlock(&indio_dev->mlock);
 319
 320        if (ret)
 321                return ret;
 322
 323        sample = raw_sample >> chan->scan_type.shift;
 324        sample &= (1 << chan->scan_type.realbits) - 1;
 325        *val = sample;
 326
 327        ret = ad_sigma_delta_postprocess_sample(sigma_delta, raw_sample);
 328        if (ret)
 329                return ret;
 330
 331        return IIO_VAL_INT;
 332}
 333EXPORT_SYMBOL_GPL(ad_sigma_delta_single_conversion);
 334
 335static int ad_sd_buffer_postenable(struct iio_dev *indio_dev)
 336{
 337        struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev);
 338        unsigned int channel;
 339        int ret;
 340
 341        ret = iio_triggered_buffer_postenable(indio_dev);
 342        if (ret < 0)
 343                return ret;
 344
 345        channel = find_first_bit(indio_dev->active_scan_mask,
 346                                 indio_dev->masklength);
 347        ret = ad_sigma_delta_set_channel(sigma_delta,
 348                indio_dev->channels[channel].address);
 349        if (ret)
 350                goto err_predisable;
 351
 352        spi_bus_lock(sigma_delta->spi->master);
 353        sigma_delta->bus_locked = true;
 354        ret = ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_CONTINUOUS);
 355        if (ret)
 356                goto err_unlock;
 357
 358        sigma_delta->irq_dis = false;
 359        enable_irq(sigma_delta->spi->irq);
 360
 361        return 0;
 362
 363err_unlock:
 364        spi_bus_unlock(sigma_delta->spi->master);
 365err_predisable:
 366
 367        return ret;
 368}
 369
 370static int ad_sd_buffer_postdisable(struct iio_dev *indio_dev)
 371{
 372        struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev);
 373
 374        reinit_completion(&sigma_delta->completion);
 375        wait_for_completion_timeout(&sigma_delta->completion, HZ);
 376
 377        if (!sigma_delta->irq_dis) {
 378                disable_irq_nosync(sigma_delta->spi->irq);
 379                sigma_delta->irq_dis = true;
 380        }
 381
 382        ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_IDLE);
 383
 384        sigma_delta->bus_locked = false;
 385        return spi_bus_unlock(sigma_delta->spi->master);
 386}
 387
 388static irqreturn_t ad_sd_trigger_handler(int irq, void *p)
 389{
 390        struct iio_poll_func *pf = p;
 391        struct iio_dev *indio_dev = pf->indio_dev;
 392        struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev);
 393        unsigned int reg_size;
 394        uint8_t data[16];
 395        int ret;
 396
 397        memset(data, 0x00, 16);
 398
 399        reg_size = indio_dev->channels[0].scan_type.realbits +
 400                        indio_dev->channels[0].scan_type.shift;
 401        reg_size = DIV_ROUND_UP(reg_size, 8);
 402
 403        switch (reg_size) {
 404        case 4:
 405        case 2:
 406        case 1:
 407                ret = ad_sd_read_reg_raw(sigma_delta, AD_SD_REG_DATA,
 408                        reg_size, &data[0]);
 409                break;
 410        case 3:
 411                /* We store 24 bit samples in a 32 bit word. Keep the upper
 412                 * byte set to zero. */
 413                ret = ad_sd_read_reg_raw(sigma_delta, AD_SD_REG_DATA,
 414                        reg_size, &data[1]);
 415                break;
 416        }
 417
 418        iio_push_to_buffers_with_timestamp(indio_dev, data, pf->timestamp);
 419
 420        iio_trigger_notify_done(indio_dev->trig);
 421        sigma_delta->irq_dis = false;
 422        enable_irq(sigma_delta->spi->irq);
 423
 424        return IRQ_HANDLED;
 425}
 426
 427static const struct iio_buffer_setup_ops ad_sd_buffer_setup_ops = {
 428        .postenable = &ad_sd_buffer_postenable,
 429        .predisable = &iio_triggered_buffer_predisable,
 430        .postdisable = &ad_sd_buffer_postdisable,
 431        .validate_scan_mask = &iio_validate_scan_mask_onehot,
 432};
 433
 434static irqreturn_t ad_sd_data_rdy_trig_poll(int irq, void *private)
 435{
 436        struct ad_sigma_delta *sigma_delta = private;
 437
 438        complete(&sigma_delta->completion);
 439        disable_irq_nosync(irq);
 440        sigma_delta->irq_dis = true;
 441        iio_trigger_poll(sigma_delta->trig);
 442
 443        return IRQ_HANDLED;
 444}
 445
 446/**
 447 * ad_sd_validate_trigger() - validate_trigger callback for ad_sigma_delta devices
 448 * @indio_dev: The IIO device
 449 * @trig: The new trigger
 450 *
 451 * Returns: 0 if the 'trig' matches the trigger registered by the ad_sigma_delta
 452 * device, -EINVAL otherwise.
 453 */
 454int ad_sd_validate_trigger(struct iio_dev *indio_dev, struct iio_trigger *trig)
 455{
 456        struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev);
 457
 458        if (sigma_delta->trig != trig)
 459                return -EINVAL;
 460
 461        return 0;
 462}
 463EXPORT_SYMBOL_GPL(ad_sd_validate_trigger);
 464
 465static const struct iio_trigger_ops ad_sd_trigger_ops = {
 466};
 467
 468static int ad_sd_probe_trigger(struct iio_dev *indio_dev)
 469{
 470        struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev);
 471        int ret;
 472
 473        sigma_delta->trig = iio_trigger_alloc("%s-dev%d", indio_dev->name,
 474                                                indio_dev->id);
 475        if (sigma_delta->trig == NULL) {
 476                ret = -ENOMEM;
 477                goto error_ret;
 478        }
 479        sigma_delta->trig->ops = &ad_sd_trigger_ops;
 480        init_completion(&sigma_delta->completion);
 481
 482        ret = request_irq(sigma_delta->spi->irq,
 483                          ad_sd_data_rdy_trig_poll,
 484                          IRQF_TRIGGER_LOW,
 485                          indio_dev->name,
 486                          sigma_delta);
 487        if (ret)
 488                goto error_free_trig;
 489
 490        if (!sigma_delta->irq_dis) {
 491                sigma_delta->irq_dis = true;
 492                disable_irq_nosync(sigma_delta->spi->irq);
 493        }
 494        sigma_delta->trig->dev.parent = &sigma_delta->spi->dev;
 495        iio_trigger_set_drvdata(sigma_delta->trig, sigma_delta);
 496
 497        ret = iio_trigger_register(sigma_delta->trig);
 498        if (ret)
 499                goto error_free_irq;
 500
 501        /* select default trigger */
 502        indio_dev->trig = iio_trigger_get(sigma_delta->trig);
 503
 504        return 0;
 505
 506error_free_irq:
 507        free_irq(sigma_delta->spi->irq, sigma_delta);
 508error_free_trig:
 509        iio_trigger_free(sigma_delta->trig);
 510error_ret:
 511        return ret;
 512}
 513
 514static void ad_sd_remove_trigger(struct iio_dev *indio_dev)
 515{
 516        struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev);
 517
 518        iio_trigger_unregister(sigma_delta->trig);
 519        free_irq(sigma_delta->spi->irq, sigma_delta);
 520        iio_trigger_free(sigma_delta->trig);
 521}
 522
 523/**
 524 * ad_sd_setup_buffer_and_trigger() -
 525 * @indio_dev: The IIO device
 526 */
 527int ad_sd_setup_buffer_and_trigger(struct iio_dev *indio_dev)
 528{
 529        int ret;
 530
 531        ret = iio_triggered_buffer_setup(indio_dev, &iio_pollfunc_store_time,
 532                        &ad_sd_trigger_handler, &ad_sd_buffer_setup_ops);
 533        if (ret)
 534                return ret;
 535
 536        ret = ad_sd_probe_trigger(indio_dev);
 537        if (ret) {
 538                iio_triggered_buffer_cleanup(indio_dev);
 539                return ret;
 540        }
 541
 542        return 0;
 543}
 544EXPORT_SYMBOL_GPL(ad_sd_setup_buffer_and_trigger);
 545
 546/**
 547 * ad_sd_cleanup_buffer_and_trigger() -
 548 * @indio_dev: The IIO device
 549 */
 550void ad_sd_cleanup_buffer_and_trigger(struct iio_dev *indio_dev)
 551{
 552        ad_sd_remove_trigger(indio_dev);
 553        iio_triggered_buffer_cleanup(indio_dev);
 554}
 555EXPORT_SYMBOL_GPL(ad_sd_cleanup_buffer_and_trigger);
 556
 557/**
 558 * ad_sd_init() - Initializes a ad_sigma_delta struct
 559 * @sigma_delta: The ad_sigma_delta device
 560 * @indio_dev: The IIO device which the Sigma Delta device is used for
 561 * @spi: The SPI device for the ad_sigma_delta device
 562 * @info: Device specific callbacks and options
 563 *
 564 * This function needs to be called before any other operations are performed on
 565 * the ad_sigma_delta struct.
 566 */
 567int ad_sd_init(struct ad_sigma_delta *sigma_delta, struct iio_dev *indio_dev,
 568        struct spi_device *spi, const struct ad_sigma_delta_info *info)
 569{
 570        sigma_delta->spi = spi;
 571        sigma_delta->info = info;
 572        iio_device_set_drvdata(indio_dev, sigma_delta);
 573
 574        return 0;
 575}
 576EXPORT_SYMBOL_GPL(ad_sd_init);
 577
 578MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");
 579MODULE_DESCRIPTION("Analog Devices Sigma-Delta ADCs");
 580MODULE_LICENSE("GPL v2");
 581