Linux Audio

Check our new training course

Loading...
   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  */
 104enum activity_level {
 105	ACTIVITY_UNKNOWN,
 106	ACTIVITY_REST,
 107	ACTIVITY_WALKING,
 108	ACTIVITY_JOGGING,
 109	ACTIVITY_RUNNING,
 110};
 111
 112static 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
 166struct mma9553_event {
 167	struct mma9553_event_info *info;
 168	bool enabled;
 169};
 170
 171struct 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
 182struct 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
 203static u8 mma9553_get_bits(u16 val, u16 mask)
 204{
 205	return (val & mask) >> (ffs(mask) - 1);
 206}
 207
 208static u16 mma9553_set_bits(u16 current_val, u16 val, u16 mask)
 209{
 210	return (current_val & ~mask) | (val << (ffs(mask) - 1));
 211}
 212
 213static 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
 230static 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
 241static 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
 257static 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
 272static 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
 321static 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
 342static 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
 387static 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
 445static 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
 471static 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
 614static 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
 719static 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
 734static 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
 765err_conf_gpio:
 766	if (state) {
 767		event->enabled = false;
 768		mma9551_set_power_state(data->client, false);
 769	}
 770err_out:
 771	mutex_unlock(&data->mutex);
 772	return ret;
 773}
 774
 775static 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
 815static 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
 862static 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
 876static 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
 895static 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
 901static 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
 918static const char * const mma9553_calibgender_modes[] = { "male", "female" };
 919
 920static 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
 927static 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
 953static 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
 990static 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
