Re: [PATCH] Input: rotary-encoder: use request_any_context_irq and gpio_get_value_cansleep

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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



[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux