On Tue, Jan 07, 2020 at 03:10:29PM +0100, Linus Walleij wrote: > This converts the NS2 LED driver to use GPIO descriptors. > We take care to request the GPIOs "as is" which is what > the current driver goes to lengths to achieve, then we use > GPIOs throughout. > > As the nodes for each LED does not have any corresponding > device, we need to use the DT-specific accessors to get these > GPIO descriptors from the device tree. > > Cc: Simon Guinot > Cc: Vincent Donnefort > Signed-off-by: Linus Walleij Hi Linus and Pavel, I have tested this patches on a LaCie d2 Network v2 board and the LEDs are still working as expected. Tested-by: Simon Guinot > --- > drivers/leds/leds-ns2.c | 73 +++++++++++++++++------------------------ > 1 file changed, 31 insertions(+), 42 deletions(-) > > diff --git a/drivers/leds/leds-ns2.c b/drivers/leds/leds-ns2.c > index 6d37dda12c39..538ca5755602 100644 > --- a/drivers/leds/leds-ns2.c > +++ b/drivers/leds/leds-ns2.c > @@ -33,8 +33,8 @@ struct ns2_led_modval { > struct ns2_led { > const char *name; > const char *default_trigger; > - unsigned cmd; > - unsigned slow; > + struct gpio_desc *cmd; > + struct gpio_desc *slow; > int num_modes; > struct ns2_led_modval *modval; > }; > @@ -53,8 +53,8 @@ struct ns2_led_platform_data { > > struct ns2_led_data { > struct led_classdev cdev; > - unsigned int cmd; > - unsigned int slow; > + struct gpio_desc *cmd; > + struct gpio_desc *slow; > bool can_sleep; > unsigned char sata; /* True when SATA mode active. */ > rwlock_t rw_lock; /* Lock GPIOs. */ > @@ -70,8 +70,8 @@ static int ns2_led_get_mode(struct ns2_led_data *led_dat, > int cmd_level; > int slow_level; > > - cmd_level = gpio_get_value_cansleep(led_dat->cmd); > - slow_level = gpio_get_value_cansleep(led_dat->slow); > + cmd_level = gpiod_get_value_cansleep(led_dat->cmd); > + slow_level = gpiod_get_value_cansleep(led_dat->slow); > > for (i = 0; i < led_dat->num_modes; i++) { > if (cmd_level == led_dat->modval[i].cmd_level && > @@ -104,15 +104,15 @@ static void ns2_led_set_mode(struct ns2_led_data *led_dat, > write_lock_irqsave(&led_dat->rw_lock, flags); > > if (!led_dat->can_sleep) { > - gpio_set_value(led_dat->cmd, > - led_dat->modval[i].cmd_level); > - gpio_set_value(led_dat->slow, > - led_dat->modval[i].slow_level); > + gpiod_set_value(led_dat->cmd, > + led_dat->modval[i].cmd_level); > + gpiod_set_value(led_dat->slow, > + led_dat->modval[i].slow_level); > goto exit_unlock; > } > > - gpio_set_value_cansleep(led_dat->cmd, led_dat->modval[i].cmd_level); > - gpio_set_value_cansleep(led_dat->slow, led_dat->modval[i].slow_level); > + gpiod_set_value_cansleep(led_dat->cmd, led_dat->modval[i].cmd_level); > + gpiod_set_value_cansleep(led_dat->slow, led_dat->modval[i].slow_level); > > exit_unlock: > write_unlock_irqrestore(&led_dat->rw_lock, flags); > @@ -200,26 +200,6 @@ create_ns2_led(struct platform_device *pdev, struct ns2_led_data *led_dat, > int ret; > enum ns2_led_modes mode; > > - ret = devm_gpio_request_one(&pdev->dev, template->cmd, > - gpio_get_value_cansleep(template->cmd) ? > - GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW, > - template->name); > - if (ret) { > - dev_err(&pdev->dev, "%s: failed to setup command GPIO\n", > - template->name); > - return ret; > - } > - > - ret = devm_gpio_request_one(&pdev->dev, template->slow, > - gpio_get_value_cansleep(template->slow) ? > - GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW, > - template->name); > - if (ret) { > - dev_err(&pdev->dev, "%s: failed to setup slow GPIO\n", > - template->name); > - return ret; > - } > - > rwlock_init(&led_dat->rw_lock); > > led_dat->cdev.name = template->name; > @@ -229,8 +209,8 @@ create_ns2_led(struct platform_device *pdev, struct ns2_led_data *led_dat, > led_dat->cdev.groups = ns2_led_groups; > led_dat->cmd = template->cmd; > led_dat->slow = template->slow; > - led_dat->can_sleep = gpio_cansleep(led_dat->cmd) | > - gpio_cansleep(led_dat->slow); > + led_dat->can_sleep = gpiod_cansleep(led_dat->cmd) | > + gpiod_cansleep(led_dat->slow); > if (led_dat->can_sleep) > led_dat->cdev.brightness_set_blocking = ns2_led_set_blocking; > else > @@ -285,17 +265,26 @@ ns2_leds_get_of_pdata(struct device *dev, struct ns2_led_platform_data *pdata) > const char *string; > int i, num_modes; > struct ns2_led_modval *modval; > + struct gpio_desc *gd; > > - ret = of_get_named_gpio(child, "cmd-gpio", 0); > - if (ret < 0) > - goto err_node_put; > - led->cmd = ret; > - ret = of_get_named_gpio(child, "slow-gpio", 0); > - if (ret < 0) > - goto err_node_put; > - led->slow = ret; > ret = of_property_read_string(child, "label", &string); > led->name = (ret == 0) ? string : child->name; > + > + gd = gpiod_get_from_of_node(child, "cmd-gpio", 0, > + GPIOD_ASIS, led->name); > + if (IS_ERR(gd)) { > + ret = PTR_ERR(gd); > + goto err_node_put; > + } > + led->cmd = gd; > + gd = gpiod_get_from_of_node(child, "slow-gpio", 0, > + GPIOD_ASIS, led->name); > + if (IS_ERR(gd)) { > + ret = PTR_ERR(gd); > + goto err_node_put; > + } > + led->slow = gd; > + > ret = of_property_read_string(child, "linux,default-trigger", > &string); > if (ret == 0) > -- > 2.23.0