mma8452.c 47 KB

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