mma8452.c 44 KB

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