diff options
author | Ben Dooks <ben.dooks@codethink.co.uk> | 2014-02-13 13:02:49 -0500 |
---|---|---|
committer | Mike Turquette <mturquette@linaro.org> | 2014-02-23 15:40:20 -0500 |
commit | 7a0fc1a3df82d29e00b4c9f88a6b37450d6711f1 (patch) | |
tree | 2489148971978cbf398fea553c8ef5773e9aa121 | |
parent | 29d43ddf7355b8f93fa9b5d18a605dd8517bed71 (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.txt | 17 | ||||
-rw-r--r-- | drivers/clk/clk.c | 20 |
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 | ||
47 | clock-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 | |||
52 | For 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 | ||
49 | Required properties: | 66 | Required 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); | |||
2496 | const char *of_clk_get_parent_name(struct device_node *np, int index) | 2496 | const 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 | ||