mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-09-22 09:34:56 +02:00
iio: proximity: vl53l0x: notify trigger and clear IRQ on error paths
commitbe843b0579upstream. vl53l0x_trigger_handler() returns directly on the I2C read failure paths without calling iio_trigger_notify_done() or vl53l0x_clear_irq(). A single transient i2c_smbus_read_i2c_block_data() failure (negative errno or a short read) therefore leaves two pieces of state behind: - iio_trigger_notify_done() never decrements the trigger's use_count, so iio_trigger_poll_nested() silently drops further dispatches (see industrialio-trigger.c, the !atomic_read(&trig->use_count) guard); - vl53l0x_clear_irq() never writes SYSTEM_INTERRUPT_CLEAR, so the chip keeps the DRDY interrupt asserted. The sensor's buffer mode stays wedged from then on, recoverable only by re-binding the driver. The sibling driver vl53l1x-i2c.c handles exactly the same case correctly by jumping to a "notify_and_clear_irq" label that always calls both helpers; mirror that here. The bogus negative-int return value cast to irqreturn_t also goes away as a side effect. Fixes:762186c6e7("iio: proximity: vl53l0x-i2c: Added continuous mode support") Signed-off-by: Stepan Ionichev <sozdayvek@gmail.com> Cc: <Stable@vger.kernel.org> Signed-off-by: Jonathan Cameron <jic23@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
b3f1af4ba8
commit
c6ca87c7bb
@@ -87,15 +87,14 @@ static irqreturn_t vl53l0x_trigger_handler(int irq, void *priv)
|
||||
ret = i2c_smbus_read_i2c_block_data(data->client,
|
||||
VL_REG_RESULT_RANGE_STATUS,
|
||||
sizeof(buffer), buffer);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
else if (ret != 12)
|
||||
return -EREMOTEIO;
|
||||
if (ret != 12)
|
||||
goto done;
|
||||
|
||||
scan.chan = get_unaligned_be16(&buffer[10]);
|
||||
iio_push_to_buffers_with_ts(indio_dev, &scan, sizeof(scan),
|
||||
iio_get_time_ns(indio_dev));
|
||||
|
||||
done:
|
||||
iio_trigger_notify_done(indio_dev->trig);
|
||||
vl53l0x_clear_irq(data);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user