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