st_accel_core.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914
  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. /* CUSTOM VALUES FOR SENSOR 1 */
  41. #define ST_ACCEL_1_WAI_EXP 0x33
  42. #define ST_ACCEL_1_ODR_ADDR 0x20
  43. #define ST_ACCEL_1_ODR_MASK 0xf0
  44. #define ST_ACCEL_1_ODR_AVL_1HZ_VAL 0x01
  45. #define ST_ACCEL_1_ODR_AVL_10HZ_VAL 0x02
  46. #define ST_ACCEL_1_ODR_AVL_25HZ_VAL 0x03
  47. #define ST_ACCEL_1_ODR_AVL_50HZ_VAL 0x04
  48. #define ST_ACCEL_1_ODR_AVL_100HZ_VAL 0x05
  49. #define ST_ACCEL_1_ODR_AVL_200HZ_VAL 0x06
  50. #define ST_ACCEL_1_ODR_AVL_400HZ_VAL 0x07
  51. #define ST_ACCEL_1_ODR_AVL_1600HZ_VAL 0x08
  52. #define ST_ACCEL_1_FS_ADDR 0x23
  53. #define ST_ACCEL_1_FS_MASK 0x30
  54. #define ST_ACCEL_1_FS_AVL_2_VAL 0x00
  55. #define ST_ACCEL_1_FS_AVL_4_VAL 0x01
  56. #define ST_ACCEL_1_FS_AVL_8_VAL 0x02
  57. #define ST_ACCEL_1_FS_AVL_16_VAL 0x03
  58. #define ST_ACCEL_1_FS_AVL_2_GAIN IIO_G_TO_M_S_2(1000)
  59. #define ST_ACCEL_1_FS_AVL_4_GAIN IIO_G_TO_M_S_2(2000)
  60. #define ST_ACCEL_1_FS_AVL_8_GAIN IIO_G_TO_M_S_2(4000)
  61. #define ST_ACCEL_1_FS_AVL_16_GAIN IIO_G_TO_M_S_2(12000)
  62. #define ST_ACCEL_1_BDU_ADDR 0x23
  63. #define ST_ACCEL_1_BDU_MASK 0x80
  64. #define ST_ACCEL_1_DRDY_IRQ_ADDR 0x22
  65. #define ST_ACCEL_1_DRDY_IRQ_INT1_MASK 0x10
  66. #define ST_ACCEL_1_DRDY_IRQ_INT2_MASK 0x08
  67. #define ST_ACCEL_1_IHL_IRQ_ADDR 0x25
  68. #define ST_ACCEL_1_IHL_IRQ_MASK 0x02
  69. #define ST_ACCEL_1_MULTIREAD_BIT true
  70. /* CUSTOM VALUES FOR SENSOR 2 */
  71. #define ST_ACCEL_2_WAI_EXP 0x32
  72. #define ST_ACCEL_2_ODR_ADDR 0x20
  73. #define ST_ACCEL_2_ODR_MASK 0x18
  74. #define ST_ACCEL_2_ODR_AVL_50HZ_VAL 0x00
  75. #define ST_ACCEL_2_ODR_AVL_100HZ_VAL 0x01
  76. #define ST_ACCEL_2_ODR_AVL_400HZ_VAL 0x02
  77. #define ST_ACCEL_2_ODR_AVL_1000HZ_VAL 0x03
  78. #define ST_ACCEL_2_PW_ADDR 0x20
  79. #define ST_ACCEL_2_PW_MASK 0xe0
  80. #define ST_ACCEL_2_FS_ADDR 0x23
  81. #define ST_ACCEL_2_FS_MASK 0x30
  82. #define ST_ACCEL_2_FS_AVL_2_VAL 0X00
  83. #define ST_ACCEL_2_FS_AVL_4_VAL 0X01
  84. #define ST_ACCEL_2_FS_AVL_8_VAL 0x03
  85. #define ST_ACCEL_2_FS_AVL_2_GAIN IIO_G_TO_M_S_2(1000)
  86. #define ST_ACCEL_2_FS_AVL_4_GAIN IIO_G_TO_M_S_2(2000)
  87. #define ST_ACCEL_2_FS_AVL_8_GAIN IIO_G_TO_M_S_2(3900)
  88. #define ST_ACCEL_2_BDU_ADDR 0x23
  89. #define ST_ACCEL_2_BDU_MASK 0x80
  90. #define ST_ACCEL_2_DRDY_IRQ_ADDR 0x22
  91. #define ST_ACCEL_2_DRDY_IRQ_INT1_MASK 0x02
  92. #define ST_ACCEL_2_DRDY_IRQ_INT2_MASK 0x10
  93. #define ST_ACCEL_2_IHL_IRQ_ADDR 0x22
  94. #define ST_ACCEL_2_IHL_IRQ_MASK 0x80
  95. #define ST_ACCEL_2_OD_IRQ_ADDR 0x22
  96. #define ST_ACCEL_2_OD_IRQ_MASK 0x40
  97. #define ST_ACCEL_2_MULTIREAD_BIT true
  98. /* CUSTOM VALUES FOR SENSOR 3 */
  99. #define ST_ACCEL_3_WAI_EXP 0x40
  100. #define ST_ACCEL_3_ODR_ADDR 0x20
  101. #define ST_ACCEL_3_ODR_MASK 0xf0
  102. #define ST_ACCEL_3_ODR_AVL_3HZ_VAL 0x01
  103. #define ST_ACCEL_3_ODR_AVL_6HZ_VAL 0x02
  104. #define ST_ACCEL_3_ODR_AVL_12HZ_VAL 0x03
  105. #define ST_ACCEL_3_ODR_AVL_25HZ_VAL 0x04
  106. #define ST_ACCEL_3_ODR_AVL_50HZ_VAL 0x05
  107. #define ST_ACCEL_3_ODR_AVL_100HZ_VAL 0x06
  108. #define ST_ACCEL_3_ODR_AVL_200HZ_VAL 0x07
  109. #define ST_ACCEL_3_ODR_AVL_400HZ_VAL 0x08
  110. #define ST_ACCEL_3_ODR_AVL_800HZ_VAL 0x09
  111. #define ST_ACCEL_3_ODR_AVL_1600HZ_VAL 0x0a
  112. #define ST_ACCEL_3_FS_ADDR 0x24
  113. #define ST_ACCEL_3_FS_MASK 0x38
  114. #define ST_ACCEL_3_FS_AVL_2_VAL 0X00
  115. #define ST_ACCEL_3_FS_AVL_4_VAL 0X01
  116. #define ST_ACCEL_3_FS_AVL_6_VAL 0x02
  117. #define ST_ACCEL_3_FS_AVL_8_VAL 0x03
  118. #define ST_ACCEL_3_FS_AVL_16_VAL 0x04
  119. #define ST_ACCEL_3_FS_AVL_2_GAIN IIO_G_TO_M_S_2(61)
  120. #define ST_ACCEL_3_FS_AVL_4_GAIN IIO_G_TO_M_S_2(122)
  121. #define ST_ACCEL_3_FS_AVL_6_GAIN IIO_G_TO_M_S_2(183)
  122. #define ST_ACCEL_3_FS_AVL_8_GAIN IIO_G_TO_M_S_2(244)
  123. #define ST_ACCEL_3_FS_AVL_16_GAIN IIO_G_TO_M_S_2(732)
  124. #define ST_ACCEL_3_BDU_ADDR 0x20
  125. #define ST_ACCEL_3_BDU_MASK 0x08
  126. #define ST_ACCEL_3_DRDY_IRQ_ADDR 0x23
  127. #define ST_ACCEL_3_DRDY_IRQ_INT1_MASK 0x80
  128. #define ST_ACCEL_3_DRDY_IRQ_INT2_MASK 0x00
  129. #define ST_ACCEL_3_IHL_IRQ_ADDR 0x23
  130. #define ST_ACCEL_3_IHL_IRQ_MASK 0x40
  131. #define ST_ACCEL_3_IG1_EN_ADDR 0x23
  132. #define ST_ACCEL_3_IG1_EN_MASK 0x08
  133. #define ST_ACCEL_3_MULTIREAD_BIT false
  134. /* CUSTOM VALUES FOR SENSOR 4 */
  135. #define ST_ACCEL_4_WAI_EXP 0x3a
  136. #define ST_ACCEL_4_ODR_ADDR 0x20
  137. #define ST_ACCEL_4_ODR_MASK 0x30 /* DF1 and DF0 */
  138. #define ST_ACCEL_4_ODR_AVL_40HZ_VAL 0x00
  139. #define ST_ACCEL_4_ODR_AVL_160HZ_VAL 0x01
  140. #define ST_ACCEL_4_ODR_AVL_640HZ_VAL 0x02
  141. #define ST_ACCEL_4_ODR_AVL_2560HZ_VAL 0x03
  142. #define ST_ACCEL_4_PW_ADDR 0x20
  143. #define ST_ACCEL_4_PW_MASK 0xc0
  144. #define ST_ACCEL_4_FS_ADDR 0x21
  145. #define ST_ACCEL_4_FS_MASK 0x80
  146. #define ST_ACCEL_4_FS_AVL_2_VAL 0X00
  147. #define ST_ACCEL_4_FS_AVL_6_VAL 0X01
  148. #define ST_ACCEL_4_FS_AVL_2_GAIN IIO_G_TO_M_S_2(1000)
  149. #define ST_ACCEL_4_FS_AVL_6_GAIN IIO_G_TO_M_S_2(3000)
  150. #define ST_ACCEL_4_BDU_ADDR 0x21
  151. #define ST_ACCEL_4_BDU_MASK 0x40
  152. #define ST_ACCEL_4_DRDY_IRQ_ADDR 0x21
  153. #define ST_ACCEL_4_DRDY_IRQ_INT1_MASK 0x04
  154. #define ST_ACCEL_4_MULTIREAD_BIT true
  155. /* CUSTOM VALUES FOR SENSOR 5 */
  156. #define ST_ACCEL_5_WAI_EXP 0x3b
  157. #define ST_ACCEL_5_ODR_ADDR 0x20
  158. #define ST_ACCEL_5_ODR_MASK 0x80
  159. #define ST_ACCEL_5_ODR_AVL_100HZ_VAL 0x00
  160. #define ST_ACCEL_5_ODR_AVL_400HZ_VAL 0x01
  161. #define ST_ACCEL_5_PW_ADDR 0x20
  162. #define ST_ACCEL_5_PW_MASK 0x40
  163. #define ST_ACCEL_5_FS_ADDR 0x20
  164. #define ST_ACCEL_5_FS_MASK 0x20
  165. #define ST_ACCEL_5_FS_AVL_2_VAL 0X00
  166. #define ST_ACCEL_5_FS_AVL_8_VAL 0X01
  167. /* TODO: check these resulting gain settings, these are not in the datsheet */
  168. #define ST_ACCEL_5_FS_AVL_2_GAIN IIO_G_TO_M_S_2(18000)
  169. #define ST_ACCEL_5_FS_AVL_8_GAIN IIO_G_TO_M_S_2(72000)
  170. #define ST_ACCEL_5_DRDY_IRQ_ADDR 0x22
  171. #define ST_ACCEL_5_DRDY_IRQ_INT1_MASK 0x04
  172. #define ST_ACCEL_5_DRDY_IRQ_INT2_MASK 0x20
  173. #define ST_ACCEL_5_IHL_IRQ_ADDR 0x22
  174. #define ST_ACCEL_5_IHL_IRQ_MASK 0x80
  175. #define ST_ACCEL_5_OD_IRQ_ADDR 0x22
  176. #define ST_ACCEL_5_OD_IRQ_MASK 0x40
  177. #define ST_ACCEL_5_IG1_EN_ADDR 0x21
  178. #define ST_ACCEL_5_IG1_EN_MASK 0x08
  179. #define ST_ACCEL_5_MULTIREAD_BIT false
  180. /* CUSTOM VALUES FOR SENSOR 6 */
  181. #define ST_ACCEL_6_WAI_EXP 0x32
  182. #define ST_ACCEL_6_ODR_ADDR 0x20
  183. #define ST_ACCEL_6_ODR_MASK 0x18
  184. #define ST_ACCEL_6_ODR_AVL_50HZ_VAL 0x00
  185. #define ST_ACCEL_6_ODR_AVL_100HZ_VAL 0x01
  186. #define ST_ACCEL_6_ODR_AVL_400HZ_VAL 0x02
  187. #define ST_ACCEL_6_ODR_AVL_1000HZ_VAL 0x03
  188. #define ST_ACCEL_6_PW_ADDR 0x20
  189. #define ST_ACCEL_6_PW_MASK 0x20
  190. #define ST_ACCEL_6_FS_ADDR 0x23
  191. #define ST_ACCEL_6_FS_MASK 0x30
  192. #define ST_ACCEL_6_FS_AVL_100_VAL 0x00
  193. #define ST_ACCEL_6_FS_AVL_200_VAL 0x01
  194. #define ST_ACCEL_6_FS_AVL_400_VAL 0x03
  195. #define ST_ACCEL_6_FS_AVL_100_GAIN IIO_G_TO_M_S_2(49000)
  196. #define ST_ACCEL_6_FS_AVL_200_GAIN IIO_G_TO_M_S_2(98000)
  197. #define ST_ACCEL_6_FS_AVL_400_GAIN IIO_G_TO_M_S_2(195000)
  198. #define ST_ACCEL_6_BDU_ADDR 0x23
  199. #define ST_ACCEL_6_BDU_MASK 0x80
  200. #define ST_ACCEL_6_DRDY_IRQ_ADDR 0x22
  201. #define ST_ACCEL_6_DRDY_IRQ_INT1_MASK 0x02
  202. #define ST_ACCEL_6_DRDY_IRQ_INT2_MASK 0x10
  203. #define ST_ACCEL_6_IHL_IRQ_ADDR 0x22
  204. #define ST_ACCEL_6_IHL_IRQ_MASK 0x80
  205. #define ST_ACCEL_6_MULTIREAD_BIT true
  206. /* CUSTOM VALUES FOR SENSOR 7 */
  207. #define ST_ACCEL_7_ODR_ADDR 0x20
  208. #define ST_ACCEL_7_ODR_MASK 0x30
  209. #define ST_ACCEL_7_ODR_AVL_280HZ_VAL 0x00
  210. #define ST_ACCEL_7_ODR_AVL_560HZ_VAL 0x01
  211. #define ST_ACCEL_7_ODR_AVL_1120HZ_VAL 0x02
  212. #define ST_ACCEL_7_ODR_AVL_4480HZ_VAL 0x03
  213. #define ST_ACCEL_7_PW_ADDR 0x20
  214. #define ST_ACCEL_7_PW_MASK 0xc0
  215. #define ST_ACCEL_7_FS_AVL_2_GAIN IIO_G_TO_M_S_2(488)
  216. #define ST_ACCEL_7_BDU_ADDR 0x21
  217. #define ST_ACCEL_7_BDU_MASK 0x40
  218. #define ST_ACCEL_7_DRDY_IRQ_ADDR 0x21
  219. #define ST_ACCEL_7_DRDY_IRQ_INT1_MASK 0x04
  220. #define ST_ACCEL_7_MULTIREAD_BIT false
  221. static const struct iio_chan_spec st_accel_8bit_channels[] = {
  222. ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
  223. BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
  224. ST_SENSORS_SCAN_X, 1, IIO_MOD_X, 's', IIO_LE, 8, 8,
  225. ST_ACCEL_DEFAULT_OUT_X_L_ADDR+1),
  226. ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
  227. BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
  228. ST_SENSORS_SCAN_Y, 1, IIO_MOD_Y, 's', IIO_LE, 8, 8,
  229. ST_ACCEL_DEFAULT_OUT_Y_L_ADDR+1),
  230. ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
  231. BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
  232. ST_SENSORS_SCAN_Z, 1, IIO_MOD_Z, 's', IIO_LE, 8, 8,
  233. ST_ACCEL_DEFAULT_OUT_Z_L_ADDR+1),
  234. IIO_CHAN_SOFT_TIMESTAMP(3)
  235. };
  236. static const struct iio_chan_spec st_accel_12bit_channels[] = {
  237. ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
  238. BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
  239. ST_SENSORS_SCAN_X, 1, IIO_MOD_X, 's', IIO_LE, 12, 16,
  240. ST_ACCEL_DEFAULT_OUT_X_L_ADDR),
  241. ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
  242. BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
  243. ST_SENSORS_SCAN_Y, 1, IIO_MOD_Y, 's', IIO_LE, 12, 16,
  244. ST_ACCEL_DEFAULT_OUT_Y_L_ADDR),
  245. ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
  246. BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
  247. ST_SENSORS_SCAN_Z, 1, IIO_MOD_Z, 's', IIO_LE, 12, 16,
  248. ST_ACCEL_DEFAULT_OUT_Z_L_ADDR),
  249. IIO_CHAN_SOFT_TIMESTAMP(3)
  250. };
  251. static const struct iio_chan_spec st_accel_16bit_channels[] = {
  252. ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
  253. BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
  254. ST_SENSORS_SCAN_X, 1, IIO_MOD_X, 's', IIO_LE, 16, 16,
  255. ST_ACCEL_DEFAULT_OUT_X_L_ADDR),
  256. ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
  257. BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
  258. ST_SENSORS_SCAN_Y, 1, IIO_MOD_Y, 's', IIO_LE, 16, 16,
  259. ST_ACCEL_DEFAULT_OUT_Y_L_ADDR),
  260. ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
  261. BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
  262. ST_SENSORS_SCAN_Z, 1, IIO_MOD_Z, 's', IIO_LE, 16, 16,
  263. ST_ACCEL_DEFAULT_OUT_Z_L_ADDR),
  264. IIO_CHAN_SOFT_TIMESTAMP(3)
  265. };
  266. static const struct st_sensor_settings st_accel_sensors_settings[] = {
  267. {
  268. .wai = ST_ACCEL_1_WAI_EXP,
  269. .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
  270. .sensors_supported = {
  271. [0] = LIS3DH_ACCEL_DEV_NAME,
  272. [1] = LSM303DLHC_ACCEL_DEV_NAME,
  273. [2] = LSM330D_ACCEL_DEV_NAME,
  274. [3] = LSM330DL_ACCEL_DEV_NAME,
  275. [4] = LSM330DLC_ACCEL_DEV_NAME,
  276. [5] = LSM303AGR_ACCEL_DEV_NAME,
  277. [6] = LIS2DH12_ACCEL_DEV_NAME,
  278. },
  279. .ch = (struct iio_chan_spec *)st_accel_12bit_channels,
  280. .odr = {
  281. .addr = ST_ACCEL_1_ODR_ADDR,
  282. .mask = ST_ACCEL_1_ODR_MASK,
  283. .odr_avl = {
  284. { 1, ST_ACCEL_1_ODR_AVL_1HZ_VAL, },
  285. { 10, ST_ACCEL_1_ODR_AVL_10HZ_VAL, },
  286. { 25, ST_ACCEL_1_ODR_AVL_25HZ_VAL, },
  287. { 50, ST_ACCEL_1_ODR_AVL_50HZ_VAL, },
  288. { 100, ST_ACCEL_1_ODR_AVL_100HZ_VAL, },
  289. { 200, ST_ACCEL_1_ODR_AVL_200HZ_VAL, },
  290. { 400, ST_ACCEL_1_ODR_AVL_400HZ_VAL, },
  291. { 1600, ST_ACCEL_1_ODR_AVL_1600HZ_VAL, },
  292. },
  293. },
  294. .pw = {
  295. .addr = ST_ACCEL_1_ODR_ADDR,
  296. .mask = ST_ACCEL_1_ODR_MASK,
  297. .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
  298. },
  299. .enable_axis = {
  300. .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
  301. .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
  302. },
  303. .fs = {
  304. .addr = ST_ACCEL_1_FS_ADDR,
  305. .mask = ST_ACCEL_1_FS_MASK,
  306. .fs_avl = {
  307. [0] = {
  308. .num = ST_ACCEL_FS_AVL_2G,
  309. .value = ST_ACCEL_1_FS_AVL_2_VAL,
  310. .gain = ST_ACCEL_1_FS_AVL_2_GAIN,
  311. },
  312. [1] = {
  313. .num = ST_ACCEL_FS_AVL_4G,
  314. .value = ST_ACCEL_1_FS_AVL_4_VAL,
  315. .gain = ST_ACCEL_1_FS_AVL_4_GAIN,
  316. },
  317. [2] = {
  318. .num = ST_ACCEL_FS_AVL_8G,
  319. .value = ST_ACCEL_1_FS_AVL_8_VAL,
  320. .gain = ST_ACCEL_1_FS_AVL_8_GAIN,
  321. },
  322. [3] = {
  323. .num = ST_ACCEL_FS_AVL_16G,
  324. .value = ST_ACCEL_1_FS_AVL_16_VAL,
  325. .gain = ST_ACCEL_1_FS_AVL_16_GAIN,
  326. },
  327. },
  328. },
  329. .bdu = {
  330. .addr = ST_ACCEL_1_BDU_ADDR,
  331. .mask = ST_ACCEL_1_BDU_MASK,
  332. },
  333. /*
  334. * Data Alignment Setting - needs to be set to get
  335. * left-justified data like all other sensors.
  336. */
  337. .das = {
  338. .addr = 0x21,
  339. .mask = 0x01,
  340. },
  341. .drdy_irq = {
  342. .addr = ST_ACCEL_1_DRDY_IRQ_ADDR,
  343. .mask_int1 = ST_ACCEL_1_DRDY_IRQ_INT1_MASK,
  344. .mask_int2 = ST_ACCEL_1_DRDY_IRQ_INT2_MASK,
  345. .addr_ihl = ST_ACCEL_1_IHL_IRQ_ADDR,
  346. .mask_ihl = ST_ACCEL_1_IHL_IRQ_MASK,
  347. .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
  348. },
  349. .multi_read_bit = ST_ACCEL_1_MULTIREAD_BIT,
  350. .bootime = 2,
  351. },
  352. {
  353. .wai = ST_ACCEL_2_WAI_EXP,
  354. .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
  355. .sensors_supported = {
  356. [0] = LIS331DLH_ACCEL_DEV_NAME,
  357. [1] = LSM303DL_ACCEL_DEV_NAME,
  358. [2] = LSM303DLH_ACCEL_DEV_NAME,
  359. [3] = LSM303DLM_ACCEL_DEV_NAME,
  360. },
  361. .ch = (struct iio_chan_spec *)st_accel_12bit_channels,
  362. .odr = {
  363. .addr = ST_ACCEL_2_ODR_ADDR,
  364. .mask = ST_ACCEL_2_ODR_MASK,
  365. .odr_avl = {
  366. { 50, ST_ACCEL_2_ODR_AVL_50HZ_VAL, },
  367. { 100, ST_ACCEL_2_ODR_AVL_100HZ_VAL, },
  368. { 400, ST_ACCEL_2_ODR_AVL_400HZ_VAL, },
  369. { 1000, ST_ACCEL_2_ODR_AVL_1000HZ_VAL, },
  370. },
  371. },
  372. .pw = {
  373. .addr = ST_ACCEL_2_PW_ADDR,
  374. .mask = ST_ACCEL_2_PW_MASK,
  375. .value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
  376. .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
  377. },
  378. .enable_axis = {
  379. .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
  380. .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
  381. },
  382. .fs = {
  383. .addr = ST_ACCEL_2_FS_ADDR,
  384. .mask = ST_ACCEL_2_FS_MASK,
  385. .fs_avl = {
  386. [0] = {
  387. .num = ST_ACCEL_FS_AVL_2G,
  388. .value = ST_ACCEL_2_FS_AVL_2_VAL,
  389. .gain = ST_ACCEL_2_FS_AVL_2_GAIN,
  390. },
  391. [1] = {
  392. .num = ST_ACCEL_FS_AVL_4G,
  393. .value = ST_ACCEL_2_FS_AVL_4_VAL,
  394. .gain = ST_ACCEL_2_FS_AVL_4_GAIN,
  395. },
  396. [2] = {
  397. .num = ST_ACCEL_FS_AVL_8G,
  398. .value = ST_ACCEL_2_FS_AVL_8_VAL,
  399. .gain = ST_ACCEL_2_FS_AVL_8_GAIN,
  400. },
  401. },
  402. },
  403. .bdu = {
  404. .addr = ST_ACCEL_2_BDU_ADDR,
  405. .mask = ST_ACCEL_2_BDU_MASK,
  406. },
  407. .drdy_irq = {
  408. .addr = ST_ACCEL_2_DRDY_IRQ_ADDR,
  409. .mask_int1 = ST_ACCEL_2_DRDY_IRQ_INT1_MASK,
  410. .mask_int2 = ST_ACCEL_2_DRDY_IRQ_INT2_MASK,
  411. .addr_ihl = ST_ACCEL_2_IHL_IRQ_ADDR,
  412. .mask_ihl = ST_ACCEL_2_IHL_IRQ_MASK,
  413. .addr_od = ST_ACCEL_2_OD_IRQ_ADDR,
  414. .mask_od = ST_ACCEL_2_OD_IRQ_MASK,
  415. .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
  416. },
  417. .multi_read_bit = ST_ACCEL_2_MULTIREAD_BIT,
  418. .bootime = 2,
  419. },
  420. {
  421. .wai = ST_ACCEL_3_WAI_EXP,
  422. .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
  423. .sensors_supported = {
  424. [0] = LSM330_ACCEL_DEV_NAME,
  425. },
  426. .ch = (struct iio_chan_spec *)st_accel_16bit_channels,
  427. .odr = {
  428. .addr = ST_ACCEL_3_ODR_ADDR,
  429. .mask = ST_ACCEL_3_ODR_MASK,
  430. .odr_avl = {
  431. { 3, ST_ACCEL_3_ODR_AVL_3HZ_VAL },
  432. { 6, ST_ACCEL_3_ODR_AVL_6HZ_VAL, },
  433. { 12, ST_ACCEL_3_ODR_AVL_12HZ_VAL, },
  434. { 25, ST_ACCEL_3_ODR_AVL_25HZ_VAL, },
  435. { 50, ST_ACCEL_3_ODR_AVL_50HZ_VAL, },
  436. { 100, ST_ACCEL_3_ODR_AVL_100HZ_VAL, },
  437. { 200, ST_ACCEL_3_ODR_AVL_200HZ_VAL, },
  438. { 400, ST_ACCEL_3_ODR_AVL_400HZ_VAL, },
  439. { 800, ST_ACCEL_3_ODR_AVL_800HZ_VAL, },
  440. { 1600, ST_ACCEL_3_ODR_AVL_1600HZ_VAL, },
  441. },
  442. },
  443. .pw = {
  444. .addr = ST_ACCEL_3_ODR_ADDR,
  445. .mask = ST_ACCEL_3_ODR_MASK,
  446. .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
  447. },
  448. .enable_axis = {
  449. .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
  450. .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
  451. },
  452. .fs = {
  453. .addr = ST_ACCEL_3_FS_ADDR,
  454. .mask = ST_ACCEL_3_FS_MASK,
  455. .fs_avl = {
  456. [0] = {
  457. .num = ST_ACCEL_FS_AVL_2G,
  458. .value = ST_ACCEL_3_FS_AVL_2_VAL,
  459. .gain = ST_ACCEL_3_FS_AVL_2_GAIN,
  460. },
  461. [1] = {
  462. .num = ST_ACCEL_FS_AVL_4G,
  463. .value = ST_ACCEL_3_FS_AVL_4_VAL,
  464. .gain = ST_ACCEL_3_FS_AVL_4_GAIN,
  465. },
  466. [2] = {
  467. .num = ST_ACCEL_FS_AVL_6G,
  468. .value = ST_ACCEL_3_FS_AVL_6_VAL,
  469. .gain = ST_ACCEL_3_FS_AVL_6_GAIN,
  470. },
  471. [3] = {
  472. .num = ST_ACCEL_FS_AVL_8G,
  473. .value = ST_ACCEL_3_FS_AVL_8_VAL,
  474. .gain = ST_ACCEL_3_FS_AVL_8_GAIN,
  475. },
  476. [4] = {
  477. .num = ST_ACCEL_FS_AVL_16G,
  478. .value = ST_ACCEL_3_FS_AVL_16_VAL,
  479. .gain = ST_ACCEL_3_FS_AVL_16_GAIN,
  480. },
  481. },
  482. },
  483. .bdu = {
  484. .addr = ST_ACCEL_3_BDU_ADDR,
  485. .mask = ST_ACCEL_3_BDU_MASK,
  486. },
  487. .drdy_irq = {
  488. .addr = ST_ACCEL_3_DRDY_IRQ_ADDR,
  489. .mask_int1 = ST_ACCEL_3_DRDY_IRQ_INT1_MASK,
  490. .mask_int2 = ST_ACCEL_3_DRDY_IRQ_INT2_MASK,
  491. .addr_ihl = ST_ACCEL_3_IHL_IRQ_ADDR,
  492. .mask_ihl = ST_ACCEL_3_IHL_IRQ_MASK,
  493. .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
  494. .ig1 = {
  495. .en_addr = ST_ACCEL_3_IG1_EN_ADDR,
  496. .en_mask = ST_ACCEL_3_IG1_EN_MASK,
  497. },
  498. },
  499. .multi_read_bit = ST_ACCEL_3_MULTIREAD_BIT,
  500. .bootime = 2,
  501. },
  502. {
  503. .wai = ST_ACCEL_4_WAI_EXP,
  504. .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
  505. .sensors_supported = {
  506. [0] = LIS3LV02DL_ACCEL_DEV_NAME,
  507. },
  508. .ch = (struct iio_chan_spec *)st_accel_12bit_channels,
  509. .odr = {
  510. .addr = ST_ACCEL_4_ODR_ADDR,
  511. .mask = ST_ACCEL_4_ODR_MASK,
  512. .odr_avl = {
  513. { 40, ST_ACCEL_4_ODR_AVL_40HZ_VAL },
  514. { 160, ST_ACCEL_4_ODR_AVL_160HZ_VAL, },
  515. { 640, ST_ACCEL_4_ODR_AVL_640HZ_VAL, },
  516. { 2560, ST_ACCEL_4_ODR_AVL_2560HZ_VAL, },
  517. },
  518. },
  519. .pw = {
  520. .addr = ST_ACCEL_4_PW_ADDR,
  521. .mask = ST_ACCEL_4_PW_MASK,
  522. .value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
  523. .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
  524. },
  525. .enable_axis = {
  526. .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
  527. .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
  528. },
  529. .fs = {
  530. .addr = ST_ACCEL_4_FS_ADDR,
  531. .mask = ST_ACCEL_4_FS_MASK,
  532. .fs_avl = {
  533. [0] = {
  534. .num = ST_ACCEL_FS_AVL_2G,
  535. .value = ST_ACCEL_4_FS_AVL_2_VAL,
  536. .gain = ST_ACCEL_4_FS_AVL_2_GAIN,
  537. },
  538. [1] = {
  539. .num = ST_ACCEL_FS_AVL_6G,
  540. .value = ST_ACCEL_4_FS_AVL_6_VAL,
  541. .gain = ST_ACCEL_4_FS_AVL_6_GAIN,
  542. },
  543. },
  544. },
  545. .bdu = {
  546. .addr = ST_ACCEL_4_BDU_ADDR,
  547. .mask = ST_ACCEL_4_BDU_MASK,
  548. },
  549. .drdy_irq = {
  550. .addr = ST_ACCEL_4_DRDY_IRQ_ADDR,
  551. .mask_int1 = ST_ACCEL_4_DRDY_IRQ_INT1_MASK,
  552. .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
  553. },
  554. .multi_read_bit = ST_ACCEL_4_MULTIREAD_BIT,
  555. .bootime = 2, /* guess */
  556. },
  557. {
  558. .wai = ST_ACCEL_5_WAI_EXP,
  559. .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
  560. .sensors_supported = {
  561. [0] = LIS331DL_ACCEL_DEV_NAME,
  562. },
  563. .ch = (struct iio_chan_spec *)st_accel_8bit_channels,
  564. .odr = {
  565. .addr = ST_ACCEL_5_ODR_ADDR,
  566. .mask = ST_ACCEL_5_ODR_MASK,
  567. .odr_avl = {
  568. { 100, ST_ACCEL_5_ODR_AVL_100HZ_VAL },
  569. { 400, ST_ACCEL_5_ODR_AVL_400HZ_VAL, },
  570. },
  571. },
  572. .pw = {
  573. .addr = ST_ACCEL_5_PW_ADDR,
  574. .mask = ST_ACCEL_5_PW_MASK,
  575. .value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
  576. .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
  577. },
  578. .enable_axis = {
  579. .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
  580. .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
  581. },
  582. .fs = {
  583. .addr = ST_ACCEL_5_FS_ADDR,
  584. .mask = ST_ACCEL_5_FS_MASK,
  585. .fs_avl = {
  586. [0] = {
  587. .num = ST_ACCEL_FS_AVL_2G,
  588. .value = ST_ACCEL_5_FS_AVL_2_VAL,
  589. .gain = ST_ACCEL_5_FS_AVL_2_GAIN,
  590. },
  591. [1] = {
  592. .num = ST_ACCEL_FS_AVL_8G,
  593. .value = ST_ACCEL_5_FS_AVL_8_VAL,
  594. .gain = ST_ACCEL_5_FS_AVL_8_GAIN,
  595. },
  596. },
  597. },
  598. .drdy_irq = {
  599. .addr = ST_ACCEL_5_DRDY_IRQ_ADDR,
  600. .mask_int1 = ST_ACCEL_5_DRDY_IRQ_INT1_MASK,
  601. .mask_int2 = ST_ACCEL_5_DRDY_IRQ_INT2_MASK,
  602. .addr_ihl = ST_ACCEL_5_IHL_IRQ_ADDR,
  603. .mask_ihl = ST_ACCEL_5_IHL_IRQ_MASK,
  604. .addr_od = ST_ACCEL_5_OD_IRQ_ADDR,
  605. .mask_od = ST_ACCEL_5_OD_IRQ_MASK,
  606. .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
  607. },
  608. .multi_read_bit = ST_ACCEL_5_MULTIREAD_BIT,
  609. .bootime = 2, /* guess */
  610. },
  611. {
  612. .wai = ST_ACCEL_6_WAI_EXP,
  613. .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
  614. .sensors_supported = {
  615. [0] = H3LIS331DL_DRIVER_NAME,
  616. },
  617. .ch = (struct iio_chan_spec *)st_accel_12bit_channels,
  618. .odr = {
  619. .addr = ST_ACCEL_6_ODR_ADDR,
  620. .mask = ST_ACCEL_6_ODR_MASK,
  621. .odr_avl = {
  622. { 50, ST_ACCEL_6_ODR_AVL_50HZ_VAL },
  623. { 100, ST_ACCEL_6_ODR_AVL_100HZ_VAL, },
  624. { 400, ST_ACCEL_6_ODR_AVL_400HZ_VAL, },
  625. { 1000, ST_ACCEL_6_ODR_AVL_1000HZ_VAL, },
  626. },
  627. },
  628. .pw = {
  629. .addr = ST_ACCEL_6_PW_ADDR,
  630. .mask = ST_ACCEL_6_PW_MASK,
  631. .value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
  632. .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
  633. },
  634. .enable_axis = {
  635. .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
  636. .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
  637. },
  638. .fs = {
  639. .addr = ST_ACCEL_6_FS_ADDR,
  640. .mask = ST_ACCEL_6_FS_MASK,
  641. .fs_avl = {
  642. [0] = {
  643. .num = ST_ACCEL_FS_AVL_100G,
  644. .value = ST_ACCEL_6_FS_AVL_100_VAL,
  645. .gain = ST_ACCEL_6_FS_AVL_100_GAIN,
  646. },
  647. [1] = {
  648. .num = ST_ACCEL_FS_AVL_200G,
  649. .value = ST_ACCEL_6_FS_AVL_200_VAL,
  650. .gain = ST_ACCEL_6_FS_AVL_200_GAIN,
  651. },
  652. [2] = {
  653. .num = ST_ACCEL_FS_AVL_400G,
  654. .value = ST_ACCEL_6_FS_AVL_400_VAL,
  655. .gain = ST_ACCEL_6_FS_AVL_400_GAIN,
  656. },
  657. },
  658. },
  659. .bdu = {
  660. .addr = ST_ACCEL_6_BDU_ADDR,
  661. .mask = ST_ACCEL_6_BDU_MASK,
  662. },
  663. .drdy_irq = {
  664. .addr = ST_ACCEL_6_DRDY_IRQ_ADDR,
  665. .mask_int1 = ST_ACCEL_6_DRDY_IRQ_INT1_MASK,
  666. .mask_int2 = ST_ACCEL_6_DRDY_IRQ_INT2_MASK,
  667. .addr_ihl = ST_ACCEL_6_IHL_IRQ_ADDR,
  668. .mask_ihl = ST_ACCEL_6_IHL_IRQ_MASK,
  669. },
  670. .multi_read_bit = ST_ACCEL_6_MULTIREAD_BIT,
  671. .bootime = 2,
  672. },
  673. {
  674. /* No WAI register present */
  675. .sensors_supported = {
  676. [0] = LIS3L02DQ_ACCEL_DEV_NAME,
  677. },
  678. .ch = (struct iio_chan_spec *)st_accel_12bit_channels,
  679. .odr = {
  680. .addr = ST_ACCEL_7_ODR_ADDR,
  681. .mask = ST_ACCEL_7_ODR_MASK,
  682. .odr_avl = {
  683. { 280, ST_ACCEL_7_ODR_AVL_280HZ_VAL, },
  684. { 560, ST_ACCEL_7_ODR_AVL_560HZ_VAL, },
  685. { 1120, ST_ACCEL_7_ODR_AVL_1120HZ_VAL, },
  686. { 4480, ST_ACCEL_7_ODR_AVL_4480HZ_VAL, },
  687. },
  688. },
  689. .pw = {
  690. .addr = ST_ACCEL_7_PW_ADDR,
  691. .mask = ST_ACCEL_7_PW_MASK,
  692. .value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
  693. .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
  694. },
  695. .enable_axis = {
  696. .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
  697. .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
  698. },
  699. .fs = {
  700. .fs_avl = {
  701. [0] = {
  702. .num = ST_ACCEL_FS_AVL_2G,
  703. .gain = ST_ACCEL_7_FS_AVL_2_GAIN,
  704. },
  705. },
  706. },
  707. /*
  708. * The part has a BDU bit but if set the data is never
  709. * updated so don't set it.
  710. */
  711. .bdu = {
  712. },
  713. .drdy_irq = {
  714. .addr = ST_ACCEL_7_DRDY_IRQ_ADDR,
  715. .mask_int1 = ST_ACCEL_7_DRDY_IRQ_INT1_MASK,
  716. .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
  717. },
  718. .multi_read_bit = ST_ACCEL_7_MULTIREAD_BIT,
  719. .bootime = 2,
  720. },
  721. };
  722. static int st_accel_read_raw(struct iio_dev *indio_dev,
  723. struct iio_chan_spec const *ch, int *val,
  724. int *val2, long mask)
  725. {
  726. int err;
  727. struct st_sensor_data *adata = iio_priv(indio_dev);
  728. switch (mask) {
  729. case IIO_CHAN_INFO_RAW:
  730. err = st_sensors_read_info_raw(indio_dev, ch, val);
  731. if (err < 0)
  732. goto read_error;
  733. return IIO_VAL_INT;
  734. case IIO_CHAN_INFO_SCALE:
  735. *val = adata->current_fullscale->gain / 1000000;
  736. *val2 = adata->current_fullscale->gain % 1000000;
  737. return IIO_VAL_INT_PLUS_MICRO;
  738. case IIO_CHAN_INFO_SAMP_FREQ:
  739. *val = adata->odr;
  740. return IIO_VAL_INT;
  741. default:
  742. return -EINVAL;
  743. }
  744. read_error:
  745. return err;
  746. }
  747. static int st_accel_write_raw(struct iio_dev *indio_dev,
  748. struct iio_chan_spec const *chan, int val, int val2, long mask)
  749. {
  750. int err;
  751. switch (mask) {
  752. case IIO_CHAN_INFO_SCALE: {
  753. int gain;
  754. gain = val * 1000000 + val2;
  755. err = st_sensors_set_fullscale_by_gain(indio_dev, gain);
  756. break;
  757. }
  758. case IIO_CHAN_INFO_SAMP_FREQ:
  759. if (val2)
  760. return -EINVAL;
  761. mutex_lock(&indio_dev->mlock);
  762. err = st_sensors_set_odr(indio_dev, val);
  763. mutex_unlock(&indio_dev->mlock);
  764. return err;
  765. default:
  766. return -EINVAL;
  767. }
  768. return err;
  769. }
  770. static ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL();
  771. static ST_SENSORS_DEV_ATTR_SCALE_AVAIL(in_accel_scale_available);
  772. static struct attribute *st_accel_attributes[] = {
  773. &iio_dev_attr_sampling_frequency_available.dev_attr.attr,
  774. &iio_dev_attr_in_accel_scale_available.dev_attr.attr,
  775. NULL,
  776. };
  777. static const struct attribute_group st_accel_attribute_group = {
  778. .attrs = st_accel_attributes,
  779. };
  780. static const struct iio_info accel_info = {
  781. .driver_module = THIS_MODULE,
  782. .attrs = &st_accel_attribute_group,
  783. .read_raw = &st_accel_read_raw,
  784. .write_raw = &st_accel_write_raw,
  785. .debugfs_reg_access = &st_sensors_debugfs_reg_access,
  786. };
  787. #ifdef CONFIG_IIO_TRIGGER
  788. static const struct iio_trigger_ops st_accel_trigger_ops = {
  789. .owner = THIS_MODULE,
  790. .set_trigger_state = ST_ACCEL_TRIGGER_SET_STATE,
  791. .validate_device = st_sensors_validate_device,
  792. };
  793. #define ST_ACCEL_TRIGGER_OPS (&st_accel_trigger_ops)
  794. #else
  795. #define ST_ACCEL_TRIGGER_OPS NULL
  796. #endif
  797. int st_accel_common_probe(struct iio_dev *indio_dev)
  798. {
  799. struct st_sensor_data *adata = iio_priv(indio_dev);
  800. struct st_sensors_platform_data *pdata =
  801. (struct st_sensors_platform_data *)adata->dev->platform_data;
  802. int irq = adata->get_irq_data_ready(indio_dev);
  803. int err;
  804. indio_dev->modes = INDIO_DIRECT_MODE;
  805. indio_dev->info = &accel_info;
  806. mutex_init(&adata->tb.buf_lock);
  807. err = st_sensors_power_enable(indio_dev);
  808. if (err)
  809. return err;
  810. err = st_sensors_check_device_support(indio_dev,
  811. ARRAY_SIZE(st_accel_sensors_settings),
  812. st_accel_sensors_settings);
  813. if (err < 0)
  814. goto st_accel_power_off;
  815. adata->num_data_channels = ST_ACCEL_NUMBER_DATA_CHANNELS;
  816. adata->multiread_bit = adata->sensor_settings->multi_read_bit;
  817. indio_dev->channels = adata->sensor_settings->ch;
  818. indio_dev->num_channels = ST_SENSORS_NUMBER_ALL_CHANNELS;
  819. adata->current_fullscale = (struct st_sensor_fullscale_avl *)
  820. &adata->sensor_settings->fs.fs_avl[0];
  821. adata->odr = adata->sensor_settings->odr.odr_avl[0].hz;
  822. if (!pdata)
  823. pdata = (struct st_sensors_platform_data *)&default_accel_pdata;
  824. err = st_sensors_init_sensor(indio_dev, pdata);
  825. if (err < 0)
  826. goto st_accel_power_off;
  827. err = st_accel_allocate_ring(indio_dev);
  828. if (err < 0)
  829. goto st_accel_power_off;
  830. if (irq > 0) {
  831. err = st_sensors_allocate_trigger(indio_dev,
  832. ST_ACCEL_TRIGGER_OPS);
  833. if (err < 0)
  834. goto st_accel_probe_trigger_error;
  835. }
  836. err = iio_device_register(indio_dev);
  837. if (err)
  838. goto st_accel_device_register_error;
  839. dev_info(&indio_dev->dev, "registered accelerometer %s\n",
  840. indio_dev->name);
  841. return 0;
  842. st_accel_device_register_error:
  843. if (irq > 0)
  844. st_sensors_deallocate_trigger(indio_dev);
  845. st_accel_probe_trigger_error:
  846. st_accel_deallocate_ring(indio_dev);
  847. st_accel_power_off:
  848. st_sensors_power_disable(indio_dev);
  849. return err;
  850. }
  851. EXPORT_SYMBOL(st_accel_common_probe);
  852. void st_accel_common_remove(struct iio_dev *indio_dev)
  853. {
  854. struct st_sensor_data *adata = iio_priv(indio_dev);
  855. st_sensors_power_disable(indio_dev);
  856. iio_device_unregister(indio_dev);
  857. if (adata->get_irq_data_ready(indio_dev) > 0)
  858. st_sensors_deallocate_trigger(indio_dev);
  859. st_accel_deallocate_ring(indio_dev);
  860. }
  861. EXPORT_SYMBOL(st_accel_common_remove);
  862. MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");
  863. MODULE_DESCRIPTION("STMicroelectronics accelerometers driver");
  864. MODULE_LICENSE("GPL v2");