mirror of
https://github.com/torvalds/linux.git
synced 2026-09-27 19:42:03 +02:00
ARM: OMAP2+: Fix OF node reference leaks in omap_hwmod
The OF helpers that return device nodes acquire references that must be released by the caller. _init() leaks the "ocp" bus node returned by of_find_node_by_name() on all paths after lookup, and also leaks the child returned by of_get_next_child() when parsing module flags. Route the post-lookup returns through a common cleanup path and release the child after use. omap_hwmod_setup_earlycon_flags() leaks the /chosen node and the UART node resolved from stdout-path. Track them separately and drop both references after use. Fixes:1aa8f0cb19("ARM: OMAP2+: Remove unused legacy code for interconnects") Fixes:4f21224733("ARM: OMAP2+: Check also the first dts child for hwmod flags") Fixes:8dd6666f49("ARM: OMAP2+: omap_hwmod: Add support for earlycon") Signed-off-by: Yuho Choi <dbgh9129@gmail.com> Reviewed-by: Andreas Kemnade <andreas@kemnade.info> Link: https://patch.msgid.link/20260504164711.2854116-1-dbgh9129@gmail.com Signed-off-by: Kevin Hilman (TI) <khilman@baylibre.com>
This commit is contained in:
parent
4a7b197ad2
commit
7610381427
|
|
@ -2331,13 +2331,15 @@ static int __init _init(struct omap_hwmod *oh, void *data)
|
|||
if (r < 0) {
|
||||
WARN(1, "omap_hwmod: %s: doesn't have mpu register target base\n",
|
||||
oh->name);
|
||||
return 0;
|
||||
r = 0;
|
||||
goto out_put_node;
|
||||
}
|
||||
|
||||
r = _init_clocks(oh, np);
|
||||
if (r < 0) {
|
||||
WARN(1, "omap_hwmod: %s: couldn't init clocks\n", oh->name);
|
||||
return -EINVAL;
|
||||
r = -EINVAL;
|
||||
goto out_put_node;
|
||||
}
|
||||
|
||||
if (np) {
|
||||
|
|
@ -2345,13 +2347,19 @@ static int __init _init(struct omap_hwmod *oh, void *data)
|
|||
|
||||
parse_module_flags(oh, np);
|
||||
child = of_get_next_child(np, NULL);
|
||||
if (child)
|
||||
if (child) {
|
||||
parse_module_flags(oh, child);
|
||||
of_node_put(child);
|
||||
}
|
||||
}
|
||||
|
||||
oh->_state = _HWMOD_STATE_INITIALIZED;
|
||||
|
||||
return 0;
|
||||
r = 0;
|
||||
|
||||
out_put_node:
|
||||
of_node_put(bus);
|
||||
return r;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -3608,13 +3616,13 @@ int omap_hwmod_init_module(struct device *dev,
|
|||
#ifdef CONFIG_SERIAL_EARLYCON
|
||||
static void __init omap_hwmod_setup_earlycon_flags(void)
|
||||
{
|
||||
struct device_node *np;
|
||||
struct device_node *np, *chosen;
|
||||
struct omap_hwmod *oh;
|
||||
const char *uart;
|
||||
|
||||
np = of_find_node_by_path("/chosen");
|
||||
if (np) {
|
||||
uart = of_get_property(np, "stdout-path", NULL);
|
||||
chosen = of_find_node_by_path("/chosen");
|
||||
if (chosen) {
|
||||
uart = of_get_property(chosen, "stdout-path", NULL);
|
||||
if (uart) {
|
||||
np = of_find_node_by_path(uart);
|
||||
if (np) {
|
||||
|
|
@ -3629,8 +3637,10 @@ static void __init omap_hwmod_setup_earlycon_flags(void)
|
|||
if (oh)
|
||||
oh->flags |= DEBUG_OMAPUART_FLAGS;
|
||||
}
|
||||
of_node_put(np);
|
||||
}
|
||||
}
|
||||
of_node_put(chosen);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user