Skip to content

Commit 922b83b

Browse files
committed
Merge tag 'iio-fixes-3.17a' of git://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio into staging-linus
Jonathan writes: First round of IIO fixes for the 3.17 cycle. * Fix an overwritten error return that can prevent deferred probing when using of_iio_channel_get_by_name * A series that deals with an incorrect reference count when the default trigger is set within the main probe routine for a driver. Can result in a double free if the trigger is changed. * Fix a buglet with xilinx-xadc concerning setup of the address for an aux channel. * At91 adc driver could sometimes get a touchscreen reading rather than the intended adc channel. This is fixed by using the channel data register instead. * Fix some ST magnetometer gain values that differ in production parts from the prerelease ones used for driver development.
2 parents 9e82bf0 + a31d092 commit 922b83b

File tree

12 files changed

+50
-37
lines changed

12 files changed

+50
-37
lines changed

drivers/iio/accel/bma180.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -571,7 +571,7 @@ static int bma180_probe(struct i2c_client *client,
571571
trig->ops = &bma180_trigger_ops;
572572
iio_trigger_set_drvdata(trig, indio_dev);
573573
data->trig = trig;
574-
indio_dev->trig = trig;
574+
indio_dev->trig = iio_trigger_get(trig);
575575

576576
ret = iio_trigger_register(trig);
577577
if (ret)

drivers/iio/adc/ad_sigma_delta.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -472,7 +472,7 @@ static int ad_sd_probe_trigger(struct iio_dev *indio_dev)
472472
goto error_free_irq;
473473

474474
/* select default trigger */
475-
indio_dev->trig = sigma_delta->trig;
475+
indio_dev->trig = iio_trigger_get(sigma_delta->trig);
476476

477477
return 0;
478478

drivers/iio/adc/at91_adc.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ struct at91_adc_state {
196196
bool done;
197197
int irq;
198198
u16 last_value;
199+
int chnb;
199200
struct mutex lock;
200201
u8 num_channels;
201202
void __iomem *reg_base;
@@ -274,7 +275,7 @@ void handle_adc_eoc_trigger(int irq, struct iio_dev *idev)
274275
disable_irq_nosync(irq);
275276
iio_trigger_poll(idev->trig);
276277
} else {
277-
st->last_value = at91_adc_readl(st, AT91_ADC_LCDR);
278+
st->last_value = at91_adc_readl(st, AT91_ADC_CHAN(st, st->chnb));
278279
st->done = true;
279280
wake_up_interruptible(&st->wq_data_avail);
280281
}
@@ -351,7 +352,7 @@ static irqreturn_t at91_adc_rl_interrupt(int irq, void *private)
351352
unsigned int reg;
352353

353354
status &= at91_adc_readl(st, AT91_ADC_IMR);
354-
if (status & st->registers->drdy_mask)
355+
if (status & GENMASK(st->num_channels - 1, 0))
355356
handle_adc_eoc_trigger(irq, idev);
356357

357358
if (status & AT91RL_ADC_IER_PEN) {
@@ -418,7 +419,7 @@ static irqreturn_t at91_adc_9x5_interrupt(int irq, void *private)
418419
AT91_ADC_IER_YRDY |
419420
AT91_ADC_IER_PRDY;
420421

421-
if (status & st->registers->drdy_mask)
422+
if (status & GENMASK(st->num_channels - 1, 0))
422423
handle_adc_eoc_trigger(irq, idev);
423424

424425
if (status & AT91_ADC_IER_PEN) {
@@ -689,9 +690,10 @@ static int at91_adc_read_raw(struct iio_dev *idev,
689690
case IIO_CHAN_INFO_RAW:
690691
mutex_lock(&st->lock);
691692

693+
st->chnb = chan->channel;
692694
at91_adc_writel(st, AT91_ADC_CHER,
693695
AT91_ADC_CH(chan->channel));
694-
at91_adc_writel(st, AT91_ADC_IER, st->registers->drdy_mask);
696+
at91_adc_writel(st, AT91_ADC_IER, BIT(chan->channel));
695697
at91_adc_writel(st, AT91_ADC_CR, AT91_ADC_START);
696698

697699
ret = wait_event_interruptible_timeout(st->wq_data_avail,
@@ -708,7 +710,7 @@ static int at91_adc_read_raw(struct iio_dev *idev,
708710

709711
at91_adc_writel(st, AT91_ADC_CHDR,
710712
AT91_ADC_CH(chan->channel));
711-
at91_adc_writel(st, AT91_ADC_IDR, st->registers->drdy_mask);
713+
at91_adc_writel(st, AT91_ADC_IDR, BIT(chan->channel));
712714

713715
st->last_value = 0;
714716
st->done = false;

drivers/iio/adc/xilinx-xadc-core.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1126,7 +1126,7 @@ static int xadc_parse_dt(struct iio_dev *indio_dev, struct device_node *np,
11261126
chan->address = XADC_REG_VPVN;
11271127
} else {
11281128
chan->scan_index = 15 + reg;
1129-
chan->scan_index = XADC_REG_VAUX(reg - 1);
1129+
chan->address = XADC_REG_VAUX(reg - 1);
11301130
}
11311131
num_channels++;
11321132
chan++;

drivers/iio/common/hid-sensors/hid-sensor-trigger.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,8 @@ int hid_sensor_setup_trigger(struct iio_dev *indio_dev, const char *name,
122122
dev_err(&indio_dev->dev, "Trigger Register Failed\n");
123123
goto error_free_trig;
124124
}
125-
indio_dev->trig = attrb->trigger = trig;
125+
attrb->trigger = trig;
126+
indio_dev->trig = iio_trigger_get(trig);
126127

127128
return ret;
128129

drivers/iio/common/st_sensors/st_sensors_trigger.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ int st_sensors_allocate_trigger(struct iio_dev *indio_dev,
4949
dev_err(&indio_dev->dev, "failed to register iio trigger.\n");
5050
goto iio_trigger_register_error;
5151
}
52-
indio_dev->trig = sdata->trig;
52+
indio_dev->trig = iio_trigger_get(sdata->trig);
5353

5454
return 0;
5555

drivers/iio/gyro/itg3200_buffer.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ int itg3200_probe_trigger(struct iio_dev *indio_dev)
132132
goto error_free_irq;
133133

134134
/* select default trigger */
135-
indio_dev->trig = st->trig;
135+
indio_dev->trig = iio_trigger_get(st->trig);
136136

137137
return 0;
138138

drivers/iio/imu/inv_mpu6050/inv_mpu_trigger.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ int inv_mpu6050_probe_trigger(struct iio_dev *indio_dev)
135135
ret = iio_trigger_register(st->trig);
136136
if (ret)
137137
goto error_free_irq;
138-
indio_dev->trig = st->trig;
138+
indio_dev->trig = iio_trigger_get(st->trig);
139139

140140
return 0;
141141

drivers/iio/inkern.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ static struct iio_channel *of_iio_channel_get_by_name(struct device_node *np,
178178
index = of_property_match_string(np, "io-channel-names",
179179
name);
180180
chan = of_iio_channel_get(np, index);
181-
if (!IS_ERR(chan))
181+
if (!IS_ERR(chan) || PTR_ERR(chan) == -EPROBE_DEFER)
182182
break;
183183
else if (name && index >= 0) {
184184
pr_err("ERROR: could not get IIO channel %s:%s(%i)\n",

drivers/iio/magnetometer/st_magn_core.c

Lines changed: 30 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@
4242
#define ST_MAGN_FS_AVL_5600MG 5600
4343
#define ST_MAGN_FS_AVL_8000MG 8000
4444
#define ST_MAGN_FS_AVL_8100MG 8100
45-
#define ST_MAGN_FS_AVL_10000MG 10000
45+
#define ST_MAGN_FS_AVL_12000MG 12000
46+
#define ST_MAGN_FS_AVL_16000MG 16000
4647

4748
/* CUSTOM VALUES FOR SENSOR 1 */
4849
#define ST_MAGN_1_WAI_EXP 0x3c
@@ -69,20 +70,20 @@
6970
#define ST_MAGN_1_FS_AVL_4700_VAL 0x05
7071
#define ST_MAGN_1_FS_AVL_5600_VAL 0x06
7172
#define ST_MAGN_1_FS_AVL_8100_VAL 0x07
72-
#define ST_MAGN_1_FS_AVL_1300_GAIN_XY 1100
73-
#define ST_MAGN_1_FS_AVL_1900_GAIN_XY 855
74-
#define ST_MAGN_1_FS_AVL_2500_GAIN_XY 670
75-
#define ST_MAGN_1_FS_AVL_4000_GAIN_XY 450
76-
#define ST_MAGN_1_FS_AVL_4700_GAIN_XY 400
77-
#define ST_MAGN_1_FS_AVL_5600_GAIN_XY 330
78-
#define ST_MAGN_1_FS_AVL_8100_GAIN_XY 230
79-
#define ST_MAGN_1_FS_AVL_1300_GAIN_Z 980
80-
#define ST_MAGN_1_FS_AVL_1900_GAIN_Z 760
81-
#define ST_MAGN_1_FS_AVL_2500_GAIN_Z 600
82-
#define ST_MAGN_1_FS_AVL_4000_GAIN_Z 400
83-
#define ST_MAGN_1_FS_AVL_4700_GAIN_Z 355
84-
#define ST_MAGN_1_FS_AVL_5600_GAIN_Z 295
85-
#define ST_MAGN_1_FS_AVL_8100_GAIN_Z 205
73+
#define ST_MAGN_1_FS_AVL_1300_GAIN_XY 909
74+
#define ST_MAGN_1_FS_AVL_1900_GAIN_XY 1169
75+
#define ST_MAGN_1_FS_AVL_2500_GAIN_XY 1492
76+
#define ST_MAGN_1_FS_AVL_4000_GAIN_XY 2222
77+
#define ST_MAGN_1_FS_AVL_4700_GAIN_XY 2500
78+
#define ST_MAGN_1_FS_AVL_5600_GAIN_XY 3030
79+
#define ST_MAGN_1_FS_AVL_8100_GAIN_XY 4347
80+
#define ST_MAGN_1_FS_AVL_1300_GAIN_Z 1020
81+
#define ST_MAGN_1_FS_AVL_1900_GAIN_Z 1315
82+
#define ST_MAGN_1_FS_AVL_2500_GAIN_Z 1666
83+
#define ST_MAGN_1_FS_AVL_4000_GAIN_Z 2500
84+
#define ST_MAGN_1_FS_AVL_4700_GAIN_Z 2816
85+
#define ST_MAGN_1_FS_AVL_5600_GAIN_Z 3389
86+
#define ST_MAGN_1_FS_AVL_8100_GAIN_Z 4878
8687
#define ST_MAGN_1_MULTIREAD_BIT false
8788

8889
/* CUSTOM VALUES FOR SENSOR 2 */
@@ -105,10 +106,12 @@
105106
#define ST_MAGN_2_FS_MASK 0x60
106107
#define ST_MAGN_2_FS_AVL_4000_VAL 0x00
107108
#define ST_MAGN_2_FS_AVL_8000_VAL 0x01
108-
#define ST_MAGN_2_FS_AVL_10000_VAL 0x02
109-
#define ST_MAGN_2_FS_AVL_4000_GAIN 430
110-
#define ST_MAGN_2_FS_AVL_8000_GAIN 230
111-
#define ST_MAGN_2_FS_AVL_10000_GAIN 230
109+
#define ST_MAGN_2_FS_AVL_12000_VAL 0x02
110+
#define ST_MAGN_2_FS_AVL_16000_VAL 0x03
111+
#define ST_MAGN_2_FS_AVL_4000_GAIN 146
112+
#define ST_MAGN_2_FS_AVL_8000_GAIN 292
113+
#define ST_MAGN_2_FS_AVL_12000_GAIN 438
114+
#define ST_MAGN_2_FS_AVL_16000_GAIN 584
112115
#define ST_MAGN_2_MULTIREAD_BIT false
113116
#define ST_MAGN_2_OUT_X_L_ADDR 0x28
114117
#define ST_MAGN_2_OUT_Y_L_ADDR 0x2a
@@ -266,9 +269,14 @@ static const struct st_sensors st_magn_sensors[] = {
266269
.gain = ST_MAGN_2_FS_AVL_8000_GAIN,
267270
},
268271
[2] = {
269-
.num = ST_MAGN_FS_AVL_10000MG,
270-
.value = ST_MAGN_2_FS_AVL_10000_VAL,
271-
.gain = ST_MAGN_2_FS_AVL_10000_GAIN,
272+
.num = ST_MAGN_FS_AVL_12000MG,
273+
.value = ST_MAGN_2_FS_AVL_12000_VAL,
274+
.gain = ST_MAGN_2_FS_AVL_12000_GAIN,
275+
},
276+
[3] = {
277+
.num = ST_MAGN_FS_AVL_16000MG,
278+
.value = ST_MAGN_2_FS_AVL_16000_VAL,
279+
.gain = ST_MAGN_2_FS_AVL_16000_GAIN,
272280
},
273281
},
274282
},

drivers/staging/iio/meter/ade7758_trigger.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ int ade7758_probe_trigger(struct iio_dev *indio_dev)
8585
ret = iio_trigger_register(st->trig);
8686

8787
/* select default trigger */
88-
indio_dev->trig = st->trig;
88+
indio_dev->trig = iio_trigger_get(st->trig);
8989
if (ret)
9090
goto error_free_irq;
9191

include/linux/iio/trigger.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,12 @@ static inline void iio_trigger_put(struct iio_trigger *trig)
8484
put_device(&trig->dev);
8585
}
8686

87-
static inline void iio_trigger_get(struct iio_trigger *trig)
87+
static inline struct iio_trigger *iio_trigger_get(struct iio_trigger *trig)
8888
{
8989
get_device(&trig->dev);
9090
__module_get(trig->ops->owner);
91+
92+
return trig;
9193
}
9294

9395
/**

0 commit comments

Comments
 (0)