st_lis2du12.h 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * STMicroelectronics lis2du12 driver
  4. *
  5. * MEMS Software Solutions Team
  6. *
  7. * Copyright 2022 STMicroelectronics Inc.
  8. */
  9. #ifndef ST_LIS2DU12_H
  10. #define ST_LIS2DU12_H
  11. #include <linux/device.h>
  12. #include <linux/iio/events.h>
  13. #include <linux/iio/iio.h>
  14. #include <linux/regmap.h>
  15. #include <linux/bitfield.h>
  16. #include "../common/stm_iio_types.h"
  17. #define ST_LIS2DU12_DEV_NAME "lis2du12"
  18. #define ST_LIS2DU12_MAX_WATERMARK 127
  19. #define ST_LIS2DU12_ACC_DATA_SIZE 6
  20. #define ST_LIS2DU12_TEMP_DATA_SIZE 2
  21. #define ST_LIS2DU12_DATA_SIZE (ST_LIS2DU12_ACC_DATA_SIZE + \
  22. ST_LIS2DU12_TEMP_DATA_SIZE)
  23. #define ST_LIS2DU12_ODR_EXPAND(odr, uodr) ((odr * 1000000) + uodr)
  24. #define ST_LIS2DU12_IF_CTRL_ADDR 0x0e
  25. #define ST_LIS2DU12_PD_DIS_INT1_MASK BIT(2)
  26. #define ST_LIS2DU12_CTRL1_ADDR 0x10
  27. #define ST_LIS2DU12_WU_EN_MASK GENMASK(2, 0)
  28. #define ST_LIS2DU12_IF_ADD_INC_MASK BIT(4)
  29. #define ST_LIS2DU12_SW_RESET_MASK BIT(5)
  30. #define ST_LIS2DU12_PP_OD_MASK BIT(7)
  31. #define ST_LIS2DU12_CTRL2_ADDR 0x11
  32. #define ST_LIS2DU12_INT_F_FTH_MASK BIT(5)
  33. #define ST_LIS2DU12_CTRL3_ADDR 0x12
  34. #define ST_LIS2DU12_ST_MASK GENMASK(1, 0)
  35. #define ST_LIS2DU12_CTRL4_ADDR 0x13
  36. #define ST_LIS2DU12_BOOT_MASK BIT(0)
  37. #define ST_LIS2DU12_BDU_MASK BIT(5)
  38. #define ST_LIS2DU12_CTRL5_ADDR 0x14
  39. #define ST_LIS2DU12_ODR_MASK GENMASK(7, 4)
  40. #define ST_LIS2DU12_FS_MASK GENMASK(1, 0)
  41. #define ST_LIS2DU12_FIFO_CTRL_ADDR 0x15
  42. #define ST_LIS2DU12_FIFOMODE_MASK GENMASK(3, 0)
  43. #define ST_LIS2DU12_ROUNDING_XYZ_MASK BIT(7)
  44. #define ST_LIS2DU12_FIFO_WTM_ADDR 0x16
  45. #define ST_LIS2DU12_FTH_MASK GENMASK(6, 0)
  46. #define ST_LIS2DU12_INTERRUPT_CFG_ADDR 0x17
  47. #define ST_LIS2DU12_INTERRUPTS_ENABLE_MASK BIT(0)
  48. #define ST_LIS2DU12_LIR_MASK BIT(1)
  49. #define ST_LIS2DU12_H_LACTIVE_MASK BIT(2)
  50. #define ST_LIS2DU12_SLEEP_STATUS_ON_INT_MASK BIT(3)
  51. #define ST_LIS2DU12_INT_SHORT_EN_MASK BIT(6)
  52. #define ST_LIS2DU12_TAP_THS_X_ADDR 0x18
  53. #define ST_LIS2DU12_D4D_EN_MASK BIT(7)
  54. #define ST_LIS2DU12_D6D_THS_MASK GENMASK(6, 5)
  55. #define ST_LIS2DU12_TAP_THS_X_MASK GENMASK(4, 0)
  56. #define ST_LIS2DU12_TAP_THS_Y_ADDR 0x19
  57. #define ST_LIS2DU12_TAP_PRIORITY_MASK GENMASK(7, 5)
  58. #define ST_LIS2DU12_TAP_THS_Y_MASK GENMASK(4, 0)
  59. #define ST_LIS2DU12_TAP_THS_Z_ADDR 0x1a
  60. #define ST_LIS2DU12_TAP_EN_MASK GENMASK(7, 5)
  61. #define ST_LIS2DU12_TAP_THS_Z_MASK GENMASK(4, 0)
  62. #define ST_LIS2DU12_INT_DUR_ADDR 0x1b
  63. #define ST_LIS2DU12_SHOCK_MASK GENMASK(1, 0)
  64. #define ST_LIS2DU12_QUIET_MASK GENMASK(3, 2)
  65. #define ST_LIS2DU12_LATENCY_MASK GENMASK(7, 4)
  66. #define ST_LIS2DU12_WAKE_UP_THS_ADDR 0x1c
  67. #define ST_LIS2DU12_WK_THS_MASK GENMASK(5, 0)
  68. #define ST_LIS2DU12_SLEEP_ON_MASK BIT(6)
  69. #define ST_LIS2DU12_SINGLE_DOUBLE_TAP_MASK BIT(7)
  70. #define ST_LIS2DU12_WAKE_UP_DUR_ADDR 0x1d
  71. #define ST_LIS2DU12_SLEEP_DUR_MASK GENMASK(3, 0)
  72. #define ST_LIS2DU12_WAKE_DUR_MASK GENMASK(6, 5)
  73. #define ST_LIS2DU12_FF_DUR5_MASK BIT(7)
  74. #define ST_LIS2DU12_FREE_FALL_ADDR 0x1e
  75. #define ST_LIS2DU12_FF_THS_MASK GENMASK(2, 0)
  76. #define ST_LIS2DU12_FF_DUR_MASK GENMASK(7, 3)
  77. #define ST_LIS2DU12_MD1_CFG_ADDR 0x1f
  78. #define ST_LIS2DU12_MD2_CFG_ADDR 0x20
  79. #define ST_LIS2DU12_MD_INT_MASK GENMASK(7, 2)
  80. #define ST_LIS2DU12_INT_6D_MASK BIT(2)
  81. #define ST_LIS2DU12_INT_DOUBLE_TAP_MASK BIT(3)
  82. #define ST_LIS2DU12_INT_FF_MASK BIT(4)
  83. #define ST_LIS2DU12_INT_WU_MASK BIT(5)
  84. #define ST_LIS2DU12_INT_SINGLE_TAP_MASK BIT(6)
  85. #define ST_LIS2DU12_INT_SLEEP_CHANGE_MASK BIT(7)
  86. #define ST_LIS2DU12_WAKE_UP_SRC_ADDR 0x21
  87. #define ST_LIS2DU12_WU_MASK GENMASK(3, 0)
  88. #define ST_LIS2DU12_WU_IA_MASK BIT(3)
  89. #define ST_LIS2DU12_SLEEP_STATE_MASK BIT(4)
  90. #define ST_LIS2DU12_FF_IA_MASK BIT(5)
  91. #define ST_LIS2DU12_SLEEP_CHANGE_IA_MASK BIT(6)
  92. #define ST_LIS2DU12_TAP_SRC_ADDR 0x22
  93. #define ST_LIS2DU12_DOUBLE_TAP_IA_MASK BIT(4)
  94. #define ST_LIS2DU12_SINGLE_TAP_IA_MASK BIT(5)
  95. #define ST_LIS2DU12_SIXD_SRC_ADDR 0x23
  96. #define ST_LIS2DU12_OVERTHRESHOLD_MASK GENMASK(5, 0)
  97. #define ST_LIS2DU12_D6D_IA_MASK BIT(6)
  98. #define ST_LIS2DU12_ALL_INT_SRC_ADDR 0x24
  99. #define ST_LIS2DU12_FF_IA_ALL_MASK BIT(0)
  100. #define ST_LIS2DU12_WU_IA_ALL_MASK BIT(1)
  101. #define ST_LIS2DU12_SINGLE_TAP_ALL_MASK BIT(2)
  102. #define ST_LIS2DU12_DOUBLE_TAP_ALL_MASK BIT(3)
  103. #define ST_LIS2DU12_D6D_IA_ALL_MASK BIT(4)
  104. #define ST_LIS2DU12_SLEEP_CHANGE_IA_ALL_MASK BIT(5)
  105. #define ST_LIS2DU12_INT_GLOBAL_MASK BIT(6)
  106. #define ST_LIS2DU12_STATUS_ADDR 0x25
  107. #define ST_LIS2DU12_DRDY_MASK BIT(0)
  108. #define ST_LIS2DU12_FIFO_STATUS1_ADDR 0x26
  109. #define ST_LIS2DU12_FTH_WTM_MASK BIT(7)
  110. #define ST_LIS2DU12_FIFO_STATUS2_ADDR 0x27
  111. #define ST_LIS2DU12_FSS_MASK GENMASK(7, 0)
  112. #define ST_LIS2DU12_OUT_X_L_ADDR 0x28
  113. #define ST_LIS2DU12_OUT_Y_L_ADDR 0x2a
  114. #define ST_LIS2DU12_OUT_Z_L_ADDR 0x2c
  115. #define ST_LIS2DU12_TEMP_L_ADDR 0x30
  116. #define ST_LIS2DU12_WHOAMI_ADDR 0x43
  117. #define ST_LIS2DU12_WHOAMI_VAL 0x45
  118. #define ST_LIS2DU12_ST_SIGN_ADDR 0x58
  119. #define ST_LIS2DU12_STSIGN_MASK GENMASK(7, 5)
  120. #define ST_LIS2DU12_SHIFT_VAL(val, mask) (((val) << __ffs(mask)) & (mask))
  121. #define ST_LIS2DU12_ACC_CHAN(addr, ch2, idx) \
  122. { \
  123. .type = IIO_ACCEL, \
  124. .address = addr, \
  125. .modified = 1, \
  126. .channel2 = ch2, \
  127. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
  128. BIT(IIO_CHAN_INFO_SCALE), \
  129. .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
  130. .scan_index = idx, \
  131. .scan_type = { \
  132. .sign = 's', \
  133. .realbits = 12, \
  134. .storagebits = 16, \
  135. .shift = 4, \
  136. .endianness = IIO_LE, \
  137. }, \
  138. }
  139. #define ST_LIS2DU12_TEMP_CHAN(addr, ch2) \
  140. { \
  141. .type = IIO_TEMP, \
  142. .address = addr, \
  143. .modified = 1, \
  144. .channel2 = ch2, \
  145. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
  146. BIT(IIO_CHAN_INFO_OFFSET) | \
  147. BIT(IIO_CHAN_INFO_SCALE), \
  148. .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
  149. .scan_index = 0, \
  150. .scan_type = { \
  151. .sign = 's', \
  152. .realbits = 12, \
  153. .storagebits = 16, \
  154. .shift = 4, \
  155. .endianness = IIO_LE, \
  156. }, \
  157. }
  158. #define ST_LIS2DU12_EVENT_CHANNEL(chan_type, evt_spec) \
  159. { \
  160. .type = chan_type, \
  161. .modified = 0, \
  162. .scan_index = -1, \
  163. .indexed = -1, \
  164. .event_spec = evt_spec, \
  165. .num_event_specs = 1, \
  166. }
  167. enum st_lis2du12_fifo_mode {
  168. ST_LIS2DU12_FIFO_BYPASS = 0x0,
  169. ST_LIS2DU12_FIFO_CONTINUOUS = 0x6,
  170. };
  171. enum st_lis2du12_selftest_status {
  172. ST_LIS2DU12_ST_RESET,
  173. ST_LIS2DU12_ST_PASS,
  174. ST_LIS2DU12_ST_FAIL,
  175. };
  176. enum st_lis2du12_sensor_id {
  177. ST_LIS2DU12_ID_ACC,
  178. ST_LIS2DU12_ID_TEMP,
  179. ST_LIS2DU12_ID_TAP_TAP,
  180. ST_LIS2DU12_ID_TAP,
  181. ST_LIS2DU12_ID_WU,
  182. ST_LIS2DU12_ID_FF,
  183. ST_LIS2DU12_ID_6D,
  184. ST_LIS2DU12_ID_ACT,
  185. ST_LIS2DU12_ID_MAX,
  186. };
  187. enum st_lis2du12_attr_id {
  188. ST_LIS2DU12_WK_THS_ATTR_ID = 0x0,
  189. ST_LIS2DU12_WK_DUR_ATTR_ID,
  190. ST_LIS2DU12_FF_THS_ATTR_ID,
  191. ST_LIS2DU12_FF_DUR_ATTR_ID,
  192. ST_LIS2DU12_6D_THS_ATTR_ID,
  193. ST_LIS2DU12_LATENCY_ATTR_ID,
  194. ST_LIS2DU12_QUIET_ATTR_ID,
  195. ST_LIS2DU12_SHOCK_ATTR_ID,
  196. ST_LIS2DU12_TAP_PRIORITY_ATTR_ID,
  197. ST_LIS2DU12_TAP_THRESHOLD_X_ATTR_ID,
  198. ST_LIS2DU12_TAP_THRESHOLD_Y_ATTR_ID,
  199. ST_LIS2DU12_TAP_THRESHOLD_Z_ATTR_ID,
  200. ST_LIS2DU12_TAP_ENABLE_ATTR_ID,
  201. ST_LIS2DU12_SLEEP_DUR_ATTR_ID,
  202. };
  203. #define ST_LIS2DU12_MAX_BUFFER ST_LIS2DU12_ID_TEMP
  204. struct st_lis2du12_sensor {
  205. enum st_lis2du12_sensor_id id;
  206. struct st_lis2du12_hw *hw;
  207. u16 odr;
  208. u32 uodr;
  209. union {
  210. struct {
  211. u16 gain;
  212. u32 offset;
  213. u8 watermark;
  214. };
  215. struct {
  216. u8 wk_en;
  217. u8 d6d_ths;
  218. u8 tap_ths_x;
  219. u8 tap_ths_y;
  220. u8 tap_ths_z;
  221. u8 tap_priority;
  222. u8 tap_en;
  223. u8 latency;
  224. u8 quiet;
  225. u8 shock;
  226. u8 wh_ths;
  227. u8 wh_dur;
  228. u8 sleep_dur;
  229. u8 ff_dur;
  230. u8 ff_ths;
  231. };
  232. };
  233. };
  234. struct st_lis2du12_hw {
  235. struct device *dev;
  236. int irq;
  237. struct regmap *regmap;
  238. struct mutex fifo_lock;
  239. struct mutex lock;
  240. struct iio_dev *iio_devs[ST_LIS2DU12_ID_MAX];
  241. enum st_lis2du12_selftest_status st_status;
  242. enum st_lis2du12_fifo_mode fifo_mode;
  243. u16 enable_mask;
  244. u8 fifo_watermark;
  245. bool round_xl_xyz;
  246. u8 std_level;
  247. u64 samples;
  248. s64 delta_ts;
  249. s64 ts_irq;
  250. s64 ts;
  251. u8 drdy_reg;
  252. u8 md_reg;
  253. bool fourd_enabled;
  254. };
  255. extern const struct dev_pm_ops st_lis2du12_pm_ops;
  256. static inline s64 st_lis2du12_get_timestamp(struct st_lis2du12_hw *hw)
  257. {
  258. return iio_get_time_ns(hw->iio_devs[ST_LIS2DU12_ID_ACC]);
  259. }
  260. static inline bool
  261. st_lis2du12_interrupts_enabled(struct st_lis2du12_hw *hw)
  262. {
  263. return hw->enable_mask & (BIT(ST_LIS2DU12_ID_FF) |
  264. BIT(ST_LIS2DU12_ID_TAP_TAP) |
  265. BIT(ST_LIS2DU12_ID_TAP) |
  266. BIT(ST_LIS2DU12_ID_WU) |
  267. BIT(ST_LIS2DU12_ID_6D) |
  268. BIT(ST_LIS2DU12_ID_ACT));
  269. }
  270. static inline bool
  271. st_lis2du12_fifo_enabled(struct st_lis2du12_hw *hw)
  272. {
  273. return hw->enable_mask & (BIT(ST_LIS2DU12_ID_ACC) |
  274. BIT(ST_LIS2DU12_ID_TEMP));
  275. }
  276. static inline int
  277. st_lis2du12_read_locked(struct st_lis2du12_hw *hw, unsigned int addr,
  278. void *val, unsigned int len)
  279. {
  280. int err;
  281. mutex_lock(&hw->lock);
  282. err = regmap_bulk_read(hw->regmap, addr, val, len);
  283. mutex_unlock(&hw->lock);
  284. return err;
  285. }
  286. static inline struct st_lis2du12_sensor *
  287. st_lis2du12_get_sensor_from_id(struct st_lis2du12_hw *hw,
  288. enum st_lis2du12_sensor_id id)
  289. {
  290. return iio_priv(hw->iio_devs[id]);
  291. }
  292. int st_lis2du12_probe(struct device *dev, int irq,
  293. struct regmap *regmap);
  294. int st_lis2du12_buffer_setup(struct st_lis2du12_hw *hw);
  295. ssize_t st_lis2du12_flush_fifo(struct device *dev,
  296. struct device_attribute *attr,
  297. const char *buf, size_t size);
  298. ssize_t st_lis2du12_set_hwfifo_watermark(struct device *device,
  299. struct device_attribute *attr,
  300. const char *buf, size_t size);
  301. int st_lis2du12_sensor_set_enable(struct st_lis2du12_sensor *sensor,
  302. bool enable);
  303. #endif /* ST_LIS2DU12_H */