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

leds: is31fl319x: Use device_for_each_child_node_scoped() to access child nodes

The iterated nodes are direct children of the device node, and the
`device_for_each_child_node()` macro accounts for child node
availability.

`fwnode_for_each_available_child_node()` is meant to access the child
nodes of an fwnode, and therefore not direct child nodes of the device
node.

In this case, the child nodes are not required outside the loop, and
the scoped version of the macro can be used to remove the repetitive
`goto put` pattern.

Use `device_for_each_child_node_scoped_scoped()` to indicate device's
direct child nodes.

Signed-off-by: Javier Carrasco <javier.carrasco.cruz@gmail.com>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Link: https://lore.kernel.org/r/20240721-device_for_each_child_node-available-v2-4-f33748fd8b2d@gmail.com
Signed-off-by: Lee Jones <lee@kernel.org>

authored by

Javier Carrasco and committed by
Lee Jones
10cc4876 ffbf1fcb

+11 -23
+11 -23
drivers/leds/leds-is31fl319x.c
··· 392 392 393 393 static int is31fl319x_parse_fw(struct device *dev, struct is31fl319x_chip *is31) 394 394 { 395 - struct fwnode_handle *fwnode = dev_fwnode(dev), *child; 395 + struct fwnode_handle *fwnode = dev_fwnode(dev); 396 396 int count; 397 397 int ret; 398 398 ··· 404 404 is31->cdef = device_get_match_data(dev); 405 405 406 406 count = 0; 407 - fwnode_for_each_available_child_node(fwnode, child) 407 + device_for_each_child_node_scoped(dev, child) 408 408 count++; 409 409 410 410 dev_dbg(dev, "probing with %d leds defined in DT\n", count); ··· 414 414 "Number of leds defined must be between 1 and %u\n", 415 415 is31->cdef->num_leds); 416 416 417 - fwnode_for_each_available_child_node(fwnode, child) { 417 + device_for_each_child_node_scoped(dev, child) { 418 418 struct is31fl319x_led *led; 419 419 u32 reg; 420 420 421 421 ret = fwnode_property_read_u32(child, "reg", &reg); 422 - if (ret) { 423 - ret = dev_err_probe(dev, ret, "Failed to read led 'reg' property\n"); 424 - goto put_child_node; 425 - } 422 + if (ret) 423 + return dev_err_probe(dev, ret, "Failed to read led 'reg' property\n"); 426 424 427 - if (reg < 1 || reg > is31->cdef->num_leds) { 428 - ret = dev_err_probe(dev, -EINVAL, "invalid led reg %u\n", reg); 429 - goto put_child_node; 430 - } 425 + if (reg < 1 || reg > is31->cdef->num_leds) 426 + return dev_err_probe(dev, -EINVAL, "invalid led reg %u\n", reg); 431 427 432 428 led = &is31->leds[reg - 1]; 433 429 434 - if (led->configured) { 435 - ret = dev_err_probe(dev, -EINVAL, "led %u is already configured\n", reg); 436 - goto put_child_node; 437 - } 430 + if (led->configured) 431 + return dev_err_probe(dev, -EINVAL, "led %u is already configured\n", reg); 438 432 439 433 ret = is31fl319x_parse_child_fw(dev, child, led, is31); 440 - if (ret) { 441 - ret = dev_err_probe(dev, ret, "led %u DT parsing failed\n", reg); 442 - goto put_child_node; 443 - } 434 + if (ret) 435 + return dev_err_probe(dev, ret, "led %u DT parsing failed\n", reg); 444 436 445 437 led->configured = true; 446 438 } ··· 446 454 } 447 455 448 456 return 0; 449 - 450 - put_child_node: 451 - fwnode_handle_put(child); 452 - return ret; 453 457 } 454 458 455 459 static inline int is31fl3190_microamp_to_cs(struct device *dev, u32 microamp)