mma8452.c 44 KB

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