From: Vasileios Amoiridis <vassilisamir@xxxxxxxxx> Remove the ambient temperature from being a macro and implement it as an attribute. This way, it is possible to dynamically configure the ambient temperature of the environment to improve the accuracy of the measurements. Signed-off-by: Vasileios Amoiridis <vassilisamir@xxxxxxxxx> --- drivers/iio/chemical/bme680.h | 1 - drivers/iio/chemical/bme680_core.c | 35 +++++++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/drivers/iio/chemical/bme680.h b/drivers/iio/chemical/bme680.h index e9e3e08fa366..95d39c154d59 100644 --- a/drivers/iio/chemical/bme680.h +++ b/drivers/iio/chemical/bme680.h @@ -45,7 +45,6 @@ #define BME680_REG_RES_HEAT_0 0x5A #define BME680_REG_GAS_WAIT_0 0x64 #define BME680_ADC_GAS_RES GENMASK(15, 6) -#define BME680_AMB_TEMP 25 #define BME680_REG_CTRL_GAS_1 0x71 #define BME680_RUN_GAS_MASK BIT(4) diff --git a/drivers/iio/chemical/bme680_core.c b/drivers/iio/chemical/bme680_core.c index 5fd5740bb7fe..0979c8f0afcf 100644 --- a/drivers/iio/chemical/bme680_core.c +++ b/drivers/iio/chemical/bme680_core.c @@ -120,6 +120,7 @@ struct bme680_data { u16 heater_temp; struct regulator_bulk_data supplies[BME680_NUM_SUPPLIES]; + int ambient_temp; union { u8 buf[3]; @@ -483,7 +484,7 @@ static u8 bme680_calc_heater_res(struct bme680_data *data, u16 temp) if (temp > 400) /* Cap temperature */ temp = 400; - var1 = (((s32)BME680_AMB_TEMP * calib->par_gh3) / 1000) * 256; + var1 = (((s32)data->ambient_temp * calib->par_gh3) / 1000) * 256; var2 = (calib->par_gh1 + 784) * (((((calib->par_gh2 + 154009) * temp * 5) / 100) + 3276800) / 10); @@ -878,6 +879,37 @@ static int bme680_write_raw(struct iio_dev *indio_dev, return ret; } +static ssize_t ambient_temp_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct iio_dev *indio_dev = dev_to_iio_dev(dev); + struct bme680_data *data = iio_priv(indio_dev); + int vals[2]; + + vals[0] = data->ambient_temp; + vals[1] = 1; + + return iio_format_value(buf, IIO_VAL_INT, 1, vals); +} + +static ssize_t ambient_temp_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t len) +{ + struct iio_dev *indio_dev = dev_to_iio_dev(dev); + struct bme680_data *data = iio_priv(indio_dev); + int ret, val_int, val_fract; + + ret = iio_str_to_fixpoint(buf, 1, &val_int, &val_fract); + if (ret) + return ret; + + data->ambient_temp = val_int; + return len; +} + +static IIO_DEVICE_ATTR_RW(ambient_temp, 0); + static const char bme680_oversampling_ratio_show[] = "1 2 4 8 16"; static IIO_CONST_ATTR(oversampling_ratio_available, @@ -885,6 +917,7 @@ static IIO_CONST_ATTR(oversampling_ratio_available, static struct attribute *bme680_attributes[] = { &iio_const_attr_oversampling_ratio_available.dev_attr.attr, + &iio_dev_attr_ambient_temp.dev_attr.attr, NULL, }; -- 2.43.0