Skip to content

Commit 7c602f5

Browse files
committed
Merge tag 'iio-fixes-for-5.16b' of https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio into char-misc-next
Jonathan writes: 2nd set of IIO fixes for 5.16 Note 1st set were before the merge window. Biggest set in here fix what happens when things go wrong in the interrupt handlers for an IIO trigger. Otherwise normal mix of recent and ancient bugs. trigger core - Fix reference counting bug that was preventing the iio_trig structures from being released. adxrs290 - Correctly sign extend the rate and temperature data. at91-sama5d2 - Fix sign extension from the wrong bit and use the scan_type values to avoid it being open coded in two places (which were out of sync) axp20x_adc - Fix current reporting bit depth. dln2-adc - Fix a lock ordering issue and lockdep complaint that results. - Add error handling for failure to register the trigger. imx8qxp - Wrong config dependency kxcjk-1013 - Potential leak due to wrong guard on cleanup. ltr501, kxsd9, stk3310, itg3200, ad7768 - Don't return error codes from interrupt handler and call iio_trigger_notify_done() on all paths to avoid leaving trigger disabled on an intermittent fault. mma8452 - Fix missing iio_trigger_get() that could lead to use after free. stm32 - Fix a current leak. - Avoid null pointer derefence on defer_probe error due to wrong struct device being passed. stm32-timer - Drop space in MODULE_ALIAS. * tag 'iio-fixes-for-5.16b' of https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio: iio: trigger: stm32-timer: fix MODULE_ALIAS iio: adc: stm32: fix null pointer on defer_probe error iio: at91-sama5d2: Fix incorrect sign extension iio: adc: axp20x_adc: fix charging current reporting on AXP22x iio: gyro: adxrs290: fix data signedness iio: ad7768-1: Call iio_trigger_notify_done() on error iio: itg3200: Call iio_trigger_notify_done() on error iio: imx8qxp-adc: fix dependency to the intended ARCH_MXC config iio: dln2: Check return value of devm_iio_trigger_register() iio: trigger: Fix reference counting iio: dln2-adc: Fix lockdep complaint iio: adc: stm32: fix a current leak by resetting pcsel before disabling vdda iio: mma8452: Fix trigger reference couting iio: stk3310: Don't return error code in interrupt handler iio: kxsd9: Don't return error code in trigger handler iio: ltr501: Don't return error code in trigger handler iio: accel: kxcjk-1013: Fix possible memory leak in probe and remove
2 parents 0edeb89 + 893621e commit 7c602f5

File tree

15 files changed

+36
-44
lines changed

15 files changed

+36
-44
lines changed

drivers/iio/accel/kxcjk-1013.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1595,8 +1595,7 @@ static int kxcjk1013_probe(struct i2c_client *client,
15951595
return 0;
15961596

15971597
err_buffer_cleanup:
1598-
if (data->dready_trig)
1599-
iio_triggered_buffer_cleanup(indio_dev);
1598+
iio_triggered_buffer_cleanup(indio_dev);
16001599
err_trigger_unregister:
16011600
if (data->dready_trig)
16021601
iio_trigger_unregister(data->dready_trig);
@@ -1618,8 +1617,8 @@ static int kxcjk1013_remove(struct i2c_client *client)
16181617
pm_runtime_disable(&client->dev);
16191618
pm_runtime_set_suspended(&client->dev);
16201619

1620+
iio_triggered_buffer_cleanup(indio_dev);
16211621
if (data->dready_trig) {
1622-
iio_triggered_buffer_cleanup(indio_dev);
16231622
iio_trigger_unregister(data->dready_trig);
16241623
iio_trigger_unregister(data->motion_trig);
16251624
}

drivers/iio/accel/kxsd9.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -224,14 +224,14 @@ static irqreturn_t kxsd9_trigger_handler(int irq, void *p)
224224
hw_values.chan,
225225
sizeof(hw_values.chan));
226226
if (ret) {
227-
dev_err(st->dev,
228-
"error reading data\n");
229-
return ret;
227+
dev_err(st->dev, "error reading data: %d\n", ret);
228+
goto out;
230229
}
231230

