linux/drivers/iio/accel/mma9553.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Freescale MMA9553L Intelligent Pedometer driver
   4 * Copyright (c) 2014, Intel Corporation.
   5 */
   6
   7#include <linux/module.h>
   8#include <linux/i2c.h>
   9#include <linux/interrupt.h>
  10#include <linux/slab.h>
  11#include <linux/acpi.h>
  12#include <linux/iio/iio.h>
  13#include <linux/iio/sysfs.h>
  14#include <linux/iio/events.h>
  15#include <linux/pm_runtime.h>
  16#include "mma9551_core.h"
  17
  18#define MMA9553_DRV_NAME                        "mma9553"
  19#define MMA9553_IRQ_NAME                        "mma9553_event"
  20
  21/* Pedometer configuration registers (R/W) */
  22#define MMA9553_REG_CONF_SLEEPMIN               0x00
  23#define MMA9553_REG_CONF_SLEEPMAX               0x02
  24#define MMA9553_REG_CONF_SLEEPTHD               0x04
  25#define MMA9553_MASK_CONF_WORD                  GENMASK(15, 0)
  26
  27#define MMA9553_REG_CONF_CONF_STEPLEN           0x06
  28#define MMA9553_MASK_CONF_CONFIG                BIT(15)
  29#define MMA9553_MASK_CONF_ACT_DBCNTM            BIT(14)
  30#define MMA9553_MASK_CONF_SLP_DBCNTM            BIT(13)
  31#define MMA9553_MASK_CONF_STEPLEN               GENMASK(7, 0)
  32
  33#define MMA9553_REG_CONF_HEIGHT_WEIGHT          0x08
  34#define MMA9553_MASK_CONF_HEIGHT                GENMASK(15, 8)
  35#define MMA9553_MASK_CONF_WEIGHT                GENMASK(7, 0)
  36
  37#define MMA9553_REG_CONF_FILTER                 0x0A
  38#define MMA9553_MASK_CONF_FILTSTEP              GENMASK(15, 8)
  39#define MMA9553_MASK_CONF_MALE                  BIT(7)
  40#define MMA9553_MASK_CONF_FILTTIME              GENMASK(6, 0)
  41
  42#define MMA9553_REG_CONF_SPEED_STEP             0x0C
  43#define MMA9553_MASK_CONF_SPDPRD                GENMASK(15, 8)
  44#define MMA9553_MASK_CONF_STEPCOALESCE          GENMASK(7, 0)
  45
  46#define MMA9553_REG_CONF_ACTTHD                 0x0E
  47#define MMA9553_MAX_ACTTHD                      GENMASK(15, 0)
  48
  49/* Pedometer status registers (R-only) */
  50#define MMA9553_REG_STATUS                      0x00
  51#define MMA9553_MASK_STATUS_MRGFL               BIT(15)
  52#define MMA9553_MASK_STATUS_SUSPCHG             BIT(14)
  53#define MMA9553_MASK_STATUS_STEPCHG             BIT(13)
  54#define MMA9553_MASK_STATUS_ACTCHG              BIT(12)
  55#define MMA9553_MASK_STATUS_SUSP                BIT(11)
  56#define MMA9553_MASK_STATUS_ACTIVITY            GENMASK(10, 8)
  57#define MMA9553_MASK_STATUS_VERSION             GENMASK(7, 0)
  58
  59#define MMA9553_REG_STEPCNT                     0x02
  60#define MMA9553_REG_DISTANCE                    0x04
  61#define MMA9553_REG_SPEED                       0x06
  62#define MMA9553_REG_CALORIES                    0x08
  63#define MMA9553_REG_SLEEPCNT                    0x0A
  64
  65/* Pedometer events are always mapped to this pin. */
  66#define MMA9553_DEFAULT_GPIO_PIN        mma9551_gpio6
  67#define MMA9553_DEFAULT_GPIO_POLARITY   0
  68
  69/* Bitnum used for GPIO configuration = bit number in high status byte */
  70#define MMA9553_STATUS_TO_BITNUM(bit)   (ffs(bit) - 9)
  71#define MMA9553_MAX_BITNUM              MMA9553_STATUS_TO_BITNUM(BIT(16))
  72
  73#define MMA9553_DEFAULT_SAMPLE_RATE     30      /* Hz */
  74
  75/*
  76 * The internal activity level must be stable for ACTTHD samples before
  77 * ACTIVITY is updated. The ACTIVITY variable contains the current activity
  78 * level and is updated every time a step is detected or once a second
  79 * if there are no steps.
  80 */
  81#define MMA9553_ACTIVITY_THD_TO_SEC(thd) ((thd) / MMA9553_DEFAULT_SAMPLE_RATE)
  82#define MMA9553_ACTIVITY_SEC_TO_THD(sec) ((sec) * MMA9553_DEFAULT_SAMPLE_RATE)
  83
  84/*
  85 * Autonomously suspend pedometer if acceleration vector magnitude
  86 * is near 1g (4096 at 0.244 mg/LSB resolution) for 30 seconds.
  87 */
  88#define MMA9553_DEFAULT_SLEEPMIN        3688    /* 0,9 g */
  89#define MMA9553_DEFAULT_SLEEPMAX        4508    /* 1,1 g */
  90#define MMA9553_DEFAULT_SLEEPTHD        (MMA9553_DEFAULT_SAMPLE_RATE * 30)
  91
  92#define MMA9553_CONFIG_RETRIES          2
  93
  94/* Status register - activity field  */
  95enum activity_level {
  96        ACTIVITY_UNKNOWN,
  97        ACTIVITY_REST,
  98        ACTIVITY_WALKING,
  99        ACTIVITY_JOGGING,
 100        ACTIVITY_RUNNING,
 101};
 102
 103static struct mma9553_event_info {
 104        enum iio_chan_type type;
 105        enum iio_modifier mod;
 106        enum iio_event_direction dir;
 107} mma9553_events_info[] = {
 108        {
 109                .type = IIO_STEPS,
 110                .mod = IIO_NO_MOD,
 111                .dir = IIO_EV_DIR_NONE,
 112        },
 113        {
 114                .type = IIO_ACTIVITY,
 115                .mod = IIO_MOD_STILL,
 116                .dir = IIO_EV_DIR_RISING,
 117        },
 118        {
 119                .type = IIO_ACTIVITY,
 120                .mod = IIO_MOD_STILL,
 121                .dir = IIO_EV_DIR_FALLING,
 122        },
 123        {
 124                .type = IIO_ACTIVITY,
 125                .mod = IIO_MOD_WALKING,
 126                .dir = IIO_EV_DIR_RISING,
 127        },
 128        {
 129                .type = IIO_ACTIVITY,
 130                .mod = IIO_MOD_WALKING,
 131                .dir = IIO_EV_DIR_FALLING,
 132        },
 133        {
 134                .type = IIO_ACTIVITY,
 135                .mod = IIO_MOD_JOGGING,
 136                .dir = IIO_EV_DIR_RISING,
 137        },
 138        {
 139                .type = IIO_ACTIVITY,
 140                .mod = IIO_MOD_JOGGING,
 141                .dir = IIO_EV_DIR_FALLING,
 142        },
 143        {
 144                .type = IIO_ACTIVITY,
 145                .mod = IIO_MOD_RUNNING,
 146                .dir = IIO_EV_DIR_RISING,
 147        },
 148        {
 149                .type = IIO_ACTIVITY,
 150                .mod = IIO_MOD_RUNNING,
 151                .dir = IIO_EV_DIR_FALLING,
 152        },
 153};
 154
 155#define MMA9553_EVENTS_INFO_SIZE ARRAY_SIZE(mma9553_events_info)
 156
 157struct mma9553_event {
 158        struct mma9553_event_info *info;
 159        bool enabled;
 160};
 161
 162struct mma9553_conf_regs {
 163        u16 sleepmin;
 164        u16 sleepmax;
 165        u16 sleepthd;
 166        u16 config;
 167        u16 height_weight;
 168        u16 filter;
 169        u16 speed_step;
 170        u16 actthd;
 171} __packed;
 172
 173struct mma9553_data {
 174        struct i2c_client *client;
 175        /*
 176         * 1. Serialize access to HW (requested by mma9551_core API).
 177         * 2. Serialize sequences that power on/off the device and access HW.
 178         */
 179        struct mutex mutex;
 180        struct mma9553_conf_regs conf;
 181        struct mma9553_event events[MMA9553_EVENTS_INFO_SIZE];
 182        int num_events;
 183        u8 gpio_bitnum;
 184        /*
 185         * This is used for all features that depend on step count:
 186         * step count, distance, speed, calories.
 187         */
 188        bool stepcnt_enabled;
 189        u16 stepcnt;
 190        u8 activity;
 191        s64 timestamp;
 192};
 193
 194static u8 mma9553_get_bits(u16 val, u16 mask)
 195{
 196        return (val & mask) >> (ffs(mask) - 1);
 197}
 198
 199static u16 mma9553_set_bits(u16 current_val, u16 val, u16 mask)
 200{
 201        return (current_val & ~mask) | (val << (ffs(mask) - 1));
 202}
 203
 204static enum iio_modifier mma9553_activity_to_mod(enum activity_level activity)
 205{
 206        switch (activity) {
 207        case ACTIVITY_RUNNING:
 208                return IIO_MOD_RUNNING;
 209        case ACTIVITY_JOGGING:
 210                return IIO_MOD_JOGGING;
 211        case ACTIVITY_WALKING:
 212                return IIO_MOD_WALKING;
 213        case ACTIVITY_REST:
 214                return IIO_MOD_STILL;
 215        case ACTIVITY_UNKNOWN:
 216        default:
 217                return IIO_NO_MOD;
 218        }
 219}
 220
 221static void mma9553_init_events(struct mma9553_data *data)
 222{
 223        int i;
 224
 225        data->num_events = MMA9553_EVENTS_INFO_SIZE;
 226        for (i = 0; i < data->num_events; i++) {
 227                data->events[i].info = &mma9553_events_info[i];
 228                data->events[i].enabled = false;
 229        }
 230}
 231
 232static struct mma9553_event *mma9553_get_event(struct mma9553_data *data,
 233                                               enum iio_chan_type type,
 234                                               enum iio_modifier mod,
 235                                               enum iio_event_direction dir)
 236{
 237        int i;
 238
 239        for (i = 0; i < data->num_events; i++)
 240                if (data->events[i].info->type == type &&
 241                    data->events[i].info->mod == mod &&
 242                    data->events[i].info->dir == dir)
 243                        return &data->events[i];
 244
 245        return NULL;
 246}
 247
 248static bool mma9553_is_any_event_enabled(struct mma9553_data *data,
 249                                         bool check_type,
 250                                         enum iio_chan_type type)
 251{
 252        int i;
 253
 254        for (i = 0; i < data->num_events; i++)
 255                if ((check_type && data->events[i].info->type == type &&
 256                     data->events[i].enabled) ||
 257                     (!check_type && data->events[i].enabled))
 258                        return true;
 259
 260        return false;
 261}
 262
 263static int mma9553_set_config(struct mma9553_data *data, u16 reg,
 264                              u16 *p_reg_val, u16 val, u16 mask)
 265{
 266        int ret, retries;
 267        u16 reg_val, config;
 268
 269        reg_val = *p_reg_val;
 270        if (val == mma9553_get_bits(reg_val, mask))
 271                return 0;
 272
 273        reg_val = mma9553_set_bits(reg_val, val, mask);
 274        ret = mma9551_write_config_word(data->client, MMA9551_APPID_PEDOMETER,
 275                                        reg, reg_val);
 276        if (ret < 0) {
 277                dev_err(&data->client->dev,
 278                        "error writing config register 0x%x\n", reg);
 279                return ret;
 280        }
 281
 282        *p_reg_val = reg_val;
 283
 284        /* Reinitializes the pedometer with current configuration values */
 285        config = mma9553_set_bits(data->conf.config, 1,
 286                                  MMA9553_MASK_CONF_CONFIG);
 287
 288        ret = mma9551_write_config_word(data->client, MMA9551_APPID_PEDOMETER,
 289                                        MMA9553_REG_CONF_CONF_STEPLEN, config);
 290        if (ret < 0) {
 291                dev_err(&data->client->dev,
 292                        "error writing config register 0x%x\n",
 293                        MMA9553_REG_CONF_CONF_STEPLEN);
 294                return ret;
 295        }
 296
 297        retries = MMA9553_CONFIG_RETRIES;
 298        do {
 299                mma9551_sleep(MMA9553_DEFAULT_SAMPLE_RATE);
 300                ret = mma9551_read_config_word(data->client,
 301                                               MMA9551_APPID_PEDOMETER,
 302                                               MMA9553_REG_CONF_CONF_STEPLEN,
 303                                               &config);
 304                if (ret < 0)
 305                        return ret;
 306        } while (mma9553_get_bits(config, MMA9553_MASK_CONF_CONFIG) &&
 307                 --retries > 0);
 308
 309        return 0;
 310}
 311
 312static int mma9553_read_activity_stepcnt(struct mma9553_data *data,
 313                                         u8 *activity, u16 *stepcnt)
 314{
 315        u16 buf[2];
 316        int ret;
 317
 318        ret = mma9551_read_status_words(data->client, MMA9551_APPID_PEDOMETER,
 319                                        MMA9553_REG_STATUS, ARRAY_SIZE(buf),
 320                                        buf);
 321        if (ret < 0) {
 322                dev_err(&data->client->dev,
 323                        "error reading status and stepcnt\n");
 324                return ret;
 325        }
 326
 327        *activity = mma9553_get_bits(buf[0], MMA9553_MASK_STATUS_ACTIVITY);
 328        *stepcnt = buf[1];
 329
 330        return 0;
 331}
 332
 333static int mma9553_conf_gpio(struct mma9553_data *data)
 334{
 335        u8 bitnum = 0, appid = MMA9551_APPID_PEDOMETER;
 336        int ret;
 337        struct mma9553_event *ev_step_detect;
 338        bool activity_enabled;
 339
 340        activity_enabled = mma9553_is_any_event_enabled(data, true,
 341                                                        IIO_ACTIVITY);
 342        ev_step_detect = mma9553_get_event(data, IIO_STEPS, IIO_NO_MOD,
 343                                           IIO_EV_DIR_NONE);
 344
 345        /*
 346         * If both step detector and activity are enabled, use the MRGFL bit.
 347         * This bit is the logical OR of the SUSPCHG, STEPCHG, and ACTCHG flags.
 348         */
 349        if (activity_enabled && ev_step_detect->enabled)
 350                bitnum = MMA9553_STATUS_TO_BITNUM(MMA9553_MASK_STATUS_MRGFL);
 351        else if (ev_step_detect->enabled)
 352                bitnum = MMA9553_STATUS_TO_BITNUM(MMA9553_MASK_STATUS_STEPCHG);
 353        else if (activity_enabled)
 354                bitnum = MMA9553_STATUS_TO_BITNUM(MMA9553_MASK_STATUS_ACTCHG);
 355        else                    /* Reset */
 356                appid = MMA9551_APPID_NONE;
 357
 358        if (data->gpio_bitnum == bitnum)
 359                return 0;
 360
 361        /* Save initial values for activity and stepcnt */
 362        if (activity_enabled || ev_step_detect->enabled) {
 363                ret = mma9553_read_activity_stepcnt(data, &data->activity,
 364                                                    &data->stepcnt);
 365                if (ret < 0)
 366                        return ret;
 367        }
 368
 369        ret = mma9551_gpio_config(data->client, MMA9553_DEFAULT_GPIO_PIN, appid,
 370                                  bitnum, MMA9553_DEFAULT_GPIO_POLARITY);
 371        if (ret < 0)
 372                return ret;
 373        data->gpio_bitnum = bitnum;
 374
 375        return 0;
 376}
 377
 378static int mma9553_init(struct mma9553_data *data)
 379{
 380        int ret;
 381
 382        ret = mma9551_read_version(data->client);
 383        if (ret)
 384                return ret;
 385
 386        /*
 387         * Read all the pedometer configuration registers. This is used as
 388         * a device identification command to differentiate the MMA9553L
 389         * from the MMA9550L.
 390         */
 391        ret = mma9551_read_config_words(data->client, MMA9551_APPID_PEDOMETER,
 392                                        MMA9553_REG_CONF_SLEEPMIN,
 393                                        sizeof(data->conf) / sizeof(u16),
 394                                        (u16 *)&data->conf);
 395        if (ret < 0) {
 396                dev_err(&data->client->dev,
 397                        "failed to read configuration registers\n");
 398                return ret;
 399        }
 400
 401        /* Reset GPIO */
 402        data->gpio_bitnum = MMA9553_MAX_BITNUM;
 403        ret = mma9553_conf_gpio(data);
 404        if (ret < 0)
 405                return ret;
 406
 407        ret = mma9551_app_reset(data->client, MMA9551_RSC_PED);
 408        if (ret < 0)
 409                return ret;
 410
 411        /* Init config registers */
 412        data->conf.sleepmin = MMA9553_DEFAULT_SLEEPMIN;
 413        data->conf.sleepmax = MMA9553_DEFAULT_SLEEPMAX;
 414        data->conf.sleepthd = MMA9553_DEFAULT_SLEEPTHD;
 415        data->conf.config = mma9553_set_bits(data->conf.config, 1,
 416                                             MMA9553_MASK_CONF_CONFIG);
 417        /*
 418         * Clear the activity debounce counter when the activity level changes,
 419         * so that the confidence level applies for any activity level.
 420         */
 421        data->conf.config = mma9553_set_bits(data->conf.config, 1,
 422                                             MMA9553_MASK_CONF_ACT_DBCNTM);
 423        ret = mma9551_write_config_words(data->client, MMA9551_APPID_PEDOMETER,
 424                                         MMA9553_REG_CONF_SLEEPMIN,
 425                                         sizeof(data->conf) / sizeof(u16),
 426                                         (u16 *)&data->conf);
 427        if (ret < 0) {
 428                dev_err(&data->client->dev,
 429                        "failed to write configuration registers\n");
 430                return ret;
 431        }
 432
 433        return mma9551_set_device_state(data->client, true);
 434}
 435
 436static int mma9553_read_status_word(struct mma9553_data *data, u16 reg,
 437                                    u16 *tmp)
 438{
 439        bool powered_on;
 440        int ret;
 441
 442        /*
 443         * The HW only counts steps and other dependent
 444         * parameters (speed, distance, calories, activity)
 445         * if power is on (from enabling an event or the
 446         * step counter).
 447         */
 448        powered_on = mma9553_is_any_event_enabled(data, false, 0) ||
 449                     data->stepcnt_enabled;
 450        if (!powered_on) {
 451                dev_err(&data->client->dev, "No channels enabled\n");
 452                return -EINVAL;
 453        }
 454
 455        mutex_lock(&data->mutex);
 456        ret = mma9551_read_status_word(data->client, MMA9551_APPID_PEDOMETER,
 457                                       reg, tmp);
 458        mutex_unlock(&data->mutex);
 459        return ret;
 460}
 461
 462static int mma9553_read_raw(struct iio_dev *indio_dev,
 463                            struct iio_chan_spec const *chan,
 464                            int *val, int *val2, long mask)
 465{
 466        struct mma9553_data *data = iio_priv(indio_dev);
 467        int ret;
 468        u16 tmp;
 469        u8 activity;
 470
 471        switch (mask) {
 472        case IIO_CHAN_INFO_PROCESSED:
 473                switch (chan->type) {
 474                case IIO_STEPS:
 475                        ret = mma9553_read_status_word(data,
 476                                                       MMA9553_REG_STEPCNT,
 477                                                       &tmp);
 478                        if (ret < 0)
 479                                return ret;
 480                        *val = tmp;
 481                        return IIO_VAL_INT;
 482                case IIO_DISTANCE:
 483                        ret = mma9553_read_status_word(data,
 484                                                       MMA9553_REG_DISTANCE,
 485                                                       &tmp);
 486                        if (ret < 0)
 487                                return ret;
 488                        *val = tmp;
 489                        return IIO_VAL_INT;
 490                case IIO_ACTIVITY:
 491                        ret = mma9553_read_status_word(data,
 492                                                       MMA9553_REG_STATUS,
 493                                                       &tmp);
 494                        if (ret < 0)
 495                                return ret;
 496
 497                        activity =
 498                            mma9553_get_bits(tmp, MMA9553_MASK_STATUS_ACTIVITY);
 499
 500                        /*
 501                         * The device does not support confidence value levels,
 502                         * so we will always have 100% for current activity and
 503                         * 0% for the others.
 504                         */
 505                        if (chan->channel2 == mma9553_activity_to_mod(activity))
 506                                *val = 100;
 507                        else
 508                                *val = 0;
 509                        return IIO_VAL_INT;
 510                default:
 511                        return -EINVAL;
 512                }
 513        case IIO_CHAN_INFO_RAW:
 514                switch (chan->type) {
 515                case IIO_VELOCITY:      /* m/h */
 516                        if (chan->channel2 != IIO_MOD_ROOT_SUM_SQUARED_X_Y_Z)
 517                                return -EINVAL;
 518                        ret = mma9553_read_status_word(data,
 519                                                       MMA9553_REG_SPEED,
 520                                                       &tmp);
 521                        if (ret < 0)
 522                                return ret;
 523                        *val = tmp;
 524                        return IIO_VAL_INT;
 525                case IIO_ENERGY:        /* Cal or kcal */
 526                        ret = mma9553_read_status_word(data,
 527                                                       MMA9553_REG_CALORIES,
 528                                                       &tmp);
 529                        if (ret < 0)
 530                                return ret;
 531                        *val = tmp;
 532                        return IIO_VAL_INT;
 533                case IIO_ACCEL:
 534                        mutex_lock(&data->mutex);
 535                        ret = mma9551_read_accel_chan(data->client,
 536                                                      chan, val, val2);
 537                        mutex_unlock(&data->mutex);
 538                        return ret;
 539                default:
 540                        return -EINVAL;
 541                }
 542        case IIO_CHAN_INFO_SCALE:
 543                switch (chan->type) {
 544                case IIO_VELOCITY:      /* m/h to m/s */
 545                        if (chan->channel2 != IIO_MOD_ROOT_SUM_SQUARED_X_Y_Z)
 546                                return -EINVAL;
 547                        *val = 0;
 548                        *val2 = 277;    /* 0.000277 */
 549                        return IIO_VAL_INT_PLUS_MICRO;
 550                case IIO_ENERGY:        /* Cal or kcal to J */
 551                        *val = 4184;
 552                        return IIO_VAL_INT;
 553                case IIO_ACCEL:
 554                        return mma9551_read_accel_scale(val, val2);
 555                default:
 556                        return -EINVAL;
 557                }
 558        case IIO_CHAN_INFO_ENABLE:
 559                *val = data->stepcnt_enabled;
 560                return IIO_VAL_INT;
 561        case IIO_CHAN_INFO_CALIBHEIGHT:
 562                tmp = mma9553_get_bits(data->conf.height_weight,
 563                                       MMA9553_MASK_CONF_HEIGHT);
 564                *val = tmp / 100;       /* cm to m */
 565                *val2 = (tmp % 100) * 10000;
 566                return IIO_VAL_INT_PLUS_MICRO;
 567        case IIO_CHAN_INFO_CALIBWEIGHT:
 568                *val = mma9553_get_bits(data->conf.height_weight,
 569                                        MMA9553_MASK_CONF_WEIGHT);
 570                return IIO_VAL_INT;
 571        case IIO_CHAN_INFO_DEBOUNCE_COUNT:
 572                switch (chan->type) {
 573                case IIO_STEPS:
 574                        *val = mma9553_get_bits(data->conf.filter,
 575                                                MMA9553_MASK_CONF_FILTSTEP);
 576                        return IIO_VAL_INT;
 577                default:
 578                        return -EINVAL;
 579                }
 580        case IIO_CHAN_INFO_DEBOUNCE_TIME:
 581                switch (chan->type) {
 582                case IIO_STEPS:
 583                        *val = mma9553_get_bits(data->conf.filter,
 584                                                MMA9553_MASK_CONF_FILTTIME);
 585                        return IIO_VAL_INT;
 586                default:
 587                        return -EINVAL;
 588                }
 589        case IIO_CHAN_INFO_INT_TIME:
 590                switch (chan->type) {
 591                case IIO_VELOCITY:
 592                        if (chan->channel2 != IIO_MOD_ROOT_SUM_SQUARED_X_Y_Z)
 593                                return -EINVAL;
 594                        *val = mma9553_get_bits(data->conf.speed_step,
 595                                                MMA9553_MASK_CONF_SPDPRD);
 596                        return IIO_VAL_INT;
 597                default:
 598                        return -EINVAL;
 599                }
 600        default:
 601                return -EINVAL;
 602        }
 603}
 604
 605static int mma9553_write_raw(struct iio_dev *indio_dev,
 606                             struct iio_chan_spec const *chan,
 607                             int val, int val2, long mask)
 608{
 609        struct mma9553_data *data = iio_priv(indio_dev);
 610        int ret, tmp;
 611
 612        switch (mask) {
 613        case IIO_CHAN_INFO_ENABLE:
 614                if (data->stepcnt_enabled == !!val)
 615                        return 0;
 616                mutex_lock(&data->mutex);
 617                ret = mma9551_set_power_state(data->client, val);
 618                if (ret < 0) {
 619                        mutex_unlock(&data->mutex);
 620                        return ret;
 621                }
 622                data->stepcnt_enabled = val;
 623                mutex_unlock(&data->mutex);
 624                return 0;
 625        case IIO_CHAN_INFO_CALIBHEIGHT:
 626                /* m to cm */
 627                tmp = val * 100 + val2 / 10000;
 628                if (tmp < 0 || tmp > 255)
 629                        return -EINVAL;
 630                mutex_lock(&data->mutex);
 631                ret = mma9553_set_config(data,
 632                                         MMA9553_REG_CONF_HEIGHT_WEIGHT,
 633                                         &data->conf.height_weight,
 634                                         tmp, MMA9553_MASK_CONF_HEIGHT);
 635                mutex_unlock(&data->mutex);
 636                return ret;
 637        case IIO_CHAN_INFO_CALIBWEIGHT:
 638                if (val < 0 || val > 255)
 639                        return -EINVAL;
 640                mutex_lock(&data->mutex);
 641                ret = mma9553_set_config(data,
 642                                         MMA9553_REG_CONF_HEIGHT_WEIGHT,
 643                                         &data->conf.height_weight,
 644                                         val, MMA9553_MASK_CONF_WEIGHT);
 645                mutex_unlock(&data->mutex);
 646                return ret;
 647        case IIO_CHAN_INFO_DEBOUNCE_COUNT:
 648                switch (chan->type) {
 649                case IIO_STEPS:
 650                        /*
 651                         * Set to 0 to disable step filtering. If the value
 652                         * specified is greater than 6, then 6 will be used.
 653                         */
 654                        if (val < 0)
 655                                return -EINVAL;
 656                        if (val > 6)
 657                                val = 6;
 658                        mutex_lock(&data->mutex);
 659                        ret = mma9553_set_config(data, MMA9553_REG_CONF_FILTER,
 660                                                 &data->conf.filter, val,
 661                                                 MMA9553_MASK_CONF_FILTSTEP);
 662                        mutex_unlock(&data->mutex);
 663                        return ret;
 664                default:
 665                        return -EINVAL;
 666                }
 667        case IIO_CHAN_INFO_DEBOUNCE_TIME:
 668                switch (chan->type) {
 669                case IIO_STEPS:
 670                        if (val < 0 || val > 127)
 671                                return -EINVAL;
 672                        mutex_lock(&data->mutex);
 673                        ret = mma9553_set_config(data, MMA9553_REG_CONF_FILTER,
 674                                                 &data->conf.filter, val,
 675                                                 MMA9553_MASK_CONF_FILTTIME);
 676                        mutex_unlock(&data->mutex);
 677                        return ret;
 678                default:
 679                        return -EINVAL;
 680                }
 681        case IIO_CHAN_INFO_INT_TIME:
 682                switch (chan->type) {
 683                case IIO_VELOCITY:
 684                        if (chan->channel2 != IIO_MOD_ROOT_SUM_SQUARED_X_Y_Z)
 685                                return -EINVAL;
 686                        /*
 687                         * If set to a value greater than 5, then 5 will be
 688                         * used. Warning: Do not set SPDPRD to 0 or 1 as
 689                         * this may cause undesirable behavior.
 690                         */
 691                        if (val < 2)
 692                                return -EINVAL;
 693                        if (val > 5)
 694                                val = 5;
 695                        mutex_lock(&data->mutex);
 696                        ret = mma9553_set_config(data,
 697                                                 MMA9553_REG_CONF_SPEED_STEP,
 698                                                 &data->conf.speed_step, val,
 699                                                 MMA9553_MASK_CONF_SPDPRD);
 700                        mutex_unlock(&data->mutex);
 701                        return ret;
 702                default:
 703                        return -EINVAL;
 704                }
 705        default:
 706                return -EINVAL;
 707        }
 708}
 709
 710static int mma9553_read_event_config(struct iio_dev *indio_dev,
 711                                     const struct iio_chan_spec *chan,
 712                                     enum iio_event_type type,
 713                                     enum iio_event_direction dir)
 714{
 715        struct mma9553_data *data = iio_priv(indio_dev);
 716        struct mma9553_event *event;
 717
 718        event = mma9553_get_event(data, chan->type, chan->channel2, dir);
 719        if (!event)
 720                return -EINVAL;
 721
 722        return event->enabled;
 723}
 724
 725static int mma9553_write_event_config(struct iio_dev *indio_dev,
 726                                      const struct iio_chan_spec *chan,
 727                                      enum iio_event_type type,
 728                                      enum iio_event_direction dir, int state)
 729{
 730        struct mma9553_data *data = iio_priv(indio_dev);
 731        struct mma9553_event *event;
 732        int ret;
 733
 734        event = mma9553_get_event(data, chan->type, chan->channel2, dir);
 735        if (!event)
 736                return -EINVAL;
 737
 738        if (event->enabled == state)
 739                return 0;
 740
 741        mutex_lock(&data->mutex);
 742
 743        ret = mma9551_set_power_state(data->client, state);
 744        if (ret < 0)
 745                goto err_out;
 746        event->enabled = state;
 747
 748        ret = mma9553_conf_gpio(data);
 749        if (ret < 0)
 750                goto err_conf_gpio;
 751
 752        mutex_unlock(&data->mutex);
 753
 754        return 0;
 755
 756err_conf_gpio:
 757        if (state) {
 758                event->enabled = false;
 759                mma9551_set_power_state(data->client, false);
 760        }
 761err_out:
 762        mutex_unlock(&data->mutex);
 763        return ret;
 764}
 765
 766static int mma9553_read_event_value(struct iio_dev *indio_dev,
 767                                    const struct iio_chan_spec *chan,
 768                                    enum iio_event_type type,
 769                                    enum iio_event_direction dir,
 770                                    enum iio_event_info info,
 771                                    int *val, int *val2)
 772{
 773        struct mma9553_data *data = iio_priv(indio_dev);
 774
 775        *val2 = 0;
 776        switch (info) {
 777        case IIO_EV_INFO_VALUE:
 778                switch (chan->type) {
 779                case IIO_STEPS:
 780                        *val = mma9553_get_bits(data->conf.speed_step,
 781                                                MMA9553_MASK_CONF_STEPCOALESCE);
 782                        return IIO_VAL_INT;
 783                case IIO_ACTIVITY:
 784                        /*
 785                         * The device does not support confidence value levels.
 786                         * We set an average of 50%.
 787                         */
 788                        *val = 50;
 789                        return IIO_VAL_INT;
 790                default:
 791                        return -EINVAL;
 792                }
 793        case IIO_EV_INFO_PERIOD:
 794                switch (chan->type) {
 795                case IIO_ACTIVITY:
 796                        *val = MMA9553_ACTIVITY_THD_TO_SEC(data->conf.actthd);
 797                        return IIO_VAL_INT;
 798                default:
 799                        return -EINVAL;
 800                }
 801        default:
 802                return -EINVAL;
 803        }
 804}
 805
 806static int mma9553_write_event_value(struct iio_dev *indio_dev,
 807                                     const struct iio_chan_spec *chan,
 808                                     enum iio_event_type type,
 809                                     enum iio_event_direction dir,
 810                                     enum iio_event_info info,
 811                                     int val, int val2)
 812{
 813        struct mma9553_data *data = iio_priv(indio_dev);
 814        int ret;
 815
 816        switch (info) {
 817        case IIO_EV_INFO_VALUE:
 818                switch (chan->type) {
 819                case IIO_STEPS:
 820                        if (val < 0 || val > 255)
 821                                return -EINVAL;
 822                        mutex_lock(&data->mutex);
 823                        ret = mma9553_set_config(data,
 824                                                MMA9553_REG_CONF_SPEED_STEP,
 825                                                &data->conf.speed_step, val,
 826                                                MMA9553_MASK_CONF_STEPCOALESCE);
 827                        mutex_unlock(&data->mutex);
 828                        return ret;
 829                default:
 830                        return -EINVAL;
 831                }
 832        case IIO_EV_INFO_PERIOD:
 833                switch (chan->type) {
 834                case IIO_ACTIVITY:
 835                        if (val < 0 || val > MMA9553_ACTIVITY_THD_TO_SEC(
 836                            MMA9553_MAX_ACTTHD))
 837                                return -EINVAL;
 838                        mutex_lock(&data->mutex);
 839                        ret = mma9553_set_config(data, MMA9553_REG_CONF_ACTTHD,
 840                                                 &data->conf.actthd,
 841                                                 MMA9553_ACTIVITY_SEC_TO_THD
 842                                                 (val), MMA9553_MASK_CONF_WORD);
 843                        mutex_unlock(&data->mutex);
 844                        return ret;
 845                default:
 846                        return -EINVAL;
 847                }
 848        default:
 849                return -EINVAL;
 850        }
 851}
 852
 853static int mma9553_get_calibgender_mode(struct iio_dev *indio_dev,
 854                                        const struct iio_chan_spec *chan)
 855{
 856        struct mma9553_data *data = iio_priv(indio_dev);
 857        u8 gender;
 858
 859        gender = mma9553_get_bits(data->conf.filter, MMA9553_MASK_CONF_MALE);
 860        /*
 861         * HW expects 0 for female and 1 for male,
 862         * while iio index is 0 for male and 1 for female.
 863         */
 864        return !gender;
 865}
 866
 867static int mma9553_set_calibgender_mode(struct iio_dev *indio_dev,
 868                                        const struct iio_chan_spec *chan,
 869                                        unsigned int mode)
 870{
 871        struct mma9553_data *data = iio_priv(indio_dev);
 872        u8 gender = !mode;
 873        int ret;
 874
 875        if ((mode != 0) && (mode != 1))
 876                return -EINVAL;
 877        mutex_lock(&data->mutex);
 878        ret = mma9553_set_config(data, MMA9553_REG_CONF_FILTER,
 879                                 &data->conf.filter, gender,
 880                                 MMA9553_MASK_CONF_MALE);
 881        mutex_unlock(&data->mutex);
 882
 883        return ret;
 884}
 885
 886static const struct iio_event_spec mma9553_step_event = {
 887        .type = IIO_EV_TYPE_CHANGE,
 888        .dir = IIO_EV_DIR_NONE,
 889        .mask_separate = BIT(IIO_EV_INFO_ENABLE) | BIT(IIO_EV_INFO_VALUE),
 890};
 891
 892static const struct iio_event_spec mma9553_activity_events[] = {
 893        {
 894                .type = IIO_EV_TYPE_THRESH,
 895                .dir = IIO_EV_DIR_RISING,
 896                .mask_separate = BIT(IIO_EV_INFO_ENABLE) |
 897                                 BIT(IIO_EV_INFO_VALUE) |
 898                                 BIT(IIO_EV_INFO_PERIOD),
 899         },
 900        {
 901                .type = IIO_EV_TYPE_THRESH,
 902                .dir = IIO_EV_DIR_FALLING,
 903                .mask_separate = BIT(IIO_EV_INFO_ENABLE) |
 904                                 BIT(IIO_EV_INFO_VALUE) |
 905                                 BIT(IIO_EV_INFO_PERIOD),
 906        },
 907};
 908
 909static const char * const mma9553_calibgender_modes[] = { "male", "female" };
 910
 911static const struct iio_enum mma9553_calibgender_enum = {
 912        .items = mma9553_calibgender_modes,
 913        .num_items = ARRAY_SIZE(mma9553_calibgender_modes),
 914        .get = mma9553_get_calibgender_mode,
 915        .set = mma9553_set_calibgender_mode,
 916};
 917
 918static const struct iio_chan_spec_ext_info mma9553_ext_info[] = {
 919        IIO_ENUM("calibgender", IIO_SHARED_BY_TYPE, &mma9553_calibgender_enum),
 920        IIO_ENUM_AVAILABLE("calibgender", &mma9553_calibgender_enum),
 921        {},
 922};
 923
 924#define MMA9553_PEDOMETER_CHANNEL(_type, _mask) {               \
 925        .type = _type,                                          \
 926        .info_mask_separate = BIT(IIO_CHAN_INFO_ENABLE)      |  \
 927                              BIT(IIO_CHAN_INFO_CALIBHEIGHT) |  \
 928                              _mask,                            \
 929        .ext_info = mma9553_ext_info,                           \
 930}
 931
 932#define MMA9553_ACTIVITY_CHANNEL(_chan2) {                              \
 933        .type = IIO_ACTIVITY,                                           \
 934        .modified = 1,                                                  \
 935        .channel2 = _chan2,                                             \
 936        .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED),             \
 937        .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_CALIBHEIGHT) |    \
 938                                    BIT(IIO_CHAN_INFO_ENABLE),          \
 939        .event_spec = mma9553_activity_events,                          \
 940        .num_event_specs = ARRAY_SIZE(mma9553_activity_events),         \
 941        .ext_info = mma9553_ext_info,                                   \
 942}
 943
 944static const struct iio_chan_spec mma9553_channels[] = {
 945        MMA9551_ACCEL_CHANNEL(IIO_MOD_X),
 946        MMA9551_ACCEL_CHANNEL(IIO_MOD_Y),
 947        MMA9551_ACCEL_CHANNEL(IIO_MOD_Z),
 948
 949        {
 950                .type = IIO_STEPS,
 951                .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) |
 952                                     BIT(IIO_CHAN_INFO_ENABLE) |
 953                                     BIT(IIO_CHAN_INFO_DEBOUNCE_COUNT) |
 954                                     BIT(IIO_CHAN_INFO_DEBOUNCE_TIME),
 955                .event_spec = &mma9553_step_event,
 956                .num_event_specs = 1,
 957        },
 958
 959        MMA9553_PEDOMETER_CHANNEL(IIO_DISTANCE, BIT(IIO_CHAN_INFO_PROCESSED)),
 960        {
 961                .type = IIO_VELOCITY,
 962                .modified = 1,
 963                .channel2 = IIO_MOD_ROOT_SUM_SQUARED_X_Y_Z,
 964                .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
 965                                      BIT(IIO_CHAN_INFO_SCALE) |
 966                                      BIT(IIO_CHAN_INFO_INT_TIME) |
 967                                      BIT(IIO_CHAN_INFO_ENABLE),
 968                .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_CALIBHEIGHT),
 969                .ext_info = mma9553_ext_info,
 970        },
 971        MMA9553_PEDOMETER_CHANNEL(IIO_ENERGY, BIT(IIO_CHAN_INFO_RAW) |
 972                                  BIT(IIO_CHAN_INFO_SCALE) |
 973                                  BIT(IIO_CHAN_INFO_CALIBWEIGHT)),
 974
 975        MMA9553_ACTIVITY_CHANNEL(IIO_MOD_RUNNING),
 976        MMA9553_ACTIVITY_CHANNEL(IIO_MOD_JOGGING),
 977        MMA9553_ACTIVITY_CHANNEL(IIO_MOD_WALKING),
 978        MMA9553_ACTIVITY_CHANNEL(IIO_MOD_STILL),
 979};
 980
 981static const struct iio_info mma9553_info = {
 982        .read_raw = mma9553_read_raw,
 983        .write_raw = mma9553_write_raw,
 984        .read_event_config = mma9553_read_event_config,
 985        .write_event_config = mma9553_write_event_config,
 986        .read_event_value = mma9553_read_event_value,
 987        .write_event_value = mma9553_write_event_value,
 988};
 989
 990static irqreturn_t mma9553_irq_handler(int irq, void *private)
 991{
 992        struct iio_dev *indio_dev = private;
 993        struct mma9553_data *data = iio_priv(indio_dev);
 994
 995        data->timestamp = iio_get_time_ns(indio_dev);
 996        /*
 997         * Since we only configure the interrupt pin when an
 998         * event is enabled, we are sure we have at least
 999         * one event enabled at this point.
1000         */
1001        return IRQ_WAKE_THREAD;
1002}
1003
1004static irqreturn_t mma9553_event_handler(int irq, void *private)
1005{
1006        struct iio_dev *indio_dev = private;
1007        struct mma9553_data *data = iio_priv(indio_dev);
1008        u16 stepcnt;
1009        u8 activity;
1010        struct mma9553_event *ev_activity, *ev_prev_activity, *ev_step_detect;
1011        int ret;
1012
1013        mutex_lock(&data->mutex);
1014        ret = mma9553_read_activity_stepcnt(data, &activity, &stepcnt);
1015        if (ret < 0) {
1016                mutex_unlock(&data->mutex);
1017                return IRQ_HANDLED;
1018        }
1019
1020        ev_prev_activity = mma9553_get_event(data, IIO_ACTIVITY,
1021                                             mma9553_activity_to_mod(
1022                                             data->activity),
1023                                             IIO_EV_DIR_FALLING);
1024        ev_activity = mma9553_get_event(data, IIO_ACTIVITY,
1025                                        mma9553_activity_to_mod(activity),
1026                                        IIO_EV_DIR_RISING);
1027        ev_step_detect = mma9553_get_event(data, IIO_STEPS, IIO_NO_MOD,
1028                                           IIO_EV_DIR_NONE);
1029
1030        if (ev_step_detect->enabled && (stepcnt != data->stepcnt)) {
1031                data->stepcnt = stepcnt;
1032                iio_push_event(indio_dev,
1033                               IIO_EVENT_CODE(IIO_STEPS, 0, IIO_NO_MOD,
1034                                              IIO_EV_DIR_NONE,
1035                                              IIO_EV_TYPE_CHANGE, 0, 0, 0),
1036                               data->timestamp);
1037        }
1038
1039        if (activity != data->activity) {
1040                data->activity = activity;
1041                /* ev_activity can be NULL if activity == ACTIVITY_UNKNOWN */
1042                if (ev_prev_activity && ev_prev_activity->enabled)
1043                        iio_push_event(indio_dev,
1044                                       IIO_EVENT_CODE(IIO_ACTIVITY, 0,
1045                                                    ev_prev_activity->info->mod,
1046                                                    IIO_EV_DIR_FALLING,
1047                                                    IIO_EV_TYPE_THRESH, 0, 0,
1048                                                    0),
1049                                       data->timestamp);
1050
1051                if (ev_activity && ev_activity->enabled)
1052                        iio_push_event(indio_dev,
1053                                       IIO_EVENT_CODE(IIO_ACTIVITY, 0,
1054                                                      ev_activity->info->mod,
1055                                                      IIO_EV_DIR_RISING,
1056                                                      IIO_EV_TYPE_THRESH, 0, 0,
1057                                                      0),
1058                                       data->timestamp);
1059        }
1060        mutex_unlock(&data->mutex);
1061
1062        return IRQ_HANDLED;
1063}
1064
1065static const char *mma9553_match_acpi_device(struct device *dev)
1066{
1067        const struct acpi_device_id *id;
1068
1069        id = acpi_match_device(dev->driver->acpi_match_table, dev);
1070        if (!id)
1071                return NULL;
1072
1073        return dev_name(dev);
1074}
1075
1076static int mma9553_probe(struct i2c_client *client,
1077                         const struct i2c_device_id *id)
1078{
1079        struct mma9553_data *data;
1080        struct iio_dev *indio_dev;
1081        const char *name = NULL;
1082        int ret;
1083
1084        indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
1085        if (!indio_dev)
1086                return -ENOMEM;
1087
1088        data = iio_priv(indio_dev);
1089        i2c_set_clientdata(client, indio_dev);
1090        data->client = client;
1091
1092        if (id)
1093                name = id->name;
1094        else if (ACPI_HANDLE(&client->dev))
1095                name = mma9553_match_acpi_device(&client->dev);
1096        else
1097                return -ENOSYS;
1098
1099        mutex_init(&data->mutex);
1100        mma9553_init_events(data);
1101
1102        ret = mma9553_init(data);
1103        if (ret < 0)
1104                return ret;
1105
1106        indio_dev->dev.parent = &client->dev;
1107        indio_dev->channels = mma9553_channels;
1108        indio_dev->num_channels = ARRAY_SIZE(mma9553_channels);
1109        indio_dev->name = name;
1110        indio_dev->modes = INDIO_DIRECT_MODE;
1111        indio_dev->info = &mma9553_info;
1112
1113        if (client->irq > 0) {
1114                ret = devm_request_threaded_irq(&client->dev, client->irq,
1115                                                mma9553_irq_handler,
1116                                                mma9553_event_handler,
1117                                                IRQF_TRIGGER_RISING,
1118                                                MMA9553_IRQ_NAME, indio_dev);
1119                if (ret < 0) {
1120                        dev_err(&client->dev, "request irq %d failed\n",
1121                                client->irq);
1122                        goto out_poweroff;
1123                }
1124        }
1125
1126        ret = pm_runtime_set_active(&client->dev);
1127        if (ret < 0)
1128                goto out_poweroff;
1129
1130        pm_runtime_enable(&client->dev);
1131        pm_runtime_set_autosuspend_delay(&client->dev,
1132                                         MMA9551_AUTO_SUSPEND_DELAY_MS);
1133        pm_runtime_use_autosuspend(&client->dev);
1134
1135        ret = iio_device_register(indio_dev);
1136        if (ret < 0) {
1137                dev_err(&client->dev, "unable to register iio device\n");
1138                goto out_poweroff;
1139        }
1140
1141        dev_dbg(&indio_dev->dev, "Registered device %s\n", name);
1142        return 0;
1143
1144out_poweroff:
1145        mma9551_set_device_state(client, false);
1146        return ret;
1147}
1148
1149static int mma9553_remove(struct i2c_client *client)
1150{
1151        struct iio_dev *indio_dev = i2c_get_clientdata(client);
1152        struct mma9553_data *data = iio_priv(indio_dev);
1153
1154        iio_device_unregister(indio_dev);
1155
1156        pm_runtime_disable(&client->dev);
1157        pm_runtime_set_suspended(&client->dev);
1158        pm_runtime_put_noidle(&client->dev);
1159
1160        mutex_lock(&data->mutex);
1161        mma9551_set_device_state(data->client, false);
1162        mutex_unlock(&data->mutex);
1163
1164        return 0;
1165}
1166
1167#ifdef CONFIG_PM
1168static int mma9553_runtime_suspend(struct device *dev)
1169{
1170        struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
1171        struct mma9553_data *data = iio_priv(indio_dev);
1172        int ret;
1173
1174        mutex_lock(&data->mutex);
1175        ret = mma9551_set_device_state(data->client, false);
1176        mutex_unlock(&data->mutex);
1177        if (ret < 0) {
1178                dev_err(&data->client->dev, "powering off device failed\n");
1179                return -EAGAIN;
1180        }
1181
1182        return 0;
1183}
1184
1185static int mma9553_runtime_resume(struct device *dev)
1186{
1187        struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
1188        struct mma9553_data *data = iio_priv(indio_dev);
1189        int ret;
1190
1191        ret = mma9551_set_device_state(data->client, true);
1192        if (ret < 0)
1193                return ret;
1194
1195        mma9551_sleep(MMA9553_DEFAULT_SAMPLE_RATE);
1196
1197        return 0;
1198}
1199#endif
1200
1201#ifdef CONFIG_PM_SLEEP
1202static int mma9553_suspend(struct device *dev)
1203{
1204        struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
1205        struct mma9553_data *data = iio_priv(indio_dev);
1206        int ret;
1207
1208        mutex_lock(&data->mutex);
1209        ret = mma9551_set_device_state(data->client, false);
1210        mutex_unlock(&data->mutex);
1211
1212        return ret;
1213}
1214
1215static int mma9553_resume(struct device *dev)
1216{
1217        struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
1218        struct mma9553_data *data = iio_priv(indio_dev);
1219        int ret;
1220
1221        mutex_lock(&data->mutex);
1222        ret = mma9551_set_device_state(data->client, true);
1223        mutex_unlock(&data->mutex);
1224
1225        return ret;
1226}
1227#endif
1228
1229static const struct dev_pm_ops mma9553_pm_ops = {
1230        SET_SYSTEM_SLEEP_PM_OPS(mma9553_suspend, mma9553_resume)
1231        SET_RUNTIME_PM_OPS(mma9553_runtime_suspend,
1232                           mma9553_runtime_resume, NULL)
1233};
1234
1235static const struct acpi_device_id mma9553_acpi_match[] = {
1236        {"MMA9553", 0},
1237        {},
1238};
1239
1240MODULE_DEVICE_TABLE(acpi, mma9553_acpi_match);
1241
1242static const struct i2c_device_id mma9553_id[] = {
1243        {"mma9553", 0},
1244        {},
1245};
1246
1247MODULE_DEVICE_TABLE(i2c, mma9553_id);
1248
1249static struct i2c_driver mma9553_driver = {
1250        .driver = {
1251                   .name = MMA9553_DRV_NAME,
1252                   .acpi_match_table = ACPI_PTR(mma9553_acpi_match),
1253                   .pm = &mma9553_pm_ops,
1254                   },
1255        .probe = mma9553_probe,
1256        .remove = mma9553_remove,
1257        .id_table = mma9553_id,
1258};
1259
1260module_i2c_driver(mma9553_driver);
1261
1262MODULE_AUTHOR("Irina Tirdea <irina.tirdea@intel.com>");
1263MODULE_LICENSE("GPL v2");
1264MODULE_DESCRIPTION("MMA9553L pedometer platform driver");
1265