Commit 84dd4373 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'char-misc-6.10-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc

Pull char/misc driver fixes from Greg KH:
 "Here are some small driver fixes for 6.10-rc6. Included in here are:

   - IIO driver fixes for reported issues

   - Counter driver fix for a reported problem.

  All of these have been in linux-next this week with no reported
  issues"

* tag 'char-misc-6.10-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc:
  counter: ti-eqep: enable clock at probe
  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 12529aa1 06ebbce9
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
*/ */
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/clk.h>
#include <linux/counter.h> #include <linux/counter.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/mod_devicetable.h> #include <linux/mod_devicetable.h>
...@@ -376,6 +377,7 @@ static int ti_eqep_probe(struct platform_device *pdev) ...@@ -376,6 +377,7 @@ static int ti_eqep_probe(struct platform_device *pdev)
struct counter_device *counter; struct counter_device *counter;
struct ti_eqep_cnt *priv; struct ti_eqep_cnt *priv;
void __iomem *base; void __iomem *base;
struct clk *clk;
int err; int err;
counter = devm_counter_alloc(dev, sizeof(*priv)); counter = devm_counter_alloc(dev, sizeof(*priv));
...@@ -415,6 +417,10 @@ static int ti_eqep_probe(struct platform_device *pdev) ...@@ -415,6 +417,10 @@ static int ti_eqep_probe(struct platform_device *pdev)
pm_runtime_enable(dev); pm_runtime_enable(dev);
pm_runtime_get_sync(dev); pm_runtime_get_sync(dev);
clk = devm_clk_get_enabled(dev, NULL);
if (IS_ERR(clk))
return dev_err_probe(dev, PTR_ERR(clk), "failed to enable clock\n");
err = counter_add(counter); err = counter_add(counter);
if (err < 0) { if (err < 0) {
pm_runtime_put_sync(dev); pm_runtime_put_sync(dev);
......
...@@ -330,6 +330,8 @@ config DMARD10 ...@@ -330,6 +330,8 @@ config DMARD10
config FXLS8962AF config FXLS8962AF
tristate tristate
depends on I2C || !I2C # cannot be built-in for modular I2C depends on I2C || !I2C # cannot be built-in for modular I2C
select IIO_BUFFER
select IIO_KFIFO_BUF
config FXLS8962AF_I2C config FXLS8962AF_I2C
tristate "NXP FXLS8962AF/FXLS8964AF Accelerometer I2C Driver" tristate "NXP FXLS8962AF/FXLS8964AF Accelerometer I2C Driver"
......
...@@ -157,6 +157,8 @@ static int ad7266_read_raw(struct iio_dev *indio_dev, ...@@ -157,6 +157,8 @@ static int ad7266_read_raw(struct iio_dev *indio_dev,
ret = ad7266_read_single(st, val, chan->address); ret = ad7266_read_single(st, val, chan->address);
iio_device_release_direct_mode(indio_dev); iio_device_release_direct_mode(indio_dev);
if (ret < 0)
return ret;
*val = (*val >> 2) & 0xfff; *val = (*val >> 2) & 0xfff;
if (chan->scan_type.sign == 's') if (chan->scan_type.sign == 's')
*val = sign_extend32(*val, *val = sign_extend32(*val,
......
...@@ -414,8 +414,12 @@ static void ams_enable_channel_sequence(struct iio_dev *indio_dev) ...@@ -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 */ /* Run calibration of PS & PL as part of the sequence */
scan_mask = BIT(0) | BIT(AMS_PS_SEQ_MAX); scan_mask = BIT(0) | BIT(AMS_PS_SEQ_MAX);
for (i = 0; i < indio_dev->num_channels; i++) for (i = 0; i < indio_dev->num_channels; i++) {
scan_mask |= BIT_ULL(indio_dev->channels[i].scan_index); 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) { if (ams->ps_base) {
/* put sysmon in a soft reset to change the sequence */ /* put sysmon in a soft reset to change the sequence */
......
...@@ -54,7 +54,9 @@ ...@@ -54,7 +54,9 @@
#define BME680_NB_CONV_MASK GENMASK(3, 0) #define BME680_NB_CONV_MASK GENMASK(3, 0)
#define BME680_REG_MEAS_STAT_0 0x1D #define BME680_REG_MEAS_STAT_0 0x1D
#define BME680_NEW_DATA_BIT BIT(7)
#define BME680_GAS_MEAS_BIT BIT(6) #define BME680_GAS_MEAS_BIT BIT(6)
#define BME680_MEAS_BIT BIT(5)
/* Calibration Parameters */ /* Calibration Parameters */
#define BME680_T2_LSB_REG 0x8A #define BME680_T2_LSB_REG 0x8A
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
*/ */
#include <linux/acpi.h> #include <linux/acpi.h>
#include <linux/bitfield.h> #include <linux/bitfield.h>
#include <linux/delay.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/log2.h> #include <linux/log2.h>
...@@ -38,7 +39,7 @@ struct bme680_calib { ...@@ -38,7 +39,7 @@ struct bme680_calib {
s8 par_h3; s8 par_h3;
s8 par_h4; s8 par_h4;
s8 par_h5; s8 par_h5;
s8 par_h6; u8 par_h6;
s8 par_h7; s8 par_h7;
s8 par_gh1; s8 par_gh1;
s16 par_gh2; s16 par_gh2;
...@@ -342,10 +343,10 @@ static s16 bme680_compensate_temp(struct bme680_data *data, ...@@ -342,10 +343,10 @@ static s16 bme680_compensate_temp(struct bme680_data *data,
if (!calib->par_t2) if (!calib->par_t2)
bme680_read_calib(data, calib); 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; var2 = (var1 * calib->par_t2) >> 11;
var3 = ((var1 >> 1) * (var1 >> 1)) >> 12; 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; data->t_fine = var2 + var3;
calc_temp = (data->t_fine * 5 + 128) >> 8; calc_temp = (data->t_fine * 5 + 128) >> 8;
...@@ -368,9 +369,9 @@ static u32 bme680_compensate_press(struct bme680_data *data, ...@@ -368,9 +369,9 @@ static u32 bme680_compensate_press(struct bme680_data *data,
var1 = (data->t_fine >> 1) - 64000; var1 = (data->t_fine >> 1) - 64000;
var2 = ((((var1 >> 2) * (var1 >> 2)) >> 11) * calib->par_p6) >> 2; var2 = ((((var1 >> 2) * (var1 >> 2)) >> 11) * calib->par_p6) >> 2;
var2 = var2 + (var1 * calib->par_p5 << 1); 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) * var1 = (((((var1 >> 2) * (var1 >> 2)) >> 13) *
(calib->par_p3 << 5)) >> 3) + ((s32)calib->par_p3 << 5)) >> 3) +
((calib->par_p2 * var1) >> 1); ((calib->par_p2 * var1) >> 1);
var1 = var1 >> 18; var1 = var1 >> 18;
var1 = ((32768 + var1) * calib->par_p1) >> 15; var1 = ((32768 + var1) * calib->par_p1) >> 15;
...@@ -388,7 +389,7 @@ static u32 bme680_compensate_press(struct bme680_data *data, ...@@ -388,7 +389,7 @@ static u32 bme680_compensate_press(struct bme680_data *data,
var3 = ((press_comp >> 8) * (press_comp >> 8) * var3 = ((press_comp >> 8) * (press_comp >> 8) *
(press_comp >> 8) * calib->par_p10) >> 17; (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; return press_comp;
} }
...@@ -414,7 +415,7 @@ static u32 bme680_compensate_humid(struct bme680_data *data, ...@@ -414,7 +415,7 @@ static u32 bme680_compensate_humid(struct bme680_data *data,
(((temp_scaled * ((temp_scaled * calib->par_h5) / 100)) (((temp_scaled * ((temp_scaled * calib->par_h5) / 100))
>> 6) / 100) + (1 << 14))) >> 10; >> 6) / 100) + (1 << 14))) >> 10;
var3 = var1 * var2; var3 = var1 * var2;
var4 = calib->par_h6 << 7; var4 = (s32)calib->par_h6 << 7;
var4 = (var4 + ((temp_scaled * calib->par_h7) / 100)) >> 4; var4 = (var4 + ((temp_scaled * calib->par_h7) / 100)) >> 4;
var5 = ((var3 >> 14) * (var3 >> 14)) >> 10; var5 = ((var3 >> 14) * (var3 >> 14)) >> 10;
var6 = (var4 * var5) >> 1; var6 = (var4 * var5) >> 1;
...@@ -532,6 +533,43 @@ static u8 bme680_oversampling_to_reg(u8 val) ...@@ -532,6 +533,43 @@ static u8 bme680_oversampling_to_reg(u8 val)
return ilog2(val) + 1; 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) static int bme680_chip_config(struct bme680_data *data)
{ {
struct device *dev = regmap_get_device(data->regmap); struct device *dev = regmap_get_device(data->regmap);
...@@ -622,6 +660,10 @@ static int bme680_read_temp(struct bme680_data *data, int *val) ...@@ -622,6 +660,10 @@ static int bme680_read_temp(struct bme680_data *data, int *val)
if (ret < 0) if (ret < 0)
return ret; return ret;
ret = bme680_wait_for_eoc(data);
if (ret)
return ret;
ret = regmap_bulk_read(data->regmap, BME680_REG_TEMP_MSB, ret = regmap_bulk_read(data->regmap, BME680_REG_TEMP_MSB,
&tmp, 3); &tmp, 3);
if (ret < 0) { if (ret < 0) {
...@@ -678,7 +720,7 @@ static int bme680_read_press(struct bme680_data *data, ...@@ -678,7 +720,7 @@ static int bme680_read_press(struct bme680_data *data,
} }
*val = bme680_compensate_press(data, adc_press); *val = bme680_compensate_press(data, adc_press);
*val2 = 100; *val2 = 1000;
return IIO_VAL_FRACTIONAL; return IIO_VAL_FRACTIONAL;
} }
...@@ -738,6 +780,10 @@ static int bme680_read_gas(struct bme680_data *data, ...@@ -738,6 +780,10 @@ static int bme680_read_gas(struct bme680_data *data,
if (ret < 0) if (ret < 0)
return ret; return ret;
ret = bme680_wait_for_eoc(data);
if (ret)
return ret;
ret = regmap_read(data->regmap, BME680_REG_MEAS_STAT_0, &check); ret = regmap_read(data->regmap, BME680_REG_MEAS_STAT_0, &check);
if (check & BME680_GAS_MEAS_BIT) { if (check & BME680_GAS_MEAS_BIT) {
dev_err(dev, "gas measurement incomplete\n"); dev_err(dev, "gas measurement incomplete\n");
......
...@@ -133,7 +133,7 @@ config AD5624R_SPI ...@@ -133,7 +133,7 @@ config AD5624R_SPI
config AD9739A config AD9739A
tristate "Analog Devices AD9739A RF DAC spi driver" tristate "Analog Devices AD9739A RF DAC spi driver"
depends on SPI || COMPILE_TEST depends on SPI
select REGMAP_SPI select REGMAP_SPI
select IIO_BACKEND select IIO_BACKEND
help help
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment