mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-03-22 07:27:12 +08:00
Merge tag 'iio-fixes-for-7.0a' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/jic23/iio into work-linus
Jonathan writes: IIO: 1st set of fixes for the 7.0 cycle Usual mixed bag of ancient bugs that have been discovered and more recent stuff. core - Cleanup a wait_queue if a driver is removed at exacty the wrong moment. adi,adf4377 - Check correct masks when waiting for reset to complete. adi,adis - Fix a NULL pointer dereference if ops not provided to adis_init() bosch,bme680 - Fix typo in value used to calculate measurement wait duration. infineon,tlv493d - Drop incorrect shifting of some bits for x-axis invensense,icm42600 - Fix corner case of output data rate being set to the value it already has which resulted in waiting for ever for a flag to say the update was completed. - Fix a case where the buffer is turned off whilst ODR switch is in progress. invensense,icm45600 - Interrupt 1 drive bit was inverted. - Fix a underflow for regulator put warning if probe fails invensense,mpu9150 - Work around a hardware quirk where reading from irq status is not sufficient to acknowledge an interrupt. maxim,ds4424 - Reject -128 as a possible raw value as it's out of range with the sign / magnitude encoding used by this chip. microchip,mcp4131 - Shift the wiper value only once. rohm,bh1780 - Fix a runtime reference count issue on an error path. sensiron,sps30 - Fix two buffer size issues due to sizeof() wrong thing. tyhx,hx9023s - Ensure count used by __counted_by is set before accessing the buffer. - Avoid a potential division by zero. * tag 'iio-fixes-for-7.0a' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/jic23/iio: iio: imu: adis: Fix NULL pointer dereference in adis_init iio: imu: inv_icm45600: fix regulator put warning when probe fails iio: buffer: Fix wait_queue not being removed iio: gyro: mpu3050-core: fix pm_runtime error handling iio: gyro: mpu3050-i2c: fix pm_runtime error handling iio: adc: ad7768-1: Fix ERR_PTR dereference in ad7768_fill_scale_tbl iio: chemical: sps30_serial: fix buffer size in sps30_serial_read_meas() iio: chemical: sps30_i2c: fix buffer size in sps30_i2c_read_meas() iio: magnetometer: tlv493d: remove erroneous shift in X-axis data iio: proximity: hx9023s: Protect against division by zero in set_samp_freq iio: proximity: hx9023s: fix assignment order for __counted_by iio: chemical: bme680: Fix measurement wait duration calculation iio: dac: ds4424: reject -128 RAW value iio: imu: inv_icm45600: fix INT1 drive bit inverted iio: potentiometer: mcp4131: fix double application of wiper shift iio: imu: inv-mpu9150: fix irq ack preventing irq storms iio: frequency: adf4377: Fix duplicated soft reset mask iio: light: bh1780: fix PM runtime leak on error path iio: imu: inv_icm42600: fix odr switch when turning buffer off iio: imu: inv_icm42600: fix odr switch to the same value
This commit is contained in:
@@ -531,7 +531,7 @@ static int ad7768_reg_access(struct iio_dev *indio_dev,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void ad7768_fill_scale_tbl(struct iio_dev *dev)
|
||||
static int ad7768_fill_scale_tbl(struct iio_dev *dev)
|
||||
{
|
||||
struct ad7768_state *st = iio_priv(dev);
|
||||
const struct iio_scan_type *scan_type;
|
||||
@@ -541,6 +541,11 @@ static void ad7768_fill_scale_tbl(struct iio_dev *dev)
|
||||
u64 tmp2;
|
||||
|
||||
scan_type = iio_get_current_scan_type(dev, &dev->channels[0]);
|
||||
if (IS_ERR(scan_type)) {
|
||||
dev_err(&st->spi->dev, "Failed to get scan type.\n");
|
||||
return PTR_ERR(scan_type);
|
||||
}
|
||||
|
||||
if (scan_type->sign == 's')
|
||||
val2 = scan_type->realbits - 1;
|
||||
else
|
||||
@@ -565,6 +570,8 @@ static void ad7768_fill_scale_tbl(struct iio_dev *dev)
|
||||
st->scale_tbl[i][0] = tmp0; /* Integer part */
|
||||
st->scale_tbl[i][1] = abs(tmp1); /* Fractional part */
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ad7768_set_sinc3_dec_rate(struct ad7768_state *st,
|
||||
@@ -669,7 +676,9 @@ static int ad7768_configure_dig_fil(struct iio_dev *dev,
|
||||
}
|
||||
|
||||
/* Update scale table: scale values vary according to the precision */
|
||||
ad7768_fill_scale_tbl(dev);
|
||||
ret = ad7768_fill_scale_tbl(dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ad7768_fill_samp_freq_tbl(st);
|
||||
|
||||
|
||||
@@ -613,7 +613,7 @@ static int bme680_wait_for_eoc(struct bme680_data *data)
|
||||
* + heater duration
|
||||
*/
|
||||
int wait_eoc_us = ((data->oversampling_temp + data->oversampling_press +
|
||||
data->oversampling_humid) * 1936) + (477 * 4) +
|
||||
data->oversampling_humid) * 1963) + (477 * 4) +
|
||||
(477 * 5) + 1000 + (data->heater_dur * 1000);
|
||||
|
||||
fsleep(wait_eoc_us);
|
||||
|
||||
@@ -171,7 +171,7 @@ static int sps30_i2c_read_meas(struct sps30_state *state, __be32 *meas, size_t n
|
||||
if (!sps30_i2c_meas_ready(state))
|
||||
return -ETIMEDOUT;
|
||||
|
||||
return sps30_i2c_command(state, SPS30_I2C_READ_MEAS, NULL, 0, meas, sizeof(num) * num);
|
||||
return sps30_i2c_command(state, SPS30_I2C_READ_MEAS, NULL, 0, meas, sizeof(*meas) * num);
|
||||
}
|
||||
|
||||
static int sps30_i2c_clean_fan(struct sps30_state *state)
|
||||
|
||||
@@ -303,7 +303,7 @@ static int sps30_serial_read_meas(struct sps30_state *state, __be32 *meas, size_
|
||||
if (msleep_interruptible(1000))
|
||||
return -EINTR;
|
||||
|
||||
ret = sps30_serial_command(state, SPS30_SERIAL_READ_MEAS, NULL, 0, meas, num * sizeof(num));
|
||||
ret = sps30_serial_command(state, SPS30_SERIAL_READ_MEAS, NULL, 0, meas, num * sizeof(*meas));
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
/* if measurements aren't ready sensor returns empty frame */
|
||||
|
||||
@@ -140,7 +140,7 @@ static int ds4424_write_raw(struct iio_dev *indio_dev,
|
||||
|
||||
switch (mask) {
|
||||
case IIO_CHAN_INFO_RAW:
|
||||
if (val < S8_MIN || val > S8_MAX)
|
||||
if (val <= S8_MIN || val > S8_MAX)
|
||||
return -EINVAL;
|
||||
|
||||
if (val > 0) {
|
||||
|
||||
@@ -508,7 +508,7 @@ static int adf4377_soft_reset(struct adf4377_state *st)
|
||||
return ret;
|
||||
|
||||
return regmap_read_poll_timeout(st->regmap, 0x0, read_val,
|
||||
!(read_val & (ADF4377_0000_SOFT_RESET_R_MSK |
|
||||
!(read_val & (ADF4377_0000_SOFT_RESET_MSK |
|
||||
ADF4377_0000_SOFT_RESET_R_MSK)), 200, 200 * 100);
|
||||
}
|
||||
|
||||
|
||||
@@ -322,7 +322,9 @@ static int mpu3050_read_raw(struct iio_dev *indio_dev,
|
||||
}
|
||||
case IIO_CHAN_INFO_RAW:
|
||||
/* Resume device */
|
||||
pm_runtime_get_sync(mpu3050->dev);
|
||||
ret = pm_runtime_resume_and_get(mpu3050->dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
mutex_lock(&mpu3050->lock);
|
||||
|
||||
ret = mpu3050_set_8khz_samplerate(mpu3050);
|
||||
@@ -647,14 +649,20 @@ out_trigger_unlock:
|
||||
static int mpu3050_buffer_preenable(struct iio_dev *indio_dev)
|
||||
{
|
||||
struct mpu3050 *mpu3050 = iio_priv(indio_dev);
|
||||
int ret;
|
||||
|
||||
pm_runtime_get_sync(mpu3050->dev);
|
||||
ret = pm_runtime_resume_and_get(mpu3050->dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Unless we have OUR trigger active, run at full speed */
|
||||
if (!mpu3050->hw_irq_trigger)
|
||||
return mpu3050_set_8khz_samplerate(mpu3050);
|
||||
if (!mpu3050->hw_irq_trigger) {
|
||||
ret = mpu3050_set_8khz_samplerate(mpu3050);
|
||||
if (ret)
|
||||
pm_runtime_put_autosuspend(mpu3050->dev);
|
||||
}
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int mpu3050_buffer_postdisable(struct iio_dev *indio_dev)
|
||||
|
||||
@@ -19,8 +19,7 @@ static int mpu3050_i2c_bypass_select(struct i2c_mux_core *mux, u32 chan_id)
|
||||
struct mpu3050 *mpu3050 = i2c_mux_priv(mux);
|
||||
|
||||
/* Just power up the device, that is all that is needed */
|
||||
pm_runtime_get_sync(mpu3050->dev);
|
||||
return 0;
|
||||
return pm_runtime_resume_and_get(mpu3050->dev);
|
||||
}
|
||||
|
||||
static int mpu3050_i2c_bypass_deselect(struct i2c_mux_core *mux, u32 chan_id)
|
||||
|
||||
@@ -526,7 +526,7 @@ int adis_init(struct adis *adis, struct iio_dev *indio_dev,
|
||||
|
||||
adis->spi = spi;
|
||||
adis->data = data;
|
||||
if (!adis->ops->write && !adis->ops->read && !adis->ops->reset)
|
||||
if (!adis->ops)
|
||||
adis->ops = &adis_default_ops;
|
||||
else if (!adis->ops->write || !adis->ops->read || !adis->ops->reset)
|
||||
return -EINVAL;
|
||||
|
||||
@@ -651,6 +651,8 @@ static int inv_icm42600_accel_write_odr(struct iio_dev *indio_dev,
|
||||
return -EINVAL;
|
||||
|
||||
conf.odr = inv_icm42600_accel_odr_conv[idx / 2];
|
||||
if (conf.odr == st->conf.accel.odr)
|
||||
return 0;
|
||||
|
||||
pm_runtime_get_sync(dev);
|
||||
mutex_lock(&st->lock);
|
||||
|
||||
@@ -371,6 +371,8 @@ static int inv_icm42600_buffer_predisable(struct iio_dev *indio_dev)
|
||||
static int inv_icm42600_buffer_postdisable(struct iio_dev *indio_dev)
|
||||
{
|
||||
struct inv_icm42600_state *st = iio_device_get_drvdata(indio_dev);
|
||||
struct inv_icm42600_sensor_state *sensor_st = iio_priv(indio_dev);
|
||||
struct inv_sensors_timestamp *ts = &sensor_st->ts;
|
||||
struct device *dev = regmap_get_device(st->map);
|
||||
unsigned int sensor;
|
||||
unsigned int *watermark;
|
||||
@@ -392,6 +394,8 @@ static int inv_icm42600_buffer_postdisable(struct iio_dev *indio_dev)
|
||||
|
||||
mutex_lock(&st->lock);
|
||||
|
||||
inv_sensors_timestamp_apply_odr(ts, 0, 0, 0);
|
||||
|
||||
ret = inv_icm42600_buffer_set_fifo_en(st, st->fifo.en & ~sensor);
|
||||
if (ret)
|
||||
goto out_unlock;
|
||||
|
||||
@@ -358,6 +358,8 @@ static int inv_icm42600_gyro_write_odr(struct iio_dev *indio_dev,
|
||||
return -EINVAL;
|
||||
|
||||
conf.odr = inv_icm42600_gyro_odr_conv[idx / 2];
|
||||
if (conf.odr == st->conf.gyro.odr)
|
||||
return 0;
|
||||
|
||||
pm_runtime_get_sync(dev);
|
||||
mutex_lock(&st->lock);
|
||||
|
||||
@@ -205,7 +205,7 @@ struct inv_icm45600_sensor_state {
|
||||
#define INV_ICM45600_SPI_SLEW_RATE_38NS 0
|
||||
|
||||
#define INV_ICM45600_REG_INT1_CONFIG2 0x0018
|
||||
#define INV_ICM45600_INT1_CONFIG2_PUSH_PULL BIT(2)
|
||||
#define INV_ICM45600_INT1_CONFIG2_OPEN_DRAIN BIT(2)
|
||||
#define INV_ICM45600_INT1_CONFIG2_LATCHED BIT(1)
|
||||
#define INV_ICM45600_INT1_CONFIG2_ACTIVE_HIGH BIT(0)
|
||||
#define INV_ICM45600_INT1_CONFIG2_ACTIVE_LOW 0x00
|
||||
|
||||
@@ -637,8 +637,8 @@ static int inv_icm45600_irq_init(struct inv_icm45600_state *st, int irq,
|
||||
break;
|
||||
}
|
||||
|
||||
if (!open_drain)
|
||||
val |= INV_ICM45600_INT1_CONFIG2_PUSH_PULL;
|
||||
if (open_drain)
|
||||
val |= INV_ICM45600_INT1_CONFIG2_OPEN_DRAIN;
|
||||
|
||||
ret = regmap_write(st->map, INV_ICM45600_REG_INT1_CONFIG2, val);
|
||||
if (ret)
|
||||
@@ -744,6 +744,11 @@ int inv_icm45600_core_probe(struct regmap *regmap, const struct inv_icm45600_chi
|
||||
*/
|
||||
fsleep(5 * USEC_PER_MSEC);
|
||||
|
||||
/* set pm_runtime active early for disable vddio resource cleanup */
|
||||
ret = pm_runtime_set_active(dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = inv_icm45600_enable_regulator_vddio(st);
|
||||
if (ret)
|
||||
return ret;
|
||||
@@ -776,7 +781,7 @@ int inv_icm45600_core_probe(struct regmap *regmap, const struct inv_icm45600_chi
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = devm_pm_runtime_set_active_enabled(dev);
|
||||
ret = devm_pm_runtime_enable(dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
||||
@@ -1943,6 +1943,14 @@ int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name,
|
||||
irq_type);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Acking interrupts by status register does not work reliably
|
||||
* but seem to work when this bit is set.
|
||||
*/
|
||||
if (st->chip_type == INV_MPU9150)
|
||||
st->irq_mask |= INV_MPU6050_INT_RD_CLEAR;
|
||||
|
||||
device_set_wakeup_capable(dev, true);
|
||||
|
||||
st->vdd_supply = devm_regulator_get(dev, "vdd");
|
||||
|
||||
@@ -390,6 +390,8 @@ struct inv_mpu6050_state {
|
||||
/* enable level triggering */
|
||||
#define INV_MPU6050_LATCH_INT_EN 0x20
|
||||
#define INV_MPU6050_BIT_BYPASS_EN 0x2
|
||||
/* allow acking interrupts by any register read */
|
||||
#define INV_MPU6050_INT_RD_CLEAR 0x10
|
||||
|
||||
/* Allowed timestamp period jitter in percent */
|
||||
#define INV_MPU6050_TS_PERIOD_JITTER 4
|
||||
|
||||
@@ -248,7 +248,6 @@ static irqreturn_t inv_mpu6050_interrupt_handle(int irq, void *p)
|
||||
switch (st->chip_type) {
|
||||
case INV_MPU6000:
|
||||
case INV_MPU6050:
|
||||
case INV_MPU9150:
|
||||
/*
|
||||
* WoM is not supported and interrupt status read seems to be broken for
|
||||
* some chips. Since data ready is the only interrupt, bypass interrupt
|
||||
@@ -257,6 +256,10 @@ static irqreturn_t inv_mpu6050_interrupt_handle(int irq, void *p)
|
||||
wom_bits = 0;
|
||||
int_status = INV_MPU6050_BIT_RAW_DATA_RDY_INT;
|
||||
goto data_ready_interrupt;
|
||||
case INV_MPU9150:
|
||||
/* IRQ needs to be acked */
|
||||
wom_bits = 0;
|
||||
break;
|
||||
case INV_MPU6500:
|
||||
case INV_MPU6515:
|
||||
case INV_MPU6880:
|
||||
|
||||
@@ -228,8 +228,10 @@ static ssize_t iio_buffer_write(struct file *filp, const char __user *buf,
|
||||
written = 0;
|
||||
add_wait_queue(&rb->pollq, &wait);
|
||||
do {
|
||||
if (!indio_dev->info)
|
||||
return -ENODEV;
|
||||
if (!indio_dev->info) {
|
||||
ret = -ENODEV;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!iio_buffer_space_available(rb)) {
|
||||
if (signal_pending(current)) {
|
||||
|
||||
@@ -109,9 +109,9 @@ static int bh1780_read_raw(struct iio_dev *indio_dev,
|
||||
case IIO_LIGHT:
|
||||
pm_runtime_get_sync(&bh1780->client->dev);
|
||||
value = bh1780_read_word(bh1780, BH1780_REG_DLOW);
|
||||
pm_runtime_put_autosuspend(&bh1780->client->dev);
|
||||
if (value < 0)
|
||||
return value;
|
||||
pm_runtime_put_autosuspend(&bh1780->client->dev);
|
||||
*val = value;
|
||||
|
||||
return IIO_VAL_INT;
|
||||
|
||||
@@ -171,7 +171,7 @@ static s16 tlv493d_get_channel_data(u8 *b, enum tlv493d_channels ch)
|
||||
switch (ch) {
|
||||
case TLV493D_AXIS_X:
|
||||
val = FIELD_GET(TLV493D_BX_MAG_X_AXIS_MSB, b[TLV493D_RD_REG_BX]) << 4 |
|
||||
FIELD_GET(TLV493D_BX2_MAG_X_AXIS_LSB, b[TLV493D_RD_REG_BX2]) >> 4;
|
||||
FIELD_GET(TLV493D_BX2_MAG_X_AXIS_LSB, b[TLV493D_RD_REG_BX2]);
|
||||
break;
|
||||
case TLV493D_AXIS_Y:
|
||||
val = FIELD_GET(TLV493D_BY_MAG_Y_AXIS_MSB, b[TLV493D_RD_REG_BY]) << 4 |
|
||||
|
||||
@@ -221,7 +221,7 @@ static int mcp4131_write_raw(struct iio_dev *indio_dev,
|
||||
|
||||
mutex_lock(&data->lock);
|
||||
|
||||
data->buf[0] = address << MCP4131_WIPER_SHIFT;
|
||||
data->buf[0] = address;
|
||||
data->buf[0] |= MCP4131_WRITE | (val >> 8);
|
||||
data->buf[1] = val & 0xFF; /* 8 bits here */
|
||||
|
||||
|
||||
@@ -719,6 +719,9 @@ static int hx9023s_set_samp_freq(struct hx9023s_data *data, int val, int val2)
|
||||
struct device *dev = regmap_get_device(data->regmap);
|
||||
unsigned int i, period_ms;
|
||||
|
||||
if (!val && !val2)
|
||||
return -EINVAL;
|
||||
|
||||
period_ms = div_u64(NANO, (val * MEGA + val2));
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(hx9023s_samp_freq_table); i++) {
|
||||
@@ -1034,9 +1037,8 @@ static int hx9023s_send_cfg(const struct firmware *fw, struct hx9023s_data *data
|
||||
if (!bin)
|
||||
return -ENOMEM;
|
||||
|
||||
memcpy(bin->data, fw->data, fw->size);
|
||||
|
||||
bin->fw_size = fw->size;
|
||||
memcpy(bin->data, fw->data, bin->fw_size);
|
||||
bin->fw_ver = bin->data[FW_VER_OFFSET];
|
||||
bin->reg_count = get_unaligned_le16(bin->data + FW_REG_CNT_OFFSET);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user