mirror of
https://github.com/nxp-imx/linux-imx.git
synced 2025-07-06 17:35:20 +02:00
iio: pressure: bmp280: Allow multiple chips id per family of devices
[ Upstream commit33564435c8
] Improve device detection in certain chip families known to have various chip IDs. When no ID matches, give a warning but follow along what device said on the firmware side and try to configure it. Signed-off-by: Angel Iglesias <ang.iglesiasg@gmail.com> Link: https://lore.kernel.org/r/eade22d11e9de4405ea19fdaa5a8249143ae94df.1697994521.git.ang.iglesiasg@gmail.com Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> Stable-dep-of:b9065b0250
("iio: pressure: bmp280: Fix regmap for BMP280 device") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
c059a2661a
commit
afe335a6c5
|
@ -794,10 +794,12 @@ static int bmp280_chip_config(struct bmp280_data *data)
|
|||
}
|
||||
|
||||
static const int bmp280_oversampling_avail[] = { 1, 2, 4, 8, 16 };
|
||||
static const u8 bmp280_chip_ids[] = { BMP280_CHIP_ID };
|
||||
|
||||
const struct bmp280_chip_info bmp280_chip_info = {
|
||||
.id_reg = BMP280_REG_ID,
|
||||
.chip_id = BMP280_CHIP_ID,
|
||||
.chip_id = bmp280_chip_ids,
|
||||
.num_chip_id = ARRAY_SIZE(bmp280_chip_ids),
|
||||
.regmap_config = &bmp280_regmap_config,
|
||||
.start_up_time = 2000,
|
||||
.channels = bmp280_channels,
|
||||
|
@ -846,9 +848,12 @@ static int bme280_chip_config(struct bmp280_data *data)
|
|||
return bmp280_chip_config(data);
|
||||
}
|
||||
|
||||
static const u8 bme280_chip_ids[] = { BME280_CHIP_ID };
|
||||
|
||||
const struct bmp280_chip_info bme280_chip_info = {
|
||||
.id_reg = BMP280_REG_ID,
|
||||
.chip_id = BME280_CHIP_ID,
|
||||
.chip_id = bme280_chip_ids,
|
||||
.num_chip_id = ARRAY_SIZE(bme280_chip_ids),
|
||||
.regmap_config = &bmp280_regmap_config,
|
||||
.start_up_time = 2000,
|
||||
.channels = bmp280_channels,
|
||||
|
@ -1220,10 +1225,12 @@ static int bmp380_chip_config(struct bmp280_data *data)
|
|||
|
||||
static const int bmp380_oversampling_avail[] = { 1, 2, 4, 8, 16, 32 };
|
||||
static const int bmp380_iir_filter_coeffs_avail[] = { 1, 2, 4, 8, 16, 32, 64, 128};
|
||||
static const u8 bmp380_chip_ids[] = { BMP380_CHIP_ID };
|
||||
|
||||
const struct bmp280_chip_info bmp380_chip_info = {
|
||||
.id_reg = BMP380_REG_ID,
|
||||
.chip_id = BMP380_CHIP_ID,
|
||||
.chip_id = bmp380_chip_ids,
|
||||
.num_chip_id = ARRAY_SIZE(bmp380_chip_ids),
|
||||
.regmap_config = &bmp380_regmap_config,
|
||||
.start_up_time = 2000,
|
||||
.channels = bmp380_channels,
|
||||
|
@ -1720,10 +1727,12 @@ static int bmp580_chip_config(struct bmp280_data *data)
|
|||
}
|
||||
|
||||
static const int bmp580_oversampling_avail[] = { 1, 2, 4, 8, 16, 32, 64, 128 };
|
||||
static const u8 bmp580_chip_ids[] = { BMP580_CHIP_ID, BMP580_CHIP_ID_ALT };
|
||||
|
||||
const struct bmp280_chip_info bmp580_chip_info = {
|
||||
.id_reg = BMP580_REG_CHIP_ID,
|
||||
.chip_id = BMP580_CHIP_ID,
|
||||
.chip_id = bmp580_chip_ids,
|
||||
.num_chip_id = ARRAY_SIZE(bmp580_chip_ids),
|
||||
.regmap_config = &bmp580_regmap_config,
|
||||
.start_up_time = 2000,
|
||||
.channels = bmp380_channels,
|
||||
|
@ -1983,10 +1992,12 @@ static int bmp180_chip_config(struct bmp280_data *data)
|
|||
|
||||
static const int bmp180_oversampling_temp_avail[] = { 1 };
|
||||
static const int bmp180_oversampling_press_avail[] = { 1, 2, 4, 8 };
|
||||
static const u8 bmp180_chip_ids[] = { BMP180_CHIP_ID };
|
||||
|
||||
const struct bmp280_chip_info bmp180_chip_info = {
|
||||
.id_reg = BMP280_REG_ID,
|
||||
.chip_id = BMP180_CHIP_ID,
|
||||
.chip_id = bmp180_chip_ids,
|
||||
.num_chip_id = ARRAY_SIZE(bmp180_chip_ids),
|
||||
.regmap_config = &bmp180_regmap_config,
|
||||
.start_up_time = 2000,
|
||||
.channels = bmp280_channels,
|
||||
|
@ -2077,6 +2088,7 @@ int bmp280_common_probe(struct device *dev,
|
|||
struct bmp280_data *data;
|
||||
struct gpio_desc *gpiod;
|
||||
unsigned int chip_id;
|
||||
unsigned int i;
|
||||
int ret;
|
||||
|
||||
indio_dev = devm_iio_device_alloc(dev, sizeof(*data));
|
||||
|
@ -2142,12 +2154,17 @@ int bmp280_common_probe(struct device *dev,
|
|||
ret = regmap_read(regmap, data->chip_info->id_reg, &chip_id);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
if (chip_id != data->chip_info->chip_id) {
|
||||
dev_err(dev, "bad chip id: expected %x got %x\n",
|
||||
data->chip_info->chip_id, chip_id);
|
||||
return -EINVAL;
|
||||
|
||||
for (i = 0; i < data->chip_info->num_chip_id; i++) {
|
||||
if (chip_id == data->chip_info->chip_id[i]) {
|
||||
dev_info(dev, "0x%x is a known chip id for %s\n", chip_id, name);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i == data->chip_info->num_chip_id)
|
||||
dev_warn(dev, "bad chip id: 0x%x is not a known chip id\n", chip_id);
|
||||
|
||||
if (data->chip_info->preinit) {
|
||||
ret = data->chip_info->preinit(data);
|
||||
if (ret)
|
||||
|
|
|
@ -418,7 +418,8 @@ struct bmp280_data {
|
|||
|
||||
struct bmp280_chip_info {
|
||||
unsigned int id_reg;
|
||||
const unsigned int chip_id;
|
||||
const u8 *chip_id;
|
||||
int num_chip_id;
|
||||
|
||||
const struct regmap_config *regmap_config;
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user