Skip to content
  • Javier Martinez Canillas's avatar
    leds: leds-gpio: set devm_gpio_request_one() flags param correctly · 2d7c22f6
    Javier Martinez Canillas authored
    commit a99d76f9
    
     leds: leds-gpio: use gpio_request_one
    
    changed the leds-gpio driver to use gpio_request_one() instead
    of gpio_request() + gpio_direction_output()
    
    Unfortunately, it also made a semantic change that breaks the
    leds-gpio driver.
    
    The gpio_request_one() flags parameter was set to:
    
    GPIOF_DIR_OUT | (led_dat->active_low ^ state)
    
    Since GPIOF_DIR_OUT is 0, the final flags value will just be the
    XOR'ed value of led_dat->active_low and state.
    
    This value were used to distinguish between HIGH/LOW output initial
    level and call gpio_direction_output() accordingly.
    
    With this new semantic gpio_request_one() will take the flags value
    of 1 as a configuration of input direction (GPIOF_DIR_IN) and will
    call gpio_direction_input() instead of gpio_direction_output().
    
    int gpio_request_one(unsigned gpio, unsigned long flags, const char *label)
    {
    ..
    	if (flags & GPIOF_DIR_IN)
    		err = gpio_direction_input(gpio);
    	else
    		err = gpio_direction_output(gpio,
    				(flags & GPIOF_INIT_HIGH) ? 1 : 0);
    ..
    }
    
    The right semantic is to evaluate led_dat->active_low ^ state and
    set the output initial level explicitly.
    
    Signed-off-by: default avatarJavier Martinez Canillas <javier.martinez@collabora.co.uk>
    Reported-by: default avatarArnaud Patard <arnaud.patard@rtp-net.org>
    Tested-by: default avatarEzequiel Garcia <ezequiel.garcia@free-electrons.com>
    Signed-off-by: default avatarBryan Wu <cooloney@gmail.com>
    2d7c22f6