st_lis2hh12.h 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * STMicroelectronics lis2hh12 driver
  4. *
  5. * MEMS Software Solutions Team
  6. *
  7. * Copyright 2016 STMicroelectronics Inc.
  8. */
  9. #ifndef __LIS2HH12_H
  10. #define __LIS2HH12_H
  11. #include <linux/types.h>
  12. #include <linux/iio/iio.h>
  13. #include <linux/iio/trigger.h>
  14. #include <linux/version.h>
  15. #include "../common/stm_iio_types.h"
  16. #if KERNEL_VERSION(5, 19, 0) <= LINUX_VERSION_CODE
  17. #include <linux/iio/iio-opaque.h>
  18. #endif /* LINUX_VERSION_CODE */
  19. #define LIS2HH12_WHO_AM_I_ADDR 0x0f
  20. #define LIS2HH12_WHO_AM_I_DEF 0x41
  21. #define LIS2HH12_CTRL1_ADDR 0x20
  22. #define LIS2HH12_CTRL2_ADDR 0x21
  23. #define LIS2HH12_CTRL3_ADDR 0x22
  24. #define LIS2HH12_CTRL4_ADDR 0x23
  25. #define LIS2HH12_CTRL5_ADDR 0x24
  26. #define LIS2HH12_CTRL6_ADDR 0x25
  27. #define LIS2HH12_CTRL7_ADDR 0x26
  28. #define LIS2HH12_STATUS_ADDR 0x27
  29. #define LIS2HH12_DATA_XYZ_RDY 0x08
  30. #define LIS2HH12_FIFO_CTRL_ADDR 0x2E
  31. #define LIS2HH12_OUTX_L_ADDR 0x28
  32. #define LIS2HH12_OUTY_L_ADDR 0x2A
  33. #define LIS2HH12_OUTZ_L_ADDR 0x2C
  34. #define LIS2HH12_FIFO_THS_ADDR LIS2HH12_FIFO_CTRL_ADDR
  35. #define LIS2HH12_FIFO_THS_MASK 0x1f
  36. #define LIS2HH12_FIFO_MODE_ADDR LIS2HH12_FIFO_CTRL_ADDR
  37. #define LIS2HH12_FIFO_MODE_MASK 0xe0
  38. #define LIS2HH12_FIFO_MODE_BYPASS 0x00
  39. #define LIS2HH12_FIFO_MODE_STREAM 0x02
  40. #define LIS2HH12_FIFO_SRC_ADDR 0x2F
  41. #define LIS2HH12_FIFO_STATUS_ADDR LIS2HH12_FIFO_SRC_ADDR
  42. #define LIS2HH12_FIFO_FSS_MASK 0x1F
  43. #define LIS2HH12_FIFO_SRC_FTH_MASK 0x80
  44. #define LIS2HH12_ODR_ADDR LIS2HH12_CTRL1_ADDR
  45. #define LIS2HH12_ODR_MASK 0x70
  46. #define LIS2HH12_ODR_POWER_DOWN_VAL 0x00
  47. #define LIS2HH12_ODR_10HZ_VAL 0x01
  48. #define LIS2HH12_ODR_50HZ_VAL 0x02
  49. #define LIS2HH12_ODR_100HZ_VAL 0x03
  50. #define LIS2HH12_ODR_200HZ_VAL 0x04
  51. #define LIS2HH12_ODR_400HZ_VAL 0x05
  52. #define LIS2HH12_ODR_800HZ_VAL 0x06
  53. #define LIS2HH12_ODR_LIST_NUM 7
  54. #define LIS2HH12_FS_ADDR LIS2HH12_CTRL4_ADDR
  55. #define LIS2HH12_FS_MASK 0x30
  56. #define LIS2HH12_FS_2G_VAL 0x00
  57. #define LIS2HH12_FS_4G_VAL 0x02
  58. #define LIS2HH12_FS_8G_VAL 0x03
  59. #define LIS2HH12_FS_LIST_NUM 3
  60. #define LIS2HH12_FS_2G_GAIN IIO_G_TO_M_S_2(61)
  61. #define LIS2HH12_FS_4G_GAIN IIO_G_TO_M_S_2(122)
  62. #define LIS2HH12_FS_8G_GAIN IIO_G_TO_M_S_2(244)
  63. #define LIS2HH12_INT_CFG_ADDR LIS2HH12_CTRL3_ADDR
  64. #define LIS2HH12_INT_DRDY_MASK 0x01
  65. #define LIS2HH12_INT_FTH_MASK 0x02
  66. #define LIS2HH12_INT_FOVR_MASK 0x04
  67. #define LIS2HH12_FIFO_EN_ADDR LIS2HH12_CTRL3_ADDR
  68. #define LIS2HH12_FIFO_EN_MASK 0x80
  69. #define LIS2HH12_BDU_ADDR LIS2HH12_CTRL1_ADDR
  70. #define LIS2HH12_BDU_MASK 0x08
  71. #define LIS2HH12_SOFT_RESET_ADDR LIS2HH12_CTRL5_ADDR
  72. #define LIS2HH12_SOFT_RESET_MASK 0x40
  73. #define LIS2HH12_LIR_ADDR LIS2HH12_CTRL7_ADDR
  74. #define LIS2HH12_LIR1_MASK 0x04
  75. #define LIS2HH12_LIR2_MASK 0x08
  76. #define LIS2HH12_SELF_TEST_ADDR LIS2HH12_CTRL5_ADDR
  77. #define LIS2HH12_ST_MASK 0x0c
  78. #define LIS2HH12_MAX_FIFO_LENGHT 32
  79. #define LIS2HH12_MAX_FIFO_THS (LIS2HH12_MAX_FIFO_LENGHT - 1)
  80. #define LIS2HH12_FIFO_NUM_AXIS 3
  81. #define LIS2HH12_FIFO_BYTE_X_AXIS 2
  82. #define LIS2HH12_FIFO_BYTE_FOR_SAMPLE (LIS2HH12_FIFO_NUM_AXIS * \
  83. LIS2HH12_FIFO_BYTE_X_AXIS)
  84. #define LIS2HH12_TIMESTAMP_SIZE 8
  85. #define LIS2HH12_EN_BIT 0x01
  86. #define LIS2HH12_DIS_BIT 0x00
  87. #define LIS2HH12_MAX_CHANNEL_SPEC 5
  88. #define LIS2HH12_ACCEL 0
  89. #define LIS2HH12_SENSORS_NUMB 1
  90. #define LIS2HH12_DEV_NAME "lis2hh12"
  91. #define SET_BIT(a, b) {a |= (1 << b);}
  92. #define RESET_BIT(a, b) {a &= ~(1 << b);}
  93. #define CHECK_BIT(a, b) (a & (1 << b))
  94. #define LIS2HH12_DATA_SIZE 6
  95. #define LIS2HH12_SELFTEST_MIN 1147
  96. #define LIS2HH12_SELFTEST_MAX 24590
  97. #define ST_LIS2HH12_FLUSH_CHANNEL(device_type) \
  98. { \
  99. .type = device_type, \
  100. .modified = 0, \
  101. .scan_index = -1, \
  102. .indexed = -1, \
  103. .event_spec = &lis2hh12_fifo_flush_event,\
  104. .num_event_specs = 1, \
  105. }
  106. #define ST_LIS2HH12_HWFIFO_ENABLED() \
  107. IIO_DEVICE_ATTR(hwfifo_enabled, S_IWUSR | S_IRUGO, \
  108. lis2hh12_sysfs_get_hwfifo_enabled,\
  109. lis2hh12_sysfs_set_hwfifo_enabled, 0);
  110. #define ST_LIS2HH12_HWFIFO_WATERMARK() \
  111. IIO_DEVICE_ATTR(hwfifo_watermark, S_IWUSR | S_IRUGO, \
  112. lis2hh12_sysfs_get_hwfifo_watermark,\
  113. lis2hh12_sysfs_set_hwfifo_watermark, 0);
  114. #define ST_LIS2HH12_HWFIFO_WATERMARK_MIN() \
  115. IIO_DEVICE_ATTR(hwfifo_watermark_min, S_IRUGO, \
  116. lis2hh12_sysfs_get_hwfifo_watermark_min, NULL, 0);
  117. #define ST_LIS2HH12_HWFIFO_WATERMARK_MAX() \
  118. IIO_DEVICE_ATTR(hwfifo_watermark_max, S_IRUGO, \
  119. lis2hh12_sysfs_get_hwfifo_watermark_max, NULL, 0);
  120. #define ST_LIS2HH12_HWFIFO_FLUSH() \
  121. IIO_DEVICE_ATTR(hwfifo_flush, S_IWUSR, NULL, \
  122. lis2hh12_sysfs_flush_fifo, 0);
  123. enum fifo_mode {
  124. BYPASS = 0,
  125. STREAM,
  126. };
  127. enum lis2hh12_selftest_status {
  128. LIS2HH12_ST_RESET,
  129. LIS2HH12_ST_PASS,
  130. LIS2HH12_ST_FAIL,
  131. };
  132. #define LIS2HH12_TX_MAX_LENGTH 12
  133. #define LIS2HH12_RX_MAX_LENGTH 8193
  134. struct lis2hh12_transfer_buffer {
  135. struct mutex buf_lock;
  136. u8 rx_buf[LIS2HH12_RX_MAX_LENGTH];
  137. u8 tx_buf[LIS2HH12_TX_MAX_LENGTH] ____cacheline_aligned;
  138. };
  139. struct lis2hh12_data;
  140. struct lis2hh12_transfer_function {
  141. int (*write)(struct lis2hh12_data *cdata, u8 reg_addr, int len, u8 *data);
  142. int (*read)(struct lis2hh12_data *cdata, u8 reg_addr, int len, u8 *data);
  143. };
  144. struct lis2hh12_sensor_data {
  145. struct lis2hh12_data *cdata;
  146. const char *name;
  147. s64 timestamp;
  148. u8 enabled;
  149. u32 odr;
  150. u32 gain;
  151. u8 sindex;
  152. u8 sample_to_discard;
  153. };
  154. struct lis2hh12_data {
  155. const char *name;
  156. u8 drdy_int_pin;
  157. u8 enabled_sensor;
  158. u8 hwfifo_enabled;
  159. u8 hwfifo_watermark;
  160. u32 common_odr;
  161. int irq;
  162. s64 timestamp;
  163. s64 sensor_deltatime;
  164. s64 sensor_timestamp;
  165. u8 *fifo_data;
  166. u16 fifo_size;
  167. enum lis2hh12_selftest_status st_status;
  168. struct device *dev;
  169. struct iio_dev *iio_sensors_dev[LIS2HH12_SENSORS_NUMB];
  170. struct iio_trigger *iio_trig[LIS2HH12_SENSORS_NUMB];
  171. const struct lis2hh12_transfer_function *tf;
  172. struct lis2hh12_transfer_buffer tb;
  173. };
  174. static inline int lis2hh12_iio_dev_currentmode(struct iio_dev *indio_dev)
  175. {
  176. #if KERNEL_VERSION(5, 19, 0) <= LINUX_VERSION_CODE
  177. struct iio_dev_opaque *iio_opq = to_iio_dev_opaque(indio_dev);
  178. return iio_opq->currentmode;
  179. #else /* LINUX_VERSION_CODE */
  180. return indio_dev->currentmode;
  181. #endif /* LINUX_VERSION_CODE */
  182. }
  183. int lis2hh12_common_probe(struct lis2hh12_data *cdata, int irq);
  184. #ifdef CONFIG_PM
  185. int lis2hh12_common_suspend(struct lis2hh12_data *cdata);
  186. int lis2hh12_common_resume(struct lis2hh12_data *cdata);
  187. #endif
  188. int lis2hh12_allocate_rings(struct lis2hh12_data *cdata);
  189. int lis2hh12_allocate_triggers(struct lis2hh12_data *cdata,
  190. const struct iio_trigger_ops *trigger_ops);
  191. int lis2hh12_trig_set_state(struct iio_trigger *trig, bool state);
  192. int lis2hh12_read_register(struct lis2hh12_data *cdata, u8 reg_addr, int data_len,
  193. u8 *data);
  194. int lis2hh12_update_drdy_irq(struct lis2hh12_sensor_data *sdata, bool state);
  195. int lis2hh12_set_enable(struct lis2hh12_sensor_data *sdata, bool enable);
  196. int lis2hh12_update_fifo_ths(struct lis2hh12_data *cdata, u8 fifo_len);
  197. void lis2hh12_common_remove(struct lis2hh12_data *cdata, int irq);
  198. void lis2hh12_read_fifo(struct lis2hh12_data *cdata, bool check_fifo_len);
  199. void lis2hh12_deallocate_rings(struct lis2hh12_data *cdata);
  200. void lis2hh12_deallocate_triggers(struct lis2hh12_data *cdata);
  201. int lis2hh12_set_fifo_mode(struct lis2hh12_data *cdata, enum fifo_mode fm);
  202. void lis2hh12_read_xyz(struct lis2hh12_data *cdata);
  203. #endif /* __LIS2HH12_H */