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

power: Add devm_power_supply_get_by_phandle() helper function

This commit adds a resource-managed version of the
power_supply_get_by_phandle() function.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Sebastian Reichel <sre@kernel.org>

authored by

Hans de Goede and committed by
Sebastian Reichel
fe27e1df a6e6b63e

+44
+39
drivers/power/power_supply_core.c
··· 446 446 return psy; 447 447 } 448 448 EXPORT_SYMBOL_GPL(power_supply_get_by_phandle); 449 + 450 + static void devm_power_supply_put(struct device *dev, void *res) 451 + { 452 + struct power_supply **psy = res; 453 + 454 + power_supply_put(*psy); 455 + } 456 + 457 + /** 458 + * devm_power_supply_get_by_phandle() - Resource managed version of 459 + * power_supply_get_by_phandle() 460 + * @dev: Pointer to device holding phandle property 461 + * @phandle_name: Name of property holding a power supply phandle 462 + * 463 + * Return: On success returns a reference to a power supply with 464 + * matching name equals to value under @property, NULL or ERR_PTR otherwise. 465 + */ 466 + struct power_supply *devm_power_supply_get_by_phandle(struct device *dev, 467 + const char *property) 468 + { 469 + struct power_supply **ptr, *psy; 470 + 471 + if (!dev->of_node) 472 + return ERR_PTR(-ENODEV); 473 + 474 + ptr = devres_alloc(devm_power_supply_put, sizeof(*ptr), GFP_KERNEL); 475 + if (!ptr) 476 + return ERR_PTR(-ENOMEM); 477 + 478 + psy = power_supply_get_by_phandle(dev->of_node, property); 479 + if (IS_ERR_OR_NULL(psy)) { 480 + devres_free(ptr); 481 + } else { 482 + *ptr = psy; 483 + devres_add(dev, ptr); 484 + } 485 + return psy; 486 + } 487 + EXPORT_SYMBOL_GPL(devm_power_supply_get_by_phandle); 449 488 #endif /* CONFIG_OF */ 450 489 451 490 int power_supply_get_property(struct power_supply *psy,
+5
include/linux/power_supply.h
··· 292 292 #ifdef CONFIG_OF 293 293 extern struct power_supply *power_supply_get_by_phandle(struct device_node *np, 294 294 const char *property); 295 + extern struct power_supply *devm_power_supply_get_by_phandle( 296 + struct device *dev, const char *property); 295 297 #else /* !CONFIG_OF */ 296 298 static inline struct power_supply * 297 299 power_supply_get_by_phandle(struct device_node *np, const char *property) 300 + { return NULL; } 301 + static inline struct power_supply * 302 + devm_power_supply_get_by_phandle(struct device *dev, const char *property) 298 303 { return NULL; } 299 304 #endif /* CONFIG_OF */ 300 305 extern void power_supply_changed(struct power_supply *psy);