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        unsigned long timeout;
 213
 214        ret = ad_sigma_delta_set_channel(sigma_delta, channel);
 215        if (ret)
 216                return ret;
 217
 218        spi_bus_lock(sigma_delta->spi->master);
 219        sigma_delta->bus_locked = true;
 220        reinit_completion(&sigma_delta->completion);
 221
 222        ret = ad_sigma_delta_set_mode(sigma_delta, mode);
 223        if (ret < 0)
 224                goto out;
 225
 226        sigma_delta->irq_dis = false;
 227        enable_irq(sigma_delta->spi->irq);
 228        timeout = wait_for_completion_timeout(&sigma_delta->completion, 2 * HZ);
 229        if (timeout == 0) {
 230                sigma_delta->irq_dis = true;
 231                disable_irq_nosync(sigma_delta->spi->irq);
 232                ret = -EIO;
 233        } else {
 234                ret = 0;
 235        }
 236out:
 237        sigma_delta->bus_locked = false;
 238        spi_bus_unlock(sigma_delta->spi->master);
 239        ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_IDLE);
 240
 241        return ret;
 242}
 243
 244/**
 245 * ad_sd_calibrate_all() - Performs channel calibration
 246 * @sigma_delta: The sigma delta device
 247 * @cb: Array of channels and calibration type to perform
 248 * @n: Number of items in cb
 249 *
 250 * Returns 0 on success, an error code otherwise.
 251 **/
 252int ad_sd_calibrate_all(struct ad_sigma_delta *sigma_delta,
 253        const struct ad_sd_calib_data *cb, unsigned int n)
 254{
 255        unsigned int i;
 256        int ret;
 257
 258        for (i = 0; i < n; i++) {
 259                ret = ad_sd_calibrate(sigma_delta, cb[i].mode, cb[i].channel);
 260                if (ret)
 261                        return ret;
 262        }
 263
 264        return 0;
 265}
 266EXPORT_SYMBOL_GPL(ad_sd_calibrate_all);
 267
 268/**
 269 * ad_sigma_delta_single_conversion() - Performs a single data conversion
 270 * @indio_dev: The IIO device
 271 * @chan: The conversion is done for this channel
 272 * @val: Pointer to the location where to store the read value
 273 *
 274 * Returns: 0 on success, an error value otherwise.
 275 */
 276int ad_sigma_delta_single_conversion(struct iio_dev *indio_dev,
 277        const struct iio_chan_spec *chan, int *val)
 278{
 279        struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev);
 280        unsigned int sample, raw_sample;
 281        int ret = 0;
 282
 283        if (iio_buffer_enabled(indio_dev))
 284                return -EBUSY;
 285
 286        mutex_lock(&indio_dev->mlock);
 287        ad_sigma_delta_set_channel(sigma_delta, chan->address);
 288
 289        spi_bus_lock(sigma_delta->spi->master);
 290        sigma_delta->bus_locked = true;
 291        reinit_completion(&sigma_delta->completion);
 292
 293        ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_SINGLE);
 294
 295        sigma_delta->irq_dis = false;
 296        enable_irq(sigma_delta->spi->irq);
 297        ret = wait_for_completion_interruptible_timeout(
 298                        &sigma_delta->completion, HZ);
 299
 300        sigma_delta->bus_locked = false;
 301        spi_bus_unlock(sigma_delta->spi->master);
 302
 303        if (ret == 0)
 304                ret = -EIO;
 305        if (ret < 0)
 306                goto out;
 307
 308        ret = ad_sd_read_reg(sigma_delta, AD_SD_REG_DATA,
 309                DIV_ROUND_UP(chan->scan_type.realbits + chan->scan_type.shift, 8),
 310                &raw_sample);
 311
 312out:
 313        if (!sigma_delta->irq_dis) {
 314                disable_irq_nosync(sigma_delta->spi->irq);
 315                sigma_delta->irq_dis = true;
 316        }
 317
 318        ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_IDLE);
 319        mutex_unlock(&indio_dev->mlock);
 320
 321        if (ret)
 322                return ret;
 323
 324        sample = raw_sample >> chan->scan_type.shift;
 325        sample &= (1 << chan->scan_type.realbits) - 1;
 326        *val = sample;
 327
 328        ret = ad_sigma_delta_postprocess_sample(sigma_delta, raw_sample);
 329        if (ret)
 330                return ret;
 331
 332        return IIO_VAL_INT;
 333}
 334EXPORT_SYMBOL_GPL(ad_sigma_delta_single_conversion);
 335
 336static int ad_sd_buffer_postenable(struct iio_dev *indio_dev)
 337{
 338        struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev);
 339        unsigned int channel;
 340        int ret;
 341
 342        ret = iio_triggered_buffer_postenable(indio_dev);
 343        if (ret < 0)
 344                return ret;
 345
 346        channel = find_first_bit(indio_dev->active_scan_mask,
 347                                 indio_dev->masklength);
 348        ret = ad_sigma_delta_set_channel(sigma_delta,
 349                indio_dev->channels[channel].address);
 350        if (ret)
 351                goto err_predisable;
 352
 353        spi_bus_lock(sigma_delta->spi->master);
 354        sigma_delta->bus_locked = true;
 355        ret = ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_CONTINUOUS);
 356        if (ret)
 357                goto err_unlock;
 358
 359        sigma_delta->irq_dis = false;
 360        enable_irq(sigma_delta->spi->irq);
 361
 362        return 0;
 363
 364err_unlock:
 365        spi_bus_unlock(sigma_delta->spi->master);
 366err_predisable:
 367
 368        return ret;
 369}
 370
 371static int ad_sd_buffer_postdisable(struct iio_dev *indio_dev)
 372{
 373        struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev);
 374
 375        reinit_completion(&sigma_delta->completion);
 376        wait_for_completion_timeout(&sigma_delta->completion, HZ);
 377
 378        if (!sigma_delta->irq_dis) {
 379                disable_irq_nosync(sigma_delta->spi->irq);
 380                sigma_delta->irq_dis = true;
 381        }
 382
 383        ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_IDLE);
 384
 385        sigma_delta->bus_locked = false;
 386        return spi_bus_unlock(sigma_delta->spi->master);
 387}
 388
 389static irqreturn_t ad_sd_trigger_handler(int irq, void *p)
 390{
 391        struct iio_poll_func *pf = p;
 392        struct iio_dev *indio_dev = pf->indio_dev;
 393        struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev);
 394        unsigned int reg_size;
 395        uint8_t data[16];
 396        int ret;
 397
 398        memset(data, 0x00, 16);
 399
 400        reg_size = indio_dev->channels[0].scan_type.realbits +
 401                        indio_dev->channels[0].scan_type.shift;
 402        reg_size = DIV_ROUND_UP(reg_size, 8);
 403
 404        switch (reg_size) {
 405        case 4:
 406        case 2:
 407        case 1:
 408                ret = ad_sd_read_reg_raw(sigma_delta, AD_SD_REG_DATA,
 409                        reg_size, &data[0]);
 410                break;
 411        case 3:
 412                /* We store 24 bit samples in a 32 bit word. Keep the upper
 413                 * byte set to zero. */
 414                ret = ad_sd_read_reg_raw(sigma_delta, AD_SD_REG_DATA,
 415                        reg_size, &data[1]);
 416                break;
 417        }
 418
 419        iio_push_to_buffers_with_timestamp(indio_dev, data, pf->timestamp);
 420
 421        iio_trigger_notify_done(indio_dev->trig);
 422        sigma_delta->irq_dis = false;
 423        enable_irq(sigma_delta->spi->irq);
 424
 425        return IRQ_HANDLED;
 426}
 427
 428static const struct iio_buffer_setup_ops ad_sd_buffer_setup_ops = {
 429        .postenable = &ad_sd_buffer_postenable,
 430        .predisable = &iio_triggered_buffer_predisable,
 431        .postdisable = &ad_sd_buffer_postdisable,
 432        .validate_scan_mask = &iio_validate_scan_mask_onehot,
 433};
 434
 435static irqreturn_t ad_sd_data_rdy_trig_poll(int irq, void *private)
 436{
 437        struct ad_sigma_delta *sigma_delta = private;
 438
 439        complete(&sigma_delta->completion);
 440        disable_irq_nosync(irq);
 441        sigma_delta->irq_dis = true;
 442        iio_trigger_poll(sigma_delta->trig);
 443
 444        return IRQ_HANDLED;
 445}
 446
 447/**
 448 * ad_sd_validate_trigger() - validate_trigger callback for ad_sigma_delta devices
 449 * @indio_dev: The IIO device
 450 * @trig: The new trigger
 451 *
 452 * Returns: 0 if the 'trig' matches the trigger registered by the ad_sigma_delta
 453 * device, -EINVAL otherwise.
 454 */
 455int ad_sd_validate_trigger(struct iio_dev *indio_dev, struct iio_trigger *trig)
 456{
 457        struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev);
 458
 459        if (sigma_delta->trig != trig)
 460                return -EINVAL;
 461
 462        return 0;
 463}
 464EXPORT_SYMBOL_GPL(ad_sd_validate_trigger);
 465
 466static const struct iio_trigger_ops ad_sd_trigger_ops = {
 467};
 468
 469static int ad_sd_probe_trigger(struct iio_dev *indio_dev)
 470{
 471        struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev);
 472        int ret;
 473
 474        sigma_delta->trig = iio_trigger_alloc("%s-dev%d", indio_dev->name,
 475                                                indio_dev->id);
 476        if (sigma_delta->trig == NULL) {
 477                ret = -ENOMEM;
 478                goto error_ret;
 479        }
 480        sigma_delta->trig->ops = &ad_sd_trigger_ops;
 481        init_completion(&sigma_delta->completion);
 482
 483        ret = request_irq(sigma_delta->spi->irq,
 484                          ad_sd_data_rdy_trig_poll,
 485                          IRQF_TRIGGER_LOW,
 486                          indio_dev->name,
 487                          sigma_delta);
 488        if (ret)
 489                goto error_free_trig;
 490
 491        if (!sigma_delta->irq_dis) {
 492                sigma_delta->irq_dis = true;
 493                disable_irq_nosync(sigma_delta->spi->irq);
 494        }
 495        sigma_delta->trig->dev.parent = &sigma_delta->spi->dev;
 496        iio_trigger_set_drvdata(sigma_delta->trig, sigma_delta);
 497
 498        ret = iio_trigger_register(sigma_delta->trig);
 499        if (ret)
 500                goto error_free_irq;
 501
 502        /* select default trigger */
 503        indio_dev->trig = iio_trigger_get(sigma_delta->trig);
 504
 505        return 0;
 506
 507error_free_irq:
 508        free_irq(sigma_delta->spi->irq, sigma_delta);
 509error_free_trig:
 510        iio_trigger_free(sigma_delta->trig);
 511error_ret:
 512        return ret;
 513}
 514
 515static void ad_sd_remove_trigger(struct iio_dev *indio_dev)
 516{
 517        struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev);
 518
 519        iio_trigger_unregister(sigma_delta->trig);
 520        free_irq(sigma_delta->spi->irq, sigma_delta);
 521        iio_trigger_free(sigma_delta->trig);
 522}
 523
 524/**
 525 * ad_sd_setup_buffer_and_trigger() -
 526 * @indio_dev: The IIO device
 527 */
 528int ad_sd_setup_buffer_and_trigger(struct iio_dev *indio_dev)
 529{
 530        int ret;
 531
 532        ret = iio_triggered_buffer_setup(indio_dev, &iio_pollfunc_store_time,
 533                        &ad_sd_trigger_handler, &ad_sd_buffer_setup_ops);
 534        if (ret)
 535                return ret;
 536
 537        ret = ad_sd_probe_trigger(indio_dev);
 538        if (ret) {
 539                iio_triggered_buffer_cleanup(indio_dev);
 540                return ret;
 541        }
 542
 543        return 0;
 544}
 545EXPORT_SYMBOL_GPL(ad_sd_setup_buffer_and_trigger);
 546
 547/**
 548 * ad_sd_cleanup_buffer_and_trigger() -
 549 * @indio_dev: The IIO device
 550 */
 551void ad_sd_cleanup_buffer_and_trigger(struct iio_dev *indio_dev)
 552{
 553        ad_sd_remove_trigger(indio_dev);
 554        iio_triggered_buffer_cleanup(indio_dev);
 555}
 556EXPORT_SYMBOL_GPL(ad_sd_cleanup_buffer_and_trigger);
 557
 558/**
 559 * ad_sd_init() - Initializes a ad_sigma_delta struct
 560 * @sigma_delta: The ad_sigma_delta device
 561 * @indio_dev: The IIO device which the Sigma Delta device is used for
 562 * @spi: The SPI device for the ad_sigma_delta device
 563 * @info: Device specific callbacks and options
 564 *
 565 * This function needs to be called before any other operations are performed on
 566 * the ad_sigma_delta struct.
 567 */
 568int ad_sd_init(struct ad_sigma_delta *sigma_delta, struct iio_dev *indio_dev,
 569        struct spi_device *spi, const struct ad_sigma_delta_info *info)
 570{
 571        sigma_delta->spi = spi;
 572        sigma_delta->info = info;
 573        iio_device_set_drvdata(indio_dev, sigma_delta);
 574
 575        return 0;
 576}
 577EXPORT_SYMBOL_GPL(ad_sd_init);
 578
 579MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");
 580MODULE_DESCRIPTION("Analog Devices Sigma-Delta ADCs");
 581MODULE_LICENSE("GPL v2");
 582