Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

CLK: TI: add support for clockdomain binding

Some OMAP clocks require knowledge about their parent clockdomain for
book keeping purposes. This patch creates a new DT binding for TI
clockdomains, which act as a collection of device clocks. Clockdomain
itself is rather misleading name for the hardware functionality, as at
least on OMAP4 / OMAP5 / DRA7 the clockdomains can be collections of either
clocks and/or IP blocks, thus idle-domain or such might be more appropriate.
For most cases on these SoCs, the kernel doesn't even need the information
and the mappings can be ignored.

Signed-off-by: Tero Kristo <t-kristo@ti.com>
Acked-by: Tony Lindgren <tony@atomide.com>
Signed-off-by: Mike Turquette <mturquette@linaro.org>

authored by

Tero Kristo and committed by
Mike Turquette
3cd4a596 f60b1ea5

+96 -1
+24
Documentation/devicetree/bindings/clock/ti/clockdomain.txt
··· 1 + Binding for Texas Instruments clockdomain. 2 + 3 + Binding status: Unstable - ABI compatibility may be broken in the future 4 + 5 + This binding uses the common clock binding[1] in consumer role. 6 + Every clock on TI SoC belongs to one clockdomain, but software 7 + only needs this information for specific clocks which require 8 + their parent clockdomain to be controlled when the clock is 9 + enabled/disabled. This binding doesn't define a new clock 10 + binding type, it is used to group existing clock nodes under 11 + hardware hierarchy. 12 + 13 + [1] Documentation/devicetree/bindings/clock/clock-bindings.txt 14 + 15 + Required properties: 16 + - compatible : shall be "ti,clockdomain" 17 + - #clock-cells : from common clock binding; shall be set to 0. 18 + - clocks : link phandles of clocks within this domain 19 + 20 + Examples: 21 + dss_clkdm: dss_clkdm { 22 + compatible = "ti,clockdomain"; 23 + clocks = <&dss1_alwon_fck_3430es2>, <&dss_ick_3430es2>; 24 + };
+1 -1
drivers/clk/ti/Makefile
··· 1 1 ifneq ($(CONFIG_OF),) 2 - obj-y += clk.o autoidle.o 2 + obj-y += clk.o autoidle.o clockdomain.o 3 3 clk-common = dpll.o composite.o divider.o gate.o \ 4 4 fixed-factor.o 5 5 endif
+70
drivers/clk/ti/clockdomain.c
··· 1 + /* 2 + * OMAP clockdomain support 3 + * 4 + * Copyright (C) 2013 Texas Instruments, Inc. 5 + * 6 + * Tero Kristo <t-kristo@ti.com> 7 + * 8 + * This program is free software; you can redistribute it and/or modify 9 + * it under the terms of the GNU General Public License version 2 as 10 + * published by the Free Software Foundation. 11 + * 12 + * This program is distributed "as is" WITHOUT ANY WARRANTY of any 13 + * kind, whether express or implied; without even the implied warranty 14 + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 + * GNU General Public License for more details. 16 + */ 17 + 18 + #include <linux/clk-provider.h> 19 + #include <linux/slab.h> 20 + #include <linux/of.h> 21 + #include <linux/of_address.h> 22 + #include <linux/clk/ti.h> 23 + 24 + #undef pr_fmt 25 + #define pr_fmt(fmt) "%s: " fmt, __func__ 26 + 27 + static void __init of_ti_clockdomain_setup(struct device_node *node) 28 + { 29 + struct clk *clk; 30 + struct clk_hw *clk_hw; 31 + const char *clkdm_name = node->name; 32 + int i; 33 + int num_clks; 34 + 35 + num_clks = of_count_phandle_with_args(node, "clocks", "#clock-cells"); 36 + 37 + for (i = 0; i < num_clks; i++) { 38 + clk = of_clk_get(node, i); 39 + if (__clk_get_flags(clk) & CLK_IS_BASIC) { 40 + pr_warn("can't setup clkdm for basic clk %s\n", 41 + __clk_get_name(clk)); 42 + continue; 43 + } 44 + clk_hw = __clk_get_hw(clk); 45 + to_clk_hw_omap(clk_hw)->clkdm_name = clkdm_name; 46 + omap2_init_clk_clkdm(clk_hw); 47 + } 48 + } 49 + 50 + static struct of_device_id ti_clkdm_match_table[] __initdata = { 51 + { .compatible = "ti,clockdomain" }, 52 + { } 53 + }; 54 + 55 + /** 56 + * ti_dt_clockdomains_setup - setup device tree clockdomains 57 + * 58 + * Initializes clockdomain nodes for a SoC. This parses through all the 59 + * nodes with compatible = "ti,clockdomain", and add the clockdomain 60 + * info for all the clocks listed under these. This function shall be 61 + * called after rest of the DT clock init has completed and all 62 + * clock nodes have been registered. 63 + */ 64 + void __init ti_dt_clockdomains_setup(void) 65 + { 66 + struct device_node *np; 67 + for_each_matching_node(np, ti_clkdm_match_table) { 68 + of_ti_clockdomain_setup(np); 69 + } 70 + }
+1
include/linux/clk/ti.h
··· 255 255 void __iomem *ti_clk_get_reg_addr(struct device_node *node, int index); 256 256 void ti_dt_clocks_register(struct ti_dt_clk *oclks); 257 257 void ti_dt_clk_init_provider(struct device_node *np, int index); 258 + void ti_dt_clockdomains_setup(void); 258 259 int ti_clk_retry_init(struct device_node *node, struct clk_hw *hw, 259 260 ti_of_clk_init_cb_t func); 260 261 int of_ti_clk_autoidle_setup(struct device_node *node);