Skip to content

Commit

Permalink
staging:iio:accel:sca3000 Tidy up probe order to avoid a race.
Browse files Browse the repository at this point in the history
Previously the device was exposed to userspace and in kernel consumers
before the interrupts had been configured. As nothing stopped them being
enabled in the interval this could cause unhandled interrupts.

Signed-off-by: Jonathan Cameron <jic23@kernel.org>
Reviewed-by: Lars-Peter Clausen <lars@metafoo.de>
  • Loading branch information
Jonathan Cameron committed Oct 23, 2016
1 parent 7ab9fa0 commit 9a4936d
Showing 1 changed file with 6 additions and 8 deletions.
14 changes: 6 additions & 8 deletions drivers/staging/iio/accel/sca3000.c
Original file line number Diff line number Diff line change
Expand Up @@ -1440,9 +1440,6 @@ static int sca3000_probe(struct spi_device *spi)
indio_dev->modes = INDIO_DIRECT_MODE;

sca3000_configure_ring(indio_dev);
ret = iio_device_register(indio_dev);
if (ret < 0)
return ret;

if (spi->irq) {
ret = request_threaded_irq(spi->irq,
Expand All @@ -1452,7 +1449,7 @@ static int sca3000_probe(struct spi_device *spi)
"sca3000",
indio_dev);
if (ret)
goto error_unregister_dev;
return ret;
}
indio_dev->setup_ops = &sca3000_ring_setup_ops;
ret = sca3000_clean_setup(st);
Expand All @@ -1463,13 +1460,12 @@ static int sca3000_probe(struct spi_device *spi)
if (ret)
goto error_free_irq;

return 0;
return iio_device_register(indio_dev);

error_free_irq:
if (spi->irq)
free_irq(spi->irq, indio_dev);
error_unregister_dev:
iio_device_unregister(indio_dev);

return ret;
}

Expand All @@ -1496,11 +1492,13 @@ static int sca3000_remove(struct spi_device *spi)
struct iio_dev *indio_dev = spi_get_drvdata(spi);
struct sca3000_state *st = iio_priv(indio_dev);

iio_device_unregister(indio_dev);

/* Must ensure no interrupts can be generated after this! */
sca3000_stop_all_interrupts(st);
if (spi->irq)
free_irq(spi->irq, indio_dev);
iio_device_unregister(indio_dev);

sca3000_unconfigure_ring(indio_dev);

return 0;
Expand Down

0 comments on commit 9a4936d

Please sign in to comment.