232231
iio_push_to_buffers_with_timestamp(indio_dev,
233232
&hw_values,
234233
iio_get_time_ns(indio_dev));
234+
out:
235235
iio_trigger_notify_done(indio_dev->trig);
236236

237237
return IRQ_HANDLED;

drivers/iio/accel/mma8452.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1470,7 +1470,7 @@ static int mma8452_trigger_setup(struct iio_dev *indio_dev)
14701470
if (ret)
14711471
return ret;
14721472

1473-
indio_dev->trig = trig;
1473+
indio_dev->trig = iio_trigger_get(trig);
14741474

14751475
return 0;
14761476
}

drivers/iio/adc/Kconfig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -532,7 +532,7 @@ config IMX7D_ADC
532532

533533
config IMX8QXP_ADC
534534
tristate "NXP IMX8QXP ADC driver"
535-
depends on ARCH_MXC_ARM64 || COMPILE_TEST
535+
depends on ARCH_MXC || COMPILE_TEST
536536
depends on HAS_IOMEM
537537
help
538538
Say yes here to build support for IMX8QXP ADC.

drivers/iio/adc/ad7768-1.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -480,8 +480,8 @@ static irqreturn_t ad7768_trigger_handler(int irq, void *p)
480480
iio_push_to_buffers_with_timestamp(indio_dev, &st->data.scan,
481481
iio_get_time_ns(indio_dev));
482482

483-
iio_trigger_notify_done(indio_dev->trig);
484483
err_unlock:
484+
iio_trigger_notify_done(indio_dev->trig);
485485
mutex_unlock(&st->lock);
486486

487487
return IRQ_HANDLED;

drivers/iio/adc/at91-sama5d2_adc.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1586,7 +1586,8 @@ static int at91_adc_read_info_raw(struct iio_dev *indio_dev,
15861586
*val = st->conversion_value;
15871587
ret = at91_adc_adjust_val_osr(st, val);
15881588
if (chan->scan_type.sign == 's')
1589-
*val = sign_extend32(*val, 11);
1589+
*val = sign_extend32(*val,
1590+
chan->scan_type.realbits - 1);
15901591
st->conversion_done = false;
15911592
}
15921593

