mma8452.c 47 KB

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