st_accel_core.c 22 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006
  1. /*
  2. * STMicroelectronics accelerometers driver
  3. *
  4. * Copyright 2012-2013 STMicroelectronics Inc.
  5. *
  6. * Denis Ciocca <denis.ciocca@st.com>
  7. *
  8. * Licensed under the GPL-2.
  9. */
  10. #include <linux/kernel.h>
  11. #include <linux/module.h>
  12. #include <linux/slab.h>
  13. #include <linux/errno.h>
  14. #include <linux/types.h>
  15. #include <linux/mutex.h>
  16. #include <linux/interrupt.h>
  17. #include <linux/i2c.h>
  18. #include <linux/gpio.h>
  19. #include <linux/irq.h>
  20. #include <linux/iio/iio.h>
  21. #include <linux/iio/sysfs.h>
  22. #include <linux/iio/trigger.h>
  23. #include <linux/iio/buffer.h>
  24. #include <linux/iio/common/st_sensors.h>
  25. #include "st_accel.h"
  26. #define ST_ACCEL_NUMBER_DATA_CHANNELS 3
  27. /* DEFAULT VALUE FOR SENSORS */
  28. #define ST_ACCEL_DEFAULT_OUT_X_L_ADDR 0x28
  29. #define ST_ACCEL_DEFAULT_OUT_Y_L_ADDR 0x2a
  30. #define ST_ACCEL_DEFAULT_OUT_Z_L_ADDR 0x2c
  31. /* FULLSCALE */
  32. #define ST_ACCEL_FS_AVL_2G 2
  33. #define ST_ACCEL_FS_AVL_4G 4
  34. #define ST_ACCEL_FS_AVL_6G 6
  35. #define ST_ACCEL_FS_AVL_8G 8
  36. #define ST_ACCEL_FS_AVL_16G 16
  37. #define ST_ACCEL_FS_AVL_100G 100
  38. #define ST_ACCEL_FS_AVL_200G 200
  39. #define ST_ACCEL_FS_AVL_400G 400
  40. static const struct iio_chan_spec st_accel_8bit_channels[] = {
  41. ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
  42. BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
  43. ST_SENSORS_SCAN_X, 1, IIO_MOD_X, 's', IIO_LE, 8, 8,
  44. ST_ACCEL_DEFAULT_OUT_X_L_ADDR+1),
  45. ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
  46. BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
  47. ST_SENSORS_SCAN_Y, 1, IIO_MOD_Y, 's', IIO_LE, 8, 8,
  48. ST_ACCEL_DEFAULT_OUT_Y_L_ADDR+1),
  49. ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
  50. BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
  51. ST_SENSORS_SCAN_Z, 1, IIO_MOD_Z, 's', IIO_LE, 8, 8,
  52. ST_ACCEL_DEFAULT_OUT_Z_L_ADDR+1),
  53. IIO_CHAN_SOFT_TIMESTAMP(3)
  54. };
  55. static const struct iio_chan_spec st_accel_12bit_channels[] = {
  56. ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
  57. BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
  58. ST_SENSORS_SCAN_X, 1, IIO_MOD_X, 's', IIO_LE, 12, 16,
  59. ST_ACCEL_DEFAULT_OUT_X_L_ADDR),
  60. ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
  61. BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
  62. ST_SENSORS_SCAN_Y, 1, IIO_MOD_Y, 's', IIO_LE, 12, 16,
  63. ST_ACCEL_DEFAULT_OUT_Y_L_ADDR),
  64. ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
  65. BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
  66. ST_SENSORS_SCAN_Z, 1, IIO_MOD_Z, 's', IIO_LE, 12, 16,
  67. ST_ACCEL_DEFAULT_OUT_Z_L_ADDR),
  68. IIO_CHAN_SOFT_TIMESTAMP(3)
  69. };
  70. static const struct iio_chan_spec st_accel_16bit_channels[] = {
  71. ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
  72. BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
  73. ST_SENSORS_SCAN_X, 1, IIO_MOD_X, 's', IIO_LE, 16, 16,
  74. ST_ACCEL_DEFAULT_OUT_X_L_ADDR),
  75. ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
  76. BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
  77. ST_SENSORS_SCAN_Y, 1, IIO_MOD_Y, 's', IIO_LE, 16, 16,
  78. ST_ACCEL_DEFAULT_OUT_Y_L_ADDR),
  79. ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
  80. BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
  81. ST_SENSORS_SCAN_Z, 1, IIO_MOD_Z, 's', IIO_LE, 16, 16,
  82. ST_ACCEL_DEFAULT_OUT_Z_L_ADDR),
  83. IIO_CHAN_SOFT_TIMESTAMP(3)
  84. };
  85. static const struct st_sensor_settings st_accel_sensors_settings[] = {
  86. {
  87. .wai = 0x33,
  88. .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
  89. .sensors_supported = {
  90. [0] = LIS3DH_ACCEL_DEV_NAME,
  91. [1] = LSM303DLHC_ACCEL_DEV_NAME,
  92. [2] = LSM330D_ACCEL_DEV_NAME,
  93. [3] = LSM330DL_ACCEL_DEV_NAME,
  94. [4] = LSM330DLC_ACCEL_DEV_NAME,
  95. [5] = LSM303AGR_ACCEL_DEV_NAME,
  96. [6] = LIS2DH12_ACCEL_DEV_NAME,
  97. },
  98. .ch = (struct iio_chan_spec *)st_accel_12bit_channels,
  99. .odr = {
  100. .addr = 0x20,
  101. .mask = 0xf0,
  102. .odr_avl = {
  103. { .hz = 1, .value = 0x01, },
  104. { .hz = 10, .value = 0x02, },
  105. { .hz = 25, .value = 0x03, },
  106. { .hz = 50, .value = 0x04, },
  107. { .hz = 100, .value = 0x05, },
  108. { .hz = 200, .value = 0x06, },
  109. { .hz = 400, .value = 0x07, },
  110. { .hz = 1600, .value = 0x08, },
  111. },
  112. },
  113. .pw = {
  114. .addr = 0x20,
  115. .mask = 0xf0,
  116. .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
  117. },
  118. .enable_axis = {
  119. .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
  120. .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
  121. },
  122. .fs = {
  123. .addr = 0x23,
  124. .mask = 0x30,
  125. .fs_avl = {
  126. [0] = {
  127. .num = ST_ACCEL_FS_AVL_2G,
  128. .value = 0x00,
  129. .gain = IIO_G_TO_M_S_2(1000),
  130. },
  131. [1] = {
  132. .num = ST_ACCEL_FS_AVL_4G,
  133. .value = 0x01,
  134. .gain = IIO_G_TO_M_S_2(2000),
  135. },
  136. [2] = {
  137. .num = ST_ACCEL_FS_AVL_8G,
  138. .value = 0x02,
  139. .gain = IIO_G_TO_M_S_2(4000),
  140. },
  141. [3] = {
  142. .num = ST_ACCEL_FS_AVL_16G,
  143. .value = 0x03,
  144. .gain = IIO_G_TO_M_S_2(12000),
  145. },
  146. },
  147. },
  148. .bdu = {
  149. .addr = 0x23,
  150. .mask = 0x80,
  151. },
  152. .drdy_irq = {
  153. .int1 = {
  154. .addr = 0x22,
  155. .mask = 0x10,
  156. },
  157. .addr_ihl = 0x25,
  158. .mask_ihl = 0x02,
  159. .stat_drdy = {
  160. .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
  161. .mask = 0x07,
  162. },
  163. },
  164. .sim = {
  165. .addr = 0x23,
  166. .value = BIT(0),
  167. },
  168. .multi_read_bit = true,
  169. .bootime = 2,
  170. },
  171. {
  172. .wai = 0x32,
  173. .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
  174. .sensors_supported = {
  175. [0] = LIS331DLH_ACCEL_DEV_NAME,
  176. [1] = LSM303DL_ACCEL_DEV_NAME,
  177. [2] = LSM303DLH_ACCEL_DEV_NAME,
  178. [3] = LSM303DLM_ACCEL_DEV_NAME,
  179. },
  180. .ch = (struct iio_chan_spec *)st_accel_12bit_channels,
  181. .odr = {
  182. .addr = 0x20,
  183. .mask = 0x18,
  184. .odr_avl = {
  185. { .hz = 50, .value = 0x00, },
  186. { .hz = 100, .value = 0x01, },
  187. { .hz = 400, .value = 0x02, },
  188. { .hz = 1000, .value = 0x03, },
  189. },
  190. },
  191. .pw = {
  192. .addr = 0x20,
  193. .mask = 0xe0,
  194. .value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
  195. .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
  196. },
  197. .enable_axis = {
  198. .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
  199. .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
  200. },
  201. .fs = {
  202. .addr = 0x23,
  203. .mask = 0x30,
  204. .fs_avl = {
  205. [0] = {
  206. .num = ST_ACCEL_FS_AVL_2G,
  207. .value = 0x00,
  208. .gain = IIO_G_TO_M_S_2(1000),
  209. },
  210. [1] = {
  211. .num = ST_ACCEL_FS_AVL_4G,
  212. .value = 0x01,
  213. .gain = IIO_G_TO_M_S_2(2000),
  214. },
  215. [2] = {
  216. .num = ST_ACCEL_FS_AVL_8G,
  217. .value = 0x03,
  218. .gain = IIO_G_TO_M_S_2(3900),
  219. },
  220. },
  221. },
  222. .bdu = {
  223. .addr = 0x23,
  224. .mask = 0x80,
  225. },
  226. .drdy_irq = {
  227. .int1 = {
  228. .addr = 0x22,
  229. .mask = 0x02,
  230. .addr_od = 0x22,
  231. .mask_od = 0x40,
  232. },
  233. .int2 = {
  234. .addr = 0x22,
  235. .mask = 0x10,
  236. .addr_od = 0x22,
  237. .mask_od = 0x40,
  238. },
  239. .addr_ihl = 0x22,
  240. .mask_ihl = 0x80,
  241. .stat_drdy = {
  242. .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
  243. .mask = 0x07,
  244. },
  245. },
  246. .sim = {
  247. .addr = 0x23,
  248. .value = BIT(0),
  249. },
  250. .multi_read_bit = true,
  251. .bootime = 2,
  252. },
  253. {
  254. .wai = 0x40,
  255. .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
  256. .sensors_supported = {
  257. [0] = LSM330_ACCEL_DEV_NAME,
  258. },
  259. .ch = (struct iio_chan_spec *)st_accel_16bit_channels,
  260. .odr = {
  261. .addr = 0x20,
  262. .mask = 0xf0,
  263. .odr_avl = {
  264. { .hz = 3, .value = 0x01, },
  265. { .hz = 6, .value = 0x02, },
  266. { .hz = 12, .value = 0x03, },
  267. { .hz = 25, .value = 0x04, },
  268. { .hz = 50, .value = 0x05, },
  269. { .hz = 100, .value = 0x06, },
  270. { .hz = 200, .value = 0x07, },
  271. { .hz = 400, .value = 0x08, },
  272. { .hz = 800, .value = 0x09, },
  273. { .hz = 1600, .value = 0x0a, },
  274. },
  275. },
  276. .pw = {
  277. .addr = 0x20,
  278. .mask = 0xf0,
  279. .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
  280. },
  281. .enable_axis = {
  282. .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
  283. .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
  284. },
  285. .fs = {
  286. .addr = 0x24,
  287. .mask = 0x38,
  288. .fs_avl = {
  289. [0] = {
  290. .num = ST_ACCEL_FS_AVL_2G,
  291. .value = 0x00,
  292. .gain = IIO_G_TO_M_S_2(61),
  293. },
  294. [1] = {
  295. .num = ST_ACCEL_FS_AVL_4G,
  296. .value = 0x01,
  297. .gain = IIO_G_TO_M_S_2(122),
  298. },
  299. [2] = {
  300. .num = ST_ACCEL_FS_AVL_6G,
  301. .value = 0x02,
  302. .gain = IIO_G_TO_M_S_2(183),
  303. },
  304. [3] = {
  305. .num = ST_ACCEL_FS_AVL_8G,
  306. .value = 0x03,
  307. .gain = IIO_G_TO_M_S_2(244),
  308. },
  309. [4] = {
  310. .num = ST_ACCEL_FS_AVL_16G,
  311. .value = 0x04,
  312. .gain = IIO_G_TO_M_S_2(732),
  313. },
  314. },
  315. },
  316. .bdu = {
  317. .addr = 0x20,
  318. .mask = 0x08,
  319. },
  320. .drdy_irq = {
  321. .int1 = {
  322. .addr = 0x23,
  323. .mask = 0x80,
  324. },
  325. .addr_ihl = 0x23,
  326. .mask_ihl = 0x40,
  327. .stat_drdy = {
  328. .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
  329. .mask = 0x07,
  330. },
  331. .ig1 = {
  332. .en_addr = 0x23,
  333. .en_mask = 0x08,
  334. },
  335. },
  336. .sim = {
  337. .addr = 0x24,
  338. .value = BIT(0),
  339. },
  340. .multi_read_bit = false,
  341. .bootime = 2,
  342. },
  343. {
  344. .wai = 0x3a,
  345. .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
  346. .sensors_supported = {
  347. [0] = LIS3LV02DL_ACCEL_DEV_NAME,
  348. },
  349. .ch = (struct iio_chan_spec *)st_accel_12bit_channels,
  350. .odr = {
  351. .addr = 0x20,
  352. .mask = 0x30, /* DF1 and DF0 */
  353. .odr_avl = {
  354. { .hz = 40, .value = 0x00, },
  355. { .hz = 160, .value = 0x01, },
  356. { .hz = 640, .value = 0x02, },
  357. { .hz = 2560, .value = 0x03, },
  358. },
  359. },
  360. .pw = {
  361. .addr = 0x20,
  362. .mask = 0xc0,
  363. .value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
  364. .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
  365. },
  366. .enable_axis = {
  367. .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
  368. .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
  369. },
  370. .fs = {
  371. .addr = 0x21,
  372. .mask = 0x80,
  373. .fs_avl = {
  374. [0] = {
  375. .num = ST_ACCEL_FS_AVL_2G,
  376. .value = 0x00,
  377. .gain = IIO_G_TO_M_S_2(1000),
  378. },
  379. [1] = {
  380. .num = ST_ACCEL_FS_AVL_6G,
  381. .value = 0x01,
  382. .gain = IIO_G_TO_M_S_2(3000),
  383. },
  384. },
  385. },
  386. .bdu = {
  387. .addr = 0x21,
  388. .mask = 0x40,
  389. },
  390. /*
  391. * Data Alignment Setting - needs to be set to get
  392. * left-justified data like all other sensors.
  393. */
  394. .das = {
  395. .addr = 0x21,
  396. .mask = 0x01,
  397. },
  398. .drdy_irq = {
  399. .int1 = {
  400. .addr = 0x21,
  401. .mask = 0x04,
  402. },
  403. .stat_drdy = {
  404. .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
  405. .mask = 0x07,
  406. },
  407. },
  408. .sim = {
  409. .addr = 0x21,
  410. .value = BIT(1),
  411. },
  412. .multi_read_bit = true,
  413. .bootime = 2, /* guess */
  414. },
  415. {
  416. .wai = 0x3b,
  417. .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
  418. .sensors_supported = {
  419. [0] = LIS331DL_ACCEL_DEV_NAME,
  420. },
  421. .ch = (struct iio_chan_spec *)st_accel_8bit_channels,
  422. .odr = {
  423. .addr = 0x20,
  424. .mask = 0x80,
  425. .odr_avl = {
  426. { .hz = 100, .value = 0x00, },
  427. { .hz = 400, .value = 0x01, },
  428. },
  429. },
  430. .pw = {
  431. .addr = 0x20,
  432. .mask = 0x40,
  433. .value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
  434. .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
  435. },
  436. .enable_axis = {
  437. .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
  438. .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
  439. },
  440. .fs = {
  441. .addr = 0x20,
  442. .mask = 0x20,
  443. /*
  444. * TODO: check these resulting gain settings, these are
  445. * not in the datsheet
  446. */
  447. .fs_avl = {
  448. [0] = {
  449. .num = ST_ACCEL_FS_AVL_2G,
  450. .value = 0x00,
  451. .gain = IIO_G_TO_M_S_2(18000),
  452. },
  453. [1] = {
  454. .num = ST_ACCEL_FS_AVL_8G,
  455. .value = 0x01,
  456. .gain = IIO_G_TO_M_S_2(72000),
  457. },
  458. },
  459. },
  460. .drdy_irq = {
  461. .int1 = {
  462. .addr = 0x22,
  463. .mask = 0x04,
  464. .addr_od = 0x22,
  465. .mask_od = 0x40,
  466. },
  467. .int2 = {
  468. .addr = 0x22,
  469. .mask = 0x20,
  470. .addr_od = 0x22,
  471. .mask_od = 0x40,
  472. },
  473. .addr_ihl = 0x22,
  474. .mask_ihl = 0x80,
  475. .stat_drdy = {
  476. .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
  477. .mask = 0x07,
  478. },
  479. },
  480. .sim = {
  481. .addr = 0x21,
  482. .value = BIT(7),
  483. },
  484. .multi_read_bit = false,
  485. .bootime = 2, /* guess */
  486. },
  487. {
  488. .wai = 0x32,
  489. .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
  490. .sensors_supported = {
  491. [0] = H3LIS331DL_ACCEL_DEV_NAME,
  492. },
  493. .ch = (struct iio_chan_spec *)st_accel_12bit_channels,
  494. .odr = {
  495. .addr = 0x20,
  496. .mask = 0x18,
  497. .odr_avl = {
  498. { .hz = 50, .value = 0x00, },
  499. { .hz = 100, .value = 0x01, },
  500. { .hz = 400, .value = 0x02, },
  501. { .hz = 1000, .value = 0x03, },
  502. },
  503. },
  504. .pw = {
  505. .addr = 0x20,
  506. .mask = 0x20,
  507. .value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
  508. .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
  509. },
  510. .enable_axis = {
  511. .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
  512. .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
  513. },
  514. .fs = {
  515. .addr = 0x23,
  516. .mask = 0x30,
  517. .fs_avl = {
  518. [0] = {
  519. .num = ST_ACCEL_FS_AVL_100G,
  520. .value = 0x00,
  521. .gain = IIO_G_TO_M_S_2(49000),
  522. },
  523. [1] = {
  524. .num = ST_ACCEL_FS_AVL_200G,
  525. .value = 0x01,
  526. .gain = IIO_G_TO_M_S_2(98000),
  527. },
  528. [2] = {
  529. .num = ST_ACCEL_FS_AVL_400G,
  530. .value = 0x03,
  531. .gain = IIO_G_TO_M_S_2(195000),
  532. },
  533. },
  534. },
  535. .bdu = {
  536. .addr = 0x23,
  537. .mask = 0x80,
  538. },
  539. .drdy_irq = {
  540. .int1 = {
  541. .addr = 0x22,
  542. .mask = 0x02,
  543. },
  544. .int2 = {
  545. .addr = 0x22,
  546. .mask = 0x10,
  547. },
  548. .addr_ihl = 0x22,
  549. .mask_ihl = 0x80,
  550. },
  551. .sim = {
  552. .addr = 0x23,
  553. .value = BIT(0),
  554. },
  555. .multi_read_bit = true,
  556. .bootime = 2,
  557. },
  558. {
  559. /* No WAI register present */
  560. .sensors_supported = {
  561. [0] = LIS3L02DQ_ACCEL_DEV_NAME,
  562. },
  563. .ch = (struct iio_chan_spec *)st_accel_12bit_channels,
  564. .odr = {
  565. .addr = 0x20,
  566. .mask = 0x30,
  567. .odr_avl = {
  568. { .hz = 280, .value = 0x00, },
  569. { .hz = 560, .value = 0x01, },
  570. { .hz = 1120, .value = 0x02, },
  571. { .hz = 4480, .value = 0x03, },
  572. },
  573. },
  574. .pw = {
  575. .addr = 0x20,
  576. .mask = 0xc0,
  577. .value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
  578. .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
  579. },
  580. .enable_axis = {
  581. .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
  582. .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
  583. },
  584. .fs = {
  585. .fs_avl = {
  586. [0] = {
  587. .num = ST_ACCEL_FS_AVL_2G,
  588. .gain = IIO_G_TO_M_S_2(488),
  589. },
  590. },
  591. },
  592. /*
  593. * The part has a BDU bit but if set the data is never
  594. * updated so don't set it.
  595. */
  596. .bdu = {
  597. },
  598. .drdy_irq = {
  599. .int1 = {
  600. .addr = 0x21,
  601. .mask = 0x04,
  602. },
  603. .stat_drdy = {
  604. .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
  605. .mask = 0x07,
  606. },
  607. },
  608. .sim = {
  609. .addr = 0x21,
  610. .value = BIT(1),
  611. },
  612. .multi_read_bit = false,
  613. .bootime = 2,
  614. },
  615. {
  616. .wai = 0x33,
  617. .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
  618. .sensors_supported = {
  619. [0] = LNG2DM_ACCEL_DEV_NAME,
  620. },
  621. .ch = (struct iio_chan_spec *)st_accel_8bit_channels,
  622. .odr = {
  623. .addr = 0x20,
  624. .mask = 0xf0,
  625. .odr_avl = {
  626. { .hz = 1, .value = 0x01, },
  627. { .hz = 10, .value = 0x02, },
  628. { .hz = 25, .value = 0x03, },
  629. { .hz = 50, .value = 0x04, },
  630. { .hz = 100, .value = 0x05, },
  631. { .hz = 200, .value = 0x06, },
  632. { .hz = 400, .value = 0x07, },
  633. { .hz = 1600, .value = 0x08, },
  634. },
  635. },
  636. .pw = {
  637. .addr = 0x20,
  638. .mask = 0xf0,
  639. .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
  640. },
  641. .enable_axis = {
  642. .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
  643. .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
  644. },
  645. .fs = {
  646. .addr = 0x23,
  647. .mask = 0x30,
  648. .fs_avl = {
  649. [0] = {
  650. .num = ST_ACCEL_FS_AVL_2G,
  651. .value = 0x00,
  652. .gain = IIO_G_TO_M_S_2(15600),
  653. },
  654. [1] = {
  655. .num = ST_ACCEL_FS_AVL_4G,
  656. .value = 0x01,
  657. .gain = IIO_G_TO_M_S_2(31200),
  658. },
  659. [2] = {
  660. .num = ST_ACCEL_FS_AVL_8G,
  661. .value = 0x02,
  662. .gain = IIO_G_TO_M_S_2(62500),
  663. },
  664. [3] = {
  665. .num = ST_ACCEL_FS_AVL_16G,
  666. .value = 0x03,
  667. .gain = IIO_G_TO_M_S_2(187500),
  668. },
  669. },
  670. },
  671. .drdy_irq = {
  672. .int1 = {
  673. .addr = 0x22,
  674. .mask = 0x10,
  675. },
  676. .addr_ihl = 0x25,
  677. .mask_ihl = 0x02,
  678. .stat_drdy = {
  679. .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
  680. .mask = 0x07,
  681. },
  682. },
  683. .sim = {
  684. .addr = 0x23,
  685. .value = BIT(0),
  686. },
  687. .multi_read_bit = true,
  688. .bootime = 2,
  689. },
  690. {
  691. .wai = 0x44,
  692. .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
  693. .sensors_supported = {
  694. [0] = LIS2DW12_ACCEL_DEV_NAME,
  695. },
  696. .ch = (struct iio_chan_spec *)st_accel_12bit_channels,
  697. .odr = {
  698. .addr = 0x20,
  699. .mask = 0xf0,
  700. .odr_avl = {
  701. { .hz = 1, .value = 0x01, },
  702. { .hz = 12, .value = 0x02, },
  703. { .hz = 25, .value = 0x03, },
  704. { .hz = 50, .value = 0x04, },
  705. { .hz = 100, .value = 0x05, },
  706. { .hz = 200, .value = 0x06, },
  707. },
  708. },
  709. .pw = {
  710. .addr = 0x20,
  711. .mask = 0xf0,
  712. .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
  713. },
  714. .fs = {
  715. .addr = 0x25,
  716. .mask = 0x30,
  717. .fs_avl = {
  718. [0] = {
  719. .num = ST_ACCEL_FS_AVL_2G,
  720. .value = 0x00,
  721. .gain = IIO_G_TO_M_S_2(976),
  722. },
  723. [1] = {
  724. .num = ST_ACCEL_FS_AVL_4G,
  725. .value = 0x01,
  726. .gain = IIO_G_TO_M_S_2(1952),
  727. },
  728. [2] = {
  729. .num = ST_ACCEL_FS_AVL_8G,
  730. .value = 0x02,
  731. .gain = IIO_G_TO_M_S_2(3904),
  732. },
  733. [3] = {
  734. .num = ST_ACCEL_FS_AVL_16G,
  735. .value = 0x03,
  736. .gain = IIO_G_TO_M_S_2(7808),
  737. },
  738. },
  739. },
  740. .bdu = {
  741. .addr = 0x21,
  742. .mask = 0x08,
  743. },
  744. .drdy_irq = {
  745. .int1 = {
  746. .addr = 0x23,
  747. .mask = 0x01,
  748. .addr_od = 0x22,
  749. .mask_od = 0x20,
  750. },
  751. .int2 = {
  752. .addr = 0x24,
  753. .mask = 0x01,
  754. .addr_od = 0x22,
  755. .mask_od = 0x20,
  756. },
  757. .addr_ihl = 0x22,
  758. .mask_ihl = 0x08,
  759. .stat_drdy = {
  760. .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
  761. .mask = 0x01,
  762. },
  763. },
  764. .sim = {
  765. .addr = 0x21,
  766. .value = BIT(0),
  767. },
  768. .multi_read_bit = false,
  769. .bootime = 2,
  770. },
  771. {
  772. .wai = 0x11,
  773. .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
  774. .sensors_supported = {
  775. [0] = LIS3DHH_ACCEL_DEV_NAME,
  776. },
  777. .ch = (struct iio_chan_spec *)st_accel_16bit_channels,
  778. .odr = {
  779. /* just ODR = 1100Hz available */
  780. .odr_avl = {
  781. { .hz = 1100, .value = 0x00, },
  782. },
  783. },
  784. .pw = {
  785. .addr = 0x20,
  786. .mask = 0x80,
  787. .value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
  788. .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
  789. },
  790. .fs = {
  791. .fs_avl = {
  792. [0] = {
  793. .num = ST_ACCEL_FS_AVL_2G,
  794. .gain = IIO_G_TO_M_S_2(76),
  795. },
  796. },
  797. },
  798. .bdu = {
  799. .addr = 0x20,
  800. .mask = 0x01,
  801. },
  802. .drdy_irq = {
  803. .int1 = {
  804. .addr = 0x21,
  805. .mask = 0x80,
  806. .addr_od = 0x23,
  807. .mask_od = 0x04,
  808. },
  809. .int2 = {
  810. .addr = 0x22,
  811. .mask = 0x80,
  812. .addr_od = 0x23,
  813. .mask_od = 0x08,
  814. },
  815. .stat_drdy = {
  816. .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
  817. .mask = 0x07,
  818. },
  819. },
  820. .multi_read_bit = false,
  821. .bootime = 2,
  822. },
  823. };
  824. static int st_accel_read_raw(struct iio_dev *indio_dev,
  825. struct iio_chan_spec const *ch, int *val,
  826. int *val2, long mask)
  827. {
  828. int err;
  829. struct st_sensor_data *adata = iio_priv(indio_dev);
  830. switch (mask) {
  831. case IIO_CHAN_INFO_RAW:
  832. err = st_sensors_read_info_raw(indio_dev, ch, val);
  833. if (err < 0)
  834. goto read_error;
  835. return IIO_VAL_INT;
  836. case IIO_CHAN_INFO_SCALE:
  837. *val = adata->current_fullscale->gain / 1000000;
  838. *val2 = adata->current_fullscale->gain % 1000000;
  839. return IIO_VAL_INT_PLUS_MICRO;
  840. case IIO_CHAN_INFO_SAMP_FREQ:
  841. *val = adata->odr;
  842. return IIO_VAL_INT;
  843. default:
  844. return -EINVAL;
  845. }
  846. read_error:
  847. return err;
  848. }
  849. static int st_accel_write_raw(struct iio_dev *indio_dev,
  850. struct iio_chan_spec const *chan, int val, int val2, long mask)
  851. {
  852. int err;
  853. switch (mask) {
  854. case IIO_CHAN_INFO_SCALE: {
  855. int gain;
  856. gain = val * 1000000 + val2;
  857. err = st_sensors_set_fullscale_by_gain(indio_dev, gain);
  858. break;
  859. }
  860. case IIO_CHAN_INFO_SAMP_FREQ:
  861. if (val2)
  862. return -EINVAL;
  863. mutex_lock(&indio_dev->mlock);
  864. err = st_sensors_set_odr(indio_dev, val);
  865. mutex_unlock(&indio_dev->mlock);
  866. return err;
  867. default:
  868. return -EINVAL;
  869. }
  870. return err;
  871. }
  872. static ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL();
  873. static ST_SENSORS_DEV_ATTR_SCALE_AVAIL(in_accel_scale_available);
  874. static struct attribute *st_accel_attributes[] = {
  875. &iio_dev_attr_sampling_frequency_available.dev_attr.attr,
  876. &iio_dev_attr_in_accel_scale_available.dev_attr.attr,
  877. NULL,
  878. };
  879. static const struct attribute_group st_accel_attribute_group = {
  880. .attrs = st_accel_attributes,
  881. };
  882. static const struct iio_info accel_info = {
  883. .attrs = &st_accel_attribute_group,
  884. .read_raw = &st_accel_read_raw,
  885. .write_raw = &st_accel_write_raw,
  886. .debugfs_reg_access = &st_sensors_debugfs_reg_access,
  887. };
  888. #ifdef CONFIG_IIO_TRIGGER
  889. static const struct iio_trigger_ops st_accel_trigger_ops = {
  890. .set_trigger_state = ST_ACCEL_TRIGGER_SET_STATE,
  891. .validate_device = st_sensors_validate_device,
  892. };
  893. #define ST_ACCEL_TRIGGER_OPS (&st_accel_trigger_ops)
  894. #else
  895. #define ST_ACCEL_TRIGGER_OPS NULL
  896. #endif
  897. int st_accel_common_probe(struct iio_dev *indio_dev)
  898. {
  899. struct st_sensor_data *adata = iio_priv(indio_dev);
  900. struct st_sensors_platform_data *pdata =
  901. (struct st_sensors_platform_data *)adata->dev->platform_data;
  902. int irq = adata->get_irq_data_ready(indio_dev);
  903. int err;
  904. indio_dev->modes = INDIO_DIRECT_MODE;
  905. indio_dev->info = &accel_info;
  906. mutex_init(&adata->tb.buf_lock);
  907. err = st_sensors_power_enable(indio_dev);
  908. if (err)
  909. return err;
  910. err = st_sensors_check_device_support(indio_dev,
  911. ARRAY_SIZE(st_accel_sensors_settings),
  912. st_accel_sensors_settings);
  913. if (err < 0)
  914. goto st_accel_power_off;
  915. adata->num_data_channels = ST_ACCEL_NUMBER_DATA_CHANNELS;
  916. adata->multiread_bit = adata->sensor_settings->multi_read_bit;
  917. indio_dev->channels = adata->sensor_settings->ch;
  918. indio_dev->num_channels = ST_SENSORS_NUMBER_ALL_CHANNELS;
  919. adata->current_fullscale = (struct st_sensor_fullscale_avl *)
  920. &adata->sensor_settings->fs.fs_avl[0];
  921. adata->odr = adata->sensor_settings->odr.odr_avl[0].hz;
  922. if (!pdata)
  923. pdata = (struct st_sensors_platform_data *)&default_accel_pdata;
  924. err = st_sensors_init_sensor(indio_dev, pdata);
  925. if (err < 0)
  926. goto st_accel_power_off;
  927. err = st_accel_allocate_ring(indio_dev);
  928. if (err < 0)
  929. goto st_accel_power_off;
  930. if (irq > 0) {
  931. err = st_sensors_allocate_trigger(indio_dev,
  932. ST_ACCEL_TRIGGER_OPS);
  933. if (err < 0)
  934. goto st_accel_probe_trigger_error;
  935. }
  936. err = iio_device_register(indio_dev);
  937. if (err)
  938. goto st_accel_device_register_error;
  939. dev_info(&indio_dev->dev, "registered accelerometer %s\n",
  940. indio_dev->name);
  941. return 0;
  942. st_accel_device_register_error:
  943. if (irq > 0)
  944. st_sensors_deallocate_trigger(indio_dev);
  945. st_accel_probe_trigger_error:
  946. st_accel_deallocate_ring(indio_dev);
  947. st_accel_power_off:
  948. st_sensors_power_disable(indio_dev);
  949. return err;
  950. }
  951. EXPORT_SYMBOL(st_accel_common_probe);
  952. void st_accel_common_remove(struct iio_dev *indio_dev)
  953. {
  954. struct st_sensor_data *adata = iio_priv(indio_dev);
  955. st_sensors_power_disable(indio_dev);
  956. iio_device_unregister(indio_dev);
  957. if (adata->get_irq_data_ready(indio_dev) > 0)
  958. st_sensors_deallocate_trigger(indio_dev);
  959. st_accel_deallocate_ring(indio_dev);
  960. }
  961. EXPORT_SYMBOL(st_accel_common_remove);
  962. MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");
  963. MODULE_DESCRIPTION("STMicroelectronics accelerometers driver");
  964. MODULE_LICENSE("GPL v2");