1000static 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
1014static 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
1075static 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
1086static 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 = pm_runtime_set_active(&client->dev);
1137	if (ret < 0)
1138		goto out_poweroff;
1139
1140	pm_runtime_enable(&client->dev);
1141	pm_runtime_set_autosuspend_delay(&client->dev,
1142					 MMA9551_AUTO_SUSPEND_DELAY_MS);
1143	pm_runtime_use_autosuspend(&client->dev);
1144
1145	ret = iio_device_register(indio_dev);
1146	if (ret < 0) {
1147		dev_err(&client->dev, "unable to register iio device\n");
1148		goto out_poweroff;
1149	}
1150
1151	dev_dbg(&indio_dev->dev, "Registered device %s\n", name);
1152	return 0;
1153
1154out_poweroff:
1155	mma9551_set_device_state(client, false);
1156	return ret;
1157}
1158
1159static int mma9553_remove(struct i2c_client *client)
1160{
1161	struct iio_dev *indio_dev = i2c_get_clientdata(client);
1162	struct mma9553_data *data = iio_priv(indio_dev);
1163
1164	iio_device_unregister(indio_dev);
1165
1166	pm_runtime_disable(&client->dev);
1167	pm_runtime_set_suspended(&client->dev);
1168	pm_runtime_put_noidle(&client->dev);
1169
1170	mutex_lock(&data->mutex);
1171	mma9551_set_device_state(data->client, false);
1172	mutex_unlock(&data->mutex);
1173
1174	return 0;
1175}
1176
1177#ifdef CONFIG_PM
1178static int mma9553_runtime_suspend(struct device *dev)
1179{
1180	struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
1181	struct mma9553_data *data = iio_priv(indio_dev);
1182	int ret;
1183
1184	mutex_lock(&data->mutex);
1185	ret = mma9551_set_device_state(data->client, false);
1186	mutex_unlock(&data->mutex);
1187	if (ret < 0) {
1188		dev_err(&data->client->dev, "powering off device failed\n");
1189		return -EAGAIN;
1190	}
1191
1192	return 0;
1193}
1194
1195static int mma9553_runtime_resume(struct device *dev)
1196{
1197	struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
1198	struct mma9553_data *data = iio_priv(indio_dev);
1199	int ret;
1200
1201	ret = mma9551_set_device_state(data->client, true);
1202	if (ret < 0)
1203		return ret;
1204
1205	mma9551_sleep(MMA9553_DEFAULT_SAMPLE_RATE);
1206
1207	return 0;
1208}
1209#endif
1210
1211#ifdef CONFIG_PM_SLEEP
1212static int mma9553_suspend(struct device *dev)
1213{
1214	struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
1215	struct mma9553_data *data = iio_priv(indio_dev);
1216	int ret;
1217
1218	mutex_lock(&data->mutex);
1219	ret = mma9551_set_device_state(data->client, false);
1220	mutex_unlock(&data->mutex);
1221
1222	return ret;
1223}
1224
1225static int mma9553_resume(struct device *dev)
1226{
1227	struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
1228	struct mma9553_data *data = iio_priv(indio_dev);
1229	int ret;
1230
1231	mutex_lock(&data->mutex);
1232	ret = mma9551_set_device_state(data->client, true);
1233	mutex_unlock(&data->mutex);
1234
1235	return ret;
1236}
1237#endif
1238
1239static const struct dev_pm_ops mma9553_pm_ops = {
1240	SET_SYSTEM_SLEEP_PM_OPS(mma9553_suspend, mma9553_resume)
1241	SET_RUNTIME_PM_OPS(mma9553_runtime_suspend,
1242			   mma9553_runtime_resume, NULL)
1243};
1244
1245static const struct acpi_device_id mma9553_acpi_match[] = {
1246	{"MMA9553", 0},
1247	{},
1248};
1249
1250MODULE_DEVICE_TABLE(acpi, mma9553_acpi_match);
1251
1252static const struct i2c_device_id mma9553_id[] = {
1253	{"mma9553", 0},
1254	{},
1255};
1256
1257MODULE_DEVICE_TABLE(i2c, mma9553_id);
1258
1259static struct i2c_driver mma9553_driver = {
1260	.driver = {
1261		   .name = MMA9553_DRV_NAME,
1262		   .acpi_match_table = ACPI_PTR(mma9553_acpi_match),
1263		   .pm = &mma9553_pm_ops,
1264		   },
1265	.probe = mma9553_probe,
1266	.remove = mma9553_remove,
1267	.id_table = mma9553_id,
1268};
1269
1270module_i2c_driver(mma9553_driver);
1271
1272MODULE_AUTHOR("Irina Tirdea <irina.tirdea@intel.com>");
1273MODULE_LICENSE("GPL v2");
1274MODULE_DESCRIPTION("MMA9553L pedometer platform driver");
   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{
1078	const struct i2c_device_id *id = i2c_client_get_device_id(client);
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 void 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
1166static int mma9553_runtime_suspend(struct device *dev)
1167{
1168	struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
1169	struct mma9553_data *data = iio_priv(indio_dev);
1170	int ret;
1171
1172	mutex_lock(&data->mutex);
1173	ret = mma9551_set_device_state(data->client, false);
1174	mutex_unlock(&data->mutex);
1175	if (ret < 0) {
1176		dev_err(&data->client->dev, "powering off device failed\n");
1177		return -EAGAIN;
1178	}
1179
1180	return 0;
1181}
1182
1183static int mma9553_runtime_resume(struct device *dev)
1184{
1185	struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
1186	struct mma9553_data *data = iio_priv(indio_dev);
1187	int ret;
1188
1189	ret = mma9551_set_device_state(data->client, true);
1190	if (ret < 0)
1191		return ret;
1192
1193	mma9551_sleep(MMA9553_DEFAULT_SAMPLE_RATE);
1194
1195	return 0;
1196}
1197
1198static int mma9553_suspend(struct device *dev)
1199{
1200	struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
1201	struct mma9553_data *data = iio_priv(indio_dev);
1202	int ret;
1203
1204	mutex_lock(&data->mutex);
1205	ret = mma9551_set_device_state(data->client, false);
1206	mutex_unlock(&data->mutex);
1207
1208	return ret;
1209}
1210
1211static int mma9553_resume(struct device *dev)
1212{
1213	struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
1214	struct mma9553_data *data = iio_priv(indio_dev);
1215	int ret;
1216
1217	mutex_lock(&data->mutex);
1218	ret = mma9551_set_device_state(data->client, true);
1219	mutex_unlock(&data->mutex);
1220
1221	return ret;
1222}
1223
1224static const struct dev_pm_ops mma9553_pm_ops = {
1225	SYSTEM_SLEEP_PM_OPS(mma9553_suspend, mma9553_resume)
1226	RUNTIME_PM_OPS(mma9553_runtime_suspend, mma9553_runtime_resume, NULL)
1227};
1228
1229static const struct acpi_device_id mma9553_acpi_match[] = {
1230	{"MMA9553", 0},
1231	{},
1232};
1233
1234MODULE_DEVICE_TABLE(acpi, mma9553_acpi_match);
1235
1236static const struct i2c_device_id mma9553_id[] = {
1237	{"mma9553", 0},
1238	{},
1239};
1240
1241MODULE_DEVICE_TABLE(i2c, mma9553_id);
1242
1243static struct i2c_driver mma9553_driver = {
1244	.driver = {
1245		   .name = MMA9553_DRV_NAME,
1246		   .acpi_match_table = ACPI_PTR(mma9553_acpi_match),
1247		   .pm = pm_ptr(&mma9553_pm_ops),
1248		   },
1249	.probe = mma9553_probe,
1250	.remove = mma9553_remove,
1251	.id_table = mma9553_id,
1252};
1253
1254module_i2c_driver(mma9553_driver);
1255
1256MODULE_AUTHOR("Irina Tirdea <irina.tirdea@intel.com>");
1257MODULE_LICENSE("GPL v2");
1258MODULE_DESCRIPTION("MMA9553L pedometer platform driver");
1259MODULE_IMPORT_NS(IIO_MMA9551);