linux/drivers/iio/accel/stk8ba50.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/**
   3 * Sensortek STK8BA50 3-Axis Accelerometer
   4 *
   5 * Copyright (c) 2015, Intel Corporation.
   6 *
   7 * STK8BA50 7-bit I2C address: 0x18.
   8 */
   9
  10#include <linux/acpi.h>
  11#include <linux/i2c.h>
  12#include <linux/interrupt.h>
  13#include <linux/kernel.h>
  14#include <linux/module.h>
  15#include <linux/iio/buffer.h>
  16#include <linux/iio/iio.h>
  17#include <linux/iio/sysfs.h>
  18#include <linux/iio/trigger.h>
  19#include <linux/iio/triggered_buffer.h>
  20#include <linux/iio/trigger_consumer.h>
  21
  22#define STK8BA50_REG_XOUT                       0x02
  23#define STK8BA50_REG_YOUT                       0x04
  24#define STK8BA50_REG_ZOUT                       0x06
  25#define STK8BA50_REG_RANGE                      0x0F
  26#define STK8BA50_REG_BWSEL                      0x10
  27#define STK8BA50_REG_POWMODE                    0x11
  28#define STK8BA50_REG_SWRST                      0x14
  29#define STK8BA50_REG_INTEN2                     0x17
  30#define STK8BA50_REG_INTMAP2                    0x1A
  31
  32#define STK8BA50_MODE_NORMAL                    0
  33#define STK8BA50_MODE_SUSPEND                   1
  34#define STK8BA50_MODE_POWERBIT                  BIT(7)
  35#define STK8BA50_DATA_SHIFT                     6
  36#define STK8BA50_RESET_CMD                      0xB6
  37#define STK8BA50_SR_1792HZ_IDX                  7
  38#define STK8BA50_DREADY_INT_MASK                0x10
  39#define STK8BA50_DREADY_INT_MAP                 0x81
  40#define STK8BA50_ALL_CHANNEL_MASK               7
  41#define STK8BA50_ALL_CHANNEL_SIZE               6
  42
  43#define STK8BA50_DRIVER_NAME                    "stk8ba50"
  44#define STK8BA50_IRQ_NAME                       "stk8ba50_event"
  45
  46#define STK8BA50_SCALE_AVAIL                    "0.0384 0.0767 0.1534 0.3069"
  47
  48/*
  49 * The accelerometer has four measurement ranges:
  50 * +/-2g; +/-4g; +/-8g; +/-16g
  51 *
  52 * Acceleration values are 10-bit, 2's complement.
  53 * Scales are calculated as following:
  54 *
  55 * scale1 = (2 + 2) * 9.81 / (2^10 - 1)   = 0.0384
  56 * scale2 = (4 + 4) * 9.81 / (2^10 - 1)   = 0.0767
  57 * etc.
  58 *
  59 * Scales are stored in this format:
  60 * { <register value>, <scale value> }
  61 *
  62 * Locally, the range is stored as a table index.
  63 */
  64static const struct {
  65        u8 reg_val;
  66        u32 scale_val;
  67} stk8ba50_scale_table[] = {
  68        {3, 38400}, {5, 76700}, {8, 153400}, {12, 306900}
  69};
  70
  71/* Sample rates are stored as { <register value>, <Hz value> } */
  72static const struct {
  73        u8 reg_val;
  74        u16 samp_freq;
  75} stk8ba50_samp_freq_table[] = {
  76        {0x08, 14},  {0x09, 25},  {0x0A, 56},  {0x0B, 112},
  77        {0x0C, 224}, {0x0D, 448}, {0x0E, 896}, {0x0F, 1792}
  78};
  79
  80/* Used to map scan mask bits to their corresponding channel register. */
  81static const int stk8ba50_channel_table[] = {
  82        STK8BA50_REG_XOUT,
  83        STK8BA50_REG_YOUT,
  84        STK8BA50_REG_ZOUT
  85};
  86
  87struct stk8ba50_data {
  88        struct i2c_client *client;
  89        struct mutex lock;
  90        int range;
  91        u8 sample_rate_idx;
  92        struct iio_trigger *dready_trig;
  93        bool dready_trigger_on;
  94        /*
  95         * 3 x 16-bit channels (10-bit data, 6-bit padding) +
  96         * 1 x 16 padding +
  97         * 4 x 16 64-bit timestamp
  98         */
  99        s16 buffer[8];
 100};
 101
 102#define STK8BA50_ACCEL_CHANNEL(index, reg, axis) {                      \
 103        .type = IIO_ACCEL,                                              \
 104        .address = reg,                                                 \
 105        .modified = 1,                                                  \
 106        .channel2 = IIO_MOD_##axis,                                     \
 107        .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),                   \
 108        .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),           \
 109                                    BIT(IIO_CHAN_INFO_SAMP_FREQ),       \
 110        .scan_index = index,                                            \
 111        .scan_type = {                                                  \
 112                .sign = 's',                                            \
 113                .realbits = 10,                                         \
 114                .storagebits = 16,                                      \
 115                .shift = STK8BA50_DATA_SHIFT,                           \
 116                .endianness = IIO_CPU,                                  \
 117        },                                                              \
 118}
 119
 120static const struct iio_chan_spec stk8ba50_channels[] = {
 121        STK8BA50_ACCEL_CHANNEL(0, STK8BA50_REG_XOUT, X),
 122        STK8BA50_ACCEL_CHANNEL(1, STK8BA50_REG_YOUT, Y),
 123        STK8BA50_ACCEL_CHANNEL(2, STK8BA50_REG_ZOUT, Z),
 124        IIO_CHAN_SOFT_TIMESTAMP(3),
 125};
 126
 127static IIO_CONST_ATTR(in_accel_scale_available, STK8BA50_SCALE_AVAIL);
 128
 129static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("14 25 56 112 224 448 896 1792");
 130
 131static struct attribute *stk8ba50_attributes[] = {
 132        &iio_const_attr_in_accel_scale_available.dev_attr.attr,
 133        &iio_const_attr_sampling_frequency_available.dev_attr.attr,
 134        NULL,
 135};
 136
 137static const struct attribute_group stk8ba50_attribute_group = {
 138        .attrs = stk8ba50_attributes
 139};
 140
 141static int stk8ba50_read_accel(struct stk8ba50_data *data, u8 reg)
 142{
 143        int ret;
 144        struct i2c_client *client = data->client;
 145
 146        ret = i2c_smbus_read_word_data(client, reg);
 147        if (ret < 0) {
 148                dev_err(&client->dev, "register read failed\n");
 149                return ret;
 150        }
 151
 152        return ret;
 153}
 154
 155static int stk8ba50_data_rdy_trigger_set_state(struct iio_trigger *trig,
 156                                               bool state)
 157{
 158        struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
 159        struct stk8ba50_data *data = iio_priv(indio_dev);
 160        int ret;
 161
 162        if (state)
 163                ret = i2c_smbus_write_byte_data(data->client,
 164                        STK8BA50_REG_INTEN2, STK8BA50_DREADY_INT_MASK);
 165        else
 166                ret = i2c_smbus_write_byte_data(data->client,
 167                        STK8BA50_REG_INTEN2, 0x00);
 168
 169        if (ret < 0)
 170                dev_err(&data->client->dev, "failed to set trigger state\n");
 171        else
 172                data->dready_trigger_on = state;
 173
 174        return ret;
 175}
 176
 177static const struct iio_trigger_ops stk8ba50_trigger_ops = {
 178        .set_trigger_state = stk8ba50_data_rdy_trigger_set_state,
 179};
 180
 181static int stk8ba50_set_power(struct stk8ba50_data *data, bool mode)
 182{
 183        int ret;
 184        u8 masked_reg;
 185        struct i2c_client *client = data->client;
 186
 187        ret = i2c_smbus_read_byte_data(client, STK8BA50_REG_POWMODE);
 188        if (ret < 0)
 189                goto exit_err;
 190
 191        if (mode)
 192                masked_reg = ret | STK8BA50_MODE_POWERBIT;
 193        else
 194                masked_reg = ret & (~STK8BA50_MODE_POWERBIT);
 195
 196        ret = i2c_smbus_write_byte_data(client, STK8BA50_REG_POWMODE,
 197                                        masked_reg);
 198        if (ret < 0)
 199                goto exit_err;
 200
 201        return ret;
 202
 203exit_err:
 204        dev_err(&client->dev, "failed to change sensor mode\n");
 205        return ret;
 206}
 207
 208static int stk8ba50_read_raw(struct iio_dev *indio_dev,
 209                             struct iio_chan_spec const *chan,
 210                             int *val, int *val2, long mask)
 211{
 212        struct stk8ba50_data *data = iio_priv(indio_dev);
 213        int ret;
 214
 215        switch (mask) {
 216        case IIO_CHAN_INFO_RAW:
 217                if (iio_buffer_enabled(indio_dev))
 218                        return -EBUSY;
 219                mutex_lock(&data->lock);
 220                ret = stk8ba50_set_power(data, STK8BA50_MODE_NORMAL);
 221                if (ret < 0) {
 222                        mutex_unlock(&data->lock);
 223                        return -EINVAL;
 224                }
 225                ret = stk8ba50_read_accel(data, chan->address);
 226                if (ret < 0) {
 227                        stk8ba50_set_power(data, STK8BA50_MODE_SUSPEND);
 228                        mutex_unlock(&data->lock);
 229                        return -EINVAL;
 230                }
 231                *val = sign_extend32(ret >> STK8BA50_DATA_SHIFT, 9);
 232                stk8ba50_set_power(data, STK8BA50_MODE_SUSPEND);
 233                mutex_unlock(&data->lock);
 234                return IIO_VAL_INT;
 235        case IIO_CHAN_INFO_SCALE:
 236                *val = 0;
 237                *val2 = stk8ba50_scale_table[data->range].scale_val;
 238                return IIO_VAL_INT_PLUS_MICRO;
 239        case IIO_CHAN_INFO_SAMP_FREQ:
 240                *val = stk8ba50_samp_freq_table
 241                                [data->sample_rate_idx].samp_freq;
 242                *val2 = 0;
 243                return IIO_VAL_INT;
 244        }
 245
 246        return -EINVAL;
 247}
 248
 249static int stk8ba50_write_raw(struct iio_dev *indio_dev,
 250                              struct iio_chan_spec const *chan,
 251                              int val, int val2, long mask)
 252{
 253        int ret;
 254        int i;
 255        int index = -1;
 256        struct stk8ba50_data *data = iio_priv(indio_dev);
 257
 258        switch (mask) {
 259        case IIO_CHAN_INFO_SCALE:
 260                if (val != 0)
 261                        return -EINVAL;
 262
 263                for (i = 0; i < ARRAY_SIZE(stk8ba50_scale_table); i++)
 264                        if (val2 == stk8ba50_scale_table[i].scale_val) {
 265                                index = i;
 266                                break;
 267                        }
 268                if (index < 0)
 269                        return -EINVAL;
 270
 271                ret = i2c_smbus_write_byte_data(data->client,
 272                                STK8BA50_REG_RANGE,
 273                                stk8ba50_scale_table[index].reg_val);
 274                if (ret < 0)
 275                        dev_err(&data->client->dev,
 276                                        "failed to set measurement range\n");
 277                else
 278                        data->range = index;
 279
 280                return ret;
 281        case IIO_CHAN_INFO_SAMP_FREQ:
 282                for (i = 0; i < ARRAY_SIZE(stk8ba50_samp_freq_table); i++)
 283                        if (val == stk8ba50_samp_freq_table[i].samp_freq) {
 284                                index = i;
 285                                break;
 286                        }
 287                if (index < 0)
 288                        return -EINVAL;
 289
 290                ret = i2c_smbus_write_byte_data(data->client,
 291                                STK8BA50_REG_BWSEL,
 292                                stk8ba50_samp_freq_table[index].reg_val);
 293                if (ret < 0)
 294                        dev_err(&data->client->dev,
 295                                        "failed to set sampling rate\n");
 296                else
 297                        data->sample_rate_idx = index;
 298
 299                return ret;
 300        }
 301
 302        return -EINVAL;
 303}
 304
 305static const struct iio_info stk8ba50_info = {
 306        .read_raw               = stk8ba50_read_raw,
 307        .write_raw              = stk8ba50_write_raw,
 308        .attrs                  = &stk8ba50_attribute_group,
 309};
 310
 311static irqreturn_t stk8ba50_trigger_handler(int irq, void *p)
 312{
 313        struct iio_poll_func *pf = p;
 314        struct iio_dev *indio_dev = pf->indio_dev;
 315        struct stk8ba50_data *data = iio_priv(indio_dev);
 316        int bit, ret, i = 0;
 317
 318        mutex_lock(&data->lock);
 319        /*
 320         * Do a bulk read if all channels are requested,
 321         * from 0x02 (XOUT1) to 0x07 (ZOUT2)
 322         */
 323        if (*(indio_dev->active_scan_mask) == STK8BA50_ALL_CHANNEL_MASK) {
 324                ret = i2c_smbus_read_i2c_block_data(data->client,
 325                                                    STK8BA50_REG_XOUT,
 326                                                    STK8BA50_ALL_CHANNEL_SIZE,
 327                                                    (u8 *)data->buffer);
 328                if (ret < STK8BA50_ALL_CHANNEL_SIZE) {
 329                        dev_err(&data->client->dev, "register read failed\n");
 330                        goto err;
 331                }
 332        } else {
 333                for_each_set_bit(bit, indio_dev->active_scan_mask,
 334                                 indio_dev->masklength) {
 335                        ret = stk8ba50_read_accel(data,
 336                                                  stk8ba50_channel_table[bit]);
 337                        if (ret < 0)
 338                                goto err;
 339
 340                        data->buffer[i++] = ret;
 341                }
 342        }
 343        iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
 344                                           pf->timestamp);
 345err:
 346        mutex_unlock(&data->lock);
 347        iio_trigger_notify_done(indio_dev->trig);
 348
 349        return IRQ_HANDLED;
 350}
 351
 352static irqreturn_t stk8ba50_data_rdy_trig_poll(int irq, void *private)
 353{
 354        struct iio_dev *indio_dev = private;
 355        struct stk8ba50_data *data = iio_priv(indio_dev);
 356
 357        if (data->dready_trigger_on)
 358                iio_trigger_poll(data->dready_trig);
 359
 360        return IRQ_HANDLED;
 361}
 362
 363static int stk8ba50_buffer_preenable(struct iio_dev *indio_dev)
 364{
 365        struct stk8ba50_data *data = iio_priv(indio_dev);
 366
 367        return stk8ba50_set_power(data, STK8BA50_MODE_NORMAL);
 368}
 369
 370static int stk8ba50_buffer_postdisable(struct iio_dev *indio_dev)
 371{
 372        struct stk8ba50_data *data = iio_priv(indio_dev);
 373
 374        return stk8ba50_set_power(data, STK8BA50_MODE_SUSPEND);
 375}
 376
 377static const struct iio_buffer_setup_ops stk8ba50_buffer_setup_ops = {
 378        .preenable   = stk8ba50_buffer_preenable,
 379        .postdisable = stk8ba50_buffer_postdisable,
 380};
 381
 382static int stk8ba50_probe(struct i2c_client *client,
 383                          const struct i2c_device_id *id)
 384{
 385        int ret;
 386        struct iio_dev *indio_dev;
 387        struct stk8ba50_data *data;
 388
 389        indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
 390        if (!indio_dev) {
 391                dev_err(&client->dev, "iio allocation failed!\n");
 392                return -ENOMEM;
 393        }
 394
 395        data = iio_priv(indio_dev);
 396        data->client = client;
 397        i2c_set_clientdata(client, indio_dev);
 398        mutex_init(&data->lock);
 399
 400        indio_dev->info = &stk8ba50_info;
 401        indio_dev->name = STK8BA50_DRIVER_NAME;
 402        indio_dev->modes = INDIO_DIRECT_MODE;
 403        indio_dev->channels = stk8ba50_channels;
 404        indio_dev->num_channels = ARRAY_SIZE(stk8ba50_channels);
 405
 406        /* Reset all registers on startup */
 407        ret = i2c_smbus_write_byte_data(client,
 408                        STK8BA50_REG_SWRST, STK8BA50_RESET_CMD);
 409        if (ret < 0) {
 410                dev_err(&client->dev, "failed to reset sensor\n");
 411                goto err_power_off;
 412        }
 413
 414        /* The default range is +/-2g */
 415        data->range = 0;
 416
 417        /* The default sampling rate is 1792 Hz (maximum) */
 418        data->sample_rate_idx = STK8BA50_SR_1792HZ_IDX;
 419
 420        /* Set up interrupts */
 421        ret = i2c_smbus_write_byte_data(client,
 422                        STK8BA50_REG_INTEN2, STK8BA50_DREADY_INT_MASK);
 423        if (ret < 0) {
 424                dev_err(&client->dev, "failed to set up interrupts\n");
 425                goto err_power_off;
 426        }
 427        ret = i2c_smbus_write_byte_data(client,
 428                        STK8BA50_REG_INTMAP2, STK8BA50_DREADY_INT_MAP);
 429        if (ret < 0) {
 430                dev_err(&client->dev, "failed to set up interrupts\n");
 431                goto err_power_off;
 432        }
 433
 434        if (client->irq > 0) {
 435                ret = devm_request_threaded_irq(&client->dev, client->irq,
 436                                                stk8ba50_data_rdy_trig_poll,
 437                                                NULL,
 438                                                IRQF_TRIGGER_RISING |
 439                                                IRQF_ONESHOT,
 440                                                STK8BA50_IRQ_NAME,
 441                                                indio_dev);
 442                if (ret < 0) {
 443                        dev_err(&client->dev, "request irq %d failed\n",
 444                                client->irq);
 445                        goto err_power_off;
 446                }
 447
 448                data->dready_trig = devm_iio_trigger_alloc(&client->dev,
 449                                                           "%s-dev%d",
 450                                                           indio_dev->name,
 451                                                           indio_dev->id);
 452                if (!data->dready_trig) {
 453                        ret = -ENOMEM;
 454                        goto err_power_off;
 455                }
 456
 457                data->dready_trig->dev.parent = &client->dev;
 458                data->dready_trig->ops = &stk8ba50_trigger_ops;
 459                iio_trigger_set_drvdata(data->dready_trig, indio_dev);
 460                ret = iio_trigger_register(data->dready_trig);
 461                if (ret) {
 462                        dev_err(&client->dev, "iio trigger register failed\n");
 463                        goto err_power_off;
 464                }
 465        }
 466
 467        ret = iio_triggered_buffer_setup(indio_dev,
 468                                         iio_pollfunc_store_time,
 469                                         stk8ba50_trigger_handler,
 470                                         &stk8ba50_buffer_setup_ops);
 471        if (ret < 0) {
 472                dev_err(&client->dev, "iio triggered buffer setup failed\n");
 473                goto err_trigger_unregister;
 474        }
 475
 476        ret = iio_device_register(indio_dev);
 477        if (ret < 0) {
 478                dev_err(&client->dev, "device_register failed\n");
 479                goto err_buffer_cleanup;
 480        }
 481
 482        return ret;
 483
 484err_buffer_cleanup:
 485        iio_triggered_buffer_cleanup(indio_dev);
 486err_trigger_unregister:
 487        if (data->dready_trig)
 488                iio_trigger_unregister(data->dready_trig);
 489err_power_off:
 490        stk8ba50_set_power(data, STK8BA50_MODE_SUSPEND);
 491        return ret;
 492}
 493
 494static int stk8ba50_remove(struct i2c_client *client)
 495{
 496        struct iio_dev *indio_dev = i2c_get_clientdata(client);
 497        struct stk8ba50_data *data = iio_priv(indio_dev);
 498
 499        iio_device_unregister(indio_dev);
 500        iio_triggered_buffer_cleanup(indio_dev);
 501
 502        if (data->dready_trig)
 503                iio_trigger_unregister(data->dready_trig);
 504
 505        return stk8ba50_set_power(data, STK8BA50_MODE_SUSPEND);
 506}
 507
 508#ifdef CONFIG_PM_SLEEP
 509static int stk8ba50_suspend(struct device *dev)
 510{
 511        struct stk8ba50_data *data;
 512
 513        data = iio_priv(i2c_get_clientdata(to_i2c_client(dev)));
 514
 515        return stk8ba50_set_power(data, STK8BA50_MODE_SUSPEND);
 516}
 517
 518static int stk8ba50_resume(struct device *dev)
 519{
 520        struct stk8ba50_data *data;
 521
 522        data = iio_priv(i2c_get_clientdata(to_i2c_client(dev)));
 523
 524        return stk8ba50_set_power(data, STK8BA50_MODE_NORMAL);
 525}
 526
 527static SIMPLE_DEV_PM_OPS(stk8ba50_pm_ops, stk8ba50_suspend, stk8ba50_resume);
 528
 529#define STK8BA50_PM_OPS (&stk8ba50_pm_ops)
 530#else
 531#define STK8BA50_PM_OPS NULL
 532#endif
 533
 534static const struct i2c_device_id stk8ba50_i2c_id[] = {
 535        {"stk8ba50", 0},
 536        {}
 537};
 538MODULE_DEVICE_TABLE(i2c, stk8ba50_i2c_id);
 539
 540static const struct acpi_device_id stk8ba50_acpi_id[] = {
 541        {"STK8BA50", 0},
 542        {}
 543};
 544
 545MODULE_DEVICE_TABLE(acpi, stk8ba50_acpi_id);
 546
 547static struct i2c_driver stk8ba50_driver = {
 548        .driver = {
 549                .name = "stk8ba50",
 550                .pm = STK8BA50_PM_OPS,
 551                .acpi_match_table = ACPI_PTR(stk8ba50_acpi_id),
 552        },
 553        .probe =            stk8ba50_probe,
 554        .remove =           stk8ba50_remove,
 555        .id_table =         stk8ba50_i2c_id,
 556};
 557
 558module_i2c_driver(stk8ba50_driver);
 559
 560MODULE_AUTHOR("Tiberiu Breana <tiberiu.a.breana@intel.com>");
 561MODULE_DESCRIPTION("STK8BA50 3-Axis Accelerometer driver");
 562MODULE_LICENSE("GPL v2");
 563