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