Commit 8fe050e9 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman
Browse files

Merge tag 'iio-fixes-for-6.10b' of...

Merge tag 'iio-fixes-for-6.10b' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/jic23/iio into char-misc-linus

Jonathan writes:

IIO: 2nd set of fixes for 6.10

The usual mixed bag of new stuff and long term issues that have surfaced
as a particular driver gets more adoption.

adi,ad7266
- Add missing error check that could lead to bad data being reported.
adi,ad9739a
- Fix Kconfig to not allow COMPILE_TEST to override lack SPI support.
bosch,bme680
- Fix units for pressure value (off by factor of 10)
- Fix sign on a calibration variable read back from the device
- Avoid integer overflow in compensation functions.
- Fix an issue with read sequence that leads to stale data and bad first
  reading.
freescale,fxls8962af
- Kconfig dependency fixes.
ti,hdc3020
- Fix representation of hysteresis to match ABI by being an offset from
  the current event threshold, not an absolute value.
xilinx,ams
- Don't include the ams_ctrl_channels in a computed mask.  This driver is
  making an unusual use of scan_mask (it doesn't support buffers) and that
  lead to an overflow.

* tag 'iio-fixes-for-6.10b' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/jic23/iio:
  iio: chemical: bme680: Fix sensor data read operation
  iio: chemical: bme680: Fix overflows in compensate() functions
  iio: chemical: bme680: Fix calibration data variable
  iio: chemical: bme680: Fix pressure value output
  iio: humidity: hdc3020: fix hysteresis representation
  iio: dac: fix ad9739a random config compile error
  iio: accel: fxls8962af: select IIO_BUFFER & IIO_KFIFO_BUF
  iio: adc: ad7266: Fix variable checking bug
  iio: xilinx-ams: Don't include ams_ctrl_channels in scan_mask
parents 6ba59ff4 4241665e
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -330,6 +330,8 @@ config DMARD10
config FXLS8962AF
	tristate
	depends on I2C || !I2C # cannot be built-in for modular I2C
	select IIO_BUFFER
	select IIO_KFIFO_BUF

config FXLS8962AF_I2C
	tristate "NXP FXLS8962AF/FXLS8964AF Accelerometer I2C Driver"
+2 −0
Original line number Diff line number Diff line
@@ -157,6 +157,8 @@ static int ad7266_read_raw(struct iio_dev *indio_dev,
		ret = ad7266_read_single(st, val, chan->address);
		iio_device_release_direct_mode(indio_dev);

		if (ret < 0)
			return ret;
		*val = (*val >> 2) & 0xfff;
		if (chan->scan_type.sign == 's')
			*val = sign_extend32(*val,
+6 −2
Original line number Diff line number Diff line
@@ -414,8 +414,12 @@ static void ams_enable_channel_sequence(struct iio_dev *indio_dev)

	/* Run calibration of PS & PL as part of the sequence */
	scan_mask = BIT(0) | BIT(AMS_PS_SEQ_MAX);
	for (i = 0; i < indio_dev->num_channels; i++)
		scan_mask |= BIT_ULL(indio_dev->channels[i].scan_index);
	for (i = 0; i < indio_dev->num_channels; i++) {
		const struct iio_chan_spec *chan = &indio_dev->channels[i];

		if (chan->scan_index < AMS_CTRL_SEQ_BASE)
			scan_mask |= BIT_ULL(chan->scan_index);
	}

	if (ams->ps_base) {
		/* put sysmon in a soft reset to change the sequence */
+2 −0
Original line number Diff line number Diff line
@@ -54,7 +54,9 @@
#define   BME680_NB_CONV_MASK			GENMASK(3, 0)

#define BME680_REG_MEAS_STAT_0			0x1D
#define   BME680_NEW_DATA_BIT			BIT(7)
#define   BME680_GAS_MEAS_BIT			BIT(6)
#define   BME680_MEAS_BIT			BIT(5)

/* Calibration Parameters */
#define BME680_T2_LSB_REG	0x8A
+54 −8
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@
 */
#include <linux/acpi.h>
#include <linux/bitfield.h>
#include <linux/delay.h>
#include <linux/device.h>
#include <linux/module.h>
#include <linux/log2.h>
@@ -38,7 +39,7 @@ struct bme680_calib {
	s8  par_h3;
	s8  par_h4;
	s8  par_h5;
	s8  par_h6;
	u8  par_h6;
	s8  par_h7;
	s8  par_gh1;
	s16 par_gh2;
@@ -342,10 +343,10 @@ static s16 bme680_compensate_temp(struct bme680_data *data,
	if (!calib->par_t2)
		bme680_read_calib(data, calib);

	var1 = (adc_temp >> 3) - (calib->par_t1 << 1);
	var1 = (adc_temp >> 3) - ((s32)calib->par_t1 << 1);
	var2 = (var1 * calib->par_t2) >> 11;
	var3 = ((var1 >> 1) * (var1 >> 1)) >> 12;
	var3 = (var3 * (calib->par_t3 << 4)) >> 14;
	var3 = (var3 * ((s32)calib->par_t3 << 4)) >> 14;
	data->t_fine = var2 + var3;
	calc_temp = (data->t_fine * 5 + 128) >> 8;

@@ -368,9 +369,9 @@ static u32 bme680_compensate_press(struct bme680_data *data,
	var1 = (data->t_fine >> 1) - 64000;
	var2 = ((((var1 >> 2) * (var1 >> 2)) >> 11) * calib->par_p6) >> 2;
	var2 = var2 + (var1 * calib->par_p5 << 1);
	var2 = (var2 >> 2) + (calib->par_p4 << 16);
	var2 = (var2 >> 2) + ((s32)calib->par_p4 << 16);
	var1 = (((((var1 >> 2) * (var1 >> 2)) >> 13) *
			(calib->par_p3 << 5)) >> 3) +
			((s32)calib->par_p3 << 5)) >> 3) +
			((calib->par_p2 * var1) >> 1);
	var1 = var1 >> 18;
	var1 = ((32768 + var1) * calib->par_p1) >> 15;
@@ -388,7 +389,7 @@ static u32 bme680_compensate_press(struct bme680_data *data,
	var3 = ((press_comp >> 8) * (press_comp >> 8) *
			(press_comp >> 8) * calib->par_p10) >> 17;

	press_comp += (var1 + var2 + var3 + (calib->par_p7 << 7)) >> 4;
	press_comp += (var1 + var2 + var3 + ((s32)calib->par_p7 << 7)) >> 4;

	return press_comp;
}
@@ -414,7 +415,7 @@ static u32 bme680_compensate_humid(struct bme680_data *data,
		 (((temp_scaled * ((temp_scaled * calib->par_h5) / 100))
		   >> 6) / 100) + (1 << 14))) >> 10;
	var3 = var1 * var2;
	var4 = calib->par_h6 << 7;
	var4 = (s32)calib->par_h6 << 7;
	var4 = (var4 + ((temp_scaled * calib->par_h7) / 100)) >> 4;
	var5 = ((var3 >> 14) * (var3 >> 14)) >> 10;
	var6 = (var4 * var5) >> 1;
@@ -532,6 +533,43 @@ static u8 bme680_oversampling_to_reg(u8 val)
	return ilog2(val) + 1;
}

/*
 * Taken from Bosch BME680 API:
 * https://github.com/boschsensortec/BME68x_SensorAPI/blob/v4.4.8/bme68x.c#L490
 */
static int bme680_wait_for_eoc(struct bme680_data *data)
{
	struct device *dev = regmap_get_device(data->regmap);
	unsigned int check;
	int ret;
	/*
	 * (Sum of oversampling ratios * time per oversampling) +
	 * TPH measurement + gas measurement + wait transition from forced mode
	 * + heater duration
	 */
	int wait_eoc_us = ((data->oversampling_temp + data->oversampling_press +
			   data->oversampling_humid) * 1936) + (477 * 4) +
			   (477 * 5) + 1000 + (data->heater_dur * 1000);

	usleep_range(wait_eoc_us, wait_eoc_us + 100);

	ret = regmap_read(data->regmap, BME680_REG_MEAS_STAT_0, &check);
	if (ret) {
		dev_err(dev, "failed to read measurement status register.\n");
		return ret;
	}
	if (check & BME680_MEAS_BIT) {
		dev_err(dev, "Device measurement cycle incomplete.\n");
		return -EBUSY;
	}
	if (!(check & BME680_NEW_DATA_BIT)) {
		dev_err(dev, "No new data available from the device.\n");
		return -ENODATA;
	}

	return 0;
}

static int bme680_chip_config(struct bme680_data *data)
{
	struct device *dev = regmap_get_device(data->regmap);
@@ -622,6 +660,10 @@ static int bme680_read_temp(struct bme680_data *data, int *val)
	if (ret < 0)
		return ret;

	ret = bme680_wait_for_eoc(data);
	if (ret)
		return ret;

	ret = regmap_bulk_read(data->regmap, BME680_REG_TEMP_MSB,
			       &tmp, 3);
	if (ret < 0) {
@@ -678,7 +720,7 @@ static int bme680_read_press(struct bme680_data *data,
	}

	*val = bme680_compensate_press(data, adc_press);
	*val2 = 100;
	*val2 = 1000;
	return IIO_VAL_FRACTIONAL;
}

@@ -738,6 +780,10 @@ static int bme680_read_gas(struct bme680_data *data,
	if (ret < 0)
		return ret;

	ret = bme680_wait_for_eoc(data);
	if (ret)
		return ret;

	ret = regmap_read(data->regmap, BME680_REG_MEAS_STAT_0, &check);
	if (check & BME680_GAS_MEAS_BIT) {
		dev_err(dev, "gas measurement incomplete\n");
Loading