* [PATCH v2] clk: sprd: Hold reference returned by of_get_parent()
@ 2022-06-28 13:52 Liang He
2022-07-01 0:15 ` Orson Zhai
0 siblings, 1 reply; 3+ messages in thread
From: Liang He @ 2022-06-28 13:52 UTC (permalink / raw)
To: mturquette, sboyd, orsonzhai, baolin.wang7, zhang.lyra,
linux-clk, windhl
We should hold the reference returned by of_get_parent() and use it
to call of_node_out() for refcount balance.
Fixes: f95e8c7923d1 ("clk: sprd: support to get regmap from parent node")
Signed-off-by: Liang He <windhl@126.com>
---
changelog:
v2: minimize the effective range of of_get_parent() advised by Orson
v1: hold reference returned by of_get_parent()
v1-link: https://lore.kernel.org/all/20220624103809.4167753-1-windhl@126.com/
Patched file has been compiled test in 5.19rc2.
drivers/clk/sprd/common.c | 37 +++++++++++++++++++++----------------
1 file changed, 21 insertions(+), 16 deletions(-)
diff --git a/drivers/clk/sprd/common.c b/drivers/clk/sprd/common.c
index d620bbbcdfc8..d85ba80c5931 100644
--- a/drivers/clk/sprd/common.c
+++ b/drivers/clk/sprd/common.c
@@ -50,23 +50,28 @@ int sprd_clk_regmap_init(struct platform_device *pdev,
pr_err("%s: failed to get syscon regmap\n", __func__);
return PTR_ERR(regmap);
}
- } else if (of_device_is_compatible(of_get_parent(dev->of_node),
- "syscon")) {
- regmap = device_node_to_regmap(of_get_parent(dev->of_node));
- if (IS_ERR(regmap)) {
- dev_err(dev, "failed to get regmap from its parent.\n");
- return PTR_ERR(regmap);
- }
} else {
- base = devm_platform_ioremap_resource(pdev, 0);
- if (IS_ERR(base))
- return PTR_ERR(base);
-
- regmap = devm_regmap_init_mmio(&pdev->dev, base,
- &sprdclk_regmap_config);
- if (IS_ERR(regmap)) {
- pr_err("failed to init regmap\n");
- return PTR_ERR(regmap);
+ struct device_node *np = of_get_parent(dev->of_node);
+
+ if (of_device_is_compatible(np, "syscon")) {
+ regmap = device_node_to_regmap(np);
+ of_node_put(np);
+ if (IS_ERR(regmap)) {
+ dev_err(dev, "failed to get regmap from its parent.\n");
+ return PTR_ERR(regmap);
+ }
+ } else {
+ of_node_put(np);
+ base = devm_platform_ioremap_resource(pdev, 0);
+ if (IS_ERR(base))
+ return PTR_ERR(base);
+
+ regmap = devm_regmap_init_mmio(&pdev->dev, base,
+ &sprdclk_regmap_config);
+ if (IS_ERR(regmap)) {
+ pr_err("failed to init regmap\n");
+ return PTR_ERR(regmap);
+ }
}
}
--
2.25.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH v2] clk: sprd: Hold reference returned by of_get_parent()
2022-06-28 13:52 [PATCH v2] clk: sprd: Hold reference returned by of_get_parent() Liang He
@ 2022-07-01 0:15 ` Orson Zhai
2022-07-01 2:00 ` Liang He
0 siblings, 1 reply; 3+ messages in thread
From: Orson Zhai @ 2022-07-01 0:15 UTC (permalink / raw)
To: Liang He
Cc: Michael Turquette, Stephen Boyd, Baolin Wang, Lyra Zhang, linux-clk
Hi Liang,
On Tue, Jun 28, 2022 at 9:54 PM Liang He <windhl@126.com> wrote:
>
> We should hold the reference returned by of_get_parent() and use it
> to call of_node_out() for refcount balance.
typo. s/out/put
>
> Fixes: f95e8c7923d1 ("clk: sprd: support to get regmap from parent node")
>
> Signed-off-by: Liang He <windhl@126.com>
> ---
> changelog:
>
> v2: minimize the effective range of of_get_parent() advised by Orson
> v1: hold reference returned by of_get_parent()
>
> v1-link: https://lore.kernel.org/all/20220624103809.4167753-1-windhl@126.com/
>
> Patched file has been compiled test in 5.19rc2.
>
> drivers/clk/sprd/common.c | 37 +++++++++++++++++++++----------------
> 1 file changed, 21 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/clk/sprd/common.c b/drivers/clk/sprd/common.c
> index d620bbbcdfc8..d85ba80c5931 100644
> --- a/drivers/clk/sprd/common.c
> +++ b/drivers/clk/sprd/common.c
> @@ -50,23 +50,28 @@ int sprd_clk_regmap_init(struct platform_device *pdev,
> pr_err("%s: failed to get syscon regmap\n", __func__);
> return PTR_ERR(regmap);
> }
> - } else if (of_device_is_compatible(of_get_parent(dev->of_node),
> - "syscon")) {
> - regmap = device_node_to_regmap(of_get_parent(dev->of_node));
> - if (IS_ERR(regmap)) {
> - dev_err(dev, "failed to get regmap from its parent.\n");
> - return PTR_ERR(regmap);
> - }
> } else {
> - base = devm_platform_ioremap_resource(pdev, 0);
> - if (IS_ERR(base))
> - return PTR_ERR(base);
> -
> - regmap = devm_regmap_init_mmio(&pdev->dev, base,
> - &sprdclk_regmap_config);
> - if (IS_ERR(regmap)) {
> - pr_err("failed to init regmap\n");
> - return PTR_ERR(regmap);
> + struct device_node *np = of_get_parent(dev->of_node);
move the declaration of "np" to the beginning part without assigning any value.
> +
> + if (of_device_is_compatible(np, "syscon")) {
There may be no need to split the origin structure of "if...else if...else".
How about the following method?
else if (of_device_is_compatible(np =
of_get_parent(dev->of_node), "syscon")
|| (of_node_put(np), 0)) {
> + regmap = device_node_to_regmap(np);
> + of_node_put(np);
> + if (IS_ERR(regmap)) {
> + dev_err(dev, "failed to get regmap from its parent.\n");
> + return PTR_ERR(regmap);
> + }
> + } else {
> + of_node_put(np);
This line would not be necessary then.
-Orson
> + base = devm_platform_ioremap_resource(pdev, 0);
> + if (IS_ERR(base))
> + return PTR_ERR(base);
> +
> + regmap = devm_regmap_init_mmio(&pdev->dev, base,
> + &sprdclk_regmap_config);
> + if (IS_ERR(regmap)) {
> + pr_err("failed to init regmap\n");
> + return PTR_ERR(regmap);
> + }
> }
> }
>
> --
> 2.25.1
>
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re:Re: [PATCH v2] clk: sprd: Hold reference returned by of_get_parent()
2022-07-01 0:15 ` Orson Zhai
@ 2022-07-01 2:00 ` Liang He
0 siblings, 0 replies; 3+ messages in thread
From: Liang He @ 2022-07-01 2:00 UTC (permalink / raw)
To: Orson Zhai
Cc: Michael Turquette, Stephen Boyd, Baolin Wang, Lyra Zhang, linux-clk
At 2022-07-01 08:15:23, "Orson Zhai" <orsonzhai@gmail.com> wrote:
>Hi Liang,
>
>On Tue, Jun 28, 2022 at 9:54 PM Liang He <windhl@126.com> wrote:
>>
>> We should hold the reference returned by of_get_parent() and use it
>> to call of_node_out() for refcount balance.
>
>typo. s/out/put
>
Thanks, I will correct it in next version.
>>
>> Fixes: f95e8c7923d1 ("clk: sprd: support to get regmap from parent node")
>>
>> Signed-off-by: Liang He <windhl@126.com>
>> ---
>> changelog:
>>
>> v2: minimize the effective range of of_get_parent() advised by Orson
>> v1: hold reference returned by of_get_parent()
>>
>> v1-link: https://lore.kernel.org/all/20220624103809.4167753-1-windhl@126.com/
>>
>> Patched file has been compiled test in 5.19rc2.
>>
>> drivers/clk/sprd/common.c | 37 +++++++++++++++++++++----------------
>> 1 file changed, 21 insertions(+), 16 deletions(-)
>>
>> diff --git a/drivers/clk/sprd/common.c b/drivers/clk/sprd/common.c
>> index d620bbbcdfc8..d85ba80c5931 100644
>> --- a/drivers/clk/sprd/common.c
>> +++ b/drivers/clk/sprd/common.c
>> @@ -50,23 +50,28 @@ int sprd_clk_regmap_init(struct platform_device *pdev,
>> pr_err("%s: failed to get syscon regmap\n", __func__);
>> return PTR_ERR(regmap);
>> }
>> - } else if (of_device_is_compatible(of_get_parent(dev->of_node),
>> - "syscon")) {
>> - regmap = device_node_to_regmap(of_get_parent(dev->of_node));
>> - if (IS_ERR(regmap)) {
>> - dev_err(dev, "failed to get regmap from its parent.\n");
>> - return PTR_ERR(regmap);
>> - }
>> } else {
>> - base = devm_platform_ioremap_resource(pdev, 0);
>> - if (IS_ERR(base))
>> - return PTR_ERR(base);
>> -
>> - regmap = devm_regmap_init_mmio(&pdev->dev, base,
>> - &sprdclk_regmap_config);
>> - if (IS_ERR(regmap)) {
>> - pr_err("failed to init regmap\n");
>> - return PTR_ERR(regmap);
>> + struct device_node *np = of_get_parent(dev->of_node);
>
>move the declaration of "np" to the beginning part without assigning any value.
>
OK.
>> +
>> + if (of_device_is_compatible(np, "syscon")) {
>
>There may be no need to split the origin structure of "if...else if...else".
>How about the following method?
>
> else if (of_device_is_compatible(np =
>of_get_parent(dev->of_node), "syscon")
> || (of_node_put(np), 0)) {
>
Thanks, I will try it and compile test it before I send next version.
>> + regmap = device_node_to_regmap(np);
>> + of_node_put(np);
>> + if (IS_ERR(regmap)) {
>> + dev_err(dev, "failed to get regmap from its parent.\n");
>> + return PTR_ERR(regmap);
>> + }
>> + } else {
>> + of_node_put(np);
>
>This line would not be necessary then.
>
>-Orson
Thanks, I will remove this line.
Liang
>
>> + base = devm_platform_ioremap_resource(pdev, 0);
>> + if (IS_ERR(base))
>> + return PTR_ERR(base);
>> +
>> + regmap = devm_regmap_init_mmio(&pdev->dev, base,
>> + &sprdclk_regmap_config);
>> + if (IS_ERR(regmap)) {
>> + pr_err("failed to init regmap\n");
>> + return PTR_ERR(regmap);
>> + }
>> }
>> }
>>
>> --
>> 2.25.1
>>
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2022-07-01 2:00 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-28 13:52 [PATCH v2] clk: sprd: Hold reference returned by of_get_parent() Liang He
2022-07-01 0:15 ` Orson Zhai
2022-07-01 2:00 ` Liang He
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.