| From b59e9ab315a0ec7d806582ec64562fd97ce54b16 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 23 Mar 2020 12:41:25 +0200 |
| Subject: iio: pressure: bmp280: Tolerate IRQ before registering |
| |
| From: Andy Shevchenko <andriy.shevchenko@linux.intel.com> |
| |
| [ Upstream commit 97b31a6f5fb95b1ec6575b78a7240baddba34384 ] |
| |
| With DEBUG_SHIRQ enabled we have a kernel crash |
| |
| [ 116.482696] BUG: kernel NULL pointer dereference, address: 0000000000000000 |
| |
| ... |
| |
| [ 116.606571] Call Trace: |
| [ 116.609023] <IRQ> |
| [ 116.611047] complete+0x34/0x50 |
| [ 116.614206] bmp085_eoc_irq+0x9/0x10 [bmp280] |
| |
| because DEBUG_SHIRQ mechanism fires an IRQ before registration and drivers |
| ought to be able to handle an interrupt happening before request_irq() returns. |
| |
| Fixes: aae953949651 ("iio: pressure: bmp280: add support for BMP085 EOC interrupt") |
| Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> |
| Acked-by: Linus Walleij <linus.walleij@linaro.org> |
| Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/iio/pressure/bmp280-core.c | 5 ++++- |
| 1 file changed, 4 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/iio/pressure/bmp280-core.c b/drivers/iio/pressure/bmp280-core.c |
| index 5f625ffa2a88d..3204dff34e0ad 100644 |
| --- a/drivers/iio/pressure/bmp280-core.c |
| +++ b/drivers/iio/pressure/bmp280-core.c |
| @@ -651,7 +651,7 @@ static int bmp180_measure(struct bmp280_data *data, u8 ctrl_meas) |
| unsigned int ctrl; |
| |
| if (data->use_eoc) |
| - init_completion(&data->done); |
| + reinit_completion(&data->done); |
| |
| ret = regmap_write(data->regmap, BMP280_REG_CTRL_MEAS, ctrl_meas); |
| if (ret) |
| @@ -907,6 +907,9 @@ static int bmp085_fetch_eoc_irq(struct device *dev, |
| "trying to enforce it\n"); |
| irq_trig = IRQF_TRIGGER_RISING; |
| } |
| + |
| + init_completion(&data->done); |
| + |
| ret = devm_request_threaded_irq(dev, |
| irq, |
| bmp085_eoc_irq, |
| -- |
| 2.25.1 |
| |