mma9553.c (32516B)
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", IIO_SHARED_BY_TYPE, &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->channels = mma9553_channels; 1107 indio_dev->num_channels = ARRAY_SIZE(mma9553_channels); 1108 indio_dev->name = name; 1109 indio_dev->modes = INDIO_DIRECT_MODE; 1110 indio_dev->info = &mma9553_info; 1111 1112 if (client->irq > 0) { 1113 ret = devm_request_threaded_irq(&client->dev, client->irq, 1114 mma9553_irq_handler, 1115 mma9553_event_handler, 1116 IRQF_TRIGGER_RISING, 1117 MMA9553_IRQ_NAME, indio_dev); 1118 if (ret < 0) { 1119 dev_err(&client->dev, "request irq %d failed\n", 1120 client->irq); 1121 goto out_poweroff; 1122 } 1123 } 1124 1125 ret = pm_runtime_set_active(&client->dev); 1126 if (ret < 0) 1127 goto out_poweroff; 1128 1129 pm_runtime_enable(&client->dev); 1130 pm_runtime_set_autosuspend_delay(&client->dev, 1131 MMA9551_AUTO_SUSPEND_DELAY_MS); 1132 pm_runtime_use_autosuspend(&client->dev); 1133 1134 ret = iio_device_register(indio_dev); 1135 if (ret < 0) { 1136 dev_err(&client->dev, "unable to register iio device\n"); 1137 goto err_pm_cleanup; 1138 } 1139 1140 dev_dbg(&indio_dev->dev, "Registered device %s\n", name); 1141 return 0; 1142 1143err_pm_cleanup: 1144 pm_runtime_dont_use_autosuspend(&client->dev); 1145 pm_runtime_disable(&client->dev); 1146out_poweroff: 1147 mma9551_set_device_state(client, false); 1148 return ret; 1149} 1150 1151static int mma9553_remove(struct i2c_client *client) 1152{ 1153 struct iio_dev *indio_dev = i2c_get_clientdata(client); 1154 struct mma9553_data *data = iio_priv(indio_dev); 1155 1156 iio_device_unregister(indio_dev); 1157 1158 pm_runtime_disable(&client->dev); 1159 pm_runtime_set_suspended(&client->dev); 1160 1161 mutex_lock(&data->mutex); 1162 mma9551_set_device_state(data->client, false); 1163 mutex_unlock(&data->mutex); 1164 1165 return 0; 1166} 1167 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 1200static int mma9553_suspend(struct device *dev) 1201{ 1202 struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev)); 1203 struct mma9553_data *data = iio_priv(indio_dev); 1204 int ret; 1205 1206 mutex_lock(&data->mutex); 1207 ret = mma9551_set_device_state(data->client, false); 1208 mutex_unlock(&data->mutex); 1209 1210 return ret; 1211} 1212 1213static int mma9553_resume(struct device *dev) 1214{ 1215 struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev)); 1216 struct mma9553_data *data = iio_priv(indio_dev); 1217 int ret; 1218 1219 mutex_lock(&data->mutex); 1220 ret = mma9551_set_device_state(data->client, true); 1221 mutex_unlock(&data->mutex); 1222 1223 return ret; 1224} 1225 1226static const struct dev_pm_ops mma9553_pm_ops = { 1227 SYSTEM_SLEEP_PM_OPS(mma9553_suspend, mma9553_resume) 1228 RUNTIME_PM_OPS(mma9553_runtime_suspend, mma9553_runtime_resume, NULL) 1229}; 1230 1231static const struct acpi_device_id mma9553_acpi_match[] = { 1232 {"MMA9553", 0}, 1233 {}, 1234}; 1235 1236MODULE_DEVICE_TABLE(acpi, mma9553_acpi_match); 1237 1238static const struct i2c_device_id mma9553_id[] = { 1239 {"mma9553", 0}, 1240 {}, 1241}; 1242 1243MODULE_DEVICE_TABLE(i2c, mma9553_id); 1244 1245static struct i2c_driver mma9553_driver = { 1246 .driver = { 1247 .name = MMA9553_DRV_NAME, 1248 .acpi_match_table = ACPI_PTR(mma9553_acpi_match), 1249 .pm = pm_ptr(&mma9553_pm_ops), 1250 }, 1251 .probe = mma9553_probe, 1252 .remove = mma9553_remove, 1253 .id_table = mma9553_id, 1254}; 1255 1256module_i2c_driver(mma9553_driver); 1257 1258MODULE_AUTHOR("Irina Tirdea <irina.tirdea@intel.com>"); 1259MODULE_LICENSE("GPL v2"); 1260MODULE_DESCRIPTION("MMA9553L pedometer platform driver"); 1261MODULE_IMPORT_NS(IIO_MMA9551);