Message ID | 20220624105958.4184250-1-windhl@126.com (mailing list archive) |
---|---|
State | Superseded, archived |
Headers | show |
Series | clk/at91: Hold reference returned by of_get_parent() | expand |
Hi, Liang, Patch title should be something like "clk: at91: dt-compat: <you message>" On 24.06.2022 13:59, Liang He wrote: > EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe > > We need to hold the reference returned by of_get_parent() and use > it to call of_node_put() for refcount balance. > > Fixes: 62061d357c7f ("clk: at91: move DT compatibility code to its own file") > Signed-off-by: Liang He <windhl@126.com> > --- > these bugs are found in 5.19rc2 > these bugs are confirmed not fixed by lore.kernel.org > these bugs are compiled tested in 5.19rc2 with at91_dt_defconfig > > drivers/clk/at91/dt-compat.c | 108 +++++++++++++++++++++++++++-------- > 1 file changed, 84 insertions(+), 24 deletions(-) > > diff --git a/drivers/clk/at91/dt-compat.c b/drivers/clk/at91/dt-compat.c > index 8ca8bcacf66d..cc34141864bd 100644 > --- a/drivers/clk/at91/dt-compat.c > +++ b/drivers/clk/at91/dt-compat.c > @@ -33,8 +33,11 @@ static void __init of_sama5d2_clk_audio_pll_frac_setup(struct device_node *np) > const char *name = np->name; > const char *parent_name; > struct regmap *regmap; > + struct device_node *tp; What tp stands for? > > - regmap = syscon_node_to_regmap(of_get_parent(np)); > + tp = of_get_parent(np); > + regmap = syscon_node_to_regmap(tp); > + of_node_put(tp); > if (IS_ERR(regmap)) > return; > > @@ -56,8 +59,11 @@ static void __init of_sama5d2_clk_audio_pll_pad_setup(struct device_node *np) > const char *name = np->name; > const char *parent_name; > struct regmap *regmap; > + struct device_node *tp; > > - regmap = syscon_node_to_regmap(of_get_parent(np)); > + tp = of_get_parent(np); > + regmap = syscon_node_to_regmap(tp); > + of_node_put(tp); > if (IS_ERR(regmap)) > return; > > @@ -79,8 +85,11 @@ static void __init of_sama5d2_clk_audio_pll_pmc_setup(struct device_node *np) > const char *name = np->name; > const char *parent_name; > struct regmap *regmap; > + struct device_node *tp; > > - regmap = syscon_node_to_regmap(of_get_parent(np)); > + tp = of_get_parent(np); > + regmap = syscon_node_to_regmap(tp); > + of_node_put(tp); > if (IS_ERR(regmap)) > return; > > @@ -120,7 +129,7 @@ static void __init of_sama5d2_clk_generated_setup(struct device_node *np) > struct clk_hw *hw; > unsigned int num_parents; > const char *parent_names[GENERATED_SOURCE_MAX]; > - struct device_node *gcknp; > + struct device_node *gcknp, *tp; > struct clk_range range = CLK_RANGE(0, 0); > struct regmap *regmap; > > @@ -134,7 +143,9 @@ static void __init of_sama5d2_clk_generated_setup(struct device_node *np) > if (!num || num > PERIPHERAL_MAX) > return; > > - regmap = syscon_node_to_regmap(of_get_parent(np)); > + tp = of_get_parent(np); > + regmap = syscon_node_to_regmap(tp); > + of_node_put(tp); > if (IS_ERR(regmap)) > return; > > @@ -180,8 +191,11 @@ static void __init of_sama5d4_clk_h32mx_setup(struct device_node *np) > const char *name = np->name; > const char *parent_name; > struct regmap *regmap; > + struct device_node *tp; > > - regmap = syscon_node_to_regmap(of_get_parent(np)); > + tp = of_get_parent(np); > + regmap = syscon_node_to_regmap(tp); > + of_node_put(tp); > if (IS_ERR(regmap)) > return; > > @@ -243,12 +257,15 @@ static void __init of_at91rm9200_clk_main_osc_setup(struct device_node *np) > const char *parent_name; > struct regmap *regmap; > bool bypass; > + struct device_node *tp; > > of_property_read_string(np, "clock-output-names", &name); > bypass = of_property_read_bool(np, "atmel,osc-bypass"); > parent_name = of_clk_get_parent_name(np, 0); > > - regmap = syscon_node_to_regmap(of_get_parent(np)); > + tp = of_get_parent(np); > + regmap = syscon_node_to_regmap(tp); > + of_node_put(tp); > if (IS_ERR(regmap)) > return; > > @@ -268,12 +285,15 @@ static void __init of_at91sam9x5_clk_main_rc_osc_setup(struct device_node *np) > u32 accuracy = 0; > const char *name = np->name; > struct regmap *regmap; > + struct device_node *tp; > > of_property_read_string(np, "clock-output-names", &name); > of_property_read_u32(np, "clock-frequency", &frequency); > of_property_read_u32(np, "clock-accuracy", &accuracy); > > - regmap = syscon_node_to_regmap(of_get_parent(np)); > + tp = of_get_parent(np); > + regmap = syscon_node_to_regmap(tp); > + of_node_put(tp); > if (IS_ERR(regmap)) > return; > > @@ -292,11 +312,14 @@ static void __init of_at91rm9200_clk_main_setup(struct device_node *np) > const char *parent_name; > const char *name = np->name; > struct regmap *regmap; > + struct device_node *tp; > > parent_name = of_clk_get_parent_name(np, 0); > of_property_read_string(np, "clock-output-names", &name); > > - regmap = syscon_node_to_regmap(of_get_parent(np)); > + tp = of_get_parent(np); > + regmap = syscon_node_to_regmap(tp); > + of_node_put(tp); > if (IS_ERR(regmap)) > return; > > @@ -316,13 +339,16 @@ static void __init of_at91sam9x5_clk_main_setup(struct device_node *np) > unsigned int num_parents; > const char *name = np->name; > struct regmap *regmap; > + struct device_node *tp; > > num_parents = of_clk_get_parent_count(np); > if (num_parents == 0 || num_parents > 2) > return; > > of_clk_parent_fill(np, parent_names, num_parents); > - regmap = syscon_node_to_regmap(of_get_parent(np)); > + tp = of_get_parent(np); > + regmap = syscon_node_to_regmap(tp); > + of_node_put(tp); > if (IS_ERR(regmap)) > return; > > @@ -373,6 +399,7 @@ of_at91_clk_master_setup(struct device_node *np, > const char *name = np->name; > struct clk_master_characteristics *characteristics; > struct regmap *regmap; > + struct device_node *tp; > > num_parents = of_clk_get_parent_count(np); > if (num_parents == 0 || num_parents > MASTER_SOURCE_MAX) > @@ -386,7 +413,9 @@ of_at91_clk_master_setup(struct device_node *np, > if (!characteristics) > return; > > - regmap = syscon_node_to_regmap(of_get_parent(np)); > + tp = of_get_parent(np); > + regmap = syscon_node_to_regmap(tp); > + of_node_put(tp); > if (IS_ERR(regmap)) > return; > > @@ -433,6 +462,7 @@ of_at91_clk_periph_setup(struct device_node *np, u8 type) > const char *name; > struct device_node *periphclknp; > struct regmap *regmap; > + struct device_node *tp; > > parent_name = of_clk_get_parent_name(np, 0); > if (!parent_name) > @@ -442,7 +472,9 @@ of_at91_clk_periph_setup(struct device_node *np, u8 type) > if (!num || num > PERIPHERAL_MAX) > return; > > - regmap = syscon_node_to_regmap(of_get_parent(np)); > + tp = of_get_parent(np); > + regmap = syscon_node_to_regmap(tp); > + of_node_put(tp); > if (IS_ERR(regmap)) > return; > > @@ -602,6 +634,7 @@ of_at91_clk_pll_setup(struct device_node *np, > const char *parent_name; > const char *name = np->name; > struct clk_pll_characteristics *characteristics; > + struct device_node *tp; > > if (of_property_read_u32(np, "reg", &id)) > return; > @@ -610,7 +643,9 @@ of_at91_clk_pll_setup(struct device_node *np, > > of_property_read_string(np, "clock-output-names", &name); > > - regmap = syscon_node_to_regmap(of_get_parent(np)); > + tp = of_get_parent(np); > + regmap = syscon_node_to_regmap(tp); > + of_node_put(tp); > if (IS_ERR(regmap)) > return; > > @@ -665,12 +700,15 @@ of_at91sam9x5_clk_plldiv_setup(struct device_node *np) > const char *parent_name; > const char *name = np->name; > struct regmap *regmap; > + struct device_node *tp; > > parent_name = of_clk_get_parent_name(np, 0); > > of_property_read_string(np, "clock-output-names", &name); > > - regmap = syscon_node_to_regmap(of_get_parent(np)); > + tp = of_get_parent(np); > + regmap = syscon_node_to_regmap(tp); > + of_node_put(tp); > if (IS_ERR(regmap)) > return; > > @@ -694,7 +732,7 @@ of_at91_clk_prog_setup(struct device_node *np, > unsigned int num_parents; > const char *parent_names[PROG_SOURCE_MAX]; > const char *name; > - struct device_node *progclknp; > + struct device_node *progclknp, *tp; > struct regmap *regmap; > > num_parents = of_clk_get_parent_count(np); > @@ -707,7 +745,9 @@ of_at91_clk_prog_setup(struct device_node *np, > if (!num || num > (PROG_ID_MAX + 1)) > return; > > - regmap = syscon_node_to_regmap(of_get_parent(np)); > + tp = of_get_parent(np); > + regmap = syscon_node_to_regmap(tp); > + of_node_put(tp); > if (IS_ERR(regmap)) > return; > > @@ -756,13 +796,16 @@ static void __init of_at91sam9260_clk_slow_setup(struct device_node *np) > unsigned int num_parents; > const char *name = np->name; > struct regmap *regmap; > + struct device_node *tp; > > num_parents = of_clk_get_parent_count(np); > if (num_parents != 2) > return; > > of_clk_parent_fill(np, parent_names, num_parents); > - regmap = syscon_node_to_regmap(of_get_parent(np)); > + tp = of_get_parent(np); > + regmap = syscon_node_to_regmap(tp); > + of_node_put(tp); > if (IS_ERR(regmap)) > return; > > @@ -788,6 +831,7 @@ static void __init of_at91sam9x5_clk_smd_setup(struct device_node *np) > const char *parent_names[SMD_SOURCE_MAX]; > const char *name = np->name; > struct regmap *regmap; > + struct device_node *tp; > > num_parents = of_clk_get_parent_count(np); > if (num_parents == 0 || num_parents > SMD_SOURCE_MAX) > @@ -797,7 +841,9 @@ static void __init of_at91sam9x5_clk_smd_setup(struct device_node *np) > > of_property_read_string(np, "clock-output-names", &name); > > - regmap = syscon_node_to_regmap(of_get_parent(np)); > + tp = of_get_parent(np); > + regmap = syscon_node_to_regmap(tp); > + of_node_put(tp); > if (IS_ERR(regmap)) > return; > > @@ -818,7 +864,7 @@ static void __init of_at91rm9200_clk_sys_setup(struct device_node *np) > u32 id; > struct clk_hw *hw; > const char *name; > - struct device_node *sysclknp; > + struct device_node *sysclknp, *tp; > const char *parent_name; > struct regmap *regmap; > > @@ -826,7 +872,9 @@ static void __init of_at91rm9200_clk_sys_setup(struct device_node *np) > if (num > (SYSTEM_MAX_ID + 1)) > return; > > - regmap = syscon_node_to_regmap(of_get_parent(np)); > + tp = of_get_parent(np); > + regmap = syscon_node_to_regmap(tp); > + of_node_put(tp); > if (IS_ERR(regmap)) > return; > > @@ -859,6 +907,7 @@ static void __init of_at91sam9x5_clk_usb_setup(struct device_node *np) > const char *parent_names[USB_SOURCE_MAX]; > const char *name = np->name; > struct regmap *regmap; > + struct device_node *tp; > > num_parents = of_clk_get_parent_count(np); > if (num_parents == 0 || num_parents > USB_SOURCE_MAX) > @@ -868,7 +917,9 @@ static void __init of_at91sam9x5_clk_usb_setup(struct device_node *np) > > of_property_read_string(np, "clock-output-names", &name); > > - regmap = syscon_node_to_regmap(of_get_parent(np)); > + tp = of_get_parent(np); > + regmap = syscon_node_to_regmap(tp); > + of_node_put(tp); > if (IS_ERR(regmap)) > return; > > @@ -888,6 +939,7 @@ static void __init of_at91sam9n12_clk_usb_setup(struct device_node *np) > const char *parent_name; > const char *name = np->name; > struct regmap *regmap; > + struct device_node *tp; > > parent_name = of_clk_get_parent_name(np, 0); > if (!parent_name) > @@ -895,7 +947,9 @@ static void __init of_at91sam9n12_clk_usb_setup(struct device_node *np) > > of_property_read_string(np, "clock-output-names", &name); > > - regmap = syscon_node_to_regmap(of_get_parent(np)); > + tp = of_get_parent(np); > + regmap = syscon_node_to_regmap(tp); > + of_node_put(tp); > if (IS_ERR(regmap)) > return; > > @@ -915,6 +969,7 @@ static void __init of_at91rm9200_clk_usb_setup(struct device_node *np) > const char *name = np->name; > u32 divisors[4] = {0, 0, 0, 0}; > struct regmap *regmap; > + struct device_node *tp; > > parent_name = of_clk_get_parent_name(np, 0); > if (!parent_name) > @@ -926,7 +981,9 @@ static void __init of_at91rm9200_clk_usb_setup(struct device_node *np) > > of_property_read_string(np, "clock-output-names", &name); > > - regmap = syscon_node_to_regmap(of_get_parent(np)); > + tp = of_get_parent(np); > + regmap = syscon_node_to_regmap(tp); > + of_node_put(tp); > if (IS_ERR(regmap)) > return; > hw = at91rm9200_clk_register_usb(regmap, name, parent_name, divisors); > @@ -946,12 +1003,15 @@ static void __init of_at91sam9x5_clk_utmi_setup(struct device_node *np) > const char *parent_name; > const char *name = np->name; > struct regmap *regmap_pmc, *regmap_sfr; > + struct device_node *tp; > > parent_name = of_clk_get_parent_name(np, 0); > > of_property_read_string(np, "clock-output-names", &name); > > - regmap_pmc = syscon_node_to_regmap(of_get_parent(np)); > + tp = of_get_parent(np); > + regmap_pmc = syscon_node_to_regmap(tp); > + of_node_put(tp); > if (IS_ERR(regmap_pmc)) > return; > > -- > 2.25.1 >
At 2022-06-27 17:05:18, Claudiu.Beznea@microchip.com wrote: >Hi, Liang, > >Patch title should be something like "clk: at91: dt-compat: <you message>" > Thanks, I am preparing the version-2 patch code and I will change all similar clk bugs commit title using above format. > >On 24.06.2022 13:59, Liang He wrote: >> EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe >> >> We need to hold the reference returned by of_get_parent() and use >> it to call of_node_put() for refcount balance. >> >> Fixes: 62061d357c7f ("clk: at91: move DT compatibility code to its own file") >> Signed-off-by: Liang He <windhl@126.com> >> --- >> these bugs are found in 5.19rc2 >> these bugs are confirmed not fixed by lore.kernel.org >> these bugs are compiled tested in 5.19rc2 with at91_dt_defconfig >> >> drivers/clk/at91/dt-compat.c | 108 +++++++++++++++++++++++++++-------- >> 1 file changed, 84 insertions(+), 24 deletions(-) >> >> diff --git a/drivers/clk/at91/dt-compat.c b/drivers/clk/at91/dt-compat.c >> index 8ca8bcacf66d..cc34141864bd 100644 >> --- a/drivers/clk/at91/dt-compat.c >> +++ b/drivers/clk/at91/dt-compat.c >> @@ -33,8 +33,11 @@ static void __init of_sama5d2_clk_audio_pll_frac_setup(struct device_node *np) >> const char *name = np->name; >> const char *parent_name; >> struct regmap *regmap; >> + struct device_node *tp; > >What tp stands for? I only want to use it to mean 'tmp_pointer', but Martin advises to use 'parent_np'. I will chose to use 'parent_np' in my version-2 patch, and how do you think about this name? Thanks very much for reviewing my patch code. Liang > >> >> - regmap = syscon_node_to_regmap(of_get_parent(np)); >> + tp = of_get_parent(np); >> + regmap = syscon_node_to_regmap(tp); >> + of_node_put(tp); >> if (IS_ERR(regmap)) >> return; >> >> @@ -56,8 +59,11 @@ static void __init of_sama5d2_clk_audio_pll_pad_setup(struct device_node *np) >> const char *name = np->name; >> const char *parent_name; >> struct regmap *regmap; >> + struct device_node *tp; >> >> - regmap = syscon_node_to_regmap(of_get_parent(np)); >> + tp = of_get_parent(np); >> + regmap = syscon_node_to_regmap(tp); >> + of_node_put(tp); >> if (IS_ERR(regmap)) >> return; >> >> @@ -79,8 +85,11 @@ static void __init of_sama5d2_clk_audio_pll_pmc_setup(struct device_node *np) >> const char *name = np->name; >> const char *parent_name; >> struct regmap *regmap; >> + struct device_node *tp; >> >> - regmap = syscon_node_to_regmap(of_get_parent(np)); >> + tp = of_get_parent(np); >> + regmap = syscon_node_to_regmap(tp); >> + of_node_put(tp); >> if (IS_ERR(regmap)) >> return; >> >> @@ -120,7 +129,7 @@ static void __init of_sama5d2_clk_generated_setup(struct device_node *np) >> struct clk_hw *hw; >> unsigned int num_parents; >> const char *parent_names[GENERATED_SOURCE_MAX]; >> - struct device_node *gcknp; >> + struct device_node *gcknp, *tp; >> struct clk_range range = CLK_RANGE(0, 0); >> struct regmap *regmap; >> >> @@ -134,7 +143,9 @@ static void __init of_sama5d2_clk_generated_setup(struct device_node *np) >> if (!num || num > PERIPHERAL_MAX) >> return; >> >> - regmap = syscon_node_to_regmap(of_get_parent(np)); >> + tp = of_get_parent(np); >> + regmap = syscon_node_to_regmap(tp); >> + of_node_put(tp); >> if (IS_ERR(regmap)) >> return; >> >> @@ -180,8 +191,11 @@ static void __init of_sama5d4_clk_h32mx_setup(struct device_node *np) >> const char *name = np->name; >> const char *parent_name; >> struct regmap *regmap; >> + struct device_node *tp; >> >> - regmap = syscon_node_to_regmap(of_get_parent(np)); >> + tp = of_get_parent(np); >> + regmap = syscon_node_to_regmap(tp); >> + of_node_put(tp); >> if (IS_ERR(regmap)) >> return; >> >> @@ -243,12 +257,15 @@ static void __init of_at91rm9200_clk_main_osc_setup(struct device_node *np) >> const char *parent_name; >> struct regmap *regmap; >> bool bypass; >> + struct device_node *tp; >> >> of_property_read_string(np, "clock-output-names", &name); >> bypass = of_property_read_bool(np, "atmel,osc-bypass"); >> parent_name = of_clk_get_parent_name(np, 0); >> >> - regmap = syscon_node_to_regmap(of_get_parent(np)); >> + tp = of_get_parent(np); >> + regmap = syscon_node_to_regmap(tp); >> + of_node_put(tp); >> if (IS_ERR(regmap)) >> return; >> >> @@ -268,12 +285,15 @@ static void __init of_at91sam9x5_clk_main_rc_osc_setup(struct device_node *np) >> u32 accuracy = 0; >> const char *name = np->name; >> struct regmap *regmap; >> + struct device_node *tp; >> >> of_property_read_string(np, "clock-output-names", &name); >> of_property_read_u32(np, "clock-frequency", &frequency); >> of_property_read_u32(np, "clock-accuracy", &accuracy); >> >> - regmap = syscon_node_to_regmap(of_get_parent(np)); >> + tp = of_get_parent(np); >> + regmap = syscon_node_to_regmap(tp); >> + of_node_put(tp); >> if (IS_ERR(regmap)) >> return; >> >> @@ -292,11 +312,14 @@ static void __init of_at91rm9200_clk_main_setup(struct device_node *np) >> const char *parent_name; >> const char *name = np->name; >> struct regmap *regmap; >> + struct device_node *tp; >> >> parent_name = of_clk_get_parent_name(np, 0); >> of_property_read_string(np, "clock-output-names", &name); >> >> - regmap = syscon_node_to_regmap(of_get_parent(np)); >> + tp = of_get_parent(np); >> + regmap = syscon_node_to_regmap(tp); >> + of_node_put(tp); >> if (IS_ERR(regmap)) >> return; >> >> @@ -316,13 +339,16 @@ static void __init of_at91sam9x5_clk_main_setup(struct device_node *np) >> unsigned int num_parents; >> const char *name = np->name; >> struct regmap *regmap; >> + struct device_node *tp; >> >> num_parents = of_clk_get_parent_count(np); >> if (num_parents == 0 || num_parents > 2) >> return; >> >> of_clk_parent_fill(np, parent_names, num_parents); >> - regmap = syscon_node_to_regmap(of_get_parent(np)); >> + tp = of_get_parent(np); >> + regmap = syscon_node_to_regmap(tp); >> + of_node_put(tp); >> if (IS_ERR(regmap)) >> return; >> >> @@ -373,6 +399,7 @@ of_at91_clk_master_setup(struct device_node *np, >> const char *name = np->name; >> struct clk_master_characteristics *characteristics; >> struct regmap *regmap; >> + struct device_node *tp; >> >> num_parents = of_clk_get_parent_count(np); >> if (num_parents == 0 || num_parents > MASTER_SOURCE_MAX) >> @@ -386,7 +413,9 @@ of_at91_clk_master_setup(struct device_node *np, >> if (!characteristics) >> return; >> >> - regmap = syscon_node_to_regmap(of_get_parent(np)); >> + tp = of_get_parent(np); >> + regmap = syscon_node_to_regmap(tp); >> + of_node_put(tp); >> if (IS_ERR(regmap)) >> return; >> >> @@ -433,6 +462,7 @@ of_at91_clk_periph_setup(struct device_node *np, u8 type) >> const char *name; >> struct device_node *periphclknp; >> struct regmap *regmap; >> + struct device_node *tp; >> >> parent_name = of_clk_get_parent_name(np, 0); >> if (!parent_name) >> @@ -442,7 +472,9 @@ of_at91_clk_periph_setup(struct device_node *np, u8 type) >> if (!num || num > PERIPHERAL_MAX) >> return; >> >> - regmap = syscon_node_to_regmap(of_get_parent(np)); >> + tp = of_get_parent(np); >> + regmap = syscon_node_to_regmap(tp); >> + of_node_put(tp); >> if (IS_ERR(regmap)) >> return; >> >> @@ -602,6 +634,7 @@ of_at91_clk_pll_setup(struct device_node *np, >> const char *parent_name; >> const char *name = np->name; >> struct clk_pll_characteristics *characteristics; >> + struct device_node *tp; >> >> if (of_property_read_u32(np, "reg", &id)) >> return; >> @@ -610,7 +643,9 @@ of_at91_clk_pll_setup(struct device_node *np, >> >> of_property_read_string(np, "clock-output-names", &name); >> >> - regmap = syscon_node_to_regmap(of_get_parent(np)); >> + tp = of_get_parent(np); >> + regmap = syscon_node_to_regmap(tp); >> + of_node_put(tp); >> if (IS_ERR(regmap)) >> return; >> >> @@ -665,12 +700,15 @@ of_at91sam9x5_clk_plldiv_setup(struct device_node *np) >> const char *parent_name; >> const char *name = np->name; >> struct regmap *regmap; >> + struct device_node *tp; >> >> parent_name = of_clk_get_parent_name(np, 0); >> >> of_property_read_string(np, "clock-output-names", &name); >> >> - regmap = syscon_node_to_regmap(of_get_parent(np)); >> + tp = of_get_parent(np); >> + regmap = syscon_node_to_regmap(tp); >> + of_node_put(tp); >> if (IS_ERR(regmap)) >> return; >> >> @@ -694,7 +732,7 @@ of_at91_clk_prog_setup(struct device_node *np, >> unsigned int num_parents; >> const char *parent_names[PROG_SOURCE_MAX]; >> const char *name; >> - struct device_node *progclknp; >> + struct device_node *progclknp, *tp; >> struct regmap *regmap; >> >> num_parents = of_clk_get_parent_count(np); >> @@ -707,7 +745,9 @@ of_at91_clk_prog_setup(struct device_node *np, >> if (!num || num > (PROG_ID_MAX + 1)) >> return; >> >> - regmap = syscon_node_to_regmap(of_get_parent(np)); >> + tp = of_get_parent(np); >> + regmap = syscon_node_to_regmap(tp); >> + of_node_put(tp); >> if (IS_ERR(regmap)) >> return; >> >> @@ -756,13 +796,16 @@ static void __init of_at91sam9260_clk_slow_setup(struct device_node *np) >> unsigned int num_parents; >> const char *name = np->name; >> struct regmap *regmap; >> + struct device_node *tp; >> >> num_parents = of_clk_get_parent_count(np); >> if (num_parents != 2) >> return; >> >> of_clk_parent_fill(np, parent_names, num_parents); >> - regmap = syscon_node_to_regmap(of_get_parent(np)); >> + tp = of_get_parent(np); >> + regmap = syscon_node_to_regmap(tp); >> + of_node_put(tp); >> if (IS_ERR(regmap)) >> return; >> >> @@ -788,6 +831,7 @@ static void __init of_at91sam9x5_clk_smd_setup(struct device_node *np) >> const char *parent_names[SMD_SOURCE_MAX]; >> const char *name = np->name; >> struct regmap *regmap; >> + struct device_node *tp; >> >> num_parents = of_clk_get_parent_count(np); >> if (num_parents == 0 || num_parents > SMD_SOURCE_MAX) >> @@ -797,7 +841,9 @@ static void __init of_at91sam9x5_clk_smd_setup(struct device_node *np) >> >> of_property_read_string(np, "clock-output-names", &name); >> >> - regmap = syscon_node_to_regmap(of_get_parent(np)); >> + tp = of_get_parent(np); >> + regmap = syscon_node_to_regmap(tp); >> + of_node_put(tp); >> if (IS_ERR(regmap)) >> return; >> >> @@ -818,7 +864,7 @@ static void __init of_at91rm9200_clk_sys_setup(struct device_node *np) >> u32 id; >> struct clk_hw *hw; >> const char *name; >> - struct device_node *sysclknp; >> + struct device_node *sysclknp, *tp; >> const char *parent_name; >> struct regmap *regmap; >> >> @@ -826,7 +872,9 @@ static void __init of_at91rm9200_clk_sys_setup(struct device_node *np) >> if (num > (SYSTEM_MAX_ID + 1)) >> return; >> >> - regmap = syscon_node_to_regmap(of_get_parent(np)); >> + tp = of_get_parent(np); >> + regmap = syscon_node_to_regmap(tp); >> + of_node_put(tp); >> if (IS_ERR(regmap)) >> return; >> >> @@ -859,6 +907,7 @@ static void __init of_at91sam9x5_clk_usb_setup(struct device_node *np) >> const char *parent_names[USB_SOURCE_MAX]; >> const char *name = np->name; >> struct regmap *regmap; >> + struct device_node *tp; >> >> num_parents = of_clk_get_parent_count(np); >> if (num_parents == 0 || num_parents > USB_SOURCE_MAX) >> @@ -868,7 +917,9 @@ static void __init of_at91sam9x5_clk_usb_setup(struct device_node *np) >> >> of_property_read_string(np, "clock-output-names", &name); >> >> - regmap = syscon_node_to_regmap(of_get_parent(np)); >> + tp = of_get_parent(np); >> + regmap = syscon_node_to_regmap(tp); >> + of_node_put(tp); >> if (IS_ERR(regmap)) >> return; >> >> @@ -888,6 +939,7 @@ static void __init of_at91sam9n12_clk_usb_setup(struct device_node *np) >> const char *parent_name; >> const char *name = np->name; >> struct regmap *regmap; >> + struct device_node *tp; >> >> parent_name = of_clk_get_parent_name(np, 0); >> if (!parent_name) >> @@ -895,7 +947,9 @@ static void __init of_at91sam9n12_clk_usb_setup(struct device_node *np) >> >> of_property_read_string(np, "clock-output-names", &name); >> >> - regmap = syscon_node_to_regmap(of_get_parent(np)); >> + tp = of_get_parent(np); >> + regmap = syscon_node_to_regmap(tp); >> + of_node_put(tp); >> if (IS_ERR(regmap)) >> return; >> >> @@ -915,6 +969,7 @@ static void __init of_at91rm9200_clk_usb_setup(struct device_node *np) >> const char *name = np->name; >> u32 divisors[4] = {0, 0, 0, 0}; >> struct regmap *regmap; >> + struct device_node *tp; >> >> parent_name = of_clk_get_parent_name(np, 0); >> if (!parent_name) >> @@ -926,7 +981,9 @@ static void __init of_at91rm9200_clk_usb_setup(struct device_node *np) >> >> of_property_read_string(np, "clock-output-names", &name); >> >> - regmap = syscon_node_to_regmap(of_get_parent(np)); >> + tp = of_get_parent(np); >> + regmap = syscon_node_to_regmap(tp); >> + of_node_put(tp); >> if (IS_ERR(regmap)) >> return; >> hw = at91rm9200_clk_register_usb(regmap, name, parent_name, divisors); >> @@ -946,12 +1003,15 @@ static void __init of_at91sam9x5_clk_utmi_setup(struct device_node *np) >> const char *parent_name; >> const char *name = np->name; >> struct regmap *regmap_pmc, *regmap_sfr; >> + struct device_node *tp; >> >> parent_name = of_clk_get_parent_name(np, 0); >> >> of_property_read_string(np, "clock-output-names", &name); >> >> - regmap_pmc = syscon_node_to_regmap(of_get_parent(np)); >> + tp = of_get_parent(np); >> + regmap_pmc = syscon_node_to_regmap(tp); >> + of_node_put(tp); >> if (IS_ERR(regmap_pmc)) >> return; >> >> -- >> 2.25.1 >> >
On 27.06.2022 13:32, Liang He wrote: > EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe > > At 2022-06-27 17:05:18, Claudiu.Beznea@microchip.com wrote: >> Hi, Liang, >> >> Patch title should be something like "clk: at91: dt-compat: <you message>" >> > > Thanks, I am preparing the version-2 patch code and I will change all similar clk bugs commit title > using above format. > >> >> On 24.06.2022 13:59, Liang He wrote: >>> EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe >>> >>> We need to hold the reference returned by of_get_parent() and use >>> it to call of_node_put() for refcount balance. >>> >>> Fixes: 62061d357c7f ("clk: at91: move DT compatibility code to its own file") >>> Signed-off-by: Liang He <windhl@126.com> >>> --- >>> these bugs are found in 5.19rc2 >>> these bugs are confirmed not fixed by lore.kernel.org >>> these bugs are compiled tested in 5.19rc2 with at91_dt_defconfig >>> >>> drivers/clk/at91/dt-compat.c | 108 +++++++++++++++++++++++++++-------- >>> 1 file changed, 84 insertions(+), 24 deletions(-) >>> >>> diff --git a/drivers/clk/at91/dt-compat.c b/drivers/clk/at91/dt-compat.c >>> index 8ca8bcacf66d..cc34141864bd 100644 >>> --- a/drivers/clk/at91/dt-compat.c >>> +++ b/drivers/clk/at91/dt-compat.c >>> @@ -33,8 +33,11 @@ static void __init of_sama5d2_clk_audio_pll_frac_setup(struct device_node *np) >>> const char *name = np->name; >>> const char *parent_name; >>> struct regmap *regmap; >>> + struct device_node *tp; >> >> What tp stands for? > > I only want to use it to mean 'tmp_pointer', but Martin advises to > use 'parent_np'. > > I will chose to use 'parent_np' in my version-2 patch, and how do you > think about this name? parent_np is good. Thank you, Claudiu Beznea > > Thanks very much for reviewing my patch code. > > Liang >> >>> >>> - regmap = syscon_node_to_regmap(of_get_parent(np)); >>> + tp = of_get_parent(np); >>> + regmap = syscon_node_to_regmap(tp); >>> + of_node_put(tp); >>> if (IS_ERR(regmap)) >>> return; >>> >>> @@ -56,8 +59,11 @@ static void __init of_sama5d2_clk_audio_pll_pad_setup(struct device_node *np) >>> const char *name = np->name; >>> const char *parent_name; >>> struct regmap *regmap; >>> + struct device_node *tp; >>> >>> - regmap = syscon_node_to_regmap(of_get_parent(np)); >>> + tp = of_get_parent(np); >>> + regmap = syscon_node_to_regmap(tp); >>> + of_node_put(tp); >>> if (IS_ERR(regmap)) >>> return; >>> >>> @@ -79,8 +85,11 @@ static void __init of_sama5d2_clk_audio_pll_pmc_setup(struct device_node *np) >>> const char *name = np->name; >>> const char *parent_name; >>> struct regmap *regmap; >>> + struct device_node *tp; >>> >>> - regmap = syscon_node_to_regmap(of_get_parent(np)); >>> + tp = of_get_parent(np); >>> + regmap = syscon_node_to_regmap(tp); >>> + of_node_put(tp); >>> if (IS_ERR(regmap)) >>> return; >>> >>> @@ -120,7 +129,7 @@ static void __init of_sama5d2_clk_generated_setup(struct device_node *np) >>> struct clk_hw *hw; >>> unsigned int num_parents; >>> const char *parent_names[GENERATED_SOURCE_MAX]; >>> - struct device_node *gcknp; >>> + struct device_node *gcknp, *tp; >>> struct clk_range range = CLK_RANGE(0, 0); >>> struct regmap *regmap; >>> >>> @@ -134,7 +143,9 @@ static void __init of_sama5d2_clk_generated_setup(struct device_node *np) >>> if (!num || num > PERIPHERAL_MAX) >>> return; >>> >>> - regmap = syscon_node_to_regmap(of_get_parent(np)); >>> + tp = of_get_parent(np); >>> + regmap = syscon_node_to_regmap(tp); >>> + of_node_put(tp); >>> if (IS_ERR(regmap)) >>> return; >>> >>> @@ -180,8 +191,11 @@ static void __init of_sama5d4_clk_h32mx_setup(struct device_node *np) >>> const char *name = np->name; >>> const char *parent_name; >>> struct regmap *regmap; >>> + struct device_node *tp; >>> >>> - regmap = syscon_node_to_regmap(of_get_parent(np)); >>> + tp = of_get_parent(np); >>> + regmap = syscon_node_to_regmap(tp); >>> + of_node_put(tp); >>> if (IS_ERR(regmap)) >>> return; >>> >>> @@ -243,12 +257,15 @@ static void __init of_at91rm9200_clk_main_osc_setup(struct device_node *np) >>> const char *parent_name; >>> struct regmap *regmap; >>> bool bypass; >>> + struct device_node *tp; >>> >>> of_property_read_string(np, "clock-output-names", &name); >>> bypass = of_property_read_bool(np, "atmel,osc-bypass"); >>> parent_name = of_clk_get_parent_name(np, 0); >>> >>> - regmap = syscon_node_to_regmap(of_get_parent(np)); >>> + tp = of_get_parent(np); >>> + regmap = syscon_node_to_regmap(tp); >>> + of_node_put(tp); >>> if (IS_ERR(regmap)) >>> return; >>> >>> @@ -268,12 +285,15 @@ static void __init of_at91sam9x5_clk_main_rc_osc_setup(struct device_node *np) >>> u32 accuracy = 0; >>> const char *name = np->name; >>> struct regmap *regmap; >>> + struct device_node *tp; >>> >>> of_property_read_string(np, "clock-output-names", &name); >>> of_property_read_u32(np, "clock-frequency", &frequency); >>> of_property_read_u32(np, "clock-accuracy", &accuracy); >>> >>> - regmap = syscon_node_to_regmap(of_get_parent(np)); >>> + tp = of_get_parent(np); >>> + regmap = syscon_node_to_regmap(tp); >>> + of_node_put(tp); >>> if (IS_ERR(regmap)) >>> return; >>> >>> @@ -292,11 +312,14 @@ static void __init of_at91rm9200_clk_main_setup(struct device_node *np) >>> const char *parent_name; >>> const char *name = np->name; >>> struct regmap *regmap; >>> + struct device_node *tp; >>> >>> parent_name = of_clk_get_parent_name(np, 0); >>> of_property_read_string(np, "clock-output-names", &name); >>> >>> - regmap = syscon_node_to_regmap(of_get_parent(np)); >>> + tp = of_get_parent(np); >>> + regmap = syscon_node_to_regmap(tp); >>> + of_node_put(tp); >>> if (IS_ERR(regmap)) >>> return; >>> >>> @@ -316,13 +339,16 @@ static void __init of_at91sam9x5_clk_main_setup(struct device_node *np) >>> unsigned int num_parents; >>> const char *name = np->name; >>> struct regmap *regmap; >>> + struct device_node *tp; >>> >>> num_parents = of_clk_get_parent_count(np); >>> if (num_parents == 0 || num_parents > 2) >>> return; >>> >>> of_clk_parent_fill(np, parent_names, num_parents); >>> - regmap = syscon_node_to_regmap(of_get_parent(np)); >>> + tp = of_get_parent(np); >>> + regmap = syscon_node_to_regmap(tp); >>> + of_node_put(tp); >>> if (IS_ERR(regmap)) >>> return; >>> >>> @@ -373,6 +399,7 @@ of_at91_clk_master_setup(struct device_node *np, >>> const char *name = np->name; >>> struct clk_master_characteristics *characteristics; >>> struct regmap *regmap; >>> + struct device_node *tp; >>> >>> num_parents = of_clk_get_parent_count(np); >>> if (num_parents == 0 || num_parents > MASTER_SOURCE_MAX) >>> @@ -386,7 +413,9 @@ of_at91_clk_master_setup(struct device_node *np, >>> if (!characteristics) >>> return; >>> >>> - regmap = syscon_node_to_regmap(of_get_parent(np)); >>> + tp = of_get_parent(np); >>> + regmap = syscon_node_to_regmap(tp); >>> + of_node_put(tp); >>> if (IS_ERR(regmap)) >>> return; >>> >>> @@ -433,6 +462,7 @@ of_at91_clk_periph_setup(struct device_node *np, u8 type) >>> const char *name; >>> struct device_node *periphclknp; >>> struct regmap *regmap; >>> + struct device_node *tp; >>> >>> parent_name = of_clk_get_parent_name(np, 0); >>> if (!parent_name) >>> @@ -442,7 +472,9 @@ of_at91_clk_periph_setup(struct device_node *np, u8 type) >>> if (!num || num > PERIPHERAL_MAX) >>> return; >>> >>> - regmap = syscon_node_to_regmap(of_get_parent(np)); >>> + tp = of_get_parent(np); >>> + regmap = syscon_node_to_regmap(tp); >>> + of_node_put(tp); >>> if (IS_ERR(regmap)) >>> return; >>> >>> @@ -602,6 +634,7 @@ of_at91_clk_pll_setup(struct device_node *np, >>> const char *parent_name; >>> const char *name = np->name; >>> struct clk_pll_characteristics *characteristics; >>> + struct device_node *tp; >>> >>> if (of_property_read_u32(np, "reg", &id)) >>> return; >>> @@ -610,7 +643,9 @@ of_at91_clk_pll_setup(struct device_node *np, >>> >>> of_property_read_string(np, "clock-output-names", &name); >>> >>> - regmap = syscon_node_to_regmap(of_get_parent(np)); >>> + tp = of_get_parent(np); >>> + regmap = syscon_node_to_regmap(tp); >>> + of_node_put(tp); >>> if (IS_ERR(regmap)) >>> return; >>> >>> @@ -665,12 +700,15 @@ of_at91sam9x5_clk_plldiv_setup(struct device_node *np) >>> const char *parent_name; >>> const char *name = np->name; >>> struct regmap *regmap; >>> + struct device_node *tp; >>> >>> parent_name = of_clk_get_parent_name(np, 0); >>> >>> of_property_read_string(np, "clock-output-names", &name); >>> >>> - regmap = syscon_node_to_regmap(of_get_parent(np)); >>> + tp = of_get_parent(np); >>> + regmap = syscon_node_to_regmap(tp); >>> + of_node_put(tp); >>> if (IS_ERR(regmap)) >>> return; >>> >>> @@ -694,7 +732,7 @@ of_at91_clk_prog_setup(struct device_node *np, >>> unsigned int num_parents; >>> const char *parent_names[PROG_SOURCE_MAX]; >>> const char *name; >>> - struct device_node *progclknp; >>> + struct device_node *progclknp, *tp; >>> struct regmap *regmap; >>> >>> num_parents = of_clk_get_parent_count(np); >>> @@ -707,7 +745,9 @@ of_at91_clk_prog_setup(struct device_node *np, >>> if (!num || num > (PROG_ID_MAX + 1)) >>> return; >>> >>> - regmap = syscon_node_to_regmap(of_get_parent(np)); >>> + tp = of_get_parent(np); >>> + regmap = syscon_node_to_regmap(tp); >>> + of_node_put(tp); >>> if (IS_ERR(regmap)) >>> return; >>> >>> @@ -756,13 +796,16 @@ static void __init of_at91sam9260_clk_slow_setup(struct device_node *np) >>> unsigned int num_parents; >>> const char *name = np->name; >>> struct regmap *regmap; >>> + struct device_node *tp; >>> >>> num_parents = of_clk_get_parent_count(np); >>> if (num_parents != 2) >>> return; >>> >>> of_clk_parent_fill(np, parent_names, num_parents); >>> - regmap = syscon_node_to_regmap(of_get_parent(np)); >>> + tp = of_get_parent(np); >>> + regmap = syscon_node_to_regmap(tp); >>> + of_node_put(tp); >>> if (IS_ERR(regmap)) >>> return; >>> >>> @@ -788,6 +831,7 @@ static void __init of_at91sam9x5_clk_smd_setup(struct device_node *np) >>> const char *parent_names[SMD_SOURCE_MAX]; >>> const char *name = np->name; >>> struct regmap *regmap; >>> + struct device_node *tp; >>> >>> num_parents = of_clk_get_parent_count(np); >>> if (num_parents == 0 || num_parents > SMD_SOURCE_MAX) >>> @@ -797,7 +841,9 @@ static void __init of_at91sam9x5_clk_smd_setup(struct device_node *np) >>> >>> of_property_read_string(np, "clock-output-names", &name); >>> >>> - regmap = syscon_node_to_regmap(of_get_parent(np)); >>> + tp = of_get_parent(np); >>> + regmap = syscon_node_to_regmap(tp); >>> + of_node_put(tp); >>> if (IS_ERR(regmap)) >>> return; >>> >>> @@ -818,7 +864,7 @@ static void __init of_at91rm9200_clk_sys_setup(struct device_node *np) >>> u32 id; >>> struct clk_hw *hw; >>> const char *name; >>> - struct device_node *sysclknp; >>> + struct device_node *sysclknp, *tp; >>> const char *parent_name; >>> struct regmap *regmap; >>> >>> @@ -826,7 +872,9 @@ static void __init of_at91rm9200_clk_sys_setup(struct device_node *np) >>> if (num > (SYSTEM_MAX_ID + 1)) >>> return; >>> >>> - regmap = syscon_node_to_regmap(of_get_parent(np)); >>> + tp = of_get_parent(np); >>> + regmap = syscon_node_to_regmap(tp); >>> + of_node_put(tp); >>> if (IS_ERR(regmap)) >>> return; >>> >>> @@ -859,6 +907,7 @@ static void __init of_at91sam9x5_clk_usb_setup(struct device_node *np) >>> const char *parent_names[USB_SOURCE_MAX]; >>> const char *name = np->name; >>> struct regmap *regmap; >>> + struct device_node *tp; >>> >>> num_parents = of_clk_get_parent_count(np); >>> if (num_parents == 0 || num_parents > USB_SOURCE_MAX) >>> @@ -868,7 +917,9 @@ static void __init of_at91sam9x5_clk_usb_setup(struct device_node *np) >>> >>> of_property_read_string(np, "clock-output-names", &name); >>> >>> - regmap = syscon_node_to_regmap(of_get_parent(np)); >>> + tp = of_get_parent(np); >>> + regmap = syscon_node_to_regmap(tp); >>> + of_node_put(tp); >>> if (IS_ERR(regmap)) >>> return; >>> >>> @@ -888,6 +939,7 @@ static void __init of_at91sam9n12_clk_usb_setup(struct device_node *np) >>> const char *parent_name; >>> const char *name = np->name; >>> struct regmap *regmap; >>> + struct device_node *tp; >>> >>> parent_name = of_clk_get_parent_name(np, 0); >>> if (!parent_name) >>> @@ -895,7 +947,9 @@ static void __init of_at91sam9n12_clk_usb_setup(struct device_node *np) >>> >>> of_property_read_string(np, "clock-output-names", &name); >>> >>> - regmap = syscon_node_to_regmap(of_get_parent(np)); >>> + tp = of_get_parent(np); >>> + regmap = syscon_node_to_regmap(tp); >>> + of_node_put(tp); >>> if (IS_ERR(regmap)) >>> return; >>> >>> @@ -915,6 +969,7 @@ static void __init of_at91rm9200_clk_usb_setup(struct device_node *np) >>> const char *name = np->name; >>> u32 divisors[4] = {0, 0, 0, 0}; >>> struct regmap *regmap; >>> + struct device_node *tp; >>> >>> parent_name = of_clk_get_parent_name(np, 0); >>> if (!parent_name) >>> @@ -926,7 +981,9 @@ static void __init of_at91rm9200_clk_usb_setup(struct device_node *np) >>> >>> of_property_read_string(np, "clock-output-names", &name); >>> >>> - regmap = syscon_node_to_regmap(of_get_parent(np)); >>> + tp = of_get_parent(np); >>> + regmap = syscon_node_to_regmap(tp); >>> + of_node_put(tp); >>> if (IS_ERR(regmap)) >>> return; >>> hw = at91rm9200_clk_register_usb(regmap, name, parent_name, divisors); >>> @@ -946,12 +1003,15 @@ static void __init of_at91sam9x5_clk_utmi_setup(struct device_node *np) >>> const char *parent_name; >>> const char *name = np->name; >>> struct regmap *regmap_pmc, *regmap_sfr; >>> + struct device_node *tp; >>> >>> parent_name = of_clk_get_parent_name(np, 0); >>> >>> of_property_read_string(np, "clock-output-names", &name); >>> >>> - regmap_pmc = syscon_node_to_regmap(of_get_parent(np)); >>> + tp = of_get_parent(np); >>> + regmap_pmc = syscon_node_to_regmap(tp); >>> + of_node_put(tp); >>> if (IS_ERR(regmap_pmc)) >>> return; >>> >>> -- >>> 2.25.1 >>> >>
diff --git a/drivers/clk/at91/dt-compat.c b/drivers/clk/at91/dt-compat.c index 8ca8bcacf66d..cc34141864bd 100644 --- a/drivers/clk/at91/dt-compat.c +++ b/drivers/clk/at91/dt-compat.c @@ -33,8 +33,11 @@ static void __init of_sama5d2_clk_audio_pll_frac_setup(struct device_node *np) const char *name = np->name; const char *parent_name; struct regmap *regmap; + struct device_node *tp; - regmap = syscon_node_to_regmap(of_get_parent(np)); + tp = of_get_parent(np); + regmap = syscon_node_to_regmap(tp); + of_node_put(tp); if (IS_ERR(regmap)) return; @@ -56,8 +59,11 @@ static void __init of_sama5d2_clk_audio_pll_pad_setup(struct device_node *np) const char *name = np->name; const char *parent_name; struct regmap *regmap; + struct device_node *tp; - regmap = syscon_node_to_regmap(of_get_parent(np)); + tp = of_get_parent(np); + regmap = syscon_node_to_regmap(tp); + of_node_put(tp); if (IS_ERR(regmap)) return; @@ -79,8 +85,11 @@ static void __init of_sama5d2_clk_audio_pll_pmc_setup(struct device_node *np) const char *name = np->name; const char *parent_name; struct regmap *regmap; + struct device_node *tp; - regmap = syscon_node_to_regmap(of_get_parent(np)); + tp = of_get_parent(np); + regmap = syscon_node_to_regmap(tp); + of_node_put(tp); if (IS_ERR(regmap)) return; @@ -120,7 +129,7 @@ static void __init of_sama5d2_clk_generated_setup(struct device_node *np) struct clk_hw *hw; unsigned int num_parents; const char *parent_names[GENERATED_SOURCE_MAX]; - struct device_node *gcknp; + struct device_node *gcknp, *tp; struct clk_range range = CLK_RANGE(0, 0); struct regmap *regmap; @@ -134,7 +143,9 @@ static void __init of_sama5d2_clk_generated_setup(struct device_node *np) if (!num || num > PERIPHERAL_MAX) return; - regmap = syscon_node_to_regmap(of_get_parent(np)); + tp = of_get_parent(np); + regmap = syscon_node_to_regmap(tp); + of_node_put(tp); if (IS_ERR(regmap)) return; @@ -180,8 +191,11 @@ static void __init of_sama5d4_clk_h32mx_setup(struct device_node *np) const char *name = np->name; const char *parent_name; struct regmap *regmap; + struct device_node *tp; - regmap = syscon_node_to_regmap(of_get_parent(np)); + tp = of_get_parent(np); + regmap = syscon_node_to_regmap(tp); + of_node_put(tp); if (IS_ERR(regmap)) return; @@ -243,12 +257,15 @@ static void __init of_at91rm9200_clk_main_osc_setup(struct device_node *np) const char *parent_name; struct regmap *regmap; bool bypass; + struct device_node *tp; of_property_read_string(np, "clock-output-names", &name); bypass = of_property_read_bool(np, "atmel,osc-bypass"); parent_name = of_clk_get_parent_name(np, 0); - regmap = syscon_node_to_regmap(of_get_parent(np)); + tp = of_get_parent(np); + regmap = syscon_node_to_regmap(tp); + of_node_put(tp); if (IS_ERR(regmap)) return; @@ -268,12 +285,15 @@ static void __init of_at91sam9x5_clk_main_rc_osc_setup(struct device_node *np) u32 accuracy = 0; const char *name = np->name; struct regmap *regmap; + struct device_node *tp; of_property_read_string(np, "clock-output-names", &name); of_property_read_u32(np, "clock-frequency", &frequency); of_property_read_u32(np, "clock-accuracy", &accuracy); - regmap = syscon_node_to_regmap(of_get_parent(np)); + tp = of_get_parent(np); + regmap = syscon_node_to_regmap(tp); + of_node_put(tp); if (IS_ERR(regmap)) return; @@ -292,11 +312,14 @@ static void __init of_at91rm9200_clk_main_setup(struct device_node *np) const char *parent_name; const char *name = np->name; struct regmap *regmap; + struct device_node *tp; parent_name = of_clk_get_parent_name(np, 0); of_property_read_string(np, "clock-output-names", &name); - regmap = syscon_node_to_regmap(of_get_parent(np)); + tp = of_get_parent(np); + regmap = syscon_node_to_regmap(tp); + of_node_put(tp); if (IS_ERR(regmap)) return; @@ -316,13 +339,16 @@ static void __init of_at91sam9x5_clk_main_setup(struct device_node *np) unsigned int num_parents; const char *name = np->name; struct regmap *regmap; + struct device_node *tp; num_parents = of_clk_get_parent_count(np); if (num_parents == 0 || num_parents > 2) return; of_clk_parent_fill(np, parent_names, num_parents); - regmap = syscon_node_to_regmap(of_get_parent(np)); + tp = of_get_parent(np); + regmap = syscon_node_to_regmap(tp); + of_node_put(tp); if (IS_ERR(regmap)) return; @@ -373,6 +399,7 @@ of_at91_clk_master_setup(struct device_node *np, const char *name = np->name; struct clk_master_characteristics *characteristics; struct regmap *regmap; + struct device_node *tp; num_parents = of_clk_get_parent_count(np); if (num_parents == 0 || num_parents > MASTER_SOURCE_MAX) @@ -386,7 +413,9 @@ of_at91_clk_master_setup(struct device_node *np, if (!characteristics) return; - regmap = syscon_node_to_regmap(of_get_parent(np)); + tp = of_get_parent(np); + regmap = syscon_node_to_regmap(tp); + of_node_put(tp); if (IS_ERR(regmap)) return; @@ -433,6 +462,7 @@ of_at91_clk_periph_setup(struct device_node *np, u8 type) const char *name; struct device_node *periphclknp; struct regmap *regmap; + struct device_node *tp; parent_name = of_clk_get_parent_name(np, 0); if (!parent_name) @@ -442,7 +472,9 @@ of_at91_clk_periph_setup(struct device_node *np, u8 type) if (!num || num > PERIPHERAL_MAX) return; - regmap = syscon_node_to_regmap(of_get_parent(np)); + tp = of_get_parent(np); + regmap = syscon_node_to_regmap(tp); + of_node_put(tp); if (IS_ERR(regmap)) return; @@ -602,6 +634,7 @@ of_at91_clk_pll_setup(struct device_node *np, const char *parent_name; const char *name = np->name; struct clk_pll_characteristics *characteristics; + struct device_node *tp; if (of_property_read_u32(np, "reg", &id)) return; @@ -610,7 +643,9 @@ of_at91_clk_pll_setup(struct device_node *np, of_property_read_string(np, "clock-output-names", &name); - regmap = syscon_node_to_regmap(of_get_parent(np)); + tp = of_get_parent(np); + regmap = syscon_node_to_regmap(tp); + of_node_put(tp); if (IS_ERR(regmap)) return; @@ -665,12 +700,15 @@ of_at91sam9x5_clk_plldiv_setup(struct device_node *np) const char *parent_name; const char *name = np->name; struct regmap *regmap; + struct device_node *tp; parent_name = of_clk_get_parent_name(np, 0); of_property_read_string(np, "clock-output-names", &name); - regmap = syscon_node_to_regmap(of_get_parent(np)); + tp = of_get_parent(np); + regmap = syscon_node_to_regmap(tp); + of_node_put(tp); if (IS_ERR(regmap)) return; @@ -694,7 +732,7 @@ of_at91_clk_prog_setup(struct device_node *np, unsigned int num_parents; const char *parent_names[PROG_SOURCE_MAX]; const char *name; - struct device_node *progclknp; + struct device_node *progclknp, *tp; struct regmap *regmap; num_parents = of_clk_get_parent_count(np); @@ -707,7 +745,9 @@ of_at91_clk_prog_setup(struct device_node *np, if (!num || num > (PROG_ID_MAX + 1)) return; - regmap = syscon_node_to_regmap(of_get_parent(np)); + tp = of_get_parent(np); + regmap = syscon_node_to_regmap(tp); + of_node_put(tp); if (IS_ERR(regmap)) return; @@ -756,13 +796,16 @@ static void __init of_at91sam9260_clk_slow_setup(struct device_node *np) unsigned int num_parents; const char *name = np->name; struct regmap *regmap; + struct device_node *tp; num_parents = of_clk_get_parent_count(np); if (num_parents != 2) return; of_clk_parent_fill(np, parent_names, num_parents); - regmap = syscon_node_to_regmap(of_get_parent(np)); + tp = of_get_parent(np); + regmap = syscon_node_to_regmap(tp); + of_node_put(tp); if (IS_ERR(regmap)) return; @@ -788,6 +831,7 @@ static void __init of_at91sam9x5_clk_smd_setup(struct device_node *np) const char *parent_names[SMD_SOURCE_MAX]; const char *name = np->name; struct regmap *regmap; + struct device_node *tp; num_parents = of_clk_get_parent_count(np); if (num_parents == 0 || num_parents > SMD_SOURCE_MAX) @@ -797,7 +841,9 @@ static void __init of_at91sam9x5_clk_smd_setup(struct device_node *np) of_property_read_string(np, "clock-output-names", &name); - regmap = syscon_node_to_regmap(of_get_parent(np)); + tp = of_get_parent(np); + regmap = syscon_node_to_regmap(tp); + of_node_put(tp); if (IS_ERR(regmap)) return; @@ -818,7 +864,7 @@ static void __init of_at91rm9200_clk_sys_setup(struct device_node *np) u32 id; struct clk_hw *hw; const char *name; - struct device_node *sysclknp; + struct device_node *sysclknp, *tp; const char *parent_name; struct regmap *regmap; @@ -826,7 +872,9 @@ static void __init of_at91rm9200_clk_sys_setup(struct device_node *np) if (num > (SYSTEM_MAX_ID + 1)) return; - regmap = syscon_node_to_regmap(of_get_parent(np)); + tp = of_get_parent(np); + regmap = syscon_node_to_regmap(tp); + of_node_put(tp); if (IS_ERR(regmap)) return; @@ -859,6 +907,7 @@ static void __init of_at91sam9x5_clk_usb_setup(struct device_node *np) const char *parent_names[USB_SOURCE_MAX]; const char *name = np->name; struct regmap *regmap; + struct device_node *tp; num_parents = of_clk_get_parent_count(np); if (num_parents == 0 || num_parents > USB_SOURCE_MAX) @@ -868,7 +917,9 @@ static void __init of_at91sam9x5_clk_usb_setup(struct device_node *np) of_property_read_string(np, "clock-output-names", &name); - regmap = syscon_node_to_regmap(of_get_parent(np)); + tp = of_get_parent(np); + regmap = syscon_node_to_regmap(tp); + of_node_put(tp); if (IS_ERR(regmap)) return; @@ -888,6 +939,7 @@ static void __init of_at91sam9n12_clk_usb_setup(struct device_node *np) const char *parent_name; const char *name = np->name; struct regmap *regmap; + struct device_node *tp; parent_name = of_clk_get_parent_name(np, 0); if (!parent_name) @@ -895,7 +947,9 @@ static void __init of_at91sam9n12_clk_usb_setup(struct device_node *np) of_property_read_string(np, "clock-output-names", &name); - regmap = syscon_node_to_regmap(of_get_parent(np)); + tp = of_get_parent(np); + regmap = syscon_node_to_regmap(tp); + of_node_put(tp); if (IS_ERR(regmap)) return; @@ -915,6 +969,7 @@ static void __init of_at91rm9200_clk_usb_setup(struct device_node *np) const char *name = np->name; u32 divisors[4] = {0, 0, 0, 0}; struct regmap *regmap; + struct device_node *tp; parent_name = of_clk_get_parent_name(np, 0); if (!parent_name) @@ -926,7 +981,9 @@ static void __init of_at91rm9200_clk_usb_setup(struct device_node *np) of_property_read_string(np, "clock-output-names", &name); - regmap = syscon_node_to_regmap(of_get_parent(np)); + tp = of_get_parent(np); + regmap = syscon_node_to_regmap(tp); + of_node_put(tp); if (IS_ERR(regmap)) return; hw = at91rm9200_clk_register_usb(regmap, name, parent_name, divisors); @@ -946,12 +1003,15 @@ static void __init of_at91sam9x5_clk_utmi_setup(struct device_node *np) const char *parent_name; const char *name = np->name; struct regmap *regmap_pmc, *regmap_sfr; + struct device_node *tp; parent_name = of_clk_get_parent_name(np, 0); of_property_read_string(np, "clock-output-names", &name); - regmap_pmc = syscon_node_to_regmap(of_get_parent(np)); + tp = of_get_parent(np); + regmap_pmc = syscon_node_to_regmap(tp); + of_node_put(tp); if (IS_ERR(regmap_pmc)) return;
We need to hold the reference returned by of_get_parent() and use it to call of_node_put() for refcount balance. Fixes: 62061d357c7f ("clk: at91: move DT compatibility code to its own file") Signed-off-by: Liang He <windhl@126.com> --- these bugs are found in 5.19rc2 these bugs are confirmed not fixed by lore.kernel.org these bugs are compiled tested in 5.19rc2 with at91_dt_defconfig drivers/clk/at91/dt-compat.c | 108 +++++++++++++++++++++++++++-------- 1 file changed, 84 insertions(+), 24 deletions(-)