drivers/iio/adc/axp20x_adc.c

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -251,19 +251,8 @@ static int axp22x_adc_raw(struct iio_dev *indio_dev,
251251
struct iio_chan_spec const *chan, int *val)
252252
{
253253
struct axp20x_adc_iio *info = iio_priv(indio_dev);
254-
int size;
255254

256-
/*
257-
* N.B.: Unlike the Chinese datasheets tell, the charging current is
258-
* stored on 12 bits, not 13 bits. Only discharging current is on 13
259-
* bits.
260-
*/
261-
if (chan->type == IIO_CURRENT && chan->channel == AXP22X_BATT_DISCHRG_I)
262-
size = 13;
263-
else
264-
size = 12;
265-
266-
*val = axp20x_read_variable_width(info->regmap, chan->address, size);
255+
*val = axp20x_read_variable_width(info->regmap, chan->address, 12);
267256
if (*val < 0)
268257
return *val;
269258

@@ -386,9 +375,8 @@ static int axp22x_adc_scale(struct iio_chan_spec const *chan, int *val,
386375
return IIO_VAL_INT_PLUS_MICRO;
387376

388377
case IIO_CURRENT:
389-
*val = 0;
390-
*val2 = 500000;
391-
return IIO_VAL_INT_PLUS_MICRO;
378+
*val = 1;
379+
return IIO_VAL_INT;
392380

393381
case IIO_TEMP:
394382
*val = 100;

drivers/iio/adc/dln2-adc.c

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,6 @@ static int dln2_adc_set_chan_period(struct dln2_adc *dln2,
248248
static int dln2_adc_read(struct dln2_adc *dln2, unsigned int channel)
249249
{
250250
int ret, i;
251-
struct iio_dev *indio_dev = platform_get_drvdata(dln2->pdev);
252251
u16 conflict;
253252
__le16 value;
254253
int olen = sizeof(value);
@@ -257,13 +256,9 @@ static int dln2_adc_read(struct dln2_adc *dln2, unsigned int channel)
257256
.chan = channel,
258257
};
259258

260-
ret = iio_device_claim_direct_mode(indio_dev);
261-
if (ret < 0)
262-
return ret;
263-
264259
ret = dln2_adc_set_chan_enabled(dln2, channel, true);
265260
if (ret < 0)
266-
goto release_direct;
261+
return ret;
267262

268263
ret = dln2_adc_set_port_enabled(dln2, true, &conflict);
269264
if (ret < 0) {
@@ -300,8 +295,6 @@ static int dln2_adc_read(struct dln2_adc *dln2, unsigned int channel)
300295
dln2_adc_set_port_enabled(dln2, false, NULL);
301296
disable_chan:
302297
dln2_adc_set_chan_enabled(dln2, channel, false);
303-
release_direct:
304-
iio_device_release_direct_mode(indio_dev);
305298

306299
return ret;
307300
}
@@ -337,10 +330,16 @@ static int dln2_adc_read_raw(struct iio_dev *indio_dev,
337330

338331
switch (mask) {
339332
case IIO_CHAN_INFO_RAW:
333+
ret = iio_device_claim_direct_mode(indio_dev);
334+
if (ret < 0)
335+
return ret;
336+
340337
mutex_lock(&dln2->mutex);
341338
ret = dln2_adc_read(dln2, chan->channel);
342339
mutex_unlock(&dln2->mutex);
343340

341+
iio_device_release_direct_mode(indio_dev);
342+
344343
if (ret < 0)
345344
return ret;
346345

@@ -656,7 +655,11 @@ static int dln2_adc_probe(struct platform_device *pdev)
656655
return -ENOMEM;
657656
}
658657
iio_trigger_set_drvdata(dln2->trig, dln2);
659-
devm_iio_trigger_register(dev, dln2->trig);
658+
ret = devm_iio_trigger_register(dev, dln2->trig);
659+
if (ret) {
660+
dev_err(dev, "failed to register trigger: %d\n", ret);
661+
return ret;
662+
}
660663
iio_trigger_set_immutable(indio_dev, dln2->trig);
661664

662665
ret = devm_iio_triggered_buffer_setup(dev, indio_dev, NULL,

drivers/iio/adc/stm32-adc.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1117,6 +1117,7 @@ static void stm32h7_adc_unprepare(struct iio_dev *indio_dev)
11171117
{
11181118
struct stm32_adc *adc = iio_priv(indio_dev);
11191119

1120+
stm32_adc_writel(adc, STM32H7_ADC_PCSEL, 0);
11201121
stm32h7_adc_disable(indio_dev);
11211122
stm32_adc_int_ch_disable(adc);
11221123
stm32h7_adc_enter_pwr_down(adc);
@@ -1986,7 +1987,7 @@ static int stm32_adc_populate_int_ch(struct iio_dev *indio_dev, const char *ch_n
19861987
/* Get calibration data for vrefint channel */
19871988
ret = nvmem_cell_read_u16(&indio_dev->dev, "vrefint", &vrefint);
19881989
if (ret && ret != -ENOENT) {
1989-
return dev_err_probe(&indio_dev->dev, ret,
1990+
return dev_err_probe(indio_dev->dev.parent, ret,
19901991
"nvmem access error\n");
19911992
}
19921993
if (ret == -ENOENT)

drivers/iio/gyro/adxrs290.c

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

99
#include <linux/bitfield.h>
10+
#include <linux/bitops.h>
1011
#include <linux/delay.h>
1112
#include <linux/device.h>
1213
#include <linux/kernel.h>
@@ -124,7 +125,7 @@ static int adxrs290_get_rate_data(struct iio_dev *indio_dev, const u8 cmd, int *
124125
goto err_unlock;
125126
}
126127

127-
*val = temp;
128+
*val = sign_extend32(temp, 15);
128129

129130
err_unlock:
130131
mutex_unlock(&st->lock);
@@ -146,7 +147,7 @@ static int adxrs290_get_temp_data(struct iio_dev *indio_dev, int *val)
146147
}
147148

148149
/* extract lower 12 bits temperature reading */
149-
*val = temp & 0x0FFF;
150+
*val = sign_extend32(temp, 11);
150151

151152
err_unlock:
152153
mutex_unlock(&st->lock);

0 commit comments

Comments
 (0)