mma8452.c 25 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015
  1. /*
  2. * mma8452.c - Support for Freescale MMA8452Q 3-axis 12-bit accelerometer
  3. *
  4. * Copyright 2014 Peter Meerwald <pmeerw@pmeerw.net>
  5. *
  6. * This file is subject to the terms and conditions of version 2 of
  7. * the GNU General Public License. See the file COPYING in the main
  8. * directory of this archive for more details.
  9. *
  10. * 7-bit I2C slave address 0x1c/0x1d (pin selectable)
  11. *
  12. * TODO: orientation / freefall events, autosleep
  13. */
  14. #include <linux/module.h>
  15. #include <linux/i2c.h>
  16. #include <linux/iio/iio.h>
  17. #include <linux/iio/sysfs.h>
  18. #include <linux/iio/buffer.h>
  19. #include <linux/iio/trigger.h>
  20. #include <linux/iio/trigger_consumer.h>
  21. #include <linux/iio/triggered_buffer.h>
  22. #include <linux/iio/events.h>
  23. #include <linux/delay.h>
  24. #define MMA8452_STATUS 0x00
  25. #define MMA8452_STATUS_DRDY (BIT(2) | BIT(1) | BIT(0))
  26. #define MMA8452_OUT_X 0x01 /* MSB first, 12-bit */
  27. #define MMA8452_OUT_Y 0x03
  28. #define MMA8452_OUT_Z 0x05
  29. #define MMA8452_INT_SRC 0x0c
  30. #define MMA8452_WHO_AM_I 0x0d
  31. #define MMA8452_DATA_CFG 0x0e
  32. #define MMA8452_DATA_CFG_FS_MASK GENMASK(1, 0)
  33. #define MMA8452_DATA_CFG_FS_2G 0
  34. #define MMA8452_DATA_CFG_FS_4G 1
  35. #define MMA8452_DATA_CFG_FS_8G 2
  36. #define MMA8452_DATA_CFG_HPF_MASK BIT(4)
  37. #define MMA8452_HP_FILTER_CUTOFF 0x0f
  38. #define MMA8452_HP_FILTER_CUTOFF_SEL_MASK GENMASK(1, 0)
  39. #define MMA8452_TRANSIENT_CFG 0x1d
  40. #define MMA8452_TRANSIENT_CFG_HPF_BYP BIT(0)
  41. #define MMA8452_TRANSIENT_CFG_CHAN(chan) BIT(chan + 1)
  42. #define MMA8452_TRANSIENT_CFG_ELE BIT(4)
  43. #define MMA8452_TRANSIENT_SRC 0x1e
  44. #define MMA8452_TRANSIENT_SRC_XTRANSE BIT(1)
  45. #define MMA8452_TRANSIENT_SRC_YTRANSE BIT(3)
  46. #define MMA8452_TRANSIENT_SRC_ZTRANSE BIT(5)
  47. #define MMA8452_TRANSIENT_THS 0x1f
  48. #define MMA8452_TRANSIENT_THS_MASK GENMASK(6, 0)
  49. #define MMA8452_TRANSIENT_COUNT 0x20
  50. #define MMA8452_CTRL_REG1 0x2a
  51. #define MMA8452_CTRL_ACTIVE BIT(0)
  52. #define MMA8452_CTRL_DR_MASK GENMASK(5, 3)
  53. #define MMA8452_CTRL_DR_SHIFT 3
  54. #define MMA8452_CTRL_DR_DEFAULT 0x4 /* 50 Hz sample frequency */
  55. #define MMA8452_CTRL_REG2 0x2b
  56. #define MMA8452_CTRL_REG2_RST BIT(6)
  57. #define MMA8452_CTRL_REG4 0x2d
  58. #define MMA8452_CTRL_REG5 0x2e
  59. #define MMA8452_OFF_X 0x2f
  60. #define MMA8452_OFF_Y 0x30
  61. #define MMA8452_OFF_Z 0x31
  62. #define MMA8452_MAX_REG 0x31
  63. #define MMA8452_INT_DRDY BIT(0)
  64. #define MMA8452_INT_TRANS BIT(5)
  65. #define MMA8452_DEVICE_ID 0x2a
  66. struct mma8452_data {
  67. struct i2c_client *client;
  68. struct mutex lock;
  69. u8 ctrl_reg1;
  70. u8 data_cfg;
  71. };
  72. static int mma8452_drdy(struct mma8452_data *data)
  73. {
  74. int tries = 150;
  75. while (tries-- > 0) {
  76. int ret = i2c_smbus_read_byte_data(data->client,
  77. MMA8452_STATUS);
  78. if (ret < 0)
  79. return ret;
  80. if ((ret & MMA8452_STATUS_DRDY) == MMA8452_STATUS_DRDY)
  81. return 0;
  82. msleep(20);
  83. }
  84. dev_err(&data->client->dev, "data not ready\n");
  85. return -EIO;
  86. }
  87. static int mma8452_read(struct mma8452_data *data, __be16 buf[3])
  88. {
  89. int ret = mma8452_drdy(data);
  90. if (ret < 0)
  91. return ret;
  92. return i2c_smbus_read_i2c_block_data(data->client, MMA8452_OUT_X,
  93. 3 * sizeof(__be16), (u8 *)buf);
  94. }
  95. static ssize_t mma8452_show_int_plus_micros(char *buf, const int (*vals)[2],
  96. int n)
  97. {
  98. size_t len = 0;
  99. while (n-- > 0)
  100. len += scnprintf(buf + len, PAGE_SIZE - len, "%d.%06d ",
  101. vals[n][0], vals[n][1]);
  102. /* replace trailing space by newline */
  103. buf[len - 1] = '\n';
  104. return len;
  105. }
  106. static int mma8452_get_int_plus_micros_index(const int (*vals)[2], int n,
  107. int val, int val2)
  108. {
  109. while (n-- > 0)
  110. if (val == vals[n][0] && val2 == vals[n][1])
  111. return n;
  112. return -EINVAL;
  113. }
  114. static int mma8452_get_odr_index(struct mma8452_data *data)
  115. {
  116. return (data->ctrl_reg1 & MMA8452_CTRL_DR_MASK) >>
  117. MMA8452_CTRL_DR_SHIFT;
  118. }
  119. static const int mma8452_samp_freq[8][2] = {
  120. {800, 0}, {400, 0}, {200, 0}, {100, 0}, {50, 0}, {12, 500000},
  121. {6, 250000}, {1, 560000}
  122. };
  123. /*
  124. * Hardware has fullscale of -2G, -4G, -8G corresponding to raw value -2048
  125. * The userspace interface uses m/s^2 and we declare micro units
  126. * So scale factor is given by:
  127. * g * N * 1000000 / 2048 for N = 2, 4, 8 and g = 9.80665
  128. */
  129. static const int mma8452_scales[3][2] = {
  130. {0, 9577}, {0, 19154}, {0, 38307}
  131. };
  132. /* Datasheet table 35 (step time vs sample frequency) */
  133. static const int mma8452_transient_time_step_us[8] = {
  134. 1250,
  135. 2500,
  136. 5000,
  137. 10000,
  138. 20000,
  139. 20000,
  140. 20000,
  141. 20000
  142. };
  143. /* Datasheet table 18 (normal mode) */
  144. static const int mma8452_hp_filter_cutoff[8][4][2] = {
  145. { {16, 0}, {8, 0}, {4, 0}, {2, 0} }, /* 800 Hz sample */
  146. { {16, 0}, {8, 0}, {4, 0}, {2, 0} }, /* 400 Hz sample */
  147. { {8, 0}, {4, 0}, {2, 0}, {1, 0} }, /* 200 Hz sample */
  148. { {4, 0}, {2, 0}, {1, 0}, {0, 500000} }, /* 100 Hz sample */
  149. { {2, 0}, {1, 0}, {0, 500000}, {0, 250000} }, /* 50 Hz sample */
  150. { {2, 0}, {1, 0}, {0, 500000}, {0, 250000} }, /* 12.5 Hz sample */
  151. { {2, 0}, {1, 0}, {0, 500000}, {0, 250000} }, /* 6.25 Hz sample */
  152. { {2, 0}, {1, 0}, {0, 500000}, {0, 250000} } /* 1.56 Hz sample */
  153. };
  154. static ssize_t mma8452_show_samp_freq_avail(struct device *dev,
  155. struct device_attribute *attr,
  156. char *buf)
  157. {
  158. return mma8452_show_int_plus_micros(buf, mma8452_samp_freq,
  159. ARRAY_SIZE(mma8452_samp_freq));
  160. }
  161. static ssize_t mma8452_show_scale_avail(struct device *dev,
  162. struct device_attribute *attr,
  163. char *buf)
  164. {
  165. return mma8452_show_int_plus_micros(buf, mma8452_scales,
  166. ARRAY_SIZE(mma8452_scales));
  167. }
  168. static ssize_t mma8452_show_hp_cutoff_avail(struct device *dev,
  169. struct device_attribute *attr,
  170. char *buf)
  171. {
  172. struct iio_dev *indio_dev = dev_to_iio_dev(dev);
  173. struct mma8452_data *data = iio_priv(indio_dev);
  174. int i = mma8452_get_odr_index(data);
  175. return mma8452_show_int_plus_micros(buf, mma8452_hp_filter_cutoff[i],
  176. ARRAY_SIZE(mma8452_hp_filter_cutoff[0]));
  177. }
  178. static IIO_DEV_ATTR_SAMP_FREQ_AVAIL(mma8452_show_samp_freq_avail);
  179. static IIO_DEVICE_ATTR(in_accel_scale_available, S_IRUGO,
  180. mma8452_show_scale_avail, NULL, 0);
  181. static IIO_DEVICE_ATTR(in_accel_filter_high_pass_3db_frequency_available,
  182. S_IRUGO, mma8452_show_hp_cutoff_avail, NULL, 0);
  183. static int mma8452_get_samp_freq_index(struct mma8452_data *data,
  184. int val, int val2)
  185. {
  186. return mma8452_get_int_plus_micros_index(mma8452_samp_freq,
  187. ARRAY_SIZE(mma8452_samp_freq),
  188. val, val2);
  189. }
  190. static int mma8452_get_scale_index(struct mma8452_data *data, int val, int val2)
  191. {
  192. return mma8452_get_int_plus_micros_index(mma8452_scales,
  193. ARRAY_SIZE(mma8452_scales),
  194. val, val2);
  195. }
  196. static int mma8452_get_hp_filter_index(struct mma8452_data *data,
  197. int val, int val2)
  198. {
  199. int i = mma8452_get_odr_index(data);
  200. return mma8452_get_int_plus_micros_index(mma8452_hp_filter_cutoff[i],
  201. ARRAY_SIZE(mma8452_hp_filter_cutoff[0]), val, val2);
  202. }
  203. static int mma8452_read_hp_filter(struct mma8452_data *data, int *hz, int *uHz)
  204. {
  205. int i, ret;
  206. ret = i2c_smbus_read_byte_data(data->client, MMA8452_HP_FILTER_CUTOFF);
  207. if (ret < 0)
  208. return ret;
  209. i = mma8452_get_odr_index(data);
  210. ret &= MMA8452_HP_FILTER_CUTOFF_SEL_MASK;
  211. *hz = mma8452_hp_filter_cutoff[i][ret][0];
  212. *uHz = mma8452_hp_filter_cutoff[i][ret][1];
  213. return 0;
  214. }
  215. static int mma8452_read_raw(struct iio_dev *indio_dev,
  216. struct iio_chan_spec const *chan,
  217. int *val, int *val2, long mask)
  218. {
  219. struct mma8452_data *data = iio_priv(indio_dev);
  220. __be16 buffer[3];
  221. int i, ret;
  222. switch (mask) {
  223. case IIO_CHAN_INFO_RAW:
  224. if (iio_buffer_enabled(indio_dev))
  225. return -EBUSY;
  226. mutex_lock(&data->lock);
  227. ret = mma8452_read(data, buffer);
  228. mutex_unlock(&data->lock);
  229. if (ret < 0)
  230. return ret;
  231. *val = sign_extend32(be16_to_cpu(buffer[chan->scan_index]) >> 4,
  232. 11);
  233. return IIO_VAL_INT;
  234. case IIO_CHAN_INFO_SCALE:
  235. i = data->data_cfg & MMA8452_DATA_CFG_FS_MASK;
  236. *val = mma8452_scales[i][0];
  237. *val2 = mma8452_scales[i][1];
  238. return IIO_VAL_INT_PLUS_MICRO;
  239. case IIO_CHAN_INFO_SAMP_FREQ:
  240. i = mma8452_get_odr_index(data);
  241. *val = mma8452_samp_freq[i][0];
  242. *val2 = mma8452_samp_freq[i][1];
  243. return IIO_VAL_INT_PLUS_MICRO;
  244. case IIO_CHAN_INFO_CALIBBIAS:
  245. ret = i2c_smbus_read_byte_data(data->client,
  246. MMA8452_OFF_X + chan->scan_index);
  247. if (ret < 0)
  248. return ret;
  249. *val = sign_extend32(ret, 7);
  250. return IIO_VAL_INT;
  251. case IIO_CHAN_INFO_HIGH_PASS_FILTER_3DB_FREQUENCY:
  252. if (data->data_cfg & MMA8452_DATA_CFG_HPF_MASK) {
  253. ret = mma8452_read_hp_filter(data, val, val2);
  254. if (ret < 0)
  255. return ret;
  256. } else {
  257. *val = 0;
  258. *val2 = 0;
  259. }
  260. return IIO_VAL_INT_PLUS_MICRO;
  261. }
  262. return -EINVAL;
  263. }
  264. static int mma8452_standby(struct mma8452_data *data)
  265. {
  266. return i2c_smbus_write_byte_data(data->client, MMA8452_CTRL_REG1,
  267. data->ctrl_reg1 & ~MMA8452_CTRL_ACTIVE);
  268. }
  269. static int mma8452_active(struct mma8452_data *data)
  270. {
  271. return i2c_smbus_write_byte_data(data->client, MMA8452_CTRL_REG1,
  272. data->ctrl_reg1);
  273. }
  274. static int mma8452_change_config(struct mma8452_data *data, u8 reg, u8 val)
  275. {
  276. int ret;
  277. mutex_lock(&data->lock);
  278. /* config can only be changed when in standby */
  279. ret = mma8452_standby(data);
  280. if (ret < 0)
  281. goto fail;
  282. ret = i2c_smbus_write_byte_data(data->client, reg, val);
  283. if (ret < 0)
  284. goto fail;
  285. ret = mma8452_active(data);
  286. if (ret < 0)
  287. goto fail;
  288. ret = 0;
  289. fail:
  290. mutex_unlock(&data->lock);
  291. return ret;
  292. }
  293. static int mma8452_set_hp_filter_frequency(struct mma8452_data *data,
  294. int val, int val2)
  295. {
  296. int i, reg;
  297. i = mma8452_get_hp_filter_index(data, val, val2);
  298. if (i < 0)
  299. return i;
  300. reg = i2c_smbus_read_byte_data(data->client,
  301. MMA8452_HP_FILTER_CUTOFF);
  302. if (reg < 0)
  303. return reg;
  304. reg &= ~MMA8452_HP_FILTER_CUTOFF_SEL_MASK;
  305. reg |= i;
  306. return mma8452_change_config(data, MMA8452_HP_FILTER_CUTOFF, reg);
  307. }
  308. static int mma8452_write_raw(struct iio_dev *indio_dev,
  309. struct iio_chan_spec const *chan,
  310. int val, int val2, long mask)
  311. {
  312. struct mma8452_data *data = iio_priv(indio_dev);
  313. int i, ret;
  314. if (iio_buffer_enabled(indio_dev))
  315. return -EBUSY;
  316. switch (mask) {
  317. case IIO_CHAN_INFO_SAMP_FREQ:
  318. i = mma8452_get_samp_freq_index(data, val, val2);
  319. if (i < 0)
  320. return i;
  321. data->ctrl_reg1 &= ~MMA8452_CTRL_DR_MASK;
  322. data->ctrl_reg1 |= i << MMA8452_CTRL_DR_SHIFT;
  323. return mma8452_change_config(data, MMA8452_CTRL_REG1,
  324. data->ctrl_reg1);
  325. case IIO_CHAN_INFO_SCALE:
  326. i = mma8452_get_scale_index(data, val, val2);
  327. if (i < 0)
  328. return i;
  329. data->data_cfg &= ~MMA8452_DATA_CFG_FS_MASK;
  330. data->data_cfg |= i;
  331. return mma8452_change_config(data, MMA8452_DATA_CFG,
  332. data->data_cfg);
  333. case IIO_CHAN_INFO_CALIBBIAS:
  334. if (val < -128 || val > 127)
  335. return -EINVAL;
  336. return mma8452_change_config(data,
  337. MMA8452_OFF_X + chan->scan_index,
  338. val);
  339. case IIO_CHAN_INFO_HIGH_PASS_FILTER_3DB_FREQUENCY:
  340. if (val == 0 && val2 == 0) {
  341. data->data_cfg &= ~MMA8452_DATA_CFG_HPF_MASK;
  342. } else {
  343. data->data_cfg |= MMA8452_DATA_CFG_HPF_MASK;
  344. ret = mma8452_set_hp_filter_frequency(data, val, val2);
  345. if (ret < 0)
  346. return ret;
  347. }
  348. return mma8452_change_config(data, MMA8452_DATA_CFG,
  349. data->data_cfg);
  350. default:
  351. return -EINVAL;
  352. }
  353. }
  354. static int mma8452_read_thresh(struct iio_dev *indio_dev,
  355. const struct iio_chan_spec *chan,
  356. enum iio_event_type type,
  357. enum iio_event_direction dir,
  358. enum iio_event_info info,
  359. int *val, int *val2)
  360. {
  361. struct mma8452_data *data = iio_priv(indio_dev);
  362. int ret, us;
  363. switch (info) {
  364. case IIO_EV_INFO_VALUE:
  365. ret = i2c_smbus_read_byte_data(data->client,
  366. MMA8452_TRANSIENT_THS);
  367. if (ret < 0)
  368. return ret;
  369. *val = ret & MMA8452_TRANSIENT_THS_MASK;
  370. return IIO_VAL_INT;
  371. case IIO_EV_INFO_PERIOD:
  372. ret = i2c_smbus_read_byte_data(data->client,
  373. MMA8452_TRANSIENT_COUNT);
  374. if (ret < 0)
  375. return ret;
  376. us = ret * mma8452_transient_time_step_us[
  377. mma8452_get_odr_index(data)];
  378. *val = us / USEC_PER_SEC;
  379. *val2 = us % USEC_PER_SEC;
  380. return IIO_VAL_INT_PLUS_MICRO;
  381. case IIO_EV_INFO_HIGH_PASS_FILTER_3DB:
  382. ret = i2c_smbus_read_byte_data(data->client,
  383. MMA8452_TRANSIENT_CFG);
  384. if (ret < 0)
  385. return ret;
  386. if (ret & MMA8452_TRANSIENT_CFG_HPF_BYP) {
  387. *val = 0;
  388. *val2 = 0;
  389. } else {
  390. ret = mma8452_read_hp_filter(data, val, val2);
  391. if (ret < 0)
  392. return ret;
  393. }
  394. return IIO_VAL_INT_PLUS_MICRO;
  395. default:
  396. return -EINVAL;
  397. }
  398. }
  399. static int mma8452_write_thresh(struct iio_dev *indio_dev,
  400. const struct iio_chan_spec *chan,
  401. enum iio_event_type type,
  402. enum iio_event_direction dir,
  403. enum iio_event_info info,
  404. int val, int val2)
  405. {
  406. struct mma8452_data *data = iio_priv(indio_dev);
  407. int ret, reg, steps;
  408. switch (info) {
  409. case IIO_EV_INFO_VALUE:
  410. if (val < 0 || val > MMA8452_TRANSIENT_THS_MASK)
  411. return -EINVAL;
  412. return mma8452_change_config(data, MMA8452_TRANSIENT_THS, val);
  413. case IIO_EV_INFO_PERIOD:
  414. steps = (val * USEC_PER_SEC + val2) /
  415. mma8452_transient_time_step_us[
  416. mma8452_get_odr_index(data)];
  417. if (steps < 0 || steps > 0xff)
  418. return -EINVAL;
  419. return mma8452_change_config(data, MMA8452_TRANSIENT_COUNT,
  420. steps);
  421. case IIO_EV_INFO_HIGH_PASS_FILTER_3DB:
  422. reg = i2c_smbus_read_byte_data(data->client,
  423. MMA8452_TRANSIENT_CFG);
  424. if (reg < 0)
  425. return reg;
  426. if (val == 0 && val2 == 0) {
  427. reg |= MMA8452_TRANSIENT_CFG_HPF_BYP;
  428. } else {
  429. reg &= ~MMA8452_TRANSIENT_CFG_HPF_BYP;
  430. ret = mma8452_set_hp_filter_frequency(data, val, val2);
  431. if (ret < 0)
  432. return ret;
  433. }
  434. return mma8452_change_config(data, MMA8452_TRANSIENT_CFG, reg);
  435. default:
  436. return -EINVAL;
  437. }
  438. }
  439. static int mma8452_read_event_config(struct iio_dev *indio_dev,
  440. const struct iio_chan_spec *chan,
  441. enum iio_event_type type,
  442. enum iio_event_direction dir)
  443. {
  444. struct mma8452_data *data = iio_priv(indio_dev);
  445. int ret;
  446. ret = i2c_smbus_read_byte_data(data->client, MMA8452_TRANSIENT_CFG);
  447. if (ret < 0)
  448. return ret;
  449. return ret & MMA8452_TRANSIENT_CFG_CHAN(chan->scan_index) ? 1 : 0;
  450. }
  451. static int mma8452_write_event_config(struct iio_dev *indio_dev,
  452. const struct iio_chan_spec *chan,
  453. enum iio_event_type type,
  454. enum iio_event_direction dir,
  455. int state)
  456. {
  457. struct mma8452_data *data = iio_priv(indio_dev);
  458. int val;
  459. val = i2c_smbus_read_byte_data(data->client, MMA8452_TRANSIENT_CFG);
  460. if (val < 0)
  461. return val;
  462. if (state)
  463. val |= MMA8452_TRANSIENT_CFG_CHAN(chan->scan_index);
  464. else
  465. val &= ~MMA8452_TRANSIENT_CFG_CHAN(chan->scan_index);
  466. val |= MMA8452_TRANSIENT_CFG_ELE;
  467. return mma8452_change_config(data, MMA8452_TRANSIENT_CFG, val);
  468. }
  469. static void mma8452_transient_interrupt(struct iio_dev *indio_dev)
  470. {
  471. struct mma8452_data *data = iio_priv(indio_dev);
  472. s64 ts = iio_get_time_ns();
  473. int src;
  474. src = i2c_smbus_read_byte_data(data->client, MMA8452_TRANSIENT_SRC);
  475. if (src < 0)
  476. return;
  477. if (src & MMA8452_TRANSIENT_SRC_XTRANSE)
  478. iio_push_event(indio_dev,
  479. IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_X,
  480. IIO_EV_TYPE_MAG,
  481. IIO_EV_DIR_RISING),
  482. ts);
  483. if (src & MMA8452_TRANSIENT_SRC_YTRANSE)
  484. iio_push_event(indio_dev,
  485. IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_Y,
  486. IIO_EV_TYPE_MAG,
  487. IIO_EV_DIR_RISING),
  488. ts);
  489. if (src & MMA8452_TRANSIENT_SRC_ZTRANSE)
  490. iio_push_event(indio_dev,
  491. IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_Z,
  492. IIO_EV_TYPE_MAG,
  493. IIO_EV_DIR_RISING),
  494. ts);
  495. }
  496. static irqreturn_t mma8452_interrupt(int irq, void *p)
  497. {
  498. struct iio_dev *indio_dev = p;
  499. struct mma8452_data *data = iio_priv(indio_dev);
  500. int ret = IRQ_NONE;
  501. int src;
  502. src = i2c_smbus_read_byte_data(data->client, MMA8452_INT_SRC);
  503. if (src < 0)
  504. return IRQ_NONE;
  505. if (src & MMA8452_INT_DRDY) {
  506. iio_trigger_poll_chained(indio_dev->trig);
  507. ret = IRQ_HANDLED;
  508. }
  509. if (src & MMA8452_INT_TRANS) {
  510. mma8452_transient_interrupt(indio_dev);
  511. ret = IRQ_HANDLED;
  512. }
  513. return ret;
  514. }
  515. static irqreturn_t mma8452_trigger_handler(int irq, void *p)
  516. {
  517. struct iio_poll_func *pf = p;
  518. struct iio_dev *indio_dev = pf->indio_dev;
  519. struct mma8452_data *data = iio_priv(indio_dev);
  520. u8 buffer[16]; /* 3 16-bit channels + padding + ts */
  521. int ret;
  522. ret = mma8452_read(data, (__be16 *)buffer);
  523. if (ret < 0)
  524. goto done;
  525. iio_push_to_buffers_with_timestamp(indio_dev, buffer,
  526. iio_get_time_ns());
  527. done:
  528. iio_trigger_notify_done(indio_dev->trig);
  529. return IRQ_HANDLED;
  530. }
  531. static int mma8452_reg_access_dbg(struct iio_dev *indio_dev,
  532. unsigned reg, unsigned writeval,
  533. unsigned *readval)
  534. {
  535. int ret;
  536. struct mma8452_data *data = iio_priv(indio_dev);
  537. if (reg > MMA8452_MAX_REG)
  538. return -EINVAL;
  539. if (!readval)
  540. return mma8452_change_config(data, reg, writeval);
  541. ret = i2c_smbus_read_byte_data(data->client, reg);
  542. if (ret < 0)
  543. return ret;
  544. *readval = ret;
  545. return 0;
  546. }
  547. static const struct iio_event_spec mma8452_transient_event[] = {
  548. {
  549. .type = IIO_EV_TYPE_MAG,
  550. .dir = IIO_EV_DIR_RISING,
  551. .mask_separate = BIT(IIO_EV_INFO_ENABLE),
  552. .mask_shared_by_type = BIT(IIO_EV_INFO_VALUE) |
  553. BIT(IIO_EV_INFO_PERIOD) |
  554. BIT(IIO_EV_INFO_HIGH_PASS_FILTER_3DB)
  555. },
  556. };
  557. /*
  558. * Threshold is configured in fixed 8G/127 steps regardless of
  559. * currently selected scale for measurement.
  560. */
  561. static IIO_CONST_ATTR_NAMED(accel_transient_scale, in_accel_scale, "0.617742");
  562. static struct attribute *mma8452_event_attributes[] = {
  563. &iio_const_attr_accel_transient_scale.dev_attr.attr,
  564. NULL,
  565. };
  566. static struct attribute_group mma8452_event_attribute_group = {
  567. .attrs = mma8452_event_attributes,
  568. .name = "events",
  569. };
  570. #define MMA8452_CHANNEL(axis, idx) { \
  571. .type = IIO_ACCEL, \
  572. .modified = 1, \
  573. .channel2 = IIO_MOD_##axis, \
  574. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
  575. BIT(IIO_CHAN_INFO_CALIBBIAS), \
  576. .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SAMP_FREQ) | \
  577. BIT(IIO_CHAN_INFO_SCALE) | \
  578. BIT(IIO_CHAN_INFO_HIGH_PASS_FILTER_3DB_FREQUENCY), \
  579. .scan_index = idx, \
  580. .scan_type = { \
  581. .sign = 's', \
  582. .realbits = 12, \
  583. .storagebits = 16, \
  584. .shift = 4, \
  585. .endianness = IIO_BE, \
  586. }, \
  587. .event_spec = mma8452_transient_event, \
  588. .num_event_specs = ARRAY_SIZE(mma8452_transient_event), \
  589. }
  590. static const struct iio_chan_spec mma8452_channels[] = {
  591. MMA8452_CHANNEL(X, 0),
  592. MMA8452_CHANNEL(Y, 1),
  593. MMA8452_CHANNEL(Z, 2),
  594. IIO_CHAN_SOFT_TIMESTAMP(3),
  595. };
  596. static struct attribute *mma8452_attributes[] = {
  597. &iio_dev_attr_sampling_frequency_available.dev_attr.attr,
  598. &iio_dev_attr_in_accel_scale_available.dev_attr.attr,
  599. &iio_dev_attr_in_accel_filter_high_pass_3db_frequency_available.dev_attr.attr,
  600. NULL
  601. };
  602. static const struct attribute_group mma8452_group = {
  603. .attrs = mma8452_attributes,
  604. };
  605. static const struct iio_info mma8452_info = {
  606. .attrs = &mma8452_group,
  607. .read_raw = &mma8452_read_raw,
  608. .write_raw = &mma8452_write_raw,
  609. .event_attrs = &mma8452_event_attribute_group,
  610. .read_event_value = &mma8452_read_thresh,
  611. .write_event_value = &mma8452_write_thresh,
  612. .read_event_config = &mma8452_read_event_config,
  613. .write_event_config = &mma8452_write_event_config,
  614. .debugfs_reg_access = &mma8452_reg_access_dbg,
  615. .driver_module = THIS_MODULE,
  616. };
  617. static const unsigned long mma8452_scan_masks[] = {0x7, 0};
  618. static int mma8452_data_rdy_trigger_set_state(struct iio_trigger *trig,
  619. bool state)
  620. {
  621. struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
  622. struct mma8452_data *data = iio_priv(indio_dev);
  623. int reg;
  624. reg = i2c_smbus_read_byte_data(data->client, MMA8452_CTRL_REG4);
  625. if (reg < 0)
  626. return reg;
  627. if (state)
  628. reg |= MMA8452_INT_DRDY;
  629. else
  630. reg &= ~MMA8452_INT_DRDY;
  631. return mma8452_change_config(data, MMA8452_CTRL_REG4, reg);
  632. }
  633. static int mma8452_validate_device(struct iio_trigger *trig,
  634. struct iio_dev *indio_dev)
  635. {
  636. struct iio_dev *indio = iio_trigger_get_drvdata(trig);
  637. if (indio != indio_dev)
  638. return -EINVAL;
  639. return 0;
  640. }
  641. static const struct iio_trigger_ops mma8452_trigger_ops = {
  642. .set_trigger_state = mma8452_data_rdy_trigger_set_state,
  643. .validate_device = mma8452_validate_device,
  644. .owner = THIS_MODULE,
  645. };
  646. static int mma8452_trigger_setup(struct iio_dev *indio_dev)
  647. {
  648. struct mma8452_data *data = iio_priv(indio_dev);
  649. struct iio_trigger *trig;
  650. int ret;
  651. trig = devm_iio_trigger_alloc(&data->client->dev, "%s-dev%d",
  652. indio_dev->name,
  653. indio_dev->id);
  654. if (!trig)
  655. return -ENOMEM;
  656. trig->dev.parent = &data->client->dev;
  657. trig->ops = &mma8452_trigger_ops;
  658. iio_trigger_set_drvdata(trig, indio_dev);
  659. ret = iio_trigger_register(trig);
  660. if (ret)
  661. return ret;
  662. indio_dev->trig = trig;
  663. return 0;
  664. }
  665. static void mma8452_trigger_cleanup(struct iio_dev *indio_dev)
  666. {
  667. if (indio_dev->trig)
  668. iio_trigger_unregister(indio_dev->trig);
  669. }
  670. static int mma8452_reset(struct i2c_client *client)
  671. {
  672. int i;
  673. int ret;
  674. ret = i2c_smbus_write_byte_data(client, MMA8452_CTRL_REG2,
  675. MMA8452_CTRL_REG2_RST);
  676. if (ret < 0)
  677. return ret;
  678. for (i = 0; i < 10; i++) {
  679. usleep_range(100, 200);
  680. ret = i2c_smbus_read_byte_data(client, MMA8452_CTRL_REG2);
  681. if (ret == -EIO)
  682. continue; /* I2C comm reset */
  683. if (ret < 0)
  684. return ret;
  685. if (!(ret & MMA8452_CTRL_REG2_RST))
  686. return 0;
  687. }
  688. return -ETIMEDOUT;
  689. }
  690. static int mma8452_probe(struct i2c_client *client,
  691. const struct i2c_device_id *id)
  692. {
  693. struct mma8452_data *data;
  694. struct iio_dev *indio_dev;
  695. int ret;
  696. ret = i2c_smbus_read_byte_data(client, MMA8452_WHO_AM_I);
  697. if (ret < 0)
  698. return ret;
  699. if (ret != MMA8452_DEVICE_ID)
  700. return -ENODEV;
  701. indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
  702. if (!indio_dev)
  703. return -ENOMEM;
  704. data = iio_priv(indio_dev);
  705. data->client = client;
  706. mutex_init(&data->lock);
  707. i2c_set_clientdata(client, indio_dev);
  708. indio_dev->info = &mma8452_info;
  709. indio_dev->name = id->name;
  710. indio_dev->dev.parent = &client->dev;
  711. indio_dev->modes = INDIO_DIRECT_MODE;
  712. indio_dev->channels = mma8452_channels;
  713. indio_dev->num_channels = ARRAY_SIZE(mma8452_channels);
  714. indio_dev->available_scan_masks = mma8452_scan_masks;
  715. ret = mma8452_reset(client);
  716. if (ret < 0)
  717. return ret;
  718. data->data_cfg = MMA8452_DATA_CFG_FS_2G;
  719. ret = i2c_smbus_write_byte_data(client, MMA8452_DATA_CFG,
  720. data->data_cfg);
  721. if (ret < 0)
  722. return ret;
  723. /*
  724. * By default set transient threshold to max to avoid events if
  725. * enabling without configuring threshold.
  726. */
  727. ret = i2c_smbus_write_byte_data(client, MMA8452_TRANSIENT_THS,
  728. MMA8452_TRANSIENT_THS_MASK);
  729. if (ret < 0)
  730. return ret;
  731. if (client->irq) {
  732. /*
  733. * Although we enable the transient interrupt source once and
  734. * for all here the transient event detection itself is not
  735. * enabled until userspace asks for it by
  736. * mma8452_write_event_config()
  737. */
  738. int supported_interrupts = MMA8452_INT_DRDY | MMA8452_INT_TRANS;
  739. int enabled_interrupts = MMA8452_INT_TRANS;
  740. /* Assume wired to INT1 pin */
  741. ret = i2c_smbus_write_byte_data(client,
  742. MMA8452_CTRL_REG5,
  743. supported_interrupts);
  744. if (ret < 0)
  745. return ret;
  746. ret = i2c_smbus_write_byte_data(client,
  747. MMA8452_CTRL_REG4,
  748. enabled_interrupts);
  749. if (ret < 0)
  750. return ret;
  751. ret = mma8452_trigger_setup(indio_dev);
  752. if (ret < 0)
  753. return ret;
  754. }
  755. data->ctrl_reg1 = MMA8452_CTRL_ACTIVE |
  756. (MMA8452_CTRL_DR_DEFAULT << MMA8452_CTRL_DR_SHIFT);
  757. ret = i2c_smbus_write_byte_data(client, MMA8452_CTRL_REG1,
  758. data->ctrl_reg1);
  759. if (ret < 0)
  760. goto trigger_cleanup;
  761. ret = iio_triggered_buffer_setup(indio_dev, NULL,
  762. mma8452_trigger_handler, NULL);
  763. if (ret < 0)
  764. goto trigger_cleanup;
  765. if (client->irq) {
  766. ret = devm_request_threaded_irq(&client->dev,
  767. client->irq,
  768. NULL, mma8452_interrupt,
  769. IRQF_TRIGGER_LOW | IRQF_ONESHOT,
  770. client->name, indio_dev);
  771. if (ret)
  772. goto buffer_cleanup;
  773. }
  774. ret = iio_device_register(indio_dev);
  775. if (ret < 0)
  776. goto buffer_cleanup;
  777. return 0;
  778. buffer_cleanup:
  779. iio_triggered_buffer_cleanup(indio_dev);
  780. trigger_cleanup:
  781. mma8452_trigger_cleanup(indio_dev);
  782. return ret;
  783. }
  784. static int mma8452_remove(struct i2c_client *client)
  785. {
  786. struct iio_dev *indio_dev = i2c_get_clientdata(client);
  787. iio_device_unregister(indio_dev);
  788. iio_triggered_buffer_cleanup(indio_dev);
  789. mma8452_trigger_cleanup(indio_dev);
  790. mma8452_standby(iio_priv(indio_dev));
  791. return 0;
  792. }
  793. #ifdef CONFIG_PM_SLEEP
  794. static int mma8452_suspend(struct device *dev)
  795. {
  796. return mma8452_standby(iio_priv(i2c_get_clientdata(
  797. to_i2c_client(dev))));
  798. }
  799. static int mma8452_resume(struct device *dev)
  800. {
  801. return mma8452_active(iio_priv(i2c_get_clientdata(
  802. to_i2c_client(dev))));
  803. }
  804. static SIMPLE_DEV_PM_OPS(mma8452_pm_ops, mma8452_suspend, mma8452_resume);
  805. #define MMA8452_PM_OPS (&mma8452_pm_ops)
  806. #else
  807. #define MMA8452_PM_OPS NULL
  808. #endif
  809. static const struct i2c_device_id mma8452_id[] = {
  810. { "mma8452", 0 },
  811. { }
  812. };
  813. MODULE_DEVICE_TABLE(i2c, mma8452_id);
  814. static const struct of_device_id mma8452_dt_ids[] = {
  815. { .compatible = "fsl,mma8452" },
  816. { }
  817. };
  818. MODULE_DEVICE_TABLE(of, mma8452_dt_ids);
  819. static struct i2c_driver mma8452_driver = {
  820. .driver = {
  821. .name = "mma8452",
  822. .of_match_table = of_match_ptr(mma8452_dt_ids),
  823. .pm = MMA8452_PM_OPS,
  824. },
  825. .probe = mma8452_probe,
  826. .remove = mma8452_remove,
  827. .id_table = mma8452_id,
  828. };
  829. module_i2c_driver(mma8452_driver);
  830. MODULE_AUTHOR("Peter Meerwald <pmeerw@pmeerw.net>");
  831. MODULE_DESCRIPTION("Freescale MMA8452 accelerometer driver");
  832. MODULE_LICENSE("GPL");