[PATCHv5 02/31] CLK: TI: Add DPLL clock support
Mark Rutland
mark.rutland at arm.com
Tue Aug 13 06:50:42 EDT 2013
Hi,
On Fri, Aug 02, 2013 at 05:25:21PM +0100, Tero Kristo wrote:
> The OMAP clock driver now supports DPLL clock type. This patch also
> adds support for DT DPLL nodes.
>
> Signed-off-by: Tero Kristo <t-kristo at ti.com>
> ---
> .../devicetree/bindings/clock/ti/dpll.txt | 70 +++
> arch/arm/mach-omap2/clock.h | 144 +-----
> arch/arm/mach-omap2/clock3xxx.h | 2 -
> drivers/clk/Makefile | 1 +
> drivers/clk/ti/Makefile | 3 +
> drivers/clk/ti/dpll.c | 488 ++++++++++++++++++++
> include/linux/clk/ti.h | 164 +++++++
> 7 files changed, 727 insertions(+), 145 deletions(-)
> create mode 100644 Documentation/devicetree/bindings/clock/ti/dpll.txt
> create mode 100644 drivers/clk/ti/Makefile
> create mode 100644 drivers/clk/ti/dpll.c
> create mode 100644 include/linux/clk/ti.h
>
> diff --git a/Documentation/devicetree/bindings/clock/ti/dpll.txt b/Documentation/devicetree/bindings/clock/ti/dpll.txt
> new file mode 100644
> index 0000000..dcd6e63
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/clock/ti/dpll.txt
> @@ -0,0 +1,70 @@
> +Binding for Texas Instruments DPLL clock.
> +
> +This binding uses the common clock binding[1]. It assumes a
> +register-mapped DPLL with usually two selectable input clocks
> +(reference clock and bypass clock), with digital phase locked
> +loop logic for multiplying the input clock to a desired output
> +clock. This clock also typically supports different operation
> +modes (locked, low power stop etc.) This binding has several
> +sub-types, which effectively result in slightly different setup
> +for the actual DPLL clock.
> +
> +[1] Documentation/devicetree/bindings/clock/clock-bindings.txt
> +
> +Required properties:
> +- compatible : shall be one of:
> + "ti,omap4-dpll-x2-clock",
> + "ti,omap3-dpll-clock",
> + "ti,omap3-dpll-core-clock",
> + "ti,omap3-dpll-per-clock",
> + "ti,omap3-dpll-per-j-type-clock",
> + "ti,omap4-dpll-clock",
> + "ti,omap4-dpll-core-clock",
> + "ti,omap4-dpll-m4xen-clock",
> + "ti,omap4-dpll-j-type-clock",
> + "ti,omap4-dpll-no-gate-clock",
> + "ti,omap4-dpll-no-gate-j-type-clock",
> +
> +- #clock-cells : from common clock binding; shall be set to 0.
> +- clocks : link phandles of parent clocks (clk-ref and clk-bypass)
It might be a good idea to use clock-names to clarify which clocks are
present (I notice your examples contain only one clock input).
> +- reg : array of register base addresses for controlling the DPLL (some
> + of these can also be left as NULL):
> + reg[0] = control register
> + reg[1] = idle status register
> + reg[2] = autoidle register
> + reg[3] = multiplier / divider set register
Are all of these always present? Using reg-names seems sensible here.
> +- ti,clk-ref : link phandle for the reference clock
> +- ti,clk-bypass : link phandle for the bypass clock
You already have these in clocks, why do you need them again here?
> +
> +Optional properties:
> +- ti,modes : available modes for the DPLL
Huh? What type is that property? What does it mean?
> +- ti,recal-en-bit : recalibration enable bit
> +- ti,recal-st-bit : recalibration status bit
> +- ti,auto-recal-bit : auto recalibration enable bit
These seem rather low-level, but I see other clock bindings are doing
similar things. When are these needed, and why? What type are they?
> +- ti,clkdm-name : clockdomain name for the DPLL
Could you elaborate on what this is for? What constitutes a valid name?
I'm not sure a string is the best way to define the linkage of several
elements to a domain...
> +
> +Examples:
> + dpll_core_ck: dpll_core_ck at 44e00490 {
> + #clock-cells = <0>;
> + compatible = "ti,omap4-dpll-core-clock";
> + clocks = <&sys_clkin_ck>;
> + reg = <0x44e00490 0x4>, <0x44e0045c 0x4>, <0x0 0x4>,
> + <0x44e00468 0x4>;
> + ti,clk-ref = <&sys_clkin_ck>;
> + ti,clk-bypass = <&sys_clkin_ck>;
Huh? Why aren't these both in the clocks property?
[...]
> +static inline void __iomem *get_dt_register(struct device_node *node,
> + int index)
> +{
> + u32 val;
> +
> + of_property_read_u32_index(node, "reg", 2 * index, &val);
> + if (val)
> + return of_iomap(node, index);
> + else
> + return NULL;
NAK. Use reg-names to handle registers being optional.
[...]
> + clkspec.np = of_parse_phandle(node, "ti,clk-ref", 0);
> + dd->clk_ref = of_clk_get_from_provider(&clkspec);
> + if (IS_ERR(dd->clk_ref)) {
> + pr_err("%s: ti,clk-ref for %s not found\n", __func__,
> + clk_name);
> + goto cleanup;
> + }
> +
> + clkspec.np = of_parse_phandle(node, "ti,clk-bypass", 0);
> + dd->clk_bypass = of_clk_get_from_provider(&clkspec);
> + if (IS_ERR(dd->clk_bypass)) {
> + pr_err("%s: ti,clk-bypass for %s not found\n", __func__,
> + clk_name);
> + goto cleanup;
> + }
You can get these from the standard clocks property. Don't do this.
Look at of_clk_get_by_name().
Thanks,
Mark.
More information about the linux-arm-kernel
mailing list