linux/drivers/iio/gyro/fxas21002c_core.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Driver for NXP FXAS21002C Gyroscope - Core
   4 *
   5 * Copyright (C) 2019 Linaro Ltd.
   6 */
   7
   8#include <linux/interrupt.h>
   9#include <linux/module.h>
  10#include <linux/of_irq.h>
  11#include <linux/pm.h>
  12#include <linux/pm_runtime.h>
  13#include <linux/regmap.h>
  14#include <linux/regulator/consumer.h>
  15
  16#include <linux/iio/events.h>
  17#include <linux/iio/iio.h>
  18#include <linux/iio/buffer.h>
  19#include <linux/iio/sysfs.h>
  20#include <linux/iio/trigger.h>
  21#include <linux/iio/trigger_consumer.h>
  22#include <linux/iio/triggered_buffer.h>
  23
  24#include "fxas21002c.h"
  25
  26#define FXAS21002C_CHIP_ID_1    0xD6
  27#define FXAS21002C_CHIP_ID_2    0xD7
  28
  29enum fxas21002c_mode_state {
  30        FXAS21002C_MODE_STANDBY,
  31        FXAS21002C_MODE_READY,
  32        FXAS21002C_MODE_ACTIVE,
  33};
  34
  35#define FXAS21002C_STANDBY_ACTIVE_TIME_MS       62
  36#define FXAS21002C_READY_ACTIVE_TIME_MS         7
  37
  38#define FXAS21002C_ODR_LIST_MAX         10
  39
  40#define FXAS21002C_SCALE_FRACTIONAL     32
  41#define FXAS21002C_RANGE_LIMIT_DOUBLE   2000
  42
  43#define FXAS21002C_AXIS_TO_REG(axis) (FXAS21002C_REG_OUT_X_MSB + ((axis) * 2))
  44
  45static const int fxas21002c_odr_values[] = {
  46        800, 400, 200, 100, 50, 25, 12, 12
  47};
  48
  49/*
  50 * These values are taken from the low-pass filter cutoff frequency calculated
  51 * ODR * 0.lpf_values. So, for ODR = 800Hz with a lpf value = 0.32
  52 * => LPF cutoff frequency = 800 * 0.32 = 256 Hz
  53 */
  54static const int fxas21002c_lpf_values[] = {
  55        32, 16, 8
  56};
  57
  58/*
  59 * These values are taken from the high-pass filter cutoff frequency calculated
  60 * ODR * 0.0hpf_values. So, for ODR = 800Hz with a hpf value = 0.018750
  61 * => HPF cutoff frequency = 800 * 0.018750 = 15 Hz
  62 */
  63static const int fxas21002c_hpf_values[] = {
  64        18750, 9625, 4875, 2475
  65};
  66
  67static const int fxas21002c_range_values[] = {
  68        4000, 2000, 1000, 500, 250
  69};
  70
  71struct fxas21002c_data {
  72        u8 chip_id;
  73        enum fxas21002c_mode_state mode;
  74        enum fxas21002c_mode_state prev_mode;
  75
  76        struct mutex lock;              /* serialize data access */
  77        struct regmap *regmap;
  78        struct regmap_field *regmap_fields[F_MAX_FIELDS];
  79        struct iio_trigger *dready_trig;
  80        s64 timestamp;
  81        int irq;
  82
  83        struct regulator *vdd;
  84        struct regulator *vddio;
  85
  86        /*
  87         * DMA (thus cache coherency maintenance) requires the
  88         * transfer buffers to live in their own cache lines.
  89         */
  90        s16 buffer[8] ____cacheline_aligned;
  91};
  92
  93enum fxas21002c_channel_index {
  94        CHANNEL_SCAN_INDEX_X,
  95        CHANNEL_SCAN_INDEX_Y,
  96        CHANNEL_SCAN_INDEX_Z,
  97        CHANNEL_SCAN_MAX,
  98};
  99
 100static int fxas21002c_odr_hz_from_value(struct fxas21002c_data *data, u8 value)
 101{
 102        int odr_value_max = ARRAY_SIZE(fxas21002c_odr_values) - 1;
 103
 104        value = min_t(u8, value, odr_value_max);
 105
 106        return fxas21002c_odr_values[value];
 107}
 108
 109static int fxas21002c_odr_value_from_hz(struct fxas21002c_data *data,
 110                                        unsigned int hz)
 111{
 112        int odr_table_size = ARRAY_SIZE(fxas21002c_odr_values);
 113        int i;
 114
 115        for (i = 0; i < odr_table_size; i++)
 116                if (fxas21002c_odr_values[i] == hz)
 117                        return i;
 118
 119        return -EINVAL;
 120}
 121
 122static int fxas21002c_lpf_bw_from_value(struct fxas21002c_data *data, u8 value)
 123{
 124        int lpf_value_max = ARRAY_SIZE(fxas21002c_lpf_values) - 1;
 125
 126        value = min_t(u8, value, lpf_value_max);
 127
 128        return fxas21002c_lpf_values[value];
 129}
 130
 131static int fxas21002c_lpf_value_from_bw(struct fxas21002c_data *data,
 132                                        unsigned int hz)
 133{
 134        int lpf_table_size = ARRAY_SIZE(fxas21002c_lpf_values);
 135        int i;
 136
 137        for (i = 0; i < lpf_table_size; i++)
 138                if (fxas21002c_lpf_values[i] == hz)
 139                        return i;
 140
 141        return -EINVAL;
 142}
 143
 144static int fxas21002c_hpf_sel_from_value(struct fxas21002c_data *data, u8 value)
 145{
 146        int hpf_value_max = ARRAY_SIZE(fxas21002c_hpf_values) - 1;
 147
 148        value = min_t(u8, value, hpf_value_max);
 149
 150        return fxas21002c_hpf_values[value];
 151}
 152
 153static int fxas21002c_hpf_value_from_sel(struct fxas21002c_data *data,
 154                                         unsigned int hz)
 155{
 156        int hpf_table_size = ARRAY_SIZE(fxas21002c_hpf_values);
 157        int i;
 158
 159        for (i = 0; i < hpf_table_size; i++)
 160                if (fxas21002c_hpf_values[i] == hz)
 161                        return i;
 162
 163        return -EINVAL;
 164}
 165
 166static int fxas21002c_range_fs_from_value(struct fxas21002c_data *data,
 167                                          u8 value)
 168{
 169        int range_value_max = ARRAY_SIZE(fxas21002c_range_values) - 1;
 170        unsigned int fs_double;
 171        int ret;
 172
 173        /* We need to check if FS_DOUBLE is enabled to offset the value */
 174        ret = regmap_field_read(data->regmap_fields[F_FS_DOUBLE], &fs_double);
 175        if (ret < 0)
 176                return ret;
 177
 178        if (!fs_double)
 179                value += 1;
 180
 181        value = min_t(u8, value, range_value_max);
 182
 183        return fxas21002c_range_values[value];
 184}
 185
 186static int fxas21002c_range_value_from_fs(struct fxas21002c_data *data,
 187                                          unsigned int range)
 188{
 189        int range_table_size = ARRAY_SIZE(fxas21002c_range_values);
 190        bool found = false;
 191        int fs_double = 0;
 192        int ret;
 193        int i;
 194
 195        for (i = 0; i < range_table_size; i++)
 196                if (fxas21002c_range_values[i] == range) {
 197                        found = true;
 198                        break;
 199                }
 200
 201        if (!found)
 202                return -EINVAL;
 203
 204        if (range > FXAS21002C_RANGE_LIMIT_DOUBLE)
 205                fs_double = 1;
 206
 207        ret = regmap_field_write(data->regmap_fields[F_FS_DOUBLE], fs_double);
 208        if (ret < 0)
 209                return ret;
 210
 211        return i;
 212}
 213
 214static int fxas21002c_mode_get(struct fxas21002c_data *data)
 215{
 216        unsigned int active;
 217        unsigned int ready;
 218        int ret;
 219
 220        ret = regmap_field_read(data->regmap_fields[F_ACTIVE], &active);
 221        if (ret < 0)
 222                return ret;
 223        if (active)
 224                return FXAS21002C_MODE_ACTIVE;
 225
 226        ret = regmap_field_read(data->regmap_fields[F_READY], &ready);
 227        if (ret < 0)
 228                return ret;
 229        if (ready)
 230                return FXAS21002C_MODE_READY;
 231
 232        return FXAS21002C_MODE_STANDBY;
 233}
 234
 235static int fxas21002c_mode_set(struct fxas21002c_data *data,
 236                               enum fxas21002c_mode_state mode)
 237{
 238        int ret;
 239
 240        if (mode == data->mode)
 241                return 0;
 242
 243        if (mode == FXAS21002C_MODE_READY)
 244                ret = regmap_field_write(data->regmap_fields[F_READY], 1);
 245        else
 246                ret = regmap_field_write(data->regmap_fields[F_READY], 0);
 247        if (ret < 0)
 248                return ret;
 249
 250        if (mode == FXAS21002C_MODE_ACTIVE)
 251                ret = regmap_field_write(data->regmap_fields[F_ACTIVE], 1);
 252        else
 253                ret = regmap_field_write(data->regmap_fields[F_ACTIVE], 0);
 254        if (ret < 0)
 255                return ret;
 256
 257        /* if going to active wait the setup times */
 258        if (mode == FXAS21002C_MODE_ACTIVE &&
 259            data->mode == FXAS21002C_MODE_STANDBY)
 260                msleep_interruptible(FXAS21002C_STANDBY_ACTIVE_TIME_MS);
 261
 262        if (data->mode == FXAS21002C_MODE_READY)
 263                msleep_interruptible(FXAS21002C_READY_ACTIVE_TIME_MS);
 264
 265        data->prev_mode = data->mode;
 266        data->mode = mode;
 267
 268        return ret;
 269}
 270
 271static int fxas21002c_write(struct fxas21002c_data *data,
 272                            enum fxas21002c_fields field, int bits)
 273{
 274        int actual_mode;
 275        int ret;
 276
 277        mutex_lock(&data->lock);
 278
 279        actual_mode = fxas21002c_mode_get(data);
 280        if (actual_mode < 0) {
 281                ret = actual_mode;
 282                goto out_unlock;
 283        }
 284
 285        ret = fxas21002c_mode_set(data, FXAS21002C_MODE_READY);
 286        if (ret < 0)
 287                goto out_unlock;
 288
 289        ret = regmap_field_write(data->regmap_fields[field], bits);
 290        if (ret < 0)
 291                goto out_unlock;
 292
 293        ret = fxas21002c_mode_set(data, data->prev_mode);
 294
 295out_unlock:
 296        mutex_unlock(&data->lock);
 297
 298        return ret;
 299}
 300
 301static int  fxas21002c_pm_get(struct fxas21002c_data *data)
 302{
 303        struct device *dev = regmap_get_device(data->regmap);
 304        int ret;
 305
 306        ret = pm_runtime_get_sync(dev);
 307        if (ret < 0)
 308                pm_runtime_put_noidle(dev);
 309
 310        return ret;
 311}
 312
 313static int  fxas21002c_pm_put(struct fxas21002c_data *data)
 314{
 315        struct device *dev = regmap_get_device(data->regmap);
 316
 317        pm_runtime_mark_last_busy(dev);
 318
 319        return pm_runtime_put_autosuspend(dev);
 320}
 321
 322static int fxas21002c_temp_get(struct fxas21002c_data *data, int *val)
 323{
 324        struct device *dev = regmap_get_device(data->regmap);
 325        unsigned int temp;
 326        int ret;
 327
 328        mutex_lock(&data->lock);
 329        ret = fxas21002c_pm_get(data);
 330        if (ret < 0)
 331                goto data_unlock;
 332
 333        ret = regmap_field_read(data->regmap_fields[F_TEMP], &temp);
 334        if (ret < 0) {
 335                dev_err(dev, "failed to read temp: %d\n", ret);
 336                goto data_unlock;
 337        }
 338
 339        *val = sign_extend32(temp, 7);
 340
 341        ret = fxas21002c_pm_put(data);
 342        if (ret < 0)
 343                goto data_unlock;
 344
 345        ret = IIO_VAL_INT;
 346
 347data_unlock:
 348        mutex_unlock(&data->lock);
 349
 350        return ret;
 351}
 352
 353static int fxas21002c_axis_get(struct fxas21002c_data *data,
 354                               int index, int *val)
 355{
 356        struct device *dev = regmap_get_device(data->regmap);
 357        __be16 axis_be;
 358        int ret;
 359
 360        mutex_lock(&data->lock);
 361        ret = fxas21002c_pm_get(data);
 362        if (ret < 0)
 363                goto data_unlock;
 364
 365        ret = regmap_bulk_read(data->regmap, FXAS21002C_AXIS_TO_REG(index),
 366                               &axis_be, sizeof(axis_be));
 367        if (ret < 0) {
 368                dev_err(dev, "failed to read axis: %d: %d\n", index, ret);
 369                goto data_unlock;
 370        }
 371
 372        *val = sign_extend32(be16_to_cpu(axis_be), 15);
 373
 374        ret = fxas21002c_pm_put(data);
 375        if (ret < 0)
 376                goto data_unlock;
 377
 378        ret = IIO_VAL_INT;
 379
 380data_unlock:
 381        mutex_unlock(&data->lock);
 382
 383        return ret;
 384}
 385
 386static int fxas21002c_odr_get(struct fxas21002c_data *data, int *odr)
 387{
 388        unsigned int odr_bits;
 389        int ret;
 390
 391        mutex_lock(&data->lock);
 392        ret = regmap_field_read(data->regmap_fields[F_DR], &odr_bits);
 393        if (ret < 0)
 394                goto data_unlock;
 395
 396        *odr = fxas21002c_odr_hz_from_value(data, odr_bits);
 397
 398        ret = IIO_VAL_INT;
 399
 400data_unlock:
 401        mutex_unlock(&data->lock);
 402
 403        return ret;
 404}
 405
 406static int fxas21002c_odr_set(struct fxas21002c_data *data, int odr)
 407{
 408        int odr_bits;
 409
 410        odr_bits = fxas21002c_odr_value_from_hz(data, odr);
 411        if (odr_bits < 0)
 412                return odr_bits;
 413
 414        return fxas21002c_write(data, F_DR, odr_bits);
 415}
 416
 417static int fxas21002c_lpf_get(struct fxas21002c_data *data, int *val2)
 418{
 419        unsigned int bw_bits;
 420        int ret;
 421
 422        mutex_lock(&data->lock);
 423        ret = regmap_field_read(data->regmap_fields[F_BW], &bw_bits);
 424        if (ret < 0)
 425                goto data_unlock;
 426
 427        *val2 = fxas21002c_lpf_bw_from_value(data, bw_bits) * 10000;
 428
 429        ret = IIO_VAL_INT_PLUS_MICRO;
 430
 431data_unlock:
 432        mutex_unlock(&data->lock);
 433
 434        return ret;
 435}
 436
 437static int fxas21002c_lpf_set(struct fxas21002c_data *data, int bw)
 438{
 439        int bw_bits;
 440        int odr;
 441        int ret;
 442
 443        bw_bits = fxas21002c_lpf_value_from_bw(data, bw);
 444        if (bw_bits < 0)
 445                return bw_bits;
 446
 447        /*
 448         * From table 33 of the device spec, for ODR = 25Hz and 12.5 value 0.08
 449         * is not allowed and for ODR = 12.5 value 0.16 is also not allowed
 450         */
 451        ret = fxas21002c_odr_get(data, &odr);
 452        if (ret < 0)
 453                return -EINVAL;
 454
 455        if ((odr == 25 && bw_bits > 0x01) || (odr == 12 && bw_bits > 0))
 456                return -EINVAL;
 457
 458        return fxas21002c_write(data, F_BW, bw_bits);
 459}
 460
 461static int fxas21002c_hpf_get(struct fxas21002c_data *data, int *val2)
 462{
 463        unsigned int sel_bits;
 464        int ret;
 465
 466        mutex_lock(&data->lock);
 467        ret = regmap_field_read(data->regmap_fields[F_SEL], &sel_bits);
 468        if (ret < 0)
 469                goto data_unlock;
 470
 471        *val2 = fxas21002c_hpf_sel_from_value(data, sel_bits);
 472
 473        ret = IIO_VAL_INT_PLUS_MICRO;
 474
 475data_unlock:
 476        mutex_unlock(&data->lock);
 477
 478        return ret;
 479}
 480
 481static int fxas21002c_hpf_set(struct fxas21002c_data *data, int sel)
 482{
 483        int sel_bits;
 484
 485        sel_bits = fxas21002c_hpf_value_from_sel(data, sel);
 486        if (sel_bits < 0)
 487                return sel_bits;
 488
 489        return fxas21002c_write(data, F_SEL, sel_bits);
 490}
 491
 492static int fxas21002c_scale_get(struct fxas21002c_data *data, int *val)
 493{
 494        int fs_bits;
 495        int scale;
 496        int ret;
 497
 498        mutex_lock(&data->lock);
 499        ret = regmap_field_read(data->regmap_fields[F_FS], &fs_bits);
 500        if (ret < 0)
 501                goto data_unlock;
 502
 503        scale = fxas21002c_range_fs_from_value(data, fs_bits);
 504        if (scale < 0) {
 505                ret = scale;
 506                goto data_unlock;
 507        }
 508
 509        *val = scale;
 510
 511data_unlock:
 512        mutex_unlock(&data->lock);
 513
 514        return ret;
 515}
 516
 517static int fxas21002c_scale_set(struct fxas21002c_data *data, int range)
 518{
 519        int fs_bits;
 520
 521        fs_bits = fxas21002c_range_value_from_fs(data, range);
 522        if (fs_bits < 0)
 523                return fs_bits;
 524
 525        return fxas21002c_write(data, F_FS, fs_bits);
 526}
 527
 528static int fxas21002c_read_raw(struct iio_dev *indio_dev,
 529                               struct iio_chan_spec const *chan, int *val,
 530                               int *val2, long mask)
 531{
 532        struct fxas21002c_data *data = iio_priv(indio_dev);
 533        int ret;
 534
 535        switch (mask) {
 536        case IIO_CHAN_INFO_RAW:
 537                switch (chan->type) {
 538                case IIO_TEMP:
 539                        return fxas21002c_temp_get(data, val);
 540                case IIO_ANGL_VEL:
 541                        return fxas21002c_axis_get(data, chan->scan_index, val);
 542                default:
 543                        return -EINVAL;
 544                }
 545        case IIO_CHAN_INFO_SCALE:
 546                switch (chan->type) {
 547                case IIO_ANGL_VEL:
 548                        *val2 = FXAS21002C_SCALE_FRACTIONAL;
 549                        ret = fxas21002c_scale_get(data, val);
 550                        if (ret < 0)
 551                                return ret;
 552
 553                        return IIO_VAL_FRACTIONAL;
 554                default:
 555                        return -EINVAL;
 556                }
 557        case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY:
 558                *val = 0;
 559                return fxas21002c_lpf_get(data, val2);
 560        case IIO_CHAN_INFO_HIGH_PASS_FILTER_3DB_FREQUENCY:
 561                *val = 0;
 562                return fxas21002c_hpf_get(data, val2);
 563        case IIO_CHAN_INFO_SAMP_FREQ:
 564                *val2 = 0;
 565                return fxas21002c_odr_get(data, val);
 566        default:
 567                return -EINVAL;
 568        }
 569}
 570
 571static int fxas21002c_write_raw(struct iio_dev *indio_dev,
 572                                struct iio_chan_spec const *chan, int val,
 573                                int val2, long mask)
 574{
 575        struct fxas21002c_data *data = iio_priv(indio_dev);
 576        int range;
 577
 578        switch (mask) {
 579        case IIO_CHAN_INFO_SAMP_FREQ:
 580                if (val2)
 581                        return -EINVAL;
 582
 583                return fxas21002c_odr_set(data, val);
 584        case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY:
 585                if (val)
 586                        return -EINVAL;
 587
 588                val2 = val2 / 10000;
 589                return fxas21002c_lpf_set(data, val2);
 590        case IIO_CHAN_INFO_SCALE:
 591                switch (chan->type) {
 592                case IIO_ANGL_VEL:
 593                        range = (((val * 1000 + val2 / 1000) *
 594                                  FXAS21002C_SCALE_FRACTIONAL) / 1000);
 595                        return fxas21002c_scale_set(data, range);
 596                default:
 597                        return -EINVAL;
 598                }
 599        case IIO_CHAN_INFO_HIGH_PASS_FILTER_3DB_FREQUENCY:
 600                return fxas21002c_hpf_set(data, val2);
 601        default:
 602                return -EINVAL;
 603        }
 604}
 605
 606static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("12.5 25 50 100 200 400 800");
 607
 608static IIO_CONST_ATTR(in_anglvel_filter_low_pass_3db_frequency_available,
 609                      "0.32 0.16 0.08");
 610
 611static IIO_CONST_ATTR(in_anglvel_filter_high_pass_3db_frequency_available,
 612                      "0.018750 0.009625 0.004875 0.002475");
 613
 614static IIO_CONST_ATTR(in_anglvel_scale_available,
 615                      "125.0 62.5 31.25 15.625 7.8125");
 616
 617static struct attribute *fxas21002c_attributes[] = {
 618        &iio_const_attr_sampling_frequency_available.dev_attr.attr,
 619        &iio_const_attr_in_anglvel_filter_low_pass_3db_frequency_available.dev_attr.attr,
 620        &iio_const_attr_in_anglvel_filter_high_pass_3db_frequency_available.dev_attr.attr,
 621        &iio_const_attr_in_anglvel_scale_available.dev_attr.attr,
 622        NULL,
 623};
 624
 625static const struct attribute_group fxas21002c_attrs_group = {
 626        .attrs = fxas21002c_attributes,
 627};
 628
 629#define FXAS21002C_CHANNEL(_axis) {                                     \
 630        .type = IIO_ANGL_VEL,                                           \
 631        .modified = 1,                                                  \
 632        .channel2 = IIO_MOD_##_axis,                                    \
 633        .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),                   \
 634        .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) |          \
 635                BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY) |      \
 636                BIT(IIO_CHAN_INFO_HIGH_PASS_FILTER_3DB_FREQUENCY) |     \
 637                BIT(IIO_CHAN_INFO_SAMP_FREQ),                           \
 638        .scan_index = CHANNEL_SCAN_INDEX_##_axis,                       \
 639        .scan_type = {                                                  \
 640                .sign = 's',                                            \
 641                .realbits = 16,                                         \
 642                .storagebits = 16,                                      \
 643                .endianness = IIO_BE,                                   \
 644        },                                                              \
 645}
 646
 647static const struct iio_chan_spec fxas21002c_channels[] = {
 648        {
 649                .type = IIO_TEMP,
 650                .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
 651                .scan_index = -1,
 652        },
 653        FXAS21002C_CHANNEL(X),
 654        FXAS21002C_CHANNEL(Y),
 655        FXAS21002C_CHANNEL(Z),
 656};
 657
 658static const struct iio_info fxas21002c_info = {
 659        .attrs                  = &fxas21002c_attrs_group,
 660        .read_raw               = &fxas21002c_read_raw,
 661        .write_raw              = &fxas21002c_write_raw,
 662};
 663
 664static irqreturn_t fxas21002c_trigger_handler(int irq, void *p)
 665{
 666        struct iio_poll_func *pf = p;
 667        struct iio_dev *indio_dev = pf->indio_dev;
 668        struct fxas21002c_data *data = iio_priv(indio_dev);
 669        int ret;
 670
 671        mutex_lock(&data->lock);
 672        ret = regmap_bulk_read(data->regmap, FXAS21002C_REG_OUT_X_MSB,
 673                               data->buffer, CHANNEL_SCAN_MAX * sizeof(s16));
 674        if (ret < 0)
 675                goto out_unlock;
 676
 677        iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
 678                                           data->timestamp);
 679
 680out_unlock:
 681        mutex_unlock(&data->lock);
 682
 683        iio_trigger_notify_done(indio_dev->trig);
 684
 685        return IRQ_HANDLED;
 686}
 687
 688static int fxas21002c_chip_init(struct fxas21002c_data *data)
 689{
 690        struct device *dev = regmap_get_device(data->regmap);
 691        unsigned int chip_id;
 692        int ret;
 693
 694        ret = regmap_field_read(data->regmap_fields[F_WHO_AM_I], &chip_id);
 695        if (ret < 0)
 696                return ret;
 697
 698        if (chip_id != FXAS21002C_CHIP_ID_1 &&
 699            chip_id != FXAS21002C_CHIP_ID_2) {
 700                dev_err(dev, "chip id 0x%02x is not supported\n", chip_id);
 701                return -EINVAL;
 702        }
 703
 704        data->chip_id = chip_id;
 705
 706        ret = fxas21002c_mode_set(data, FXAS21002C_MODE_STANDBY);
 707        if (ret < 0)
 708                return ret;
 709
 710        /* Set ODR to 200HZ as default */
 711        ret = fxas21002c_odr_set(data, 200);
 712        if (ret < 0)
 713                dev_err(dev, "failed to set ODR: %d\n", ret);
 714
 715        return ret;
 716}
 717
 718static int fxas21002c_data_rdy_trigger_set_state(struct iio_trigger *trig,
 719                                                 bool state)
 720{
 721        struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
 722        struct fxas21002c_data *data = iio_priv(indio_dev);
 723
 724        return regmap_field_write(data->regmap_fields[F_INT_EN_DRDY], state);
 725}
 726
 727static const struct iio_trigger_ops fxas21002c_trigger_ops = {
 728        .set_trigger_state = &fxas21002c_data_rdy_trigger_set_state,
 729};
 730
 731static irqreturn_t fxas21002c_data_rdy_handler(int irq, void *private)
 732{
 733        struct iio_dev *indio_dev = private;
 734        struct fxas21002c_data *data = iio_priv(indio_dev);
 735
 736        data->timestamp = iio_get_time_ns(indio_dev);
 737
 738        return IRQ_WAKE_THREAD;
 739}
 740
 741static irqreturn_t fxas21002c_data_rdy_thread(int irq, void *private)
 742{
 743        struct iio_dev *indio_dev = private;
 744        struct fxas21002c_data *data = iio_priv(indio_dev);
 745        unsigned int data_ready;
 746        int ret;
 747
 748        ret = regmap_field_read(data->regmap_fields[F_SRC_DRDY], &data_ready);
 749        if (ret < 0)
 750                return IRQ_NONE;
 751
 752        if (!data_ready)
 753                return IRQ_NONE;
 754
 755        iio_trigger_poll_chained(data->dready_trig);
 756
 757        return IRQ_HANDLED;
 758}
 759
 760static int fxas21002c_trigger_probe(struct fxas21002c_data *data)
 761{
 762        struct device *dev = regmap_get_device(data->regmap);
 763        struct iio_dev *indio_dev = dev_get_drvdata(dev);
 764        struct device_node *np = indio_dev->dev.of_node;
 765        unsigned long irq_trig;
 766        bool irq_open_drain;
 767        int irq1;
 768        int ret;
 769
 770        if (!data->irq)
 771                return 0;
 772
 773        irq1 = of_irq_get_byname(np, "INT1");
 774
 775        if (irq1 == data->irq) {
 776                dev_info(dev, "using interrupt line INT1\n");
 777                ret = regmap_field_write(data->regmap_fields[F_INT_CFG_DRDY],
 778                                         1);
 779                if (ret < 0)
 780                        return ret;
 781        }
 782
 783        dev_info(dev, "using interrupt line INT2\n");
 784
 785        irq_open_drain = of_property_read_bool(np, "drive-open-drain");
 786
 787        data->dready_trig = devm_iio_trigger_alloc(dev, "%s-dev%d",
 788                                                   indio_dev->name,
 789                                                   indio_dev->id);
 790        if (!data->dready_trig)
 791                return -ENOMEM;
 792
 793        irq_trig = irqd_get_trigger_type(irq_get_irq_data(data->irq));
 794
 795        if (irq_trig == IRQF_TRIGGER_RISING) {
 796                ret = regmap_field_write(data->regmap_fields[F_IPOL], 1);
 797                if (ret < 0)
 798                        return ret;
 799        }
 800
 801        if (irq_open_drain)
 802                irq_trig |= IRQF_SHARED;
 803
 804        ret = devm_request_threaded_irq(dev, data->irq,
 805                                        fxas21002c_data_rdy_handler,
 806                                        fxas21002c_data_rdy_thread,
 807                                        irq_trig, "fxas21002c_data_ready",
 808                                        indio_dev);
 809        if (ret < 0)
 810                return ret;
 811
 812        data->dready_trig->dev.parent = dev;
 813        data->dready_trig->ops = &fxas21002c_trigger_ops;
 814        iio_trigger_set_drvdata(data->dready_trig, indio_dev);
 815
 816        return devm_iio_trigger_register(dev, data->dready_trig);
 817}
 818
 819static int fxas21002c_power_enable(struct fxas21002c_data *data)
 820{
 821        int ret;
 822
 823        ret = regulator_enable(data->vdd);
 824        if (ret < 0)
 825                return ret;
 826
 827        ret = regulator_enable(data->vddio);
 828        if (ret < 0) {
 829                regulator_disable(data->vdd);
 830                return ret;
 831        }
 832
 833        return 0;
 834}
 835
 836static void fxas21002c_power_disable(struct fxas21002c_data *data)
 837{
 838        regulator_disable(data->vdd);
 839        regulator_disable(data->vddio);
 840}
 841
 842static void fxas21002c_power_disable_action(void *_data)
 843{
 844        struct fxas21002c_data *data = _data;
 845
 846        fxas21002c_power_disable(data);
 847}
 848
 849static int fxas21002c_regulators_get(struct fxas21002c_data *data)
 850{
 851        struct device *dev = regmap_get_device(data->regmap);
 852
 853        data->vdd = devm_regulator_get(dev->parent, "vdd");
 854        if (IS_ERR(data->vdd))
 855                return PTR_ERR(data->vdd);
 856
 857        data->vddio = devm_regulator_get(dev->parent, "vddio");
 858
 859        return PTR_ERR_OR_ZERO(data->vddio);
 860}
 861
 862int fxas21002c_core_probe(struct device *dev, struct regmap *regmap, int irq,
 863                          const char *name)
 864{
 865        struct fxas21002c_data *data;
 866        struct iio_dev *indio_dev;
 867        struct regmap_field *f;
 868        int i;
 869        int ret;
 870
 871        indio_dev = devm_iio_device_alloc(dev, sizeof(*data));
 872        if (!indio_dev)
 873                return -ENOMEM;
 874
 875        data = iio_priv(indio_dev);
 876        dev_set_drvdata(dev, indio_dev);
 877        data->irq = irq;
 878        data->regmap = regmap;
 879
 880        for (i = 0; i < F_MAX_FIELDS; i++) {
 881                f = devm_regmap_field_alloc(dev, data->regmap,
 882                                            fxas21002c_reg_fields[i]);
 883                if (IS_ERR(f))
 884                        return PTR_ERR(f);
 885
 886                data->regmap_fields[i] = f;
 887        }
 888
 889        mutex_init(&data->lock);
 890
 891        ret = fxas21002c_regulators_get(data);
 892        if (ret < 0)
 893                return ret;
 894
 895        ret = fxas21002c_power_enable(data);
 896        if (ret < 0)
 897                return ret;
 898
 899        ret = devm_add_action_or_reset(dev, fxas21002c_power_disable_action,
 900                                       data);
 901        if (ret < 0)
 902                return ret;
 903
 904        ret = fxas21002c_chip_init(data);
 905        if (ret < 0)
 906                return ret;
 907
 908        indio_dev->dev.parent = dev;
 909        indio_dev->channels = fxas21002c_channels;
 910        indio_dev->num_channels = ARRAY_SIZE(fxas21002c_channels);
 911        indio_dev->name = name;
 912        indio_dev->modes = INDIO_DIRECT_MODE;
 913        indio_dev->info = &fxas21002c_info;
 914
 915        ret = fxas21002c_trigger_probe(data);
 916        if (ret < 0)
 917                return ret;
 918
 919        ret = devm_iio_triggered_buffer_setup(dev, indio_dev, NULL,
 920                                              fxas21002c_trigger_handler, NULL);
 921        if (ret < 0)
 922                return ret;
 923
 924        ret = pm_runtime_set_active(dev);
 925        if (ret)
 926                return ret;
 927
 928        pm_runtime_enable(dev);
 929        pm_runtime_set_autosuspend_delay(dev, 2000);
 930        pm_runtime_use_autosuspend(dev);
 931
 932        ret = iio_device_register(indio_dev);
 933        if (ret < 0)
 934                goto pm_disable;
 935
 936        return 0;
 937
 938pm_disable:
 939        pm_runtime_disable(dev);
 940        pm_runtime_set_suspended(dev);
 941        pm_runtime_put_noidle(dev);
 942
 943        return ret;
 944}
 945EXPORT_SYMBOL_GPL(fxas21002c_core_probe);
 946
 947void fxas21002c_core_remove(struct device *dev)
 948{
 949        struct iio_dev *indio_dev = dev_get_drvdata(dev);
 950
 951        iio_device_unregister(indio_dev);
 952
 953        pm_runtime_disable(dev);
 954        pm_runtime_set_suspended(dev);
 955        pm_runtime_put_noidle(dev);
 956}
 957EXPORT_SYMBOL_GPL(fxas21002c_core_remove);
 958
 959static int __maybe_unused fxas21002c_suspend(struct device *dev)
 960{
 961        struct fxas21002c_data *data = iio_priv(dev_get_drvdata(dev));
 962
 963        fxas21002c_mode_set(data, FXAS21002C_MODE_STANDBY);
 964        fxas21002c_power_disable(data);
 965
 966        return 0;
 967}
 968
 969static int __maybe_unused fxas21002c_resume(struct device *dev)
 970{
 971        struct fxas21002c_data *data = iio_priv(dev_get_drvdata(dev));
 972        int ret;
 973
 974        ret = fxas21002c_power_enable(data);
 975        if (ret < 0)
 976                return ret;
 977
 978        return fxas21002c_mode_set(data, data->prev_mode);
 979}
 980
 981static int __maybe_unused fxas21002c_runtime_suspend(struct device *dev)
 982{
 983        struct fxas21002c_data *data = iio_priv(dev_get_drvdata(dev));
 984
 985        return fxas21002c_mode_set(data, FXAS21002C_MODE_READY);
 986}
 987
 988static int __maybe_unused fxas21002c_runtime_resume(struct device *dev)
 989{
 990        struct fxas21002c_data *data = iio_priv(dev_get_drvdata(dev));
 991
 992        return fxas21002c_mode_set(data, FXAS21002C_MODE_ACTIVE);
 993}
 994
 995const struct dev_pm_ops fxas21002c_pm_ops = {
 996        SET_SYSTEM_SLEEP_PM_OPS(fxas21002c_suspend, fxas21002c_resume)
 997        SET_RUNTIME_PM_OPS(fxas21002c_runtime_suspend,
 998                           fxas21002c_runtime_resume, NULL)
 999};
1000EXPORT_SYMBOL_GPL(fxas21002c_pm_ops);
1001
1002MODULE_AUTHOR("Rui Miguel Silva <rui.silva@linaro.org>");
1003MODULE_LICENSE("GPL v2");
1004MODULE_DESCRIPTION("FXAS21002C Gyro driver");
1005