• Grygorii Strashko's avatar
    gpio: omap: fix omap2_set_gpio_debounce · e85ec6c3
    Grygorii Strashko authored
    According to TRMs:
    
    Required input line stable =
      (the value of the GPIO_DEBOUNCINGTIME[7:0].DEBOUNCETIME + 1) × 31,
    where the value of the GPIO_DEBOUNCINGTIME[7:0].DEBOUNCETIME bit field
    is from 0 to 255.
    
    But now omap2_set_gpio_debounce() will calculate debounce time and
    behave incorrectly in the following cases:
    1) requested debounce time is !0 and <32
       calculated DEBOUNCETIME = 0x1 == 62 us;
       expected value of DEBOUNCETIME = 0x0 == 31us
    2) requested debounce time is 0
       calculated DEBOUNCETIME = 0x1 == 62 us;
       expected: disable debounce and DEBOUNCETIME = 0x0
    3) requested debounce time is >32 and <63
       calculated DEBOUNCETIME = 0x0 and debounce will be disabled;
       expected: enable debounce and DEBOUNCETIME = 0x1 == 62 us
    
    Hence, rework omap2_set_gpio_debounce() to fix above cases:
    1) introduce local variable "enable" and use it to identify
    when debounce need to be enabled or disabled. Disable debounce
    if requested debounce time is 0.
    2) use below formula for debounce time calculation:
       debounce = (DIV_ROUND_UP(debounce, 31) - 1) & 0xFF;
    Signed-off-by: default avatarGrygorii Strashko <grygorii.strashko@ti.com>
    Acked-by: default avatarSantosh Shilimkar <ssantosh@kernel.org>
    Tested-by: default avatarTony Lindgren <tony@atomide.com>
    Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    e85ec6c3
gpio-omap.c 43.5 KB