From: Stephen Boyd <sboyd@codeaurora.org>
To: Sjoerd Simons <sjoerd.simons@collabora.co.uk>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>,
Simon Horman <horms@verge.net.au>,
linux-renesas-soc@vger.kernel.org,
"devicetree@vger.kernel.org" <devicetree@vger.kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>,
Michael Turquette <mturquette@baylibre.com>,
linux-clk <linux-clk@vger.kernel.org>
Subject: Re: [PATCH] ARM: dts: r8a7791: Don't disable referenced optional clocks
Date: Wed, 13 Apr 2016 17:19:13 -0700 [thread overview]
Message-ID: <20160414001913.GG14441@codeaurora.org> (raw)
In-Reply-To: <1460112654.31245.20.camel@collabora.co.uk>
On 04/08, Sjoerd Simons wrote:
> On Thu, 2016-04-07 at 16:21 -0700, Stephen Boyd wrote:
> > On 04/06, Sjoerd Simons wrote:
> > >
> > > Though even so I'm not sure what the convention is for clocks like
> > > these, the r8a7791.dtsi is inconsistent, as some are disabled while
> > > others (e.g. the audio clocks) are 0hz. Would be good to get some
> > > input
> > > on that regardless.
> > >
> > What's the question here?
>
> So the question is how to model unconnected external clocks in device-
> tree.
>
> The dtsi we're loooking at has (in pseudo dt):
>
> device {
> clock-names = "internal", "external";
> clocks = <&internal, &external>
> };
>
> external {
> compatible = "fixed-clock";
> clock-frequency = <12345>;
> status = "disabled";
> };
>
> Before 3e5dd6f6e690048d ("clk: Ignore disabled DT clock providers")
> this apparently worked. Afterwards drivers getting all the clocks would
> fail to probe with -EPROBE_DEFER.
>
> Judging by your comment I assume this way of modelling it is broken
> (and the behaviour caused by the patch is correct)?
>
> And as a follow-up, is modelling unconnected clocks as enabled with a
> frequency of 0hz as my proposed patch does seen as the right way of
> doing things?
>
Right. In the case where the external clk is populated, I imagine
there would be a DT node describing it with the clock-frequency
property if it's a fixed rate clk. If the clk is not populated on
the board, then we would have a "ground" clk node that has a
frequency of 0. This way, if we have some mux clk that is default
connected to the external clk but can switch to some internal clk
it isn't orphaned forever. This is actually a problem for orphan
clk deferral right now.
My head starts to spin when we consider something like expansion
boards that have clk pins on them though. Hopefully for things
like that, we can populate clks with DT overlays and then change
the root hierarchy of the clk tree by swapping out the "ground"
clk for some real clk on the expansion board. The usage of
strings to describe the clk tree is probably going to get us here
though. Fun!
If we can't do this DT design because of backwards compatibility
concerns, then perhaps we need to expand the core to return a
fixed rate of 0 clk whenever clk_get() is called on a provider
that's status = "disabled"? Here's an untested patch to show that
idea.
---8<----
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
index fb74dc1f7520..19c3777b1cea 100644
--- a/drivers/clk/clk.c
+++ b/drivers/clk/clk.c
@@ -3085,6 +3085,17 @@ int of_clk_parent_fill(struct device_node *np, const char **parents,
}
EXPORT_SYMBOL_GPL(of_clk_parent_fill);
+static void init_disabled_clk_provider(struct device_node *np)
+{
+ struct clk *clk;
+
+ clk = clk_register_fixed_rate(NULL, of_node_full_name(np), NULL, 0, 0);
+ if (IS_ERR(clk))
+ return;
+
+ of_clk_add_provider(np, of_clk_src_simple_get, clk);
+}
+
struct clock_provider {
of_clk_init_cb_t clk_init_cb;
struct device_node *np;
@@ -3150,9 +3161,6 @@ void __init of_clk_init(const struct of_device_id *matches)
for_each_matching_node_and_match(np, matches, &match) {
struct clock_provider *parent;
- if (!of_device_is_available(np))
- continue;
-
parent = kzalloc(sizeof(*parent), GFP_KERNEL);
if (!parent) {
list_for_each_entry_safe(clk_provider, next,
@@ -3165,7 +3173,18 @@ void __init of_clk_init(const struct of_device_id *matches)
return;
}
- parent->clk_init_cb = match->data;
+ /*
+ * Sometimes DT nodes are status = "disabled" but they're used
+ * by other clk providers. In that case we make the disabled
+ * provider return fixed rate clks with a frequency of 0 so
+ * that nothing is orphaned and drivers can still get all
+ * their clks.
+ */
+ if (!of_device_is_available(np)) {
+ parent->clk_init_cb = init_disabled_clk_provider;
+ } else {
+ parent->clk_init_cb = match->data;
+ }
parent->np = of_node_get(np);
list_add_tail(&parent->node, &clk_provider_list);
}
--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
a Linux Foundation Collaborative Project
WARNING: multiple messages have this Message-ID (diff)
From: Stephen Boyd <sboyd@codeaurora.org>
To: Sjoerd Simons <sjoerd.simons@collabora.co.uk>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>,
Simon Horman <horms@verge.net.au>,
linux-renesas-soc@vger.kernel.org,
"devicetree@vger.kernel.org" <devicetree@vger.kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>,
Michael Turquette <mturquette@baylibre.com>,
linux-clk <linux-clk@vger.kernel.org>
Subject: Re: [PATCH] ARM: dts: r8a7791: Don't disable referenced optional clocks
Date: Wed, 13 Apr 2016 17:19:13 -0700 [thread overview]
Message-ID: <20160414001913.GG14441@codeaurora.org> (raw)
In-Reply-To: <1460112654.31245.20.camel@collabora.co.uk>
On 04/08, Sjoerd Simons wrote:
> On Thu, 2016-04-07 at 16:21 -0700, Stephen Boyd wrote:
> > On 04/06, Sjoerd Simons wrote:
> > >
> > > Though even so I'm not sure what the convention is for clocks like
> > > these, the r8a7791.dtsi is inconsistent, as some are disabled while
> > > others (e.g. the audio clocks) are 0hz. Would be good to get some
> > > input
> > > on that regardless.
> > >
> > What's the question here?
>
> So the question is how to model unconnected external clocks in device-
> tree.
>
> The dtsi we're loooking at has (in pseudo dt):
>
> device {
> � clock-names = "internal", "external";
> � clocks = <&internal, &external>
> };
>
> external {
> � compatible = "fixed-clock";
> � clock-frequency = <12345>;
> � status = "disabled";
> };
>
> Before�3e5dd6f6e690048d ("clk: Ignore�disabled DT�clock providers")
> this apparently worked. Afterwards drivers getting all the clocks would
> fail to probe with -EPROBE_DEFER.
>
> Judging by your comment I assume this way of modelling it is broken
> (and the behaviour caused by the patch is correct)?�
>
> And as a follow-up, is modelling unconnected clocks as enabled with a
> frequency of 0hz as my proposed patch does seen as the right way of
> doing things?
>
Right. In the case where the external clk is populated, I imagine
there would be a DT node describing it with the clock-frequency
property if it's a fixed rate clk. If the clk is not populated on
the board, then we would have a "ground" clk node that has a
frequency of 0. This way, if we have some mux clk that is default
connected to the external clk but can switch to some internal clk
it isn't orphaned forever. This is actually a problem for orphan
clk deferral right now.
My head starts to spin when we consider something like expansion
boards that have clk pins on them though. Hopefully for things
like that, we can populate clks with DT overlays and then change
the root hierarchy of the clk tree by swapping out the "ground"
clk for some real clk on the expansion board. The usage of
strings to describe the clk tree is probably going to get us here
though. Fun!
If we can't do this DT design because of backwards compatibility
concerns, then perhaps we need to expand the core to return a
fixed rate of 0 clk whenever clk_get() is called on a provider
that's status = "disabled"? Here's an untested patch to show that
idea.
---8<----
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
index fb74dc1f7520..19c3777b1cea 100644
--- a/drivers/clk/clk.c
+++ b/drivers/clk/clk.c
@@ -3085,6 +3085,17 @@ int of_clk_parent_fill(struct device_node *np, const char **parents,
}
EXPORT_SYMBOL_GPL(of_clk_parent_fill);
+static void init_disabled_clk_provider(struct device_node *np)
+{
+ struct clk *clk;
+
+ clk = clk_register_fixed_rate(NULL, of_node_full_name(np), NULL, 0, 0);
+ if (IS_ERR(clk))
+ return;
+
+ of_clk_add_provider(np, of_clk_src_simple_get, clk);
+}
+
struct clock_provider {
of_clk_init_cb_t clk_init_cb;
struct device_node *np;
@@ -3150,9 +3161,6 @@ void __init of_clk_init(const struct of_device_id *matches)
for_each_matching_node_and_match(np, matches, &match) {
struct clock_provider *parent;
- if (!of_device_is_available(np))
- continue;
-
parent = kzalloc(sizeof(*parent), GFP_KERNEL);
if (!parent) {
list_for_each_entry_safe(clk_provider, next,
@@ -3165,7 +3173,18 @@ void __init of_clk_init(const struct of_device_id *matches)
return;
}
- parent->clk_init_cb = match->data;
+ /*
+ * Sometimes DT nodes are status = "disabled" but they're used
+ * by other clk providers. In that case we make the disabled
+ * provider return fixed rate clks with a frequency of 0 so
+ * that nothing is orphaned and drivers can still get all
+ * their clks.
+ */
+ if (!of_device_is_available(np)) {
+ parent->clk_init_cb = init_disabled_clk_provider;
+ } else {
+ parent->clk_init_cb = match->data;
+ }
parent->np = of_node_get(np);
list_add_tail(&parent->node, &clk_provider_list);
}
--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
a Linux Foundation Collaborative Project
WARNING: multiple messages have this Message-ID (diff)
From: sboyd@codeaurora.org (Stephen Boyd)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH] ARM: dts: r8a7791: Don't disable referenced optional clocks
Date: Wed, 13 Apr 2016 17:19:13 -0700 [thread overview]
Message-ID: <20160414001913.GG14441@codeaurora.org> (raw)
In-Reply-To: <1460112654.31245.20.camel@collabora.co.uk>
On 04/08, Sjoerd Simons wrote:
> On Thu, 2016-04-07 at 16:21 -0700, Stephen Boyd wrote:
> > On 04/06, Sjoerd Simons wrote:
> > >
> > > Though even so I'm not sure what the convention is for clocks like
> > > these, the r8a7791.dtsi is inconsistent, as some are disabled while
> > > others (e.g. the audio clocks) are 0hz. Would be good to get some
> > > input
> > > on that regardless.
> > >
> > What's the question here?
>
> So the question is how to model unconnected external clocks in device-
> tree.
>
> The dtsi we're loooking at has (in pseudo dt):
>
> device {
> ? clock-names = "internal", "external";
> ? clocks = <&internal, &external>
> };
>
> external {
> ? compatible = "fixed-clock";
> ? clock-frequency = <12345>;
> ? status = "disabled";
> };
>
> Before?3e5dd6f6e690048d ("clk: Ignore?disabled DT?clock providers")
> this apparently worked. Afterwards drivers getting all the clocks would
> fail to probe with -EPROBE_DEFER.
>
> Judging by your comment I assume this way of modelling it is broken
> (and the behaviour caused by the patch is correct)??
>
> And as a follow-up, is modelling unconnected clocks as enabled with a
> frequency of 0hz as my proposed patch does seen as the right way of
> doing things?
>
Right. In the case where the external clk is populated, I imagine
there would be a DT node describing it with the clock-frequency
property if it's a fixed rate clk. If the clk is not populated on
the board, then we would have a "ground" clk node that has a
frequency of 0. This way, if we have some mux clk that is default
connected to the external clk but can switch to some internal clk
it isn't orphaned forever. This is actually a problem for orphan
clk deferral right now.
My head starts to spin when we consider something like expansion
boards that have clk pins on them though. Hopefully for things
like that, we can populate clks with DT overlays and then change
the root hierarchy of the clk tree by swapping out the "ground"
clk for some real clk on the expansion board. The usage of
strings to describe the clk tree is probably going to get us here
though. Fun!
If we can't do this DT design because of backwards compatibility
concerns, then perhaps we need to expand the core to return a
fixed rate of 0 clk whenever clk_get() is called on a provider
that's status = "disabled"? Here's an untested patch to show that
idea.
---8<----
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
index fb74dc1f7520..19c3777b1cea 100644
--- a/drivers/clk/clk.c
+++ b/drivers/clk/clk.c
@@ -3085,6 +3085,17 @@ int of_clk_parent_fill(struct device_node *np, const char **parents,
}
EXPORT_SYMBOL_GPL(of_clk_parent_fill);
+static void init_disabled_clk_provider(struct device_node *np)
+{
+ struct clk *clk;
+
+ clk = clk_register_fixed_rate(NULL, of_node_full_name(np), NULL, 0, 0);
+ if (IS_ERR(clk))
+ return;
+
+ of_clk_add_provider(np, of_clk_src_simple_get, clk);
+}
+
struct clock_provider {
of_clk_init_cb_t clk_init_cb;
struct device_node *np;
@@ -3150,9 +3161,6 @@ void __init of_clk_init(const struct of_device_id *matches)
for_each_matching_node_and_match(np, matches, &match) {
struct clock_provider *parent;
- if (!of_device_is_available(np))
- continue;
-
parent = kzalloc(sizeof(*parent), GFP_KERNEL);
if (!parent) {
list_for_each_entry_safe(clk_provider, next,
@@ -3165,7 +3173,18 @@ void __init of_clk_init(const struct of_device_id *matches)
return;
}
- parent->clk_init_cb = match->data;
+ /*
+ * Sometimes DT nodes are status = "disabled" but they're used
+ * by other clk providers. In that case we make the disabled
+ * provider return fixed rate clks with a frequency of 0 so
+ * that nothing is orphaned and drivers can still get all
+ * their clks.
+ */
+ if (!of_device_is_available(np)) {
+ parent->clk_init_cb = init_disabled_clk_provider;
+ } else {
+ parent->clk_init_cb = match->data;
+ }
parent->np = of_node_get(np);
list_add_tail(&parent->node, &clk_provider_list);
}
--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
a Linux Foundation Collaborative Project
next prev parent reply other threads:[~2016-04-14 0:19 UTC|newest]
Thread overview: 68+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-04-05 12:47 [PATCH net-next v3 0/4] vxlan: implement Generic Protocol Extension (GPE) Jiri Benc
2016-04-05 12:47 ` [PATCH net-next v3 1/4] vxlan: move Ethernet initialization to a separate function Jiri Benc
2016-04-05 12:47 ` [PATCH net-next v3 2/4] vxlan: move fdb code to common location in vxlan_xmit Jiri Benc
2016-04-05 12:47 ` [PATCH net-next v3 3/4] ip_tunnel: implement __iptunnel_pull_header Jiri Benc
2016-04-05 12:47 ` [PATCH net-next v3 4/4] vxlan: implement GPE Jiri Benc
2016-04-06 12:52 ` [PATCH] ARM: dts: r8a7791: Don't disable referenced optional clocks Sjoerd Simons
2016-04-06 12:52 ` Sjoerd Simons
2016-04-06 13:09 ` Geert Uytterhoeven
2016-04-06 13:09 ` Geert Uytterhoeven
2016-04-06 13:09 ` Geert Uytterhoeven
2016-04-06 13:11 ` Geert Uytterhoeven
2016-04-06 13:11 ` Geert Uytterhoeven
2016-04-06 13:37 ` Sjoerd Simons
2016-04-06 13:37 ` Sjoerd Simons
2016-04-06 13:37 ` Sjoerd Simons
2016-04-07 23:21 ` Stephen Boyd
2016-04-07 23:21 ` Stephen Boyd
2016-04-08 10:50 ` Sjoerd Simons
2016-04-08 10:50 ` Sjoerd Simons
2016-04-08 10:50 ` Sjoerd Simons
2016-04-14 0:19 ` Stephen Boyd [this message]
2016-04-14 0:19 ` Stephen Boyd
2016-04-14 0:19 ` Stephen Boyd
2016-04-06 23:15 ` Sergei Shtylyov
2016-04-06 23:15 ` Sergei Shtylyov
2016-04-05 13:50 ` [PATCH net-next v3 4/4] vxlan: implement GPE, Re: [PATCH] ARM: dts: r8a7791: Don't disable referenced optional clocks, No serial since ARM: dts: r8a7791: Add BRG support for (H)SCIF, [PATCH net v2 1/3] gre: do not assign header_ops in collect metadata mode, [PATCH iproute2 0/2] ip link gre: fix external mode handling, [PATCH 3/7] soc: renesas: Add r8a7790 SYSC PM Domain Binding Definitions Tom Herbert, Sergei Shtylyov, Sjoerd Simons, Jiri Benc, Jiri Benc, Simon Horman
2016-04-07 7:00 ` [PATCH] ARM: dts: r8a7791: Don't disable referenced optional clocks Sjoerd Simons
2016-04-07 7:00 ` Sjoerd Simons
2016-04-07 7:00 ` Sjoerd Simons
2016-04-07 19:14 ` Sergei Shtylyov
2016-04-07 19:14 ` Sergei Shtylyov
2016-04-08 14:20 ` Phil Edworthy
2016-04-08 14:20 ` Phil Edworthy
2016-04-08 14:20 ` Phil Edworthy
2016-04-19 7:18 ` Geert Uytterhoeven
2016-04-19 7:18 ` Geert Uytterhoeven
2016-04-19 7:18 ` Geert Uytterhoeven
2016-04-19 22:51 ` Simon Horman
2016-04-19 22:51 ` Simon Horman
2016-04-24 11:00 ` [PATCH net v2 0/3] gre: fix lwtunnel support Jiri Benc
2016-04-21 3:44 ` [GIT PULL] Renesas ARM Based SoC R-Car SYSC Updates for v4.7 Simon Horman
2016-04-21 3:44 ` [PATCH 1/7] PM / Domains: Add DT bindings for the R-Car System Controller Simon Horman
2016-04-21 3:44 ` Simon Horman
2016-04-21 3:44 ` [PATCH 2/7] soc: renesas: Add r8a7779 SYSC PM Domain Binding Definitions Simon Horman
2016-04-21 3:44 ` Simon Horman
2016-04-21 3:44 ` [PATCH 3/7] soc: renesas: Add r8a7790 " Simon Horman
2016-04-05 13:50 ` [PATCH net-next v3 4/4] vxlan: implement GPE, Re: [PATCH] ARM: dts: r8a7791: Don't disable referenced optional clocks, No serial since ARM: dts: r8a7791: Add BRG support for (H)SCIF, [PATCH net v2 1/3] gre: do not assign header_ops in collect metadata mode, [PATCH iproute2 0/2] ip link gre: fix external mode handling, " Tom Herbert, Sergei Shtylyov, Sjoerd Simons, Jiri Benc, Jiri Benc, Simon Horman
2016-04-05 13:50 ` [PATCH net-next v3 4/4] vxlan: implement GPE Tom Herbert
2016-04-05 13:57 ` Jiri Benc
2016-04-21 3:44 ` [PATCH 4/7] soc: renesas: Add r8a7791 SYSC PM Domain Binding Definitions Simon Horman
2016-04-21 3:44 ` Simon Horman
2016-04-21 3:44 ` [PATCH 5/7] soc: renesas: Add r8a7793 " Simon Horman
2016-04-21 3:44 ` Simon Horman
2016-04-21 3:44 ` [PATCH 6/7] soc: renesas: Add r8a7794 " Simon Horman
2016-04-21 3:44 ` [PATCH 7/7] soc: renesas: Add r8a7795 " Simon Horman
2016-04-24 21:40 ` [GIT PULL] Renesas ARM Based SoC R-Car SYSC Updates for v4.7 Arnd Bergmann
2016-04-25 0:23 ` Simon Horman
2016-04-24 11:00 ` [PATCH net v2 1/3] gre: do not assign header_ops in collect metadata mode Jiri Benc
2016-04-24 13:45 ` Sergei Shtylyov
2016-04-26 8:39 ` Jiri Benc
2016-04-27 14:11 ` [PATCH iproute2 0/2] ip link gre: fix external mode handling Jiri Benc
2016-04-27 14:11 ` [PATCH iproute2 1/2] ip link gre: create interfaces in external mode correctly Jiri Benc
2016-04-27 14:11 ` [PATCH iproute2 2/2] ip link gre: print only relevant info in external mode Jiri Benc
2016-05-06 18:50 ` [PATCH iproute2 0/2] ip link gre: fix external mode handling Stephen Hemminger
2016-04-24 11:00 ` [PATCH net v2 2/3] gre: build header correctly for collect metadata tunnels Jiri Benc
2016-04-24 11:00 ` [PATCH net v2 3/3] gre: allow creation of gretap interfaces in metadata mode Jiri Benc
2016-04-25 18:00 ` pravin shelar
2016-04-26 8:47 ` Jiri Benc
2016-04-06 20:50 ` [PATCH net-next v3 0/4] vxlan: implement Generic Protocol Extension (GPE) David Miller
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=20160414001913.GG14441@codeaurora.org \
--to=sboyd@codeaurora.org \
--cc=devicetree@vger.kernel.org \
--cc=geert@linux-m68k.org \
--cc=horms@verge.net.au \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-clk@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-renesas-soc@vger.kernel.org \
--cc=mturquette@baylibre.com \
--cc=sjoerd.simons@collabora.co.uk \
/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 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.