mma9553.c 32 KB

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