Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

leds: ns2: Convert to GPIO descriptors

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: Vincent Donnefort <vdonnefort@gmail.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Tested-by: Simon Guinot <simon.guinot@sequanux.org>
Signed-off-by: Pavel Machek <pavel@ucw.cz>

authored by

Linus Walleij and committed by
Pavel Machek
ccbbb117 c7896490

+31 -42
+31 -42
drivers/leds/leds-ns2.c
··· 33 33 struct ns2_led { 34 34 const char *name; 35 35 const char *default_trigger; 36 - unsigned cmd; 37 - unsigned slow; 36 + struct gpio_desc *cmd; 37 + struct gpio_desc *slow; 38 38 int num_modes; 39 39 struct ns2_led_modval *modval; 40 40 }; ··· 53 53 54 54 struct ns2_led_data { 55 55 struct led_classdev cdev; 56 - unsigned int cmd; 57 - unsigned int slow; 56 + struct gpio_desc *cmd; 57 + struct gpio_desc *slow; 58 58 bool can_sleep; 59 59 unsigned char sata; /* True when SATA mode active. */ 60 60 rwlock_t rw_lock; /* Lock GPIOs. */ ··· 70 70 int cmd_level; 71 71 int slow_level; 72 72 73 - cmd_level = gpio_get_value_cansleep(led_dat->cmd); 74 - slow_level = gpio_get_value_cansleep(led_dat->slow); 73 + cmd_level = gpiod_get_value_cansleep(led_dat->cmd); 74 + slow_level = gpiod_get_value_cansleep(led_dat->slow); 75 75 76 76 for (i = 0; i < led_dat->num_modes; i++) { 77 77 if (cmd_level == led_dat->modval[i].cmd_level && ··· 104 104 write_lock_irqsave(&led_dat->rw_lock, flags); 105 105 106 106 if (!led_dat->can_sleep) { 107 - gpio_set_value(led_dat->cmd, 108 - led_dat->modval[i].cmd_level); 109 - gpio_set_value(led_dat->slow, 110 - led_dat->modval[i].slow_level); 107 + gpiod_set_value(led_dat->cmd, 108 + led_dat->modval[i].cmd_level); 109 + gpiod_set_value(led_dat->slow, 110 + led_dat->modval[i].slow_level); 111 111 goto exit_unlock; 112 112 } 113 113 114 - gpio_set_value_cansleep(led_dat->cmd, led_dat->modval[i].cmd_level); 115 - gpio_set_value_cansleep(led_dat->slow, led_dat->modval[i].slow_level); 114 + gpiod_set_value_cansleep(led_dat->cmd, led_dat->modval[i].cmd_level); 115 + gpiod_set_value_cansleep(led_dat->slow, led_dat->modval[i].slow_level); 116 116 117 117 exit_unlock: 118 118 write_unlock_irqrestore(&led_dat->rw_lock, flags); ··· 200 200 int ret; 201 201 enum ns2_led_modes mode; 202 202 203 - ret = devm_gpio_request_one(&pdev->dev, template->cmd, 204 - gpio_get_value_cansleep(template->cmd) ? 205 - GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW, 206 - template->name); 207 - if (ret) { 208 - dev_err(&pdev->dev, "%s: failed to setup command GPIO\n", 209 - template->name); 210 - return ret; 211 - } 212 - 213 - ret = devm_gpio_request_one(&pdev->dev, template->slow, 214 - gpio_get_value_cansleep(template->slow) ? 215 - GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW, 216 - template->name); 217 - if (ret) { 218 - dev_err(&pdev->dev, "%s: failed to setup slow GPIO\n", 219 - template->name); 220 - return ret; 221 - } 222 - 223 203 rwlock_init(&led_dat->rw_lock); 224 204 225 205 led_dat->cdev.name = template->name; ··· 209 229 led_dat->cdev.groups = ns2_led_groups; 210 230 led_dat->cmd = template->cmd; 211 231 led_dat->slow = template->slow; 212 - led_dat->can_sleep = gpio_cansleep(led_dat->cmd) | 213 - gpio_cansleep(led_dat->slow); 232 + led_dat->can_sleep = gpiod_cansleep(led_dat->cmd) | 233 + gpiod_cansleep(led_dat->slow); 214 234 if (led_dat->can_sleep) 215 235 led_dat->cdev.brightness_set_blocking = ns2_led_set_blocking; 216 236 else ··· 265 285 const char *string; 266 286 int i, num_modes; 267 287 struct ns2_led_modval *modval; 288 + struct gpio_desc *gd; 268 289 269 - ret = of_get_named_gpio(child, "cmd-gpio", 0); 270 - if (ret < 0) 271 - goto err_node_put; 272 - led->cmd = ret; 273 - ret = of_get_named_gpio(child, "slow-gpio", 0); 274 - if (ret < 0) 275 - goto err_node_put; 276 - led->slow = ret; 277 290 ret = of_property_read_string(child, "label", &string); 278 291 led->name = (ret == 0) ? string : child->name; 292 + 293 + gd = gpiod_get_from_of_node(child, "cmd-gpio", 0, 294 + GPIOD_ASIS, led->name); 295 + if (IS_ERR(gd)) { 296 + ret = PTR_ERR(gd); 297 + goto err_node_put; 298 + } 299 + led->cmd = gd; 300 + gd = gpiod_get_from_of_node(child, "slow-gpio", 0, 301 + GPIOD_ASIS, led->name); 302 + if (IS_ERR(gd)) { 303 + ret = PTR_ERR(gd); 304 + goto err_node_put; 305 + } 306 + led->slow = gd; 307 + 279 308 ret = of_property_read_string(child, "linux,default-trigger", 280 309 &string); 281 310 if (ret == 0)