st_lis2ds12.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * STMicroelectronics lis2ds12 driver
  4. *
  5. * MEMS Software Solutions Team
  6. *
  7. * Copyright 2015 STMicroelectronics Inc.
  8. */
  9. #ifndef __LIS2DS12_H
  10. #define __LIS2DS12_H
  11. #include <linux/types.h>
  12. #include <linux/iio/iio.h>
  13. #include <linux/iio/trigger.h>
  14. #include <linux/platform_data/stm/lis2ds12.h>
  15. #include <linux/version.h>
  16. #include "../common/stm_iio_types.h"
  17. #if KERNEL_VERSION(5, 19, 0) <= LINUX_VERSION_CODE
  18. #include <linux/iio/iio-opaque.h>
  19. #endif /* LINUX_VERSION_CODE */
  20. #define LIS2DS12_WHO_AM_I_ADDR 0x0f
  21. #define LIS2DS12_WHO_AM_I_DEF 0x43
  22. #define LIS2DS12_CTRL1_ADDR 0x20
  23. #define LIS2DS12_CTRL2_ADDR 0x21
  24. #define LIS2DS12_CTRL3_ADDR 0x22
  25. #define LIS2DS12_CTRL4_INT1_PAD_ADDR 0x23
  26. #define LIS2DS12_CTRL5_INT2_PAD_ADDR 0x24
  27. #define LIS2DS12_FIFO_CTRL_ADDR 0x25
  28. #define LIS2DS12_OUTX_L_ADDR 0x28
  29. #define LIS2DS12_OUTY_L_ADDR 0x2a
  30. #define LIS2DS12_OUTZ_L_ADDR 0x2c
  31. #define LIS2DS12_TAP_THS_6D_ADDR 0x31
  32. #define LIS2DS12_WAKE_UP_THS_ADDR 0x33
  33. #define LIS2DS12_FREE_FALL_ADDR 0x35
  34. #define LIS2DS12_STEP_C_MINTHS_ADDR 0x3a
  35. #define LIS2DS12_STEP_C_MINTHS_RST_NSTEP_MASK 0x80
  36. #define LIS2DS12_STEP_C_OUT_L_ADDR 0x3b
  37. #define LIS2DS12_FUNC_CTRL_ADDR 0x3f
  38. #define LIS2DS12_FUNC_CTRL_TILT_MASK 0x10
  39. #define LIS2DS12_FUNC_CTRL_SIGN_MOT_MASK 0x02
  40. #define LIS2DS12_FUNC_CTRL_STEP_CNT_MASK 0x01
  41. #define LIS2DS12_FUNC_CTRL_EV_MASK (LIS2DS12_FUNC_CTRL_TILT_MASK | \
  42. LIS2DS12_FUNC_CTRL_SIGN_MOT_MASK | \
  43. LIS2DS12_FUNC_CTRL_STEP_CNT_MASK)
  44. #define LIS2DS12_FIFO_THS_ADDR 0x2e
  45. #define LIS2DS12_FIFO_THS_MASK 0xff
  46. #define LIS2DS12_ODR_ADDR LIS2DS12_CTRL1_ADDR
  47. #define LIS2DS12_ODR_MASK 0xf0
  48. #define LIS2DS12_ODR_POWER_OFF_VAL 0x00
  49. #define LIS2DS12_ODR_1HZ_LP_VAL 0x08
  50. #define LIS2DS12_ODR_12HZ_LP_VAL 0x09
  51. #define LIS2DS12_ODR_25HZ_LP_VAL 0x0a
  52. #define LIS2DS12_ODR_50HZ_LP_VAL 0x0b
  53. #define LIS2DS12_ODR_100HZ_LP_VAL 0x0c
  54. #define LIS2DS12_ODR_200HZ_LP_VAL 0x0d
  55. #define LIS2DS12_ODR_400HZ_LP_VAL 0x0e
  56. #define LIS2DS12_ODR_800HZ_LP_VAL 0x0f
  57. #define LIS2DS12_ODR_LP_LIST_NUM 9
  58. #define LIS2DS12_ODR_12_5HZ_HR_VAL 0x01
  59. #define LIS2DS12_ODR_25HZ_HR_VAL 0x02
  60. #define LIS2DS12_ODR_50HZ_HR_VAL 0x03
  61. #define LIS2DS12_ODR_100HZ_HR_VAL 0x04
  62. #define LIS2DS12_ODR_200HZ_HR_VAL 0x05
  63. #define LIS2DS12_ODR_400HZ_HR_VAL 0x06
  64. #define LIS2DS12_ODR_800HZ_HR_VAL 0x07
  65. #define LIS2DS12_ODR_HR_LIST_NUM 8
  66. #define LIS2DS12_FS_ADDR LIS2DS12_CTRL1_ADDR
  67. #define LIS2DS12_FS_MASK 0x0c
  68. #define LIS2DS12_FS_2G_VAL 0x00
  69. #define LIS2DS12_FS_4G_VAL 0x02
  70. #define LIS2DS12_FS_8G_VAL 0x03
  71. #define LIS2DS12_FS_16G_VAL 0x01
  72. /* Advanced Configuration Registers */
  73. #define LIS2DS12_FUNC_CFG_ENTER_ADDR LIS2DS12_CTRL2_ADDR
  74. #define LIS2DS12_FUNC_CFG_EXIT_ADDR 0x3F
  75. #define LIS2DS12_FUNC_CFG_EN_MASK 0x10
  76. #define LIS2DS12_STEP_COUNT_DELTA 0x3A
  77. #define LIS2DS12_SIM_ADDR LIS2DS12_CTRL2_ADDR
  78. #define LIS2DS12_SIM_MASK 0x01
  79. #define LIS2DS12_ADD_INC_MASK 0x04
  80. /*
  81. * Sensitivity for the 16-bit data
  82. */
  83. #define LIS2DS12_FS_2G_GAIN IIO_G_TO_M_S_2(61)
  84. #define LIS2DS12_FS_4G_GAIN IIO_G_TO_M_S_2(122)
  85. #define LIS2DS12_FS_8G_GAIN IIO_G_TO_M_S_2(244)
  86. #define LIS2DS12_FS_16G_GAIN IIO_G_TO_M_S_2(488)
  87. #define LIS2DS12_MODE_DEFAULT LIS2DS12_HR_MODE
  88. #define LIS2DS12_INT1_S_TAP_MASK 0x40
  89. #define LIS2DS12_INT1_WAKEUP_MASK 0x20
  90. #define LIS2DS12_INT1_FREE_FALL_MASK 0x10
  91. #define LIS2DS12_INT1_TAP_MASK 0x08
  92. #define LIS2DS12_INT1_6D_MASK 0x04
  93. #define LIS2DS12_INT1_FTH_MASK 0x02
  94. #define LIS2DS12_INT1_DRDY_MASK 0x01
  95. #define LIS2DS12_INT1_EVENTS_MASK (LIS2DS12_INT1_S_TAP_MASK | \
  96. LIS2DS12_INT1_WAKEUP_MASK | \
  97. LIS2DS12_INT1_FREE_FALL_MASK | \
  98. LIS2DS12_INT1_TAP_MASK | \
  99. LIS2DS12_INT1_6D_MASK | \
  100. LIS2DS12_INT1_FTH_MASK | \
  101. LIS2DS12_INT1_DRDY_MASK)
  102. #define LIS2DS12_INT2_ON_INT1_MASK 0x20
  103. #define LIS2DS12_INT2_TILT_MASK 0x10
  104. #define LIS2DS12_INT2_SIG_MOT_DET_MASK 0x08
  105. #define LIS2DS12_INT2_STEP_DET_MASK 0x04
  106. #define LIS2DS12_INT2_FTH_MASK 0x02
  107. #define LIS2DS12_INT2_DRDY_MASK 0x01
  108. #define LIS2DS12_INT2_EVENTS_MASK (LIS2DS12_INT2_TILT_MASK | \
  109. LIS2DS12_INT2_SIG_MOT_DET_MASK | \
  110. LIS2DS12_INT2_STEP_DET_MASK | \
  111. LIS2DS12_INT2_FTH_MASK | \
  112. LIS2DS12_INT2_DRDY_MASK)
  113. #define LIS2DS12_WAKE_UP_THS_WU_MASK 0x3f
  114. #define LIS2DS12_WAKE_UP_THS_WU_DEFAULT 0x02
  115. #define LIS2DS12_FREE_FALL_THS_MASK 0x07
  116. #define LIS2DS12_FREE_FALL_DUR_MASK 0xF8
  117. #define LIS2DS12_FREE_FALL_THS_DEFAULT 0x01
  118. #define LIS2DS12_FREE_FALL_DUR_DEFAULT 0x01
  119. #define LIS2DS12_BDU_ADDR LIS2DS12_CTRL1_ADDR
  120. #define LIS2DS12_BDU_MASK 0x01
  121. #define LIS2DS12_SOFT_RESET_ADDR LIS2DS12_CTRL2_ADDR
  122. #define LIS2DS12_SOFT_RESET_MASK 0x40
  123. #define LIS2DS12_LIR_ADDR LIS2DS12_CTRL3_ADDR
  124. #define LIS2DS12_LIR_MASK 0x04
  125. #define LIS2DS12_TAP_AXIS_ADDR LIS2DS12_CTRL3_ADDR
  126. #define LIS2DS12_TAP_AXIS_MASK 0x38
  127. #define LIS2DS12_TAP_AXIS_ANABLE_ALL 0x07
  128. #define LIS2DS12_TAP_THS_ADDR LIS2DS12_TAP_THS_6D_ADDR
  129. #define LIS2DS12_TAP_THS_MASK 0x1f
  130. #define LIS2DS12_TAP_THS_DEFAULT 0x09
  131. #define LIS2DS12_INT2_ON_INT1_ADDR LIS2DS12_CTRL5_INT2_PAD_ADDR
  132. #define LIS2DS12_INT2_ON_INT1_MASK 0x20
  133. #define LIS2DS12_FIFO_MODE_ADDR LIS2DS12_FIFO_CTRL_ADDR
  134. #define LIS2DS12_FIFO_MODE_MASK 0xe0
  135. #define LIS2DS12_FIFO_MODE_BYPASS 0x00
  136. #define LIS2DS12_FIFO_MODE_CONTINUOS 0x06
  137. #define LIS2DS12_OUT_XYZ_SIZE 8
  138. #define LIS2DS12_SELFTEST_ADDR LIS2DS12_CTRL3_ADDR
  139. #define LIS2DS12_SELFTEST_MASK 0xc0
  140. #define LIS2DS12_SELFTEST_NORMAL 0x00
  141. #define LIS2DS12_SELFTEST_POS_SIGN 0x01
  142. #define LIS2DS12_SELFTEST_NEG_SIGN 0x02
  143. #define LIS2DS12_FIFO_SRC 0x2f
  144. #define LIS2DS12_FIFO_SRC_DIFF_MASK 0x20
  145. #define LIS2DS12_FIFO_NUM_AXIS 3
  146. #define LIS2DS12_FIFO_BYTE_X_AXIS 2
  147. #define LIS2DS12_FIFO_BYTE_FOR_SAMPLE (LIS2DS12_FIFO_NUM_AXIS * \
  148. LIS2DS12_FIFO_BYTE_X_AXIS)
  149. #define LIS2DS12_TIMESTAMP_SIZE 8
  150. #define LIS2DS12_STATUS_ADDR 0x27
  151. #define LIS2DS12_STATUS_DUP_ADDR 0x36
  152. #define LIS2DS12_FUNC_CK_GATE_ADDR 0x3d
  153. #define LIS2DS12_FUNC_CK_GATE_TILT_INT_MASK 0x80
  154. #define LIS2DS12_FUNC_CK_GATE_SIGN_M_DET_MASK 0x10
  155. #define LIS2DS12_FUNC_CK_GATE_RST_SIGN_M_MASK 0x08
  156. #define LIS2DS12_FUNC_CK_GATE_RST_PEDO_MASK 0x04
  157. #define LIS2DS12_FUNC_CK_GATE_STEP_D_MASK 0x02
  158. #define LIS2DS12_FUNC_CK_GATE_MASK (LIS2DS12_FUNC_CK_GATE_TILT_INT_MASK | \
  159. LIS2DS12_FUNC_CK_GATE_SIGN_M_DET_MASK | \
  160. LIS2DS12_FUNC_CK_GATE_STEP_D_MASK)
  161. #define LIS2DS12_WAKE_UP_IA_MASK 0x40
  162. #define LIS2DS12_DOUBLE_TAP_MASK 0x10
  163. #define LIS2DS12_TAP_MASK 0x08
  164. #define LIS2DS12_6D_IA_MASK 0x04
  165. #define LIS2DS12_FF_IA_MASK 0x02
  166. #define LIS2DS12_DRDY_MASK 0x01
  167. #define LIS2DS12_EVENT_MASK (LIS2DS12_WAKE_UP_IA_MASK | \
  168. LIS2DS12_DOUBLE_TAP_MASK | \
  169. LIS2DS12_TAP_MASK | \
  170. LIS2DS12_6D_IA_MASK | \
  171. LIS2DS12_FF_IA_MASK)
  172. #define LIS2DS12_FIFO_SRC_ADDR 0x2f
  173. #define LIS2DS12_FIFO_SRC_FTH_MASK 0x80
  174. #define LIS2DS12_EN_BIT 0x01
  175. #define LIS2DS12_DIS_BIT 0x00
  176. #define LIS2DS12_ACCEL_ODR 1
  177. #define LIS2DS12_DEFAULT_ACCEL_FS 2
  178. #define LIS2DS12_FF_ODR 25
  179. #define LIS2DS12_STEP_D_ODR 25
  180. #define LIS2DS12_TILT_ODR 25
  181. #define LIS2DS12_SIGN_M_ODR 25
  182. #define LIS2DS12_TAP_ODR 400
  183. #define LIS2DS12_WAKEUP_ODR 25
  184. #define LIS2DS12_ACTIVITY_ODR 12
  185. #define LIS2DS12_MAX_FIFO_LENGHT 256
  186. #define LIS2DS12_MAX_FIFO_THS (LIS2DS12_MAX_FIFO_LENGHT - 1)
  187. #define LIS2DS12_MAX_CHANNEL_SPEC 5
  188. #define LIS2DS12_EVENT_CHANNEL_SPEC_SIZE 2
  189. #define LIS2DS12_MIN_DURATION_MS 1638
  190. #define LIS2DS12_DEV_NAME "lis2ds12"
  191. #define SET_BIT(a, b) {a |= (1 << b);}
  192. #define RESET_BIT(a, b) {a &= ~(1 << b);}
  193. #define CHECK_BIT(a, b) (a & (1 << b))
  194. enum {
  195. LIS2DS12_ACCEL = 0,
  196. LIS2DS12_STEP_C,
  197. LIS2DS12_TAP,
  198. LIS2DS12_DOUBLE_TAP,
  199. LIS2DS12_STEP_D,
  200. LIS2DS12_TILT,
  201. LIS2DS12_SIGN_M,
  202. LIS2DS12_SENSORS_NUMB,
  203. };
  204. #define ST_LIS2DS12_FLUSH_CHANNEL(device_type) \
  205. { \
  206. .type = device_type, \
  207. .modified = 0, \
  208. .scan_index = -1, \
  209. .indexed = -1, \
  210. .event_spec = &lis2ds12_fifo_flush_event,\
  211. .num_event_specs = 1, \
  212. }
  213. #define ST_LIS2DS12_HWFIFO_ENABLED() \
  214. IIO_DEVICE_ATTR(hwfifo_enabled, S_IWUSR | S_IRUGO, \
  215. lis2ds12_sysfs_get_hwfifo_enabled,\
  216. lis2ds12_sysfs_set_hwfifo_enabled, 0);
  217. #define ST_LIS2DS12_HWFIFO_WATERMARK() \
  218. IIO_DEVICE_ATTR(hwfifo_watermark, S_IWUSR | S_IRUGO, \
  219. lis2ds12_sysfs_get_hwfifo_watermark,\
  220. lis2ds12_sysfs_set_hwfifo_watermark, 0);
  221. #define ST_LIS2DS12_HWFIFO_WATERMARK_MIN() \
  222. IIO_DEVICE_ATTR(hwfifo_watermark_min, S_IRUGO, \
  223. lis2ds12_sysfs_get_hwfifo_watermark_min, NULL, 0);
  224. #define ST_LIS2DS12_HWFIFO_WATERMARK_MAX() \
  225. IIO_DEVICE_ATTR(hwfifo_watermark_max, S_IRUGO, \
  226. lis2ds12_sysfs_get_hwfifo_watermark_max, NULL, 0);
  227. #define ST_LIS2DS12_HWFIFO_FLUSH() \
  228. IIO_DEVICE_ATTR(hwfifo_flush, S_IWUSR, NULL, \
  229. lis2ds12_sysfs_flush_fifo, 0);
  230. enum fifo_mode {
  231. BYPASS = 0,
  232. CONTINUOS,
  233. };
  234. #define LIS2DS12_TX_MAX_LENGTH 12
  235. #define LIS2DS12_RX_MAX_LENGTH 8193
  236. #define LIS2DS12_EWMA_DIV 128
  237. struct lis2ds12_transfer_buffer {
  238. struct mutex buf_lock;
  239. u8 rx_buf[LIS2DS12_RX_MAX_LENGTH];
  240. u8 tx_buf[LIS2DS12_TX_MAX_LENGTH] ____cacheline_aligned;
  241. };
  242. struct lis2ds12_data;
  243. struct lis2ds12_transfer_function {
  244. int (*write)(struct lis2ds12_data *cdata, u8 reg_addr, int len,
  245. u8 *data, bool b_lock);
  246. int (*read)(struct lis2ds12_data *cdata, u8 reg_addr, int len,
  247. u8 *data, bool b_lock);
  248. };
  249. struct lis2ds12_sensor_data {
  250. struct lis2ds12_data *cdata;
  251. const char *name;
  252. s64 timestamp;
  253. u8 enabled;
  254. u32 odr;
  255. u32 gain;
  256. u8 sindex;
  257. u8 sample_to_discard;
  258. };
  259. struct lis2ds12_data {
  260. const char *name;
  261. u8 drdy_int_pin;
  262. bool spi_3wire;
  263. u8 selftest_status;
  264. u8 hwfifo_enabled;
  265. u8 hwfifo_watermark;
  266. u8 power_mode;
  267. u8 enabled_sensor;
  268. u32 common_odr;
  269. int irq;
  270. s64 timestamp;
  271. s64 accel_deltatime;
  272. s64 sample_timestamp;
  273. u8 *fifo_data;
  274. u16 fifo_size;
  275. u64 samples;
  276. u8 std_level;
  277. struct mutex fifo_lock;
  278. struct device *dev;
  279. struct iio_dev *iio_sensors_dev[LIS2DS12_SENSORS_NUMB];
  280. struct iio_trigger *iio_trig[LIS2DS12_SENSORS_NUMB];
  281. struct mutex regs_lock;
  282. const struct lis2ds12_transfer_function *tf;
  283. struct lis2ds12_transfer_buffer tb;
  284. };
  285. static inline s64 lis2ds12_get_time_ns(struct iio_dev *iio_dev)
  286. {
  287. return iio_get_time_ns(iio_dev);
  288. }
  289. static inline int lis2ds12_iio_dev_currentmode(struct iio_dev *indio_dev)
  290. {
  291. #if KERNEL_VERSION(5, 19, 0) <= LINUX_VERSION_CODE
  292. struct iio_dev_opaque *iio_opq = to_iio_dev_opaque(indio_dev);
  293. return iio_opq->currentmode;
  294. #else /* LINUX_VERSION_CODE */
  295. return indio_dev->currentmode;
  296. #endif /* LINUX_VERSION_CODE */
  297. }
  298. int lis2ds12_common_probe(struct lis2ds12_data *cdata, int irq);
  299. #ifdef CONFIG_PM
  300. int lis2ds12_common_suspend(struct lis2ds12_data *cdata);
  301. int lis2ds12_common_resume(struct lis2ds12_data *cdata);
  302. #endif
  303. int lis2ds12_allocate_rings(struct lis2ds12_data *cdata);
  304. int lis2ds12_allocate_triggers(struct lis2ds12_data *cdata,
  305. const struct iio_trigger_ops *trigger_ops);
  306. int lis2ds12_trig_set_state(struct iio_trigger *trig, bool state);
  307. int lis2ds12_read_register(struct lis2ds12_data *cdata, u8 reg_addr,
  308. int data_len, u8 *data, bool b_lock);
  309. int lis2ds12_update_drdy_irq(struct lis2ds12_sensor_data *sdata, bool state);
  310. int lis2ds12_set_enable(struct lis2ds12_sensor_data *sdata, bool enable);
  311. int lis2ds12_update_fifo(struct lis2ds12_data *cdata, u16 watermark);
  312. void lis2ds12_common_remove(struct lis2ds12_data *cdata, int irq);
  313. void lis2ds12_read_xyz(struct lis2ds12_data *cdata);
  314. void lis2ds12_read_fifo(struct lis2ds12_data *cdata, bool check_fifo_len);
  315. void lis2ds12_read_step_c(struct lis2ds12_data *cdata);
  316. void lis2ds12_deallocate_rings(struct lis2ds12_data *cdata);
  317. void lis2ds12_deallocate_triggers(struct lis2ds12_data *cdata);
  318. #endif /* __LIS2DS12_H */