Re: [PATCH 2/2] leds: ns2: Convert to GPIO descriptors

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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 <simon.guinot@xxxxxxxxxxxx>
> Cc: Vincent Donnefort <vdonnefort@xxxxxxxxx>
> Signed-off-by: Linus Walleij <linus.walleij@xxxxxxxxxx>

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 <simon.guinot@xxxxxxxxxxxx>

> ---
>  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

Attachment: signature.asc
Description: PGP signature


[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux