mma8452.c 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * mma8452.c - Support for following Freescale / NXP 3-axis accelerometers:
  4. *
  5. * device name digital output 7-bit I2C slave address (pin selectable)
  6. * ---------------------------------------------------------------------
  7. * MMA8451Q 14 bit 0x1c / 0x1d
  8. * MMA8452Q 12 bit 0x1c / 0x1d
  9. * MMA8453Q 10 bit 0x1c / 0x1d
  10. * MMA8652FC 12 bit 0x1d
  11. * MMA8653FC 10 bit 0x1d
  12. * FXLS8471Q 14 bit 0x1e / 0x1d / 0x1c / 0x1f
  13. *
  14. * Copyright 2015 Martin Kepplinger <martink@posteo.de>
  15. * Copyright 2014 Peter Meerwald <pmeerw@pmeerw.net>
  16. *
  17. *
  18. * TODO: orientation events
  19. */
  20. #include <linux/module.h>
  21. #include <linux/i2c.h>
  22. #include <linux/iio/iio.h>
  23. #include <linux/iio/sysfs.h>
  24. #include <linux/iio/buffer.h>
  25. #include <linux/iio/trigger.h>
  26. #include <linux/iio/trigger_consumer.h>
  27. #include <linux/iio/triggered_buffer.h>
  28. #include <linux/iio/events.h>
  29. #include <linux/delay.h>
  30. #include <linux/of_device.h>
  31. #include <linux/of_irq.h>
  32. #include <linux/pm_runtime.h>
  33. #define MMA8452_STATUS 0x00
  34. #define MMA8452_STATUS_DRDY (BIT(2) | BIT(1) | BIT(0))
  35. #define MMA8452_OUT_X 0x01 /* MSB first */
  36. #define MMA8452_OUT_Y 0x03
  37. #define MMA8452_OUT_Z 0x05
  38. #define MMA8452_INT_SRC 0x0c
  39. #define MMA8452_WHO_AM_I 0x0d
  40. #define MMA8452_DATA_CFG 0x0e
  41. #define MMA8452_DATA_CFG_FS_MASK GENMASK(1, 0)
  42. #define MMA8452_DATA_CFG_FS_2G 0
  43. #define MMA8452_DATA_CFG_FS_4G 1
  44. #define MMA8452_DATA_CFG_FS_8G 2
  45. #define MMA8452_DATA_CFG_HPF_MASK BIT(4)
  46. #define MMA8452_HP_FILTER_CUTOFF 0x0f
  47. #define MMA8452_HP_FILTER_CUTOFF_SEL_MASK GENMASK(1, 0)
  48. #define MMA8452_FF_MT_CFG 0x15
  49. #define MMA8452_FF_MT_CFG_OAE BIT(6)
  50. #define MMA8452_FF_MT_CFG_ELE BIT(7)
  51. #define MMA8452_FF_MT_SRC 0x16
  52. #define MMA8452_FF_MT_SRC_XHE BIT(1)
  53. #define MMA8452_FF_MT_SRC_YHE BIT(3)
  54. #define MMA8452_FF_MT_SRC_ZHE BIT(5)
  55. #define MMA8452_FF_MT_THS 0x17
  56. #define MMA8452_FF_MT_THS_MASK 0x7f
  57. #define MMA8452_FF_MT_COUNT 0x18
  58. #define MMA8452_FF_MT_CHAN_SHIFT 3
  59. #define MMA8452_TRANSIENT_CFG 0x1d
  60. #define MMA8452_TRANSIENT_CFG_CHAN(chan) BIT(chan + 1)
  61. #define MMA8452_TRANSIENT_CFG_HPF_BYP BIT(0)
  62. #define MMA8452_TRANSIENT_CFG_ELE BIT(4)
  63. #define MMA8452_TRANSIENT_SRC 0x1e
  64. #define MMA8452_TRANSIENT_SRC_XTRANSE BIT(1)
  65. #define MMA8452_TRANSIENT_SRC_YTRANSE BIT(3)
  66. #define MMA8452_TRANSIENT_SRC_ZTRANSE BIT(5)
  67. #define MMA8452_TRANSIENT_THS 0x1f
  68. #define MMA8452_TRANSIENT_THS_MASK GENMASK(6, 0)
  69. #define MMA8452_TRANSIENT_COUNT 0x20
  70. #define MMA8452_TRANSIENT_CHAN_SHIFT 1
  71. #define MMA8452_CTRL_REG1 0x2a
  72. #define MMA8452_CTRL_ACTIVE BIT(0)
  73. #define MMA8452_CTRL_DR_MASK GENMASK(5, 3)
  74. #define MMA8452_CTRL_DR_SHIFT 3
  75. #define MMA8452_CTRL_DR_DEFAULT 0x4 /* 50 Hz sample frequency */
  76. #define MMA8452_CTRL_REG2 0x2b
  77. #define MMA8452_CTRL_REG2_RST BIT(6)
  78. #define MMA8452_CTRL_REG2_MODS_SHIFT 3
  79. #define MMA8452_CTRL_REG2_MODS_MASK 0x1b
  80. #define MMA8452_CTRL_REG4 0x2d
  81. #define MMA8452_CTRL_REG5 0x2e
  82. #define MMA8452_OFF_X 0x2f
  83. #define MMA8452_OFF_Y 0x30
  84. #define MMA8452_OFF_Z 0x31
  85. #define MMA8452_MAX_REG 0x31
  86. #define MMA8452_INT_DRDY BIT(0)
  87. #define MMA8452_INT_FF_MT BIT(2)
  88. #define MMA8452_INT_TRANS BIT(5)
  89. #define MMA8451_DEVICE_ID 0x1a
  90. #define MMA8452_DEVICE_ID 0x2a
  91. #define MMA8453_DEVICE_ID 0x3a
  92. #define MMA8652_DEVICE_ID 0x4a
  93. #define MMA8653_DEVICE_ID 0x5a
  94. #define FXLS8471_DEVICE_ID 0x6a
  95. #define MMA8452_AUTO_SUSPEND_DELAY_MS 2000
  96. struct mma8452_data {
  97. struct i2c_client *client;
  98. struct mutex lock;
  99. u8 ctrl_reg1;
  100. u8 data_cfg;
  101. const struct mma_chip_info *chip_info;
  102. int sleep_val;
  103. /* Ensure correct alignment of time stamp when present */
  104. struct {
  105. __be16 channels[3];
  106. s64 ts __aligned(8);
  107. } buffer;
  108. };
  109. /**
  110. * struct mma8452_event_regs - chip specific data related to events
  111. * @ev_cfg: event config register address
  112. * @ev_cfg_ele: latch bit in event config register
  113. * @ev_cfg_chan_shift: number of the bit to enable events in X
  114. * direction; in event config register
  115. * @ev_src: event source register address
  116. * @ev_ths: event threshold register address
  117. * @ev_ths_mask: mask for the threshold value
  118. * @ev_count: event count (period) register address
  119. *
  120. * Since not all chips supported by the driver support comparing high pass
  121. * filtered data for events (interrupts), different interrupt sources are
  122. * used for different chips and the relevant registers are included here.
  123. */
  124. struct mma8452_event_regs {
  125. u8 ev_cfg;
  126. u8 ev_cfg_ele;
  127. u8 ev_cfg_chan_shift;
  128. u8 ev_src;
  129. u8 ev_ths;
  130. u8 ev_ths_mask;
  131. u8 ev_count;
  132. };
  133. static const struct mma8452_event_regs ff_mt_ev_regs = {
  134. .ev_cfg = MMA8452_FF_MT_CFG,
  135. .ev_cfg_ele = MMA8452_FF_MT_CFG_ELE,
  136. .ev_cfg_chan_shift = MMA8452_FF_MT_CHAN_SHIFT,
  137. .ev_src = MMA8452_FF_MT_SRC,
  138. .ev_ths = MMA8452_FF_MT_THS,
  139. .ev_ths_mask = MMA8452_FF_MT_THS_MASK,
  140. .ev_count = MMA8452_FF_MT_COUNT
  141. };
  142. static const struct mma8452_event_regs trans_ev_regs = {
  143. .ev_cfg = MMA8452_TRANSIENT_CFG,
  144. .ev_cfg_ele = MMA8452_TRANSIENT_CFG_ELE,
  145. .ev_cfg_chan_shift = MMA8452_TRANSIENT_CHAN_SHIFT,
  146. .ev_src = MMA8452_TRANSIENT_SRC,
  147. .ev_ths = MMA8452_TRANSIENT_THS,
  148. .ev_ths_mask = MMA8452_TRANSIENT_THS_MASK,
  149. .ev_count = MMA8452_TRANSIENT_COUNT,
  150. };
  151. /**
  152. * struct mma_chip_info - chip specific data
  153. * @chip_id: WHO_AM_I register's value
  154. * @channels: struct iio_chan_spec matching the device's
  155. * capabilities
  156. * @num_channels: number of channels
  157. * @mma_scales: scale factors for converting register values
  158. * to m/s^2; 3 modes: 2g, 4g, 8g; 2 integers
  159. * per mode: m/s^2 and micro m/s^2
  160. * @all_events: all events supported by this chip
  161. * @enabled_events: event flags enabled and handled by this driver
  162. */
  163. struct mma_chip_info {
  164. u8 chip_id;
  165. const struct iio_chan_spec *channels;
  166. int num_channels;
  167. const int mma_scales[3][2];
  168. int all_events;
  169. int enabled_events;
  170. };
  171. enum {
  172. idx_x,
  173. idx_y,
  174. idx_z,
  175. idx_ts,
  176. };
  177. static int mma8452_drdy(struct mma8452_data *data)
  178. {
  179. int tries = 150;
  180. while (tries-- > 0) {
  181. int ret = i2c_smbus_read_byte_data(data->client,
  182. MMA8452_STATUS);
  183. if (ret < 0)
  184. return ret;
  185. if ((ret & MMA8452_STATUS_DRDY) == MMA8452_STATUS_DRDY)
  186. return 0;
  187. if (data->sleep_val <= 20)
  188. usleep_range(data->sleep_val * 250,
  189. data->sleep_val * 500);
  190. else
  191. msleep(20);
  192. }
  193. dev_err(&data->client->dev, "data not ready\n");
  194. return -EIO;
  195. }
  196. static int mma8452_set_runtime_pm_state(struct i2c_client *client, bool on)
  197. {
  198. #ifdef CONFIG_PM
  199. int ret;
  200. if (on) {
  201. ret = pm_runtime_get_sync(&client->dev);
  202. } else {
  203. pm_runtime_mark_last_busy(&client->dev);
  204. ret = pm_runtime_put_autosuspend(&client->dev);
  205. }
  206. if (ret < 0) {
  207. dev_err(&client->dev,
  208. "failed to change power state to %d\n", on);
  209. if (on)
  210. pm_runtime_put_noidle(&client->dev);
  211. return ret;
  212. }
  213. #endif
  214. return 0;
  215. }
  216. static int mma8452_read(struct mma8452_data *data, __be16 buf[3])
  217. {
  218. int ret = mma8452_drdy(data);
  219. if (ret < 0)
  220. return ret;
  221. ret = mma8452_set_runtime_pm_state(data->client, true);
  222. if (ret)
  223. return ret;
  224. ret = i2c_smbus_read_i2c_block_data(data->client, MMA8452_OUT_X,
  225. 3 * sizeof(__be16), (u8 *)buf);
  226. ret = mma8452_set_runtime_pm_state(data->client, false);
  227. return ret;
  228. }
  229. static ssize_t mma8452_show_int_plus_micros(char *buf, const int (*vals)[2],
  230. int n)
  231. {
  232. size_t len = 0;
  233. while (n-- > 0)
  234. len += scnprintf(buf + len, PAGE_SIZE - len, "%d.%06d ",
  235. vals[n][0], vals[n][1]);
  236. /* replace trailing space by newline */
  237. buf[len - 1] = '\n';
  238. return len;
  239. }
  240. static int mma8452_get_int_plus_micros_index(const int (*vals)[2], int n,
  241. int val, int val2)
  242. {
  243. while (n-- > 0)
  244. if (val == vals[n][0] && val2 == vals[n][1])
  245. return n;
  246. return -EINVAL;
  247. }
  248. static unsigned int mma8452_get_odr_index(struct mma8452_data *data)
  249. {
  250. return (data->ctrl_reg1 & MMA8452_CTRL_DR_MASK) >>
  251. MMA8452_CTRL_DR_SHIFT;
  252. }
  253. static const int mma8452_samp_freq[8][2] = {
  254. {800, 0}, {400, 0}, {200, 0}, {100, 0}, {50, 0}, {12, 500000},
  255. {6, 250000}, {1, 560000}
  256. };
  257. /* Datasheet table: step time "Relationship with the ODR" (sample frequency) */
  258. static const unsigned int mma8452_time_step_us[4][8] = {
  259. { 1250, 2500, 5000, 10000, 20000, 20000, 20000, 20000 }, /* normal */
  260. { 1250, 2500, 5000, 10000, 20000, 80000, 80000, 80000 }, /* l p l n */
  261. { 1250, 2500, 2500, 2500, 2500, 2500, 2500, 2500 }, /* high res*/
  262. { 1250, 2500, 5000, 10000, 20000, 80000, 160000, 160000 } /* l p */
  263. };
  264. /* Datasheet table "High-Pass Filter Cutoff Options" */
  265. static const int mma8452_hp_filter_cutoff[4][8][4][2] = {
  266. { /* normal */
  267. { {16, 0}, {8, 0}, {4, 0}, {2, 0} }, /* 800 Hz sample */
  268. { {16, 0}, {8, 0}, {4, 0}, {2, 0} }, /* 400 Hz sample */
  269. { {8, 0}, {4, 0}, {2, 0}, {1, 0} }, /* 200 Hz sample */
  270. { {4, 0}, {2, 0}, {1, 0}, {0, 500000} }, /* 100 Hz sample */
  271. { {2, 0}, {1, 0}, {0, 500000}, {0, 250000} }, /* 50 Hz sample */
  272. { {2, 0}, {1, 0}, {0, 500000}, {0, 250000} }, /* 12.5 Hz sample */
  273. { {2, 0}, {1, 0}, {0, 500000}, {0, 250000} }, /* 6.25 Hz sample */
  274. { {2, 0}, {1, 0}, {0, 500000}, {0, 250000} } /* 1.56 Hz sample */
  275. },
  276. { /* low noise low power */
  277. { {16, 0}, {8, 0}, {4, 0}, {2, 0} },
  278. { {16, 0}, {8, 0}, {4, 0}, {2, 0} },
  279. { {8, 0}, {4, 0}, {2, 0}, {1, 0} },
  280. { {4, 0}, {2, 0}, {1, 0}, {0, 500000} },
  281. { {2, 0}, {1, 0}, {0, 500000}, {0, 250000} },
  282. { {0, 500000}, {0, 250000}, {0, 125000}, {0, 063000} },
  283. { {0, 500000}, {0, 250000}, {0, 125000}, {0, 063000} },
  284. { {0, 500000}, {0, 250000}, {0, 125000}, {0, 063000} }
  285. },
  286. { /* high resolution */
  287. { {16, 0}, {8, 0}, {4, 0}, {2, 0} },
  288. { {16, 0}, {8, 0}, {4, 0}, {2, 0} },
  289. { {16, 0}, {8, 0}, {4, 0}, {2, 0} },
  290. { {16, 0}, {8, 0}, {4, 0}, {2, 0} },
  291. { {16, 0}, {8, 0}, {4, 0}, {2, 0} },
  292. { {16, 0}, {8, 0}, {4, 0}, {2, 0} },
  293. { {16, 0}, {8, 0}, {4, 0}, {2, 0} },
  294. { {16, 0}, {8, 0}, {4, 0}, {2, 0} }
  295. },
  296. { /* low power */
  297. { {16, 0}, {8, 0}, {4, 0}, {2, 0} },
  298. { {8, 0}, {4, 0}, {2, 0}, {1, 0} },
  299. { {4, 0}, {2, 0}, {1, 0}, {0, 500000} },
  300. { {2, 0}, {1, 0}, {0, 500000}, {0, 250000} },
  301. { {1, 0}, {0, 500000}, {0, 250000}, {0, 125000} },
  302. { {0, 250000}, {0, 125000}, {0, 063000}, {0, 031000} },
  303. { {0, 250000}, {0, 125000}, {0, 063000}, {0, 031000} },
  304. { {0, 250000}, {0, 125000}, {0, 063000}, {0, 031000} }
  305. }
  306. };
  307. /* Datasheet table "MODS Oversampling modes averaging values at each ODR" */
  308. static const u16 mma8452_os_ratio[4][8] = {
  309. /* 800 Hz, 400 Hz, ... , 1.56 Hz */
  310. { 2, 4, 4, 4, 4, 16, 32, 128 }, /* normal */
  311. { 2, 4, 4, 4, 4, 4, 8, 32 }, /* low power low noise */
  312. { 2, 4, 8, 16, 32, 128, 256, 1024 }, /* high resolution */
  313. { 2, 2, 2, 2, 2, 2, 4, 16 } /* low power */
  314. };
  315. static int mma8452_get_power_mode(struct mma8452_data *data)
  316. {
  317. int reg;
  318. reg = i2c_smbus_read_byte_data(data->client,
  319. MMA8452_CTRL_REG2);
  320. if (reg < 0)
  321. return reg;
  322. return ((reg & MMA8452_CTRL_REG2_MODS_MASK) >>
  323. MMA8452_CTRL_REG2_MODS_SHIFT);
  324. }
  325. static ssize_t mma8452_show_samp_freq_avail(struct device *dev,
  326. struct device_attribute *attr,
  327. char *buf)
  328. {
  329. return mma8452_show_int_plus_micros(buf, mma8452_samp_freq,
  330. ARRAY_SIZE(mma8452_samp_freq));
  331. }
  332. static ssize_t mma8452_show_scale_avail(struct device *dev,
  333. struct device_attribute *attr,
  334. char *buf)
  335. {
  336. struct mma8452_data *data = iio_priv(i2c_get_clientdata(
  337. to_i2c_client(dev)));
  338. return mma8452_show_int_plus_micros(buf, data->chip_info->mma_scales,
  339. ARRAY_SIZE(data->chip_info->mma_scales));
  340. }
  341. static ssize_t mma8452_show_hp_cutoff_avail(struct device *dev,
  342. struct device_attribute *attr,
  343. char *buf)
  344. {
  345. struct iio_dev *indio_dev = dev_to_iio_dev(dev);
  346. struct mma8452_data *data = iio_priv(indio_dev);
  347. int i, j;
  348. i = mma8452_get_odr_index(data);
  349. j = mma8452_get_power_mode(data);
  350. if (j < 0)
  351. return j;
  352. return mma8452_show_int_plus_micros(buf, mma8452_hp_filter_cutoff[j][i],
  353. ARRAY_SIZE(mma8452_hp_filter_cutoff[0][0]));
  354. }
  355. static ssize_t mma8452_show_os_ratio_avail(struct device *dev,
  356. struct device_attribute *attr,
  357. char *buf)
  358. {
  359. struct iio_dev *indio_dev = dev_to_iio_dev(dev);
  360. struct mma8452_data *data = iio_priv(indio_dev);
  361. int i = mma8452_get_odr_index(data);
  362. int j;
  363. u16 val = 0;
  364. size_t len = 0;
  365. for (j = 0; j < ARRAY_SIZE(mma8452_os_ratio); j++) {
  366. if (val == mma8452_os_ratio[j][i])
  367. continue;
  368. val = mma8452_os_ratio[j][i];
  369. len += scnprintf(buf + len, PAGE_SIZE - len, "%d ", val);
  370. }
  371. buf[len - 1] = '\n';
  372. return len;
  373. }
  374. static IIO_DEV_ATTR_SAMP_FREQ_AVAIL(mma8452_show_samp_freq_avail);
  375. static IIO_DEVICE_ATTR(in_accel_scale_available, 0444,
  376. mma8452_show_scale_avail, NULL, 0);
  377. static IIO_DEVICE_ATTR(in_accel_filter_high_pass_3db_frequency_available,
  378. 0444, mma8452_show_hp_cutoff_avail, NULL, 0);
  379. static IIO_DEVICE_ATTR(in_accel_oversampling_ratio_available, 0444,
  380. mma8452_show_os_ratio_avail, NULL, 0);
  381. static int mma8452_get_samp_freq_index(struct mma8452_data *data,
  382. int val, int val2)
  383. {
  384. return mma8452_get_int_plus_micros_index(mma8452_samp_freq,
  385. ARRAY_SIZE(mma8452_samp_freq),
  386. val, val2);
  387. }
  388. static int mma8452_get_scale_index(struct mma8452_data *data, int val, int val2)
  389. {
  390. return mma8452_get_int_plus_micros_index(data->chip_info->mma_scales,
  391. ARRAY_SIZE(data->chip_info->mma_scales), val, val2);
  392. }
  393. static int mma8452_get_hp_filter_index(struct mma8452_data *data,
  394. int val, int val2)
  395. {
  396. int i, j;
  397. i = mma8452_get_odr_index(data);
  398. j = mma8452_get_power_mode(data);
  399. if (j < 0)
  400. return j;
  401. return mma8452_get_int_plus_micros_index(mma8452_hp_filter_cutoff[j][i],
  402. ARRAY_SIZE(mma8452_hp_filter_cutoff[0][0]), val, val2);
  403. }
  404. static int mma8452_read_hp_filter(struct mma8452_data *data, int *hz, int *uHz)
  405. {
  406. int j, i, ret;
  407. ret = i2c_smbus_read_byte_data(data->client, MMA8452_HP_FILTER_CUTOFF);
  408. if (ret < 0)
  409. return ret;
  410. i = mma8452_get_odr_index(data);
  411. j = mma8452_get_power_mode(data);
  412. if (j < 0)
  413. return j;
  414. ret &= MMA8452_HP_FILTER_CUTOFF_SEL_MASK;
  415. *hz = mma8452_hp_filter_cutoff[j][i][ret][0];
  416. *uHz = mma8452_hp_filter_cutoff[j][i][ret][1];
  417. return 0;
  418. }
  419. static int mma8452_read_raw(struct iio_dev *indio_dev,
  420. struct iio_chan_spec const *chan,
  421. int *val, int *val2, long mask)
  422. {
  423. struct mma8452_data *data = iio_priv(indio_dev);
  424. __be16 buffer[3];
  425. int i, ret;
  426. switch (mask) {
  427. case IIO_CHAN_INFO_RAW:
  428. ret = iio_device_claim_direct_mode(indio_dev);
  429. if (ret)
  430. return ret;
  431. mutex_lock(&data->lock);
  432. ret = mma8452_read(data, buffer);
  433. mutex_unlock(&data->lock);
  434. iio_device_release_direct_mode(indio_dev);
  435. if (ret < 0)
  436. return ret;
  437. *val = sign_extend32(be16_to_cpu(
  438. buffer[chan->scan_index]) >> chan->scan_type.shift,
  439. chan->scan_type.realbits - 1);
  440. return IIO_VAL_INT;
  441. case IIO_CHAN_INFO_SCALE:
  442. i = data->data_cfg & MMA8452_DATA_CFG_FS_MASK;
  443. *val = data->chip_info->mma_scales[i][0];
  444. *val2 = data->chip_info->mma_scales[i][1];
  445. return IIO_VAL_INT_PLUS_MICRO;
  446. case IIO_CHAN_INFO_SAMP_FREQ:
  447. i = mma8452_get_odr_index(data);
  448. *val = mma8452_samp_freq[i][0];
  449. *val2 = mma8452_samp_freq[i][1];
  450. return IIO_VAL_INT_PLUS_MICRO;
  451. case IIO_CHAN_INFO_CALIBBIAS:
  452. ret = i2c_smbus_read_byte_data(data->client,
  453. MMA8452_OFF_X +
  454. chan->scan_index);
  455. if (ret < 0)
  456. return ret;
  457. *val = sign_extend32(ret, 7);
  458. return IIO_VAL_INT;
  459. case IIO_CHAN_INFO_HIGH_PASS_FILTER_3DB_FREQUENCY:
  460. if (data->data_cfg & MMA8452_DATA_CFG_HPF_MASK) {
  461. ret = mma8452_read_hp_filter(data, val, val2);
  462. if (ret < 0)
  463. return ret;
  464. } else {
  465. *val = 0;
  466. *val2 = 0;
  467. }
  468. return IIO_VAL_INT_PLUS_MICRO;
  469. case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
  470. ret = mma8452_get_power_mode(data);
  471. if (ret < 0)
  472. return ret;
  473. i = mma8452_get_odr_index(data);
  474. *val = mma8452_os_ratio[ret][i];
  475. return IIO_VAL_INT;
  476. }
  477. return -EINVAL;
  478. }
  479. static int mma8452_calculate_sleep(struct mma8452_data *data)
  480. {
  481. int ret, i = mma8452_get_odr_index(data);
  482. if (mma8452_samp_freq[i][0] > 0)
  483. ret = 1000 / mma8452_samp_freq[i][0];
  484. else
  485. ret = 1000;
  486. return ret == 0 ? 1 : ret;
  487. }
  488. static int mma8452_standby(struct mma8452_data *data)
  489. {
  490. return i2c_smbus_write_byte_data(data->client, MMA8452_CTRL_REG1,
  491. data->ctrl_reg1 & ~MMA8452_CTRL_ACTIVE);
  492. }
  493. static int mma8452_active(struct mma8452_data *data)
  494. {
  495. return i2c_smbus_write_byte_data(data->client, MMA8452_CTRL_REG1,
  496. data->ctrl_reg1);
  497. }
  498. /* returns >0 if active, 0 if in standby and <0 on error */
  499. static int mma8452_is_active(struct mma8452_data *data)
  500. {
  501. int reg;
  502. reg = i2c_smbus_read_byte_data(data->client, MMA8452_CTRL_REG1);
  503. if (reg < 0)
  504. return reg;
  505. return reg & MMA8452_CTRL_ACTIVE;
  506. }
  507. static int mma8452_change_config(struct mma8452_data *data, u8 reg, u8 val)
  508. {
  509. int ret;
  510. int is_active;
  511. mutex_lock(&data->lock);
  512. is_active = mma8452_is_active(data);
  513. if (is_active < 0) {
  514. ret = is_active;
  515. goto fail;
  516. }
  517. /* config can only be changed when in standby */
  518. if (is_active > 0) {
  519. ret = mma8452_standby(data);
  520. if (ret < 0)
  521. goto fail;
  522. }
  523. ret = i2c_smbus_write_byte_data(data->client, reg, val);
  524. if (ret < 0)
  525. goto fail;
  526. if (is_active > 0) {
  527. ret = mma8452_active(data);
  528. if (ret < 0)
  529. goto fail;
  530. }
  531. ret = 0;
  532. fail:
  533. mutex_unlock(&data->lock);
  534. return ret;
  535. }
  536. static int mma8452_set_power_mode(struct mma8452_data *data, u8 mode)
  537. {
  538. int reg;
  539. reg = i2c_smbus_read_byte_data(data->client,
  540. MMA8452_CTRL_REG2);
  541. if (reg < 0)
  542. return reg;
  543. reg &= ~MMA8452_CTRL_REG2_MODS_MASK;
  544. reg |= mode << MMA8452_CTRL_REG2_MODS_SHIFT;
  545. return mma8452_change_config(data, MMA8452_CTRL_REG2, reg);
  546. }
  547. /* returns >0 if in freefall mode, 0 if not or <0 if an error occurred */
  548. static int mma8452_freefall_mode_enabled(struct mma8452_data *data)
  549. {
  550. int val;
  551. val = i2c_smbus_read_byte_data(data->client, MMA8452_FF_MT_CFG);
  552. if (val < 0)
  553. return val;
  554. return !(val & MMA8452_FF_MT_CFG_OAE);
  555. }
  556. static int mma8452_set_freefall_mode(struct mma8452_data *data, bool state)
  557. {
  558. int val;
  559. if ((state && mma8452_freefall_mode_enabled(data)) ||
  560. (!state && !(mma8452_freefall_mode_enabled(data))))
  561. return 0;
  562. val = i2c_smbus_read_byte_data(data->client, MMA8452_FF_MT_CFG);
  563. if (val < 0)
  564. return val;
  565. if (state) {
  566. val |= BIT(idx_x + MMA8452_FF_MT_CHAN_SHIFT);
  567. val |= BIT(idx_y + MMA8452_FF_MT_CHAN_SHIFT);
  568. val |= BIT(idx_z + MMA8452_FF_MT_CHAN_SHIFT);
  569. val &= ~MMA8452_FF_MT_CFG_OAE;
  570. } else {
  571. val &= ~BIT(idx_x + MMA8452_FF_MT_CHAN_SHIFT);
  572. val &= ~BIT(idx_y + MMA8452_FF_MT_CHAN_SHIFT);
  573. val &= ~BIT(idx_z + MMA8452_FF_MT_CHAN_SHIFT);
  574. val |= MMA8452_FF_MT_CFG_OAE;
  575. }
  576. return mma8452_change_config(data, MMA8452_FF_MT_CFG, val);
  577. }
  578. static int mma8452_set_hp_filter_frequency(struct mma8452_data *data,
  579. int val, int val2)
  580. {
  581. int i, reg;
  582. i = mma8452_get_hp_filter_index(data, val, val2);
  583. if (i < 0)
  584. return i;
  585. reg = i2c_smbus_read_byte_data(data->client,
  586. MMA8452_HP_FILTER_CUTOFF);
  587. if (reg < 0)
  588. return reg;
  589. reg &= ~MMA8452_HP_FILTER_CUTOFF_SEL_MASK;
  590. reg |= i;
  591. return mma8452_change_config(data, MMA8452_HP_FILTER_CUTOFF, reg);
  592. }
  593. static int mma8452_write_raw(struct iio_dev *indio_dev,
  594. struct iio_chan_spec const *chan,
  595. int val, int val2, long mask)
  596. {
  597. struct mma8452_data *data = iio_priv(indio_dev);
  598. int i, ret;
  599. ret = iio_device_claim_direct_mode(indio_dev);
  600. if (ret)
  601. return ret;
  602. switch (mask) {
  603. case IIO_CHAN_INFO_SAMP_FREQ:
  604. i = mma8452_get_samp_freq_index(data, val, val2);
  605. if (i < 0) {
  606. ret = i;
  607. break;
  608. }
  609. data->ctrl_reg1 &= ~MMA8452_CTRL_DR_MASK;
  610. data->ctrl_reg1 |= i << MMA8452_CTRL_DR_SHIFT;
  611. data->sleep_val = mma8452_calculate_sleep(data);
  612. ret = mma8452_change_config(data, MMA8452_CTRL_REG1,
  613. data->ctrl_reg1);
  614. break;
  615. case IIO_CHAN_INFO_SCALE:
  616. i = mma8452_get_scale_index(data, val, val2);
  617. if (i < 0) {
  618. ret = i;
  619. break;
  620. }
  621. data->data_cfg &= ~MMA8452_DATA_CFG_FS_MASK;
  622. data->data_cfg |= i;
  623. ret = mma8452_change_config(data, MMA8452_DATA_CFG,
  624. data->data_cfg);
  625. break;
  626. case IIO_CHAN_INFO_CALIBBIAS:
  627. if (val < -128 || val > 127) {
  628. ret = -EINVAL;
  629. break;
  630. }
  631. ret = mma8452_change_config(data,
  632. MMA8452_OFF_X + chan->scan_index,
  633. val);
  634. break;
  635. case IIO_CHAN_INFO_HIGH_PASS_FILTER_3DB_FREQUENCY:
  636. if (val == 0 && val2 == 0) {
  637. data->data_cfg &= ~MMA8452_DATA_CFG_HPF_MASK;
  638. } else {
  639. data->data_cfg |= MMA8452_DATA_CFG_HPF_MASK;
  640. ret = mma8452_set_hp_filter_frequency(data, val, val2);
  641. if (ret < 0)
  642. break;
  643. }
  644. ret = mma8452_change_config(data, MMA8452_DATA_CFG,
  645. data->data_cfg);
  646. break;
  647. case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
  648. ret = mma8452_get_odr_index(data);
  649. for (i = 0; i < ARRAY_SIZE(mma8452_os_ratio); i++) {
  650. if (mma8452_os_ratio[i][ret] == val) {
  651. ret = mma8452_set_power_mode(data, i);
  652. break;
  653. }
  654. }
  655. break;
  656. default:
  657. ret = -EINVAL;
  658. break;
  659. }
  660. iio_device_release_direct_mode(indio_dev);
  661. return ret;
  662. }
  663. static int mma8452_get_event_regs(struct mma8452_data *data,
  664. const struct iio_chan_spec *chan, enum iio_event_direction dir,
  665. const struct mma8452_event_regs **ev_reg)
  666. {
  667. if (!chan)
  668. return -EINVAL;
  669. switch (chan->type) {
  670. case IIO_ACCEL:
  671. switch (dir) {
  672. case IIO_EV_DIR_RISING:
  673. if ((data->chip_info->all_events
  674. & MMA8452_INT_TRANS) &&
  675. (data->chip_info->enabled_events
  676. & MMA8452_INT_TRANS))
  677. *ev_reg = &trans_ev_regs;
  678. else
  679. *ev_reg = &ff_mt_ev_regs;
  680. return 0;
  681. case IIO_EV_DIR_FALLING:
  682. *ev_reg = &ff_mt_ev_regs;
  683. return 0;
  684. default:
  685. return -EINVAL;
  686. }
  687. default:
  688. return -EINVAL;
  689. }
  690. }
  691. static int mma8452_read_event_value(struct iio_dev *indio_dev,
  692. const struct iio_chan_spec *chan,
  693. enum iio_event_type type,
  694. enum iio_event_direction dir,
  695. enum iio_event_info info,
  696. int *val, int *val2)
  697. {
  698. struct mma8452_data *data = iio_priv(indio_dev);
  699. int ret, us, power_mode;
  700. const struct mma8452_event_regs *ev_regs;
  701. ret = mma8452_get_event_regs(data, chan, dir, &ev_regs);
  702. if (ret)
  703. return ret;
  704. switch (info) {
  705. case IIO_EV_INFO_VALUE:
  706. ret = i2c_smbus_read_byte_data(data->client, ev_regs->ev_ths);
  707. if (ret < 0)
  708. return ret;
  709. *val = ret & ev_regs->ev_ths_mask;
  710. return IIO_VAL_INT;
  711. case IIO_EV_INFO_PERIOD:
  712. ret = i2c_smbus_read_byte_data(data->client, ev_regs->ev_count);
  713. if (ret < 0)
  714. return ret;
  715. power_mode = mma8452_get_power_mode(data);
  716. if (power_mode < 0)
  717. return power_mode;
  718. us = ret * mma8452_time_step_us[power_mode][
  719. mma8452_get_odr_index(data)];
  720. *val = us / USEC_PER_SEC;
  721. *val2 = us % USEC_PER_SEC;
  722. return IIO_VAL_INT_PLUS_MICRO;
  723. case IIO_EV_INFO_HIGH_PASS_FILTER_3DB:
  724. ret = i2c_smbus_read_byte_data(data->client,
  725. MMA8452_TRANSIENT_CFG);
  726. if (ret < 0)
  727. return ret;
  728. if (ret & MMA8452_TRANSIENT_CFG_HPF_BYP) {
  729. *val = 0;
  730. *val2 = 0;
  731. } else {
  732. ret = mma8452_read_hp_filter(data, val, val2);
  733. if (ret < 0)
  734. return ret;
  735. }
  736. return IIO_VAL_INT_PLUS_MICRO;
  737. default:
  738. return -EINVAL;
  739. }
  740. }
  741. static int mma8452_write_event_value(struct iio_dev *indio_dev,
  742. const struct iio_chan_spec *chan,
  743. enum iio_event_type type,
  744. enum iio_event_direction dir,
  745. enum iio_event_info info,
  746. int val, int val2)
  747. {
  748. struct mma8452_data *data = iio_priv(indio_dev);
  749. int ret, reg, steps;
  750. const struct mma8452_event_regs *ev_regs;
  751. ret = mma8452_get_event_regs(data, chan, dir, &ev_regs);
  752. if (ret)
  753. return ret;
  754. switch (info) {
  755. case IIO_EV_INFO_VALUE:
  756. if (val < 0 || val > ev_regs->ev_ths_mask)
  757. return -EINVAL;
  758. return mma8452_change_config(data, ev_regs->ev_ths, val);
  759. case IIO_EV_INFO_PERIOD:
  760. ret = mma8452_get_power_mode(data);
  761. if (ret < 0)
  762. return ret;
  763. steps = (val * USEC_PER_SEC + val2) /
  764. mma8452_time_step_us[ret][
  765. mma8452_get_odr_index(data)];
  766. if (steps < 0 || steps > 0xff)
  767. return -EINVAL;
  768. return mma8452_change_config(data, ev_regs->ev_count, steps);
  769. case IIO_EV_INFO_HIGH_PASS_FILTER_3DB:
  770. reg = i2c_smbus_read_byte_data(data->client,
  771. MMA8452_TRANSIENT_CFG);
  772. if (reg < 0)
  773. return reg;
  774. if (val == 0 && val2 == 0) {
  775. reg |= MMA8452_TRANSIENT_CFG_HPF_BYP;
  776. } else {
  777. reg &= ~MMA8452_TRANSIENT_CFG_HPF_BYP;
  778. ret = mma8452_set_hp_filter_frequency(data, val, val2);
  779. if (ret < 0)
  780. return ret;
  781. }
  782. return mma8452_change_config(data, MMA8452_TRANSIENT_CFG, reg);
  783. default:
  784. return -EINVAL;
  785. }
  786. }
  787. static int mma8452_read_event_config(struct iio_dev *indio_dev,
  788. const struct iio_chan_spec *chan,
  789. enum iio_event_type type,
  790. enum iio_event_direction dir)
  791. {
  792. struct mma8452_data *data = iio_priv(indio_dev);
  793. int ret;
  794. const struct mma8452_event_regs *ev_regs;
  795. ret = mma8452_get_event_regs(data, chan, dir, &ev_regs);
  796. if (ret)
  797. return ret;
  798. switch (dir) {
  799. case IIO_EV_DIR_FALLING:
  800. return mma8452_freefall_mode_enabled(data);
  801. case IIO_EV_DIR_RISING:
  802. ret = i2c_smbus_read_byte_data(data->client,
  803. ev_regs->ev_cfg);
  804. if (ret < 0)
  805. return ret;
  806. return !!(ret & BIT(chan->scan_index +
  807. ev_regs->ev_cfg_chan_shift));
  808. default:
  809. return -EINVAL;
  810. }
  811. }
  812. static int mma8452_write_event_config(struct iio_dev *indio_dev,
  813. const struct iio_chan_spec *chan,
  814. enum iio_event_type type,
  815. enum iio_event_direction dir,
  816. int state)
  817. {
  818. struct mma8452_data *data = iio_priv(indio_dev);
  819. int val, ret;
  820. const struct mma8452_event_regs *ev_regs;
  821. ret = mma8452_get_event_regs(data, chan, dir, &ev_regs);
  822. if (ret)
  823. return ret;
  824. ret = mma8452_set_runtime_pm_state(data->client, state);
  825. if (ret)
  826. return ret;
  827. switch (dir) {
  828. case IIO_EV_DIR_FALLING:
  829. return mma8452_set_freefall_mode(data, state);
  830. case IIO_EV_DIR_RISING:
  831. val = i2c_smbus_read_byte_data(data->client, ev_regs->ev_cfg);
  832. if (val < 0)
  833. return val;
  834. if (state) {
  835. if (mma8452_freefall_mode_enabled(data)) {
  836. val &= ~BIT(idx_x + ev_regs->ev_cfg_chan_shift);
  837. val &= ~BIT(idx_y + ev_regs->ev_cfg_chan_shift);
  838. val &= ~BIT(idx_z + ev_regs->ev_cfg_chan_shift);
  839. val |= MMA8452_FF_MT_CFG_OAE;
  840. }
  841. val |= BIT(chan->scan_index +
  842. ev_regs->ev_cfg_chan_shift);
  843. } else {
  844. if (mma8452_freefall_mode_enabled(data))
  845. return 0;
  846. val &= ~BIT(chan->scan_index +
  847. ev_regs->ev_cfg_chan_shift);
  848. }
  849. val |= ev_regs->ev_cfg_ele;
  850. return mma8452_change_config(data, ev_regs->ev_cfg, val);
  851. default:
  852. return -EINVAL;
  853. }
  854. }
  855. static void mma8452_transient_interrupt(struct iio_dev *indio_dev)
  856. {
  857. struct mma8452_data *data = iio_priv(indio_dev);
  858. s64 ts = iio_get_time_ns(indio_dev);
  859. int src;
  860. src = i2c_smbus_read_byte_data(data->client, MMA8452_TRANSIENT_SRC);
  861. if (src < 0)
  862. return;
  863. if (src & MMA8452_TRANSIENT_SRC_XTRANSE)
  864. iio_push_event(indio_dev,
  865. IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_X,
  866. IIO_EV_TYPE_MAG,
  867. IIO_EV_DIR_RISING),
  868. ts);
  869. if (src & MMA8452_TRANSIENT_SRC_YTRANSE)
  870. iio_push_event(indio_dev,
  871. IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_Y,
  872. IIO_EV_TYPE_MAG,
  873. IIO_EV_DIR_RISING),
  874. ts);
  875. if (src & MMA8452_TRANSIENT_SRC_ZTRANSE)
  876. iio_push_event(indio_dev,
  877. IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_Z,
  878. IIO_EV_TYPE_MAG,
  879. IIO_EV_DIR_RISING),
  880. ts);
  881. }
  882. static irqreturn_t mma8452_interrupt(int irq, void *p)
  883. {
  884. struct iio_dev *indio_dev = p;
  885. struct mma8452_data *data = iio_priv(indio_dev);
  886. int ret = IRQ_NONE;
  887. int src;
  888. src = i2c_smbus_read_byte_data(data->client, MMA8452_INT_SRC);
  889. if (src < 0)
  890. return IRQ_NONE;
  891. if (!(src & (data->chip_info->enabled_events | MMA8452_INT_DRDY)))
  892. return IRQ_NONE;
  893. if (src & MMA8452_INT_DRDY) {
  894. iio_trigger_poll_chained(indio_dev->trig);
  895. ret = IRQ_HANDLED;
  896. }
  897. if (src & MMA8452_INT_FF_MT) {
  898. if (mma8452_freefall_mode_enabled(data)) {
  899. s64 ts = iio_get_time_ns(indio_dev);
  900. iio_push_event(indio_dev,
  901. IIO_MOD_EVENT_CODE(IIO_ACCEL, 0,
  902. IIO_MOD_X_AND_Y_AND_Z,
  903. IIO_EV_TYPE_MAG,
  904. IIO_EV_DIR_FALLING),
  905. ts);
  906. }
  907. ret = IRQ_HANDLED;
  908. }
  909. if (src & MMA8452_INT_TRANS) {
  910. mma8452_transient_interrupt(indio_dev);
  911. ret = IRQ_HANDLED;
  912. }
  913. return ret;
  914. }
  915. static irqreturn_t mma8452_trigger_handler(int irq, void *p)
  916. {
  917. struct iio_poll_func *pf = p;
  918. struct iio_dev *indio_dev = pf->indio_dev;
  919. struct mma8452_data *data = iio_priv(indio_dev);
  920. int ret;
  921. ret = mma8452_read(data, data->buffer.channels);
  922. if (ret < 0)
  923. goto done;
  924. iio_push_to_buffers_with_timestamp(indio_dev, &data->buffer,
  925. iio_get_time_ns(indio_dev));
  926. done:
  927. iio_trigger_notify_done(indio_dev->trig);
  928. return IRQ_HANDLED;
  929. }
  930. static int mma8452_reg_access_dbg(struct iio_dev *indio_dev,
  931. unsigned int reg, unsigned int writeval,
  932. unsigned int *readval)
  933. {
  934. int ret;
  935. struct mma8452_data *data = iio_priv(indio_dev);
  936. if (reg > MMA8452_MAX_REG)
  937. return -EINVAL;
  938. if (!readval)
  939. return mma8452_change_config(data, reg, writeval);
  940. ret = i2c_smbus_read_byte_data(data->client, reg);
  941. if (ret < 0)
  942. return ret;
  943. *readval = ret;
  944. return 0;
  945. }
  946. static const struct iio_event_spec mma8452_freefall_event[] = {
  947. {
  948. .type = IIO_EV_TYPE_MAG,
  949. .dir = IIO_EV_DIR_FALLING,
  950. .mask_separate = BIT(IIO_EV_INFO_ENABLE),
  951. .mask_shared_by_type = BIT(IIO_EV_INFO_VALUE) |
  952. BIT(IIO_EV_INFO_PERIOD) |
  953. BIT(IIO_EV_INFO_HIGH_PASS_FILTER_3DB)
  954. },
  955. };
  956. static const struct iio_event_spec mma8652_freefall_event[] = {
  957. {
  958. .type = IIO_EV_TYPE_MAG,
  959. .dir = IIO_EV_DIR_FALLING,
  960. .mask_separate = BIT(IIO_EV_INFO_ENABLE),
  961. .mask_shared_by_type = BIT(IIO_EV_INFO_VALUE) |
  962. BIT(IIO_EV_INFO_PERIOD)
  963. },
  964. };
  965. static const struct iio_event_spec mma8452_transient_event[] = {
  966. {
  967. .type = IIO_EV_TYPE_MAG,
  968. .dir = IIO_EV_DIR_RISING,
  969. .mask_separate = BIT(IIO_EV_INFO_ENABLE),
  970. .mask_shared_by_type = BIT(IIO_EV_INFO_VALUE) |
  971. BIT(IIO_EV_INFO_PERIOD) |
  972. BIT(IIO_EV_INFO_HIGH_PASS_FILTER_3DB)
  973. },
  974. };
  975. static const struct iio_event_spec mma8452_motion_event[] = {
  976. {
  977. .type = IIO_EV_TYPE_MAG,
  978. .dir = IIO_EV_DIR_RISING,
  979. .mask_separate = BIT(IIO_EV_INFO_ENABLE),
  980. .mask_shared_by_type = BIT(IIO_EV_INFO_VALUE) |
  981. BIT(IIO_EV_INFO_PERIOD)
  982. },
  983. };
  984. /*
  985. * Threshold is configured in fixed 8G/127 steps regardless of
  986. * currently selected scale for measurement.
  987. */
  988. static IIO_CONST_ATTR_NAMED(accel_transient_scale, in_accel_scale, "0.617742");
  989. static struct attribute *mma8452_event_attributes[] = {
  990. &iio_const_attr_accel_transient_scale.dev_attr.attr,
  991. NULL,
  992. };
  993. static struct attribute_group mma8452_event_attribute_group = {
  994. .attrs = mma8452_event_attributes,
  995. };
  996. #define MMA8452_FREEFALL_CHANNEL(modifier) { \
  997. .type = IIO_ACCEL, \
  998. .modified = 1, \
  999. .channel2 = modifier, \
  1000. .scan_index = -1, \
  1001. .event_spec = mma8452_freefall_event, \
  1002. .num_event_specs = ARRAY_SIZE(mma8452_freefall_event), \
  1003. }
  1004. #define MMA8652_FREEFALL_CHANNEL(modifier) { \
  1005. .type = IIO_ACCEL, \
  1006. .modified = 1, \
  1007. .channel2 = modifier, \
  1008. .scan_index = -1, \
  1009. .event_spec = mma8652_freefall_event, \
  1010. .num_event_specs = ARRAY_SIZE(mma8652_freefall_event), \
  1011. }
  1012. #define MMA8452_CHANNEL(axis, idx, bits) { \
  1013. .type = IIO_ACCEL, \
  1014. .modified = 1, \
  1015. .channel2 = IIO_MOD_##axis, \
  1016. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
  1017. BIT(IIO_CHAN_INFO_CALIBBIAS), \
  1018. .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SAMP_FREQ) | \
  1019. BIT(IIO_CHAN_INFO_SCALE) | \
  1020. BIT(IIO_CHAN_INFO_HIGH_PASS_FILTER_3DB_FREQUENCY) | \
  1021. BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), \
  1022. .scan_index = idx, \
  1023. .scan_type = { \
  1024. .sign = 's', \
  1025. .realbits = (bits), \
  1026. .storagebits = 16, \
  1027. .shift = 16 - (bits), \
  1028. .endianness = IIO_BE, \
  1029. }, \
  1030. .event_spec = mma8452_transient_event, \
  1031. .num_event_specs = ARRAY_SIZE(mma8452_transient_event), \
  1032. }
  1033. #define MMA8652_CHANNEL(axis, idx, bits) { \
  1034. .type = IIO_ACCEL, \
  1035. .modified = 1, \
  1036. .channel2 = IIO_MOD_##axis, \
  1037. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
  1038. BIT(IIO_CHAN_INFO_CALIBBIAS), \
  1039. .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SAMP_FREQ) | \
  1040. BIT(IIO_CHAN_INFO_SCALE) | \
  1041. BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), \
  1042. .scan_index = idx, \
  1043. .scan_type = { \
  1044. .sign = 's', \
  1045. .realbits = (bits), \
  1046. .storagebits = 16, \
  1047. .shift = 16 - (bits), \
  1048. .endianness = IIO_BE, \
  1049. }, \
  1050. .event_spec = mma8452_motion_event, \
  1051. .num_event_specs = ARRAY_SIZE(mma8452_motion_event), \
  1052. }
  1053. static const struct iio_chan_spec mma8451_channels[] = {
  1054. MMA8452_CHANNEL(X, idx_x, 14),
  1055. MMA8452_CHANNEL(Y, idx_y, 14),
  1056. MMA8452_CHANNEL(Z, idx_z, 14),
  1057. IIO_CHAN_SOFT_TIMESTAMP(idx_ts),
  1058. MMA8452_FREEFALL_CHANNEL(IIO_MOD_X_AND_Y_AND_Z),
  1059. };
  1060. static const struct iio_chan_spec mma8452_channels[] = {
  1061. MMA8452_CHANNEL(X, idx_x, 12),
  1062. MMA8452_CHANNEL(Y, idx_y, 12),
  1063. MMA8452_CHANNEL(Z, idx_z, 12),
  1064. IIO_CHAN_SOFT_TIMESTAMP(idx_ts),
  1065. MMA8452_FREEFALL_CHANNEL(IIO_MOD_X_AND_Y_AND_Z),
  1066. };
  1067. static const struct iio_chan_spec mma8453_channels[] = {
  1068. MMA8452_CHANNEL(X, idx_x, 10),
  1069. MMA8452_CHANNEL(Y, idx_y, 10),
  1070. MMA8452_CHANNEL(Z, idx_z, 10),
  1071. IIO_CHAN_SOFT_TIMESTAMP(idx_ts),
  1072. MMA8452_FREEFALL_CHANNEL(IIO_MOD_X_AND_Y_AND_Z),
  1073. };
  1074. static const struct iio_chan_spec mma8652_channels[] = {
  1075. MMA8652_CHANNEL(X, idx_x, 12),
  1076. MMA8652_CHANNEL(Y, idx_y, 12),
  1077. MMA8652_CHANNEL(Z, idx_z, 12),
  1078. IIO_CHAN_SOFT_TIMESTAMP(idx_ts),
  1079. MMA8652_FREEFALL_CHANNEL(IIO_MOD_X_AND_Y_AND_Z),
  1080. };
  1081. static const struct iio_chan_spec mma8653_channels[] = {
  1082. MMA8652_CHANNEL(X, idx_x, 10),
  1083. MMA8652_CHANNEL(Y, idx_y, 10),
  1084. MMA8652_CHANNEL(Z, idx_z, 10),
  1085. IIO_CHAN_SOFT_TIMESTAMP(idx_ts),
  1086. MMA8652_FREEFALL_CHANNEL(IIO_MOD_X_AND_Y_AND_Z),
  1087. };
  1088. enum {
  1089. mma8451,
  1090. mma8452,
  1091. mma8453,
  1092. mma8652,
  1093. mma8653,
  1094. fxls8471,
  1095. };
  1096. static const struct mma_chip_info mma_chip_info_table[] = {
  1097. [mma8451] = {
  1098. .chip_id = MMA8451_DEVICE_ID,
  1099. .channels = mma8451_channels,
  1100. .num_channels = ARRAY_SIZE(mma8451_channels),
  1101. /*
  1102. * Hardware has fullscale of -2G, -4G, -8G corresponding to
  1103. * raw value -8192 for 14 bit, -2048 for 12 bit or -512 for 10
  1104. * bit.
  1105. * The userspace interface uses m/s^2 and we declare micro units
  1106. * So scale factor for 12 bit here is given by:
  1107. * g * N * 1000000 / 2048 for N = 2, 4, 8 and g=9.80665
  1108. */
  1109. .mma_scales = { {0, 2394}, {0, 4788}, {0, 9577} },
  1110. /*
  1111. * Although we enable the interrupt sources once and for
  1112. * all here the event detection itself is not enabled until
  1113. * userspace asks for it by mma8452_write_event_config()
  1114. */
  1115. .all_events = MMA8452_INT_DRDY |
  1116. MMA8452_INT_TRANS |
  1117. MMA8452_INT_FF_MT,
  1118. .enabled_events = MMA8452_INT_TRANS |
  1119. MMA8452_INT_FF_MT,
  1120. },
  1121. [mma8452] = {
  1122. .chip_id = MMA8452_DEVICE_ID,
  1123. .channels = mma8452_channels,
  1124. .num_channels = ARRAY_SIZE(mma8452_channels),
  1125. .mma_scales = { {0, 9577}, {0, 19154}, {0, 38307} },
  1126. /*
  1127. * Although we enable the interrupt sources once and for
  1128. * all here the event detection itself is not enabled until
  1129. * userspace asks for it by mma8452_write_event_config()
  1130. */
  1131. .all_events = MMA8452_INT_DRDY |
  1132. MMA8452_INT_TRANS |
  1133. MMA8452_INT_FF_MT,
  1134. .enabled_events = MMA8452_INT_TRANS |
  1135. MMA8452_INT_FF_MT,
  1136. },
  1137. [mma8453] = {
  1138. .chip_id = MMA8453_DEVICE_ID,
  1139. .channels = mma8453_channels,
  1140. .num_channels = ARRAY_SIZE(mma8453_channels),
  1141. .mma_scales = { {0, 38307}, {0, 76614}, {0, 153228} },
  1142. /*
  1143. * Although we enable the interrupt sources once and for
  1144. * all here the event detection itself is not enabled until
  1145. * userspace asks for it by mma8452_write_event_config()
  1146. */
  1147. .all_events = MMA8452_INT_DRDY |
  1148. MMA8452_INT_TRANS |
  1149. MMA8452_INT_FF_MT,
  1150. .enabled_events = MMA8452_INT_TRANS |
  1151. MMA8452_INT_FF_MT,
  1152. },
  1153. [mma8652] = {
  1154. .chip_id = MMA8652_DEVICE_ID,
  1155. .channels = mma8652_channels,
  1156. .num_channels = ARRAY_SIZE(mma8652_channels),
  1157. .mma_scales = { {0, 9577}, {0, 19154}, {0, 38307} },
  1158. .all_events = MMA8452_INT_DRDY |
  1159. MMA8452_INT_FF_MT,
  1160. .enabled_events = MMA8452_INT_FF_MT,
  1161. },
  1162. [mma8653] = {
  1163. .chip_id = MMA8653_DEVICE_ID,
  1164. .channels = mma8653_channels,
  1165. .num_channels = ARRAY_SIZE(mma8653_channels),
  1166. .mma_scales = { {0, 38307}, {0, 76614}, {0, 153228} },
  1167. /*
  1168. * Although we enable the interrupt sources once and for
  1169. * all here the event detection itself is not enabled until
  1170. * userspace asks for it by mma8452_write_event_config()
  1171. */
  1172. .all_events = MMA8452_INT_DRDY |
  1173. MMA8452_INT_FF_MT,
  1174. .enabled_events = MMA8452_INT_FF_MT,
  1175. },
  1176. [fxls8471] = {
  1177. .chip_id = FXLS8471_DEVICE_ID,
  1178. .channels = mma8451_channels,
  1179. .num_channels = ARRAY_SIZE(mma8451_channels),
  1180. .mma_scales = { {0, 2394}, {0, 4788}, {0, 9577} },
  1181. /*
  1182. * Although we enable the interrupt sources once and for
  1183. * all here the event detection itself is not enabled until
  1184. * userspace asks for it by mma8452_write_event_config()
  1185. */
  1186. .all_events = MMA8452_INT_DRDY |
  1187. MMA8452_INT_TRANS |
  1188. MMA8452_INT_FF_MT,
  1189. .enabled_events = MMA8452_INT_TRANS |
  1190. MMA8452_INT_FF_MT,
  1191. },
  1192. };
  1193. static struct attribute *mma8452_attributes[] = {
  1194. &iio_dev_attr_sampling_frequency_available.dev_attr.attr,
  1195. &iio_dev_attr_in_accel_scale_available.dev_attr.attr,
  1196. &iio_dev_attr_in_accel_filter_high_pass_3db_frequency_available.dev_attr.attr,
  1197. &iio_dev_attr_in_accel_oversampling_ratio_available.dev_attr.attr,
  1198. NULL
  1199. };
  1200. static const struct attribute_group mma8452_group = {
  1201. .attrs = mma8452_attributes,
  1202. };
  1203. static const struct iio_info mma8452_info = {
  1204. .attrs = &mma8452_group,
  1205. .read_raw = &mma8452_read_raw,
  1206. .write_raw = &mma8452_write_raw,
  1207. .event_attrs = &mma8452_event_attribute_group,
  1208. .read_event_value = &mma8452_read_event_value,
  1209. .write_event_value = &mma8452_write_event_value,
  1210. .read_event_config = &mma8452_read_event_config,
  1211. .write_event_config = &mma8452_write_event_config,
  1212. .debugfs_reg_access = &mma8452_reg_access_dbg,
  1213. };
  1214. static const unsigned long mma8452_scan_masks[] = {0x7, 0};
  1215. static int mma8452_data_rdy_trigger_set_state(struct iio_trigger *trig,
  1216. bool state)
  1217. {
  1218. struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
  1219. struct mma8452_data *data = iio_priv(indio_dev);
  1220. int reg, ret;
  1221. ret = mma8452_set_runtime_pm_state(data->client, state);
  1222. if (ret)
  1223. return ret;
  1224. reg = i2c_smbus_read_byte_data(data->client, MMA8452_CTRL_REG4);
  1225. if (reg < 0)
  1226. return reg;
  1227. if (state)
  1228. reg |= MMA8452_INT_DRDY;
  1229. else
  1230. reg &= ~MMA8452_INT_DRDY;
  1231. return mma8452_change_config(data, MMA8452_CTRL_REG4, reg);
  1232. }
  1233. static const struct iio_trigger_ops mma8452_trigger_ops = {
  1234. .set_trigger_state = mma8452_data_rdy_trigger_set_state,
  1235. .validate_device = iio_trigger_validate_own_device,
  1236. };
  1237. static int mma8452_trigger_setup(struct iio_dev *indio_dev)
  1238. {
  1239. struct mma8452_data *data = iio_priv(indio_dev);
  1240. struct iio_trigger *trig;
  1241. int ret;
  1242. trig = devm_iio_trigger_alloc(&data->client->dev, "%s-dev%d",
  1243. indio_dev->name,
  1244. indio_dev->id);
  1245. if (!trig)
  1246. return -ENOMEM;
  1247. trig->dev.parent = &data->client->dev;
  1248. trig->ops = &mma8452_trigger_ops;
  1249. iio_trigger_set_drvdata(trig, indio_dev);
  1250. ret = iio_trigger_register(trig);
  1251. if (ret)
  1252. return ret;
  1253. indio_dev->trig = trig;
  1254. return 0;
  1255. }
  1256. static void mma8452_trigger_cleanup(struct iio_dev *indio_dev)
  1257. {
  1258. if (indio_dev->trig)
  1259. iio_trigger_unregister(indio_dev->trig);
  1260. }
  1261. static int mma8452_reset(struct i2c_client *client)
  1262. {
  1263. int i;
  1264. int ret;
  1265. ret = i2c_smbus_write_byte_data(client, MMA8452_CTRL_REG2,
  1266. MMA8452_CTRL_REG2_RST);
  1267. if (ret < 0)
  1268. return ret;
  1269. for (i = 0; i < 10; i++) {
  1270. usleep_range(100, 200);
  1271. ret = i2c_smbus_read_byte_data(client, MMA8452_CTRL_REG2);
  1272. if (ret == -EIO)
  1273. continue; /* I2C comm reset */
  1274. if (ret < 0)
  1275. return ret;
  1276. if (!(ret & MMA8452_CTRL_REG2_RST))
  1277. return 0;
  1278. }
  1279. return -ETIMEDOUT;
  1280. }
  1281. static const struct of_device_id mma8452_dt_ids[] = {
  1282. { .compatible = "fsl,mma8451", .data = &mma_chip_info_table[mma8451] },
  1283. { .compatible = "fsl,mma8452", .data = &mma_chip_info_table[mma8452] },
  1284. { .compatible = "fsl,mma8453", .data = &mma_chip_info_table[mma8453] },
  1285. { .compatible = "fsl,mma8652", .data = &mma_chip_info_table[mma8652] },
  1286. { .compatible = "fsl,mma8653", .data = &mma_chip_info_table[mma8653] },
  1287. { .compatible = "fsl,fxls8471", .data = &mma_chip_info_table[fxls8471] },
  1288. { }
  1289. };
  1290. MODULE_DEVICE_TABLE(of, mma8452_dt_ids);
  1291. static int mma8452_probe(struct i2c_client *client,
  1292. const struct i2c_device_id *id)
  1293. {
  1294. struct mma8452_data *data;
  1295. struct iio_dev *indio_dev;
  1296. int ret;
  1297. const struct of_device_id *match;
  1298. match = of_match_device(mma8452_dt_ids, &client->dev);
  1299. if (!match) {
  1300. dev_err(&client->dev, "unknown device model\n");
  1301. return -ENODEV;
  1302. }
  1303. indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
  1304. if (!indio_dev)
  1305. return -ENOMEM;
  1306. data = iio_priv(indio_dev);
  1307. data->client = client;
  1308. mutex_init(&data->lock);
  1309. data->chip_info = match->data;
  1310. ret = i2c_smbus_read_byte_data(client, MMA8452_WHO_AM_I);
  1311. if (ret < 0)
  1312. return ret;
  1313. switch (ret) {
  1314. case MMA8451_DEVICE_ID:
  1315. case MMA8452_DEVICE_ID:
  1316. case MMA8453_DEVICE_ID:
  1317. case MMA8652_DEVICE_ID:
  1318. case MMA8653_DEVICE_ID:
  1319. case FXLS8471_DEVICE_ID:
  1320. if (ret == data->chip_info->chip_id)
  1321. break;
  1322. /* else: fall through */
  1323. default:
  1324. return -ENODEV;
  1325. }
  1326. dev_info(&client->dev, "registering %s accelerometer; ID 0x%x\n",
  1327. match->compatible, data->chip_info->chip_id);
  1328. i2c_set_clientdata(client, indio_dev);
  1329. indio_dev->info = &mma8452_info;
  1330. indio_dev->name = id->name;
  1331. indio_dev->dev.parent = &client->dev;
  1332. indio_dev->modes = INDIO_DIRECT_MODE;
  1333. indio_dev->channels = data->chip_info->channels;
  1334. indio_dev->num_channels = data->chip_info->num_channels;
  1335. indio_dev->available_scan_masks = mma8452_scan_masks;
  1336. ret = mma8452_reset(client);
  1337. if (ret < 0)
  1338. return ret;
  1339. data->data_cfg = MMA8452_DATA_CFG_FS_2G;
  1340. ret = i2c_smbus_write_byte_data(client, MMA8452_DATA_CFG,
  1341. data->data_cfg);
  1342. if (ret < 0)
  1343. return ret;
  1344. /*
  1345. * By default set transient threshold to max to avoid events if
  1346. * enabling without configuring threshold.
  1347. */
  1348. ret = i2c_smbus_write_byte_data(client, MMA8452_TRANSIENT_THS,
  1349. MMA8452_TRANSIENT_THS_MASK);
  1350. if (ret < 0)
  1351. return ret;
  1352. if (client->irq) {
  1353. int irq2;
  1354. irq2 = of_irq_get_byname(client->dev.of_node, "INT2");
  1355. if (irq2 == client->irq) {
  1356. dev_dbg(&client->dev, "using interrupt line INT2\n");
  1357. } else {
  1358. ret = i2c_smbus_write_byte_data(client,
  1359. MMA8452_CTRL_REG5,
  1360. data->chip_info->all_events);
  1361. if (ret < 0)
  1362. return ret;
  1363. dev_dbg(&client->dev, "using interrupt line INT1\n");
  1364. }
  1365. ret = i2c_smbus_write_byte_data(client,
  1366. MMA8452_CTRL_REG4,
  1367. data->chip_info->enabled_events);
  1368. if (ret < 0)
  1369. return ret;
  1370. ret = mma8452_trigger_setup(indio_dev);
  1371. if (ret < 0)
  1372. return ret;
  1373. }
  1374. data->ctrl_reg1 = MMA8452_CTRL_ACTIVE |
  1375. (MMA8452_CTRL_DR_DEFAULT << MMA8452_CTRL_DR_SHIFT);
  1376. data->sleep_val = mma8452_calculate_sleep(data);
  1377. ret = i2c_smbus_write_byte_data(client, MMA8452_CTRL_REG1,
  1378. data->ctrl_reg1);
  1379. if (ret < 0)
  1380. goto trigger_cleanup;
  1381. ret = iio_triggered_buffer_setup(indio_dev, NULL,
  1382. mma8452_trigger_handler, NULL);
  1383. if (ret < 0)
  1384. goto trigger_cleanup;
  1385. if (client->irq) {
  1386. ret = devm_request_threaded_irq(&client->dev,
  1387. client->irq,
  1388. NULL, mma8452_interrupt,
  1389. IRQF_TRIGGER_LOW | IRQF_ONESHOT,
  1390. client->name, indio_dev);
  1391. if (ret)
  1392. goto buffer_cleanup;
  1393. }
  1394. ret = pm_runtime_set_active(&client->dev);
  1395. if (ret < 0)
  1396. goto buffer_cleanup;
  1397. pm_runtime_enable(&client->dev);
  1398. pm_runtime_set_autosuspend_delay(&client->dev,
  1399. MMA8452_AUTO_SUSPEND_DELAY_MS);
  1400. pm_runtime_use_autosuspend(&client->dev);
  1401. ret = iio_device_register(indio_dev);
  1402. if (ret < 0)
  1403. goto buffer_cleanup;
  1404. ret = mma8452_set_freefall_mode(data, false);
  1405. if (ret < 0)
  1406. goto unregister_device;
  1407. return 0;
  1408. unregister_device:
  1409. iio_device_unregister(indio_dev);
  1410. buffer_cleanup:
  1411. iio_triggered_buffer_cleanup(indio_dev);
  1412. trigger_cleanup:
  1413. mma8452_trigger_cleanup(indio_dev);
  1414. return ret;
  1415. }
  1416. static int mma8452_remove(struct i2c_client *client)
  1417. {
  1418. struct iio_dev *indio_dev = i2c_get_clientdata(client);
  1419. iio_device_unregister(indio_dev);
  1420. pm_runtime_disable(&client->dev);
  1421. pm_runtime_set_suspended(&client->dev);
  1422. pm_runtime_put_noidle(&client->dev);
  1423. iio_triggered_buffer_cleanup(indio_dev);
  1424. mma8452_trigger_cleanup(indio_dev);
  1425. mma8452_standby(iio_priv(indio_dev));
  1426. return 0;
  1427. }
  1428. #ifdef CONFIG_PM
  1429. static int mma8452_runtime_suspend(struct device *dev)
  1430. {
  1431. struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
  1432. struct mma8452_data *data = iio_priv(indio_dev);
  1433. int ret;
  1434. mutex_lock(&data->lock);
  1435. ret = mma8452_standby(data);
  1436. mutex_unlock(&data->lock);
  1437. if (ret < 0) {
  1438. dev_err(&data->client->dev, "powering off device failed\n");
  1439. return -EAGAIN;
  1440. }
  1441. return 0;
  1442. }
  1443. static int mma8452_runtime_resume(struct device *dev)
  1444. {
  1445. struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
  1446. struct mma8452_data *data = iio_priv(indio_dev);
  1447. int ret, sleep_val;
  1448. ret = mma8452_active(data);
  1449. if (ret < 0)
  1450. return ret;
  1451. ret = mma8452_get_odr_index(data);
  1452. sleep_val = 1000 / mma8452_samp_freq[ret][0];
  1453. if (sleep_val < 20)
  1454. usleep_range(sleep_val * 1000, 20000);
  1455. else
  1456. msleep_interruptible(sleep_val);
  1457. return 0;
  1458. }
  1459. #endif
  1460. #ifdef CONFIG_PM_SLEEP
  1461. static int mma8452_suspend(struct device *dev)
  1462. {
  1463. return mma8452_standby(iio_priv(i2c_get_clientdata(
  1464. to_i2c_client(dev))));
  1465. }
  1466. static int mma8452_resume(struct device *dev)
  1467. {
  1468. return mma8452_active(iio_priv(i2c_get_clientdata(
  1469. to_i2c_client(dev))));
  1470. }
  1471. #endif
  1472. static const struct dev_pm_ops mma8452_pm_ops = {
  1473. SET_SYSTEM_SLEEP_PM_OPS(mma8452_suspend, mma8452_resume)
  1474. SET_RUNTIME_PM_OPS(mma8452_runtime_suspend,
  1475. mma8452_runtime_resume, NULL)
  1476. };
  1477. static const struct i2c_device_id mma8452_id[] = {
  1478. { "mma8451", mma8451 },
  1479. { "mma8452", mma8452 },
  1480. { "mma8453", mma8453 },
  1481. { "mma8652", mma8652 },
  1482. { "mma8653", mma8653 },
  1483. { "fxls8471", fxls8471 },
  1484. { }
  1485. };
  1486. MODULE_DEVICE_TABLE(i2c, mma8452_id);
  1487. static struct i2c_driver mma8452_driver = {
  1488. .driver = {
  1489. .name = "mma8452",
  1490. .of_match_table = of_match_ptr(mma8452_dt_ids),
  1491. .pm = &mma8452_pm_ops,
  1492. },
  1493. .probe = mma8452_probe,
  1494. .remove = mma8452_remove,
  1495. .id_table = mma8452_id,
  1496. };
  1497. module_i2c_driver(mma8452_driver);
  1498. MODULE_AUTHOR("Peter Meerwald <pmeerw@pmeerw.net>");
  1499. MODULE_DESCRIPTION("Freescale / NXP MMA8452 accelerometer driver");
  1500. MODULE_LICENSE("GPL");