| From 1dbdf65c300903355ac70b6f22b5d2259f7ae995 Mon Sep 17 00:00:00 2001 |
| From: Ben Dooks <ben.dooks@codethink.co.uk> |
| Date: Thu, 13 Feb 2014 18:02:49 +0000 |
| Subject: clk: add clock-indices support |
| |
| Add a property called clock-indices to allow clock-output-names |
| to be used where the index used to lookup a clock is not a 1:1 |
| mapping to the array position in the clock-output-names |
| |
| Signed-off-by: Ben Dooks <ben.dooks@codethink.co.uk> |
| Signed-off-by: Mike Turquette <mturquette@linaro.org> |
| (cherry picked from commit 7a0fc1a3df82d29e00b4c9f88a6b37450d6711f1) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| Documentation/devicetree/bindings/clock/clock-bindings.txt | 17 +++++++++++ |
| drivers/clk/clk.c | 20 ++++++++++++- |
| 2 files changed, 36 insertions(+), 1 deletion(-) |
| |
| --- a/Documentation/devicetree/bindings/clock/clock-bindings.txt |
| +++ b/Documentation/devicetree/bindings/clock/clock-bindings.txt |
| @@ -44,6 +44,23 @@ For example: |
| clocks by index. The names should reflect the clock output signal |
| names for the device. |
| |
| +clock-indices: If the identifyng number for the clocks in the node |
| + is not linear from zero, then the this mapping allows |
| + the mapping of identifiers into the clock-output-names |
| + array. |
| + |
| +For example, if we have two clocks <&oscillator 1> and <&oscillator 3>: |
| + |
| + oscillator { |
| + compatible = "myclocktype"; |
| + #clock-cells = <1>; |
| + clock-indices = <1>, <3>; |
| + clock-output-names = "clka", "clkb"; |
| + } |
| + |
| + This ensures we do not have any empty nodes in clock-output-names |
| + |
| + |
| ==Clock consumers== |
| |
| Required properties: |
| --- a/drivers/clk/clk.c |
| +++ b/drivers/clk/clk.c |
| @@ -2501,8 +2501,12 @@ EXPORT_SYMBOL_GPL(of_clk_get_parent_coun |
| const char *of_clk_get_parent_name(struct device_node *np, int index) |
| { |
| struct of_phandle_args clkspec; |
| + struct property *prop; |
| const char *clk_name; |
| + const __be32 *vp; |
| + u32 pv; |
| int rc; |
| + int count; |
| |
| if (index < 0) |
| return NULL; |
| @@ -2512,8 +2516,22 @@ const char *of_clk_get_parent_name(struc |
| if (rc) |
| return NULL; |
| |
| + index = clkspec.args_count ? clkspec.args[0] : 0; |
| + count = 0; |
| + |
| + /* if there is an indices property, use it to transfer the index |
| + * specified into an array offset for the clock-output-names property. |
| + */ |
| + of_property_for_each_u32(clkspec.np, "clock-indices", prop, vp, pv) { |
| + if (index == pv) { |
| + index = count; |
| + break; |
| + } |
| + count++; |
| + } |
| + |
| if (of_property_read_string_index(clkspec.np, "clock-output-names", |
| - clkspec.args_count ? clkspec.args[0] : 0, |
| + index, |
| &clk_name) < 0) |
| clk_name = clkspec.np->name; |
| |