Skip to content
This repository was archived by the owner on Nov 8, 2023. It is now read-only.

Commit 84dd437

Browse files
committed
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
2 parents 12529aa + 06ebbce commit 84dd437

File tree

8 files changed

+322
-87
lines changed

8 files changed

+322
-87
lines changed

drivers/counter/ti-eqep.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
*/
77

88
#include <linux/bitops.h>
9+
#include <linux/clk.h>
910
#include <linux/counter.h>
1011
#include <linux/kernel.h>
1112
#include <linux/mod_devicetable.h>
@@ -376,6 +377,7 @@ static int ti_eqep_probe(struct platform_device *pdev)
376377
struct counter_device *counter;
377378
struct ti_eqep_cnt *priv;
378379
void __iomem *base;
380+
struct clk *clk;
379381
int err;
380382

381383
counter = devm_counter_alloc(dev, sizeof(*priv));
@@ -415,6 +417,10 @@ static int ti_eqep_probe(struct platform_device *pdev)
415417
pm_runtime_enable(dev);
416418
pm_runtime_get_sync(dev);
417419

420+
clk = devm_clk_get_enabled(dev, NULL);
421+
if (IS_ERR(clk))
422+
return dev_err_probe(dev, PTR_ERR(clk), "failed to enable clock\n");
423+
418424
err = counter_add(counter);
419425
if (err < 0) {
420426
pm_runtime_put_sync(dev);

drivers/iio/accel/Kconfig

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,8 @@ config DMARD10
330330
config FXLS8962AF
331331
tristate
332332
depends on I2C || !I2C # cannot be built-in for modular I2C
333+
select IIO_BUFFER
334+
select IIO_KFIFO_BUF
333335

334336
config FXLS8962AF_I2C
335337
tristate "NXP FXLS8962AF/FXLS8964AF Accelerometer I2C Driver"

drivers/iio/adc/ad7266.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,8 @@ static int ad7266_read_raw(struct iio_dev *indio_dev,
157157
ret = ad7266_read_single(st, val, chan->address);
158158
iio_device_release_direct_mode(indio_dev);
159159

160+
if (ret < 0)
161+
return ret;
160162
*val = (*val >> 2) & 0xfff;
161163
if (chan->scan_type.sign == 's')
162164
*val = sign_extend32(*val,

drivers/iio/adc/xilinx-ams.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -414,8 +414,12 @@ static void ams_enable_channel_sequence(struct iio_dev *indio_dev)
414414

415415
/* Run calibration of PS & PL as part of the sequence */
416416
scan_mask = BIT(0) | BIT(AMS_PS_SEQ_MAX);
417-
for (i = 0; i < indio_dev->num_channels; i++)
418-
scan_mask |= BIT_ULL(indio_dev->channels[i].scan_index);
417+
for (i = 0; i < indio_dev->num_channels; i++) {
418+
const struct iio_chan_spec *chan = &indio_dev->channels[i];
419+
420+
if (chan->scan_index < AMS_CTRL_SEQ_BASE)
421+
scan_mask |= BIT_ULL(chan->scan_index);
422+
}
419423

420424
if (ams->ps_base) {
421425
/* put sysmon in a soft reset to change the sequence */

drivers/iio/chemical/bme680.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,9 @@
5454
#define BME680_NB_CONV_MASK GENMASK(3, 0)
5555

5656
#define BME680_REG_MEAS_STAT_0 0x1D
57+
#define BME680_NEW_DATA_BIT BIT(7)
5758
#define BME680_GAS_MEAS_BIT BIT(6)
59+
#define BME680_MEAS_BIT BIT(5)
5860

5961
/* Calibration Parameters */
6062
#define BME680_T2_LSB_REG 0x8A

drivers/iio/chemical/bme680_core.c

Lines changed: 54 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
*/
1111
#include <linux/acpi.h>
1212
#include <linux/bitfield.h>
13+
#include <linux/delay.h>
1314
#include <linux/device.h>
1415
#include <linux/module.h>
1516
#include <linux/log2.h>
@@ -38,7 +39,7 @@ struct bme680_calib {
3839
s8 par_h3;
3940
s8 par_h4;
4041
s8 par_h5;
41-
s8 par_h6;
42+
u8 par_h6;
4243
s8 par_h7;
4344
s8 par_gh1;
4445
s16 par_gh2;
@@ -342,10 +343,10 @@ static s16 bme680_compensate_temp(struct bme680_data *data,
342343
if (!calib->par_t2)
343344
bme680_read_calib(data, calib);
344345

345-
var1 = (adc_temp >> 3) - (calib->par_t1 << 1);
346+
var1 = (adc_temp >> 3) - ((s32)calib->par_t1 << 1);
346347
var2 = (var1 * calib->par_t2) >> 11;
347348
var3 = ((var1 >> 1) * (var1 >> 1)) >> 12;
348-
var3 = (var3 * (calib->par_t3 << 4)) >> 14;
349+
var3 = (var3 * ((s32)calib->par_t3 << 4)) >> 14;
349350
data->t_fine = var2 + var3;
350351
calc_temp = (data->t_fine * 5 + 128) >> 8;
351352

@@ -368,9 +369,9 @@ static u32 bme680_compensate_press(struct bme680_data *data,
368369
var1 = (data->t_fine >> 1) - 64000;
369370
var2 = ((((var1 >> 2) * (var1 >> 2)) >> 11) * calib->par_p6) >> 2;
370371
var2 = var2 + (var1 * calib->par_p5 << 1);
371-
var2 = (var2 >> 2) + (calib->par_p4 << 16);
372+
var2 = (var2 >> 2) + ((s32)calib->par_p4 << 16);
372373
var1 = (((((var1 >> 2) * (var1 >> 2)) >> 13) *
373-
(calib->par_p3 << 5)) >> 3) +
374+
((s32)calib->par_p3 << 5)) >> 3) +
374375
((calib->par_p2 * var1) >> 1);
375376
var1 = var1 >> 18;
376377
var1 = ((32768 + var1) * calib->par_p1) >> 15;
@@ -388,7 +389,7 @@ static u32 bme680_compensate_press(struct bme680_data *data,
388389
var3 = ((press_comp >> 8) * (press_comp >> 8) *
389390
(press_comp >> 8) * calib->par_p10) >> 17;
390391

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

393394
return press_comp;
394395
}
@@ -414,7 +415,7 @@ static u32 bme680_compensate_humid(struct bme680_data *data,
414415
(((temp_scaled * ((temp_scaled * calib->par_h5) / 100))
415416
>> 6) / 100) + (1 << 14))) >> 10;
416417
var3 = var1 * var2;
417-
var4 = calib->par_h6 << 7;
418+
var4 = (s32)calib->par_h6 << 7;
418419
var4 = (var4 + ((temp_scaled * calib->par_h7) / 100)) >> 4;
419420
var5 = ((var3 >> 14) * (var3 >> 14)) >> 10;
420421
var6 = (var4 * var5) >> 1;
@@ -532,6 +533,43 @@ static u8 bme680_oversampling_to_reg(u8 val)
532533
return ilog2(val) + 1;
533534
}
534535

536+
/*
537+
* Taken from Bosch BME680 API:
538+
* https://github.com/boschsensortec/BME68x_SensorAPI/blob/v4.4.8/bme68x.c#L490
539+
*/
540+
static int bme680_wait_for_eoc(struct bme680_data *data)
541+
{
542+
struct device *dev = regmap_get_device(data->regmap);
543+
unsigned int check;
544+
int ret;
545+
/*
546+
* (Sum of oversampling ratios * time per oversampling) +
547+
* TPH measurement + gas measurement + wait transition from forced mode
548+
* + heater duration
549+
*/
550+
int wait_eoc_us = ((data->oversampling_temp + data->oversampling_press +
551+
data->oversampling_humid) * 1936) + (477 * 4) +
552+
(477 * 5) + 1000 + (data->heater_dur * 1000);
553+
554+
usleep_range(wait_eoc_us, wait_eoc_us + 100);
555+
556+
ret = regmap_read(data->regmap, BME680_REG_MEAS_STAT_0, &check);
557+
if (ret) {
558+
dev_err(dev, "failed to read measurement status register.\n");
559+
return ret;
560+
}
561+
if (check & BME680_MEAS_BIT) {
562+
dev_err(dev, "Device measurement cycle incomplete.\n");
563+
return -EBUSY;
564+
}
565+
if (!(check & BME680_NEW_DATA_BIT)) {
566+
dev_err(dev, "No new data available from the device.\n");
567+
return -ENODATA;
568+
}
569+
570+
return 0;
571+
}
572+
535573
static int bme680_chip_config(struct bme680_data *data)
536574
{
537575
struct device *dev = regmap_get_device(data->regmap);
@@ -622,6 +660,10 @@ static int bme680_read_temp(struct bme680_data *data, int *val)
622660
if (ret < 0)
623661
return ret;
624662

663+
ret = bme680_wait_for_eoc(data);
664+
if (ret)
665+
return ret;
666+
625667
ret = regmap_bulk_read(data->regmap, BME680_REG_TEMP_MSB,
626668
&tmp, 3);
627669
if (ret < 0) {
@@ -678,7 +720,7 @@ static int bme680_read_press(struct bme680_data *data,
678720
}
679721

680722
*val = bme680_compensate_press(data, adc_press);
681-
*val2 = 100;
723+
*val2 = 1000;
682724
return IIO_VAL_FRACTIONAL;
683725
}
684726

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

783+
ret = bme680_wait_for_eoc(data);
784+
if (ret)
785+
return ret;
786+
741787
ret = regmap_read(data->regmap, BME680_REG_MEAS_STAT_0, &check);
742788
if (check & BME680_GAS_MEAS_BIT) {
743789
dev_err(dev, "gas measurement incomplete\n");

drivers/iio/dac/Kconfig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ config AD5624R_SPI
133133

134134
config AD9739A
135135
tristate "Analog Devices AD9739A RF DAC spi driver"
136-
depends on SPI || COMPILE_TEST
136+
depends on SPI
137137
select REGMAP_SPI
138138
select IIO_BACKEND
139139
help

0 commit comments

Comments
 (0)