st_lps22df.h 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * STMicroelectronics lps22df driver
  4. *
  5. * MEMS Software Solutions Team
  6. *
  7. * Copyright 2021 STMicroelectronics Inc.
  8. */
  9. #ifndef __ST_LPS22DF_H
  10. #define __ST_LPS22DF_H
  11. #include <linux/module.h>
  12. #include <linux/types.h>
  13. #include <linux/iio/iio.h>
  14. #include <linux/property.h>
  15. #include <linux/iio/trigger.h>
  16. #include "../common/stm_iio_types.h"
  17. #define ST_LPS22DF_DEV_NAME "lps22df"
  18. #define ST_LPS28DFW_DEV_NAME "lps28dfw"
  19. #define ST_LPS22DF_MAX_FIFO_LENGTH 127
  20. #define ST_LPS22DF_INTERRUPT_CFG_ADDR 0x0b
  21. #define ST_LPS22DF_LIR_MASK BIT(2)
  22. #define ST_LPS22DF_WHO_AM_I_ADDR 0x0f
  23. #define ST_LPS22DF_WHO_AM_I_VAL 0xb4
  24. #define ST_LPS22DF_CTRL_REG1_ADDR 0x10
  25. #define ST_LPS22DF_AVG_MASK GENMASK(2, 0)
  26. #define ST_LPS22DF_ODR_MASK GENMASK(6, 3)
  27. #define ST_LPS22DF_CTRL_REG2_ADDR 0x11
  28. #define ST_LPS22DF_SWRESET_MASK BIT(2)
  29. #define ST_LPS22DF_BDU_MASK BIT(3)
  30. #define ST_LPS22DF_EN_LPFP_MASK BIT(4)
  31. #define ST_LPS22DF_FS_MODE_MASK BIT(6)
  32. #define ST_LPS22DF_BOOT_MASK BIT(7)
  33. #define ST_LPS22DF_CTRL3_ADDR 0x12
  34. #define ST_LPS22DF_IF_ADD_INC_MASK BIT(0)
  35. #define ST_LPS22DF_PP_OD_MASK BIT(1)
  36. #define ST_LPS22DF_INT_H_L_MASK BIT(3)
  37. #define ST_LPS22DF_CTRL4_ADDR 0x13
  38. #define ST_LPS22DF_INT_F_WTM_MASK BIT(1)
  39. #define ST_LPS22DF_FIFO_CTRL_ADDR 0x14
  40. #define ST_LPS22DF_FIFO_MODE_MASK GENMASK(1, 0)
  41. #define ST_LPS22DF_FIFO_WTM_ADDR 0x15
  42. #define ST_LPS22DF_FIFO_THS_MASK GENMASK(6, 0)
  43. #define ST_LPS22DF_FIFO_STATUS1_ADDR 0x25
  44. #define ST_LPS22DF_FIFO_SRC_DIFF_MASK GENMASK(7, 0)
  45. #define ST_LPS22DF_FIFO_STATUS2_ADDR 0x26
  46. #define ST_LPS22DF_FIFO_WTM_IA_MASK BIT(7)
  47. #define ST_LPS22DF_PRESS_OUT_XL_ADDR 0x28
  48. #define ST_LPS22DF_TEMP_OUT_L_ADDR 0x2b
  49. #define ST_LPS22DF_FIFO_DATA_OUT_PRESS_XL_ADDR 0x78
  50. #define ST_LPS22DF_PRESS_1260_FS_AVL_GAIN (1000000000UL / 4096UL)
  51. #define ST_LPS22DF_PRESS_4060_FS_AVL_GAIN (1000000000UL / 2048UL)
  52. #define ST_LPS22DF_TEMP_FS_AVL_GAIN 100
  53. #define ST_LPS22DF_ODR_LIST_NUM 9
  54. enum st_lps22df_sensor_type {
  55. ST_LPS22DF_PRESS = 0,
  56. ST_LPS22DF_TEMP,
  57. ST_LPS22DF_SENSORS_NUMB,
  58. };
  59. enum st_lps22df_fifo_mode {
  60. ST_LPS22DF_BYPASS = 0x0,
  61. ST_LPS22DF_STREAM = 0x2,
  62. };
  63. #define ST_LPS22DF_PRESS_SAMPLE_LEN 3
  64. #define ST_LPS22DF_TEMP_SAMPLE_LEN 2
  65. #define ST_LPS22DF_TX_MAX_LENGTH 64
  66. #define ST_LPS22DF_RX_MAX_LENGTH ((ST_LPS22DF_MAX_FIFO_LENGTH + 1) * \
  67. ST_LPS22DF_PRESS_SAMPLE_LEN)
  68. struct st_lps22df_transfer_buffer {
  69. u8 rx_buf[ST_LPS22DF_RX_MAX_LENGTH];
  70. u8 tx_buf[ST_LPS22DF_TX_MAX_LENGTH] ____cacheline_aligned;
  71. };
  72. struct st_lps22df_transfer_function {
  73. int (*write)(struct device *dev, u8 addr, int len, u8 *data);
  74. int (*read)(struct device *dev, u8 addr, int len, u8 *data);
  75. };
  76. enum st_lps22df_hw_id {
  77. ST_LPS22DF_ID,
  78. ST_LPS28DFW_ID,
  79. ST_LPS22DF_MAX_ID,
  80. };
  81. struct st_lps22df_fs {
  82. u32 gain;
  83. u8 val;
  84. };
  85. struct st_lps22df_fs_table_t {
  86. u8 addr;
  87. u8 mask;
  88. u8 fs_len;
  89. struct st_lps22df_fs fs_avl[2];
  90. };
  91. struct st_lps22df_settings {
  92. struct {
  93. enum st_lps22df_hw_id hw_id;
  94. const char *name;
  95. } id[ST_LPS22DF_MAX_ID];
  96. struct st_lps22df_fs_table_t fs_table;
  97. bool st_multi_scale;
  98. };
  99. struct st_lps22df_hw {
  100. struct device *dev;
  101. int irq;
  102. struct mutex fifo_lock;
  103. struct mutex lock;
  104. u8 watermark;
  105. struct iio_dev *iio_devs[ST_LPS22DF_SENSORS_NUMB];
  106. u8 enable_mask;
  107. u8 odr;
  108. s64 last_fifo_ts;
  109. s64 delta_ts;
  110. s64 ts_irq;
  111. s64 ts;
  112. const struct st_lps22df_settings *settings;
  113. const struct st_lps22df_transfer_function *tf;
  114. struct st_lps22df_transfer_buffer tb;
  115. };
  116. struct st_lps22df_sensor {
  117. struct st_lps22df_hw *hw;
  118. enum st_lps22df_sensor_type type;
  119. char name[32];
  120. u32 gain;
  121. u8 odr;
  122. };
  123. int st_lps22df_common_probe(struct device *dev, int irq, int hw_id,
  124. const struct st_lps22df_transfer_function *tf_ops);
  125. int st_lps22df_write_with_mask(struct st_lps22df_hw *hw, u8 addr, u8 mask,
  126. u8 data);
  127. int st_lps22df_allocate_buffers(struct st_lps22df_hw *hw);
  128. int st_lps22df_set_enable(struct st_lps22df_sensor *sensor, bool enable);
  129. ssize_t st_lps22df_sysfs_set_hwfifo_watermark(struct device *dev,
  130. struct device_attribute *attr,
  131. const char *buf, size_t count);
  132. ssize_t st_lps22df_sysfs_flush_fifo(struct device *dev,
  133. struct device_attribute *attr,
  134. const char *buf, size_t size);
  135. #endif /* __ST_LPS22DF_H */