From: Andy Shevchenko <andriy.shevche...@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.shevche...@linux.intel.com>
Acked-by: Linus Walleij <linus.wall...@linaro.org>
Signed-off-by: Jonathan Cameron <jonathan.came...@huawei.com>
Signed-off-by: Sasha Levin <sas...@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 29c209cc1108..2540e7c2358c 100644
--- a/drivers/iio/pressure/bmp280-core.c
+++ b/drivers/iio/pressure/bmp280-core.c
@@ -713,7 +713,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)
@@ -969,6 +969,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

Reply via email to