mma8452.c 45 KB

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