On Wed, Oct 19, 2016 at 04:41:07PM -0700, Dmitry Torokhov wrote:
> It does not matter if given GPIO may sleep or not when reading state,
> polling is always done in a non-atomic context, so we should always
> be able to simply use gpiod_get_value_cansleep().
> 
> Also let's note in the logs when we fail to read gpio state.
> 
> Signed-off-by: Dmitry Torokhov <[email protected]>
> ---
>  drivers/input/keyboard/gpio_keys_polled.c | 21 ++++++++++-----------
>  1 file changed, 10 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/input/keyboard/gpio_keys_polled.c 
> b/drivers/input/keyboard/gpio_keys_polled.c
> index daef8ea..3c79158 100644
> --- a/drivers/input/keyboard/gpio_keys_polled.c
> +++ b/drivers/input/keyboard/gpio_keys_polled.c
> @@ -34,7 +34,6 @@ struct gpio_keys_button_data {
>       int last_state;
>       int count;
>       int threshold;
> -     int can_sleep;
>  };
>  
>  struct gpio_keys_polled_dev {
> @@ -76,16 +75,17 @@ static void gpio_keys_polled_check_state(struct 
> input_polled_dev *dev,
>  {
>       int state;
>  
> -     if (bdata->can_sleep)
> -             state = !!gpiod_get_value_cansleep(bdata->gpiod);
> -     else
> -             state = !!gpiod_get_value(bdata->gpiod);
> -
> -     gpio_keys_button_event(dev, button, state);
> +     state = gpiod_get_value_cansleep(bdata->gpiod);
> +     if (unlikely(state < 0)) {
> +             dev_err(input->dev.parent,

Umm, this should have been dev->input->dev.parent

> +                     "failed to get gpio state: %d\n", state);
> +     } else {
> +             gpio_keys_button_event(dev, button, state);
>  
> -     if (state != bdata->last_state) {
> -             bdata->count = 0;
> -             bdata->last_state = state;
> +             if (state != bdata->last_state) {
> +                     bdata->count = 0;
> +                     bdata->last_state = state;
> +             }
>       }
>  }
>  
> @@ -341,7 +341,6 @@ static int gpio_keys_polled_probe(struct platform_device 
> *pdev)
>                       }
>               }
>  
> -             bdata->can_sleep = gpiod_cansleep(bdata->gpiod);
>               bdata->last_state = -1;
>               bdata->threshold = DIV_ROUND_UP(button->debounce_interval,
>                                               pdata->poll_interval);
> -- 
> 2.8.0.rc3.226.g39d4020
> 
> 
> -- 
> Dmitry

-- 
Dmitry

Reply via email to