Re: [PATCH] leds: bd2802: Convert to use GPIO descriptors

Dan Murphy
2019-12-03T12:43:26Z

Linus

On 12/3/19 3:59 AM, Linus Walleij wrote:
> The Rohm BD2802 have no in-kernel users so we can drop the
> GPIO number from the platform data and require users to
> provide the GPIO line using machine descriptors.
>
> As the descriptors come with inherent polarity inversion
> semantics, we invert the calls to set the GPIO line such
> that 0 means "unasserted" and 1 means "asserted".
>
> Put a note in the driver that machine descriptor tables
> will need to specify that the line is active low.
>
> Cc: Kim Kyuwon <chammoru@gmail.com>
> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
> ---
> drivers/leds/leds-bd2802.c | 27 ++++++++++++++++++---------
> include/linux/leds-bd2802.h | 1 -
> 2 files changed, 18 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/leds/leds-bd2802.c b/drivers/leds/leds-bd2802.c
> index e7ec6bff2b5f..d551f7434897 100644
> --- a/drivers/leds/leds-bd2802.c
> +++ b/drivers/leds/leds-bd2802.c
> @@ -10,7 +10,7 @@
>
> #include <linux/module.h>
> #include <linux/i2c.h>
> -#include <linux/gpio.h>
> +#include <linux/gpio/consumer.h>
> #include <linux/delay.h>
> #include <linux/leds.h>
> #include <linux/leds-bd2802.h>
> @@ -67,6 +67,7 @@ struct led_state {
> struct bd2802_led {
> struct bd2802_led_platform_data *pdata;
> struct i2c_client *client;
> + struct gpio_desc *reset;
> struct rw_semaphore rwsem;
>
> struct led_state led[2];
> @@ -200,7 +201,7 @@ static void bd2802_update_state(struct bd2802_led *led, enum led_ids id,
> return;
>
> if (bd2802_is_all_off(led) && !led->adf_on) {
> - gpio_set_value(led->pdata->reset_gpio, 0);
> + gpiod_set_value(led->reset, 1);
> return;
> }
>
> @@ -226,7 +227,7 @@ static void bd2802_configure(struct bd2802_led *led)
>
> static void bd2802_reset_cancel(struct bd2802_led *led)
> {
> - gpio_set_value(led->pdata->reset_gpio, 1);
> + gpiod_set_value(led->reset, 0);
> udelay(100);
> bd2802_configure(led);
> }
> @@ -420,7 +421,7 @@ static void bd2802_disable_adv_conf(struct bd2802_led *led)
> bd2802_addr_attributes[i]);
>
> if (bd2802_is_all_off(led))
> - gpio_set_value(led->pdata->reset_gpio, 0);
> + gpiod_set_value(led->reset, 1);
>
> led->adf_on = 0;
> }
> @@ -670,8 +671,16 @@ static int bd2802_probe(struct i2c_client *client,
> pdata = led->pdata = dev_get_platdata(&client->dev);
> i2c_set_clientdata(client, led);
>
> - /* Configure RESET GPIO (L: RESET, H: RESET cancel) */
> - gpio_request_one(pdata->reset_gpio, GPIOF_OUT_INIT_HIGH, "RGB_RESETB");
> + /*
> + * Configure RESET GPIO (L: RESET, H: RESET cancel)
> + *
> + * We request the reset GPIO as OUT_LOW which means de-asserted,
> + * board files specifying this GPIO line in a machine descriptor
> + * table should take care to specify GPIO_ACTIVE_LOW for this line.
> + */
> + led->reset = devm_gpiod_get(&client->dev, "rgb-resetb", GPIOD_OUT_LOW);

We usually use "reset" for the property of the reset-gpios.

Unless there are other reset lines for this chip or you are keeping the
name for compatibiilty

Dan