]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
clk: mxs: replace imx23 clk_register_clkdev with clock DT lookup
authorShawn Guo <shawn.guo@linaro.org>
Wed, 22 Aug 2012 13:36:30 +0000 (21:36 +0800)
committerShawn Guo <shawn.guo@linaro.org>
Tue, 11 Sep 2012 06:45:46 +0000 (14:45 +0800)
It really becomes a maintenance issue that every time a device needs
to look up (clk_get) a clock we have to patch kernel clock file to call
clk_register_clkdev for that clock.

Since clock DT support which is meant to resolve clock lookup in device
tree is in place, the patch moves imx23 client devices' clock lookup
over to device tree, so that any new lookup to be added at later time
can just get done in DT instead of kernel.

Signed-off-by: Shawn Guo <shawn.guo@linaro.org>
Documentation/devicetree/bindings/clock/imx23-clock.txt [new file with mode: 0644]
arch/arm/boot/dts/imx23.dtsi
drivers/clk/mxs/clk-imx23.c

diff --git a/Documentation/devicetree/bindings/clock/imx23-clock.txt b/Documentation/devicetree/bindings/clock/imx23-clock.txt
new file mode 100644 (file)
index 0000000..a0b867e
--- /dev/null
@@ -0,0 +1,76 @@
+* Clock bindings for Freescale i.MX23
+
+Required properties:
+- compatible: Should be "fsl,imx23-clkctrl"
+- reg: Address and length of the register set
+- #clock-cells: Should be <1>
+
+The clock consumer should specify the desired clock by having the clock
+ID in its "clocks" phandle cell.  The following is a full list of i.MX23
+clocks and IDs.
+
+       Clock           ID
+       ------------------
+       ref_xtal        0
+       pll             1
+       ref_cpu         2
+       ref_emi         3
+       ref_pix         4
+       ref_io          5
+       saif_sel        6
+       lcdif_sel       7
+       gpmi_sel        8
+       ssp_sel         9
+       emi_sel         10
+       cpu             11
+       etm_sel         12
+       cpu_pll         13
+       cpu_xtal        14
+       hbus            15
+       xbus            16
+       lcdif_div       17
+       ssp_div         18
+       gpmi_div        19
+       emi_pll         20
+       emi_xtal        21
+       etm_div         22
+       saif_div        23
+       clk32k_div      24
+       rtc             25
+       adc             26
+       spdif_div       27
+       clk32k          28
+       dri             29
+       pwm             30
+       filt            31
+       uart            32
+       ssp             33
+       gpmi            34
+       spdif           35
+       emi             36
+       saif            37
+       lcdif           38
+       etm             39
+       usb             40
+       usb_pwr         41
+
+Examples:
+
+clks: clkctrl@80040000 {
+       compatible = "fsl,imx23-clkctrl";
+       reg = <0x80040000 0x2000>;
+       #clock-cells = <1>;
+       clock-output-names =
+               ...
+               "uart",         /* 32 */
+               ...
+               "end_of_list";
+};
+
+auart0: serial@8006c000 {
+       compatible = "fsl,imx23-auart";
+       reg = <0x8006c000 0x2000>;
+       interrupts = <24 25 23>;
+       clocks = <&clks 32>;
+       status = "disabled";
+};
index b00f3cfb3bf8c1b7d0fabb728cb502e5e783a3fb..9d0e803e3ecae9d7e6e500cefe208fb045e22514 100644 (file)
@@ -52,6 +52,7 @@
                        dma-apbh@80004000 {
                                compatible = "fsl,imx23-dma-apbh";
                                reg = <0x80004000 0x2000>;
+                               clocks = <&clks 15>;
                        };
 
                        ecc@80008000 {
@@ -67,6 +68,7 @@
                                reg-names = "gpmi-nand", "bch";
                                interrupts = <13>, <56>;
                                interrupt-names = "gpmi-dma", "bch";
+                               clocks = <&clks 34>;
                                fsl,gpmi-dma-channel = <4>;
                                status = "disabled";
                        };
@@ -74,6 +76,7 @@
                        ssp0: ssp@80010000 {
                                reg = <0x80010000 0x2000>;
                                interrupts = <15 14>;
+                               clocks = <&clks 33>;
                                fsl,ssp-dma-channel = <1>;
                                status = "disabled";
                        };
                        dma-apbx@80024000 {
                                compatible = "fsl,imx23-dma-apbx";
                                reg = <0x80024000 0x2000>;
+                               clocks = <&clks 16>;
                        };
 
                        dcp@80028000 {
                                compatible = "fsl,imx23-lcdif";
                                reg = <0x80030000 2000>;
                                interrupts = <46 45>;
+                               clocks = <&clks 38>;
                                status = "disabled";
                        };
 
                        ssp1: ssp@80034000 {
                                reg = <0x80034000 0x2000>;
                                interrupts = <2 20>;
+                               clocks = <&clks 33>;
                                fsl,ssp-dma-channel = <2>;
                                status = "disabled";
                        };
                        reg = <0x80040000 0x40000>;
                        ranges;
 
