From: Grant Likely <grant.likely-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
To: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org,
devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Cc: mturquette-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org,
linux-lFZ/pmaqli7XmaaqVzeoHQ@public.gmane.org,
robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org,
mark.rutland-5wv7dgnIgG8@public.gmane.org,
galak-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org,
kyungmin.park-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org,
sw0312.kim-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org,
m.szyprowski-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org,
t.figa-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org,
Sylwester Nawrocki
<s.nawrocki-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
Subject: Re: [PATCH RFC v1 3/3] clk: Add handling of clk parent and rate assigned from DT
Date: Thu, 20 Feb 2014 14:09:28 +0000 [thread overview]
Message-ID: <20140220140928.27132C4050F@trevor.secretlab.ca> (raw)
In-Reply-To: <1392829124-25705-4-git-send-email-s.nawrocki-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
On Wed, 19 Feb 2014 17:58:44 +0100, Sylwester Nawrocki <s.nawrocki-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> wrote:
> This function adds a notifier callback run before a driver is bound to
> its driver. It will configure parent clock and clock frequencies based
> on [clk-name]-clk-parent and [clk-name]-clk-rate' DT properties.
>
> Signed-off-by: Sylwester Nawrocki <s.nawrocki-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
> Acked-by: Kyungmin Park <kyungmin.park-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
> ---
> .../devicetree/bindings/clock/clock-bindings.txt | 24 +++++
> drivers/clk/clk.c | 92 ++++++++++++++++++++
> 2 files changed, 116 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/clock/clock-bindings.txt b/Documentation/devicetree/bindings/clock/clock-bindings.txt
> index 7c52c29..d618498 100644
> --- a/Documentation/devicetree/bindings/clock/clock-bindings.txt
> +++ b/Documentation/devicetree/bindings/clock/clock-bindings.txt
> @@ -115,3 +115,27 @@ clock signal, and a UART.
> ("pll" and "pll-switched").
> * The UART has its baud clock connected the external oscillator and its
> register clock connected to the PLL clock (the "pll-switched" signal)
> +
> +==Static initial configuration of clock parent and clock frequency==
> +
> +Some platforms require static configuration of (parts of) the clock controller
> +often determined by the board design. Such a configuration can be specified in
> +a clock consumer node through [clk-name]-clk-parent and [clk-name]-clk-rate DT
> +properties. The former should contain phandle and clock specifier of the parent
> +clock, the latter the required clock's frequency value (one cell). "clk-name"
> +should be listed in the clock-names property and a phandle and a clock specifier
> +pair corresponding to it should be present in the clocks property.
> +
> + uart@a000 {
> + compatible = "fsl,imx-uart";
> + reg = <0xa000 0x1000>;
> + ...
> + clocks = <&clkcon 0>, <&clkcon 3>;
> + clock-names = "baud", "mux";
> +
> + mux-clk-parent = <&pll 1>;
> + baud-clk-rate = <460800>;
This mixes patterns for references to clocks. Plus it requires composing
property names which is a little painful. I'd rather see a list of
tuples to match the existing pattern already in use
clocks = <&clkcon 0>, <&clkcon 3>;
clock-names = "baud", "mux";
clock-parents = <0> <&pll 1>;
clock-rates = <0> <460800>;
g.
> + };
> +
> +In this example the pll is set as parent of "mux" clock and frequency of "baud"
> +clock is specified as 460800 Hz.
> diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
> index 19f6f3f..9238e08 100644
> --- a/drivers/clk/clk.c
> +++ b/drivers/clk/clk.c
> @@ -19,6 +19,7 @@
> #include <linux/of.h>
> #include <linux/device.h>
> #include <linux/init.h>
> +#include <linux/platform_device.h>
> #include <linux/sched.h>
>
> #include "clk.h"
> @@ -2527,6 +2528,97 @@ const char *of_clk_get_parent_name(struct device_node *np, int index)
> }
> EXPORT_SYMBOL_GPL(of_clk_get_parent_name);
>
> +static void __of_clk_assigned_config_set(struct clk *clk, struct clk *pclk,
> + u32 rate)
> +{
> + int rc;
> +
> + if (rate) {
> + rc = clk_set_rate(clk, rate);
> + if (rc < 0)
> + pr_err("clk: couldn't set rate of clock %s (%d)\n",
> + __clk_get_name(clk), rc);
> + else
> + pr_debug("clk: set rate of clock %s to %u\n",
> + __clk_get_name(clk), rate);
> + }
> +
> + if (!IS_ERR(pclk)) {
> + rc = clk_set_parent(clk, pclk);
> + if (rc < 0)
> + pr_err("clk: couldn't set %s as parent of %s (%d)\n",
> + __clk_get_name(pclk), __clk_get_name(clk), rc);
> + else
> + pr_debug("clk: set %s as parent of %s\n",
> + __clk_get_name(pclk), __clk_get_name(clk));
> + }
> +}
> +
> +static void of_clk_assigned_config_parse(struct device_node *node)
> +{
> + char prop_name[OF_PROP_NAME_MAXLEN];
> + struct property *prop;
> + const char *clk_name;
> + int rc, index = 0;
> +
> + of_property_for_each_string(node, "clock-names", prop, clk_name) {
> + struct clk *clk, *pclk;
> + u32 rate = 0;
> +
> + snprintf(prop_name, OF_PROP_NAME_MAXLEN,
> + "%s-clk-parent", clk_name);
> + pclk = of_clk_get_list_entry(node, prop_name, 0);
> +
> + snprintf(prop_name, OF_PROP_NAME_MAXLEN,
> + "%s-clk-rate", clk_name);
> + rc = of_property_read_u32(node, prop_name, &rate);
> +
> + if (!rc || !IS_ERR(pclk)) {
> + /*
> + * Assuming here of_property_for_each_string() returns
> + * consecutive values of a DT property in ascending
> + * index order.
> + */
> + clk = of_clk_get(node, index);
> +
> + if (!IS_ERR(clk))
> + __of_clk_assigned_config_set(clk, pclk, rate);
> + else
> + pr_err("clk: couldn't get clk %s\n", clk_name);
> + }
> + index++;
> + }
> +}
> +
> +
> +static int of_clk_setup_notifier_call(struct notifier_block *nb,
> + unsigned long event, void *data)
> +{
> + struct device *dev = data;
> +
> + if (!dev->of_node)
> + return NOTIFY_DONE;
> +
> + switch (event) {
> + case BUS_NOTIFY_BIND_DRIVER:
> + /* Parse and configure DT assigned clock parents and rates */
> + of_clk_assigned_config_parse(dev->of_node);
> + break;
> + }
> +
> + return NOTIFY_DONE;
> +}
> +
> +static struct notifier_block of_clk_setup_nb = {
> + .notifier_call = of_clk_setup_notifier_call,
> +};
> +
> +int __init of_clk_setup_notifier_init(void)
> +{
> + return bus_register_notifier(&platform_bus_type, &of_clk_setup_nb);
> +}
> +subsys_initcall(of_clk_setup_notifier_init);
> +
> /**
> * of_clk_init() - Scan and init clock providers from the DT
> * @matches: array of compatible values and init functions for providers.
> --
> 1.7.9.5
>
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2014-02-20 14:09 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-02-19 16:58 [PATCH RFC v1 0/3] clk: Support for DT assigned clk parent and rate Sylwester Nawrocki
[not found] ` <1392829124-25705-1-git-send-email-s.nawrocki-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
2014-02-19 16:58 ` [PATCH RFC v1 1/3] clk: Add function to parse an arbitrary clocks list property Sylwester Nawrocki
[not found] ` <1392829124-25705-2-git-send-email-s.nawrocki-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
2014-02-24 0:43 ` Mike Turquette
2014-02-24 10:43 ` Sylwester Nawrocki
2014-02-19 16:58 ` [PATCH RFC v1 2/3] of: Add definition of maximum length of a property name Sylwester Nawrocki
[not found] ` <1392829124-25705-3-git-send-email-s.nawrocki-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
2014-02-19 21:42 ` Rob Herring
[not found] ` <CAL_Jsq+0pmLHC2Xo=i3kvQMo+uukraK1nRyPZReKtwE_GEaGFQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2014-02-20 15:02 ` Sylwester Nawrocki
2014-02-19 16:58 ` [PATCH RFC v1 3/3] clk: Add handling of clk parent and rate assigned from DT Sylwester Nawrocki
[not found] ` < 1392829124-25705-4-git-send-email-s.nawrocki@samsung.com>
[not found] ` <1392829124-25705-4-git-send-email-s.nawrocki-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
2014-02-20 14:09 ` Grant Likely [this message]
[not found] ` <20140220140928.27132C4050F-WNowdnHR2B42iJbIjFUEsiwD8/FfD2ys@public.gmane.org>
2014-02-21 10:38 ` Sylwester Nawrocki
[not found] ` <53072C9D.5040303-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
2014-02-24 0:48 ` Mike Turquette
2014-02-24 18:11 ` Sylwester Nawrocki
[not found] ` <530B8B46.6060003-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
2014-03-01 21:13 ` Grant Likely
2014-03-01 21:11 ` Grant Likely
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=20140220140928.27132C4050F@trevor.secretlab.ca \
--to=grant.likely-qsej5fyqhm4dnm+yrofe0a@public.gmane.org \
--cc=devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=galak-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org \
--cc=kyungmin.park-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org \
--cc=linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \
--cc=linux-lFZ/pmaqli7XmaaqVzeoHQ@public.gmane.org \
--cc=m.szyprowski-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org \
--cc=mark.rutland-5wv7dgnIgG8@public.gmane.org \
--cc=mturquette-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org \
--cc=robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
--cc=s.nawrocki-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org \
--cc=sw0312.kim-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org \
--cc=t.figa-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org \
/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;
as well as URLs for NNTP newsgroup(s).