162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#include <linux/bitops.h>
362306a36Sopenharmony_ci#include <linux/device.h>
462306a36Sopenharmony_ci#include <linux/iio/iio.h>
562306a36Sopenharmony_ci#include <linux/regmap.h>
662306a36Sopenharmony_ci#include <linux/regulator/consumer.h>
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci/* BMP580 specific registers */
1062306a36Sopenharmony_ci#define BMP580_REG_CMD			0x7E
1162306a36Sopenharmony_ci#define BMP580_REG_EFF_OSR		0x38
1262306a36Sopenharmony_ci#define BMP580_REG_ODR_CONFIG		0x37
1362306a36Sopenharmony_ci#define BMP580_REG_OSR_CONFIG		0x36
1462306a36Sopenharmony_ci#define BMP580_REG_IF_CONFIG		0x13
1562306a36Sopenharmony_ci#define BMP580_REG_REV_ID		0x02
1662306a36Sopenharmony_ci#define BMP580_REG_CHIP_ID		0x01
1762306a36Sopenharmony_ci/* OOR allows to configure a pressure alarm */
1862306a36Sopenharmony_ci#define BMP580_REG_OOR_CONFIG		0x35
1962306a36Sopenharmony_ci#define BMP580_REG_OOR_RANGE		0x34
2062306a36Sopenharmony_ci#define BMP580_REG_OOR_THR_MSB		0x33
2162306a36Sopenharmony_ci#define BMP580_REG_OOR_THR_LSB		0x32
2262306a36Sopenharmony_ci/* DSP registers (IIR filters) */
2362306a36Sopenharmony_ci#define BMP580_REG_DSP_IIR		0x31
2462306a36Sopenharmony_ci#define BMP580_REG_DSP_CONFIG		0x30
2562306a36Sopenharmony_ci/* NVM access registers */
2662306a36Sopenharmony_ci#define BMP580_REG_NVM_DATA_MSB		0x2D
2762306a36Sopenharmony_ci#define BMP580_REG_NVM_DATA_LSB		0x2C
2862306a36Sopenharmony_ci#define BMP580_REG_NVM_ADDR		0x2B
2962306a36Sopenharmony_ci/* Status registers */
3062306a36Sopenharmony_ci#define BMP580_REG_STATUS		0x28
3162306a36Sopenharmony_ci#define BMP580_REG_INT_STATUS		0x27
3262306a36Sopenharmony_ci#define BMP580_REG_CHIP_STATUS		0x11
3362306a36Sopenharmony_ci/* Data registers */
3462306a36Sopenharmony_ci#define BMP580_REG_FIFO_DATA		0x29
3562306a36Sopenharmony_ci#define BMP580_REG_PRESS_MSB		0x22
3662306a36Sopenharmony_ci#define BMP580_REG_PRESS_LSB		0x21
3762306a36Sopenharmony_ci#define BMP580_REG_PRESS_XLSB		0x20
3862306a36Sopenharmony_ci#define BMP580_REG_TEMP_MSB		0x1F
3962306a36Sopenharmony_ci#define BMP580_REG_TEMP_LSB		0x1E
4062306a36Sopenharmony_ci#define BMP580_REG_TEMP_XLSB		0x1D
4162306a36Sopenharmony_ci/* FIFO config registers */
4262306a36Sopenharmony_ci#define BMP580_REG_FIFO_SEL		0x18
4362306a36Sopenharmony_ci#define BMP580_REG_FIFO_COUNT		0x17
4462306a36Sopenharmony_ci#define BMP580_REG_FIFO_CONFIG		0x16
4562306a36Sopenharmony_ci/* Interruptions config registers */
4662306a36Sopenharmony_ci#define BMP580_REG_INT_SOURCE		0x15
4762306a36Sopenharmony_ci#define BMP580_REG_INT_CONFIG		0x14
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci#define BMP580_CMD_NOOP			0x00
5062306a36Sopenharmony_ci#define BMP580_CMD_EXTMODE_SEQ_0	0x73
5162306a36Sopenharmony_ci#define BMP580_CMD_EXTMODE_SEQ_1	0xB4
5262306a36Sopenharmony_ci#define BMP580_CMD_EXTMODE_SEQ_2	0x69
5362306a36Sopenharmony_ci#define BMP580_CMD_NVM_OP_SEQ_0		0x5D
5462306a36Sopenharmony_ci#define BMP580_CMD_NVM_READ_SEQ_1	0xA5
5562306a36Sopenharmony_ci#define BMP580_CMD_NVM_WRITE_SEQ_1	0xA0
5662306a36Sopenharmony_ci#define BMP580_CMD_SOFT_RESET		0xB6
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci#define BMP580_INT_STATUS_POR_MASK	BIT(4)
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci#define BMP580_STATUS_CORE_RDY_MASK	BIT(0)
6162306a36Sopenharmony_ci#define BMP580_STATUS_NVM_RDY_MASK	BIT(1)
6262306a36Sopenharmony_ci#define BMP580_STATUS_NVM_ERR_MASK	BIT(2)
6362306a36Sopenharmony_ci#define BMP580_STATUS_NVM_CMD_ERR_MASK	BIT(3)
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci#define BMP580_OSR_PRESS_MASK		GENMASK(5, 3)
6662306a36Sopenharmony_ci#define BMP580_OSR_TEMP_MASK		GENMASK(2, 0)
6762306a36Sopenharmony_ci#define BMP580_OSR_PRESS_EN		BIT(6)
6862306a36Sopenharmony_ci#define BMP580_EFF_OSR_PRESS_MASK	GENMASK(5, 3)
6962306a36Sopenharmony_ci#define BMP580_EFF_OSR_TEMP_MASK	GENMASK(2, 0)
7062306a36Sopenharmony_ci#define BMP580_EFF_OSR_VALID_ODR	BIT(7)
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci#define BMP580_ODR_MASK			GENMASK(6, 2)
7362306a36Sopenharmony_ci#define BMP580_MODE_MASK		GENMASK(1, 0)
7462306a36Sopenharmony_ci#define BMP580_MODE_SLEEP		0
7562306a36Sopenharmony_ci#define BMP580_MODE_NORMAL		1
7662306a36Sopenharmony_ci#define BMP580_MODE_FORCED		2
7762306a36Sopenharmony_ci#define BMP580_MODE_CONTINOUS		3
7862306a36Sopenharmony_ci#define BMP580_ODR_DEEPSLEEP_DIS	BIT(7)
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci#define BMP580_DSP_COMP_MASK		GENMASK(1, 0)
8162306a36Sopenharmony_ci#define BMP580_DSP_COMP_DIS		0
8262306a36Sopenharmony_ci#define BMP580_DSP_TEMP_COMP_EN		1
8362306a36Sopenharmony_ci/*
8462306a36Sopenharmony_ci * In section 7.27 of datasheet, modes 2 and 3 are technically the same.
8562306a36Sopenharmony_ci * Pressure compensation means also enabling temperature compensation
8662306a36Sopenharmony_ci */
8762306a36Sopenharmony_ci#define BMP580_DSP_PRESS_COMP_EN	2
8862306a36Sopenharmony_ci#define BMP580_DSP_PRESS_TEMP_COMP_EN	3
8962306a36Sopenharmony_ci#define BMP580_DSP_IIR_FORCED_FLUSH	BIT(2)
9062306a36Sopenharmony_ci#define BMP580_DSP_SHDW_IIR_TEMP_EN	BIT(3)
9162306a36Sopenharmony_ci#define BMP580_DSP_FIFO_IIR_TEMP_EN	BIT(4)
9262306a36Sopenharmony_ci#define BMP580_DSP_SHDW_IIR_PRESS_EN	BIT(5)
9362306a36Sopenharmony_ci#define BMP580_DSP_FIFO_IIR_PRESS_EN	BIT(6)
9462306a36Sopenharmony_ci#define BMP580_DSP_OOR_IIR_PRESS_EN	BIT(7)
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ci#define BMP580_DSP_IIR_PRESS_MASK	GENMASK(5, 3)
9762306a36Sopenharmony_ci#define BMP580_DSP_IIR_TEMP_MASK	GENMASK(2, 0)
9862306a36Sopenharmony_ci#define BMP580_FILTER_OFF		0
9962306a36Sopenharmony_ci#define BMP580_FILTER_1X		1
10062306a36Sopenharmony_ci#define BMP580_FILTER_3X		2
10162306a36Sopenharmony_ci#define BMP580_FILTER_7X		3
10262306a36Sopenharmony_ci#define BMP580_FILTER_15X		4
10362306a36Sopenharmony_ci#define BMP580_FILTER_31X		5
10462306a36Sopenharmony_ci#define BMP580_FILTER_63X		6
10562306a36Sopenharmony_ci#define BMP580_FILTER_127X		7
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_ci#define BMP580_NVM_ROW_ADDR_MASK	GENMASK(5, 0)
10862306a36Sopenharmony_ci#define BMP580_NVM_PROG_EN		BIT(6)
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ci#define BMP580_TEMP_SKIPPED		0x7f7f7f
11162306a36Sopenharmony_ci#define BMP580_PRESS_SKIPPED		0x7f7f7f
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ci/* BMP380 specific registers */
11462306a36Sopenharmony_ci#define BMP380_REG_CMD			0x7E
11562306a36Sopenharmony_ci#define BMP380_REG_CONFIG		0x1F
11662306a36Sopenharmony_ci#define BMP380_REG_ODR			0x1D
11762306a36Sopenharmony_ci#define BMP380_REG_OSR			0x1C
11862306a36Sopenharmony_ci#define BMP380_REG_POWER_CONTROL	0x1B
11962306a36Sopenharmony_ci#define BMP380_REG_IF_CONFIG		0x1A
12062306a36Sopenharmony_ci#define BMP380_REG_INT_CONTROL		0x19
12162306a36Sopenharmony_ci#define BMP380_REG_INT_STATUS		0x11
12262306a36Sopenharmony_ci#define BMP380_REG_EVENT		0x10
12362306a36Sopenharmony_ci#define BMP380_REG_STATUS		0x03
12462306a36Sopenharmony_ci#define BMP380_REG_ERROR		0x02
12562306a36Sopenharmony_ci#define BMP380_REG_ID			0x00
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_ci#define BMP380_REG_FIFO_CONFIG_1	0x18
12862306a36Sopenharmony_ci#define BMP380_REG_FIFO_CONFIG_2	0x17
12962306a36Sopenharmony_ci#define BMP380_REG_FIFO_WATERMARK_MSB	0x16
13062306a36Sopenharmony_ci#define BMP380_REG_FIFO_WATERMARK_LSB	0x15
13162306a36Sopenharmony_ci#define BMP380_REG_FIFO_DATA		0x14
13262306a36Sopenharmony_ci#define BMP380_REG_FIFO_LENGTH_MSB	0x13
13362306a36Sopenharmony_ci#define BMP380_REG_FIFO_LENGTH_LSB	0x12
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_ci#define BMP380_REG_SENSOR_TIME_MSB	0x0E
13662306a36Sopenharmony_ci#define BMP380_REG_SENSOR_TIME_LSB	0x0D
13762306a36Sopenharmony_ci#define BMP380_REG_SENSOR_TIME_XLSB	0x0C
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_ci#define BMP380_REG_TEMP_MSB		0x09
14062306a36Sopenharmony_ci#define BMP380_REG_TEMP_LSB		0x08
14162306a36Sopenharmony_ci#define BMP380_REG_TEMP_XLSB		0x07
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_ci#define BMP380_REG_PRESS_MSB		0x06
14462306a36Sopenharmony_ci#define BMP380_REG_PRESS_LSB		0x05
14562306a36Sopenharmony_ci#define BMP380_REG_PRESS_XLSB		0x04
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_ci#define BMP380_REG_CALIB_TEMP_START	0x31
14862306a36Sopenharmony_ci#define BMP380_CALIB_REG_COUNT		21
14962306a36Sopenharmony_ci
15062306a36Sopenharmony_ci#define BMP380_FILTER_MASK		GENMASK(3, 1)
15162306a36Sopenharmony_ci#define BMP380_FILTER_OFF		0
15262306a36Sopenharmony_ci#define BMP380_FILTER_1X		1
15362306a36Sopenharmony_ci#define BMP380_FILTER_3X		2
15462306a36Sopenharmony_ci#define BMP380_FILTER_7X		3
15562306a36Sopenharmony_ci#define BMP380_FILTER_15X		4
15662306a36Sopenharmony_ci#define BMP380_FILTER_31X		5
15762306a36Sopenharmony_ci#define BMP380_FILTER_63X		6
15862306a36Sopenharmony_ci#define BMP380_FILTER_127X		7
15962306a36Sopenharmony_ci
16062306a36Sopenharmony_ci#define BMP380_OSRS_TEMP_MASK		GENMASK(5, 3)
16162306a36Sopenharmony_ci#define BMP380_OSRS_PRESS_MASK		GENMASK(2, 0)
16262306a36Sopenharmony_ci
16362306a36Sopenharmony_ci#define BMP380_ODRS_MASK		GENMASK(4, 0)
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_ci#define BMP380_CTRL_SENSORS_MASK	GENMASK(1, 0)
16662306a36Sopenharmony_ci#define BMP380_CTRL_SENSORS_PRESS_EN	BIT(0)
16762306a36Sopenharmony_ci#define BMP380_CTRL_SENSORS_TEMP_EN	BIT(1)
16862306a36Sopenharmony_ci#define BMP380_MODE_MASK		GENMASK(5, 4)
16962306a36Sopenharmony_ci#define BMP380_MODE_SLEEP		0
17062306a36Sopenharmony_ci#define BMP380_MODE_FORCED		1
17162306a36Sopenharmony_ci#define BMP380_MODE_NORMAL		3
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_ci#define BMP380_MIN_TEMP			-4000
17462306a36Sopenharmony_ci#define BMP380_MAX_TEMP			8500
17562306a36Sopenharmony_ci#define BMP380_MIN_PRES			3000000
17662306a36Sopenharmony_ci#define BMP380_MAX_PRES			12500000
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_ci#define BMP380_CMD_NOOP			0x00
17962306a36Sopenharmony_ci#define BMP380_CMD_EXTMODE_EN_MID	0x34
18062306a36Sopenharmony_ci#define BMP380_CMD_FIFO_FLUSH		0xB0
18162306a36Sopenharmony_ci#define BMP380_CMD_SOFT_RESET		0xB6
18262306a36Sopenharmony_ci
18362306a36Sopenharmony_ci#define BMP380_STATUS_CMD_RDY_MASK	BIT(4)
18462306a36Sopenharmony_ci#define BMP380_STATUS_DRDY_PRESS_MASK	BIT(5)
18562306a36Sopenharmony_ci#define BMP380_STATUS_DRDY_TEMP_MASK	BIT(6)
18662306a36Sopenharmony_ci
18762306a36Sopenharmony_ci#define BMP380_ERR_FATAL_MASK		BIT(0)
18862306a36Sopenharmony_ci#define BMP380_ERR_CMD_MASK		BIT(1)
18962306a36Sopenharmony_ci#define BMP380_ERR_CONF_MASK		BIT(2)
19062306a36Sopenharmony_ci
19162306a36Sopenharmony_ci#define BMP380_TEMP_SKIPPED		0x800000
19262306a36Sopenharmony_ci#define BMP380_PRESS_SKIPPED		0x800000
19362306a36Sopenharmony_ci
19462306a36Sopenharmony_ci/* BMP280 specific registers */
19562306a36Sopenharmony_ci#define BMP280_REG_HUMIDITY_LSB		0xFE
19662306a36Sopenharmony_ci#define BMP280_REG_HUMIDITY_MSB		0xFD
19762306a36Sopenharmony_ci#define BMP280_REG_TEMP_XLSB		0xFC
19862306a36Sopenharmony_ci#define BMP280_REG_TEMP_LSB		0xFB
19962306a36Sopenharmony_ci#define BMP280_REG_TEMP_MSB		0xFA
20062306a36Sopenharmony_ci#define BMP280_REG_PRESS_XLSB		0xF9
20162306a36Sopenharmony_ci#define BMP280_REG_PRESS_LSB		0xF8
20262306a36Sopenharmony_ci#define BMP280_REG_PRESS_MSB		0xF7
20362306a36Sopenharmony_ci
20462306a36Sopenharmony_ci/* Helper mask to truncate excess 4 bits on pressure and temp readings */
20562306a36Sopenharmony_ci#define BMP280_MEAS_TRIM_MASK		GENMASK(24, 4)
20662306a36Sopenharmony_ci
20762306a36Sopenharmony_ci#define BMP280_REG_CONFIG		0xF5
20862306a36Sopenharmony_ci#define BMP280_REG_CTRL_MEAS		0xF4
20962306a36Sopenharmony_ci#define BMP280_REG_STATUS		0xF3
21062306a36Sopenharmony_ci#define BMP280_REG_CTRL_HUMIDITY	0xF2
21162306a36Sopenharmony_ci
21262306a36Sopenharmony_ci/* Due to non linear mapping, and data sizes we can't do a bulk read */
21362306a36Sopenharmony_ci#define BMP280_REG_COMP_H1		0xA1
21462306a36Sopenharmony_ci#define BMP280_REG_COMP_H2		0xE1
21562306a36Sopenharmony_ci#define BMP280_REG_COMP_H3		0xE3
21662306a36Sopenharmony_ci#define BMP280_REG_COMP_H4		0xE4
21762306a36Sopenharmony_ci#define BMP280_REG_COMP_H5		0xE5
21862306a36Sopenharmony_ci#define BMP280_REG_COMP_H6		0xE7
21962306a36Sopenharmony_ci
22062306a36Sopenharmony_ci#define BMP280_REG_COMP_TEMP_START	0x88
22162306a36Sopenharmony_ci#define BMP280_COMP_TEMP_REG_COUNT	6
22262306a36Sopenharmony_ci
22362306a36Sopenharmony_ci#define BMP280_REG_COMP_PRESS_START	0x8E
22462306a36Sopenharmony_ci#define BMP280_COMP_PRESS_REG_COUNT	18
22562306a36Sopenharmony_ci
22662306a36Sopenharmony_ci#define BMP280_COMP_H5_MASK		GENMASK(15, 4)
22762306a36Sopenharmony_ci
22862306a36Sopenharmony_ci#define BMP280_CONTIGUOUS_CALIB_REGS	(BMP280_COMP_TEMP_REG_COUNT + \
22962306a36Sopenharmony_ci					 BMP280_COMP_PRESS_REG_COUNT)
23062306a36Sopenharmony_ci
23162306a36Sopenharmony_ci#define BMP280_FILTER_MASK		GENMASK(4, 2)
23262306a36Sopenharmony_ci#define BMP280_FILTER_OFF		0
23362306a36Sopenharmony_ci#define BMP280_FILTER_2X		1
23462306a36Sopenharmony_ci#define BMP280_FILTER_4X		2
23562306a36Sopenharmony_ci#define BMP280_FILTER_8X		3
23662306a36Sopenharmony_ci#define BMP280_FILTER_16X		4
23762306a36Sopenharmony_ci
23862306a36Sopenharmony_ci#define BMP280_OSRS_HUMIDITY_MASK	GENMASK(2, 0)
23962306a36Sopenharmony_ci#define BMP280_OSRS_HUMIDITY_SKIP	0
24062306a36Sopenharmony_ci#define BMP280_OSRS_HUMIDITY_1X		1
24162306a36Sopenharmony_ci#define BMP280_OSRS_HUMIDITY_2X		2
24262306a36Sopenharmony_ci#define BMP280_OSRS_HUMIDITY_4X		3
24362306a36Sopenharmony_ci#define BMP280_OSRS_HUMIDITY_8X		4
24462306a36Sopenharmony_ci#define BMP280_OSRS_HUMIDITY_16X	5
24562306a36Sopenharmony_ci
24662306a36Sopenharmony_ci#define BMP280_OSRS_TEMP_MASK		GENMASK(7, 5)
24762306a36Sopenharmony_ci#define BMP280_OSRS_TEMP_SKIP		0
24862306a36Sopenharmony_ci#define BMP280_OSRS_TEMP_1X		1
24962306a36Sopenharmony_ci#define BMP280_OSRS_TEMP_2X		2
25062306a36Sopenharmony_ci#define BMP280_OSRS_TEMP_4X		3
25162306a36Sopenharmony_ci#define BMP280_OSRS_TEMP_8X		4
25262306a36Sopenharmony_ci#define BMP280_OSRS_TEMP_16X		5
25362306a36Sopenharmony_ci
25462306a36Sopenharmony_ci#define BMP280_OSRS_PRESS_MASK		GENMASK(4, 2)
25562306a36Sopenharmony_ci#define BMP280_OSRS_PRESS_SKIP		0
25662306a36Sopenharmony_ci#define BMP280_OSRS_PRESS_1X		1
25762306a36Sopenharmony_ci#define BMP280_OSRS_PRESS_2X		2
25862306a36Sopenharmony_ci#define BMP280_OSRS_PRESS_4X		3
25962306a36Sopenharmony_ci#define BMP280_OSRS_PRESS_8X		4
26062306a36Sopenharmony_ci#define BMP280_OSRS_PRESS_16X		5
26162306a36Sopenharmony_ci
26262306a36Sopenharmony_ci#define BMP280_MODE_MASK		GENMASK(1, 0)
26362306a36Sopenharmony_ci#define BMP280_MODE_SLEEP		0
26462306a36Sopenharmony_ci#define BMP280_MODE_FORCED		1
26562306a36Sopenharmony_ci#define BMP280_MODE_NORMAL		3
26662306a36Sopenharmony_ci
26762306a36Sopenharmony_ci/* BMP180 specific registers */
26862306a36Sopenharmony_ci#define BMP180_REG_OUT_XLSB		0xF8
26962306a36Sopenharmony_ci#define BMP180_REG_OUT_LSB		0xF7
27062306a36Sopenharmony_ci#define BMP180_REG_OUT_MSB		0xF6
27162306a36Sopenharmony_ci
27262306a36Sopenharmony_ci#define BMP180_REG_CALIB_START		0xAA
27362306a36Sopenharmony_ci#define BMP180_REG_CALIB_COUNT		22
27462306a36Sopenharmony_ci
27562306a36Sopenharmony_ci#define BMP180_MEAS_CTRL_MASK		GENMASK(4, 0)
27662306a36Sopenharmony_ci#define BMP180_MEAS_TEMP		0x0E
27762306a36Sopenharmony_ci#define BMP180_MEAS_PRESS		0x14
27862306a36Sopenharmony_ci#define BMP180_MEAS_SCO			BIT(5)
27962306a36Sopenharmony_ci#define BMP180_OSRS_PRESS_MASK		GENMASK(7, 6)
28062306a36Sopenharmony_ci#define BMP180_MEAS_PRESS_1X		0
28162306a36Sopenharmony_ci#define BMP180_MEAS_PRESS_2X		1
28262306a36Sopenharmony_ci#define BMP180_MEAS_PRESS_4X		2
28362306a36Sopenharmony_ci#define BMP180_MEAS_PRESS_8X		3
28462306a36Sopenharmony_ci
28562306a36Sopenharmony_ci/* BMP180 and BMP280 common registers */
28662306a36Sopenharmony_ci#define BMP280_REG_CTRL_MEAS		0xF4
28762306a36Sopenharmony_ci#define BMP280_REG_RESET		0xE0
28862306a36Sopenharmony_ci#define BMP280_REG_ID			0xD0
28962306a36Sopenharmony_ci
29062306a36Sopenharmony_ci#define BMP380_CHIP_ID			0x50
29162306a36Sopenharmony_ci#define BMP580_CHIP_ID			0x50
29262306a36Sopenharmony_ci#define BMP580_CHIP_ID_ALT		0x51
29362306a36Sopenharmony_ci#define BMP180_CHIP_ID			0x55
29462306a36Sopenharmony_ci#define BMP280_CHIP_ID			0x58
29562306a36Sopenharmony_ci#define BME280_CHIP_ID			0x60
29662306a36Sopenharmony_ci#define BMP280_SOFT_RESET_VAL		0xB6
29762306a36Sopenharmony_ci
29862306a36Sopenharmony_ci/* BMP280 register skipped special values */
29962306a36Sopenharmony_ci#define BMP280_TEMP_SKIPPED		0x80000
30062306a36Sopenharmony_ci#define BMP280_PRESS_SKIPPED		0x80000
30162306a36Sopenharmony_ci#define BMP280_HUMIDITY_SKIPPED		0x8000
30262306a36Sopenharmony_ci
30362306a36Sopenharmony_ci/* Core exported structs */
30462306a36Sopenharmony_ci
30562306a36Sopenharmony_cistatic const char *const bmp280_supply_names[] = {
30662306a36Sopenharmony_ci	"vddd", "vdda"
30762306a36Sopenharmony_ci};
30862306a36Sopenharmony_ci
30962306a36Sopenharmony_ci#define BMP280_NUM_SUPPLIES ARRAY_SIZE(bmp280_supply_names)
31062306a36Sopenharmony_ci
31162306a36Sopenharmony_cistruct bmp180_calib {
31262306a36Sopenharmony_ci	s16 AC1;
31362306a36Sopenharmony_ci	s16 AC2;
31462306a36Sopenharmony_ci	s16 AC3;
31562306a36Sopenharmony_ci	u16 AC4;
31662306a36Sopenharmony_ci	u16 AC5;
31762306a36Sopenharmony_ci	u16 AC6;
31862306a36Sopenharmony_ci	s16 B1;
31962306a36Sopenharmony_ci	s16 B2;
32062306a36Sopenharmony_ci	s16 MB;
32162306a36Sopenharmony_ci	s16 MC;
32262306a36Sopenharmony_ci	s16 MD;
32362306a36Sopenharmony_ci};
32462306a36Sopenharmony_ci
32562306a36Sopenharmony_ci/* See datasheet Section 4.2.2. */
32662306a36Sopenharmony_cistruct bmp280_calib {
32762306a36Sopenharmony_ci	u16 T1;
32862306a36Sopenharmony_ci	s16 T2;
32962306a36Sopenharmony_ci	s16 T3;
33062306a36Sopenharmony_ci	u16 P1;
33162306a36Sopenharmony_ci	s16 P2;
33262306a36Sopenharmony_ci	s16 P3;
33362306a36Sopenharmony_ci	s16 P4;
33462306a36Sopenharmony_ci	s16 P5;
33562306a36Sopenharmony_ci	s16 P6;
33662306a36Sopenharmony_ci	s16 P7;
33762306a36Sopenharmony_ci	s16 P8;
33862306a36Sopenharmony_ci	s16 P9;
33962306a36Sopenharmony_ci	u8  H1;
34062306a36Sopenharmony_ci	s16 H2;
34162306a36Sopenharmony_ci	u8  H3;
34262306a36Sopenharmony_ci	s16 H4;
34362306a36Sopenharmony_ci	s16 H5;
34462306a36Sopenharmony_ci	s8  H6;
34562306a36Sopenharmony_ci};
34662306a36Sopenharmony_ci
34762306a36Sopenharmony_ci/* See datasheet Section 3.11.1. */
34862306a36Sopenharmony_cistruct bmp380_calib {
34962306a36Sopenharmony_ci	u16 T1;
35062306a36Sopenharmony_ci	u16 T2;
35162306a36Sopenharmony_ci	s8  T3;
35262306a36Sopenharmony_ci	s16 P1;
35362306a36Sopenharmony_ci	s16 P2;
35462306a36Sopenharmony_ci	s8  P3;
35562306a36Sopenharmony_ci	s8  P4;
35662306a36Sopenharmony_ci	u16 P5;
35762306a36Sopenharmony_ci	u16 P6;
35862306a36Sopenharmony_ci	s8  P7;
35962306a36Sopenharmony_ci	s8  P8;
36062306a36Sopenharmony_ci	s16 P9;
36162306a36Sopenharmony_ci	s8  P10;
36262306a36Sopenharmony_ci	s8  P11;
36362306a36Sopenharmony_ci};
36462306a36Sopenharmony_ci
36562306a36Sopenharmony_cistruct bmp280_data {
36662306a36Sopenharmony_ci	struct device *dev;
36762306a36Sopenharmony_ci	struct mutex lock;
36862306a36Sopenharmony_ci	struct regmap *regmap;
36962306a36Sopenharmony_ci	struct completion done;
37062306a36Sopenharmony_ci	bool use_eoc;
37162306a36Sopenharmony_ci	const struct bmp280_chip_info *chip_info;
37262306a36Sopenharmony_ci	union {
37362306a36Sopenharmony_ci		struct bmp180_calib bmp180;
37462306a36Sopenharmony_ci		struct bmp280_calib bmp280;
37562306a36Sopenharmony_ci		struct bmp380_calib bmp380;
37662306a36Sopenharmony_ci	} calib;
37762306a36Sopenharmony_ci	struct regulator_bulk_data supplies[BMP280_NUM_SUPPLIES];
37862306a36Sopenharmony_ci	unsigned int start_up_time; /* in microseconds */
37962306a36Sopenharmony_ci
38062306a36Sopenharmony_ci	/* log of base 2 of oversampling rate */
38162306a36Sopenharmony_ci	u8 oversampling_press;
38262306a36Sopenharmony_ci	u8 oversampling_temp;
38362306a36Sopenharmony_ci	u8 oversampling_humid;
38462306a36Sopenharmony_ci	u8 iir_filter_coeff;
38562306a36Sopenharmony_ci
38662306a36Sopenharmony_ci	/*
38762306a36Sopenharmony_ci	 * BMP380 devices introduce sampling frequency configuration. See
38862306a36Sopenharmony_ci	 * datasheet sections 3.3.3. and 4.3.19 for more details.
38962306a36Sopenharmony_ci	 *
39062306a36Sopenharmony_ci	 * BMx280 devices allowed indirect configuration of sampling frequency
39162306a36Sopenharmony_ci	 * changing the t_standby duration between measurements, as detailed on
39262306a36Sopenharmony_ci	 * section 3.6.3 of the datasheet.
39362306a36Sopenharmony_ci	 */
39462306a36Sopenharmony_ci	int sampling_freq;
39562306a36Sopenharmony_ci
39662306a36Sopenharmony_ci	/*
39762306a36Sopenharmony_ci	 * Carryover value from temperature conversion, used in pressure
39862306a36Sopenharmony_ci	 * calculation.
39962306a36Sopenharmony_ci	 */
40062306a36Sopenharmony_ci	s32 t_fine;
40162306a36Sopenharmony_ci
40262306a36Sopenharmony_ci	/*
40362306a36Sopenharmony_ci	 * DMA (thus cache coherency maintenance) may require the
40462306a36Sopenharmony_ci	 * transfer buffers to live in their own cache lines.
40562306a36Sopenharmony_ci	 */
40662306a36Sopenharmony_ci	union {
40762306a36Sopenharmony_ci		/* Sensor data buffer */
40862306a36Sopenharmony_ci		u8 buf[3];
40962306a36Sopenharmony_ci		/* Calibration data buffers */
41062306a36Sopenharmony_ci		__le16 bmp280_cal_buf[BMP280_CONTIGUOUS_CALIB_REGS / 2];
41162306a36Sopenharmony_ci		__be16 bmp180_cal_buf[BMP180_REG_CALIB_COUNT / 2];
41262306a36Sopenharmony_ci		u8 bmp380_cal_buf[BMP380_CALIB_REG_COUNT];
41362306a36Sopenharmony_ci		/* Miscellaneous, endianess-aware data buffers */
41462306a36Sopenharmony_ci		__le16 le16;
41562306a36Sopenharmony_ci		__be16 be16;
41662306a36Sopenharmony_ci	} __aligned(IIO_DMA_MINALIGN);
41762306a36Sopenharmony_ci};
41862306a36Sopenharmony_ci
41962306a36Sopenharmony_cistruct bmp280_chip_info {
42062306a36Sopenharmony_ci	unsigned int id_reg;
42162306a36Sopenharmony_ci	const unsigned int chip_id;
42262306a36Sopenharmony_ci
42362306a36Sopenharmony_ci	const struct regmap_config *regmap_config;
42462306a36Sopenharmony_ci
42562306a36Sopenharmony_ci	const struct iio_chan_spec *channels;
42662306a36Sopenharmony_ci	int num_channels;
42762306a36Sopenharmony_ci	unsigned int start_up_time;
42862306a36Sopenharmony_ci
42962306a36Sopenharmony_ci	const int *oversampling_temp_avail;
43062306a36Sopenharmony_ci	int num_oversampling_temp_avail;
43162306a36Sopenharmony_ci	int oversampling_temp_default;
43262306a36Sopenharmony_ci
43362306a36Sopenharmony_ci	const int *oversampling_press_avail;
43462306a36Sopenharmony_ci	int num_oversampling_press_avail;
43562306a36Sopenharmony_ci	int oversampling_press_default;
43662306a36Sopenharmony_ci
43762306a36Sopenharmony_ci	const int *oversampling_humid_avail;
43862306a36Sopenharmony_ci	int num_oversampling_humid_avail;
43962306a36Sopenharmony_ci	int oversampling_humid_default;
44062306a36Sopenharmony_ci
44162306a36Sopenharmony_ci	const int *iir_filter_coeffs_avail;
44262306a36Sopenharmony_ci	int num_iir_filter_coeffs_avail;
44362306a36Sopenharmony_ci	int iir_filter_coeff_default;
44462306a36Sopenharmony_ci
44562306a36Sopenharmony_ci	const int (*sampling_freq_avail)[2];
44662306a36Sopenharmony_ci	int num_sampling_freq_avail;
44762306a36Sopenharmony_ci	int sampling_freq_default;
44862306a36Sopenharmony_ci
44962306a36Sopenharmony_ci	int (*chip_config)(struct bmp280_data *);
45062306a36Sopenharmony_ci	int (*read_temp)(struct bmp280_data *, int *, int *);
45162306a36Sopenharmony_ci	int (*read_press)(struct bmp280_data *, int *, int *);
45262306a36Sopenharmony_ci	int (*read_humid)(struct bmp280_data *, int *, int *);
45362306a36Sopenharmony_ci	int (*read_calib)(struct bmp280_data *);
45462306a36Sopenharmony_ci	int (*preinit)(struct bmp280_data *);
45562306a36Sopenharmony_ci};
45662306a36Sopenharmony_ci
45762306a36Sopenharmony_ci/* Chip infos for each variant */
45862306a36Sopenharmony_ciextern const struct bmp280_chip_info bmp180_chip_info;
45962306a36Sopenharmony_ciextern const struct bmp280_chip_info bmp280_chip_info;
46062306a36Sopenharmony_ciextern const struct bmp280_chip_info bme280_chip_info;
46162306a36Sopenharmony_ciextern const struct bmp280_chip_info bmp380_chip_info;
46262306a36Sopenharmony_ciextern const struct bmp280_chip_info bmp580_chip_info;
46362306a36Sopenharmony_ci
46462306a36Sopenharmony_ci/* Regmap configurations */
46562306a36Sopenharmony_ciextern const struct regmap_config bmp180_regmap_config;
46662306a36Sopenharmony_ciextern const struct regmap_config bmp280_regmap_config;
46762306a36Sopenharmony_ciextern const struct regmap_config bmp380_regmap_config;
46862306a36Sopenharmony_ciextern const struct regmap_config bmp580_regmap_config;
46962306a36Sopenharmony_ci
47062306a36Sopenharmony_ci/* Probe called from different transports */
47162306a36Sopenharmony_ciint bmp280_common_probe(struct device *dev,
47262306a36Sopenharmony_ci			struct regmap *regmap,
47362306a36Sopenharmony_ci			const struct bmp280_chip_info *,
47462306a36Sopenharmony_ci			const char *name,
47562306a36Sopenharmony_ci			int irq);
47662306a36Sopenharmony_ci
47762306a36Sopenharmony_ci/* PM ops */
47862306a36Sopenharmony_ciextern const struct dev_pm_ops bmp280_dev_pm_ops;
479