-                       clkctl@80040000 {
+                       clks: clkctrl@80040000 {
+                               compatible = "fsl,imx23-clkctrl";
                                reg = <0x80040000 0x2000>;
-                               status = "disabled";
+                               #clock-cells = <1>;
                        };
 
                        saif0: saif@80042000 {
                        pwm: pwm@80064000 {
                                compatible = "fsl,imx23-pwm";
                                reg = <0x80064000 0x2000>;
+                               clocks = <&clks 30>;
                                #pwm-cells = <2>;
                                fsl,pwm-number = <5>;
                                status = "disabled";
                                compatible = "fsl,imx23-auart";
                                reg = <0x8006c000 0x2000>;
                                interrupts = <24 25 23>;
+                               clocks = <&clks 32>;
                                status = "disabled";
                        };
 
                                compatible = "fsl,imx23-auart";
                                reg = <0x8006e000 0x2000>;
                                interrupts = <59 60 58>;
+                               clocks = <&clks 32>;
                                status = "disabled";
                        };
 
                                compatible = "arm,pl011", "arm,primecell";
                                reg = <0x80070000 0x2000>;
                                interrupts = <0>;
+                               clocks = <&clks 32>, <&clks 16>;
+                               clock-names = "uart", "apb_pclk";
                                status = "disabled";
                        };
 
index 844043ad0fe44c7b18dfee9ce05abc4218fc2f8d..9f6d15546cbe95a12a9ceb45e28139a0ae46952d 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/err.h>
 #include <linux/init.h>
 #include <linux/io.h>
+#include <linux/of.h>
 #include <mach/common.h>
 #include <mach/mx23.h>
 #include "clk.h"
@@ -71,44 +72,6 @@ static void __init clk_misc_init(void)
        __mxs_setl(30 << BP_FRAC_IOFRAC, FRAC);
 }
 
-static struct clk_lookup uart_lookups[] = {
-       { .dev_id = "duart", },
-       { .dev_id = "mxs-auart.0", },
-       { .dev_id = "mxs-auart.1", },
-       { .dev_id = "8006c000.serial", },
-       { .dev_id = "8006e000.serial", },
-       { .dev_id = "80070000.serial", },
-};
-
-static struct clk_lookup hbus_lookups[] = {
-       { .dev_id = "imx23-dma-apbh", },
-       { .dev_id = "80004000.dma-apbh", },
-};
-
-static struct clk_lookup xbus_lookups[] = {
-       { .dev_id = "duart", .con_id = "apb_pclk"},
-       { .dev_id = "80070000.serial", .con_id = "apb_pclk"},
-       { .dev_id = "imx23-dma-apbx", },
-       { .dev_id = "80024000.dma-apbx", },
-};
-
-static struct clk_lookup ssp_lookups[] = {
-       { .dev_id = "imx23-mmc.0", },
-       { .dev_id = "imx23-mmc.1", },
-       { .dev_id = "80010000.ssp", },
-       { .dev_id = "80034000.ssp", },
-};
-
-static struct clk_lookup lcdif_lookups[] = {
-       { .dev_id = "imx23-fb", },
-       { .dev_id = "80030000.lcdif", },
-};
-
-static struct clk_lookup gpmi_lookups[] = {
-       { .dev_id = "imx23-gpmi-nand", },
-       { .dev_id = "8000c000.gpmi-nand", },
-};
-
 static const char *sel_pll[]  __initconst = { "pll", "ref_xtal", };
 static const char *sel_cpu[]  __initconst = { "ref_cpu", "ref_xtal", };
 static const char *sel_pix[]  __initconst = { "ref_pix", "ref_xtal", };
@@ -127,6 +90,7 @@ enum imx23_clk {
 };
 
 static struct clk *clks[clk_max];
+static struct clk_onecell_data clk_data;
 
 static enum imx23_clk clks_init_on[] __initdata = {
        cpu, hbus, xbus, emi, uart,
@@ -134,6 +98,7 @@ static enum imx23_clk clks_init_on[] __initdata = {
 
 int __init mx23_clocks_init(void)
 {
+       struct device_node *np;
        int i;
 
        clk_misc_init();
@@ -188,14 +153,14 @@ int __init mx23_clocks_init(void)
                        return PTR_ERR(clks[i]);
                }
 
+       np = of_find_compatible_node(NULL, NULL, "fsl,imx23-clkctrl");
+       if (np) {
+               clk_data.clks = clks;
+               clk_data.clk_num = ARRAY_SIZE(clks);
+               of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
+       }
+
        clk_register_clkdev(clks[clk32k], NULL, "timrot");
-       clk_register_clkdev(clks[pwm], NULL, "80064000.pwm");
-       clk_register_clkdevs(clks[hbus], hbus_lookups, ARRAY_SIZE(hbus_lookups));
-       clk_register_clkdevs(clks[xbus], xbus_lookups, ARRAY_SIZE(xbus_lookups));
-       clk_register_clkdevs(clks[uart], uart_lookups, ARRAY_SIZE(uart_lookups));
-       clk_register_clkdevs(clks[ssp], ssp_lookups, ARRAY_SIZE(ssp_lookups));
-       clk_register_clkdevs(clks[gpmi], gpmi_lookups, ARRAY_SIZE(gpmi_lookups));
-       clk_register_clkdevs(clks[lcdif], lcdif_lookups, ARRAY_SIZE(lcdif_lookups));
 
        for (i = 0; i < ARRAY_SIZE(clks_init_on); i++)
                clk_prepare_enable(clks[clks_init_on[i]]);