• Robert Jarzmik's avatar
    ARM: pxa: fix GPIO double shifts · 67d7d69d
    Robert Jarzmik authored
    commit ca26475b upstream.
    
    The commit 9bf448c6 ("ARM: pxa: use generic gpio operation instead of
    gpio register") from Oct 17, 2011, leads to the following static checker
    warning:
      arch/arm/mach-pxa/spitz_pm.c:172 spitz_charger_wakeup()
      warn: double left shift '!gpio_get_value(SPITZ_GPIO_KEY_INT)
            << (1 << ((SPITZ_GPIO_KEY_INT) & 31))'
    
    As Dan reported, the value is shifted three times :
     - once by gpio_get_value(), which returns either 0 or BIT(gpio)
     - once by the shift operation '<<'
     - a last time by GPIO_bit(gpio) which is BIT(gpio)
    
    Therefore the calculation lead to a chained or operator of :
     - (1 << gpio) << (1 << gpio) = (2^gpio)^gpio = 2 ^ (gpio * gpio)
    
    It is be sheer luck the former statement works, only because each gpio
    used is strictly smaller than 6, and therefore 2^(gpio^2) never
    overflows a 32 bits value, and because it is used as a boolean value to
    check a gpio activation.
    
    As the xxx_charger_wakeup() functions are used as a true/false detection
    mechanism, take that opportunity to change their prototypes from integer
    return value to boolean one.
    
    Fixes: 9bf448c6 ("ARM: pxa: use generic gpio operation instead of
    gpio register")
    Reported-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
    Cc: Joe Perches <joe@perches.com>
    Signed-off-by: default avatarRobert Jarzmik <robert.jarzmik@free.fr>
    [bwh: Backported to 3.16: adjust filename]
    Signed-off-by: default avatarBen Hutchings <ben@decadent.org.uk>
    67d7d69d
corgi_pm.c 6.06 KB