2022-07-05 07:42:14

by Neil Armstrong

[permalink] [raw]
Subject: Re: [PATCH] soc: amlogic: meson-pwrc: Hold reference returned by of_get_parent()

+ linux-amlogic, linux-arm-kernel, linux-kernel

On 05/07/2022 04:20, Liang He wrote:
> We should hold the reference returned by of_get_parent() and use
> it to call of_node_put() for refcount balance.
>
> Signed-off-by: Liang He <[email protected]>
> ---
> drivers/soc/amlogic/meson-ee-pwrc.c | 5 ++++-
> drivers/soc/amlogic/meson-gx-pwrc-vpu.c | 5 ++++-
> 2 files changed, 8 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/soc/amlogic/meson-ee-pwrc.c b/drivers/soc/amlogic/meson-ee-pwrc.c
> index 2be3afe6c2e3..872ab8ba90bc 100644
> --- a/drivers/soc/amlogic/meson-ee-pwrc.c
> +++ b/drivers/soc/amlogic/meson-ee-pwrc.c
> @@ -470,6 +470,7 @@ static int meson_ee_pwrc_probe(struct platform_device *pdev)
> const struct meson_ee_pwrc_domain_data *match;
> struct regmap *regmap_ao, *regmap_hhi;
> struct meson_ee_pwrc *pwrc;
> + struct device_node *np;
> int i, ret;
>
> match = of_device_get_match_data(&pdev->dev);
> @@ -495,7 +496,9 @@ static int meson_ee_pwrc_probe(struct platform_device *pdev)
>
> pwrc->xlate.num_domains = match->count;
>
> - regmap_hhi = syscon_node_to_regmap(of_get_parent(pdev->dev.of_node));
> + np = of_get_parent(pdev->dev.of_node);
> + regmap_hhi = syscon_node_to_regmap(np);
> + of_node_put(np);
> if (IS_ERR(regmap_hhi)) {
> dev_err(&pdev->dev, "failed to get HHI regmap\n");
> return PTR_ERR(regmap_hhi);
> diff --git a/drivers/soc/amlogic/meson-gx-pwrc-vpu.c b/drivers/soc/amlogic/meson-gx-pwrc-vpu.c
> index b4615b288625..75a4e1cec416 100644
> --- a/drivers/soc/amlogic/meson-gx-pwrc-vpu.c
> +++ b/drivers/soc/amlogic/meson-gx-pwrc-vpu.c
> @@ -274,6 +274,7 @@ static int meson_gx_pwrc_vpu_probe(struct platform_device *pdev)
> struct regmap *regmap_ao, *regmap_hhi;
> struct meson_gx_pwrc_vpu *vpu_pd;
> struct reset_control *rstc;
> + struct device_node *np;
> struct clk *vpu_clk;
> struct clk *vapb_clk;
> bool powered_off;
> @@ -291,7 +292,9 @@ static int meson_gx_pwrc_vpu_probe(struct platform_device *pdev)
>
> memcpy(vpu_pd, vpu_pd_match, sizeof(*vpu_pd));
>
> - regmap_ao = syscon_node_to_regmap(of_get_parent(pdev->dev.of_node));
> + np = of_get_parent(pdev->dev.of_node);
> + regmap_ao = syscon_node_to_regmap(np);
> + of_node_put(np);
> if (IS_ERR(regmap_ao)) {
> dev_err(&pdev->dev, "failed to get regmap\n");
> return PTR_ERR(regmap_ao);


2022-07-26 01:11:22

by Liang He

[permalink] [raw]
Subject: Re:Re: [PATCH] soc: amlogic: meson-pwrc: Hold reference returned by of_get_parent()


At 2022-07-26 03:46:30, "Martin Blumenstingl" <[email protected]> wrote:
>Hello,
>
>thank you for your patch!
>
>On Tue, Jul 5, 2022 at 4:20 AM Liang He <[email protected]> wrote:
>[...]
>> + struct device_node *np;
>>
>> int i, ret;
>>
>> match = of_device_get_match_data(&pdev->dev);
>> @@ -495,7 +496,9 @@ static int meson_ee_pwrc_probe(struct platform_device *pdev)
>>
>> pwrc->xlate.num_domains = match->count;
>>
>> - regmap_hhi = syscon_node_to_regmap(of_get_parent(pdev->dev.of_node));
>> + np = of_get_parent(pdev->dev.of_node);
>> + regmap_hhi = syscon_node_to_regmap(np);
>This works but I had to read the code twice because I thought the
>wrong struct device_node was used.
>Other drivers typically use "np" for whatever the code section
>currently refers to. In this case the code section is about the power
>controller, so I thought that "np" was the same as
>"pdev->dev.of_node".
>
>I think the code would be easier to understand and the likelihood of
>someone making the same mistake as I did if you could rename "np" to
>"parent_np" (just like you have done in your other patches).
>
>[...]
>> + struct device_node *np;
>same as above, I suggest renaming this to parent_np.

Thanks, I will send a new verison soon.

Liang

2022-07-26 01:37:16

by Liang He

[permalink] [raw]
Subject: Re:Re: [PATCH] soc: amlogic: meson-pwrc: Hold reference returned by of_get_parent()


At 2022-07-26 03:46:30, "Martin Blumenstingl" <[email protected]> wrote:
>Hello,
>
>thank you for your patch!
>
>On Tue, Jul 5, 2022 at 4:20 AM Liang He <[email protected]> wrote:
>[...]
>> + struct device_node *np;
>>
>> int i, ret;
>>
>> match = of_device_get_match_data(&pdev->dev);
>> @@ -495,7 +496,9 @@ static int meson_ee_pwrc_probe(struct platform_device *pdev)
>>
>> pwrc->xlate.num_domains = match->count;
>>
>> - regmap_hhi = syscon_node_to_regmap(of_get_parent(pdev->dev.of_node));
>> + np = of_get_parent(pdev->dev.of_node);
>> + regmap_hhi = syscon_node_to_regmap(np);
>This works but I had to read the code twice because I thought the
>wrong struct device_node was used.
>Other drivers typically use "np" for whatever the code section
>currently refers to. In this case the code section is about the power
>controller, so I thought that "np" was the same as
>"pdev->dev.of_node".
>
>I think the code would be easier to understand and the likelihood of
>someone making the same mistake as I did if you could rename "np" to
>"parent_np" (just like you have done in your other patches).
>
>[...]
>> + struct device_node *np;

>same as above, I suggest renaming this to parent_np.


Hi, Martin,


I notice the declarations keep the reverse Christmas tree order,
should I keep that order as the 'parent_np' will become longer than 'np'.


Thanks,
Liang