aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Dooks <ben.dooks@codethink.co.uk>2014-02-13 13:02:49 -0500
committerMike Turquette <mturquette@linaro.org>2014-02-23 15:40:20 -0500
commit7a0fc1a3df82d29e00b4c9f88a6b37450d6711f1 (patch)
tree2489148971978cbf398fea553c8ef5773e9aa121
parent29d43ddf7355b8f93fa9b5d18a605dd8517bed71 (diff)
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>
-rw-r--r--Documentation/devicetree/bindings/clock/clock-bindings.txt17
-rw-r--r--drivers/clk/clk.c20
2 files changed, 36 insertions, 1 deletions
diff --git a/Documentation/devicetree/bindings/clock/clock-bindings.txt b/Documentation/devicetree/bindings/clock/clock-bindings.txt
index 7c52c29d99fa..700e7aac3717 100644
--- a/Documentation/devicetree/bindings/clock/clock-bindings.txt
+++ b/Documentation/devicetree/bindings/clock/clock-bindings.txt
@@ -44,6 +44,23 @@ For example:
44 clocks by index. The names should reflect the clock output signal 44 clocks by index. The names should reflect the clock output signal
45 names for the device. 45 names for the device.
46 46
47clock-indices: If the identifyng number for the clocks in the node
48 is not linear from zero, then the this mapping allows
49 the mapping of identifiers into the clock-output-names
50 array.
51
52For example, if we have two clocks <&oscillator 1> and <&oscillator 3>:
53
54 oscillator {
55 compatible = "myclocktype";
56 #clock-cells = <1>;
57 clock-indices = <1>, <3>;
58 clock-output-names = "clka", "clkb";
59 }
60
61 This ensures we do not have any empty nodes in clock-output-names
62
63
47==Clock consumers== 64==Clock consumers==
48 65
49Required properties: 66Required properties:
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
index ea2ca9ff2677..a6f079d23eaa 100644
--- a/drivers/clk/clk.c
+++ b/drivers/clk/clk.c
@@ -2496,8 +2496,12 @@ EXPORT_SYMBOL_GPL(of_clk_get_parent_count);
2496const char *of_clk_get_parent_name(struct device_node *np, int index) 2496const char *of_clk_get_parent_name(struct device_node *np, int index)
2497{ 2497{
2498 struct of_phandle_args clkspec; 2498 struct of_phandle_args clkspec;
2499 struct property *prop;
2499 const char *clk_name; 2500 const char *clk_name;
2501 const __be32 *vp;
2502 u32 pv;
2500 int rc; 2503 int rc;
2504 int count;
2501 2505
2502 if (index < 0) 2506 if (index < 0)
2503 return NULL; 2507 return NULL;
@@ -2507,8 +2511,22 @@ const char *of_clk_get_parent_name(struct device_node *np, int index)
2507 if (rc) 2511 if (rc)
2508 return NULL; 2512 return NULL;
2509 2513
2514 index = clkspec.args_count ? clkspec.args[0] : 0;
2515 count = 0;
2516
2517 /* if there is an indices property, use it to transfer the index
2518 * specified into an array offset for the clock-output-names property.
2519 */
2520 of_property_for_each_u32(clkspec.np, "clock-indices", prop, vp, pv) {
2521 if (index == pv) {
2522 index = count;
2523 break;
2524 }
2525 count++;
2526 }
2527
2510 if (of_property_read_string_index(clkspec.np, "clock-output-names", 2528 if (of_property_read_string_index(clkspec.np, "clock-output-names",
2511 clkspec.args_count ? clkspec.args[0] : 0, 2529 index,
2512 &clk_name) < 0) 2530 &clk_name) < 0)
2513 clk_name = clkspec.np->name; 2531 clk_name = clkspec.np->name;
2514 2532