summaryrefslogtreecommitdiffstats
path: root/drivers/iio/pressure/bmp280.h
blob: b546d7727a964524dba119644d0357b7b3f7c145 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
/* SPDX-License-Identifier: GPL-2.0 */
#include <linux/bitops.h>
#include <linux/device.h>
#include <linux/regmap.h>

/* BMP380 specific registers */
#define BMP380_REG_CMD			0x7E
#define BMP380_REG_CONFIG		0x1F
#define BMP380_REG_ODR			0x1D
#define BMP380_REG_OSR			0x1C
#define BMP380_REG_POWER_CONTROL	0x1B
#define BMP380_REG_IF_CONFIG		0x1A
#define BMP380_REG_INT_CONTROL		0x19
#define BMP380_REG_INT_STATUS		0x11
#define BMP380_REG_EVENT		0x10
#define BMP380_REG_STATUS		0x03
#define BMP380_REG_ERROR		0x02
#define BMP380_REG_ID			0x00

#define BMP380_REG_FIFO_CONFIG_1	0x18
#define BMP380_REG_FIFO_CONFIG_2	0x17
#define BMP380_REG_FIFO_WATERMARK_MSB	0x16
#define BMP380_REG_FIFO_WATERMARK_LSB	0x15
#define BMP380_REG_FIFO_DATA		0x14
#define BMP380_REG_FIFO_LENGTH_MSB	0x13
#define BMP380_REG_FIFO_LENGTH_LSB	0x12

#define BMP380_REG_SENSOR_TIME_MSB	0x0E
#define BMP380_REG_SENSOR_TIME_LSB	0x0D
#define BMP380_REG_SENSOR_TIME_XLSB	0x0C

#define BMP380_REG_TEMP_MSB		0x09
#define BMP380_REG_TEMP_LSB		0x08
#define BMP380_REG_TEMP_XLSB		0x07

#define BMP380_REG_PRESS_MSB		0x06
#define BMP380_REG_PRESS_LSB		0x05
#define BMP380_REG_PRESS_XLSB		0x04

#define BMP380_REG_CALIB_TEMP_START	0x31
#define BMP380_CALIB_REG_COUNT		21

#define BMP380_FILTER_MASK		GENMASK(3, 1)
#define BMP380_FILTER_OFF		0
#define BMP380_FILTER_1X		1
#define BMP380_FILTER_3X		2
#define BMP380_FILTER_7X		3
#define BMP380_FILTER_15X		4
#define BMP380_FILTER_31X		5
#define BMP380_FILTER_63X		6
#define BMP380_FILTER_127X		7

#define BMP380_OSRS_TEMP_MASK		GENMASK(5, 3)
#define BMP380_OSRS_PRESS_MASK		GENMASK(2, 0)

#define BMP380_ODRS_MASK		GENMASK(4, 0)
#define BMP380_ODRS_200HZ		0x00
#define BMP380_ODRS_100HZ		0x01
#define BMP380_ODRS_50HZ		0x02
#define BMP380_ODRS_25HZ		0x03
#define BMP380_ODRS_12_5HZ		0x04
#define BMP380_ODRS_6_25HZ		0x05
#define BMP380_ODRS_3_1HZ		0x06
#define BMP380_ODRS_1_5HZ		0x07
#define BMP380_ODRS_0_78HZ		0x08
#define BMP380_ODRS_0_39HZ		0x09
#define BMP380_ODRS_0_2HZ		0x0A
#define BMP380_ODRS_0_1HZ		0x0B
#define BMP380_ODRS_0_05HZ		0x0C
#define BMP380_ODRS_0_02HZ		0x0D
#define BMP380_ODRS_0_01HZ		0x0E
#define BMP380_ODRS_0_006HZ		0x0F
#define BMP380_ODRS_0_003HZ		0x10
#define BMP380_ODRS_0_0015HZ		0x11

#define BMP380_CTRL_SENSORS_MASK	GENMASK(1, 0)
#define BMP380_CTRL_SENSORS_PRESS_EN	BIT(0)
#define BMP380_CTRL_SENSORS_TEMP_EN	BIT(1)
#define BMP380_MODE_MASK		GENMASK(5, 4)
#define BMP380_MODE_SLEEP		0
#define BMP380_MODE_FORCED		1
#define BMP380_MODE_NORMAL		3

#define BMP380_MIN_TEMP			-4000
#define BMP380_MAX_TEMP			8500
#define BMP380_MIN_PRES			3000000
#define BMP380_MAX_PRES			12500000

#define BMP380_CMD_NOOP			0x00
#define BMP380_CMD_EXTMODE_EN_MID	0x34
#define BMP380_CMD_FIFO_FLUSH		0xB0
#define BMP380_CMD_SOFT_RESET		0xB6

#define BMP380_STATUS_CMD_RDY_MASK	BIT(4)
#define BMP380_STATUS_DRDY_PRESS_MASK	BIT(5)
#define BMP380_STATUS_DRDY_TEMP_MASK	BIT(6)

#define BMP380_ERR_FATAL_MASK		BIT(0)
#define BMP380_ERR_CMD_MASK		BIT(1)
#define BMP380_ERR_CONF_MASK		BIT(2)

#define BMP380_TEMP_SKIPPED		0x800000
#define BMP380_PRESS_SKIPPED		0x800000

