2 * Freescale MMA9553L Intelligent Pedometer driver
3 * Copyright (c) 2014, Intel Corporation.
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.
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
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"
27 #define MMA9553_DRV_NAME "mma9553"
28 #define MMA9553_IRQ_NAME "mma9553_event"
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)
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)
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)
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)
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)
55 #define MMA9553_REG_CONF_ACTTHD 0x0E
56 #define MMA9553_MAX_ACTTHD GENMASK(15, 0)
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)
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
74 /* Pedometer events are always mapped to this pin. */
75 #define MMA9553_DEFAULT_GPIO_PIN mma9551_gpio6
76 #define MMA9553_DEFAULT_GPIO_POLARITY 0
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))
82 #define MMA9553_DEFAULT_SAMPLE_RATE 30 /* Hz */
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.
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)
94 * Autonomously suspend pedometer if acceleration vector magnitude
95 * is near 1g (4096 at 0.244 mg/LSB resolution) for 30 seconds.
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)
101 #define MMA9553_CONFIG_RETRIES 2
103 /* Status register - activity field */
104 enum activity_level
{
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
[] = {
120 .dir
= IIO_EV_DIR_NONE
,
123 .type
= IIO_ACTIVITY
,
124 .mod
= IIO_MOD_STILL
,
125 .dir
= IIO_EV_DIR_RISING
,
128 .type
= IIO_ACTIVITY
,
129 .mod
= IIO_MOD_STILL
,
130 .dir
= IIO_EV_DIR_FALLING
,
133 .type
= IIO_ACTIVITY
,
134 .mod
= IIO_MOD_WALKING
,
135 .dir
= IIO_EV_DIR_RISING
,
138 .type
= IIO_ACTIVITY
,
139 .mod
= IIO_MOD_WALKING
,
140 .dir
= IIO_EV_DIR_FALLING
,
143 .type
= IIO_ACTIVITY
,
144 .mod
= IIO_MOD_JOGGING
,
145 .dir
= IIO_EV_DIR_RISING
,
148 .type
= IIO_ACTIVITY
,
149 .mod
= IIO_MOD_JOGGING
,
150 .dir
= IIO_EV_DIR_FALLING
,
153 .type
= IIO_ACTIVITY
,
154 .mod
= IIO_MOD_RUNNING
,
155 .dir
= IIO_EV_DIR_RISING
,
158 .type
= IIO_ACTIVITY
,
159 .mod
= IIO_MOD_RUNNING
,
160 .dir
= IIO_EV_DIR_FALLING
,
164 #define MMA9553_EVENTS_INFO_SIZE ARRAY_SIZE(mma9553_events_info)
166 struct mma9553_event
{
167 struct mma9553_event_info
*info
;
171 struct mma9553_conf_regs
{
182 struct mma9553_data
{
183 struct i2c_client
*client
;
185 * 1. Serialize access to HW (requested by mma9551_core API).
186 * 2. Serialize sequences that power on/off the device and access HW.
189 struct mma9553_conf_regs conf
;
190 struct mma9553_event events
[MMA9553_EVENTS_INFO_SIZE
];
194 * This is used for all features that depend on step count:
195 * step count, distance, speed, calories.
197 bool stepcnt_enabled
;
203 static u8
mma9553_get_bits(u16 val
, u16 mask
)
205 return (val
& mask
) >> (ffs(mask
) - 1);
208 static u16
mma9553_set_bits(u16 current_val
, u16 val
, u16 mask
)
210 return (current_val
& ~mask
) | (val
<< (ffs(mask
) - 1));
213 static enum iio_modifier
mma9553_activity_to_mod(enum activity_level 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
;
223 return IIO_MOD_STILL
;
224 case ACTIVITY_UNKNOWN
:
230 static void mma9553_init_events(struct mma9553_data
*data
)
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;
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
)
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
];
257 static bool mma9553_is_any_event_enabled(struct mma9553_data
*data
,
259 enum iio_chan_type type
)
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
))
272 static int mma9553_set_config(struct mma9553_data
*data
, u16 reg
,
273 u16
*p_reg_val
, u16 val
, u16 mask
)
278 reg_val
= *p_reg_val
;
279 if (val
== mma9553_get_bits(reg_val
, mask
))
282 reg_val
= mma9553_set_bits(reg_val
, val
, mask
);
283 ret
= mma9551_write_config_word(data
->client
, MMA9551_APPID_PEDOMETER
,
286 dev_err(&data
->client
->dev
,
287 "error writing config register 0x%x\n", reg
);
291 *p_reg_val
= reg_val
;
293 /* Reinitializes the pedometer with current configuration values */
294 config
= mma9553_set_bits(data
->conf
.config
, 1,
295 MMA9553_MASK_CONF_CONFIG
);
297 ret
= mma9551_write_config_word(data
->client
, MMA9551_APPID_PEDOMETER
,
298 MMA9553_REG_CONF_CONF_STEPLEN
, config
);
300 dev_err(&data
->client
->dev
,
301 "error writing config register 0x%x\n",
302 MMA9553_REG_CONF_CONF_STEPLEN
);
306 retries
= MMA9553_CONFIG_RETRIES
;
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
,
315 } while (mma9553_get_bits(config
, MMA9553_MASK_CONF_CONFIG
) &&
321 static int mma9553_read_activity_stepcnt(struct mma9553_data
*data
,
322 u8
*activity
, u16
*stepcnt
)
327 ret
= mma9551_read_status_words(data
->client
, MMA9551_APPID_PEDOMETER
,
328 MMA9553_REG_STATUS
, ARRAY_SIZE(buf
),
331 dev_err(&data
->client
->dev
,
332 "error reading status and stepcnt\n");
336 *activity
= mma9553_get_bits(buf
[0], MMA9553_MASK_STATUS_ACTIVITY
);
342 static int mma9553_conf_gpio(struct mma9553_data
*data
)
344 u8 bitnum
= 0, appid
= MMA9551_APPID_PEDOMETER
;
346 struct mma9553_event
*ev_step_detect
;
347 bool activity_enabled
;
349 activity_enabled
= mma9553_is_any_event_enabled(data
, true,
351 ev_step_detect
= mma9553_get_event(data
, IIO_STEPS
, IIO_NO_MOD
,
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.
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
);
365 appid
= MMA9551_APPID_NONE
;
367 if (data
->gpio_bitnum
== bitnum
)
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
,
378 ret
= mma9551_gpio_config(data
->client
, MMA9553_DEFAULT_GPIO_PIN
, appid
,
379 bitnum
, MMA9553_DEFAULT_GPIO_POLARITY
);
382 data
->gpio_bitnum
= bitnum
;
387 static int mma9553_init(struct mma9553_data
*data
)
391 ret
= mma9551_read_version(data
->client
);
396 * Read all the pedometer configuration registers. This is used as
397 * a device identification command to differentiate the MMA9553L
400 ret
= mma9551_read_config_words(data
->client
, MMA9551_APPID_PEDOMETER
,
401 MMA9553_REG_CONF_SLEEPMIN
,
402 sizeof(data
->conf
) / sizeof(u16
),
405 dev_err(&data
->client
->dev
,
406 "failed to read configuration registers\n");
411 data
->gpio_bitnum
= MMA9553_MAX_BITNUM
;
412 ret
= mma9553_conf_gpio(data
);
416 ret
= mma9551_app_reset(data
->client
, MMA9551_RSC_PED
);
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
);
427 * Clear the activity debounce counter when the activity level changes,
428 * so that the confidence level applies for any activity level.
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
),
437 dev_err(&data
->client
->dev
,
438 "failed to write configuration registers\n");
442 return mma9551_set_device_state(data
->client
, true);
445 static int mma9553_read_status_word(struct mma9553_data
*data
, u16 reg
,
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
457 powered_on
= mma9553_is_any_event_enabled(data
, false, 0) ||
458 data
->stepcnt_enabled
;
460 dev_err(&data
->client
->dev
, "No channels enabled\n");
464 mutex_lock(&data
->mutex
);
465 ret
= mma9551_read_status_word(data
->client
, MMA9551_APPID_PEDOMETER
,
467 mutex_unlock(&data
->mutex
);
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
)
475 struct mma9553_data
*data
= iio_priv(indio_dev
);
481 case IIO_CHAN_INFO_PROCESSED
:
482 switch (chan
->type
) {
484 ret
= mma9553_read_status_word(data
,
492 ret
= mma9553_read_status_word(data
,
493 MMA9553_REG_DISTANCE
,
500 ret
= mma9553_read_status_word(data
,
507 mma9553_get_bits(tmp
, MMA9553_MASK_STATUS_ACTIVITY
);
510 * The device does not support confidence value levels,
511 * so we will always have 100% for current activity and
514 if (chan
->channel2
== mma9553_activity_to_mod(activity
))
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
)
527 ret
= mma9553_read_status_word(data
,
534 case IIO_ENERGY
: /* Cal or kcal */
535 ret
= mma9553_read_status_word(data
,
536 MMA9553_REG_CALORIES
,
543 mutex_lock(&data
->mutex
);
544 ret
= mma9551_read_accel_chan(data
->client
,
546 mutex_unlock(&data
->mutex
);
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
)
557 *val2
= 277; /* 0.000277 */
558 return IIO_VAL_INT_PLUS_MICRO
;
559 case IIO_ENERGY
: /* Cal or kcal to J */
563 return mma9551_read_accel_scale(val
, val2
);
567 case IIO_CHAN_INFO_ENABLE
:
568 *val
= data
->stepcnt_enabled
;
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
);
580 case IIO_CHAN_INFO_DEBOUNCE_COUNT
:
581 switch (chan
->type
) {
583 *val
= mma9553_get_bits(data
->conf
.filter
,
584 MMA9553_MASK_CONF_FILTSTEP
);
589 case IIO_CHAN_INFO_DEBOUNCE_TIME
:
590 switch (chan
->type
) {
592 *val
= mma9553_get_bits(data
->conf
.filter
,
593 MMA9553_MASK_CONF_FILTTIME
);
598 case IIO_CHAN_INFO_INT_TIME
:
599 switch (chan
->type
) {
601 if (chan
->channel2
!= IIO_MOD_ROOT_SUM_SQUARED_X_Y_Z
)
603 *val
= mma9553_get_bits(data
->conf
.speed_step
,
604 MMA9553_MASK_CONF_SPDPRD
);
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
)
618 struct mma9553_data
*data
= iio_priv(indio_dev
);
622 case IIO_CHAN_INFO_ENABLE
:
623 if (data
->stepcnt_enabled
== !!val
)
625 mutex_lock(&data
->mutex
);
626 ret
= mma9551_set_power_state(data
->client
, val
);
628 mutex_unlock(&data
->mutex
);
631 data
->stepcnt_enabled
= val
;
632 mutex_unlock(&data
->mutex
);
634 case IIO_CHAN_INFO_CALIBHEIGHT
:
636 tmp
= val
* 100 + val2
/ 10000;
637 if (tmp
< 0 || tmp
> 255)
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
);
646 case IIO_CHAN_INFO_CALIBWEIGHT
:
647 if (val
< 0 || val
> 255)
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
);
656 case IIO_CHAN_INFO_DEBOUNCE_COUNT
:
657 switch (chan
->type
) {
660 * Set to 0 to disable step filtering. If the value
661 * specified is greater than 6, then 6 will be used.
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
);
676 case IIO_CHAN_INFO_DEBOUNCE_TIME
:
677 switch (chan
->type
) {
679 if (val
< 0 || val
> 127)
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
);
690 case IIO_CHAN_INFO_INT_TIME
:
691 switch (chan
->type
) {
693 if (chan
->channel2
!= IIO_MOD_ROOT_SUM_SQUARED_X_Y_Z
)
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.
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
);
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
)
724 struct mma9553_data
*data
= iio_priv(indio_dev
);
725 struct mma9553_event
*event
;
727 event
= mma9553_get_event(data
, chan
->type
, chan
->channel2
, dir
);
731 return event
->enabled
;
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
)
739 struct mma9553_data
*data
= iio_priv(indio_dev
);
740 struct mma9553_event
*event
;
743 event
= mma9553_get_event(data
, chan
->type
, chan
->channel2
, dir
);
747 if (event
->enabled
== state
)
750 mutex_lock(&data
->mutex
);
752 ret
= mma9551_set_power_state(data
->client
, state
);
755 event
->enabled
= state
;
757 ret
= mma9553_conf_gpio(data
);
761 mutex_unlock(&data
->mutex
);
767 event
->enabled
= false;
768 mma9551_set_power_state(data
->client
, false);
771 mutex_unlock(&data
->mutex
);
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
,
782 struct mma9553_data
*data
= iio_priv(indio_dev
);
786 case IIO_EV_INFO_VALUE
:
787 switch (chan
->type
) {
789 *val
= mma9553_get_bits(data
->conf
.speed_step
,
790 MMA9553_MASK_CONF_STEPCOALESCE
);
794 * The device does not support confidence value levels.
795 * We set an average of 50%.
802 case IIO_EV_INFO_PERIOD
:
803 switch (chan
->type
) {
805 *val
= MMA9553_ACTIVITY_THD_TO_SEC(data
->conf
.actthd
);
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
,
822 struct mma9553_data
*data
= iio_priv(indio_dev
);
826 case IIO_EV_INFO_VALUE
:
827 switch (chan
->type
) {
829 if (val
< 0 || val
> 255)
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
);
841 case IIO_EV_INFO_PERIOD
:
842 switch (chan
->type
) {
844 if (val
< 0 || val
> MMA9553_ACTIVITY_THD_TO_SEC(
847 mutex_lock(&data
->mutex
);
848 ret
= mma9553_set_config(data
, MMA9553_REG_CONF_ACTTHD
,
850 MMA9553_ACTIVITY_SEC_TO_THD
851 (val
), MMA9553_MASK_CONF_WORD
);
852 mutex_unlock(&data
->mutex
);
862 static int mma9553_get_calibgender_mode(struct iio_dev
*indio_dev
,
863 const struct iio_chan_spec
*chan
)
865 struct mma9553_data
*data
= iio_priv(indio_dev
);
868 gender
= mma9553_get_bits(data
->conf
.filter
, MMA9553_MASK_CONF_MALE
);
870 * HW expects 0 for female and 1 for male,
871 * while iio index is 0 for male and 1 for female.
876 static int mma9553_set_calibgender_mode(struct iio_dev
*indio_dev
,
877 const struct iio_chan_spec
*chan
,
880 struct mma9553_data
*data
= iio_priv(indio_dev
);
884 if ((mode
!= 0) && (mode
!= 1))
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
);
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
),
901 static const struct iio_event_spec mma9553_activity_events
[] = {
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
),
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
),
918 static const char * const mma9553_calibgender_modes
[] = { "male", "female" };
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
,
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
),
933 #define MMA9553_PEDOMETER_CHANNEL(_type, _mask) { \
935 .info_mask_separate = BIT(IIO_CHAN_INFO_ENABLE) | \
936 BIT(IIO_CHAN_INFO_CALIBHEIGHT) | \
938 .ext_info = mma9553_ext_info, \
941 #define MMA9553_ACTIVITY_CHANNEL(_chan2) { \
942 .type = IIO_ACTIVITY, \
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, \
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
),
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,
968 MMA9553_PEDOMETER_CHANNEL(IIO_DISTANCE
, BIT(IIO_CHAN_INFO_PROCESSED
)),
970 .type
= IIO_VELOCITY
,
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
,
980 MMA9553_PEDOMETER_CHANNEL(IIO_ENERGY
, BIT(IIO_CHAN_INFO_RAW
) |
981 BIT(IIO_CHAN_INFO_SCALE
) |
982 BIT(IIO_CHAN_INFO_CALIBWEIGHT
)),
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
),
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
,
1000 static irqreturn_t
mma9553_irq_handler(int irq
, void *private)
1002 struct iio_dev
*indio_dev
= private;
1003 struct mma9553_data
*data
= iio_priv(indio_dev
);
1005 data
->timestamp
= iio_get_time_ns();
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.
1011 return IRQ_WAKE_THREAD
;
1014 static irqreturn_t
mma9553_event_handler(int irq
, void *private)
1016 struct iio_dev
*indio_dev
= private;
1017 struct mma9553_data
*data
= iio_priv(indio_dev
);
1020 struct mma9553_event
*ev_activity
, *ev_prev_activity
, *ev_step_detect
;
1023 mutex_lock(&data
->mutex
);
1024 ret
= mma9553_read_activity_stepcnt(data
, &activity
, &stepcnt
);
1026 mutex_unlock(&data
->mutex
);
1030 ev_prev_activity
= mma9553_get_event(data
, IIO_ACTIVITY
,
1031 mma9553_activity_to_mod(
1033 IIO_EV_DIR_FALLING
);
1034 ev_activity
= mma9553_get_event(data
, IIO_ACTIVITY
,
1035 mma9553_activity_to_mod(activity
),
1037 ev_step_detect
= mma9553_get_event(data
, IIO_STEPS
, IIO_NO_MOD
,
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
,
1045 IIO_EV_TYPE_CHANGE
, 0, 0, 0),
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
,
1057 IIO_EV_TYPE_THRESH
, 0, 0,
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
,
1066 IIO_EV_TYPE_THRESH
, 0, 0,
1070 mutex_unlock(&data
->mutex
);
1075 static const char *mma9553_match_acpi_device(struct device
*dev
)
1077 const struct acpi_device_id
*id
;
1079 id
= acpi_match_device(dev
->driver
->acpi_match_table
, dev
);
1083 return dev_name(dev
);
1086 static int mma9553_probe(struct i2c_client
*client
,
1087 const struct i2c_device_id
*id
)
1089 struct mma9553_data
*data
;
1090 struct iio_dev
*indio_dev
;
1091 const char *name
= NULL
;
1094 indio_dev
= devm_iio_device_alloc(&client
->dev
, sizeof(*data
));
1098 data
= iio_priv(indio_dev
);
1099 i2c_set_clientdata(client
, indio_dev
);
1100 data
->client
= client
;
1104 else if (ACPI_HANDLE(&client
->dev
))
1105 name
= mma9553_match_acpi_device(&client
->dev
);
1109 mutex_init(&data
->mutex
);
1110 mma9553_init_events(data
);
1112 ret
= mma9553_init(data
);
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
;
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
);
1130 dev_err(&client
->dev
, "request irq %d failed\n",
1136 ret
= iio_device_register(indio_dev
);
1138 dev_err(&client
->dev
, "unable to register iio device\n");
1142 ret
= pm_runtime_set_active(&client
->dev
);
1144 goto out_iio_unregister
;
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
);
1151 dev_dbg(&indio_dev
->dev
, "Registered device %s\n", name
);
1156 iio_device_unregister(indio_dev
);
1158 mma9551_set_device_state(client
, false);
1162 static int mma9553_remove(struct i2c_client
*client
)
1164 struct iio_dev
*indio_dev
= i2c_get_clientdata(client
);
1165 struct mma9553_data
*data
= iio_priv(indio_dev
);
1167 pm_runtime_disable(&client
->dev
);
1168 pm_runtime_set_suspended(&client
->dev
);
1169 pm_runtime_put_noidle(&client
->dev
);
1171 iio_device_unregister(indio_dev
);
1172 mutex_lock(&data
->mutex
);
1173 mma9551_set_device_state(data
->client
, false);
1174 mutex_unlock(&data
->mutex
);
1180 static int mma9553_runtime_suspend(struct device
*dev
)
1182 struct iio_dev
*indio_dev
= i2c_get_clientdata(to_i2c_client(dev
));
1183 struct mma9553_data
*data
= iio_priv(indio_dev
);
1186 mutex_lock(&data
->mutex
);
1187 ret
= mma9551_set_device_state(data
->client
, false);
1188 mutex_unlock(&data
->mutex
);
1190 dev_err(&data
->client
->dev
, "powering off device failed\n");
1197 static int mma9553_runtime_resume(struct device
*dev
)
1199 struct iio_dev
*indio_dev
= i2c_get_clientdata(to_i2c_client(dev
));
1200 struct mma9553_data
*data
= iio_priv(indio_dev
);
1203 ret
= mma9551_set_device_state(data
->client
, true);
1207 mma9551_sleep(MMA9553_DEFAULT_SAMPLE_RATE
);
1213 #ifdef CONFIG_PM_SLEEP
1214 static int mma9553_suspend(struct device
*dev
)
1216 struct iio_dev
*indio_dev
= i2c_get_clientdata(to_i2c_client(dev
));
1217 struct mma9553_data
*data
= iio_priv(indio_dev
);
1220 mutex_lock(&data
->mutex
);
1221 ret
= mma9551_set_device_state(data
->client
, false);
1222 mutex_unlock(&data
->mutex
);
1227 static int mma9553_resume(struct device
*dev
)
1229 struct iio_dev
*indio_dev
= i2c_get_clientdata(to_i2c_client(dev
));
1230 struct mma9553_data
*data
= iio_priv(indio_dev
);
1233 mutex_lock(&data
->mutex
);
1234 ret
= mma9551_set_device_state(data
->client
, true);
1235 mutex_unlock(&data
->mutex
);
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
)
1247 static const struct acpi_device_id mma9553_acpi_match
[] = {
1252 MODULE_DEVICE_TABLE(acpi
, mma9553_acpi_match
);
1254 static const struct i2c_device_id mma9553_id
[] = {
1259 MODULE_DEVICE_TABLE(i2c
, mma9553_id
);
1261 static struct i2c_driver mma9553_driver
= {
1263 .name
= MMA9553_DRV_NAME
,
1264 .acpi_match_table
= ACPI_PTR(mma9553_acpi_match
),
1265 .pm
= &mma9553_pm_ops
,
1267 .probe
= mma9553_probe
,
1268 .remove
= mma9553_remove
,
1269 .id_table
= mma9553_id
,
1272 module_i2c_driver(mma9553_driver
);
1274 MODULE_AUTHOR("Irina Tirdea <irina.tirdea@intel.com>");
1275 MODULE_LICENSE("GPL v2");
1276 MODULE_DESCRIPTION("MMA9553L pedometer platform driver");