On Wed, Dec 23, 2015 at 08:41:55PM +0200, Timo Teräs wrote: > This allows to use GPIO expanders behind I2C or SPI bus. > > Signed-off-by: Timo Teräs <timo.teras@xxxxxx> > --- > drivers/input/misc/rotary_encoder.c | 20 ++++++++++---------- > 1 file changed, 10 insertions(+), 10 deletions(-) > > diff --git a/drivers/input/misc/rotary_encoder.c b/drivers/input/misc/rotary_encoder.c > index 8aee719..8bedd7b 100644 > --- a/drivers/input/misc/rotary_encoder.c > +++ b/drivers/input/misc/rotary_encoder.c > @@ -48,8 +48,8 @@ struct rotary_encoder { > > static int rotary_encoder_get_state(const struct rotary_encoder_platform_data *pdata) > { > - int a = !!gpio_get_value(pdata->gpio_a); > - int b = !!gpio_get_value(pdata->gpio_b); > + int a = !!gpio_get_value_cansleep(pdata->gpio_a); > + int b = !!gpio_get_value_cansleep(pdata->gpio_b); > > a ^= pdata->inverted_a; > b ^= pdata->inverted_b; > @@ -335,18 +335,18 @@ static int rotary_encoder_probe(struct platform_device *pdev) > goto exit_free_gpio_b; > } > > - err = request_irq(encoder->irq_a, handler, > - IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, > - DRV_NAME, encoder); > - if (err) { > + err = request_any_context_irq(encoder->irq_a, handler, > + IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, > + DRV_NAME, encoder); > + if (err < 0) { This is wrong. If you are saying that you can use any context IRQ you can get hard irq, but in rotary_encoder_get_state() (which is called from IRQ handler) you are using sleeping gpio accessors. I guess you need to explicitly request threaded IRQs. Thanks. -- Dmitry -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html