/* BMP280 specific registers */
#define BMP280_REG_HUMIDITY_LSB		0xFE
#define BMP280_REG_HUMIDITY_MSB		0xFD
#define BMP280_REG_TEMP_XLSB		0xFC
#define BMP280_REG_TEMP_LSB		0xFB
#define BMP280_REG_TEMP_MSB		0xFA
#define BMP280_REG_PRESS_XLSB		0xF9
#define BMP280_REG_PRESS_LSB		0xF8
#define BMP280_REG_PRESS_MSB		0xF7

/* Helper mask to truncate excess 4 bits on pressure and temp readings */
#define BMP280_MEAS_TRIM_MASK		GENMASK(24, 4)

#define BMP280_REG_CONFIG		0xF5
#define BMP280_REG_CTRL_MEAS		0xF4
#define BMP280_REG_STATUS		0xF3
#define BMP280_REG_CTRL_HUMIDITY	0xF2

/* Due to non linear mapping, and data sizes we can't do a bulk read */
#define BMP280_REG_COMP_H1		0xA1
#define BMP280_REG_COMP_H2		0xE1
#define BMP280_REG_COMP_H3		0xE3
#define BMP280_REG_COMP_H4		0xE4
#define BMP280_REG_COMP_H5		0xE5
#define BMP280_REG_COMP_H6		0xE7

#define BMP280_REG_COMP_TEMP_START	0x88
#define BMP280_COMP_TEMP_REG_COUNT	6

#define BMP280_REG_COMP_PRESS_START	0x8E
#define BMP280_COMP_PRESS_REG_COUNT	18

#define BMP280_COMP_H5_MASK		GENMASK(15, 4)

#define BMP280_CONTIGUOUS_CALIB_REGS	(BMP280_COMP_TEMP_REG_COUNT + \
					 BMP280_COMP_PRESS_REG_COUNT)

#define BMP280_FILTER_MASK		GENMASK(4, 2)
#define BMP280_FILTER_OFF		0
#define BMP280_FILTER_2X		1
#define BMP280_FILTER_4X		2
#define BMP280_FILTER_8X		3
#define BMP280_FILTER_16X		4

#define BMP280_OSRS_HUMIDITY_MASK	GENMASK(2, 0)
#define BMP280_OSRS_HUMIDITY_SKIP	0
#define BMP280_OSRS_HUMIDITY_1X		1
#define BMP280_OSRS_HUMIDITY_2X		2
#define BMP280_OSRS_HUMIDITY_4X		3
#define BMP280_OSRS_HUMIDITY_8X		4
#define BMP280_OSRS_HUMIDITY_16X	5

#define BMP280_OSRS_TEMP_MASK		GENMASK(7, 5)
#define BMP280_OSRS_TEMP_SKIP		0
#define BMP280_OSRS_TEMP_1X		1
#define BMP280_OSRS_TEMP_2X		2
#define BMP280_OSRS_TEMP_4X		3
#define BMP280_OSRS_TEMP_8X		4
#define BMP280_OSRS_TEMP_16X		5

#define BMP280_OSRS_PRESS_MASK		GENMASK(4, 2)
#define BMP280_OSRS_PRESS_SKIP		0
#define BMP280_OSRS_PRESS_1X		1
#define BMP280_OSRS_PRESS_2X		2
#define BMP280_OSRS_PRESS_4X		3
#define BMP280_OSRS_PRESS_8X		4
#define BMP280_OSRS_PRESS_16X		5

#define BMP280_MODE_MASK		GENMASK(1, 0)
#define BMP280_MODE_SLEEP		0
#define BMP280_MODE_FORCED		1
#define BMP280_MODE_NORMAL		3

/* BMP180 specific registers */
#define BMP180_REG_OUT_XLSB		0xF8
#define BMP180_REG_OUT_LSB		0xF7
#define BMP180_REG_OUT_MSB		0xF6

#define BMP180_REG_CALIB_START		0xAA
#define BMP180_REG_CALIB_COUNT		22

#define BMP180_MEAS_CTRL_MASK		GENMASK(4, 0)
#define BMP180_MEAS_TEMP		0x0E
#define BMP180_MEAS_PRESS		0x14
#define BMP180_MEAS_SCO			BIT(5)
#define BMP180_OSRS_PRESS_MASK		GENMASK(7, 6)
#define BMP180_MEAS_PRESS_1X		0
#define BMP180_MEAS_PRESS_2X		1
#define BMP180_MEAS_PRESS_4X		2
#define BMP180_MEAS_PRESS_8X		3

/* BMP180 and BMP280 common registers */
#define BMP280_REG_CTRL_MEAS		0xF4
#define BMP280_REG_RESET		0xE0
#define BMP280_REG_ID			0xD0

#define BMP380_CHIP_ID			0x50
#define BMP180_CHIP_ID			0x55
#define BMP280_CHIP_ID			0x58
#define BME280_CHIP_ID			0x60
#define BMP280_SOFT_RESET_VAL		0xB6

/* BMP280 register skipped special values */
#define BMP280_TEMP_SKIPPED		0x80000
#define BMP280_PRESS_SKIPPED		0x80000
#define BMP280_HUMIDITY_SKIPPED		0x8000

/* Regmap configurations */
extern const struct regmap_config bmp180_regmap_config;
extern const struct regmap_config bmp280_regmap_config;
extern const struct regmap_config bmp380_regmap_config;

/* Probe called from different transports */
int bmp280_common_probe(struct device *dev,
			struct regmap *regmap,
			unsigned int chip,
			const char *name,
			int irq);

/* PM ops */
extern const struct dev_pm_ops bmp280_dev_pm_ops;