[PATCH v4 4/6] iio: accel: mma8452: Support interrupt sharing
Esben Haabendal <[email protected]>
| Newsgroups | org.kernel.vger.linux-iio,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
Adding handling of rutnime PM suspension in the interrupt handler allows sharing interrupt with other devices. Keep in mind that the device by default is using push-pull for the irq pin, which might require additional hardware design to allow interrupt sharing. Signed-off-by: Esben Haabendal <[email protected]> --- drivers/iio/accel/mma8452.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/drivers/iio/accel/mma8452.c b/drivers/iio/accel/mma8452.c index 1fb43c5b0b72..106cdd904dbf 100644 --- a/drivers/iio/accel/mma8452.c +++ b/drivers/iio/accel/mma8452.c @@ -1056,14 +1056,19 @@ static irqreturn_t mma8452_interrupt(int irq, void *p) struct iio_dev *indio_dev = p; struct mma8452_data *data = iio_priv(indio_dev); irqreturn_t ret = IRQ_NONE; + int pm_status; int src; + pm_status = pm_runtime_get_if_active(&data->client->dev); + if (pm_status == 0) + return IRQ_NONE; /* device is powered down */ + src = i2c_smbus_read_byte_data(data->client, MMA8452_INT_SRC); if (src < 0) - return IRQ_NONE; + goto out; if (!(src & (data->chip_info->enabled_events | MMA8452_INT_DRDY))) - return IRQ_NONE; + goto out; if (src & MMA8452_INT_DRDY) { iio_trigger_poll_nested(indio_dev->trig); @@ -1089,6 +1094,10 @@ static irqreturn_t mma8452_interrupt(int irq, void *p) ret = IRQ_HANDLED; } +out: + if (pm_status > 0) + pm_runtime_put_autosuspend(&data->client->dev); + return ret; } @@ -1690,7 +1699,7 @@ static int mma8452_probe(struct i2c_client *client) dev_info(dev, "invalid irq type, setting default active low\n"); irq_flags = IRQF_TRIGGER_LOW; } - irq_flags |= IRQF_ONESHOT; + irq_flags |= IRQF_ONESHOT | IRQF_SHARED; ret = request_threaded_irq(client->irq, NULL, mma8452_interrupt, irq_flags, client->name, indio_dev); if (ret) -- 2.55.0