From: <Claudiu.Beznea@microchip.com>
To: <windhl@126.com>, <mturquette@baylibre.com>, <sboyd@kernel.org>,
<Nicolas.Ferre@microchip.com>, <alexandre.belloni@bootlin.com>,
<linux-clk@vger.kernel.org>
Subject: Re: [PATCH v2] clk: at91: dt-compat: Hold reference returned by of_get_parent()
Date: Thu, 30 Jun 2022 08:39:26 +0000 [thread overview]
Message-ID: <6a78dca9-96d6-08c3-7cb2-6773b4bc3883@microchip.com> (raw)
In-Reply-To: <20220628132256.164120-1-windhl@126.com>
On 28.06.2022 16:22, 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.
>
> Signed-off-by: Liang He <windhl@126.com>
> ---
> changelog:
>
> v2: use 'parent_np' to replace 'tp' and use xx:yy:zz title format
> v1: hold references returned by of_get_parent() and put them
>
> drivers/clk/at91/dt-compat.c | 112 +++++++++++++++++++++++++++--------
> 1 file changed, 86 insertions(+), 26 deletions(-)
>
> diff --git a/drivers/clk/at91/dt-compat.c b/drivers/clk/at91/dt-compat.c
> index 8ca8bcacf66d..0d36b4e7fd6e 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 *parent_np;
>
> - regmap = syscon_node_to_regmap(of_get_parent(np));
> + parent_np = of_get_parent(np);
> + regmap = syscon_node_to_regmap(parent_np);
> + of_node_put(parent_np);
> 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 *parent_np;
>
> - regmap = syscon_node_to_regmap(of_get_parent(np));
> + parent_np = of_get_parent(np);
> + regmap = syscon_node_to_regmap(parent_np);
> + of_node_put(parent_np);
> 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 *parent_np;
>
> - regmap = syscon_node_to_regmap(of_get_parent(np));
> + parent_np = of_get_parent(np);
> + regmap = syscon_node_to_regmap(parent_np);
> + of_node_put(parent_np);
> 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, *parent_np;
> 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));
> + parent_np = of_get_parent(np);
> + regmap = syscon_node_to_regmap(parent_np);
> + of_node_put(parent_np);
> 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 *parent_np;
>
> - regmap = syscon_node_to_regmap(of_get_parent(np));
> + parent_np = of_get_parent(np);
> + regmap = syscon_node_to_regmap(parent_np);
> + of_node_put(parent_np);
> 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 *parent_np;
>
> 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));
> + parent_np = of_get_parent(np);
> + regmap = syscon_node_to_regmap(parent_np);
> + of_node_put(parent_np);
> 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 *parent_np;
>
> 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));
> + parent_np = of_get_parent(np);
> + regmap = syscon_node_to_regmap(parent_np);
> + of_node_put(parent_np);
> 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 *parent_np;
>
> 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));
> + parent_np = of_get_parent(np);
> + regmap = syscon_node_to_regmap(parent_np);
> + of_node_put(parent_np);
> 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 *parent_np;
>
> 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));
> + parent_np = of_get_parent(np);
> + regmap = syscon_node_to_regmap(parent_np);
> + of_node_put(parent_np);
> 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 *parent_np;
>
> 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));
> + parent_np = of_get_parent(np);
> + regmap = syscon_node_to_regmap(parent_np);
> + of_node_put(parent_np);
> 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 *parent_np;
>
> 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));
> + parent_np = of_get_parent(np);
> + regmap = syscon_node_to_regmap(parent_np);
> + of_node_put(parent_np);
> if (IS_ERR(regmap))
> return;
>
> @@ -601,6 +633,7 @@ of_at91_clk_pll_setup(struct device_node *np,
> struct regmap *regmap;
> const char *parent_name;
> const char *name = np->name;
> + struct device_node *parent_np;
> struct clk_pll_characteristics *characteristics;
>
> if (of_property_read_u32(np, "reg", &id))
> @@ -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));
> + parent_np = of_get_parent(np);
> + regmap = syscon_node_to_regmap(parent_np);
> + of_node_put(parent_np);
> 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 *parent_np;
>
> 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));
> + parent_np = of_get_parent(np);
> + regmap = syscon_node_to_regmap(parent_np);
> + of_node_put(parent_np);
> if (IS_ERR(regmap))
> return;
>
> @@ -694,8 +732,8 @@ 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 regmap *regmap;
> + struct device_node *progclknp, *parent_np;
Is there a reason you chosed to move this on a new line?
>
> num_parents = of_clk_get_parent_count(np);
> if (num_parents == 0 || num_parents > PROG_SOURCE_MAX)
> @@ -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));
> + parent_np = of_get_parent(np);
> + regmap = syscon_node_to_regmap(parent_np);
> + of_node_put(parent_np);
> 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 *parent_np;
>
> 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));
> + parent_np = of_get_parent(np);
> + regmap = syscon_node_to_regmap(parent_np);
> + of_node_put(parent_np);
> 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 *parent_np;
>
> 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));
> + parent_np = of_get_parent(np);
> + regmap = syscon_node_to_regmap(parent_np);
> + of_node_put(parent_np);
> if (IS_ERR(regmap))
> return;
>
> @@ -818,15 +864,17 @@ 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;
> const char *parent_name;
> struct regmap *regmap;
> + struct device_node *sysclknp, *parent_np;
Same here.
>
> num = of_get_child_count(np);
> if (num > (SYSTEM_MAX_ID + 1))
> return;
>
> - regmap = syscon_node_to_regmap(of_get_parent(np));
> + parent_np = of_get_parent(np);
> + regmap = syscon_node_to_regmap(parent_np);
> + of_node_put(parent_np);
> 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 *parent_np;
>
> 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));
> + parent_np = of_get_parent(np);
> + regmap = syscon_node_to_regmap(parent_np);
> + of_node_put(parent_np);
> if (IS_ERR(regmap))
> return;
>
> @@ -885,9 +936,10 @@ CLK_OF_DECLARE(at91sam9x5_clk_usb, "atmel,at91sam9x5-clk-usb",
> static void __init of_at91sam9n12_clk_usb_setup(struct device_node *np)
> {
> struct clk_hw *hw;
> + struct regmap *regmap;
> const char *parent_name;
> const char *name = np->name;
> - struct regmap *regmap;
> + struct device_node *parent_np;
You moved around the declarations.
>
> 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));
> + parent_np = of_get_parent(np);
> + regmap = syscon_node_to_regmap(parent_np);
> + of_node_put(parent_np);
> if (IS_ERR(regmap))
> return;
>
> @@ -911,10 +965,11 @@ CLK_OF_DECLARE(at91sam9n12_clk_usb, "atmel,at91sam9n12-clk-usb",
> static void __init of_at91rm9200_clk_usb_setup(struct device_node *np)
> {
> struct clk_hw *hw;
> + struct regmap *regmap;
> const char *parent_name;
> const char *name = np->name;
> + struct device_node *parent_np;
> u32 divisors[4] = {0, 0, 0, 0};
> - struct regmap *regmap;
Same here.
>
> 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));
> + parent_np = of_get_parent(np);
> + regmap = syscon_node_to_regmap(parent_np);
> + of_node_put(parent_np);
> if (IS_ERR(regmap))
> return;
> hw = at91rm9200_clk_register_usb(regmap, name, parent_name, divisors);
> @@ -945,13 +1002,16 @@ static void __init of_at91sam9x5_clk_utmi_setup(struct device_node *np)
> struct clk_hw *hw;
> const char *parent_name;
> const char *name = np->name;
> + struct device_node *parent_np;
> struct regmap *regmap_pmc, *regmap_sfr;
>
> 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));
> + parent_np = of_get_parent(np);
> + regmap_pmc = syscon_node_to_regmap(parent_np);
> + of_node_put(parent_np);
> if (IS_ERR(regmap_pmc))
> return;
>
> --
> 2.25.1
>
next prev parent reply other threads:[~2022-06-30 8:39 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-28 13:22 [PATCH v2] clk: at91: dt-compat: Hold reference returned by of_get_parent() Liang He
2022-06-30 8:39 ` Claudiu.Beznea [this message]
2022-06-30 8:59 ` Liang He
2022-06-30 10:20 ` Claudiu.Beznea
2022-06-30 12:58 ` Liang He
2022-06-30 14:19 ` Claudiu.Beznea
2022-06-30 14:27 ` Liang He
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=6a78dca9-96d6-08c3-7cb2-6773b4bc3883@microchip.com \
--to=claudiu.beznea@microchip.com \
--cc=Nicolas.Ferre@microchip.com \
--cc=alexandre.belloni@bootlin.com \
--cc=linux-clk@vger.kernel.org \
--cc=mturquette@baylibre.com \
--cc=sboyd@kernel.org \
--cc=windhl@126.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox