aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/devicetree/bindings/clock/imx23-clock.txt76
-rw-r--r--Documentation/devicetree/bindings/clock/imx28-clock.txt99
-rw-r--r--arch/arm/boot/dts/imx23.dtsi16
-rw-r--r--arch/arm/boot/dts/imx28.dtsi35
-rw-r--r--drivers/clk/mxs/clk-imx23.c55
-rw-r--r--drivers/clk/mxs/clk-imx28.c113
6 files changed, 242 insertions, 152 deletions
diff --git a/Documentation/devicetree/bindings/clock/imx23-clock.txt b/Documentation/devicetree/bindings/clock/imx23-clock.txt
new file mode 100644
index 000000000000..a0b867ef8d96
--- /dev/null
+++ b/Documentation/devicetree/bindings/clock/imx23-clock.txt
@@ -0,0 +1,76 @@
1* Clock bindings for Freescale i.MX23
2
3Required properties:
4- compatible: Should be "fsl,imx23-clkctrl"
5- reg: Address and length of the register set
6- #clock-cells: Should be <1>
7
8The clock consumer should specify the desired clock by having the clock
9ID in its "clocks" phandle cell. The following is a full list of i.MX23
10clocks and IDs.
11
12 Clock ID
13 ------------------
14 ref_xtal 0
15 pll 1
16 ref_cpu 2
17 ref_emi 3
18 ref_pix 4
19 ref_io 5
20 saif_sel 6
21 lcdif_sel 7
22 gpmi_sel 8
23 ssp_sel 9
24 emi_sel 10
25 cpu 11
26 etm_sel 12
27 cpu_pll 13
28 cpu_xtal 14
29 hbus 15
30 xbus 16
31 lcdif_div 17
32 ssp_div 18
33 gpmi_div 19
34 emi_pll 20
35 emi_xtal 21
36 etm_div 22
37 saif_div 23
38 clk32k_div 24
39 rtc 25
40 adc 26
41 spdif_div 27
42 clk32k 28
43 dri 29
44 pwm 30
45 filt 31
46 uart 32
47 ssp 33
48 gpmi 34
49 spdif 35
50 emi 36
51 saif 37
52 lcdif 38
53 etm 39
54 usb 40
55 usb_pwr 41
56
57Examples:
58
59clks: clkctrl@80040000 {
60 compatible = "fsl,imx23-clkctrl";
61 reg = <0x80040000 0x2000>;
62 #clock-cells = <1>;
63 clock-output-names =
64 ...
65 "uart", /* 32 */
66 ...
67 "end_of_list";
68};
69
70auart0: serial@8006c000 {
71 compatible = "fsl,imx23-auart";
72 reg = <0x8006c000 0x2000>;
73 interrupts = <24 25 23>;
74 clocks = <&clks 32>;
75 status = "disabled";
76};
diff --git a/Documentation/devicetree/bindings/clock/imx28-clock.txt b/Documentation/devicetree/bindings/clock/imx28-clock.txt
new file mode 100644
index 000000000000..aa2af2866fe8
--- /dev/null
+++ b/Documentation/devicetree/bindings/clock/imx28-clock.txt
@@ -0,0 +1,99 @@
1* Clock bindings for Freescale i.MX28
2
3Required properties:
4- compatible: Should be "fsl,imx28-clkctrl"
5- reg: Address and length of the register set
6- #clock-cells: Should be <1>
7
8The clock consumer should specify the desired clock by having the clock
9ID in its "clocks" phandle cell. The following is a full list of i.MX28
10clocks and IDs.
11
12 Clock ID
13 ------------------
14 ref_xtal 0
15 pll0 1
16 pll1 2
17 pll2 3
18 ref_cpu 4
19 ref_emi 5
20 ref_io0 6
21 ref_io1 7
22 ref_pix 8
23 ref_hsadc 9
24 ref_gpmi 10
25 saif0_sel 11
26 saif1_sel 12
27 gpmi_sel 13
28 ssp0_sel 14
29 ssp1_sel 15
30 ssp2_sel 16
31 ssp3_sel 17
32 emi_sel 18
33 etm_sel 19
34 lcdif_sel 20
35 cpu 21
36 ptp_sel 22
37 cpu_pll 23
38 cpu_xtal 24
39 hbus 25
40 xbus 26
41 ssp0_div 27
42 ssp1_div 28
43 ssp2_div 29
44 ssp3_div 30
45 gpmi_div 31
46 emi_pll 32
47 emi_xtal 33
48 lcdif_div 34
49 etm_div 35
50 ptp 36
51 saif0_div 37
52 saif1_div 38
53 clk32k_div 39
54 rtc 40
55 lradc 41
56 spdif_div 42
57 clk32k 43
58 pwm 44
59 uart 45
60 ssp0 46
61 ssp1 47
62 ssp2 48
63 ssp3 49
64 gpmi 50
65 spdif 51
66 emi 52
67 saif0 53
68 saif1 54
69 lcdif 55
70 etm 56
71 fec 57
72 can0 58
73 can1 59
74 usb0 60
75 usb1 61
76 usb0_pwr 62
77 usb1_pwr 63
78 enet_out 64
79
80Examples:
81
82clks: clkctrl@80040000 {
83 compatible = "fsl,imx28-clkctrl";
84 reg = <0x80040000 0x2000>;
85 #clock-cells = <1>;
86 clock-output-names =
87 ...
88 "uart", /* 45 */
89 ...
90 "end_of_list";
91};
92
93auart0: serial@8006a000 {
94 compatible = "fsl,imx28-auart", "fsl,imx23-auart";
95 reg = <0x8006a000 0x2000>;
96 interrupts = <112 70 71>;
97 clocks = <&clks 45>;
98 status = "disabled";
99};
diff --git a/arch/arm/boot/dts/imx23.dtsi b/arch/arm/boot/dts/imx23.dtsi
index b00f3cfb3bf8..9d0e803e3eca 100644
--- a/arch/arm/boot/dts/imx23.dtsi
+++ b/arch/arm/boot/dts/imx23.dtsi
@@ -52,6 +52,7 @@
52 dma-apbh@80004000 { 52 dma-apbh@80004000 {
53 compatible = "fsl,imx23-dma-apbh"; 53 compatible = "fsl,imx23-dma-apbh";
54 reg = <0x80004000 0x2000>; 54 reg = <0x80004000 0x2000>;
55 clocks = <&clks 15>;
55 }; 56 };
56 57
57 ecc@80008000 { 58 ecc@80008000 {
@@ -67,6 +68,7 @@
67 reg-names = "gpmi-nand", "bch"; 68 reg-names = "gpmi-nand", "bch";
68 interrupts = <13>, <56>; 69 interrupts = <13>, <56>;
69 interrupt-names = "gpmi-dma", "bch"; 70 interrupt-names = "gpmi-dma", "bch";
71 clocks = <&clks 34>;
70 fsl,gpmi-dma-channel = <4>; 72 fsl,gpmi-dma-channel = <4>;
71 status = "disabled"; 73 status = "disabled";
72 }; 74 };
@@ -74,6 +76,7 @@
74 ssp0: ssp@80010000 { 76 ssp0: ssp@80010000 {
75 reg = <0x80010000 0x2000>; 77 reg = <0x80010000 0x2000>;
76 interrupts = <15 14>; 78 interrupts = <15 14>;
79 clocks = <&clks 33>;
77 fsl,ssp-dma-channel = <1>; 80 fsl,ssp-dma-channel = <1>;
78 status = "disabled"; 81 status = "disabled";
79 }; 82 };
@@ -290,6 +293,7 @@
290 dma-apbx@80024000 { 293 dma-apbx@80024000 {
291 compatible = "fsl,imx23-dma-apbx"; 294 compatible = "fsl,imx23-dma-apbx";
292 reg = <0x80024000 0x2000>; 295 reg = <0x80024000 0x2000>;
296 clocks = <&clks 16>;
293 }; 297 };
294 298
295 dcp@80028000 { 299 dcp@80028000 {
@@ -316,12 +320,14 @@
316 compatible = "fsl,imx23-lcdif"; 320 compatible = "fsl,imx23-lcdif";
317 reg = <0x80030000 2000>; 321 reg = <0x80030000 2000>;
318 interrupts = <46 45>; 322 interrupts = <46 45>;
323 clocks = <&clks 38>;
319 status = "disabled"; 324 status = "disabled";
320 }; 325 };
321 326
322 ssp1: ssp@80034000 { 327 ssp1: ssp@80034000 {
323 reg = <0x80034000 0x2000>; 328 reg = <0x80034000 0x2000>;
324 interrupts = <2 20>; 329 interrupts = <2 20>;
330 clocks = <&clks 33>;
325 fsl,ssp-dma-channel = <2>; 331 fsl,ssp-dma-channel = <2>;
326 status = "disabled"; 332 status = "disabled";
327 }; 333 };
@@ -339,9 +345,10 @@
339 reg = <0x80040000 0x40000>; 345 reg = <0x80040000 0x40000>;
340 ranges; 346 ranges;
341 347
342 clkctl@80040000 { 348 clks: clkctrl@80040000 {
349 compatible = "fsl,imx23-clkctrl";
343 reg = <0x80040000 0x2000>; 350 reg = <0x80040000 0x2000>;
344 status = "disabled"; 351 #clock-cells = <1>;
345 }; 352 };
346 353
347 saif0: saif@80042000 { 354 saif0: saif@80042000 {
@@ -393,6 +400,7 @@
393 pwm: pwm@80064000 { 400 pwm: pwm@80064000 {
394 compatible = "fsl,imx23-pwm"; 401 compatible = "fsl,imx23-pwm";
395 reg = <0x80064000 0x2000>; 402 reg = <0x80064000 0x2000>;
403 clocks = <&clks 30>;
396 #pwm-cells = <2>; 404 #pwm-cells = <2>;
397 fsl,pwm-number = <5>; 405 fsl,pwm-number = <5>;
398 status = "disabled"; 406 status = "disabled";
@@ -407,6 +415,7 @@
407 compatible = "fsl,imx23-auart"; 415 compatible = "fsl,imx23-auart";
408 reg = <0x8006c000 0x2000>; 416 reg = <0x8006c000 0x2000>;
409 interrupts = <24 25 23>; 417 interrupts = <24 25 23>;
418 clocks = <&clks 32>;
410 status = "disabled"; 419 status = "disabled";
411 }; 420 };
412 421
@@ -414,6 +423,7 @@
414 compatible = "fsl,imx23-auart"; 423 compatible = "fsl,imx23-auart";
415 reg = <0x8006e000 0x2000>; 424 reg = <0x8006e000 0x2000>;
416 interrupts = <59 60 58>; 425 interrupts = <59 60 58>;
426 clocks = <&clks 32>;
417 status = "disabled"; 427 status = "disabled";
418 }; 428 };
419 429
@@ -421,6 +431,8 @@
421 compatible = "arm,pl011", "arm,primecell"; 431 compatible = "arm,pl011", "arm,primecell";
422 reg = <0x80070000 0x2000>; 432 reg = <0x80070000 0x2000>;
423 interrupts = <0>; 433 interrupts = <0>;
434 clocks = <&clks 32>, <&clks 16>;
435 clock-names = "uart", "apb_pclk";
424 status = "disabled"; 436 status = "disabled";
425 }; 437 };
426 438
diff --git a/arch/arm/boot/dts/imx28.dtsi b/arch/arm/boot/dts/imx28.dtsi
index 96fe74e4935c..03e0fef8e7a7 100644
--- a/arch/arm/boot/dts/imx28.dtsi
+++ b/arch/arm/boot/dts/imx28.dtsi
@@ -65,6 +65,7 @@
65 dma-apbh@80004000 { 65 dma-apbh@80004000 {
66 compatible = "fsl,imx28-dma-apbh"; 66 compatible = "fsl,imx28-dma-apbh";
67 reg = <0x80004000 0x2000>; 67 reg = <0x80004000 0x2000>;
68 clocks = <&clks 25>;
68 }; 69 };
69 70
70 perfmon@80006000 { 71 perfmon@80006000 {
@@ -81,6 +82,7 @@
81 reg-names = "gpmi-nand", "bch"; 82 reg-names = "gpmi-nand", "bch";
82 interrupts = <88>, <41>; 83 interrupts = <88>, <41>;
83 interrupt-names = "gpmi-dma", "bch"; 84 interrupt-names = "gpmi-dma", "bch";
85 clocks = <&clks 50>;
84 fsl,gpmi-dma-channel = <4>; 86 fsl,gpmi-dma-channel = <4>;
85 status = "disabled"; 87 status = "disabled";
86 }; 88 };
@@ -90,6 +92,7 @@
90 #size-cells = <0>; 92 #size-cells = <0>;
91 reg = <0x80010000 0x2000>; 93 reg = <0x80010000 0x2000>;
92 interrupts = <96 82>; 94 interrupts = <96 82>;
95 clocks = <&clks 46>;
93 fsl,ssp-dma-channel = <0>; 96 fsl,ssp-dma-channel = <0>;
94 status = "disabled"; 97 status = "disabled";
95 }; 98 };
@@ -99,6 +102,7 @@
99 #size-cells = <0>; 102 #size-cells = <0>;
100 reg = <0x80012000 0x2000>; 103 reg = <0x80012000 0x2000>;
101 interrupts = <97 83>; 104 interrupts = <97 83>;
105 clocks = <&clks 47>;
102 fsl,ssp-dma-channel = <1>; 106 fsl,ssp-dma-channel = <1>;
103 status = "disabled"; 107 status = "disabled";
104 }; 108 };
@@ -108,6 +112,7 @@
108 #size-cells = <0>; 112 #size-cells = <0>;
109 reg = <0x80014000 0x2000>; 113 reg = <0x80014000 0x2000>;
110 interrupts = <98 84>; 114 interrupts = <98 84>;
115 clocks = <&clks 48>;
111 fsl,ssp-dma-channel = <2>; 116 fsl,ssp-dma-channel = <2>;
112 status = "disabled"; 117 status = "disabled";
113 }; 118 };
@@ -117,6 +122,7 @@
117 #size-cells = <0>; 122 #size-cells = <0>;
118 reg = <0x80016000 0x2000>; 123 reg = <0x80016000 0x2000>;
119 interrupts = <99 85>; 124 interrupts = <99 85>;
125 clocks = <&clks 49>;
120 fsl,ssp-dma-channel = <3>; 126 fsl,ssp-dma-channel = <3>;
121 status = "disabled"; 127 status = "disabled";
122 }; 128 };
@@ -606,6 +612,7 @@
606 dma-apbx@80024000 { 612 dma-apbx@80024000 {
607 compatible = "fsl,imx28-dma-apbx"; 613 compatible = "fsl,imx28-dma-apbx";
608 reg = <0x80024000 0x2000>; 614 reg = <0x80024000 0x2000>;
615 clocks = <&clks 26>;
609 }; 616 };
610 617
611 dcp@80028000 { 618 dcp@80028000 {
@@ -634,6 +641,7 @@
634 compatible = "fsl,imx28-lcdif"; 641 compatible = "fsl,imx28-lcdif";
635 reg = <0x80030000 0x2000>; 642 reg = <0x80030000 0x2000>;
636 interrupts = <38 86>; 643 interrupts = <38 86>;
644 clocks = <&clks 55>;
637 status = "disabled"; 645 status = "disabled";
638 }; 646 };
639 647
@@ -641,6 +649,8 @@
641 compatible = "fsl,imx28-flexcan", "fsl,p1010-flexcan"; 649 compatible = "fsl,imx28-flexcan", "fsl,p1010-flexcan";
642 reg = <0x80032000 0x2000>; 650 reg = <0x80032000 0x2000>;
643 interrupts = <8>; 651 interrupts = <8>;
652 clocks = <&clks 58>, <&clks 58>;
653 clock-names = "ipg", "per";
644 status = "disabled"; 654 status = "disabled";
645 }; 655 };
646 656
@@ -648,6 +658,8 @@
648 compatible = "fsl,imx28-flexcan", "fsl,p1010-flexcan"; 658 compatible = "fsl,imx28-flexcan", "fsl,p1010-flexcan";
649 reg = <0x80034000 0x2000>; 659 reg = <0x80034000 0x2000>;
650 interrupts = <9>; 660 interrupts = <9>;
661 clocks = <&clks 59>, <&clks 59>;
662 clock-names = "ipg", "per";
651 status = "disabled"; 663 status = "disabled";
652 }; 664 };
653 665
@@ -694,15 +706,17 @@
694 reg = <0x80040000 0x40000>; 706 reg = <0x80040000 0x40000>;
695 ranges; 707 ranges;
696 708
697 clkctl@80040000 { 709 clks: clkctrl@80040000 {
710 compatible = "fsl,imx28-clkctrl";
698 reg = <0x80040000 0x2000>; 711 reg = <0x80040000 0x2000>;
699 status = "disabled"; 712 #clock-cells = <1>;
700 }; 713 };
701 714
702 saif0: saif@80042000 { 715 saif0: saif@80042000 {
703 compatible = "fsl,imx28-saif"; 716 compatible = "fsl,imx28-saif";
704 reg = <0x80042000 0x2000>; 717 reg = <0x80042000 0x2000>;
705 interrupts = <59 80>; 718 interrupts = <59 80>;
719 clocks = <&clks 53>;
706 fsl,saif-dma-channel = <4>; 720 fsl,saif-dma-channel = <4>;
707 status = "disabled"; 721 status = "disabled";
708 }; 722 };
@@ -716,6 +730,7 @@
716 compatible = "fsl,imx28-saif"; 730 compatible = "fsl,imx28-saif";
717 reg = <0x80046000 0x2000>; 731 reg = <0x80046000 0x2000>;
718 interrupts = <58 81>; 732 interrupts = <58 81>;
733 clocks = <&clks 54>;
719 fsl,saif-dma-channel = <5>; 734 fsl,saif-dma-channel = <5>;
720 status = "disabled"; 735 status = "disabled";
721 }; 736 };
@@ -763,6 +778,7 @@
763 pwm: pwm@80064000 { 778 pwm: pwm@80064000 {
764 compatible = "fsl,imx28-pwm", "fsl,imx23-pwm"; 779 compatible = "fsl,imx28-pwm", "fsl,imx23-pwm";
765 reg = <0x80064000 0x2000>; 780 reg = <0x80064000 0x2000>;
781 clocks = <&clks 44>;
766 #pwm-cells = <2>; 782 #pwm-cells = <2>;
767 fsl,pwm-number = <8>; 783 fsl,pwm-number = <8>;
768 status = "disabled"; 784 status = "disabled";
@@ -777,6 +793,7 @@
777 compatible = "fsl,imx28-auart", "fsl,imx23-auart"; 793 compatible = "fsl,imx28-auart", "fsl,imx23-auart";
778 reg = <0x8006a000 0x2000>; 794 reg = <0x8006a000 0x2000>;
779 interrupts = <112 70 71>; 795 interrupts = <112 70 71>;
796 clocks = <&clks 45>;
780 status = "disabled"; 797 status = "disabled";
781 }; 798 };
782 799
@@ -784,6 +801,7 @@
784 compatible = "fsl,imx28-auart", "fsl,imx23-auart"; 801 compatible = "fsl,imx28-auart", "fsl,imx23-auart";
785 reg = <0x8006c000 0x2000>; 802 reg = <0x8006c000 0x2000>;
786 interrupts = <113 72 73>; 803 interrupts = <113 72 73>;
804 clocks = <&clks 45>;
787 status = "disabled"; 805 status = "disabled";
788 }; 806 };
789 807
@@ -791,6 +809,7 @@
791 compatible = "fsl,imx28-auart", "fsl,imx23-auart"; 809 compatible = "fsl,imx28-auart", "fsl,imx23-auart";
792 reg = <0x8006e000 0x2000>; 810 reg = <0x8006e000 0x2000>;
793 interrupts = <114 74 75>; 811 interrupts = <114 74 75>;
812 clocks = <&clks 45>;
794 status = "disabled"; 813 status = "disabled";
795 }; 814 };
796 815
@@ -798,6 +817,7 @@
798 compatible = "fsl,imx28-auart", "fsl,imx23-auart"; 817 compatible = "fsl,imx28-auart", "fsl,imx23-auart";
799 reg = <0x80070000 0x2000>; 818 reg = <0x80070000 0x2000>;
800 interrupts = <115 76 77>; 819 interrupts = <115 76 77>;
820 clocks = <&clks 45>;
801 status = "disabled"; 821 status = "disabled";
802 }; 822 };
803 823
@@ -805,6 +825,7 @@
805 compatible = "fsl,imx28-auart", "fsl,imx23-auart"; 825 compatible = "fsl,imx28-auart", "fsl,imx23-auart";
806 reg = <0x80072000 0x2000>; 826 reg = <0x80072000 0x2000>;
807 interrupts = <116 78 79>; 827 interrupts = <116 78 79>;
828 clocks = <&clks 45>;
808 status = "disabled"; 829 status = "disabled";
809 }; 830 };
810 831
@@ -812,18 +833,22 @@
812 compatible = "arm,pl011", "arm,primecell"; 833 compatible = "arm,pl011", "arm,primecell";
813 reg = <0x80074000 0x1000>; 834 reg = <0x80074000 0x1000>;
814 interrupts = <47>; 835 interrupts = <47>;
836 clocks = <&clks 45>, <&clks 26>;
837 clock-names = "uart", "apb_pclk";
815 status = "disabled"; 838 status = "disabled";
816 }; 839 };
817 840
818 usbphy0: usbphy@8007c000 { 841 usbphy0: usbphy@8007c000 {
819 compatible = "fsl,imx28-usbphy", "fsl,imx23-usbphy"; 842 compatible = "fsl,imx28-usbphy", "fsl,imx23-usbphy";
820 reg = <0x8007c000 0x2000>; 843 reg = <0x8007c000 0x2000>;
844 clocks = <&clks 62>;
821 status = "disabled"; 845 status = "disabled";
822 }; 846 };
823 847
824 usbphy1: usbphy@8007e000 { 848 usbphy1: usbphy@8007e000 {
825 compatible = "fsl,imx28-usbphy", "fsl,imx23-usbphy"; 849 compatible = "fsl,imx28-usbphy", "fsl,imx23-usbphy";
826 reg = <0x8007e000 0x2000>; 850 reg = <0x8007e000 0x2000>;
851 clocks = <&clks 63>;
827 status = "disabled"; 852 status = "disabled";
828 }; 853 };
829 }; 854 };
@@ -840,6 +865,7 @@
840 compatible = "fsl,imx28-usb", "fsl,imx27-usb"; 865 compatible = "fsl,imx28-usb", "fsl,imx27-usb";
841 reg = <0x80080000 0x10000>; 866 reg = <0x80080000 0x10000>;
842 interrupts = <93>; 867 interrupts = <93>;
868 clocks = <&clks 60>;
843 fsl,usbphy = <&usbphy0>; 869 fsl,usbphy = <&usbphy0>;
844 status = "disabled"; 870 status = "disabled";
845 }; 871 };
@@ -848,6 +874,7 @@
848 compatible = "fsl,imx28-usb", "fsl,imx27-usb"; 874 compatible = "fsl,imx28-usb", "fsl,imx27-usb";
849 reg = <0x80090000 0x10000>; 875 reg = <0x80090000 0x10000>;
850 interrupts = <92>; 876 interrupts = <92>;
877 clocks = <&clks 61>;
851 fsl,usbphy = <&usbphy1>; 878 fsl,usbphy = <&usbphy1>;
852 status = "disabled"; 879 status = "disabled";
853 }; 880 };
@@ -861,6 +888,8 @@
861 compatible = "fsl,imx28-fec"; 888 compatible = "fsl,imx28-fec";
862 reg = <0x800f0000 0x4000>; 889 reg = <0x800f0000 0x4000>;
863 interrupts = <101>; 890 interrupts = <101>;
891 clocks = <&clks 57>, <&clks 57>;
892 clock-names = "ipg", "ahb";
864 status = "disabled"; 893 status = "disabled";
865 }; 894 };
866 895
@@ -868,6 +897,8 @@
868 compatible = "fsl,imx28-fec"; 897 compatible = "fsl,imx28-fec";
869 reg = <0x800f4000 0x4000>; 898 reg = <0x800f4000 0x4000>;
870 interrupts = <102>; 899 interrupts = <102>;
900 clocks = <&clks 57>, <&clks 57>;
901 clock-names = "ipg", "ahb";
871 status = "disabled"; 902 status = "disabled";
872 }; 903 };
873 904
diff --git a/drivers/clk/mxs/clk-imx23.c b/drivers/clk/mxs/clk-imx23.c
index 844043ad0fe4..9f6d15546cbe 100644
--- a/drivers/clk/mxs/clk-imx23.c
+++ b/drivers/clk/mxs/clk-imx23.c
@@ -14,6 +14,7 @@
14#include <linux/err.h> 14#include <linux/err.h>
15#include <linux/init.h> 15#include <linux/init.h>
16#include <linux/io.h> 16#include <linux/io.h>
17#include <linux/of.h>
17#include <mach/common.h> 18#include <mach/common.h>
18#include <mach/mx23.h> 19#include <mach/mx23.h>
19#include "clk.h" 20#include "clk.h"
@@ -71,44 +72,6 @@ static void __init clk_misc_init(void)
71 __mxs_setl(30 << BP_FRAC_IOFRAC, FRAC); 72 __mxs_setl(30 << BP_FRAC_IOFRAC, FRAC);
72} 73}
73 74
74static struct clk_lookup uart_lookups[] = {
75 { .dev_id = "duart", },
76 { .dev_id = "mxs-auart.0", },
77 { .dev_id = "mxs-auart.1", },
78 { .dev_id = "8006c000.serial", },
79 { .dev_id = "8006e000.serial", },
80 { .dev_id = "80070000.serial", },
81};
82
83static struct clk_lookup hbus_lookups[] = {
84 { .dev_id = "imx23-dma-apbh", },
85 { .dev_id = "80004000.dma-apbh", },
86};
87
88static struct clk_lookup xbus_lookups[] = {
89 { .dev_id = "duart", .con_id = "apb_pclk"},
90 { .dev_id = "80070000.serial", .con_id = "apb_pclk"},
91 { .dev_id = "imx23-dma-apbx", },
92 { .dev_id = "80024000.dma-apbx", },
93};
94
95static struct clk_lookup ssp_lookups[] = {
96 { .dev_id = "imx23-mmc.0", },
97 { .dev_id = "imx23-mmc.1", },
98 { .dev_id = "80010000.ssp", },
99 { .dev_id = "80034000.ssp", },
100};
101
102static struct clk_lookup lcdif_lookups[] = {
103 { .dev_id = "imx23-fb", },
104 { .dev_id = "80030000.lcdif", },
105};
106
107static struct clk_lookup gpmi_lookups[] = {
108 { .dev_id = "imx23-gpmi-nand", },
109 { .dev_id = "8000c000.gpmi-nand", },
110};
111
112static const char *sel_pll[] __initconst = { "pll", "ref_xtal", }; 75static const char *sel_pll[] __initconst = { "pll", "ref_xtal", };
113static const char *sel_cpu[] __initconst = { "ref_cpu", "ref_xtal", }; 76static const char *sel_cpu[] __initconst = { "ref_cpu", "ref_xtal", };
114static const char *sel_pix[] __initconst = { "ref_pix", "ref_xtal", }; 77static const char *sel_pix[] __initconst = { "ref_pix", "ref_xtal", };
@@ -127,6 +90,7 @@ enum imx23_clk {
127}; 90};
128 91
129static struct clk *clks[clk_max]; 92static struct clk *clks[clk_max];
93static struct clk_onecell_data clk_data;
130 94
131static enum imx23_clk clks_init_on[] __initdata = { 95static enum imx23_clk clks_init_on[] __initdata = {
132 cpu, hbus, xbus, emi, uart, 96 cpu, hbus, xbus, emi, uart,
@@ -134,6 +98,7 @@ static enum imx23_clk clks_init_on[] __initdata = {
134 98
135int __init mx23_clocks_init(void) 99int __init mx23_clocks_init(void)
136{ 100{
101 struct device_node *np;
137 int i; 102 int i;
138 103
139 clk_misc_init(); 104 clk_misc_init();
@@ -188,14 +153,14 @@ int __init mx23_clocks_init(void)
188 return PTR_ERR(clks[i]); 153 return PTR_ERR(clks[i]);
189 } 154 }
190 155
156 np = of_find_compatible_node(NULL, NULL, "fsl,imx23-clkctrl");
157 if (np) {
158 clk_data.clks = clks;
159 clk_data.clk_num = ARRAY_SIZE(clks);
160 of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
161 }
162
191 clk_register_clkdev(clks[clk32k], NULL, "timrot"); 163 clk_register_clkdev(clks[clk32k], NULL, "timrot");
192 clk_register_clkdev(clks[pwm], NULL, "80064000.pwm");
193 clk_register_clkdevs(clks[hbus], hbus_lookups, ARRAY_SIZE(hbus_lookups));
194 clk_register_clkdevs(clks[xbus], xbus_lookups, ARRAY_SIZE(xbus_lookups));
195 clk_register_clkdevs(clks[uart], uart_lookups, ARRAY_SIZE(uart_lookups));
196 clk_register_clkdevs(clks[ssp], ssp_lookups, ARRAY_SIZE(ssp_lookups));
197 clk_register_clkdevs(clks[gpmi], gpmi_lookups, ARRAY_SIZE(gpmi_lookups));
198 clk_register_clkdevs(clks[lcdif], lcdif_lookups, ARRAY_SIZE(lcdif_lookups));
199 164
200 for (i = 0; i < ARRAY_SIZE(clks_init_on); i++) 165 for (i = 0; i < ARRAY_SIZE(clks_init_on); i++)
201 clk_prepare_enable(clks[clks_init_on[i]]); 166 clk_prepare_enable(clks[clks_init_on[i]]);
diff --git a/drivers/clk/mxs/clk-imx28.c b/drivers/clk/mxs/clk-imx28.c
index e3aab67b3eb7..613e76f3758e 100644
--- a/drivers/clk/mxs/clk-imx28.c
+++ b/drivers/clk/mxs/clk-imx28.c
@@ -14,6 +14,7 @@
14#include <linux/err.h> 14#include <linux/err.h>
15#include <linux/init.h> 15#include <linux/init.h>
16#include <linux/io.h> 16#include <linux/io.h>
17#include <linux/of.h>
17#include <mach/common.h> 18#include <mach/common.h>
18#include <mach/mx28.h> 19#include <mach/mx28.h>
19#include "clk.h" 20#include "clk.h"
@@ -120,90 +121,6 @@ static void __init clk_misc_init(void)
120 writel_relaxed(val, FRAC0); 121 writel_relaxed(val, FRAC0);
121} 122}
122 123
123static struct clk_lookup uart_lookups[] = {
124 { .dev_id = "duart", },
125 { .dev_id = "mxs-auart.0", },
126 { .dev_id = "mxs-auart.1", },
127 { .dev_id = "mxs-auart.2", },
128 { .dev_id = "mxs-auart.3", },
129 { .dev_id = "mxs-auart.4", },
130 { .dev_id = "8006a000.serial", },
131 { .dev_id = "8006c000.serial", },
132 { .dev_id = "8006e000.serial", },
133 { .dev_id = "80070000.serial", },
134 { .dev_id = "80072000.serial", },
135 { .dev_id = "80074000.serial", },
136};
137
138static struct clk_lookup hbus_lookups[] = {
139 { .dev_id = "imx28-dma-apbh", },
140 { .dev_id = "80004000.dma-apbh", },
141};
142
143static struct clk_lookup xbus_lookups[] = {
144 { .dev_id = "duart", .con_id = "apb_pclk"},
145 { .dev_id = "80074000.serial", .con_id = "apb_pclk"},
146 { .dev_id = "imx28-dma-apbx", },
147 { .dev_id = "80024000.dma-apbx", },
148};
149
150static struct clk_lookup ssp0_lookups[] = {
151 { .dev_id = "imx28-mmc.0", },
152 { .dev_id = "80010000.ssp", },
153};
154
155static struct clk_lookup ssp1_lookups[] = {
156 { .dev_id = "imx28-mmc.1", },
157 { .dev_id = "80012000.ssp", },
158};
159
160static struct clk_lookup ssp2_lookups[] = {
161 { .dev_id = "imx28-mmc.2", },
162 { .dev_id = "80014000.ssp", },
163};
164
165static struct clk_lookup ssp3_lookups[] = {
166 { .dev_id = "imx28-mmc.3", },
167 { .dev_id = "80016000.ssp", },
168};
169
170static struct clk_lookup lcdif_lookups[] = {
171 { .dev_id = "imx28-fb", },
172 { .dev_id = "80030000.lcdif", },
173};
174
175static struct clk_lookup gpmi_lookups[] = {
176 { .dev_id = "imx28-gpmi-nand", },
177 { .dev_id = "8000c000.gpmi-nand", },
178};
179
180static struct clk_lookup fec_lookups[] = {
181 { .dev_id = "imx28-fec.0", },
182 { .dev_id = "imx28-fec.1", },
183 { .dev_id = "800f0000.ethernet", },
184 { .dev_id = "800f4000.ethernet", },
185};
186
187static struct clk_lookup can0_lookups[] = {
188 { .dev_id = "flexcan.0", },
189 { .dev_id = "80032000.can", },
190};
191
192static struct clk_lookup can1_lookups[] = {
193 { .dev_id = "flexcan.1", },
194 { .dev_id = "80034000.can", },
195};
196
197static struct clk_lookup saif0_lookups[] = {
198 { .dev_id = "mxs-saif.0", },
199 { .dev_id = "80042000.saif", },
200};
201
202static struct clk_lookup saif1_lookups[] = {
203 { .dev_id = "mxs-saif.1", },
204 { .dev_id = "80046000.saif", },
205};
206
207static const char *sel_cpu[] __initconst = { "ref_cpu", "ref_xtal", }; 124static const char *sel_cpu[] __initconst = { "ref_cpu", "ref_xtal", };
208static const char *sel_io0[] __initconst = { "ref_io0", "ref_xtal", }; 125static const char *sel_io0[] __initconst = { "ref_io0", "ref_xtal", };
209static const char *sel_io1[] __initconst = { "ref_io1", "ref_xtal", }; 126static const char *sel_io1[] __initconst = { "ref_io1", "ref_xtal", };
@@ -228,6 +145,7 @@ enum imx28_clk {
228}; 145};
229 146
230static struct clk *clks[clk_max]; 147static struct clk *clks[clk_max];
148static struct clk_onecell_data clk_data;
231 149
232static enum imx28_clk clks_init_on[] __initdata = { 150static enum imx28_clk clks_init_on[] __initdata = {
233 cpu, hbus, xbus, emi, uart, 151 cpu, hbus, xbus, emi, uart,
@@ -235,6 +153,7 @@ static enum imx28_clk clks_init_on[] __initdata = {
235 153
236int __init mx28_clocks_init(void) 154int __init mx28_clocks_init(void)
237{ 155{
156 struct device_node *np;
238 int i; 157 int i;
239 158
240 clk_misc_init(); 159 clk_misc_init();
@@ -312,27 +231,15 @@ int __init mx28_clocks_init(void)
312 return PTR_ERR(clks[i]); 231 return PTR_ERR(clks[i]);
313 } 232 }
314 233
234 np = of_find_compatible_node(NULL, NULL, "fsl,imx28-clkctrl");
235 if (np) {
236 clk_data.clks = clks;
237 clk_data.clk_num = ARRAY_SIZE(clks);
238 of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
239 }
240
315 clk_register_clkdev(clks[clk32k], NULL, "timrot"); 241 clk_register_clkdev(clks[clk32k], NULL, "timrot");
316 clk_register_clkdev(clks[enet_out], NULL, "enet_out"); 242 clk_register_clkdev(clks[enet_out], NULL, "enet_out");
317 clk_register_clkdev(clks[pwm], NULL, "80064000.pwm");
318 clk_register_clkdevs(clks[hbus], hbus_lookups, ARRAY_SIZE(hbus_lookups));
319 clk_register_clkdevs(clks[xbus], xbus_lookups, ARRAY_SIZE(xbus_lookups));
320 clk_register_clkdevs(clks[uart], uart_lookups, ARRAY_SIZE(uart_lookups));
321 clk_register_clkdevs(clks[ssp0], ssp0_lookups, ARRAY_SIZE(ssp0_lookups));
322 clk_register_clkdevs(clks[ssp1], ssp1_lookups, ARRAY_SIZE(ssp1_lookups));
323 clk_register_clkdevs(clks[ssp2], ssp2_lookups, ARRAY_SIZE(ssp2_lookups));
324 clk_register_clkdevs(clks[ssp3], ssp3_lookups, ARRAY_SIZE(ssp3_lookups));
325 clk_register_clkdevs(clks[gpmi], gpmi_lookups, ARRAY_SIZE(gpmi_lookups));
326 clk_register_clkdevs(clks[saif0], saif0_lookups, ARRAY_SIZE(saif0_lookups));
327 clk_register_clkdevs(clks[saif1], saif1_lookups, ARRAY_SIZE(saif1_lookups));
328 clk_register_clkdevs(clks[lcdif], lcdif_lookups, ARRAY_SIZE(lcdif_lookups));
329 clk_register_clkdevs(clks[fec], fec_lookups, ARRAY_SIZE(fec_lookups));
330 clk_register_clkdevs(clks[can0], can0_lookups, ARRAY_SIZE(can0_lookups));
331 clk_register_clkdevs(clks[can1], can1_lookups, ARRAY_SIZE(can1_lookups));
332 clk_register_clkdev(clks[usb0_pwr], NULL, "8007c000.usbphy");
333 clk_register_clkdev(clks[usb1_pwr], NULL, "8007e000.usbphy");
334 clk_register_clkdev(clks[usb0], NULL, "80080000.usb");
335 clk_register_clkdev(clks[usb1], NULL, "80090000.usb");
336 243
337 for (i = 0; i < ARRAY_SIZE(clks_init_on); i++) 244 for (i = 0; i < ARRAY_SIZE(clks_init_on); i++)
338 clk_prepare_enable(clks[clks_init_on[i]]); 245 clk_prepare_enable(clks[clks_init_on[i]]);