diff options
Diffstat (limited to 'arch/arm')
474 files changed, 13445 insertions, 17132 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 5458aa9db067..5e7601301b41 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -5,6 +5,9 @@ config ARM | |||
5 | select HAVE_AOUT | 5 | select HAVE_AOUT |
6 | select HAVE_DMA_API_DEBUG | 6 | select HAVE_DMA_API_DEBUG |
7 | select HAVE_IDE if PCI || ISA || PCMCIA | 7 | select HAVE_IDE if PCI || ISA || PCMCIA |
8 | select HAVE_DMA_ATTRS | ||
9 | select HAVE_DMA_CONTIGUOUS if (CPU_V6 || CPU_V6K || CPU_V7) | ||
10 | select CMA if (CPU_V6 || CPU_V6K || CPU_V7) | ||
8 | select HAVE_MEMBLOCK | 11 | select HAVE_MEMBLOCK |
9 | select RTC_LIB | 12 | select RTC_LIB |
10 | select SYS_SUPPORTS_APM_EMULATION | 13 | select SYS_SUPPORTS_APM_EMULATION |
@@ -54,6 +57,14 @@ config ARM | |||
54 | config ARM_HAS_SG_CHAIN | 57 | config ARM_HAS_SG_CHAIN |
55 | bool | 58 | bool |
56 | 59 | ||
60 | config NEED_SG_DMA_LENGTH | ||
61 | bool | ||
62 | |||
63 | config ARM_DMA_USE_IOMMU | ||
64 | select NEED_SG_DMA_LENGTH | ||
65 | select ARM_HAS_SG_CHAIN | ||
66 | bool | ||
67 | |||
57 | config HAVE_PWM | 68 | config HAVE_PWM |
58 | bool | 69 | bool |
59 | 70 | ||
@@ -445,8 +456,10 @@ config ARCH_MXS | |||
445 | select ARCH_REQUIRE_GPIOLIB | 456 | select ARCH_REQUIRE_GPIOLIB |
446 | select CLKDEV_LOOKUP | 457 | select CLKDEV_LOOKUP |
447 | select CLKSRC_MMIO | 458 | select CLKSRC_MMIO |
459 | select COMMON_CLK | ||
448 | select HAVE_CLK_PREPARE | 460 | select HAVE_CLK_PREPARE |
449 | select PINCTRL | 461 | select PINCTRL |
462 | select USE_OF | ||
450 | help | 463 | help |
451 | Support for Freescale MXS-based family of processors | 464 | Support for Freescale MXS-based family of processors |
452 | 465 | ||
@@ -936,6 +949,7 @@ config PLAT_SPEAR | |||
936 | select ARM_AMBA | 949 | select ARM_AMBA |
937 | select ARCH_REQUIRE_GPIOLIB | 950 | select ARCH_REQUIRE_GPIOLIB |
938 | select CLKDEV_LOOKUP | 951 | select CLKDEV_LOOKUP |
952 | select COMMON_CLK | ||
939 | select CLKSRC_MMIO | 953 | select CLKSRC_MMIO |
940 | select GENERIC_CLOCKEVENTS | 954 | select GENERIC_CLOCKEVENTS |
941 | select HAVE_CLK | 955 | select HAVE_CLK |
@@ -1040,7 +1054,6 @@ source "arch/arm/mach-sa1100/Kconfig" | |||
1040 | 1054 | ||
1041 | source "arch/arm/plat-samsung/Kconfig" | 1055 | source "arch/arm/plat-samsung/Kconfig" |
1042 | source "arch/arm/plat-s3c24xx/Kconfig" | 1056 | source "arch/arm/plat-s3c24xx/Kconfig" |
1043 | source "arch/arm/plat-s5p/Kconfig" | ||
1044 | 1057 | ||
1045 | source "arch/arm/plat-spear/Kconfig" | 1058 | source "arch/arm/plat-spear/Kconfig" |
1046 | 1059 | ||
@@ -1091,6 +1104,7 @@ config PLAT_ORION | |||
1091 | bool | 1104 | bool |
1092 | select CLKSRC_MMIO | 1105 | select CLKSRC_MMIO |
1093 | select GENERIC_IRQ_CHIP | 1106 | select GENERIC_IRQ_CHIP |
1107 | select COMMON_CLK | ||
1094 | 1108 | ||
1095 | config PLAT_PXA | 1109 | config PLAT_PXA |
1096 | bool | 1110 | bool |
diff --git a/arch/arm/Kconfig.debug b/arch/arm/Kconfig.debug index 85348a09d655..01a134141216 100644 --- a/arch/arm/Kconfig.debug +++ b/arch/arm/Kconfig.debug | |||
@@ -103,6 +103,35 @@ choice | |||
103 | Say Y here if you want the debug print routines to direct | 103 | Say Y here if you want the debug print routines to direct |
104 | their output to the second serial port on these devices. | 104 | their output to the second serial port on these devices. |
105 | 105 | ||
106 | config DEBUG_DAVINCI_DA8XX_UART1 | ||
107 | bool "Kernel low-level debugging on DaVinci DA8XX using UART1" | ||
108 | depends on ARCH_DAVINCI_DA8XX | ||
109 | help | ||
110 | Say Y here if you want the debug print routines to direct | ||
111 | their output to UART1 serial port on DaVinci DA8XX devices. | ||
112 | |||
113 | config DEBUG_DAVINCI_DA8XX_UART2 | ||
114 | bool "Kernel low-level debugging on DaVinci DA8XX using UART2" | ||
115 | depends on ARCH_DAVINCI_DA8XX | ||
116 | help | ||
117 | Say Y here if you want the debug print routines to direct | ||
118 | their output to UART2 serial port on DaVinci DA8XX devices. | ||
119 | |||
120 | config DEBUG_DAVINCI_DMx_UART0 | ||
121 | bool "Kernel low-level debugging on DaVinci DMx using UART0" | ||
122 | depends on ARCH_DAVINCI_DMx | ||
123 | help | ||
124 | Say Y here if you want the debug print routines to direct | ||
125 | their output to UART0 serial port on DaVinci DMx devices. | ||
126 | |||
127 | config DEBUG_DAVINCI_TNETV107X_UART1 | ||
128 | bool "Kernel low-level debugging on DaVinci TNETV107x using UART1" | ||
129 | depends on ARCH_DAVINCI_TNETV107X | ||
130 | help | ||
131 | Say Y here if you want the debug print routines to direct | ||
132 | their output to UART1 serial port on DaVinci TNETV107X | ||
133 | devices. | ||
134 | |||
106 | config DEBUG_DC21285_PORT | 135 | config DEBUG_DC21285_PORT |
107 | bool "Kernel low-level debugging messages via footbridge serial port" | 136 | bool "Kernel low-level debugging messages via footbridge serial port" |
108 | depends on FOOTBRIDGE | 137 | depends on FOOTBRIDGE |
@@ -180,6 +209,14 @@ choice | |||
180 | Say Y here if you want kernel low-level debugging support | 209 | Say Y here if you want kernel low-level debugging support |
181 | on i.MX50 or i.MX53. | 210 | on i.MX50 or i.MX53. |
182 | 211 | ||
212 | config DEBUG_IMX6Q_UART2 | ||
213 | bool "i.MX6Q Debug UART2" | ||
214 | depends on SOC_IMX6Q | ||
215 | help | ||
216 | Say Y here if you want kernel low-level debugging support | ||
217 | on i.MX6Q UART2. This is correct for e.g. the SabreLite | ||
218 | board. | ||
219 | |||
183 | config DEBUG_IMX6Q_UART4 | 220 | config DEBUG_IMX6Q_UART4 |
184 | bool "i.MX6Q Debug UART4" | 221 | bool "i.MX6Q Debug UART4" |
185 | depends on SOC_IMX6Q | 222 | depends on SOC_IMX6Q |
diff --git a/arch/arm/Makefile b/arch/arm/Makefile index 157900da8782..0298b00fe241 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile | |||
@@ -160,9 +160,7 @@ machine-$(CONFIG_ARCH_MXS) := mxs | |||
160 | machine-$(CONFIG_ARCH_NETX) := netx | 160 | machine-$(CONFIG_ARCH_NETX) := netx |
161 | machine-$(CONFIG_ARCH_NOMADIK) := nomadik | 161 | machine-$(CONFIG_ARCH_NOMADIK) := nomadik |
162 | machine-$(CONFIG_ARCH_OMAP1) := omap1 | 162 | machine-$(CONFIG_ARCH_OMAP1) := omap1 |
163 | machine-$(CONFIG_ARCH_OMAP2) := omap2 | 163 | machine-$(CONFIG_ARCH_OMAP2PLUS) := omap2 |
164 | machine-$(CONFIG_ARCH_OMAP3) := omap2 | ||
165 | machine-$(CONFIG_ARCH_OMAP4) := omap2 | ||
166 | machine-$(CONFIG_ARCH_ORION5X) := orion5x | 164 | machine-$(CONFIG_ARCH_ORION5X) := orion5x |
167 | machine-$(CONFIG_ARCH_PICOXCELL) := picoxcell | 165 | machine-$(CONFIG_ARCH_PICOXCELL) := picoxcell |
168 | machine-$(CONFIG_ARCH_PNX4008) := pnx4008 | 166 | machine-$(CONFIG_ARCH_PNX4008) := pnx4008 |
@@ -188,6 +186,8 @@ machine-$(CONFIG_ARCH_VEXPRESS) := vexpress | |||
188 | machine-$(CONFIG_ARCH_VT8500) := vt8500 | 186 | machine-$(CONFIG_ARCH_VT8500) := vt8500 |
189 | machine-$(CONFIG_ARCH_W90X900) := w90x900 | 187 | machine-$(CONFIG_ARCH_W90X900) := w90x900 |
190 | machine-$(CONFIG_FOOTBRIDGE) := footbridge | 188 | machine-$(CONFIG_FOOTBRIDGE) := footbridge |
189 | machine-$(CONFIG_MACH_SPEAR1310) := spear13xx | ||
190 | machine-$(CONFIG_MACH_SPEAR1340) := spear13xx | ||
191 | machine-$(CONFIG_MACH_SPEAR300) := spear3xx | 191 | machine-$(CONFIG_MACH_SPEAR300) := spear3xx |
192 | machine-$(CONFIG_MACH_SPEAR310) := spear3xx | 192 | machine-$(CONFIG_MACH_SPEAR310) := spear3xx |
193 | machine-$(CONFIG_MACH_SPEAR320) := spear3xx | 193 | machine-$(CONFIG_MACH_SPEAR320) := spear3xx |
@@ -205,7 +205,7 @@ plat-$(CONFIG_PLAT_NOMADIK) := nomadik | |||
205 | plat-$(CONFIG_PLAT_ORION) := orion | 205 | plat-$(CONFIG_PLAT_ORION) := orion |
206 | plat-$(CONFIG_PLAT_PXA) := pxa | 206 | plat-$(CONFIG_PLAT_PXA) := pxa |
207 | plat-$(CONFIG_PLAT_S3C24XX) := s3c24xx samsung | 207 | plat-$(CONFIG_PLAT_S3C24XX) := s3c24xx samsung |
208 | plat-$(CONFIG_PLAT_S5P) := s5p samsung | 208 | plat-$(CONFIG_PLAT_S5P) := samsung |
209 | plat-$(CONFIG_PLAT_SPEAR) := spear | 209 | plat-$(CONFIG_PLAT_SPEAR) := spear |
210 | plat-$(CONFIG_PLAT_VERSATILE) := versatile | 210 | plat-$(CONFIG_PLAT_VERSATILE) := versatile |
211 | 211 | ||
diff --git a/arch/arm/boot/dts/exynos5250-smdk5250.dts b/arch/arm/boot/dts/exynos5250-smdk5250.dts index 399d17b231d2..49945cc1bc7d 100644 --- a/arch/arm/boot/dts/exynos5250-smdk5250.dts +++ b/arch/arm/boot/dts/exynos5250-smdk5250.dts | |||
@@ -23,4 +23,52 @@ | |||
23 | chosen { | 23 | chosen { |
24 | bootargs = "root=/dev/ram0 rw ramdisk=8192 console=ttySAC1,115200"; | 24 | bootargs = "root=/dev/ram0 rw ramdisk=8192 console=ttySAC1,115200"; |
25 | }; | 25 | }; |
26 | |||
27 | i2c@12C60000 { | ||
28 | samsung,i2c-sda-delay = <100>; | ||
29 | samsung,i2c-max-bus-freq = <20000>; | ||
30 | gpios = <&gpb3 0 2 3 0>, | ||
31 | <&gpb3 1 2 3 0>; | ||
32 | |||
33 | eeprom@50 { | ||
34 | compatible = "samsung,s524ad0xd1"; | ||
35 | reg = <0x50>; | ||
36 | }; | ||
37 | }; | ||
38 | |||
39 | i2c@12C70000 { | ||
40 | samsung,i2c-sda-delay = <100>; | ||
41 | samsung,i2c-max-bus-freq = <20000>; | ||
42 | gpios = <&gpb3 2 2 3 0>, | ||
43 | <&gpb3 3 2 3 0>; | ||
44 | |||
45 | eeprom@51 { | ||
46 | compatible = "samsung,s524ad0xd1"; | ||
47 | reg = <0x51>; | ||
48 | }; | ||
49 | }; | ||
50 | |||
51 | i2c@12C80000 { | ||
52 | status = "disabled"; | ||
53 | }; | ||
54 | |||
55 | i2c@12C90000 { | ||
56 | status = "disabled"; | ||
57 | }; | ||
58 | |||
59 | i2c@12CA0000 { | ||
60 | status = "disabled"; | ||
61 | }; | ||
62 | |||
63 | i2c@12CB0000 { | ||
64 | status = "disabled"; | ||
65 | }; | ||
66 | |||
67 | i2c@12CC0000 { | ||
68 | status = "disabled"; | ||
69 | }; | ||
70 | |||
71 | i2c@12CD0000 { | ||
72 | status = "disabled"; | ||
73 | }; | ||
26 | }; | 74 | }; |
diff --git a/arch/arm/boot/dts/exynos5250.dtsi b/arch/arm/boot/dts/exynos5250.dtsi index dfc433599436..5ca0cdb76413 100644 --- a/arch/arm/boot/dts/exynos5250.dtsi +++ b/arch/arm/boot/dts/exynos5250.dtsi | |||
@@ -23,11 +23,11 @@ | |||
23 | compatible = "samsung,exynos5250"; | 23 | compatible = "samsung,exynos5250"; |
24 | interrupt-parent = <&gic>; | 24 | interrupt-parent = <&gic>; |
25 | 25 | ||
26 | gic:interrupt-controller@10490000 { | 26 | gic:interrupt-controller@10481000 { |
27 | compatible = "arm,cortex-a9-gic"; | 27 | compatible = "arm,cortex-a9-gic"; |
28 | #interrupt-cells = <3>; | 28 | #interrupt-cells = <3>; |
29 | interrupt-controller; | 29 | interrupt-controller; |
30 | reg = <0x10490000 0x1000>, <0x10480000 0x100>; | 30 | reg = <0x10481000 0x1000>, <0x10482000 0x2000>; |
31 | }; | 31 | }; |
32 | 32 | ||
33 | watchdog { | 33 | watchdog { |
@@ -42,30 +42,6 @@ | |||
42 | interrupts = <0 43 0>, <0 44 0>; | 42 | interrupts = <0 43 0>, <0 44 0>; |
43 | }; | 43 | }; |
44 | 44 | ||
45 | sdhci@12200000 { | ||
46 | compatible = "samsung,exynos4210-sdhci"; | ||
47 | reg = <0x12200000 0x100>; | ||
48 | interrupts = <0 75 0>; | ||
49 | }; | ||
50 | |||
51 | sdhci@12210000 { | ||
52 | compatible = "samsung,exynos4210-sdhci"; | ||
53 | reg = <0x12210000 0x100>; | ||
54 | interrupts = <0 76 0>; | ||
55 | }; | ||
56 | |||
57 | sdhci@12220000 { | ||
58 | compatible = "samsung,exynos4210-sdhci"; | ||
59 | reg = <0x12220000 0x100>; | ||
60 | interrupts = <0 77 0>; | ||
61 | }; | ||
62 | |||
63 | sdhci@12230000 { | ||
64 | compatible = "samsung,exynos4210-sdhci"; | ||
65 | reg = <0x12230000 0x100>; | ||
66 | interrupts = <0 78 0>; | ||
67 | }; | ||
68 | |||
69 | serial@12C00000 { | 45 | serial@12C00000 { |
70 | compatible = "samsung,exynos4210-uart"; | 46 | compatible = "samsung,exynos4210-uart"; |
71 | reg = <0x12C00000 0x100>; | 47 | reg = <0x12C00000 0x100>; |
@@ -94,48 +70,64 @@ | |||
94 | compatible = "samsung,s3c2440-i2c"; | 70 | compatible = "samsung,s3c2440-i2c"; |
95 | reg = <0x12C60000 0x100>; | 71 | reg = <0x12C60000 0x100>; |
96 | interrupts = <0 56 0>; | 72 | interrupts = <0 56 0>; |
73 | #address-cells = <1>; | ||
74 | #size-cells = <0>; | ||
97 | }; | 75 | }; |
98 | 76 | ||
99 | i2c@12C70000 { | 77 | i2c@12C70000 { |
100 | compatible = "samsung,s3c2440-i2c"; | 78 | compatible = "samsung,s3c2440-i2c"; |
101 | reg = <0x12C70000 0x100>; | 79 | reg = <0x12C70000 0x100>; |
102 | interrupts = <0 57 0>; | 80 | interrupts = <0 57 0>; |
81 | #address-cells = <1>; | ||
82 | #size-cells = <0>; | ||
103 | }; | 83 | }; |
104 | 84 | ||
105 | i2c@12C80000 { | 85 | i2c@12C80000 { |
106 | compatible = "samsung,s3c2440-i2c"; | 86 | compatible = "samsung,s3c2440-i2c"; |
107 | reg = <0x12C80000 0x100>; | 87 | reg = <0x12C80000 0x100>; |
108 | interrupts = <0 58 0>; | 88 | interrupts = <0 58 0>; |
89 | #address-cells = <1>; | ||
90 | #size-cells = <0>; | ||
109 | }; | 91 | }; |
110 | 92 | ||
111 | i2c@12C90000 { | 93 | i2c@12C90000 { |
112 | compatible = "samsung,s3c2440-i2c"; | 94 | compatible = "samsung,s3c2440-i2c"; |
113 | reg = <0x12C90000 0x100>; | 95 | reg = <0x12C90000 0x100>; |
114 | interrupts = <0 59 0>; | 96 | interrupts = <0 59 0>; |
97 | #address-cells = <1>; | ||
98 | #size-cells = <0>; | ||
115 | }; | 99 | }; |
116 | 100 | ||
117 | i2c@12CA0000 { | 101 | i2c@12CA0000 { |
118 | compatible = "samsung,s3c2440-i2c"; | 102 | compatible = "samsung,s3c2440-i2c"; |
119 | reg = <0x12CA0000 0x100>; | 103 | reg = <0x12CA0000 0x100>; |
120 | interrupts = <0 60 0>; | 104 | interrupts = <0 60 0>; |
105 | #address-cells = <1>; | ||
106 | #size-cells = <0>; | ||
121 | }; | 107 | }; |
122 | 108 | ||
123 | i2c@12CB0000 { | 109 | i2c@12CB0000 { |
124 | compatible = "samsung,s3c2440-i2c"; | 110 | compatible = "samsung,s3c2440-i2c"; |
125 | reg = <0x12CB0000 0x100>; | 111 | reg = <0x12CB0000 0x100>; |
126 | interrupts = <0 61 0>; | 112 | interrupts = <0 61 0>; |
113 | #address-cells = <1>; | ||
114 | #size-cells = <0>; | ||
127 | }; | 115 | }; |
128 | 116 | ||
129 | i2c@12CC0000 { | 117 | i2c@12CC0000 { |
130 | compatible = "samsung,s3c2440-i2c"; | 118 | compatible = "samsung,s3c2440-i2c"; |
131 | reg = <0x12CC0000 0x100>; | 119 | reg = <0x12CC0000 0x100>; |
132 | interrupts = <0 62 0>; | 120 | interrupts = <0 62 0>; |
121 | #address-cells = <1>; | ||
122 | #size-cells = <0>; | ||
133 | }; | 123 | }; |
134 | 124 | ||
135 | i2c@12CD0000 { | 125 | i2c@12CD0000 { |
136 | compatible = "samsung,s3c2440-i2c"; | 126 | compatible = "samsung,s3c2440-i2c"; |
137 | reg = <0x12CD0000 0x100>; | 127 | reg = <0x12CD0000 0x100>; |
138 | interrupts = <0 63 0>; | 128 | interrupts = <0 63 0>; |
129 | #address-cells = <1>; | ||
130 | #size-cells = <0>; | ||
139 | }; | 131 | }; |
140 | 132 | ||
141 | amba { | 133 | amba { |
@@ -157,13 +149,13 @@ | |||
157 | interrupts = <0 35 0>; | 149 | interrupts = <0 35 0>; |
158 | }; | 150 | }; |
159 | 151 | ||
160 | mdma0: pdma@10800000 { | 152 | mdma0: mdma@10800000 { |
161 | compatible = "arm,pl330", "arm,primecell"; | 153 | compatible = "arm,pl330", "arm,primecell"; |
162 | reg = <0x10800000 0x1000>; | 154 | reg = <0x10800000 0x1000>; |
163 | interrupts = <0 33 0>; | 155 | interrupts = <0 33 0>; |
164 | }; | 156 | }; |
165 | 157 | ||
166 | mdma1: pdma@11C10000 { | 158 | mdma1: mdma@11C10000 { |
167 | compatible = "arm,pl330", "arm,primecell"; | 159 | compatible = "arm,pl330", "arm,primecell"; |
168 | reg = <0x11C10000 0x1000>; | 160 | reg = <0x11C10000 0x1000>; |
169 | interrupts = <0 124 0>; | 161 | interrupts = <0 124 0>; |
@@ -242,6 +234,12 @@ | |||
242 | #gpio-cells = <4>; | 234 | #gpio-cells = <4>; |
243 | }; | 235 | }; |
244 | 236 | ||
237 | gpc4: gpio-controller@114002E0 { | ||
238 | compatible = "samsung,exynos4-gpio"; | ||
239 | reg = <0x114002E0 0x20>; | ||
240 | #gpio-cells = <4>; | ||
241 | }; | ||
242 | |||
245 | gpd0: gpio-controller@11400160 { | 243 | gpd0: gpio-controller@11400160 { |
246 | compatible = "samsung,exynos4-gpio"; | 244 | compatible = "samsung,exynos4-gpio"; |
247 | reg = <0x11400160 0x20>; | 245 | reg = <0x11400160 0x20>; |
@@ -388,19 +386,19 @@ | |||
388 | 386 | ||
389 | gpv2: gpio-controller@10D10040 { | 387 | gpv2: gpio-controller@10D10040 { |
390 | compatible = "samsung,exynos4-gpio"; | 388 | compatible = "samsung,exynos4-gpio"; |
391 | reg = <0x10D10040 0x20>; | 389 | reg = <0x10D10060 0x20>; |
392 | #gpio-cells = <4>; | 390 | #gpio-cells = <4>; |
393 | }; | 391 | }; |
394 | 392 | ||
395 | gpv3: gpio-controller@10D10060 { | 393 | gpv3: gpio-controller@10D10060 { |
396 | compatible = "samsung,exynos4-gpio"; | 394 | compatible = "samsung,exynos4-gpio"; |
397 | reg = <0x10D10060 0x20>; | 395 | reg = <0x10D10080 0x20>; |
398 | #gpio-cells = <4>; | 396 | #gpio-cells = <4>; |
399 | }; | 397 | }; |
400 | 398 | ||
401 | gpv4: gpio-controller@10D10080 { | 399 | gpv4: gpio-controller@10D10080 { |
402 | compatible = "samsung,exynos4-gpio"; | 400 | compatible = "samsung,exynos4-gpio"; |
403 | reg = <0x10D10080 0x20>; | 401 | reg = <0x10D100C0 0x20>; |
404 | #gpio-cells = <4>; | 402 | #gpio-cells = <4>; |
405 | }; | 403 | }; |
406 | 404 | ||
diff --git a/arch/arm/boot/dts/imx23-evk.dts b/arch/arm/boot/dts/imx23-evk.dts new file mode 100644 index 000000000000..70bffa929b65 --- /dev/null +++ b/arch/arm/boot/dts/imx23-evk.dts | |||
@@ -0,0 +1,43 @@ | |||
1 | /* | ||
2 | * Copyright 2012 Freescale Semiconductor, Inc. | ||
3 | * | ||
4 | * The code contained herein is licensed under the GNU General Public | ||
5 | * License. You may obtain a copy of the GNU General Public License | ||
6 | * Version 2 or later at the following locations: | ||
7 | * | ||
8 | * http://www.opensource.org/licenses/gpl-license.html | ||
9 | * http://www.gnu.org/copyleft/gpl.html | ||
10 | */ | ||
11 | |||
12 | /dts-v1/; | ||
13 | /include/ "imx23.dtsi" | ||
14 | |||
15 | / { | ||
16 | model = "Freescale i.MX23 Evaluation Kit"; | ||
17 | compatible = "fsl,imx23-evk", "fsl,imx23"; | ||
18 | |||
19 | memory { | ||
20 | reg = <0x40000000 0x08000000>; | ||
21 | }; | ||
22 | |||
23 | apb@80000000 { | ||
24 | apbh@80000000 { | ||
25 | ssp0: ssp@80010000 { | ||
26 | compatible = "fsl,imx23-mmc"; | ||
27 | pinctrl-names = "default"; | ||
28 | pinctrl-0 = <&mmc0_8bit_pins_a &mmc0_pins_fixup>; | ||
29 | bus-width = <8>; | ||
30 | wp-gpios = <&gpio1 30 0>; | ||
31 | status = "okay"; | ||
32 | }; | ||
33 | }; | ||
34 | |||
35 | apbx@80040000 { | ||
36 | duart: serial@80070000 { | ||
37 | pinctrl-names = "default"; | ||
38 | pinctrl-0 = <&duart_pins_a>; | ||
39 | status = "okay"; | ||
40 | }; | ||
41 | }; | ||
42 | }; | ||
43 | }; | ||
diff --git a/arch/arm/boot/dts/imx23.dtsi b/arch/arm/boot/dts/imx23.dtsi new file mode 100644 index 000000000000..8c5f9994f3fc --- /dev/null +++ b/arch/arm/boot/dts/imx23.dtsi | |||
@@ -0,0 +1,295 @@ | |||
1 | /* | ||
2 | * Copyright 2012 Freescale Semiconductor, Inc. | ||
3 | * | ||
4 | * The code contained herein is licensed under the GNU General Public | ||
5 | * License. You may obtain a copy of the GNU General Public License | ||
6 | * Version 2 or later at the following locations: | ||
7 | * | ||
8 | * http://www.opensource.org/licenses/gpl-license.html | ||
9 | * http://www.gnu.org/copyleft/gpl.html | ||
10 | */ | ||
11 | |||
12 | /include/ "skeleton.dtsi" | ||
13 | |||
14 | / { | ||
15 | interrupt-parent = <&icoll>; | ||
16 | |||
17 | aliases { | ||
18 | gpio0 = &gpio0; | ||
19 | gpio1 = &gpio1; | ||
20 | gpio2 = &gpio2; | ||
21 | }; | ||
22 | |||
23 | cpus { | ||
24 | cpu@0 { | ||
25 | compatible = "arm,arm926ejs"; | ||
26 | }; | ||
27 | }; | ||
28 | |||
29 | apb@80000000 { | ||
30 | compatible = "simple-bus"; | ||
31 | #address-cells = <1>; | ||
32 | #size-cells = <1>; | ||
33 | reg = <0x80000000 0x80000>; | ||
34 | ranges; | ||
35 | |||
36 | apbh@80000000 { | ||
37 | compatible = "simple-bus"; | ||
38 | #address-cells = <1>; | ||
39 | #size-cells = <1>; | ||
40 | reg = <0x80000000 0x40000>; | ||
41 | ranges; | ||
42 | |||
43 | icoll: interrupt-controller@80000000 { | ||
44 | compatible = "fsl,imx23-icoll", "fsl,mxs-icoll"; | ||
45 | interrupt-controller; | ||
46 | #interrupt-cells = <1>; | ||
47 | reg = <0x80000000 0x2000>; | ||
48 | }; | ||
49 | |||
50 | dma-apbh@80004000 { | ||
51 | compatible = "fsl,imx23-dma-apbh"; | ||
52 | reg = <0x80004000 2000>; | ||
53 | }; | ||
54 | |||
55 | ecc@80008000 { | ||
56 | reg = <0x80008000 2000>; | ||
57 | status = "disabled"; | ||
58 | }; | ||
59 | |||
60 | bch@8000a000 { | ||
61 | reg = <0x8000a000 2000>; | ||
62 | status = "disabled"; | ||
63 | }; | ||
64 | |||
65 | gpmi@8000c000 { | ||
66 | reg = <0x8000c000 2000>; | ||
67 | status = "disabled"; | ||
68 | }; | ||
69 | |||
70 | ssp0: ssp@80010000 { | ||
71 | reg = <0x80010000 2000>; | ||
72 | interrupts = <15 14>; | ||
73 | fsl,ssp-dma-channel = <1>; | ||
74 | status = "disabled"; | ||
75 | }; | ||
76 | |||
77 | etm@80014000 { | ||
78 | reg = <0x80014000 2000>; | ||
79 | status = "disabled"; | ||
80 | }; | ||
81 | |||
82 | pinctrl@80018000 { | ||
83 | #address-cells = <1>; | ||
84 | #size-cells = <0>; | ||
85 | compatible = "fsl,imx23-pinctrl", "simple-bus"; | ||
86 | reg = <0x80018000 2000>; | ||
87 | |||
88 | gpio0: gpio@0 { | ||
89 | compatible = "fsl,imx23-gpio", "fsl,mxs-gpio"; | ||
90 | interrupts = <16>; | ||
91 | gpio-controller; | ||
92 | #gpio-cells = <2>; | ||
93 | interrupt-controller; | ||
94 | #interrupt-cells = <2>; | ||
95 | }; | ||
96 | |||
97 | gpio1: gpio@1 { | ||
98 | compatible = "fsl,imx23-gpio", "fsl,mxs-gpio"; | ||
99 | interrupts = <17>; | ||
100 | gpio-controller; | ||
101 | #gpio-cells = <2>; | ||
102 | interrupt-controller; | ||
103 | #interrupt-cells = <2>; | ||
104 | }; | ||
105 | |||
106 | gpio2: gpio@2 { | ||
107 | compatible = "fsl,imx23-gpio", "fsl,mxs-gpio"; | ||
108 | interrupts = <18>; | ||
109 | gpio-controller; | ||
110 | #gpio-cells = <2>; | ||
111 | interrupt-controller; | ||
112 | #interrupt-cells = <2>; | ||
113 | }; | ||
114 | |||
115 | duart_pins_a: duart@0 { | ||
116 | reg = <0>; | ||
117 | fsl,pinmux-ids = <0x11a2 0x11b2>; | ||
118 | fsl,drive-strength = <0>; | ||
119 | fsl,voltage = <1>; | ||
120 | fsl,pull-up = <0>; | ||
121 | }; | ||
122 | |||
123 | mmc0_8bit_pins_a: mmc0-8bit@0 { | ||
124 | reg = <0>; | ||
125 | fsl,pinmux-ids = <0x2020 0x2030 0x2040 | ||
126 | 0x2050 0x0082 0x0092 0x00a2 | ||
127 | 0x00b2 0x2000 0x2010 0x2060>; | ||
128 | fsl,drive-strength = <1>; | ||
129 | fsl,voltage = <1>; | ||
130 | fsl,pull-up = <1>; | ||
131 | }; | ||
132 | |||
133 | mmc0_pins_fixup: mmc0-pins-fixup { | ||
134 | fsl,pinmux-ids = <0x2010 0x2060>; | ||
135 | fsl,pull-up = <0>; | ||
136 | }; | ||
137 | }; | ||
138 | |||
139 | digctl@8001c000 { | ||
140 | reg = <0x8001c000 2000>; | ||
141 | status = "disabled"; | ||
142 | }; | ||
143 | |||
144 | emi@80020000 { | ||
145 | reg = <0x80020000 2000>; | ||
146 | status = "disabled"; | ||
147 | }; | ||
148 | |||
149 | dma-apbx@80024000 { | ||
150 | compatible = "fsl,imx23-dma-apbx"; | ||
151 | reg = <0x80024000 2000>; | ||
152 | }; | ||
153 | |||
154 | dcp@80028000 { | ||
155 | reg = <0x80028000 2000>; | ||
156 | status = "disabled"; | ||
157 | }; | ||
158 | |||
159 | pxp@8002a000 { | ||
160 | reg = <0x8002a000 2000>; | ||
161 | status = "disabled"; | ||
162 | }; | ||
163 | |||
164 | ocotp@8002c000 { | ||
165 | reg = <0x8002c000 2000>; | ||
166 | status = "disabled"; | ||
167 | }; | ||
168 | |||
169 | axi-ahb@8002e000 { | ||
170 | reg = <0x8002e000 2000>; | ||
171 | status = "disabled"; | ||
172 | }; | ||
173 | |||
174 | lcdif@80030000 { | ||
175 | reg = <0x80030000 2000>; | ||
176 | status = "disabled"; | ||
177 | }; | ||
178 | |||
179 | ssp1: ssp@80034000 { | ||
180 | reg = <0x80034000 2000>; | ||
181 | interrupts = <2 20>; | ||
182 | fsl,ssp-dma-channel = <2>; | ||
183 | status = "disabled"; | ||
184 | }; | ||
185 | |||
186 | tvenc@80038000 { | ||
187 | reg = <0x80038000 2000>; | ||
188 | status = "disabled"; | ||
189 | }; | ||
190 | }; | ||
191 | |||
192 | apbx@80040000 { | ||
193 | compatible = "simple-bus"; | ||
194 | #address-cells = <1>; | ||
195 | #size-cells = <1>; | ||
196 | reg = <0x80040000 0x40000>; | ||
197 | ranges; | ||
198 | |||
199 | clkctl@80040000 { | ||
200 | reg = <0x80040000 2000>; | ||
201 | status = "disabled"; | ||
202 | }; | ||
203 | |||
204 | saif0: saif@80042000 { | ||
205 | reg = <0x80042000 2000>; | ||
206 | status = "disabled"; | ||
207 | }; | ||
208 | |||
209 | power@80044000 { | ||
210 | reg = <0x80044000 2000>; | ||
211 | status = "disabled"; | ||
212 | }; | ||
213 | |||
214 | saif1: saif@80046000 { | ||
215 | reg = <0x80046000 2000>; | ||
216 | status = "disabled"; | ||
217 | }; | ||
218 | |||
219 | audio-out@80048000 { | ||
220 | reg = <0x80048000 2000>; | ||
221 | status = "disabled"; | ||
222 | }; | ||
223 | |||
224 | audio-in@8004c000 { | ||
225 | reg = <0x8004c000 2000>; | ||
226 | status = "disabled"; | ||
227 | }; | ||
228 | |||
229 | lradc@80050000 { | ||
230 | reg = <0x80050000 2000>; | ||
231 | status = "disabled"; | ||
232 | }; | ||
233 | |||
234 | spdif@80054000 { | ||
235 | reg = <0x80054000 2000>; | ||
236 | status = "disabled"; | ||
237 | }; | ||
238 | |||
239 | i2c@80058000 { | ||
240 | reg = <0x80058000 2000>; | ||
241 | status = "disabled"; | ||
242 | }; | ||
243 | |||
244 | rtc@8005c000 { | ||
245 | reg = <0x8005c000 2000>; | ||
246 | status = "disabled"; | ||
247 | }; | ||
248 | |||
249 | pwm@80064000 { | ||
250 | reg = <0x80064000 2000>; | ||
251 | status = "disabled"; | ||
252 | }; | ||
253 | |||
254 | timrot@80068000 { | ||
255 | reg = <0x80068000 2000>; | ||
256 | status = "disabled"; | ||
257 | }; | ||
258 | |||
259 | auart0: serial@8006c000 { | ||
260 | reg = <0x8006c000 0x2000>; | ||
261 | status = "disabled"; | ||
262 | }; | ||
263 | |||
264 | auart1: serial@8006e000 { | ||
265 | reg = <0x8006e000 0x2000>; | ||
266 | status = "disabled"; | ||
267 | }; | ||
268 | |||
269 | duart: serial@80070000 { | ||
270 | compatible = "arm,pl011", "arm,primecell"; | ||
271 | reg = <0x80070000 0x2000>; | ||
272 | interrupts = <0>; | ||
273 | status = "disabled"; | ||
274 | }; | ||
275 | |||
276 | usbphy@8007c000 { | ||
277 | reg = <0x8007c000 0x2000>; | ||
278 | status = "disabled"; | ||
279 | }; | ||
280 | }; | ||
281 | }; | ||
282 | |||
283 | ahb@80080000 { | ||
284 | compatible = "simple-bus"; | ||
285 | #address-cells = <1>; | ||
286 | #size-cells = <1>; | ||
287 | reg = <0x80080000 0x80000>; | ||
288 | ranges; | ||
289 | |||
290 | usbctrl@80080000 { | ||
291 | reg = <0x80080000 0x10000>; | ||
292 | status = "disabled"; | ||
293 | }; | ||
294 | }; | ||
295 | }; | ||
diff --git a/arch/arm/boot/dts/imx27-phytec-phycore.dts b/arch/arm/boot/dts/imx27-phytec-phycore.dts index a51a08fc2af9..2b0ff60247a4 100644 --- a/arch/arm/boot/dts/imx27-phytec-phycore.dts +++ b/arch/arm/boot/dts/imx27-phytec-phycore.dts | |||
@@ -27,22 +27,22 @@ | |||
27 | status = "okay"; | 27 | status = "okay"; |
28 | }; | 28 | }; |
29 | 29 | ||
30 | uart@1000a000 { | 30 | serial@1000a000 { |
31 | fsl,uart-has-rtscts; | 31 | fsl,uart-has-rtscts; |
32 | status = "okay"; | 32 | status = "okay"; |
33 | }; | 33 | }; |
34 | 34 | ||
35 | uart@1000b000 { | 35 | serial@1000b000 { |
36 | fsl,uart-has-rtscts; | 36 | fsl,uart-has-rtscts; |
37 | status = "okay"; | 37 | status = "okay"; |
38 | }; | 38 | }; |
39 | 39 | ||
40 | uart@1000c000 { | 40 | serial@1000c000 { |
41 | fsl,uart-has-rtscts; | 41 | fsl,uart-has-rtscts; |
42 | status = "okay"; | 42 | status = "okay"; |
43 | }; | 43 | }; |
44 | 44 | ||
45 | fec@1002b000 { | 45 | ethernet@1002b000 { |
46 | status = "okay"; | 46 | status = "okay"; |
47 | }; | 47 | }; |
48 | 48 | ||
diff --git a/arch/arm/boot/dts/imx27.dtsi b/arch/arm/boot/dts/imx27.dtsi index bc5e7d5ddd54..2b1a166d41f9 100644 --- a/arch/arm/boot/dts/imx27.dtsi +++ b/arch/arm/boot/dts/imx27.dtsi | |||
@@ -59,28 +59,28 @@ | |||
59 | status = "disabled"; | 59 | status = "disabled"; |
60 | }; | 60 | }; |
61 | 61 | ||
62 | uart1: uart@1000a000 { | 62 | uart1: serial@1000a000 { |
63 | compatible = "fsl,imx27-uart", "fsl,imx21-uart"; | 63 | compatible = "fsl,imx27-uart", "fsl,imx21-uart"; |
64 | reg = <0x1000a000 0x1000>; | 64 | reg = <0x1000a000 0x1000>; |
65 | interrupts = <20>; | 65 | interrupts = <20>; |
66 | status = "disabled"; | 66 | status = "disabled"; |
67 | }; | 67 | }; |
68 | 68 | ||
69 | uart2: uart@1000b000 { | 69 | uart2: serial@1000b000 { |
70 | compatible = "fsl,imx27-uart", "fsl,imx21-uart"; | 70 | compatible = "fsl,imx27-uart", "fsl,imx21-uart"; |
71 | reg = <0x1000b000 0x1000>; | 71 | reg = <0x1000b000 0x1000>; |
72 | interrupts = <19>; | 72 | interrupts = <19>; |
73 | status = "disabled"; | 73 | status = "disabled"; |
74 | }; | 74 | }; |
75 | 75 | ||
76 | uart3: uart@1000c000 { | 76 | uart3: serial@1000c000 { |
77 | compatible = "fsl,imx27-uart", "fsl,imx21-uart"; | 77 | compatible = "fsl,imx27-uart", "fsl,imx21-uart"; |
78 | reg = <0x1000c000 0x1000>; | 78 | reg = <0x1000c000 0x1000>; |
79 | interrupts = <18>; | 79 | interrupts = <18>; |
80 | status = "disabled"; | 80 | status = "disabled"; |
81 | }; | 81 | }; |
82 | 82 | ||
83 | uart4: uart@1000d000 { | 83 | uart4: serial@1000d000 { |
84 | compatible = "fsl,imx27-uart", "fsl,imx21-uart"; | 84 | compatible = "fsl,imx27-uart", "fsl,imx21-uart"; |
85 | reg = <0x1000d000 0x1000>; | 85 | reg = <0x1000d000 0x1000>; |
86 | interrupts = <17>; | 86 | interrupts = <17>; |
@@ -183,14 +183,14 @@ | |||
183 | status = "disabled"; | 183 | status = "disabled"; |
184 | }; | 184 | }; |
185 | 185 | ||
186 | uart5: uart@1001b000 { | 186 | uart5: serial@1001b000 { |
187 | compatible = "fsl,imx27-uart", "fsl,imx21-uart"; | 187 | compatible = "fsl,imx27-uart", "fsl,imx21-uart"; |
188 | reg = <0x1001b000 0x1000>; | 188 | reg = <0x1001b000 0x1000>; |
189 | interrupts = <49>; | 189 | interrupts = <49>; |
190 | status = "disabled"; | 190 | status = "disabled"; |
191 | }; | 191 | }; |
192 | 192 | ||
193 | uart6: uart@1001c000 { | 193 | uart6: serial@1001c000 { |
194 | compatible = "fsl,imx27-uart", "fsl,imx21-uart"; | 194 | compatible = "fsl,imx27-uart", "fsl,imx21-uart"; |
195 | reg = <0x1001c000 0x1000>; | 195 | reg = <0x1001c000 0x1000>; |
196 | interrupts = <48>; | 196 | interrupts = <48>; |
@@ -206,7 +206,7 @@ | |||
206 | status = "disabled"; | 206 | status = "disabled"; |
207 | }; | 207 | }; |
208 | 208 | ||
209 | fec: fec@1002b000 { | 209 | fec: ethernet@1002b000 { |
210 | compatible = "fsl,imx27-fec"; | 210 | compatible = "fsl,imx27-fec"; |
211 | reg = <0x1002b000 0x4000>; | 211 | reg = <0x1002b000 0x4000>; |
212 | interrupts = <50>; | 212 | interrupts = <50>; |
diff --git a/arch/arm/boot/dts/imx28-evk.dts b/arch/arm/boot/dts/imx28-evk.dts new file mode 100644 index 000000000000..ee520a529cb4 --- /dev/null +++ b/arch/arm/boot/dts/imx28-evk.dts | |||
@@ -0,0 +1,114 @@ | |||
1 | /* | ||
2 | * Copyright 2012 Freescale Semiconductor, Inc. | ||
3 | * | ||
4 | * The code contained herein is licensed under the GNU General Public | ||
5 | * License. You may obtain a copy of the GNU General Public License | ||
6 | * Version 2 or later at the following locations: | ||
7 | * | ||
8 | * http://www.opensource.org/licenses/gpl-license.html | ||
9 | * http://www.gnu.org/copyleft/gpl.html | ||
10 | */ | ||
11 | |||
12 | /dts-v1/; | ||
13 | /include/ "imx28.dtsi" | ||
14 | |||
15 | / { | ||
16 | model = "Freescale i.MX28 Evaluation Kit"; | ||
17 | compatible = "fsl,imx28-evk", "fsl,imx28"; | ||
18 | |||
19 | memory { | ||
20 | reg = <0x40000000 0x08000000>; | ||
21 | }; | ||
22 | |||
23 | apb@80000000 { | ||
24 | apbh@80000000 { | ||
25 | ssp0: ssp@80010000 { | ||
26 | compatible = "fsl,imx28-mmc"; | ||
27 | pinctrl-names = "default"; | ||
28 | pinctrl-0 = <&mmc0_8bit_pins_a | ||
29 | &mmc0_cd_cfg &mmc0_sck_cfg>; | ||
30 | bus-width = <8>; | ||
31 | wp-gpios = <&gpio2 12 0>; | ||
32 | status = "okay"; | ||
33 | }; | ||
34 | |||
35 | ssp1: ssp@80012000 { | ||
36 | compatible = "fsl,imx28-mmc"; | ||
37 | bus-width = <8>; | ||
38 | wp-gpios = <&gpio0 28 0>; | ||
39 | status = "okay"; | ||
40 | }; | ||
41 | }; | ||
42 | |||
43 | apbx@80040000 { | ||
44 | saif0: saif@80042000 { | ||
45 | pinctrl-names = "default"; | ||
46 | pinctrl-0 = <&saif0_pins_a>; | ||
47 | status = "okay"; | ||
48 | }; | ||
49 | |||
50 | saif1: saif@80046000 { | ||
51 | pinctrl-names = "default"; | ||
52 | pinctrl-0 = <&saif1_pins_a>; | ||
53 | fsl,saif-master = <&saif0>; | ||
54 | status = "okay"; | ||
55 | }; | ||
56 | |||
57 | i2c0: i2c@80058000 { | ||
58 | pinctrl-names = "default"; | ||
59 | pinctrl-0 = <&i2c0_pins_a>; | ||
60 | status = "okay"; | ||
61 | |||
62 | sgtl5000: codec@0a { | ||
63 | compatible = "fsl,sgtl5000"; | ||
64 | reg = <0x0a>; | ||
65 | VDDA-supply = <®_3p3v>; | ||
66 | VDDIO-supply = <®_3p3v>; | ||
67 | |||
68 | }; | ||
69 | }; | ||
70 | |||
71 | duart: serial@80074000 { | ||
72 | pinctrl-names = "default"; | ||
73 | pinctrl-0 = <&duart_pins_a>; | ||
74 | status = "okay"; | ||
75 | }; | ||
76 | }; | ||
77 | }; | ||
78 | |||
79 | ahb@80080000 { | ||
80 | mac0: ethernet@800f0000 { | ||
81 | phy-mode = "rmii"; | ||
82 | pinctrl-names = "default"; | ||
83 | pinctrl-0 = <&mac0_pins_a>; | ||
84 | status = "okay"; | ||
85 | }; | ||
86 | |||
87 | mac1: ethernet@800f4000 { | ||
88 | phy-mode = "rmii"; | ||
89 | pinctrl-names = "default"; | ||
90 | pinctrl-0 = <&mac1_pins_a>; | ||
91 | status = "okay"; | ||
92 | }; | ||
93 | }; | ||
94 | |||
95 | regulators { | ||
96 | compatible = "simple-bus"; | ||
97 | |||
98 | reg_3p3v: 3p3v { | ||
99 | compatible = "regulator-fixed"; | ||
100 | regulator-name = "3P3V"; | ||
101 | regulator-min-microvolt = <3300000>; | ||
102 | regulator-max-microvolt = <3300000>; | ||
103 | regulator-always-on; | ||
104 | }; | ||
105 | }; | ||
106 | |||
107 | sound { | ||
108 | compatible = "fsl,imx28-evk-sgtl5000", | ||
109 | "fsl,mxs-audio-sgtl5000"; | ||
110 | model = "imx28-evk-sgtl5000"; | ||
111 | saif-controllers = <&saif0 &saif1>; | ||
112 | audio-codec = <&sgtl5000>; | ||
113 | }; | ||
114 | }; | ||
diff --git a/arch/arm/boot/dts/imx28.dtsi b/arch/arm/boot/dts/imx28.dtsi new file mode 100644 index 000000000000..4634cb861a59 --- /dev/null +++ b/arch/arm/boot/dts/imx28.dtsi | |||
@@ -0,0 +1,497 @@ | |||
1 | /* | ||
2 | * Copyright 2012 Freescale Semiconductor, Inc. | ||
3 | * | ||
4 | * The code contained herein is licensed under the GNU General Public | ||
5 | * License. You may obtain a copy of the GNU General Public License | ||
6 | * Version 2 or later at the following locations: | ||
7 | * | ||
8 | * http://www.opensource.org/licenses/gpl-license.html | ||
9 | * http://www.gnu.org/copyleft/gpl.html | ||
10 | */ | ||
11 | |||
12 | /include/ "skeleton.dtsi" | ||
13 | |||
14 | / { | ||
15 | interrupt-parent = <&icoll>; | ||
16 | |||
17 | aliases { | ||
18 | gpio0 = &gpio0; | ||
19 | gpio1 = &gpio1; | ||
20 | gpio2 = &gpio2; | ||
21 | gpio3 = &gpio3; | ||
22 | gpio4 = &gpio4; | ||
23 | saif0 = &saif0; | ||
24 | saif1 = &saif1; | ||
25 | }; | ||
26 | |||
27 | cpus { | ||
28 | cpu@0 { | ||
29 | compatible = "arm,arm926ejs"; | ||
30 | }; | ||
31 | }; | ||
32 | |||
33 | apb@80000000 { | ||
34 | compatible = "simple-bus"; | ||
35 | #address-cells = <1>; | ||
36 | #size-cells = <1>; | ||
37 | reg = <0x80000000 0x80000>; | ||
38 | ranges; | ||
39 | |||
40 | apbh@80000000 { | ||
41 | compatible = "simple-bus"; | ||
42 | #address-cells = <1>; | ||
43 | #size-cells = <1>; | ||
44 | reg = <0x80000000 0x3c900>; | ||
45 | ranges; | ||
46 | |||
47 | icoll: interrupt-controller@80000000 { | ||
48 | compatible = "fsl,imx28-icoll", "fsl,mxs-icoll"; | ||
49 | interrupt-controller; | ||
50 | #interrupt-cells = <1>; | ||
51 | reg = <0x80000000 0x2000>; | ||
52 | }; | ||
53 | |||
54 | hsadc@80002000 { | ||
55 | reg = <0x80002000 2000>; | ||
56 | interrupts = <13 87>; | ||
57 | status = "disabled"; | ||
58 | }; | ||
59 | |||
60 | dma-apbh@80004000 { | ||
61 | compatible = "fsl,imx28-dma-apbh"; | ||
62 | reg = <0x80004000 2000>; | ||
63 | }; | ||
64 | |||
65 | perfmon@80006000 { | ||
66 | reg = <0x80006000 800>; | ||
67 | interrupts = <27>; | ||
68 | status = "disabled"; | ||
69 | }; | ||
70 | |||
71 | bch@8000a000 { | ||
72 | reg = <0x8000a000 2000>; | ||
73 | interrupts = <41>; | ||
74 | status = "disabled"; | ||
75 | }; | ||
76 | |||
77 | gpmi@8000c000 { | ||
78 | reg = <0x8000c000 2000>; | ||
79 | interrupts = <42 88>; | ||
80 | status = "disabled"; | ||
81 | }; | ||
82 | |||
83 | ssp0: ssp@80010000 { | ||
84 | reg = <0x80010000 2000>; | ||
85 | interrupts = <96 82>; | ||
86 | fsl,ssp-dma-channel = <0>; | ||
87 | status = "disabled"; | ||
88 | }; | ||
89 | |||
90 | ssp1: ssp@80012000 { | ||
91 | reg = <0x80012000 2000>; | ||
92 | interrupts = <97 83>; | ||
93 | fsl,ssp-dma-channel = <1>; | ||
94 | status = "disabled"; | ||
95 | }; | ||
96 | |||
97 | ssp2: ssp@80014000 { | ||
98 | reg = <0x80014000 2000>; | ||
99 | interrupts = <98 84>; | ||
100 | fsl,ssp-dma-channel = <2>; | ||
101 | status = "disabled"; | ||
102 | }; | ||
103 | |||
104 | ssp3: ssp@80016000 { | ||
105 | reg = <0x80016000 2000>; | ||
106 | interrupts = <99 85>; | ||
107 | fsl,ssp-dma-channel = <3>; | ||
108 | status = "disabled"; | ||
109 | }; | ||
110 | |||
111 | pinctrl@80018000 { | ||
112 | #address-cells = <1>; | ||
113 | #size-cells = <0>; | ||
114 | compatible = "fsl,imx28-pinctrl", "simple-bus"; | ||
115 | reg = <0x80018000 2000>; | ||
116 | |||
117 | gpio0: gpio@0 { | ||
118 | compatible = "fsl,imx28-gpio", "fsl,mxs-gpio"; | ||
119 | interrupts = <127>; | ||
120 | gpio-controller; | ||
121 | #gpio-cells = <2>; | ||
122 | interrupt-controller; | ||
123 | #interrupt-cells = <2>; | ||
124 | }; | ||
125 | |||
126 | gpio1: gpio@1 { | ||
127 | compatible = "fsl,imx28-gpio", "fsl,mxs-gpio"; | ||
128 | interrupts = <126>; | ||
129 | gpio-controller; | ||
130 | #gpio-cells = <2>; | ||
131 | interrupt-controller; | ||
132 | #interrupt-cells = <2>; | ||
133 | }; | ||
134 | |||
135 | gpio2: gpio@2 { | ||
136 | compatible = "fsl,imx28-gpio", "fsl,mxs-gpio"; | ||
137 | interrupts = <125>; | ||
138 | gpio-controller; | ||
139 | #gpio-cells = <2>; | ||
140 | interrupt-controller; | ||
141 | #interrupt-cells = <2>; | ||
142 | }; | ||
143 | |||
144 | gpio3: gpio@3 { | ||
145 | compatible = "fsl,imx28-gpio", "fsl,mxs-gpio"; | ||
146 | interrupts = <124>; | ||
147 | gpio-controller; | ||
148 | #gpio-cells = <2>; | ||
149 | interrupt-controller; | ||
150 | #interrupt-cells = <2>; | ||
151 | }; | ||
152 | |||
153 | gpio4: gpio@4 { | ||
154 | compatible = "fsl,imx28-gpio", "fsl,mxs-gpio"; | ||
155 | interrupts = <123>; | ||
156 | gpio-controller; | ||
157 | #gpio-cells = <2>; | ||
158 | interrupt-controller; | ||
159 | #interrupt-cells = <2>; | ||
160 | }; | ||
161 | |||
162 | duart_pins_a: duart@0 { | ||
163 | reg = <0>; | ||
164 | fsl,pinmux-ids = <0x3102 0x3112>; | ||
165 | fsl,drive-strength = <0>; | ||
166 | fsl,voltage = <1>; | ||
167 | fsl,pull-up = <0>; | ||
168 | }; | ||
169 | |||
170 | mac0_pins_a: mac0@0 { | ||
171 | reg = <0>; | ||
172 | fsl,pinmux-ids = <0x4000 0x4010 0x4020 | ||
173 | 0x4030 0x4040 0x4060 0x4070 | ||
174 | 0x4080 0x4100>; | ||
175 | fsl,drive-strength = <1>; | ||
176 | fsl,voltage = <1>; | ||
177 | fsl,pull-up = <1>; | ||
178 | }; | ||
179 | |||
180 | mac1_pins_a: mac1@0 { | ||
181 | reg = <0>; | ||
182 | fsl,pinmux-ids = <0x40f1 0x4091 0x40a1 | ||
183 | 0x40e1 0x40b1 0x40c1>; | ||
184 | fsl,drive-strength = <1>; | ||
185 | fsl,voltage = <1>; | ||
186 | fsl,pull-up = <1>; | ||
187 | }; | ||
188 | |||
189 | mmc0_8bit_pins_a: mmc0-8bit@0 { | ||
190 | reg = <0>; | ||
191 | fsl,pinmux-ids = <0x2000 0x2010 0x2020 | ||
192 | 0x2030 0x2040 0x2050 0x2060 | ||
193 | 0x2070 0x2080 0x2090 0x20a0>; | ||
194 | fsl,drive-strength = <1>; | ||
195 | fsl,voltage = <1>; | ||
196 | fsl,pull-up = <1>; | ||
197 | }; | ||
198 | |||
199 | mmc0_cd_cfg: mmc0-cd-cfg { | ||
200 | fsl,pinmux-ids = <0x2090>; | ||
201 | fsl,pull-up = <0>; | ||
202 | }; | ||
203 | |||
204 | mmc0_sck_cfg: mmc0-sck-cfg { | ||
205 | fsl,pinmux-ids = <0x20a0>; | ||
206 | fsl,drive-strength = <2>; | ||
207 | fsl,pull-up = <0>; | ||
208 | }; | ||
209 | |||
210 | i2c0_pins_a: i2c0@0 { | ||
211 | reg = <0>; | ||
212 | fsl,pinmux-ids = <0x3180 0x3190>; | ||
213 | fsl,drive-strength = <1>; | ||
214 | fsl,voltage = <1>; | ||
215 | fsl,pull-up = <1>; | ||
216 | }; | ||
217 | |||
218 | saif0_pins_a: saif0@0 { | ||
219 | reg = <0>; | ||
220 | fsl,pinmux-ids = | ||
221 | <0x3140 0x3150 0x3160 0x3170>; | ||
222 | fsl,drive-strength = <2>; | ||
223 | fsl,voltage = <1>; | ||
224 | fsl,pull-up = <1>; | ||
225 | }; | ||
226 | |||
227 | saif1_pins_a: saif1@0 { | ||
228 | reg = <0>; | ||
229 | fsl,pinmux-ids = <0x31a0>; | ||
230 | fsl,drive-strength = <2>; | ||
231 | fsl,voltage = <1>; | ||
232 | fsl,pull-up = <1>; | ||
233 | }; | ||
234 | }; | ||
235 | |||
236 | digctl@8001c000 { | ||
237 | reg = <0x8001c000 2000>; | ||
238 | interrupts = <89>; | ||
239 | status = "disabled"; | ||
240 | }; | ||
241 | |||
242 | etm@80022000 { | ||
243 | reg = <0x80022000 2000>; | ||
244 | status = "disabled"; | ||
245 | }; | ||
246 | |||
247 | dma-apbx@80024000 { | ||
248 | compatible = "fsl,imx28-dma-apbx"; | ||
249 | reg = <0x80024000 2000>; | ||
250 | }; | ||
251 | |||
252 | dcp@80028000 { | ||
253 | reg = <0x80028000 2000>; | ||
254 | interrupts = <52 53 54>; | ||
255 | status = "disabled"; | ||
256 | }; | ||
257 | |||
258 | pxp@8002a000 { | ||
259 | reg = <0x8002a000 2000>; | ||
260 | interrupts = <39>; | ||
261 | status = "disabled"; | ||
262 | }; | ||
263 | |||
264 | ocotp@8002c000 { | ||
265 | reg = <0x8002c000 2000>; | ||
266 | status = "disabled"; | ||
267 | }; | ||
268 | |||
269 | axi-ahb@8002e000 { | ||
270 | reg = <0x8002e000 2000>; | ||
271 | status = "disabled"; | ||
272 | }; | ||
273 | |||
274 | lcdif@80030000 { | ||
275 | reg = <0x80030000 2000>; | ||
276 | interrupts = <38 86>; | ||
277 | status = "disabled"; | ||
278 | }; | ||
279 | |||
280 | can0: can@80032000 { | ||
281 | reg = <0x80032000 2000>; | ||
282 | interrupts = <8>; | ||
283 | status = "disabled"; | ||
284 | }; | ||
285 | |||
286 | can1: can@80034000 { | ||
287 | reg = <0x80034000 2000>; | ||
288 | interrupts = <9>; | ||
289 | status = "disabled"; | ||
290 | }; | ||
291 | |||
292 | simdbg@8003c000 { | ||
293 | reg = <0x8003c000 200>; | ||
294 | status = "disabled"; | ||
295 | }; | ||
296 | |||
297 | simgpmisel@8003c200 { | ||
298 | reg = <0x8003c200 100>; | ||
299 | status = "disabled"; | ||
300 | }; | ||
301 | |||
302 | simsspsel@8003c300 { | ||
303 | reg = <0x8003c300 100>; | ||
304 | status = "disabled"; | ||
305 | }; | ||
306 | |||
307 | simmemsel@8003c400 { | ||
308 | reg = <0x8003c400 100>; | ||
309 | status = "disabled"; | ||
310 | }; | ||
311 | |||
312 | gpiomon@8003c500 { | ||
313 | reg = <0x8003c500 100>; | ||
314 | status = "disabled"; | ||
315 | }; | ||
316 | |||
317 | simenet@8003c700 { | ||
318 | reg = <0x8003c700 100>; | ||
319 | status = "disabled"; | ||
320 | }; | ||
321 | |||
322 | armjtag@8003c800 { | ||
323 | reg = <0x8003c800 100>; | ||
324 | status = "disabled"; | ||
325 | }; | ||
326 | }; | ||
327 | |||
328 | apbx@80040000 { | ||
329 | compatible = "simple-bus"; | ||
330 | #address-cells = <1>; | ||
331 | #size-cells = <1>; | ||
332 | reg = <0x80040000 0x40000>; | ||
333 | ranges; | ||
334 | |||
335 | clkctl@80040000 { | ||
336 | reg = <0x80040000 2000>; | ||
337 | status = "disabled"; | ||
338 | }; | ||
339 | |||
340 | saif0: saif@80042000 { | ||
341 | compatible = "fsl,imx28-saif"; | ||
342 | reg = <0x80042000 2000>; | ||
343 | interrupts = <59 80>; | ||
344 | fsl,saif-dma-channel = <4>; | ||
345 | status = "disabled"; | ||
346 | }; | ||
347 | |||
348 | power@80044000 { | ||
349 | reg = <0x80044000 2000>; | ||
350 | status = "disabled"; | ||
351 | }; | ||
352 | |||
353 | saif1: saif@80046000 { | ||
354 | compatible = "fsl,imx28-saif"; | ||
355 | reg = <0x80046000 2000>; | ||
356 | interrupts = <58 81>; | ||
357 | fsl,saif-dma-channel = <5>; | ||
358 | status = "disabled"; | ||
359 | }; | ||
360 | |||
361 | lradc@80050000 { | ||
362 | reg = <0x80050000 2000>; | ||
363 | status = "disabled"; | ||
364 | }; | ||
365 | |||
366 | spdif@80054000 { | ||
367 | reg = <0x80054000 2000>; | ||
368 | interrupts = <45 66>; | ||
369 | status = "disabled"; | ||
370 | }; | ||
371 | |||
372 | rtc@80056000 { | ||
373 | reg = <0x80056000 2000>; | ||
374 | interrupts = <28 29>; | ||
375 | status = "disabled"; | ||
376 | }; | ||
377 | |||
378 | i2c0: i2c@80058000 { | ||
379 | #address-cells = <1>; | ||
380 | #size-cells = <0>; | ||
381 | compatible = "fsl,imx28-i2c"; | ||
382 | reg = <0x80058000 2000>; | ||
383 | interrupts = <111 68>; | ||
384 | status = "disabled"; | ||
385 | }; | ||
386 | |||
387 | i2c1: i2c@8005a000 { | ||
388 | #address-cells = <1>; | ||
389 | #size-cells = <0>; | ||
390 | compatible = "fsl,imx28-i2c"; | ||
391 | reg = <0x8005a000 2000>; | ||
392 | interrupts = <110 69>; | ||
393 | status = "disabled"; | ||
394 | }; | ||
395 | |||
396 | pwm@80064000 { | ||
397 | reg = <0x80064000 2000>; | ||
398 | status = "disabled"; | ||
399 | }; | ||
400 | |||
401 | timrot@80068000 { | ||
402 | reg = <0x80068000 2000>; | ||
403 | status = "disabled"; | ||
404 | }; | ||
405 | |||
406 | auart0: serial@8006a000 { | ||
407 | reg = <0x8006a000 0x2000>; | ||
408 | interrupts = <112 70 71>; | ||
409 | status = "disabled"; | ||
410 | }; | ||
411 | |||
412 | auart1: serial@8006c000 { | ||
413 | reg = <0x8006c000 0x2000>; | ||
414 | interrupts = <113 72 73>; | ||
415 | status = "disabled"; | ||
416 | }; | ||
417 | |||
418 | auart2: serial@8006e000 { | ||
419 | reg = <0x8006e000 0x2000>; | ||
420 | interrupts = <114 74 75>; | ||
421 | status = "disabled"; | ||
422 | }; | ||
423 | |||
424 | auart3: serial@80070000 { | ||
425 | reg = <0x80070000 0x2000>; | ||
426 | interrupts = <115 76 77>; | ||
427 | status = "disabled"; | ||
428 | }; | ||
429 | |||
430 | auart4: serial@80072000 { | ||
431 | reg = <0x80072000 0x2000>; | ||
432 | interrupts = <116 78 79>; | ||
433 | status = "disabled"; | ||
434 | }; | ||
435 | |||
436 | duart: serial@80074000 { | ||
437 | compatible = "arm,pl011", "arm,primecell"; | ||
438 | reg = <0x80074000 0x1000>; | ||
439 | interrupts = <47>; | ||
440 | status = "disabled"; | ||
441 | }; | ||
442 | |||
443 | usbphy0: usbphy@8007c000 { | ||
444 | reg = <0x8007c000 0x2000>; | ||
445 | status = "disabled"; | ||
446 | }; | ||
447 | |||
448 | usbphy1: usbphy@8007e000 { | ||
449 | reg = <0x8007e000 0x2000>; | ||
450 | status = "disabled"; | ||
451 | }; | ||
452 | }; | ||
453 | }; | ||
454 | |||
455 | ahb@80080000 { | ||
456 | compatible = "simple-bus"; | ||
457 | #address-cells = <1>; | ||
458 | #size-cells = <1>; | ||
459 | reg = <0x80080000 0x80000>; | ||
460 | ranges; | ||
461 | |||
462 | usbctrl0: usbctrl@80080000 { | ||
463 | reg = <0x80080000 0x10000>; | ||
464 | status = "disabled"; | ||
465 | }; | ||
466 | |||
467 | usbctrl1: usbctrl@80090000 { | ||
468 | reg = <0x80090000 0x10000>; | ||
469 | status = "disabled"; | ||
470 | }; | ||
471 | |||
472 | dflpt@800c0000 { | ||
473 | reg = <0x800c0000 0x10000>; | ||
474 | status = "disabled"; | ||
475 | }; | ||
476 | |||
477 | mac0: ethernet@800f0000 { | ||
478 | compatible = "fsl,imx28-fec"; | ||
479 | reg = <0x800f0000 0x4000>; | ||
480 | interrupts = <101>; | ||
481 | status = "disabled"; | ||
482 | }; | ||
483 | |||
484 | mac1: ethernet@800f4000 { | ||
485 | compatible = "fsl,imx28-fec"; | ||
486 | reg = <0x800f4000 0x4000>; | ||
487 | interrupts = <102>; | ||
488 | status = "disabled"; | ||
489 | }; | ||
490 | |||
491 | switch@800f8000 { | ||
492 | reg = <0x800f8000 0x8000>; | ||
493 | status = "disabled"; | ||
494 | }; | ||
495 | |||
496 | }; | ||
497 | }; | ||
diff --git a/arch/arm/boot/dts/imx51-babbage.dts b/arch/arm/boot/dts/imx51-babbage.dts index 9949e6060dee..de065b5976e6 100644 --- a/arch/arm/boot/dts/imx51-babbage.dts +++ b/arch/arm/boot/dts/imx51-babbage.dts | |||
@@ -17,10 +17,6 @@ | |||
17 | model = "Freescale i.MX51 Babbage Board"; | 17 | model = "Freescale i.MX51 Babbage Board"; |
18 | compatible = "fsl,imx51-babbage", "fsl,imx51"; | 18 | compatible = "fsl,imx51-babbage", "fsl,imx51"; |
19 | 19 | ||
20 | chosen { | ||
21 | bootargs = "console=ttymxc0,115200 root=/dev/mmcblk0p3 rootwait"; | ||
22 | }; | ||
23 | |||
24 | memory { | 20 | memory { |
25 | reg = <0x90000000 0x20000000>; | 21 | reg = <0x90000000 0x20000000>; |
26 | }; | 22 | }; |
@@ -40,7 +36,7 @@ | |||
40 | status = "okay"; | 36 | status = "okay"; |
41 | }; | 37 | }; |
42 | 38 | ||
43 | uart3: uart@7000c000 { | 39 | uart3: serial@7000c000 { |
44 | fsl,uart-has-rtscts; | 40 | fsl,uart-has-rtscts; |
45 | status = "okay"; | 41 | status = "okay"; |
46 | }; | 42 | }; |
@@ -166,6 +162,11 @@ | |||
166 | }; | 162 | }; |
167 | }; | 163 | }; |
168 | }; | 164 | }; |
165 | |||
166 | ssi2: ssi@70014000 { | ||
167 | fsl,mode = "i2s-slave"; | ||
168 | status = "okay"; | ||
169 | }; | ||
169 | }; | 170 | }; |
170 | 171 | ||
171 | wdog@73f98000 { /* WDOG1 */ | 172 | wdog@73f98000 { /* WDOG1 */ |
@@ -177,12 +178,12 @@ | |||
177 | reg = <0x73fa8000 0x4000>; | 178 | reg = <0x73fa8000 0x4000>; |
178 | }; | 179 | }; |
179 | 180 | ||
180 | uart1: uart@73fbc000 { | 181 | uart1: serial@73fbc000 { |
181 | fsl,uart-has-rtscts; | 182 | fsl,uart-has-rtscts; |
182 | status = "okay"; | 183 | status = "okay"; |
183 | }; | 184 | }; |
184 | 185 | ||
185 | uart2: uart@73fc0000 { | 186 | uart2: serial@73fc0000 { |
186 | status = "okay"; | 187 | status = "okay"; |
187 | }; | 188 | }; |
188 | }; | 189 | }; |
@@ -195,13 +196,20 @@ | |||
195 | i2c@83fc4000 { /* I2C2 */ | 196 | i2c@83fc4000 { /* I2C2 */ |
196 | status = "okay"; | 197 | status = "okay"; |
197 | 198 | ||
198 | codec: sgtl5000@0a { | 199 | sgtl5000: codec@0a { |
199 | compatible = "fsl,sgtl5000"; | 200 | compatible = "fsl,sgtl5000"; |
200 | reg = <0x0a>; | 201 | reg = <0x0a>; |
202 | clock-frequency = <26000000>; | ||
203 | VDDA-supply = <&vdig_reg>; | ||
204 | VDDIO-supply = <&vvideo_reg>; | ||
201 | }; | 205 | }; |
202 | }; | 206 | }; |
203 | 207 | ||
204 | fec@83fec000 { | 208 | audmux@83fd0000 { |
209 | status = "okay"; | ||
210 | }; | ||
211 | |||
212 | ethernet@83fec000 { | ||
205 | phy-mode = "mii"; | 213 | phy-mode = "mii"; |
206 | status = "okay"; | 214 | status = "okay"; |
207 | }; | 215 | }; |
@@ -218,4 +226,18 @@ | |||
218 | gpio-key,wakeup; | 226 | gpio-key,wakeup; |
219 | }; | 227 | }; |
220 | }; | 228 | }; |
229 | |||
230 | sound { | ||
231 | compatible = "fsl,imx51-babbage-sgtl5000", | ||
232 | "fsl,imx-audio-sgtl5000"; | ||
233 | model = "imx51-babbage-sgtl5000"; | ||
234 | ssi-controller = <&ssi2>; | ||
235 | audio-codec = <&sgtl5000>; | ||
236 | audio-routing = | ||
237 | "MIC_IN", "Mic Jack", | ||
238 | "Mic Jack", "Mic Bias", | ||
239 | "Headphone Jack", "HP_OUT"; | ||
240 | mux-int-port = <2>; | ||
241 | mux-ext-port = <3>; | ||
242 | }; | ||
221 | }; | 243 | }; |
diff --git a/arch/arm/boot/dts/imx51.dtsi b/arch/arm/boot/dts/imx51.dtsi index 6663986fe1c8..bfa65abe8ef2 100644 --- a/arch/arm/boot/dts/imx51.dtsi +++ b/arch/arm/boot/dts/imx51.dtsi | |||
@@ -86,7 +86,7 @@ | |||
86 | status = "disabled"; | 86 | status = "disabled"; |
87 | }; | 87 | }; |
88 | 88 | ||
89 | uart3: uart@7000c000 { | 89 | uart3: serial@7000c000 { |
90 | compatible = "fsl,imx51-uart", "fsl,imx21-uart"; | 90 | compatible = "fsl,imx51-uart", "fsl,imx21-uart"; |
91 | reg = <0x7000c000 0x4000>; | 91 | reg = <0x7000c000 0x4000>; |
92 | interrupts = <33>; | 92 | interrupts = <33>; |
@@ -102,6 +102,15 @@ | |||
102 | status = "disabled"; | 102 | status = "disabled"; |
103 | }; | 103 | }; |
104 | 104 | ||
105 | ssi2: ssi@70014000 { | ||
106 | compatible = "fsl,imx51-ssi", "fsl,imx21-ssi"; | ||
107 | reg = <0x70014000 0x4000>; | ||
108 | interrupts = <30>; | ||
109 | fsl,fifo-depth = <15>; | ||
110 | fsl,ssi-dma-events = <25 24 23 22>; /* TX0 RX0 TX1 RX1 */ | ||
111 | status = "disabled"; | ||
112 | }; | ||
113 | |||
105 | esdhc@70020000 { /* ESDHC3 */ | 114 | esdhc@70020000 { /* ESDHC3 */ |
106 | compatible = "fsl,imx51-esdhc"; | 115 | compatible = "fsl,imx51-esdhc"; |
107 | reg = <0x70020000 0x4000>; | 116 | reg = <0x70020000 0x4000>; |
@@ -171,14 +180,14 @@ | |||
171 | status = "disabled"; | 180 | status = "disabled"; |
172 | }; | 181 | }; |
173 | 182 | ||
174 | uart1: uart@73fbc000 { | 183 | uart1: serial@73fbc000 { |
175 | compatible = "fsl,imx51-uart", "fsl,imx21-uart"; | 184 | compatible = "fsl,imx51-uart", "fsl,imx21-uart"; |
176 | reg = <0x73fbc000 0x4000>; | 185 | reg = <0x73fbc000 0x4000>; |
177 | interrupts = <31>; | 186 | interrupts = <31>; |
178 | status = "disabled"; | 187 | status = "disabled"; |
179 | }; | 188 | }; |
180 | 189 | ||
181 | uart2: uart@73fc0000 { | 190 | uart2: serial@73fc0000 { |
182 | compatible = "fsl,imx51-uart", "fsl,imx21-uart"; | 191 | compatible = "fsl,imx51-uart", "fsl,imx21-uart"; |
183 | reg = <0x73fc0000 0x4000>; | 192 | reg = <0x73fc0000 0x4000>; |
184 | interrupts = <32>; | 193 | interrupts = <32>; |
@@ -235,7 +244,31 @@ | |||
235 | status = "disabled"; | 244 | status = "disabled"; |
236 | }; | 245 | }; |
237 | 246 | ||
238 | fec@83fec000 { | 247 | ssi1: ssi@83fcc000 { |
248 | compatible = "fsl,imx51-ssi", "fsl,imx21-ssi"; | ||
249 | reg = <0x83fcc000 0x4000>; | ||
250 | interrupts = <29>; | ||
251 | fsl,fifo-depth = <15>; | ||
252 | fsl,ssi-dma-events = <29 28 27 26>; /* TX0 RX0 TX1 RX1 */ | ||
253 | status = "disabled"; | ||
254 | }; | ||
255 | |||
256 | audmux@83fd0000 { | ||
257 | compatible = "fsl,imx51-audmux", "fsl,imx31-audmux"; | ||
258 | reg = <0x83fd0000 0x4000>; | ||
259 | status = "disabled"; | ||
260 | }; | ||
261 | |||
262 | ssi3: ssi@83fe8000 { | ||
263 | compatible = "fsl,imx51-ssi", "fsl,imx21-ssi"; | ||
264 | reg = <0x83fe8000 0x4000>; | ||
265 | interrupts = <96>; | ||
266 | fsl,fifo-depth = <15>; | ||
267 | fsl,ssi-dma-events = <47 46 37 35>; /* TX0 RX0 TX1 RX1 */ | ||
268 | status = "disabled"; | ||
269 | }; | ||
270 | |||
271 | ethernet@83fec000 { | ||
239 | compatible = "fsl,imx51-fec", "fsl,imx27-fec"; | 272 | compatible = "fsl,imx51-fec", "fsl,imx27-fec"; |
240 | reg = <0x83fec000 0x4000>; | 273 | reg = <0x83fec000 0x4000>; |
241 | interrupts = <87>; | 274 | interrupts = <87>; |
diff --git a/arch/arm/boot/dts/imx53-ard.dts b/arch/arm/boot/dts/imx53-ard.dts index 2dccce46ed81..5b8eafcdbeec 100644 --- a/arch/arm/boot/dts/imx53-ard.dts +++ b/arch/arm/boot/dts/imx53-ard.dts | |||
@@ -17,10 +17,6 @@ | |||
17 | model = "Freescale i.MX53 Automotive Reference Design Board"; | 17 | model = "Freescale i.MX53 Automotive Reference Design Board"; |
18 | compatible = "fsl,imx53-ard", "fsl,imx53"; | 18 | compatible = "fsl,imx53-ard", "fsl,imx53"; |
19 | 19 | ||
20 | chosen { | ||
21 | bootargs = "console=ttymxc0,115200 root=/dev/mmcblk0p3 rootwait"; | ||
22 | }; | ||
23 | |||
24 | memory { | 20 | memory { |
25 | reg = <0x70000000 0x40000000>; | 21 | reg = <0x70000000 0x40000000>; |
26 | }; | 22 | }; |
@@ -44,7 +40,7 @@ | |||
44 | reg = <0x53fa8000 0x4000>; | 40 | reg = <0x53fa8000 0x4000>; |
45 | }; | 41 | }; |
46 | 42 | ||
47 | uart1: uart@53fbc000 { | 43 | uart1: serial@53fbc000 { |
48 | status = "okay"; | 44 | status = "okay"; |
49 | }; | 45 | }; |
50 | }; | 46 | }; |
diff --git a/arch/arm/boot/dts/imx53-evk.dts b/arch/arm/boot/dts/imx53-evk.dts index 5bac4aa4800b..9c798034675e 100644 --- a/arch/arm/boot/dts/imx53-evk.dts +++ b/arch/arm/boot/dts/imx53-evk.dts | |||
@@ -17,10 +17,6 @@ | |||
17 | model = "Freescale i.MX53 Evaluation Kit"; | 17 | model = "Freescale i.MX53 Evaluation Kit"; |
18 | compatible = "fsl,imx53-evk", "fsl,imx53"; | 18 | compatible = "fsl,imx53-evk", "fsl,imx53"; |
19 | 19 | ||
20 | chosen { | ||
21 | bootargs = "console=ttymxc0,115200 root=/dev/mmcblk0p3 rootwait"; | ||
22 | }; | ||
23 | |||
24 | memory { | 20 | memory { |
25 | reg = <0x70000000 0x80000000>; | 21 | reg = <0x70000000 0x80000000>; |
26 | }; | 22 | }; |
@@ -75,7 +71,7 @@ | |||
75 | reg = <0x53fa8000 0x4000>; | 71 | reg = <0x53fa8000 0x4000>; |
76 | }; | 72 | }; |
77 | 73 | ||
78 | uart1: uart@53fbc000 { | 74 | uart1: serial@53fbc000 { |
79 | status = "okay"; | 75 | status = "okay"; |
80 | }; | 76 | }; |
81 | }; | 77 | }; |
@@ -99,7 +95,7 @@ | |||
99 | }; | 95 | }; |
100 | }; | 96 | }; |
101 | 97 | ||
102 | fec@63fec000 { | 98 | ethernet@63fec000 { |
103 | phy-mode = "rmii"; | 99 | phy-mode = "rmii"; |
104 | phy-reset-gpios = <&gpio7 6 0>; | 100 | phy-reset-gpios = <&gpio7 6 0>; |
105 | status = "okay"; | 101 | status = "okay"; |
diff --git a/arch/arm/boot/dts/imx53-qsb.dts b/arch/arm/boot/dts/imx53-qsb.dts index 5c57c8672c36..2d803a9a6949 100644 --- a/arch/arm/boot/dts/imx53-qsb.dts +++ b/arch/arm/boot/dts/imx53-qsb.dts | |||
@@ -17,10 +17,6 @@ | |||
17 | model = "Freescale i.MX53 Quick Start Board"; | 17 | model = "Freescale i.MX53 Quick Start Board"; |
18 | compatible = "fsl,imx53-qsb", "fsl,imx53"; | 18 | compatible = "fsl,imx53-qsb", "fsl,imx53"; |
19 | 19 | ||
20 | chosen { | ||
21 | bootargs = "console=ttymxc0,115200 root=/dev/mmcblk0p3 rootwait"; | ||
22 | }; | ||
23 | |||
24 | memory { | 20 | memory { |
25 | reg = <0x70000000 0x40000000>; | 21 | reg = <0x70000000 0x40000000>; |
26 | }; | 22 | }; |
@@ -33,6 +29,11 @@ | |||
33 | status = "okay"; | 29 | status = "okay"; |
34 | }; | 30 | }; |
35 | 31 | ||
32 | ssi2: ssi@50014000 { | ||
33 | fsl,mode = "i2s-slave"; | ||
34 | status = "okay"; | ||
35 | }; | ||
36 | |||
36 | esdhc@50020000 { /* ESDHC3 */ | 37 | esdhc@50020000 { /* ESDHC3 */ |
37 | cd-gpios = <&gpio3 11 0>; | 38 | cd-gpios = <&gpio3 11 0>; |
38 | wp-gpios = <&gpio3 12 0>; | 39 | wp-gpios = <&gpio3 12 0>; |
@@ -49,7 +50,7 @@ | |||
49 | reg = <0x53fa8000 0x4000>; | 50 | reg = <0x53fa8000 0x4000>; |
50 | }; | 51 | }; |
51 | 52 | ||
52 | uart1: uart@53fbc000 { | 53 | uart1: serial@53fbc000 { |
53 | status = "okay"; | 54 | status = "okay"; |
54 | }; | 55 | }; |
55 | }; | 56 | }; |
@@ -62,9 +63,11 @@ | |||
62 | i2c@63fc4000 { /* I2C2 */ | 63 | i2c@63fc4000 { /* I2C2 */ |
63 | status = "okay"; | 64 | status = "okay"; |
64 | 65 | ||
65 | codec: sgtl5000@0a { | 66 | sgtl5000: codec@0a { |
66 | compatible = "fsl,sgtl5000"; | 67 | compatible = "fsl,sgtl5000"; |
67 | reg = <0x0a>; | 68 | reg = <0x0a>; |
69 | VDDA-supply = <®_3p2v>; | ||
70 | VDDIO-supply = <®_3p2v>; | ||
68 | }; | 71 | }; |
69 | }; | 72 | }; |
70 | 73 | ||
@@ -77,12 +80,88 @@ | |||
77 | }; | 80 | }; |
78 | 81 | ||
79 | pmic: dialog@48 { | 82 | pmic: dialog@48 { |
80 | compatible = "dialog,da9053", "dialog,da9052"; | 83 | compatible = "dlg,da9053-aa", "dlg,da9052"; |
81 | reg = <0x48>; | 84 | reg = <0x48>; |
85 | |||
86 | regulators { | ||
87 | buck0 { | ||
88 | regulator-min-microvolt = <500000>; | ||
89 | regulator-max-microvolt = <2075000>; | ||
90 | }; | ||
91 | |||
92 | buck1 { | ||
93 | regulator-min-microvolt = <500000>; | ||
94 | regulator-max-microvolt = <2075000>; | ||
95 | }; | ||
96 | |||
97 | buck2 { | ||
98 | regulator-min-microvolt = <925000>; | ||
99 | regulator-max-microvolt = <2500000>; | ||
100 | }; | ||
101 | |||
102 | buck3 { | ||
103 | regulator-min-microvolt = <925000>; | ||
104 | regulator-max-microvolt = <2500000>; | ||
105 | }; | ||
106 | |||
107 | ldo4 { | ||
108 | regulator-min-microvolt = <600000>; | ||
109 | regulator-max-microvolt = <1800000>; | ||
110 | }; | ||
111 | |||
112 | ldo5 { | ||
113 | regulator-min-microvolt = <600000>; | ||
114 | regulator-max-microvolt = <1800000>; | ||
115 | }; | ||
116 | |||
117 | ldo6 { | ||
118 | regulator-min-microvolt = <1725000>; | ||
119 | regulator-max-microvolt = <3300000>; | ||
120 | }; | ||
121 | |||
122 | ldo7 { | ||
123 | regulator-min-microvolt = <1725000>; | ||
124 | regulator-max-microvolt = <3300000>; | ||
125 | }; | ||
126 | |||
127 | ldo8 { | ||
128 | regulator-min-microvolt = <1200000>; | ||
129 | regulator-max-microvolt = <3600000>; | ||
130 | }; | ||
131 | |||
132 | ldo9 { | ||
133 | regulator-min-microvolt = <1200000>; | ||
134 | regulator-max-microvolt = <3600000>; | ||
135 | }; | ||
136 | |||
137 | ldo10 { | ||
138 | regulator-min-microvolt = <1200000>; | ||
139 | regulator-max-microvolt = <3600000>; | ||
140 | }; | ||
141 | |||
142 | ldo11 { | ||
143 | regulator-min-microvolt = <1200000>; | ||
144 | regulator-max-microvolt = <3600000>; | ||
145 | }; | ||
146 | |||
147 | ldo12 { | ||
148 | regulator-min-microvolt = <1250000>; | ||
149 | regulator-max-microvolt = <3650000>; | ||
150 | }; | ||
151 | |||
152 | ldo13 { | ||
153 | regulator-min-microvolt = <1200000>; | ||
154 | regulator-max-microvolt = <3600000>; | ||
155 | }; | ||
156 | }; | ||
82 | }; | 157 | }; |
83 | }; | 158 | }; |
84 | 159 | ||
85 | fec@63fec000 { | 160 | audmux@63fd0000 { |
161 | status = "okay"; | ||
162 | }; | ||
163 | |||
164 | ethernet@63fec000 { | ||
86 | phy-mode = "rmii"; | 165 | phy-mode = "rmii"; |
87 | phy-reset-gpios = <&gpio7 6 0>; | 166 | phy-reset-gpios = <&gpio7 6 0>; |
88 | status = "okay"; | 167 | status = "okay"; |
@@ -122,4 +201,30 @@ | |||
122 | linux,default-trigger = "heartbeat"; | 201 | linux,default-trigger = "heartbeat"; |
123 | }; | 202 | }; |
124 | }; | 203 | }; |
204 | |||
205 | regulators { | ||
206 | compatible = "simple-bus"; | ||
207 | |||
208 | reg_3p2v: 3p2v { | ||
209 | compatible = "regulator-fixed"; | ||
210 | regulator-name = "3P2V"; | ||
211 | regulator-min-microvolt = <3200000>; | ||
212 | regulator-max-microvolt = <3200000>; | ||
213 | regulator-always-on; | ||
214 | }; | ||
215 | }; | ||
216 | |||
217 | sound { | ||
218 | compatible = "fsl,imx53-qsb-sgtl5000", | ||
219 | "fsl,imx-audio-sgtl5000"; | ||
220 | model = "imx53-qsb-sgtl5000"; | ||
221 | ssi-controller = <&ssi2>; | ||
222 | audio-codec = <&sgtl5000>; | ||
223 | audio-routing = | ||
224 | "MIC_IN", "Mic Jack", | ||
225 | "Mic Jack", "Mic Bias", | ||
226 | "Headphone Jack", "HP_OUT"; | ||
227 | mux-int-port = <2>; | ||
228 | mux-ext-port = <5>; | ||
229 | }; | ||
125 | }; | 230 | }; |
diff --git a/arch/arm/boot/dts/imx53-smd.dts b/arch/arm/boot/dts/imx53-smd.dts index c7ee86c2dfb5..08091029168e 100644 --- a/arch/arm/boot/dts/imx53-smd.dts +++ b/arch/arm/boot/dts/imx53-smd.dts | |||
@@ -17,10 +17,6 @@ | |||
17 | model = "Freescale i.MX53 Smart Mobile Reference Design Board"; | 17 | model = "Freescale i.MX53 Smart Mobile Reference Design Board"; |
18 | compatible = "fsl,imx53-smd", "fsl,imx53"; | 18 | compatible = "fsl,imx53-smd", "fsl,imx53"; |
19 | 19 | ||
20 | chosen { | ||
21 | bootargs = "console=ttymxc0,115200 root=/dev/mmcblk0p3 rootwait"; | ||
22 | }; | ||
23 | |||
24 | memory { | 20 | memory { |
25 | reg = <0x70000000 0x40000000>; | 21 | reg = <0x70000000 0x40000000>; |
26 | }; | 22 | }; |
@@ -35,11 +31,11 @@ | |||
35 | }; | 31 | }; |
36 | 32 | ||
37 | esdhc@50008000 { /* ESDHC2 */ | 33 | esdhc@50008000 { /* ESDHC2 */ |
38 | fsl,card-wired; | 34 | non-removable; |
39 | status = "okay"; | 35 | status = "okay"; |
40 | }; | 36 | }; |
41 | 37 | ||
42 | uart3: uart@5000c000 { | 38 | uart3: serial@5000c000 { |
43 | fsl,uart-has-rtscts; | 39 | fsl,uart-has-rtscts; |
44 | status = "okay"; | 40 | status = "okay"; |
45 | }; | 41 | }; |
@@ -76,7 +72,7 @@ | |||
76 | }; | 72 | }; |
77 | 73 | ||
78 | esdhc@50020000 { /* ESDHC3 */ | 74 | esdhc@50020000 { /* ESDHC3 */ |
79 | fsl,card-wired; | 75 | non-removable; |
80 | status = "okay"; | 76 | status = "okay"; |
81 | }; | 77 | }; |
82 | }; | 78 | }; |
@@ -90,11 +86,11 @@ | |||
90 | reg = <0x53fa8000 0x4000>; | 86 | reg = <0x53fa8000 0x4000>; |
91 | }; | 87 | }; |
92 | 88 | ||
93 | uart1: uart@53fbc000 { | 89 | uart1: serial@53fbc000 { |
94 | status = "okay"; | 90 | status = "okay"; |
95 | }; | 91 | }; |
96 | 92 | ||
97 | uart2: uart@53fc0000 { | 93 | uart2: serial@53fc0000 { |
98 | status = "okay"; | 94 | status = "okay"; |
99 | }; | 95 | }; |
100 | }; | 96 | }; |
@@ -142,7 +138,7 @@ | |||
142 | }; | 138 | }; |
143 | }; | 139 | }; |
144 | 140 | ||
145 | fec@63fec000 { | 141 | ethernet@63fec000 { |
146 | phy-mode = "rmii"; | 142 | phy-mode = "rmii"; |
147 | phy-reset-gpios = <&gpio7 6 0>; | 143 | phy-reset-gpios = <&gpio7 6 0>; |
148 | status = "okay"; | 144 | status = "okay"; |
diff --git a/arch/arm/boot/dts/imx53.dtsi b/arch/arm/boot/dts/imx53.dtsi index 5dd91b942c91..e3e869470cd3 100644 --- a/arch/arm/boot/dts/imx53.dtsi +++ b/arch/arm/boot/dts/imx53.dtsi | |||
@@ -88,7 +88,7 @@ | |||
88 | status = "disabled"; | 88 | status = "disabled"; |
89 | }; | 89 | }; |
90 | 90 | ||
91 | uart3: uart@5000c000 { | 91 | uart3: serial@5000c000 { |
92 | compatible = "fsl,imx53-uart", "fsl,imx21-uart"; | 92 | compatible = "fsl,imx53-uart", "fsl,imx21-uart"; |
93 | reg = <0x5000c000 0x4000>; | 93 | reg = <0x5000c000 0x4000>; |
94 | interrupts = <33>; | 94 | interrupts = <33>; |
@@ -104,6 +104,15 @@ | |||
104 | status = "disabled"; | 104 | status = "disabled"; |
105 | }; | 105 | }; |
106 | 106 | ||
107 | ssi2: ssi@50014000 { | ||
108 | compatible = "fsl,imx53-ssi", "fsl,imx21-ssi"; | ||
109 | reg = <0x50014000 0x4000>; | ||
110 | interrupts = <30>; | ||
111 | fsl,fifo-depth = <15>; | ||
112 | fsl,ssi-dma-events = <25 24 23 22>; /* TX0 RX0 TX1 RX1 */ | ||
113 | status = "disabled"; | ||
114 | }; | ||
115 | |||
107 | esdhc@50020000 { /* ESDHC3 */ | 116 | esdhc@50020000 { /* ESDHC3 */ |
108 | compatible = "fsl,imx53-esdhc"; | 117 | compatible = "fsl,imx53-esdhc"; |
109 | reg = <0x50020000 0x4000>; | 118 | reg = <0x50020000 0x4000>; |
@@ -173,14 +182,14 @@ | |||
173 | status = "disabled"; | 182 | status = "disabled"; |
174 | }; | 183 | }; |
175 | 184 | ||
176 | uart1: uart@53fbc000 { | 185 | uart1: serial@53fbc000 { |
177 | compatible = "fsl,imx53-uart", "fsl,imx21-uart"; | 186 | compatible = "fsl,imx53-uart", "fsl,imx21-uart"; |
178 | reg = <0x53fbc000 0x4000>; | 187 | reg = <0x53fbc000 0x4000>; |
179 | interrupts = <31>; | 188 | interrupts = <31>; |
180 | status = "disabled"; | 189 | status = "disabled"; |
181 | }; | 190 | }; |
182 | 191 | ||
183 | uart2: uart@53fc0000 { | 192 | uart2: serial@53fc0000 { |
184 | compatible = "fsl,imx53-uart", "fsl,imx21-uart"; | 193 | compatible = "fsl,imx53-uart", "fsl,imx21-uart"; |
185 | reg = <0x53fc0000 0x4000>; | 194 | reg = <0x53fc0000 0x4000>; |
186 | interrupts = <32>; | 195 | interrupts = <32>; |
@@ -226,7 +235,7 @@ | |||
226 | status = "disabled"; | 235 | status = "disabled"; |
227 | }; | 236 | }; |
228 | 237 | ||
229 | uart4: uart@53ff0000 { | 238 | uart4: serial@53ff0000 { |
230 | compatible = "fsl,imx53-uart", "fsl,imx21-uart"; | 239 | compatible = "fsl,imx53-uart", "fsl,imx21-uart"; |
231 | reg = <0x53ff0000 0x4000>; | 240 | reg = <0x53ff0000 0x4000>; |
232 | interrupts = <13>; | 241 | interrupts = <13>; |
@@ -241,7 +250,7 @@ | |||
241 | reg = <0x60000000 0x10000000>; | 250 | reg = <0x60000000 0x10000000>; |
242 | ranges; | 251 | ranges; |
243 | 252 | ||
244 | uart5: uart@63f90000 { | 253 | uart5: serial@63f90000 { |
245 | compatible = "fsl,imx53-uart", "fsl,imx21-uart"; | 254 | compatible = "fsl,imx53-uart", "fsl,imx21-uart"; |
246 | reg = <0x63f90000 0x4000>; | 255 | reg = <0x63f90000 0x4000>; |
247 | interrupts = <86>; | 256 | interrupts = <86>; |
@@ -290,7 +299,31 @@ | |||
290 | status = "disabled"; | 299 | status = "disabled"; |
291 | }; | 300 | }; |
292 | 301 | ||
293 | fec@63fec000 { | 302 | ssi1: ssi@63fcc000 { |
303 | compatible = "fsl,imx53-ssi", "fsl,imx21-ssi"; | ||
304 | reg = <0x63fcc000 0x4000>; | ||
305 | interrupts = <29>; | ||
306 | fsl,fifo-depth = <15>; | ||
307 | fsl,ssi-dma-events = <29 28 27 26>; /* TX0 RX0 TX1 RX1 */ | ||
308 | status = "disabled"; | ||
309 | }; | ||
310 | |||
311 | audmux@63fd0000 { | ||
312 | compatible = "fsl,imx53-audmux", "fsl,imx31-audmux"; | ||
313 | reg = <0x63fd0000 0x4000>; | ||
314 | status = "disabled"; | ||
315 | }; | ||
316 | |||
317 | ssi3: ssi@63fe8000 { | ||
318 | compatible = "fsl,imx53-ssi", "fsl,imx21-ssi"; | ||
319 | reg = <0x63fe8000 0x4000>; | ||
320 | interrupts = <96>; | ||
321 | fsl,fifo-depth = <15>; | ||
322 | fsl,ssi-dma-events = <47 46 45 44>; /* TX0 RX0 TX1 RX1 */ | ||
323 | status = "disabled"; | ||
324 | }; | ||
325 | |||
326 | ethernet@63fec000 { | ||
294 | compatible = "fsl,imx53-fec", "fsl,imx25-fec"; | 327 | compatible = "fsl,imx53-fec", "fsl,imx25-fec"; |
295 | reg = <0x63fec000 0x4000>; | 328 | reg = <0x63fec000 0x4000>; |
296 | interrupts = <87>; | 329 | interrupts = <87>; |
diff --git a/arch/arm/boot/dts/imx6q-arm2.dts b/arch/arm/boot/dts/imx6q-arm2.dts index ce1c8238c897..db4c6096c562 100644 --- a/arch/arm/boot/dts/imx6q-arm2.dts +++ b/arch/arm/boot/dts/imx6q-arm2.dts | |||
@@ -17,19 +17,14 @@ | |||
17 | model = "Freescale i.MX6 Quad Armadillo2 Board"; | 17 | model = "Freescale i.MX6 Quad Armadillo2 Board"; |
18 | compatible = "fsl,imx6q-arm2", "fsl,imx6q"; | 18 | compatible = "fsl,imx6q-arm2", "fsl,imx6q"; |
19 | 19 | ||
20 | chosen { | ||
21 | bootargs = "console=ttymxc0,115200 root=/dev/mmcblk3p3 rootwait"; | ||
22 | }; | ||
23 | |||
24 | memory { | 20 | memory { |
25 | reg = <0x10000000 0x80000000>; | 21 | reg = <0x10000000 0x80000000>; |
26 | }; | 22 | }; |
27 | 23 | ||
28 | soc { | 24 | soc { |
29 | aips-bus@02100000 { /* AIPS2 */ | 25 | aips-bus@02100000 { /* AIPS2 */ |
30 | enet@02188000 { | 26 | ethernet@02188000 { |
31 | phy-mode = "rgmii"; | 27 | phy-mode = "rgmii"; |
32 | local-mac-address = [00 04 9F 01 1B 61]; | ||
33 | status = "okay"; | 28 | status = "okay"; |
34 | }; | 29 | }; |
35 | 30 | ||
@@ -37,16 +32,20 @@ | |||
37 | cd-gpios = <&gpio6 11 0>; | 32 | cd-gpios = <&gpio6 11 0>; |
38 | wp-gpios = <&gpio6 14 0>; | 33 | wp-gpios = <&gpio6 14 0>; |
39 | vmmc-supply = <®_3p3v>; | 34 | vmmc-supply = <®_3p3v>; |
35 | pinctrl-names = "default"; | ||
36 | pinctrl-0 = <&pinctrl_usdhc3_1>; | ||
40 | status = "okay"; | 37 | status = "okay"; |
41 | }; | 38 | }; |
42 | 39 | ||
43 | usdhc@0219c000 { /* uSDHC4 */ | 40 | usdhc@0219c000 { /* uSDHC4 */ |
44 | fsl,card-wired; | 41 | non-removable; |
45 | vmmc-supply = <®_3p3v>; | 42 | vmmc-supply = <®_3p3v>; |
43 | pinctrl-names = "default"; | ||
44 | pinctrl-0 = <&pinctrl_usdhc4_1>; | ||
46 | status = "okay"; | 45 | status = "okay"; |
47 | }; | 46 | }; |
48 | 47 | ||
49 | uart4: uart@021f0000 { | 48 | uart4: serial@021f0000 { |
50 | status = "okay"; | 49 | status = "okay"; |
51 | }; | 50 | }; |
52 | }; | 51 | }; |
diff --git a/arch/arm/boot/dts/imx6q-sabrelite.dts b/arch/arm/boot/dts/imx6q-sabrelite.dts index 4663a4e5a285..e0ec92973e7e 100644 --- a/arch/arm/boot/dts/imx6q-sabrelite.dts +++ b/arch/arm/boot/dts/imx6q-sabrelite.dts | |||
@@ -22,8 +22,30 @@ | |||
22 | }; | 22 | }; |
23 | 23 | ||
24 | soc { | 24 | soc { |
25 | aips-bus@02000000 { /* AIPS1 */ | ||
26 | spba-bus@02000000 { | ||
27 | ecspi@02008000 { /* eCSPI1 */ | ||
28 | fsl,spi-num-chipselects = <1>; | ||
29 | cs-gpios = <&gpio3 19 0>; | ||
30 | status = "okay"; | ||
31 | |||
32 | flash: m25p80@0 { | ||
33 | compatible = "sst,sst25vf016b"; | ||
34 | spi-max-frequency = <20000000>; | ||
35 | reg = <0>; | ||
36 | }; | ||
37 | }; | ||
38 | |||
39 | ssi1: ssi@02028000 { | ||
40 | fsl,mode = "i2s-slave"; | ||
41 | status = "okay"; | ||
42 | }; | ||
43 | }; | ||
44 | |||
45 | }; | ||
46 | |||
25 | aips-bus@02100000 { /* AIPS2 */ | 47 | aips-bus@02100000 { /* AIPS2 */ |
26 | enet@02188000 { | 48 | ethernet@02188000 { |
27 | phy-mode = "rgmii"; | 49 | phy-mode = "rgmii"; |
28 | phy-reset-gpios = <&gpio3 23 0>; | 50 | phy-reset-gpios = <&gpio3 23 0>; |
29 | status = "okay"; | 51 | status = "okay"; |
@@ -43,13 +65,23 @@ | |||
43 | status = "okay"; | 65 | status = "okay"; |
44 | }; | 66 | }; |
45 | 67 | ||
46 | uart2: uart@021e8000 { | 68 | audmux@021d8000 { |
69 | status = "okay"; | ||
70 | pinctrl-names = "default"; | ||
71 | pinctrl-0 = <&pinctrl_audmux_1>; | ||
72 | }; | ||
73 | |||
74 | uart2: serial@021e8000 { | ||
47 | status = "okay"; | 75 | status = "okay"; |
76 | pinctrl-names = "default"; | ||
77 | pinctrl-0 = <&pinctrl_serial2_1>; | ||
48 | }; | 78 | }; |
49 | 79 | ||
50 | i2c@021a0000 { /* I2C1 */ | 80 | i2c@021a0000 { /* I2C1 */ |
51 | status = "okay"; | 81 | status = "okay"; |
52 | clock-frequency = <100000>; | 82 | clock-frequency = <100000>; |
83 | pinctrl-names = "default"; | ||
84 | pinctrl-0 = <&pinctrl_i2c1_1>; | ||
53 | 85 | ||
54 | codec: sgtl5000@0a { | 86 | codec: sgtl5000@0a { |
55 | compatible = "fsl,sgtl5000"; | 87 | compatible = "fsl,sgtl5000"; |
@@ -80,4 +112,18 @@ | |||
80 | regulator-always-on; | 112 | regulator-always-on; |
81 | }; | 113 | }; |
82 | }; | 114 | }; |
115 | |||
116 | sound { | ||
117 | compatible = "fsl,imx6q-sabrelite-sgtl5000", | ||
118 | "fsl,imx-audio-sgtl5000"; | ||
119 | model = "imx6q-sabrelite-sgtl5000"; | ||
120 | ssi-controller = <&ssi1>; | ||
121 | audio-codec = <&codec>; | ||
122 | audio-routing = | ||
123 | "MIC_IN", "Mic Jack", | ||
124 | "Mic Jack", "Mic Bias", | ||
125 | "Headphone Jack", "HP_OUT"; | ||
126 | mux-int-port = <1>; | ||
127 | mux-ext-port = <4>; | ||
128 | }; | ||
83 | }; | 129 | }; |
diff --git a/arch/arm/boot/dts/imx6q-sabresd.dts b/arch/arm/boot/dts/imx6q-sabresd.dts new file mode 100644 index 000000000000..07509a181178 --- /dev/null +++ b/arch/arm/boot/dts/imx6q-sabresd.dts | |||
@@ -0,0 +1,53 @@ | |||
1 | /* | ||
2 | * Copyright 2012 Freescale Semiconductor, Inc. | ||
3 | * Copyright 2011 Linaro Ltd. | ||
4 | * | ||
5 | * The code contained herein is licensed under the GNU General Public | ||
6 | * License. You may obtain a copy of the GNU General Public License | ||
7 | * Version 2 or later at the following locations: | ||
8 | * | ||
9 | * http://www.opensource.org/licenses/gpl-license.html | ||
10 | * http://www.gnu.org/copyleft/gpl.html | ||
11 | */ | ||
12 | |||
13 | /dts-v1/; | ||
14 | /include/ "imx6q.dtsi" | ||
15 | |||
16 | / { | ||
17 | model = "Freescale i.MX6Q SABRE Smart Device Board"; | ||
18 | compatible = "fsl,imx6q-sabresd", "fsl,imx6q"; | ||
19 | |||
20 | memory { | ||
21 | reg = <0x10000000 0x40000000>; | ||
22 | }; | ||
23 | |||
24 | soc { | ||
25 | |||
26 | aips-bus@02000000 { /* AIPS1 */ | ||
27 | spba-bus@02000000 { | ||
28 | uart1: serial@02020000 { | ||
29 | status = "okay"; | ||
30 | }; | ||
31 | }; | ||
32 | }; | ||
33 | |||
34 | aips-bus@02100000 { /* AIPS2 */ | ||
35 | ethernet@02188000 { | ||
36 | phy-mode = "rgmii"; | ||
37 | status = "okay"; | ||
38 | }; | ||
39 | |||
40 | usdhc@02194000 { /* uSDHC2 */ | ||
41 | cd-gpios = <&gpio2 2 0>; | ||
42 | wp-gpios = <&gpio2 3 0>; | ||
43 | status = "okay"; | ||
44 | }; | ||
45 | |||
46 | usdhc@02198000 { /* uSDHC3 */ | ||
47 | cd-gpios = <&gpio2 0 0>; | ||
48 | wp-gpios = <&gpio2 1 0>; | ||
49 | status = "okay"; | ||
50 | }; | ||
51 | }; | ||
52 | }; | ||
53 | }; | ||
diff --git a/arch/arm/boot/dts/imx6q.dtsi b/arch/arm/boot/dts/imx6q.dtsi index 4905f51a106f..8c90cbac945f 100644 --- a/arch/arm/boot/dts/imx6q.dtsi +++ b/arch/arm/boot/dts/imx6q.dtsi | |||
@@ -165,7 +165,7 @@ | |||
165 | status = "disabled"; | 165 | status = "disabled"; |
166 | }; | 166 | }; |
167 | 167 | ||
168 | uart1: uart@02020000 { | 168 | uart1: serial@02020000 { |
169 | compatible = "fsl,imx6q-uart", "fsl,imx21-uart"; | 169 | compatible = "fsl,imx6q-uart", "fsl,imx21-uart"; |
170 | reg = <0x02020000 0x4000>; | 170 | reg = <0x02020000 0x4000>; |
171 | interrupts = <0 26 0x04>; | 171 | interrupts = <0 26 0x04>; |
@@ -177,19 +177,31 @@ | |||
177 | interrupts = <0 51 0x04>; | 177 | interrupts = <0 51 0x04>; |
178 | }; | 178 | }; |
179 | 179 | ||
180 | ssi@02028000 { /* SSI1 */ | 180 | ssi1: ssi@02028000 { |
181 | compatible = "fsl,imx6q-ssi","fsl,imx21-ssi"; | ||
181 | reg = <0x02028000 0x4000>; | 182 | reg = <0x02028000 0x4000>; |
182 | interrupts = <0 46 0x04>; | 183 | interrupts = <0 46 0x04>; |
184 | fsl,fifo-depth = <15>; | ||
185 | fsl,ssi-dma-events = <38 37>; | ||
186 | status = "disabled"; | ||
183 | }; | 187 | }; |
184 | 188 | ||
185 | ssi@0202c000 { /* SSI2 */ | 189 | ssi2: ssi@0202c000 { |
190 | compatible = "fsl,imx6q-ssi","fsl,imx21-ssi"; | ||
186 | reg = <0x0202c000 0x4000>; | 191 | reg = <0x0202c000 0x4000>; |
187 | interrupts = <0 47 0x04>; | 192 | interrupts = <0 47 0x04>; |
193 | fsl,fifo-depth = <15>; | ||
194 | fsl,ssi-dma-events = <42 41>; | ||
195 | status = "disabled"; | ||
188 | }; | 196 | }; |
189 | 197 | ||
190 | ssi@02030000 { /* SSI3 */ | 198 | ssi3: ssi@02030000 { |
199 | compatible = "fsl,imx6q-ssi","fsl,imx21-ssi"; | ||
191 | reg = <0x02030000 0x4000>; | 200 | reg = <0x02030000 0x4000>; |
192 | interrupts = <0 48 0x04>; | 201 | interrupts = <0 48 0x04>; |
202 | fsl,fifo-depth = <15>; | ||
203 | fsl,ssi-dma-events = <46 45>; | ||
204 | status = "disabled"; | ||
193 | }; | 205 | }; |
194 | 206 | ||
195 | asrc@02034000 { | 207 | asrc@02034000 { |
@@ -346,6 +358,90 @@ | |||
346 | compatible = "fsl,imx6q-anatop"; | 358 | compatible = "fsl,imx6q-anatop"; |
347 | reg = <0x020c8000 0x1000>; | 359 | reg = <0x020c8000 0x1000>; |
348 | interrupts = <0 49 0x04 0 54 0x04 0 127 0x04>; | 360 | interrupts = <0 49 0x04 0 54 0x04 0 127 0x04>; |
361 | |||
362 | regulator-1p1@110 { | ||
363 | compatible = "fsl,anatop-regulator"; | ||
364 | regulator-name = "vdd1p1"; | ||
365 | regulator-min-microvolt = <800000>; | ||
366 | regulator-max-microvolt = <1375000>; | ||
367 | regulator-always-on; | ||
368 | anatop-reg-offset = <0x110>; | ||
369 | anatop-vol-bit-shift = <8>; | ||
370 | anatop-vol-bit-width = <5>; | ||
371 | anatop-min-bit-val = <4>; | ||
372 | anatop-min-voltage = <800000>; | ||
373 | anatop-max-voltage = <1375000>; | ||
374 | }; | ||
375 | |||
376 | regulator-3p0@120 { | ||
377 | compatible = "fsl,anatop-regulator"; | ||
378 | regulator-name = "vdd3p0"; | ||
379 | regulator-min-microvolt = <2800000>; | ||
380 | regulator-max-microvolt = <3150000>; | ||
381 | regulator-always-on; | ||
382 | anatop-reg-offset = <0x120>; | ||
383 | anatop-vol-bit-shift = <8>; | ||
384 | anatop-vol-bit-width = <5>; | ||
385 | anatop-min-bit-val = <0>; | ||
386 | anatop-min-voltage = <2625000>; | ||
387 | anatop-max-voltage = <3400000>; | ||
388 | }; | ||
389 | |||
390 | regulator-2p5@130 { | ||
391 | compatible = "fsl,anatop-regulator"; | ||
392 | regulator-name = "vdd2p5"; | ||
393 | regulator-min-microvolt = <2000000>; | ||
394 | regulator-max-microvolt = <2750000>; | ||
395 | regulator-always-on; | ||
396 | anatop-reg-offset = <0x130>; | ||
397 | anatop-vol-bit-shift = <8>; | ||
398 | anatop-vol-bit-width = <5>; | ||
399 | anatop-min-bit-val = <0>; | ||
400 | anatop-min-voltage = <2000000>; | ||
401 | anatop-max-voltage = <2750000>; | ||
402 | }; | ||
403 | |||
404 | regulator-vddcore@140 { | ||
405 | compatible = "fsl,anatop-regulator"; | ||
406 | regulator-name = "cpu"; | ||
407 | regulator-min-microvolt = <725000>; | ||
408 | regulator-max-microvolt = <1450000>; | ||
409 | regulator-always-on; | ||
410 | anatop-reg-offset = <0x140>; | ||
411 | anatop-vol-bit-shift = <0>; | ||
412 | anatop-vol-bit-width = <5>; | ||
413 | anatop-min-bit-val = <1>; | ||
414 | anatop-min-voltage = <725000>; | ||
415 | anatop-max-voltage = <1450000>; | ||
416 | }; | ||
417 | |||
418 | regulator-vddpu@140 { | ||
419 | compatible = "fsl,anatop-regulator"; | ||
420 | regulator-name = "vddpu"; | ||
421 | regulator-min-microvolt = <725000>; | ||
422 | regulator-max-microvolt = <1450000>; | ||
423 | regulator-always-on; | ||
424 | anatop-reg-offset = <0x140>; | ||
425 | anatop-vol-bit-shift = <9>; | ||
426 | anatop-vol-bit-width = <5>; | ||
427 | anatop-min-bit-val = <1>; | ||
428 | anatop-min-voltage = <725000>; | ||
429 | anatop-max-voltage = <1450000>; | ||
430 | }; | ||
431 | |||
432 | regulator-vddsoc@140 { | ||
433 | compatible = "fsl,anatop-regulator"; | ||
434 | regulator-name = "vddsoc"; | ||
435 | regulator-min-microvolt = <725000>; | ||
436 | regulator-max-microvolt = <1450000>; | ||
437 | regulator-always-on; | ||
438 | anatop-reg-offset = <0x140>; | ||
439 | anatop-vol-bit-shift = <18>; | ||
440 | anatop-vol-bit-width = <5>; | ||
441 | anatop-min-bit-val = <1>; | ||
442 | anatop-min-voltage = <725000>; | ||
443 | anatop-max-voltage = <1450000>; | ||
444 | }; | ||
349 | }; | 445 | }; |
350 | 446 | ||
351 | usbphy@020c9000 { /* USBPHY1 */ | 447 | usbphy@020c9000 { /* USBPHY1 */ |
@@ -386,7 +482,62 @@ | |||
386 | }; | 482 | }; |
387 | 483 | ||
388 | iomuxc@020e0000 { | 484 | iomuxc@020e0000 { |
485 | compatible = "fsl,imx6q-iomuxc"; | ||
389 | reg = <0x020e0000 0x4000>; | 486 | reg = <0x020e0000 0x4000>; |
487 | |||
488 | /* shared pinctrl settings */ | ||
489 | audmux { | ||
490 | pinctrl_audmux_1: audmux-1 { | ||
491 | fsl,pins = <18 0x80000000 /* MX6Q_PAD_SD2_DAT0__AUDMUX_AUD4_RXD */ | ||
492 | 1586 0x80000000 /* MX6Q_PAD_SD2_DAT3__AUDMUX_AUD4_TXC */ | ||
493 | 11 0x80000000 /* MX6Q_PAD_SD2_DAT2__AUDMUX_AUD4_TXD */ | ||
494 | 3 0x80000000>; /* MX6Q_PAD_SD2_DAT1__AUDMUX_AUD4_TXFS */ | ||
495 | }; | ||
496 | }; | ||
497 | |||
498 | i2c1 { | ||
499 | pinctrl_i2c1_1: i2c1grp-1 { | ||
500 | fsl,pins = <137 0x4001b8b1 /* MX6Q_PAD_EIM_D21__I2C1_SCL */ | ||
501 | 196 0x4001b8b1>; /* MX6Q_PAD_EIM_D28__I2C1_SDA */ | ||
502 | }; | ||
503 | }; | ||
504 | |||
505 | serial2 { | ||
506 | pinctrl_serial2_1: serial2grp-1 { | ||
507 | fsl,pins = <183 0x1b0b1 /* MX6Q_PAD_EIM_D26__UART2_TXD */ | ||
508 | 191 0x1b0b1>; /* MX6Q_PAD_EIM_D27__UART2_RXD */ | ||
509 | }; | ||
510 | }; | ||
511 | |||
512 | usdhc3 { | ||
513 | pinctrl_usdhc3_1: usdhc3grp-1 { | ||
514 | fsl,pins = <1273 0x17059 /* MX6Q_PAD_SD3_CMD__USDHC3_CMD */ | ||
515 | 1281 0x10059 /* MX6Q_PAD_SD3_CLK__USDHC3_CLK */ | ||
516 | 1289 0x17059 /* MX6Q_PAD_SD3_DAT0__USDHC3_DAT0 */ | ||
517 | 1297 0x17059 /* MX6Q_PAD_SD3_DAT1__USDHC3_DAT1 */ | ||
518 | 1305 0x17059 /* MX6Q_PAD_SD3_DAT2__USDHC3_DAT2 */ | ||
519 | 1312 0x17059 /* MX6Q_PAD_SD3_DAT3__USDHC3_DAT3 */ | ||
520 | 1265 0x17059 /* MX6Q_PAD_SD3_DAT4__USDHC3_DAT4 */ | ||
521 | 1257 0x17059 /* MX6Q_PAD_SD3_DAT5__USDHC3_DAT5 */ | ||
522 | 1249 0x17059 /* MX6Q_PAD_SD3_DAT6__USDHC3_DAT6 */ | ||
523 | 1241 0x17059>; /* MX6Q_PAD_SD3_DAT7__USDHC3_DAT7 */ | ||
524 | }; | ||
525 | }; | ||
526 | |||
527 | usdhc4 { | ||
528 | pinctrl_usdhc4_1: usdhc4grp-1 { | ||
529 | fsl,pins = <1386 0x17059 /* MX6Q_PAD_SD4_CMD__USDHC4_CMD */ | ||
530 | 1392 0x10059 /* MX6Q_PAD_SD4_CLK__USDHC4_CLK */ | ||
531 | 1462 0x17059 /* MX6Q_PAD_SD4_DAT0__USDHC4_DAT0 */ | ||
532 | 1470 0x17059 /* MX6Q_PAD_SD4_DAT1__USDHC4_DAT1 */ | ||
533 | 1478 0x17059 /* MX6Q_PAD_SD4_DAT2__USDHC4_DAT2 */ | ||
534 | 1486 0x17059 /* MX6Q_PAD_SD4_DAT3__USDHC4_DAT3 */ | ||
535 | 1493 0x17059 /* MX6Q_PAD_SD4_DAT4__USDHC4_DAT4 */ | ||
536 | 1501 0x17059 /* MX6Q_PAD_SD4_DAT5__USDHC4_DAT5 */ | ||
537 | 1509 0x17059 /* MX6Q_PAD_SD4_DAT6__USDHC4_DAT6 */ | ||
538 | 1517 0x17059>; /* MX6Q_PAD_SD4_DAT7__USDHC4_DAT7 */ | ||
539 | }; | ||
540 | }; | ||
390 | }; | 541 | }; |
391 | 542 | ||
392 | dcic@020e4000 { /* DCIC1 */ | 543 | dcic@020e4000 { /* DCIC1 */ |
@@ -422,7 +573,7 @@ | |||
422 | reg = <0x0217c000 0x4000>; | 573 | reg = <0x0217c000 0x4000>; |
423 | }; | 574 | }; |
424 | 575 | ||
425 | enet@02188000 { | 576 | ethernet@02188000 { |
426 | compatible = "fsl,imx6q-fec"; | 577 | compatible = "fsl,imx6q-fec"; |
427 | reg = <0x02188000 0x4000>; | 578 | reg = <0x02188000 0x4000>; |
428 | interrupts = <0 118 0x04 0 119 0x04>; | 579 | interrupts = <0 118 0x04 0 119 0x04>; |
@@ -527,7 +678,9 @@ | |||
527 | }; | 678 | }; |
528 | 679 | ||
529 | audmux@021d8000 { | 680 | audmux@021d8000 { |
681 | compatible = "fsl,imx6q-audmux", "fsl,imx31-audmux"; | ||
530 | reg = <0x021d8000 0x4000>; | 682 | reg = <0x021d8000 0x4000>; |
683 | status = "disabled"; | ||
531 | }; | 684 | }; |
532 | 685 | ||
533 | mipi@021dc000 { /* MIPI-CSI */ | 686 | mipi@021dc000 { /* MIPI-CSI */ |
@@ -543,28 +696,28 @@ | |||
543 | interrupts = <0 18 0x04>; | 696 | interrupts = <0 18 0x04>; |
544 | }; | 697 | }; |
545 | 698 | ||
546 | uart2: uart@021e8000 { | 699 | uart2: serial@021e8000 { |
547 | compatible = "fsl,imx6q-uart", "fsl,imx21-uart"; | 700 | compatible = "fsl,imx6q-uart", "fsl,imx21-uart"; |
548 | reg = <0x021e8000 0x4000>; | 701 | reg = <0x021e8000 0x4000>; |
549 | interrupts = <0 27 0x04>; | 702 | interrupts = <0 27 0x04>; |
550 | status = "disabled"; | 703 | status = "disabled"; |
551 | }; | 704 | }; |
552 | 705 | ||
553 | uart3: uart@021ec000 { | 706 | uart3: serial@021ec000 { |
554 | compatible = "fsl,imx6q-uart", "fsl,imx21-uart"; | 707 | compatible = "fsl,imx6q-uart", "fsl,imx21-uart"; |
555 | reg = <0x021ec000 0x4000>; | 708 | reg = <0x021ec000 0x4000>; |
556 | interrupts = <0 28 0x04>; | 709 | interrupts = <0 28 0x04>; |
557 | status = "disabled"; | 710 | status = "disabled"; |
558 | }; | 711 | }; |
559 | 712 | ||
560 | uart4: uart@021f0000 { | 713 | uart4: serial@021f0000 { |
561 | compatible = "fsl,imx6q-uart", "fsl,imx21-uart"; | 714 | compatible = "fsl,imx6q-uart", "fsl,imx21-uart"; |
562 | reg = <0x021f0000 0x4000>; | 715 | reg = <0x021f0000 0x4000>; |
563 | interrupts = <0 29 0x04>; | 716 | interrupts = <0 29 0x04>; |
564 | status = "disabled"; | 717 | status = "disabled"; |
565 | }; | 718 | }; |
566 | 719 | ||
567 | uart5: uart@021f4000 { | 720 | uart5: serial@021f4000 { |
568 | compatible = "fsl,imx6q-uart", "fsl,imx21-uart"; | 721 | compatible = "fsl,imx6q-uart", "fsl,imx21-uart"; |
569 | reg = <0x021f4000 0x4000>; | 722 | reg = <0x021f4000 0x4000>; |
570 | interrupts = <0 30 0x04>; | 723 | interrupts = <0 30 0x04>; |
diff --git a/arch/arm/boot/dts/omap3-beagle.dts b/arch/arm/boot/dts/omap3-beagle.dts index 8c756be4d7ad..5b4506c0a8c4 100644 --- a/arch/arm/boot/dts/omap3-beagle.dts +++ b/arch/arm/boot/dts/omap3-beagle.dts | |||
@@ -57,7 +57,7 @@ | |||
57 | &mmc1 { | 57 | &mmc1 { |
58 | vmmc-supply = <&vmmc1>; | 58 | vmmc-supply = <&vmmc1>; |
59 | vmmc_aux-supply = <&vsim>; | 59 | vmmc_aux-supply = <&vsim>; |
60 | ti,bus-width = <8>; | 60 | bus-width = <8>; |
61 | }; | 61 | }; |
62 | 62 | ||
63 | &mmc2 { | 63 | &mmc2 { |
diff --git a/arch/arm/boot/dts/omap4-panda.dts b/arch/arm/boot/dts/omap4-panda.dts index e671361bc791..1efe0c587985 100644 --- a/arch/arm/boot/dts/omap4-panda.dts +++ b/arch/arm/boot/dts/omap4-panda.dts | |||
@@ -70,7 +70,7 @@ | |||
70 | 70 | ||
71 | &mmc1 { | 71 | &mmc1 { |
72 | vmmc-supply = <&vmmc>; | 72 | vmmc-supply = <&vmmc>; |
73 | ti,bus-width = <8>; | 73 | bus-width = <8>; |
74 | }; | 74 | }; |
75 | 75 | ||
76 | &mmc2 { | 76 | &mmc2 { |
@@ -87,5 +87,5 @@ | |||
87 | 87 | ||
88 | &mmc5 { | 88 | &mmc5 { |
89 | ti,non-removable; | 89 | ti,non-removable; |
90 | ti,bus-width = <4>; | 90 | bus-width = <4>; |
91 | }; | 91 | }; |
diff --git a/arch/arm/boot/dts/omap4-sdp.dts b/arch/arm/boot/dts/omap4-sdp.dts index e5eeb6f9c6e6..d08c4d137280 100644 --- a/arch/arm/boot/dts/omap4-sdp.dts +++ b/arch/arm/boot/dts/omap4-sdp.dts | |||
@@ -137,12 +137,12 @@ | |||
137 | 137 | ||
138 | &mmc1 { | 138 | &mmc1 { |
139 | vmmc-supply = <&vmmc>; | 139 | vmmc-supply = <&vmmc>; |
140 | ti,bus-width = <8>; | 140 | bus-width = <8>; |
141 | }; | 141 | }; |
142 | 142 | ||
143 | &mmc2 { | 143 | &mmc2 { |
144 | vmmc-supply = <&vaux1>; | 144 | vmmc-supply = <&vaux1>; |
145 | ti,bus-width = <8>; | 145 | bus-width = <8>; |
146 | ti,non-removable; | 146 | ti,non-removable; |
147 | }; | 147 | }; |
148 | 148 | ||
@@ -155,6 +155,6 @@ | |||
155 | }; | 155 | }; |
156 | 156 | ||
157 | &mmc5 { | 157 | &mmc5 { |
158 | ti,bus-width = <4>; | 158 | bus-width = <4>; |
159 | ti,non-removable; | 159 | ti,non-removable; |
160 | }; | 160 | }; |
diff --git a/arch/arm/boot/dts/spear1310-evb.dts b/arch/arm/boot/dts/spear1310-evb.dts new file mode 100644 index 000000000000..8314e4171884 --- /dev/null +++ b/arch/arm/boot/dts/spear1310-evb.dts | |||
@@ -0,0 +1,292 @@ | |||
1 | /* | ||
2 | * DTS file for SPEAr1310 Evaluation Baord | ||
3 | * | ||
4 | * Copyright 2012 Viresh Kumar <viresh.kumar@st.com> | ||
5 | * | ||
6 | * The code contained herein is licensed under the GNU General Public | ||
7 | * License. You may obtain a copy of the GNU General Public License | ||
8 | * Version 2 or later at the following locations: | ||
9 | * | ||
10 | * http://www.opensource.org/licenses/gpl-license.html | ||
11 | * http://www.gnu.org/copyleft/gpl.html | ||
12 | */ | ||
13 | |||
14 | /dts-v1/; | ||
15 | /include/ "spear1310.dtsi" | ||
16 | |||
17 | / { | ||
18 | model = "ST SPEAr1310 Evaluation Board"; | ||
19 | compatible = "st,spear1310-evb", "st,spear1310"; | ||
20 | #address-cells = <1>; | ||
21 | #size-cells = <1>; | ||
22 | |||
23 | memory { | ||
24 | reg = <0 0x40000000>; | ||
25 | }; | ||
26 | |||
27 | ahb { | ||
28 | pinmux@e0700000 { | ||
29 | pinctrl-names = "default"; | ||
30 | pinctrl-0 = <&state_default>; | ||
31 | |||
32 | state_default: pinmux { | ||
33 | i2c0-pmx { | ||
34 | st,pins = "i2c0_grp"; | ||
35 | st,function = "i2c0"; | ||
36 | }; | ||
37 | i2s1 { | ||
38 | st,pins = "i2s1_grp"; | ||
39 | st,function = "i2s1"; | ||
40 | }; | ||
41 | gpio { | ||
42 | st,pins = "arm_gpio_grp"; | ||
43 | st,function = "arm_gpio"; | ||
44 | }; | ||
45 | eth { | ||
46 | st,pins = "gmii_grp"; | ||
47 | st,function = "gmii"; | ||
48 | }; | ||
49 | ssp0 { | ||
50 | st,pins = "ssp0_grp"; | ||
51 | st,function = "ssp0"; | ||
52 | }; | ||
53 | kbd { | ||
54 | st,pins = "keyboard_6x6_grp"; | ||
55 | st,function = "keyboard"; | ||
56 | }; | ||
57 | sdhci { | ||
58 | st,pins = "sdhci_grp"; | ||
59 | st,function = "sdhci"; | ||
60 | }; | ||
61 | smi-pmx { | ||
62 | st,pins = "smi_2_chips_grp"; | ||
63 | st,function = "smi"; | ||
64 | }; | ||
65 | uart0 { | ||
66 | st,pins = "uart0_grp"; | ||
67 | st,function = "uart0"; | ||
68 | }; | ||
69 | rs485 { | ||
70 | st,pins = "rs485_0_1_tdm_0_1_grp"; | ||
71 | st,function = "rs485_0_1_tdm_0_1"; | ||
72 | }; | ||
73 | i2c1_2 { | ||
74 | st,pins = "i2c_1_2_grp"; | ||
75 | st,function = "i2c_1_2"; | ||
76 | }; | ||
77 | pci { | ||
78 | st,pins = "pcie0_grp","pcie1_grp", | ||
79 | "pcie2_grp"; | ||
80 | st,function = "pci"; | ||
81 | }; | ||
82 | smii { | ||
83 | st,pins = "smii_0_1_2_grp"; | ||
84 | st,function = "smii_0_1_2"; | ||
85 | }; | ||
86 | nand { | ||
87 | st,pins = "nand_8bit_grp", | ||
88 | "nand_16bit_grp"; | ||
89 | st,function = "nand"; | ||
90 | }; | ||
91 | }; | ||
92 | }; | ||
93 | |||
94 | ahci@b1000000 { | ||
95 | status = "okay"; | ||
96 | }; | ||
97 | |||
98 | cf@b2800000 { | ||
99 | status = "okay"; | ||
100 | }; | ||
101 | |||
102 | dma@ea800000 { | ||
103 | status = "okay"; | ||
104 | }; | ||
105 | |||
106 | dma@eb000000 { | ||
107 | status = "okay"; | ||
108 | }; | ||
109 | |||
110 | fsmc: flash@b0000000 { | ||
111 | status = "okay"; | ||
112 | }; | ||
113 | |||
114 | gmac0: eth@e2000000 { | ||
115 | status = "okay"; | ||
116 | }; | ||
117 | |||
118 | sdhci@b3000000 { | ||
119 | status = "okay"; | ||
120 | }; | ||
121 | |||
122 | smi: flash@ea000000 { | ||
123 | status = "okay"; | ||
124 | clock-rate=<50000000>; | ||
125 | |||
126 | flash@e6000000 { | ||
127 | #address-cells = <1>; | ||
128 | #size-cells = <1>; | ||
129 | reg = <0xe6000000 0x800000>; | ||
130 | st,smi-fast-mode; | ||
131 | |||
132 | partition@0 { | ||
133 | label = "xloader"; | ||
134 | reg = <0x0 0x10000>; | ||
135 | }; | ||
136 | partition@10000 { | ||
137 | label = "u-boot"; | ||
138 | reg = <0x10000 0x40000>; | ||
139 | }; | ||
140 | partition@50000 { | ||
141 | label = "linux"; | ||
142 | reg = <0x50000 0x2c0000>; | ||
143 | }; | ||
144 | partition@310000 { | ||
145 | label = "rootfs"; | ||
146 | reg = <0x310000 0x4f0000>; | ||
147 | }; | ||
148 | }; | ||
149 | }; | ||
150 | |||
151 | spi0: spi@e0100000 { | ||
152 | status = "okay"; | ||
153 | }; | ||
154 | |||
155 | ehci@e4800000 { | ||
156 | status = "okay"; | ||
157 | }; | ||
158 | |||
159 | ehci@e5800000 { | ||
160 | status = "okay"; | ||
161 | }; | ||
162 | |||
163 | ohci@e4000000 { | ||
164 | status = "okay"; | ||
165 | }; | ||
166 | |||
167 | ohci@e5000000 { | ||
168 | status = "okay"; | ||
169 | }; | ||
170 | |||
171 | apb { | ||
172 | adc@e0080000 { | ||
173 | status = "okay"; | ||
174 | }; | ||
175 | |||
176 | gpio0: gpio@e0600000 { | ||
177 | status = "okay"; | ||
178 | }; | ||
179 | |||
180 | gpio1: gpio@e0680000 { | ||
181 | status = "okay"; | ||
182 | }; | ||
183 | |||
184 | i2c0: i2c@e0280000 { | ||
185 | status = "okay"; | ||
186 | }; | ||
187 | |||
188 | i2c1: i2c@5cd00000 { | ||
189 | status = "okay"; | ||
190 | }; | ||
191 | |||
192 | kbd@e0300000 { | ||
193 | linux,keymap = < 0x00000001 | ||
194 | 0x00010002 | ||
195 | 0x00020003 | ||
196 | 0x00030004 | ||
197 | 0x00040005 | ||
198 | 0x00050006 | ||
199 | 0x00060007 | ||
200 | 0x00070008 | ||
201 | 0x00080009 | ||
202 | 0x0100000a | ||
203 | 0x0101000c | ||
204 | 0x0102000d | ||
205 | 0x0103000e | ||
206 | 0x0104000f | ||
207 | 0x01050010 | ||
208 | 0x01060011 | ||
209 | 0x01070012 | ||
210 | 0x01080013 | ||
211 | 0x02000014 | ||
212 | 0x02010015 | ||
213 | 0x02020016 | ||
214 | 0x02030017 | ||
215 | 0x02040018 | ||
216 | 0x02050019 | ||
217 | 0x0206001a | ||
218 | 0x0207001b | ||
219 | 0x0208001c | ||
220 | 0x0300001d | ||
221 | 0x0301001e | ||
222 | 0x0302001f | ||
223 | 0x03030020 | ||
224 | 0x03040021 | ||
225 | 0x03050022 | ||
226 | 0x03060023 | ||
227 | 0x03070024 | ||
228 | 0x03080025 | ||
229 | 0x04000026 | ||
230 | 0x04010027 | ||
231 | 0x04020028 | ||
232 | 0x04030029 | ||
233 | 0x0404002a | ||
234 | 0x0405002b | ||
235 | 0x0406002c | ||
236 | 0x0407002d | ||
237 | 0x0408002e | ||
238 | 0x0500002f | ||
239 | 0x05010030 | ||
240 | 0x05020031 | ||
241 | 0x05030032 | ||
242 | 0x05040033 | ||
243 | 0x05050034 | ||
244 | 0x05060035 | ||
245 | 0x05070036 | ||
246 | 0x05080037 | ||
247 | 0x06000038 | ||
248 | 0x06010039 | ||
249 | 0x0602003a | ||
250 | 0x0603003b | ||
251 | 0x0604003c | ||
252 | 0x0605003d | ||
253 | 0x0606003e | ||
254 | 0x0607003f | ||
255 | 0x06080040 | ||
256 | 0x07000041 | ||
257 | 0x07010042 | ||
258 | 0x07020043 | ||
259 | 0x07030044 | ||
260 | 0x07040045 | ||
261 | 0x07050046 | ||
262 | 0x07060047 | ||
263 | 0x07070048 | ||
264 | 0x07080049 | ||
265 | 0x0800004a | ||
266 | 0x0801004b | ||
267 | 0x0802004c | ||
268 | 0x0803004d | ||
269 | 0x0804004e | ||
270 | 0x0805004f | ||
271 | 0x08060050 | ||
272 | 0x08070051 | ||
273 | 0x08080052 >; | ||
274 | autorepeat; | ||
275 | st,mode = <0>; | ||
276 | status = "okay"; | ||
277 | }; | ||
278 | |||
279 | rtc@e0580000 { | ||
280 | status = "okay"; | ||
281 | }; | ||
282 | |||
283 | serial@e0000000 { | ||
284 | status = "okay"; | ||
285 | }; | ||
286 | |||
287 | wdt@ec800620 { | ||
288 | status = "okay"; | ||
289 | }; | ||
290 | }; | ||
291 | }; | ||
292 | }; | ||
diff --git a/arch/arm/boot/dts/spear1310.dtsi b/arch/arm/boot/dts/spear1310.dtsi new file mode 100644 index 000000000000..9e61da404d57 --- /dev/null +++ b/arch/arm/boot/dts/spear1310.dtsi | |||
@@ -0,0 +1,184 @@ | |||
1 | /* | ||
2 | * DTS file for all SPEAr1310 SoCs | ||
3 | * | ||
4 | * Copyright 2012 Viresh Kumar <viresh.kumar@st.com> | ||
5 | * | ||
6 | * The code contained herein is licensed under the GNU General Public | ||
7 | * License. You may obtain a copy of the GNU General Public License | ||
8 | * Version 2 or later at the following locations: | ||
9 | * | ||
10 | * http://www.opensource.org/licenses/gpl-license.html | ||
11 | * http://www.gnu.org/copyleft/gpl.html | ||
12 | */ | ||
13 | |||
14 | /include/ "spear13xx.dtsi" | ||
15 | |||
16 | / { | ||
17 | compatible = "st,spear1310"; | ||
18 | |||
19 | ahb { | ||
20 | ahci@b1000000 { | ||
21 | compatible = "snps,spear-ahci"; | ||
22 | reg = <0xb1000000 0x10000>; | ||
23 | interrupts = <0 68 0x4>; | ||
24 | status = "disabled"; | ||
25 | }; | ||
26 | |||
27 | ahci@b1800000 { | ||
28 | compatible = "snps,spear-ahci"; | ||
29 | reg = <0xb1800000 0x10000>; | ||
30 | interrupts = <0 69 0x4>; | ||
31 | status = "disabled"; | ||
32 | }; | ||
33 | |||
34 | ahci@b4000000 { | ||
35 | compatible = "snps,spear-ahci"; | ||
36 | reg = <0xb4000000 0x10000>; | ||
37 | interrupts = <0 70 0x4>; | ||
38 | status = "disabled"; | ||
39 | }; | ||
40 | |||
41 | gmac1: eth@5c400000 { | ||
42 | compatible = "st,spear600-gmac"; | ||
43 | reg = <0x5c400000 0x8000>; | ||
44 | interrupts = <0 95 0x4>; | ||
45 | interrupt-names = "macirq"; | ||
46 | status = "disabled"; | ||
47 | }; | ||
48 | |||
49 | gmac2: eth@5c500000 { | ||
50 | compatible = "st,spear600-gmac"; | ||
51 | reg = <0x5c500000 0x8000>; | ||
52 | interrupts = <0 96 0x4>; | ||
53 | interrupt-names = "macirq"; | ||
54 | status = "disabled"; | ||
55 | }; | ||
56 | |||
57 | gmac3: eth@5c600000 { | ||
58 | compatible = "st,spear600-gmac"; | ||
59 | reg = <0x5c600000 0x8000>; | ||
60 | interrupts = <0 97 0x4>; | ||
61 | interrupt-names = "macirq"; | ||
62 | status = "disabled"; | ||
63 | }; | ||
64 | |||
65 | gmac4: eth@5c700000 { | ||
66 | compatible = "st,spear600-gmac"; | ||
67 | reg = <0x5c700000 0x8000>; | ||
68 | interrupts = <0 98 0x4>; | ||
69 | interrupt-names = "macirq"; | ||
70 | status = "disabled"; | ||
71 | }; | ||
72 | |||
73 | spi1: spi@5d400000 { | ||
74 | compatible = "arm,pl022", "arm,primecell"; | ||
75 | reg = <0x5d400000 0x1000>; | ||
76 | interrupts = <0 99 0x4>; | ||
77 | status = "disabled"; | ||
78 | }; | ||
79 | |||
80 | apb { | ||
81 | i2c1: i2c@5cd00000 { | ||
82 | #address-cells = <1>; | ||
83 | #size-cells = <0>; | ||
84 | compatible = "snps,designware-i2c"; | ||
85 | reg = <0x5cd00000 0x1000>; | ||
86 | interrupts = <0 87 0x4>; | ||
87 | status = "disabled"; | ||
88 | }; | ||
89 | |||
90 | i2c2: i2c@5ce00000 { | ||
91 | #address-cells = <1>; | ||
92 | #size-cells = <0>; | ||
93 | compatible = "snps,designware-i2c"; | ||
94 | reg = <0x5ce00000 0x1000>; | ||
95 | interrupts = <0 88 0x4>; | ||
96 | status = "disabled"; | ||
97 | }; | ||
98 | |||
99 | i2c3: i2c@5cf00000 { | ||
100 | #address-cells = <1>; | ||
101 | #size-cells = <0>; | ||
102 | compatible = "snps,designware-i2c"; | ||
103 | reg = <0x5cf00000 0x1000>; | ||
104 | interrupts = <0 89 0x4>; | ||
105 | status = "disabled"; | ||
106 | }; | ||
107 | |||
108 | i2c4: i2c@5d000000 { | ||
109 | #address-cells = <1>; | ||
110 | #size-cells = <0>; | ||
111 | compatible = "snps,designware-i2c"; | ||
112 | reg = <0x5d000000 0x1000>; | ||
113 | interrupts = <0 90 0x4>; | ||
114 | status = "disabled"; | ||
115 | }; | ||
116 | |||
117 | i2c5: i2c@5d100000 { | ||
118 | #address-cells = <1>; | ||
119 | #size-cells = <0>; | ||
120 | compatible = "snps,designware-i2c"; | ||
121 | reg = <0x5d100000 0x1000>; | ||
122 | interrupts = <0 91 0x4>; | ||
123 | status = "disabled"; | ||
124 | }; | ||
125 | |||
126 | i2c6: i2c@5d200000 { | ||
127 | #address-cells = <1>; | ||
128 | #size-cells = <0>; | ||
129 | compatible = "snps,designware-i2c"; | ||
130 | reg = <0x5d200000 0x1000>; | ||
131 | interrupts = <0 92 0x4>; | ||
132 | status = "disabled"; | ||
133 | }; | ||
134 | |||
135 | i2c7: i2c@5d300000 { | ||
136 | #address-cells = <1>; | ||
137 | #size-cells = <0>; | ||
138 | compatible = "snps,designware-i2c"; | ||
139 | reg = <0x5d300000 0x1000>; | ||
140 | interrupts = <0 93 0x4>; | ||
141 | status = "disabled"; | ||
142 | }; | ||
143 | |||
144 | serial@5c800000 { | ||
145 | compatible = "arm,pl011", "arm,primecell"; | ||
146 | reg = <0x5c800000 0x1000>; | ||
147 | interrupts = <0 82 0x4>; | ||
148 | status = "disabled"; | ||
149 | }; | ||
150 | |||
151 | serial@5c900000 { | ||
152 | compatible = "arm,pl011", "arm,primecell"; | ||
153 | reg = <0x5c900000 0x1000>; | ||
154 | interrupts = <0 83 0x4>; | ||
155 | status = "disabled"; | ||
156 | }; | ||
157 | |||
158 | serial@5ca00000 { | ||
159 | compatible = "arm,pl011", "arm,primecell"; | ||
160 | reg = <0x5ca00000 0x1000>; | ||
161 | interrupts = <0 84 0x4>; | ||
162 | status = "disabled"; | ||
163 | }; | ||
164 | |||
165 | serial@5cb00000 { | ||
166 | compatible = "arm,pl011", "arm,primecell"; | ||
167 | reg = <0x5cb00000 0x1000>; | ||
168 | interrupts = <0 85 0x4>; | ||
169 | status = "disabled"; | ||
170 | }; | ||
171 | |||
172 | serial@5cc00000 { | ||
173 | compatible = "arm,pl011", "arm,primecell"; | ||
174 | reg = <0x5cc00000 0x1000>; | ||
175 | interrupts = <0 86 0x4>; | ||
176 | status = "disabled"; | ||
177 | }; | ||
178 | |||
179 | thermal@e07008c4 { | ||
180 | st,thermal-flags = <0x7000>; | ||
181 | }; | ||
182 | }; | ||
183 | }; | ||
184 | }; | ||
diff --git a/arch/arm/boot/dts/spear1340-evb.dts b/arch/arm/boot/dts/spear1340-evb.dts new file mode 100644 index 000000000000..0d8472e5ab9f --- /dev/null +++ b/arch/arm/boot/dts/spear1340-evb.dts | |||
@@ -0,0 +1,308 @@ | |||
1 | /* | ||
2 | * DTS file for SPEAr1340 Evaluation Baord | ||
3 | * | ||
4 | * Copyright 2012 Viresh Kumar <viresh.kumar@st.com> | ||
5 | * | ||
6 | * The code contained herein is licensed under the GNU General Public | ||
7 | * License. You may obtain a copy of the GNU General Public License | ||
8 | * Version 2 or later at the following locations: | ||
9 | * | ||
10 | * http://www.opensource.org/licenses/gpl-license.html | ||
11 | * http://www.gnu.org/copyleft/gpl.html | ||
12 | */ | ||
13 | |||
14 | /dts-v1/; | ||
15 | /include/ "spear1340.dtsi" | ||
16 | |||
17 | / { | ||
18 | model = "ST SPEAr1340 Evaluation Board"; | ||
19 | compatible = "st,spear1340-evb", "st,spear1340"; | ||
20 | #address-cells = <1>; | ||
21 | #size-cells = <1>; | ||
22 | |||
23 | memory { | ||
24 | reg = <0 0x40000000>; | ||
25 | }; | ||
26 | |||
27 | ahb { | ||
28 | pinmux@e0700000 { | ||
29 | pinctrl-names = "default"; | ||
30 | pinctrl-0 = <&state_default>; | ||
31 | |||
32 | state_default: pinmux { | ||
33 | pads_as_gpio { | ||
34 | st,pins = "pads_as_gpio_grp"; | ||
35 | st,function = "pads_as_gpio"; | ||
36 | }; | ||
37 | fsmc { | ||
38 | st,pins = "fsmc_8bit_grp"; | ||
39 | st,function = "fsmc"; | ||
40 | }; | ||
41 | kbd { | ||
42 | st,pins = "keyboard_row_col_grp", | ||
43 | "keyboard_col5_grp"; | ||
44 | st,function = "keyboard"; | ||
45 | }; | ||
46 | uart0 { | ||
47 | st,pins = "uart0_grp", "uart0_enh_grp"; | ||
48 | st,function = "uart0"; | ||
49 | }; | ||
50 | i2c0-pmx { | ||
51 | st,pins = "i2c0_grp"; | ||
52 | st,function = "i2c0"; | ||
53 | }; | ||
54 | i2c1-pmx { | ||
55 | st,pins = "i2c1_grp"; | ||
56 | st,function = "i2c1"; | ||
57 | }; | ||
58 | spdif-in { | ||
59 | st,pins = "spdif_in_grp"; | ||
60 | st,function = "spdif_in"; | ||
61 | }; | ||
62 | spdif-out { | ||
63 | st,pins = "spdif_out_grp"; | ||
64 | st,function = "spdif_out"; | ||
65 | }; | ||
66 | ssp0 { | ||
67 | st,pins = "ssp0_grp", "ssp0_cs1_grp", | ||
68 | "ssp0_cs3_grp"; | ||
69 | st,function = "ssp0"; | ||
70 | }; | ||
71 | pwm { | ||
72 | st,pins = "pwm2_grp", "pwm3_grp"; | ||
73 | st,function = "pwm"; | ||
74 | }; | ||
75 | smi-pmx { | ||
76 | st,pins = "smi_grp"; | ||
77 | st,function = "smi"; | ||
78 | }; | ||
79 | i2s { | ||
80 | st,pins = "i2s_in_grp", "i2s_out_grp"; | ||
81 | st,function = "i2s"; | ||
82 | }; | ||
83 | gmac { | ||
84 | st,pins = "gmii_grp", "rgmii_grp"; | ||
85 | st,function = "gmac"; | ||
86 | }; | ||
87 | cam3 { | ||
88 | st,pins = "cam3_grp"; | ||
89 | st,function = "cam3"; | ||
90 | }; | ||
91 | cec0 { | ||
92 | st,pins = "cec0_grp"; | ||
93 | st,function = "cec0"; | ||
94 | }; | ||
95 | cec1 { | ||
96 | st,pins = "cec1_grp"; | ||
97 | st,function = "cec1"; | ||
98 | }; | ||
99 | sdhci { | ||
100 | st,pins = "sdhci_grp"; | ||
101 | st,function = "sdhci"; | ||
102 | }; | ||
103 | clcd { | ||
104 | st,pins = "clcd_grp"; | ||
105 | st,function = "clcd"; | ||
106 | }; | ||
107 | sata { | ||
108 | st,pins = "sata_grp"; | ||
109 | st,function = "sata"; | ||
110 | }; | ||
111 | }; | ||
112 | }; | ||
113 | |||
114 | dma@ea800000 { | ||
115 | status = "okay"; | ||
116 | }; | ||
117 | |||
118 | dma@eb000000 { | ||
119 | status = "okay"; | ||
120 | }; | ||
121 | |||
122 | fsmc: flash@b0000000 { | ||
123 | status = "okay"; | ||
124 | }; | ||
125 | |||
126 | gmac0: eth@e2000000 { | ||
127 | status = "okay"; | ||
128 | }; | ||
129 | |||
130 | sdhci@b3000000 { | ||
131 | status = "okay"; | ||
132 | }; | ||
133 | |||
134 | smi: flash@ea000000 { | ||
135 | status = "okay"; | ||
136 | clock-rate=<50000000>; | ||
137 | |||
138 | flash@e6000000 { | ||
139 | #address-cells = <1>; | ||
140 | #size-cells = <1>; | ||
141 | reg = <0xe6000000 0x800000>; | ||
142 | st,smi-fast-mode; | ||
143 | |||
144 | partition@0 { | ||
145 | label = "xloader"; | ||
146 | reg = <0x0 0x10000>; | ||
147 | }; | ||
148 | partition@10000 { | ||
149 | label = "u-boot"; | ||
150 | reg = <0x10000 0x40000>; | ||
151 | }; | ||
152 | partition@50000 { | ||
153 | label = "linux"; | ||
154 | reg = <0x50000 0x2c0000>; | ||
155 | }; | ||
156 | partition@310000 { | ||
157 | label = "rootfs"; | ||
158 | reg = <0x310000 0x4f0000>; | ||
159 | }; | ||
160 | }; | ||
161 | }; | ||
162 | |||
163 | spi0: spi@e0100000 { | ||
164 | status = "okay"; | ||
165 | }; | ||
166 | |||
167 | ehci@e4800000 { | ||
168 | status = "okay"; | ||
169 | }; | ||
170 | |||
171 | ehci@e5800000 { | ||
172 | status = "okay"; | ||
173 | }; | ||
174 | |||
175 | ohci@e4000000 { | ||
176 | status = "okay"; | ||
177 | }; | ||
178 | |||
179 | ohci@e5000000 { | ||
180 | status = "okay"; | ||
181 | }; | ||
182 | |||
183 | apb { | ||
184 | adc@e0080000 { | ||
185 | status = "okay"; | ||
186 | }; | ||
187 | |||
188 | gpio0: gpio@e0600000 { | ||
189 | status = "okay"; | ||
190 | }; | ||
191 | |||
192 | gpio1: gpio@e0680000 { | ||
193 | status = "okay"; | ||
194 | }; | ||
195 | |||
196 | i2c0: i2c@e0280000 { | ||
197 | status = "okay"; | ||
198 | }; | ||
199 | |||
200 | i2c1: i2c@b4000000 { | ||
201 | status = "okay"; | ||
202 | }; | ||
203 | |||
204 | kbd@e0300000 { | ||
205 | linux,keymap = < 0x00000001 | ||
206 | 0x00010002 | ||
207 | 0x00020003 | ||
208 | 0x00030004 | ||
209 | 0x00040005 | ||
210 | 0x00050006 | ||
211 | 0x00060007 | ||
212 | 0x00070008 | ||
213 | 0x00080009 | ||
214 | 0x0100000a | ||
215 | 0x0101000c | ||
216 | 0x0102000d | ||
217 | 0x0103000e | ||
218 | 0x0104000f | ||
219 | 0x01050010 | ||
220 | 0x01060011 | ||
221 | 0x01070012 | ||
222 | 0x01080013 | ||
223 | 0x02000014 | ||
224 | 0x02010015 | ||
225 | 0x02020016 | ||
226 | 0x02030017 | ||
227 | 0x02040018 | ||
228 | 0x02050019 | ||
229 | 0x0206001a | ||
230 | 0x0207001b | ||
231 | 0x0208001c | ||
232 | 0x0300001d | ||
233 | 0x0301001e | ||
234 | 0x0302001f | ||
235 | 0x03030020 | ||
236 | 0x03040021 | ||
237 | 0x03050022 | ||
238 | 0x03060023 | ||
239 | 0x03070024 | ||
240 | 0x03080025 | ||
241 | 0x04000026 | ||
242 | 0x04010027 | ||
243 | 0x04020028 | ||
244 | 0x04030029 | ||
245 | 0x0404002a | ||
246 | 0x0405002b | ||
247 | 0x0406002c | ||
248 | 0x0407002d | ||
249 | 0x0408002e | ||
250 | 0x0500002f | ||
251 | 0x05010030 | ||
252 | 0x05020031 | ||
253 | 0x05030032 | ||
254 | 0x05040033 | ||
255 | 0x05050034 | ||
256 | 0x05060035 | ||
257 | 0x05070036 | ||
258 | 0x05080037 | ||
259 | 0x06000038 | ||
260 | 0x06010039 | ||
261 | 0x0602003a | ||
262 | 0x0603003b | ||
263 | 0x0604003c | ||
264 | 0x0605003d | ||
265 | 0x0606003e | ||
266 | 0x0607003f | ||
267 | 0x06080040 | ||
268 | 0x07000041 | ||
269 | 0x07010042 | ||
270 | 0x07020043 | ||
271 | 0x07030044 | ||
272 | 0x07040045 | ||
273 | 0x07050046 | ||
274 | 0x07060047 | ||
275 | 0x07070048 | ||
276 | 0x07080049 | ||
277 | 0x0800004a | ||
278 | 0x0801004b | ||
279 | 0x0802004c | ||
280 | 0x0803004d | ||
281 | 0x0804004e | ||
282 | 0x0805004f | ||
283 | 0x08060050 | ||
284 | 0x08070051 | ||
285 | 0x08080052 >; | ||
286 | autorepeat; | ||
287 | st,mode = <0>; | ||
288 | status = "okay"; | ||
289 | }; | ||
290 | |||
291 | rtc@e0580000 { | ||
292 | status = "okay"; | ||
293 | }; | ||
294 | |||
295 | serial@e0000000 { | ||
296 | status = "okay"; | ||
297 | }; | ||
298 | |||
299 | serial@b4100000 { | ||
300 | status = "okay"; | ||
301 | }; | ||
302 | |||
303 | wdt@ec800620 { | ||
304 | status = "okay"; | ||
305 | }; | ||
306 | }; | ||
307 | }; | ||
308 | }; | ||
diff --git a/arch/arm/boot/dts/spear1340.dtsi b/arch/arm/boot/dts/spear1340.dtsi new file mode 100644 index 000000000000..a26fc47a55e8 --- /dev/null +++ b/arch/arm/boot/dts/spear1340.dtsi | |||
@@ -0,0 +1,56 @@ | |||
1 | /* | ||
2 | * DTS file for all SPEAr1340 SoCs | ||
3 | * | ||
4 | * Copyright 2012 Viresh Kumar <viresh.kumar@st.com> | ||
5 | * | ||
6 | * The code contained herein is licensed under the GNU General Public | ||
7 | * License. You may obtain a copy of the GNU General Public License | ||
8 | * Version 2 or later at the following locations: | ||
9 | * | ||
10 | * http://www.opensource.org/licenses/gpl-license.html | ||
11 | * http://www.gnu.org/copyleft/gpl.html | ||
12 | */ | ||
13 | |||
14 | /include/ "spear13xx.dtsi" | ||
15 | |||
16 | / { | ||
17 | compatible = "st,spear1340"; | ||
18 | |||
19 | ahb { | ||
20 | ahci@b1000000 { | ||
21 | compatible = "snps,spear-ahci"; | ||
22 | reg = <0xb1000000 0x10000>; | ||
23 | interrupts = <0 72 0x4>; | ||
24 | status = "disabled"; | ||
25 | }; | ||
26 | |||
27 | spi1: spi@5d400000 { | ||
28 | compatible = "arm,pl022", "arm,primecell"; | ||
29 | reg = <0x5d400000 0x1000>; | ||
30 | interrupts = <0 99 0x4>; | ||
31 | status = "disabled"; | ||
32 | }; | ||
33 | |||
34 | apb { | ||
35 | i2c1: i2c@b4000000 { | ||
36 | #address-cells = <1>; | ||
37 | #size-cells = <0>; | ||
38 | compatible = "snps,designware-i2c"; | ||
39 | reg = <0xb4000000 0x1000>; | ||
40 | interrupts = <0 104 0x4>; | ||
41 | status = "disabled"; | ||
42 | }; | ||
43 | |||
44 | serial@b4100000 { | ||
45 | compatible = "arm,pl011", "arm,primecell"; | ||
46 | reg = <0xb4100000 0x1000>; | ||
47 | interrupts = <0 105 0x4>; | ||
48 | status = "disabled"; | ||
49 | }; | ||
50 | |||
51 | thermal@e07008c4 { | ||
52 | st,thermal-flags = <0x2a00>; | ||
53 | }; | ||
54 | }; | ||
55 | }; | ||
56 | }; | ||
diff --git a/arch/arm/boot/dts/spear13xx.dtsi b/arch/arm/boot/dts/spear13xx.dtsi new file mode 100644 index 000000000000..1f8e1e1481df --- /dev/null +++ b/arch/arm/boot/dts/spear13xx.dtsi | |||
@@ -0,0 +1,262 @@ | |||
1 | /* | ||
2 | * DTS file for all SPEAr13xx SoCs | ||
3 | * | ||
4 | * Copyright 2012 Viresh Kumar <viresh.kumar@st.com> | ||
5 | * | ||
6 | * The code contained herein is licensed under the GNU General Public | ||
7 | * License. You may obtain a copy of the GNU General Public License | ||
8 | * Version 2 or later at the following locations: | ||
9 | * | ||
10 | * http://www.opensource.org/licenses/gpl-license.html | ||
11 | * http://www.gnu.org/copyleft/gpl.html | ||
12 | */ | ||
13 | |||
14 | /include/ "skeleton.dtsi" | ||
15 | |||
16 | / { | ||
17 | interrupt-parent = <&gic>; | ||
18 | |||
19 | cpus { | ||
20 | #address-cells = <1>; | ||
21 | #size-cells = <0>; | ||
22 | |||
23 | cpu@0 { | ||
24 | compatible = "arm,cortex-a9"; | ||
25 | reg = <0>; | ||
26 | next-level-cache = <&L2>; | ||
27 | }; | ||
28 | |||
29 | cpu@1 { | ||
30 | compatible = "arm,cortex-a9"; | ||
31 | reg = <1>; | ||
32 | next-level-cache = <&L2>; | ||
33 | }; | ||
34 | }; | ||
35 | |||
36 | gic: interrupt-controller@ec801000 { | ||
37 | compatible = "arm,cortex-a9-gic"; | ||
38 | interrupt-controller; | ||
39 | #interrupt-cells = <3>; | ||
40 | reg = < 0xec801000 0x1000 >, | ||
41 | < 0xec800100 0x0100 >; | ||
42 | }; | ||
43 | |||
44 | pmu { | ||
45 | compatible = "arm,cortex-a9-pmu"; | ||
46 | interrupts = <0 8 0x04 | ||
47 | 0 9 0x04>; | ||
48 | }; | ||
49 | |||
50 | L2: l2-cache { | ||
51 | compatible = "arm,pl310-cache"; | ||
52 | reg = <0xed000000 0x1000>; | ||
53 | cache-unified; | ||
54 | cache-level = <2>; | ||
55 | }; | ||
56 | |||
57 | memory { | ||
58 | name = "memory"; | ||
59 | device_type = "memory"; | ||
60 | reg = <0 0x40000000>; | ||
61 | }; | ||
62 | |||
63 | chosen { | ||
64 | bootargs = "console=ttyAMA0,115200"; | ||
65 | }; | ||
66 | |||
67 | ahb { | ||
68 | #address-cells = <1>; | ||
69 | #size-cells = <1>; | ||
70 | compatible = "simple-bus"; | ||
71 | ranges = <0x50000000 0x50000000 0x10000000 | ||
72 | 0xb0000000 0xb0000000 0x10000000 | ||
73 | 0xe0000000 0xe0000000 0x10000000>; | ||
74 | |||
75 | sdhci@b3000000 { | ||
76 | compatible = "st,sdhci-spear"; | ||
77 | reg = <0xb3000000 0x100>; | ||
78 | interrupts = <0 28 0x4>; | ||
79 | status = "disabled"; | ||
80 | }; | ||
81 | |||
82 | cf@b2800000 { | ||
83 | compatible = "arasan,cf-spear1340"; | ||
84 | reg = <0xb2800000 0x100>; | ||
85 | interrupts = <0 29 0x4>; | ||
86 | status = "disabled"; | ||
87 | }; | ||
88 | |||
89 | dma@ea800000 { | ||
90 | compatible = "snps,dma-spear1340"; | ||
91 | reg = <0xea800000 0x1000>; | ||
92 | interrupts = <0 19 0x4>; | ||
93 | status = "disabled"; | ||
94 | }; | ||
95 | |||
96 | dma@eb000000 { | ||
97 | compatible = "snps,dma-spear1340"; | ||
98 | reg = <0xeb000000 0x1000>; | ||
99 | interrupts = <0 59 0x4>; | ||
100 | status = "disabled"; | ||
101 | }; | ||
102 | |||
103 | fsmc: flash@b0000000 { | ||
104 | compatible = "st,spear600-fsmc-nand"; | ||
105 | #address-cells = <1>; | ||
106 | #size-cells = <1>; | ||
107 | reg = <0xb0000000 0x1000 /* FSMC Register */ | ||
108 | 0xb0800000 0x0010>; /* NAND Base */ | ||
109 | reg-names = "fsmc_regs", "nand_data"; | ||
110 | interrupts = <0 20 0x4 | ||
111 | 0 21 0x4 | ||
112 | 0 22 0x4 | ||
113 | 0 23 0x4>; | ||
114 | st,ale-off = <0x20000>; | ||
115 | st,cle-off = <0x10000>; | ||
116 | status = "disabled"; | ||
117 | }; | ||
118 | |||
119 | gmac0: eth@e2000000 { | ||
120 | compatible = "st,spear600-gmac"; | ||
121 | reg = <0xe2000000 0x8000>; | ||
122 | interrupts = <0 23 0x4 | ||
123 | 0 24 0x4>; | ||
124 | interrupt-names = "macirq", "eth_wake_irq"; | ||
125 | status = "disabled"; | ||
126 | }; | ||
127 | |||
128 | smi: flash@ea000000 { | ||
129 | compatible = "st,spear600-smi"; | ||
130 | #address-cells = <1>; | ||
131 | #size-cells = <1>; | ||
132 | reg = <0xea000000 0x1000>; | ||
133 | interrupts = <0 30 0x4>; | ||
134 | status = "disabled"; | ||
135 | }; | ||
136 | |||
137 | spi0: spi@e0100000 { | ||
138 | compatible = "arm,pl022", "arm,primecell"; | ||
139 | reg = <0xe0100000 0x1000>; | ||
140 | interrupts = <0 31 0x4>; | ||
141 | status = "disabled"; | ||
142 | }; | ||
143 | |||
144 | ehci@e4800000 { | ||
145 | compatible = "st,spear600-ehci", "usb-ehci"; | ||
146 | reg = <0xe4800000 0x1000>; | ||
147 | interrupts = <0 64 0x4>; | ||
148 | status = "disabled"; | ||
149 | }; | ||
150 | |||
151 | ehci@e5800000 { | ||
152 | compatible = "st,spear600-ehci", "usb-ehci"; | ||
153 | reg = <0xe5800000 0x1000>; | ||
154 | interrupts = <0 66 0x4>; | ||
155 | status = "disabled"; | ||
156 | }; | ||
157 | |||
158 | ohci@e4000000 { | ||
159 | compatible = "st,spear600-ohci", "usb-ohci"; | ||
160 | reg = <0xe4000000 0x1000>; | ||
161 | interrupts = <0 65 0x4>; | ||
162 | status = "disabled"; | ||
163 | }; | ||
164 | |||
165 | ohci@e5000000 { | ||
166 | compatible = "st,spear600-ohci", "usb-ohci"; | ||
167 | reg = <0xe5000000 0x1000>; | ||
168 | interrupts = <0 67 0x4>; | ||
169 | status = "disabled"; | ||
170 | }; | ||
171 | |||
172 | apb { | ||
173 | #address-cells = <1>; | ||
174 | #size-cells = <1>; | ||
175 | compatible = "simple-bus"; | ||
176 | ranges = <0x50000000 0x50000000 0x10000000 | ||
177 | 0xb0000000 0xb0000000 0x10000000 | ||
178 | 0xe0000000 0xe0000000 0x10000000>; | ||
179 | |||
180 | gpio0: gpio@e0600000 { | ||
181 | compatible = "arm,pl061", "arm,primecell"; | ||
182 | reg = <0xe0600000 0x1000>; | ||
183 | interrupts = <0 24 0x4>; | ||
184 | gpio-controller; | ||
185 | #gpio-cells = <2>; | ||
186 | interrupt-controller; | ||
187 | #interrupt-cells = <2>; | ||
188 | status = "disabled"; | ||
189 | }; | ||
190 | |||
191 | gpio1: gpio@e0680000 { | ||
192 | compatible = "arm,pl061", "arm,primecell"; | ||
193 | reg = <0xe0680000 0x1000>; | ||
194 | interrupts = <0 25 0x4>; | ||
195 | gpio-controller; | ||
196 | #gpio-cells = <2>; | ||
197 | interrupt-controller; | ||
198 | #interrupt-cells = <2>; | ||
199 | status = "disabled"; | ||
200 | }; | ||
201 | |||
202 | kbd@e0300000 { | ||
203 | compatible = "st,spear300-kbd"; | ||
204 | reg = <0xe0300000 0x1000>; | ||
205 | status = "disabled"; | ||
206 | }; | ||
207 | |||
208 | i2c0: i2c@e0280000 { | ||
209 | #address-cells = <1>; | ||
210 | #size-cells = <0>; | ||
211 | compatible = "snps,designware-i2c"; | ||
212 | reg = <0xe0280000 0x1000>; | ||
213 | interrupts = <0 41 0x4>; | ||
214 | status = "disabled"; | ||
215 | }; | ||
216 | |||
217 | rtc@e0580000 { | ||
218 | compatible = "st,spear-rtc"; | ||
219 | reg = <0xe0580000 0x1000>; | ||
220 | interrupts = <0 36 0x4>; | ||
221 | status = "disabled"; | ||
222 | }; | ||
223 | |||
224 | serial@e0000000 { | ||
225 | compatible = "arm,pl011", "arm,primecell"; | ||
226 | reg = <0xe0000000 0x1000>; | ||
227 | interrupts = <0 36 0x4>; | ||
228 | status = "disabled"; | ||
229 | }; | ||
230 | |||
231 | adc@e0080000 { | ||
232 | compatible = "st,spear600-adc"; | ||
233 | reg = <0xe0080000 0x1000>; | ||
234 | interrupts = <0 44 0x4>; | ||
235 | status = "disabled"; | ||
236 | }; | ||
237 | |||
238 | timer@e0380000 { | ||
239 | compatible = "st,spear-timer"; | ||
240 | reg = <0xe0380000 0x400>; | ||
241 | interrupts = <0 37 0x4>; | ||
242 | }; | ||
243 | |||
244 | timer@ec800600 { | ||
245 | compatible = "arm,cortex-a9-twd-timer"; | ||
246 | reg = <0xec800600 0x20>; | ||
247 | interrupts = <1 13 0x301>; | ||
248 | }; | ||
249 | |||
250 | wdt@ec800620 { | ||
251 | compatible = "arm,cortex-a9-twd-wdt"; | ||
252 | reg = <0xec800620 0x20>; | ||
253 | status = "disabled"; | ||
254 | }; | ||
255 | |||
256 | thermal@e07008c4 { | ||
257 | compatible = "st,thermal-spear1340"; | ||
258 | reg = <0xe07008c4 0x4>; | ||
259 | }; | ||
260 | }; | ||
261 | }; | ||
262 | }; | ||
diff --git a/arch/arm/boot/dts/spear300-evb.dts b/arch/arm/boot/dts/spear300-evb.dts index 910e264b87c0..fc82b1a26458 100644 --- a/arch/arm/boot/dts/spear300-evb.dts +++ b/arch/arm/boot/dts/spear300-evb.dts | |||
@@ -87,6 +87,31 @@ | |||
87 | 87 | ||
88 | smi: flash@fc000000 { | 88 | smi: flash@fc000000 { |
89 | status = "okay"; | 89 | status = "okay"; |
90 | clock-rate=<50000000>; | ||
91 | |||
92 | flash@f8000000 { | ||
93 | #address-cells = <1>; | ||
94 | #size-cells = <1>; | ||
95 | reg = <0xf8000000 0x800000>; | ||
96 | st,smi-fast-mode; | ||
97 | |||
98 | partition@0 { | ||
99 | label = "xloader"; | ||
100 | reg = <0x0 0x10000>; | ||
101 | }; | ||
102 | partition@10000 { | ||
103 | label = "u-boot"; | ||
104 | reg = <0x10000 0x40000>; | ||
105 | }; | ||
106 | partition@50000 { | ||
107 | label = "linux"; | ||
108 | reg = <0x50000 0x2c0000>; | ||
109 | }; | ||
110 | partition@310000 { | ||
111 | label = "rootfs"; | ||
112 | reg = <0x310000 0x4f0000>; | ||
113 | }; | ||
114 | }; | ||
90 | }; | 115 | }; |
91 | 116 | ||
92 | spi0: spi@d0100000 { | 117 | spi0: spi@d0100000 { |
diff --git a/arch/arm/boot/dts/spear310-evb.dts b/arch/arm/boot/dts/spear310-evb.dts index 6d95317100ad..dc5e2d445a93 100644 --- a/arch/arm/boot/dts/spear310-evb.dts +++ b/arch/arm/boot/dts/spear310-evb.dts | |||
@@ -103,11 +103,27 @@ | |||
103 | clock-rate=<50000000>; | 103 | clock-rate=<50000000>; |
104 | 104 | ||
105 | flash@f8000000 { | 105 | flash@f8000000 { |
106 | label = "m25p64"; | ||
107 | reg = <0xf8000000 0x800000>; | ||
108 | #address-cells = <1>; | 106 | #address-cells = <1>; |
109 | #size-cells = <1>; | 107 | #size-cells = <1>; |
108 | reg = <0xf8000000 0x800000>; | ||
110 | st,smi-fast-mode; | 109 | st,smi-fast-mode; |
110 | |||
111 | partition@0 { | ||
112 | label = "xloader"; | ||
113 | reg = <0x0 0x10000>; | ||
114 | }; | ||
115 | partition@10000 { | ||
116 | label = "u-boot"; | ||
117 | reg = <0x10000 0x40000>; | ||
118 | }; | ||
119 | partition@50000 { | ||
120 | label = "linux"; | ||
121 | reg = <0x50000 0x2c0000>; | ||
122 | }; | ||
123 | partition@310000 { | ||
124 | label = "rootfs"; | ||
125 | reg = <0x310000 0x4f0000>; | ||
126 | }; | ||
111 | }; | 127 | }; |
112 | }; | 128 | }; |
113 | 129 | ||
diff --git a/arch/arm/boot/dts/spear320-evb.dts b/arch/arm/boot/dts/spear320-evb.dts index 0c6463b71a37..6308fa3bec1e 100644 --- a/arch/arm/boot/dts/spear320-evb.dts +++ b/arch/arm/boot/dts/spear320-evb.dts | |||
@@ -110,6 +110,31 @@ | |||
110 | 110 | ||
111 | smi: flash@fc000000 { | 111 | smi: flash@fc000000 { |
112 | status = "okay"; | 112 | status = "okay"; |
113 | clock-rate=<50000000>; | ||
114 | |||
115 | flash@f8000000 { | ||
116 | #address-cells = <1>; | ||
117 | #size-cells = <1>; | ||
118 | reg = <0xf8000000 0x800000>; | ||
119 | st,smi-fast-mode; | ||
120 | |||
121 | partition@0 { | ||
122 | label = "xloader"; | ||
123 | reg = <0x0 0x10000>; | ||
124 | }; | ||
125 | partition@10000 { | ||
126 | label = "u-boot"; | ||
127 | reg = <0x10000 0x40000>; | ||
128 | }; | ||
129 | partition@50000 { | ||
130 | label = "linux"; | ||
131 | reg = <0x50000 0x2c0000>; | ||
132 | }; | ||
133 | partition@310000 { | ||
134 | label = "rootfs"; | ||
135 | reg = <0x310000 0x4f0000>; | ||
136 | }; | ||
137 | }; | ||
113 | }; | 138 | }; |
114 | 139 | ||
115 | spi0: spi@d0100000 { | 140 | spi0: spi@d0100000 { |
diff --git a/arch/arm/boot/dts/spear3xx.dtsi b/arch/arm/boot/dts/spear3xx.dtsi index 0ae7c8e86311..91072553963f 100644 --- a/arch/arm/boot/dts/spear3xx.dtsi +++ b/arch/arm/boot/dts/spear3xx.dtsi | |||
@@ -139,6 +139,12 @@ | |||
139 | interrupts = <12>; | 139 | interrupts = <12>; |
140 | status = "disabled"; | 140 | status = "disabled"; |
141 | }; | 141 | }; |
142 | |||
143 | timer@f0000000 { | ||
144 | compatible = "st,spear-timer"; | ||
145 | reg = <0xf0000000 0x400>; | ||
146 | interrupts = <2>; | ||
147 | }; | ||
142 | }; | 148 | }; |
143 | }; | 149 | }; |
144 | }; | 150 | }; |
diff --git a/arch/arm/boot/dts/spear600-evb.dts b/arch/arm/boot/dts/spear600-evb.dts index 790a7a8a5ccd..1119c22c9a82 100644 --- a/arch/arm/boot/dts/spear600-evb.dts +++ b/arch/arm/boot/dts/spear600-evb.dts | |||
@@ -33,6 +33,35 @@ | |||
33 | status = "okay"; | 33 | status = "okay"; |
34 | }; | 34 | }; |
35 | 35 | ||
36 | smi: flash@fc000000 { | ||
37 | status = "okay"; | ||
38 | clock-rate=<50000000>; | ||
39 | |||
40 | flash@f8000000 { | ||
41 | #address-cells = <1>; | ||
42 | #size-cells = <1>; | ||
43 | reg = <0xf8000000 0x800000>; | ||
44 | st,smi-fast-mode; | ||
45 | |||
46 | partition@0 { | ||
47 | label = "xloader"; | ||
48 | reg = <0x0 0x10000>; | ||
49 | }; | ||
50 | partition@10000 { | ||
51 | label = "u-boot"; | ||
52 | reg = <0x10000 0x40000>; | ||
53 | }; | ||
54 | partition@50000 { | ||
55 | label = "linux"; | ||
56 | reg = <0x50000 0x2c0000>; | ||
57 | }; | ||
58 | partition@310000 { | ||
59 | label = "rootfs"; | ||
60 | reg = <0x310000 0x4f0000>; | ||
61 | }; | ||
62 | }; | ||
63 | }; | ||
64 | |||
36 | apb { | 65 | apb { |
37 | serial@d0000000 { | 66 | serial@d0000000 { |
38 | status = "okay"; | 67 | status = "okay"; |
diff --git a/arch/arm/boot/dts/spear600.dtsi b/arch/arm/boot/dts/spear600.dtsi index d777e3a6f178..089f0a42c50e 100644 --- a/arch/arm/boot/dts/spear600.dtsi +++ b/arch/arm/boot/dts/spear600.dtsi | |||
@@ -177,6 +177,12 @@ | |||
177 | interrupts = <28>; | 177 | interrupts = <28>; |
178 | status = "disabled"; | 178 | status = "disabled"; |
179 | }; | 179 | }; |
180 | |||
181 | timer@f0000000 { | ||
182 | compatible = "st,spear-timer"; | ||
183 | reg = <0xf0000000 0x400>; | ||
184 | interrupts = <16>; | ||
185 | }; | ||
180 | }; | 186 | }; |
181 | }; | 187 | }; |
182 | }; | 188 | }; |
diff --git a/arch/arm/boot/dts/tegra-cardhu.dts b/arch/arm/boot/dts/tegra-cardhu.dts index 0a9f34a2c3aa..36321bceec46 100644 --- a/arch/arm/boot/dts/tegra-cardhu.dts +++ b/arch/arm/boot/dts/tegra-cardhu.dts | |||
@@ -7,10 +7,10 @@ | |||
7 | compatible = "nvidia,cardhu", "nvidia,tegra30"; | 7 | compatible = "nvidia,cardhu", "nvidia,tegra30"; |
8 | 8 | ||
9 | memory { | 9 | memory { |
10 | reg = < 0x80000000 0x40000000 >; | 10 | reg = <0x80000000 0x40000000>; |
11 | }; | 11 | }; |
12 | 12 | ||
13 | pinmux@70000000 { | 13 | pinmux { |
14 | pinctrl-names = "default"; | 14 | pinctrl-names = "default"; |
15 | pinctrl-0 = <&state_default>; | 15 | pinctrl-0 = <&state_default>; |
16 | 16 | ||
@@ -51,64 +51,122 @@ | |||
51 | nvidia,pull = <2>; | 51 | nvidia,pull = <2>; |
52 | nvidia,tristate = <0>; | 52 | nvidia,tristate = <0>; |
53 | }; | 53 | }; |
54 | dap2_fs_pa2 { | ||
55 | nvidia,pins = "dap2_fs_pa2", | ||
56 | "dap2_sclk_pa3", | ||
57 | "dap2_din_pa4", | ||
58 | "dap2_dout_pa5"; | ||
59 | nvidia,function = "i2s1"; | ||
60 | nvidia,pull = <0>; | ||
61 | nvidia,tristate = <0>; | ||
62 | }; | ||
54 | }; | 63 | }; |
55 | }; | 64 | }; |
56 | 65 | ||
57 | serial@70006000 { | 66 | serial@70006000 { |
58 | clock-frequency = < 408000000 >; | 67 | status = "okay"; |
59 | }; | 68 | clock-frequency = <408000000>; |
60 | |||
61 | serial@70006040 { | ||
62 | status = "disable"; | ||
63 | }; | ||
64 | |||
65 | serial@70006200 { | ||
66 | status = "disable"; | ||
67 | }; | ||
68 | |||
69 | serial@70006300 { | ||
70 | status = "disable"; | ||
71 | }; | ||
72 | |||
73 | serial@70006400 { | ||
74 | status = "disable"; | ||
75 | }; | 69 | }; |
76 | 70 | ||
77 | i2c@7000c000 { | 71 | i2c@7000c000 { |
72 | status = "okay"; | ||
78 | clock-frequency = <100000>; | 73 | clock-frequency = <100000>; |
79 | }; | 74 | }; |
80 | 75 | ||
81 | i2c@7000c400 { | 76 | i2c@7000c400 { |
77 | status = "okay"; | ||
82 | clock-frequency = <100000>; | 78 | clock-frequency = <100000>; |
83 | }; | 79 | }; |
84 | 80 | ||
85 | i2c@7000c500 { | 81 | i2c@7000c500 { |
82 | status = "okay"; | ||
86 | clock-frequency = <100000>; | 83 | clock-frequency = <100000>; |
84 | |||
85 | /* ALS and Proximity sensor */ | ||
86 | isl29028@44 { | ||
87 | compatible = "isil,isl29028"; | ||
88 | reg = <0x44>; | ||
89 | interrupt-parent = <&gpio>; | ||
90 | interrupts = <88 0x04>; /*gpio PL0 */ | ||
91 | }; | ||
87 | }; | 92 | }; |
88 | 93 | ||
89 | i2c@7000c700 { | 94 | i2c@7000c700 { |
95 | status = "okay"; | ||
90 | clock-frequency = <100000>; | 96 | clock-frequency = <100000>; |
91 | }; | 97 | }; |
92 | 98 | ||
93 | i2c@7000d000 { | 99 | i2c@7000d000 { |
100 | status = "okay"; | ||
94 | clock-frequency = <100000>; | 101 | clock-frequency = <100000>; |
102 | |||
103 | wm8903: wm8903@1a { | ||
104 | compatible = "wlf,wm8903"; | ||
105 | reg = <0x1a>; | ||
106 | interrupt-parent = <&gpio>; | ||
107 | interrupts = <179 0x04>; /* gpio PW3 */ | ||
108 | |||
109 | gpio-controller; | ||
110 | #gpio-cells = <2>; | ||
111 | |||
112 | micdet-cfg = <0>; | ||
113 | micdet-delay = <100>; | ||
114 | gpio-cfg = <0xffffffff 0xffffffff 0 0xffffffff 0xffffffff>; | ||
115 | }; | ||
116 | |||
117 | tps62361 { | ||
118 | compatible = "ti,tps62361"; | ||
119 | reg = <0x60>; | ||
120 | |||
121 | regulator-name = "tps62361-vout"; | ||
122 | regulator-min-microvolt = <500000>; | ||
123 | regulator-max-microvolt = <1500000>; | ||
124 | regulator-boot-on; | ||
125 | regulator-always-on; | ||
126 | ti,vsel0-state-high; | ||
127 | ti,vsel1-state-high; | ||
128 | }; | ||
129 | }; | ||
130 | |||
131 | ahub { | ||
132 | i2s@70080400 { | ||
133 | status = "okay"; | ||
134 | }; | ||
95 | }; | 135 | }; |
96 | 136 | ||
97 | sdhci@78000000 { | 137 | sdhci@78000000 { |
138 | status = "okay"; | ||
98 | cd-gpios = <&gpio 69 0>; /* gpio PI5 */ | 139 | cd-gpios = <&gpio 69 0>; /* gpio PI5 */ |
99 | wp-gpios = <&gpio 155 0>; /* gpio PT3 */ | 140 | wp-gpios = <&gpio 155 0>; /* gpio PT3 */ |
100 | power-gpios = <&gpio 31 0>; /* gpio PD7 */ | 141 | power-gpios = <&gpio 31 0>; /* gpio PD7 */ |
142 | bus-width = <4>; | ||
101 | }; | 143 | }; |
102 | 144 | ||
103 | sdhci@78000200 { | 145 | sdhci@78000600 { |
104 | status = "disable"; | 146 | status = "okay"; |
147 | support-8bit; | ||
148 | bus-width = <8>; | ||
105 | }; | 149 | }; |
106 | 150 | ||
107 | sdhci@78000400 { | 151 | sound { |
108 | status = "disable"; | 152 | compatible = "nvidia,tegra-audio-wm8903-cardhu", |
109 | }; | 153 | "nvidia,tegra-audio-wm8903"; |
154 | nvidia,model = "NVIDIA Tegra Cardhu"; | ||
110 | 155 | ||
111 | sdhci@78000400 { | 156 | nvidia,audio-routing = |
112 | support-8bit; | 157 | "Headphone Jack", "HPOUTR", |
158 | "Headphone Jack", "HPOUTL", | ||
159 | "Int Spk", "ROP", | ||
160 | "Int Spk", "RON", | ||
161 | "Int Spk", "LOP", | ||
162 | "Int Spk", "LON", | ||
163 | "Mic Jack", "MICBIAS", | ||
164 | "IN1L", "Mic Jack"; | ||
165 | |||
166 | nvidia,i2s-controller = <&tegra_i2s1>; | ||
167 | nvidia,audio-codec = <&wm8903>; | ||
168 | |||
169 | nvidia,spkr-en-gpios = <&wm8903 2 0>; | ||
170 | nvidia,hp-det-gpios = <&gpio 178 0>; /* gpio PW2 */ | ||
113 | }; | 171 | }; |
114 | }; | 172 | }; |
diff --git a/arch/arm/boot/dts/tegra-harmony.dts b/arch/arm/boot/dts/tegra-harmony.dts index 1a0b1f182944..7de701365fce 100644 --- a/arch/arm/boot/dts/tegra-harmony.dts +++ b/arch/arm/boot/dts/tegra-harmony.dts | |||
@@ -6,11 +6,11 @@ | |||
6 | model = "NVIDIA Tegra2 Harmony evaluation board"; | 6 | model = "NVIDIA Tegra2 Harmony evaluation board"; |
7 | compatible = "nvidia,harmony", "nvidia,tegra20"; | 7 | compatible = "nvidia,harmony", "nvidia,tegra20"; |
8 | 8 | ||
9 | memory@0 { | 9 | memory { |
10 | reg = < 0x00000000 0x40000000 >; | 10 | reg = <0x00000000 0x40000000>; |
11 | }; | 11 | }; |
12 | 12 | ||
13 | pinmux@70000000 { | 13 | pinmux { |
14 | pinctrl-names = "default"; | 14 | pinctrl-names = "default"; |
15 | pinctrl-0 = <&state_default>; | 15 | pinctrl-0 = <&state_default>; |
16 | 16 | ||
@@ -167,28 +167,28 @@ | |||
167 | }; | 167 | }; |
168 | conf_ata { | 168 | conf_ata { |
169 | nvidia,pins = "ata", "atb", "atc", "atd", "ate", | 169 | nvidia,pins = "ata", "atb", "atc", "atd", "ate", |
170 | "cdev1", "dap1", "dtb", "gma", "gmb", | 170 | "cdev1", "cdev2", "dap1", "dtb", "gma", |
171 | "gmc", "gmd", "gme", "gpu7", "gpv", | 171 | "gmb", "gmc", "gmd", "gme", "gpu7", |
172 | "i2cp", "pta", "rm", "slxa", "slxk", | 172 | "gpv", "i2cp", "pta", "rm", "slxa", |
173 | "spia", "spib"; | 173 | "slxk", "spia", "spib", "uac"; |
174 | nvidia,pull = <0>; | 174 | nvidia,pull = <0>; |
175 | nvidia,tristate = <0>; | 175 | nvidia,tristate = <0>; |
176 | }; | 176 | }; |
177 | conf_cdev2 { | ||
178 | nvidia,pins = "cdev2", "csus", "spid", "spif"; | ||
179 | nvidia,pull = <1>; | ||
180 | nvidia,tristate = <1>; | ||
181 | }; | ||
182 | conf_ck32 { | 177 | conf_ck32 { |
183 | nvidia,pins = "ck32", "ddrc", "pmca", "pmcb", | 178 | nvidia,pins = "ck32", "ddrc", "pmca", "pmcb", |
184 | "pmcc", "pmcd", "pmce", "xm2c", "xm2d"; | 179 | "pmcc", "pmcd", "pmce", "xm2c", "xm2d"; |
185 | nvidia,pull = <0>; | 180 | nvidia,pull = <0>; |
186 | }; | 181 | }; |
182 | conf_csus { | ||
183 | nvidia,pins = "csus", "spid", "spif"; | ||
184 | nvidia,pull = <1>; | ||
185 | nvidia,tristate = <1>; | ||
186 | }; | ||
187 | conf_crtp { | 187 | conf_crtp { |
188 | nvidia,pins = "crtp", "dap2", "dap3", "dap4", | 188 | nvidia,pins = "crtp", "dap2", "dap3", "dap4", |
189 | "dtc", "dte", "dtf", "gpu", "sdio1", | 189 | "dtc", "dte", "dtf", "gpu", "sdio1", |
190 | "slxc", "slxd", "spdi", "spdo", "spig", | 190 | "slxc", "slxd", "spdi", "spdo", "spig", |
191 | "uac", "uda"; | 191 | "uda"; |
192 | nvidia,pull = <0>; | 192 | nvidia,pull = <0>; |
193 | nvidia,tristate = <1>; | 193 | nvidia,tristate = <1>; |
194 | }; | 194 | }; |
@@ -234,42 +234,81 @@ | |||
234 | }; | 234 | }; |
235 | }; | 235 | }; |
236 | 236 | ||
237 | pmc@7000f400 { | 237 | i2s@70002800 { |
238 | nvidia,invert-interrupt; | 238 | status = "okay"; |
239 | }; | ||
240 | |||
241 | serial@70006300 { | ||
242 | status = "okay"; | ||
243 | clock-frequency = <216000000>; | ||
239 | }; | 244 | }; |
240 | 245 | ||
241 | i2c@7000c000 { | 246 | i2c@7000c000 { |
247 | status = "okay"; | ||
242 | clock-frequency = <400000>; | 248 | clock-frequency = <400000>; |
243 | 249 | ||
244 | wm8903: wm8903@1a { | 250 | wm8903: wm8903@1a { |
245 | compatible = "wlf,wm8903"; | 251 | compatible = "wlf,wm8903"; |
246 | reg = <0x1a>; | 252 | reg = <0x1a>; |
247 | interrupt-parent = <&gpio>; | 253 | interrupt-parent = <&gpio>; |
248 | interrupts = < 187 0x04 >; | 254 | interrupts = <187 0x04>; |
249 | 255 | ||
250 | gpio-controller; | 256 | gpio-controller; |
251 | #gpio-cells = <2>; | 257 | #gpio-cells = <2>; |
252 | 258 | ||
253 | micdet-cfg = <0>; | 259 | micdet-cfg = <0>; |
254 | micdet-delay = <100>; | 260 | micdet-delay = <100>; |
255 | gpio-cfg = < 0xffffffff 0xffffffff 0 0xffffffff 0xffffffff >; | 261 | gpio-cfg = <0xffffffff 0xffffffff 0 0xffffffff 0xffffffff>; |
256 | }; | 262 | }; |
257 | }; | 263 | }; |
258 | 264 | ||
259 | i2c@7000c400 { | 265 | i2c@7000c400 { |
266 | status = "okay"; | ||
260 | clock-frequency = <400000>; | 267 | clock-frequency = <400000>; |
261 | }; | 268 | }; |
262 | 269 | ||
263 | i2c@7000c500 { | 270 | i2c@7000c500 { |
271 | status = "okay"; | ||
264 | clock-frequency = <400000>; | 272 | clock-frequency = <400000>; |
265 | }; | 273 | }; |
266 | 274 | ||
267 | i2c@7000d000 { | 275 | i2c@7000d000 { |
276 | status = "okay"; | ||
268 | clock-frequency = <400000>; | 277 | clock-frequency = <400000>; |
269 | }; | 278 | }; |
270 | 279 | ||
271 | i2s@70002a00 { | 280 | pmc { |
272 | status = "disable"; | 281 | nvidia,invert-interrupt; |
282 | }; | ||
283 | |||
284 | usb@c5000000 { | ||
285 | status = "okay"; | ||
286 | }; | ||
287 | |||
288 | usb@c5004000 { | ||
289 | status = "okay"; | ||
290 | nvidia,phy-reset-gpio = <&gpio 169 0>; /* gpio PV1 */ | ||
291 | }; | ||
292 | |||
293 | usb@c5008000 { | ||
294 | status = "okay"; | ||
295 | }; | ||
296 | |||
297 | sdhci@c8000200 { | ||
298 | status = "okay"; | ||
299 | cd-gpios = <&gpio 69 0>; /* gpio PI5 */ | ||
300 | wp-gpios = <&gpio 57 0>; /* gpio PH1 */ | ||
301 | power-gpios = <&gpio 155 0>; /* gpio PT3 */ | ||
302 | bus-width = <4>; | ||
303 | }; | ||
304 | |||
305 | sdhci@c8000600 { | ||
306 | status = "okay"; | ||
307 | cd-gpios = <&gpio 58 0>; /* gpio PH2 */ | ||
308 | wp-gpios = <&gpio 59 0>; /* gpio PH3 */ | ||
309 | power-gpios = <&gpio 70 0>; /* gpio PI6 */ | ||
310 | support-8bit; | ||
311 | bus-width = <8>; | ||
273 | }; | 312 | }; |
274 | 313 | ||
275 | sound { | 314 | sound { |
@@ -295,45 +334,4 @@ | |||
295 | nvidia,int-mic-en-gpios = <&gpio 184 0>; /*gpio PX0 */ | 334 | nvidia,int-mic-en-gpios = <&gpio 184 0>; /*gpio PX0 */ |
296 | nvidia,ext-mic-en-gpios = <&gpio 185 0>; /* gpio PX1 */ | 335 | nvidia,ext-mic-en-gpios = <&gpio 185 0>; /* gpio PX1 */ |
297 | }; | 336 | }; |
298 | |||
299 | serial@70006000 { | ||
300 | status = "disable"; | ||
301 | }; | ||
302 | |||
303 | serial@70006040 { | ||
304 | status = "disable"; | ||
305 | }; | ||
306 | |||
307 | serial@70006200 { | ||
308 | status = "disable"; | ||
309 | }; | ||
310 | |||
311 | serial@70006300 { | ||
312 | clock-frequency = < 216000000 >; | ||
313 | }; | ||
314 | |||
315 | serial@70006400 { | ||
316 | status = "disable"; | ||
317 | }; | ||
318 | |||
319 | sdhci@c8000000 { | ||
320 | status = "disable"; | ||
321 | }; | ||
322 | |||
323 | sdhci@c8000200 { | ||
324 | cd-gpios = <&gpio 69 0>; /* gpio PI5 */ | ||
325 | wp-gpios = <&gpio 57 0>; /* gpio PH1 */ | ||
326 | power-gpios = <&gpio 155 0>; /* gpio PT3 */ | ||
327 | }; | ||
328 | |||
329 | sdhci@c8000400 { | ||
330 | status = "disable"; | ||
331 | }; | ||
332 | |||
333 | sdhci@c8000600 { | ||
334 | cd-gpios = <&gpio 58 0>; /* gpio PH2 */ | ||
335 | wp-gpios = <&gpio 59 0>; /* gpio PH3 */ | ||
336 | power-gpios = <&gpio 70 0>; /* gpio PI6 */ | ||
337 | support-8bit; | ||
338 | }; | ||
339 | }; | 337 | }; |
diff --git a/arch/arm/boot/dts/tegra-paz00.dts b/arch/arm/boot/dts/tegra-paz00.dts index 10943fb2561c..bfeb117d5aea 100644 --- a/arch/arm/boot/dts/tegra-paz00.dts +++ b/arch/arm/boot/dts/tegra-paz00.dts | |||
@@ -6,11 +6,11 @@ | |||
6 | model = "Toshiba AC100 / Dynabook AZ"; | 6 | model = "Toshiba AC100 / Dynabook AZ"; |
7 | compatible = "compal,paz00", "nvidia,tegra20"; | 7 | compatible = "compal,paz00", "nvidia,tegra20"; |
8 | 8 | ||
9 | memory@0 { | 9 | memory { |
10 | reg = <0x00000000 0x20000000>; | 10 | reg = <0x00000000 0x20000000>; |
11 | }; | 11 | }; |
12 | 12 | ||
13 | pinmux@70000000 { | 13 | pinmux { |
14 | pinctrl-names = "default"; | 14 | pinctrl-names = "default"; |
15 | pinctrl-0 = <&state_default>; | 15 | pinctrl-0 = <&state_default>; |
16 | 16 | ||
@@ -159,18 +159,14 @@ | |||
159 | }; | 159 | }; |
160 | conf_ata { | 160 | conf_ata { |
161 | nvidia,pins = "ata", "atb", "atc", "atd", "ate", | 161 | nvidia,pins = "ata", "atb", "atc", "atd", "ate", |
162 | "cdev1", "dap1", "dap2", "dtf", "gma", | 162 | "cdev1", "cdev2", "dap1", "dap2", "dtf", |
163 | "gmb", "gmc", "gmd", "gme", "gpu", | 163 | "gma", "gmb", "gmc", "gmd", "gme", |
164 | "gpu7", "gpv", "i2cp", "pta", "rm", | 164 | "gpu", "gpu7", "gpv", "i2cp", "pta", |
165 | "sdio1", "slxk", "spdo", "uac", "uda"; | 165 | "rm", "sdio1", "slxk", "spdo", "uac", |
166 | "uda"; | ||
166 | nvidia,pull = <0>; | 167 | nvidia,pull = <0>; |
167 | nvidia,tristate = <0>; | 168 | nvidia,tristate = <0>; |
168 | }; | 169 | }; |
169 | conf_cdev2 { | ||
170 | nvidia,pins = "cdev2"; | ||
171 | nvidia,pull = <1>; | ||
172 | nvidia,tristate = <0>; | ||
173 | }; | ||
174 | conf_ck32 { | 170 | conf_ck32 { |
175 | nvidia,pins = "ck32", "ddrc", "pmca", "pmcb", | 171 | nvidia,pins = "ck32", "ddrc", "pmca", "pmcb", |
176 | "pmcc", "pmcd", "pmce", "xm2c", "xm2d"; | 172 | "pmcc", "pmcd", "pmce", "xm2c", "xm2d"; |
@@ -230,7 +226,22 @@ | |||
230 | }; | 226 | }; |
231 | }; | 227 | }; |
232 | 228 | ||
229 | i2s@70002800 { | ||
230 | status = "okay"; | ||
231 | }; | ||
232 | |||
233 | serial@70006000 { | ||
234 | status = "okay"; | ||
235 | clock-frequency = <216000000>; | ||
236 | }; | ||
237 | |||
238 | serial@70006200 { | ||
239 | status = "okay"; | ||
240 | clock-frequency = <216000000>; | ||
241 | }; | ||
242 | |||
233 | i2c@7000c000 { | 243 | i2c@7000c000 { |
244 | status = "okay"; | ||
234 | clock-frequency = <400000>; | 245 | clock-frequency = <400000>; |
235 | 246 | ||
236 | alc5632: alc5632@1e { | 247 | alc5632: alc5632@1e { |
@@ -242,25 +253,23 @@ | |||
242 | }; | 253 | }; |
243 | 254 | ||
244 | i2c@7000c400 { | 255 | i2c@7000c400 { |
256 | status = "okay"; | ||
245 | clock-frequency = <400000>; | 257 | clock-frequency = <400000>; |
246 | }; | 258 | }; |
247 | 259 | ||
248 | i2c@7000c500 { | 260 | nvec { |
249 | status = "disable"; | ||
250 | }; | ||
251 | |||
252 | nvec@7000c500 { | ||
253 | #address-cells = <1>; | ||
254 | #size-cells = <0>; | ||
255 | compatible = "nvidia,nvec"; | 261 | compatible = "nvidia,nvec"; |
256 | reg = <0x7000C500 0x100>; | 262 | reg = <0x7000c500 0x100>; |
257 | interrupts = <0 92 0x04>; | 263 | interrupts = <0 92 0x04>; |
264 | #address-cells = <1>; | ||
265 | #size-cells = <0>; | ||
258 | clock-frequency = <80000>; | 266 | clock-frequency = <80000>; |
259 | request-gpios = <&gpio 170 0>; | 267 | request-gpios = <&gpio 170 0>; /* gpio PV2 */ |
260 | slave-addr = <138>; | 268 | slave-addr = <138>; |
261 | }; | 269 | }; |
262 | 270 | ||
263 | i2c@7000d000 { | 271 | i2c@7000d000 { |
272 | status = "okay"; | ||
264 | clock-frequency = <400000>; | 273 | clock-frequency = <400000>; |
265 | 274 | ||
266 | adt7461@4c { | 275 | adt7461@4c { |
@@ -269,66 +278,31 @@ | |||
269 | }; | 278 | }; |
270 | }; | 279 | }; |
271 | 280 | ||
272 | i2s@70002a00 { | 281 | usb@c5000000 { |
273 | status = "disable"; | 282 | status = "okay"; |
274 | }; | ||
275 | |||
276 | sound { | ||
277 | compatible = "nvidia,tegra-audio-alc5632-paz00", | ||
278 | "nvidia,tegra-audio-alc5632"; | ||
279 | |||
280 | nvidia,model = "Compal PAZ00"; | ||
281 | |||
282 | nvidia,audio-routing = | ||
283 | "Int Spk", "SPKOUT", | ||
284 | "Int Spk", "SPKOUTN", | ||
285 | "Headset Mic", "MICBIAS1", | ||
286 | "MIC1", "Headset Mic", | ||
287 | "Headset Stereophone", "HPR", | ||
288 | "Headset Stereophone", "HPL", | ||
289 | "DMICDAT", "Digital Mic"; | ||
290 | |||
291 | nvidia,audio-codec = <&alc5632>; | ||
292 | nvidia,i2s-controller = <&tegra_i2s1>; | ||
293 | nvidia,hp-det-gpios = <&gpio 178 0>; /* gpio PW2 */ | ||
294 | }; | ||
295 | |||
296 | serial@70006000 { | ||
297 | clock-frequency = <216000000>; | ||
298 | }; | 283 | }; |
299 | 284 | ||
300 | serial@70006040 { | 285 | usb@c5004000 { |
301 | status = "disable"; | 286 | status = "okay"; |
287 | nvidia,phy-reset-gpio = <&gpio 168 0>; /* gpio PV0 */ | ||
302 | }; | 288 | }; |
303 | 289 | ||
304 | serial@70006200 { | 290 | usb@c5008000 { |
305 | clock-frequency = <216000000>; | 291 | status = "okay"; |
306 | }; | ||
307 | |||
308 | serial@70006300 { | ||
309 | status = "disable"; | ||
310 | }; | ||
311 | |||
312 | serial@70006400 { | ||
313 | status = "disable"; | ||
314 | }; | 292 | }; |
315 | 293 | ||
316 | sdhci@c8000000 { | 294 | sdhci@c8000000 { |
295 | status = "okay"; | ||
317 | cd-gpios = <&gpio 173 0>; /* gpio PV5 */ | 296 | cd-gpios = <&gpio 173 0>; /* gpio PV5 */ |
318 | wp-gpios = <&gpio 57 0>; /* gpio PH1 */ | 297 | wp-gpios = <&gpio 57 0>; /* gpio PH1 */ |
319 | power-gpios = <&gpio 169 0>; /* gpio PV1 */ | 298 | power-gpios = <&gpio 169 0>; /* gpio PV1 */ |
320 | }; | 299 | bus-width = <4>; |
321 | |||
322 | sdhci@c8000200 { | ||
323 | status = "disable"; | ||
324 | }; | ||
325 | |||
326 | sdhci@c8000400 { | ||
327 | status = "disable"; | ||
328 | }; | 300 | }; |
329 | 301 | ||
330 | sdhci@c8000600 { | 302 | sdhci@c8000600 { |
303 | status = "okay"; | ||
331 | support-8bit; | 304 | support-8bit; |
305 | bus-width = <8>; | ||
332 | }; | 306 | }; |
333 | 307 | ||
334 | gpio-keys { | 308 | gpio-keys { |
@@ -347,8 +321,28 @@ | |||
347 | 321 | ||
348 | wifi { | 322 | wifi { |
349 | label = "wifi-led"; | 323 | label = "wifi-led"; |
350 | gpios = <&gpio 24 0>; | 324 | gpios = <&gpio 24 0>; /* gpio PD0 */ |
351 | linux,default-trigger = "rfkill0"; | 325 | linux,default-trigger = "rfkill0"; |
352 | }; | 326 | }; |
353 | }; | 327 | }; |
328 | |||
329 | sound { | ||
330 | compatible = "nvidia,tegra-audio-alc5632-paz00", | ||
331 | "nvidia,tegra-audio-alc5632"; | ||
332 | |||
333 | nvidia,model = "Compal PAZ00"; | ||
334 | |||
335 | nvidia,audio-routing = | ||
336 | "Int Spk", "SPKOUT", | ||
337 | "Int Spk", "SPKOUTN", | ||
338 | "Headset Mic", "MICBIAS1", | ||
339 | "MIC1", "Headset Mic", | ||
340 | "Headset Stereophone", "HPR", | ||
341 | "Headset Stereophone", "HPL", | ||
342 | "DMICDAT", "Digital Mic"; | ||
343 | |||
344 | nvidia,audio-codec = <&alc5632>; | ||
345 | nvidia,i2s-controller = <&tegra_i2s1>; | ||
346 | nvidia,hp-det-gpios = <&gpio 178 0>; /* gpio PW2 */ | ||
347 | }; | ||
354 | }; | 348 | }; |
diff --git a/arch/arm/boot/dts/tegra-seaboard.dts b/arch/arm/boot/dts/tegra-seaboard.dts index ec33116f5df9..89cb7f2acd92 100644 --- a/arch/arm/boot/dts/tegra-seaboard.dts +++ b/arch/arm/boot/dts/tegra-seaboard.dts | |||
@@ -7,11 +7,10 @@ | |||
7 | compatible = "nvidia,seaboard", "nvidia,tegra20"; | 7 | compatible = "nvidia,seaboard", "nvidia,tegra20"; |
8 | 8 | ||
9 | memory { | 9 | memory { |
10 | device_type = "memory"; | 10 | reg = <0x00000000 0x40000000>; |
11 | reg = < 0x00000000 0x40000000 >; | ||
12 | }; | 11 | }; |
13 | 12 | ||
14 | pinmux@70000000 { | 13 | pinmux { |
15 | pinctrl-names = "default"; | 14 | pinctrl-names = "default"; |
16 | pinctrl-0 = <&state_default>; | 15 | pinctrl-0 = <&state_default>; |
17 | 16 | ||
@@ -100,7 +99,7 @@ | |||
100 | }; | 99 | }; |
101 | hdint { | 100 | hdint { |
102 | nvidia,pins = "hdint", "lpw0", "lpw2", "lsc1", | 101 | nvidia,pins = "hdint", "lpw0", "lpw2", "lsc1", |
103 | "lsck", "lsda", "pta"; | 102 | "lsck", "lsda"; |
104 | nvidia,function = "hdmi"; | 103 | nvidia,function = "hdmi"; |
105 | }; | 104 | }; |
106 | i2cp { | 105 | i2cp { |
@@ -134,6 +133,10 @@ | |||
134 | nvidia,pins = "pmc"; | 133 | nvidia,pins = "pmc"; |
135 | nvidia,function = "pwr_on"; | 134 | nvidia,function = "pwr_on"; |
136 | }; | 135 | }; |
136 | pta { | ||
137 | nvidia,pins = "pta"; | ||
138 | nvidia,function = "i2c2"; | ||
139 | }; | ||
137 | rm { | 140 | rm { |
138 | nvidia,pins = "rm"; | 141 | nvidia,pins = "rm"; |
139 | nvidia,function = "i2c1"; | 142 | nvidia,function = "i2c1"; |
@@ -254,108 +257,148 @@ | |||
254 | }; | 257 | }; |
255 | }; | 258 | }; |
256 | 259 | ||
260 | i2s@70002800 { | ||
261 | status = "okay"; | ||
262 | }; | ||
263 | |||
264 | serial@70006300 { | ||
265 | status = "okay"; | ||
266 | clock-frequency = <216000000>; | ||
267 | }; | ||
268 | |||
257 | i2c@7000c000 { | 269 | i2c@7000c000 { |
270 | status = "okay"; | ||
258 | clock-frequency = <400000>; | 271 | clock-frequency = <400000>; |
259 | 272 | ||
260 | wm8903: wm8903@1a { | 273 | wm8903: wm8903@1a { |
261 | compatible = "wlf,wm8903"; | 274 | compatible = "wlf,wm8903"; |
262 | reg = <0x1a>; | 275 | reg = <0x1a>; |
263 | interrupt-parent = <&gpio>; | 276 | interrupt-parent = <&gpio>; |
264 | interrupts = < 187 0x04 >; | 277 | interrupts = <187 0x04>; |
265 | 278 | ||
266 | gpio-controller; | 279 | gpio-controller; |
267 | #gpio-cells = <2>; | 280 | #gpio-cells = <2>; |
268 | 281 | ||
269 | micdet-cfg = <0>; | 282 | micdet-cfg = <0>; |
270 | micdet-delay = <100>; | 283 | micdet-delay = <100>; |
271 | gpio-cfg = < 0xffffffff 0xffffffff 0 0xffffffff 0xffffffff >; | 284 | gpio-cfg = <0xffffffff 0xffffffff 0 0xffffffff 0xffffffff>; |
285 | }; | ||
286 | |||
287 | /* ALS and proximity sensor */ | ||
288 | isl29018@44 { | ||
289 | compatible = "isil,isl29018"; | ||
290 | reg = <0x44>; | ||
291 | interrupt-parent = <&gpio>; | ||
292 | interrupts = <202 0x04>; /* GPIO PZ2 */ | ||
293 | }; | ||
294 | |||
295 | gyrometer@68 { | ||
296 | compatible = "invn,mpu3050"; | ||
297 | reg = <0x68>; | ||
298 | interrupt-parent = <&gpio>; | ||
299 | interrupts = <204 0x04>; /* gpio PZ4 */ | ||
272 | }; | 300 | }; |
273 | }; | 301 | }; |
274 | 302 | ||
275 | i2c@7000c400 { | 303 | i2c@7000c400 { |
276 | clock-frequency = <400000>; | 304 | status = "okay"; |
305 | clock-frequency = <100000>; | ||
306 | |||
307 | smart-battery@b { | ||
308 | compatible = "ti,bq20z75", "smart-battery-1.1"; | ||
309 | reg = <0xb>; | ||
310 | ti,i2c-retry-count = <2>; | ||
311 | ti,poll-retry-count = <10>; | ||
312 | }; | ||
277 | }; | 313 | }; |
278 | 314 | ||
279 | i2c@7000c500 { | 315 | i2c@7000c500 { |
316 | status = "okay"; | ||
280 | clock-frequency = <400000>; | 317 | clock-frequency = <400000>; |
281 | }; | 318 | }; |
282 | 319 | ||
283 | i2c@7000d000 { | 320 | i2c@7000d000 { |
321 | status = "okay"; | ||
284 | clock-frequency = <400000>; | 322 | clock-frequency = <400000>; |
285 | 323 | ||
286 | adt7461@4c { | 324 | temperature-sensor@4c { |
287 | compatible = "adt7461"; | 325 | compatible = "nct1008"; |
288 | reg = <0x4c>; | 326 | reg = <0x4c>; |
289 | }; | 327 | }; |
290 | }; | ||
291 | |||
292 | i2s@70002a00 { | ||
293 | status = "disable"; | ||
294 | }; | ||
295 | |||
296 | sound { | ||
297 | compatible = "nvidia,tegra-audio-wm8903-seaboard", | ||
298 | "nvidia,tegra-audio-wm8903"; | ||
299 | nvidia,model = "NVIDIA Tegra Seaboard"; | ||
300 | |||
301 | nvidia,audio-routing = | ||
302 | "Headphone Jack", "HPOUTR", | ||
303 | "Headphone Jack", "HPOUTL", | ||
304 | "Int Spk", "ROP", | ||
305 | "Int Spk", "RON", | ||
306 | "Int Spk", "LOP", | ||
307 | "Int Spk", "LON", | ||
308 | "Mic Jack", "MICBIAS", | ||
309 | "IN1R", "Mic Jack"; | ||
310 | |||
311 | nvidia,i2s-controller = <&tegra_i2s1>; | ||
312 | nvidia,audio-codec = <&wm8903>; | ||
313 | |||
314 | nvidia,spkr-en-gpios = <&wm8903 2 0>; | ||
315 | nvidia,hp-det-gpios = <&gpio 185 0>; /* gpio PX1 */ | ||
316 | }; | ||
317 | 328 | ||
318 | serial@70006000 { | 329 | magnetometer@c { |
319 | status = "disable"; | 330 | compatible = "ak8975"; |
320 | }; | 331 | reg = <0xc>; |
321 | 332 | interrupt-parent = <&gpio>; | |
322 | serial@70006040 { | 333 | interrupts = <109 0x04>; /* gpio PN5 */ |
323 | status = "disable"; | 334 | }; |
324 | }; | 335 | }; |
325 | 336 | ||
326 | serial@70006200 { | 337 | emc { |
327 | status = "disable"; | 338 | emc-table@190000 { |
328 | }; | 339 | reg = <190000>; |
340 | compatible = "nvidia,tegra20-emc-table"; | ||
341 | clock-frequency = <190000>; | ||
342 | nvidia,emc-registers = <0x0000000c 0x00000026 | ||
343 | 0x00000009 0x00000003 0x00000004 0x00000004 | ||
344 | 0x00000002 0x0000000c 0x00000003 0x00000003 | ||
345 | 0x00000002 0x00000001 0x00000004 0x00000005 | ||
346 | 0x00000004 0x00000009 0x0000000d 0x0000059f | ||
347 | 0x00000000 0x00000003 0x00000003 0x00000003 | ||
348 | 0x00000003 0x00000001 0x0000000b 0x000000c8 | ||
349 | 0x00000003 0x00000007 0x00000004 0x0000000f | ||
350 | 0x00000002 0x00000000 0x00000000 0x00000002 | ||
351 | 0x00000000 0x00000000 0x00000083 0xa06204ae | ||
352 | 0x007dc010 0x00000000 0x00000000 0x00000000 | ||
353 | 0x00000000 0x00000000 0x00000000 0x00000000>; | ||
354 | }; | ||
329 | 355 | ||
330 | serial@70006300 { | 356 | emc-table@380000 { |
331 | clock-frequency = < 216000000 >; | 357 | reg = <380000>; |
358 | compatible = "nvidia,tegra20-emc-table"; | ||
359 | clock-frequency = <380000>; | ||
360 | nvidia,emc-registers = <0x00000017 0x0000004b | ||
361 | 0x00000012 0x00000006 0x00000004 0x00000005 | ||
362 | 0x00000003 0x0000000c 0x00000006 0x00000006 | ||
363 | 0x00000003 0x00000001 0x00000004 0x00000005 | ||
364 | 0x00000004 0x00000009 0x0000000d 0x00000b5f | ||
365 | 0x00000000 0x00000003 0x00000003 0x00000006 | ||
366 | 0x00000006 0x00000001 0x00000011 0x000000c8 | ||
367 | 0x00000003 0x0000000e 0x00000007 0x0000000f | ||
368 | 0x00000002 0x00000000 0x00000000 0x00000002 | ||
369 | 0x00000000 0x00000000 0x00000083 0xe044048b | ||
370 | 0x007d8010 0x00000000 0x00000000 0x00000000 | ||
371 | 0x00000000 0x00000000 0x00000000 0x00000000>; | ||
372 | }; | ||
332 | }; | 373 | }; |
333 | 374 | ||
334 | serial@70006400 { | 375 | usb@c5000000 { |
335 | status = "disable"; | 376 | status = "okay"; |
377 | nvidia,vbus-gpio = <&gpio 24 0>; /* PD0 */ | ||
378 | dr_mode = "otg"; | ||
336 | }; | 379 | }; |
337 | 380 | ||
338 | sdhci@c8000000 { | 381 | usb@c5004000 { |
339 | status = "disable"; | 382 | status = "okay"; |
383 | nvidia,phy-reset-gpio = <&gpio 169 0>; /* gpio PV1 */ | ||
340 | }; | 384 | }; |
341 | 385 | ||
342 | sdhci@c8000200 { | 386 | usb@c5008000 { |
343 | status = "disable"; | 387 | status = "okay"; |
344 | }; | 388 | }; |
345 | 389 | ||
346 | sdhci@c8000400 { | 390 | sdhci@c8000400 { |
391 | status = "okay"; | ||
347 | cd-gpios = <&gpio 69 0>; /* gpio PI5 */ | 392 | cd-gpios = <&gpio 69 0>; /* gpio PI5 */ |
348 | wp-gpios = <&gpio 57 0>; /* gpio PH1 */ | 393 | wp-gpios = <&gpio 57 0>; /* gpio PH1 */ |
349 | power-gpios = <&gpio 70 0>; /* gpio PI6 */ | 394 | power-gpios = <&gpio 70 0>; /* gpio PI6 */ |
395 | bus-width = <4>; | ||
350 | }; | 396 | }; |
351 | 397 | ||
352 | sdhci@c8000600 { | 398 | sdhci@c8000600 { |
399 | status = "okay"; | ||
353 | support-8bit; | 400 | support-8bit; |
354 | }; | 401 | bus-width = <8>; |
355 | |||
356 | usb@c5000000 { | ||
357 | nvidia,vbus-gpio = <&gpio 24 0>; /* PD0 */ | ||
358 | dr_mode = "otg"; | ||
359 | }; | 402 | }; |
360 | 403 | ||
361 | gpio-keys { | 404 | gpio-keys { |
@@ -378,41 +421,25 @@ | |||
378 | }; | 421 | }; |
379 | }; | 422 | }; |
380 | 423 | ||
381 | emc@7000f400 { | 424 | sound { |
382 | emc-table@190000 { | 425 | compatible = "nvidia,tegra-audio-wm8903-seaboard", |
383 | reg = < 190000 >; | 426 | "nvidia,tegra-audio-wm8903"; |
384 | compatible = "nvidia,tegra20-emc-table"; | 427 | nvidia,model = "NVIDIA Tegra Seaboard"; |
385 | clock-frequency = < 190000 >; | ||
386 | nvidia,emc-registers = < 0x0000000c 0x00000026 | ||
387 | 0x00000009 0x00000003 0x00000004 0x00000004 | ||
388 | 0x00000002 0x0000000c 0x00000003 0x00000003 | ||
389 | 0x00000002 0x00000001 0x00000004 0x00000005 | ||
390 | 0x00000004 0x00000009 0x0000000d 0x0000059f | ||
391 | 0x00000000 0x00000003 0x00000003 0x00000003 | ||
392 | 0x00000003 0x00000001 0x0000000b 0x000000c8 | ||
393 | 0x00000003 0x00000007 0x00000004 0x0000000f | ||
394 | 0x00000002 0x00000000 0x00000000 0x00000002 | ||
395 | 0x00000000 0x00000000 0x00000083 0xa06204ae | ||
396 | 0x007dc010 0x00000000 0x00000000 0x00000000 | ||
397 | 0x00000000 0x00000000 0x00000000 0x00000000 >; | ||
398 | }; | ||
399 | 428 | ||
400 | emc-table@380000 { | 429 | nvidia,audio-routing = |
401 | reg = < 380000 >; | 430 | "Headphone Jack", "HPOUTR", |
402 | compatible = "nvidia,tegra20-emc-table"; | 431 | "Headphone Jack", "HPOUTL", |
403 | clock-frequency = < 380000 >; | 432 | "Int Spk", "ROP", |
404 | nvidia,emc-registers = < 0x00000017 0x0000004b | 433 | "Int Spk", "RON", |
405 | 0x00000012 0x00000006 0x00000004 0x00000005 | 434 | "Int Spk", "LOP", |
406 | 0x00000003 0x0000000c 0x00000006 0x00000006 | 435 | "Int Spk", "LON", |
407 | 0x00000003 0x00000001 0x00000004 0x00000005 | 436 | "Mic Jack", "MICBIAS", |
408 | 0x00000004 0x00000009 0x0000000d 0x00000b5f | 437 | "IN1R", "Mic Jack"; |
409 | 0x00000000 0x00000003 0x00000003 0x00000006 | 438 | |
410 | 0x00000006 0x00000001 0x00000011 0x000000c8 | 439 | nvidia,i2s-controller = <&tegra_i2s1>; |
411 | 0x00000003 0x0000000e 0x00000007 0x0000000f | 440 | nvidia,audio-codec = <&wm8903>; |
412 | 0x00000002 0x00000000 0x00000000 0x00000002 | 441 | |
413 | 0x00000000 0x00000000 0x00000083 0xe044048b | 442 | nvidia,spkr-en-gpios = <&wm8903 2 0>; |
414 | 0x007d8010 0x00000000 0x00000000 0x00000000 | 443 | nvidia,hp-det-gpios = <&gpio 185 0>; /* gpio PX1 */ |
415 | 0x00000000 0x00000000 0x00000000 0x00000000 >; | ||
416 | }; | ||
417 | }; | 444 | }; |
418 | }; | 445 | }; |
diff --git a/arch/arm/boot/dts/tegra-trimslice.dts b/arch/arm/boot/dts/tegra-trimslice.dts index 98efd5b0d7f9..9de5636023f6 100644 --- a/arch/arm/boot/dts/tegra-trimslice.dts +++ b/arch/arm/boot/dts/tegra-trimslice.dts | |||
@@ -6,11 +6,11 @@ | |||
6 | model = "Compulab TrimSlice board"; | 6 | model = "Compulab TrimSlice board"; |
7 | compatible = "compulab,trimslice", "nvidia,tegra20"; | 7 | compatible = "compulab,trimslice", "nvidia,tegra20"; |
8 | 8 | ||
9 | memory@0 { | 9 | memory { |
10 | reg = < 0x00000000 0x40000000 >; | 10 | reg = <0x00000000 0x40000000>; |
11 | }; | 11 | }; |
12 | 12 | ||
13 | pinmux@70000000 { | 13 | pinmux { |
14 | pinctrl-names = "default"; | 14 | pinctrl-names = "default"; |
15 | pinctrl-0 = <&state_default>; | 15 | pinctrl-0 = <&state_default>; |
16 | 16 | ||
@@ -182,23 +182,23 @@ | |||
182 | nvidia,tristate = <1>; | 182 | nvidia,tristate = <1>; |
183 | }; | 183 | }; |
184 | conf_atb { | 184 | conf_atb { |
185 | nvidia,pins = "atb", "cdev1", "dap1", "gma", | 185 | nvidia,pins = "atb", "cdev1", "cdev2", "dap1", |
186 | "gmc", "gmd", "gpu", "gpu7", "gpv", | 186 | "gma", "gmc", "gmd", "gpu", "gpu7", |
187 | "sdio1", "slxa", "slxk", "uac"; | 187 | "gpv", "sdio1", "slxa", "slxk", "uac"; |
188 | nvidia,pull = <0>; | 188 | nvidia,pull = <0>; |
189 | nvidia,tristate = <0>; | 189 | nvidia,tristate = <0>; |
190 | }; | 190 | }; |
191 | conf_cdev2 { | ||
192 | nvidia,pins = "cdev2", "csus", "spia", "spib", | ||
193 | "spid", "spif"; | ||
194 | nvidia,pull = <1>; | ||
195 | nvidia,tristate = <1>; | ||
196 | }; | ||
197 | conf_ck32 { | 191 | conf_ck32 { |
198 | nvidia,pins = "ck32", "ddrc", "pmca", "pmcb", | 192 | nvidia,pins = "ck32", "ddrc", "pmca", "pmcb", |
199 | "pmcc", "pmcd", "pmce", "xm2c", "xm2d"; | 193 | "pmcc", "pmcd", "pmce", "xm2c", "xm2d"; |
200 | nvidia,pull = <0>; | 194 | nvidia,pull = <0>; |
201 | }; | 195 | }; |
196 | conf_csus { | ||
197 | nvidia,pins = "csus", "spia", "spib", | ||
198 | "spid", "spif"; | ||
199 | nvidia,pull = <1>; | ||
200 | nvidia,tristate = <1>; | ||
201 | }; | ||
202 | conf_ddc { | 202 | conf_ddc { |
203 | nvidia,pins = "ddc", "dtf", "rm", "sdc", "sdd"; | 203 | nvidia,pins = "ddc", "dtf", "rm", "sdc", "sdd"; |
204 | nvidia,pull = <2>; | 204 | nvidia,pull = <2>; |
@@ -240,68 +240,67 @@ | |||
240 | }; | 240 | }; |
241 | }; | 241 | }; |
242 | 242 | ||
243 | i2s@70002800 { | ||
244 | status = "okay"; | ||
245 | }; | ||
246 | |||
247 | serial@70006000 { | ||
248 | status = "okay"; | ||
249 | clock-frequency = <216000000>; | ||
250 | }; | ||
251 | |||
243 | i2c@7000c000 { | 252 | i2c@7000c000 { |
253 | status = "okay"; | ||
244 | clock-frequency = <400000>; | 254 | clock-frequency = <400000>; |
245 | }; | 255 | }; |
246 | 256 | ||
247 | i2c@7000c400 { | 257 | i2c@7000c400 { |
258 | status = "okay"; | ||
248 | clock-frequency = <400000>; | 259 | clock-frequency = <400000>; |
249 | }; | 260 | }; |
250 | 261 | ||
251 | i2c@7000c500 { | 262 | i2c@7000c500 { |
263 | status = "okay"; | ||
252 | clock-frequency = <400000>; | 264 | clock-frequency = <400000>; |
253 | }; | ||
254 | |||
255 | i2c@7000d000 { | ||
256 | status = "disable"; | ||
257 | }; | ||
258 | |||
259 | i2s@70002800 { | ||
260 | status = "disable"; | ||
261 | }; | ||
262 | |||
263 | i2s@70002a00 { | ||
264 | status = "disable"; | ||
265 | }; | ||
266 | |||
267 | das@70000c00 { | ||
268 | status = "disable"; | ||
269 | }; | ||
270 | 265 | ||
271 | serial@70006000 { | 266 | codec: codec@1a { |
272 | clock-frequency = < 216000000 >; | 267 | compatible = "ti,tlv320aic23"; |
273 | }; | 268 | reg = <0x1a>; |
269 | }; | ||
274 | 270 | ||
275 | serial@70006040 { | 271 | rtc@56 { |
276 | status = "disable"; | 272 | compatible = "emmicro,em3027"; |
273 | reg = <0x56>; | ||
274 | }; | ||
277 | }; | 275 | }; |
278 | 276 | ||
279 | serial@70006200 { | 277 | usb@c5000000 { |
280 | status = "disable"; | 278 | status = "okay"; |
281 | }; | 279 | }; |
282 | 280 | ||
283 | serial@70006300 { | 281 | usb@c5004000 { |
284 | status = "disable"; | 282 | nvidia,phy-reset-gpio = <&gpio 168 0>; /* gpio PV0 */ |
285 | }; | 283 | }; |
286 | 284 | ||
287 | serial@70006400 { | 285 | usb@c5008000 { |
288 | status = "disable"; | 286 | status = "okay"; |
289 | }; | 287 | }; |
290 | 288 | ||
291 | sdhci@c8000000 { | 289 | sdhci@c8000000 { |
292 | status = "disable"; | 290 | status = "okay"; |
291 | bus-width = <4>; | ||
293 | }; | 292 | }; |
294 | 293 | ||
295 | sdhci@c8000200 { | 294 | sdhci@c8000600 { |
296 | status = "disable"; | 295 | status = "okay"; |
297 | }; | 296 | cd-gpios = <&gpio 121 0>; /* gpio PP1 */ |
298 | 297 | wp-gpios = <&gpio 122 0>; /* gpio PP2 */ | |
299 | sdhci@c8000400 { | 298 | bus-width = <4>; |
300 | status = "disable"; | ||
301 | }; | 299 | }; |
302 | 300 | ||
303 | sdhci@c8000600 { | 301 | sound { |
304 | cd-gpios = <&gpio 121 0>; | 302 | compatible = "nvidia,tegra-audio-trimslice"; |
305 | wp-gpios = <&gpio 122 0>; | 303 | nvidia,i2s-controller = <&tegra_i2s1>; |
304 | nvidia,audio-codec = <&codec>; | ||
306 | }; | 305 | }; |
307 | }; | 306 | }; |
diff --git a/arch/arm/boot/dts/tegra-ventana.dts b/arch/arm/boot/dts/tegra-ventana.dts index 71eb2e50a668..445343b0fbdd 100644 --- a/arch/arm/boot/dts/tegra-ventana.dts +++ b/arch/arm/boot/dts/tegra-ventana.dts | |||
@@ -7,10 +7,10 @@ | |||
7 | compatible = "nvidia,ventana", "nvidia,tegra20"; | 7 | compatible = "nvidia,ventana", "nvidia,tegra20"; |
8 | 8 | ||
9 | memory { | 9 | memory { |
10 | reg = < 0x00000000 0x40000000 >; | 10 | reg = <0x00000000 0x40000000>; |
11 | }; | 11 | }; |
12 | 12 | ||
13 | pinmux@70000000 { | 13 | pinmux { |
14 | pinctrl-names = "default"; | 14 | pinctrl-names = "default"; |
15 | pinctrl-0 = <&state_default>; | 15 | pinctrl-0 = <&state_default>; |
16 | 16 | ||
@@ -240,38 +240,82 @@ | |||
240 | }; | 240 | }; |
241 | }; | 241 | }; |
242 | 242 | ||
243 | i2s@70002800 { | ||
244 | status = "okay"; | ||
245 | }; | ||
246 | |||
247 | serial@70006300 { | ||
248 | status = "okay"; | ||
249 | clock-frequency = <216000000>; | ||
250 | }; | ||
251 | |||
243 | i2c@7000c000 { | 252 | i2c@7000c000 { |
253 | status = "okay"; | ||
244 | clock-frequency = <400000>; | 254 | clock-frequency = <400000>; |
245 | 255 | ||
246 | wm8903: wm8903@1a { | 256 | wm8903: wm8903@1a { |
247 | compatible = "wlf,wm8903"; | 257 | compatible = "wlf,wm8903"; |
248 | reg = <0x1a>; | 258 | reg = <0x1a>; |
249 | interrupt-parent = <&gpio>; | 259 | interrupt-parent = <&gpio>; |
250 | interrupts = < 187 0x04 >; | 260 | interrupts = <187 0x04>; |
251 | 261 | ||
252 | gpio-controller; | 262 | gpio-controller; |
253 | #gpio-cells = <2>; | 263 | #gpio-cells = <2>; |
254 | 264 | ||
255 | micdet-cfg = <0>; | 265 | micdet-cfg = <0>; |
256 | micdet-delay = <100>; | 266 | micdet-delay = <100>; |
257 | gpio-cfg = < 0xffffffff 0xffffffff 0 0xffffffff 0xffffffff >; | 267 | gpio-cfg = <0xffffffff 0xffffffff 0 0xffffffff 0xffffffff>; |
268 | }; | ||
269 | |||
270 | /* ALS and proximity sensor */ | ||
271 | isl29018@44 { | ||
272 | compatible = "isil,isl29018"; | ||
273 | reg = <0x44>; | ||
274 | interrupt-parent = <&gpio>; | ||
275 | interrupts = <202 0x04>; /*gpio PZ2 */ | ||
258 | }; | 276 | }; |
259 | }; | 277 | }; |
260 | 278 | ||
261 | i2c@7000c400 { | 279 | i2c@7000c400 { |
280 | status = "okay"; | ||
262 | clock-frequency = <400000>; | 281 | clock-frequency = <400000>; |
263 | }; | 282 | }; |
264 | 283 | ||
265 | i2c@7000c500 { | 284 | i2c@7000c500 { |
285 | status = "okay"; | ||
266 | clock-frequency = <400000>; | 286 | clock-frequency = <400000>; |
267 | }; | 287 | }; |
268 | 288 | ||
269 | i2c@7000d000 { | 289 | i2c@7000d000 { |
290 | status = "okay"; | ||
270 | clock-frequency = <400000>; | 291 | clock-frequency = <400000>; |
271 | }; | 292 | }; |
272 | 293 | ||
273 | i2s@70002a00 { | 294 | usb@c5000000 { |
274 | status = "disable"; | 295 | status = "okay"; |
296 | }; | ||
297 | |||
298 | usb@c5004000 { | ||
299 | status = "okay"; | ||
300 | nvidia,phy-reset-gpio = <&gpio 169 0>; /* gpio PV1 */ | ||
301 | }; | ||
302 | |||
303 | usb@c5008000 { | ||
304 | status = "okay"; | ||
305 | }; | ||
306 | |||
307 | sdhci@c8000400 { | ||
308 | status = "okay"; | ||
309 | cd-gpios = <&gpio 69 0>; /* gpio PI5 */ | ||
310 | wp-gpios = <&gpio 57 0>; /* gpio PH1 */ | ||
311 | power-gpios = <&gpio 70 0>; /* gpio PI6 */ | ||
312 | bus-width = <4>; | ||
313 | }; | ||
314 | |||
315 | sdhci@c8000600 { | ||
316 | status = "okay"; | ||
317 | support-8bit; | ||
318 | bus-width = <8>; | ||
275 | }; | 319 | }; |
276 | 320 | ||
277 | sound { | 321 | sound { |
@@ -294,45 +338,7 @@ | |||
294 | 338 | ||
295 | nvidia,spkr-en-gpios = <&wm8903 2 0>; | 339 | nvidia,spkr-en-gpios = <&wm8903 2 0>; |
296 | nvidia,hp-det-gpios = <&gpio 178 0>; /* gpio PW2 */ | 340 | nvidia,hp-det-gpios = <&gpio 178 0>; /* gpio PW2 */ |
297 | nvidia,int-mic-en-gpios = <&gpio 184 0>; /*gpio PX0 */ | 341 | nvidia,int-mic-en-gpios = <&gpio 184 0>; /* gpio PX0 */ |
298 | nvidia,ext-mic-en-gpios = <&gpio 185 0>; /* gpio PX1 */ | 342 | nvidia,ext-mic-en-gpios = <&gpio 185 0>; /* gpio PX1 */ |
299 | }; | 343 | }; |
300 | |||
301 | serial@70006000 { | ||
302 | status = "disable"; | ||
303 | }; | ||
304 | |||
305 | serial@70006040 { | ||
306 | status = "disable"; | ||
307 | }; | ||
308 | |||
309 | serial@70006200 { | ||
310 | status = "disable"; | ||
311 | }; | ||
312 | |||
313 | serial@70006300 { | ||
314 | clock-frequency = < 216000000 >; | ||
315 | }; | ||
316 | |||
317 | serial@70006400 { | ||
318 | status = "disable"; | ||
319 | }; | ||
320 | |||
321 | sdhci@c8000000 { | ||
322 | status = "disable"; | ||
323 | }; | ||
324 | |||
325 | sdhci@c8000200 { | ||
326 | status = "disable"; | ||
327 | }; | ||
328 | |||
329 | sdhci@c8000400 { | ||
330 | cd-gpios = <&gpio 69 0>; /* gpio PI5 */ | ||
331 | wp-gpios = <&gpio 57 0>; /* gpio PH1 */ | ||
332 | power-gpios = <&gpio 70 0>; /* gpio PI6 */ | ||
333 | }; | ||
334 | |||
335 | sdhci@c8000600 { | ||
336 | support-8bit; | ||
337 | }; | ||
338 | }; | 344 | }; |
diff --git a/arch/arm/boot/dts/tegra20.dtsi b/arch/arm/boot/dts/tegra20.dtsi index 108e894a8926..c417d67e9027 100644 --- a/arch/arm/boot/dts/tegra20.dtsi +++ b/arch/arm/boot/dts/tegra20.dtsi | |||
@@ -4,207 +4,242 @@ | |||
4 | compatible = "nvidia,tegra20"; | 4 | compatible = "nvidia,tegra20"; |
5 | interrupt-parent = <&intc>; | 5 | interrupt-parent = <&intc>; |
6 | 6 | ||
7 | pmc@7000f400 { | 7 | intc: interrupt-controller { |
8 | compatible = "nvidia,tegra20-pmc"; | ||
9 | reg = <0x7000e400 0x400>; | ||
10 | }; | ||
11 | |||
12 | intc: interrupt-controller@50041000 { | ||
13 | compatible = "arm,cortex-a9-gic"; | 8 | compatible = "arm,cortex-a9-gic"; |
9 | reg = <0x50041000 0x1000 | ||
10 | 0x50040100 0x0100>; | ||
14 | interrupt-controller; | 11 | interrupt-controller; |
15 | #interrupt-cells = <3>; | 12 | #interrupt-cells = <3>; |
16 | reg = < 0x50041000 0x1000 >, | ||
17 | < 0x50040100 0x0100 >; | ||
18 | }; | 13 | }; |
19 | 14 | ||
20 | pmu { | 15 | apbdma: dma { |
21 | compatible = "arm,cortex-a9-pmu"; | ||
22 | interrupts = <0 56 0x04 | ||
23 | 0 57 0x04>; | ||
24 | }; | ||
25 | |||
26 | apbdma: dma@6000a000 { | ||
27 | compatible = "nvidia,tegra20-apbdma"; | 16 | compatible = "nvidia,tegra20-apbdma"; |
28 | reg = <0x6000a000 0x1200>; | 17 | reg = <0x6000a000 0x1200>; |
29 | interrupts = < 0 104 0x04 | 18 | interrupts = <0 104 0x04 |
30 | 0 105 0x04 | 19 | 0 105 0x04 |
31 | 0 106 0x04 | 20 | 0 106 0x04 |
32 | 0 107 0x04 | 21 | 0 107 0x04 |
33 | 0 108 0x04 | 22 | 0 108 0x04 |
34 | 0 109 0x04 | 23 | 0 109 0x04 |
35 | 0 110 0x04 | 24 | 0 110 0x04 |
36 | 0 111 0x04 | 25 | 0 111 0x04 |
37 | 0 112 0x04 | 26 | 0 112 0x04 |
38 | 0 113 0x04 | 27 | 0 113 0x04 |
39 | 0 114 0x04 | 28 | 0 114 0x04 |
40 | 0 115 0x04 | 29 | 0 115 0x04 |
41 | 0 116 0x04 | 30 | 0 116 0x04 |
42 | 0 117 0x04 | 31 | 0 117 0x04 |
43 | 0 118 0x04 | 32 | 0 118 0x04 |
44 | 0 119 0x04 >; | 33 | 0 119 0x04>; |
45 | }; | 34 | }; |
46 | 35 | ||
47 | i2c@7000c000 { | 36 | ahb { |
48 | #address-cells = <1>; | 37 | compatible = "nvidia,tegra20-ahb"; |
49 | #size-cells = <0>; | 38 | reg = <0x6000c004 0x10c>; /* AHB Arbitration + Gizmo Controller */ |
50 | compatible = "nvidia,tegra20-i2c"; | 39 | }; |
51 | reg = <0x7000C000 0x100>; | 40 | |
52 | interrupts = < 0 38 0x04 >; | 41 | gpio: gpio { |
53 | }; | 42 | compatible = "nvidia,tegra20-gpio"; |
54 | 43 | reg = <0x6000d000 0x1000>; | |
55 | i2c@7000c400 { | 44 | interrupts = <0 32 0x04 |
56 | #address-cells = <1>; | 45 | 0 33 0x04 |
57 | #size-cells = <0>; | 46 | 0 34 0x04 |
58 | compatible = "nvidia,tegra20-i2c"; | 47 | 0 35 0x04 |
59 | reg = <0x7000C400 0x100>; | 48 | 0 55 0x04 |
60 | interrupts = < 0 84 0x04 >; | 49 | 0 87 0x04 |
50 | 0 89 0x04>; | ||
51 | #gpio-cells = <2>; | ||
52 | gpio-controller; | ||
53 | #interrupt-cells = <2>; | ||
54 | interrupt-controller; | ||
61 | }; | 55 | }; |
62 | 56 | ||
63 | i2c@7000c500 { | 57 | pinmux: pinmux { |
64 | #address-cells = <1>; | 58 | compatible = "nvidia,tegra20-pinmux"; |
65 | #size-cells = <0>; | 59 | reg = <0x70000014 0x10 /* Tri-state registers */ |
66 | compatible = "nvidia,tegra20-i2c"; | 60 | 0x70000080 0x20 /* Mux registers */ |
67 | reg = <0x7000C500 0x100>; | 61 | 0x700000a0 0x14 /* Pull-up/down registers */ |
68 | interrupts = < 0 92 0x04 >; | 62 | 0x70000868 0xa8>; /* Pad control registers */ |
69 | }; | 63 | }; |
70 | 64 | ||
71 | i2c@7000d000 { | 65 | das { |
72 | #address-cells = <1>; | 66 | compatible = "nvidia,tegra20-das"; |
73 | #size-cells = <0>; | 67 | reg = <0x70000c00 0x80>; |
74 | compatible = "nvidia,tegra20-i2c-dvc"; | ||
75 | reg = <0x7000D000 0x200>; | ||
76 | interrupts = < 0 53 0x04 >; | ||
77 | }; | 68 | }; |
78 | 69 | ||
79 | tegra_i2s1: i2s@70002800 { | 70 | tegra_i2s1: i2s@70002800 { |
80 | compatible = "nvidia,tegra20-i2s"; | 71 | compatible = "nvidia,tegra20-i2s"; |
81 | reg = <0x70002800 0x200>; | 72 | reg = <0x70002800 0x200>; |
82 | interrupts = < 0 13 0x04 >; | 73 | interrupts = <0 13 0x04>; |
83 | nvidia,dma-request-selector = < &apbdma 2 >; | 74 | nvidia,dma-request-selector = <&apbdma 2>; |
75 | status = "disable"; | ||
84 | }; | 76 | }; |
85 | 77 | ||
86 | tegra_i2s2: i2s@70002a00 { | 78 | tegra_i2s2: i2s@70002a00 { |
87 | compatible = "nvidia,tegra20-i2s"; | 79 | compatible = "nvidia,tegra20-i2s"; |
88 | reg = <0x70002a00 0x200>; | 80 | reg = <0x70002a00 0x200>; |
89 | interrupts = < 0 3 0x04 >; | 81 | interrupts = <0 3 0x04>; |
90 | nvidia,dma-request-selector = < &apbdma 1 >; | 82 | nvidia,dma-request-selector = <&apbdma 1>; |
91 | }; | 83 | status = "disable"; |
92 | |||
93 | das@70000c00 { | ||
94 | compatible = "nvidia,tegra20-das"; | ||
95 | reg = <0x70000c00 0x80>; | ||
96 | }; | ||
97 | |||
98 | gpio: gpio@6000d000 { | ||
99 | compatible = "nvidia,tegra20-gpio"; | ||
100 | reg = < 0x6000d000 0x1000 >; | ||
101 | interrupts = < 0 32 0x04 | ||
102 | 0 33 0x04 | ||
103 | 0 34 0x04 | ||
104 | 0 35 0x04 | ||
105 | 0 55 0x04 | ||
106 | 0 87 0x04 | ||
107 | 0 89 0x04 >; | ||
108 | #gpio-cells = <2>; | ||
109 | gpio-controller; | ||
110 | #interrupt-cells = <2>; | ||
111 | interrupt-controller; | ||
112 | }; | ||
113 | |||
114 | pinmux: pinmux@70000000 { | ||
115 | compatible = "nvidia,tegra20-pinmux"; | ||
116 | reg = < 0x70000014 0x10 /* Tri-state registers */ | ||
117 | 0x70000080 0x20 /* Mux registers */ | ||
118 | 0x700000a0 0x14 /* Pull-up/down registers */ | ||
119 | 0x70000868 0xa8 >; /* Pad control registers */ | ||
120 | }; | 84 | }; |
121 | 85 | ||
122 | serial@70006000 { | 86 | serial@70006000 { |
123 | compatible = "nvidia,tegra20-uart"; | 87 | compatible = "nvidia,tegra20-uart"; |
124 | reg = <0x70006000 0x40>; | 88 | reg = <0x70006000 0x40>; |
125 | reg-shift = <2>; | 89 | reg-shift = <2>; |
126 | interrupts = < 0 36 0x04 >; | 90 | interrupts = <0 36 0x04>; |
91 | status = "disable"; | ||
127 | }; | 92 | }; |
128 | 93 | ||
129 | serial@70006040 { | 94 | serial@70006040 { |
130 | compatible = "nvidia,tegra20-uart"; | 95 | compatible = "nvidia,tegra20-uart"; |
131 | reg = <0x70006040 0x40>; | 96 | reg = <0x70006040 0x40>; |
132 | reg-shift = <2>; | 97 | reg-shift = <2>; |
133 | interrupts = < 0 37 0x04 >; | 98 | interrupts = <0 37 0x04>; |
99 | status = "disable"; | ||
134 | }; | 100 | }; |
135 | 101 | ||
136 | serial@70006200 { | 102 | serial@70006200 { |
137 | compatible = "nvidia,tegra20-uart"; | 103 | compatible = "nvidia,tegra20-uart"; |
138 | reg = <0x70006200 0x100>; | 104 | reg = <0x70006200 0x100>; |
139 | reg-shift = <2>; | 105 | reg-shift = <2>; |
140 | interrupts = < 0 46 0x04 >; | 106 | interrupts = <0 46 0x04>; |
107 | status = "disable"; | ||
141 | }; | 108 | }; |
142 | 109 | ||
143 | serial@70006300 { | 110 | serial@70006300 { |
144 | compatible = "nvidia,tegra20-uart"; | 111 | compatible = "nvidia,tegra20-uart"; |
145 | reg = <0x70006300 0x100>; | 112 | reg = <0x70006300 0x100>; |
146 | reg-shift = <2>; | 113 | reg-shift = <2>; |
147 | interrupts = < 0 90 0x04 >; | 114 | interrupts = <0 90 0x04>; |
115 | status = "disable"; | ||
148 | }; | 116 | }; |
149 | 117 | ||
150 | serial@70006400 { | 118 | serial@70006400 { |
151 | compatible = "nvidia,tegra20-uart"; | 119 | compatible = "nvidia,tegra20-uart"; |
152 | reg = <0x70006400 0x100>; | 120 | reg = <0x70006400 0x100>; |
153 | reg-shift = <2>; | 121 | reg-shift = <2>; |
154 | interrupts = < 0 91 0x04 >; | 122 | interrupts = <0 91 0x04>; |
123 | status = "disable"; | ||
155 | }; | 124 | }; |
156 | 125 | ||
157 | emc@7000f400 { | 126 | i2c@7000c000 { |
127 | compatible = "nvidia,tegra20-i2c"; | ||
128 | reg = <0x7000c000 0x100>; | ||
129 | interrupts = <0 38 0x04>; | ||
158 | #address-cells = <1>; | 130 | #address-cells = <1>; |
159 | #size-cells = <0>; | 131 | #size-cells = <0>; |
160 | compatible = "nvidia,tegra20-emc"; | 132 | status = "disable"; |
161 | reg = <0x7000f400 0x200>; | ||
162 | }; | 133 | }; |
163 | 134 | ||
164 | sdhci@c8000000 { | 135 | i2c@7000c400 { |
165 | compatible = "nvidia,tegra20-sdhci"; | 136 | compatible = "nvidia,tegra20-i2c"; |
166 | reg = <0xc8000000 0x200>; | 137 | reg = <0x7000c400 0x100>; |
167 | interrupts = < 0 14 0x04 >; | 138 | interrupts = <0 84 0x04>; |
139 | #address-cells = <1>; | ||
140 | #size-cells = <0>; | ||
141 | status = "disable"; | ||
168 | }; | 142 | }; |
169 | 143 | ||
170 | sdhci@c8000200 { | 144 | i2c@7000c500 { |
171 | compatible = "nvidia,tegra20-sdhci"; | 145 | compatible = "nvidia,tegra20-i2c"; |
172 | reg = <0xc8000200 0x200>; | 146 | reg = <0x7000c500 0x100>; |
173 | interrupts = < 0 15 0x04 >; | 147 | interrupts = <0 92 0x04>; |
148 | #address-cells = <1>; | ||
149 | #size-cells = <0>; | ||
150 | status = "disable"; | ||
174 | }; | 151 | }; |
175 | 152 | ||
176 | sdhci@c8000400 { | 153 | i2c@7000d000 { |
177 | compatible = "nvidia,tegra20-sdhci"; | 154 | compatible = "nvidia,tegra20-i2c-dvc"; |
178 | reg = <0xc8000400 0x200>; | 155 | reg = <0x7000d000 0x200>; |
179 | interrupts = < 0 19 0x04 >; | 156 | interrupts = <0 53 0x04>; |
157 | #address-cells = <1>; | ||
158 | #size-cells = <0>; | ||
159 | status = "disable"; | ||
180 | }; | 160 | }; |
181 | 161 | ||
182 | sdhci@c8000600 { | 162 | pmc { |
183 | compatible = "nvidia,tegra20-sdhci"; | 163 | compatible = "nvidia,tegra20-pmc"; |
184 | reg = <0xc8000600 0x200>; | 164 | reg = <0x7000e400 0x400>; |
185 | interrupts = < 0 31 0x04 >; | 165 | }; |
166 | |||
167 | mc { | ||
168 | compatible = "nvidia,tegra20-mc"; | ||
169 | reg = <0x7000f000 0x024 | ||
170 | 0x7000f03c 0x3c4>; | ||
171 | interrupts = <0 77 0x04>; | ||
172 | }; | ||
173 | |||
174 | gart { | ||
175 | compatible = "nvidia,tegra20-gart"; | ||
176 | reg = <0x7000f024 0x00000018 /* controller registers */ | ||
177 | 0x58000000 0x02000000>; /* GART aperture */ | ||
178 | }; | ||
179 | |||
180 | emc { | ||
181 | compatible = "nvidia,tegra20-emc"; | ||
182 | reg = <0x7000f400 0x200>; | ||
183 | #address-cells = <1>; | ||
184 | #size-cells = <0>; | ||
186 | }; | 185 | }; |
187 | 186 | ||
188 | usb@c5000000 { | 187 | usb@c5000000 { |
189 | compatible = "nvidia,tegra20-ehci", "usb-ehci"; | 188 | compatible = "nvidia,tegra20-ehci", "usb-ehci"; |
190 | reg = <0xc5000000 0x4000>; | 189 | reg = <0xc5000000 0x4000>; |
191 | interrupts = < 0 20 0x04 >; | 190 | interrupts = <0 20 0x04>; |
192 | phy_type = "utmi"; | 191 | phy_type = "utmi"; |
193 | nvidia,has-legacy-mode; | 192 | nvidia,has-legacy-mode; |
193 | status = "disable"; | ||
194 | }; | 194 | }; |
195 | 195 | ||
196 | usb@c5004000 { | 196 | usb@c5004000 { |
197 | compatible = "nvidia,tegra20-ehci", "usb-ehci"; | 197 | compatible = "nvidia,tegra20-ehci", "usb-ehci"; |
198 | reg = <0xc5004000 0x4000>; | 198 | reg = <0xc5004000 0x4000>; |
199 | interrupts = < 0 21 0x04 >; | 199 | interrupts = <0 21 0x04>; |
200 | phy_type = "ulpi"; | 200 | phy_type = "ulpi"; |
201 | status = "disable"; | ||
201 | }; | 202 | }; |
202 | 203 | ||
203 | usb@c5008000 { | 204 | usb@c5008000 { |
204 | compatible = "nvidia,tegra20-ehci", "usb-ehci"; | 205 | compatible = "nvidia,tegra20-ehci", "usb-ehci"; |
205 | reg = <0xc5008000 0x4000>; | 206 | reg = <0xc5008000 0x4000>; |
206 | interrupts = < 0 97 0x04 >; | 207 | interrupts = <0 97 0x04>; |
207 | phy_type = "utmi"; | 208 | phy_type = "utmi"; |
209 | status = "disable"; | ||
210 | }; | ||
211 | |||
212 | sdhci@c8000000 { | ||
213 | compatible = "nvidia,tegra20-sdhci"; | ||
214 | reg = <0xc8000000 0x200>; | ||
215 | interrupts = <0 14 0x04>; | ||
216 | status = "disable"; | ||
208 | }; | 217 | }; |
209 | }; | ||
210 | 218 | ||
219 | sdhci@c8000200 { | ||
220 | compatible = "nvidia,tegra20-sdhci"; | ||
221 | reg = <0xc8000200 0x200>; | ||
222 | interrupts = <0 15 0x04>; | ||
223 | status = "disable"; | ||
224 | }; | ||
225 | |||
226 | sdhci@c8000400 { | ||
227 | compatible = "nvidia,tegra20-sdhci"; | ||
228 | reg = <0xc8000400 0x200>; | ||
229 | interrupts = <0 19 0x04>; | ||
230 | status = "disable"; | ||
231 | }; | ||
232 | |||
233 | sdhci@c8000600 { | ||
234 | compatible = "nvidia,tegra20-sdhci"; | ||
235 | reg = <0xc8000600 0x200>; | ||
236 | interrupts = <0 31 0x04>; | ||
237 | status = "disable"; | ||
238 | }; | ||
239 | |||
240 | pmu { | ||
241 | compatible = "arm,cortex-a9-pmu"; | ||
242 | interrupts = <0 56 0x04 | ||
243 | 0 57 0x04>; | ||
244 | }; | ||
245 | }; | ||
diff --git a/arch/arm/boot/dts/tegra30.dtsi b/arch/arm/boot/dts/tegra30.dtsi index 62a7b39f1c9a..2dcc09e784b5 100644 --- a/arch/arm/boot/dts/tegra30.dtsi +++ b/arch/arm/boot/dts/tegra30.dtsi | |||
@@ -4,183 +4,268 @@ | |||
4 | compatible = "nvidia,tegra30"; | 4 | compatible = "nvidia,tegra30"; |
5 | interrupt-parent = <&intc>; | 5 | interrupt-parent = <&intc>; |
6 | 6 | ||
7 | pmc@7000f400 { | 7 | intc: interrupt-controller { |
8 | compatible = "nvidia,tegra20-pmc", "nvidia,tegra30-pmc"; | ||
9 | reg = <0x7000e400 0x400>; | ||
10 | }; | ||
11 | |||
12 | intc: interrupt-controller@50041000 { | ||
13 | compatible = "arm,cortex-a9-gic"; | 8 | compatible = "arm,cortex-a9-gic"; |
9 | reg = <0x50041000 0x1000 | ||
10 | 0x50040100 0x0100>; | ||
14 | interrupt-controller; | 11 | interrupt-controller; |
15 | #interrupt-cells = <3>; | 12 | #interrupt-cells = <3>; |
16 | reg = < 0x50041000 0x1000 >, | ||
17 | < 0x50040100 0x0100 >; | ||
18 | }; | 13 | }; |
19 | 14 | ||
20 | pmu { | 15 | apbdma: dma { |
21 | compatible = "arm,cortex-a9-pmu"; | ||
22 | interrupts = <0 144 0x04 | ||
23 | 0 145 0x04 | ||
24 | 0 146 0x04 | ||
25 | 0 147 0x04>; | ||
26 | }; | ||
27 | |||
28 | apbdma: dma@6000a000 { | ||
29 | compatible = "nvidia,tegra30-apbdma", "nvidia,tegra20-apbdma"; | 16 | compatible = "nvidia,tegra30-apbdma", "nvidia,tegra20-apbdma"; |
30 | reg = <0x6000a000 0x1400>; | 17 | reg = <0x6000a000 0x1400>; |
31 | interrupts = < 0 104 0x04 | 18 | interrupts = <0 104 0x04 |
32 | 0 105 0x04 | 19 | 0 105 0x04 |
33 | 0 106 0x04 | 20 | 0 106 0x04 |
34 | 0 107 0x04 | 21 | 0 107 0x04 |
35 | 0 108 0x04 | 22 | 0 108 0x04 |
36 | 0 109 0x04 | 23 | 0 109 0x04 |
37 | 0 110 0x04 | 24 | 0 110 0x04 |
38 | 0 111 0x04 | 25 | 0 111 0x04 |
39 | 0 112 0x04 | 26 | 0 112 0x04 |
40 | 0 113 0x04 | 27 | 0 113 0x04 |
41 | 0 114 0x04 | 28 | 0 114 0x04 |
42 | 0 115 0x04 | 29 | 0 115 0x04 |
43 | 0 116 0x04 | 30 | 0 116 0x04 |
44 | 0 117 0x04 | 31 | 0 117 0x04 |
45 | 0 118 0x04 | 32 | 0 118 0x04 |
46 | 0 119 0x04 | 33 | 0 119 0x04 |
47 | 0 128 0x04 | 34 | 0 128 0x04 |
48 | 0 129 0x04 | 35 | 0 129 0x04 |
49 | 0 130 0x04 | 36 | 0 130 0x04 |
50 | 0 131 0x04 | 37 | 0 131 0x04 |
51 | 0 132 0x04 | 38 | 0 132 0x04 |
52 | 0 133 0x04 | 39 | 0 133 0x04 |
53 | 0 134 0x04 | 40 | 0 134 0x04 |
54 | 0 135 0x04 | 41 | 0 135 0x04 |
55 | 0 136 0x04 | 42 | 0 136 0x04 |
56 | 0 137 0x04 | 43 | 0 137 0x04 |
57 | 0 138 0x04 | 44 | 0 138 0x04 |
58 | 0 139 0x04 | 45 | 0 139 0x04 |
59 | 0 140 0x04 | 46 | 0 140 0x04 |
60 | 0 141 0x04 | 47 | 0 141 0x04 |
61 | 0 142 0x04 | 48 | 0 142 0x04 |
62 | 0 143 0x04 >; | 49 | 0 143 0x04>; |
63 | }; | ||
64 | |||
65 | i2c@7000c000 { | ||
66 | #address-cells = <1>; | ||
67 | #size-cells = <0>; | ||
68 | compatible = "nvidia,tegra30-i2c", "nvidia,tegra20-i2c"; | ||
69 | reg = <0x7000C000 0x100>; | ||
70 | interrupts = < 0 38 0x04 >; | ||
71 | }; | ||
72 | |||
73 | i2c@7000c400 { | ||
74 | #address-cells = <1>; | ||
75 | #size-cells = <0>; | ||
76 | compatible = "nvidia,tegra30-i2c", "nvidia,tegra20-i2c"; | ||
77 | reg = <0x7000C400 0x100>; | ||
78 | interrupts = < 0 84 0x04 >; | ||
79 | }; | ||
80 | |||
81 | i2c@7000c500 { | ||
82 | #address-cells = <1>; | ||
83 | #size-cells = <0>; | ||
84 | compatible = "nvidia,tegra30-i2c", "nvidia,tegra20-i2c"; | ||
85 | reg = <0x7000C500 0x100>; | ||
86 | interrupts = < 0 92 0x04 >; | ||
87 | }; | 50 | }; |
88 | 51 | ||
89 | i2c@7000c700 { | 52 | ahb: ahb { |
90 | #address-cells = <1>; | 53 | compatible = "nvidia,tegra30-ahb"; |
91 | #size-cells = <0>; | 54 | reg = <0x6000c004 0x14c>; /* AHB Arbitration + Gizmo Controller */ |
92 | compatible = "nvidia,tegra30-i2c", "nvidia,tegra20-i2c"; | ||
93 | reg = <0x7000c700 0x100>; | ||
94 | interrupts = < 0 120 0x04 >; | ||
95 | }; | 55 | }; |
96 | 56 | ||
97 | i2c@7000d000 { | 57 | gpio: gpio { |
98 | #address-cells = <1>; | ||
99 | #size-cells = <0>; | ||
100 | compatible = "nvidia,tegra30-i2c", "nvidia,tegra20-i2c"; | ||
101 | reg = <0x7000D000 0x100>; | ||
102 | interrupts = < 0 53 0x04 >; | ||
103 | }; | ||
104 | |||
105 | gpio: gpio@6000d000 { | ||
106 | compatible = "nvidia,tegra30-gpio", "nvidia,tegra20-gpio"; | 58 | compatible = "nvidia,tegra30-gpio", "nvidia,tegra20-gpio"; |
107 | reg = < 0x6000d000 0x1000 >; | 59 | reg = <0x6000d000 0x1000>; |
108 | interrupts = < 0 32 0x04 | 60 | interrupts = <0 32 0x04 |
109 | 0 33 0x04 | 61 | 0 33 0x04 |
110 | 0 34 0x04 | 62 | 0 34 0x04 |
111 | 0 35 0x04 | 63 | 0 35 0x04 |
112 | 0 55 0x04 | 64 | 0 55 0x04 |
113 | 0 87 0x04 | 65 | 0 87 0x04 |
114 | 0 89 0x04 | 66 | 0 89 0x04 |
115 | 0 125 0x04 >; | 67 | 0 125 0x04>; |
116 | #gpio-cells = <2>; | 68 | #gpio-cells = <2>; |
117 | gpio-controller; | 69 | gpio-controller; |
118 | #interrupt-cells = <2>; | 70 | #interrupt-cells = <2>; |
119 | interrupt-controller; | 71 | interrupt-controller; |
120 | }; | 72 | }; |
121 | 73 | ||
74 | pinmux: pinmux { | ||
75 | compatible = "nvidia,tegra30-pinmux"; | ||
76 | reg = <0x70000868 0xd0 /* Pad control registers */ | ||
77 | 0x70003000 0x3e0>; /* Mux registers */ | ||
78 | }; | ||
79 | |||
122 | serial@70006000 { | 80 | serial@70006000 { |
123 | compatible = "nvidia,tegra30-uart", "nvidia,tegra20-uart"; | 81 | compatible = "nvidia,tegra30-uart", "nvidia,tegra20-uart"; |
124 | reg = <0x70006000 0x40>; | 82 | reg = <0x70006000 0x40>; |
125 | reg-shift = <2>; | 83 | reg-shift = <2>; |
126 | interrupts = < 0 36 0x04 >; | 84 | interrupts = <0 36 0x04>; |
85 | status = "disable"; | ||
127 | }; | 86 | }; |
128 | 87 | ||
129 | serial@70006040 { | 88 | serial@70006040 { |
130 | compatible = "nvidia,tegra30-uart", "nvidia,tegra20-uart"; | 89 | compatible = "nvidia,tegra30-uart", "nvidia,tegra20-uart"; |
131 | reg = <0x70006040 0x40>; | 90 | reg = <0x70006040 0x40>; |
132 | reg-shift = <2>; | 91 | reg-shift = <2>; |
133 | interrupts = < 0 37 0x04 >; | 92 | interrupts = <0 37 0x04>; |
93 | status = "disable"; | ||
134 | }; | 94 | }; |
135 | 95 | ||
136 | serial@70006200 { | 96 | serial@70006200 { |
137 | compatible = "nvidia,tegra30-uart", "nvidia,tegra20-uart"; | 97 | compatible = "nvidia,tegra30-uart", "nvidia,tegra20-uart"; |
138 | reg = <0x70006200 0x100>; | 98 | reg = <0x70006200 0x100>; |
139 | reg-shift = <2>; | 99 | reg-shift = <2>; |
140 | interrupts = < 0 46 0x04 >; | 100 | interrupts = <0 46 0x04>; |
101 | status = "disable"; | ||
141 | }; | 102 | }; |
142 | 103 | ||
143 | serial@70006300 { | 104 | serial@70006300 { |
144 | compatible = "nvidia,tegra30-uart", "nvidia,tegra20-uart"; | 105 | compatible = "nvidia,tegra30-uart", "nvidia,tegra20-uart"; |
145 | reg = <0x70006300 0x100>; | 106 | reg = <0x70006300 0x100>; |
146 | reg-shift = <2>; | 107 | reg-shift = <2>; |
147 | interrupts = < 0 90 0x04 >; | 108 | interrupts = <0 90 0x04>; |
109 | status = "disable"; | ||
148 | }; | 110 | }; |
149 | 111 | ||
150 | serial@70006400 { | 112 | serial@70006400 { |
151 | compatible = "nvidia,tegra30-uart", "nvidia,tegra20-uart"; | 113 | compatible = "nvidia,tegra30-uart", "nvidia,tegra20-uart"; |
152 | reg = <0x70006400 0x100>; | 114 | reg = <0x70006400 0x100>; |
153 | reg-shift = <2>; | 115 | reg-shift = <2>; |
154 | interrupts = < 0 91 0x04 >; | 116 | interrupts = <0 91 0x04>; |
117 | status = "disable"; | ||
118 | }; | ||
119 | |||
120 | i2c@7000c000 { | ||
121 | compatible = "nvidia,tegra30-i2c", "nvidia,tegra20-i2c"; | ||
122 | reg = <0x7000c000 0x100>; | ||
123 | interrupts = <0 38 0x04>; | ||
124 | #address-cells = <1>; | ||
125 | #size-cells = <0>; | ||
126 | status = "disable"; | ||
127 | }; | ||
128 | |||
129 | i2c@7000c400 { | ||
130 | compatible = "nvidia,tegra30-i2c", "nvidia,tegra20-i2c"; | ||
131 | reg = <0x7000c400 0x100>; | ||
132 | interrupts = <0 84 0x04>; | ||
133 | #address-cells = <1>; | ||
134 | #size-cells = <0>; | ||
135 | status = "disable"; | ||
136 | }; | ||
137 | |||
138 | i2c@7000c500 { | ||
139 | compatible = "nvidia,tegra30-i2c", "nvidia,tegra20-i2c"; | ||
140 | reg = <0x7000c500 0x100>; | ||
141 | interrupts = <0 92 0x04>; | ||
142 | #address-cells = <1>; | ||
143 | #size-cells = <0>; | ||
144 | status = "disable"; | ||
145 | }; | ||
146 | |||
147 | i2c@7000c700 { | ||
148 | compatible = "nvidia,tegra30-i2c", "nvidia,tegra20-i2c"; | ||
149 | reg = <0x7000c700 0x100>; | ||
150 | interrupts = <0 120 0x04>; | ||
151 | #address-cells = <1>; | ||
152 | #size-cells = <0>; | ||
153 | status = "disable"; | ||
154 | }; | ||
155 | |||
156 | i2c@7000d000 { | ||
157 | compatible = "nvidia,tegra30-i2c", "nvidia,tegra20-i2c"; | ||
158 | reg = <0x7000d000 0x100>; | ||
159 | interrupts = <0 53 0x04>; | ||
160 | #address-cells = <1>; | ||
161 | #size-cells = <0>; | ||
162 | status = "disable"; | ||
163 | }; | ||
164 | |||
165 | pmc { | ||
166 | compatible = "nvidia,tegra20-pmc", "nvidia,tegra30-pmc"; | ||
167 | reg = <0x7000e400 0x400>; | ||
168 | }; | ||
169 | |||
170 | mc { | ||
171 | compatible = "nvidia,tegra30-mc"; | ||
172 | reg = <0x7000f000 0x010 | ||
173 | 0x7000f03c 0x1b4 | ||
174 | 0x7000f200 0x028 | ||
175 | 0x7000f284 0x17c>; | ||
176 | interrupts = <0 77 0x04>; | ||
177 | }; | ||
178 | |||
179 | smmu { | ||
180 | compatible = "nvidia,tegra30-smmu"; | ||
181 | reg = <0x7000f010 0x02c | ||
182 | 0x7000f1f0 0x010 | ||
183 | 0x7000f228 0x05c>; | ||
184 | nvidia,#asids = <4>; /* # of ASIDs */ | ||
185 | dma-window = <0 0x40000000>; /* IOVA start & length */ | ||
186 | nvidia,ahb = <&ahb>; | ||
187 | }; | ||
188 | |||
189 | ahub { | ||
190 | compatible = "nvidia,tegra30-ahub"; | ||
191 | reg = <0x70080000 0x200 | ||
192 | 0x70080200 0x100>; | ||
193 | interrupts = <0 103 0x04>; | ||
194 | nvidia,dma-request-selector = <&apbdma 1>; | ||
195 | |||
196 | ranges; | ||
197 | #address-cells = <1>; | ||
198 | #size-cells = <1>; | ||
199 | |||
200 | tegra_i2s0: i2s@70080300 { | ||
201 | compatible = "nvidia,tegra30-i2s"; | ||
202 | reg = <0x70080300 0x100>; | ||
203 | nvidia,ahub-cif-ids = <4 4>; | ||
204 | status = "disable"; | ||
205 | }; | ||
206 | |||
207 | tegra_i2s1: i2s@70080400 { | ||
208 | compatible = "nvidia,tegra30-i2s"; | ||
209 | reg = <0x70080400 0x100>; | ||
210 | nvidia,ahub-cif-ids = <5 5>; | ||
211 | status = "disable"; | ||
212 | }; | ||
213 | |||
214 | tegra_i2s2: i2s@70080500 { | ||
215 | compatible = "nvidia,tegra30-i2s"; | ||
216 | reg = <0x70080500 0x100>; | ||
217 | nvidia,ahub-cif-ids = <6 6>; | ||
218 | status = "disable"; | ||
219 | }; | ||
220 | |||
221 | tegra_i2s3: i2s@70080600 { | ||
222 | compatible = "nvidia,tegra30-i2s"; | ||
223 | reg = <0x70080600 0x100>; | ||
224 | nvidia,ahub-cif-ids = <7 7>; | ||
225 | status = "disable"; | ||
226 | }; | ||
227 | |||
228 | tegra_i2s4: i2s@70080700 { | ||
229 | compatible = "nvidia,tegra30-i2s"; | ||
230 | reg = <0x70080700 0x100>; | ||
231 | nvidia,ahub-cif-ids = <8 8>; | ||
232 | status = "disable"; | ||
233 | }; | ||
155 | }; | 234 | }; |
156 | 235 | ||
157 | sdhci@78000000 { | 236 | sdhci@78000000 { |
158 | compatible = "nvidia,tegra30-sdhci", "nvidia,tegra20-sdhci"; | 237 | compatible = "nvidia,tegra30-sdhci", "nvidia,tegra20-sdhci"; |
159 | reg = <0x78000000 0x200>; | 238 | reg = <0x78000000 0x200>; |
160 | interrupts = < 0 14 0x04 >; | 239 | interrupts = <0 14 0x04>; |
240 | status = "disable"; | ||
161 | }; | 241 | }; |
162 | 242 | ||
163 | sdhci@78000200 { | 243 | sdhci@78000200 { |
164 | compatible = "nvidia,tegra30-sdhci", "nvidia,tegra20-sdhci"; | 244 | compatible = "nvidia,tegra30-sdhci", "nvidia,tegra20-sdhci"; |
165 | reg = <0x78000200 0x200>; | 245 | reg = <0x78000200 0x200>; |
166 | interrupts = < 0 15 0x04 >; | 246 | interrupts = <0 15 0x04>; |
247 | status = "disable"; | ||
167 | }; | 248 | }; |
168 | 249 | ||
169 | sdhci@78000400 { | 250 | sdhci@78000400 { |
170 | compatible = "nvidia,tegra30-sdhci", "nvidia,tegra20-sdhci"; | 251 | compatible = "nvidia,tegra30-sdhci", "nvidia,tegra20-sdhci"; |
171 | reg = <0x78000400 0x200>; | 252 | reg = <0x78000400 0x200>; |
172 | interrupts = < 0 19 0x04 >; | 253 | interrupts = <0 19 0x04>; |
254 | status = "disable"; | ||
173 | }; | 255 | }; |
174 | 256 | ||
175 | sdhci@78000600 { | 257 | sdhci@78000600 { |
176 | compatible = "nvidia,tegra30-sdhci", "nvidia,tegra20-sdhci"; | 258 | compatible = "nvidia,tegra30-sdhci", "nvidia,tegra20-sdhci"; |
177 | reg = <0x78000600 0x200>; | 259 | reg = <0x78000600 0x200>; |
178 | interrupts = < 0 31 0x04 >; | 260 | interrupts = <0 31 0x04>; |
261 | status = "disable"; | ||
179 | }; | 262 | }; |
180 | 263 | ||
181 | pinmux: pinmux@70000000 { | 264 | pmu { |
182 | compatible = "nvidia,tegra30-pinmux"; | 265 | compatible = "arm,cortex-a9-pmu"; |
183 | reg = < 0x70000868 0xd0 /* Pad control registers */ | 266 | interrupts = <0 144 0x04 |
184 | 0x70003000 0x3e0 >; /* Mux registers */ | 267 | 0 145 0x04 |
268 | 0 146 0x04 | ||
269 | 0 147 0x04>; | ||
185 | }; | 270 | }; |
186 | }; | 271 | }; |
diff --git a/arch/arm/common/dmabounce.c b/arch/arm/common/dmabounce.c index 595ecd290ebf..9d7eb530f95f 100644 --- a/arch/arm/common/dmabounce.c +++ b/arch/arm/common/dmabounce.c | |||
@@ -173,7 +173,8 @@ find_safe_buffer(struct dmabounce_device_info *device_info, dma_addr_t safe_dma_ | |||
173 | read_lock_irqsave(&device_info->lock, flags); | 173 | read_lock_irqsave(&device_info->lock, flags); |
174 | 174 | ||
175 | list_for_each_entry(b, &device_info->safe_buffers, node) | 175 | list_for_each_entry(b, &device_info->safe_buffers, node) |
176 | if (b->safe_dma_addr == safe_dma_addr) { | 176 | if (b->safe_dma_addr <= safe_dma_addr && |
177 | b->safe_dma_addr + b->size > safe_dma_addr) { | ||
177 | rb = b; | 178 | rb = b; |
178 | break; | 179 | break; |
179 | } | 180 | } |
@@ -254,7 +255,7 @@ static inline dma_addr_t map_single(struct device *dev, void *ptr, size_t size, | |||
254 | if (buf == NULL) { | 255 | if (buf == NULL) { |
255 | dev_err(dev, "%s: unable to map unsafe buffer %p!\n", | 256 | dev_err(dev, "%s: unable to map unsafe buffer %p!\n", |
256 | __func__, ptr); | 257 | __func__, ptr); |
257 | return ~0; | 258 | return DMA_ERROR_CODE; |
258 | } | 259 | } |
259 | 260 | ||
260 | dev_dbg(dev, "%s: unsafe buffer %p (dma=%#x) mapped to %p (dma=%#x)\n", | 261 | dev_dbg(dev, "%s: unsafe buffer %p (dma=%#x) mapped to %p (dma=%#x)\n", |
@@ -307,8 +308,9 @@ static inline void unmap_single(struct device *dev, struct safe_buffer *buf, | |||
307 | * substitute the safe buffer for the unsafe one. | 308 | * substitute the safe buffer for the unsafe one. |
308 | * (basically move the buffer from an unsafe area to a safe one) | 309 | * (basically move the buffer from an unsafe area to a safe one) |
309 | */ | 310 | */ |
310 | dma_addr_t __dma_map_page(struct device *dev, struct page *page, | 311 | static dma_addr_t dmabounce_map_page(struct device *dev, struct page *page, |
311 | unsigned long offset, size_t size, enum dma_data_direction dir) | 312 | unsigned long offset, size_t size, enum dma_data_direction dir, |
313 | struct dma_attrs *attrs) | ||
312 | { | 314 | { |
313 | dma_addr_t dma_addr; | 315 | dma_addr_t dma_addr; |
314 | int ret; | 316 | int ret; |
@@ -320,21 +322,20 @@ dma_addr_t __dma_map_page(struct device *dev, struct page *page, | |||
320 | 322 | ||
321 | ret = needs_bounce(dev, dma_addr, size); | 323 | ret = needs_bounce(dev, dma_addr, size); |
322 | if (ret < 0) | 324 | if (ret < 0) |
323 | return ~0; | 325 | return DMA_ERROR_CODE; |
324 | 326 | ||
325 | if (ret == 0) { | 327 | if (ret == 0) { |
326 | __dma_page_cpu_to_dev(page, offset, size, dir); | 328 | arm_dma_ops.sync_single_for_device(dev, dma_addr, size, dir); |
327 | return dma_addr; | 329 | return dma_addr; |
328 | } | 330 | } |
329 | 331 | ||
330 | if (PageHighMem(page)) { | 332 | if (PageHighMem(page)) { |
331 | dev_err(dev, "DMA buffer bouncing of HIGHMEM pages is not supported\n"); | 333 | dev_err(dev, "DMA buffer bouncing of HIGHMEM pages is not supported\n"); |
332 | return ~0; | 334 | return DMA_ERROR_CODE; |
333 | } | 335 | } |
334 | 336 | ||
335 | return map_single(dev, page_address(page) + offset, size, dir); | 337 | return map_single(dev, page_address(page) + offset, size, dir); |
336 | } | 338 | } |
337 | EXPORT_SYMBOL(__dma_map_page); | ||
338 | 339 | ||
339 | /* | 340 | /* |
340 | * see if a mapped address was really a "safe" buffer and if so, copy | 341 | * see if a mapped address was really a "safe" buffer and if so, copy |
@@ -342,8 +343,8 @@ EXPORT_SYMBOL(__dma_map_page); | |||
342 | * the safe buffer. (basically return things back to the way they | 343 | * the safe buffer. (basically return things back to the way they |
343 | * should be) | 344 | * should be) |
344 | */ | 345 | */ |
345 | void __dma_unmap_page(struct device *dev, dma_addr_t dma_addr, size_t size, | 346 | static void dmabounce_unmap_page(struct device *dev, dma_addr_t dma_addr, size_t size, |
346 | enum dma_data_direction dir) | 347 | enum dma_data_direction dir, struct dma_attrs *attrs) |
347 | { | 348 | { |
348 | struct safe_buffer *buf; | 349 | struct safe_buffer *buf; |
349 | 350 | ||
@@ -352,19 +353,18 @@ void __dma_unmap_page(struct device *dev, dma_addr_t dma_addr, size_t size, | |||
352 | 353 | ||
353 | buf = find_safe_buffer_dev(dev, dma_addr, __func__); | 354 | buf = find_safe_buffer_dev(dev, dma_addr, __func__); |
354 | if (!buf) { | 355 | if (!buf) { |
355 | __dma_page_dev_to_cpu(pfn_to_page(dma_to_pfn(dev, dma_addr)), | 356 | arm_dma_ops.sync_single_for_cpu(dev, dma_addr, size, dir); |
356 | dma_addr & ~PAGE_MASK, size, dir); | ||
357 | return; | 357 | return; |
358 | } | 358 | } |
359 | 359 | ||
360 | unmap_single(dev, buf, size, dir); | 360 | unmap_single(dev, buf, size, dir); |
361 | } | 361 | } |
362 | EXPORT_SYMBOL(__dma_unmap_page); | ||
363 | 362 | ||
364 | int dmabounce_sync_for_cpu(struct device *dev, dma_addr_t addr, | 363 | static int __dmabounce_sync_for_cpu(struct device *dev, dma_addr_t addr, |
365 | unsigned long off, size_t sz, enum dma_data_direction dir) | 364 | size_t sz, enum dma_data_direction dir) |
366 | { | 365 | { |
367 | struct safe_buffer *buf; | 366 | struct safe_buffer *buf; |
367 | unsigned long off; | ||
368 | 368 | ||
369 | dev_dbg(dev, "%s(dma=%#x,off=%#lx,sz=%zx,dir=%x)\n", | 369 | dev_dbg(dev, "%s(dma=%#x,off=%#lx,sz=%zx,dir=%x)\n", |
370 | __func__, addr, off, sz, dir); | 370 | __func__, addr, off, sz, dir); |
@@ -373,6 +373,8 @@ int dmabounce_sync_for_cpu(struct device *dev, dma_addr_t addr, | |||
373 | if (!buf) | 373 | if (!buf) |
374 | return 1; | 374 | return 1; |
375 | 375 | ||
376 | off = addr - buf->safe_dma_addr; | ||
377 | |||
376 | BUG_ON(buf->direction != dir); | 378 | BUG_ON(buf->direction != dir); |
377 | 379 | ||
378 | dev_dbg(dev, "%s: unsafe buffer %p (dma=%#x) mapped to %p (dma=%#x)\n", | 380 | dev_dbg(dev, "%s: unsafe buffer %p (dma=%#x) mapped to %p (dma=%#x)\n", |
@@ -388,12 +390,21 @@ int dmabounce_sync_for_cpu(struct device *dev, dma_addr_t addr, | |||
388 | } | 390 | } |
389 | return 0; | 391 | return 0; |
390 | } | 392 | } |
391 | EXPORT_SYMBOL(dmabounce_sync_for_cpu); | ||
392 | 393 | ||
393 | int dmabounce_sync_for_device(struct device *dev, dma_addr_t addr, | 394 | static void dmabounce_sync_for_cpu(struct device *dev, |
394 | unsigned long off, size_t sz, enum dma_data_direction dir) | 395 | dma_addr_t handle, size_t size, enum dma_data_direction dir) |
396 | { | ||
397 | if (!__dmabounce_sync_for_cpu(dev, handle, size, dir)) | ||
398 | return; | ||
399 | |||
400 | arm_dma_ops.sync_single_for_cpu(dev, handle, size, dir); | ||
401 | } | ||
402 | |||
403 | static int __dmabounce_sync_for_device(struct device *dev, dma_addr_t addr, | ||
404 | size_t sz, enum dma_data_direction dir) | ||
395 | { | 405 | { |
396 | struct safe_buffer *buf; | 406 | struct safe_buffer *buf; |
407 | unsigned long off; | ||
397 | 408 | ||
398 | dev_dbg(dev, "%s(dma=%#x,off=%#lx,sz=%zx,dir=%x)\n", | 409 | dev_dbg(dev, "%s(dma=%#x,off=%#lx,sz=%zx,dir=%x)\n", |
399 | __func__, addr, off, sz, dir); | 410 | __func__, addr, off, sz, dir); |
@@ -402,6 +413,8 @@ int dmabounce_sync_for_device(struct device *dev, dma_addr_t addr, | |||
402 | if (!buf) | 413 | if (!buf) |
403 | return 1; | 414 | return 1; |
404 | 415 | ||
416 | off = addr - buf->safe_dma_addr; | ||
417 | |||
405 | BUG_ON(buf->direction != dir); | 418 | BUG_ON(buf->direction != dir); |
406 | 419 | ||
407 | dev_dbg(dev, "%s: unsafe buffer %p (dma=%#x) mapped to %p (dma=%#x)\n", | 420 | dev_dbg(dev, "%s: unsafe buffer %p (dma=%#x) mapped to %p (dma=%#x)\n", |
@@ -417,7 +430,38 @@ int dmabounce_sync_for_device(struct device *dev, dma_addr_t addr, | |||
417 | } | 430 | } |
418 | return 0; | 431 | return 0; |
419 | } | 432 | } |
420 | EXPORT_SYMBOL(dmabounce_sync_for_device); | 433 | |
434 | static void dmabounce_sync_for_device(struct device *dev, | ||
435 | dma_addr_t handle, size_t size, enum dma_data_direction dir) | ||
436 | { | ||
437 | if (!__dmabounce_sync_for_device(dev, handle, size, dir)) | ||
438 | return; | ||
439 | |||
440 | arm_dma_ops.sync_single_for_device(dev, handle, size, dir); | ||
441 | } | ||
442 | |||
443 | static int dmabounce_set_mask(struct device *dev, u64 dma_mask) | ||
444 | { | ||
445 | if (dev->archdata.dmabounce) | ||
446 | return 0; | ||
447 | |||
448 | return arm_dma_ops.set_dma_mask(dev, dma_mask); | ||
449 | } | ||
450 | |||
451 | static struct dma_map_ops dmabounce_ops = { | ||
452 | .alloc = arm_dma_alloc, | ||
453 | .free = arm_dma_free, | ||
454 | .mmap = arm_dma_mmap, | ||
455 | .map_page = dmabounce_map_page, | ||
456 | .unmap_page = dmabounce_unmap_page, | ||
457 | .sync_single_for_cpu = dmabounce_sync_for_cpu, | ||
458 | .sync_single_for_device = dmabounce_sync_for_device, | ||
459 | .map_sg = arm_dma_map_sg, | ||
460 | .unmap_sg = arm_dma_unmap_sg, | ||
461 | .sync_sg_for_cpu = arm_dma_sync_sg_for_cpu, | ||
462 | .sync_sg_for_device = arm_dma_sync_sg_for_device, | ||
463 | .set_dma_mask = dmabounce_set_mask, | ||
464 | }; | ||
421 | 465 | ||
422 | static int dmabounce_init_pool(struct dmabounce_pool *pool, struct device *dev, | 466 | static int dmabounce_init_pool(struct dmabounce_pool *pool, struct device *dev, |
423 | const char *name, unsigned long size) | 467 | const char *name, unsigned long size) |
@@ -479,6 +523,7 @@ int dmabounce_register_dev(struct device *dev, unsigned long small_buffer_size, | |||
479 | #endif | 523 | #endif |
480 | 524 | ||
481 | dev->archdata.dmabounce = device_info; | 525 | dev->archdata.dmabounce = device_info; |
526 | set_dma_ops(dev, &dmabounce_ops); | ||
482 | 527 | ||
483 | dev_info(dev, "dmabounce: registered device\n"); | 528 | dev_info(dev, "dmabounce: registered device\n"); |
484 | 529 | ||
@@ -497,6 +542,7 @@ void dmabounce_unregister_dev(struct device *dev) | |||
497 | struct dmabounce_device_info *device_info = dev->archdata.dmabounce; | 542 | struct dmabounce_device_info *device_info = dev->archdata.dmabounce; |
498 | 543 | ||
499 | dev->archdata.dmabounce = NULL; | 544 | dev->archdata.dmabounce = NULL; |
545 | set_dma_ops(dev, NULL); | ||
500 | 546 | ||
501 | if (!device_info) { | 547 | if (!device_info) { |
502 | dev_warn(dev, | 548 | dev_warn(dev, |
diff --git a/arch/arm/configs/imx_v4_v5_defconfig b/arch/arm/configs/imx_v4_v5_defconfig index 09a02963cf58..e05a2f1665a7 100644 --- a/arch/arm/configs/imx_v4_v5_defconfig +++ b/arch/arm/configs/imx_v4_v5_defconfig | |||
@@ -33,6 +33,7 @@ CONFIG_MACH_IMX27LITE=y | |||
33 | CONFIG_MACH_PCA100=y | 33 | CONFIG_MACH_PCA100=y |
34 | CONFIG_MACH_MXT_TD60=y | 34 | CONFIG_MACH_MXT_TD60=y |
35 | CONFIG_MACH_IMX27IPCAM=y | 35 | CONFIG_MACH_IMX27IPCAM=y |
36 | CONFIG_MACH_IMX27_DT=y | ||
36 | CONFIG_MXC_IRQ_PRIOR=y | 37 | CONFIG_MXC_IRQ_PRIOR=y |
37 | CONFIG_MXC_PWM=y | 38 | CONFIG_MXC_PWM=y |
38 | CONFIG_NO_HZ=y | 39 | CONFIG_NO_HZ=y |
@@ -172,7 +173,7 @@ CONFIG_LEDS_TRIGGER_DEFAULT_ON=y | |||
172 | CONFIG_RTC_CLASS=y | 173 | CONFIG_RTC_CLASS=y |
173 | CONFIG_RTC_DRV_PCF8563=y | 174 | CONFIG_RTC_DRV_PCF8563=y |
174 | CONFIG_RTC_DRV_IMXDI=y | 175 | CONFIG_RTC_DRV_IMXDI=y |
175 | CONFIG_RTC_MXC=y | 176 | CONFIG_RTC_DRV_MXC=y |
176 | CONFIG_DMADEVICES=y | 177 | CONFIG_DMADEVICES=y |
177 | CONFIG_IMX_SDMA=y | 178 | CONFIG_IMX_SDMA=y |
178 | CONFIG_IMX_DMA=y | 179 | CONFIG_IMX_DMA=y |
diff --git a/arch/arm/configs/imx_v6_v7_defconfig b/arch/arm/configs/imx_v6_v7_defconfig index dc6f6411bbf5..b1d3675df72c 100644 --- a/arch/arm/configs/imx_v6_v7_defconfig +++ b/arch/arm/configs/imx_v6_v7_defconfig | |||
@@ -64,6 +64,12 @@ CONFIG_IPV6=y | |||
64 | # CONFIG_WIRELESS is not set | 64 | # CONFIG_WIRELESS is not set |
65 | CONFIG_DEVTMPFS=y | 65 | CONFIG_DEVTMPFS=y |
66 | CONFIG_DEVTMPFS_MOUNT=y | 66 | CONFIG_DEVTMPFS_MOUNT=y |
67 | CONFIG_MTD=y | ||
68 | CONFIG_MTD_OF_PARTS=y | ||
69 | CONFIG_MTD_CHAR=y | ||
70 | CONFIG_MTD_DATAFLASH=y | ||
71 | CONFIG_MTD_M25P80=y | ||
72 | CONFIG_MTD_SST25L=y | ||
67 | # CONFIG_STANDALONE is not set | 73 | # CONFIG_STANDALONE is not set |
68 | CONFIG_CONNECTOR=y | 74 | CONFIG_CONNECTOR=y |
69 | CONFIG_BLK_DEV_LOOP=y | 75 | CONFIG_BLK_DEV_LOOP=y |
@@ -172,7 +178,7 @@ CONFIG_NEW_LEDS=y | |||
172 | CONFIG_LEDS_CLASS=y | 178 | CONFIG_LEDS_CLASS=y |
173 | CONFIG_RTC_CLASS=y | 179 | CONFIG_RTC_CLASS=y |
174 | CONFIG_RTC_INTF_DEV_UIE_EMUL=y | 180 | CONFIG_RTC_INTF_DEV_UIE_EMUL=y |
175 | CONFIG_RTC_MXC=y | 181 | CONFIG_RTC_DRV_MXC=y |
176 | CONFIG_DMADEVICES=y | 182 | CONFIG_DMADEVICES=y |
177 | CONFIG_IMX_SDMA=y | 183 | CONFIG_IMX_SDMA=y |
178 | CONFIG_EXT2_FS=y | 184 | CONFIG_EXT2_FS=y |
diff --git a/arch/arm/configs/mxs_defconfig b/arch/arm/configs/mxs_defconfig index 1ebbf451c48d..5406c23a02e3 100644 --- a/arch/arm/configs/mxs_defconfig +++ b/arch/arm/configs/mxs_defconfig | |||
@@ -22,6 +22,7 @@ CONFIG_BLK_DEV_INTEGRITY=y | |||
22 | # CONFIG_IOSCHED_DEADLINE is not set | 22 | # CONFIG_IOSCHED_DEADLINE is not set |
23 | # CONFIG_IOSCHED_CFQ is not set | 23 | # CONFIG_IOSCHED_CFQ is not set |
24 | CONFIG_ARCH_MXS=y | 24 | CONFIG_ARCH_MXS=y |
25 | CONFIG_MACH_MXS_DT=y | ||
25 | CONFIG_MACH_MX23EVK=y | 26 | CONFIG_MACH_MX23EVK=y |
26 | CONFIG_MACH_MX28EVK=y | 27 | CONFIG_MACH_MX28EVK=y |
27 | CONFIG_MACH_STMP378X_DEVB=y | 28 | CONFIG_MACH_STMP378X_DEVB=y |
diff --git a/arch/arm/configs/prima2_defconfig b/arch/arm/configs/prima2_defconfig new file mode 100644 index 000000000000..c328ac65479a --- /dev/null +++ b/arch/arm/configs/prima2_defconfig | |||
@@ -0,0 +1,69 @@ | |||
1 | CONFIG_EXPERIMENTAL=y | ||
2 | CONFIG_RELAY=y | ||
3 | CONFIG_BLK_DEV_INITRD=y | ||
4 | CONFIG_KALLSYMS_ALL=y | ||
5 | CONFIG_MODULES=y | ||
6 | CONFIG_MODULE_UNLOAD=y | ||
7 | # CONFIG_BLK_DEV_BSG is not set | ||
8 | CONFIG_PARTITION_ADVANCED=y | ||
9 | CONFIG_BSD_DISKLABEL=y | ||
10 | CONFIG_SOLARIS_X86_PARTITION=y | ||
11 | CONFIG_ARCH_PRIMA2=y | ||
12 | CONFIG_NO_HZ=y | ||
13 | CONFIG_HIGH_RES_TIMERS=y | ||
14 | CONFIG_PREEMPT=y | ||
15 | CONFIG_AEABI=y | ||
16 | CONFIG_KEXEC=y | ||
17 | CONFIG_BINFMT_MISC=y | ||
18 | CONFIG_PM_RUNTIME=y | ||
19 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
20 | CONFIG_BLK_DEV_LOOP=y | ||
21 | CONFIG_BLK_DEV_RAM=y | ||
22 | CONFIG_BLK_DEV_RAM_SIZE=8192 | ||
23 | CONFIG_SCSI=y | ||
24 | CONFIG_BLK_DEV_SD=y | ||
25 | CONFIG_CHR_DEV_SG=y | ||
26 | CONFIG_INPUT_EVDEV=y | ||
27 | # CONFIG_INPUT_MOUSE is not set | ||
28 | CONFIG_INPUT_TOUCHSCREEN=y | ||
29 | CONFIG_SERIAL_SIRFSOC=y | ||
30 | CONFIG_SERIAL_SIRFSOC_CONSOLE=y | ||
31 | CONFIG_HW_RANDOM=y | ||
32 | CONFIG_I2C=y | ||
33 | CONFIG_I2C_CHARDEV=y | ||
34 | CONFIG_I2C_SIRF=y | ||
35 | CONFIG_SPI=y | ||
36 | CONFIG_SPI_SIRF=y | ||
37 | CONFIG_SPI_SPIDEV=y | ||
38 | # CONFIG_HWMON is not set | ||
39 | # CONFIG_HID_SUPPORT is not set | ||
40 | CONFIG_USB_GADGET=y | ||
41 | CONFIG_USB_FILE_STORAGE=m | ||
42 | CONFIG_USB_MASS_STORAGE=m | ||
43 | CONFIG_MMC=y | ||
44 | CONFIG_MMC_SDHCI=y | ||
45 | CONFIG_MMC_SDHCI_PLTFM=y | ||
46 | CONFIG_DMADEVICES=y | ||
47 | CONFIG_DMADEVICES_DEBUG=y | ||
48 | CONFIG_DMADEVICES_VDEBUG=y | ||
49 | CONFIG_SIRF_DMA=y | ||
50 | # CONFIG_IOMMU_SUPPORT is not set | ||
51 | CONFIG_EXT2_FS=y | ||
52 | CONFIG_MSDOS_FS=y | ||
53 | CONFIG_VFAT_FS=y | ||
54 | CONFIG_TMPFS=y | ||
55 | CONFIG_TMPFS_POSIX_ACL=y | ||
56 | CONFIG_CRAMFS=y | ||
57 | CONFIG_ROMFS_FS=y | ||
58 | CONFIG_NLS_CODEPAGE_437=y | ||
59 | CONFIG_NLS_ASCII=y | ||
60 | CONFIG_NLS_ISO8859_1=y | ||
61 | CONFIG_MAGIC_SYSRQ=y | ||
62 | CONFIG_DEBUG_SECTION_MISMATCH=y | ||
63 | CONFIG_DEBUG_KERNEL=y | ||
64 | # CONFIG_DEBUG_PREEMPT is not set | ||
65 | CONFIG_DEBUG_RT_MUTEXES=y | ||
66 | CONFIG_DEBUG_SPINLOCK=y | ||
67 | CONFIG_DEBUG_MUTEXES=y | ||
68 | CONFIG_DEBUG_INFO=y | ||
69 | CONFIG_CRC_CCITT=y | ||
diff --git a/arch/arm/configs/spear13xx_defconfig b/arch/arm/configs/spear13xx_defconfig new file mode 100644 index 000000000000..1fdb82694ca2 --- /dev/null +++ b/arch/arm/configs/spear13xx_defconfig | |||
@@ -0,0 +1,95 @@ | |||
1 | CONFIG_EXPERIMENTAL=y | ||
2 | CONFIG_SYSVIPC=y | ||
3 | CONFIG_BSD_PROCESS_ACCT=y | ||
4 | CONFIG_BLK_DEV_INITRD=y | ||
5 | CONFIG_MODULES=y | ||
6 | CONFIG_MODULE_UNLOAD=y | ||
7 | CONFIG_MODVERSIONS=y | ||
8 | CONFIG_PARTITION_ADVANCED=y | ||
9 | CONFIG_PLAT_SPEAR=y | ||
10 | CONFIG_ARCH_SPEAR13XX=y | ||
11 | CONFIG_MACH_SPEAR1310=y | ||
12 | CONFIG_MACH_SPEAR1340=y | ||
13 | # CONFIG_SWP_EMULATE is not set | ||
14 | CONFIG_SMP=y | ||
15 | # CONFIG_SMP_ON_UP is not set | ||
16 | # CONFIG_ARM_CPU_TOPOLOGY is not set | ||
17 | CONFIG_ARM_APPENDED_DTB=y | ||
18 | CONFIG_ARM_ATAG_DTB_COMPAT=y | ||
19 | CONFIG_BINFMT_MISC=y | ||
20 | CONFIG_NET=y | ||
21 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
22 | CONFIG_MTD=y | ||
23 | CONFIG_MTD_OF_PARTS=y | ||
24 | CONFIG_MTD_CHAR=y | ||
25 | CONFIG_MTD_BLOCK=y | ||
26 | CONFIG_MTD_NAND=y | ||
27 | CONFIG_MTD_NAND_FSMC=y | ||
28 | CONFIG_BLK_DEV_RAM=y | ||
29 | CONFIG_BLK_DEV_RAM_SIZE=16384 | ||
30 | CONFIG_ATA=y | ||
31 | # CONFIG_SATA_PMP is not set | ||
32 | CONFIG_SATA_AHCI_PLATFORM=y | ||
33 | CONFIG_PATA_ARASAN_CF=y | ||
34 | CONFIG_NETDEVICES=y | ||
35 | # CONFIG_NET_VENDOR_BROADCOM is not set | ||
36 | # CONFIG_NET_VENDOR_CIRRUS is not set | ||
37 | # CONFIG_NET_VENDOR_FARADAY is not set | ||
38 | # CONFIG_NET_VENDOR_INTEL is not set | ||
39 | # CONFIG_NET_VENDOR_MICREL is not set | ||
40 | # CONFIG_NET_VENDOR_NATSEMI is not set | ||
41 | # CONFIG_NET_VENDOR_SEEQ is not set | ||
42 | # CONFIG_NET_VENDOR_SMSC is not set | ||
43 | CONFIG_STMMAC_ETH=y | ||
44 | # CONFIG_WLAN is not set | ||
45 | CONFIG_INPUT_FF_MEMLESS=y | ||
46 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set | ||
47 | # CONFIG_KEYBOARD_ATKBD is not set | ||
48 | CONFIG_KEYBOARD_SPEAR=y | ||
49 | # CONFIG_INPUT_MOUSE is not set | ||
50 | # CONFIG_LEGACY_PTYS is not set | ||
51 | CONFIG_SERIAL_AMBA_PL011=y | ||
52 | CONFIG_SERIAL_AMBA_PL011_CONSOLE=y | ||
53 | # CONFIG_HW_RANDOM is not set | ||
54 | CONFIG_RAW_DRIVER=y | ||
55 | CONFIG_MAX_RAW_DEVS=8192 | ||
56 | CONFIG_I2C=y | ||
57 | CONFIG_I2C_DESIGNWARE_PLATFORM=y | ||
58 | CONFIG_SPI=y | ||
59 | CONFIG_SPI_PL022=y | ||
60 | CONFIG_GPIO_SYSFS=y | ||
61 | CONFIG_GPIO_PL061=y | ||
62 | # CONFIG_HWMON is not set | ||
63 | CONFIG_WATCHDOG=y | ||
64 | CONFIG_MPCORE_WATCHDOG=y | ||
65 | # CONFIG_HID_SUPPORT is not set | ||
66 | CONFIG_USB=y | ||
67 | # CONFIG_USB_DEVICE_CLASS is not set | ||
68 | CONFIG_USB_EHCI_HCD=y | ||
69 | CONFIG_USB_OHCI_HCD=y | ||
70 | CONFIG_MMC=y | ||
71 | CONFIG_MMC_SDHCI=y | ||
72 | CONFIG_MMC_SDHCI_SPEAR=y | ||
73 | CONFIG_RTC_CLASS=y | ||
74 | CONFIG_DMADEVICES=y | ||
75 | CONFIG_DW_DMAC=y | ||
76 | CONFIG_DMATEST=m | ||
77 | CONFIG_EXT2_FS=y | ||
78 | CONFIG_EXT2_FS_XATTR=y | ||
79 | CONFIG_EXT2_FS_SECURITY=y | ||
80 | CONFIG_EXT3_FS=y | ||
81 | CONFIG_EXT3_FS_SECURITY=y | ||
82 | CONFIG_AUTOFS4_FS=m | ||
83 | CONFIG_MSDOS_FS=m | ||
84 | CONFIG_VFAT_FS=m | ||
85 | CONFIG_FAT_DEFAULT_IOCHARSET="ascii" | ||
86 | CONFIG_TMPFS=y | ||
87 | CONFIG_JFFS2_FS=y | ||
88 | CONFIG_NLS_DEFAULT="utf8" | ||
89 | CONFIG_NLS_CODEPAGE_437=y | ||
90 | CONFIG_NLS_ASCII=m | ||
91 | CONFIG_MAGIC_SYSRQ=y | ||
92 | CONFIG_DEBUG_FS=y | ||
93 | CONFIG_DEBUG_KERNEL=y | ||
94 | CONFIG_DEBUG_SPINLOCK=y | ||
95 | CONFIG_DEBUG_INFO=y | ||
diff --git a/arch/arm/configs/spear3xx_defconfig b/arch/arm/configs/spear3xx_defconfig index 7ed42912d69a..865980c5f212 100644 --- a/arch/arm/configs/spear3xx_defconfig +++ b/arch/arm/configs/spear3xx_defconfig | |||
@@ -14,6 +14,9 @@ CONFIG_BINFMT_MISC=y | |||
14 | CONFIG_NET=y | 14 | CONFIG_NET=y |
15 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | 15 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" |
16 | CONFIG_MTD=y | 16 | CONFIG_MTD=y |
17 | CONFIG_MTD_OF_PARTS=y | ||
18 | CONFIG_MTD_CHAR=y | ||
19 | CONFIG_MTD_BLOCK=y | ||
17 | CONFIG_MTD_NAND=y | 20 | CONFIG_MTD_NAND=y |
18 | CONFIG_MTD_NAND_FSMC=y | 21 | CONFIG_MTD_NAND_FSMC=y |
19 | CONFIG_BLK_DEV_RAM=y | 22 | CONFIG_BLK_DEV_RAM=y |
@@ -73,6 +76,7 @@ CONFIG_MSDOS_FS=m | |||
73 | CONFIG_VFAT_FS=m | 76 | CONFIG_VFAT_FS=m |
74 | CONFIG_FAT_DEFAULT_IOCHARSET="ascii" | 77 | CONFIG_FAT_DEFAULT_IOCHARSET="ascii" |
75 | CONFIG_TMPFS=y | 78 | CONFIG_TMPFS=y |
79 | CONFIG_JFFS2_FS=y | ||
76 | CONFIG_NLS_DEFAULT="utf8" | 80 | CONFIG_NLS_DEFAULT="utf8" |
77 | CONFIG_NLS_CODEPAGE_437=y | 81 | CONFIG_NLS_CODEPAGE_437=y |
78 | CONFIG_NLS_ASCII=m | 82 | CONFIG_NLS_ASCII=m |
diff --git a/arch/arm/configs/spear6xx_defconfig b/arch/arm/configs/spear6xx_defconfig index cf94bc73a0e0..a2a1265f86b6 100644 --- a/arch/arm/configs/spear6xx_defconfig +++ b/arch/arm/configs/spear6xx_defconfig | |||
@@ -8,11 +8,13 @@ CONFIG_MODVERSIONS=y | |||
8 | CONFIG_PARTITION_ADVANCED=y | 8 | CONFIG_PARTITION_ADVANCED=y |
9 | CONFIG_PLAT_SPEAR=y | 9 | CONFIG_PLAT_SPEAR=y |
10 | CONFIG_ARCH_SPEAR6XX=y | 10 | CONFIG_ARCH_SPEAR6XX=y |
11 | CONFIG_BOARD_SPEAR600_DT=y | ||
12 | CONFIG_BINFMT_MISC=y | 11 | CONFIG_BINFMT_MISC=y |
13 | CONFIG_NET=y | 12 | CONFIG_NET=y |
14 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | 13 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" |
15 | CONFIG_MTD=y | 14 | CONFIG_MTD=y |
15 | CONFIG_MTD_OF_PARTS=y | ||
16 | CONFIG_MTD_CHAR=y | ||
17 | CONFIG_MTD_BLOCK=y | ||
16 | CONFIG_MTD_NAND=y | 18 | CONFIG_MTD_NAND=y |
17 | CONFIG_MTD_NAND_FSMC=y | 19 | CONFIG_MTD_NAND_FSMC=y |
18 | CONFIG_BLK_DEV_RAM=y | 20 | CONFIG_BLK_DEV_RAM=y |
@@ -64,6 +66,7 @@ CONFIG_MSDOS_FS=m | |||
64 | CONFIG_VFAT_FS=m | 66 | CONFIG_VFAT_FS=m |
65 | CONFIG_FAT_DEFAULT_IOCHARSET="ascii" | 67 | CONFIG_FAT_DEFAULT_IOCHARSET="ascii" |
66 | CONFIG_TMPFS=y | 68 | CONFIG_TMPFS=y |
69 | CONFIG_JFFS2_FS=y | ||
67 | CONFIG_NLS_DEFAULT="utf8" | 70 | CONFIG_NLS_DEFAULT="utf8" |
68 | CONFIG_NLS_CODEPAGE_437=y | 71 | CONFIG_NLS_CODEPAGE_437=y |
69 | CONFIG_NLS_ASCII=m | 72 | CONFIG_NLS_ASCII=m |
diff --git a/arch/arm/configs/tegra_defconfig b/arch/arm/configs/tegra_defconfig index 351d6708c3ae..1198dd61c7c4 100644 --- a/arch/arm/configs/tegra_defconfig +++ b/arch/arm/configs/tegra_defconfig | |||
@@ -45,6 +45,7 @@ CONFIG_CPU_FREQ=y | |||
45 | CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y | 45 | CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y |
46 | CONFIG_CPU_IDLE=y | 46 | CONFIG_CPU_IDLE=y |
47 | CONFIG_VFP=y | 47 | CONFIG_VFP=y |
48 | CONFIG_PM_RUNTIME=y | ||
48 | CONFIG_NET=y | 49 | CONFIG_NET=y |
49 | CONFIG_PACKET=y | 50 | CONFIG_PACKET=y |
50 | CONFIG_UNIX=y | 51 | CONFIG_UNIX=y |
@@ -91,6 +92,8 @@ CONFIG_USB_NET_SMSC75XX=y | |||
91 | CONFIG_USB_NET_SMSC95XX=y | 92 | CONFIG_USB_NET_SMSC95XX=y |
92 | # CONFIG_WLAN is not set | 93 | # CONFIG_WLAN is not set |
93 | CONFIG_INPUT_EVDEV=y | 94 | CONFIG_INPUT_EVDEV=y |
95 | CONFIG_INPUT_MISC=y | ||
96 | CONFIG_INPUT_MPU3050=y | ||
94 | # CONFIG_VT is not set | 97 | # CONFIG_VT is not set |
95 | # CONFIG_LEGACY_PTYS is not set | 98 | # CONFIG_LEGACY_PTYS is not set |
96 | # CONFIG_DEVKMEM is not set | 99 | # CONFIG_DEVKMEM is not set |
@@ -103,12 +106,15 @@ CONFIG_I2C=y | |||
103 | CONFIG_I2C_TEGRA=y | 106 | CONFIG_I2C_TEGRA=y |
104 | CONFIG_SPI=y | 107 | CONFIG_SPI=y |
105 | CONFIG_SPI_TEGRA=y | 108 | CONFIG_SPI_TEGRA=y |
109 | CONFIG_POWER_SUPPLY=y | ||
110 | CONFIG_BATTERY_SBS=y | ||
106 | CONFIG_SENSORS_LM90=y | 111 | CONFIG_SENSORS_LM90=y |
107 | CONFIG_MFD_TPS6586X=y | 112 | CONFIG_MFD_TPS6586X=y |
108 | CONFIG_REGULATOR=y | 113 | CONFIG_REGULATOR=y |
109 | CONFIG_REGULATOR_FIXED_VOLTAGE=y | 114 | CONFIG_REGULATOR_FIXED_VOLTAGE=y |
110 | CONFIG_REGULATOR_VIRTUAL_CONSUMER=y | 115 | CONFIG_REGULATOR_VIRTUAL_CONSUMER=y |
111 | CONFIG_REGULATOR_GPIO=y | 116 | CONFIG_REGULATOR_GPIO=y |
117 | CONFIG_REGULATOR_TPS62360=y | ||
112 | CONFIG_REGULATOR_TPS6586X=y | 118 | CONFIG_REGULATOR_TPS6586X=y |
113 | CONFIG_SOUND=y | 119 | CONFIG_SOUND=y |
114 | CONFIG_SND=y | 120 | CONFIG_SND=y |
@@ -133,16 +139,19 @@ CONFIG_MMC_SDHCI=y | |||
133 | CONFIG_MMC_SDHCI_PLTFM=y | 139 | CONFIG_MMC_SDHCI_PLTFM=y |
134 | CONFIG_MMC_SDHCI_TEGRA=y | 140 | CONFIG_MMC_SDHCI_TEGRA=y |
135 | CONFIG_RTC_CLASS=y | 141 | CONFIG_RTC_CLASS=y |
142 | CONFIG_RTC_DRV_EM3027=y | ||
136 | CONFIG_RTC_DRV_TEGRA=y | 143 | CONFIG_RTC_DRV_TEGRA=y |
137 | CONFIG_STAGING=y | 144 | CONFIG_STAGING=y |
138 | CONFIG_IIO=y | ||
139 | CONFIG_SENSORS_ISL29018=y | 145 | CONFIG_SENSORS_ISL29018=y |
146 | CONFIG_SENSORS_ISL29028=y | ||
140 | CONFIG_SENSORS_AK8975=y | 147 | CONFIG_SENSORS_AK8975=y |
141 | CONFIG_MFD_NVEC=y | 148 | CONFIG_MFD_NVEC=y |
142 | CONFIG_KEYBOARD_NVEC=y | 149 | CONFIG_KEYBOARD_NVEC=y |
143 | CONFIG_SERIO_NVEC_PS2=y | 150 | CONFIG_SERIO_NVEC_PS2=y |
144 | CONFIG_TEGRA_IOMMU_GART=y | 151 | CONFIG_TEGRA_IOMMU_GART=y |
145 | CONFIG_TEGRA_IOMMU_SMMU=y | 152 | CONFIG_TEGRA_IOMMU_SMMU=y |
153 | CONFIG_MEMORY=y | ||
154 | CONFIG_IIO=y | ||
146 | CONFIG_EXT2_FS=y | 155 | CONFIG_EXT2_FS=y |
147 | CONFIG_EXT2_FS_XATTR=y | 156 | CONFIG_EXT2_FS_XATTR=y |
148 | CONFIG_EXT2_FS_POSIX_ACL=y | 157 | CONFIG_EXT2_FS_POSIX_ACL=y |
diff --git a/arch/arm/include/asm/device.h b/arch/arm/include/asm/device.h index 7aa368003b05..b69c0d3285f8 100644 --- a/arch/arm/include/asm/device.h +++ b/arch/arm/include/asm/device.h | |||
@@ -7,12 +7,16 @@ | |||
7 | #define ASMARM_DEVICE_H | 7 | #define ASMARM_DEVICE_H |
8 | 8 | ||
9 | struct dev_archdata { | 9 | struct dev_archdata { |
10 | struct dma_map_ops *dma_ops; | ||
10 | #ifdef CONFIG_DMABOUNCE | 11 | #ifdef CONFIG_DMABOUNCE |
11 | struct dmabounce_device_info *dmabounce; | 12 | struct dmabounce_device_info *dmabounce; |
12 | #endif | 13 | #endif |
13 | #ifdef CONFIG_IOMMU_API | 14 | #ifdef CONFIG_IOMMU_API |
14 | void *iommu; /* private IOMMU data */ | 15 | void *iommu; /* private IOMMU data */ |
15 | #endif | 16 | #endif |
17 | #ifdef CONFIG_ARM_DMA_USE_IOMMU | ||
18 | struct dma_iommu_mapping *mapping; | ||
19 | #endif | ||
16 | }; | 20 | }; |
17 | 21 | ||
18 | struct omap_device; | 22 | struct omap_device; |
diff --git a/arch/arm/include/asm/dma-contiguous.h b/arch/arm/include/asm/dma-contiguous.h new file mode 100644 index 000000000000..3ed37b4d93da --- /dev/null +++ b/arch/arm/include/asm/dma-contiguous.h | |||
@@ -0,0 +1,15 @@ | |||
1 | #ifndef ASMARM_DMA_CONTIGUOUS_H | ||
2 | #define ASMARM_DMA_CONTIGUOUS_H | ||
3 | |||
4 | #ifdef __KERNEL__ | ||
5 | #ifdef CONFIG_CMA | ||
6 | |||
7 | #include <linux/types.h> | ||
8 | #include <asm-generic/dma-contiguous.h> | ||
9 | |||
10 | void dma_contiguous_early_fixup(phys_addr_t base, unsigned long size); | ||
11 | |||
12 | #endif | ||
13 | #endif | ||
14 | |||
15 | #endif | ||
diff --git a/arch/arm/include/asm/dma-iommu.h b/arch/arm/include/asm/dma-iommu.h new file mode 100644 index 000000000000..799b09409fad --- /dev/null +++ b/arch/arm/include/asm/dma-iommu.h | |||
@@ -0,0 +1,34 @@ | |||
1 | #ifndef ASMARM_DMA_IOMMU_H | ||
2 | #define ASMARM_DMA_IOMMU_H | ||
3 | |||
4 | #ifdef __KERNEL__ | ||
5 | |||
6 | #include <linux/mm_types.h> | ||
7 | #include <linux/scatterlist.h> | ||
8 | #include <linux/dma-debug.h> | ||
9 | #include <linux/kmemcheck.h> | ||
10 | |||
11 | struct dma_iommu_mapping { | ||
12 | /* iommu specific data */ | ||
13 | struct iommu_domain *domain; | ||
14 | |||
15 | void *bitmap; | ||
16 | size_t bits; | ||
17 | unsigned int order; | ||
18 | dma_addr_t base; | ||
19 | |||
20 | spinlock_t lock; | ||
21 | struct kref kref; | ||
22 | }; | ||
23 | |||
24 | struct dma_iommu_mapping * | ||
25 | arm_iommu_create_mapping(struct bus_type *bus, dma_addr_t base, size_t size, | ||
26 | int order); | ||
27 | |||
28 | void arm_iommu_release_mapping(struct dma_iommu_mapping *mapping); | ||
29 | |||
30 | int arm_iommu_attach_device(struct device *dev, | ||
31 | struct dma_iommu_mapping *mapping); | ||
32 | |||
33 | #endif /* __KERNEL__ */ | ||
34 | #endif | ||
diff --git a/arch/arm/include/asm/dma-mapping.h b/arch/arm/include/asm/dma-mapping.h index cb3b7c981c4b..bbef15d04890 100644 --- a/arch/arm/include/asm/dma-mapping.h +++ b/arch/arm/include/asm/dma-mapping.h | |||
@@ -5,11 +5,35 @@ | |||
5 | 5 | ||
6 | #include <linux/mm_types.h> | 6 | #include <linux/mm_types.h> |
7 | #include <linux/scatterlist.h> | 7 | #include <linux/scatterlist.h> |
8 | #include <linux/dma-attrs.h> | ||
8 | #include <linux/dma-debug.h> | 9 | #include <linux/dma-debug.h> |
9 | 10 | ||
10 | #include <asm-generic/dma-coherent.h> | 11 | #include <asm-generic/dma-coherent.h> |
11 | #include <asm/memory.h> | 12 | #include <asm/memory.h> |
12 | 13 | ||
14 | #define DMA_ERROR_CODE (~0) | ||
15 | extern struct dma_map_ops arm_dma_ops; | ||
16 | |||
17 | static inline struct dma_map_ops *get_dma_ops(struct device *dev) | ||
18 | { | ||
19 | if (dev && dev->archdata.dma_ops) | ||
20 | return dev->archdata.dma_ops; | ||
21 | return &arm_dma_ops; | ||
22 | } | ||
23 | |||
24 | static inline void set_dma_ops(struct device *dev, struct dma_map_ops *ops) | ||
25 | { | ||
26 | BUG_ON(!dev); | ||
27 | dev->archdata.dma_ops = ops; | ||
28 | } | ||
29 | |||
30 | #include <asm-generic/dma-mapping-common.h> | ||
31 | |||
32 | static inline int dma_set_mask(struct device *dev, u64 mask) | ||
33 | { | ||
34 | return get_dma_ops(dev)->set_dma_mask(dev, mask); | ||
35 | } | ||
36 | |||
13 | #ifdef __arch_page_to_dma | 37 | #ifdef __arch_page_to_dma |
14 | #error Please update to __arch_pfn_to_dma | 38 | #error Please update to __arch_pfn_to_dma |
15 | #endif | 39 | #endif |
@@ -62,68 +86,11 @@ static inline dma_addr_t virt_to_dma(struct device *dev, void *addr) | |||
62 | #endif | 86 | #endif |
63 | 87 | ||
64 | /* | 88 | /* |
65 | * The DMA API is built upon the notion of "buffer ownership". A buffer | ||
66 | * is either exclusively owned by the CPU (and therefore may be accessed | ||
67 | * by it) or exclusively owned by the DMA device. These helper functions | ||
68 | * represent the transitions between these two ownership states. | ||
69 | * | ||
70 | * Note, however, that on later ARMs, this notion does not work due to | ||
71 | * speculative prefetches. We model our approach on the assumption that | ||
72 | * the CPU does do speculative prefetches, which means we clean caches | ||
73 | * before transfers and delay cache invalidation until transfer completion. | ||
74 | * | ||
75 | * Private support functions: these are not part of the API and are | ||
76 | * liable to change. Drivers must not use these. | ||
77 | */ | ||
78 | static inline void __dma_single_cpu_to_dev(const void *kaddr, size_t size, | ||
79 | enum dma_data_direction dir) | ||
80 | { | ||
81 | extern void ___dma_single_cpu_to_dev(const void *, size_t, | ||
82 | enum dma_data_direction); | ||
83 | |||
84 | if (!arch_is_coherent()) | ||
85 | ___dma_single_cpu_to_dev(kaddr, size, dir); | ||
86 | } | ||
87 | |||
88 | static inline void __dma_single_dev_to_cpu(const void *kaddr, size_t size, | ||
89 | enum dma_data_direction dir) | ||
90 | { | ||
91 | extern void ___dma_single_dev_to_cpu(const void *, size_t, | ||
92 | enum dma_data_direction); | ||
93 | |||
94 | if (!arch_is_coherent()) | ||
95 | ___dma_single_dev_to_cpu(kaddr, size, dir); | ||
96 | } | ||
97 | |||
98 | static inline void __dma_page_cpu_to_dev(struct page *page, unsigned long off, | ||
99 | size_t size, enum dma_data_direction dir) | ||
100 | { | ||
101 | extern void ___dma_page_cpu_to_dev(struct page *, unsigned long, | ||
102 | size_t, enum dma_data_direction); | ||
103 | |||
104 | if (!arch_is_coherent()) | ||
105 | ___dma_page_cpu_to_dev(page, off, size, dir); | ||
106 | } | ||
107 | |||
108 | static inline void __dma_page_dev_to_cpu(struct page *page, unsigned long off, | ||
109 | size_t size, enum dma_data_direction dir) | ||
110 | { | ||
111 | extern void ___dma_page_dev_to_cpu(struct page *, unsigned long, | ||
112 | size_t, enum dma_data_direction); | ||
113 | |||
114 | if (!arch_is_coherent()) | ||
115 | ___dma_page_dev_to_cpu(page, off, size, dir); | ||
116 | } | ||
117 | |||
118 | extern int dma_supported(struct device *, u64); | ||
119 | extern int dma_set_mask(struct device *, u64); | ||
120 | |||
121 | /* | ||
122 | * DMA errors are defined by all-bits-set in the DMA address. | 89 | * DMA errors are defined by all-bits-set in the DMA address. |
123 | */ | 90 | */ |
124 | static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) | 91 | static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) |
125 | { | 92 | { |
126 | return dma_addr == ~0; | 93 | return dma_addr == DMA_ERROR_CODE; |
127 | } | 94 | } |
128 | 95 | ||
129 | /* | 96 | /* |
@@ -141,69 +108,118 @@ static inline void dma_free_noncoherent(struct device *dev, size_t size, | |||
141 | { | 108 | { |
142 | } | 109 | } |
143 | 110 | ||
111 | extern int dma_supported(struct device *dev, u64 mask); | ||
112 | |||
144 | /** | 113 | /** |
145 | * dma_alloc_coherent - allocate consistent memory for DMA | 114 | * arm_dma_alloc - allocate consistent memory for DMA |
146 | * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices | 115 | * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices |
147 | * @size: required memory size | 116 | * @size: required memory size |
148 | * @handle: bus-specific DMA address | 117 | * @handle: bus-specific DMA address |
118 | * @attrs: optinal attributes that specific mapping properties | ||
149 | * | 119 | * |
150 | * Allocate some uncached, unbuffered memory for a device for | 120 | * Allocate some memory for a device for performing DMA. This function |
151 | * performing DMA. This function allocates pages, and will | 121 | * allocates pages, and will return the CPU-viewed address, and sets @handle |
152 | * return the CPU-viewed address, and sets @handle to be the | 122 | * to be the device-viewed address. |
153 | * device-viewed address. | ||
154 | */ | 123 | */ |
155 | extern void *dma_alloc_coherent(struct device *, size_t, dma_addr_t *, gfp_t); | 124 | extern void *arm_dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, |
125 | gfp_t gfp, struct dma_attrs *attrs); | ||
126 | |||
127 | #define dma_alloc_coherent(d, s, h, f) dma_alloc_attrs(d, s, h, f, NULL) | ||
128 | |||
129 | static inline void *dma_alloc_attrs(struct device *dev, size_t size, | ||
130 | dma_addr_t *dma_handle, gfp_t flag, | ||
131 | struct dma_attrs *attrs) | ||
132 | { | ||
133 | struct dma_map_ops *ops = get_dma_ops(dev); | ||
134 | void *cpu_addr; | ||
135 | BUG_ON(!ops); | ||
136 | |||
137 | cpu_addr = ops->alloc(dev, size, dma_handle, flag, attrs); | ||
138 | debug_dma_alloc_coherent(dev, size, *dma_handle, cpu_addr); | ||
139 | return cpu_addr; | ||
140 | } | ||
156 | 141 | ||
157 | /** | 142 | /** |
158 | * dma_free_coherent - free memory allocated by dma_alloc_coherent | 143 | * arm_dma_free - free memory allocated by arm_dma_alloc |
159 | * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices | 144 | * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices |
160 | * @size: size of memory originally requested in dma_alloc_coherent | 145 | * @size: size of memory originally requested in dma_alloc_coherent |
161 | * @cpu_addr: CPU-view address returned from dma_alloc_coherent | 146 | * @cpu_addr: CPU-view address returned from dma_alloc_coherent |
162 | * @handle: device-view address returned from dma_alloc_coherent | 147 | * @handle: device-view address returned from dma_alloc_coherent |
148 | * @attrs: optinal attributes that specific mapping properties | ||
163 | * | 149 | * |
164 | * Free (and unmap) a DMA buffer previously allocated by | 150 | * Free (and unmap) a DMA buffer previously allocated by |
165 | * dma_alloc_coherent(). | 151 | * arm_dma_alloc(). |
166 | * | 152 | * |
167 | * References to memory and mappings associated with cpu_addr/handle | 153 | * References to memory and mappings associated with cpu_addr/handle |
168 | * during and after this call executing are illegal. | 154 | * during and after this call executing are illegal. |
169 | */ | 155 | */ |
170 | extern void dma_free_coherent(struct device *, size_t, void *, dma_addr_t); | 156 | extern void arm_dma_free(struct device *dev, size_t size, void *cpu_addr, |
157 | dma_addr_t handle, struct dma_attrs *attrs); | ||
158 | |||
159 | #define dma_free_coherent(d, s, c, h) dma_free_attrs(d, s, c, h, NULL) | ||
160 | |||
161 | static inline void dma_free_attrs(struct device *dev, size_t size, | ||
162 | void *cpu_addr, dma_addr_t dma_handle, | ||
163 | struct dma_attrs *attrs) | ||
164 | { | ||
165 | struct dma_map_ops *ops = get_dma_ops(dev); | ||
166 | BUG_ON(!ops); | ||
167 | |||
168 | debug_dma_free_coherent(dev, size, cpu_addr, dma_handle); | ||
169 | ops->free(dev, size, cpu_addr, dma_handle, attrs); | ||
170 | } | ||
171 | 171 | ||
172 | /** | 172 | /** |
173 | * dma_mmap_coherent - map a coherent DMA allocation into user space | 173 | * arm_dma_mmap - map a coherent DMA allocation into user space |
174 | * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices | 174 | * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices |
175 | * @vma: vm_area_struct describing requested user mapping | 175 | * @vma: vm_area_struct describing requested user mapping |
176 | * @cpu_addr: kernel CPU-view address returned from dma_alloc_coherent | 176 | * @cpu_addr: kernel CPU-view address returned from dma_alloc_coherent |
177 | * @handle: device-view address returned from dma_alloc_coherent | 177 | * @handle: device-view address returned from dma_alloc_coherent |
178 | * @size: size of memory originally requested in dma_alloc_coherent | 178 | * @size: size of memory originally requested in dma_alloc_coherent |
179 | * @attrs: optinal attributes that specific mapping properties | ||
179 | * | 180 | * |
180 | * Map a coherent DMA buffer previously allocated by dma_alloc_coherent | 181 | * Map a coherent DMA buffer previously allocated by dma_alloc_coherent |
181 | * into user space. The coherent DMA buffer must not be freed by the | 182 | * into user space. The coherent DMA buffer must not be freed by the |
182 | * driver until the user space mapping has been released. | 183 | * driver until the user space mapping has been released. |
183 | */ | 184 | */ |
184 | int dma_mmap_coherent(struct device *, struct vm_area_struct *, | 185 | extern int arm_dma_mmap(struct device *dev, struct vm_area_struct *vma, |
185 | void *, dma_addr_t, size_t); | 186 | void *cpu_addr, dma_addr_t dma_addr, size_t size, |
187 | struct dma_attrs *attrs); | ||
186 | 188 | ||
189 | #define dma_mmap_coherent(d, v, c, h, s) dma_mmap_attrs(d, v, c, h, s, NULL) | ||
187 | 190 | ||
188 | /** | 191 | static inline int dma_mmap_attrs(struct device *dev, struct vm_area_struct *vma, |
189 | * dma_alloc_writecombine - allocate writecombining memory for DMA | 192 | void *cpu_addr, dma_addr_t dma_addr, |
190 | * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices | 193 | size_t size, struct dma_attrs *attrs) |
191 | * @size: required memory size | 194 | { |
192 | * @handle: bus-specific DMA address | 195 | struct dma_map_ops *ops = get_dma_ops(dev); |
193 | * | 196 | BUG_ON(!ops); |
194 | * Allocate some uncached, buffered memory for a device for | 197 | return ops->mmap(dev, vma, cpu_addr, dma_addr, size, attrs); |
195 | * performing DMA. This function allocates pages, and will | 198 | } |
196 | * return the CPU-viewed address, and sets @handle to be the | 199 | |
197 | * device-viewed address. | 200 | static inline void *dma_alloc_writecombine(struct device *dev, size_t size, |
198 | */ | 201 | dma_addr_t *dma_handle, gfp_t flag) |
199 | extern void *dma_alloc_writecombine(struct device *, size_t, dma_addr_t *, | 202 | { |
200 | gfp_t); | 203 | DEFINE_DMA_ATTRS(attrs); |
204 | dma_set_attr(DMA_ATTR_WRITE_COMBINE, &attrs); | ||
205 | return dma_alloc_attrs(dev, size, dma_handle, flag, &attrs); | ||
206 | } | ||
201 | 207 | ||
202 | #define dma_free_writecombine(dev,size,cpu_addr,handle) \ | 208 | static inline void dma_free_writecombine(struct device *dev, size_t size, |
203 | dma_free_coherent(dev,size,cpu_addr,handle) | 209 | void *cpu_addr, dma_addr_t dma_handle) |
210 | { | ||
211 | DEFINE_DMA_ATTRS(attrs); | ||
212 | dma_set_attr(DMA_ATTR_WRITE_COMBINE, &attrs); | ||
213 | return dma_free_attrs(dev, size, cpu_addr, dma_handle, &attrs); | ||
214 | } | ||
204 | 215 | ||
205 | int dma_mmap_writecombine(struct device *, struct vm_area_struct *, | 216 | static inline int dma_mmap_writecombine(struct device *dev, struct vm_area_struct *vma, |
206 | void *, dma_addr_t, size_t); | 217 | void *cpu_addr, dma_addr_t dma_addr, size_t size) |
218 | { | ||
219 | DEFINE_DMA_ATTRS(attrs); | ||
220 | dma_set_attr(DMA_ATTR_WRITE_COMBINE, &attrs); | ||
221 | return dma_mmap_attrs(dev, vma, cpu_addr, dma_addr, size, &attrs); | ||
222 | } | ||
207 | 223 | ||
208 | /* | 224 | /* |
209 | * This can be called during boot to increase the size of the consistent | 225 | * This can be called during boot to increase the size of the consistent |
@@ -212,8 +228,6 @@ int dma_mmap_writecombine(struct device *, struct vm_area_struct *, | |||
212 | */ | 228 | */ |
213 | extern void __init init_consistent_dma_size(unsigned long size); | 229 | extern void __init init_consistent_dma_size(unsigned long size); |
214 | 230 | ||
215 | |||
216 | #ifdef CONFIG_DMABOUNCE | ||
217 | /* | 231 | /* |
218 | * For SA-1111, IXP425, and ADI systems the dma-mapping functions are "magic" | 232 | * For SA-1111, IXP425, and ADI systems the dma-mapping functions are "magic" |
219 | * and utilize bounce buffers as needed to work around limited DMA windows. | 233 | * and utilize bounce buffers as needed to work around limited DMA windows. |
@@ -253,222 +267,19 @@ extern int dmabounce_register_dev(struct device *, unsigned long, | |||
253 | */ | 267 | */ |
254 | extern void dmabounce_unregister_dev(struct device *); | 268 | extern void dmabounce_unregister_dev(struct device *); |
255 | 269 | ||
256 | /* | ||
257 | * The DMA API, implemented by dmabounce.c. See below for descriptions. | ||
258 | */ | ||
259 | extern dma_addr_t __dma_map_page(struct device *, struct page *, | ||
260 | unsigned long, size_t, enum dma_data_direction); | ||
261 | extern void __dma_unmap_page(struct device *, dma_addr_t, size_t, | ||
262 | enum dma_data_direction); | ||
263 | |||
264 | /* | ||
265 | * Private functions | ||
266 | */ | ||
267 | int dmabounce_sync_for_cpu(struct device *, dma_addr_t, unsigned long, | ||
268 | size_t, enum dma_data_direction); | ||
269 | int dmabounce_sync_for_device(struct device *, dma_addr_t, unsigned long, | ||
270 | size_t, enum dma_data_direction); | ||
271 | #else | ||
272 | static inline int dmabounce_sync_for_cpu(struct device *d, dma_addr_t addr, | ||
273 | unsigned long offset, size_t size, enum dma_data_direction dir) | ||
274 | { | ||
275 | return 1; | ||
276 | } | ||
277 | 270 | ||
278 | static inline int dmabounce_sync_for_device(struct device *d, dma_addr_t addr, | ||
279 | unsigned long offset, size_t size, enum dma_data_direction dir) | ||
280 | { | ||
281 | return 1; | ||
282 | } | ||
283 | |||
284 | |||
285 | static inline dma_addr_t __dma_map_page(struct device *dev, struct page *page, | ||
286 | unsigned long offset, size_t size, enum dma_data_direction dir) | ||
287 | { | ||
288 | __dma_page_cpu_to_dev(page, offset, size, dir); | ||
289 | return pfn_to_dma(dev, page_to_pfn(page)) + offset; | ||
290 | } | ||
291 | |||
292 | static inline void __dma_unmap_page(struct device *dev, dma_addr_t handle, | ||
293 | size_t size, enum dma_data_direction dir) | ||
294 | { | ||
295 | __dma_page_dev_to_cpu(pfn_to_page(dma_to_pfn(dev, handle)), | ||
296 | handle & ~PAGE_MASK, size, dir); | ||
297 | } | ||
298 | #endif /* CONFIG_DMABOUNCE */ | ||
299 | |||
300 | /** | ||
301 | * dma_map_single - map a single buffer for streaming DMA | ||
302 | * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices | ||
303 | * @cpu_addr: CPU direct mapped address of buffer | ||
304 | * @size: size of buffer to map | ||
305 | * @dir: DMA transfer direction | ||
306 | * | ||
307 | * Ensure that any data held in the cache is appropriately discarded | ||
308 | * or written back. | ||
309 | * | ||
310 | * The device owns this memory once this call has completed. The CPU | ||
311 | * can regain ownership by calling dma_unmap_single() or | ||
312 | * dma_sync_single_for_cpu(). | ||
313 | */ | ||
314 | static inline dma_addr_t dma_map_single(struct device *dev, void *cpu_addr, | ||
315 | size_t size, enum dma_data_direction dir) | ||
316 | { | ||
317 | unsigned long offset; | ||
318 | struct page *page; | ||
319 | dma_addr_t addr; | ||
320 | |||
321 | BUG_ON(!virt_addr_valid(cpu_addr)); | ||
322 | BUG_ON(!virt_addr_valid(cpu_addr + size - 1)); | ||
323 | BUG_ON(!valid_dma_direction(dir)); | ||
324 | |||
325 | page = virt_to_page(cpu_addr); | ||
326 | offset = (unsigned long)cpu_addr & ~PAGE_MASK; | ||
327 | addr = __dma_map_page(dev, page, offset, size, dir); | ||
328 | debug_dma_map_page(dev, page, offset, size, dir, addr, true); | ||
329 | |||
330 | return addr; | ||
331 | } | ||
332 | |||
333 | /** | ||
334 | * dma_map_page - map a portion of a page for streaming DMA | ||
335 | * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices | ||
336 | * @page: page that buffer resides in | ||
337 | * @offset: offset into page for start of buffer | ||
338 | * @size: size of buffer to map | ||
339 | * @dir: DMA transfer direction | ||
340 | * | ||
341 | * Ensure that any data held in the cache is appropriately discarded | ||
342 | * or written back. | ||
343 | * | ||
344 | * The device owns this memory once this call has completed. The CPU | ||
345 | * can regain ownership by calling dma_unmap_page(). | ||
346 | */ | ||
347 | static inline dma_addr_t dma_map_page(struct device *dev, struct page *page, | ||
348 | unsigned long offset, size_t size, enum dma_data_direction dir) | ||
349 | { | ||
350 | dma_addr_t addr; | ||
351 | |||
352 | BUG_ON(!valid_dma_direction(dir)); | ||
353 | |||
354 | addr = __dma_map_page(dev, page, offset, size, dir); | ||
355 | debug_dma_map_page(dev, page, offset, size, dir, addr, false); | ||
356 | |||
357 | return addr; | ||
358 | } | ||
359 | |||
360 | /** | ||
361 | * dma_unmap_single - unmap a single buffer previously mapped | ||
362 | * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices | ||
363 | * @handle: DMA address of buffer | ||
364 | * @size: size of buffer (same as passed to dma_map_single) | ||
365 | * @dir: DMA transfer direction (same as passed to dma_map_single) | ||
366 | * | ||
367 | * Unmap a single streaming mode DMA translation. The handle and size | ||
368 | * must match what was provided in the previous dma_map_single() call. | ||
369 | * All other usages are undefined. | ||
370 | * | ||
371 | * After this call, reads by the CPU to the buffer are guaranteed to see | ||
372 | * whatever the device wrote there. | ||
373 | */ | ||
374 | static inline void dma_unmap_single(struct device *dev, dma_addr_t handle, | ||
375 | size_t size, enum dma_data_direction dir) | ||
376 | { | ||
377 | debug_dma_unmap_page(dev, handle, size, dir, true); | ||
378 | __dma_unmap_page(dev, handle, size, dir); | ||
379 | } | ||
380 | |||
381 | /** | ||
382 | * dma_unmap_page - unmap a buffer previously mapped through dma_map_page() | ||
383 | * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices | ||
384 | * @handle: DMA address of buffer | ||
385 | * @size: size of buffer (same as passed to dma_map_page) | ||
386 | * @dir: DMA transfer direction (same as passed to dma_map_page) | ||
387 | * | ||
388 | * Unmap a page streaming mode DMA translation. The handle and size | ||
389 | * must match what was provided in the previous dma_map_page() call. | ||
390 | * All other usages are undefined. | ||
391 | * | ||
392 | * After this call, reads by the CPU to the buffer are guaranteed to see | ||
393 | * whatever the device wrote there. | ||
394 | */ | ||
395 | static inline void dma_unmap_page(struct device *dev, dma_addr_t handle, | ||
396 | size_t size, enum dma_data_direction dir) | ||
397 | { | ||
398 | debug_dma_unmap_page(dev, handle, size, dir, false); | ||
399 | __dma_unmap_page(dev, handle, size, dir); | ||
400 | } | ||
401 | |||
402 | /** | ||
403 | * dma_sync_single_range_for_cpu | ||
404 | * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices | ||
405 | * @handle: DMA address of buffer | ||
406 | * @offset: offset of region to start sync | ||
407 | * @size: size of region to sync | ||
408 | * @dir: DMA transfer direction (same as passed to dma_map_single) | ||
409 | * | ||
410 | * Make physical memory consistent for a single streaming mode DMA | ||
411 | * translation after a transfer. | ||
412 | * | ||
413 | * If you perform a dma_map_single() but wish to interrogate the | ||
414 | * buffer using the cpu, yet do not wish to teardown the PCI dma | ||
415 | * mapping, you must call this function before doing so. At the | ||
416 | * next point you give the PCI dma address back to the card, you | ||
417 | * must first the perform a dma_sync_for_device, and then the | ||
418 | * device again owns the buffer. | ||
419 | */ | ||
420 | static inline void dma_sync_single_range_for_cpu(struct device *dev, | ||
421 | dma_addr_t handle, unsigned long offset, size_t size, | ||
422 | enum dma_data_direction dir) | ||
423 | { | ||
424 | BUG_ON(!valid_dma_direction(dir)); | ||
425 | |||
426 | debug_dma_sync_single_for_cpu(dev, handle + offset, size, dir); | ||
427 | |||
428 | if (!dmabounce_sync_for_cpu(dev, handle, offset, size, dir)) | ||
429 | return; | ||
430 | |||
431 | __dma_single_dev_to_cpu(dma_to_virt(dev, handle) + offset, size, dir); | ||
432 | } | ||
433 | |||
434 | static inline void dma_sync_single_range_for_device(struct device *dev, | ||
435 | dma_addr_t handle, unsigned long offset, size_t size, | ||
436 | enum dma_data_direction dir) | ||
437 | { | ||
438 | BUG_ON(!valid_dma_direction(dir)); | ||
439 | |||
440 | debug_dma_sync_single_for_device(dev, handle + offset, size, dir); | ||
441 | |||
442 | if (!dmabounce_sync_for_device(dev, handle, offset, size, dir)) | ||
443 | return; | ||
444 | |||
445 | __dma_single_cpu_to_dev(dma_to_virt(dev, handle) + offset, size, dir); | ||
446 | } | ||
447 | |||
448 | static inline void dma_sync_single_for_cpu(struct device *dev, | ||
449 | dma_addr_t handle, size_t size, enum dma_data_direction dir) | ||
450 | { | ||
451 | dma_sync_single_range_for_cpu(dev, handle, 0, size, dir); | ||
452 | } | ||
453 | |||
454 | static inline void dma_sync_single_for_device(struct device *dev, | ||
455 | dma_addr_t handle, size_t size, enum dma_data_direction dir) | ||
456 | { | ||
457 | dma_sync_single_range_for_device(dev, handle, 0, size, dir); | ||
458 | } | ||
459 | 271 | ||
460 | /* | 272 | /* |
461 | * The scatter list versions of the above methods. | 273 | * The scatter list versions of the above methods. |
462 | */ | 274 | */ |
463 | extern int dma_map_sg(struct device *, struct scatterlist *, int, | 275 | extern int arm_dma_map_sg(struct device *, struct scatterlist *, int, |
464 | enum dma_data_direction); | 276 | enum dma_data_direction, struct dma_attrs *attrs); |
465 | extern void dma_unmap_sg(struct device *, struct scatterlist *, int, | 277 | extern void arm_dma_unmap_sg(struct device *, struct scatterlist *, int, |
278 | enum dma_data_direction, struct dma_attrs *attrs); | ||
279 | extern void arm_dma_sync_sg_for_cpu(struct device *, struct scatterlist *, int, | ||
466 | enum dma_data_direction); | 280 | enum dma_data_direction); |
467 | extern void dma_sync_sg_for_cpu(struct device *, struct scatterlist *, int, | 281 | extern void arm_dma_sync_sg_for_device(struct device *, struct scatterlist *, int, |
468 | enum dma_data_direction); | 282 | enum dma_data_direction); |
469 | extern void dma_sync_sg_for_device(struct device *, struct scatterlist *, int, | ||
470 | enum dma_data_direction); | ||
471 | |||
472 | 283 | ||
473 | #endif /* __KERNEL__ */ | 284 | #endif /* __KERNEL__ */ |
474 | #endif | 285 | #endif |
diff --git a/arch/arm/include/asm/hardware/pl080.h b/arch/arm/include/asm/hardware/pl080.h index 33c78d7af2e1..4eea2107214b 100644 --- a/arch/arm/include/asm/hardware/pl080.h +++ b/arch/arm/include/asm/hardware/pl080.h | |||
@@ -102,6 +102,8 @@ | |||
102 | #define PL080_WIDTH_16BIT (0x1) | 102 | #define PL080_WIDTH_16BIT (0x1) |
103 | #define PL080_WIDTH_32BIT (0x2) | 103 | #define PL080_WIDTH_32BIT (0x2) |
104 | 104 | ||
105 | #define PL080N_CONFIG_ITPROT (1 << 20) | ||
106 | #define PL080N_CONFIG_SECPROT (1 << 19) | ||
105 | #define PL080_CONFIG_HALT (1 << 18) | 107 | #define PL080_CONFIG_HALT (1 << 18) |
106 | #define PL080_CONFIG_ACTIVE (1 << 17) /* RO */ | 108 | #define PL080_CONFIG_ACTIVE (1 << 17) /* RO */ |
107 | #define PL080_CONFIG_LOCK (1 << 16) | 109 | #define PL080_CONFIG_LOCK (1 << 16) |
diff --git a/arch/arm/include/asm/io.h b/arch/arm/include/asm/io.h index 9af5563dd3eb..815c669fec0a 100644 --- a/arch/arm/include/asm/io.h +++ b/arch/arm/include/asm/io.h | |||
@@ -47,9 +47,9 @@ extern void __raw_readsb(const void __iomem *addr, void *data, int bytelen); | |||
47 | extern void __raw_readsw(const void __iomem *addr, void *data, int wordlen); | 47 | extern void __raw_readsw(const void __iomem *addr, void *data, int wordlen); |
48 | extern void __raw_readsl(const void __iomem *addr, void *data, int longlen); | 48 | extern void __raw_readsl(const void __iomem *addr, void *data, int longlen); |
49 | 49 | ||
50 | #define __raw_writeb(v,a) (__chk_io_ptr(a), *(volatile unsigned char __force *)(a) = (v)) | 50 | #define __raw_writeb(v,a) ((void)(__chk_io_ptr(a), *(volatile unsigned char __force *)(a) = (v))) |
51 | #define __raw_writew(v,a) (__chk_io_ptr(a), *(volatile unsigned short __force *)(a) = (v)) | 51 | #define __raw_writew(v,a) ((void)(__chk_io_ptr(a), *(volatile unsigned short __force *)(a) = (v))) |
52 | #define __raw_writel(v,a) (__chk_io_ptr(a), *(volatile unsigned int __force *)(a) = (v)) | 52 | #define __raw_writel(v,a) ((void)(__chk_io_ptr(a), *(volatile unsigned int __force *)(a) = (v))) |
53 | 53 | ||
54 | #define __raw_readb(a) (__chk_io_ptr(a), *(volatile unsigned char __force *)(a)) | 54 | #define __raw_readb(a) (__chk_io_ptr(a), *(volatile unsigned char __force *)(a)) |
55 | #define __raw_readw(a) (__chk_io_ptr(a), *(volatile unsigned short __force *)(a)) | 55 | #define __raw_readw(a) (__chk_io_ptr(a), *(volatile unsigned short __force *)(a)) |
@@ -229,11 +229,9 @@ extern void _memset_io(volatile void __iomem *, int, size_t); | |||
229 | #define readl_relaxed(c) ({ u32 __r = le32_to_cpu((__force __le32) \ | 229 | #define readl_relaxed(c) ({ u32 __r = le32_to_cpu((__force __le32) \ |
230 | __raw_readl(c)); __r; }) | 230 | __raw_readl(c)); __r; }) |
231 | 231 | ||
232 | #define writeb_relaxed(v,c) ((void)__raw_writeb(v,c)) | 232 | #define writeb_relaxed(v,c) __raw_writeb(v,c) |
233 | #define writew_relaxed(v,c) ((void)__raw_writew((__force u16) \ | 233 | #define writew_relaxed(v,c) __raw_writew((__force u16) cpu_to_le16(v),c) |
234 | cpu_to_le16(v),c)) | 234 | #define writel_relaxed(v,c) __raw_writel((__force u32) cpu_to_le32(v),c) |
235 | #define writel_relaxed(v,c) ((void)__raw_writel((__force u32) \ | ||
236 | cpu_to_le32(v),c)) | ||
237 | 235 | ||
238 | #define readb(c) ({ u8 __v = readb_relaxed(c); __iormb(); __v; }) | 236 | #define readb(c) ({ u8 __v = readb_relaxed(c); __iormb(); __v; }) |
239 | #define readw(c) ({ u16 __v = readw_relaxed(c); __iormb(); __v; }) | 237 | #define readw(c) ({ u16 __v = readw_relaxed(c); __iormb(); __v; }) |
@@ -281,12 +279,12 @@ extern void _memset_io(volatile void __iomem *, int, size_t); | |||
281 | #define ioread16be(p) ({ unsigned int __v = be16_to_cpu((__force __be16)__raw_readw(p)); __iormb(); __v; }) | 279 | #define ioread16be(p) ({ unsigned int __v = be16_to_cpu((__force __be16)__raw_readw(p)); __iormb(); __v; }) |
282 | #define ioread32be(p) ({ unsigned int __v = be32_to_cpu((__force __be32)__raw_readl(p)); __iormb(); __v; }) | 280 | #define ioread32be(p) ({ unsigned int __v = be32_to_cpu((__force __be32)__raw_readl(p)); __iormb(); __v; }) |
283 | 281 | ||
284 | #define iowrite8(v,p) ({ __iowmb(); (void)__raw_writeb(v, p); }) | 282 | #define iowrite8(v,p) ({ __iowmb(); __raw_writeb(v, p); }) |
285 | #define iowrite16(v,p) ({ __iowmb(); (void)__raw_writew((__force __u16)cpu_to_le16(v), p); }) | 283 | #define iowrite16(v,p) ({ __iowmb(); __raw_writew((__force __u16)cpu_to_le16(v), p); }) |
286 | #define iowrite32(v,p) ({ __iowmb(); (void)__raw_writel((__force __u32)cpu_to_le32(v), p); }) | 284 | #define iowrite32(v,p) ({ __iowmb(); __raw_writel((__force __u32)cpu_to_le32(v), p); }) |
287 | 285 | ||
288 | #define iowrite16be(v,p) ({ __iowmb(); (void)__raw_writew((__force __u16)cpu_to_be16(v), p); }) | 286 | #define iowrite16be(v,p) ({ __iowmb(); __raw_writew((__force __u16)cpu_to_be16(v), p); }) |
289 | #define iowrite32be(v,p) ({ __iowmb(); (void)__raw_writel((__force __u32)cpu_to_be32(v), p); }) | 287 | #define iowrite32be(v,p) ({ __iowmb(); __raw_writel((__force __u32)cpu_to_be32(v), p); }) |
290 | 288 | ||
291 | #define ioread8_rep(p,d,c) __raw_readsb(p,d,c) | 289 | #define ioread8_rep(p,d,c) __raw_readsb(p,d,c) |
292 | #define ioread16_rep(p,d,c) __raw_readsw(p,d,c) | 290 | #define ioread16_rep(p,d,c) __raw_readsw(p,d,c) |
diff --git a/arch/arm/include/asm/kvm_para.h b/arch/arm/include/asm/kvm_para.h new file mode 100644 index 000000000000..14fab8f0b957 --- /dev/null +++ b/arch/arm/include/asm/kvm_para.h | |||
@@ -0,0 +1 @@ | |||
#include <asm-generic/kvm_para.h> | |||
diff --git a/arch/arm/include/asm/mach/arch.h b/arch/arm/include/asm/mach/arch.h index d7692cafde7f..0b1c94b8c652 100644 --- a/arch/arm/include/asm/mach/arch.h +++ b/arch/arm/include/asm/mach/arch.h | |||
@@ -43,6 +43,7 @@ struct machine_desc { | |||
43 | void (*init_irq)(void); | 43 | void (*init_irq)(void); |
44 | struct sys_timer *timer; /* system tick timer */ | 44 | struct sys_timer *timer; /* system tick timer */ |
45 | void (*init_machine)(void); | 45 | void (*init_machine)(void); |
46 | void (*init_late)(void); | ||
46 | #ifdef CONFIG_MULTI_IRQ_HANDLER | 47 | #ifdef CONFIG_MULTI_IRQ_HANDLER |
47 | void (*handle_irq)(struct pt_regs *); | 48 | void (*handle_irq)(struct pt_regs *); |
48 | #endif | 49 | #endif |
diff --git a/arch/arm/include/asm/mach/map.h b/arch/arm/include/asm/mach/map.h index b36f3654bf54..a6efcdd6fd25 100644 --- a/arch/arm/include/asm/mach/map.h +++ b/arch/arm/include/asm/mach/map.h | |||
@@ -30,6 +30,7 @@ struct map_desc { | |||
30 | #define MT_MEMORY_DTCM 12 | 30 | #define MT_MEMORY_DTCM 12 |
31 | #define MT_MEMORY_ITCM 13 | 31 | #define MT_MEMORY_ITCM 13 |
32 | #define MT_MEMORY_SO 14 | 32 | #define MT_MEMORY_SO 14 |
33 | #define MT_MEMORY_DMA_READY 15 | ||
33 | 34 | ||
34 | #ifdef CONFIG_MMU | 35 | #ifdef CONFIG_MMU |
35 | extern void iotable_init(struct map_desc *, int); | 36 | extern void iotable_init(struct map_desc *, int); |
diff --git a/arch/arm/include/asm/thread_info.h b/arch/arm/include/asm/thread_info.h index 68388eb4946b..b79f8e97f775 100644 --- a/arch/arm/include/asm/thread_info.h +++ b/arch/arm/include/asm/thread_info.h | |||
@@ -148,6 +148,7 @@ extern int vfp_restore_user_hwstate(struct user_vfp __user *, | |||
148 | #define TIF_NOTIFY_RESUME 2 /* callback before returning to user */ | 148 | #define TIF_NOTIFY_RESUME 2 /* callback before returning to user */ |
149 | #define TIF_SYSCALL_TRACE 8 | 149 | #define TIF_SYSCALL_TRACE 8 |
150 | #define TIF_SYSCALL_AUDIT 9 | 150 | #define TIF_SYSCALL_AUDIT 9 |
151 | #define TIF_SYSCALL_RESTARTSYS 10 | ||
151 | #define TIF_POLLING_NRFLAG 16 | 152 | #define TIF_POLLING_NRFLAG 16 |
152 | #define TIF_USING_IWMMXT 17 | 153 | #define TIF_USING_IWMMXT 17 |
153 | #define TIF_MEMDIE 18 /* is terminating due to OOM killer */ | 154 | #define TIF_MEMDIE 18 /* is terminating due to OOM killer */ |
@@ -162,16 +163,17 @@ extern int vfp_restore_user_hwstate(struct user_vfp __user *, | |||
162 | #define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT) | 163 | #define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT) |
163 | #define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG) | 164 | #define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG) |
164 | #define _TIF_USING_IWMMXT (1 << TIF_USING_IWMMXT) | 165 | #define _TIF_USING_IWMMXT (1 << TIF_USING_IWMMXT) |
165 | #define _TIF_RESTORE_SIGMASK (1 << TIF_RESTORE_SIGMASK) | ||
166 | #define _TIF_SECCOMP (1 << TIF_SECCOMP) | 166 | #define _TIF_SECCOMP (1 << TIF_SECCOMP) |
167 | #define _TIF_SYSCALL_RESTARTSYS (1 << TIF_SYSCALL_RESTARTSYS) | ||
167 | 168 | ||
168 | /* Checks for any syscall work in entry-common.S */ | 169 | /* Checks for any syscall work in entry-common.S */ |
169 | #define _TIF_SYSCALL_WORK (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT) | 170 | #define _TIF_SYSCALL_WORK (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | \ |
171 | _TIF_SYSCALL_RESTARTSYS) | ||
170 | 172 | ||
171 | /* | 173 | /* |
172 | * Change these and you break ASM code in entry-common.S | 174 | * Change these and you break ASM code in entry-common.S |
173 | */ | 175 | */ |
174 | #define _TIF_WORK_MASK 0x000000ff | 176 | #define _TIF_WORK_MASK (_TIF_NEED_RESCHED | _TIF_SIGPENDING | _TIF_NOTIFY_RESUME) |
175 | 177 | ||
176 | #endif /* __KERNEL__ */ | 178 | #endif /* __KERNEL__ */ |
177 | #endif /* __ASM_ARM_THREAD_INFO_H */ | 179 | #endif /* __ASM_ARM_THREAD_INFO_H */ |
diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index 7bd2d3cb8957..4afed88d250a 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S | |||
@@ -53,9 +53,13 @@ fast_work_pending: | |||
53 | work_pending: | 53 | work_pending: |
54 | tst r1, #_TIF_NEED_RESCHED | 54 | tst r1, #_TIF_NEED_RESCHED |
55 | bne work_resched | 55 | bne work_resched |
56 | tst r1, #_TIF_SIGPENDING|_TIF_NOTIFY_RESUME | 56 | /* |
57 | beq no_work_pending | 57 | * TIF_SIGPENDING or TIF_NOTIFY_RESUME must've been set if we got here |
58 | */ | ||
59 | ldr r2, [sp, #S_PSR] | ||
58 | mov r0, sp @ 'regs' | 60 | mov r0, sp @ 'regs' |
61 | tst r2, #15 @ are we returning to user mode? | ||
62 | bne no_work_pending @ no? just leave, then... | ||
59 | mov r2, why @ 'syscall' | 63 | mov r2, why @ 'syscall' |
60 | tst r1, #_TIF_SIGPENDING @ delivering a signal? | 64 | tst r1, #_TIF_SIGPENDING @ delivering a signal? |
61 | movne why, #0 @ prevent further restarts | 65 | movne why, #0 @ prevent further restarts |
diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c index 14e38261cd31..5700a7ae7f0b 100644 --- a/arch/arm/kernel/ptrace.c +++ b/arch/arm/kernel/ptrace.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/regset.h> | 25 | #include <linux/regset.h> |
26 | #include <linux/audit.h> | 26 | #include <linux/audit.h> |
27 | #include <linux/tracehook.h> | 27 | #include <linux/tracehook.h> |
28 | #include <linux/unistd.h> | ||
28 | 29 | ||
29 | #include <asm/pgtable.h> | 30 | #include <asm/pgtable.h> |
30 | #include <asm/traps.h> | 31 | #include <asm/traps.h> |
@@ -917,6 +918,8 @@ asmlinkage int syscall_trace(int why, struct pt_regs *regs, int scno) | |||
917 | audit_syscall_entry(AUDIT_ARCH_ARM, scno, regs->ARM_r0, | 918 | audit_syscall_entry(AUDIT_ARCH_ARM, scno, regs->ARM_r0, |
918 | regs->ARM_r1, regs->ARM_r2, regs->ARM_r3); | 919 | regs->ARM_r1, regs->ARM_r2, regs->ARM_r3); |
919 | 920 | ||
921 | if (why == 0 && test_and_clear_thread_flag(TIF_SYSCALL_RESTARTSYS)) | ||
922 | scno = __NR_restart_syscall - __NR_SYSCALL_BASE; | ||
920 | if (!test_thread_flag(TIF_SYSCALL_TRACE)) | 923 | if (!test_thread_flag(TIF_SYSCALL_TRACE)) |
921 | return scno; | 924 | return scno; |
922 | 925 | ||
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index ebfac782593f..e15d83bb4ea3 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c | |||
@@ -81,6 +81,7 @@ __setup("fpe=", fpe_setup); | |||
81 | extern void paging_init(struct machine_desc *desc); | 81 | extern void paging_init(struct machine_desc *desc); |
82 | extern void sanity_check_meminfo(void); | 82 | extern void sanity_check_meminfo(void); |
83 | extern void reboot_setup(char *str); | 83 | extern void reboot_setup(char *str); |
84 | extern void setup_dma_zone(struct machine_desc *desc); | ||
84 | 85 | ||
85 | unsigned int processor_id; | 86 | unsigned int processor_id; |
86 | EXPORT_SYMBOL(processor_id); | 87 | EXPORT_SYMBOL(processor_id); |
@@ -800,6 +801,14 @@ static int __init customize_machine(void) | |||
800 | } | 801 | } |
801 | arch_initcall(customize_machine); | 802 | arch_initcall(customize_machine); |
802 | 803 | ||
804 | static int __init init_machine_late(void) | ||
805 | { | ||
806 | if (machine_desc->init_late) | ||
807 | machine_desc->init_late(); | ||
808 | return 0; | ||
809 | } | ||
810 | late_initcall(init_machine_late); | ||
811 | |||
803 | #ifdef CONFIG_KEXEC | 812 | #ifdef CONFIG_KEXEC |
804 | static inline unsigned long long get_total_mem(void) | 813 | static inline unsigned long long get_total_mem(void) |
805 | { | 814 | { |
@@ -939,12 +948,8 @@ void __init setup_arch(char **cmdline_p) | |||
939 | machine_desc = mdesc; | 948 | machine_desc = mdesc; |
940 | machine_name = mdesc->name; | 949 | machine_name = mdesc->name; |
941 | 950 | ||
942 | #ifdef CONFIG_ZONE_DMA | 951 | setup_dma_zone(mdesc); |
943 | if (mdesc->dma_zone_size) { | 952 | |
944 | extern unsigned long arm_dma_zone_size; | ||
945 | arm_dma_zone_size = mdesc->dma_zone_size; | ||
946 | } | ||
947 | #endif | ||
948 | if (mdesc->restart_mode) | 953 | if (mdesc->restart_mode) |
949 | reboot_setup(&mdesc->restart_mode); | 954 | reboot_setup(&mdesc->restart_mode); |
950 | 955 | ||
diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c index 4e5fdd9bd9e3..17fc36c41cff 100644 --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c | |||
@@ -29,7 +29,6 @@ | |||
29 | */ | 29 | */ |
30 | #define SWI_SYS_SIGRETURN (0xef000000|(__NR_sigreturn)|(__NR_OABI_SYSCALL_BASE)) | 30 | #define SWI_SYS_SIGRETURN (0xef000000|(__NR_sigreturn)|(__NR_OABI_SYSCALL_BASE)) |
31 | #define SWI_SYS_RT_SIGRETURN (0xef000000|(__NR_rt_sigreturn)|(__NR_OABI_SYSCALL_BASE)) | 31 | #define SWI_SYS_RT_SIGRETURN (0xef000000|(__NR_rt_sigreturn)|(__NR_OABI_SYSCALL_BASE)) |
32 | #define SWI_SYS_RESTART (0xef000000|__NR_restart_syscall|__NR_OABI_SYSCALL_BASE) | ||
33 | 32 | ||
34 | /* | 33 | /* |
35 | * With EABI, the syscall number has to be loaded into r7. | 34 | * With EABI, the syscall number has to be loaded into r7. |
@@ -50,18 +49,6 @@ const unsigned long sigreturn_codes[7] = { | |||
50 | }; | 49 | }; |
51 | 50 | ||
52 | /* | 51 | /* |
53 | * Either we support OABI only, or we have EABI with the OABI | ||
54 | * compat layer enabled. In the later case we don't know if | ||
55 | * user space is EABI or not, and if not we must not clobber r7. | ||
56 | * Always using the OABI syscall solves that issue and works for | ||
57 | * all those cases. | ||
58 | */ | ||
59 | const unsigned long syscall_restart_code[2] = { | ||
60 | SWI_SYS_RESTART, /* swi __NR_restart_syscall */ | ||
61 | 0xe49df004, /* ldr pc, [sp], #4 */ | ||
62 | }; | ||
63 | |||
64 | /* | ||
65 | * atomically swap in the new signal mask, and wait for a signal. | 52 | * atomically swap in the new signal mask, and wait for a signal. |
66 | */ | 53 | */ |
67 | asmlinkage int sys_sigsuspend(int restart, unsigned long oldmask, old_sigset_t mask) | 54 | asmlinkage int sys_sigsuspend(int restart, unsigned long oldmask, old_sigset_t mask) |
@@ -82,10 +69,10 @@ sys_sigaction(int sig, const struct old_sigaction __user *act, | |||
82 | old_sigset_t mask; | 69 | old_sigset_t mask; |
83 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || | 70 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || |
84 | __get_user(new_ka.sa.sa_handler, &act->sa_handler) || | 71 | __get_user(new_ka.sa.sa_handler, &act->sa_handler) || |
85 | __get_user(new_ka.sa.sa_restorer, &act->sa_restorer)) | 72 | __get_user(new_ka.sa.sa_restorer, &act->sa_restorer) || |
73 | __get_user(new_ka.sa.sa_flags, &act->sa_flags) || | ||
74 | __get_user(mask, &act->sa_mask)) | ||
86 | return -EFAULT; | 75 | return -EFAULT; |
87 | __get_user(new_ka.sa.sa_flags, &act->sa_flags); | ||
88 | __get_user(mask, &act->sa_mask); | ||
89 | siginitset(&new_ka.sa.sa_mask, mask); | 76 | siginitset(&new_ka.sa.sa_mask, mask); |
90 | } | 77 | } |
91 | 78 | ||
@@ -94,10 +81,10 @@ sys_sigaction(int sig, const struct old_sigaction __user *act, | |||
94 | if (!ret && oact) { | 81 | if (!ret && oact) { |
95 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || | 82 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || |
96 | __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || | 83 | __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || |
97 | __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer)) | 84 | __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer) || |
85 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags) || | ||
86 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask)) | ||
98 | return -EFAULT; | 87 | return -EFAULT; |
99 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags); | ||
100 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask); | ||
101 | } | 88 | } |
102 | 89 | ||
103 | return ret; | 90 | return ret; |
@@ -602,15 +589,6 @@ static void do_signal(struct pt_regs *regs, int syscall) | |||
602 | int signr; | 589 | int signr; |
603 | 590 | ||
604 | /* | 591 | /* |
605 | * We want the common case to go fast, which | ||
606 | * is why we may in certain cases get here from | ||
607 | * kernel mode. Just return without doing anything | ||
608 | * if so. | ||
609 | */ | ||
610 | if (!user_mode(regs)) | ||
611 | return; | ||
612 | |||
613 | /* | ||
614 | * If we were from a system call, check for system call restarting... | 592 | * If we were from a system call, check for system call restarting... |
615 | */ | 593 | */ |
616 | if (syscall) { | 594 | if (syscall) { |
@@ -626,18 +604,13 @@ static void do_signal(struct pt_regs *regs, int syscall) | |||
626 | case -ERESTARTNOHAND: | 604 | case -ERESTARTNOHAND: |
627 | case -ERESTARTSYS: | 605 | case -ERESTARTSYS: |
628 | case -ERESTARTNOINTR: | 606 | case -ERESTARTNOINTR: |
607 | case -ERESTART_RESTARTBLOCK: | ||
629 | regs->ARM_r0 = regs->ARM_ORIG_r0; | 608 | regs->ARM_r0 = regs->ARM_ORIG_r0; |
630 | regs->ARM_pc = restart_addr; | 609 | regs->ARM_pc = restart_addr; |
631 | break; | 610 | break; |
632 | case -ERESTART_RESTARTBLOCK: | ||
633 | regs->ARM_r0 = -EINTR; | ||
634 | break; | ||
635 | } | 611 | } |
636 | } | 612 | } |
637 | 613 | ||
638 | if (try_to_freeze()) | ||
639 | goto no_signal; | ||
640 | |||
641 | /* | 614 | /* |
642 | * Get the signal to deliver. When running under ptrace, at this | 615 | * Get the signal to deliver. When running under ptrace, at this |
643 | * point the debugger may change all our registers ... | 616 | * point the debugger may change all our registers ... |
@@ -652,12 +625,14 @@ static void do_signal(struct pt_regs *regs, int syscall) | |||
652 | * debugger has chosen to restart at a different PC. | 625 | * debugger has chosen to restart at a different PC. |
653 | */ | 626 | */ |
654 | if (regs->ARM_pc == restart_addr) { | 627 | if (regs->ARM_pc == restart_addr) { |
655 | if (retval == -ERESTARTNOHAND | 628 | if (retval == -ERESTARTNOHAND || |
629 | retval == -ERESTART_RESTARTBLOCK | ||
656 | || (retval == -ERESTARTSYS | 630 | || (retval == -ERESTARTSYS |
657 | && !(ka.sa.sa_flags & SA_RESTART))) { | 631 | && !(ka.sa.sa_flags & SA_RESTART))) { |
658 | regs->ARM_r0 = -EINTR; | 632 | regs->ARM_r0 = -EINTR; |
659 | regs->ARM_pc = continue_addr; | 633 | regs->ARM_pc = continue_addr; |
660 | } | 634 | } |
635 | clear_thread_flag(TIF_SYSCALL_RESTARTSYS); | ||
661 | } | 636 | } |
662 | 637 | ||
663 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | 638 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) |
@@ -677,7 +652,6 @@ static void do_signal(struct pt_regs *regs, int syscall) | |||
677 | return; | 652 | return; |
678 | } | 653 | } |
679 | 654 | ||
680 | no_signal: | ||
681 | if (syscall) { | 655 | if (syscall) { |
682 | /* | 656 | /* |
683 | * Handle restarting a different system call. As above, | 657 | * Handle restarting a different system call. As above, |
@@ -685,38 +659,15 @@ static void do_signal(struct pt_regs *regs, int syscall) | |||
685 | * ignore the restart. | 659 | * ignore the restart. |
686 | */ | 660 | */ |
687 | if (retval == -ERESTART_RESTARTBLOCK | 661 | if (retval == -ERESTART_RESTARTBLOCK |
688 | && regs->ARM_pc == continue_addr) { | 662 | && regs->ARM_pc == restart_addr) |
689 | if (thumb_mode(regs)) { | 663 | set_thread_flag(TIF_SYSCALL_RESTARTSYS); |
690 | regs->ARM_r7 = __NR_restart_syscall - __NR_SYSCALL_BASE; | ||
691 | regs->ARM_pc -= 2; | ||
692 | } else { | ||
693 | #if defined(CONFIG_AEABI) && !defined(CONFIG_OABI_COMPAT) | ||
694 | regs->ARM_r7 = __NR_restart_syscall; | ||
695 | regs->ARM_pc -= 4; | ||
696 | #else | ||
697 | u32 __user *usp; | ||
698 | |||
699 | regs->ARM_sp -= 4; | ||
700 | usp = (u32 __user *)regs->ARM_sp; | ||
701 | |||
702 | if (put_user(regs->ARM_pc, usp) == 0) { | ||
703 | regs->ARM_pc = KERN_RESTART_CODE; | ||
704 | } else { | ||
705 | regs->ARM_sp += 4; | ||
706 | force_sigsegv(0, current); | ||
707 | } | ||
708 | #endif | ||
709 | } | ||
710 | } | ||
711 | |||
712 | /* If there's no signal to deliver, we just put the saved sigmask | ||
713 | * back. | ||
714 | */ | ||
715 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) { | ||
716 | clear_thread_flag(TIF_RESTORE_SIGMASK); | ||
717 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); | ||
718 | } | ||
719 | } | 664 | } |
665 | |||
666 | /* If there's no signal to deliver, we just put the saved sigmask | ||
667 | * back. | ||
668 | */ | ||
669 | if (test_and_clear_thread_flag(TIF_RESTORE_SIGMASK)) | ||
670 | set_current_blocked(¤t->saved_sigmask); | ||
720 | } | 671 | } |
721 | 672 | ||
722 | asmlinkage void | 673 | asmlinkage void |
diff --git a/arch/arm/kernel/signal.h b/arch/arm/kernel/signal.h index 6fcfe8398aa4..5ff067b7c752 100644 --- a/arch/arm/kernel/signal.h +++ b/arch/arm/kernel/signal.h | |||
@@ -8,7 +8,5 @@ | |||
8 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
9 | */ | 9 | */ |
10 | #define KERN_SIGRETURN_CODE (CONFIG_VECTORS_BASE + 0x00000500) | 10 | #define KERN_SIGRETURN_CODE (CONFIG_VECTORS_BASE + 0x00000500) |
11 | #define KERN_RESTART_CODE (KERN_SIGRETURN_CODE + sizeof(sigreturn_codes)) | ||
12 | 11 | ||
13 | extern const unsigned long sigreturn_codes[7]; | 12 | extern const unsigned long sigreturn_codes[7]; |
14 | extern const unsigned long syscall_restart_code[2]; | ||
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index 3647170e9a16..4928d89758f4 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c | |||
@@ -820,8 +820,6 @@ void __init early_trap_init(void *vectors_base) | |||
820 | */ | 820 | */ |
821 | memcpy((void *)(vectors + KERN_SIGRETURN_CODE - CONFIG_VECTORS_BASE), | 821 | memcpy((void *)(vectors + KERN_SIGRETURN_CODE - CONFIG_VECTORS_BASE), |
822 | sigreturn_codes, sizeof(sigreturn_codes)); | 822 | sigreturn_codes, sizeof(sigreturn_codes)); |
823 | memcpy((void *)(vectors + KERN_RESTART_CODE - CONFIG_VECTORS_BASE), | ||
824 | syscall_restart_code, sizeof(syscall_restart_code)); | ||
825 | 823 | ||
826 | flush_icache_range(vectors, vectors + PAGE_SIZE); | 824 | flush_icache_range(vectors, vectors + PAGE_SIZE); |
827 | modify_domain(DOMAIN_USER, DOMAIN_CLIENT); | 825 | modify_domain(DOMAIN_USER, DOMAIN_CLIENT); |
diff --git a/arch/arm/mach-at91/at91sam9g45_devices.c b/arch/arm/mach-at91/at91sam9g45_devices.c index f6747246d649..933fc9afe7d0 100644 --- a/arch/arm/mach-at91/at91sam9g45_devices.c +++ b/arch/arm/mach-at91/at91sam9g45_devices.c | |||
@@ -436,7 +436,6 @@ void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data) | |||
436 | atslave->dma_dev = &at_hdmac_device.dev; | 436 | atslave->dma_dev = &at_hdmac_device.dev; |
437 | atslave->cfg = ATC_FIFOCFG_HALFFIFO | 437 | atslave->cfg = ATC_FIFOCFG_HALFFIFO |
438 | | ATC_SRC_H2SEL_HW | ATC_DST_H2SEL_HW; | 438 | | ATC_SRC_H2SEL_HW | ATC_DST_H2SEL_HW; |
439 | atslave->ctrla = ATC_SCSIZE_16 | ATC_DCSIZE_16; | ||
440 | if (mmc_id == 0) /* MCI0 */ | 439 | if (mmc_id == 0) /* MCI0 */ |
441 | atslave->cfg |= ATC_SRC_PER(AT_DMA_ID_MCI0) | 440 | atslave->cfg |= ATC_SRC_PER(AT_DMA_ID_MCI0) |
442 | | ATC_DST_PER(AT_DMA_ID_MCI0); | 441 | | ATC_DST_PER(AT_DMA_ID_MCI0); |
diff --git a/arch/arm/mach-at91/include/mach/at_hdmac.h b/arch/arm/mach-at91/include/mach/at_hdmac.h index fff48d1a0f4e..cab0997be3de 100644 --- a/arch/arm/mach-at91/include/mach/at_hdmac.h +++ b/arch/arm/mach-at91/include/mach/at_hdmac.h | |||
@@ -26,18 +26,11 @@ struct at_dma_platform_data { | |||
26 | /** | 26 | /** |
27 | * struct at_dma_slave - Controller-specific information about a slave | 27 | * struct at_dma_slave - Controller-specific information about a slave |
28 | * @dma_dev: required DMA master device | 28 | * @dma_dev: required DMA master device |
29 | * @tx_reg: physical address of data register used for | ||
30 | * memory-to-peripheral transfers | ||
31 | * @rx_reg: physical address of data register used for | ||
32 | * peripheral-to-memory transfers | ||
33 | * @reg_width: peripheral register width | ||
34 | * @cfg: Platform-specific initializer for the CFG register | 29 | * @cfg: Platform-specific initializer for the CFG register |
35 | * @ctrla: Platform-specific initializer for the CTRLA register | ||
36 | */ | 30 | */ |
37 | struct at_dma_slave { | 31 | struct at_dma_slave { |
38 | struct device *dma_dev; | 32 | struct device *dma_dev; |
39 | u32 cfg; | 33 | u32 cfg; |
40 | u32 ctrla; | ||
41 | }; | 34 | }; |
42 | 35 | ||
43 | 36 | ||
@@ -64,24 +57,5 @@ struct at_dma_slave { | |||
64 | #define ATC_FIFOCFG_HALFFIFO (0x1 << 28) | 57 | #define ATC_FIFOCFG_HALFFIFO (0x1 << 28) |
65 | #define ATC_FIFOCFG_ENOUGHSPACE (0x2 << 28) | 58 | #define ATC_FIFOCFG_ENOUGHSPACE (0x2 << 28) |
66 | 59 | ||
67 | /* Platform-configurable bits in CTRLA */ | ||
68 | #define ATC_SCSIZE_MASK (0x7 << 16) /* Source Chunk Transfer Size */ | ||
69 | #define ATC_SCSIZE_1 (0x0 << 16) | ||
70 | #define ATC_SCSIZE_4 (0x1 << 16) | ||
71 | #define ATC_SCSIZE_8 (0x2 << 16) | ||
72 | #define ATC_SCSIZE_16 (0x3 << 16) | ||
73 | #define ATC_SCSIZE_32 (0x4 << 16) | ||
74 | #define ATC_SCSIZE_64 (0x5 << 16) | ||
75 | #define ATC_SCSIZE_128 (0x6 << 16) | ||
76 | #define ATC_SCSIZE_256 (0x7 << 16) | ||
77 | #define ATC_DCSIZE_MASK (0x7 << 20) /* Destination Chunk Transfer Size */ | ||
78 | #define ATC_DCSIZE_1 (0x0 << 20) | ||
79 | #define ATC_DCSIZE_4 (0x1 << 20) | ||
80 | #define ATC_DCSIZE_8 (0x2 << 20) | ||
81 | #define ATC_DCSIZE_16 (0x3 << 20) | ||
82 | #define ATC_DCSIZE_32 (0x4 << 20) | ||
83 | #define ATC_DCSIZE_64 (0x5 << 20) | ||
84 | #define ATC_DCSIZE_128 (0x6 << 20) | ||
85 | #define ATC_DCSIZE_256 (0x7 << 20) | ||
86 | 60 | ||
87 | #endif /* AT_HDMAC_H */ | 61 | #endif /* AT_HDMAC_H */ |
diff --git a/arch/arm/mach-davinci/board-da830-evm.c b/arch/arm/mach-davinci/board-da830-evm.c index dc1afe5be20c..0031864e7f11 100644 --- a/arch/arm/mach-davinci/board-da830-evm.c +++ b/arch/arm/mach-davinci/board-da830-evm.c | |||
@@ -681,6 +681,7 @@ MACHINE_START(DAVINCI_DA830_EVM, "DaVinci DA830/OMAP-L137/AM17x EVM") | |||
681 | .init_irq = cp_intc_init, | 681 | .init_irq = cp_intc_init, |
682 | .timer = &davinci_timer, | 682 | .timer = &davinci_timer, |
683 | .init_machine = da830_evm_init, | 683 | .init_machine = da830_evm_init, |
684 | .init_late = davinci_init_late, | ||
684 | .dma_zone_size = SZ_128M, | 685 | .dma_zone_size = SZ_128M, |
685 | .restart = da8xx_restart, | 686 | .restart = da8xx_restart, |
686 | MACHINE_END | 687 | MACHINE_END |
diff --git a/arch/arm/mach-davinci/board-da850-evm.c b/arch/arm/mach-davinci/board-da850-evm.c index 09f61073c8d9..0149fb453be3 100644 --- a/arch/arm/mach-davinci/board-da850-evm.c +++ b/arch/arm/mach-davinci/board-da850-evm.c | |||
@@ -1411,6 +1411,7 @@ MACHINE_START(DAVINCI_DA850_EVM, "DaVinci DA850/OMAP-L138/AM18x EVM") | |||
1411 | .init_irq = cp_intc_init, | 1411 | .init_irq = cp_intc_init, |
1412 | .timer = &davinci_timer, | 1412 | .timer = &davinci_timer, |
1413 | .init_machine = da850_evm_init, | 1413 | .init_machine = da850_evm_init, |
1414 | .init_late = davinci_init_late, | ||
1414 | .dma_zone_size = SZ_128M, | 1415 | .dma_zone_size = SZ_128M, |
1415 | .restart = da8xx_restart, | 1416 | .restart = da8xx_restart, |
1416 | MACHINE_END | 1417 | MACHINE_END |
diff --git a/arch/arm/mach-davinci/board-dm355-evm.c b/arch/arm/mach-davinci/board-dm355-evm.c index 82ed753fb360..1c7b1f46a8f3 100644 --- a/arch/arm/mach-davinci/board-dm355-evm.c +++ b/arch/arm/mach-davinci/board-dm355-evm.c | |||
@@ -357,6 +357,7 @@ MACHINE_START(DAVINCI_DM355_EVM, "DaVinci DM355 EVM") | |||
357 | .init_irq = davinci_irq_init, | 357 | .init_irq = davinci_irq_init, |
358 | .timer = &davinci_timer, | 358 | .timer = &davinci_timer, |
359 | .init_machine = dm355_evm_init, | 359 | .init_machine = dm355_evm_init, |
360 | .init_late = davinci_init_late, | ||
360 | .dma_zone_size = SZ_128M, | 361 | .dma_zone_size = SZ_128M, |
361 | .restart = davinci_restart, | 362 | .restart = davinci_restart, |
362 | MACHINE_END | 363 | MACHINE_END |
diff --git a/arch/arm/mach-davinci/board-dm355-leopard.c b/arch/arm/mach-davinci/board-dm355-leopard.c index d74a8b3445fb..8e7703213b08 100644 --- a/arch/arm/mach-davinci/board-dm355-leopard.c +++ b/arch/arm/mach-davinci/board-dm355-leopard.c | |||
@@ -276,6 +276,7 @@ MACHINE_START(DM355_LEOPARD, "DaVinci DM355 leopard") | |||
276 | .init_irq = davinci_irq_init, | 276 | .init_irq = davinci_irq_init, |
277 | .timer = &davinci_timer, | 277 | .timer = &davinci_timer, |
278 | .init_machine = dm355_leopard_init, | 278 | .init_machine = dm355_leopard_init, |
279 | .init_late = davinci_init_late, | ||
279 | .dma_zone_size = SZ_128M, | 280 | .dma_zone_size = SZ_128M, |
280 | .restart = davinci_restart, | 281 | .restart = davinci_restart, |
281 | MACHINE_END | 282 | MACHINE_END |
diff --git a/arch/arm/mach-davinci/board-dm365-evm.c b/arch/arm/mach-davinci/board-dm365-evm.c index 5bce2b83bb4f..688a9c556dc9 100644 --- a/arch/arm/mach-davinci/board-dm365-evm.c +++ b/arch/arm/mach-davinci/board-dm365-evm.c | |||
@@ -618,6 +618,7 @@ MACHINE_START(DAVINCI_DM365_EVM, "DaVinci DM365 EVM") | |||
618 | .init_irq = davinci_irq_init, | 618 | .init_irq = davinci_irq_init, |
619 | .timer = &davinci_timer, | 619 | .timer = &davinci_timer, |
620 | .init_machine = dm365_evm_init, | 620 | .init_machine = dm365_evm_init, |
621 | .init_late = davinci_init_late, | ||
621 | .dma_zone_size = SZ_128M, | 622 | .dma_zone_size = SZ_128M, |
622 | .restart = davinci_restart, | 623 | .restart = davinci_restart, |
623 | MACHINE_END | 624 | MACHINE_END |
diff --git a/arch/arm/mach-davinci/board-dm644x-evm.c b/arch/arm/mach-davinci/board-dm644x-evm.c index 3683306e0245..d34ed55912b2 100644 --- a/arch/arm/mach-davinci/board-dm644x-evm.c +++ b/arch/arm/mach-davinci/board-dm644x-evm.c | |||
@@ -825,6 +825,7 @@ MACHINE_START(DAVINCI_EVM, "DaVinci DM644x EVM") | |||
825 | .init_irq = davinci_irq_init, | 825 | .init_irq = davinci_irq_init, |
826 | .timer = &davinci_timer, | 826 | .timer = &davinci_timer, |
827 | .init_machine = davinci_evm_init, | 827 | .init_machine = davinci_evm_init, |
828 | .init_late = davinci_init_late, | ||
828 | .dma_zone_size = SZ_128M, | 829 | .dma_zone_size = SZ_128M, |
829 | .restart = davinci_restart, | 830 | .restart = davinci_restart, |
830 | MACHINE_END | 831 | MACHINE_END |
diff --git a/arch/arm/mach-davinci/board-dm646x-evm.c b/arch/arm/mach-davinci/board-dm646x-evm.c index d72ab948d630..958679a20e13 100644 --- a/arch/arm/mach-davinci/board-dm646x-evm.c +++ b/arch/arm/mach-davinci/board-dm646x-evm.c | |||
@@ -788,6 +788,7 @@ MACHINE_START(DAVINCI_DM6467_EVM, "DaVinci DM646x EVM") | |||
788 | .init_irq = davinci_irq_init, | 788 | .init_irq = davinci_irq_init, |
789 | .timer = &davinci_timer, | 789 | .timer = &davinci_timer, |
790 | .init_machine = evm_init, | 790 | .init_machine = evm_init, |
791 | .init_late = davinci_init_late, | ||
791 | .dma_zone_size = SZ_128M, | 792 | .dma_zone_size = SZ_128M, |
792 | .restart = davinci_restart, | 793 | .restart = davinci_restart, |
793 | MACHINE_END | 794 | MACHINE_END |
@@ -798,6 +799,7 @@ MACHINE_START(DAVINCI_DM6467TEVM, "DaVinci DM6467T EVM") | |||
798 | .init_irq = davinci_irq_init, | 799 | .init_irq = davinci_irq_init, |
799 | .timer = &davinci_timer, | 800 | .timer = &davinci_timer, |
800 | .init_machine = evm_init, | 801 | .init_machine = evm_init, |
802 | .init_late = davinci_init_late, | ||
801 | .dma_zone_size = SZ_128M, | 803 | .dma_zone_size = SZ_128M, |
802 | .restart = davinci_restart, | 804 | .restart = davinci_restart, |
803 | MACHINE_END | 805 | MACHINE_END |
diff --git a/arch/arm/mach-davinci/board-mityomapl138.c b/arch/arm/mach-davinci/board-mityomapl138.c index 672d820e2aa4..beecde3a1d2f 100644 --- a/arch/arm/mach-davinci/board-mityomapl138.c +++ b/arch/arm/mach-davinci/board-mityomapl138.c | |||
@@ -572,6 +572,7 @@ MACHINE_START(MITYOMAPL138, "MityDSP-L138/MityARM-1808") | |||
572 | .init_irq = cp_intc_init, | 572 | .init_irq = cp_intc_init, |
573 | .timer = &davinci_timer, | 573 | .timer = &davinci_timer, |
574 | .init_machine = mityomapl138_init, | 574 | .init_machine = mityomapl138_init, |
575 | .init_late = davinci_init_late, | ||
575 | .dma_zone_size = SZ_128M, | 576 | .dma_zone_size = SZ_128M, |
576 | .restart = da8xx_restart, | 577 | .restart = da8xx_restart, |
577 | MACHINE_END | 578 | MACHINE_END |
diff --git a/arch/arm/mach-davinci/board-neuros-osd2.c b/arch/arm/mach-davinci/board-neuros-osd2.c index a772bb45570a..5de69f2fcca9 100644 --- a/arch/arm/mach-davinci/board-neuros-osd2.c +++ b/arch/arm/mach-davinci/board-neuros-osd2.c | |||
@@ -278,6 +278,7 @@ MACHINE_START(NEUROS_OSD2, "Neuros OSD2") | |||
278 | .init_irq = davinci_irq_init, | 278 | .init_irq = davinci_irq_init, |
279 | .timer = &davinci_timer, | 279 | .timer = &davinci_timer, |
280 | .init_machine = davinci_ntosd2_init, | 280 | .init_machine = davinci_ntosd2_init, |
281 | .init_late = davinci_init_late, | ||
281 | .dma_zone_size = SZ_128M, | 282 | .dma_zone_size = SZ_128M, |
282 | .restart = davinci_restart, | 283 | .restart = davinci_restart, |
283 | MACHINE_END | 284 | MACHINE_END |
diff --git a/arch/arm/mach-davinci/board-omapl138-hawk.c b/arch/arm/mach-davinci/board-omapl138-hawk.c index 45e815760a27..dc1208e9e664 100644 --- a/arch/arm/mach-davinci/board-omapl138-hawk.c +++ b/arch/arm/mach-davinci/board-omapl138-hawk.c | |||
@@ -343,6 +343,7 @@ MACHINE_START(OMAPL138_HAWKBOARD, "AM18x/OMAP-L138 Hawkboard") | |||
343 | .init_irq = cp_intc_init, | 343 | .init_irq = cp_intc_init, |
344 | .timer = &davinci_timer, | 344 | .timer = &davinci_timer, |
345 | .init_machine = omapl138_hawk_init, | 345 | .init_machine = omapl138_hawk_init, |
346 | .init_late = davinci_init_late, | ||
346 | .dma_zone_size = SZ_128M, | 347 | .dma_zone_size = SZ_128M, |
347 | .restart = da8xx_restart, | 348 | .restart = da8xx_restart, |
348 | MACHINE_END | 349 | MACHINE_END |
diff --git a/arch/arm/mach-davinci/board-sffsdr.c b/arch/arm/mach-davinci/board-sffsdr.c index 76e675096104..9078acf94bac 100644 --- a/arch/arm/mach-davinci/board-sffsdr.c +++ b/arch/arm/mach-davinci/board-sffsdr.c | |||
@@ -157,6 +157,7 @@ MACHINE_START(SFFSDR, "Lyrtech SFFSDR") | |||
157 | .init_irq = davinci_irq_init, | 157 | .init_irq = davinci_irq_init, |
158 | .timer = &davinci_timer, | 158 | .timer = &davinci_timer, |
159 | .init_machine = davinci_sffsdr_init, | 159 | .init_machine = davinci_sffsdr_init, |
160 | .init_late = davinci_init_late, | ||
160 | .dma_zone_size = SZ_128M, | 161 | .dma_zone_size = SZ_128M, |
161 | .restart = davinci_restart, | 162 | .restart = davinci_restart, |
162 | MACHINE_END | 163 | MACHINE_END |
diff --git a/arch/arm/mach-davinci/board-tnetv107x-evm.c b/arch/arm/mach-davinci/board-tnetv107x-evm.c index 5f14e30b00d8..ac4e003ad863 100644 --- a/arch/arm/mach-davinci/board-tnetv107x-evm.c +++ b/arch/arm/mach-davinci/board-tnetv107x-evm.c | |||
@@ -282,6 +282,7 @@ MACHINE_START(TNETV107X, "TNETV107X EVM") | |||
282 | .init_irq = cp_intc_init, | 282 | .init_irq = cp_intc_init, |
283 | .timer = &davinci_timer, | 283 | .timer = &davinci_timer, |
284 | .init_machine = tnetv107x_evm_board_init, | 284 | .init_machine = tnetv107x_evm_board_init, |
285 | .init_late = davinci_init_late, | ||
285 | .dma_zone_size = SZ_128M, | 286 | .dma_zone_size = SZ_128M, |
286 | .restart = tnetv107x_restart, | 287 | .restart = tnetv107x_restart, |
287 | MACHINE_END | 288 | MACHINE_END |
diff --git a/arch/arm/mach-davinci/clock.c b/arch/arm/mach-davinci/clock.c index 008772e3b843..34668ead53c7 100644 --- a/arch/arm/mach-davinci/clock.c +++ b/arch/arm/mach-davinci/clock.c | |||
@@ -213,7 +213,7 @@ EXPORT_SYMBOL(clk_unregister); | |||
213 | /* | 213 | /* |
214 | * Disable any unused clocks left on by the bootloader | 214 | * Disable any unused clocks left on by the bootloader |
215 | */ | 215 | */ |
216 | static int __init clk_disable_unused(void) | 216 | int __init davinci_clk_disable_unused(void) |
217 | { | 217 | { |
218 | struct clk *ck; | 218 | struct clk *ck; |
219 | 219 | ||
@@ -237,7 +237,6 @@ static int __init clk_disable_unused(void) | |||
237 | 237 | ||
238 | return 0; | 238 | return 0; |
239 | } | 239 | } |
240 | late_initcall(clk_disable_unused); | ||
241 | #endif | 240 | #endif |
242 | 241 | ||
243 | static unsigned long clk_sysclk_recalc(struct clk *clk) | 242 | static unsigned long clk_sysclk_recalc(struct clk *clk) |
diff --git a/arch/arm/mach-davinci/common.c b/arch/arm/mach-davinci/common.c index cb9b2e47510c..64b0f65a8639 100644 --- a/arch/arm/mach-davinci/common.c +++ b/arch/arm/mach-davinci/common.c | |||
@@ -117,3 +117,10 @@ void __init davinci_common_init(struct davinci_soc_info *soc_info) | |||
117 | err: | 117 | err: |
118 | panic("davinci_common_init: SoC Initialization failed\n"); | 118 | panic("davinci_common_init: SoC Initialization failed\n"); |
119 | } | 119 | } |
120 | |||
121 | void __init davinci_init_late(void) | ||
122 | { | ||
123 | davinci_cpufreq_init(); | ||
124 | davinci_pm_init(); | ||
125 | davinci_clk_disable_unused(); | ||
126 | } | ||
diff --git a/arch/arm/mach-davinci/cpufreq.c b/arch/arm/mach-davinci/cpufreq.c index 031048fec9f5..4729eaab0f40 100644 --- a/arch/arm/mach-davinci/cpufreq.c +++ b/arch/arm/mach-davinci/cpufreq.c | |||
@@ -240,10 +240,9 @@ static struct platform_driver davinci_cpufreq_driver = { | |||
240 | .remove = __exit_p(davinci_cpufreq_remove), | 240 | .remove = __exit_p(davinci_cpufreq_remove), |
241 | }; | 241 | }; |
242 | 242 | ||
243 | static int __init davinci_cpufreq_init(void) | 243 | int __init davinci_cpufreq_init(void) |
244 | { | 244 | { |
245 | return platform_driver_probe(&davinci_cpufreq_driver, | 245 | return platform_driver_probe(&davinci_cpufreq_driver, |
246 | davinci_cpufreq_probe); | 246 | davinci_cpufreq_probe); |
247 | } | 247 | } |
248 | late_initcall(davinci_cpufreq_init); | ||
249 | 248 | ||
diff --git a/arch/arm/mach-davinci/dma.c b/arch/arm/mach-davinci/dma.c index 95ce019c9b98..a685e9706b7b 100644 --- a/arch/arm/mach-davinci/dma.c +++ b/arch/arm/mach-davinci/dma.c | |||
@@ -353,9 +353,10 @@ static int irq2ctlr(int irq) | |||
353 | *****************************************************************************/ | 353 | *****************************************************************************/ |
354 | static irqreturn_t dma_irq_handler(int irq, void *data) | 354 | static irqreturn_t dma_irq_handler(int irq, void *data) |
355 | { | 355 | { |
356 | int i; | ||
357 | int ctlr; | 356 | int ctlr; |
358 | unsigned int cnt = 0; | 357 | u32 sh_ier; |
358 | u32 sh_ipr; | ||
359 | u32 bank; | ||
359 | 360 | ||
360 | ctlr = irq2ctlr(irq); | 361 | ctlr = irq2ctlr(irq); |
361 | if (ctlr < 0) | 362 | if (ctlr < 0) |
@@ -363,41 +364,39 @@ static irqreturn_t dma_irq_handler(int irq, void *data) | |||
363 | 364 | ||
364 | dev_dbg(data, "dma_irq_handler\n"); | 365 | dev_dbg(data, "dma_irq_handler\n"); |
365 | 366 | ||
366 | if ((edma_shadow0_read_array(ctlr, SH_IPR, 0) == 0) && | 367 | sh_ipr = edma_shadow0_read_array(ctlr, SH_IPR, 0); |
367 | (edma_shadow0_read_array(ctlr, SH_IPR, 1) == 0)) | 368 | if (!sh_ipr) { |
368 | return IRQ_NONE; | 369 | sh_ipr = edma_shadow0_read_array(ctlr, SH_IPR, 1); |
370 | if (!sh_ipr) | ||
371 | return IRQ_NONE; | ||
372 | sh_ier = edma_shadow0_read_array(ctlr, SH_IER, 1); | ||
373 | bank = 1; | ||
374 | } else { | ||
375 | sh_ier = edma_shadow0_read_array(ctlr, SH_IER, 0); | ||
376 | bank = 0; | ||
377 | } | ||
369 | 378 | ||
370 | while (1) { | 379 | do { |
371 | int j; | 380 | u32 slot; |
372 | if (edma_shadow0_read_array(ctlr, SH_IPR, 0) & | 381 | u32 channel; |
373 | edma_shadow0_read_array(ctlr, SH_IER, 0)) | 382 | |
374 | j = 0; | 383 | dev_dbg(data, "IPR%d %08x\n", bank, sh_ipr); |
375 | else if (edma_shadow0_read_array(ctlr, SH_IPR, 1) & | 384 | |
376 | edma_shadow0_read_array(ctlr, SH_IER, 1)) | 385 | slot = __ffs(sh_ipr); |
377 | j = 1; | 386 | sh_ipr &= ~(BIT(slot)); |
378 | else | 387 | |
379 | break; | 388 | if (sh_ier & BIT(slot)) { |
380 | dev_dbg(data, "IPR%d %08x\n", j, | 389 | channel = (bank << 5) | slot; |
381 | edma_shadow0_read_array(ctlr, SH_IPR, j)); | 390 | /* Clear the corresponding IPR bits */ |
382 | for (i = 0; i < 32; i++) { | 391 | edma_shadow0_write_array(ctlr, SH_ICR, bank, |
383 | int k = (j << 5) + i; | 392 | BIT(slot)); |
384 | if ((edma_shadow0_read_array(ctlr, SH_IPR, j) & BIT(i)) | 393 | if (edma_cc[ctlr]->intr_data[channel].callback) |
385 | && (edma_shadow0_read_array(ctlr, | 394 | edma_cc[ctlr]->intr_data[channel].callback( |
386 | SH_IER, j) & BIT(i))) { | 395 | channel, DMA_COMPLETE, |
387 | /* Clear the corresponding IPR bits */ | 396 | edma_cc[ctlr]->intr_data[channel].data); |
388 | edma_shadow0_write_array(ctlr, SH_ICR, j, | ||
389 | BIT(i)); | ||
390 | if (edma_cc[ctlr]->intr_data[k].callback) | ||
391 | edma_cc[ctlr]->intr_data[k].callback( | ||
392 | k, DMA_COMPLETE, | ||
393 | edma_cc[ctlr]->intr_data[k]. | ||
394 | data); | ||
395 | } | ||
396 | } | 397 | } |
397 | cnt++; | 398 | } while (sh_ipr); |
398 | if (cnt > 10) | 399 | |
399 | break; | ||
400 | } | ||
401 | edma_shadow0_write(ctlr, SH_IEVAL, 1); | 400 | edma_shadow0_write(ctlr, SH_IEVAL, 1); |
402 | return IRQ_HANDLED; | 401 | return IRQ_HANDLED; |
403 | } | 402 | } |
diff --git a/arch/arm/mach-davinci/include/mach/common.h b/arch/arm/mach-davinci/include/mach/common.h index 5cd39a4e0c96..bdc4aa8e672a 100644 --- a/arch/arm/mach-davinci/include/mach/common.h +++ b/arch/arm/mach-davinci/include/mach/common.h | |||
@@ -84,6 +84,25 @@ extern struct davinci_soc_info davinci_soc_info; | |||
84 | extern void davinci_common_init(struct davinci_soc_info *soc_info); | 84 | extern void davinci_common_init(struct davinci_soc_info *soc_info); |
85 | extern void davinci_init_ide(void); | 85 | extern void davinci_init_ide(void); |
86 | void davinci_restart(char mode, const char *cmd); | 86 | void davinci_restart(char mode, const char *cmd); |
87 | void davinci_init_late(void); | ||
88 | |||
89 | #ifdef CONFIG_DAVINCI_RESET_CLOCKS | ||
90 | int davinci_clk_disable_unused(void); | ||
91 | #else | ||
92 | static inline int davinci_clk_disable_unused(void) { return 0; } | ||
93 | #endif | ||
94 | |||
95 | #ifdef CONFIG_CPU_FREQ | ||
96 | int davinci_cpufreq_init(void); | ||
97 | #else | ||
98 | static inline int davinci_cpufreq_init(void) { return 0; } | ||
99 | #endif | ||
100 | |||
101 | #ifdef CONFIG_SUSPEND | ||
102 | int davinci_pm_init(void); | ||
103 | #else | ||
104 | static inline int davinci_pm_init(void) { return 0; } | ||
105 | #endif | ||
87 | 106 | ||
88 | /* standard place to map on-chip SRAMs; they *may* support DMA */ | 107 | /* standard place to map on-chip SRAMs; they *may* support DMA */ |
89 | #define SRAM_VIRT 0xfffe0000 | 108 | #define SRAM_VIRT 0xfffe0000 |
diff --git a/arch/arm/mach-davinci/include/mach/debug-macro.S b/arch/arm/mach-davinci/include/mach/debug-macro.S index cf94552d5274..34290d14754b 100644 --- a/arch/arm/mach-davinci/include/mach/debug-macro.S +++ b/arch/arm/mach-davinci/include/mach/debug-macro.S | |||
@@ -22,46 +22,28 @@ | |||
22 | 22 | ||
23 | #define UART_SHIFT 2 | 23 | #define UART_SHIFT 2 |
24 | 24 | ||
25 | .pushsection .data | 25 | #if defined(CONFIG_DEBUG_DAVINCI_DMx_UART0) |
26 | davinci_uart_phys: .word 0 | 26 | #define UART_BASE DAVINCI_UART0_BASE |
27 | davinci_uart_virt: .word 0 | 27 | #elif defined(CONFIG_DEBUG_DAVINCI_DA8XX_UART0) |
28 | .popsection | 28 | #define UART_BASE DA8XX_UART0_BASE |
29 | 29 | #elif defined(CONFIG_DEBUG_DAVINCI_DA8XX_UART1) | |
30 | .macro addruart, rp, rv, tmp | 30 | #define UART_BASE DA8XX_UART1_BASE |
31 | 31 | #elif defined(CONFIG_DEBUG_DAVINCI_DA8XX_UART2) | |
32 | /* Use davinci_uart_phys/virt if already configured */ | 32 | #define UART_BASE DA8XX_UART2_BASE |
33 | 10: adr \rp, 99f @ get effective addr of 99f | 33 | #elif defined(CONFIG_DEBUG_DAVINCI_TNETV107X_UART1) |
34 | ldr \rv, [\rp] @ get absolute addr of 99f | 34 | #define UART_BASE TNETV107X_UART2_BASE |
35 | sub \rv, \rv, \rp @ offset between the two | 35 | #define UART_VIRTBASE TNETV107X_UART2_VIRT |
36 | ldr \rp, [\rp, #4] @ abs addr of omap_uart_phys | 36 | #else |
37 | sub \tmp, \rp, \rv @ make it effective | 37 | #error "Select a specifc port for DEBUG_LL" |
38 | ldr \rp, [\tmp, #0] @ davinci_uart_phys | 38 | #endif |
39 | ldr \rv, [\tmp, #4] @ davinci_uart_virt | ||
40 | cmp \rp, #0 @ is port configured? | ||
41 | cmpne \rv, #0 | ||
42 | bne 100f @ already configured | ||
43 | |||
44 | /* Check the debug UART address set in uncompress.h */ | ||
45 | and \rp, pc, #0xff000000 | ||
46 | ldr \rv, =DAVINCI_UART_INFO_OFS | ||
47 | add \rp, \rp, \rv | ||
48 | |||
49 | /* Copy uart phys address from decompressor uart info */ | ||
50 | ldr \rv, [\rp, #0] | ||
51 | str \rv, [\tmp, #0] | ||
52 | |||
53 | /* Copy uart virt address from decompressor uart info */ | ||
54 | ldr \rv, [\rp, #4] | ||
55 | str \rv, [\tmp, #4] | ||
56 | |||
57 | b 10b | ||
58 | 39 | ||
59 | .align | 40 | #ifndef UART_VIRTBASE |
60 | 99: .word . | 41 | #define UART_VIRTBASE IO_ADDRESS(UART_BASE) |
61 | .word davinci_uart_phys | 42 | #endif |
62 | .ltorg | ||
63 | 43 | ||
64 | 100: | 44 | .macro addruart, rp, rv, tmp |
45 | ldr \rp, =UART_BASE | ||
46 | ldr \rv, =UART_VIRTBASE | ||
65 | .endm | 47 | .endm |
66 | 48 | ||
67 | .macro senduart,rd,rx | 49 | .macro senduart,rd,rx |
diff --git a/arch/arm/mach-davinci/include/mach/hardware.h b/arch/arm/mach-davinci/include/mach/hardware.h index 2184691ebc2f..16bb42291d39 100644 --- a/arch/arm/mach-davinci/include/mach/hardware.h +++ b/arch/arm/mach-davinci/include/mach/hardware.h | |||
@@ -22,7 +22,7 @@ | |||
22 | /* | 22 | /* |
23 | * I/O mapping | 23 | * I/O mapping |
24 | */ | 24 | */ |
25 | #define IO_PHYS 0x01c00000UL | 25 | #define IO_PHYS UL(0x01c00000) |
26 | #define IO_OFFSET 0xfd000000 /* Virtual IO = 0xfec00000 */ | 26 | #define IO_OFFSET 0xfd000000 /* Virtual IO = 0xfec00000 */ |
27 | #define IO_SIZE 0x00400000 | 27 | #define IO_SIZE 0x00400000 |
28 | #define IO_VIRT (IO_PHYS + IO_OFFSET) | 28 | #define IO_VIRT (IO_PHYS + IO_OFFSET) |
diff --git a/arch/arm/mach-davinci/include/mach/serial.h b/arch/arm/mach-davinci/include/mach/serial.h index e347d88fef91..46b3cd11c3c2 100644 --- a/arch/arm/mach-davinci/include/mach/serial.h +++ b/arch/arm/mach-davinci/include/mach/serial.h | |||
@@ -15,16 +15,6 @@ | |||
15 | 15 | ||
16 | #include <mach/hardware.h> | 16 | #include <mach/hardware.h> |
17 | 17 | ||
18 | /* | ||
19 | * Stolen area that contains debug uart physical and virtual addresses. These | ||
20 | * addresses are filled in by the uncompress.h code, and are used by the debug | ||
21 | * macros in debug-macro.S. | ||
22 | * | ||
23 | * This area sits just below the page tables (see arch/arm/kernel/head.S). | ||
24 | * We define it as a relative offset from start of usable RAM. | ||
25 | */ | ||
26 | #define DAVINCI_UART_INFO_OFS 0x3ff8 | ||
27 | |||
28 | #define DAVINCI_UART0_BASE (IO_PHYS + 0x20000) | 18 | #define DAVINCI_UART0_BASE (IO_PHYS + 0x20000) |
29 | #define DAVINCI_UART1_BASE (IO_PHYS + 0x20400) | 19 | #define DAVINCI_UART1_BASE (IO_PHYS + 0x20400) |
30 | #define DAVINCI_UART2_BASE (IO_PHYS + 0x20800) | 20 | #define DAVINCI_UART2_BASE (IO_PHYS + 0x20800) |
diff --git a/arch/arm/mach-davinci/include/mach/uncompress.h b/arch/arm/mach-davinci/include/mach/uncompress.h index da2fb2c2155a..18cfd4977155 100644 --- a/arch/arm/mach-davinci/include/mach/uncompress.h +++ b/arch/arm/mach-davinci/include/mach/uncompress.h | |||
@@ -43,37 +43,27 @@ static inline void flush(void) | |||
43 | barrier(); | 43 | barrier(); |
44 | } | 44 | } |
45 | 45 | ||
46 | static inline void set_uart_info(u32 phys, void * __iomem virt) | 46 | static inline void set_uart_info(u32 phys) |
47 | { | 47 | { |
48 | /* | ||
49 | * Get address of some.bss variable and round it down | ||
50 | * a la CONFIG_AUTO_ZRELADDR. | ||
51 | */ | ||
52 | u32 ram_start = (u32)&uart & 0xf8000000; | ||
53 | u32 *uart_info = (u32 *)(ram_start + DAVINCI_UART_INFO_OFS); | ||
54 | |||
55 | uart = (u32 *)phys; | 48 | uart = (u32 *)phys; |
56 | uart_info[0] = phys; | ||
57 | uart_info[1] = (u32)virt; | ||
58 | } | 49 | } |
59 | 50 | ||
60 | #define _DEBUG_LL_ENTRY(machine, phys, virt) \ | 51 | #define _DEBUG_LL_ENTRY(machine, phys) \ |
61 | if (machine_is_##machine()) { \ | 52 | { \ |
62 | set_uart_info(phys, virt); \ | 53 | if (machine_is_##machine()) { \ |
63 | break; \ | 54 | set_uart_info(phys); \ |
55 | break; \ | ||
56 | } \ | ||
64 | } | 57 | } |
65 | 58 | ||
66 | #define DEBUG_LL_DAVINCI(machine, port) \ | 59 | #define DEBUG_LL_DAVINCI(machine, port) \ |
67 | _DEBUG_LL_ENTRY(machine, DAVINCI_UART##port##_BASE, \ | 60 | _DEBUG_LL_ENTRY(machine, DAVINCI_UART##port##_BASE) |
68 | IO_ADDRESS(DAVINCI_UART##port##_BASE)) | ||
69 | 61 | ||
70 | #define DEBUG_LL_DA8XX(machine, port) \ | 62 | #define DEBUG_LL_DA8XX(machine, port) \ |
71 | _DEBUG_LL_ENTRY(machine, DA8XX_UART##port##_BASE, \ | 63 | _DEBUG_LL_ENTRY(machine, DA8XX_UART##port##_BASE) |
72 | IO_ADDRESS(DA8XX_UART##port##_BASE)) | ||
73 | 64 | ||
74 | #define DEBUG_LL_TNETV107X(machine, port) \ | 65 | #define DEBUG_LL_TNETV107X(machine, port) \ |
75 | _DEBUG_LL_ENTRY(machine, TNETV107X_UART##port##_BASE, \ | 66 | _DEBUG_LL_ENTRY(machine, TNETV107X_UART##port##_BASE) |
76 | TNETV107X_UART##port##_VIRT) | ||
77 | 67 | ||
78 | static inline void __arch_decomp_setup(unsigned long arch_id) | 68 | static inline void __arch_decomp_setup(unsigned long arch_id) |
79 | { | 69 | { |
diff --git a/arch/arm/mach-davinci/pm.c b/arch/arm/mach-davinci/pm.c index 04c49f7543ef..eb8360b33aa9 100644 --- a/arch/arm/mach-davinci/pm.c +++ b/arch/arm/mach-davinci/pm.c | |||
@@ -152,8 +152,7 @@ static struct platform_driver davinci_pm_driver = { | |||
152 | .remove = __exit_p(davinci_pm_remove), | 152 | .remove = __exit_p(davinci_pm_remove), |
153 | }; | 153 | }; |
154 | 154 | ||
155 | static int __init davinci_pm_init(void) | 155 | int __init davinci_pm_init(void) |
156 | { | 156 | { |
157 | return platform_driver_probe(&davinci_pm_driver, davinci_pm_probe); | 157 | return platform_driver_probe(&davinci_pm_driver, davinci_pm_probe); |
158 | } | 158 | } |
159 | late_initcall(davinci_pm_init); | ||
diff --git a/arch/arm/mach-dove/common.c b/arch/arm/mach-dove/common.c index 42ab1e7c4ecc..9493076fc594 100644 --- a/arch/arm/mach-dove/common.c +++ b/arch/arm/mach-dove/common.c | |||
@@ -13,7 +13,7 @@ | |||
13 | #include <linux/init.h> | 13 | #include <linux/init.h> |
14 | #include <linux/platform_device.h> | 14 | #include <linux/platform_device.h> |
15 | #include <linux/pci.h> | 15 | #include <linux/pci.h> |
16 | #include <linux/clk.h> | 16 | #include <linux/clk-provider.h> |
17 | #include <linux/ata_platform.h> | 17 | #include <linux/ata_platform.h> |
18 | #include <linux/gpio.h> | 18 | #include <linux/gpio.h> |
19 | #include <asm/page.h> | 19 | #include <asm/page.h> |
@@ -68,6 +68,19 @@ void __init dove_map_io(void) | |||
68 | } | 68 | } |
69 | 69 | ||
70 | /***************************************************************************** | 70 | /***************************************************************************** |
71 | * CLK tree | ||
72 | ****************************************************************************/ | ||
73 | static struct clk *tclk; | ||
74 | |||
75 | static void __init clk_init(void) | ||
76 | { | ||
77 | tclk = clk_register_fixed_rate(NULL, "tclk", NULL, CLK_IS_ROOT, | ||
78 | get_tclk()); | ||
79 | |||
80 | orion_clkdev_init(tclk); | ||
81 | } | ||
82 | |||
83 | /***************************************************************************** | ||
71 | * EHCI0 | 84 | * EHCI0 |
72 | ****************************************************************************/ | 85 | ****************************************************************************/ |
73 | void __init dove_ehci0_init(void) | 86 | void __init dove_ehci0_init(void) |
@@ -89,8 +102,7 @@ void __init dove_ehci1_init(void) | |||
89 | void __init dove_ge00_init(struct mv643xx_eth_platform_data *eth_data) | 102 | void __init dove_ge00_init(struct mv643xx_eth_platform_data *eth_data) |
90 | { | 103 | { |
91 | orion_ge00_init(eth_data, | 104 | orion_ge00_init(eth_data, |
92 | DOVE_GE00_PHYS_BASE, IRQ_DOVE_GE00_SUM, | 105 | DOVE_GE00_PHYS_BASE, IRQ_DOVE_GE00_SUM, 0); |
93 | 0, get_tclk()); | ||
94 | } | 106 | } |
95 | 107 | ||
96 | /***************************************************************************** | 108 | /***************************************************************************** |
@@ -116,7 +128,7 @@ void __init dove_sata_init(struct mv_sata_platform_data *sata_data) | |||
116 | void __init dove_uart0_init(void) | 128 | void __init dove_uart0_init(void) |
117 | { | 129 | { |
118 | orion_uart0_init(DOVE_UART0_VIRT_BASE, DOVE_UART0_PHYS_BASE, | 130 | orion_uart0_init(DOVE_UART0_VIRT_BASE, DOVE_UART0_PHYS_BASE, |
119 | IRQ_DOVE_UART_0, get_tclk()); | 131 | IRQ_DOVE_UART_0, tclk); |
120 | } | 132 | } |
121 | 133 | ||
122 | /***************************************************************************** | 134 | /***************************************************************************** |
@@ -125,7 +137,7 @@ void __init dove_uart0_init(void) | |||
125 | void __init dove_uart1_init(void) | 137 | void __init dove_uart1_init(void) |
126 | { | 138 | { |
127 | orion_uart1_init(DOVE_UART1_VIRT_BASE, DOVE_UART1_PHYS_BASE, | 139 | orion_uart1_init(DOVE_UART1_VIRT_BASE, DOVE_UART1_PHYS_BASE, |
128 | IRQ_DOVE_UART_1, get_tclk()); | 140 | IRQ_DOVE_UART_1, tclk); |
129 | } | 141 | } |
130 | 142 | ||
131 | /***************************************************************************** | 143 | /***************************************************************************** |
@@ -134,7 +146,7 @@ void __init dove_uart1_init(void) | |||
134 | void __init dove_uart2_init(void) | 146 | void __init dove_uart2_init(void) |
135 | { | 147 | { |
136 | orion_uart2_init(DOVE_UART2_VIRT_BASE, DOVE_UART2_PHYS_BASE, | 148 | orion_uart2_init(DOVE_UART2_VIRT_BASE, DOVE_UART2_PHYS_BASE, |
137 | IRQ_DOVE_UART_2, get_tclk()); | 149 | IRQ_DOVE_UART_2, tclk); |
138 | } | 150 | } |
139 | 151 | ||
140 | /***************************************************************************** | 152 | /***************************************************************************** |
@@ -143,7 +155,7 @@ void __init dove_uart2_init(void) | |||
143 | void __init dove_uart3_init(void) | 155 | void __init dove_uart3_init(void) |
144 | { | 156 | { |
145 | orion_uart3_init(DOVE_UART3_VIRT_BASE, DOVE_UART3_PHYS_BASE, | 157 | orion_uart3_init(DOVE_UART3_VIRT_BASE, DOVE_UART3_PHYS_BASE, |
146 | IRQ_DOVE_UART_3, get_tclk()); | 158 | IRQ_DOVE_UART_3, tclk); |
147 | } | 159 | } |
148 | 160 | ||
149 | /***************************************************************************** | 161 | /***************************************************************************** |
@@ -151,12 +163,12 @@ void __init dove_uart3_init(void) | |||
151 | ****************************************************************************/ | 163 | ****************************************************************************/ |
152 | void __init dove_spi0_init(void) | 164 | void __init dove_spi0_init(void) |
153 | { | 165 | { |
154 | orion_spi_init(DOVE_SPI0_PHYS_BASE, get_tclk()); | 166 | orion_spi_init(DOVE_SPI0_PHYS_BASE); |
155 | } | 167 | } |
156 | 168 | ||
157 | void __init dove_spi1_init(void) | 169 | void __init dove_spi1_init(void) |
158 | { | 170 | { |
159 | orion_spi_1_init(DOVE_SPI1_PHYS_BASE, get_tclk()); | 171 | orion_spi_1_init(DOVE_SPI1_PHYS_BASE); |
160 | } | 172 | } |
161 | 173 | ||
162 | /***************************************************************************** | 174 | /***************************************************************************** |
@@ -272,18 +284,17 @@ void __init dove_sdio1_init(void) | |||
272 | 284 | ||
273 | void __init dove_init(void) | 285 | void __init dove_init(void) |
274 | { | 286 | { |
275 | int tclk; | ||
276 | |||
277 | tclk = get_tclk(); | ||
278 | |||
279 | printk(KERN_INFO "Dove 88AP510 SoC, "); | 287 | printk(KERN_INFO "Dove 88AP510 SoC, "); |
280 | printk(KERN_INFO "TCLK = %dMHz\n", (tclk + 499999) / 1000000); | 288 | printk(KERN_INFO "TCLK = %dMHz\n", (get_tclk() + 499999) / 1000000); |
281 | 289 | ||
282 | #ifdef CONFIG_CACHE_TAUROS2 | 290 | #ifdef CONFIG_CACHE_TAUROS2 |
283 | tauros2_init(); | 291 | tauros2_init(); |
284 | #endif | 292 | #endif |
285 | dove_setup_cpu_mbus(); | 293 | dove_setup_cpu_mbus(); |
286 | 294 | ||
295 | /* Setup root of clk tree */ | ||
296 | clk_init(); | ||
297 | |||
287 | /* internal devices that every board has */ | 298 | /* internal devices that every board has */ |
288 | dove_rtc_init(); | 299 | dove_rtc_init(); |
289 | dove_xor0_init(); | 300 | dove_xor0_init(); |
diff --git a/arch/arm/mach-dove/dove-db-setup.c b/arch/arm/mach-dove/dove-db-setup.c index ea77ae430b2d..bc2867f11346 100644 --- a/arch/arm/mach-dove/dove-db-setup.c +++ b/arch/arm/mach-dove/dove-db-setup.c | |||
@@ -20,7 +20,6 @@ | |||
20 | #include <linux/i2c.h> | 20 | #include <linux/i2c.h> |
21 | #include <linux/pci.h> | 21 | #include <linux/pci.h> |
22 | #include <linux/spi/spi.h> | 22 | #include <linux/spi/spi.h> |
23 | #include <linux/spi/orion_spi.h> | ||
24 | #include <linux/spi/flash.h> | 23 | #include <linux/spi/flash.h> |
25 | #include <linux/gpio.h> | 24 | #include <linux/gpio.h> |
26 | #include <asm/mach-types.h> | 25 | #include <asm/mach-types.h> |
diff --git a/arch/arm/mach-ep93xx/adssphere.c b/arch/arm/mach-ep93xx/adssphere.c index 2d45947a3034..a472777e9eba 100644 --- a/arch/arm/mach-ep93xx/adssphere.c +++ b/arch/arm/mach-ep93xx/adssphere.c | |||
@@ -41,5 +41,6 @@ MACHINE_START(ADSSPHERE, "ADS Sphere board") | |||
41 | .handle_irq = vic_handle_irq, | 41 | .handle_irq = vic_handle_irq, |
42 | .timer = &ep93xx_timer, | 42 | .timer = &ep93xx_timer, |
43 | .init_machine = adssphere_init_machine, | 43 | .init_machine = adssphere_init_machine, |
44 | .init_late = ep93xx_init_late, | ||
44 | .restart = ep93xx_restart, | 45 | .restart = ep93xx_restart, |
45 | MACHINE_END | 46 | MACHINE_END |
diff --git a/arch/arm/mach-ep93xx/core.c b/arch/arm/mach-ep93xx/core.c index 66b1494f23a6..4dd07a0e3604 100644 --- a/arch/arm/mach-ep93xx/core.c +++ b/arch/arm/mach-ep93xx/core.c | |||
@@ -675,7 +675,7 @@ int ep93xx_keypad_acquire_gpio(struct platform_device *pdev) | |||
675 | fail_gpio_d: | 675 | fail_gpio_d: |
676 | gpio_free(EP93XX_GPIO_LINE_C(i)); | 676 | gpio_free(EP93XX_GPIO_LINE_C(i)); |
677 | fail_gpio_c: | 677 | fail_gpio_c: |
678 | for ( ; i >= 0; --i) { | 678 | for (--i; i >= 0; --i) { |
679 | gpio_free(EP93XX_GPIO_LINE_C(i)); | 679 | gpio_free(EP93XX_GPIO_LINE_C(i)); |
680 | gpio_free(EP93XX_GPIO_LINE_D(i)); | 680 | gpio_free(EP93XX_GPIO_LINE_D(i)); |
681 | } | 681 | } |
@@ -834,3 +834,8 @@ void ep93xx_restart(char mode, const char *cmd) | |||
834 | while (1) | 834 | while (1) |
835 | ; | 835 | ; |
836 | } | 836 | } |
837 | |||
838 | void __init ep93xx_init_late(void) | ||
839 | { | ||
840 | crunch_init(); | ||
841 | } | ||
diff --git a/arch/arm/mach-ep93xx/crunch.c b/arch/arm/mach-ep93xx/crunch.c index 74753e2df603..a4a2ab9648c9 100644 --- a/arch/arm/mach-ep93xx/crunch.c +++ b/arch/arm/mach-ep93xx/crunch.c | |||
@@ -79,12 +79,10 @@ static struct notifier_block crunch_notifier_block = { | |||
79 | .notifier_call = crunch_do, | 79 | .notifier_call = crunch_do, |
80 | }; | 80 | }; |
81 | 81 | ||
82 | static int __init crunch_init(void) | 82 | int __init crunch_init(void) |
83 | { | 83 | { |
84 | thread_register_notifier(&crunch_notifier_block); | 84 | thread_register_notifier(&crunch_notifier_block); |
85 | elf_hwcap |= HWCAP_CRUNCH; | 85 | elf_hwcap |= HWCAP_CRUNCH; |
86 | 86 | ||
87 | return 0; | 87 | return 0; |
88 | } | 88 | } |
89 | |||
90 | late_initcall(crunch_init); | ||
diff --git a/arch/arm/mach-ep93xx/edb93xx.c b/arch/arm/mach-ep93xx/edb93xx.c index da9047d726f0..d74c5cddb98b 100644 --- a/arch/arm/mach-ep93xx/edb93xx.c +++ b/arch/arm/mach-ep93xx/edb93xx.c | |||
@@ -255,6 +255,7 @@ MACHINE_START(EDB9301, "Cirrus Logic EDB9301 Evaluation Board") | |||
255 | .handle_irq = vic_handle_irq, | 255 | .handle_irq = vic_handle_irq, |
256 | .timer = &ep93xx_timer, | 256 | .timer = &ep93xx_timer, |
257 | .init_machine = edb93xx_init_machine, | 257 | .init_machine = edb93xx_init_machine, |
258 | .init_late = ep93xx_init_late, | ||
258 | .restart = ep93xx_restart, | 259 | .restart = ep93xx_restart, |
259 | MACHINE_END | 260 | MACHINE_END |
260 | #endif | 261 | #endif |
@@ -268,6 +269,7 @@ MACHINE_START(EDB9302, "Cirrus Logic EDB9302 Evaluation Board") | |||
268 | .handle_irq = vic_handle_irq, | 269 | .handle_irq = vic_handle_irq, |
269 | .timer = &ep93xx_timer, | 270 | .timer = &ep93xx_timer, |
270 | .init_machine = edb93xx_init_machine, | 271 | .init_machine = edb93xx_init_machine, |
272 | .init_late = ep93xx_init_late, | ||
271 | .restart = ep93xx_restart, | 273 | .restart = ep93xx_restart, |
272 | MACHINE_END | 274 | MACHINE_END |
273 | #endif | 275 | #endif |
@@ -281,6 +283,7 @@ MACHINE_START(EDB9302A, "Cirrus Logic EDB9302A Evaluation Board") | |||
281 | .handle_irq = vic_handle_irq, | 283 | .handle_irq = vic_handle_irq, |
282 | .timer = &ep93xx_timer, | 284 | .timer = &ep93xx_timer, |
283 | .init_machine = edb93xx_init_machine, | 285 | .init_machine = edb93xx_init_machine, |
286 | .init_late = ep93xx_init_late, | ||
284 | .restart = ep93xx_restart, | 287 | .restart = ep93xx_restart, |
285 | MACHINE_END | 288 | MACHINE_END |
286 | #endif | 289 | #endif |
@@ -294,6 +297,7 @@ MACHINE_START(EDB9307, "Cirrus Logic EDB9307 Evaluation Board") | |||
294 | .handle_irq = vic_handle_irq, | 297 | .handle_irq = vic_handle_irq, |
295 | .timer = &ep93xx_timer, | 298 | .timer = &ep93xx_timer, |
296 | .init_machine = edb93xx_init_machine, | 299 | .init_machine = edb93xx_init_machine, |
300 | .init_late = ep93xx_init_late, | ||
297 | .restart = ep93xx_restart, | 301 | .restart = ep93xx_restart, |
298 | MACHINE_END | 302 | MACHINE_END |
299 | #endif | 303 | #endif |
@@ -307,6 +311,7 @@ MACHINE_START(EDB9307A, "Cirrus Logic EDB9307A Evaluation Board") | |||
307 | .handle_irq = vic_handle_irq, | 311 | .handle_irq = vic_handle_irq, |
308 | .timer = &ep93xx_timer, | 312 | .timer = &ep93xx_timer, |
309 | .init_machine = edb93xx_init_machine, | 313 | .init_machine = edb93xx_init_machine, |
314 | .init_late = ep93xx_init_late, | ||
310 | .restart = ep93xx_restart, | 315 | .restart = ep93xx_restart, |
311 | MACHINE_END | 316 | MACHINE_END |
312 | #endif | 317 | #endif |
@@ -320,6 +325,7 @@ MACHINE_START(EDB9312, "Cirrus Logic EDB9312 Evaluation Board") | |||
320 | .handle_irq = vic_handle_irq, | 325 | .handle_irq = vic_handle_irq, |
321 | .timer = &ep93xx_timer, | 326 | .timer = &ep93xx_timer, |
322 | .init_machine = edb93xx_init_machine, | 327 | .init_machine = edb93xx_init_machine, |
328 | .init_late = ep93xx_init_late, | ||
323 | .restart = ep93xx_restart, | 329 | .restart = ep93xx_restart, |
324 | MACHINE_END | 330 | MACHINE_END |
325 | #endif | 331 | #endif |
@@ -333,6 +339,7 @@ MACHINE_START(EDB9315, "Cirrus Logic EDB9315 Evaluation Board") | |||
333 | .handle_irq = vic_handle_irq, | 339 | .handle_irq = vic_handle_irq, |
334 | .timer = &ep93xx_timer, | 340 | .timer = &ep93xx_timer, |
335 | .init_machine = edb93xx_init_machine, | 341 | .init_machine = edb93xx_init_machine, |
342 | .init_late = ep93xx_init_late, | ||
336 | .restart = ep93xx_restart, | 343 | .restart = ep93xx_restart, |
337 | MACHINE_END | 344 | MACHINE_END |
338 | #endif | 345 | #endif |
@@ -346,6 +353,7 @@ MACHINE_START(EDB9315A, "Cirrus Logic EDB9315A Evaluation Board") | |||
346 | .handle_irq = vic_handle_irq, | 353 | .handle_irq = vic_handle_irq, |
347 | .timer = &ep93xx_timer, | 354 | .timer = &ep93xx_timer, |
348 | .init_machine = edb93xx_init_machine, | 355 | .init_machine = edb93xx_init_machine, |
356 | .init_late = ep93xx_init_late, | ||
349 | .restart = ep93xx_restart, | 357 | .restart = ep93xx_restart, |
350 | MACHINE_END | 358 | MACHINE_END |
351 | #endif | 359 | #endif |
diff --git a/arch/arm/mach-ep93xx/gesbc9312.c b/arch/arm/mach-ep93xx/gesbc9312.c index fcdffbe49dcc..437c34111155 100644 --- a/arch/arm/mach-ep93xx/gesbc9312.c +++ b/arch/arm/mach-ep93xx/gesbc9312.c | |||
@@ -41,5 +41,6 @@ MACHINE_START(GESBC9312, "Glomation GESBC-9312-sx") | |||
41 | .handle_irq = vic_handle_irq, | 41 | .handle_irq = vic_handle_irq, |
42 | .timer = &ep93xx_timer, | 42 | .timer = &ep93xx_timer, |
43 | .init_machine = gesbc9312_init_machine, | 43 | .init_machine = gesbc9312_init_machine, |
44 | .init_late = ep93xx_init_late, | ||
44 | .restart = ep93xx_restart, | 45 | .restart = ep93xx_restart, |
45 | MACHINE_END | 46 | MACHINE_END |
diff --git a/arch/arm/mach-ep93xx/include/mach/platform.h b/arch/arm/mach-ep93xx/include/mach/platform.h index 602bd87fd0ab..1ecb040d98bf 100644 --- a/arch/arm/mach-ep93xx/include/mach/platform.h +++ b/arch/arm/mach-ep93xx/include/mach/platform.h | |||
@@ -53,5 +53,12 @@ void ep93xx_init_devices(void); | |||
53 | extern struct sys_timer ep93xx_timer; | 53 | extern struct sys_timer ep93xx_timer; |
54 | 54 | ||
55 | void ep93xx_restart(char, const char *); | 55 | void ep93xx_restart(char, const char *); |
56 | void ep93xx_init_late(void); | ||
57 | |||
58 | #ifdef CONFIG_CRUNCH | ||
59 | int crunch_init(void); | ||
60 | #else | ||
61 | static inline int crunch_init(void) { return 0; } | ||
62 | #endif | ||
56 | 63 | ||
57 | #endif | 64 | #endif |
diff --git a/arch/arm/mach-ep93xx/micro9.c b/arch/arm/mach-ep93xx/micro9.c index dc431c5f04ce..3d7cdab725b2 100644 --- a/arch/arm/mach-ep93xx/micro9.c +++ b/arch/arm/mach-ep93xx/micro9.c | |||
@@ -85,6 +85,7 @@ MACHINE_START(MICRO9, "Contec Micro9-High") | |||
85 | .handle_irq = vic_handle_irq, | 85 | .handle_irq = vic_handle_irq, |
86 | .timer = &ep93xx_timer, | 86 | .timer = &ep93xx_timer, |
87 | .init_machine = micro9_init_machine, | 87 | .init_machine = micro9_init_machine, |
88 | .init_late = ep93xx_init_late, | ||
88 | .restart = ep93xx_restart, | 89 | .restart = ep93xx_restart, |
89 | MACHINE_END | 90 | MACHINE_END |
90 | #endif | 91 | #endif |
@@ -98,6 +99,7 @@ MACHINE_START(MICRO9M, "Contec Micro9-Mid") | |||
98 | .handle_irq = vic_handle_irq, | 99 | .handle_irq = vic_handle_irq, |
99 | .timer = &ep93xx_timer, | 100 | .timer = &ep93xx_timer, |
100 | .init_machine = micro9_init_machine, | 101 | .init_machine = micro9_init_machine, |
102 | .init_late = ep93xx_init_late, | ||
101 | .restart = ep93xx_restart, | 103 | .restart = ep93xx_restart, |
102 | MACHINE_END | 104 | MACHINE_END |
103 | #endif | 105 | #endif |
@@ -111,6 +113,7 @@ MACHINE_START(MICRO9L, "Contec Micro9-Lite") | |||
111 | .handle_irq = vic_handle_irq, | 113 | .handle_irq = vic_handle_irq, |
112 | .timer = &ep93xx_timer, | 114 | .timer = &ep93xx_timer, |
113 | .init_machine = micro9_init_machine, | 115 | .init_machine = micro9_init_machine, |
116 | .init_late = ep93xx_init_late, | ||
114 | .restart = ep93xx_restart, | 117 | .restart = ep93xx_restart, |
115 | MACHINE_END | 118 | MACHINE_END |
116 | #endif | 119 | #endif |
@@ -124,6 +127,7 @@ MACHINE_START(MICRO9S, "Contec Micro9-Slim") | |||
124 | .handle_irq = vic_handle_irq, | 127 | .handle_irq = vic_handle_irq, |
125 | .timer = &ep93xx_timer, | 128 | .timer = &ep93xx_timer, |
126 | .init_machine = micro9_init_machine, | 129 | .init_machine = micro9_init_machine, |
130 | .init_late = ep93xx_init_late, | ||
127 | .restart = ep93xx_restart, | 131 | .restart = ep93xx_restart, |
128 | MACHINE_END | 132 | MACHINE_END |
129 | #endif | 133 | #endif |
diff --git a/arch/arm/mach-ep93xx/simone.c b/arch/arm/mach-ep93xx/simone.c index f40c2987e545..33dc07917417 100644 --- a/arch/arm/mach-ep93xx/simone.c +++ b/arch/arm/mach-ep93xx/simone.c | |||
@@ -86,5 +86,6 @@ MACHINE_START(SIM_ONE, "Simplemachines Sim.One Board") | |||
86 | .handle_irq = vic_handle_irq, | 86 | .handle_irq = vic_handle_irq, |
87 | .timer = &ep93xx_timer, | 87 | .timer = &ep93xx_timer, |
88 | .init_machine = simone_init_machine, | 88 | .init_machine = simone_init_machine, |
89 | .init_late = ep93xx_init_late, | ||
89 | .restart = ep93xx_restart, | 90 | .restart = ep93xx_restart, |
90 | MACHINE_END | 91 | MACHINE_END |
diff --git a/arch/arm/mach-ep93xx/snappercl15.c b/arch/arm/mach-ep93xx/snappercl15.c index 0c00852ef160..eb282378fa78 100644 --- a/arch/arm/mach-ep93xx/snappercl15.c +++ b/arch/arm/mach-ep93xx/snappercl15.c | |||
@@ -183,5 +183,6 @@ MACHINE_START(SNAPPER_CL15, "Bluewater Systems Snapper CL15") | |||
183 | .handle_irq = vic_handle_irq, | 183 | .handle_irq = vic_handle_irq, |
184 | .timer = &ep93xx_timer, | 184 | .timer = &ep93xx_timer, |
185 | .init_machine = snappercl15_init_machine, | 185 | .init_machine = snappercl15_init_machine, |
186 | .init_late = ep93xx_init_late, | ||
186 | .restart = ep93xx_restart, | 187 | .restart = ep93xx_restart, |
187 | MACHINE_END | 188 | MACHINE_END |
diff --git a/arch/arm/mach-ep93xx/ts72xx.c b/arch/arm/mach-ep93xx/ts72xx.c index 5ea790942e94..d4ef339d961e 100644 --- a/arch/arm/mach-ep93xx/ts72xx.c +++ b/arch/arm/mach-ep93xx/ts72xx.c | |||
@@ -252,5 +252,6 @@ MACHINE_START(TS72XX, "Technologic Systems TS-72xx SBC") | |||
252 | .handle_irq = vic_handle_irq, | 252 | .handle_irq = vic_handle_irq, |
253 | .timer = &ep93xx_timer, | 253 | .timer = &ep93xx_timer, |
254 | .init_machine = ts72xx_init_machine, | 254 | .init_machine = ts72xx_init_machine, |
255 | .init_late = ep93xx_init_late, | ||
255 | .restart = ep93xx_restart, | 256 | .restart = ep93xx_restart, |
256 | MACHINE_END | 257 | MACHINE_END |
diff --git a/arch/arm/mach-ep93xx/vision_ep9307.c b/arch/arm/mach-ep93xx/vision_ep9307.c index ba156eb225e8..2905a4929bdc 100644 --- a/arch/arm/mach-ep93xx/vision_ep9307.c +++ b/arch/arm/mach-ep93xx/vision_ep9307.c | |||
@@ -367,5 +367,6 @@ MACHINE_START(VISION_EP9307, "Vision Engraving Systems EP9307") | |||
367 | .handle_irq = vic_handle_irq, | 367 | .handle_irq = vic_handle_irq, |
368 | .timer = &ep93xx_timer, | 368 | .timer = &ep93xx_timer, |
369 | .init_machine = vision_init_machine, | 369 | .init_machine = vision_init_machine, |
370 | .init_late = ep93xx_init_late, | ||
370 | .restart = ep93xx_restart, | 371 | .restart = ep93xx_restart, |
371 | MACHINE_END | 372 | MACHINE_END |
diff --git a/arch/arm/mach-exynos/Kconfig b/arch/arm/mach-exynos/Kconfig index 15b05b89cc39..43ebe9094411 100644 --- a/arch/arm/mach-exynos/Kconfig +++ b/arch/arm/mach-exynos/Kconfig | |||
@@ -61,6 +61,7 @@ config SOC_EXYNOS5250 | |||
61 | bool "SAMSUNG EXYNOS5250" | 61 | bool "SAMSUNG EXYNOS5250" |
62 | default y | 62 | default y |
63 | depends on ARCH_EXYNOS5 | 63 | depends on ARCH_EXYNOS5 |
64 | select SAMSUNG_DMADEV | ||
64 | help | 65 | help |
65 | Enable EXYNOS5250 SoC support | 66 | Enable EXYNOS5250 SoC support |
66 | 67 | ||
@@ -70,7 +71,7 @@ config EXYNOS4_MCT | |||
70 | help | 71 | help |
71 | Use MCT (Multi Core Timer) as kernel timers | 72 | Use MCT (Multi Core Timer) as kernel timers |
72 | 73 | ||
73 | config EXYNOS4_DEV_DMA | 74 | config EXYNOS_DEV_DMA |
74 | bool | 75 | bool |
75 | help | 76 | help |
76 | Compile in amba device definitions for DMA controller | 77 | Compile in amba device definitions for DMA controller |
@@ -80,15 +81,20 @@ config EXYNOS4_DEV_AHCI | |||
80 | help | 81 | help |
81 | Compile in platform device definitions for AHCI | 82 | Compile in platform device definitions for AHCI |
82 | 83 | ||
84 | config EXYNOS_DEV_DRM | ||
85 | bool | ||
86 | help | ||
87 | Compile in platform device definitions for core DRM device | ||
88 | |||
83 | config EXYNOS4_SETUP_FIMD0 | 89 | config EXYNOS4_SETUP_FIMD0 |
84 | bool | 90 | bool |
85 | help | 91 | help |
86 | Common setup code for FIMD0. | 92 | Common setup code for FIMD0. |
87 | 93 | ||
88 | config EXYNOS4_DEV_SYSMMU | 94 | config EXYNOS_DEV_SYSMMU |
89 | bool | 95 | bool |
90 | help | 96 | help |
91 | Common setup code for SYSTEM MMU in EXYNOS4 | 97 | Common setup code for SYSTEM MMU in EXYNOS platforms |
92 | 98 | ||
93 | config EXYNOS4_DEV_DWMCI | 99 | config EXYNOS4_DEV_DWMCI |
94 | bool | 100 | bool |
@@ -161,7 +167,7 @@ config EXYNOS4_SETUP_USB_PHY | |||
161 | help | 167 | help |
162 | Common setup code for USB PHY controller | 168 | Common setup code for USB PHY controller |
163 | 169 | ||
164 | config EXYNOS4_SETUP_SPI | 170 | config EXYNOS_SETUP_SPI |
165 | bool | 171 | bool |
166 | help | 172 | help |
167 | Common setup code for SPI GPIO configurations. | 173 | Common setup code for SPI GPIO configurations. |
@@ -201,12 +207,12 @@ config MACH_SMDKV310 | |||
201 | select S3C_DEV_HSMMC3 | 207 | select S3C_DEV_HSMMC3 |
202 | select SAMSUNG_DEV_BACKLIGHT | 208 | select SAMSUNG_DEV_BACKLIGHT |
203 | select EXYNOS_DEV_DRM | 209 | select EXYNOS_DEV_DRM |
210 | select EXYNOS_DEV_SYSMMU | ||
204 | select EXYNOS4_DEV_AHCI | 211 | select EXYNOS4_DEV_AHCI |
205 | select SAMSUNG_DEV_KEYPAD | 212 | select SAMSUNG_DEV_KEYPAD |
206 | select EXYNOS4_DEV_DMA | 213 | select EXYNOS4_DEV_DMA |
207 | select SAMSUNG_DEV_PWM | 214 | select SAMSUNG_DEV_PWM |
208 | select EXYNOS4_DEV_USB_OHCI | 215 | select EXYNOS4_DEV_USB_OHCI |
209 | select EXYNOS4_DEV_SYSMMU | ||
210 | select EXYNOS4_SETUP_FIMD0 | 216 | select EXYNOS4_SETUP_FIMD0 |
211 | select EXYNOS4_SETUP_I2C1 | 217 | select EXYNOS4_SETUP_I2C1 |
212 | select EXYNOS4_SETUP_KEYPAD | 218 | select EXYNOS4_SETUP_KEYPAD |
@@ -224,8 +230,7 @@ config MACH_ARMLEX4210 | |||
224 | select S3C_DEV_HSMMC2 | 230 | select S3C_DEV_HSMMC2 |
225 | select S3C_DEV_HSMMC3 | 231 | select S3C_DEV_HSMMC3 |
226 | select EXYNOS4_DEV_AHCI | 232 | select EXYNOS4_DEV_AHCI |
227 | select EXYNOS4_DEV_DMA | 233 | select EXYNOS_DEV_DMA |
228 | select EXYNOS4_DEV_SYSMMU | ||
229 | select EXYNOS4_SETUP_SDHCI | 234 | select EXYNOS4_SETUP_SDHCI |
230 | help | 235 | help |
231 | Machine support for Samsung ARMLEX4210 based on EXYNOS4210 | 236 | Machine support for Samsung ARMLEX4210 based on EXYNOS4210 |
@@ -256,6 +261,7 @@ config MACH_UNIVERSAL_C210 | |||
256 | select S5P_DEV_MFC | 261 | select S5P_DEV_MFC |
257 | select S5P_DEV_ONENAND | 262 | select S5P_DEV_ONENAND |
258 | select S5P_DEV_TV | 263 | select S5P_DEV_TV |
264 | select EXYNOS_DEV_SYSMMU | ||
259 | select EXYNOS4_DEV_DMA | 265 | select EXYNOS4_DEV_DMA |
260 | select EXYNOS_DEV_DRM | 266 | select EXYNOS_DEV_DRM |
261 | select EXYNOS4_SETUP_FIMD0 | 267 | select EXYNOS4_SETUP_FIMD0 |
@@ -332,6 +338,7 @@ config MACH_ORIGEN | |||
332 | select SAMSUNG_DEV_BACKLIGHT | 338 | select SAMSUNG_DEV_BACKLIGHT |
333 | select SAMSUNG_DEV_PWM | 339 | select SAMSUNG_DEV_PWM |
334 | select EXYNOS_DEV_DRM | 340 | select EXYNOS_DEV_DRM |
341 | select EXYNOS_DEV_SYSMMU | ||
335 | select EXYNOS4_DEV_DMA | 342 | select EXYNOS4_DEV_DMA |
336 | select EXYNOS4_DEV_USB_OHCI | 343 | select EXYNOS4_DEV_USB_OHCI |
337 | select EXYNOS4_SETUP_FIMD0 | 344 | select EXYNOS4_SETUP_FIMD0 |
@@ -360,7 +367,8 @@ config MACH_SMDK4212 | |||
360 | select SAMSUNG_DEV_BACKLIGHT | 367 | select SAMSUNG_DEV_BACKLIGHT |
361 | select SAMSUNG_DEV_KEYPAD | 368 | select SAMSUNG_DEV_KEYPAD |
362 | select SAMSUNG_DEV_PWM | 369 | select SAMSUNG_DEV_PWM |
363 | select EXYNOS4_DEV_DMA | 370 | select EXYNOS_DEV_SYSMMU |
371 | select EXYNOS_DEV_DMA | ||
364 | select EXYNOS4_SETUP_I2C1 | 372 | select EXYNOS4_SETUP_I2C1 |
365 | select EXYNOS4_SETUP_I2C3 | 373 | select EXYNOS4_SETUP_I2C3 |
366 | select EXYNOS4_SETUP_I2C7 | 374 | select EXYNOS4_SETUP_I2C7 |
diff --git a/arch/arm/mach-exynos/Makefile b/arch/arm/mach-exynos/Makefile index 8631840d1b5e..440a637c76f1 100644 --- a/arch/arm/mach-exynos/Makefile +++ b/arch/arm/mach-exynos/Makefile | |||
@@ -50,10 +50,11 @@ obj-$(CONFIG_MACH_EXYNOS5_DT) += mach-exynos5-dt.o | |||
50 | obj-y += dev-uart.o | 50 | obj-y += dev-uart.o |
51 | obj-$(CONFIG_ARCH_EXYNOS4) += dev-audio.o | 51 | obj-$(CONFIG_ARCH_EXYNOS4) += dev-audio.o |
52 | obj-$(CONFIG_EXYNOS4_DEV_AHCI) += dev-ahci.o | 52 | obj-$(CONFIG_EXYNOS4_DEV_AHCI) += dev-ahci.o |
53 | obj-$(CONFIG_EXYNOS4_DEV_SYSMMU) += dev-sysmmu.o | ||
54 | obj-$(CONFIG_EXYNOS4_DEV_DWMCI) += dev-dwmci.o | 53 | obj-$(CONFIG_EXYNOS4_DEV_DWMCI) += dev-dwmci.o |
55 | obj-$(CONFIG_EXYNOS4_DEV_DMA) += dma.o | 54 | obj-$(CONFIG_EXYNOS_DEV_DMA) += dma.o |
56 | obj-$(CONFIG_EXYNOS4_DEV_USB_OHCI) += dev-ohci.o | 55 | obj-$(CONFIG_EXYNOS4_DEV_USB_OHCI) += dev-ohci.o |
56 | obj-$(CONFIG_EXYNOS_DEV_DRM) += dev-drm.o | ||
57 | obj-$(CONFIG_EXYNOS_DEV_SYSMMU) += dev-sysmmu.o | ||
57 | 58 | ||
58 | obj-$(CONFIG_ARCH_EXYNOS) += setup-i2c0.o | 59 | obj-$(CONFIG_ARCH_EXYNOS) += setup-i2c0.o |
59 | obj-$(CONFIG_EXYNOS4_SETUP_FIMC) += setup-fimc.o | 60 | obj-$(CONFIG_EXYNOS4_SETUP_FIMC) += setup-fimc.o |
@@ -68,4 +69,4 @@ obj-$(CONFIG_EXYNOS4_SETUP_I2C7) += setup-i2c7.o | |||
68 | obj-$(CONFIG_EXYNOS4_SETUP_KEYPAD) += setup-keypad.o | 69 | obj-$(CONFIG_EXYNOS4_SETUP_KEYPAD) += setup-keypad.o |
69 | obj-$(CONFIG_EXYNOS4_SETUP_SDHCI_GPIO) += setup-sdhci-gpio.o | 70 | obj-$(CONFIG_EXYNOS4_SETUP_SDHCI_GPIO) += setup-sdhci-gpio.o |
70 | obj-$(CONFIG_EXYNOS4_SETUP_USB_PHY) += setup-usb-phy.o | 71 | obj-$(CONFIG_EXYNOS4_SETUP_USB_PHY) += setup-usb-phy.o |
71 | obj-$(CONFIG_EXYNOS4_SETUP_SPI) += setup-spi.o | 72 | obj-$(CONFIG_EXYNOS_SETUP_SPI) += setup-spi.o |
diff --git a/arch/arm/mach-exynos/Makefile.boot b/arch/arm/mach-exynos/Makefile.boot index b9862e22bf10..31bd181b0514 100644 --- a/arch/arm/mach-exynos/Makefile.boot +++ b/arch/arm/mach-exynos/Makefile.boot | |||
@@ -1,2 +1,5 @@ | |||
1 | zreladdr-y += 0x40008000 | 1 | zreladdr-y += 0x40008000 |
2 | params_phys-y := 0x40000100 | 2 | params_phys-y := 0x40000100 |
3 | |||
4 | dtb-$(CONFIG_MACH_EXYNOS4_DT) += exynos4210-origen.dtb exynos4210-smdkv310.dtb | ||
5 | dtb-$(CONFIG_MACH_EXYNOS5_DT) += exynos5250-smdk5250.dtb | ||
diff --git a/arch/arm/mach-exynos/clock-exynos4.c b/arch/arm/mach-exynos/clock-exynos4.c index 6efd1e5919fd..bcb7db453145 100644 --- a/arch/arm/mach-exynos/clock-exynos4.c +++ b/arch/arm/mach-exynos/clock-exynos4.c | |||
@@ -168,7 +168,7 @@ static int exynos4_clk_ip_tv_ctrl(struct clk *clk, int enable) | |||
168 | return s5p_gatectrl(EXYNOS4_CLKGATE_IP_TV, clk, enable); | 168 | return s5p_gatectrl(EXYNOS4_CLKGATE_IP_TV, clk, enable); |
169 | } | 169 | } |
170 | 170 | ||
171 | static int exynos4_clk_ip_image_ctrl(struct clk *clk, int enable) | 171 | int exynos4_clk_ip_image_ctrl(struct clk *clk, int enable) |
172 | { | 172 | { |
173 | return s5p_gatectrl(EXYNOS4_CLKGATE_IP_IMAGE, clk, enable); | 173 | return s5p_gatectrl(EXYNOS4_CLKGATE_IP_IMAGE, clk, enable); |
174 | } | 174 | } |
@@ -198,6 +198,11 @@ static int exynos4_clk_ip_perir_ctrl(struct clk *clk, int enable) | |||
198 | return s5p_gatectrl(EXYNOS4_CLKGATE_IP_PERIR, clk, enable); | 198 | return s5p_gatectrl(EXYNOS4_CLKGATE_IP_PERIR, clk, enable); |
199 | } | 199 | } |
200 | 200 | ||
201 | int exynos4_clk_ip_dmc_ctrl(struct clk *clk, int enable) | ||
202 | { | ||
203 | return s5p_gatectrl(EXYNOS4_CLKGATE_IP_DMC, clk, enable); | ||
204 | } | ||
205 | |||
201 | static int exynos4_clk_hdmiphy_ctrl(struct clk *clk, int enable) | 206 | static int exynos4_clk_hdmiphy_ctrl(struct clk *clk, int enable) |
202 | { | 207 | { |
203 | return s5p_gatectrl(S5P_HDMI_PHY_CONTROL, clk, enable); | 208 | return s5p_gatectrl(S5P_HDMI_PHY_CONTROL, clk, enable); |
@@ -678,61 +683,55 @@ static struct clk exynos4_init_clocks_off[] = { | |||
678 | .enable = exynos4_clk_ip_peril_ctrl, | 683 | .enable = exynos4_clk_ip_peril_ctrl, |
679 | .ctrlbit = (1 << 14), | 684 | .ctrlbit = (1 << 14), |
680 | }, { | 685 | }, { |
681 | .name = "SYSMMU_MDMA", | 686 | .name = SYSMMU_CLOCK_NAME, |
687 | .devname = SYSMMU_CLOCK_DEVNAME(mfc_l, 0), | ||
688 | .enable = exynos4_clk_ip_mfc_ctrl, | ||
689 | .ctrlbit = (1 << 1), | ||
690 | }, { | ||
691 | .name = SYSMMU_CLOCK_NAME, | ||
692 | .devname = SYSMMU_CLOCK_DEVNAME(mfc_r, 1), | ||
693 | .enable = exynos4_clk_ip_mfc_ctrl, | ||
694 | .ctrlbit = (1 << 2), | ||
695 | }, { | ||
696 | .name = SYSMMU_CLOCK_NAME, | ||
697 | .devname = SYSMMU_CLOCK_DEVNAME(tv, 2), | ||
698 | .enable = exynos4_clk_ip_tv_ctrl, | ||
699 | .ctrlbit = (1 << 4), | ||
700 | }, { | ||
701 | .name = SYSMMU_CLOCK_NAME, | ||
702 | .devname = SYSMMU_CLOCK_DEVNAME(jpeg, 3), | ||
703 | .enable = exynos4_clk_ip_cam_ctrl, | ||
704 | .ctrlbit = (1 << 11), | ||
705 | }, { | ||
706 | .name = SYSMMU_CLOCK_NAME, | ||
707 | .devname = SYSMMU_CLOCK_DEVNAME(rot, 4), | ||
682 | .enable = exynos4_clk_ip_image_ctrl, | 708 | .enable = exynos4_clk_ip_image_ctrl, |
683 | .ctrlbit = (1 << 5), | 709 | .ctrlbit = (1 << 4), |
684 | }, { | 710 | }, { |
685 | .name = "SYSMMU_FIMC0", | 711 | .name = SYSMMU_CLOCK_NAME, |
712 | .devname = SYSMMU_CLOCK_DEVNAME(fimc0, 5), | ||
686 | .enable = exynos4_clk_ip_cam_ctrl, | 713 | .enable = exynos4_clk_ip_cam_ctrl, |
687 | .ctrlbit = (1 << 7), | 714 | .ctrlbit = (1 << 7), |
688 | }, { | 715 | }, { |
689 | .name = "SYSMMU_FIMC1", | 716 | .name = SYSMMU_CLOCK_NAME, |
717 | .devname = SYSMMU_CLOCK_DEVNAME(fimc1, 6), | ||
690 | .enable = exynos4_clk_ip_cam_ctrl, | 718 | .enable = exynos4_clk_ip_cam_ctrl, |
691 | .ctrlbit = (1 << 8), | 719 | .ctrlbit = (1 << 8), |
692 | }, { | 720 | }, { |
693 | .name = "SYSMMU_FIMC2", | 721 | .name = SYSMMU_CLOCK_NAME, |
722 | .devname = SYSMMU_CLOCK_DEVNAME(fimc2, 7), | ||
694 | .enable = exynos4_clk_ip_cam_ctrl, | 723 | .enable = exynos4_clk_ip_cam_ctrl, |
695 | .ctrlbit = (1 << 9), | 724 | .ctrlbit = (1 << 9), |
696 | }, { | 725 | }, { |
697 | .name = "SYSMMU_FIMC3", | 726 | .name = SYSMMU_CLOCK_NAME, |
727 | .devname = SYSMMU_CLOCK_DEVNAME(fimc3, 8), | ||
698 | .enable = exynos4_clk_ip_cam_ctrl, | 728 | .enable = exynos4_clk_ip_cam_ctrl, |
699 | .ctrlbit = (1 << 10), | 729 | .ctrlbit = (1 << 10), |
700 | }, { | 730 | }, { |
701 | .name = "SYSMMU_JPEG", | 731 | .name = SYSMMU_CLOCK_NAME, |
702 | .enable = exynos4_clk_ip_cam_ctrl, | 732 | .devname = SYSMMU_CLOCK_DEVNAME(fimd0, 10), |
703 | .ctrlbit = (1 << 11), | ||
704 | }, { | ||
705 | .name = "SYSMMU_FIMD0", | ||
706 | .enable = exynos4_clk_ip_lcd0_ctrl, | 733 | .enable = exynos4_clk_ip_lcd0_ctrl, |
707 | .ctrlbit = (1 << 4), | 734 | .ctrlbit = (1 << 4), |
708 | }, { | ||
709 | .name = "SYSMMU_FIMD1", | ||
710 | .enable = exynos4_clk_ip_lcd1_ctrl, | ||
711 | .ctrlbit = (1 << 4), | ||
712 | }, { | ||
713 | .name = "SYSMMU_PCIe", | ||
714 | .enable = exynos4_clk_ip_fsys_ctrl, | ||
715 | .ctrlbit = (1 << 18), | ||
716 | }, { | ||
717 | .name = "SYSMMU_G2D", | ||
718 | .enable = exynos4_clk_ip_image_ctrl, | ||
719 | .ctrlbit = (1 << 3), | ||
720 | }, { | ||
721 | .name = "SYSMMU_ROTATOR", | ||
722 | .enable = exynos4_clk_ip_image_ctrl, | ||
723 | .ctrlbit = (1 << 4), | ||
724 | }, { | ||
725 | .name = "SYSMMU_TV", | ||
726 | .enable = exynos4_clk_ip_tv_ctrl, | ||
727 | .ctrlbit = (1 << 4), | ||
728 | }, { | ||
729 | .name = "SYSMMU_MFC_L", | ||
730 | .enable = exynos4_clk_ip_mfc_ctrl, | ||
731 | .ctrlbit = (1 << 1), | ||
732 | }, { | ||
733 | .name = "SYSMMU_MFC_R", | ||
734 | .enable = exynos4_clk_ip_mfc_ctrl, | ||
735 | .ctrlbit = (1 << 2), | ||
736 | } | 735 | } |
737 | }; | 736 | }; |
738 | 737 | ||
diff --git a/arch/arm/mach-exynos/clock-exynos4.h b/arch/arm/mach-exynos/clock-exynos4.h index cb71c29c14d1..28a119701182 100644 --- a/arch/arm/mach-exynos/clock-exynos4.h +++ b/arch/arm/mach-exynos/clock-exynos4.h | |||
@@ -26,5 +26,7 @@ extern struct clk *exynos4_clkset_group_list[]; | |||
26 | extern int exynos4_clksrc_mask_fsys_ctrl(struct clk *clk, int enable); | 26 | extern int exynos4_clksrc_mask_fsys_ctrl(struct clk *clk, int enable); |
27 | extern int exynos4_clk_ip_fsys_ctrl(struct clk *clk, int enable); | 27 | extern int exynos4_clk_ip_fsys_ctrl(struct clk *clk, int enable); |
28 | extern int exynos4_clk_ip_lcd1_ctrl(struct clk *clk, int enable); | 28 | extern int exynos4_clk_ip_lcd1_ctrl(struct clk *clk, int enable); |
29 | extern int exynos4_clk_ip_image_ctrl(struct clk *clk, int enable); | ||
30 | extern int exynos4_clk_ip_dmc_ctrl(struct clk *clk, int enable); | ||
29 | 31 | ||
30 | #endif /* __ASM_ARCH_CLOCK_H */ | 32 | #endif /* __ASM_ARCH_CLOCK_H */ |
diff --git a/arch/arm/mach-exynos/clock-exynos4210.c b/arch/arm/mach-exynos/clock-exynos4210.c index 3b131e4b6ef5..b8689ff60baf 100644 --- a/arch/arm/mach-exynos/clock-exynos4210.c +++ b/arch/arm/mach-exynos/clock-exynos4210.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <mach/hardware.h> | 26 | #include <mach/hardware.h> |
27 | #include <mach/map.h> | 27 | #include <mach/map.h> |
28 | #include <mach/regs-clock.h> | 28 | #include <mach/regs-clock.h> |
29 | #include <mach/sysmmu.h> | ||
29 | 30 | ||
30 | #include "common.h" | 31 | #include "common.h" |
31 | #include "clock-exynos4.h" | 32 | #include "clock-exynos4.h" |
@@ -94,6 +95,16 @@ static struct clk init_clocks_off[] = { | |||
94 | .devname = "exynos4-fb.1", | 95 | .devname = "exynos4-fb.1", |
95 | .enable = exynos4_clk_ip_lcd1_ctrl, | 96 | .enable = exynos4_clk_ip_lcd1_ctrl, |
96 | .ctrlbit = (1 << 0), | 97 | .ctrlbit = (1 << 0), |
98 | }, { | ||
99 | .name = SYSMMU_CLOCK_NAME, | ||
100 | .devname = SYSMMU_CLOCK_DEVNAME(2d, 14), | ||
101 | .enable = exynos4_clk_ip_image_ctrl, | ||
102 | .ctrlbit = (1 << 3), | ||
103 | }, { | ||
104 | .name = SYSMMU_CLOCK_NAME, | ||
105 | .devname = SYSMMU_CLOCK_DEVNAME(fimd1, 11), | ||
106 | .enable = exynos4_clk_ip_lcd1_ctrl, | ||
107 | .ctrlbit = (1 << 4), | ||
97 | }, | 108 | }, |
98 | }; | 109 | }; |
99 | 110 | ||
diff --git a/arch/arm/mach-exynos/clock-exynos4212.c b/arch/arm/mach-exynos/clock-exynos4212.c index 3ecc01e06f74..da397d21bbcf 100644 --- a/arch/arm/mach-exynos/clock-exynos4212.c +++ b/arch/arm/mach-exynos/clock-exynos4212.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <mach/hardware.h> | 26 | #include <mach/hardware.h> |
27 | #include <mach/map.h> | 27 | #include <mach/map.h> |
28 | #include <mach/regs-clock.h> | 28 | #include <mach/regs-clock.h> |
29 | #include <mach/sysmmu.h> | ||
29 | 30 | ||
30 | #include "common.h" | 31 | #include "common.h" |
31 | #include "clock-exynos4.h" | 32 | #include "clock-exynos4.h" |
@@ -39,6 +40,16 @@ static struct sleep_save exynos4212_clock_save[] = { | |||
39 | }; | 40 | }; |
40 | #endif | 41 | #endif |
41 | 42 | ||
43 | static int exynos4212_clk_ip_isp0_ctrl(struct clk *clk, int enable) | ||
44 | { | ||
45 | return s5p_gatectrl(EXYNOS4_CLKGATE_IP_ISP0, clk, enable); | ||
46 | } | ||
47 | |||
48 | static int exynos4212_clk_ip_isp1_ctrl(struct clk *clk, int enable) | ||
49 | { | ||
50 | return s5p_gatectrl(EXYNOS4_CLKGATE_IP_ISP1, clk, enable); | ||
51 | } | ||
52 | |||
42 | static struct clk *clk_src_mpll_user_list[] = { | 53 | static struct clk *clk_src_mpll_user_list[] = { |
43 | [0] = &clk_fin_mpll, | 54 | [0] = &clk_fin_mpll, |
44 | [1] = &exynos4_clk_mout_mpll.clk, | 55 | [1] = &exynos4_clk_mout_mpll.clk, |
@@ -66,7 +77,32 @@ static struct clksrc_clk clksrcs[] = { | |||
66 | }; | 77 | }; |
67 | 78 | ||
68 | static struct clk init_clocks_off[] = { | 79 | static struct clk init_clocks_off[] = { |
69 | /* nothing here yet */ | 80 | { |
81 | .name = SYSMMU_CLOCK_NAME, | ||
82 | .devname = SYSMMU_CLOCK_DEVNAME(2d, 14), | ||
83 | .enable = exynos4_clk_ip_dmc_ctrl, | ||
84 | .ctrlbit = (1 << 24), | ||
85 | }, { | ||
86 | .name = SYSMMU_CLOCK_NAME, | ||
87 | .devname = SYSMMU_CLOCK_DEVNAME(isp, 9), | ||
88 | .enable = exynos4212_clk_ip_isp0_ctrl, | ||
89 | .ctrlbit = (7 << 8), | ||
90 | }, { | ||
91 | .name = SYSMMU_CLOCK_NAME2, | ||
92 | .devname = SYSMMU_CLOCK_DEVNAME(isp, 9), | ||
93 | .enable = exynos4212_clk_ip_isp1_ctrl, | ||
94 | .ctrlbit = (1 << 4), | ||
95 | }, { | ||
96 | .name = "flite", | ||
97 | .devname = "exynos-fimc-lite.0", | ||
98 | .enable = exynos4212_clk_ip_isp0_ctrl, | ||
99 | .ctrlbit = (1 << 4), | ||
100 | }, { | ||
101 | .name = "flite", | ||
102 | .devname = "exynos-fimc-lite.1", | ||
103 | .enable = exynos4212_clk_ip_isp0_ctrl, | ||
104 | .ctrlbit = (1 << 3), | ||
105 | } | ||
70 | }; | 106 | }; |
71 | 107 | ||
72 | #ifdef CONFIG_PM_SLEEP | 108 | #ifdef CONFIG_PM_SLEEP |
diff --git a/arch/arm/mach-exynos/clock-exynos5.c b/arch/arm/mach-exynos/clock-exynos5.c index 7ac6ff4c46bd..5aa460b01fdf 100644 --- a/arch/arm/mach-exynos/clock-exynos5.c +++ b/arch/arm/mach-exynos/clock-exynos5.c | |||
@@ -82,6 +82,11 @@ static int exynos5_clksrc_mask_peric0_ctrl(struct clk *clk, int enable) | |||
82 | return s5p_gatectrl(EXYNOS5_CLKSRC_MASK_PERIC0, clk, enable); | 82 | return s5p_gatectrl(EXYNOS5_CLKSRC_MASK_PERIC0, clk, enable); |
83 | } | 83 | } |
84 | 84 | ||
85 | static int exynos5_clk_ip_acp_ctrl(struct clk *clk, int enable) | ||
86 | { | ||
87 | return s5p_gatectrl(EXYNOS5_CLKGATE_IP_ACP, clk, enable); | ||
88 | } | ||
89 | |||
85 | static int exynos5_clk_ip_core_ctrl(struct clk *clk, int enable) | 90 | static int exynos5_clk_ip_core_ctrl(struct clk *clk, int enable) |
86 | { | 91 | { |
87 | return s5p_gatectrl(EXYNOS5_CLKGATE_IP_CORE, clk, enable); | 92 | return s5p_gatectrl(EXYNOS5_CLKGATE_IP_CORE, clk, enable); |
@@ -127,6 +132,21 @@ static int exynos5_clk_ip_peris_ctrl(struct clk *clk, int enable) | |||
127 | return s5p_gatectrl(EXYNOS5_CLKGATE_IP_PERIS, clk, enable); | 132 | return s5p_gatectrl(EXYNOS5_CLKGATE_IP_PERIS, clk, enable); |
128 | } | 133 | } |
129 | 134 | ||
135 | static int exynos5_clk_ip_gscl_ctrl(struct clk *clk, int enable) | ||
136 | { | ||
137 | return s5p_gatectrl(EXYNOS5_CLKGATE_IP_GSCL, clk, enable); | ||
138 | } | ||
139 | |||
140 | static int exynos5_clk_ip_isp0_ctrl(struct clk *clk, int enable) | ||
141 | { | ||
142 | return s5p_gatectrl(EXYNOS5_CLKGATE_IP_ISP0, clk, enable); | ||
143 | } | ||
144 | |||
145 | static int exynos5_clk_ip_isp1_ctrl(struct clk *clk, int enable) | ||
146 | { | ||
147 | return s5p_gatectrl(EXYNOS5_CLKGATE_IP_ISP1, clk, enable); | ||
148 | } | ||
149 | |||
130 | /* Core list of CMU_CPU side */ | 150 | /* Core list of CMU_CPU side */ |
131 | 151 | ||
132 | static struct clksrc_clk exynos5_clk_mout_apll = { | 152 | static struct clksrc_clk exynos5_clk_mout_apll = { |
@@ -145,11 +165,29 @@ static struct clksrc_clk exynos5_clk_sclk_apll = { | |||
145 | .reg_div = { .reg = EXYNOS5_CLKDIV_CPU0, .shift = 24, .size = 3 }, | 165 | .reg_div = { .reg = EXYNOS5_CLKDIV_CPU0, .shift = 24, .size = 3 }, |
146 | }; | 166 | }; |
147 | 167 | ||
168 | static struct clksrc_clk exynos5_clk_mout_bpll_fout = { | ||
169 | .clk = { | ||
170 | .name = "mout_bpll_fout", | ||
171 | }, | ||
172 | .sources = &clk_src_bpll_fout, | ||
173 | .reg_src = { .reg = EXYNOS5_PLL_DIV2_SEL, .shift = 0, .size = 1 }, | ||
174 | }; | ||
175 | |||
176 | static struct clk *exynos5_clk_src_bpll_list[] = { | ||
177 | [0] = &clk_fin_bpll, | ||
178 | [1] = &exynos5_clk_mout_bpll_fout.clk, | ||
179 | }; | ||
180 | |||
181 | static struct clksrc_sources exynos5_clk_src_bpll = { | ||
182 | .sources = exynos5_clk_src_bpll_list, | ||
183 | .nr_sources = ARRAY_SIZE(exynos5_clk_src_bpll_list), | ||
184 | }; | ||
185 | |||
148 | static struct clksrc_clk exynos5_clk_mout_bpll = { | 186 | static struct clksrc_clk exynos5_clk_mout_bpll = { |
149 | .clk = { | 187 | .clk = { |
150 | .name = "mout_bpll", | 188 | .name = "mout_bpll", |
151 | }, | 189 | }, |
152 | .sources = &clk_src_bpll, | 190 | .sources = &exynos5_clk_src_bpll, |
153 | .reg_src = { .reg = EXYNOS5_CLKSRC_CDREX, .shift = 0, .size = 1 }, | 191 | .reg_src = { .reg = EXYNOS5_CLKSRC_CDREX, .shift = 0, .size = 1 }, |
154 | }; | 192 | }; |
155 | 193 | ||
@@ -187,11 +225,29 @@ static struct clksrc_clk exynos5_clk_mout_epll = { | |||
187 | .reg_src = { .reg = EXYNOS5_CLKSRC_TOP2, .shift = 12, .size = 1 }, | 225 | .reg_src = { .reg = EXYNOS5_CLKSRC_TOP2, .shift = 12, .size = 1 }, |
188 | }; | 226 | }; |
189 | 227 | ||
228 | static struct clksrc_clk exynos5_clk_mout_mpll_fout = { | ||
229 | .clk = { | ||
230 | .name = "mout_mpll_fout", | ||
231 | }, | ||
232 | .sources = &clk_src_mpll_fout, | ||
233 | .reg_src = { .reg = EXYNOS5_PLL_DIV2_SEL, .shift = 4, .size = 1 }, | ||
234 | }; | ||
235 | |||
236 | static struct clk *exynos5_clk_src_mpll_list[] = { | ||
237 | [0] = &clk_fin_mpll, | ||
238 | [1] = &exynos5_clk_mout_mpll_fout.clk, | ||
239 | }; | ||
240 | |||
241 | static struct clksrc_sources exynos5_clk_src_mpll = { | ||
242 | .sources = exynos5_clk_src_mpll_list, | ||
243 | .nr_sources = ARRAY_SIZE(exynos5_clk_src_mpll_list), | ||
244 | }; | ||
245 | |||
190 | struct clksrc_clk exynos5_clk_mout_mpll = { | 246 | struct clksrc_clk exynos5_clk_mout_mpll = { |
191 | .clk = { | 247 | .clk = { |
192 | .name = "mout_mpll", | 248 | .name = "mout_mpll", |
193 | }, | 249 | }, |
194 | .sources = &clk_src_mpll, | 250 | .sources = &exynos5_clk_src_mpll, |
195 | .reg_src = { .reg = EXYNOS5_CLKSRC_CORE1, .shift = 8, .size = 1 }, | 251 | .reg_src = { .reg = EXYNOS5_CLKSRC_CORE1, .shift = 8, .size = 1 }, |
196 | }; | 252 | }; |
197 | 253 | ||
@@ -454,6 +510,11 @@ static struct clk exynos5_init_clocks_off[] = { | |||
454 | .enable = exynos5_clk_ip_peris_ctrl, | 510 | .enable = exynos5_clk_ip_peris_ctrl, |
455 | .ctrlbit = (1 << 20), | 511 | .ctrlbit = (1 << 20), |
456 | }, { | 512 | }, { |
513 | .name = "watchdog", | ||
514 | .parent = &exynos5_clk_aclk_66.clk, | ||
515 | .enable = exynos5_clk_ip_peris_ctrl, | ||
516 | .ctrlbit = (1 << 19), | ||
517 | }, { | ||
457 | .name = "hsmmc", | 518 | .name = "hsmmc", |
458 | .devname = "exynos4-sdhci.0", | 519 | .devname = "exynos4-sdhci.0", |
459 | .parent = &exynos5_clk_aclk_200.clk, | 520 | .parent = &exynos5_clk_aclk_200.clk, |
@@ -630,6 +691,76 @@ static struct clk exynos5_init_clocks_off[] = { | |||
630 | .parent = &exynos5_clk_aclk_66.clk, | 691 | .parent = &exynos5_clk_aclk_66.clk, |
631 | .enable = exynos5_clk_ip_peric_ctrl, | 692 | .enable = exynos5_clk_ip_peric_ctrl, |
632 | .ctrlbit = (1 << 14), | 693 | .ctrlbit = (1 << 14), |
694 | }, { | ||
695 | .name = SYSMMU_CLOCK_NAME, | ||
696 | .devname = SYSMMU_CLOCK_DEVNAME(mfc_l, 0), | ||
697 | .enable = &exynos5_clk_ip_mfc_ctrl, | ||
698 | .ctrlbit = (1 << 1), | ||
699 | }, { | ||
700 | .name = SYSMMU_CLOCK_NAME, | ||
701 | .devname = SYSMMU_CLOCK_DEVNAME(mfc_r, 1), | ||
702 | .enable = &exynos5_clk_ip_mfc_ctrl, | ||
703 | .ctrlbit = (1 << 2), | ||
704 | }, { | ||
705 | .name = SYSMMU_CLOCK_NAME, | ||
706 | .devname = SYSMMU_CLOCK_DEVNAME(tv, 2), | ||
707 | .enable = &exynos5_clk_ip_disp1_ctrl, | ||
708 | .ctrlbit = (1 << 9) | ||
709 | }, { | ||
710 | .name = SYSMMU_CLOCK_NAME, | ||
711 | .devname = SYSMMU_CLOCK_DEVNAME(jpeg, 3), | ||
712 | .enable = &exynos5_clk_ip_gen_ctrl, | ||
713 | .ctrlbit = (1 << 7), | ||
714 | }, { | ||
715 | .name = SYSMMU_CLOCK_NAME, | ||
716 | .devname = SYSMMU_CLOCK_DEVNAME(rot, 4), | ||
717 | .enable = &exynos5_clk_ip_gen_ctrl, | ||
718 | .ctrlbit = (1 << 6) | ||
719 | }, { | ||
720 | .name = SYSMMU_CLOCK_NAME, | ||
721 | .devname = SYSMMU_CLOCK_DEVNAME(gsc0, 5), | ||
722 | .enable = &exynos5_clk_ip_gscl_ctrl, | ||
723 | .ctrlbit = (1 << 7), | ||
724 | }, { | ||
725 | .name = SYSMMU_CLOCK_NAME, | ||
726 | .devname = SYSMMU_CLOCK_DEVNAME(gsc1, 6), | ||
727 | .enable = &exynos5_clk_ip_gscl_ctrl, | ||
728 | .ctrlbit = (1 << 8), | ||
729 | }, { | ||
730 | .name = SYSMMU_CLOCK_NAME, | ||
731 | .devname = SYSMMU_CLOCK_DEVNAME(gsc2, 7), | ||
732 | .enable = &exynos5_clk_ip_gscl_ctrl, | ||
733 | .ctrlbit = (1 << 9), | ||
734 | }, { | ||
735 | .name = SYSMMU_CLOCK_NAME, | ||
736 | .devname = SYSMMU_CLOCK_DEVNAME(gsc3, 8), | ||
737 | .enable = &exynos5_clk_ip_gscl_ctrl, | ||
738 | .ctrlbit = (1 << 10), | ||
739 | }, { | ||
740 | .name = SYSMMU_CLOCK_NAME, | ||
741 | .devname = SYSMMU_CLOCK_DEVNAME(isp, 9), | ||
742 | .enable = &exynos5_clk_ip_isp0_ctrl, | ||
743 | .ctrlbit = (0x3F << 8), | ||
744 | }, { | ||
745 | .name = SYSMMU_CLOCK_NAME2, | ||
746 | .devname = SYSMMU_CLOCK_DEVNAME(isp, 9), | ||
747 | .enable = &exynos5_clk_ip_isp1_ctrl, | ||
748 | .ctrlbit = (0xF << 4), | ||
749 | }, { | ||
750 | .name = SYSMMU_CLOCK_NAME, | ||
751 | .devname = SYSMMU_CLOCK_DEVNAME(camif0, 12), | ||
752 | .enable = &exynos5_clk_ip_gscl_ctrl, | ||
753 | .ctrlbit = (1 << 11), | ||
754 | }, { | ||
755 | .name = SYSMMU_CLOCK_NAME, | ||
756 | .devname = SYSMMU_CLOCK_DEVNAME(camif1, 13), | ||
757 | .enable = &exynos5_clk_ip_gscl_ctrl, | ||
758 | .ctrlbit = (1 << 12), | ||
759 | }, { | ||
760 | .name = SYSMMU_CLOCK_NAME, | ||
761 | .devname = SYSMMU_CLOCK_DEVNAME(2d, 14), | ||
762 | .enable = &exynos5_clk_ip_acp_ctrl, | ||
763 | .ctrlbit = (1 << 7) | ||
633 | } | 764 | } |
634 | }; | 765 | }; |
635 | 766 | ||
@@ -941,10 +1072,12 @@ static struct clksrc_clk *exynos5_sysclks[] = { | |||
941 | &exynos5_clk_mout_apll, | 1072 | &exynos5_clk_mout_apll, |
942 | &exynos5_clk_sclk_apll, | 1073 | &exynos5_clk_sclk_apll, |
943 | &exynos5_clk_mout_bpll, | 1074 | &exynos5_clk_mout_bpll, |
1075 | &exynos5_clk_mout_bpll_fout, | ||
944 | &exynos5_clk_mout_bpll_user, | 1076 | &exynos5_clk_mout_bpll_user, |
945 | &exynos5_clk_mout_cpll, | 1077 | &exynos5_clk_mout_cpll, |
946 | &exynos5_clk_mout_epll, | 1078 | &exynos5_clk_mout_epll, |
947 | &exynos5_clk_mout_mpll, | 1079 | &exynos5_clk_mout_mpll, |
1080 | &exynos5_clk_mout_mpll_fout, | ||
948 | &exynos5_clk_mout_mpll_user, | 1081 | &exynos5_clk_mout_mpll_user, |
949 | &exynos5_clk_vpllsrc, | 1082 | &exynos5_clk_vpllsrc, |
950 | &exynos5_clk_sclk_vpll, | 1083 | &exynos5_clk_sclk_vpll, |
@@ -1008,7 +1141,9 @@ static struct clk *exynos5_clks[] __initdata = { | |||
1008 | &exynos5_clk_sclk_hdmi27m, | 1141 | &exynos5_clk_sclk_hdmi27m, |
1009 | &exynos5_clk_sclk_hdmiphy, | 1142 | &exynos5_clk_sclk_hdmiphy, |
1010 | &clk_fout_bpll, | 1143 | &clk_fout_bpll, |
1144 | &clk_fout_bpll_div2, | ||
1011 | &clk_fout_cpll, | 1145 | &clk_fout_cpll, |
1146 | &clk_fout_mpll_div2, | ||
1012 | &exynos5_clk_armclk, | 1147 | &exynos5_clk_armclk, |
1013 | }; | 1148 | }; |
1014 | 1149 | ||
@@ -1173,8 +1308,10 @@ void __init_or_cpufreq exynos5_setup_clocks(void) | |||
1173 | 1308 | ||
1174 | clk_fout_apll.ops = &exynos5_fout_apll_ops; | 1309 | clk_fout_apll.ops = &exynos5_fout_apll_ops; |
1175 | clk_fout_bpll.rate = bpll; | 1310 | clk_fout_bpll.rate = bpll; |
1311 | clk_fout_bpll_div2.rate = bpll >> 1; | ||
1176 | clk_fout_cpll.rate = cpll; | 1312 | clk_fout_cpll.rate = cpll; |
1177 | clk_fout_mpll.rate = mpll; | 1313 | clk_fout_mpll.rate = mpll; |
1314 | clk_fout_mpll_div2.rate = mpll >> 1; | ||
1178 | clk_fout_epll.rate = epll; | 1315 | clk_fout_epll.rate = epll; |
1179 | clk_fout_vpll.rate = vpll; | 1316 | clk_fout_vpll.rate = vpll; |
1180 | 1317 | ||
diff --git a/arch/arm/mach-exynos/common.c b/arch/arm/mach-exynos/common.c index 5ccd6e80a607..742edd3bbec3 100644 --- a/arch/arm/mach-exynos/common.c +++ b/arch/arm/mach-exynos/common.c | |||
@@ -19,6 +19,9 @@ | |||
19 | #include <linux/serial_core.h> | 19 | #include <linux/serial_core.h> |
20 | #include <linux/of.h> | 20 | #include <linux/of.h> |
21 | #include <linux/of_irq.h> | 21 | #include <linux/of_irq.h> |
22 | #include <linux/export.h> | ||
23 | #include <linux/irqdomain.h> | ||
24 | #include <linux/of_address.h> | ||
22 | 25 | ||
23 | #include <asm/proc-fns.h> | 26 | #include <asm/proc-fns.h> |
24 | #include <asm/exception.h> | 27 | #include <asm/exception.h> |
@@ -265,12 +268,12 @@ static struct map_desc exynos5_iodesc[] __initdata = { | |||
265 | }, { | 268 | }, { |
266 | .virtual = (unsigned long)S5P_VA_GIC_CPU, | 269 | .virtual = (unsigned long)S5P_VA_GIC_CPU, |
267 | .pfn = __phys_to_pfn(EXYNOS5_PA_GIC_CPU), | 270 | .pfn = __phys_to_pfn(EXYNOS5_PA_GIC_CPU), |
268 | .length = SZ_64K, | 271 | .length = SZ_8K, |
269 | .type = MT_DEVICE, | 272 | .type = MT_DEVICE, |
270 | }, { | 273 | }, { |
271 | .virtual = (unsigned long)S5P_VA_GIC_DIST, | 274 | .virtual = (unsigned long)S5P_VA_GIC_DIST, |
272 | .pfn = __phys_to_pfn(EXYNOS5_PA_GIC_DIST), | 275 | .pfn = __phys_to_pfn(EXYNOS5_PA_GIC_DIST), |
273 | .length = SZ_64K, | 276 | .length = SZ_4K, |
274 | .type = MT_DEVICE, | 277 | .type = MT_DEVICE, |
275 | }, | 278 | }, |
276 | }; | 279 | }; |
@@ -285,6 +288,11 @@ void exynos5_restart(char mode, const char *cmd) | |||
285 | __raw_writel(0x1, EXYNOS_SWRESET); | 288 | __raw_writel(0x1, EXYNOS_SWRESET); |
286 | } | 289 | } |
287 | 290 | ||
291 | void __init exynos_init_late(void) | ||
292 | { | ||
293 | exynos_pm_late_initcall(); | ||
294 | } | ||
295 | |||
288 | /* | 296 | /* |
289 | * exynos_map_io | 297 | * exynos_map_io |
290 | * | 298 | * |
@@ -399,6 +407,7 @@ struct combiner_chip_data { | |||
399 | void __iomem *base; | 407 | void __iomem *base; |
400 | }; | 408 | }; |
401 | 409 | ||
410 | static struct irq_domain *combiner_irq_domain; | ||
402 | static struct combiner_chip_data combiner_data[MAX_COMBINER_NR]; | 411 | static struct combiner_chip_data combiner_data[MAX_COMBINER_NR]; |
403 | 412 | ||
404 | static inline void __iomem *combiner_base(struct irq_data *data) | 413 | static inline void __iomem *combiner_base(struct irq_data *data) |
@@ -411,14 +420,14 @@ static inline void __iomem *combiner_base(struct irq_data *data) | |||
411 | 420 | ||
412 | static void combiner_mask_irq(struct irq_data *data) | 421 | static void combiner_mask_irq(struct irq_data *data) |
413 | { | 422 | { |
414 | u32 mask = 1 << (data->irq % 32); | 423 | u32 mask = 1 << (data->hwirq % 32); |
415 | 424 | ||
416 | __raw_writel(mask, combiner_base(data) + COMBINER_ENABLE_CLEAR); | 425 | __raw_writel(mask, combiner_base(data) + COMBINER_ENABLE_CLEAR); |
417 | } | 426 | } |
418 | 427 | ||
419 | static void combiner_unmask_irq(struct irq_data *data) | 428 | static void combiner_unmask_irq(struct irq_data *data) |
420 | { | 429 | { |
421 | u32 mask = 1 << (data->irq % 32); | 430 | u32 mask = 1 << (data->hwirq % 32); |
422 | 431 | ||
423 | __raw_writel(mask, combiner_base(data) + COMBINER_ENABLE_SET); | 432 | __raw_writel(mask, combiner_base(data) + COMBINER_ENABLE_SET); |
424 | } | 433 | } |
@@ -474,49 +483,131 @@ static void __init combiner_cascade_irq(unsigned int combiner_nr, unsigned int i | |||
474 | irq_set_chained_handler(irq, combiner_handle_cascade_irq); | 483 | irq_set_chained_handler(irq, combiner_handle_cascade_irq); |
475 | } | 484 | } |
476 | 485 | ||
477 | static void __init combiner_init(unsigned int combiner_nr, void __iomem *base, | 486 | static void __init combiner_init_one(unsigned int combiner_nr, |
478 | unsigned int irq_start) | 487 | void __iomem *base) |
479 | { | 488 | { |
480 | unsigned int i; | ||
481 | unsigned int max_nr; | ||
482 | |||
483 | if (soc_is_exynos5250()) | ||
484 | max_nr = EXYNOS5_MAX_COMBINER_NR; | ||
485 | else | ||
486 | max_nr = EXYNOS4_MAX_COMBINER_NR; | ||
487 | |||
488 | if (combiner_nr >= max_nr) | ||
489 | BUG(); | ||
490 | |||
491 | combiner_data[combiner_nr].base = base; | 489 | combiner_data[combiner_nr].base = base; |
492 | combiner_data[combiner_nr].irq_offset = irq_start; | 490 | combiner_data[combiner_nr].irq_offset = irq_find_mapping( |
491 | combiner_irq_domain, combiner_nr * MAX_IRQ_IN_COMBINER); | ||
493 | combiner_data[combiner_nr].irq_mask = 0xff << ((combiner_nr % 4) << 3); | 492 | combiner_data[combiner_nr].irq_mask = 0xff << ((combiner_nr % 4) << 3); |
494 | 493 | ||
495 | /* Disable all interrupts */ | 494 | /* Disable all interrupts */ |
496 | |||
497 | __raw_writel(combiner_data[combiner_nr].irq_mask, | 495 | __raw_writel(combiner_data[combiner_nr].irq_mask, |
498 | base + COMBINER_ENABLE_CLEAR); | 496 | base + COMBINER_ENABLE_CLEAR); |
497 | } | ||
498 | |||
499 | #ifdef CONFIG_OF | ||
500 | static int combiner_irq_domain_xlate(struct irq_domain *d, | ||
501 | struct device_node *controller, | ||
502 | const u32 *intspec, unsigned int intsize, | ||
503 | unsigned long *out_hwirq, | ||
504 | unsigned int *out_type) | ||
505 | { | ||
506 | if (d->of_node != controller) | ||
507 | return -EINVAL; | ||
508 | |||
509 | if (intsize < 2) | ||
510 | return -EINVAL; | ||
511 | |||
512 | *out_hwirq = intspec[0] * MAX_IRQ_IN_COMBINER + intspec[1]; | ||
513 | *out_type = 0; | ||
514 | |||
515 | return 0; | ||
516 | } | ||
517 | #else | ||
518 | static int combiner_irq_domain_xlate(struct irq_domain *d, | ||
519 | struct device_node *controller, | ||
520 | const u32 *intspec, unsigned int intsize, | ||
521 | unsigned long *out_hwirq, | ||
522 | unsigned int *out_type) | ||
523 | { | ||
524 | return -EINVAL; | ||
525 | } | ||
526 | #endif | ||
527 | |||
528 | static int combiner_irq_domain_map(struct irq_domain *d, unsigned int irq, | ||
529 | irq_hw_number_t hw) | ||
530 | { | ||
531 | irq_set_chip_and_handler(irq, &combiner_chip, handle_level_irq); | ||
532 | irq_set_chip_data(irq, &combiner_data[hw >> 3]); | ||
533 | set_irq_flags(irq, IRQF_VALID | IRQF_PROBE); | ||
534 | |||
535 | return 0; | ||
536 | } | ||
537 | |||
538 | static struct irq_domain_ops combiner_irq_domain_ops = { | ||
539 | .xlate = combiner_irq_domain_xlate, | ||
540 | .map = combiner_irq_domain_map, | ||
541 | }; | ||
542 | |||
543 | void __init combiner_init(void __iomem *combiner_base, struct device_node *np) | ||
544 | { | ||
545 | int i, irq, irq_base; | ||
546 | unsigned int max_nr, nr_irq; | ||
547 | |||
548 | if (np) { | ||
549 | if (of_property_read_u32(np, "samsung,combiner-nr", &max_nr)) { | ||
550 | pr_warning("%s: number of combiners not specified, " | ||
551 | "setting default as %d.\n", | ||
552 | __func__, EXYNOS4_MAX_COMBINER_NR); | ||
553 | max_nr = EXYNOS4_MAX_COMBINER_NR; | ||
554 | } | ||
555 | } else { | ||
556 | max_nr = soc_is_exynos5250() ? EXYNOS5_MAX_COMBINER_NR : | ||
557 | EXYNOS4_MAX_COMBINER_NR; | ||
558 | } | ||
559 | nr_irq = max_nr * MAX_IRQ_IN_COMBINER; | ||
499 | 560 | ||
500 | /* Setup the Linux IRQ subsystem */ | 561 | irq_base = irq_alloc_descs(COMBINER_IRQ(0, 0), 1, nr_irq, 0); |
562 | if (IS_ERR_VALUE(irq_base)) { | ||
563 | irq_base = COMBINER_IRQ(0, 0); | ||
564 | pr_warning("%s: irq desc alloc failed. Continuing with %d as linux irq base\n", __func__, irq_base); | ||
565 | } | ||
501 | 566 | ||
502 | for (i = irq_start; i < combiner_data[combiner_nr].irq_offset | 567 | combiner_irq_domain = irq_domain_add_legacy(np, nr_irq, irq_base, 0, |
503 | + MAX_IRQ_IN_COMBINER; i++) { | 568 | &combiner_irq_domain_ops, &combiner_data); |
504 | irq_set_chip_and_handler(i, &combiner_chip, handle_level_irq); | 569 | if (WARN_ON(!combiner_irq_domain)) { |
505 | irq_set_chip_data(i, &combiner_data[combiner_nr]); | 570 | pr_warning("%s: irq domain init failed\n", __func__); |
506 | set_irq_flags(i, IRQF_VALID | IRQF_PROBE); | 571 | return; |
572 | } | ||
573 | |||
574 | for (i = 0; i < max_nr; i++) { | ||
575 | combiner_init_one(i, combiner_base + (i >> 2) * 0x10); | ||
576 | irq = IRQ_SPI(i); | ||
577 | #ifdef CONFIG_OF | ||
578 | if (np) | ||
579 | irq = irq_of_parse_and_map(np, i); | ||
580 | #endif | ||
581 | combiner_cascade_irq(i, irq); | ||
507 | } | 582 | } |
508 | } | 583 | } |
509 | 584 | ||
510 | #ifdef CONFIG_OF | 585 | #ifdef CONFIG_OF |
586 | int __init combiner_of_init(struct device_node *np, struct device_node *parent) | ||
587 | { | ||
588 | void __iomem *combiner_base; | ||
589 | |||
590 | combiner_base = of_iomap(np, 0); | ||
591 | if (!combiner_base) { | ||
592 | pr_err("%s: failed to map combiner registers\n", __func__); | ||
593 | return -ENXIO; | ||
594 | } | ||
595 | |||
596 | combiner_init(combiner_base, np); | ||
597 | |||
598 | return 0; | ||
599 | } | ||
600 | |||
511 | static const struct of_device_id exynos4_dt_irq_match[] = { | 601 | static const struct of_device_id exynos4_dt_irq_match[] = { |
512 | { .compatible = "arm,cortex-a9-gic", .data = gic_of_init, }, | 602 | { .compatible = "arm,cortex-a9-gic", .data = gic_of_init, }, |
603 | { .compatible = "samsung,exynos4210-combiner", | ||
604 | .data = combiner_of_init, }, | ||
513 | {}, | 605 | {}, |
514 | }; | 606 | }; |
515 | #endif | 607 | #endif |
516 | 608 | ||
517 | void __init exynos4_init_irq(void) | 609 | void __init exynos4_init_irq(void) |
518 | { | 610 | { |
519 | int irq; | ||
520 | unsigned int gic_bank_offset; | 611 | unsigned int gic_bank_offset; |
521 | 612 | ||
522 | gic_bank_offset = soc_is_exynos4412() ? 0x4000 : 0x8000; | 613 | gic_bank_offset = soc_is_exynos4412() ? 0x4000 : 0x8000; |
@@ -528,12 +619,8 @@ void __init exynos4_init_irq(void) | |||
528 | of_irq_init(exynos4_dt_irq_match); | 619 | of_irq_init(exynos4_dt_irq_match); |
529 | #endif | 620 | #endif |
530 | 621 | ||
531 | for (irq = 0; irq < EXYNOS4_MAX_COMBINER_NR; irq++) { | 622 | if (!of_have_populated_dt()) |
532 | 623 | combiner_init(S5P_VA_COMBINER_BASE, NULL); | |
533 | combiner_init(irq, (void __iomem *)S5P_VA_COMBINER(irq), | ||
534 | COMBINER_IRQ(irq, 0)); | ||
535 | combiner_cascade_irq(irq, IRQ_SPI(irq)); | ||
536 | } | ||
537 | 624 | ||
538 | /* | 625 | /* |
539 | * The parameters of s5p_init_irq() are for VIC init. | 626 | * The parameters of s5p_init_irq() are for VIC init. |
@@ -545,18 +632,9 @@ void __init exynos4_init_irq(void) | |||
545 | 632 | ||
546 | void __init exynos5_init_irq(void) | 633 | void __init exynos5_init_irq(void) |
547 | { | 634 | { |
548 | int irq; | ||
549 | |||
550 | #ifdef CONFIG_OF | 635 | #ifdef CONFIG_OF |
551 | of_irq_init(exynos4_dt_irq_match); | 636 | of_irq_init(exynos4_dt_irq_match); |
552 | #endif | 637 | #endif |
553 | |||
554 | for (irq = 0; irq < EXYNOS5_MAX_COMBINER_NR; irq++) { | ||
555 | combiner_init(irq, (void __iomem *)S5P_VA_COMBINER(irq), | ||
556 | COMBINER_IRQ(irq, 0)); | ||
557 | combiner_cascade_irq(irq, IRQ_SPI(irq)); | ||
558 | } | ||
559 | |||
560 | /* | 638 | /* |
561 | * The parameters of s5p_init_irq() are for VIC init. | 639 | * The parameters of s5p_init_irq() are for VIC init. |
562 | * Theses parameters should be NULL and 0 because EXYNOS4 | 640 | * Theses parameters should be NULL and 0 because EXYNOS4 |
@@ -565,30 +643,18 @@ void __init exynos5_init_irq(void) | |||
565 | s5p_init_irq(NULL, 0); | 643 | s5p_init_irq(NULL, 0); |
566 | } | 644 | } |
567 | 645 | ||
568 | struct bus_type exynos4_subsys = { | 646 | struct bus_type exynos_subsys = { |
569 | .name = "exynos4-core", | 647 | .name = "exynos-core", |
570 | .dev_name = "exynos4-core", | 648 | .dev_name = "exynos-core", |
571 | }; | ||
572 | |||
573 | struct bus_type exynos5_subsys = { | ||
574 | .name = "exynos5-core", | ||
575 | .dev_name = "exynos5-core", | ||
576 | }; | 649 | }; |
577 | 650 | ||
578 | static struct device exynos4_dev = { | 651 | static struct device exynos4_dev = { |
579 | .bus = &exynos4_subsys, | 652 | .bus = &exynos_subsys, |
580 | }; | ||
581 | |||
582 | static struct device exynos5_dev = { | ||
583 | .bus = &exynos5_subsys, | ||
584 | }; | 653 | }; |
585 | 654 | ||
586 | static int __init exynos_core_init(void) | 655 | static int __init exynos_core_init(void) |
587 | { | 656 | { |
588 | if (soc_is_exynos5250()) | 657 | return subsys_system_register(&exynos_subsys, NULL); |
589 | return subsys_system_register(&exynos5_subsys, NULL); | ||
590 | else | ||
591 | return subsys_system_register(&exynos4_subsys, NULL); | ||
592 | } | 658 | } |
593 | core_initcall(exynos_core_init); | 659 | core_initcall(exynos_core_init); |
594 | 660 | ||
@@ -675,10 +741,7 @@ static int __init exynos_init(void) | |||
675 | { | 741 | { |
676 | printk(KERN_INFO "EXYNOS: Initializing architecture\n"); | 742 | printk(KERN_INFO "EXYNOS: Initializing architecture\n"); |
677 | 743 | ||
678 | if (soc_is_exynos5250()) | 744 | return device_register(&exynos4_dev); |
679 | return device_register(&exynos5_dev); | ||
680 | else | ||
681 | return device_register(&exynos4_dev); | ||
682 | } | 745 | } |
683 | 746 | ||
684 | /* uart registration process */ | 747 | /* uart registration process */ |
diff --git a/arch/arm/mach-exynos/common.h b/arch/arm/mach-exynos/common.h index 677b5467df18..aed2eeb06517 100644 --- a/arch/arm/mach-exynos/common.h +++ b/arch/arm/mach-exynos/common.h | |||
@@ -19,6 +19,13 @@ void exynos4_init_irq(void); | |||
19 | void exynos5_init_irq(void); | 19 | void exynos5_init_irq(void); |
20 | void exynos4_restart(char mode, const char *cmd); | 20 | void exynos4_restart(char mode, const char *cmd); |
21 | void exynos5_restart(char mode, const char *cmd); | 21 | void exynos5_restart(char mode, const char *cmd); |
22 | void exynos_init_late(void); | ||
23 | |||
24 | #ifdef CONFIG_PM_GENERIC_DOMAINS | ||
25 | int exynos_pm_late_initcall(void); | ||
26 | #else | ||
27 | static int exynos_pm_late_initcall(void) { return 0; } | ||
28 | #endif | ||
22 | 29 | ||
23 | #ifdef CONFIG_ARCH_EXYNOS4 | 30 | #ifdef CONFIG_ARCH_EXYNOS4 |
24 | void exynos4_register_clocks(void); | 31 | void exynos4_register_clocks(void); |
diff --git a/arch/arm/mach-exynos/dev-drm.c b/arch/arm/mach-exynos/dev-drm.c new file mode 100644 index 000000000000..17c9c6ecc2e0 --- /dev/null +++ b/arch/arm/mach-exynos/dev-drm.c | |||
@@ -0,0 +1,29 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mach-exynos/dev-drm.c | ||
3 | * | ||
4 | * Copyright (c) 2012 Samsung Electronics Co., Ltd. | ||
5 | * http://www.samsung.com | ||
6 | * | ||
7 | * EXYNOS - core DRM device | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License as published by | ||
11 | * the Free Software Foundation; either version 2 of the License, or | ||
12 | * (at your option) any later version. | ||
13 | */ | ||
14 | |||
15 | #include <linux/kernel.h> | ||
16 | #include <linux/dma-mapping.h> | ||
17 | #include <linux/platform_device.h> | ||
18 | |||
19 | #include <plat/devs.h> | ||
20 | |||
21 | static u64 exynos_drm_dma_mask = DMA_BIT_MASK(32); | ||
22 | |||
23 | struct platform_device exynos_device_drm = { | ||
24 | .name = "exynos-drm", | ||
25 | .dev = { | ||
26 | .dma_mask = &exynos_drm_dma_mask, | ||
27 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
28 | } | ||
29 | }; | ||
diff --git a/arch/arm/mach-exynos/dev-sysmmu.c b/arch/arm/mach-exynos/dev-sysmmu.c index 781563fcb156..c5b1ea301df0 100644 --- a/arch/arm/mach-exynos/dev-sysmmu.c +++ b/arch/arm/mach-exynos/dev-sysmmu.c | |||
@@ -1,9 +1,9 @@ | |||
1 | /* linux/arch/arm/mach-exynos4/dev-sysmmu.c | 1 | /* linux/arch/arm/mach-exynos/dev-sysmmu.c |
2 | * | 2 | * |
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | 3 | * Copyright (c) 2010-2012 Samsung Electronics Co., Ltd. |
4 | * http://www.samsung.com | 4 | * http://www.samsung.com |
5 | * | 5 | * |
6 | * EXYNOS4 - System MMU support | 6 | * EXYNOS - System MMU support |
7 | * | 7 | * |
8 | * This program is free software; you can redistribute it and/or modify | 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 | 9 | * it under the terms of the GNU General Public License version 2 as |
@@ -12,222 +12,263 @@ | |||
12 | 12 | ||
13 | #include <linux/platform_device.h> | 13 | #include <linux/platform_device.h> |
14 | #include <linux/dma-mapping.h> | 14 | #include <linux/dma-mapping.h> |
15 | #include <linux/export.h> | 15 | |
16 | #include <plat/cpu.h> | ||
16 | 17 | ||
17 | #include <mach/map.h> | 18 | #include <mach/map.h> |
18 | #include <mach/irqs.h> | 19 | #include <mach/irqs.h> |
19 | #include <mach/sysmmu.h> | 20 | #include <mach/sysmmu.h> |
20 | #include <plat/s5p-clock.h> | ||
21 | |||
22 | /* These names must be equal to the clock names in mach-exynos4/clock.c */ | ||
23 | const char *sysmmu_ips_name[EXYNOS4_SYSMMU_TOTAL_IPNUM] = { | ||
24 | "SYSMMU_MDMA" , | ||
25 | "SYSMMU_SSS" , | ||
26 | "SYSMMU_FIMC0" , | ||
27 | "SYSMMU_FIMC1" , | ||
28 | "SYSMMU_FIMC2" , | ||
29 | "SYSMMU_FIMC3" , | ||
30 | "SYSMMU_JPEG" , | ||
31 | "SYSMMU_FIMD0" , | ||
32 | "SYSMMU_FIMD1" , | ||
33 | "SYSMMU_PCIe" , | ||
34 | "SYSMMU_G2D" , | ||
35 | "SYSMMU_ROTATOR", | ||
36 | "SYSMMU_MDMA2" , | ||
37 | "SYSMMU_TV" , | ||
38 | "SYSMMU_MFC_L" , | ||
39 | "SYSMMU_MFC_R" , | ||
40 | }; | ||
41 | 21 | ||
42 | static struct resource exynos4_sysmmu_resource[] = { | 22 | static u64 exynos_sysmmu_dma_mask = DMA_BIT_MASK(32); |
43 | [0] = { | 23 | |
44 | .start = EXYNOS4_PA_SYSMMU_MDMA, | 24 | #define SYSMMU_PLATFORM_DEVICE(ipname, devid) \ |
45 | .end = EXYNOS4_PA_SYSMMU_MDMA + SZ_64K - 1, | 25 | static struct sysmmu_platform_data platdata_##ipname = { \ |
46 | .flags = IORESOURCE_MEM, | 26 | .dbgname = #ipname, \ |
47 | }, | 27 | }; \ |
48 | [1] = { | 28 | struct platform_device SYSMMU_PLATDEV(ipname) = \ |
49 | .start = IRQ_SYSMMU_MDMA0_0, | 29 | { \ |
50 | .end = IRQ_SYSMMU_MDMA0_0, | 30 | .name = SYSMMU_DEVNAME_BASE, \ |
51 | .flags = IORESOURCE_IRQ, | 31 | .id = devid, \ |
52 | }, | 32 | .dev = { \ |
53 | [2] = { | 33 | .dma_mask = &exynos_sysmmu_dma_mask, \ |
54 | .start = EXYNOS4_PA_SYSMMU_SSS, | 34 | .coherent_dma_mask = DMA_BIT_MASK(32), \ |
55 | .end = EXYNOS4_PA_SYSMMU_SSS + SZ_64K - 1, | 35 | .platform_data = &platdata_##ipname, \ |
56 | .flags = IORESOURCE_MEM, | 36 | }, \ |
57 | }, | 37 | } |
58 | [3] = { | 38 | |
59 | .start = IRQ_SYSMMU_SSS_0, | 39 | SYSMMU_PLATFORM_DEVICE(mfc_l, 0); |
60 | .end = IRQ_SYSMMU_SSS_0, | 40 | SYSMMU_PLATFORM_DEVICE(mfc_r, 1); |
61 | .flags = IORESOURCE_IRQ, | 41 | SYSMMU_PLATFORM_DEVICE(tv, 2); |
62 | }, | 42 | SYSMMU_PLATFORM_DEVICE(jpeg, 3); |
63 | [4] = { | 43 | SYSMMU_PLATFORM_DEVICE(rot, 4); |
64 | .start = EXYNOS4_PA_SYSMMU_FIMC0, | 44 | SYSMMU_PLATFORM_DEVICE(fimc0, 5); /* fimc* and gsc* exist exclusively */ |
65 | .end = EXYNOS4_PA_SYSMMU_FIMC0 + SZ_64K - 1, | 45 | SYSMMU_PLATFORM_DEVICE(fimc1, 6); |
66 | .flags = IORESOURCE_MEM, | 46 | SYSMMU_PLATFORM_DEVICE(fimc2, 7); |
67 | }, | 47 | SYSMMU_PLATFORM_DEVICE(fimc3, 8); |
68 | [5] = { | 48 | SYSMMU_PLATFORM_DEVICE(gsc0, 5); |
69 | .start = IRQ_SYSMMU_FIMC0_0, | 49 | SYSMMU_PLATFORM_DEVICE(gsc1, 6); |
70 | .end = IRQ_SYSMMU_FIMC0_0, | 50 | SYSMMU_PLATFORM_DEVICE(gsc2, 7); |
71 | .flags = IORESOURCE_IRQ, | 51 | SYSMMU_PLATFORM_DEVICE(gsc3, 8); |
72 | }, | 52 | SYSMMU_PLATFORM_DEVICE(isp, 9); |
73 | [6] = { | 53 | SYSMMU_PLATFORM_DEVICE(fimd0, 10); |
74 | .start = EXYNOS4_PA_SYSMMU_FIMC1, | 54 | SYSMMU_PLATFORM_DEVICE(fimd1, 11); |
75 | .end = EXYNOS4_PA_SYSMMU_FIMC1 + SZ_64K - 1, | 55 | SYSMMU_PLATFORM_DEVICE(camif0, 12); |
76 | .flags = IORESOURCE_MEM, | 56 | SYSMMU_PLATFORM_DEVICE(camif1, 13); |
77 | }, | 57 | SYSMMU_PLATFORM_DEVICE(2d, 14); |
78 | [7] = { | 58 | |
79 | .start = IRQ_SYSMMU_FIMC1_0, | 59 | #define SYSMMU_RESOURCE_NAME(core, ipname) sysmmures_##core##_##ipname |
80 | .end = IRQ_SYSMMU_FIMC1_0, | 60 | |
81 | .flags = IORESOURCE_IRQ, | 61 | #define SYSMMU_RESOURCE(core, ipname) \ |
82 | }, | 62 | static struct resource SYSMMU_RESOURCE_NAME(core, ipname)[] __initdata = |
83 | [8] = { | 63 | |
84 | .start = EXYNOS4_PA_SYSMMU_FIMC2, | 64 | #define DEFINE_SYSMMU_RESOURCE(core, mem, irq) \ |
85 | .end = EXYNOS4_PA_SYSMMU_FIMC2 + SZ_64K - 1, | 65 | DEFINE_RES_MEM_NAMED(core##_PA_SYSMMU_##mem, SZ_4K, #mem), \ |
86 | .flags = IORESOURCE_MEM, | 66 | DEFINE_RES_IRQ_NAMED(core##_IRQ_SYSMMU_##irq##_0, #mem) |
87 | }, | 67 | |
88 | [9] = { | 68 | #define SYSMMU_RESOURCE_DEFINE(core, ipname, mem, irq) \ |
89 | .start = IRQ_SYSMMU_FIMC2_0, | 69 | SYSMMU_RESOURCE(core, ipname) { \ |
90 | .end = IRQ_SYSMMU_FIMC2_0, | 70 | DEFINE_SYSMMU_RESOURCE(core, mem, irq) \ |
91 | .flags = IORESOURCE_IRQ, | 71 | } |
92 | }, | ||
93 | [10] = { | ||
94 | .start = EXYNOS4_PA_SYSMMU_FIMC3, | ||
95 | .end = EXYNOS4_PA_SYSMMU_FIMC3 + SZ_64K - 1, | ||
96 | .flags = IORESOURCE_MEM, | ||
97 | }, | ||
98 | [11] = { | ||
99 | .start = IRQ_SYSMMU_FIMC3_0, | ||
100 | .end = IRQ_SYSMMU_FIMC3_0, | ||
101 | .flags = IORESOURCE_IRQ, | ||
102 | }, | ||
103 | [12] = { | ||
104 | .start = EXYNOS4_PA_SYSMMU_JPEG, | ||
105 | .end = EXYNOS4_PA_SYSMMU_JPEG + SZ_64K - 1, | ||
106 | .flags = IORESOURCE_MEM, | ||
107 | }, | ||
108 | [13] = { | ||
109 | .start = IRQ_SYSMMU_JPEG_0, | ||
110 | .end = IRQ_SYSMMU_JPEG_0, | ||
111 | .flags = IORESOURCE_IRQ, | ||
112 | }, | ||
113 | [14] = { | ||
114 | .start = EXYNOS4_PA_SYSMMU_FIMD0, | ||
115 | .end = EXYNOS4_PA_SYSMMU_FIMD0 + SZ_64K - 1, | ||
116 | .flags = IORESOURCE_MEM, | ||
117 | }, | ||
118 | [15] = { | ||
119 | .start = IRQ_SYSMMU_LCD0_M0_0, | ||
120 | .end = IRQ_SYSMMU_LCD0_M0_0, | ||
121 | .flags = IORESOURCE_IRQ, | ||
122 | }, | ||
123 | [16] = { | ||
124 | .start = EXYNOS4_PA_SYSMMU_FIMD1, | ||
125 | .end = EXYNOS4_PA_SYSMMU_FIMD1 + SZ_64K - 1, | ||
126 | .flags = IORESOURCE_MEM, | ||
127 | }, | ||
128 | [17] = { | ||
129 | .start = IRQ_SYSMMU_LCD1_M1_0, | ||
130 | .end = IRQ_SYSMMU_LCD1_M1_0, | ||
131 | .flags = IORESOURCE_IRQ, | ||
132 | }, | ||
133 | [18] = { | ||
134 | .start = EXYNOS4_PA_SYSMMU_PCIe, | ||
135 | .end = EXYNOS4_PA_SYSMMU_PCIe + SZ_64K - 1, | ||
136 | .flags = IORESOURCE_MEM, | ||
137 | }, | ||
138 | [19] = { | ||
139 | .start = IRQ_SYSMMU_PCIE_0, | ||
140 | .end = IRQ_SYSMMU_PCIE_0, | ||
141 | .flags = IORESOURCE_IRQ, | ||
142 | }, | ||
143 | [20] = { | ||
144 | .start = EXYNOS4_PA_SYSMMU_G2D, | ||
145 | .end = EXYNOS4_PA_SYSMMU_G2D + SZ_64K - 1, | ||
146 | .flags = IORESOURCE_MEM, | ||
147 | }, | ||
148 | [21] = { | ||
149 | .start = IRQ_SYSMMU_2D_0, | ||
150 | .end = IRQ_SYSMMU_2D_0, | ||
151 | .flags = IORESOURCE_IRQ, | ||
152 | }, | ||
153 | [22] = { | ||
154 | .start = EXYNOS4_PA_SYSMMU_ROTATOR, | ||
155 | .end = EXYNOS4_PA_SYSMMU_ROTATOR + SZ_64K - 1, | ||
156 | .flags = IORESOURCE_MEM, | ||
157 | }, | ||
158 | [23] = { | ||
159 | .start = IRQ_SYSMMU_ROTATOR_0, | ||
160 | .end = IRQ_SYSMMU_ROTATOR_0, | ||
161 | .flags = IORESOURCE_IRQ, | ||
162 | }, | ||
163 | [24] = { | ||
164 | .start = EXYNOS4_PA_SYSMMU_MDMA2, | ||
165 | .end = EXYNOS4_PA_SYSMMU_MDMA2 + SZ_64K - 1, | ||
166 | .flags = IORESOURCE_MEM, | ||
167 | }, | ||
168 | [25] = { | ||
169 | .start = IRQ_SYSMMU_MDMA1_0, | ||
170 | .end = IRQ_SYSMMU_MDMA1_0, | ||
171 | .flags = IORESOURCE_IRQ, | ||
172 | }, | ||
173 | [26] = { | ||
174 | .start = EXYNOS4_PA_SYSMMU_TV, | ||
175 | .end = EXYNOS4_PA_SYSMMU_TV + SZ_64K - 1, | ||
176 | .flags = IORESOURCE_MEM, | ||
177 | }, | ||
178 | [27] = { | ||
179 | .start = IRQ_SYSMMU_TV_M0_0, | ||
180 | .end = IRQ_SYSMMU_TV_M0_0, | ||
181 | .flags = IORESOURCE_IRQ, | ||
182 | }, | ||
183 | [28] = { | ||
184 | .start = EXYNOS4_PA_SYSMMU_MFC_L, | ||
185 | .end = EXYNOS4_PA_SYSMMU_MFC_L + SZ_64K - 1, | ||
186 | .flags = IORESOURCE_MEM, | ||
187 | }, | ||
188 | [29] = { | ||
189 | .start = IRQ_SYSMMU_MFC_M0_0, | ||
190 | .end = IRQ_SYSMMU_MFC_M0_0, | ||
191 | .flags = IORESOURCE_IRQ, | ||
192 | }, | ||
193 | [30] = { | ||
194 | .start = EXYNOS4_PA_SYSMMU_MFC_R, | ||
195 | .end = EXYNOS4_PA_SYSMMU_MFC_R + SZ_64K - 1, | ||
196 | .flags = IORESOURCE_MEM, | ||
197 | }, | ||
198 | [31] = { | ||
199 | .start = IRQ_SYSMMU_MFC_M1_0, | ||
200 | .end = IRQ_SYSMMU_MFC_M1_0, | ||
201 | .flags = IORESOURCE_IRQ, | ||
202 | }, | ||
203 | }; | ||
204 | 72 | ||
205 | struct platform_device exynos4_device_sysmmu = { | 73 | struct sysmmu_resource_map { |
206 | .name = "s5p-sysmmu", | 74 | struct platform_device *pdev; |
207 | .id = 32, | 75 | struct resource *res; |
208 | .num_resources = ARRAY_SIZE(exynos4_sysmmu_resource), | 76 | u32 rnum; |
209 | .resource = exynos4_sysmmu_resource, | 77 | struct device *pdd; |
78 | char *clocknames; | ||
210 | }; | 79 | }; |
211 | EXPORT_SYMBOL(exynos4_device_sysmmu); | ||
212 | 80 | ||
213 | static struct clk *sysmmu_clk[S5P_SYSMMU_TOTAL_IPNUM]; | 81 | #define SYSMMU_RESOURCE_MAPPING(core, ipname, resname) { \ |
214 | void sysmmu_clk_init(struct device *dev, sysmmu_ips ips) | 82 | .pdev = &SYSMMU_PLATDEV(ipname), \ |
215 | { | 83 | .res = SYSMMU_RESOURCE_NAME(EXYNOS##core, resname), \ |
216 | sysmmu_clk[ips] = clk_get(dev, sysmmu_ips_name[ips]); | 84 | .rnum = ARRAY_SIZE(SYSMMU_RESOURCE_NAME(EXYNOS##core, resname)),\ |
217 | if (IS_ERR(sysmmu_clk[ips])) | 85 | .clocknames = SYSMMU_CLOCK_NAME, \ |
218 | sysmmu_clk[ips] = NULL; | ||
219 | else | ||
220 | clk_put(sysmmu_clk[ips]); | ||
221 | } | 86 | } |
222 | 87 | ||
223 | void sysmmu_clk_enable(sysmmu_ips ips) | 88 | #define SYSMMU_RESOURCE_MAPPING_MC(core, ipname, resname, pdata) { \ |
224 | { | 89 | .pdev = &SYSMMU_PLATDEV(ipname), \ |
225 | if (sysmmu_clk[ips]) | 90 | .res = SYSMMU_RESOURCE_NAME(EXYNOS##core, resname), \ |
226 | clk_enable(sysmmu_clk[ips]); | 91 | .rnum = ARRAY_SIZE(SYSMMU_RESOURCE_NAME(EXYNOS##core, resname)),\ |
92 | .clocknames = SYSMMU_CLOCK_NAME "," SYSMMU_CLOCK_NAME2, \ | ||
93 | } | ||
94 | |||
95 | #ifdef CONFIG_EXYNOS_DEV_PD | ||
96 | #define SYSMMU_RESOURCE_MAPPING_PD(core, ipname, resname, pd) { \ | ||
97 | .pdev = &SYSMMU_PLATDEV(ipname), \ | ||
98 | .res = &SYSMMU_RESOURCE_NAME(EXYNOS##core, resname), \ | ||
99 | .rnum = ARRAY_SIZE(SYSMMU_RESOURCE_NAME(EXYNOS##core, resname)),\ | ||
100 | .clocknames = SYSMMU_CLOCK_NAME, \ | ||
101 | .pdd = &exynos##core##_device_pd[pd].dev, \ | ||
102 | } | ||
103 | |||
104 | #define SYSMMU_RESOURCE_MAPPING_MCPD(core, ipname, resname, pd, pdata) {\ | ||
105 | .pdev = &SYSMMU_PLATDEV(ipname), \ | ||
106 | .res = &SYSMMU_RESOURCE_NAME(EXYNOS##core, resname), \ | ||
107 | .rnum = ARRAY_SIZE(SYSMMU_RESOURCE_NAME(EXYNOS##core, resname)),\ | ||
108 | .clocknames = SYSMMU_CLOCK_NAME "," SYSMMU_CLOCK_NAME2, \ | ||
109 | .pdd = &exynos##core##_device_pd[pd].dev, \ | ||
227 | } | 110 | } |
111 | #else | ||
112 | #define SYSMMU_RESOURCE_MAPPING_PD(core, ipname, resname, pd) \ | ||
113 | SYSMMU_RESOURCE_MAPPING(core, ipname, resname) | ||
114 | #define SYSMMU_RESOURCE_MAPPING_MCPD(core, ipname, resname, pd, pdata) \ | ||
115 | SYSMMU_RESOURCE_MAPPING_MC(core, ipname, resname, pdata) | ||
116 | |||
117 | #endif /* CONFIG_EXYNOS_DEV_PD */ | ||
118 | |||
119 | #ifdef CONFIG_ARCH_EXYNOS4 | ||
120 | SYSMMU_RESOURCE_DEFINE(EXYNOS4, fimc0, FIMC0, FIMC0); | ||
121 | SYSMMU_RESOURCE_DEFINE(EXYNOS4, fimc1, FIMC1, FIMC1); | ||
122 | SYSMMU_RESOURCE_DEFINE(EXYNOS4, fimc2, FIMC2, FIMC2); | ||
123 | SYSMMU_RESOURCE_DEFINE(EXYNOS4, fimc3, FIMC3, FIMC3); | ||
124 | SYSMMU_RESOURCE_DEFINE(EXYNOS4, jpeg, JPEG, JPEG); | ||
125 | SYSMMU_RESOURCE_DEFINE(EXYNOS4, 2d, G2D, 2D); | ||
126 | SYSMMU_RESOURCE_DEFINE(EXYNOS4, tv, TV, TV_M0); | ||
127 | SYSMMU_RESOURCE_DEFINE(EXYNOS4, 2d_acp, 2D_ACP, 2D); | ||
128 | SYSMMU_RESOURCE_DEFINE(EXYNOS4, rot, ROTATOR, ROTATOR); | ||
129 | SYSMMU_RESOURCE_DEFINE(EXYNOS4, fimd0, FIMD0, LCD0_M0); | ||
130 | SYSMMU_RESOURCE_DEFINE(EXYNOS4, fimd1, FIMD1, LCD1_M1); | ||
131 | SYSMMU_RESOURCE_DEFINE(EXYNOS4, flite0, FIMC_LITE0, FIMC_LITE0); | ||
132 | SYSMMU_RESOURCE_DEFINE(EXYNOS4, flite1, FIMC_LITE1, FIMC_LITE1); | ||
133 | SYSMMU_RESOURCE_DEFINE(EXYNOS4, mfc_r, MFC_R, MFC_M0); | ||
134 | SYSMMU_RESOURCE_DEFINE(EXYNOS4, mfc_l, MFC_L, MFC_M1); | ||
135 | SYSMMU_RESOURCE(EXYNOS4, isp) { | ||
136 | DEFINE_SYSMMU_RESOURCE(EXYNOS4, FIMC_ISP, FIMC_ISP), | ||
137 | DEFINE_SYSMMU_RESOURCE(EXYNOS4, FIMC_DRC, FIMC_DRC), | ||
138 | DEFINE_SYSMMU_RESOURCE(EXYNOS4, FIMC_FD, FIMC_FD), | ||
139 | DEFINE_SYSMMU_RESOURCE(EXYNOS4, ISPCPU, FIMC_CX), | ||
140 | }; | ||
141 | |||
142 | static struct sysmmu_resource_map sysmmu_resmap4[] __initdata = { | ||
143 | SYSMMU_RESOURCE_MAPPING_PD(4, fimc0, fimc0, PD_CAM), | ||
144 | SYSMMU_RESOURCE_MAPPING_PD(4, fimc1, fimc1, PD_CAM), | ||
145 | SYSMMU_RESOURCE_MAPPING_PD(4, fimc2, fimc2, PD_CAM), | ||
146 | SYSMMU_RESOURCE_MAPPING_PD(4, fimc3, fimc3, PD_CAM), | ||
147 | SYSMMU_RESOURCE_MAPPING_PD(4, tv, tv, PD_TV), | ||
148 | SYSMMU_RESOURCE_MAPPING_PD(4, mfc_r, mfc_r, PD_MFC), | ||
149 | SYSMMU_RESOURCE_MAPPING_PD(4, mfc_l, mfc_l, PD_MFC), | ||
150 | SYSMMU_RESOURCE_MAPPING_PD(4, rot, rot, PD_LCD0), | ||
151 | SYSMMU_RESOURCE_MAPPING_PD(4, jpeg, jpeg, PD_CAM), | ||
152 | SYSMMU_RESOURCE_MAPPING_PD(4, fimd0, fimd0, PD_LCD0), | ||
153 | }; | ||
154 | |||
155 | static struct sysmmu_resource_map sysmmu_resmap4210[] __initdata = { | ||
156 | SYSMMU_RESOURCE_MAPPING_PD(4, 2d, 2d, PD_LCD0), | ||
157 | SYSMMU_RESOURCE_MAPPING_PD(4, fimd1, fimd1, PD_LCD1), | ||
158 | }; | ||
159 | |||
160 | static struct sysmmu_resource_map sysmmu_resmap4212[] __initdata = { | ||
161 | SYSMMU_RESOURCE_MAPPING(4, 2d, 2d_acp), | ||
162 | SYSMMU_RESOURCE_MAPPING_PD(4, camif0, flite0, PD_ISP), | ||
163 | SYSMMU_RESOURCE_MAPPING_PD(4, camif1, flite1, PD_ISP), | ||
164 | SYSMMU_RESOURCE_MAPPING_PD(4, isp, isp, PD_ISP), | ||
165 | }; | ||
166 | #endif /* CONFIG_ARCH_EXYNOS4 */ | ||
228 | 167 | ||
229 | void sysmmu_clk_disable(sysmmu_ips ips) | 168 | #ifdef CONFIG_ARCH_EXYNOS5 |
169 | SYSMMU_RESOURCE_DEFINE(EXYNOS5, jpeg, JPEG, JPEG); | ||
170 | SYSMMU_RESOURCE_DEFINE(EXYNOS5, fimd1, FIMD1, FIMD1); | ||
171 | SYSMMU_RESOURCE_DEFINE(EXYNOS5, 2d, 2D, 2D); | ||
172 | SYSMMU_RESOURCE_DEFINE(EXYNOS5, rot, ROTATOR, ROTATOR); | ||
173 | SYSMMU_RESOURCE_DEFINE(EXYNOS5, tv, TV, TV); | ||
174 | SYSMMU_RESOURCE_DEFINE(EXYNOS5, flite0, LITE0, LITE0); | ||
175 | SYSMMU_RESOURCE_DEFINE(EXYNOS5, flite1, LITE1, LITE1); | ||
176 | SYSMMU_RESOURCE_DEFINE(EXYNOS5, gsc0, GSC0, GSC0); | ||
177 | SYSMMU_RESOURCE_DEFINE(EXYNOS5, gsc1, GSC1, GSC1); | ||
178 | SYSMMU_RESOURCE_DEFINE(EXYNOS5, gsc2, GSC2, GSC2); | ||
179 | SYSMMU_RESOURCE_DEFINE(EXYNOS5, gsc3, GSC3, GSC3); | ||
180 | SYSMMU_RESOURCE_DEFINE(EXYNOS5, mfc_r, MFC_R, MFC_R); | ||
181 | SYSMMU_RESOURCE_DEFINE(EXYNOS5, mfc_l, MFC_L, MFC_L); | ||
182 | SYSMMU_RESOURCE(EXYNOS5, isp) { | ||
183 | DEFINE_SYSMMU_RESOURCE(EXYNOS5, ISP, ISP), | ||
184 | DEFINE_SYSMMU_RESOURCE(EXYNOS5, DRC, DRC), | ||
185 | DEFINE_SYSMMU_RESOURCE(EXYNOS5, FD, FD), | ||
186 | DEFINE_SYSMMU_RESOURCE(EXYNOS5, ISPCPU, MCUISP), | ||
187 | DEFINE_SYSMMU_RESOURCE(EXYNOS5, SCALERC, SCALERCISP), | ||
188 | DEFINE_SYSMMU_RESOURCE(EXYNOS5, SCALERP, SCALERPISP), | ||
189 | DEFINE_SYSMMU_RESOURCE(EXYNOS5, ODC, ODC), | ||
190 | DEFINE_SYSMMU_RESOURCE(EXYNOS5, DIS0, DIS0), | ||
191 | DEFINE_SYSMMU_RESOURCE(EXYNOS5, DIS1, DIS1), | ||
192 | DEFINE_SYSMMU_RESOURCE(EXYNOS5, 3DNR, 3DNR), | ||
193 | }; | ||
194 | |||
195 | static struct sysmmu_resource_map sysmmu_resmap5[] __initdata = { | ||
196 | SYSMMU_RESOURCE_MAPPING(5, jpeg, jpeg), | ||
197 | SYSMMU_RESOURCE_MAPPING(5, fimd1, fimd1), | ||
198 | SYSMMU_RESOURCE_MAPPING(5, 2d, 2d), | ||
199 | SYSMMU_RESOURCE_MAPPING(5, rot, rot), | ||
200 | SYSMMU_RESOURCE_MAPPING_PD(5, tv, tv, PD_DISP1), | ||
201 | SYSMMU_RESOURCE_MAPPING_PD(5, camif0, flite0, PD_GSCL), | ||
202 | SYSMMU_RESOURCE_MAPPING_PD(5, camif1, flite1, PD_GSCL), | ||
203 | SYSMMU_RESOURCE_MAPPING_PD(5, gsc0, gsc0, PD_GSCL), | ||
204 | SYSMMU_RESOURCE_MAPPING_PD(5, gsc1, gsc1, PD_GSCL), | ||
205 | SYSMMU_RESOURCE_MAPPING_PD(5, gsc2, gsc2, PD_GSCL), | ||
206 | SYSMMU_RESOURCE_MAPPING_PD(5, gsc3, gsc3, PD_GSCL), | ||
207 | SYSMMU_RESOURCE_MAPPING_PD(5, mfc_r, mfc_r, PD_MFC), | ||
208 | SYSMMU_RESOURCE_MAPPING_PD(5, mfc_l, mfc_l, PD_MFC), | ||
209 | SYSMMU_RESOURCE_MAPPING_MCPD(5, isp, isp, PD_ISP, mc_platdata), | ||
210 | }; | ||
211 | #endif /* CONFIG_ARCH_EXYNOS5 */ | ||
212 | |||
213 | static int __init init_sysmmu_platform_device(void) | ||
230 | { | 214 | { |
231 | if (sysmmu_clk[ips]) | 215 | int i, j; |
232 | clk_disable(sysmmu_clk[ips]); | 216 | struct sysmmu_resource_map *resmap[2] = {NULL, NULL}; |
217 | int nmap[2] = {0, 0}; | ||
218 | |||
219 | #ifdef CONFIG_ARCH_EXYNOS5 | ||
220 | if (soc_is_exynos5250()) { | ||
221 | resmap[0] = sysmmu_resmap5; | ||
222 | nmap[0] = ARRAY_SIZE(sysmmu_resmap5); | ||
223 | nmap[1] = 0; | ||
224 | } | ||
225 | #endif | ||
226 | |||
227 | #ifdef CONFIG_ARCH_EXYNOS4 | ||
228 | if (resmap[0] == NULL) { | ||
229 | resmap[0] = sysmmu_resmap4; | ||
230 | nmap[0] = ARRAY_SIZE(sysmmu_resmap4); | ||
231 | } | ||
232 | |||
233 | if (soc_is_exynos4210()) { | ||
234 | resmap[1] = sysmmu_resmap4210; | ||
235 | nmap[1] = ARRAY_SIZE(sysmmu_resmap4210); | ||
236 | } | ||
237 | |||
238 | if (soc_is_exynos4412() || soc_is_exynos4212()) { | ||
239 | resmap[1] = sysmmu_resmap4212; | ||
240 | nmap[1] = ARRAY_SIZE(sysmmu_resmap4212); | ||
241 | } | ||
242 | #endif | ||
243 | |||
244 | for (j = 0; j < 2; j++) { | ||
245 | for (i = 0; i < nmap[j]; i++) { | ||
246 | struct sysmmu_resource_map *map; | ||
247 | struct sysmmu_platform_data *platdata; | ||
248 | |||
249 | map = &resmap[j][i]; | ||
250 | |||
251 | map->pdev->dev.parent = map->pdd; | ||
252 | |||
253 | platdata = map->pdev->dev.platform_data; | ||
254 | platdata->clockname = map->clocknames; | ||
255 | |||
256 | if (platform_device_add_resources(map->pdev, map->res, | ||
257 | map->rnum)) { | ||
258 | pr_err("%s: Failed to add device resources for " | ||
259 | "%s.%d\n", __func__, | ||
260 | map->pdev->name, map->pdev->id); | ||
261 | continue; | ||
262 | } | ||
263 | |||
264 | if (platform_device_register(map->pdev)) { | ||
265 | pr_err("%s: Failed to register %s.%d\n", | ||
266 | __func__, map->pdev->name, | ||
267 | map->pdev->id); | ||
268 | } | ||
269 | } | ||
270 | } | ||
271 | |||
272 | return 0; | ||
233 | } | 273 | } |
274 | arch_initcall(init_sysmmu_platform_device); | ||
diff --git a/arch/arm/mach-exynos/dma.c b/arch/arm/mach-exynos/dma.c index 69aaa4503205..f60b66dbcf84 100644 --- a/arch/arm/mach-exynos/dma.c +++ b/arch/arm/mach-exynos/dma.c | |||
@@ -103,10 +103,45 @@ static u8 exynos4212_pdma0_peri[] = { | |||
103 | DMACH_MIPI_HSI5, | 103 | DMACH_MIPI_HSI5, |
104 | }; | 104 | }; |
105 | 105 | ||
106 | struct dma_pl330_platdata exynos4_pdma0_pdata; | 106 | static u8 exynos5250_pdma0_peri[] = { |
107 | DMACH_PCM0_RX, | ||
108 | DMACH_PCM0_TX, | ||
109 | DMACH_PCM2_RX, | ||
110 | DMACH_PCM2_TX, | ||
111 | DMACH_SPI0_RX, | ||
112 | DMACH_SPI0_TX, | ||
113 | DMACH_SPI2_RX, | ||
114 | DMACH_SPI2_TX, | ||
115 | DMACH_I2S0S_TX, | ||
116 | DMACH_I2S0_RX, | ||
117 | DMACH_I2S0_TX, | ||
118 | DMACH_I2S2_RX, | ||
119 | DMACH_I2S2_TX, | ||
120 | DMACH_UART0_RX, | ||
121 | DMACH_UART0_TX, | ||
122 | DMACH_UART2_RX, | ||
123 | DMACH_UART2_TX, | ||
124 | DMACH_UART4_RX, | ||
125 | DMACH_UART4_TX, | ||
126 | DMACH_SLIMBUS0_RX, | ||
127 | DMACH_SLIMBUS0_TX, | ||
128 | DMACH_SLIMBUS2_RX, | ||
129 | DMACH_SLIMBUS2_TX, | ||
130 | DMACH_SLIMBUS4_RX, | ||
131 | DMACH_SLIMBUS4_TX, | ||
132 | DMACH_AC97_MICIN, | ||
133 | DMACH_AC97_PCMIN, | ||
134 | DMACH_AC97_PCMOUT, | ||
135 | DMACH_MIPI_HSI0, | ||
136 | DMACH_MIPI_HSI2, | ||
137 | DMACH_MIPI_HSI4, | ||
138 | DMACH_MIPI_HSI6, | ||
139 | }; | ||
140 | |||
141 | static struct dma_pl330_platdata exynos_pdma0_pdata; | ||
107 | 142 | ||
108 | static AMBA_AHB_DEVICE(exynos4_pdma0, "dma-pl330.0", 0x00041330, | 143 | static AMBA_AHB_DEVICE(exynos_pdma0, "dma-pl330.0", 0x00041330, |
109 | EXYNOS4_PA_PDMA0, {EXYNOS4_IRQ_PDMA0}, &exynos4_pdma0_pdata); | 144 | EXYNOS4_PA_PDMA0, {EXYNOS4_IRQ_PDMA0}, &exynos_pdma0_pdata); |
110 | 145 | ||
111 | static u8 exynos4210_pdma1_peri[] = { | 146 | static u8 exynos4210_pdma1_peri[] = { |
112 | DMACH_PCM0_RX, | 147 | DMACH_PCM0_RX, |
@@ -169,10 +204,45 @@ static u8 exynos4212_pdma1_peri[] = { | |||
169 | DMACH_MIPI_HSI7, | 204 | DMACH_MIPI_HSI7, |
170 | }; | 205 | }; |
171 | 206 | ||
172 | static struct dma_pl330_platdata exynos4_pdma1_pdata; | 207 | static u8 exynos5250_pdma1_peri[] = { |
208 | DMACH_PCM0_RX, | ||
209 | DMACH_PCM0_TX, | ||
210 | DMACH_PCM1_RX, | ||
211 | DMACH_PCM1_TX, | ||
212 | DMACH_SPI1_RX, | ||
213 | DMACH_SPI1_TX, | ||
214 | DMACH_PWM, | ||
215 | DMACH_SPDIF, | ||
216 | DMACH_I2S0S_TX, | ||
217 | DMACH_I2S0_RX, | ||
218 | DMACH_I2S0_TX, | ||
219 | DMACH_I2S1_RX, | ||
220 | DMACH_I2S1_TX, | ||
221 | DMACH_UART0_RX, | ||
222 | DMACH_UART0_TX, | ||
223 | DMACH_UART1_RX, | ||
224 | DMACH_UART1_TX, | ||
225 | DMACH_UART3_RX, | ||
226 | DMACH_UART3_TX, | ||
227 | DMACH_SLIMBUS1_RX, | ||
228 | DMACH_SLIMBUS1_TX, | ||
229 | DMACH_SLIMBUS3_RX, | ||
230 | DMACH_SLIMBUS3_TX, | ||
231 | DMACH_SLIMBUS5_RX, | ||
232 | DMACH_SLIMBUS5_TX, | ||
233 | DMACH_SLIMBUS0AUX_RX, | ||
234 | DMACH_SLIMBUS0AUX_TX, | ||
235 | DMACH_DISP1, | ||
236 | DMACH_MIPI_HSI1, | ||
237 | DMACH_MIPI_HSI3, | ||
238 | DMACH_MIPI_HSI5, | ||
239 | DMACH_MIPI_HSI7, | ||
240 | }; | ||
173 | 241 | ||
174 | static AMBA_AHB_DEVICE(exynos4_pdma1, "dma-pl330.1", 0x00041330, | 242 | static struct dma_pl330_platdata exynos_pdma1_pdata; |
175 | EXYNOS4_PA_PDMA1, {EXYNOS4_IRQ_PDMA1}, &exynos4_pdma1_pdata); | 243 | |
244 | static AMBA_AHB_DEVICE(exynos_pdma1, "dma-pl330.1", 0x00041330, | ||
245 | EXYNOS4_PA_PDMA1, {EXYNOS4_IRQ_PDMA1}, &exynos_pdma1_pdata); | ||
176 | 246 | ||
177 | static u8 mdma_peri[] = { | 247 | static u8 mdma_peri[] = { |
178 | DMACH_MTOM_0, | 248 | DMACH_MTOM_0, |
@@ -185,46 +255,63 @@ static u8 mdma_peri[] = { | |||
185 | DMACH_MTOM_7, | 255 | DMACH_MTOM_7, |
186 | }; | 256 | }; |
187 | 257 | ||
188 | static struct dma_pl330_platdata exynos4_mdma1_pdata = { | 258 | static struct dma_pl330_platdata exynos_mdma1_pdata = { |
189 | .nr_valid_peri = ARRAY_SIZE(mdma_peri), | 259 | .nr_valid_peri = ARRAY_SIZE(mdma_peri), |
190 | .peri_id = mdma_peri, | 260 | .peri_id = mdma_peri, |
191 | }; | 261 | }; |
192 | 262 | ||
193 | static AMBA_AHB_DEVICE(exynos4_mdma1, "dma-pl330.2", 0x00041330, | 263 | static AMBA_AHB_DEVICE(exynos_mdma1, "dma-pl330.2", 0x00041330, |
194 | EXYNOS4_PA_MDMA1, {EXYNOS4_IRQ_MDMA1}, &exynos4_mdma1_pdata); | 264 | EXYNOS4_PA_MDMA1, {EXYNOS4_IRQ_MDMA1}, &exynos_mdma1_pdata); |
195 | 265 | ||
196 | static int __init exynos4_dma_init(void) | 266 | static int __init exynos_dma_init(void) |
197 | { | 267 | { |
198 | if (of_have_populated_dt()) | 268 | if (of_have_populated_dt()) |
199 | return 0; | 269 | return 0; |
200 | 270 | ||
201 | if (soc_is_exynos4210()) { | 271 | if (soc_is_exynos4210()) { |
202 | exynos4_pdma0_pdata.nr_valid_peri = | 272 | exynos_pdma0_pdata.nr_valid_peri = |
203 | ARRAY_SIZE(exynos4210_pdma0_peri); | 273 | ARRAY_SIZE(exynos4210_pdma0_peri); |
204 | exynos4_pdma0_pdata.peri_id = exynos4210_pdma0_peri; | 274 | exynos_pdma0_pdata.peri_id = exynos4210_pdma0_peri; |
205 | exynos4_pdma1_pdata.nr_valid_peri = | 275 | exynos_pdma1_pdata.nr_valid_peri = |
206 | ARRAY_SIZE(exynos4210_pdma1_peri); | 276 | ARRAY_SIZE(exynos4210_pdma1_peri); |
207 | exynos4_pdma1_pdata.peri_id = exynos4210_pdma1_peri; | 277 | exynos_pdma1_pdata.peri_id = exynos4210_pdma1_peri; |
208 | } else if (soc_is_exynos4212() || soc_is_exynos4412()) { | 278 | } else if (soc_is_exynos4212() || soc_is_exynos4412()) { |
209 | exynos4_pdma0_pdata.nr_valid_peri = | 279 | exynos_pdma0_pdata.nr_valid_peri = |
210 | ARRAY_SIZE(exynos4212_pdma0_peri); | 280 | ARRAY_SIZE(exynos4212_pdma0_peri); |
211 | exynos4_pdma0_pdata.peri_id = exynos4212_pdma0_peri; | 281 | exynos_pdma0_pdata.peri_id = exynos4212_pdma0_peri; |
212 | exynos4_pdma1_pdata.nr_valid_peri = | 282 | exynos_pdma1_pdata.nr_valid_peri = |
213 | ARRAY_SIZE(exynos4212_pdma1_peri); | 283 | ARRAY_SIZE(exynos4212_pdma1_peri); |
214 | exynos4_pdma1_pdata.peri_id = exynos4212_pdma1_peri; | 284 | exynos_pdma1_pdata.peri_id = exynos4212_pdma1_peri; |
285 | } else if (soc_is_exynos5250()) { | ||
286 | exynos_pdma0_pdata.nr_valid_peri = | ||
287 | ARRAY_SIZE(exynos5250_pdma0_peri); | ||
288 | exynos_pdma0_pdata.peri_id = exynos5250_pdma0_peri; | ||
289 | exynos_pdma1_pdata.nr_valid_peri = | ||
290 | ARRAY_SIZE(exynos5250_pdma1_peri); | ||
291 | exynos_pdma1_pdata.peri_id = exynos5250_pdma1_peri; | ||
292 | |||
293 | exynos_pdma0_device.res.start = EXYNOS5_PA_PDMA0; | ||
294 | exynos_pdma0_device.res.end = EXYNOS5_PA_PDMA0 + SZ_4K; | ||
295 | exynos_pdma0_device.irq[0] = EXYNOS5_IRQ_PDMA0; | ||
296 | exynos_pdma1_device.res.start = EXYNOS5_PA_PDMA1; | ||
297 | exynos_pdma1_device.res.end = EXYNOS5_PA_PDMA1 + SZ_4K; | ||
298 | exynos_pdma0_device.irq[0] = EXYNOS5_IRQ_PDMA1; | ||
299 | exynos_mdma1_device.res.start = EXYNOS5_PA_MDMA1; | ||
300 | exynos_mdma1_device.res.end = EXYNOS5_PA_MDMA1 + SZ_4K; | ||
301 | exynos_pdma0_device.irq[0] = EXYNOS5_IRQ_MDMA1; | ||
215 | } | 302 | } |
216 | 303 | ||
217 | dma_cap_set(DMA_SLAVE, exynos4_pdma0_pdata.cap_mask); | 304 | dma_cap_set(DMA_SLAVE, exynos_pdma0_pdata.cap_mask); |
218 | dma_cap_set(DMA_CYCLIC, exynos4_pdma0_pdata.cap_mask); | 305 | dma_cap_set(DMA_CYCLIC, exynos_pdma0_pdata.cap_mask); |
219 | amba_device_register(&exynos4_pdma0_device, &iomem_resource); | 306 | amba_device_register(&exynos_pdma0_device, &iomem_resource); |
220 | 307 | ||
221 | dma_cap_set(DMA_SLAVE, exynos4_pdma1_pdata.cap_mask); | 308 | dma_cap_set(DMA_SLAVE, exynos_pdma1_pdata.cap_mask); |
222 | dma_cap_set(DMA_CYCLIC, exynos4_pdma1_pdata.cap_mask); | 309 | dma_cap_set(DMA_CYCLIC, exynos_pdma1_pdata.cap_mask); |
223 | amba_device_register(&exynos4_pdma1_device, &iomem_resource); | 310 | amba_device_register(&exynos_pdma1_device, &iomem_resource); |
224 | 311 | ||
225 | dma_cap_set(DMA_MEMCPY, exynos4_mdma1_pdata.cap_mask); | 312 | dma_cap_set(DMA_MEMCPY, exynos_mdma1_pdata.cap_mask); |
226 | amba_device_register(&exynos4_mdma1_device, &iomem_resource); | 313 | amba_device_register(&exynos_mdma1_device, &iomem_resource); |
227 | 314 | ||
228 | return 0; | 315 | return 0; |
229 | } | 316 | } |
230 | arch_initcall(exynos4_dma_init); | 317 | arch_initcall(exynos_dma_init); |
diff --git a/arch/arm/mach-exynos/include/mach/gpio.h b/arch/arm/mach-exynos/include/mach/gpio.h index d7498afe036a..eb24f1eb8e3b 100644 --- a/arch/arm/mach-exynos/include/mach/gpio.h +++ b/arch/arm/mach-exynos/include/mach/gpio.h | |||
@@ -153,10 +153,11 @@ enum exynos4_gpio_number { | |||
153 | #define EXYNOS5_GPIO_B2_NR (4) | 153 | #define EXYNOS5_GPIO_B2_NR (4) |
154 | #define EXYNOS5_GPIO_B3_NR (4) | 154 | #define EXYNOS5_GPIO_B3_NR (4) |
155 | #define EXYNOS5_GPIO_C0_NR (7) | 155 | #define EXYNOS5_GPIO_C0_NR (7) |
156 | #define EXYNOS5_GPIO_C1_NR (7) | 156 | #define EXYNOS5_GPIO_C1_NR (4) |
157 | #define EXYNOS5_GPIO_C2_NR (7) | 157 | #define EXYNOS5_GPIO_C2_NR (7) |
158 | #define EXYNOS5_GPIO_C3_NR (7) | 158 | #define EXYNOS5_GPIO_C3_NR (7) |
159 | #define EXYNOS5_GPIO_D0_NR (8) | 159 | #define EXYNOS5_GPIO_C4_NR (7) |
160 | #define EXYNOS5_GPIO_D0_NR (4) | ||
160 | #define EXYNOS5_GPIO_D1_NR (8) | 161 | #define EXYNOS5_GPIO_D1_NR (8) |
161 | #define EXYNOS5_GPIO_Y0_NR (6) | 162 | #define EXYNOS5_GPIO_Y0_NR (6) |
162 | #define EXYNOS5_GPIO_Y1_NR (4) | 163 | #define EXYNOS5_GPIO_Y1_NR (4) |
@@ -199,7 +200,8 @@ enum exynos5_gpio_number { | |||
199 | EXYNOS5_GPIO_C1_START = EXYNOS_GPIO_NEXT(EXYNOS5_GPIO_C0), | 200 | EXYNOS5_GPIO_C1_START = EXYNOS_GPIO_NEXT(EXYNOS5_GPIO_C0), |
200 | EXYNOS5_GPIO_C2_START = EXYNOS_GPIO_NEXT(EXYNOS5_GPIO_C1), | 201 | EXYNOS5_GPIO_C2_START = EXYNOS_GPIO_NEXT(EXYNOS5_GPIO_C1), |
201 | EXYNOS5_GPIO_C3_START = EXYNOS_GPIO_NEXT(EXYNOS5_GPIO_C2), | 202 | EXYNOS5_GPIO_C3_START = EXYNOS_GPIO_NEXT(EXYNOS5_GPIO_C2), |
202 | EXYNOS5_GPIO_D0_START = EXYNOS_GPIO_NEXT(EXYNOS5_GPIO_C3), | 203 | EXYNOS5_GPIO_C4_START = EXYNOS_GPIO_NEXT(EXYNOS5_GPIO_C3), |
204 | EXYNOS5_GPIO_D0_START = EXYNOS_GPIO_NEXT(EXYNOS5_GPIO_C4), | ||
203 | EXYNOS5_GPIO_D1_START = EXYNOS_GPIO_NEXT(EXYNOS5_GPIO_D0), | 205 | EXYNOS5_GPIO_D1_START = EXYNOS_GPIO_NEXT(EXYNOS5_GPIO_D0), |
204 | EXYNOS5_GPIO_Y0_START = EXYNOS_GPIO_NEXT(EXYNOS5_GPIO_D1), | 206 | EXYNOS5_GPIO_Y0_START = EXYNOS_GPIO_NEXT(EXYNOS5_GPIO_D1), |
205 | EXYNOS5_GPIO_Y1_START = EXYNOS_GPIO_NEXT(EXYNOS5_GPIO_Y0), | 207 | EXYNOS5_GPIO_Y1_START = EXYNOS_GPIO_NEXT(EXYNOS5_GPIO_Y0), |
@@ -242,6 +244,7 @@ enum exynos5_gpio_number { | |||
242 | #define EXYNOS5_GPC1(_nr) (EXYNOS5_GPIO_C1_START + (_nr)) | 244 | #define EXYNOS5_GPC1(_nr) (EXYNOS5_GPIO_C1_START + (_nr)) |
243 | #define EXYNOS5_GPC2(_nr) (EXYNOS5_GPIO_C2_START + (_nr)) | 245 | #define EXYNOS5_GPC2(_nr) (EXYNOS5_GPIO_C2_START + (_nr)) |
244 | #define EXYNOS5_GPC3(_nr) (EXYNOS5_GPIO_C3_START + (_nr)) | 246 | #define EXYNOS5_GPC3(_nr) (EXYNOS5_GPIO_C3_START + (_nr)) |
247 | #define EXYNOS5_GPC4(_nr) (EXYNOS5_GPIO_C4_START + (_nr)) | ||
245 | #define EXYNOS5_GPD0(_nr) (EXYNOS5_GPIO_D0_START + (_nr)) | 248 | #define EXYNOS5_GPD0(_nr) (EXYNOS5_GPIO_D0_START + (_nr)) |
246 | #define EXYNOS5_GPD1(_nr) (EXYNOS5_GPIO_D1_START + (_nr)) | 249 | #define EXYNOS5_GPD1(_nr) (EXYNOS5_GPIO_D1_START + (_nr)) |
247 | #define EXYNOS5_GPY0(_nr) (EXYNOS5_GPIO_Y0_START + (_nr)) | 250 | #define EXYNOS5_GPY0(_nr) (EXYNOS5_GPIO_Y0_START + (_nr)) |
diff --git a/arch/arm/mach-exynos/include/mach/irqs.h b/arch/arm/mach-exynos/include/mach/irqs.h index c02dae7bf4a3..7a4b4789eb72 100644 --- a/arch/arm/mach-exynos/include/mach/irqs.h +++ b/arch/arm/mach-exynos/include/mach/irqs.h | |||
@@ -154,6 +154,13 @@ | |||
154 | #define EXYNOS4_IRQ_SYSMMU_MFC_M1_0 COMBINER_IRQ(5, 6) | 154 | #define EXYNOS4_IRQ_SYSMMU_MFC_M1_0 COMBINER_IRQ(5, 6) |
155 | #define EXYNOS4_IRQ_SYSMMU_PCIE_0 COMBINER_IRQ(5, 7) | 155 | #define EXYNOS4_IRQ_SYSMMU_PCIE_0 COMBINER_IRQ(5, 7) |
156 | 156 | ||
157 | #define EXYNOS4_IRQ_SYSMMU_FIMC_LITE0_0 COMBINER_IRQ(16, 0) | ||
158 | #define EXYNOS4_IRQ_SYSMMU_FIMC_LITE1_0 COMBINER_IRQ(16, 1) | ||
159 | #define EXYNOS4_IRQ_SYSMMU_FIMC_ISP_0 COMBINER_IRQ(16, 2) | ||
160 | #define EXYNOS4_IRQ_SYSMMU_FIMC_DRC_0 COMBINER_IRQ(16, 3) | ||
161 | #define EXYNOS4_IRQ_SYSMMU_FIMC_FD_0 COMBINER_IRQ(16, 4) | ||
162 | #define EXYNOS4_IRQ_SYSMMU_FIMC_CX_0 COMBINER_IRQ(16, 5) | ||
163 | |||
157 | #define EXYNOS4_IRQ_FIMD0_FIFO COMBINER_IRQ(11, 0) | 164 | #define EXYNOS4_IRQ_FIMD0_FIFO COMBINER_IRQ(11, 0) |
158 | #define EXYNOS4_IRQ_FIMD0_VSYNC COMBINER_IRQ(11, 1) | 165 | #define EXYNOS4_IRQ_FIMD0_VSYNC COMBINER_IRQ(11, 1) |
159 | #define EXYNOS4_IRQ_FIMD0_SYSTEM COMBINER_IRQ(11, 2) | 166 | #define EXYNOS4_IRQ_FIMD0_SYSTEM COMBINER_IRQ(11, 2) |
@@ -221,24 +228,6 @@ | |||
221 | #define IRQ_KEYPAD EXYNOS4_IRQ_KEYPAD | 228 | #define IRQ_KEYPAD EXYNOS4_IRQ_KEYPAD |
222 | #define IRQ_PMU EXYNOS4_IRQ_PMU | 229 | #define IRQ_PMU EXYNOS4_IRQ_PMU |
223 | 230 | ||
224 | #define IRQ_SYSMMU_MDMA0_0 EXYNOS4_IRQ_SYSMMU_MDMA0_0 | ||
225 | #define IRQ_SYSMMU_SSS_0 EXYNOS4_IRQ_SYSMMU_SSS_0 | ||
226 | #define IRQ_SYSMMU_FIMC0_0 EXYNOS4_IRQ_SYSMMU_FIMC0_0 | ||
227 | #define IRQ_SYSMMU_FIMC1_0 EXYNOS4_IRQ_SYSMMU_FIMC1_0 | ||
228 | #define IRQ_SYSMMU_FIMC2_0 EXYNOS4_IRQ_SYSMMU_FIMC2_0 | ||
229 | #define IRQ_SYSMMU_FIMC3_0 EXYNOS4_IRQ_SYSMMU_FIMC3_0 | ||
230 | #define IRQ_SYSMMU_JPEG_0 EXYNOS4_IRQ_SYSMMU_JPEG_0 | ||
231 | #define IRQ_SYSMMU_2D_0 EXYNOS4_IRQ_SYSMMU_2D_0 | ||
232 | |||
233 | #define IRQ_SYSMMU_ROTATOR_0 EXYNOS4_IRQ_SYSMMU_ROTATOR_0 | ||
234 | #define IRQ_SYSMMU_MDMA1_0 EXYNOS4_IRQ_SYSMMU_MDMA1_0 | ||
235 | #define IRQ_SYSMMU_LCD0_M0_0 EXYNOS4_IRQ_SYSMMU_LCD0_M0_0 | ||
236 | #define IRQ_SYSMMU_LCD1_M1_0 EXYNOS4_IRQ_SYSMMU_LCD1_M1_0 | ||
237 | #define IRQ_SYSMMU_TV_M0_0 EXYNOS4_IRQ_SYSMMU_TV_M0_0 | ||
238 | #define IRQ_SYSMMU_MFC_M0_0 EXYNOS4_IRQ_SYSMMU_MFC_M0_0 | ||
239 | #define IRQ_SYSMMU_MFC_M1_0 EXYNOS4_IRQ_SYSMMU_MFC_M1_0 | ||
240 | #define IRQ_SYSMMU_PCIE_0 EXYNOS4_IRQ_SYSMMU_PCIE_0 | ||
241 | |||
242 | #define IRQ_FIMD0_FIFO EXYNOS4_IRQ_FIMD0_FIFO | 231 | #define IRQ_FIMD0_FIFO EXYNOS4_IRQ_FIMD0_FIFO |
243 | #define IRQ_FIMD0_VSYNC EXYNOS4_IRQ_FIMD0_VSYNC | 232 | #define IRQ_FIMD0_VSYNC EXYNOS4_IRQ_FIMD0_VSYNC |
244 | #define IRQ_FIMD0_SYSTEM EXYNOS4_IRQ_FIMD0_SYSTEM | 233 | #define IRQ_FIMD0_SYSTEM EXYNOS4_IRQ_FIMD0_SYSTEM |
@@ -298,6 +287,7 @@ | |||
298 | #define EXYNOS5_IRQ_MIPICSI1 IRQ_SPI(80) | 287 | #define EXYNOS5_IRQ_MIPICSI1 IRQ_SPI(80) |
299 | #define EXYNOS5_IRQ_EFNFCON_DMA_ABORT IRQ_SPI(81) | 288 | #define EXYNOS5_IRQ_EFNFCON_DMA_ABORT IRQ_SPI(81) |
300 | #define EXYNOS5_IRQ_MIPIDSI0 IRQ_SPI(82) | 289 | #define EXYNOS5_IRQ_MIPIDSI0 IRQ_SPI(82) |
290 | #define EXYNOS5_IRQ_WDT_IOP IRQ_SPI(83) | ||
301 | #define EXYNOS5_IRQ_ROTATOR IRQ_SPI(84) | 291 | #define EXYNOS5_IRQ_ROTATOR IRQ_SPI(84) |
302 | #define EXYNOS5_IRQ_GSC0 IRQ_SPI(85) | 292 | #define EXYNOS5_IRQ_GSC0 IRQ_SPI(85) |
303 | #define EXYNOS5_IRQ_GSC1 IRQ_SPI(86) | 293 | #define EXYNOS5_IRQ_GSC1 IRQ_SPI(86) |
@@ -306,8 +296,8 @@ | |||
306 | #define EXYNOS5_IRQ_JPEG IRQ_SPI(89) | 296 | #define EXYNOS5_IRQ_JPEG IRQ_SPI(89) |
307 | #define EXYNOS5_IRQ_EFNFCON_DMA IRQ_SPI(90) | 297 | #define EXYNOS5_IRQ_EFNFCON_DMA IRQ_SPI(90) |
308 | #define EXYNOS5_IRQ_2D IRQ_SPI(91) | 298 | #define EXYNOS5_IRQ_2D IRQ_SPI(91) |
309 | #define EXYNOS5_IRQ_SFMC0 IRQ_SPI(92) | 299 | #define EXYNOS5_IRQ_EFNFCON_0 IRQ_SPI(92) |
310 | #define EXYNOS5_IRQ_SFMC1 IRQ_SPI(93) | 300 | #define EXYNOS5_IRQ_EFNFCON_1 IRQ_SPI(93) |
311 | #define EXYNOS5_IRQ_MIXER IRQ_SPI(94) | 301 | #define EXYNOS5_IRQ_MIXER IRQ_SPI(94) |
312 | #define EXYNOS5_IRQ_HDMI IRQ_SPI(95) | 302 | #define EXYNOS5_IRQ_HDMI IRQ_SPI(95) |
313 | #define EXYNOS5_IRQ_MFC IRQ_SPI(96) | 303 | #define EXYNOS5_IRQ_MFC IRQ_SPI(96) |
@@ -321,7 +311,7 @@ | |||
321 | #define EXYNOS5_IRQ_PCM2 IRQ_SPI(104) | 311 | #define EXYNOS5_IRQ_PCM2 IRQ_SPI(104) |
322 | #define EXYNOS5_IRQ_SPDIF IRQ_SPI(105) | 312 | #define EXYNOS5_IRQ_SPDIF IRQ_SPI(105) |
323 | #define EXYNOS5_IRQ_ADC0 IRQ_SPI(106) | 313 | #define EXYNOS5_IRQ_ADC0 IRQ_SPI(106) |
324 | 314 | #define EXYNOS5_IRQ_ADC1 IRQ_SPI(107) | |
325 | #define EXYNOS5_IRQ_SATA_PHY IRQ_SPI(108) | 315 | #define EXYNOS5_IRQ_SATA_PHY IRQ_SPI(108) |
326 | #define EXYNOS5_IRQ_SATA_PMEMREQ IRQ_SPI(109) | 316 | #define EXYNOS5_IRQ_SATA_PMEMREQ IRQ_SPI(109) |
327 | #define EXYNOS5_IRQ_CAM_C IRQ_SPI(110) | 317 | #define EXYNOS5_IRQ_CAM_C IRQ_SPI(110) |
@@ -330,8 +320,9 @@ | |||
330 | #define EXYNOS5_IRQ_DP1_INTP1 IRQ_SPI(113) | 320 | #define EXYNOS5_IRQ_DP1_INTP1 IRQ_SPI(113) |
331 | #define EXYNOS5_IRQ_CEC IRQ_SPI(114) | 321 | #define EXYNOS5_IRQ_CEC IRQ_SPI(114) |
332 | #define EXYNOS5_IRQ_SATA IRQ_SPI(115) | 322 | #define EXYNOS5_IRQ_SATA IRQ_SPI(115) |
333 | #define EXYNOS5_IRQ_NFCON IRQ_SPI(116) | ||
334 | 323 | ||
324 | #define EXYNOS5_IRQ_MCT_L0 IRQ_SPI(120) | ||
325 | #define EXYNOS5_IRQ_MCT_L1 IRQ_SPI(121) | ||
335 | #define EXYNOS5_IRQ_MMC44 IRQ_SPI(123) | 326 | #define EXYNOS5_IRQ_MMC44 IRQ_SPI(123) |
336 | #define EXYNOS5_IRQ_MDMA1 IRQ_SPI(124) | 327 | #define EXYNOS5_IRQ_MDMA1 IRQ_SPI(124) |
337 | #define EXYNOS5_IRQ_FIMC_LITE0 IRQ_SPI(125) | 328 | #define EXYNOS5_IRQ_FIMC_LITE0 IRQ_SPI(125) |
@@ -339,7 +330,6 @@ | |||
339 | #define EXYNOS5_IRQ_RP_TIMER IRQ_SPI(127) | 330 | #define EXYNOS5_IRQ_RP_TIMER IRQ_SPI(127) |
340 | 331 | ||
341 | #define EXYNOS5_IRQ_PMU COMBINER_IRQ(1, 2) | 332 | #define EXYNOS5_IRQ_PMU COMBINER_IRQ(1, 2) |
342 | #define EXYNOS5_IRQ_PMU_CPU1 COMBINER_IRQ(1, 6) | ||
343 | 333 | ||
344 | #define EXYNOS5_IRQ_SYSMMU_GSC0_0 COMBINER_IRQ(2, 0) | 334 | #define EXYNOS5_IRQ_SYSMMU_GSC0_0 COMBINER_IRQ(2, 0) |
345 | #define EXYNOS5_IRQ_SYSMMU_GSC0_1 COMBINER_IRQ(2, 1) | 335 | #define EXYNOS5_IRQ_SYSMMU_GSC0_1 COMBINER_IRQ(2, 1) |
@@ -350,6 +340,8 @@ | |||
350 | #define EXYNOS5_IRQ_SYSMMU_GSC3_0 COMBINER_IRQ(2, 6) | 340 | #define EXYNOS5_IRQ_SYSMMU_GSC3_0 COMBINER_IRQ(2, 6) |
351 | #define EXYNOS5_IRQ_SYSMMU_GSC3_1 COMBINER_IRQ(2, 7) | 341 | #define EXYNOS5_IRQ_SYSMMU_GSC3_1 COMBINER_IRQ(2, 7) |
352 | 342 | ||
343 | #define EXYNOS5_IRQ_SYSMMU_LITE2_0 COMBINER_IRQ(3, 0) | ||
344 | #define EXYNOS5_IRQ_SYSMMU_LITE2_1 COMBINER_IRQ(3, 1) | ||
353 | #define EXYNOS5_IRQ_SYSMMU_FIMD1_0 COMBINER_IRQ(3, 2) | 345 | #define EXYNOS5_IRQ_SYSMMU_FIMD1_0 COMBINER_IRQ(3, 2) |
354 | #define EXYNOS5_IRQ_SYSMMU_FIMD1_1 COMBINER_IRQ(3, 3) | 346 | #define EXYNOS5_IRQ_SYSMMU_FIMD1_1 COMBINER_IRQ(3, 3) |
355 | #define EXYNOS5_IRQ_SYSMMU_LITE0_0 COMBINER_IRQ(3, 4) | 347 | #define EXYNOS5_IRQ_SYSMMU_LITE0_0 COMBINER_IRQ(3, 4) |
@@ -373,8 +365,8 @@ | |||
373 | 365 | ||
374 | #define EXYNOS5_IRQ_SYSMMU_ARM_0 COMBINER_IRQ(6, 0) | 366 | #define EXYNOS5_IRQ_SYSMMU_ARM_0 COMBINER_IRQ(6, 0) |
375 | #define EXYNOS5_IRQ_SYSMMU_ARM_1 COMBINER_IRQ(6, 1) | 367 | #define EXYNOS5_IRQ_SYSMMU_ARM_1 COMBINER_IRQ(6, 1) |
376 | #define EXYNOS5_IRQ_SYSMMU_MFC_L_0 COMBINER_IRQ(6, 2) | 368 | #define EXYNOS5_IRQ_SYSMMU_MFC_R_0 COMBINER_IRQ(6, 2) |
377 | #define EXYNOS5_IRQ_SYSMMU_MFC_L_1 COMBINER_IRQ(6, 3) | 369 | #define EXYNOS5_IRQ_SYSMMU_MFC_R_1 COMBINER_IRQ(6, 3) |
378 | #define EXYNOS5_IRQ_SYSMMU_RTIC_0 COMBINER_IRQ(6, 4) | 370 | #define EXYNOS5_IRQ_SYSMMU_RTIC_0 COMBINER_IRQ(6, 4) |
379 | #define EXYNOS5_IRQ_SYSMMU_RTIC_1 COMBINER_IRQ(6, 5) | 371 | #define EXYNOS5_IRQ_SYSMMU_RTIC_1 COMBINER_IRQ(6, 5) |
380 | #define EXYNOS5_IRQ_SYSMMU_SSS_0 COMBINER_IRQ(6, 6) | 372 | #define EXYNOS5_IRQ_SYSMMU_SSS_0 COMBINER_IRQ(6, 6) |
@@ -386,11 +378,9 @@ | |||
386 | #define EXYNOS5_IRQ_SYSMMU_MDMA1_1 COMBINER_IRQ(7, 3) | 378 | #define EXYNOS5_IRQ_SYSMMU_MDMA1_1 COMBINER_IRQ(7, 3) |
387 | #define EXYNOS5_IRQ_SYSMMU_TV_0 COMBINER_IRQ(7, 4) | 379 | #define EXYNOS5_IRQ_SYSMMU_TV_0 COMBINER_IRQ(7, 4) |
388 | #define EXYNOS5_IRQ_SYSMMU_TV_1 COMBINER_IRQ(7, 5) | 380 | #define EXYNOS5_IRQ_SYSMMU_TV_1 COMBINER_IRQ(7, 5) |
389 | #define EXYNOS5_IRQ_SYSMMU_GPSX_0 COMBINER_IRQ(7, 6) | ||
390 | #define EXYNOS5_IRQ_SYSMMU_GPSX_1 COMBINER_IRQ(7, 7) | ||
391 | 381 | ||
392 | #define EXYNOS5_IRQ_SYSMMU_MFC_R_0 COMBINER_IRQ(8, 5) | 382 | #define EXYNOS5_IRQ_SYSMMU_MFC_L_0 COMBINER_IRQ(8, 5) |
393 | #define EXYNOS5_IRQ_SYSMMU_MFC_R_1 COMBINER_IRQ(8, 6) | 383 | #define EXYNOS5_IRQ_SYSMMU_MFC_L_1 COMBINER_IRQ(8, 6) |
394 | 384 | ||
395 | #define EXYNOS5_IRQ_SYSMMU_DIS1_0 COMBINER_IRQ(9, 4) | 385 | #define EXYNOS5_IRQ_SYSMMU_DIS1_0 COMBINER_IRQ(9, 4) |
396 | #define EXYNOS5_IRQ_SYSMMU_DIS1_1 COMBINER_IRQ(9, 5) | 386 | #define EXYNOS5_IRQ_SYSMMU_DIS1_1 COMBINER_IRQ(9, 5) |
@@ -406,17 +396,24 @@ | |||
406 | #define EXYNOS5_IRQ_SYSMMU_DRC_0 COMBINER_IRQ(11, 6) | 396 | #define EXYNOS5_IRQ_SYSMMU_DRC_0 COMBINER_IRQ(11, 6) |
407 | #define EXYNOS5_IRQ_SYSMMU_DRC_1 COMBINER_IRQ(11, 7) | 397 | #define EXYNOS5_IRQ_SYSMMU_DRC_1 COMBINER_IRQ(11, 7) |
408 | 398 | ||
399 | #define EXYNOS5_IRQ_MDMA1_ABORT COMBINER_IRQ(13, 1) | ||
400 | |||
401 | #define EXYNOS5_IRQ_MDMA0_ABORT COMBINER_IRQ(15, 3) | ||
402 | |||
409 | #define EXYNOS5_IRQ_FIMD1_FIFO COMBINER_IRQ(18, 4) | 403 | #define EXYNOS5_IRQ_FIMD1_FIFO COMBINER_IRQ(18, 4) |
410 | #define EXYNOS5_IRQ_FIMD1_VSYNC COMBINER_IRQ(18, 5) | 404 | #define EXYNOS5_IRQ_FIMD1_VSYNC COMBINER_IRQ(18, 5) |
411 | #define EXYNOS5_IRQ_FIMD1_SYSTEM COMBINER_IRQ(18, 6) | 405 | #define EXYNOS5_IRQ_FIMD1_SYSTEM COMBINER_IRQ(18, 6) |
412 | 406 | ||
407 | #define EXYNOS5_IRQ_ARMIOP_GIC COMBINER_IRQ(19, 0) | ||
408 | #define EXYNOS5_IRQ_ARMISP_GIC COMBINER_IRQ(19, 1) | ||
409 | #define EXYNOS5_IRQ_IOP_GIC COMBINER_IRQ(19, 3) | ||
410 | #define EXYNOS5_IRQ_ISP_GIC COMBINER_IRQ(19, 4) | ||
411 | |||
412 | #define EXYNOS5_IRQ_PMU_CPU1 COMBINER_IRQ(22, 4) | ||
413 | |||
413 | #define EXYNOS5_IRQ_EINT0 COMBINER_IRQ(23, 0) | 414 | #define EXYNOS5_IRQ_EINT0 COMBINER_IRQ(23, 0) |
414 | #define EXYNOS5_IRQ_MCT_L0 COMBINER_IRQ(23, 1) | ||
415 | #define EXYNOS5_IRQ_MCT_L1 COMBINER_IRQ(23, 2) | ||
416 | #define EXYNOS5_IRQ_MCT_G0 COMBINER_IRQ(23, 3) | 415 | #define EXYNOS5_IRQ_MCT_G0 COMBINER_IRQ(23, 3) |
417 | #define EXYNOS5_IRQ_MCT_G1 COMBINER_IRQ(23, 4) | 416 | #define EXYNOS5_IRQ_MCT_G1 COMBINER_IRQ(23, 4) |
418 | #define EXYNOS5_IRQ_MCT_G2 COMBINER_IRQ(23, 5) | ||
419 | #define EXYNOS5_IRQ_MCT_G3 COMBINER_IRQ(23, 6) | ||
420 | 417 | ||
421 | #define EXYNOS5_IRQ_EINT1 COMBINER_IRQ(24, 0) | 418 | #define EXYNOS5_IRQ_EINT1 COMBINER_IRQ(24, 0) |
422 | #define EXYNOS5_IRQ_SYSMMU_LITE1_0 COMBINER_IRQ(24, 1) | 419 | #define EXYNOS5_IRQ_SYSMMU_LITE1_0 COMBINER_IRQ(24, 1) |
@@ -447,7 +444,7 @@ | |||
447 | 444 | ||
448 | #define EXYNOS5_MAX_COMBINER_NR 32 | 445 | #define EXYNOS5_MAX_COMBINER_NR 32 |
449 | 446 | ||
450 | #define EXYNOS5_IRQ_GPIO1_NR_GROUPS 13 | 447 | #define EXYNOS5_IRQ_GPIO1_NR_GROUPS 14 |
451 | #define EXYNOS5_IRQ_GPIO2_NR_GROUPS 9 | 448 | #define EXYNOS5_IRQ_GPIO2_NR_GROUPS 9 |
452 | #define EXYNOS5_IRQ_GPIO3_NR_GROUPS 5 | 449 | #define EXYNOS5_IRQ_GPIO3_NR_GROUPS 5 |
453 | #define EXYNOS5_IRQ_GPIO4_NR_GROUPS 1 | 450 | #define EXYNOS5_IRQ_GPIO4_NR_GROUPS 1 |
diff --git a/arch/arm/mach-exynos/include/mach/map.h b/arch/arm/mach-exynos/include/mach/map.h index e009a66477f4..ca4aa89aa46b 100644 --- a/arch/arm/mach-exynos/include/mach/map.h +++ b/arch/arm/mach-exynos/include/mach/map.h | |||
@@ -34,6 +34,9 @@ | |||
34 | 34 | ||
35 | #define EXYNOS4_PA_JPEG 0x11840000 | 35 | #define EXYNOS4_PA_JPEG 0x11840000 |
36 | 36 | ||
37 | /* x = 0...1 */ | ||
38 | #define EXYNOS4_PA_FIMC_LITE(x) (0x12390000 + ((x) * 0x10000)) | ||
39 | |||
37 | #define EXYNOS4_PA_G2D 0x12800000 | 40 | #define EXYNOS4_PA_G2D 0x12800000 |
38 | 41 | ||
39 | #define EXYNOS4_PA_I2S0 0x03830000 | 42 | #define EXYNOS4_PA_I2S0 0x03830000 |
@@ -78,8 +81,8 @@ | |||
78 | 81 | ||
79 | #define EXYNOS4_PA_GIC_CPU 0x10480000 | 82 | #define EXYNOS4_PA_GIC_CPU 0x10480000 |
80 | #define EXYNOS4_PA_GIC_DIST 0x10490000 | 83 | #define EXYNOS4_PA_GIC_DIST 0x10490000 |
81 | #define EXYNOS5_PA_GIC_CPU 0x10480000 | 84 | #define EXYNOS5_PA_GIC_CPU 0x10482000 |
82 | #define EXYNOS5_PA_GIC_DIST 0x10490000 | 85 | #define EXYNOS5_PA_GIC_DIST 0x10481000 |
83 | 86 | ||
84 | #define EXYNOS4_PA_COREPERI 0x10500000 | 87 | #define EXYNOS4_PA_COREPERI 0x10500000 |
85 | #define EXYNOS4_PA_TWD 0x10500600 | 88 | #define EXYNOS4_PA_TWD 0x10500600 |
@@ -95,6 +98,7 @@ | |||
95 | #define EXYNOS5_PA_PDMA1 0x121B0000 | 98 | #define EXYNOS5_PA_PDMA1 0x121B0000 |
96 | 99 | ||
97 | #define EXYNOS4_PA_SYSMMU_MDMA 0x10A40000 | 100 | #define EXYNOS4_PA_SYSMMU_MDMA 0x10A40000 |
101 | #define EXYNOS4_PA_SYSMMU_2D_ACP 0x10A40000 | ||
98 | #define EXYNOS4_PA_SYSMMU_SSS 0x10A50000 | 102 | #define EXYNOS4_PA_SYSMMU_SSS 0x10A50000 |
99 | #define EXYNOS4_PA_SYSMMU_FIMC0 0x11A20000 | 103 | #define EXYNOS4_PA_SYSMMU_FIMC0 0x11A20000 |
100 | #define EXYNOS4_PA_SYSMMU_FIMC1 0x11A30000 | 104 | #define EXYNOS4_PA_SYSMMU_FIMC1 0x11A30000 |
@@ -103,6 +107,12 @@ | |||
103 | #define EXYNOS4_PA_SYSMMU_JPEG 0x11A60000 | 107 | #define EXYNOS4_PA_SYSMMU_JPEG 0x11A60000 |
104 | #define EXYNOS4_PA_SYSMMU_FIMD0 0x11E20000 | 108 | #define EXYNOS4_PA_SYSMMU_FIMD0 0x11E20000 |
105 | #define EXYNOS4_PA_SYSMMU_FIMD1 0x12220000 | 109 | #define EXYNOS4_PA_SYSMMU_FIMD1 0x12220000 |
110 | #define EXYNOS4_PA_SYSMMU_FIMC_ISP 0x12260000 | ||
111 | #define EXYNOS4_PA_SYSMMU_FIMC_DRC 0x12270000 | ||
112 | #define EXYNOS4_PA_SYSMMU_FIMC_FD 0x122A0000 | ||
113 | #define EXYNOS4_PA_SYSMMU_ISPCPU 0x122B0000 | ||
114 | #define EXYNOS4_PA_SYSMMU_FIMC_LITE0 0x123B0000 | ||
115 | #define EXYNOS4_PA_SYSMMU_FIMC_LITE1 0x123C0000 | ||
106 | #define EXYNOS4_PA_SYSMMU_PCIe 0x12620000 | 116 | #define EXYNOS4_PA_SYSMMU_PCIe 0x12620000 |
107 | #define EXYNOS4_PA_SYSMMU_G2D 0x12A20000 | 117 | #define EXYNOS4_PA_SYSMMU_G2D 0x12A20000 |
108 | #define EXYNOS4_PA_SYSMMU_ROTATOR 0x12A30000 | 118 | #define EXYNOS4_PA_SYSMMU_ROTATOR 0x12A30000 |
@@ -110,6 +120,37 @@ | |||
110 | #define EXYNOS4_PA_SYSMMU_TV 0x12E20000 | 120 | #define EXYNOS4_PA_SYSMMU_TV 0x12E20000 |
111 | #define EXYNOS4_PA_SYSMMU_MFC_L 0x13620000 | 121 | #define EXYNOS4_PA_SYSMMU_MFC_L 0x13620000 |
112 | #define EXYNOS4_PA_SYSMMU_MFC_R 0x13630000 | 122 | #define EXYNOS4_PA_SYSMMU_MFC_R 0x13630000 |
123 | |||
124 | #define EXYNOS5_PA_SYSMMU_MDMA1 0x10A40000 | ||
125 | #define EXYNOS5_PA_SYSMMU_SSS 0x10A50000 | ||
126 | #define EXYNOS5_PA_SYSMMU_2D 0x10A60000 | ||
127 | #define EXYNOS5_PA_SYSMMU_MFC_L 0x11200000 | ||
128 | #define EXYNOS5_PA_SYSMMU_MFC_R 0x11210000 | ||
129 | #define EXYNOS5_PA_SYSMMU_ROTATOR 0x11D40000 | ||
130 | #define EXYNOS5_PA_SYSMMU_MDMA2 0x11D50000 | ||
131 | #define EXYNOS5_PA_SYSMMU_JPEG 0x11F20000 | ||
132 | #define EXYNOS5_PA_SYSMMU_IOP 0x12360000 | ||
133 | #define EXYNOS5_PA_SYSMMU_RTIC 0x12370000 | ||
134 | #define EXYNOS5_PA_SYSMMU_GPS 0x12630000 | ||
135 | #define EXYNOS5_PA_SYSMMU_ISP 0x13260000 | ||
136 | #define EXYNOS5_PA_SYSMMU_DRC 0x12370000 | ||
137 | #define EXYNOS5_PA_SYSMMU_SCALERC 0x13280000 | ||
138 | #define EXYNOS5_PA_SYSMMU_SCALERP 0x13290000 | ||
139 | #define EXYNOS5_PA_SYSMMU_FD 0x132A0000 | ||
140 | #define EXYNOS5_PA_SYSMMU_ISPCPU 0x132B0000 | ||
141 | #define EXYNOS5_PA_SYSMMU_ODC 0x132C0000 | ||
142 | #define EXYNOS5_PA_SYSMMU_DIS0 0x132D0000 | ||
143 | #define EXYNOS5_PA_SYSMMU_DIS1 0x132E0000 | ||
144 | #define EXYNOS5_PA_SYSMMU_3DNR 0x132F0000 | ||
145 | #define EXYNOS5_PA_SYSMMU_LITE0 0x13C40000 | ||
146 | #define EXYNOS5_PA_SYSMMU_LITE1 0x13C50000 | ||
147 | #define EXYNOS5_PA_SYSMMU_GSC0 0x13E80000 | ||
148 | #define EXYNOS5_PA_SYSMMU_GSC1 0x13E90000 | ||
149 | #define EXYNOS5_PA_SYSMMU_GSC2 0x13EA0000 | ||
150 | #define EXYNOS5_PA_SYSMMU_GSC3 0x13EB0000 | ||
151 | #define EXYNOS5_PA_SYSMMU_FIMD1 0x14640000 | ||
152 | #define EXYNOS5_PA_SYSMMU_TV 0x14650000 | ||
153 | |||
113 | #define EXYNOS4_PA_SPI0 0x13920000 | 154 | #define EXYNOS4_PA_SPI0 0x13920000 |
114 | #define EXYNOS4_PA_SPI1 0x13930000 | 155 | #define EXYNOS4_PA_SPI1 0x13930000 |
115 | #define EXYNOS4_PA_SPI2 0x13940000 | 156 | #define EXYNOS4_PA_SPI2 0x13940000 |
diff --git a/arch/arm/mach-exynos/include/mach/regs-clock.h b/arch/arm/mach-exynos/include/mach/regs-clock.h index d9578a58ae7f..b78b5f3ad9c0 100644 --- a/arch/arm/mach-exynos/include/mach/regs-clock.h +++ b/arch/arm/mach-exynos/include/mach/regs-clock.h | |||
@@ -135,6 +135,9 @@ | |||
135 | #define EXYNOS4_CLKGATE_SCLKCPU EXYNOS_CLKREG(0x14800) | 135 | #define EXYNOS4_CLKGATE_SCLKCPU EXYNOS_CLKREG(0x14800) |
136 | #define EXYNOS4_CLKGATE_IP_CPU EXYNOS_CLKREG(0x14900) | 136 | #define EXYNOS4_CLKGATE_IP_CPU EXYNOS_CLKREG(0x14900) |
137 | 137 | ||
138 | #define EXYNOS4_CLKGATE_IP_ISP0 EXYNOS_CLKREG(0x18800) | ||
139 | #define EXYNOS4_CLKGATE_IP_ISP1 EXYNOS_CLKREG(0x18804) | ||
140 | |||
138 | #define EXYNOS4_APLL_LOCKTIME (0x1C20) /* 300us */ | 141 | #define EXYNOS4_APLL_LOCKTIME (0x1C20) /* 300us */ |
139 | 142 | ||
140 | #define EXYNOS4_APLLCON0_ENABLE_SHIFT (31) | 143 | #define EXYNOS4_APLLCON0_ENABLE_SHIFT (31) |
@@ -303,6 +306,8 @@ | |||
303 | #define EXYNOS5_CLKDIV_PERIC0 EXYNOS_CLKREG(0x10558) | 306 | #define EXYNOS5_CLKDIV_PERIC0 EXYNOS_CLKREG(0x10558) |
304 | 307 | ||
305 | #define EXYNOS5_CLKGATE_IP_ACP EXYNOS_CLKREG(0x08800) | 308 | #define EXYNOS5_CLKGATE_IP_ACP EXYNOS_CLKREG(0x08800) |
309 | #define EXYNOS5_CLKGATE_IP_ISP0 EXYNOS_CLKREG(0x0C800) | ||
310 | #define EXYNOS5_CLKGATE_IP_ISP1 EXYNOS_CLKREG(0x0C804) | ||
306 | #define EXYNOS5_CLKGATE_IP_GSCL EXYNOS_CLKREG(0x10920) | 311 | #define EXYNOS5_CLKGATE_IP_GSCL EXYNOS_CLKREG(0x10920) |
307 | #define EXYNOS5_CLKGATE_IP_DISP1 EXYNOS_CLKREG(0x10928) | 312 | #define EXYNOS5_CLKGATE_IP_DISP1 EXYNOS_CLKREG(0x10928) |
308 | #define EXYNOS5_CLKGATE_IP_MFC EXYNOS_CLKREG(0x1092C) | 313 | #define EXYNOS5_CLKGATE_IP_MFC EXYNOS_CLKREG(0x1092C) |
@@ -317,6 +322,8 @@ | |||
317 | #define EXYNOS5_CLKSRC_CDREX EXYNOS_CLKREG(0x20200) | 322 | #define EXYNOS5_CLKSRC_CDREX EXYNOS_CLKREG(0x20200) |
318 | #define EXYNOS5_CLKDIV_CDREX EXYNOS_CLKREG(0x20500) | 323 | #define EXYNOS5_CLKDIV_CDREX EXYNOS_CLKREG(0x20500) |
319 | 324 | ||
325 | #define EXYNOS5_PLL_DIV2_SEL EXYNOS_CLKREG(0x20A24) | ||
326 | |||
320 | #define EXYNOS5_EPLL_LOCK EXYNOS_CLKREG(0x10030) | 327 | #define EXYNOS5_EPLL_LOCK EXYNOS_CLKREG(0x10030) |
321 | 328 | ||
322 | #define EXYNOS5_EPLLCON0_LOCKED_SHIFT (29) | 329 | #define EXYNOS5_EPLLCON0_LOCKED_SHIFT (29) |
diff --git a/arch/arm/mach-exynos/include/mach/regs-pmu.h b/arch/arm/mach-exynos/include/mach/regs-pmu.h index d457d052a420..4dbb8629b200 100644 --- a/arch/arm/mach-exynos/include/mach/regs-pmu.h +++ b/arch/arm/mach-exynos/include/mach/regs-pmu.h | |||
@@ -180,7 +180,7 @@ | |||
180 | 180 | ||
181 | #define S5P_PMU_LCD1_CONF S5P_PMUREG(0x3CA0) | 181 | #define S5P_PMU_LCD1_CONF S5P_PMUREG(0x3CA0) |
182 | 182 | ||
183 | /* Only for EXYNOS4212 */ | 183 | /* Only for EXYNOS4x12 */ |
184 | #define S5P_ISP_ARM_LOWPWR S5P_PMUREG(0x1050) | 184 | #define S5P_ISP_ARM_LOWPWR S5P_PMUREG(0x1050) |
185 | #define S5P_DIS_IRQ_ISP_ARM_LOCAL_LOWPWR S5P_PMUREG(0x1054) | 185 | #define S5P_DIS_IRQ_ISP_ARM_LOCAL_LOWPWR S5P_PMUREG(0x1054) |
186 | #define S5P_DIS_IRQ_ISP_ARM_CENTRAL_LOWPWR S5P_PMUREG(0x1058) | 186 | #define S5P_DIS_IRQ_ISP_ARM_CENTRAL_LOWPWR S5P_PMUREG(0x1058) |
@@ -221,4 +221,12 @@ | |||
221 | #define S5P_SECSS_MEM_OPTION S5P_PMUREG(0x2EC8) | 221 | #define S5P_SECSS_MEM_OPTION S5P_PMUREG(0x2EC8) |
222 | #define S5P_ROTATOR_MEM_OPTION S5P_PMUREG(0x2F48) | 222 | #define S5P_ROTATOR_MEM_OPTION S5P_PMUREG(0x2F48) |
223 | 223 | ||
224 | /* Only for EXYNOS4412 */ | ||
225 | #define S5P_ARM_CORE2_LOWPWR S5P_PMUREG(0x1020) | ||
226 | #define S5P_DIS_IRQ_CORE2 S5P_PMUREG(0x1024) | ||
227 | #define S5P_DIS_IRQ_CENTRAL2 S5P_PMUREG(0x1028) | ||
228 | #define S5P_ARM_CORE3_LOWPWR S5P_PMUREG(0x1030) | ||
229 | #define S5P_DIS_IRQ_CORE3 S5P_PMUREG(0x1034) | ||
230 | #define S5P_DIS_IRQ_CENTRAL3 S5P_PMUREG(0x1038) | ||
231 | |||
224 | #endif /* __ASM_ARCH_REGS_PMU_H */ | 232 | #endif /* __ASM_ARCH_REGS_PMU_H */ |
diff --git a/arch/arm/mach-exynos/include/mach/regs-sysmmu.h b/arch/arm/mach-exynos/include/mach/regs-sysmmu.h deleted file mode 100644 index 68ff6ad08a2b..000000000000 --- a/arch/arm/mach-exynos/include/mach/regs-sysmmu.h +++ /dev/null | |||
@@ -1,28 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-exynos4/include/mach/regs-sysmmu.h | ||
2 | * | ||
3 | * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com | ||
5 | * | ||
6 | * EXYNOS4 - System MMU register | ||
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 | |||
13 | #ifndef __ASM_ARCH_REGS_SYSMMU_H | ||
14 | #define __ASM_ARCH_REGS_SYSMMU_H __FILE__ | ||
15 | |||
16 | #define S5P_MMU_CTRL 0x000 | ||
17 | #define S5P_MMU_CFG 0x004 | ||
18 | #define S5P_MMU_STATUS 0x008 | ||
19 | #define S5P_MMU_FLUSH 0x00C | ||
20 | #define S5P_PT_BASE_ADDR 0x014 | ||
21 | #define S5P_INT_STATUS 0x018 | ||
22 | #define S5P_INT_CLEAR 0x01C | ||
23 | #define S5P_PAGE_FAULT_ADDR 0x024 | ||
24 | #define S5P_AW_FAULT_ADDR 0x028 | ||
25 | #define S5P_AR_FAULT_ADDR 0x02C | ||
26 | #define S5P_DEFAULT_SLAVE_ADDR 0x030 | ||
27 | |||
28 | #endif /* __ASM_ARCH_REGS_SYSMMU_H */ | ||
diff --git a/arch/arm/mach-exynos/include/mach/spi-clocks.h b/arch/arm/mach-exynos/include/mach/spi-clocks.h index 576efdf6d091..c71a5fba6a84 100644 --- a/arch/arm/mach-exynos/include/mach/spi-clocks.h +++ b/arch/arm/mach-exynos/include/mach/spi-clocks.h | |||
@@ -11,6 +11,6 @@ | |||
11 | #define __ASM_ARCH_SPI_CLKS_H __FILE__ | 11 | #define __ASM_ARCH_SPI_CLKS_H __FILE__ |
12 | 12 | ||
13 | /* Must source from SCLK_SPI */ | 13 | /* Must source from SCLK_SPI */ |
14 | #define EXYNOS4_SPI_SRCCLK_SCLK 0 | 14 | #define EXYNOS_SPI_SRCCLK_SCLK 0 |
15 | 15 | ||
16 | #endif /* __ASM_ARCH_SPI_CLKS_H */ | 16 | #endif /* __ASM_ARCH_SPI_CLKS_H */ |
diff --git a/arch/arm/mach-exynos/include/mach/sysmmu.h b/arch/arm/mach-exynos/include/mach/sysmmu.h index 6a5fbb534e82..998daf2add92 100644 --- a/arch/arm/mach-exynos/include/mach/sysmmu.h +++ b/arch/arm/mach-exynos/include/mach/sysmmu.h | |||
@@ -1,46 +1,66 @@ | |||
1 | /* linux/arch/arm/mach-exynos4/include/mach/sysmmu.h | 1 | /* |
2 | * | 2 | * Copyright (c) 2011-2012 Samsung Electronics Co., Ltd. |
3 | * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com | 3 | * http://www.samsung.com |
5 | * | 4 | * |
6 | * Samsung sysmmu driver for EXYNOS4 | 5 | * EXYNOS - System MMU support |
7 | * | 6 | * |
8 | * This program is free software; you can redistribute it and/or modify | 7 | * 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 | 8 | * it under the terms of the GNU General Public License version 2 as |
10 | * published by the Free Software Foundation. | 9 | * published by the Free Software Foundation. |
11 | */ | 10 | */ |
12 | 11 | ||
13 | #ifndef __ASM_ARM_ARCH_SYSMMU_H | 12 | #ifndef _ARM_MACH_EXYNOS_SYSMMU_H_ |
14 | #define __ASM_ARM_ARCH_SYSMMU_H __FILE__ | 13 | #define _ARM_MACH_EXYNOS_SYSMMU_H_ |
15 | 14 | ||
16 | enum exynos4_sysmmu_ips { | 15 | struct sysmmu_platform_data { |
17 | SYSMMU_MDMA, | 16 | char *dbgname; |
18 | SYSMMU_SSS, | 17 | /* comma(,) separated list of clock names for clock gating */ |
19 | SYSMMU_FIMC0, | 18 | char *clockname; |
20 | SYSMMU_FIMC1, | ||
21 | SYSMMU_FIMC2, | ||
22 | SYSMMU_FIMC3, | ||
23 | SYSMMU_JPEG, | ||
24 | SYSMMU_FIMD0, | ||
25 | SYSMMU_FIMD1, | ||
26 | SYSMMU_PCIe, | ||
27 | SYSMMU_G2D, | ||
28 | SYSMMU_ROTATOR, | ||
29 | SYSMMU_MDMA2, | ||
30 | SYSMMU_TV, | ||
31 | SYSMMU_MFC_L, | ||
32 | SYSMMU_MFC_R, | ||
33 | EXYNOS4_SYSMMU_TOTAL_IPNUM, | ||
34 | }; | 19 | }; |
35 | 20 | ||
36 | #define S5P_SYSMMU_TOTAL_IPNUM EXYNOS4_SYSMMU_TOTAL_IPNUM | 21 | #define SYSMMU_DEVNAME_BASE "exynos-sysmmu" |
22 | |||
23 | #define SYSMMU_CLOCK_NAME "sysmmu" | ||
24 | #define SYSMMU_CLOCK_NAME2 "sysmmu_mc" | ||
25 | |||
26 | #ifdef CONFIG_EXYNOS_DEV_SYSMMU | ||
27 | #include <linux/device.h> | ||
28 | struct platform_device; | ||
29 | |||
30 | #define SYSMMU_PLATDEV(ipname) exynos_device_sysmmu_##ipname | ||
31 | |||
32 | extern struct platform_device SYSMMU_PLATDEV(mfc_l); | ||
33 | extern struct platform_device SYSMMU_PLATDEV(mfc_r); | ||
34 | extern struct platform_device SYSMMU_PLATDEV(tv); | ||
35 | extern struct platform_device SYSMMU_PLATDEV(jpeg); | ||
36 | extern struct platform_device SYSMMU_PLATDEV(rot); | ||
37 | extern struct platform_device SYSMMU_PLATDEV(fimc0); | ||
38 | extern struct platform_device SYSMMU_PLATDEV(fimc1); | ||
39 | extern struct platform_device SYSMMU_PLATDEV(fimc2); | ||
40 | extern struct platform_device SYSMMU_PLATDEV(fimc3); | ||
41 | extern struct platform_device SYSMMU_PLATDEV(gsc0); | ||
42 | extern struct platform_device SYSMMU_PLATDEV(gsc1); | ||
43 | extern struct platform_device SYSMMU_PLATDEV(gsc2); | ||
44 | extern struct platform_device SYSMMU_PLATDEV(gsc3); | ||
45 | extern struct platform_device SYSMMU_PLATDEV(isp); | ||
46 | extern struct platform_device SYSMMU_PLATDEV(fimd0); | ||
47 | extern struct platform_device SYSMMU_PLATDEV(fimd1); | ||
48 | extern struct platform_device SYSMMU_PLATDEV(camif0); | ||
49 | extern struct platform_device SYSMMU_PLATDEV(camif1); | ||
50 | extern struct platform_device SYSMMU_PLATDEV(2d); | ||
37 | 51 | ||
38 | extern const char *sysmmu_ips_name[EXYNOS4_SYSMMU_TOTAL_IPNUM]; | 52 | #ifdef CONFIG_IOMMU_API |
53 | static inline void platform_set_sysmmu( | ||
54 | struct device *sysmmu, struct device *dev) | ||
55 | { | ||
56 | dev->archdata.iommu = sysmmu; | ||
57 | } | ||
58 | #endif | ||
39 | 59 | ||
40 | typedef enum exynos4_sysmmu_ips sysmmu_ips; | 60 | #else /* !CONFIG_EXYNOS_DEV_SYSMMU */ |
61 | #define platform_set_sysmmu(dev, sysmmu) do { } while (0) | ||
62 | #endif | ||
41 | 63 | ||
42 | void sysmmu_clk_init(struct device *dev, sysmmu_ips ips); | 64 | #define SYSMMU_CLOCK_DEVNAME(ipname, id) (SYSMMU_DEVNAME_BASE "." #id) |
43 | void sysmmu_clk_enable(sysmmu_ips ips); | ||
44 | void sysmmu_clk_disable(sysmmu_ips ips); | ||
45 | 65 | ||
46 | #endif /* __ASM_ARM_ARCH_SYSMMU_H */ | 66 | #endif /* _ARM_MACH_EXYNOS_SYSMMU_H_ */ |
diff --git a/arch/arm/mach-exynos/mach-armlex4210.c b/arch/arm/mach-exynos/mach-armlex4210.c index fed7116418eb..5a3daa0168d8 100644 --- a/arch/arm/mach-exynos/mach-armlex4210.c +++ b/arch/arm/mach-exynos/mach-armlex4210.c | |||
@@ -147,7 +147,6 @@ static struct platform_device *armlex4210_devices[] __initdata = { | |||
147 | &s3c_device_hsmmc3, | 147 | &s3c_device_hsmmc3, |
148 | &s3c_device_rtc, | 148 | &s3c_device_rtc, |
149 | &s3c_device_wdt, | 149 | &s3c_device_wdt, |
150 | &exynos4_device_sysmmu, | ||
151 | &samsung_asoc_dma, | 150 | &samsung_asoc_dma, |
152 | &armlex4210_smsc911x, | 151 | &armlex4210_smsc911x, |
153 | &exynos4_device_ahci, | 152 | &exynos4_device_ahci, |
@@ -204,6 +203,7 @@ MACHINE_START(ARMLEX4210, "ARMLEX4210") | |||
204 | .map_io = armlex4210_map_io, | 203 | .map_io = armlex4210_map_io, |
205 | .handle_irq = gic_handle_irq, | 204 | .handle_irq = gic_handle_irq, |
206 | .init_machine = armlex4210_machine_init, | 205 | .init_machine = armlex4210_machine_init, |
206 | .init_late = exynos_init_late, | ||
207 | .timer = &exynos4_timer, | 207 | .timer = &exynos4_timer, |
208 | .restart = exynos4_restart, | 208 | .restart = exynos4_restart, |
209 | MACHINE_END | 209 | MACHINE_END |
diff --git a/arch/arm/mach-exynos/mach-exynos4-dt.c b/arch/arm/mach-exynos/mach-exynos4-dt.c index 8245f1c761d9..e7e9743543ac 100644 --- a/arch/arm/mach-exynos/mach-exynos4-dt.c +++ b/arch/arm/mach-exynos/mach-exynos4-dt.c | |||
@@ -83,6 +83,7 @@ DT_MACHINE_START(EXYNOS4210_DT, "Samsung Exynos4 (Flattened Device Tree)") | |||
83 | .map_io = exynos4210_dt_map_io, | 83 | .map_io = exynos4210_dt_map_io, |
84 | .handle_irq = gic_handle_irq, | 84 | .handle_irq = gic_handle_irq, |
85 | .init_machine = exynos4210_dt_machine_init, | 85 | .init_machine = exynos4210_dt_machine_init, |
86 | .init_late = exynos_init_late, | ||
86 | .timer = &exynos4_timer, | 87 | .timer = &exynos4_timer, |
87 | .dt_compat = exynos4210_dt_compat, | 88 | .dt_compat = exynos4210_dt_compat, |
88 | .restart = exynos4_restart, | 89 | .restart = exynos4_restart, |
diff --git a/arch/arm/mach-exynos/mach-exynos5-dt.c b/arch/arm/mach-exynos/mach-exynos5-dt.c index 4711c8920e37..7b1e11a228cc 100644 --- a/arch/arm/mach-exynos/mach-exynos5-dt.c +++ b/arch/arm/mach-exynos/mach-exynos5-dt.c | |||
@@ -43,6 +43,10 @@ static const struct of_dev_auxdata exynos5250_auxdata_lookup[] __initconst = { | |||
43 | "exynos4210-uart.2", NULL), | 43 | "exynos4210-uart.2", NULL), |
44 | OF_DEV_AUXDATA("samsung,exynos4210-uart", EXYNOS5_PA_UART3, | 44 | OF_DEV_AUXDATA("samsung,exynos4210-uart", EXYNOS5_PA_UART3, |
45 | "exynos4210-uart.3", NULL), | 45 | "exynos4210-uart.3", NULL), |
46 | OF_DEV_AUXDATA("samsung,s3c2440-i2c", EXYNOS5_PA_IIC(0), | ||
47 | "s3c2440-i2c.0", NULL), | ||
48 | OF_DEV_AUXDATA("samsung,s3c2440-i2c", EXYNOS5_PA_IIC(1), | ||
49 | "s3c2440-i2c.1", NULL), | ||
46 | OF_DEV_AUXDATA("arm,pl330", EXYNOS5_PA_PDMA0, "dma-pl330.0", NULL), | 50 | OF_DEV_AUXDATA("arm,pl330", EXYNOS5_PA_PDMA0, "dma-pl330.0", NULL), |
47 | OF_DEV_AUXDATA("arm,pl330", EXYNOS5_PA_PDMA1, "dma-pl330.1", NULL), | 51 | OF_DEV_AUXDATA("arm,pl330", EXYNOS5_PA_PDMA1, "dma-pl330.1", NULL), |
48 | OF_DEV_AUXDATA("arm,pl330", EXYNOS5_PA_MDMA1, "dma-pl330.2", NULL), | 52 | OF_DEV_AUXDATA("arm,pl330", EXYNOS5_PA_MDMA1, "dma-pl330.2", NULL), |
@@ -72,6 +76,7 @@ DT_MACHINE_START(EXYNOS5_DT, "SAMSUNG EXYNOS5 (Flattened Device Tree)") | |||
72 | .map_io = exynos5250_dt_map_io, | 76 | .map_io = exynos5250_dt_map_io, |
73 | .handle_irq = gic_handle_irq, | 77 | .handle_irq = gic_handle_irq, |
74 | .init_machine = exynos5250_dt_machine_init, | 78 | .init_machine = exynos5250_dt_machine_init, |
79 | .init_late = exynos_init_late, | ||
75 | .timer = &exynos4_timer, | 80 | .timer = &exynos4_timer, |
76 | .dt_compat = exynos5250_dt_compat, | 81 | .dt_compat = exynos5250_dt_compat, |
77 | .restart = exynos5_restart, | 82 | .restart = exynos5_restart, |
diff --git a/arch/arm/mach-exynos/mach-nuri.c b/arch/arm/mach-exynos/mach-nuri.c index 6c31f2ad765d..972983e392bc 100644 --- a/arch/arm/mach-exynos/mach-nuri.c +++ b/arch/arm/mach-exynos/mach-nuri.c | |||
@@ -1389,6 +1389,7 @@ MACHINE_START(NURI, "NURI") | |||
1389 | .map_io = nuri_map_io, | 1389 | .map_io = nuri_map_io, |
1390 | .handle_irq = gic_handle_irq, | 1390 | .handle_irq = gic_handle_irq, |
1391 | .init_machine = nuri_machine_init, | 1391 | .init_machine = nuri_machine_init, |
1392 | .init_late = exynos_init_late, | ||
1392 | .timer = &exynos4_timer, | 1393 | .timer = &exynos4_timer, |
1393 | .reserve = &nuri_reserve, | 1394 | .reserve = &nuri_reserve, |
1394 | .restart = exynos4_restart, | 1395 | .restart = exynos4_restart, |
diff --git a/arch/arm/mach-exynos/mach-origen.c b/arch/arm/mach-exynos/mach-origen.c index 26124a38bcbd..a7f7fd567dde 100644 --- a/arch/arm/mach-exynos/mach-origen.c +++ b/arch/arm/mach-exynos/mach-origen.c | |||
@@ -766,6 +766,7 @@ MACHINE_START(ORIGEN, "ORIGEN") | |||
766 | .map_io = origen_map_io, | 766 | .map_io = origen_map_io, |
767 | .handle_irq = gic_handle_irq, | 767 | .handle_irq = gic_handle_irq, |
768 | .init_machine = origen_machine_init, | 768 | .init_machine = origen_machine_init, |
769 | .init_late = exynos_init_late, | ||
769 | .timer = &exynos4_timer, | 770 | .timer = &exynos4_timer, |
770 | .reserve = &origen_reserve, | 771 | .reserve = &origen_reserve, |
771 | .restart = exynos4_restart, | 772 | .restart = exynos4_restart, |
diff --git a/arch/arm/mach-exynos/mach-smdk4x12.c b/arch/arm/mach-exynos/mach-smdk4x12.c index fe772d893cc9..fb09c70e195a 100644 --- a/arch/arm/mach-exynos/mach-smdk4x12.c +++ b/arch/arm/mach-exynos/mach-smdk4x12.c | |||
@@ -316,6 +316,7 @@ MACHINE_START(SMDK4412, "SMDK4412") | |||
316 | .map_io = smdk4x12_map_io, | 316 | .map_io = smdk4x12_map_io, |
317 | .handle_irq = gic_handle_irq, | 317 | .handle_irq = gic_handle_irq, |
318 | .init_machine = smdk4x12_machine_init, | 318 | .init_machine = smdk4x12_machine_init, |
319 | .init_late = exynos_init_late, | ||
319 | .timer = &exynos4_timer, | 320 | .timer = &exynos4_timer, |
320 | .restart = exynos4_restart, | 321 | .restart = exynos4_restart, |
321 | .reserve = &smdk4x12_reserve, | 322 | .reserve = &smdk4x12_reserve, |
diff --git a/arch/arm/mach-exynos/mach-smdkv310.c b/arch/arm/mach-exynos/mach-smdkv310.c index 5af96064ca51..70df1a0c2118 100644 --- a/arch/arm/mach-exynos/mach-smdkv310.c +++ b/arch/arm/mach-exynos/mach-smdkv310.c | |||
@@ -295,7 +295,6 @@ static struct platform_device *smdkv310_devices[] __initdata = { | |||
295 | &s5p_device_mfc_l, | 295 | &s5p_device_mfc_l, |
296 | &s5p_device_mfc_r, | 296 | &s5p_device_mfc_r, |
297 | &exynos4_device_spdif, | 297 | &exynos4_device_spdif, |
298 | &exynos4_device_sysmmu, | ||
299 | &samsung_asoc_dma, | 298 | &samsung_asoc_dma, |
300 | &samsung_asoc_idma, | 299 | &samsung_asoc_idma, |
301 | &s5p_device_fimd0, | 300 | &s5p_device_fimd0, |
@@ -412,6 +411,7 @@ MACHINE_START(SMDKC210, "SMDKC210") | |||
412 | .map_io = smdkv310_map_io, | 411 | .map_io = smdkv310_map_io, |
413 | .handle_irq = gic_handle_irq, | 412 | .handle_irq = gic_handle_irq, |
414 | .init_machine = smdkv310_machine_init, | 413 | .init_machine = smdkv310_machine_init, |
414 | .init_late = exynos_init_late, | ||
415 | .timer = &exynos4_timer, | 415 | .timer = &exynos4_timer, |
416 | .restart = exynos4_restart, | 416 | .restart = exynos4_restart, |
417 | MACHINE_END | 417 | MACHINE_END |
diff --git a/arch/arm/mach-exynos/mach-universal_c210.c b/arch/arm/mach-exynos/mach-universal_c210.c index 6b731b863275..083b44de9c10 100644 --- a/arch/arm/mach-exynos/mach-universal_c210.c +++ b/arch/arm/mach-exynos/mach-universal_c210.c | |||
@@ -1157,6 +1157,7 @@ MACHINE_START(UNIVERSAL_C210, "UNIVERSAL_C210") | |||
1157 | .map_io = universal_map_io, | 1157 | .map_io = universal_map_io, |
1158 | .handle_irq = gic_handle_irq, | 1158 | .handle_irq = gic_handle_irq, |
1159 | .init_machine = universal_machine_init, | 1159 | .init_machine = universal_machine_init, |
1160 | .init_late = exynos_init_late, | ||
1160 | .timer = &s5p_timer, | 1161 | .timer = &s5p_timer, |
1161 | .reserve = &universal_reserve, | 1162 | .reserve = &universal_reserve, |
1162 | .restart = exynos4_restart, | 1163 | .restart = exynos4_restart, |
diff --git a/arch/arm/mach-exynos/mct.c b/arch/arm/mach-exynos/mct.c index 897d9a9cf226..b601fb8a408b 100644 --- a/arch/arm/mach-exynos/mct.c +++ b/arch/arm/mach-exynos/mct.c | |||
@@ -388,6 +388,7 @@ static int __cpuinit exynos4_local_timer_setup(struct clock_event_device *evt) | |||
388 | { | 388 | { |
389 | struct mct_clock_event_device *mevt; | 389 | struct mct_clock_event_device *mevt; |
390 | unsigned int cpu = smp_processor_id(); | 390 | unsigned int cpu = smp_processor_id(); |
391 | int mct_lx_irq; | ||
391 | 392 | ||
392 | mevt = this_cpu_ptr(&percpu_mct_tick); | 393 | mevt = this_cpu_ptr(&percpu_mct_tick); |
393 | mevt->evt = evt; | 394 | mevt->evt = evt; |
@@ -414,14 +415,18 @@ static int __cpuinit exynos4_local_timer_setup(struct clock_event_device *evt) | |||
414 | 415 | ||
415 | if (mct_int_type == MCT_INT_SPI) { | 416 | if (mct_int_type == MCT_INT_SPI) { |
416 | if (cpu == 0) { | 417 | if (cpu == 0) { |
418 | mct_lx_irq = soc_is_exynos4210() ? EXYNOS4_IRQ_MCT_L0 : | ||
419 | EXYNOS5_IRQ_MCT_L0; | ||
417 | mct_tick0_event_irq.dev_id = mevt; | 420 | mct_tick0_event_irq.dev_id = mevt; |
418 | evt->irq = EXYNOS4_IRQ_MCT_L0; | 421 | evt->irq = mct_lx_irq; |
419 | setup_irq(EXYNOS4_IRQ_MCT_L0, &mct_tick0_event_irq); | 422 | setup_irq(mct_lx_irq, &mct_tick0_event_irq); |
420 | } else { | 423 | } else { |
424 | mct_lx_irq = soc_is_exynos4210() ? EXYNOS4_IRQ_MCT_L1 : | ||
425 | EXYNOS5_IRQ_MCT_L1; | ||
421 | mct_tick1_event_irq.dev_id = mevt; | 426 | mct_tick1_event_irq.dev_id = mevt; |
422 | evt->irq = EXYNOS4_IRQ_MCT_L1; | 427 | evt->irq = mct_lx_irq; |
423 | setup_irq(EXYNOS4_IRQ_MCT_L1, &mct_tick1_event_irq); | 428 | setup_irq(mct_lx_irq, &mct_tick1_event_irq); |
424 | irq_set_affinity(EXYNOS4_IRQ_MCT_L1, cpumask_of(1)); | 429 | irq_set_affinity(mct_lx_irq, cpumask_of(1)); |
425 | } | 430 | } |
426 | } else { | 431 | } else { |
427 | enable_percpu_irq(EXYNOS_IRQ_MCT_LOCALTIMER, 0); | 432 | enable_percpu_irq(EXYNOS_IRQ_MCT_LOCALTIMER, 0); |
@@ -473,7 +478,7 @@ static void __init exynos4_timer_resources(void) | |||
473 | 478 | ||
474 | static void __init exynos4_timer_init(void) | 479 | static void __init exynos4_timer_init(void) |
475 | { | 480 | { |
476 | if (soc_is_exynos4210()) | 481 | if ((soc_is_exynos4210()) || (soc_is_exynos5250())) |
477 | mct_int_type = MCT_INT_SPI; | 482 | mct_int_type = MCT_INT_SPI; |
478 | else | 483 | else |
479 | mct_int_type = MCT_INT_PPI; | 484 | mct_int_type = MCT_INT_PPI; |
diff --git a/arch/arm/mach-exynos/pm.c b/arch/arm/mach-exynos/pm.c index 428cfeb57724..563dea9a6dbb 100644 --- a/arch/arm/mach-exynos/pm.c +++ b/arch/arm/mach-exynos/pm.c | |||
@@ -275,7 +275,7 @@ static void exynos4_restore_pll(void) | |||
275 | 275 | ||
276 | static struct subsys_interface exynos4_pm_interface = { | 276 | static struct subsys_interface exynos4_pm_interface = { |
277 | .name = "exynos4_pm", | 277 | .name = "exynos4_pm", |
278 | .subsys = &exynos4_subsys, | 278 | .subsys = &exynos_subsys, |
279 | .add_dev = exynos4_pm_add, | 279 | .add_dev = exynos4_pm_add, |
280 | }; | 280 | }; |
281 | 281 | ||
@@ -313,7 +313,7 @@ static int exynos4_pm_suspend(void) | |||
313 | tmp &= ~S5P_CENTRAL_LOWPWR_CFG; | 313 | tmp &= ~S5P_CENTRAL_LOWPWR_CFG; |
314 | __raw_writel(tmp, S5P_CENTRAL_SEQ_CONFIGURATION); | 314 | __raw_writel(tmp, S5P_CENTRAL_SEQ_CONFIGURATION); |
315 | 315 | ||
316 | if (soc_is_exynos4212()) { | 316 | if (soc_is_exynos4212() || soc_is_exynos4412()) { |
317 | tmp = __raw_readl(S5P_CENTRAL_SEQ_OPTION); | 317 | tmp = __raw_readl(S5P_CENTRAL_SEQ_OPTION); |
318 | tmp &= ~(S5P_USE_STANDBYWFI_ISP_ARM | | 318 | tmp &= ~(S5P_USE_STANDBYWFI_ISP_ARM | |
319 | S5P_USE_STANDBYWFE_ISP_ARM); | 319 | S5P_USE_STANDBYWFE_ISP_ARM); |
diff --git a/arch/arm/mach-exynos/pm_domains.c b/arch/arm/mach-exynos/pm_domains.c index 13b306808b42..e9fafcf163de 100644 --- a/arch/arm/mach-exynos/pm_domains.c +++ b/arch/arm/mach-exynos/pm_domains.c | |||
@@ -193,9 +193,8 @@ static __init int exynos4_pm_init_power_domain(void) | |||
193 | } | 193 | } |
194 | arch_initcall(exynos4_pm_init_power_domain); | 194 | arch_initcall(exynos4_pm_init_power_domain); |
195 | 195 | ||
196 | static __init int exynos_pm_late_initcall(void) | 196 | int __init exynos_pm_late_initcall(void) |
197 | { | 197 | { |
198 | pm_genpd_poweroff_unused(); | 198 | pm_genpd_poweroff_unused(); |
199 | return 0; | 199 | return 0; |
200 | } | 200 | } |
201 | late_initcall(exynos_pm_late_initcall); | ||
diff --git a/arch/arm/mach-exynos/pmu.c b/arch/arm/mach-exynos/pmu.c index bba48f5c3e8f..77c6815eebee 100644 --- a/arch/arm/mach-exynos/pmu.c +++ b/arch/arm/mach-exynos/pmu.c | |||
@@ -94,7 +94,7 @@ static struct exynos4_pmu_conf exynos4210_pmu_config[] = { | |||
94 | { PMU_TABLE_END,}, | 94 | { PMU_TABLE_END,}, |
95 | }; | 95 | }; |
96 | 96 | ||
97 | static struct exynos4_pmu_conf exynos4212_pmu_config[] = { | 97 | static struct exynos4_pmu_conf exynos4x12_pmu_config[] = { |
98 | { S5P_ARM_CORE0_LOWPWR, { 0x0, 0x0, 0x2 } }, | 98 | { S5P_ARM_CORE0_LOWPWR, { 0x0, 0x0, 0x2 } }, |
99 | { S5P_DIS_IRQ_CORE0, { 0x0, 0x0, 0x0 } }, | 99 | { S5P_DIS_IRQ_CORE0, { 0x0, 0x0, 0x0 } }, |
100 | { S5P_DIS_IRQ_CENTRAL0, { 0x0, 0x0, 0x0 } }, | 100 | { S5P_DIS_IRQ_CENTRAL0, { 0x0, 0x0, 0x0 } }, |
@@ -202,6 +202,16 @@ static struct exynos4_pmu_conf exynos4212_pmu_config[] = { | |||
202 | { PMU_TABLE_END,}, | 202 | { PMU_TABLE_END,}, |
203 | }; | 203 | }; |
204 | 204 | ||
205 | static struct exynos4_pmu_conf exynos4412_pmu_config[] = { | ||
206 | { S5P_ARM_CORE2_LOWPWR, { 0x0, 0x0, 0x2 } }, | ||
207 | { S5P_DIS_IRQ_CORE2, { 0x0, 0x0, 0x0 } }, | ||
208 | { S5P_DIS_IRQ_CENTRAL2, { 0x0, 0x0, 0x0 } }, | ||
209 | { S5P_ARM_CORE3_LOWPWR, { 0x0, 0x0, 0x2 } }, | ||
210 | { S5P_DIS_IRQ_CORE3, { 0x0, 0x0, 0x0 } }, | ||
211 | { S5P_DIS_IRQ_CENTRAL3, { 0x0, 0x0, 0x0 } }, | ||
212 | { PMU_TABLE_END,}, | ||
213 | }; | ||
214 | |||
205 | void exynos4_sys_powerdown_conf(enum sys_powerdown mode) | 215 | void exynos4_sys_powerdown_conf(enum sys_powerdown mode) |
206 | { | 216 | { |
207 | unsigned int i; | 217 | unsigned int i; |
@@ -209,6 +219,12 @@ void exynos4_sys_powerdown_conf(enum sys_powerdown mode) | |||
209 | for (i = 0; (exynos4_pmu_config[i].reg != PMU_TABLE_END) ; i++) | 219 | for (i = 0; (exynos4_pmu_config[i].reg != PMU_TABLE_END) ; i++) |
210 | __raw_writel(exynos4_pmu_config[i].val[mode], | 220 | __raw_writel(exynos4_pmu_config[i].val[mode], |
211 | exynos4_pmu_config[i].reg); | 221 | exynos4_pmu_config[i].reg); |
222 | |||
223 | if (soc_is_exynos4412()) { | ||
224 | for (i = 0; exynos4412_pmu_config[i].reg != PMU_TABLE_END ; i++) | ||
225 | __raw_writel(exynos4412_pmu_config[i].val[mode], | ||
226 | exynos4412_pmu_config[i].reg); | ||
227 | } | ||
212 | } | 228 | } |
213 | 229 | ||
214 | static int __init exynos4_pmu_init(void) | 230 | static int __init exynos4_pmu_init(void) |
@@ -218,9 +234,9 @@ static int __init exynos4_pmu_init(void) | |||
218 | if (soc_is_exynos4210()) { | 234 | if (soc_is_exynos4210()) { |
219 | exynos4_pmu_config = exynos4210_pmu_config; | 235 | exynos4_pmu_config = exynos4210_pmu_config; |
220 | pr_info("EXYNOS4210 PMU Initialize\n"); | 236 | pr_info("EXYNOS4210 PMU Initialize\n"); |
221 | } else if (soc_is_exynos4212()) { | 237 | } else if (soc_is_exynos4212() || soc_is_exynos4412()) { |
222 | exynos4_pmu_config = exynos4212_pmu_config; | 238 | exynos4_pmu_config = exynos4x12_pmu_config; |
223 | pr_info("EXYNOS4212 PMU Initialize\n"); | 239 | pr_info("EXYNOS4x12 PMU Initialize\n"); |
224 | } else { | 240 | } else { |
225 | pr_info("EXYNOS4: PMU not supported\n"); | 241 | pr_info("EXYNOS4: PMU not supported\n"); |
226 | } | 242 | } |
diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig index cca8c0c74794..0021f726b153 100644 --- a/arch/arm/mach-imx/Kconfig +++ b/arch/arm/mach-imx/Kconfig | |||
@@ -34,6 +34,7 @@ config ARCH_MX53 | |||
34 | config SOC_IMX1 | 34 | config SOC_IMX1 |
35 | bool | 35 | bool |
36 | select ARCH_MX1 | 36 | select ARCH_MX1 |
37 | select COMMON_CLK | ||
37 | select CPU_ARM920T | 38 | select CPU_ARM920T |
38 | select IMX_HAVE_IOMUX_V1 | 39 | select IMX_HAVE_IOMUX_V1 |
39 | select MXC_AVIC | 40 | select MXC_AVIC |
@@ -42,12 +43,14 @@ config SOC_IMX21 | |||
42 | bool | 43 | bool |
43 | select MACH_MX21 | 44 | select MACH_MX21 |
44 | select CPU_ARM926T | 45 | select CPU_ARM926T |
46 | select COMMON_CLK | ||
45 | select IMX_HAVE_IOMUX_V1 | 47 | select IMX_HAVE_IOMUX_V1 |
46 | select MXC_AVIC | 48 | select MXC_AVIC |
47 | 49 | ||
48 | config SOC_IMX25 | 50 | config SOC_IMX25 |
49 | bool | 51 | bool |
50 | select ARCH_MX25 | 52 | select ARCH_MX25 |
53 | select COMMON_CLK | ||
51 | select CPU_ARM926T | 54 | select CPU_ARM926T |
52 | select ARCH_MXC_IOMUX_V3 | 55 | select ARCH_MXC_IOMUX_V3 |
53 | select MXC_AVIC | 56 | select MXC_AVIC |
@@ -56,6 +59,7 @@ config SOC_IMX27 | |||
56 | bool | 59 | bool |
57 | select MACH_MX27 | 60 | select MACH_MX27 |
58 | select CPU_ARM926T | 61 | select CPU_ARM926T |
62 | select COMMON_CLK | ||
59 | select IMX_HAVE_IOMUX_V1 | 63 | select IMX_HAVE_IOMUX_V1 |
60 | select MXC_AVIC | 64 | select MXC_AVIC |
61 | 65 | ||
@@ -64,12 +68,14 @@ config SOC_IMX31 | |||
64 | select CPU_V6 | 68 | select CPU_V6 |
65 | select IMX_HAVE_PLATFORM_MXC_RNGA | 69 | select IMX_HAVE_PLATFORM_MXC_RNGA |
66 | select MXC_AVIC | 70 | select MXC_AVIC |
71 | select COMMON_CLK | ||
67 | select SMP_ON_UP if SMP | 72 | select SMP_ON_UP if SMP |
68 | 73 | ||
69 | config SOC_IMX35 | 74 | config SOC_IMX35 |
70 | bool | 75 | bool |
71 | select CPU_V6 | 76 | select CPU_V6 |
72 | select ARCH_MXC_IOMUX_V3 | 77 | select ARCH_MXC_IOMUX_V3 |
78 | select COMMON_CLK | ||
73 | select HAVE_EPIT | 79 | select HAVE_EPIT |
74 | select MXC_AVIC | 80 | select MXC_AVIC |
75 | select SMP_ON_UP if SMP | 81 | select SMP_ON_UP if SMP |
@@ -77,6 +83,7 @@ config SOC_IMX35 | |||
77 | config SOC_IMX5 | 83 | config SOC_IMX5 |
78 | select CPU_V7 | 84 | select CPU_V7 |
79 | select MXC_TZIC | 85 | select MXC_TZIC |
86 | select COMMON_CLK | ||
80 | select ARCH_MXC_IOMUX_V3 | 87 | select ARCH_MXC_IOMUX_V3 |
81 | select ARCH_HAS_CPUFREQ | 88 | select ARCH_HAS_CPUFREQ |
82 | select ARCH_MX5 | 89 | select ARCH_MX5 |
@@ -815,6 +822,7 @@ config SOC_IMX6Q | |||
815 | bool "i.MX6 Quad support" | 822 | bool "i.MX6 Quad support" |
816 | select ARM_CPU_SUSPEND if PM | 823 | select ARM_CPU_SUSPEND if PM |
817 | select ARM_GIC | 824 | select ARM_GIC |
825 | select COMMON_CLK | ||
818 | select CPU_V7 | 826 | select CPU_V7 |
819 | select HAVE_ARM_SCU | 827 | select HAVE_ARM_SCU |
820 | select HAVE_IMX_GPC | 828 | select HAVE_IMX_GPC |
diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile index 4937c070a57e..ff29421414f2 100644 --- a/arch/arm/mach-imx/Makefile +++ b/arch/arm/mach-imx/Makefile | |||
@@ -1,15 +1,18 @@ | |||
1 | obj-$(CONFIG_SOC_IMX1) += clock-imx1.o mm-imx1.o | 1 | obj-$(CONFIG_SOC_IMX1) += clk-imx1.o mm-imx1.o |
2 | obj-$(CONFIG_SOC_IMX21) += clock-imx21.o mm-imx21.o | 2 | obj-$(CONFIG_SOC_IMX21) += clk-imx21.o mm-imx21.o |
3 | 3 | ||
4 | obj-$(CONFIG_SOC_IMX25) += clock-imx25.o mm-imx25.o ehci-imx25.o cpu-imx25.o | 4 | obj-$(CONFIG_SOC_IMX25) += clk-imx25.o mm-imx25.o ehci-imx25.o cpu-imx25.o |
5 | 5 | ||
6 | obj-$(CONFIG_SOC_IMX27) += cpu-imx27.o pm-imx27.o | 6 | obj-$(CONFIG_SOC_IMX27) += cpu-imx27.o pm-imx27.o |
7 | obj-$(CONFIG_SOC_IMX27) += clock-imx27.o mm-imx27.o ehci-imx27.o | 7 | obj-$(CONFIG_SOC_IMX27) += clk-imx27.o mm-imx27.o ehci-imx27.o |
8 | 8 | ||
9 | obj-$(CONFIG_SOC_IMX31) += mm-imx3.o cpu-imx31.o clock-imx31.o iomux-imx31.o ehci-imx31.o pm-imx3.o | 9 | obj-$(CONFIG_SOC_IMX31) += mm-imx3.o cpu-imx31.o clk-imx31.o iomux-imx31.o ehci-imx31.o pm-imx3.o |
10 | obj-$(CONFIG_SOC_IMX35) += mm-imx3.o cpu-imx35.o clock-imx35.o ehci-imx35.o pm-imx3.o | 10 | obj-$(CONFIG_SOC_IMX35) += mm-imx3.o cpu-imx35.o clk-imx35.o ehci-imx35.o pm-imx3.o |
11 | 11 | ||
12 | obj-$(CONFIG_SOC_IMX5) += cpu-imx5.o mm-imx5.o clock-mx51-mx53.o ehci-imx5.o pm-imx5.o cpu_op-mx51.o | 12 | obj-$(CONFIG_SOC_IMX5) += cpu-imx5.o mm-imx5.o clk-imx51-imx53.o ehci-imx5.o pm-imx5.o cpu_op-mx51.o |
13 | |||
14 | obj-$(CONFIG_COMMON_CLK) += clk-pllv1.o clk-pllv2.o clk-pllv3.o clk-gate2.o \ | ||
15 | clk-pfd.o clk-busy.o | ||
13 | 16 | ||
14 | # Support for CMOS sensor interface | 17 | # Support for CMOS sensor interface |
15 | obj-$(CONFIG_MX1_VIDEO) += mx1-camera-fiq.o mx1-camera-fiq-ksym.o | 18 | obj-$(CONFIG_MX1_VIDEO) += mx1-camera-fiq.o mx1-camera-fiq-ksym.o |
@@ -70,7 +73,7 @@ obj-$(CONFIG_CPU_V7) += head-v7.o | |||
70 | AFLAGS_head-v7.o :=-Wa,-march=armv7-a | 73 | AFLAGS_head-v7.o :=-Wa,-march=armv7-a |
71 | obj-$(CONFIG_SMP) += platsmp.o | 74 | obj-$(CONFIG_SMP) += platsmp.o |
72 | obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o | 75 | obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o |
73 | obj-$(CONFIG_SOC_IMX6Q) += clock-imx6q.o mach-imx6q.o | 76 | obj-$(CONFIG_SOC_IMX6Q) += clk-imx6q.o mach-imx6q.o |
74 | 77 | ||
75 | ifeq ($(CONFIG_PM),y) | 78 | ifeq ($(CONFIG_PM),y) |
76 | obj-$(CONFIG_SOC_IMX6Q) += pm-imx6q.o | 79 | obj-$(CONFIG_SOC_IMX6Q) += pm-imx6q.o |
diff --git a/arch/arm/mach-imx/Makefile.boot b/arch/arm/mach-imx/Makefile.boot index 3851d8a27875..05541cf4a878 100644 --- a/arch/arm/mach-imx/Makefile.boot +++ b/arch/arm/mach-imx/Makefile.boot | |||
@@ -42,4 +42,5 @@ dtb-$(CONFIG_MACH_IMX51_DT) += imx51-babbage.dtb | |||
42 | dtb-$(CONFIG_MACH_IMX53_DT) += imx53-ard.dtb imx53-evk.dtb \ | 42 | dtb-$(CONFIG_MACH_IMX53_DT) += imx53-ard.dtb imx53-evk.dtb \ |
43 | imx53-qsb.dtb imx53-smd.dtb | 43 | imx53-qsb.dtb imx53-smd.dtb |
44 | dtb-$(CONFIG_SOC_IMX6Q) += imx6q-arm2.dtb \ | 44 | dtb-$(CONFIG_SOC_IMX6Q) += imx6q-arm2.dtb \ |
45 | imx6q-sabrelite.dtb | 45 | imx6q-sabrelite.dtb \ |
46 | imx6q-sabresd.dtb \ | ||
diff --git a/arch/arm/mach-imx/clk-busy.c b/arch/arm/mach-imx/clk-busy.c new file mode 100644 index 000000000000..1a7a8dd045a1 --- /dev/null +++ b/arch/arm/mach-imx/clk-busy.c | |||
@@ -0,0 +1,189 @@ | |||
1 | /* | ||
2 | * Copyright 2012 Freescale Semiconductor, Inc. | ||
3 | * Copyright 2012 Linaro Ltd. | ||
4 | * | ||
5 | * The code contained herein is licensed under the GNU General Public | ||
6 | * License. You may obtain a copy of the GNU General Public License | ||
7 | * Version 2 or later at the following locations: | ||
8 | * | ||
9 | * http://www.opensource.org/licenses/gpl-license.html | ||
10 | * http://www.gnu.org/copyleft/gpl.html | ||
11 | */ | ||
12 | |||
13 | #include <linux/clk.h> | ||
14 | #include <linux/clk-provider.h> | ||
15 | #include <linux/io.h> | ||
16 | #include <linux/slab.h> | ||
17 | #include <linux/jiffies.h> | ||
18 | #include <linux/err.h> | ||
19 | #include "clk.h" | ||
20 | |||
21 | static int clk_busy_wait(void __iomem *reg, u8 shift) | ||
22 | { | ||
23 | unsigned long timeout = jiffies + msecs_to_jiffies(10); | ||
24 | |||
25 | while (readl_relaxed(reg) & (1 << shift)) | ||
26 | if (time_after(jiffies, timeout)) | ||
27 | return -ETIMEDOUT; | ||
28 | |||
29 | return 0; | ||
30 | } | ||
31 | |||
32 | struct clk_busy_divider { | ||
33 | struct clk_divider div; | ||
34 | const struct clk_ops *div_ops; | ||
35 | void __iomem *reg; | ||
36 | u8 shift; | ||
37 | }; | ||
38 | |||
39 | static inline struct clk_busy_divider *to_clk_busy_divider(struct clk_hw *hw) | ||
40 | { | ||
41 | struct clk_divider *div = container_of(hw, struct clk_divider, hw); | ||
42 | |||
43 | return container_of(div, struct clk_busy_divider, div); | ||
44 | } | ||
45 | |||
46 | static unsigned long clk_busy_divider_recalc_rate(struct clk_hw *hw, | ||
47 | unsigned long parent_rate) | ||
48 | { | ||
49 | struct clk_busy_divider *busy = to_clk_busy_divider(hw); | ||
50 | |||
51 | return busy->div_ops->recalc_rate(&busy->div.hw, parent_rate); | ||
52 | } | ||
53 | |||
54 | static long clk_busy_divider_round_rate(struct clk_hw *hw, unsigned long rate, | ||
55 | unsigned long *prate) | ||
56 | { | ||
57 | struct clk_busy_divider *busy = to_clk_busy_divider(hw); | ||
58 | |||
59 | return busy->div_ops->round_rate(&busy->div.hw, rate, prate); | ||
60 | } | ||
61 | |||
62 | static int clk_busy_divider_set_rate(struct clk_hw *hw, unsigned long rate, | ||
63 | unsigned long parent_rate) | ||
64 | { | ||
65 | struct clk_busy_divider *busy = to_clk_busy_divider(hw); | ||
66 | int ret; | ||
67 | |||
68 | ret = busy->div_ops->set_rate(&busy->div.hw, rate, parent_rate); | ||
69 | if (!ret) | ||
70 | ret = clk_busy_wait(busy->reg, busy->shift); | ||
71 | |||
72 | return ret; | ||
73 | } | ||
74 | |||
75 | static struct clk_ops clk_busy_divider_ops = { | ||
76 | .recalc_rate = clk_busy_divider_recalc_rate, | ||
77 | .round_rate = clk_busy_divider_round_rate, | ||
78 | .set_rate = clk_busy_divider_set_rate, | ||
79 | }; | ||
80 | |||
81 | struct clk *imx_clk_busy_divider(const char *name, const char *parent_name, | ||
82 | void __iomem *reg, u8 shift, u8 width, | ||
83 | void __iomem *busy_reg, u8 busy_shift) | ||
84 | { | ||
85 | struct clk_busy_divider *busy; | ||
86 | struct clk *clk; | ||
87 | struct clk_init_data init; | ||
88 | |||
89 | busy = kzalloc(sizeof(*busy), GFP_KERNEL); | ||
90 | if (!busy) | ||
91 | return ERR_PTR(-ENOMEM); | ||
92 | |||
93 | busy->reg = busy_reg; | ||
94 | busy->shift = busy_shift; | ||
95 | |||
96 | busy->div.reg = reg; | ||
97 | busy->div.shift = shift; | ||
98 | busy->div.width = width; | ||
99 | busy->div.lock = &imx_ccm_lock; | ||
100 | busy->div_ops = &clk_divider_ops; | ||
101 | |||
102 | init.name = name; | ||
103 | init.ops = &clk_busy_divider_ops; | ||
104 | init.flags = CLK_SET_RATE_PARENT; | ||
105 | init.parent_names = &parent_name; | ||
106 | init.num_parents = 1; | ||
107 | |||
108 | busy->div.hw.init = &init; | ||
109 | |||
110 | clk = clk_register(NULL, &busy->div.hw); | ||
111 | if (!clk) | ||
112 | kfree(busy); | ||
113 | |||
114 | return clk; | ||
115 | } | ||
116 | |||
117 | struct clk_busy_mux { | ||
118 | struct clk_mux mux; | ||
119 | const struct clk_ops *mux_ops; | ||
120 | void __iomem *reg; | ||
121 | u8 shift; | ||
122 | }; | ||
123 | |||
124 | static inline struct clk_busy_mux *to_clk_busy_mux(struct clk_hw *hw) | ||
125 | { | ||
126 | struct clk_mux *mux = container_of(hw, struct clk_mux, hw); | ||
127 | |||
128 | return container_of(mux, struct clk_busy_mux, mux); | ||
129 | } | ||
130 | |||
131 | static u8 clk_busy_mux_get_parent(struct clk_hw *hw) | ||
132 | { | ||
133 | struct clk_busy_mux *busy = to_clk_busy_mux(hw); | ||
134 | |||
135 | return busy->mux_ops->get_parent(&busy->mux.hw); | ||
136 | } | ||
137 | |||
138 | static int clk_busy_mux_set_parent(struct clk_hw *hw, u8 index) | ||
139 | { | ||
140 | struct clk_busy_mux *busy = to_clk_busy_mux(hw); | ||
141 | int ret; | ||
142 | |||
143 | ret = busy->mux_ops->set_parent(&busy->mux.hw, index); | ||
144 | if (!ret) | ||
145 | ret = clk_busy_wait(busy->reg, busy->shift); | ||
146 | |||
147 | return ret; | ||
148 | } | ||
149 | |||
150 | struct clk_ops clk_busy_mux_ops = { | ||
151 | .get_parent = clk_busy_mux_get_parent, | ||
152 | .set_parent = clk_busy_mux_set_parent, | ||
153 | }; | ||
154 | |||
155 | struct clk *imx_clk_busy_mux(const char *name, void __iomem *reg, u8 shift, | ||
156 | u8 width, void __iomem *busy_reg, u8 busy_shift, | ||
157 | const char **parent_names, int num_parents) | ||
158 | { | ||
159 | struct clk_busy_mux *busy; | ||
160 | struct clk *clk; | ||
161 | struct clk_init_data init; | ||
162 | |||
163 | busy = kzalloc(sizeof(*busy), GFP_KERNEL); | ||
164 | if (!busy) | ||
165 | return ERR_PTR(-ENOMEM); | ||
166 | |||
167 | busy->reg = busy_reg; | ||
168 | busy->shift = busy_shift; | ||
169 | |||
170 | busy->mux.reg = reg; | ||
171 | busy->mux.shift = shift; | ||
172 | busy->mux.width = width; | ||
173 | busy->mux.lock = &imx_ccm_lock; | ||
174 | busy->mux_ops = &clk_mux_ops; | ||
175 | |||
176 | init.name = name; | ||
177 | init.ops = &clk_busy_mux_ops; | ||
178 | init.flags = 0; | ||
179 | init.parent_names = parent_names; | ||
180 | init.num_parents = num_parents; | ||
181 | |||
182 | busy->mux.hw.init = &init; | ||
183 | |||
184 | clk = clk_register(NULL, &busy->mux.hw); | ||
185 | if (IS_ERR(clk)) | ||
186 | kfree(busy); | ||
187 | |||
188 | return clk; | ||
189 | } | ||
diff --git a/arch/arm/mach-imx/clk-gate2.c b/arch/arm/mach-imx/clk-gate2.c new file mode 100644 index 000000000000..3c1b8ff9a0a6 --- /dev/null +++ b/arch/arm/mach-imx/clk-gate2.c | |||
@@ -0,0 +1,118 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2010-2011 Canonical Ltd <jeremy.kerr@canonical.com> | ||
3 | * Copyright (C) 2011-2012 Mike Turquette, Linaro Ltd <mturquette@linaro.org> | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License version 2 as | ||
7 | * published by the Free Software Foundation. | ||
8 | * | ||
9 | * Gated clock implementation | ||
10 | */ | ||
11 | |||
12 | #include <linux/clk-provider.h> | ||
13 | #include <linux/module.h> | ||
14 | #include <linux/slab.h> | ||
15 | #include <linux/io.h> | ||
16 | #include <linux/err.h> | ||
17 | #include <linux/string.h> | ||
18 | |||
19 | /** | ||
20 | * DOC: basic gatable clock which can gate and ungate it's ouput | ||
21 | * | ||
22 | * Traits of this clock: | ||
23 | * prepare - clk_(un)prepare only ensures parent is (un)prepared | ||
24 | * enable - clk_enable and clk_disable are functional & control gating | ||
25 | * rate - inherits rate from parent. No clk_set_rate support | ||
26 | * parent - fixed parent. No clk_set_parent support | ||
27 | */ | ||
28 | |||
29 | #define to_clk_gate(_hw) container_of(_hw, struct clk_gate, hw) | ||
30 | |||
31 | static int clk_gate2_enable(struct clk_hw *hw) | ||
32 | { | ||
33 | struct clk_gate *gate = to_clk_gate(hw); | ||
34 | u32 reg; | ||
35 | unsigned long flags = 0; | ||
36 | |||
37 | if (gate->lock) | ||
38 | spin_lock_irqsave(gate->lock, flags); | ||
39 | |||
40 | reg = readl(gate->reg); | ||
41 | reg |= 3 << gate->bit_idx; | ||
42 | writel(reg, gate->reg); | ||
43 | |||
44 | if (gate->lock) | ||
45 | spin_unlock_irqrestore(gate->lock, flags); | ||
46 | |||
47 | return 0; | ||
48 | } | ||
49 | |||
50 | static void clk_gate2_disable(struct clk_hw *hw) | ||
51 | { | ||
52 | struct clk_gate *gate = to_clk_gate(hw); | ||
53 | u32 reg; | ||
54 | unsigned long flags = 0; | ||
55 | |||
56 | if (gate->lock) | ||
57 | spin_lock_irqsave(gate->lock, flags); | ||
58 | |||
59 | reg = readl(gate->reg); | ||
60 | reg &= ~(3 << gate->bit_idx); | ||
61 | writel(reg, gate->reg); | ||
62 | |||
63 | if (gate->lock) | ||
64 | spin_unlock_irqrestore(gate->lock, flags); | ||
65 | } | ||
66 | |||
67 | static int clk_gate2_is_enabled(struct clk_hw *hw) | ||
68 | { | ||
69 | u32 reg; | ||
70 | struct clk_gate *gate = to_clk_gate(hw); | ||
71 | |||
72 | reg = readl(gate->reg); | ||
73 | |||
74 | if (((reg >> gate->bit_idx) & 3) == 3) | ||
75 | return 1; | ||
76 | |||
77 | return 0; | ||
78 | } | ||
79 | |||
80 | static struct clk_ops clk_gate2_ops = { | ||
81 | .enable = clk_gate2_enable, | ||
82 | .disable = clk_gate2_disable, | ||
83 | .is_enabled = clk_gate2_is_enabled, | ||
84 | }; | ||
85 | |||
86 | struct clk *clk_register_gate2(struct device *dev, const char *name, | ||
87 | const char *parent_name, unsigned long flags, | ||
88 | void __iomem *reg, u8 bit_idx, | ||
89 | u8 clk_gate2_flags, spinlock_t *lock) | ||
90 | { | ||
91 | struct clk_gate *gate; | ||
92 | struct clk *clk; | ||
93 | struct clk_init_data init; | ||
94 | |||
95 | gate = kzalloc(sizeof(struct clk_gate), GFP_KERNEL); | ||
96 | if (!gate) | ||
97 | return ERR_PTR(-ENOMEM); | ||
98 | |||
99 | /* struct clk_gate assignments */ | ||
100 | gate->reg = reg; | ||
101 | gate->bit_idx = bit_idx; | ||
102 | gate->flags = clk_gate2_flags; | ||
103 | gate->lock = lock; | ||
104 | |||
105 | init.name = name; | ||
106 | init.ops = &clk_gate2_ops; | ||
107 | init.flags = flags; | ||
108 | init.parent_names = parent_name ? &parent_name : NULL; | ||
109 | init.num_parents = parent_name ? 1 : 0; | ||
110 | |||
111 | gate->hw.init = &init; | ||
112 | |||
113 | clk = clk_register(dev, &gate->hw); | ||
114 | if (IS_ERR(clk)) | ||
115 | kfree(clk); | ||
116 | |||
117 | return clk; | ||
118 | } | ||
diff --git a/arch/arm/mach-imx/clk-imx1.c b/arch/arm/mach-imx/clk-imx1.c new file mode 100644 index 000000000000..0f0beb580b73 --- /dev/null +++ b/arch/arm/mach-imx/clk-imx1.c | |||
@@ -0,0 +1,115 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2008 Sascha Hauer <s.hauer@pengutronix.de>, Pengutronix | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License version 2 as | ||
6 | * published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License along | ||
14 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
15 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. | ||
16 | */ | ||
17 | |||
18 | #include <linux/kernel.h> | ||
19 | #include <linux/init.h> | ||
20 | #include <linux/clk.h> | ||
21 | #include <linux/io.h> | ||
22 | #include <linux/clkdev.h> | ||
23 | #include <linux/err.h> | ||
24 | |||
25 | #include <mach/hardware.h> | ||
26 | #include <mach/common.h> | ||
27 | #include "clk.h" | ||
28 | |||
29 | /* CCM register addresses */ | ||
30 | #define IO_ADDR_CCM(off) (MX1_IO_ADDRESS(MX1_CCM_BASE_ADDR + (off))) | ||
31 | |||
32 | #define CCM_CSCR IO_ADDR_CCM(0x0) | ||
33 | #define CCM_MPCTL0 IO_ADDR_CCM(0x4) | ||
34 | #define CCM_SPCTL0 IO_ADDR_CCM(0xc) | ||
35 | #define CCM_PCDR IO_ADDR_CCM(0x20) | ||
36 | |||
37 | /* SCM register addresses */ | ||
38 | #define IO_ADDR_SCM(off) (MX1_IO_ADDRESS(MX1_SCM_BASE_ADDR + (off))) | ||
39 | |||
40 | #define SCM_GCCR IO_ADDR_SCM(0xc) | ||
41 | |||
42 | static const char *prem_sel_clks[] = { "clk32_premult", "clk16m", }; | ||
43 | static const char *clko_sel_clks[] = { "per1", "hclk", "clk48m", "clk16m", "prem", | ||
44 | "fclk", }; | ||
45 | enum imx1_clks { | ||
46 | dummy, clk32, clk16m_ext, clk16m, clk32_premult, prem, mpll, spll, mcu, | ||
47 | fclk, hclk, clk48m, per1, per2, per3, clko, dma_gate, csi_gate, | ||
48 | mma_gate, usbd_gate, clk_max | ||
49 | }; | ||
50 | |||
51 | static struct clk *clk[clk_max]; | ||
52 | |||
53 | int __init mx1_clocks_init(unsigned long fref) | ||
54 | { | ||
55 | int i; | ||
56 | |||
57 | clk[dummy] = imx_clk_fixed("dummy", 0); | ||
58 | clk[clk32] = imx_clk_fixed("clk32", fref); | ||
59 | clk[clk16m_ext] = imx_clk_fixed("clk16m_ext", 16000000); | ||
60 | clk[clk16m] = imx_clk_gate("clk16m", "clk16m_ext", CCM_CSCR, 17); | ||
61 | clk[clk32_premult] = imx_clk_fixed_factor("clk32_premult", "clk32", 512, 1); | ||
62 | clk[prem] = imx_clk_mux("prem", CCM_CSCR, 16, 1, prem_sel_clks, | ||
63 | ARRAY_SIZE(prem_sel_clks)); | ||
64 | clk[mpll] = imx_clk_pllv1("mpll", "clk32_premult", CCM_MPCTL0); | ||
65 | clk[spll] = imx_clk_pllv1("spll", "prem", CCM_SPCTL0); | ||
66 | clk[mcu] = imx_clk_divider("mcu", "clk32_premult", CCM_CSCR, 15, 1); | ||
67 | clk[fclk] = imx_clk_divider("fclk", "mpll", CCM_CSCR, 15, 1); | ||
68 | clk[hclk] = imx_clk_divider("hclk", "spll", CCM_CSCR, 10, 4); | ||
69 | clk[clk48m] = imx_clk_divider("clk48m", "spll", CCM_CSCR, 26, 3); | ||
70 | clk[per1] = imx_clk_divider("per1", "spll", CCM_PCDR, 0, 4); | ||
71 | clk[per2] = imx_clk_divider("per2", "spll", CCM_PCDR, 4, 4); | ||
72 | clk[per3] = imx_clk_divider("per3", "spll", CCM_PCDR, 16, 7); | ||
73 | clk[clko] = imx_clk_mux("clko", CCM_CSCR, 29, 3, clko_sel_clks, | ||
74 | ARRAY_SIZE(clko_sel_clks)); | ||
75 | clk[dma_gate] = imx_clk_gate("dma_gate", "hclk", SCM_GCCR, 4); | ||
76 | clk[csi_gate] = imx_clk_gate("csi_gate", "hclk", SCM_GCCR, 2); | ||
77 | clk[mma_gate] = imx_clk_gate("mma_gate", "hclk", SCM_GCCR, 1); | ||
78 | clk[usbd_gate] = imx_clk_gate("usbd_gate", "clk48m", SCM_GCCR, 0); | ||
79 | |||
80 | for (i = 0; i < ARRAY_SIZE(clk); i++) | ||
81 | if (IS_ERR(clk[i])) | ||
82 | pr_err("imx1 clk %d: register failed with %ld\n", | ||
83 | i, PTR_ERR(clk[i])); | ||
84 | |||
85 | clk_register_clkdev(clk[dma_gate], "ahb", "imx-dma"); | ||
86 | clk_register_clkdev(clk[csi_gate], NULL, "mx1-camera.0"); | ||
87 | clk_register_clkdev(clk[mma_gate], "mma", NULL); | ||
88 | clk_register_clkdev(clk[usbd_gate], NULL, "imx_udc.0"); | ||
89 | clk_register_clkdev(clk[per1], "per", "imx-gpt.0"); | ||
90 | clk_register_clkdev(clk[hclk], "ipg", "imx-gpt.0"); | ||
91 | clk_register_clkdev(clk[per1], "per", "imx1-uart.0"); | ||
92 | clk_register_clkdev(clk[hclk], "ipg", "imx1-uart.0"); | ||
93 | clk_register_clkdev(clk[per1], "per", "imx1-uart.1"); | ||
94 | clk_register_clkdev(clk[hclk], "ipg", "imx1-uart.1"); | ||
95 | clk_register_clkdev(clk[per1], "per", "imx1-uart.2"); | ||
96 | clk_register_clkdev(clk[hclk], "ipg", "imx1-uart.2"); | ||
97 | clk_register_clkdev(clk[hclk], NULL, "imx-i2c.0"); | ||
98 | clk_register_clkdev(clk[per2], "per", "imx1-cspi.0"); | ||
99 | clk_register_clkdev(clk[dummy], "ipg", "imx1-cspi.0"); | ||
100 | clk_register_clkdev(clk[per2], "per", "imx1-cspi.1"); | ||
101 | clk_register_clkdev(clk[dummy], "ipg", "imx1-cspi.1"); | ||
102 | clk_register_clkdev(clk[per2], NULL, "imx-mmc.0"); | ||
103 | clk_register_clkdev(clk[per2], "per", "imx-fb.0"); | ||
104 | clk_register_clkdev(clk[dummy], "ipg", "imx-fb.0"); | ||
105 | clk_register_clkdev(clk[dummy], "ahb", "imx-fb.0"); | ||
106 | clk_register_clkdev(clk[hclk], "mshc", NULL); | ||
107 | clk_register_clkdev(clk[per3], "ssi", NULL); | ||
108 | clk_register_clkdev(clk[clk32], NULL, "mxc_rtc.0"); | ||
109 | clk_register_clkdev(clk[clko], "clko", NULL); | ||
110 | |||
111 | mxc_timer_init(NULL, MX1_IO_ADDRESS(MX1_TIM1_BASE_ADDR), | ||
112 | MX1_TIM1_INT); | ||
113 | |||
114 | return 0; | ||
115 | } | ||
diff --git a/arch/arm/mach-imx/clk-imx21.c b/arch/arm/mach-imx/clk-imx21.c new file mode 100644 index 000000000000..4e4f384ee8dd --- /dev/null +++ b/arch/arm/mach-imx/clk-imx21.c | |||
@@ -0,0 +1,186 @@ | |||
1 | /* | ||
2 | * Copyright 2004-2007 Freescale Semiconductor, Inc. All Rights Reserved. | ||
3 | * Copyright 2008 Juergen Beisert, kernel@pengutronix.de | ||
4 | * Copyright 2008 Martin Fuzzey, mfuzzey@gmail.com | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version 2 | ||
9 | * of the License, or (at your option) any later version. | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program; if not, write to the Free Software | ||
17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, | ||
18 | * MA 02110-1301, USA. | ||
19 | */ | ||
20 | |||
21 | #include <linux/clk.h> | ||
22 | #include <linux/clkdev.h> | ||
23 | #include <linux/clk-provider.h> | ||
24 | #include <linux/io.h> | ||
25 | #include <linux/module.h> | ||
26 | #include <linux/clkdev.h> | ||
27 | #include <linux/err.h> | ||
28 | |||
29 | #include <mach/hardware.h> | ||
30 | #include <mach/common.h> | ||
31 | #include "clk.h" | ||
32 | |||
33 | #define IO_ADDR_CCM(off) (MX21_IO_ADDRESS(MX21_CCM_BASE_ADDR + (off))) | ||
34 | |||
35 | /* Register offsets */ | ||
36 | #define CCM_CSCR IO_ADDR_CCM(0x0) | ||
37 | #define CCM_MPCTL0 IO_ADDR_CCM(0x4) | ||
38 | #define CCM_MPCTL1 IO_ADDR_CCM(0x8) | ||
39 | #define CCM_SPCTL0 IO_ADDR_CCM(0xc) | ||
40 | #define CCM_SPCTL1 IO_ADDR_CCM(0x10) | ||
41 | #define CCM_OSC26MCTL IO_ADDR_CCM(0x14) | ||
42 | #define CCM_PCDR0 IO_ADDR_CCM(0x18) | ||
43 | #define CCM_PCDR1 IO_ADDR_CCM(0x1c) | ||
44 | #define CCM_PCCR0 IO_ADDR_CCM(0x20) | ||
45 | #define CCM_PCCR1 IO_ADDR_CCM(0x24) | ||
46 | #define CCM_CCSR IO_ADDR_CCM(0x28) | ||
47 | #define CCM_PMCTL IO_ADDR_CCM(0x2c) | ||
48 | #define CCM_PMCOUNT IO_ADDR_CCM(0x30) | ||
49 | #define CCM_WKGDCTL IO_ADDR_CCM(0x34) | ||
50 | |||
51 | static const char *mpll_sel_clks[] = { "fpm", "ckih", }; | ||
52 | static const char *spll_sel_clks[] = { "fpm", "ckih", }; | ||
53 | |||
54 | enum imx21_clks { | ||
55 | ckil, ckih, fpm, mpll_sel, spll_sel, mpll, spll, fclk, hclk, ipg, per1, | ||
56 | per2, per3, per4, uart1_ipg_gate, uart2_ipg_gate, uart3_ipg_gate, | ||
57 | uart4_ipg_gate, gpt1_ipg_gate, gpt2_ipg_gate, gpt3_ipg_gate, | ||
58 | pwm_ipg_gate, sdhc1_ipg_gate, sdhc2_ipg_gate, lcdc_ipg_gate, | ||
59 | lcdc_hclk_gate, cspi3_ipg_gate, cspi2_ipg_gate, cspi1_ipg_gate, | ||
60 | per4_gate, csi_hclk_gate, usb_div, usb_gate, usb_hclk_gate, ssi1_gate, | ||
61 | ssi2_gate, nfc_div, nfc_gate, dma_gate, dma_hclk_gate, brom_gate, | ||
62 | emma_gate, emma_hclk_gate, slcdc_gate, slcdc_hclk_gate, wdog_gate, | ||
63 | gpio_gate, i2c_gate, kpp_gate, owire_gate, rtc_gate, clk_max | ||
64 | }; | ||
65 | |||
66 | static struct clk *clk[clk_max]; | ||
67 | |||
68 | /* | ||
69 | * must be called very early to get information about the | ||
70 | * available clock rate when the timer framework starts | ||
71 | */ | ||
72 | int __init mx21_clocks_init(unsigned long lref, unsigned long href) | ||
73 | { | ||
74 | int i; | ||
75 | |||
76 | clk[ckil] = imx_clk_fixed("ckil", lref); | ||
77 | clk[ckih] = imx_clk_fixed("ckih", href); | ||
78 | clk[fpm] = imx_clk_fixed_factor("fpm", "ckil", 512, 1); | ||
79 | clk[mpll_sel] = imx_clk_mux("mpll_sel", CCM_CSCR, 16, 1, mpll_sel_clks, | ||
80 | ARRAY_SIZE(mpll_sel_clks)); | ||
81 | clk[spll_sel] = imx_clk_mux("spll_sel", CCM_CSCR, 17, 1, spll_sel_clks, | ||
82 | ARRAY_SIZE(spll_sel_clks)); | ||
83 | clk[mpll] = imx_clk_pllv1("mpll", "mpll_sel", CCM_MPCTL0); | ||
84 | clk[spll] = imx_clk_pllv1("spll", "spll_sel", CCM_SPCTL0); | ||
85 | clk[fclk] = imx_clk_divider("fclk", "mpll", CCM_CSCR, 29, 3); | ||
86 | clk[hclk] = imx_clk_divider("hclk", "fclk", CCM_CSCR, 10, 4); | ||
87 | clk[ipg] = imx_clk_divider("ipg", "hclk", CCM_CSCR, 9, 1); | ||
88 | clk[per1] = imx_clk_divider("per1", "mpll", CCM_PCDR1, 0, 6); | ||
89 | clk[per2] = imx_clk_divider("per2", "mpll", CCM_PCDR1, 8, 6); | ||
90 | clk[per3] = imx_clk_divider("per3", "mpll", CCM_PCDR1, 16, 6); | ||
91 | clk[per4] = imx_clk_divider("per4", "mpll", CCM_PCDR1, 24, 6); | ||
92 | clk[uart1_ipg_gate] = imx_clk_gate("uart1_ipg_gate", "ipg", CCM_PCCR0, 0); | ||
93 | clk[uart2_ipg_gate] = imx_clk_gate("uart2_ipg_gate", "ipg", CCM_PCCR0, 1); | ||
94 | clk[uart3_ipg_gate] = imx_clk_gate("uart3_ipg_gate", "ipg", CCM_PCCR0, 2); | ||
95 | clk[uart4_ipg_gate] = imx_clk_gate("uart4_ipg_gate", "ipg", CCM_PCCR0, 3); | ||
96 | clk[gpt1_ipg_gate] = imx_clk_gate("gpt1_ipg_gate", "ipg", CCM_PCCR1, 25); | ||
97 | clk[gpt2_ipg_gate] = imx_clk_gate("gpt2_ipg_gate", "ipg", CCM_PCCR1, 26); | ||
98 | clk[gpt3_ipg_gate] = imx_clk_gate("gpt3_ipg_gate", "ipg", CCM_PCCR1, 27); | ||
99 | clk[pwm_ipg_gate] = imx_clk_gate("pwm_ipg_gate", "ipg", CCM_PCCR1, 28); | ||
100 | clk[sdhc1_ipg_gate] = imx_clk_gate("sdhc1_ipg_gate", "ipg", CCM_PCCR0, 9); | ||
101 | clk[sdhc2_ipg_gate] = imx_clk_gate("sdhc2_ipg_gate", "ipg", CCM_PCCR0, 10); | ||
102 | clk[lcdc_ipg_gate] = imx_clk_gate("lcdc_ipg_gate", "ipg", CCM_PCCR0, 18); | ||
103 | clk[lcdc_hclk_gate] = imx_clk_gate("lcdc_hclk_gate", "hclk", CCM_PCCR0, 26); | ||
104 | clk[cspi3_ipg_gate] = imx_clk_gate("cspi3_ipg_gate", "ipg", CCM_PCCR1, 23); | ||
105 | clk[cspi2_ipg_gate] = imx_clk_gate("cspi2_ipg_gate", "ipg", CCM_PCCR0, 5); | ||
106 | clk[cspi1_ipg_gate] = imx_clk_gate("cspi1_ipg_gate", "ipg", CCM_PCCR0, 4); | ||
107 | clk[per4_gate] = imx_clk_gate("per4_gate", "per4", CCM_PCCR0, 22); | ||
108 | clk[csi_hclk_gate] = imx_clk_gate("csi_hclk_gate", "hclk", CCM_PCCR0, 31); | ||
109 | clk[usb_div] = imx_clk_divider("usb_div", "spll", CCM_CSCR, 26, 3); | ||
110 | clk[usb_gate] = imx_clk_gate("usb_gate", "usb_div", CCM_PCCR0, 14); | ||
111 | clk[usb_hclk_gate] = imx_clk_gate("usb_hclk_gate", "hclk", CCM_PCCR0, 24); | ||
112 | clk[ssi1_gate] = imx_clk_gate("ssi1_gate", "ipg", CCM_PCCR0, 6); | ||
113 | clk[ssi2_gate] = imx_clk_gate("ssi2_gate", "ipg", CCM_PCCR0, 7); | ||
114 | clk[nfc_div] = imx_clk_divider("nfc_div", "ipg", CCM_PCDR0, 12, 4); | ||
115 | clk[nfc_gate] = imx_clk_gate("nfc_gate", "nfc_div", CCM_PCCR0, 19); | ||
116 | clk[dma_gate] = imx_clk_gate("dma_gate", "ipg", CCM_PCCR0, 13); | ||
117 | clk[dma_hclk_gate] = imx_clk_gate("dma_hclk_gate", "hclk", CCM_PCCR0, 30); | ||
118 | clk[brom_gate] = imx_clk_gate("brom_gate", "hclk", CCM_PCCR0, 28); | ||
119 | clk[emma_gate] = imx_clk_gate("emma_gate", "ipg", CCM_PCCR0, 15); | ||
120 | clk[emma_hclk_gate] = imx_clk_gate("emma_hclk_gate", "hclk", CCM_PCCR0, 27); | ||
121 | clk[slcdc_gate] = imx_clk_gate("slcdc_gate", "ipg", CCM_PCCR0, 25); | ||
122 | clk[slcdc_hclk_gate] = imx_clk_gate("slcdc_hclk_gate", "hclk", CCM_PCCR0, 21); | ||
123 | clk[wdog_gate] = imx_clk_gate("wdog_gate", "ipg", CCM_PCCR1, 24); | ||
124 | clk[gpio_gate] = imx_clk_gate("gpio_gate", "ipg", CCM_PCCR0, 11); | ||
125 | clk[i2c_gate] = imx_clk_gate("i2c_gate", "ipg", CCM_PCCR0, 12); | ||
126 | clk[kpp_gate] = imx_clk_gate("kpp_gate", "ipg", CCM_PCCR1, 30); | ||
127 | clk[owire_gate] = imx_clk_gate("owire_gate", "ipg", CCM_PCCR1, 31); | ||
128 | clk[rtc_gate] = imx_clk_gate("rtc_gate", "ipg", CCM_PCCR1, 29); | ||
129 | |||
130 | for (i = 0; i < ARRAY_SIZE(clk); i++) | ||
131 | if (IS_ERR(clk[i])) | ||
132 | pr_err("i.MX21 clk %d: register failed with %ld\n", | ||
133 | i, PTR_ERR(clk[i])); | ||
134 | |||
135 | clk_register_clkdev(clk[per1], "per1", NULL); | ||
136 | clk_register_clkdev(clk[per2], "per2", NULL); | ||
137 | clk_register_clkdev(clk[per3], "per3", NULL); | ||
138 | clk_register_clkdev(clk[per4], "per4", NULL); | ||
139 | clk_register_clkdev(clk[per1], "per", "imx21-uart.0"); | ||
140 | clk_register_clkdev(clk[uart1_ipg_gate], "ipg", "imx21-uart.0"); | ||
141 | clk_register_clkdev(clk[per1], "per", "imx21-uart.1"); | ||
142 | clk_register_clkdev(clk[uart2_ipg_gate], "ipg", "imx21-uart.1"); | ||
143 | clk_register_clkdev(clk[per1], "per", "imx21-uart.2"); | ||
144 | clk_register_clkdev(clk[uart3_ipg_gate], "ipg", "imx21-uart.2"); | ||
145 | clk_register_clkdev(clk[per1], "per", "imx21-uart.3"); | ||
146 | clk_register_clkdev(clk[uart4_ipg_gate], "ipg", "imx21-uart.3"); | ||
147 | clk_register_clkdev(clk[gpt1_ipg_gate], "ipg", "imx-gpt.0"); | ||
148 | clk_register_clkdev(clk[per1], "per", "imx-gpt.0"); | ||
149 | clk_register_clkdev(clk[gpt2_ipg_gate], "ipg", "imx-gpt.1"); | ||
150 | clk_register_clkdev(clk[per1], "per", "imx-gpt.1"); | ||
151 | clk_register_clkdev(clk[gpt3_ipg_gate], "ipg", "imx-gpt.2"); | ||
152 | clk_register_clkdev(clk[per1], "per", "imx-gpt.2"); | ||
153 | clk_register_clkdev(clk[pwm_ipg_gate], "pwm", "mxc_pwm.0"); | ||
154 | clk_register_clkdev(clk[per2], "per", "imx21-cspi.0"); | ||
155 | clk_register_clkdev(clk[cspi1_ipg_gate], "ipg", "imx21-cspi.0"); | ||
156 | clk_register_clkdev(clk[per2], "per", "imx21-cspi.1"); | ||
157 | clk_register_clkdev(clk[cspi2_ipg_gate], "ipg", "imx21-cspi.1"); | ||
158 | clk_register_clkdev(clk[per2], "per", "imx21-cspi.2"); | ||
159 | clk_register_clkdev(clk[cspi3_ipg_gate], "ipg", "imx21-cspi.2"); | ||
160 | clk_register_clkdev(clk[per3], "per", "imx-fb.0"); | ||
161 | clk_register_clkdev(clk[lcdc_ipg_gate], "ipg", "imx-fb.0"); | ||
162 | clk_register_clkdev(clk[lcdc_hclk_gate], "ahb", "imx-fb.0"); | ||
163 | clk_register_clkdev(clk[usb_gate], "per", "imx21-hcd.0"); | ||
164 | clk_register_clkdev(clk[usb_hclk_gate], "ahb", "imx21-hcd.0"); | ||
165 | clk_register_clkdev(clk[nfc_gate], NULL, "mxc_nand.0"); | ||
166 | clk_register_clkdev(clk[dma_hclk_gate], "ahb", "imx-dma"); | ||
167 | clk_register_clkdev(clk[dma_gate], "ipg", "imx-dma"); | ||
168 | clk_register_clkdev(clk[wdog_gate], NULL, "imx2-wdt.0"); | ||
169 | clk_register_clkdev(clk[i2c_gate], NULL, "imx-i2c.0"); | ||
170 | clk_register_clkdev(clk[kpp_gate], NULL, "mxc-keypad"); | ||
171 | clk_register_clkdev(clk[owire_gate], NULL, "mxc_w1.0"); | ||
172 | clk_register_clkdev(clk[brom_gate], "brom", NULL); | ||
173 | clk_register_clkdev(clk[emma_gate], "emma", NULL); | ||
174 | clk_register_clkdev(clk[slcdc_gate], "slcdc", NULL); | ||
175 | clk_register_clkdev(clk[gpio_gate], "gpio", NULL); | ||
176 | clk_register_clkdev(clk[rtc_gate], "rtc", NULL); | ||
177 | clk_register_clkdev(clk[csi_hclk_gate], "csi", NULL); | ||
178 | clk_register_clkdev(clk[ssi1_gate], "ssi1", NULL); | ||
179 | clk_register_clkdev(clk[ssi2_gate], "ssi2", NULL); | ||
180 | clk_register_clkdev(clk[sdhc1_ipg_gate], "sdhc1", NULL); | ||
181 | clk_register_clkdev(clk[sdhc2_ipg_gate], "sdhc2", NULL); | ||
182 | |||
183 | mxc_timer_init(NULL, MX21_IO_ADDRESS(MX21_GPT1_BASE_ADDR), | ||
184 | MX21_INT_GPT1); | ||
185 | return 0; | ||
186 | } | ||
diff --git a/arch/arm/mach-imx/clk-imx25.c b/arch/arm/mach-imx/clk-imx25.c new file mode 100644 index 000000000000..d9833bb5fd61 --- /dev/null +++ b/arch/arm/mach-imx/clk-imx25.c | |||
@@ -0,0 +1,248 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2009 by Sascha Hauer, Pengutronix | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or | ||
5 | * modify it under the terms of the GNU General Public License | ||
6 | * as published by the Free Software Foundation; either version 2 | ||
7 | * of the License, or (at your option) any later version. | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License | ||
14 | * along with this program; if not, write to the Free Software | ||
15 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, | ||
16 | * MA 02110-1301, USA. | ||
17 | */ | ||
18 | |||
19 | #include <linux/kernel.h> | ||
20 | #include <linux/init.h> | ||
21 | #include <linux/list.h> | ||
22 | #include <linux/clk.h> | ||
23 | #include <linux/io.h> | ||
24 | #include <linux/clkdev.h> | ||
25 | #include <linux/err.h> | ||
26 | |||
27 | #include <mach/hardware.h> | ||
28 | #include <mach/common.h> | ||
29 | #include <mach/mx25.h> | ||
30 | #include "clk.h" | ||
31 | |||
32 | #define CRM_BASE MX25_IO_ADDRESS(MX25_CRM_BASE_ADDR) | ||
33 | |||
34 | #define CCM_MPCTL 0x00 | ||
35 | #define CCM_UPCTL 0x04 | ||
36 | #define CCM_CCTL 0x08 | ||
37 | #define CCM_CGCR0 0x0C | ||
38 | #define CCM_CGCR1 0x10 | ||
39 | #define CCM_CGCR2 0x14 | ||
40 | #define CCM_PCDR0 0x18 | ||
41 | #define CCM_PCDR1 0x1C | ||
42 | #define CCM_PCDR2 0x20 | ||
43 | #define CCM_PCDR3 0x24 | ||
44 | #define CCM_RCSR 0x28 | ||
45 | #define CCM_CRDR 0x2C | ||
46 | #define CCM_DCVR0 0x30 | ||
47 | #define CCM_DCVR1 0x34 | ||
48 | #define CCM_DCVR2 0x38 | ||
49 | #define CCM_DCVR3 0x3c | ||
50 | #define CCM_LTR0 0x40 | ||
51 | #define CCM_LTR1 0x44 | ||
52 | #define CCM_LTR2 0x48 | ||
53 | #define CCM_LTR3 0x4c | ||
54 | #define CCM_MCR 0x64 | ||
55 | |||
56 | #define ccm(x) (CRM_BASE + (x)) | ||
57 | |||
58 | static const char *cpu_sel_clks[] = { "mpll", "mpll_cpu_3_4", }; | ||
59 | static const char *per_sel_clks[] = { "ahb", "upll", }; | ||
60 | |||
61 | enum mx25_clks { | ||
62 | dummy, osc, mpll, upll, mpll_cpu_3_4, cpu_sel, cpu, ahb, usb_div, ipg, | ||
63 | per0_sel, per1_sel, per2_sel, per3_sel, per4_sel, per5_sel, per6_sel, | ||
64 | per7_sel, per8_sel, per9_sel, per10_sel, per11_sel, per12_sel, | ||
65 | per13_sel, per14_sel, per15_sel, per0, per1, per2, per3, per4, per5, | ||
66 | per6, per7, per8, per9, per10, per11, per12, per13, per14, per15, | ||
67 | csi_ipg_per, esdhc1_ipg_per, esdhc2_ipg_per, gpt_ipg_per, i2c_ipg_per, | ||
68 | lcdc_ipg_per, nfc_ipg_per, ssi1_ipg_per, ssi2_ipg_per, uart_ipg_per, | ||
69 | csi_ahb, esdhc1_ahb, esdhc2_ahb, fec_ahb, lcdc_ahb, sdma_ahb, | ||
70 | usbotg_ahb, can1_ipg, can2_ipg, csi_ipg, cspi1_ipg, cspi2_ipg, | ||
71 | cspi3_ipg, dryice_ipg, esdhc1_ipg, esdhc2_ipg, fec_ipg, iim_ipg, | ||
72 | kpp_ipg, lcdc_ipg, pwm1_ipg, pwm2_ipg, pwm3_ipg, pwm4_ipg, sdma_ipg, | ||
73 | ssi1_ipg, ssi2_ipg, tsc_ipg, uart1_ipg, uart2_ipg, uart3_ipg, | ||
74 | uart4_ipg, uart5_ipg, wdt_ipg, clk_max | ||
75 | }; | ||
76 | |||
77 | static struct clk *clk[clk_max]; | ||
78 | |||
79 | int __init mx25_clocks_init(void) | ||
80 | { | ||
81 | int i; | ||
82 | |||
83 | clk[dummy] = imx_clk_fixed("dummy", 0); | ||
84 | clk[osc] = imx_clk_fixed("osc", 24000000); | ||
85 | clk[mpll] = imx_clk_pllv1("mpll", "osc", ccm(CCM_MPCTL)); | ||
86 | clk[upll] = imx_clk_pllv1("upll", "osc", ccm(CCM_UPCTL)); | ||
87 | clk[mpll_cpu_3_4] = imx_clk_fixed_factor("mpll_cpu_3_4", "mpll", 3, 4); | ||
88 | clk[cpu_sel] = imx_clk_mux("cpu_sel", ccm(CCM_CCTL), 14, 1, cpu_sel_clks, ARRAY_SIZE(cpu_sel_clks)); | ||
89 | clk[cpu] = imx_clk_divider("cpu", "cpu_sel", ccm(CCM_CCTL), 30, 2); | ||
90 | clk[ahb] = imx_clk_divider("ahb", "cpu", ccm(CCM_CCTL), 28, 2); | ||
91 | clk[usb_div] = imx_clk_divider("usb_div", "upll", ccm(CCM_CCTL), 16, 6); | ||
92 | clk[ipg] = imx_clk_fixed_factor("ipg", "ahb", 1, 2); | ||
93 | clk[per0_sel] = imx_clk_mux("per0_sel", ccm(CCM_MCR), 0, 1, per_sel_clks, ARRAY_SIZE(per_sel_clks)); | ||
94 | clk[per1_sel] = imx_clk_mux("per1_sel", ccm(CCM_MCR), 1, 1, per_sel_clks, ARRAY_SIZE(per_sel_clks)); | ||
95 | clk[per2_sel] = imx_clk_mux("per2_sel", ccm(CCM_MCR), 2, 1, per_sel_clks, ARRAY_SIZE(per_sel_clks)); | ||
96 | clk[per3_sel] = imx_clk_mux("per3_sel", ccm(CCM_MCR), 3, 1, per_sel_clks, ARRAY_SIZE(per_sel_clks)); | ||
97 | clk[per4_sel] = imx_clk_mux("per4_sel", ccm(CCM_MCR), 4, 1, per_sel_clks, ARRAY_SIZE(per_sel_clks)); | ||
98 | clk[per5_sel] = imx_clk_mux("per5_sel", ccm(CCM_MCR), 5, 1, per_sel_clks, ARRAY_SIZE(per_sel_clks)); | ||
99 | clk[per6_sel] = imx_clk_mux("per6_sel", ccm(CCM_MCR), 6, 1, per_sel_clks, ARRAY_SIZE(per_sel_clks)); | ||
100 | clk[per7_sel] = imx_clk_mux("per7_sel", ccm(CCM_MCR), 7, 1, per_sel_clks, ARRAY_SIZE(per_sel_clks)); | ||
101 | clk[per8_sel] = imx_clk_mux("per8_sel", ccm(CCM_MCR), 8, 1, per_sel_clks, ARRAY_SIZE(per_sel_clks)); | ||
102 | clk[per9_sel] = imx_clk_mux("per9_sel", ccm(CCM_MCR), 9, 1, per_sel_clks, ARRAY_SIZE(per_sel_clks)); | ||
103 | clk[per10_sel] = imx_clk_mux("per10_sel", ccm(CCM_MCR), 10, 1, per_sel_clks, ARRAY_SIZE(per_sel_clks)); | ||
104 | clk[per11_sel] = imx_clk_mux("per11_sel", ccm(CCM_MCR), 11, 1, per_sel_clks, ARRAY_SIZE(per_sel_clks)); | ||
105 | clk[per12_sel] = imx_clk_mux("per12_sel", ccm(CCM_MCR), 12, 1, per_sel_clks, ARRAY_SIZE(per_sel_clks)); | ||
106 | clk[per13_sel] = imx_clk_mux("per13_sel", ccm(CCM_MCR), 13, 1, per_sel_clks, ARRAY_SIZE(per_sel_clks)); | ||
107 | clk[per14_sel] = imx_clk_mux("per14_sel", ccm(CCM_MCR), 14, 1, per_sel_clks, ARRAY_SIZE(per_sel_clks)); | ||
108 | clk[per15_sel] = imx_clk_mux("per15_sel", ccm(CCM_MCR), 15, 1, per_sel_clks, ARRAY_SIZE(per_sel_clks)); | ||
109 | clk[per0] = imx_clk_divider("per0", "per0_sel", ccm(CCM_PCDR0), 0, 6); | ||
110 | clk[per1] = imx_clk_divider("per1", "per1_sel", ccm(CCM_PCDR0), 8, 6); | ||
111 | clk[per2] = imx_clk_divider("per2", "per2_sel", ccm(CCM_PCDR0), 16, 6); | ||
112 | clk[per3] = imx_clk_divider("per3", "per3_sel", ccm(CCM_PCDR0), 24, 6); | ||
113 | clk[per4] = imx_clk_divider("per4", "per4_sel", ccm(CCM_PCDR1), 0, 6); | ||
114 | clk[per5] = imx_clk_divider("per5", "per5_sel", ccm(CCM_PCDR1), 8, 6); | ||
115 | clk[per6] = imx_clk_divider("per6", "per6_sel", ccm(CCM_PCDR1), 16, 6); | ||
116 | clk[per7] = imx_clk_divider("per7", "per7_sel", ccm(CCM_PCDR1), 24, 6); | ||
117 | clk[per8] = imx_clk_divider("per8", "per8_sel", ccm(CCM_PCDR2), 0, 6); | ||
118 | clk[per9] = imx_clk_divider("per9", "per9_sel", ccm(CCM_PCDR2), 8, 6); | ||
119 | clk[per10] = imx_clk_divider("per10", "per10_sel", ccm(CCM_PCDR2), 16, 6); | ||
120 | clk[per11] = imx_clk_divider("per11", "per11_sel", ccm(CCM_PCDR2), 24, 6); | ||
121 | clk[per12] = imx_clk_divider("per12", "per12_sel", ccm(CCM_PCDR3), 0, 6); | ||
122 | clk[per13] = imx_clk_divider("per13", "per13_sel", ccm(CCM_PCDR3), 8, 6); | ||
123 | clk[per14] = imx_clk_divider("per14", "per14_sel", ccm(CCM_PCDR3), 16, 6); | ||
124 | clk[per15] = imx_clk_divider("per15", "per15_sel", ccm(CCM_PCDR3), 24, 6); | ||
125 | clk[csi_ipg_per] = imx_clk_gate("csi_ipg_per", "per0", ccm(CCM_CGCR0), 0); | ||
126 | clk[esdhc1_ipg_per] = imx_clk_gate("esdhc1_ipg_per", "per3", ccm(CCM_CGCR0), 3); | ||
127 | clk[esdhc2_ipg_per] = imx_clk_gate("esdhc2_ipg_per", "per4", ccm(CCM_CGCR0), 4); | ||
128 | clk[gpt_ipg_per] = imx_clk_gate("gpt_ipg_per", "per5", ccm(CCM_CGCR0), 5); | ||
129 | clk[i2c_ipg_per] = imx_clk_gate("i2c_ipg_per", "per6", ccm(CCM_CGCR0), 6); | ||
130 | clk[lcdc_ipg_per] = imx_clk_gate("lcdc_ipg_per", "per8", ccm(CCM_CGCR0), 7); | ||
131 | clk[nfc_ipg_per] = imx_clk_gate("nfc_ipg_per", "ipg_per", ccm(CCM_CGCR0), 8); | ||
132 | clk[ssi1_ipg_per] = imx_clk_gate("ssi1_ipg_per", "per13", ccm(CCM_CGCR0), 13); | ||
133 | clk[ssi2_ipg_per] = imx_clk_gate("ssi2_ipg_per", "per14", ccm(CCM_CGCR0), 14); | ||
134 | clk[uart_ipg_per] = imx_clk_gate("uart_ipg_per", "per15", ccm(CCM_CGCR0), 15); | ||
135 | clk[csi_ahb] = imx_clk_gate("csi_ahb", "ahb", ccm(CCM_CGCR0), 18); | ||
136 | clk[esdhc1_ahb] = imx_clk_gate("esdhc1_ahb", "ahb", ccm(CCM_CGCR0), 21); | ||
137 | clk[esdhc2_ahb] = imx_clk_gate("esdhc2_ahb", "ahb", ccm(CCM_CGCR0), 22); | ||
138 | clk[fec_ahb] = imx_clk_gate("fec_ahb", "ahb", ccm(CCM_CGCR0), 23); | ||
139 | clk[lcdc_ahb] = imx_clk_gate("lcdc_ahb", "ahb", ccm(CCM_CGCR0), 24); | ||
140 | clk[sdma_ahb] = imx_clk_gate("sdma_ahb", "ahb", ccm(CCM_CGCR0), 26); | ||
141 | clk[usbotg_ahb] = imx_clk_gate("usbotg_ahb", "ahb", ccm(CCM_CGCR0), 28); | ||
142 | clk[can1_ipg] = imx_clk_gate("can1_ipg", "ipg", ccm(CCM_CGCR1), 2); | ||
143 | clk[can2_ipg] = imx_clk_gate("can2_ipg", "ipg", ccm(CCM_CGCR1), 3); | ||
144 | clk[csi_ipg] = imx_clk_gate("csi_ipg", "ipg", ccm(CCM_CGCR1), 4); | ||
145 | clk[cspi1_ipg] = imx_clk_gate("cspi1_ipg", "ipg", ccm(CCM_CGCR1), 5); | ||
146 | clk[cspi2_ipg] = imx_clk_gate("cspi2_ipg", "ipg", ccm(CCM_CGCR1), 6); | ||
147 | clk[cspi3_ipg] = imx_clk_gate("cspi3_ipg", "ipg", ccm(CCM_CGCR1), 7); | ||
148 | clk[dryice_ipg] = imx_clk_gate("dryice_ipg", "ipg", ccm(CCM_CGCR1), 8); | ||
149 | clk[esdhc1_ipg] = imx_clk_gate("esdhc1_ipg", "ipg", ccm(CCM_CGCR1), 13); | ||
150 | clk[esdhc2_ipg] = imx_clk_gate("esdhc2_ipg", "ipg", ccm(CCM_CGCR1), 14); | ||
151 | clk[fec_ipg] = imx_clk_gate("fec_ipg", "ipg", ccm(CCM_CGCR1), 15); | ||
152 | clk[iim_ipg] = imx_clk_gate("iim_ipg", "ipg", ccm(CCM_CGCR1), 26); | ||
153 | clk[kpp_ipg] = imx_clk_gate("kpp_ipg", "ipg", ccm(CCM_CGCR1), 28); | ||
154 | clk[lcdc_ipg] = imx_clk_gate("lcdc_ipg", "ipg", ccm(CCM_CGCR1), 29); | ||
155 | clk[pwm1_ipg] = imx_clk_gate("pwm1_ipg", "ipg", ccm(CCM_CGCR1), 31); | ||
156 | clk[pwm2_ipg] = imx_clk_gate("pwm2_ipg", "ipg", ccm(CCM_CGCR2), 0); | ||
157 | clk[pwm3_ipg] = imx_clk_gate("pwm3_ipg", "ipg", ccm(CCM_CGCR2), 1); | ||
158 | clk[pwm4_ipg] = imx_clk_gate("pwm4_ipg", "ipg", ccm(CCM_CGCR2), 2); | ||
159 | clk[sdma_ipg] = imx_clk_gate("sdma_ipg", "ipg", ccm(CCM_CGCR2), 6); | ||
160 | clk[ssi1_ipg] = imx_clk_gate("ssi1_ipg", "ipg", ccm(CCM_CGCR2), 11); | ||
161 | clk[ssi2_ipg] = imx_clk_gate("ssi2_ipg", "ipg", ccm(CCM_CGCR2), 12); | ||
162 | clk[tsc_ipg] = imx_clk_gate("tsc_ipg", "ipg", ccm(CCM_CGCR2), 13); | ||
163 | clk[uart1_ipg] = imx_clk_gate("uart1_ipg", "ipg", ccm(CCM_CGCR2), 14); | ||
164 | clk[uart2_ipg] = imx_clk_gate("uart2_ipg", "ipg", ccm(CCM_CGCR2), 15); | ||
165 | clk[uart3_ipg] = imx_clk_gate("uart3_ipg", "ipg", ccm(CCM_CGCR2), 16); | ||
166 | clk[uart4_ipg] = imx_clk_gate("uart4_ipg", "ipg", ccm(CCM_CGCR2), 17); | ||
167 | clk[uart5_ipg] = imx_clk_gate("uart5_ipg", "ipg", ccm(CCM_CGCR2), 18); | ||
168 | clk[wdt_ipg] = imx_clk_gate("wdt_ipg", "ipg", ccm(CCM_CGCR2), 19); | ||
169 | |||
170 | for (i = 0; i < ARRAY_SIZE(clk); i++) | ||
171 | if (IS_ERR(clk[i])) | ||
172 | pr_err("i.MX25 clk %d: register failed with %ld\n", | ||
173 | i, PTR_ERR(clk[i])); | ||
174 | |||
175 | /* i.mx25 has the i.mx21 type uart */ | ||
176 | clk_register_clkdev(clk[uart1_ipg], "ipg", "imx21-uart.0"); | ||
177 | clk_register_clkdev(clk[uart_ipg_per], "per", "imx21-uart.0"); | ||
178 | clk_register_clkdev(clk[uart2_ipg], "ipg", "imx21-uart.1"); | ||
179 | clk_register_clkdev(clk[uart_ipg_per], "per", "imx21-uart.1"); | ||
180 | clk_register_clkdev(clk[uart3_ipg], "ipg", "imx21-uart.2"); | ||
181 | clk_register_clkdev(clk[uart_ipg_per], "per", "imx21-uart.2"); | ||
182 | clk_register_clkdev(clk[uart4_ipg], "ipg", "imx21-uart.3"); | ||
183 | clk_register_clkdev(clk[uart_ipg_per], "per", "imx21-uart.3"); | ||
184 | clk_register_clkdev(clk[uart5_ipg], "ipg", "imx21-uart.4"); | ||
185 | clk_register_clkdev(clk[uart_ipg_per], "per", "imx21-uart.4"); | ||
186 | clk_register_clkdev(clk[ipg], "ipg", "imx-gpt.0"); | ||
187 | clk_register_clkdev(clk[gpt_ipg_per], "per", "imx-gpt.0"); | ||
188 | clk_register_clkdev(clk[ipg], "ipg", "mxc-ehci.0"); | ||
189 | clk_register_clkdev(clk[usbotg_ahb], "ahb", "mxc-ehci.0"); | ||
190 | clk_register_clkdev(clk[usb_div], "per", "mxc-ehci.0"); | ||
191 | clk_register_clkdev(clk[ipg], "ipg", "mxc-ehci.1"); | ||
192 | clk_register_clkdev(clk[usbotg_ahb], "ahb", "mxc-ehci.1"); | ||
193 | clk_register_clkdev(clk[usb_div], "per", "mxc-ehci.1"); | ||
194 | clk_register_clkdev(clk[ipg], "ipg", "mxc-ehci.2"); | ||
195 | clk_register_clkdev(clk[usbotg_ahb], "ahb", "mxc-ehci.2"); | ||
196 | clk_register_clkdev(clk[usb_div], "per", "mxc-ehci.2"); | ||
197 | clk_register_clkdev(clk[ipg], "ipg", "fsl-usb2-udc"); | ||
198 | clk_register_clkdev(clk[usbotg_ahb], "ahb", "fsl-usb2-udc"); | ||
199 | clk_register_clkdev(clk[usb_div], "per", "fsl-usb2-udc"); | ||
200 | clk_register_clkdev(clk[nfc_ipg_per], NULL, "mxc_nand.0"); | ||
201 | /* i.mx25 has the i.mx35 type cspi */ | ||
202 | clk_register_clkdev(clk[cspi1_ipg], NULL, "imx35-cspi.0"); | ||
203 | clk_register_clkdev(clk[cspi2_ipg], NULL, "imx35-cspi.1"); | ||
204 | clk_register_clkdev(clk[cspi3_ipg], NULL, "imx35-cspi.2"); | ||
205 | clk_register_clkdev(clk[pwm1_ipg], "ipg", "mxc_pwm.0"); | ||
206 | clk_register_clkdev(clk[per10], "per", "mxc_pwm.0"); | ||
207 | clk_register_clkdev(clk[pwm1_ipg], "ipg", "mxc_pwm.1"); | ||
208 | clk_register_clkdev(clk[per10], "per", "mxc_pwm.1"); | ||
209 | clk_register_clkdev(clk[pwm1_ipg], "ipg", "mxc_pwm.2"); | ||
210 | clk_register_clkdev(clk[per10], "per", "mxc_pwm.2"); | ||
211 | clk_register_clkdev(clk[pwm1_ipg], "ipg", "mxc_pwm.3"); | ||
212 | clk_register_clkdev(clk[per10], "per", "mxc_pwm.3"); | ||
213 | clk_register_clkdev(clk[kpp_ipg], NULL, "imx-keypad"); | ||
214 | clk_register_clkdev(clk[tsc_ipg], NULL, "mx25-adc"); | ||
215 | clk_register_clkdev(clk[i2c_ipg_per], NULL, "imx-i2c.0"); | ||
216 | clk_register_clkdev(clk[i2c_ipg_per], NULL, "imx-i2c.1"); | ||
217 | clk_register_clkdev(clk[i2c_ipg_per], NULL, "imx-i2c.2"); | ||
218 | clk_register_clkdev(clk[fec_ipg], "ipg", "imx25-fec.0"); | ||
219 | clk_register_clkdev(clk[fec_ahb], "ahb", "imx25-fec.0"); | ||
220 | clk_register_clkdev(clk[dryice_ipg], NULL, "imxdi_rtc.0"); | ||
221 | clk_register_clkdev(clk[lcdc_ipg_per], "per", "imx-fb.0"); | ||
222 | clk_register_clkdev(clk[lcdc_ipg], "ipg", "imx-fb.0"); | ||
223 | clk_register_clkdev(clk[lcdc_ahb], "ahb", "imx-fb.0"); | ||
224 | clk_register_clkdev(clk[wdt_ipg], NULL, "imx2-wdt.0"); | ||
225 | clk_register_clkdev(clk[ssi1_ipg_per], "per", "imx-ssi.0"); | ||
226 | clk_register_clkdev(clk[ssi1_ipg], "ipg", "imx-ssi.0"); | ||
227 | clk_register_clkdev(clk[ssi2_ipg_per], "per", "imx-ssi.1"); | ||
228 | clk_register_clkdev(clk[ssi2_ipg], "ipg", "imx-ssi.1"); | ||
229 | clk_register_clkdev(clk[esdhc1_ipg_per], "per", "sdhci-esdhc-imx25.0"); | ||
230 | clk_register_clkdev(clk[esdhc1_ipg], "ipg", "sdhci-esdhc-imx25.0"); | ||
231 | clk_register_clkdev(clk[esdhc1_ahb], "ahb", "sdhci-esdhc-imx25.0"); | ||
232 | clk_register_clkdev(clk[esdhc2_ipg_per], "per", "sdhci-esdhc-imx25.1"); | ||
233 | clk_register_clkdev(clk[esdhc2_ipg], "ipg", "sdhci-esdhc-imx25.1"); | ||
234 | clk_register_clkdev(clk[esdhc2_ahb], "ahb", "sdhci-esdhc-imx25.1"); | ||
235 | clk_register_clkdev(clk[csi_ipg_per], "per", "mx2-camera.0"); | ||
236 | clk_register_clkdev(clk[csi_ipg], "ipg", "mx2-camera.0"); | ||
237 | clk_register_clkdev(clk[csi_ahb], "ahb", "mx2-camera.0"); | ||
238 | clk_register_clkdev(clk[dummy], "audmux", NULL); | ||
239 | clk_register_clkdev(clk[can1_ipg], NULL, "flexcan.0"); | ||
240 | clk_register_clkdev(clk[can2_ipg], NULL, "flexcan.1"); | ||
241 | /* i.mx25 has the i.mx35 type sdma */ | ||
242 | clk_register_clkdev(clk[sdma_ipg], "ipg", "imx35-sdma"); | ||
243 | clk_register_clkdev(clk[sdma_ahb], "ahb", "imx35-sdma"); | ||
244 | clk_register_clkdev(clk[iim_ipg], "iim", NULL); | ||
245 | |||
246 | mxc_timer_init(NULL, MX25_IO_ADDRESS(MX25_GPT1_BASE_ADDR), 54); | ||
247 | return 0; | ||
248 | } | ||
diff --git a/arch/arm/mach-imx/clk-imx27.c b/arch/arm/mach-imx/clk-imx27.c new file mode 100644 index 000000000000..50a7ebd8d1b2 --- /dev/null +++ b/arch/arm/mach-imx/clk-imx27.c | |||
@@ -0,0 +1,290 @@ | |||
1 | #include <linux/clk.h> | ||
2 | #include <linux/io.h> | ||
3 | #include <linux/module.h> | ||
4 | #include <linux/clkdev.h> | ||
5 | #include <linux/err.h> | ||
6 | #include <linux/clk-provider.h> | ||
7 | #include <linux/of.h> | ||
8 | |||
9 | #include <mach/common.h> | ||
10 | #include <mach/hardware.h> | ||
11 | #include "clk.h" | ||
12 | |||
13 | #define IO_ADDR_CCM(off) (MX27_IO_ADDRESS(MX27_CCM_BASE_ADDR + (off))) | ||
14 | |||
15 | /* Register offsets */ | ||
16 | #define CCM_CSCR IO_ADDR_CCM(0x0) | ||
17 | #define CCM_MPCTL0 IO_ADDR_CCM(0x4) | ||
18 | #define CCM_MPCTL1 IO_ADDR_CCM(0x8) | ||
19 | #define CCM_SPCTL0 IO_ADDR_CCM(0xc) | ||
20 | #define CCM_SPCTL1 IO_ADDR_CCM(0x10) | ||
21 | #define CCM_OSC26MCTL IO_ADDR_CCM(0x14) | ||
22 | #define CCM_PCDR0 IO_ADDR_CCM(0x18) | ||
23 | #define CCM_PCDR1 IO_ADDR_CCM(0x1c) | ||
24 | #define CCM_PCCR0 IO_ADDR_CCM(0x20) | ||
25 | #define CCM_PCCR1 IO_ADDR_CCM(0x24) | ||
26 | #define CCM_CCSR IO_ADDR_CCM(0x28) | ||
27 | #define CCM_PMCTL IO_ADDR_CCM(0x2c) | ||
28 | #define CCM_PMCOUNT IO_ADDR_CCM(0x30) | ||
29 | #define CCM_WKGDCTL IO_ADDR_CCM(0x34) | ||
30 | |||
31 | #define CCM_CSCR_UPDATE_DIS (1 << 31) | ||
32 | #define CCM_CSCR_SSI2 (1 << 23) | ||
33 | #define CCM_CSCR_SSI1 (1 << 22) | ||
34 | #define CCM_CSCR_VPU (1 << 21) | ||
35 | #define CCM_CSCR_MSHC (1 << 20) | ||
36 | #define CCM_CSCR_SPLLRES (1 << 19) | ||
37 | #define CCM_CSCR_MPLLRES (1 << 18) | ||
38 | #define CCM_CSCR_SP (1 << 17) | ||
39 | #define CCM_CSCR_MCU (1 << 16) | ||
40 | #define CCM_CSCR_OSC26MDIV (1 << 4) | ||
41 | #define CCM_CSCR_OSC26M (1 << 3) | ||
42 | #define CCM_CSCR_FPM (1 << 2) | ||
43 | #define CCM_CSCR_SPEN (1 << 1) | ||
44 | #define CCM_CSCR_MPEN (1 << 0) | ||
45 | |||
46 | /* i.MX27 TO 2+ */ | ||
47 | #define CCM_CSCR_ARM_SRC (1 << 15) | ||
48 | |||
49 | #define CCM_SPCTL1_LF (1 << 15) | ||
50 | #define CCM_SPCTL1_BRMO (1 << 6) | ||
51 | |||
52 | static const char *vpu_sel_clks[] = { "spll", "mpll_main2", }; | ||
53 | static const char *cpu_sel_clks[] = { "mpll_main2", "mpll", }; | ||
54 | static const char *clko_sel_clks[] = { | ||
55 | "ckil", "prem", "ckih", "ckih", | ||
56 | "ckih", "mpll", "spll", "cpu_div", | ||
57 | "ahb", "ipg", "per1_div", "per2_div", | ||
58 | "per3_div", "per4_div", "ssi1_div", "ssi2_div", | ||
59 | "nfc_div", "mshc_div", "vpu_div", "60m", | ||
60 | "32k", "usb_div", "dptc", | ||
61 | }; | ||
62 | |||
63 | static const char *ssi_sel_clks[] = { "spll", "mpll", }; | ||
64 | |||
65 | enum mx27_clks { | ||
66 | dummy, ckih, ckil, mpll, spll, mpll_main2, ahb, ipg, nfc_div, per1_div, | ||
67 | per2_div, per3_div, per4_div, vpu_sel, vpu_div, usb_div, cpu_sel, | ||
68 | clko_sel, cpu_div, clko_div, ssi1_sel, ssi2_sel, ssi1_div, ssi2_div, | ||
69 | clko_en, ssi2_ipg_gate, ssi1_ipg_gate, slcdc_ipg_gate, sdhc3_ipg_gate, | ||
70 | sdhc2_ipg_gate, sdhc1_ipg_gate, scc_ipg_gate, sahara_ipg_gate, | ||
71 | rtc_ipg_gate, pwm_ipg_gate, owire_ipg_gate, lcdc_ipg_gate, | ||
72 | kpp_ipg_gate, iim_ipg_gate, i2c2_ipg_gate, i2c1_ipg_gate, | ||
73 | gpt6_ipg_gate, gpt5_ipg_gate, gpt4_ipg_gate, gpt3_ipg_gate, | ||
74 | gpt2_ipg_gate, gpt1_ipg_gate, gpio_ipg_gate, fec_ipg_gate, | ||
75 | emma_ipg_gate, dma_ipg_gate, cspi3_ipg_gate, cspi2_ipg_gate, | ||
76 | cspi1_ipg_gate, nfc_baud_gate, ssi2_baud_gate, ssi1_baud_gate, | ||
77 | vpu_baud_gate, per4_gate, per3_gate, per2_gate, per1_gate, | ||
78 | usb_ahb_gate, slcdc_ahb_gate, sahara_ahb_gate, lcdc_ahb_gate, | ||
79 | vpu_ahb_gate, fec_ahb_gate, emma_ahb_gate, emi_ahb_gate, dma_ahb_gate, | ||
80 | csi_ahb_gate, brom_ahb_gate, ata_ahb_gate, wdog_ipg_gate, usb_ipg_gate, | ||
81 | uart6_ipg_gate, uart5_ipg_gate, uart4_ipg_gate, uart3_ipg_gate, | ||
82 | uart2_ipg_gate, uart1_ipg_gate, clk_max | ||
83 | }; | ||
84 | |||
85 | static struct clk *clk[clk_max]; | ||
86 | |||
87 | int __init mx27_clocks_init(unsigned long fref) | ||
88 | { | ||
89 | int i; | ||
90 | |||
91 | clk[dummy] = imx_clk_fixed("dummy", 0); | ||
92 | clk[ckih] = imx_clk_fixed("ckih", fref); | ||
93 | clk[ckil] = imx_clk_fixed("ckil", 32768); | ||
94 | clk[mpll] = imx_clk_pllv1("mpll", "ckih", CCM_MPCTL0); | ||
95 | clk[spll] = imx_clk_pllv1("spll", "ckih", CCM_SPCTL0); | ||
96 | clk[mpll_main2] = imx_clk_fixed_factor("mpll_main2", "mpll", 2, 3); | ||
97 | |||
98 | if (mx27_revision() >= IMX_CHIP_REVISION_2_0) { | ||
99 | clk[ahb] = imx_clk_divider("ahb", "mpll_main2", CCM_CSCR, 8, 2); | ||
100 | clk[ipg] = imx_clk_fixed_factor("ipg", "ahb", 1, 2); | ||
101 | } else { | ||
102 | clk[ahb] = imx_clk_divider("ahb", "mpll_main2", CCM_CSCR, 9, 4); | ||
103 | clk[ipg] = imx_clk_divider("ipg", "ahb", CCM_CSCR, 8, 1); | ||
104 | } | ||
105 | |||
106 | clk[nfc_div] = imx_clk_divider("nfc_div", "ahb", CCM_PCDR0, 6, 4); | ||
107 | clk[per1_div] = imx_clk_divider("per1_div", "mpll_main2", CCM_PCDR1, 0, 6); | ||
108 | clk[per2_div] = imx_clk_divider("per2_div", "mpll_main2", CCM_PCDR1, 8, 6); | ||
109 | clk[per3_div] = imx_clk_divider("per3_div", "mpll_main2", CCM_PCDR1, 16, 6); | ||
110 | clk[per4_div] = imx_clk_divider("per4_div", "mpll_main2", CCM_PCDR1, 24, 6); | ||
111 | clk[vpu_sel] = imx_clk_mux("vpu_sel", CCM_CSCR, 21, 1, vpu_sel_clks, ARRAY_SIZE(vpu_sel_clks)); | ||
112 | clk[vpu_div] = imx_clk_divider("vpu_div", "vpu_sel", CCM_PCDR0, 10, 3); | ||
113 | clk[usb_div] = imx_clk_divider("usb_div", "spll", CCM_CSCR, 28, 3); | ||
114 | clk[cpu_sel] = imx_clk_mux("cpu_sel", CCM_CSCR, 15, 1, cpu_sel_clks, ARRAY_SIZE(cpu_sel_clks)); | ||
115 | clk[clko_sel] = imx_clk_mux("clko_sel", CCM_CCSR, 0, 5, clko_sel_clks, ARRAY_SIZE(clko_sel_clks)); | ||
116 | if (mx27_revision() >= IMX_CHIP_REVISION_2_0) | ||
117 | clk[cpu_div] = imx_clk_divider("cpu_div", "cpu_sel", CCM_CSCR, 12, 2); | ||
118 | else | ||
119 | clk[cpu_div] = imx_clk_divider("cpu_div", "cpu_sel", CCM_CSCR, 13, 3); | ||
120 | clk[clko_div] = imx_clk_divider("clko_div", "clko_sel", CCM_PCDR0, 22, 3); | ||
121 | clk[ssi1_sel] = imx_clk_mux("ssi1_sel", CCM_CSCR, 22, 1, ssi_sel_clks, ARRAY_SIZE(ssi_sel_clks)); | ||
122 | clk[ssi2_sel] = imx_clk_mux("ssi2_sel", CCM_CSCR, 23, 1, ssi_sel_clks, ARRAY_SIZE(ssi_sel_clks)); | ||
123 | clk[ssi1_div] = imx_clk_divider("ssi1_div", "ssi1_sel", CCM_PCDR0, 16, 6); | ||
124 | clk[ssi2_div] = imx_clk_divider("ssi2_div", "ssi2_sel", CCM_PCDR0, 26, 3); | ||
125 | clk[clko_en] = imx_clk_gate("clko_en", "clko_div", CCM_PCCR0, 0); | ||
126 | clk[ssi2_ipg_gate] = imx_clk_gate("ssi2_ipg_gate", "ipg", CCM_PCCR0, 0); | ||
127 | clk[ssi1_ipg_gate] = imx_clk_gate("ssi1_ipg_gate", "ipg", CCM_PCCR0, 1); | ||
128 | clk[slcdc_ipg_gate] = imx_clk_gate("slcdc_ipg_gate", "ipg", CCM_PCCR0, 2); | ||
129 | clk[sdhc3_ipg_gate] = imx_clk_gate("sdhc3_ipg_gate", "ipg", CCM_PCCR0, 3); | ||
130 | clk[sdhc2_ipg_gate] = imx_clk_gate("sdhc2_ipg_gate", "ipg", CCM_PCCR0, 4); | ||
131 | clk[sdhc1_ipg_gate] = imx_clk_gate("sdhc1_ipg_gate", "ipg", CCM_PCCR0, 5); | ||
132 | clk[scc_ipg_gate] = imx_clk_gate("scc_ipg_gate", "ipg", CCM_PCCR0, 6); | ||
133 | clk[sahara_ipg_gate] = imx_clk_gate("sahara_ipg_gate", "ipg", CCM_PCCR0, 7); | ||
134 | clk[rtc_ipg_gate] = imx_clk_gate("rtc_ipg_gate", "ipg", CCM_PCCR0, 9); | ||
135 | clk[pwm_ipg_gate] = imx_clk_gate("pwm_ipg_gate", "ipg", CCM_PCCR0, 11); | ||
136 | clk[owire_ipg_gate] = imx_clk_gate("owire_ipg_gate", "ipg", CCM_PCCR0, 12); | ||
137 | clk[lcdc_ipg_gate] = imx_clk_gate("lcdc_ipg_gate", "ipg", CCM_PCCR0, 14); | ||
138 | clk[kpp_ipg_gate] = imx_clk_gate("kpp_ipg_gate", "ipg", CCM_PCCR0, 15); | ||
139 | clk[iim_ipg_gate] = imx_clk_gate("iim_ipg_gate", "ipg", CCM_PCCR0, 16); | ||
140 | clk[i2c2_ipg_gate] = imx_clk_gate("i2c2_ipg_gate", "ipg", CCM_PCCR0, 17); | ||
141 | clk[i2c1_ipg_gate] = imx_clk_gate("i2c1_ipg_gate", "ipg", CCM_PCCR0, 18); | ||
142 | clk[gpt6_ipg_gate] = imx_clk_gate("gpt6_ipg_gate", "ipg", CCM_PCCR0, 19); | ||
143 | clk[gpt5_ipg_gate] = imx_clk_gate("gpt5_ipg_gate", "ipg", CCM_PCCR0, 20); | ||
144 | clk[gpt4_ipg_gate] = imx_clk_gate("gpt4_ipg_gate", "ipg", CCM_PCCR0, 21); | ||
145 | clk[gpt3_ipg_gate] = imx_clk_gate("gpt3_ipg_gate", "ipg", CCM_PCCR0, 22); | ||
146 | clk[gpt2_ipg_gate] = imx_clk_gate("gpt2_ipg_gate", "ipg", CCM_PCCR0, 23); | ||
147 | clk[gpt1_ipg_gate] = imx_clk_gate("gpt1_ipg_gate", "ipg", CCM_PCCR0, 24); | ||
148 | clk[gpio_ipg_gate] = imx_clk_gate("gpio_ipg_gate", "ipg", CCM_PCCR0, 25); | ||
149 | clk[fec_ipg_gate] = imx_clk_gate("fec_ipg_gate", "ipg", CCM_PCCR0, 26); | ||
150 | clk[emma_ipg_gate] = imx_clk_gate("emma_ipg_gate", "ipg", CCM_PCCR0, 27); | ||
151 | clk[dma_ipg_gate] = imx_clk_gate("dma_ipg_gate", "ipg", CCM_PCCR0, 28); | ||
152 | clk[cspi3_ipg_gate] = imx_clk_gate("cspi3_ipg_gate", "ipg", CCM_PCCR0, 29); | ||
153 | clk[cspi2_ipg_gate] = imx_clk_gate("cspi2_ipg_gate", "ipg", CCM_PCCR0, 30); | ||
154 | clk[cspi1_ipg_gate] = imx_clk_gate("cspi1_ipg_gate", "ipg", CCM_PCCR0, 31); | ||
155 | clk[nfc_baud_gate] = imx_clk_gate("nfc_baud_gate", "nfc_div", CCM_PCCR1, 3); | ||
156 | clk[ssi2_baud_gate] = imx_clk_gate("ssi2_baud_gate", "ssi2_div", CCM_PCCR1, 4); | ||
157 | clk[ssi1_baud_gate] = imx_clk_gate("ssi1_baud_gate", "ssi1_div", CCM_PCCR1, 5); | ||
158 | clk[vpu_baud_gate] = imx_clk_gate("vpu_baud_gate", "vpu_div", CCM_PCCR1, 6); | ||
159 | clk[per4_gate] = imx_clk_gate("per4_gate", "per4_div", CCM_PCCR1, 7); | ||
160 | clk[per3_gate] = imx_clk_gate("per3_gate", "per3_div", CCM_PCCR1, 8); | ||
161 | clk[per2_gate] = imx_clk_gate("per2_gate", "per2_div", CCM_PCCR1, 9); | ||
162 | clk[per1_gate] = imx_clk_gate("per1_gate", "per1_div", CCM_PCCR1, 10); | ||
163 | clk[usb_ahb_gate] = imx_clk_gate("usb_ahb_gate", "ahb", CCM_PCCR1, 11); | ||
164 | clk[slcdc_ahb_gate] = imx_clk_gate("slcdc_ahb_gate", "ahb", CCM_PCCR1, 12); | ||
165 | clk[sahara_ahb_gate] = imx_clk_gate("sahara_ahb_gate", "ahb", CCM_PCCR1, 13); | ||
166 | clk[lcdc_ahb_gate] = imx_clk_gate("lcdc_ahb_gate", "ahb", CCM_PCCR1, 15); | ||
167 | clk[vpu_ahb_gate] = imx_clk_gate("vpu_ahb_gate", "ahb", CCM_PCCR1, 16); | ||
168 | clk[fec_ahb_gate] = imx_clk_gate("fec_ahb_gate", "ahb", CCM_PCCR1, 17); | ||
169 | clk[emma_ahb_gate] = imx_clk_gate("emma_ahb_gate", "ahb", CCM_PCCR1, 18); | ||
170 | clk[emi_ahb_gate] = imx_clk_gate("emi_ahb_gate", "ahb", CCM_PCCR1, 19); | ||
171 | clk[dma_ahb_gate] = imx_clk_gate("dma_ahb_gate", "ahb", CCM_PCCR1, 20); | ||
172 | clk[csi_ahb_gate] = imx_clk_gate("csi_ahb_gate", "ahb", CCM_PCCR1, 21); | ||
173 | clk[brom_ahb_gate] = imx_clk_gate("brom_ahb_gate", "ahb", CCM_PCCR1, 22); | ||
174 | clk[ata_ahb_gate] = imx_clk_gate("ata_ahb_gate", "ahb", CCM_PCCR1, 23); | ||
175 | clk[wdog_ipg_gate] = imx_clk_gate("wdog_ipg_gate", "ipg", CCM_PCCR1, 24); | ||
176 | clk[usb_ipg_gate] = imx_clk_gate("usb_ipg_gate", "ipg", CCM_PCCR1, 25); | ||
177 | clk[uart6_ipg_gate] = imx_clk_gate("uart6_ipg_gate", "ipg", CCM_PCCR1, 26); | ||
178 | clk[uart5_ipg_gate] = imx_clk_gate("uart5_ipg_gate", "ipg", CCM_PCCR1, 27); | ||
179 | clk[uart4_ipg_gate] = imx_clk_gate("uart4_ipg_gate", "ipg", CCM_PCCR1, 28); | ||
180 | clk[uart3_ipg_gate] = imx_clk_gate("uart3_ipg_gate", "ipg", CCM_PCCR1, 29); | ||
181 | clk[uart2_ipg_gate] = imx_clk_gate("uart2_ipg_gate", "ipg", CCM_PCCR1, 30); | ||
182 | clk[uart1_ipg_gate] = imx_clk_gate("uart1_ipg_gate", "ipg", CCM_PCCR1, 31); | ||
183 | |||
184 | for (i = 0; i < ARRAY_SIZE(clk); i++) | ||
185 | if (IS_ERR(clk[i])) | ||
186 | pr_err("i.MX27 clk %d: register failed with %ld\n", | ||
187 | i, PTR_ERR(clk[i])); | ||
188 | |||
189 | clk_register_clkdev(clk[uart1_ipg_gate], "ipg", "imx21-uart.0"); | ||
190 | clk_register_clkdev(clk[per1_gate], "per", "imx21-uart.0"); | ||
191 | clk_register_clkdev(clk[uart2_ipg_gate], "ipg", "imx21-uart.1"); | ||
192 | clk_register_clkdev(clk[per1_gate], "per", "imx21-uart.1"); | ||
193 | clk_register_clkdev(clk[uart3_ipg_gate], "ipg", "imx21-uart.2"); | ||
194 | clk_register_clkdev(clk[per1_gate], "per", "imx21-uart.2"); | ||
195 | clk_register_clkdev(clk[uart4_ipg_gate], "ipg", "imx21-uart.3"); | ||
196 | clk_register_clkdev(clk[per1_gate], "per", "imx21-uart.3"); | ||
197 | clk_register_clkdev(clk[uart5_ipg_gate], "ipg", "imx21-uart.4"); | ||
198 | clk_register_clkdev(clk[per1_gate], "per", "imx21-uart.4"); | ||
199 | clk_register_clkdev(clk[uart6_ipg_gate], "ipg", "imx21-uart.5"); | ||
200 | clk_register_clkdev(clk[per1_gate], "per", "imx21-uart.5"); | ||
201 | clk_register_clkdev(clk[gpt1_ipg_gate], "ipg", "imx-gpt.0"); | ||
202 | clk_register_clkdev(clk[per1_gate], "per", "imx-gpt.0"); | ||
203 | clk_register_clkdev(clk[gpt2_ipg_gate], "ipg", "imx-gpt.1"); | ||
204 | clk_register_clkdev(clk[per1_gate], "per", "imx-gpt.1"); | ||
205 | clk_register_clkdev(clk[gpt3_ipg_gate], "ipg", "imx-gpt.2"); | ||
206 | clk_register_clkdev(clk[per1_gate], "per", "imx-gpt.2"); | ||
207 | clk_register_clkdev(clk[gpt4_ipg_gate], "ipg", "imx-gpt.3"); | ||
208 | clk_register_clkdev(clk[per1_gate], "per", "imx-gpt.3"); | ||
209 | clk_register_clkdev(clk[gpt5_ipg_gate], "ipg", "imx-gpt.4"); | ||
210 | clk_register_clkdev(clk[per1_gate], "per", "imx-gpt.4"); | ||
211 | clk_register_clkdev(clk[gpt6_ipg_gate], "ipg", "imx-gpt.5"); | ||
212 | clk_register_clkdev(clk[per1_gate], "per", "imx-gpt.5"); | ||
213 | clk_register_clkdev(clk[pwm_ipg_gate], NULL, "mxc_pwm.0"); | ||
214 | clk_register_clkdev(clk[per2_gate], "per", "mxc-mmc.0"); | ||
215 | clk_register_clkdev(clk[sdhc1_ipg_gate], "ipg", "mxc-mmc.0"); | ||
216 | clk_register_clkdev(clk[per2_gate], "per", "mxc-mmc.1"); | ||
217 | clk_register_clkdev(clk[sdhc2_ipg_gate], "ipg", "mxc-mmc.1"); | ||
218 | clk_register_clkdev(clk[per2_gate], "per", "mxc-mmc.2"); | ||
219 | clk_register_clkdev(clk[sdhc2_ipg_gate], "ipg", "mxc-mmc.2"); | ||
220 | clk_register_clkdev(clk[cspi1_ipg_gate], NULL, "imx27-cspi.0"); | ||
221 | clk_register_clkdev(clk[cspi2_ipg_gate], NULL, "imx27-cspi.1"); | ||
222 | clk_register_clkdev(clk[cspi3_ipg_gate], NULL, "imx27-cspi.2"); | ||
223 | clk_register_clkdev(clk[per3_gate], "per", "imx-fb.0"); | ||
224 | clk_register_clkdev(clk[lcdc_ipg_gate], "ipg", "imx-fb.0"); | ||
225 | clk_register_clkdev(clk[lcdc_ahb_gate], "ahb", "imx-fb.0"); | ||
226 | clk_register_clkdev(clk[csi_ahb_gate], NULL, "mx2-camera.0"); | ||
227 | clk_register_clkdev(clk[usb_div], "per", "fsl-usb2-udc"); | ||
228 | clk_register_clkdev(clk[usb_ipg_gate], "ipg", "fsl-usb2-udc"); | ||
229 | clk_register_clkdev(clk[usb_ahb_gate], "ahb", "fsl-usb2-udc"); | ||
230 | clk_register_clkdev(clk[usb_div], "per", "mxc-ehci.0"); | ||
231 | clk_register_clkdev(clk[usb_ipg_gate], "ipg", "mxc-ehci.0"); | ||
232 | clk_register_clkdev(clk[usb_ahb_gate], "ahb", "mxc-ehci.0"); | ||
233 | clk_register_clkdev(clk[usb_div], "per", "mxc-ehci.1"); | ||
234 | clk_register_clkdev(clk[usb_ipg_gate], "ipg", "mxc-ehci.1"); | ||
235 | clk_register_clkdev(clk[usb_ahb_gate], "ahb", "mxc-ehci.1"); | ||
236 | clk_register_clkdev(clk[usb_div], "per", "mxc-ehci.2"); | ||
237 | clk_register_clkdev(clk[usb_ipg_gate], "ipg", "mxc-ehci.2"); | ||
238 | clk_register_clkdev(clk[usb_ahb_gate], "ahb", "mxc-ehci.2"); | ||
239 | clk_register_clkdev(clk[ssi1_ipg_gate], NULL, "imx-ssi.0"); | ||
240 | clk_register_clkdev(clk[ssi2_ipg_gate], NULL, "imx-ssi.1"); | ||
241 | clk_register_clkdev(clk[nfc_baud_gate], NULL, "mxc_nand.0"); | ||
242 | clk_register_clkdev(clk[vpu_baud_gate], "per", "imx-vpu"); | ||
243 | clk_register_clkdev(clk[vpu_ahb_gate], "ahb", "imx-vpu"); | ||
244 | clk_register_clkdev(clk[dma_ahb_gate], "ahb", "imx-dma"); | ||
245 | clk_register_clkdev(clk[dma_ipg_gate], "ipg", "imx-dma"); | ||
246 | clk_register_clkdev(clk[fec_ipg_gate], "ipg", "imx27-fec.0"); | ||
247 | clk_register_clkdev(clk[fec_ahb_gate], "ahb", "imx27-fec.0"); | ||
248 | clk_register_clkdev(clk[wdog_ipg_gate], NULL, "imx2-wdt.0"); | ||
249 | clk_register_clkdev(clk[i2c1_ipg_gate], NULL, "imx-i2c.0"); | ||
250 | clk_register_clkdev(clk[i2c2_ipg_gate], NULL, "imx-i2c.1"); | ||
251 | clk_register_clkdev(clk[owire_ipg_gate], NULL, "mxc_w1.0"); | ||
252 | clk_register_clkdev(clk[kpp_ipg_gate], NULL, "imx-keypad"); | ||
253 | clk_register_clkdev(clk[emma_ahb_gate], "ahb", "imx-emma"); | ||
254 | clk_register_clkdev(clk[emma_ipg_gate], "ipg", "imx-emma"); | ||
255 | clk_register_clkdev(clk[iim_ipg_gate], "iim", NULL); | ||
256 | clk_register_clkdev(clk[gpio_ipg_gate], "gpio", NULL); | ||
257 | clk_register_clkdev(clk[brom_ahb_gate], "brom", NULL); | ||
258 | clk_register_clkdev(clk[ata_ahb_gate], "ata", NULL); | ||
259 | clk_register_clkdev(clk[rtc_ipg_gate], "rtc", NULL); | ||
260 | clk_register_clkdev(clk[scc_ipg_gate], "scc", NULL); | ||
261 | clk_register_clkdev(clk[cpu_div], "cpu", NULL); | ||
262 | clk_register_clkdev(clk[emi_ahb_gate], "emi_ahb" , NULL); | ||
263 | clk_register_clkdev(clk[ssi1_baud_gate], "bitrate" , "imx-ssi.0"); | ||
264 | clk_register_clkdev(clk[ssi2_baud_gate], "bitrate" , "imx-ssi.1"); | ||
265 | |||
266 | mxc_timer_init(NULL, MX27_IO_ADDRESS(MX27_GPT1_BASE_ADDR), | ||
267 | MX27_INT_GPT1); | ||
268 | |||
269 | clk_prepare_enable(clk[emi_ahb_gate]); | ||
270 | |||
271 | return 0; | ||
272 | } | ||
273 | |||
274 | #ifdef CONFIG_OF | ||
275 | int __init mx27_clocks_init_dt(void) | ||
276 | { | ||
277 | struct device_node *np; | ||
278 | u32 fref = 26000000; /* default */ | ||
279 | |||
280 | for_each_compatible_node(np, NULL, "fixed-clock") { | ||
281 | if (!of_device_is_compatible(np, "fsl,imx-osc26m")) | ||
282 | continue; | ||
283 | |||
284 | if (!of_property_read_u32(np, "clock-frequency", &fref)) | ||
285 | break; | ||
286 | } | ||
287 | |||
288 | return mx27_clocks_init(fref); | ||
289 | } | ||
290 | #endif | ||
diff --git a/arch/arm/mach-imx/clk-imx31.c b/arch/arm/mach-imx/clk-imx31.c new file mode 100644 index 000000000000..a854b9cae5ea --- /dev/null +++ b/arch/arm/mach-imx/clk-imx31.c | |||
@@ -0,0 +1,182 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2012 Sascha Hauer <kernel@pengutronix.de> | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or | ||
5 | * modify it under the terms of the GNU General Public License | ||
6 | * as published by the Free Software Foundation; either version 2 | ||
7 | * of the License, or (at your option) any later version. | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License | ||
14 | * along with this program; if not, write to the Free Software | ||
15 | * Foundation. | ||
16 | */ | ||
17 | |||
18 | #include <linux/module.h> | ||
19 | #include <linux/clk.h> | ||
20 | #include <linux/clkdev.h> | ||
21 | #include <linux/io.h> | ||
22 | #include <linux/err.h> | ||
23 | |||
24 | #include <mach/hardware.h> | ||
25 | #include <mach/mx31.h> | ||
26 | #include <mach/common.h> | ||
27 | |||
28 | #include "clk.h" | ||
29 | #include "crmregs-imx3.h" | ||
30 | |||
31 | static const char *mcu_main_sel[] = { "spll", "mpll", }; | ||
32 | static const char *per_sel[] = { "per_div", "ipg", }; | ||
33 | static const char *csi_sel[] = { "upll", "spll", }; | ||
34 | static const char *fir_sel[] = { "mcu_main", "upll", "spll" }; | ||
35 | |||
36 | enum mx31_clks { | ||
37 | ckih, ckil, mpll, spll, upll, mcu_main, hsp, ahb, nfc, ipg, per_div, | ||
38 | per, csi, fir, csi_div, usb_div_pre, usb_div_post, fir_div_pre, | ||
39 | fir_div_post, sdhc1_gate, sdhc2_gate, gpt_gate, epit1_gate, epit2_gate, | ||
40 | iim_gate, ata_gate, sdma_gate, cspi3_gate, rng_gate, uart1_gate, | ||
41 | uart2_gate, ssi1_gate, i2c1_gate, i2c2_gate, i2c3_gate, hantro_gate, | ||
42 | mstick1_gate, mstick2_gate, csi_gate, rtc_gate, wdog_gate, pwm_gate, | ||
43 | sim_gate, ect_gate, usb_gate, kpp_gate, ipu_gate, uart3_gate, | ||
44 | uart4_gate, uart5_gate, owire_gate, ssi2_gate, cspi1_gate, cspi2_gate, | ||
45 | gacc_gate, emi_gate, rtic_gate, firi_gate, clk_max | ||
46 | }; | ||
47 | |||
48 | static struct clk *clk[clk_max]; | ||
49 | |||
50 | int __init mx31_clocks_init(unsigned long fref) | ||
51 | { | ||
52 | void __iomem *base = MX31_IO_ADDRESS(MX31_CCM_BASE_ADDR); | ||
53 | int i; | ||
54 | |||
55 | clk[ckih] = imx_clk_fixed("ckih", fref); | ||
56 | clk[ckil] = imx_clk_fixed("ckil", 32768); | ||
57 | clk[mpll] = imx_clk_pllv1("mpll", "ckih", base + MXC_CCM_MPCTL); | ||
58 | clk[spll] = imx_clk_pllv1("spll", "ckih", base + MXC_CCM_SRPCTL); | ||
59 | clk[upll] = imx_clk_pllv1("upll", "ckih", base + MXC_CCM_UPCTL); | ||
60 | clk[mcu_main] = imx_clk_mux("mcu_main", base + MXC_CCM_PMCR0, 31, 1, mcu_main_sel, ARRAY_SIZE(mcu_main_sel)); | ||
61 | clk[hsp] = imx_clk_divider("hsp", "mcu_main", base + MXC_CCM_PDR0, 11, 3); | ||
62 | clk[ahb] = imx_clk_divider("ahb", "mcu_main", base + MXC_CCM_PDR0, 3, 3); | ||
63 | clk[nfc] = imx_clk_divider("nfc", "ahb", base + MXC_CCM_PDR0, 8, 3); | ||
64 | clk[ipg] = imx_clk_divider("ipg", "ahb", base + MXC_CCM_PDR0, 6, 2); | ||
65 | clk[per_div] = imx_clk_divider("per_div", "upll", base + MXC_CCM_PDR0, 16, 5); | ||
66 | clk[per] = imx_clk_mux("per", base + MXC_CCM_CCMR, 24, 1, per_sel, ARRAY_SIZE(per_sel)); | ||
67 | clk[csi] = imx_clk_mux("csi_sel", base + MXC_CCM_CCMR, 25, 1, csi_sel, ARRAY_SIZE(csi_sel)); | ||
68 | clk[fir] = imx_clk_mux("fir_sel", base + MXC_CCM_CCMR, 11, 2, fir_sel, ARRAY_SIZE(fir_sel)); | ||
69 | clk[csi_div] = imx_clk_divider("csi_div", "csi_sel", base + MXC_CCM_PDR0, 23, 9); | ||
70 | clk[usb_div_pre] = imx_clk_divider("usb_div_pre", "upll", base + MXC_CCM_PDR1, 30, 2); | ||
71 | clk[usb_div_post] = imx_clk_divider("usb_div_post", "usb_div_pre", base + MXC_CCM_PDR1, 27, 3); | ||
72 | clk[fir_div_pre] = imx_clk_divider("fir_div_pre", "fir_sel", base + MXC_CCM_PDR1, 24, 3); | ||
73 | clk[fir_div_post] = imx_clk_divider("fir_div_post", "fir_div_pre", base + MXC_CCM_PDR1, 23, 6); | ||
74 | clk[sdhc1_gate] = imx_clk_gate2("sdhc1_gate", "per", base + MXC_CCM_CGR0, 0); | ||
75 | clk[sdhc2_gate] = imx_clk_gate2("sdhc2_gate", "per", base + MXC_CCM_CGR0, 2); | ||
76 | clk[gpt_gate] = imx_clk_gate2("gpt_gate", "per", base + MXC_CCM_CGR0, 4); | ||
77 | clk[epit1_gate] = imx_clk_gate2("epit1_gate", "per", base + MXC_CCM_CGR0, 6); | ||
78 | clk[epit2_gate] = imx_clk_gate2("epit2_gate", "per", base + MXC_CCM_CGR0, 8); | ||
79 | clk[iim_gate] = imx_clk_gate2("iim_gate", "ipg", base + MXC_CCM_CGR0, 10); | ||
80 | clk[ata_gate] = imx_clk_gate2("ata_gate", "ipg", base + MXC_CCM_CGR0, 12); | ||
81 | clk[sdma_gate] = imx_clk_gate2("sdma_gate", "ahb", base + MXC_CCM_CGR0, 14); | ||
82 | clk[cspi3_gate] = imx_clk_gate2("cspi3_gate", "ipg", base + MXC_CCM_CGR0, 16); | ||
83 | clk[rng_gate] = imx_clk_gate2("rng_gate", "ipg", base + MXC_CCM_CGR0, 18); | ||
84 | clk[uart1_gate] = imx_clk_gate2("uart1_gate", "per", base + MXC_CCM_CGR0, 20); | ||
85 | clk[uart2_gate] = imx_clk_gate2("uart2_gate", "per", base + MXC_CCM_CGR0, 22); | ||
86 | clk[ssi1_gate] = imx_clk_gate2("ssi1_gate", "spll", base + MXC_CCM_CGR0, 24); | ||
87 | clk[i2c1_gate] = imx_clk_gate2("i2c1_gate", "per", base + MXC_CCM_CGR0, 26); | ||
88 | clk[i2c2_gate] = imx_clk_gate2("i2c2_gate", "per", base + MXC_CCM_CGR0, 28); | ||
89 | clk[i2c3_gate] = imx_clk_gate2("i2c3_gate", "per", base + MXC_CCM_CGR0, 30); | ||
90 | clk[hantro_gate] = imx_clk_gate2("hantro_gate", "per", base + MXC_CCM_CGR1, 0); | ||
91 | clk[mstick1_gate] = imx_clk_gate2("mstick1_gate", "per", base + MXC_CCM_CGR1, 2); | ||
92 | clk[mstick2_gate] = imx_clk_gate2("mstick2_gate", "per", base + MXC_CCM_CGR1, 4); | ||
93 | clk[csi_gate] = imx_clk_gate2("csi_gate", "csi_div", base + MXC_CCM_CGR1, 6); | ||
94 | clk[rtc_gate] = imx_clk_gate2("rtc_gate", "ipg", base + MXC_CCM_CGR1, 8); | ||
95 | clk[wdog_gate] = imx_clk_gate2("wdog_gate", "ipg", base + MXC_CCM_CGR1, 10); | ||
96 | clk[pwm_gate] = imx_clk_gate2("pwm_gate", "per", base + MXC_CCM_CGR1, 12); | ||
97 | clk[sim_gate] = imx_clk_gate2("sim_gate", "per", base + MXC_CCM_CGR1, 14); | ||
98 | clk[ect_gate] = imx_clk_gate2("ect_gate", "per", base + MXC_CCM_CGR1, 16); | ||
99 | clk[usb_gate] = imx_clk_gate2("usb_gate", "ahb", base + MXC_CCM_CGR1, 18); | ||
100 | clk[kpp_gate] = imx_clk_gate2("kpp_gate", "ipg", base + MXC_CCM_CGR1, 20); | ||
101 | clk[ipu_gate] = imx_clk_gate2("ipu_gate", "hsp", base + MXC_CCM_CGR1, 22); | ||
102 | clk[uart3_gate] = imx_clk_gate2("uart3_gate", "per", base + MXC_CCM_CGR1, 24); | ||
103 | clk[uart4_gate] = imx_clk_gate2("uart4_gate", "per", base + MXC_CCM_CGR1, 26); | ||
104 | clk[uart5_gate] = imx_clk_gate2("uart5_gate", "per", base + MXC_CCM_CGR1, 28); | ||
105 | clk[owire_gate] = imx_clk_gate2("owire_gate", "per", base + MXC_CCM_CGR1, 30); | ||
106 | clk[ssi2_gate] = imx_clk_gate2("ssi2_gate", "spll", base + MXC_CCM_CGR2, 0); | ||
107 | clk[cspi1_gate] = imx_clk_gate2("cspi1_gate", "ipg", base + MXC_CCM_CGR2, 2); | ||
108 | clk[cspi2_gate] = imx_clk_gate2("cspi2_gate", "ipg", base + MXC_CCM_CGR2, 4); | ||
109 | clk[gacc_gate] = imx_clk_gate2("gacc_gate", "per", base + MXC_CCM_CGR2, 6); | ||
110 | clk[emi_gate] = imx_clk_gate2("emi_gate", "ahb", base + MXC_CCM_CGR2, 8); | ||
111 | clk[rtic_gate] = imx_clk_gate2("rtic_gate", "ahb", base + MXC_CCM_CGR2, 10); | ||
112 | clk[firi_gate] = imx_clk_gate2("firi_gate", "upll", base+MXC_CCM_CGR2, 12); | ||
113 | |||
114 | for (i = 0; i < ARRAY_SIZE(clk); i++) | ||
115 | if (IS_ERR(clk[i])) | ||
116 | pr_err("imx31 clk %d: register failed with %ld\n", | ||
117 | i, PTR_ERR(clk[i])); | ||
118 | |||
119 | clk_register_clkdev(clk[gpt_gate], "per", "imx-gpt.0"); | ||
120 | clk_register_clkdev(clk[ipg], "ipg", "imx-gpt.0"); | ||
121 | clk_register_clkdev(clk[cspi1_gate], NULL, "imx31-cspi.0"); | ||
122 | clk_register_clkdev(clk[cspi2_gate], NULL, "imx31-cspi.1"); | ||
123 | clk_register_clkdev(clk[cspi3_gate], NULL, "imx31-cspi.2"); | ||
124 | clk_register_clkdev(clk[pwm_gate], "pwm", NULL); | ||
125 | clk_register_clkdev(clk[wdog_gate], NULL, "imx2-wdt.0"); | ||
126 | clk_register_clkdev(clk[rtc_gate], "rtc", NULL); | ||
127 | clk_register_clkdev(clk[epit1_gate], "epit", NULL); | ||
128 | clk_register_clkdev(clk[epit2_gate], "epit", NULL); | ||
129 | clk_register_clkdev(clk[nfc], NULL, "mxc_nand.0"); | ||
130 | clk_register_clkdev(clk[ipu_gate], NULL, "ipu-core"); | ||
131 | clk_register_clkdev(clk[ipu_gate], NULL, "mx3_sdc_fb"); | ||
132 | clk_register_clkdev(clk[kpp_gate], "kpp", NULL); | ||
133 | clk_register_clkdev(clk[usb_div_post], "per", "mxc-ehci.0"); | ||
134 | clk_register_clkdev(clk[usb_gate], "ahb", "mxc-ehci.0"); | ||
135 | clk_register_clkdev(clk[ipg], "ipg", "mxc-ehci.0"); | ||
136 | clk_register_clkdev(clk[usb_div_post], "per", "mxc-ehci.1"); | ||
137 | clk_register_clkdev(clk[usb_gate], "ahb", "mxc-ehci.1"); | ||
138 | clk_register_clkdev(clk[ipg], "ipg", "mxc-ehci.1"); | ||
139 | clk_register_clkdev(clk[usb_div_post], "per", "mxc-ehci.2"); | ||
140 | clk_register_clkdev(clk[usb_gate], "ahb", "mxc-ehci.2"); | ||
141 | clk_register_clkdev(clk[ipg], "ipg", "mxc-ehci.2"); | ||
142 | clk_register_clkdev(clk[usb_div_post], "per", "fsl-usb2-udc"); | ||
143 | clk_register_clkdev(clk[usb_gate], "ahb", "fsl-usb2-udc"); | ||
144 | clk_register_clkdev(clk[ipg], "ipg", "fsl-usb2-udc"); | ||
145 | clk_register_clkdev(clk[csi_gate], NULL, "mx3-camera.0"); | ||
146 | /* i.mx31 has the i.mx21 type uart */ | ||
147 | clk_register_clkdev(clk[uart1_gate], "per", "imx21-uart.0"); | ||
148 | clk_register_clkdev(clk[ipg], "ipg", "imx21-uart.0"); | ||
149 | clk_register_clkdev(clk[uart2_gate], "per", "imx21-uart.1"); | ||
150 | clk_register_clkdev(clk[ipg], "ipg", "imx21-uart.1"); | ||
151 | clk_register_clkdev(clk[uart3_gate], "per", "imx21-uart.2"); | ||
152 | clk_register_clkdev(clk[ipg], "ipg", "imx21-uart.2"); | ||
153 | clk_register_clkdev(clk[uart4_gate], "per", "imx21-uart.3"); | ||
154 | clk_register_clkdev(clk[ipg], "ipg", "imx21-uart.3"); | ||
155 | clk_register_clkdev(clk[uart5_gate], "per", "imx21-uart.4"); | ||
156 | clk_register_clkdev(clk[ipg], "ipg", "imx21-uart.4"); | ||
157 | clk_register_clkdev(clk[i2c1_gate], NULL, "imx-i2c.0"); | ||
158 | clk_register_clkdev(clk[i2c2_gate], NULL, "imx-i2c.1"); | ||
159 | clk_register_clkdev(clk[i2c3_gate], NULL, "imx-i2c.2"); | ||
160 | clk_register_clkdev(clk[owire_gate], NULL, "mxc_w1.0"); | ||
161 | clk_register_clkdev(clk[sdhc1_gate], NULL, "mxc-mmc.0"); | ||
162 | clk_register_clkdev(clk[sdhc2_gate], NULL, "mxc-mmc.1"); | ||
163 | clk_register_clkdev(clk[ssi1_gate], NULL, "imx-ssi.0"); | ||
164 | clk_register_clkdev(clk[ssi2_gate], NULL, "imx-ssi.1"); | ||
165 | clk_register_clkdev(clk[firi_gate], "firi", NULL); | ||
166 | clk_register_clkdev(clk[ata_gate], NULL, "pata_imx"); | ||
167 | clk_register_clkdev(clk[rtic_gate], "rtic", NULL); | ||
168 | clk_register_clkdev(clk[rng_gate], "rng", NULL); | ||
169 | clk_register_clkdev(clk[sdma_gate], NULL, "imx31-sdma"); | ||
170 | clk_register_clkdev(clk[iim_gate], "iim", NULL); | ||
171 | |||
172 | clk_set_parent(clk[csi], clk[upll]); | ||
173 | clk_prepare_enable(clk[emi_gate]); | ||
174 | clk_prepare_enable(clk[iim_gate]); | ||
175 | mx31_revision(); | ||
176 | clk_disable_unprepare(clk[iim_gate]); | ||
177 | |||
178 | mxc_timer_init(NULL, MX31_IO_ADDRESS(MX31_GPT1_BASE_ADDR), | ||
179 | MX31_INT_GPT); | ||
180 | |||
181 | return 0; | ||
182 | } | ||
diff --git a/arch/arm/mach-imx/clk-imx35.c b/arch/arm/mach-imx/clk-imx35.c new file mode 100644 index 000000000000..a9e60bf7dd75 --- /dev/null +++ b/arch/arm/mach-imx/clk-imx35.c | |||
@@ -0,0 +1,278 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2012 Sascha Hauer, Pengutronix <s.hauer@pengutronix.de> | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License version 2 as | ||
6 | * published by the Free Software Foundation. | ||
7 | * | ||
8 | */ | ||
9 | #include <linux/mm.h> | ||
10 | #include <linux/delay.h> | ||
11 | #include <linux/clk.h> | ||
12 | #include <linux/io.h> | ||
13 | #include <linux/clkdev.h> | ||
14 | #include <linux/of.h> | ||
15 | #include <linux/err.h> | ||
16 | |||
17 | #include <mach/hardware.h> | ||
18 | #include <mach/common.h> | ||
19 | |||
20 | #include "crmregs-imx3.h" | ||
21 | #include "clk.h" | ||
22 | |||
23 | struct arm_ahb_div { | ||
24 | unsigned char arm, ahb, sel; | ||
25 | }; | ||
26 | |||
27 | static struct arm_ahb_div clk_consumer[] = { | ||
28 | { .arm = 1, .ahb = 4, .sel = 0}, | ||
29 | { .arm = 1, .ahb = 3, .sel = 1}, | ||
30 | { .arm = 2, .ahb = 2, .sel = 0}, | ||
31 | { .arm = 0, .ahb = 0, .sel = 0}, | ||
32 | { .arm = 0, .ahb = 0, .sel = 0}, | ||
33 | { .arm = 0, .ahb = 0, .sel = 0}, | ||
34 | { .arm = 4, .ahb = 1, .sel = 0}, | ||
35 | { .arm = 1, .ahb = 5, .sel = 0}, | ||
36 | { .arm = 1, .ahb = 8, .sel = 0}, | ||
37 | { .arm = 1, .ahb = 6, .sel = 1}, | ||
38 | { .arm = 2, .ahb = 4, .sel = 0}, | ||
39 | { .arm = 0, .ahb = 0, .sel = 0}, | ||
40 | { .arm = 0, .ahb = 0, .sel = 0}, | ||
41 | { .arm = 0, .ahb = 0, .sel = 0}, | ||
42 | { .arm = 4, .ahb = 2, .sel = 0}, | ||
43 | { .arm = 0, .ahb = 0, .sel = 0}, | ||
44 | }; | ||
45 | |||
46 | static char hsp_div_532[] = { 4, 8, 3, 0 }; | ||
47 | static char hsp_div_400[] = { 3, 6, 3, 0 }; | ||
48 | |||
49 | static const char *std_sel[] = {"ppll", "arm"}; | ||
50 | static const char *ipg_per_sel[] = {"ahb_per_div", "arm_per_div"}; | ||
51 | |||
52 | enum mx35_clks { | ||
53 | ckih, mpll, ppll, mpll_075, arm, hsp, hsp_div, hsp_sel, ahb, ipg, | ||
54 | arm_per_div, ahb_per_div, ipg_per, uart_sel, uart_div, esdhc_sel, | ||
55 | esdhc1_div, esdhc2_div, esdhc3_div, spdif_sel, spdif_div_pre, | ||
56 | spdif_div_post, ssi_sel, ssi1_div_pre, ssi1_div_post, ssi2_div_pre, | ||
57 | ssi2_div_post, usb_sel, usb_div, nfc_div, asrc_gate, pata_gate, | ||
58 | audmux_gate, can1_gate, can2_gate, cspi1_gate, cspi2_gate, ect_gate, | ||
59 | edio_gate, emi_gate, epit1_gate, epit2_gate, esai_gate, esdhc1_gate, | ||
60 | esdhc2_gate, esdhc3_gate, fec_gate, gpio1_gate, gpio2_gate, gpio3_gate, | ||
61 | gpt_gate, i2c1_gate, i2c2_gate, i2c3_gate, iomuxc_gate, ipu_gate, | ||
62 | kpp_gate, mlb_gate, mshc_gate, owire_gate, pwm_gate, rngc_gate, | ||
63 | rtc_gate, rtic_gate, scc_gate, sdma_gate, spba_gate, spdif_gate, | ||
64 | ssi1_gate, ssi2_gate, uart1_gate, uart2_gate, uart3_gate, usbotg_gate, | ||
65 | wdog_gate, max_gate, admux_gate, csi_gate, iim_gate, gpu2d_gate, | ||
66 | clk_max | ||
67 | }; | ||
68 | |||
69 | static struct clk *clk[clk_max]; | ||
70 | |||
71 | int __init mx35_clocks_init() | ||
72 | { | ||
73 | void __iomem *base = MX35_IO_ADDRESS(MX35_CCM_BASE_ADDR); | ||
74 | u32 pdr0, consumer_sel, hsp_sel; | ||
75 | struct arm_ahb_div *aad; | ||
76 | unsigned char *hsp_div; | ||
77 | int i; | ||
78 | |||
79 | pdr0 = __raw_readl(base + MXC_CCM_PDR0); | ||
80 | consumer_sel = (pdr0 >> 16) & 0xf; | ||
81 | aad = &clk_consumer[consumer_sel]; | ||
82 | if (!aad->arm) { | ||
83 | pr_err("i.MX35 clk: illegal consumer mux selection 0x%x\n", consumer_sel); | ||
84 | /* | ||
85 | * We are basically stuck. Continue with a default entry and hope we | ||
86 | * get far enough to actually show the above message | ||
87 | */ | ||
88 | aad = &clk_consumer[0]; | ||
89 | } | ||
90 | |||
91 | clk[ckih] = imx_clk_fixed("ckih", 24000000); | ||
92 | clk[mpll] = imx_clk_pllv1("mpll", "ckih", base + MX35_CCM_MPCTL); | ||
93 | clk[ppll] = imx_clk_pllv1("ppll", "ckih", base + MX35_CCM_PPCTL); | ||
94 | |||
95 | clk[mpll] = imx_clk_fixed_factor("mpll_075", "mpll", 3, 4); | ||
96 | |||
97 | if (aad->sel) | ||
98 | clk[arm] = imx_clk_fixed_factor("arm", "mpll_075", 1, aad->arm); | ||
99 | else | ||
100 | clk[arm] = imx_clk_fixed_factor("arm", "mpll", 1, aad->arm); | ||
101 | |||
102 | if (clk_get_rate(clk[arm]) > 400000000) | ||
103 | hsp_div = hsp_div_532; | ||
104 | else | ||
105 | hsp_div = hsp_div_400; | ||
106 | |||
107 | hsp_sel = (pdr0 >> 20) & 0x3; | ||
108 | if (!hsp_div[hsp_sel]) { | ||
109 | pr_err("i.MX35 clk: illegal hsp clk selection 0x%x\n", hsp_sel); | ||
110 | hsp_sel = 0; | ||
111 | } | ||
112 | |||
113 | clk[hsp] = imx_clk_fixed_factor("hsp", "arm", 1, hsp_div[hsp_sel]); | ||
114 | |||
115 | clk[ahb] = imx_clk_fixed_factor("ahb", "arm", 1, aad->ahb); | ||
116 | clk[ipg] = imx_clk_fixed_factor("ipg", "ahb", 1, 2); | ||
117 | |||
118 | clk[arm_per_div] = imx_clk_divider("arm_per_div", "arm", base + MX35_CCM_PDR4, 16, 6); | ||
119 | clk[ahb_per_div] = imx_clk_divider("ahb_per_div", "ahb", base + MXC_CCM_PDR0, 12, 3); | ||
120 | clk[ipg_per] = imx_clk_mux("ipg_per", base + MXC_CCM_PDR0, 26, 1, ipg_per_sel, ARRAY_SIZE(ipg_per_sel)); | ||
121 | |||
122 | clk[uart_sel] = imx_clk_mux("uart_sel", base + MX35_CCM_PDR3, 14, 1, std_sel, ARRAY_SIZE(std_sel)); | ||
123 | clk[uart_div] = imx_clk_divider("uart_div", "uart_sel", base + MX35_CCM_PDR4, 10, 6); | ||
124 | |||
125 | clk[esdhc_sel] = imx_clk_mux("esdhc_sel", base + MX35_CCM_PDR4, 9, 1, std_sel, ARRAY_SIZE(std_sel)); | ||
126 | clk[esdhc1_div] = imx_clk_divider("esdhc1_div", "esdhc_sel", base + MX35_CCM_PDR3, 0, 6); | ||
127 | clk[esdhc2_div] = imx_clk_divider("esdhc2_div", "esdhc_sel", base + MX35_CCM_PDR3, 8, 6); | ||
128 | clk[esdhc3_div] = imx_clk_divider("esdhc3_div", "esdhc_sel", base + MX35_CCM_PDR3, 16, 6); | ||
129 | |||
130 | clk[spdif_sel] = imx_clk_mux("spdif_sel", base + MX35_CCM_PDR3, 22, 1, std_sel, ARRAY_SIZE(std_sel)); | ||
131 | clk[spdif_div_pre] = imx_clk_divider("spdif_div_pre", "spdif_sel", base + MX35_CCM_PDR3, 29, 3); /* divide by 1 not allowed */ | ||
132 | clk[spdif_div_post] = imx_clk_divider("spdif_div_post", "spdif_div_pre", base + MX35_CCM_PDR3, 23, 6); | ||
133 | |||
134 | clk[ssi_sel] = imx_clk_mux("ssi_sel", base + MX35_CCM_PDR2, 6, 1, std_sel, ARRAY_SIZE(std_sel)); | ||
135 | clk[ssi1_div_pre] = imx_clk_divider("ssi1_div_pre", "ssi_sel", base + MX35_CCM_PDR2, 24, 3); | ||
136 | clk[ssi1_div_post] = imx_clk_divider("ssi1_div_post", "ssi1_div_pre", base + MX35_CCM_PDR2, 0, 6); | ||
137 | clk[ssi2_div_pre] = imx_clk_divider("ssi2_div_pre", "ssi_sel", base + MX35_CCM_PDR2, 27, 3); | ||
138 | clk[ssi2_div_post] = imx_clk_divider("ssi2_div_post", "ssi2_div_pre", base + MX35_CCM_PDR2, 8, 6); | ||
139 | |||
140 | clk[usb_sel] = imx_clk_mux("usb_sel", base + MX35_CCM_PDR4, 9, 1, std_sel, ARRAY_SIZE(std_sel)); | ||
141 | clk[usb_div] = imx_clk_divider("usb_div", "usb_sel", base + MX35_CCM_PDR4, 22, 6); | ||
142 | |||
143 | clk[nfc_div] = imx_clk_divider("nfc_div", "ahb", base + MX35_CCM_PDR4, 28, 4); | ||
144 | |||
145 | clk[asrc_gate] = imx_clk_gate2("asrc_gate", "ipg", base + MX35_CCM_CGR0, 0); | ||
146 | clk[pata_gate] = imx_clk_gate2("pata_gate", "ipg", base + MX35_CCM_CGR0, 2); | ||
147 | clk[audmux_gate] = imx_clk_gate2("audmux_gate", "ipg", base + MX35_CCM_CGR0, 4); | ||
148 | clk[can1_gate] = imx_clk_gate2("can1_gate", "ipg", base + MX35_CCM_CGR0, 6); | ||
149 | clk[can2_gate] = imx_clk_gate2("can2_gate", "ipg", base + MX35_CCM_CGR0, 8); | ||
150 | clk[cspi1_gate] = imx_clk_gate2("cspi1_gate", "ipg", base + MX35_CCM_CGR0, 10); | ||
151 | clk[cspi2_gate] = imx_clk_gate2("cspi2_gate", "ipg", base + MX35_CCM_CGR0, 12); | ||
152 | clk[ect_gate] = imx_clk_gate2("ect_gate", "ipg", base + MX35_CCM_CGR0, 14); | ||
153 | clk[edio_gate] = imx_clk_gate2("edio_gate", "ipg", base + MX35_CCM_CGR0, 16); | ||
154 | clk[emi_gate] = imx_clk_gate2("emi_gate", "ipg", base + MX35_CCM_CGR0, 18); | ||
155 | clk[epit1_gate] = imx_clk_gate2("epit1_gate", "ipg", base + MX35_CCM_CGR0, 20); | ||
156 | clk[epit2_gate] = imx_clk_gate2("epit2_gate", "ipg", base + MX35_CCM_CGR0, 22); | ||
157 | clk[esai_gate] = imx_clk_gate2("esai_gate", "ipg", base + MX35_CCM_CGR0, 24); | ||
158 | clk[esdhc1_gate] = imx_clk_gate2("esdhc1_gate", "esdhc1_div", base + MX35_CCM_CGR0, 26); | ||
159 | clk[esdhc2_gate] = imx_clk_gate2("esdhc2_gate", "esdhc2_div", base + MX35_CCM_CGR0, 28); | ||
160 | clk[esdhc3_gate] = imx_clk_gate2("esdhc3_gate", "esdhc3_div", base + MX35_CCM_CGR0, 30); | ||
161 | |||
162 | clk[fec_gate] = imx_clk_gate2("fec_gate", "ipg", base + MX35_CCM_CGR1, 0); | ||
163 | clk[gpio1_gate] = imx_clk_gate2("gpio1_gate", "ipg", base + MX35_CCM_CGR1, 2); | ||
164 | clk[gpio2_gate] = imx_clk_gate2("gpio2_gate", "ipg", base + MX35_CCM_CGR1, 4); | ||
165 | clk[gpio3_gate] = imx_clk_gate2("gpio3_gate", "ipg", base + MX35_CCM_CGR1, 6); | ||
166 | clk[gpt_gate] = imx_clk_gate2("gpt_gate", "ipg", base + MX35_CCM_CGR1, 8); | ||
167 | clk[i2c1_gate] = imx_clk_gate2("i2c1_gate", "ipg_per", base + MX35_CCM_CGR1, 10); | ||
168 | clk[i2c2_gate] = imx_clk_gate2("i2c2_gate", "ipg_per", base + MX35_CCM_CGR1, 12); | ||
169 | clk[i2c3_gate] = imx_clk_gate2("i2c3_gate", "ipg_per", base + MX35_CCM_CGR1, 14); | ||
170 | clk[iomuxc_gate] = imx_clk_gate2("iomuxc_gate", "ipg", base + MX35_CCM_CGR1, 16); | ||
171 | clk[ipu_gate] = imx_clk_gate2("ipu_gate", "hsp", base + MX35_CCM_CGR1, 18); | ||
172 | clk[kpp_gate] = imx_clk_gate2("kpp_gate", "ipg", base + MX35_CCM_CGR1, 20); | ||
173 | clk[mlb_gate] = imx_clk_gate2("mlb_gate", "ahb", base + MX35_CCM_CGR1, 22); | ||
174 | clk[mshc_gate] = imx_clk_gate2("mshc_gate", "dummy", base + MX35_CCM_CGR1, 24); | ||
175 | clk[owire_gate] = imx_clk_gate2("owire_gate", "ipg_per", base + MX35_CCM_CGR1, 26); | ||
176 | clk[pwm_gate] = imx_clk_gate2("pwm_gate", "ipg_per", base + MX35_CCM_CGR1, 28); | ||
177 | clk[rngc_gate] = imx_clk_gate2("rngc_gate", "ipg", base + MX35_CCM_CGR1, 30); | ||
178 | |||
179 | clk[rtc_gate] = imx_clk_gate2("rtc_gate", "ipg", base + MX35_CCM_CGR2, 0); | ||
180 | clk[rtic_gate] = imx_clk_gate2("rtic_gate", "ahb", base + MX35_CCM_CGR2, 2); | ||
181 | clk[scc_gate] = imx_clk_gate2("scc_gate", "ipg", base + MX35_CCM_CGR2, 4); | ||
182 | clk[sdma_gate] = imx_clk_gate2("sdma_gate", "ahb", base + MX35_CCM_CGR2, 6); | ||
183 | clk[spba_gate] = imx_clk_gate2("spba_gate", "ipg", base + MX35_CCM_CGR2, 8); | ||
184 | clk[spdif_gate] = imx_clk_gate2("spdif_gate", "spdif_div_post", base + MX35_CCM_CGR2, 10); | ||
185 | clk[ssi1_gate] = imx_clk_gate2("ssi1_gate", "ssi1_div_post", base + MX35_CCM_CGR2, 12); | ||
186 | clk[ssi2_gate] = imx_clk_gate2("ssi2_gate", "ssi2_div_post", base + MX35_CCM_CGR2, 14); | ||
187 | clk[uart1_gate] = imx_clk_gate2("uart1_gate", "uart_div", base + MX35_CCM_CGR2, 16); | ||
188 | clk[uart2_gate] = imx_clk_gate2("uart2_gate", "uart_div", base + MX35_CCM_CGR2, 18); | ||
189 | clk[uart3_gate] = imx_clk_gate2("uart3_gate", "uart_div", base + MX35_CCM_CGR2, 20); | ||
190 | clk[usbotg_gate] = imx_clk_gate2("usbotg_gate", "ahb", base + MX35_CCM_CGR2, 22); | ||
191 | clk[wdog_gate] = imx_clk_gate2("wdog_gate", "ipg", base + MX35_CCM_CGR2, 24); | ||
192 | clk[max_gate] = imx_clk_gate2("max_gate", "dummy", base + MX35_CCM_CGR2, 26); | ||
193 | clk[admux_gate] = imx_clk_gate2("admux_gate", "ipg", base + MX35_CCM_CGR2, 30); | ||
194 | |||
195 | clk[csi_gate] = imx_clk_gate2("csi_gate", "ipg", base + MX35_CCM_CGR3, 0); | ||
196 | clk[iim_gate] = imx_clk_gate2("iim_gate", "ipg", base + MX35_CCM_CGR3, 2); | ||
197 | clk[gpu2d_gate] = imx_clk_gate2("gpu2d_gate", "ahb", base + MX35_CCM_CGR3, 4); | ||
198 | |||
199 | for (i = 0; i < ARRAY_SIZE(clk); i++) | ||
200 | if (IS_ERR(clk[i])) | ||
201 | pr_err("i.MX35 clk %d: register failed with %ld\n", | ||
202 | i, PTR_ERR(clk[i])); | ||
203 | |||
204 | |||
205 | clk_register_clkdev(clk[pata_gate], NULL, "pata_imx"); | ||
206 | clk_register_clkdev(clk[can1_gate], NULL, "flexcan.0"); | ||
207 | clk_register_clkdev(clk[can2_gate], NULL, "flexcan.1"); | ||
208 | clk_register_clkdev(clk[cspi1_gate], "per", "imx35-cspi.0"); | ||
209 | clk_register_clkdev(clk[cspi1_gate], "ipg", "imx35-cspi.0"); | ||
210 | clk_register_clkdev(clk[cspi2_gate], "per", "imx35-cspi.1"); | ||
211 | clk_register_clkdev(clk[cspi2_gate], "ipg", "imx35-cspi.1"); | ||
212 | clk_register_clkdev(clk[epit1_gate], NULL, "imx-epit.0"); | ||
213 | clk_register_clkdev(clk[epit2_gate], NULL, "imx-epit.1"); | ||
214 | clk_register_clkdev(clk[esdhc1_gate], "per", "sdhci-esdhc-imx35.0"); | ||
215 | clk_register_clkdev(clk[ipg], "ipg", "sdhci-esdhc-imx35.0"); | ||
216 | clk_register_clkdev(clk[ahb], "ahb", "sdhci-esdhc-imx35.0"); | ||
217 | clk_register_clkdev(clk[esdhc2_gate], "per", "sdhci-esdhc-imx35.1"); | ||
218 | clk_register_clkdev(clk[ipg], "ipg", "sdhci-esdhc-imx35.1"); | ||
219 | clk_register_clkdev(clk[ahb], "ahb", "sdhci-esdhc-imx35.1"); | ||
220 | clk_register_clkdev(clk[esdhc3_gate], "per", "sdhci-esdhc-imx35.2"); | ||
221 | clk_register_clkdev(clk[ipg], "ipg", "sdhci-esdhc-imx35.2"); | ||
222 | clk_register_clkdev(clk[ahb], "ahb", "sdhci-esdhc-imx35.2"); | ||
223 | /* i.mx35 has the i.mx27 type fec */ | ||
224 | clk_register_clkdev(clk[fec_gate], NULL, "imx27-fec.0"); | ||
225 | clk_register_clkdev(clk[gpt_gate], "per", "imx-gpt.0"); | ||
226 | clk_register_clkdev(clk[ipg], "ipg", "imx-gpt.0"); | ||
227 | clk_register_clkdev(clk[i2c1_gate], NULL, "imx-i2c.0"); | ||
228 | clk_register_clkdev(clk[i2c2_gate], NULL, "imx-i2c.1"); | ||
229 | clk_register_clkdev(clk[i2c3_gate], NULL, "imx-i2c.2"); | ||
230 | clk_register_clkdev(clk[ipu_gate], NULL, "ipu-core"); | ||
231 | clk_register_clkdev(clk[ipu_gate], NULL, "mx3_sdc_fb"); | ||
232 | clk_register_clkdev(clk[owire_gate], NULL, "mxc_w1"); | ||
233 | clk_register_clkdev(clk[sdma_gate], NULL, "imx35-sdma"); | ||
234 | clk_register_clkdev(clk[ipg], "ipg", "imx-ssi.0"); | ||
235 | clk_register_clkdev(clk[ssi1_div_post], "per", "imx-ssi.0"); | ||
236 | clk_register_clkdev(clk[ipg], "ipg", "imx-ssi.1"); | ||
237 | clk_register_clkdev(clk[ssi2_div_post], "per", "imx-ssi.1"); | ||
238 | /* i.mx35 has the i.mx21 type uart */ | ||
239 | clk_register_clkdev(clk[uart1_gate], "per", "imx21-uart.0"); | ||
240 | clk_register_clkdev(clk[ipg], "ipg", "imx21-uart.0"); | ||
241 | clk_register_clkdev(clk[uart2_gate], "per", "imx21-uart.1"); | ||
242 | clk_register_clkdev(clk[ipg], "ipg", "imx21-uart.1"); | ||
243 | clk_register_clkdev(clk[uart3_gate], "per", "imx21-uart.2"); | ||
244 | clk_register_clkdev(clk[ipg], "ipg", "imx21-uart.2"); | ||
245 | clk_register_clkdev(clk[usb_div], "per", "mxc-ehci.0"); | ||
246 | clk_register_clkdev(clk[ipg], "ipg", "mxc-ehci.0"); | ||
247 | clk_register_clkdev(clk[usbotg_gate], "ahb", "mxc-ehci.0"); | ||
248 | clk_register_clkdev(clk[usb_div], "per", "mxc-ehci.1"); | ||
249 | clk_register_clkdev(clk[ipg], "ipg", "mxc-ehci.1"); | ||
250 | clk_register_clkdev(clk[usbotg_gate], "ahb", "mxc-ehci.1"); | ||
251 | clk_register_clkdev(clk[usb_div], "per", "mxc-ehci.2"); | ||
252 | clk_register_clkdev(clk[ipg], "ipg", "mxc-ehci.2"); | ||
253 | clk_register_clkdev(clk[usbotg_gate], "ahb", "mxc-ehci.2"); | ||
254 | clk_register_clkdev(clk[usb_div], "per", "fsl-usb2-udc"); | ||
255 | clk_register_clkdev(clk[ipg], "ipg", "fsl-usb2-udc"); | ||
256 | clk_register_clkdev(clk[usbotg_gate], "ahb", "fsl-usb2-udc"); | ||
257 | clk_register_clkdev(clk[wdog_gate], NULL, "imx2-wdt.0"); | ||
258 | clk_register_clkdev(clk[nfc_div], NULL, "mxc_nand.0"); | ||
259 | |||
260 | clk_prepare_enable(clk[spba_gate]); | ||
261 | clk_prepare_enable(clk[gpio1_gate]); | ||
262 | clk_prepare_enable(clk[gpio2_gate]); | ||
263 | clk_prepare_enable(clk[gpio3_gate]); | ||
264 | clk_prepare_enable(clk[iim_gate]); | ||
265 | clk_prepare_enable(clk[emi_gate]); | ||
266 | |||
267 | imx_print_silicon_rev("i.MX35", mx35_revision()); | ||
268 | |||
269 | #ifdef CONFIG_MXC_USE_EPIT | ||
270 | epit_timer_init(&epit1_clk, | ||
271 | MX35_IO_ADDRESS(MX35_EPIT1_BASE_ADDR), MX35_INT_EPIT1); | ||
272 | #else | ||
273 | mxc_timer_init(NULL, MX35_IO_ADDRESS(MX35_GPT1_BASE_ADDR), | ||
274 | MX35_INT_GPT); | ||
275 | #endif | ||
276 | |||
277 | return 0; | ||
278 | } | ||
diff --git a/arch/arm/mach-imx/clk-imx51-imx53.c b/arch/arm/mach-imx/clk-imx51-imx53.c new file mode 100644 index 000000000000..fcd94f3b0f0e --- /dev/null +++ b/arch/arm/mach-imx/clk-imx51-imx53.c | |||
@@ -0,0 +1,506 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2011 Sascha Hauer, Pengutronix <s.hauer@pengutronix.de> | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License version 2 as | ||
6 | * published by the Free Software Foundation. | ||
7 | * | ||
8 | */ | ||
9 | #include <linux/mm.h> | ||
10 | #include <linux/delay.h> | ||
11 | #include <linux/clk.h> | ||
12 | #include <linux/io.h> | ||
13 | #include <linux/clkdev.h> | ||
14 | #include <linux/of.h> | ||
15 | #include <linux/err.h> | ||
16 | |||
17 | #include <mach/hardware.h> | ||
18 | #include <mach/common.h> | ||
19 | |||
20 | #include "crm-regs-imx5.h" | ||
21 | #include "clk.h" | ||
22 | |||
23 | /* Low-power Audio Playback Mode clock */ | ||
24 | static const char *lp_apm_sel[] = { "osc", }; | ||
25 | |||
26 | /* This is used multiple times */ | ||
27 | static const char *standard_pll_sel[] = { "pll1_sw", "pll2_sw", "pll3_sw", "lp_apm", }; | ||
28 | static const char *periph_apm_sel[] = { "pll1_sw", "pll3_sw", "lp_apm", }; | ||
29 | static const char *main_bus_sel[] = { "pll2_sw", "periph_apm", }; | ||
30 | static const char *per_lp_apm_sel[] = { "main_bus", "lp_apm", }; | ||
31 | static const char *per_root_sel[] = { "per_podf", "ipg", }; | ||
32 | static const char *esdhc_c_sel[] = { "esdhc_a_podf", "esdhc_b_podf", }; | ||
33 | static const char *esdhc_d_sel[] = { "esdhc_a_podf", "esdhc_b_podf", }; | ||
34 | static const char *ssi_apm_sels[] = { "ckih1", "lp_amp", "ckih2", }; | ||
35 | static const char *ssi_clk_sels[] = { "pll1_sw", "pll2_sw", "pll3_sw", "ssi_apm", }; | ||
36 | static const char *ssi3_clk_sels[] = { "ssi1_root_gate", "ssi2_root_gate", }; | ||
37 | static const char *ssi_ext1_com_sels[] = { "ssi_ext1_podf", "ssi1_root_gate", }; | ||
38 | static const char *ssi_ext2_com_sels[] = { "ssi_ext2_podf", "ssi2_root_gate", }; | ||
39 | static const char *emi_slow_sel[] = { "main_bus", "ahb", }; | ||
40 | static const char *usb_phy_sel_str[] = { "osc", "usb_phy_podf", }; | ||
41 | static const char *mx51_ipu_di0_sel[] = { "di_pred", "osc", "ckih1", "tve_di", }; | ||
42 | static const char *mx53_ipu_di0_sel[] = { "di_pred", "osc", "ckih1", "di_pll4_podf", "dummy", "ldb_di0", }; | ||
43 | static const char *mx53_ldb_di0_sel[] = { "pll3_sw", "pll4_sw", }; | ||
44 | static const char *mx51_ipu_di1_sel[] = { "di_pred", "osc", "ckih1", "tve_di", "ipp_di1", }; | ||
45 | static const char *mx53_ipu_di1_sel[] = { "di_pred", "osc", "ckih1", "tve_di", "ipp_di1", "ldb_di1", }; | ||
46 | static const char *mx53_ldb_di1_sel[] = { "pll3_sw", "pll4_sw", }; | ||
47 | static const char *mx51_tve_ext_sel[] = { "osc", "ckih1", }; | ||
48 | static const char *mx53_tve_ext_sel[] = { "pll4_sw", "ckih1", }; | ||
49 | static const char *tve_sel[] = { "tve_pred", "tve_ext_sel", }; | ||
50 | static const char *ipu_sel[] = { "axi_a", "axi_b", "emi_slow_gate", "ahb", }; | ||
51 | static const char *vpu_sel[] = { "axi_a", "axi_b", "emi_slow_gate", "ahb", }; | ||
52 | |||
53 | enum imx5_clks { | ||
54 | dummy, ckil, osc, ckih1, ckih2, ahb, ipg, axi_a, axi_b, uart_pred, | ||
55 | uart_root, esdhc_a_pred, esdhc_b_pred, esdhc_c_s, esdhc_d_s, | ||
56 | emi_sel, emi_slow_podf, nfc_podf, ecspi_pred, ecspi_podf, usboh3_pred, | ||
57 | usboh3_podf, usb_phy_pred, usb_phy_podf, cpu_podf, di_pred, tve_di, | ||
58 | tve_s, uart1_ipg_gate, uart1_per_gate, uart2_ipg_gate, | ||
59 | uart2_per_gate, uart3_ipg_gate, uart3_per_gate, i2c1_gate, i2c2_gate, | ||
60 | gpt_ipg_gate, pwm1_ipg_gate, pwm1_hf_gate, pwm2_ipg_gate, pwm2_hf_gate, | ||
61 | gpt_gate, fec_gate, usboh3_per_gate, esdhc1_ipg_gate, esdhc2_ipg_gate, | ||
62 | esdhc3_ipg_gate, esdhc4_ipg_gate, ssi1_ipg_gate, ssi2_ipg_gate, | ||
63 | ssi3_ipg_gate, ecspi1_ipg_gate, ecspi1_per_gate, ecspi2_ipg_gate, | ||
64 | ecspi2_per_gate, cspi_ipg_gate, sdma_gate, emi_slow_gate, ipu_s, | ||
65 | ipu_gate, nfc_gate, ipu_di1_gate, vpu_s, vpu_gate, | ||
66 | vpu_reference_gate, uart4_ipg_gate, uart4_per_gate, uart5_ipg_gate, | ||
67 | uart5_per_gate, tve_gate, tve_pred, esdhc1_per_gate, esdhc2_per_gate, | ||
68 | esdhc3_per_gate, esdhc4_per_gate, usb_phy_gate, hsi2c_gate, | ||
69 | mipi_hsc1_gate, mipi_hsc2_gate, mipi_esc_gate, mipi_hsp_gate, | ||
70 | ldb_di1_div_3_5, ldb_di1_div, ldb_di0_div_3_5, ldb_di0_div, | ||
71 | ldb_di1_gate, can2_serial_gate, can2_ipg_gate, i2c3_gate, lp_apm, | ||
72 | periph_apm, main_bus, ahb_max, aips_tz1, aips_tz2, tmax1, tmax2, | ||
73 | tmax3, spba, uart_sel, esdhc_a_sel, esdhc_b_sel, esdhc_a_podf, | ||
74 | esdhc_b_podf, ecspi_sel, usboh3_sel, usb_phy_sel, iim_gate, | ||
75 | usboh3_gate, emi_fast_gate, ipu_di0_gate,gpc_dvfs, pll1_sw, pll2_sw, | ||
76 | pll3_sw, ipu_di0_sel, ipu_di1_sel, tve_ext_sel, mx51_mipi, pll4_sw, | ||
77 | ldb_di1_sel, di_pll4_podf, ldb_di0_sel, ldb_di0_gate, usb_phy1_gate, | ||
78 | usb_phy2_gate, per_lp_apm, per_pred1, per_pred2, per_podf, per_root, | ||
79 | ssi_apm, ssi1_root_sel, ssi2_root_sel, ssi3_root_sel, ssi_ext1_sel, | ||
80 | ssi_ext2_sel, ssi_ext1_com_sel, ssi_ext2_com_sel, ssi1_root_pred, | ||
81 | ssi1_root_podf, ssi2_root_pred, ssi2_root_podf, ssi_ext1_pred, | ||
82 | ssi_ext1_podf, ssi_ext2_pred, ssi_ext2_podf, ssi1_root_gate, | ||
83 | ssi2_root_gate, ssi3_root_gate, ssi_ext1_gate, ssi_ext2_gate, | ||
84 | clk_max | ||
85 | }; | ||
86 | |||
87 | static struct clk *clk[clk_max]; | ||
88 | |||
89 | static void __init mx5_clocks_common_init(unsigned long rate_ckil, | ||
90 | unsigned long rate_osc, unsigned long rate_ckih1, | ||
91 | unsigned long rate_ckih2) | ||
92 | { | ||
93 | int i; | ||
94 | |||
95 | clk[dummy] = imx_clk_fixed("dummy", 0); | ||
96 | clk[ckil] = imx_clk_fixed("ckil", rate_ckil); | ||
97 | clk[osc] = imx_clk_fixed("osc", rate_osc); | ||
98 | clk[ckih1] = imx_clk_fixed("ckih1", rate_ckih1); | ||
99 | clk[ckih2] = imx_clk_fixed("ckih2", rate_ckih2); | ||
100 | |||
101 | clk[lp_apm] = imx_clk_mux("lp_apm", MXC_CCM_CCSR, 9, 1, | ||
102 | lp_apm_sel, ARRAY_SIZE(lp_apm_sel)); | ||
103 | clk[periph_apm] = imx_clk_mux("periph_apm", MXC_CCM_CBCMR, 12, 2, | ||
104 | periph_apm_sel, ARRAY_SIZE(periph_apm_sel)); | ||
105 | clk[main_bus] = imx_clk_mux("main_bus", MXC_CCM_CBCDR, 25, 1, | ||
106 | main_bus_sel, ARRAY_SIZE(main_bus_sel)); | ||
107 | clk[per_lp_apm] = imx_clk_mux("per_lp_apm", MXC_CCM_CBCDR, 1, 1, | ||
108 | per_lp_apm_sel, ARRAY_SIZE(per_lp_apm_sel)); | ||
109 | clk[per_pred1] = imx_clk_divider("per_pred1", "per_lp_apm", MXC_CCM_CBCDR, 6, 2); | ||
110 | clk[per_pred2] = imx_clk_divider("per_pred2", "per_pred1", MXC_CCM_CBCDR, 3, 3); | ||
111 | clk[per_podf] = imx_clk_divider("per_podf", "per_pred2", MXC_CCM_CBCDR, 0, 3); | ||
112 | clk[per_root] = imx_clk_mux("per_root", MXC_CCM_CBCDR, 1, 0, | ||
113 | per_root_sel, ARRAY_SIZE(per_root_sel)); | ||
114 | clk[ahb] = imx_clk_divider("ahb", "main_bus", MXC_CCM_CBCDR, 10, 3); | ||
115 | clk[ahb_max] = imx_clk_gate2("ahb_max", "ahb", MXC_CCM_CCGR0, 28); | ||
116 | clk[aips_tz1] = imx_clk_gate2("aips_tz1", "ahb", MXC_CCM_CCGR0, 24); | ||
117 | clk[aips_tz2] = imx_clk_gate2("aips_tz2", "ahb", MXC_CCM_CCGR0, 26); | ||
118 | clk[tmax1] = imx_clk_gate2("tmax1", "ahb", MXC_CCM_CCGR1, 0); | ||
119 | clk[tmax2] = imx_clk_gate2("tmax2", "ahb", MXC_CCM_CCGR1, 2); | ||
120 | clk[tmax3] = imx_clk_gate2("tmax3", "ahb", MXC_CCM_CCGR1, 4); | ||
121 | clk[spba] = imx_clk_gate2("spba", "ipg", MXC_CCM_CCGR5, 0); | ||
122 | clk[ipg] = imx_clk_divider("ipg", "ahb", MXC_CCM_CBCDR, 8, 2); | ||
123 | clk[axi_a] = imx_clk_divider("axi_a", "main_bus", MXC_CCM_CBCDR, 16, 3); | ||
124 | clk[axi_b] = imx_clk_divider("axi_b", "main_bus", MXC_CCM_CBCDR, 19, 3); | ||
125 | clk[uart_sel] = imx_clk_mux("uart_sel", MXC_CCM_CSCMR1, 24, 2, | ||
126 | standard_pll_sel, ARRAY_SIZE(standard_pll_sel)); | ||
127 | clk[uart_pred] = imx_clk_divider("uart_pred", "uart_sel", MXC_CCM_CSCDR1, 3, 3); | ||
128 | clk[uart_root] = imx_clk_divider("uart_root", "uart_pred", MXC_CCM_CSCDR1, 0, 3); | ||
129 | |||
130 | clk[esdhc_a_sel] = imx_clk_mux("esdhc_a_sel", MXC_CCM_CSCMR1, 20, 2, | ||
131 | standard_pll_sel, ARRAY_SIZE(standard_pll_sel)); | ||
132 | clk[esdhc_b_sel] = imx_clk_mux("esdhc_b_sel", MXC_CCM_CSCMR1, 16, 2, | ||
133 | standard_pll_sel, ARRAY_SIZE(standard_pll_sel)); | ||
134 | clk[esdhc_a_pred] = imx_clk_divider("esdhc_a_pred", "esdhc_a_sel", MXC_CCM_CSCDR1, 16, 3); | ||
135 | clk[esdhc_a_podf] = imx_clk_divider("esdhc_a_podf", "esdhc_a_pred", MXC_CCM_CSCDR1, 11, 3); | ||
136 | clk[esdhc_b_pred] = imx_clk_divider("esdhc_b_pred", "esdhc_b_sel", MXC_CCM_CSCDR1, 22, 3); | ||
137 | clk[esdhc_b_podf] = imx_clk_divider("esdhc_b_podf", "esdhc_b_pred", MXC_CCM_CSCDR1, 19, 3); | ||
138 | clk[esdhc_c_s] = imx_clk_mux("esdhc_c_sel", MXC_CCM_CSCMR1, 19, 1, esdhc_c_sel, ARRAY_SIZE(esdhc_c_sel)); | ||
139 | clk[esdhc_d_s] = imx_clk_mux("esdhc_d_sel", MXC_CCM_CSCMR1, 18, 1, esdhc_d_sel, ARRAY_SIZE(esdhc_d_sel)); | ||
140 | |||
141 | clk[emi_sel] = imx_clk_mux("emi_sel", MXC_CCM_CBCDR, 26, 1, | ||
142 | emi_slow_sel, ARRAY_SIZE(emi_slow_sel)); | ||
143 | clk[emi_slow_podf] = imx_clk_divider("emi_slow_podf", "emi_sel", MXC_CCM_CBCDR, 22, 3); | ||
144 | clk[nfc_podf] = imx_clk_divider("nfc_podf", "emi_slow_podf", MXC_CCM_CBCDR, 13, 3); | ||
145 | clk[ecspi_sel] = imx_clk_mux("ecspi_sel", MXC_CCM_CSCMR1, 4, 2, | ||
146 | standard_pll_sel, ARRAY_SIZE(standard_pll_sel)); | ||
147 | clk[ecspi_pred] = imx_clk_divider("ecspi_pred", "ecspi_sel", MXC_CCM_CSCDR2, 25, 3); | ||
148 | clk[ecspi_podf] = imx_clk_divider("ecspi_podf", "ecspi_pred", MXC_CCM_CSCDR2, 19, 6); | ||
149 | clk[usboh3_sel] = imx_clk_mux("usboh3_sel", MXC_CCM_CSCMR1, 22, 2, | ||
150 | standard_pll_sel, ARRAY_SIZE(standard_pll_sel)); | ||
151 | clk[usboh3_pred] = imx_clk_divider("usboh3_pred", "usboh3_sel", MXC_CCM_CSCDR1, 8, 3); | ||
152 | clk[usboh3_podf] = imx_clk_divider("usboh3_podf", "usboh3_pred", MXC_CCM_CSCDR1, 6, 2); | ||
153 | clk[usb_phy_pred] = imx_clk_divider("usb_phy_pred", "pll3_sw", MXC_CCM_CDCDR, 3, 3); | ||
154 | clk[usb_phy_podf] = imx_clk_divider("usb_phy_podf", "usb_phy_pred", MXC_CCM_CDCDR, 0, 3); | ||
155 | clk[usb_phy_sel] = imx_clk_mux("usb_phy_sel", MXC_CCM_CSCMR1, 26, 1, | ||
156 | usb_phy_sel_str, ARRAY_SIZE(usb_phy_sel_str)); | ||
157 | clk[cpu_podf] = imx_clk_divider("cpu_podf", "pll1_sw", MXC_CCM_CACRR, 0, 3); | ||
158 | clk[di_pred] = imx_clk_divider("di_pred", "pll3_sw", MXC_CCM_CDCDR, 6, 3); | ||
159 | clk[tve_di] = imx_clk_fixed("tve_di", 65000000); /* FIXME */ | ||
160 | clk[tve_s] = imx_clk_mux("tve_sel", MXC_CCM_CSCMR1, 7, 1, tve_sel, ARRAY_SIZE(tve_sel)); | ||
161 | clk[iim_gate] = imx_clk_gate2("iim_gate", "ipg", MXC_CCM_CCGR0, 30); | ||
162 | clk[uart1_ipg_gate] = imx_clk_gate2("uart1_ipg_gate", "ipg", MXC_CCM_CCGR1, 6); | ||
163 | clk[uart1_per_gate] = imx_clk_gate2("uart1_per_gate", "uart_root", MXC_CCM_CCGR1, 8); | ||
164 | clk[uart2_ipg_gate] = imx_clk_gate2("uart2_ipg_gate", "ipg", MXC_CCM_CCGR1, 10); | ||
165 | clk[uart2_per_gate] = imx_clk_gate2("uart2_per_gate", "uart_root", MXC_CCM_CCGR1, 12); | ||
166 | clk[uart3_ipg_gate] = imx_clk_gate2("uart3_ipg_gate", "ipg", MXC_CCM_CCGR1, 14); | ||
167 | clk[uart3_per_gate] = imx_clk_gate2("uart3_per_gate", "uart_root", MXC_CCM_CCGR1, 16); | ||
168 | clk[i2c1_gate] = imx_clk_gate2("i2c1_gate", "per_root", MXC_CCM_CCGR1, 18); | ||
169 | clk[i2c2_gate] = imx_clk_gate2("i2c2_gate", "per_root", MXC_CCM_CCGR1, 20); | ||
170 | clk[gpt_ipg_gate] = imx_clk_gate2("gpt_ipg_gate", "ipg", MXC_CCM_CCGR2, 20); | ||
171 | clk[pwm1_ipg_gate] = imx_clk_gate2("pwm1_ipg_gate", "ipg", MXC_CCM_CCGR2, 10); | ||
172 | clk[pwm1_hf_gate] = imx_clk_gate2("pwm1_hf_gate", "ipg", MXC_CCM_CCGR2, 12); | ||
173 | clk[pwm2_ipg_gate] = imx_clk_gate2("pwm2_ipg_gate", "ipg", MXC_CCM_CCGR2, 14); | ||
174 | clk[pwm2_hf_gate] = imx_clk_gate2("pwm2_hf_gate", "ipg", MXC_CCM_CCGR2, 16); | ||
175 | clk[gpt_gate] = imx_clk_gate2("gpt_gate", "ipg", MXC_CCM_CCGR2, 18); | ||
176 | clk[fec_gate] = imx_clk_gate2("fec_gate", "ipg", MXC_CCM_CCGR2, 24); | ||
177 | clk[usboh3_gate] = imx_clk_gate2("usboh3_gate", "ipg", MXC_CCM_CCGR2, 26); | ||
178 | clk[usboh3_per_gate] = imx_clk_gate2("usboh3_per_gate", "usboh3_podf", MXC_CCM_CCGR2, 28); | ||
179 | clk[esdhc1_ipg_gate] = imx_clk_gate2("esdhc1_ipg_gate", "ipg", MXC_CCM_CCGR3, 0); | ||
180 | clk[esdhc2_ipg_gate] = imx_clk_gate2("esdhc2_ipg_gate", "ipg", MXC_CCM_CCGR3, 4); | ||
181 | clk[esdhc3_ipg_gate] = imx_clk_gate2("esdhc3_ipg_gate", "ipg", MXC_CCM_CCGR3, 8); | ||
182 | clk[esdhc4_ipg_gate] = imx_clk_gate2("esdhc4_ipg_gate", "ipg", MXC_CCM_CCGR3, 12); | ||
183 | clk[ssi1_ipg_gate] = imx_clk_gate2("ssi1_ipg_gate", "ipg", MXC_CCM_CCGR3, 16); | ||
184 | clk[ssi2_ipg_gate] = imx_clk_gate2("ssi2_ipg_gate", "ipg", MXC_CCM_CCGR3, 20); | ||
185 | clk[ssi3_ipg_gate] = imx_clk_gate2("ssi3_ipg_gate", "ipg", MXC_CCM_CCGR3, 24); | ||
186 | clk[ecspi1_ipg_gate] = imx_clk_gate2("ecspi1_ipg_gate", "ipg", MXC_CCM_CCGR4, 18); | ||
187 | clk[ecspi1_per_gate] = imx_clk_gate2("ecspi1_per_gate", "ecspi_podf", MXC_CCM_CCGR4, 20); | ||
188 | clk[ecspi2_ipg_gate] = imx_clk_gate2("ecspi2_ipg_gate", "ipg", MXC_CCM_CCGR4, 22); | ||
189 | clk[ecspi2_per_gate] = imx_clk_gate2("ecspi2_per_gate", "ecspi_podf", MXC_CCM_CCGR4, 24); | ||
190 | clk[cspi_ipg_gate] = imx_clk_gate2("cspi_ipg_gate", "ipg", MXC_CCM_CCGR4, 26); | ||
191 | clk[sdma_gate] = imx_clk_gate2("sdma_gate", "ipg", MXC_CCM_CCGR4, 30); | ||
192 | clk[emi_fast_gate] = imx_clk_gate2("emi_fast_gate", "dummy", MXC_CCM_CCGR5, 14); | ||
193 | clk[emi_slow_gate] = imx_clk_gate2("emi_slow_gate", "emi_slow_podf", MXC_CCM_CCGR5, 16); | ||
194 | clk[ipu_s] = imx_clk_mux("ipu_sel", MXC_CCM_CBCMR, 6, 2, ipu_sel, ARRAY_SIZE(ipu_sel)); | ||
195 | clk[ipu_gate] = imx_clk_gate2("ipu_gate", "ipu_sel", MXC_CCM_CCGR5, 10); | ||
196 | clk[nfc_gate] = imx_clk_gate2("nfc_gate", "nfc_podf", MXC_CCM_CCGR5, 20); | ||
197 | clk[ipu_di0_gate] = imx_clk_gate2("ipu_di0_gate", "ipu_di0_sel", MXC_CCM_CCGR6, 10); | ||
198 | clk[ipu_di1_gate] = imx_clk_gate2("ipu_di1_gate", "ipu_di1_sel", MXC_CCM_CCGR6, 12); | ||
199 | clk[vpu_s] = imx_clk_mux("vpu_sel", MXC_CCM_CBCMR, 14, 2, vpu_sel, ARRAY_SIZE(vpu_sel)); | ||
200 | clk[vpu_gate] = imx_clk_gate2("vpu_gate", "vpu_sel", MXC_CCM_CCGR5, 6); | ||
201 | clk[vpu_reference_gate] = imx_clk_gate2("vpu_reference_gate", "osc", MXC_CCM_CCGR5, 8); | ||
202 | clk[uart4_ipg_gate] = imx_clk_gate2("uart4_ipg_gate", "ipg", MXC_CCM_CCGR7, 8); | ||
203 | clk[uart4_per_gate] = imx_clk_gate2("uart4_per_gate", "uart_root", MXC_CCM_CCGR7, 10); | ||
204 | clk[uart5_ipg_gate] = imx_clk_gate2("uart5_ipg_gate", "ipg", MXC_CCM_CCGR7, 12); | ||
205 | clk[uart5_per_gate] = imx_clk_gate2("uart5_per_gate", "uart_root", MXC_CCM_CCGR7, 14); | ||
206 | clk[gpc_dvfs] = imx_clk_gate2("gpc_dvfs", "dummy", MXC_CCM_CCGR5, 24); | ||
207 | |||
208 | clk[ssi_apm] = imx_clk_mux("ssi_apm", MXC_CCM_CSCMR1, 8, 2, ssi_apm_sels, ARRAY_SIZE(ssi_apm_sels)); | ||
209 | clk[ssi1_root_sel] = imx_clk_mux("ssi1_root_sel", MXC_CCM_CSCMR1, 14, 2, ssi_clk_sels, ARRAY_SIZE(ssi_clk_sels)); | ||
210 | clk[ssi2_root_sel] = imx_clk_mux("ssi2_root_sel", MXC_CCM_CSCMR1, 12, 2, ssi_clk_sels, ARRAY_SIZE(ssi_clk_sels)); | ||
211 | clk[ssi3_root_sel] = imx_clk_mux("ssi3_root_sel", MXC_CCM_CSCMR1, 11, 1, ssi3_clk_sels, ARRAY_SIZE(ssi3_clk_sels)); | ||
212 | clk[ssi_ext1_sel] = imx_clk_mux("ssi_ext1_sel", MXC_CCM_CSCMR1, 28, 2, ssi_clk_sels, ARRAY_SIZE(ssi_clk_sels)); | ||
213 | clk[ssi_ext2_sel] = imx_clk_mux("ssi_ext2_sel", MXC_CCM_CSCMR1, 30, 2, ssi_clk_sels, ARRAY_SIZE(ssi_clk_sels)); | ||
214 | clk[ssi_ext1_com_sel] = imx_clk_mux("ssi_ext1_com_sel", MXC_CCM_CSCMR1, 0, 1, ssi_ext1_com_sels, ARRAY_SIZE(ssi_ext1_com_sels)); | ||
215 | clk[ssi_ext2_com_sel] = imx_clk_mux("ssi_ext2_com_sel", MXC_CCM_CSCMR1, 1, 1, ssi_ext2_com_sels, ARRAY_SIZE(ssi_ext2_com_sels)); | ||
216 | clk[ssi1_root_pred] = imx_clk_divider("ssi1_root_pred", "ssi1_root_sel", MXC_CCM_CS1CDR, 6, 3); | ||
217 | clk[ssi1_root_podf] = imx_clk_divider("ssi1_root_podf", "ssi1_root_pred", MXC_CCM_CS1CDR, 0, 6); | ||
218 | clk[ssi2_root_pred] = imx_clk_divider("ssi2_root_pred", "ssi2_root_sel", MXC_CCM_CS2CDR, 6, 3); | ||
219 | clk[ssi2_root_podf] = imx_clk_divider("ssi2_root_podf", "ssi2_root_pred", MXC_CCM_CS2CDR, 0, 6); | ||
220 | clk[ssi_ext1_pred] = imx_clk_divider("ssi_ext1_pred", "ssi_ext1_sel", MXC_CCM_CS1CDR, 22, 3); | ||
221 | clk[ssi_ext1_podf] = imx_clk_divider("ssi_ext1_podf", "ssi_ext1_pred", MXC_CCM_CS1CDR, 16, 6); | ||
222 | clk[ssi_ext2_pred] = imx_clk_divider("ssi_ext2_pred", "ssi_ext2_sel", MXC_CCM_CS2CDR, 22, 3); | ||
223 | clk[ssi_ext2_podf] = imx_clk_divider("ssi_ext2_podf", "ssi_ext2_pred", MXC_CCM_CS2CDR, 16, 6); | ||
224 | clk[ssi1_root_gate] = imx_clk_gate2("ssi1_root_gate", "ssi1_root_podf", MXC_CCM_CCGR3, 18); | ||
225 | clk[ssi2_root_gate] = imx_clk_gate2("ssi2_root_gate", "ssi2_root_podf", MXC_CCM_CCGR3, 22); | ||
226 | clk[ssi3_root_gate] = imx_clk_gate2("ssi3_root_gate", "ssi3_root_sel", MXC_CCM_CCGR3, 26); | ||
227 | clk[ssi_ext1_gate] = imx_clk_gate2("ssi_ext1_gate", "ssi_ext1_com_sel", MXC_CCM_CCGR3, 28); | ||
228 | clk[ssi_ext2_gate] = imx_clk_gate2("ssi_ext2_gate", "ssi_ext2_com_sel", MXC_CCM_CCGR3, 30); | ||
229 | |||
230 | for (i = 0; i < ARRAY_SIZE(clk); i++) | ||
231 | if (IS_ERR(clk[i])) | ||
232 | pr_err("i.MX5 clk %d: register failed with %ld\n", | ||
233 | i, PTR_ERR(clk[i])); | ||
234 | |||
235 | clk_register_clkdev(clk[gpt_gate], "per", "imx-gpt.0"); | ||
236 | clk_register_clkdev(clk[gpt_ipg_gate], "ipg", "imx-gpt.0"); | ||
237 | clk_register_clkdev(clk[uart1_per_gate], "per", "imx21-uart.0"); | ||
238 | clk_register_clkdev(clk[uart1_ipg_gate], "ipg", "imx21-uart.0"); | ||
239 | clk_register_clkdev(clk[uart2_per_gate], "per", "imx21-uart.1"); | ||
240 | clk_register_clkdev(clk[uart2_ipg_gate], "ipg", "imx21-uart.1"); | ||
241 | clk_register_clkdev(clk[uart3_per_gate], "per", "imx21-uart.2"); | ||
242 | clk_register_clkdev(clk[uart3_ipg_gate], "ipg", "imx21-uart.2"); | ||
243 | clk_register_clkdev(clk[uart4_per_gate], "per", "imx21-uart.3"); | ||
244 | clk_register_clkdev(clk[uart4_ipg_gate], "ipg", "imx21-uart.3"); | ||
245 | clk_register_clkdev(clk[uart5_per_gate], "per", "imx21-uart.4"); | ||
246 | clk_register_clkdev(clk[uart5_ipg_gate], "ipg", "imx21-uart.4"); | ||
247 | clk_register_clkdev(clk[ecspi1_per_gate], "per", "imx51-ecspi.0"); | ||
248 | clk_register_clkdev(clk[ecspi1_ipg_gate], "ipg", "imx51-ecspi.0"); | ||
249 | clk_register_clkdev(clk[ecspi2_per_gate], "per", "imx51-ecspi.1"); | ||
250 | clk_register_clkdev(clk[ecspi2_ipg_gate], "ipg", "imx51-ecspi.1"); | ||
251 | clk_register_clkdev(clk[cspi_ipg_gate], NULL, "imx51-cspi.0"); | ||
252 | clk_register_clkdev(clk[pwm1_ipg_gate], "pwm", "mxc_pwm.0"); | ||
253 | clk_register_clkdev(clk[pwm2_ipg_gate], "pwm", "mxc_pwm.1"); | ||
254 | clk_register_clkdev(clk[i2c1_gate], NULL, "imx-i2c.0"); | ||
255 | clk_register_clkdev(clk[i2c2_gate], NULL, "imx-i2c.1"); | ||
256 | clk_register_clkdev(clk[usboh3_per_gate], "per", "mxc-ehci.0"); | ||
257 | clk_register_clkdev(clk[usboh3_gate], "ipg", "mxc-ehci.0"); | ||
258 | clk_register_clkdev(clk[usboh3_gate], "ahb", "mxc-ehci.0"); | ||
259 | clk_register_clkdev(clk[usboh3_per_gate], "per", "mxc-ehci.1"); | ||
260 | clk_register_clkdev(clk[usboh3_gate], "ipg", "mxc-ehci.1"); | ||
261 | clk_register_clkdev(clk[usboh3_gate], "ahb", "mxc-ehci.1"); | ||
262 | clk_register_clkdev(clk[usboh3_per_gate], "per", "mxc-ehci.2"); | ||
263 | clk_register_clkdev(clk[usboh3_gate], "ipg", "mxc-ehci.2"); | ||
264 | clk_register_clkdev(clk[usboh3_gate], "ahb", "mxc-ehci.2"); | ||
265 | clk_register_clkdev(clk[usboh3_per_gate], "per", "fsl-usb2-udc"); | ||
266 | clk_register_clkdev(clk[usboh3_gate], "ipg", "fsl-usb2-udc"); | ||
267 | clk_register_clkdev(clk[usboh3_gate], "ahb", "fsl-usb2-udc"); | ||
268 | clk_register_clkdev(clk[nfc_gate], NULL, "mxc_nand"); | ||
269 | clk_register_clkdev(clk[ssi1_ipg_gate], NULL, "imx-ssi.0"); | ||
270 | clk_register_clkdev(clk[ssi2_ipg_gate], NULL, "imx-ssi.1"); | ||
271 | clk_register_clkdev(clk[ssi3_ipg_gate], NULL, "imx-ssi.2"); | ||
272 | clk_register_clkdev(clk[ssi_ext1_gate], "ssi_ext1", NULL); | ||
273 | clk_register_clkdev(clk[ssi_ext2_gate], "ssi_ext2", NULL); | ||
274 | clk_register_clkdev(clk[sdma_gate], NULL, "imx35-sdma"); | ||
275 | clk_register_clkdev(clk[cpu_podf], "cpu", NULL); | ||
276 | clk_register_clkdev(clk[iim_gate], "iim", NULL); | ||
277 | clk_register_clkdev(clk[dummy], NULL, "imx2-wdt.0"); | ||
278 | clk_register_clkdev(clk[dummy], NULL, "imx2-wdt.1"); | ||
279 | clk_register_clkdev(clk[dummy], NULL, "imx-keypad"); | ||
280 | clk_register_clkdev(clk[tve_gate], NULL, "imx-tve.0"); | ||
281 | clk_register_clkdev(clk[ipu_di1_gate], "di1", "imx-tve.0"); | ||
282 | |||
283 | /* Set SDHC parents to be PLL2 */ | ||
284 | clk_set_parent(clk[esdhc_a_sel], clk[pll2_sw]); | ||
285 | clk_set_parent(clk[esdhc_b_sel], clk[pll2_sw]); | ||
286 | |||
287 | /* move usb phy clk to 24MHz */ | ||
288 | clk_set_parent(clk[usb_phy_sel], clk[osc]); | ||
289 | |||
290 | clk_prepare_enable(clk[gpc_dvfs]); | ||
291 | clk_prepare_enable(clk[ahb_max]); /* esdhc3 */ | ||
292 | clk_prepare_enable(clk[aips_tz1]); | ||
293 | clk_prepare_enable(clk[aips_tz2]); /* fec */ | ||
294 | clk_prepare_enable(clk[spba]); | ||
295 | clk_prepare_enable(clk[emi_fast_gate]); /* fec */ | ||
296 | clk_prepare_enable(clk[tmax1]); | ||
297 | clk_prepare_enable(clk[tmax2]); /* esdhc2, fec */ | ||
298 | clk_prepare_enable(clk[tmax3]); /* esdhc1, esdhc4 */ | ||
299 | } | ||
300 | |||
301 | int __init mx51_clocks_init(unsigned long rate_ckil, unsigned long rate_osc, | ||
302 | unsigned long rate_ckih1, unsigned long rate_ckih2) | ||
303 | { | ||
304 | int i; | ||
305 | |||
306 | clk[pll1_sw] = imx_clk_pllv2("pll1_sw", "osc", MX51_DPLL1_BASE); | ||
307 | clk[pll2_sw] = imx_clk_pllv2("pll2_sw", "osc", MX51_DPLL2_BASE); | ||
308 | clk[pll3_sw] = imx_clk_pllv2("pll3_sw", "osc", MX51_DPLL3_BASE); | ||
309 | clk[ipu_di0_sel] = imx_clk_mux("ipu_di0_sel", MXC_CCM_CSCMR2, 26, 3, | ||
310 | mx51_ipu_di0_sel, ARRAY_SIZE(mx51_ipu_di0_sel)); | ||
311 | clk[ipu_di1_sel] = imx_clk_mux("ipu_di1_sel", MXC_CCM_CSCMR2, 29, 3, | ||
312 | mx51_ipu_di1_sel, ARRAY_SIZE(mx51_ipu_di1_sel)); | ||
313 | clk[tve_ext_sel] = imx_clk_mux("tve_ext_sel", MXC_CCM_CSCMR1, 6, 1, | ||
314 | mx51_tve_ext_sel, ARRAY_SIZE(mx51_tve_ext_sel)); | ||
315 | clk[tve_gate] = imx_clk_gate2("tve_gate", "tve_sel", MXC_CCM_CCGR2, 30); | ||
316 | clk[tve_pred] = imx_clk_divider("tve_pred", "pll3_sw", MXC_CCM_CDCDR, 28, 3); | ||
317 | clk[esdhc1_per_gate] = imx_clk_gate2("esdhc1_per_gate", "esdhc_a_podf", MXC_CCM_CCGR3, 2); | ||
318 | clk[esdhc2_per_gate] = imx_clk_gate2("esdhc2_per_gate", "esdhc_b_podf", MXC_CCM_CCGR3, 6); | ||
319 | clk[esdhc3_per_gate] = imx_clk_gate2("esdhc3_per_gate", "esdhc_c_sel", MXC_CCM_CCGR3, 10); | ||
320 | clk[esdhc4_per_gate] = imx_clk_gate2("esdhc4_per_gate", "esdhc_d_sel", MXC_CCM_CCGR3, 14); | ||
321 | clk[usb_phy_gate] = imx_clk_gate2("usb_phy_gate", "usb_phy_sel", MXC_CCM_CCGR2, 0); | ||
322 | clk[hsi2c_gate] = imx_clk_gate2("hsi2c_gate", "ipg", MXC_CCM_CCGR1, 22); | ||
323 | clk[mipi_hsc1_gate] = imx_clk_gate2("mipi_hsc1_gate", "ipg", MXC_CCM_CCGR4, 6); | ||
324 | clk[mipi_hsc2_gate] = imx_clk_gate2("mipi_hsc2_gate", "ipg", MXC_CCM_CCGR4, 8); | ||
325 | clk[mipi_esc_gate] = imx_clk_gate2("mipi_esc_gate", "ipg", MXC_CCM_CCGR4, 10); | ||
326 | clk[mipi_hsp_gate] = imx_clk_gate2("mipi_hsp_gate", "ipg", MXC_CCM_CCGR4, 12); | ||
327 | |||
328 | for (i = 0; i < ARRAY_SIZE(clk); i++) | ||
329 | if (IS_ERR(clk[i])) | ||
330 | pr_err("i.MX51 clk %d: register failed with %ld\n", | ||
331 | i, PTR_ERR(clk[i])); | ||
332 | |||
333 | mx5_clocks_common_init(rate_ckil, rate_osc, rate_ckih1, rate_ckih2); | ||
334 | |||
335 | clk_register_clkdev(clk[hsi2c_gate], NULL, "imx-i2c.2"); | ||
336 | clk_register_clkdev(clk[mx51_mipi], "mipi_hsp", NULL); | ||
337 | clk_register_clkdev(clk[vpu_gate], NULL, "imx51-vpu.0"); | ||
338 | clk_register_clkdev(clk[fec_gate], NULL, "imx27-fec.0"); | ||
339 | clk_register_clkdev(clk[gpc_dvfs], "gpc_dvfs", NULL); | ||
340 | clk_register_clkdev(clk[ipu_gate], "bus", "imx51-ipu"); | ||
341 | clk_register_clkdev(clk[ipu_di0_gate], "di0", "imx51-ipu"); | ||
342 | clk_register_clkdev(clk[ipu_di1_gate], "di1", "imx51-ipu"); | ||
343 | clk_register_clkdev(clk[ipu_gate], "hsp", "imx51-ipu"); | ||
344 | clk_register_clkdev(clk[usb_phy_gate], "phy", "mxc-ehci.0"); | ||
345 | clk_register_clkdev(clk[esdhc1_ipg_gate], "ipg", "sdhci-esdhc-imx51.0"); | ||
346 | clk_register_clkdev(clk[dummy], "ahb", "sdhci-esdhc-imx51.0"); | ||
347 | clk_register_clkdev(clk[esdhc1_per_gate], "per", "sdhci-esdhc-imx51.0"); | ||
348 | clk_register_clkdev(clk[esdhc2_ipg_gate], "ipg", "sdhci-esdhc-imx51.1"); | ||
349 | clk_register_clkdev(clk[dummy], "ahb", "sdhci-esdhc-imx51.1"); | ||
350 | clk_register_clkdev(clk[esdhc2_per_gate], "per", "sdhci-esdhc-imx51.1"); | ||
351 | clk_register_clkdev(clk[esdhc3_ipg_gate], "ipg", "sdhci-esdhc-imx51.2"); | ||
352 | clk_register_clkdev(clk[dummy], "ahb", "sdhci-esdhc-imx51.2"); | ||
353 | clk_register_clkdev(clk[esdhc3_per_gate], "per", "sdhci-esdhc-imx51.2"); | ||
354 | clk_register_clkdev(clk[esdhc4_ipg_gate], "ipg", "sdhci-esdhc-imx51.3"); | ||
355 | clk_register_clkdev(clk[dummy], "ahb", "sdhci-esdhc-imx51.3"); | ||
356 | clk_register_clkdev(clk[esdhc4_per_gate], "per", "sdhci-esdhc-imx51.3"); | ||
357 | clk_register_clkdev(clk[ssi1_ipg_gate], NULL, "83fcc000.ssi"); | ||
358 | clk_register_clkdev(clk[ssi2_ipg_gate], NULL, "70014000.ssi"); | ||
359 | clk_register_clkdev(clk[ssi3_ipg_gate], NULL, "83fe8000.ssi"); | ||
360 | |||
361 | /* set the usboh3 parent to pll2_sw */ | ||
362 | clk_set_parent(clk[usboh3_sel], clk[pll2_sw]); | ||
363 | |||
364 | /* set SDHC root clock to 166.25MHZ*/ | ||
365 | clk_set_rate(clk[esdhc_a_podf], 166250000); | ||
366 | clk_set_rate(clk[esdhc_b_podf], 166250000); | ||
367 | |||
368 | /* System timer */ | ||
369 | mxc_timer_init(NULL, MX51_IO_ADDRESS(MX51_GPT1_BASE_ADDR), | ||
370 | MX51_INT_GPT); | ||
371 | |||
372 | clk_prepare_enable(clk[iim_gate]); | ||
373 | imx_print_silicon_rev("i.MX51", mx51_revision()); | ||
374 | clk_disable_unprepare(clk[iim_gate]); | ||
375 | |||
376 | return 0; | ||
377 | } | ||
378 | |||
379 | int __init mx53_clocks_init(unsigned long rate_ckil, unsigned long rate_osc, | ||
380 | unsigned long rate_ckih1, unsigned long rate_ckih2) | ||
381 | { | ||
382 | int i; | ||
383 | unsigned long r; | ||
384 | |||
385 | clk[pll1_sw] = imx_clk_pllv2("pll1_sw", "osc", MX53_DPLL1_BASE); | ||
386 | clk[pll2_sw] = imx_clk_pllv2("pll2_sw", "osc", MX53_DPLL2_BASE); | ||
387 | clk[pll3_sw] = imx_clk_pllv2("pll3_sw", "osc", MX53_DPLL3_BASE); | ||
388 | clk[pll4_sw] = imx_clk_pllv2("pll4_sw", "osc", MX53_DPLL4_BASE); | ||
389 | |||
390 | clk[ldb_di1_sel] = imx_clk_mux("ldb_di1_sel", MXC_CCM_CSCMR2, 9, 1, | ||
391 | mx53_ldb_di1_sel, ARRAY_SIZE(mx53_ldb_di1_sel)); | ||
392 | clk[ldb_di1_div_3_5] = imx_clk_fixed_factor("ldb_di1_div_3_5", "ldb_di1_sel", 2, 7); | ||
393 | clk[ldb_di1_div] = imx_clk_divider("ldb_di1_div", "ldb_di1_div_3_5", MXC_CCM_CSCMR2, 11, 1); | ||
394 | clk[di_pll4_podf] = imx_clk_divider("di_pll4_podf", "pll4_sw", MXC_CCM_CDCDR, 16, 3); | ||
395 | clk[ldb_di0_sel] = imx_clk_mux("ldb_di0_sel", MXC_CCM_CSCMR2, 8, 1, | ||
396 | mx53_ldb_di0_sel, ARRAY_SIZE(mx53_ldb_di0_sel)); | ||
397 | clk[ldb_di0_div_3_5] = imx_clk_fixed_factor("ldb_di0_div_3_5", "ldb_di0_sel", 2, 7); | ||
398 | clk[ldb_di0_div] = imx_clk_divider("ldb_di0_div", "ldb_di0_div_3_5", MXC_CCM_CSCMR2, 10, 1); | ||
399 | clk[ldb_di0_gate] = imx_clk_gate2("ldb_di0_gate", "ldb_di0_div", MXC_CCM_CCGR6, 28); | ||
400 | clk[ldb_di1_gate] = imx_clk_gate2("ldb_di1_gate", "ldb_di1_div", MXC_CCM_CCGR6, 30); | ||
401 | clk[ipu_di0_sel] = imx_clk_mux("ipu_di0_sel", MXC_CCM_CSCMR2, 26, 3, | ||
402 | mx53_ipu_di0_sel, ARRAY_SIZE(mx53_ipu_di0_sel)); | ||
403 | clk[ipu_di1_sel] = imx_clk_mux("ipu_di1_sel", MXC_CCM_CSCMR2, 29, 3, | ||
404 | mx53_ipu_di1_sel, ARRAY_SIZE(mx53_ipu_di1_sel)); | ||
405 | clk[tve_ext_sel] = imx_clk_mux("tve_ext_sel", MXC_CCM_CSCMR1, 6, 1, | ||
406 | mx53_tve_ext_sel, ARRAY_SIZE(mx53_tve_ext_sel)); | ||
407 | clk[tve_gate] = imx_clk_gate2("tve_gate", "tve_pred", MXC_CCM_CCGR2, 30); | ||
408 | clk[tve_pred] = imx_clk_divider("tve_pred", "tve_ext_sel", MXC_CCM_CDCDR, 28, 3); | ||
409 | clk[esdhc1_per_gate] = imx_clk_gate2("esdhc1_per_gate", "esdhc_a_podf", MXC_CCM_CCGR3, 2); | ||
410 | clk[esdhc2_per_gate] = imx_clk_gate2("esdhc2_per_gate", "esdhc_c_sel", MXC_CCM_CCGR3, 6); | ||
411 | clk[esdhc3_per_gate] = imx_clk_gate2("esdhc3_per_gate", "esdhc_b_podf", MXC_CCM_CCGR3, 10); | ||
412 | clk[esdhc4_per_gate] = imx_clk_gate2("esdhc4_per_gate", "esdhc_d_sel", MXC_CCM_CCGR3, 14); | ||
413 | clk[usb_phy1_gate] = imx_clk_gate2("usb_phy1_gate", "usb_phy_sel", MXC_CCM_CCGR4, 10); | ||
414 | clk[usb_phy2_gate] = imx_clk_gate2("usb_phy2_gate", "usb_phy_sel", MXC_CCM_CCGR4, 12); | ||
415 | clk[can2_serial_gate] = imx_clk_gate2("can2_serial_gate", "ipg", MXC_CCM_CCGR4, 6); | ||
416 | clk[can2_ipg_gate] = imx_clk_gate2("can2_ipg_gate", "ipg", MXC_CCM_CCGR4, 8); | ||
417 | clk[i2c3_gate] = imx_clk_gate2("i2c3_gate", "per_root", MXC_CCM_CCGR1, 22); | ||
418 | |||
419 | for (i = 0; i < ARRAY_SIZE(clk); i++) | ||
420 | if (IS_ERR(clk[i])) | ||
421 | pr_err("i.MX53 clk %d: register failed with %ld\n", | ||
422 | i, PTR_ERR(clk[i])); | ||
423 | |||
424 | mx5_clocks_common_init(rate_ckil, rate_osc, rate_ckih1, rate_ckih2); | ||
425 | |||
426 | clk_register_clkdev(clk[vpu_gate], NULL, "imx53-vpu.0"); | ||
427 | clk_register_clkdev(clk[i2c3_gate], NULL, "imx-i2c.2"); | ||
428 | clk_register_clkdev(clk[fec_gate], NULL, "imx25-fec.0"); | ||
429 | clk_register_clkdev(clk[ipu_gate], "bus", "imx53-ipu"); | ||
430 | clk_register_clkdev(clk[ipu_di0_gate], "di0", "imx53-ipu"); | ||
431 | clk_register_clkdev(clk[ipu_di1_gate], "di1", "imx53-ipu"); | ||
432 | clk_register_clkdev(clk[ipu_gate], "hsp", "imx53-ipu"); | ||
433 | clk_register_clkdev(clk[usb_phy1_gate], "usb_phy1", "mxc-ehci.0"); | ||
434 | clk_register_clkdev(clk[esdhc1_ipg_gate], "ipg", "sdhci-esdhc-imx53.0"); | ||
435 | clk_register_clkdev(clk[dummy], "ahb", "sdhci-esdhc-imx53.0"); | ||
436 | clk_register_clkdev(clk[esdhc1_per_gate], "per", "sdhci-esdhc-imx53.0"); | ||
437 | clk_register_clkdev(clk[esdhc2_ipg_gate], "ipg", "sdhci-esdhc-imx53.1"); | ||
438 | clk_register_clkdev(clk[dummy], "ahb", "sdhci-esdhc-imx53.1"); | ||
439 | clk_register_clkdev(clk[esdhc2_per_gate], "per", "sdhci-esdhc-imx53.1"); | ||
440 | clk_register_clkdev(clk[esdhc3_ipg_gate], "ipg", "sdhci-esdhc-imx53.2"); | ||
441 | clk_register_clkdev(clk[dummy], "ahb", "sdhci-esdhc-imx53.2"); | ||
442 | clk_register_clkdev(clk[esdhc3_per_gate], "per", "sdhci-esdhc-imx53.2"); | ||
443 | clk_register_clkdev(clk[esdhc4_ipg_gate], "ipg", "sdhci-esdhc-imx53.3"); | ||
444 | clk_register_clkdev(clk[dummy], "ahb", "sdhci-esdhc-imx53.3"); | ||
445 | clk_register_clkdev(clk[esdhc4_per_gate], "per", "sdhci-esdhc-imx53.3"); | ||
446 | clk_register_clkdev(clk[ssi1_ipg_gate], NULL, "63fcc000.ssi"); | ||
447 | clk_register_clkdev(clk[ssi2_ipg_gate], NULL, "50014000.ssi"); | ||
448 | clk_register_clkdev(clk[ssi3_ipg_gate], NULL, "63fd0000.ssi"); | ||
449 | |||
450 | /* set SDHC root clock to 200MHZ*/ | ||
451 | clk_set_rate(clk[esdhc_a_podf], 200000000); | ||
452 | clk_set_rate(clk[esdhc_b_podf], 200000000); | ||
453 | |||
454 | /* System timer */ | ||
455 | mxc_timer_init(NULL, MX53_IO_ADDRESS(MX53_GPT1_BASE_ADDR), | ||
456 | MX53_INT_GPT); | ||
457 | |||
458 | clk_prepare_enable(clk[iim_gate]); | ||
459 | imx_print_silicon_rev("i.MX53", mx53_revision()); | ||
460 | clk_disable_unprepare(clk[iim_gate]); | ||
461 | |||
462 | r = clk_round_rate(clk[usboh3_per_gate], 54000000); | ||
463 | clk_set_rate(clk[usboh3_per_gate], r); | ||
464 | |||
465 | return 0; | ||
466 | } | ||
467 | |||
468 | #ifdef CONFIG_OF | ||
469 | static void __init clk_get_freq_dt(unsigned long *ckil, unsigned long *osc, | ||
470 | unsigned long *ckih1, unsigned long *ckih2) | ||
471 | { | ||
472 | struct device_node *np; | ||
473 | |||
474 | /* retrieve the freqency of fixed clocks from device tree */ | ||
475 | for_each_compatible_node(np, NULL, "fixed-clock") { | ||
476 | u32 rate; | ||
477 | if (of_property_read_u32(np, "clock-frequency", &rate)) | ||
478 | continue; | ||
479 | |||
480 | if (of_device_is_compatible(np, "fsl,imx-ckil")) | ||
481 | *ckil = rate; | ||
482 | else if (of_device_is_compatible(np, "fsl,imx-osc")) | ||
483 | *osc = rate; | ||
484 | else if (of_device_is_compatible(np, "fsl,imx-ckih1")) | ||
485 | *ckih1 = rate; | ||
486 | else if (of_device_is_compatible(np, "fsl,imx-ckih2")) | ||
487 | *ckih2 = rate; | ||
488 | } | ||
489 | } | ||
490 | |||
491 | int __init mx51_clocks_init_dt(void) | ||
492 | { | ||
493 | unsigned long ckil, osc, ckih1, ckih2; | ||
494 | |||
495 | clk_get_freq_dt(&ckil, &osc, &ckih1, &ckih2); | ||
496 | return mx51_clocks_init(ckil, osc, ckih1, ckih2); | ||
497 | } | ||
498 | |||
499 | int __init mx53_clocks_init_dt(void) | ||
500 | { | ||
501 | unsigned long ckil, osc, ckih1, ckih2; | ||
502 | |||
503 | clk_get_freq_dt(&ckil, &osc, &ckih1, &ckih2); | ||
504 | return mx53_clocks_init(ckil, osc, ckih1, ckih2); | ||
505 | } | ||
506 | #endif | ||
diff --git a/arch/arm/mach-imx/clk-imx6q.c b/arch/arm/mach-imx/clk-imx6q.c new file mode 100644 index 000000000000..cab02d0a15d6 --- /dev/null +++ b/arch/arm/mach-imx/clk-imx6q.c | |||
@@ -0,0 +1,444 @@ | |||
1 | /* | ||
2 | * Copyright 2011 Freescale Semiconductor, Inc. | ||
3 | * Copyright 2011 Linaro Ltd. | ||
4 | * | ||
5 | * The code contained herein is licensed under the GNU General Public | ||
6 | * License. You may obtain a copy of the GNU General Public License | ||
7 | * Version 2 or later at the following locations: | ||
8 | * | ||
9 | * http://www.opensource.org/licenses/gpl-license.html | ||
10 | * http://www.gnu.org/copyleft/gpl.html | ||
11 | */ | ||
12 | |||
13 | #include <linux/init.h> | ||
14 | #include <linux/types.h> | ||
15 | #include <linux/clk.h> | ||
16 | #include <linux/clkdev.h> | ||
17 | #include <linux/err.h> | ||
18 | #include <linux/io.h> | ||
19 | #include <linux/of.h> | ||
20 | #include <linux/of_address.h> | ||
21 | #include <linux/of_irq.h> | ||
22 | #include <mach/common.h> | ||
23 | #include "clk.h" | ||
24 | |||
25 | #define CCGR0 0x68 | ||
26 | #define CCGR1 0x6c | ||
27 | #define CCGR2 0x70 | ||
28 | #define CCGR3 0x74 | ||
29 | #define CCGR4 0x78 | ||
30 | #define CCGR5 0x7c | ||
31 | #define CCGR6 0x80 | ||
32 | #define CCGR7 0x84 | ||
33 | |||
34 | #define CLPCR 0x54 | ||
35 | #define BP_CLPCR_LPM 0 | ||
36 | #define BM_CLPCR_LPM (0x3 << 0) | ||
37 | #define BM_CLPCR_BYPASS_PMIC_READY (0x1 << 2) | ||
38 | #define BM_CLPCR_ARM_CLK_DIS_ON_LPM (0x1 << 5) | ||
39 | #define BM_CLPCR_SBYOS (0x1 << 6) | ||
40 | #define BM_CLPCR_DIS_REF_OSC (0x1 << 7) | ||
41 | #define BM_CLPCR_VSTBY (0x1 << 8) | ||
42 | #define BP_CLPCR_STBY_COUNT 9 | ||
43 | #define BM_CLPCR_STBY_COUNT (0x3 << 9) | ||
44 | #define BM_CLPCR_COSC_PWRDOWN (0x1 << 11) | ||
45 | #define BM_CLPCR_WB_PER_AT_LPM (0x1 << 16) | ||
46 | #define BM_CLPCR_WB_CORE_AT_LPM (0x1 << 17) | ||
47 | #define BM_CLPCR_BYP_MMDC_CH0_LPM_HS (0x1 << 19) | ||
48 | #define BM_CLPCR_BYP_MMDC_CH1_LPM_HS (0x1 << 21) | ||
49 | #define BM_CLPCR_MASK_CORE0_WFI (0x1 << 22) | ||
50 | #define BM_CLPCR_MASK_CORE1_WFI (0x1 << 23) | ||
51 | #define BM_CLPCR_MASK_CORE2_WFI (0x1 << 24) | ||
52 | #define BM_CLPCR_MASK_CORE3_WFI (0x1 << 25) | ||
53 | #define BM_CLPCR_MASK_SCU_IDLE (0x1 << 26) | ||
54 | #define BM_CLPCR_MASK_L2CC_IDLE (0x1 << 27) | ||
55 | |||
56 | static void __iomem *ccm_base; | ||
57 | |||
58 | void __init imx6q_clock_map_io(void) { } | ||
59 | |||
60 | int imx6q_set_lpm(enum mxc_cpu_pwr_mode mode) | ||
61 | { | ||
62 | u32 val = readl_relaxed(ccm_base + CLPCR); | ||
63 | |||
64 | val &= ~BM_CLPCR_LPM; | ||
65 | switch (mode) { | ||
66 | case WAIT_CLOCKED: | ||
67 | break; | ||
68 | case WAIT_UNCLOCKED: | ||
69 | val |= 0x1 << BP_CLPCR_LPM; | ||
70 | break; | ||
71 | case STOP_POWER_ON: | ||
72 | val |= 0x2 << BP_CLPCR_LPM; | ||
73 | break; | ||
74 | case WAIT_UNCLOCKED_POWER_OFF: | ||
75 | val |= 0x1 << BP_CLPCR_LPM; | ||
76 | val &= ~BM_CLPCR_VSTBY; | ||
77 | val &= ~BM_CLPCR_SBYOS; | ||
78 | break; | ||
79 | case STOP_POWER_OFF: | ||
80 | val |= 0x2 << BP_CLPCR_LPM; | ||
81 | val |= 0x3 << BP_CLPCR_STBY_COUNT; | ||
82 | val |= BM_CLPCR_VSTBY; | ||
83 | val |= BM_CLPCR_SBYOS; | ||
84 | break; | ||
85 | default: | ||
86 | return -EINVAL; | ||
87 | } | ||
88 | |||
89 | writel_relaxed(val, ccm_base + CLPCR); | ||
90 | |||
91 | return 0; | ||
92 | } | ||
93 | |||
94 | static const char *step_sels[] = { "osc", "pll2_pfd2_396m", }; | ||
95 | static const char *pll1_sw_sels[] = { "pll1_sys", "step", }; | ||
96 | static const char *periph_pre_sels[] = { "pll2_bus", "pll2_pfd2_396m", "pll2_pfd0_352m", "pll2_198m", }; | ||
97 | static const char *periph_clk2_sels[] = { "pll3_usb_otg", "osc", }; | ||
98 | static const char *periph_sels[] = { "periph_pre", "periph_clk2", }; | ||
99 | static const char *periph2_sels[] = { "periph2_pre", "periph2_clk2", }; | ||
100 | static const char *axi_sels[] = { "periph", "pll2_pfd2_396m", "pll3_pfd1_540m", }; | ||
101 | static const char *audio_sels[] = { "pll4_audio", "pll3_pfd2_508m", "pll3_pfd3_454m", "pll3_usb_otg", }; | ||
102 | static const char *gpu_axi_sels[] = { "axi", "ahb", }; | ||
103 | static const char *gpu2d_core_sels[] = { "axi", "pll3_usb_otg", "pll2_pfd0_352m", "pll2_pfd2_396m", }; | ||
104 | static const char *gpu3d_core_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll2_pfd2_396m", }; | ||
105 | static const char *gpu3d_shader_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll2_pfd9_720m", }; | ||
106 | static const char *ipu_sels[] = { "mmdc_ch0_axi", "pll2_pfd2_396m", "pll3_120m", "pll3_pfd1_540m", }; | ||
107 | static const char *ldb_di_sels[] = { "pll5_video", "pll2_pfd0_352m", "pll2_pfd2_396m", "pll3_pfd1_540m", }; | ||
108 | static const char *ipu_di_pre_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll5_video", "pll2_pfd0_352m", "pll2_pfd2_396m", "pll3_pfd1_540m", }; | ||
109 | static const char *ipu1_di0_sels[] = { "ipu1_di0_pre", "dummy", "dummy", "ldb_di0", "ldb_di1", }; | ||
110 | static const char *ipu1_di1_sels[] = { "ipu1_di1_pre", "dummy", "dummy", "ldb_di0", "ldb_di1", }; | ||
111 | static const char *ipu2_di0_sels[] = { "ipu2_di0_pre", "dummy", "dummy", "ldb_di0", "ldb_di1", }; | ||
112 | static const char *ipu2_di1_sels[] = { "ipu2_di1_pre", "dummy", "dummy", "ldb_di0", "ldb_di1", }; | ||
113 | static const char *hsi_tx_sels[] = { "pll3_120m", "pll2_pfd2_396m", }; | ||
114 | static const char *pcie_axi_sels[] = { "axi", "ahb", }; | ||
115 | static const char *ssi_sels[] = { "pll3_pfd2_508m", "pll3_pfd3_454m", "pll4_audio", }; | ||
116 | static const char *usdhc_sels[] = { "pll2_pfd2_396m", "pll2_pfd0_352m", }; | ||
117 | static const char *enfc_sels[] = { "pll2_pfd0_352m", "pll2_bus", "pll3_usb_otg", "pll2_pfd2_396m", }; | ||
118 | static const char *emi_sels[] = { "axi", "pll3_usb_otg", "pll2_pfd2_396m", "pll2_pfd0_352m", }; | ||
119 | static const char *vdo_axi_sels[] = { "axi", "ahb", }; | ||
120 | static const char *vpu_axi_sels[] = { "axi", "pll2_pfd2_396m", "pll2_pfd0_352m", }; | ||
121 | static const char *cko1_sels[] = { "pll3_usb_otg", "pll2_bus", "pll1_sys", "pll5_video", | ||
122 | "dummy", "axi", "enfc", "ipu1_di0", "ipu1_di1", "ipu2_di0", | ||
123 | "ipu2_di1", "ahb", "ipg", "ipg_per", "ckil", "pll4_audio", }; | ||
124 | |||
125 | static const char * const clks_init_on[] __initconst = { | ||
126 | "mmdc_ch0_axi", "mmdc_ch1_axi", "usboh3", | ||
127 | }; | ||
128 | |||
129 | enum mx6q_clks { | ||
130 | dummy, ckil, ckih, osc, pll2_pfd0_352m, pll2_pfd1_594m, pll2_pfd2_396m, | ||
131 | pll3_pfd0_720m, pll3_pfd1_540m, pll3_pfd2_508m, pll3_pfd3_454m, | ||
132 | pll2_198m, pll3_120m, pll3_80m, pll3_60m, twd, step, pll1_sw, | ||
133 | periph_pre, periph2_pre, periph_clk2_sel, periph2_clk2_sel, axi_sel, | ||
134 | esai_sel, asrc_sel, spdif_sel, gpu2d_axi, gpu3d_axi, gpu2d_core_sel, | ||
135 | gpu3d_core_sel, gpu3d_shader_sel, ipu1_sel, ipu2_sel, ldb_di0_sel, | ||
136 | ldb_di1_sel, ipu1_di0_pre_sel, ipu1_di1_pre_sel, ipu2_di0_pre_sel, | ||
137 | ipu2_di1_pre_sel, ipu1_di0_sel, ipu1_di1_sel, ipu2_di0_sel, | ||
138 | ipu2_di1_sel, hsi_tx_sel, pcie_axi_sel, ssi1_sel, ssi2_sel, ssi3_sel, | ||
139 | usdhc1_sel, usdhc2_sel, usdhc3_sel, usdhc4_sel, enfc_sel, emi_sel, | ||
140 | emi_slow_sel, vdo_axi_sel, vpu_axi_sel, cko1_sel, periph, periph2, | ||
141 | periph_clk2, periph2_clk2, ipg, ipg_per, esai_pred, esai_podf, | ||
142 | asrc_pred, asrc_podf, spdif_pred, spdif_podf, can_root, ecspi_root, | ||
143 | gpu2d_core_podf, gpu3d_core_podf, gpu3d_shader, ipu1_podf, ipu2_podf, | ||
144 | ldb_di0_podf, ldb_di1_podf, ipu1_di0_pre, ipu1_di1_pre, ipu2_di0_pre, | ||
145 | ipu2_di1_pre, hsi_tx_podf, ssi1_pred, ssi1_podf, ssi2_pred, ssi2_podf, | ||
146 | ssi3_pred, ssi3_podf, uart_serial_podf, usdhc1_podf, usdhc2_podf, | ||
147 | usdhc3_podf, usdhc4_podf, enfc_pred, enfc_podf, emi_podf, | ||
148 | emi_slow_podf, vpu_axi_podf, cko1_podf, axi, mmdc_ch0_axi_podf, | ||
149 | mmdc_ch1_axi_podf, arm, ahb, apbh_dma, asrc, can1_ipg, can1_serial, | ||
150 | can2_ipg, can2_serial, ecspi1, ecspi2, ecspi3, ecspi4, ecspi5, enet, | ||
151 | esai, gpt_ipg, gpt_ipg_per, gpu2d_core, gpu3d_core, hdmi_iahb, | ||
152 | hdmi_isfr, i2c1, i2c2, i2c3, iim, enfc, ipu1, ipu1_di0, ipu1_di1, ipu2, | ||
153 | ipu2_di0, ldb_di0, ldb_di1, ipu2_di1, hsi_tx, mlb, mmdc_ch0_axi, | ||
154 | mmdc_ch1_axi, ocram, openvg_axi, pcie_axi, pwm1, pwm2, pwm3, pwm4, | ||
155 | gpmi_bch_apb, gpmi_bch, gpmi_io, gpmi_apb, sata, sdma, spba, ssi1, | ||
156 | ssi2, ssi3, uart_ipg, uart_serial, usboh3, usdhc1, usdhc2, usdhc3, | ||
157 | usdhc4, vdo_axi, vpu_axi, cko1, pll1_sys, pll2_bus, pll3_usb_otg, | ||
158 | pll4_audio, pll5_video, pll6_mlb, pll7_usb_host, pll8_enet, ssi1_ipg, | ||
159 | ssi2_ipg, ssi3_ipg, clk_max | ||
160 | }; | ||
161 | |||
162 | static struct clk *clk[clk_max]; | ||
163 | |||
164 | int __init mx6q_clocks_init(void) | ||
165 | { | ||
166 | struct device_node *np; | ||
167 | void __iomem *base; | ||
168 | struct clk *c; | ||
169 | int i, irq; | ||
170 | |||
171 | clk[dummy] = imx_clk_fixed("dummy", 0); | ||
172 | |||
173 | /* retrieve the freqency of fixed clocks from device tree */ | ||
174 | for_each_compatible_node(np, NULL, "fixed-clock") { | ||
175 | u32 rate; | ||
176 | if (of_property_read_u32(np, "clock-frequency", &rate)) | ||
177 | continue; | ||
178 | |||
179 | if (of_device_is_compatible(np, "fsl,imx-ckil")) | ||
180 | clk[ckil] = imx_clk_fixed("ckil", rate); | ||
181 | else if (of_device_is_compatible(np, "fsl,imx-ckih1")) | ||
182 | clk[ckih] = imx_clk_fixed("ckih", rate); | ||
183 | else if (of_device_is_compatible(np, "fsl,imx-osc")) | ||
184 | clk[osc] = imx_clk_fixed("osc", rate); | ||
185 | } | ||
186 | |||
187 | np = of_find_compatible_node(NULL, NULL, "fsl,imx6q-anatop"); | ||
188 | base = of_iomap(np, 0); | ||
189 | WARN_ON(!base); | ||
190 | |||
191 | /* type name parent_name base gate_mask div_mask */ | ||
192 | clk[pll1_sys] = imx_clk_pllv3(IMX_PLLV3_SYS, "pll1_sys", "osc", base, 0x2000, 0x7f); | ||
193 | clk[pll2_bus] = imx_clk_pllv3(IMX_PLLV3_GENERIC, "pll2_bus", "osc", base + 0x30, 0x2000, 0x1); | ||
194 | clk[pll3_usb_otg] = imx_clk_pllv3(IMX_PLLV3_USB, "pll3_usb_otg", "osc", base + 0x10, 0x2000, 0x3); | ||
195 | clk[pll4_audio] = imx_clk_pllv3(IMX_PLLV3_AV, "pll4_audio", "osc", base + 0x70, 0x2000, 0x7f); | ||
196 | clk[pll5_video] = imx_clk_pllv3(IMX_PLLV3_AV, "pll5_video", "osc", base + 0xa0, 0x2000, 0x7f); | ||
197 | clk[pll6_mlb] = imx_clk_pllv3(IMX_PLLV3_MLB, "pll6_mlb", "osc", base + 0xd0, 0x2000, 0x0); | ||
198 | clk[pll7_usb_host] = imx_clk_pllv3(IMX_PLLV3_USB, "pll7_usb_host","osc", base + 0x20, 0x2000, 0x3); | ||
199 | clk[pll8_enet] = imx_clk_pllv3(IMX_PLLV3_ENET, "pll8_enet", "osc", base + 0xe0, 0x182000, 0x3); | ||
200 | |||
201 | /* name parent_name reg idx */ | ||
202 | clk[pll2_pfd0_352m] = imx_clk_pfd("pll2_pfd0_352m", "pll2_bus", base + 0x100, 0); | ||
203 | clk[pll2_pfd1_594m] = imx_clk_pfd("pll2_pfd1_594m", "pll2_bus", base + 0x100, 1); | ||
204 | clk[pll2_pfd2_396m] = imx_clk_pfd("pll2_pfd2_396m", "pll2_bus", base + 0x100, 2); | ||
205 | clk[pll3_pfd0_720m] = imx_clk_pfd("pll3_pfd0_720m", "pll3_usb_otg", base + 0xf0, 0); | ||
206 | clk[pll3_pfd1_540m] = imx_clk_pfd("pll3_pfd1_540m", "pll3_usb_otg", base + 0xf0, 1); | ||
207 | clk[pll3_pfd2_508m] = imx_clk_pfd("pll3_pfd2_508m", "pll3_usb_otg", base + 0xf0, 2); | ||
208 | clk[pll3_pfd3_454m] = imx_clk_pfd("pll3_pfd3_454m", "pll3_usb_otg", base + 0xf0, 3); | ||
209 | |||
210 | /* name parent_name mult div */ | ||
211 | clk[pll2_198m] = imx_clk_fixed_factor("pll2_198m", "pll2_pfd2_396m", 1, 2); | ||
212 | clk[pll3_120m] = imx_clk_fixed_factor("pll3_120m", "pll3_usb_otg", 1, 4); | ||
213 | clk[pll3_80m] = imx_clk_fixed_factor("pll3_80m", "pll3_usb_otg", 1, 6); | ||
214 | clk[pll3_60m] = imx_clk_fixed_factor("pll3_60m", "pll3_usb_otg", 1, 8); | ||
215 | clk[twd] = imx_clk_fixed_factor("twd", "arm", 1, 2); | ||
216 | |||
217 | np = of_find_compatible_node(NULL, NULL, "fsl,imx6q-ccm"); | ||
218 | base = of_iomap(np, 0); | ||
219 | WARN_ON(!base); | ||
220 | ccm_base = base; | ||
221 | |||
222 | /* name reg shift width parent_names num_parents */ | ||
223 | clk[step] = imx_clk_mux("step", base + 0xc, 8, 1, step_sels, ARRAY_SIZE(step_sels)); | ||
224 | clk[pll1_sw] = imx_clk_mux("pll1_sw", base + 0xc, 2, 1, pll1_sw_sels, ARRAY_SIZE(pll1_sw_sels)); | ||
225 | clk[periph_pre] = imx_clk_mux("periph_pre", base + 0x18, 18, 2, periph_pre_sels, ARRAY_SIZE(periph_pre_sels)); | ||
226 | clk[periph2_pre] = imx_clk_mux("periph2_pre", base + 0x18, 21, 2, periph_pre_sels, ARRAY_SIZE(periph_pre_sels)); | ||
227 | clk[periph_clk2_sel] = imx_clk_mux("periph_clk2_sel", base + 0x18, 12, 1, periph_clk2_sels, ARRAY_SIZE(periph_clk2_sels)); | ||
228 | clk[periph2_clk2_sel] = imx_clk_mux("periph2_clk2_sel", base + 0x18, 20, 1, periph_clk2_sels, ARRAY_SIZE(periph_clk2_sels)); | ||
229 | clk[axi_sel] = imx_clk_mux("axi_sel", base + 0x14, 6, 2, axi_sels, ARRAY_SIZE(axi_sels)); | ||
230 | clk[esai_sel] = imx_clk_mux("esai_sel", base + 0x20, 19, 2, audio_sels, ARRAY_SIZE(audio_sels)); | ||
231 | clk[asrc_sel] = imx_clk_mux("asrc_sel", base + 0x30, 7, 2, audio_sels, ARRAY_SIZE(audio_sels)); | ||
232 | clk[spdif_sel] = imx_clk_mux("spdif_sel", base + 0x30, 20, 2, audio_sels, ARRAY_SIZE(audio_sels)); | ||
233 | clk[gpu2d_axi] = imx_clk_mux("gpu2d_axi", base + 0x18, 0, 1, gpu_axi_sels, ARRAY_SIZE(gpu_axi_sels)); | ||
234 | clk[gpu3d_axi] = imx_clk_mux("gpu3d_axi", base + 0x18, 1, 1, gpu_axi_sels, ARRAY_SIZE(gpu_axi_sels)); | ||
235 | clk[gpu2d_core_sel] = imx_clk_mux("gpu2d_core_sel", base + 0x18, 16, 2, gpu2d_core_sels, ARRAY_SIZE(gpu2d_core_sels)); | ||
236 | clk[gpu3d_core_sel] = imx_clk_mux("gpu3d_core_sel", base + 0x18, 4, 2, gpu3d_core_sels, ARRAY_SIZE(gpu3d_core_sels)); | ||
237 | clk[gpu3d_shader_sel] = imx_clk_mux("gpu3d_shader_sel", base + 0x18, 8, 2, gpu3d_shader_sels, ARRAY_SIZE(gpu3d_shader_sels)); | ||
238 | clk[ipu1_sel] = imx_clk_mux("ipu1_sel", base + 0x3c, 9, 2, ipu_sels, ARRAY_SIZE(ipu_sels)); | ||
239 | clk[ipu2_sel] = imx_clk_mux("ipu2_sel", base + 0x3c, 14, 2, ipu_sels, ARRAY_SIZE(ipu_sels)); | ||
240 | clk[ldb_di0_sel] = imx_clk_mux("ldb_di0_sel", base + 0x2c, 9, 3, ldb_di_sels, ARRAY_SIZE(ldb_di_sels)); | ||
241 | clk[ldb_di1_sel] = imx_clk_mux("ldb_di1_sel", base + 0x2c, 12, 3, ldb_di_sels, ARRAY_SIZE(ldb_di_sels)); | ||
242 | clk[ipu1_di0_pre_sel] = imx_clk_mux("ipu1_di0_pre_sel", base + 0x34, 6, 3, ipu_di_pre_sels, ARRAY_SIZE(ipu_di_pre_sels)); | ||
243 | clk[ipu1_di1_pre_sel] = imx_clk_mux("ipu1_di1_pre_sel", base + 0x34, 15, 3, ipu_di_pre_sels, ARRAY_SIZE(ipu_di_pre_sels)); | ||
244 | clk[ipu2_di0_pre_sel] = imx_clk_mux("ipu2_di0_pre_sel", base + 0x38, 6, 3, ipu_di_pre_sels, ARRAY_SIZE(ipu_di_pre_sels)); | ||
245 | clk[ipu2_di1_pre_sel] = imx_clk_mux("ipu2_di1_pre_sel", base + 0x38, 15, 3, ipu_di_pre_sels, ARRAY_SIZE(ipu_di_pre_sels)); | ||
246 | clk[ipu1_di0_sel] = imx_clk_mux("ipu1_di0_sel", base + 0x34, 0, 3, ipu1_di0_sels, ARRAY_SIZE(ipu1_di0_sels)); | ||
247 | clk[ipu1_di1_sel] = imx_clk_mux("ipu1_di1_sel", base + 0x34, 9, 3, ipu1_di1_sels, ARRAY_SIZE(ipu1_di1_sels)); | ||
248 | clk[ipu2_di0_sel] = imx_clk_mux("ipu2_di0_sel", base + 0x38, 0, 3, ipu2_di0_sels, ARRAY_SIZE(ipu2_di0_sels)); | ||
249 | clk[ipu2_di1_sel] = imx_clk_mux("ipu2_di1_sel", base + 0x38, 9, 3, ipu2_di1_sels, ARRAY_SIZE(ipu2_di1_sels)); | ||
250 | clk[hsi_tx_sel] = imx_clk_mux("hsi_tx_sel", base + 0x30, 28, 1, hsi_tx_sels, ARRAY_SIZE(hsi_tx_sels)); | ||
251 | clk[pcie_axi_sel] = imx_clk_mux("pcie_axi_sel", base + 0x18, 10, 1, pcie_axi_sels, ARRAY_SIZE(pcie_axi_sels)); | ||
252 | clk[ssi1_sel] = imx_clk_mux("ssi1_sel", base + 0x1c, 10, 2, ssi_sels, ARRAY_SIZE(ssi_sels)); | ||
253 | clk[ssi2_sel] = imx_clk_mux("ssi2_sel", base + 0x1c, 12, 2, ssi_sels, ARRAY_SIZE(ssi_sels)); | ||
254 | clk[ssi3_sel] = imx_clk_mux("ssi3_sel", base + 0x1c, 14, 2, ssi_sels, ARRAY_SIZE(ssi_sels)); | ||
255 | clk[usdhc1_sel] = imx_clk_mux("usdhc1_sel", base + 0x1c, 16, 1, usdhc_sels, ARRAY_SIZE(usdhc_sels)); | ||
256 | clk[usdhc2_sel] = imx_clk_mux("usdhc2_sel", base + 0x1c, 17, 1, usdhc_sels, ARRAY_SIZE(usdhc_sels)); | ||
257 | clk[usdhc3_sel] = imx_clk_mux("usdhc3_sel", base + 0x1c, 18, 1, usdhc_sels, ARRAY_SIZE(usdhc_sels)); | ||
258 | clk[usdhc4_sel] = imx_clk_mux("usdhc4_sel", base + 0x1c, 19, 1, usdhc_sels, ARRAY_SIZE(usdhc_sels)); | ||
259 | clk[enfc_sel] = imx_clk_mux("enfc_sel", base + 0x2c, 16, 2, enfc_sels, ARRAY_SIZE(enfc_sels)); | ||
260 | clk[emi_sel] = imx_clk_mux("emi_sel", base + 0x1c, 27, 2, emi_sels, ARRAY_SIZE(emi_sels)); | ||
261 | clk[emi_slow_sel] = imx_clk_mux("emi_slow_sel", base + 0x1c, 29, 2, emi_sels, ARRAY_SIZE(emi_sels)); | ||
262 | clk[vdo_axi_sel] = imx_clk_mux("vdo_axi_sel", base + 0x18, 11, 1, vdo_axi_sels, ARRAY_SIZE(vdo_axi_sels)); | ||
263 | clk[vpu_axi_sel] = imx_clk_mux("vpu_axi_sel", base + 0x18, 14, 2, vpu_axi_sels, ARRAY_SIZE(vpu_axi_sels)); | ||
264 | clk[cko1_sel] = imx_clk_mux("cko1_sel", base + 0x60, 0, 4, cko1_sels, ARRAY_SIZE(cko1_sels)); | ||
265 | |||
266 | /* name reg shift width busy: reg, shift parent_names num_parents */ | ||
267 | clk[periph] = imx_clk_busy_mux("periph", base + 0x14, 25, 1, base + 0x48, 5, periph_sels, ARRAY_SIZE(periph_sels)); | ||
268 | clk[periph2] = imx_clk_busy_mux("periph2", base + 0x14, 26, 1, base + 0x48, 3, periph2_sels, ARRAY_SIZE(periph2_sels)); | ||
269 | |||
270 | /* name parent_name reg shift width */ | ||
271 | clk[periph_clk2] = imx_clk_divider("periph_clk2", "periph_clk2_sel", base + 0x14, 27, 3); | ||
272 | clk[periph2_clk2] = imx_clk_divider("periph2_clk2", "periph2_clk2_sel", base + 0x14, 0, 3); | ||
273 | clk[ipg] = imx_clk_divider("ipg", "ahb", base + 0x14, 8, 2); | ||
274 | clk[ipg_per] = imx_clk_divider("ipg_per", "ipg", base + 0x1c, 0, 6); | ||
275 | clk[esai_pred] = imx_clk_divider("esai_pred", "esai_sel", base + 0x28, 9, 3); | ||
276 | clk[esai_podf] = imx_clk_divider("esai_podf", "esai_pred", base + 0x28, 25, 3); | ||
277 | clk[asrc_pred] = imx_clk_divider("asrc_pred", "asrc_sel", base + 0x30, 12, 3); | ||
278 | clk[asrc_podf] = imx_clk_divider("asrc_podf", "asrc_pred", base + 0x30, 9, 3); | ||
279 | clk[spdif_pred] = imx_clk_divider("spdif_pred", "spdif_sel", base + 0x30, 25, 3); | ||
280 | clk[spdif_podf] = imx_clk_divider("spdif_podf", "spdif_pred", base + 0x30, 22, 3); | ||
281 | clk[can_root] = imx_clk_divider("can_root", "pll3_usb_otg", base + 0x20, 2, 6); | ||
282 | clk[ecspi_root] = imx_clk_divider("ecspi_root", "pll3_60m", base + 0x38, 19, 6); | ||
283 | clk[gpu2d_core_podf] = imx_clk_divider("gpu2d_core_podf", "gpu2d_core_sel", base + 0x18, 23, 3); | ||
284 | clk[gpu3d_core_podf] = imx_clk_divider("gpu3d_core_podf", "gpu3d_core_sel", base + 0x18, 26, 3); | ||
285 | clk[gpu3d_shader] = imx_clk_divider("gpu3d_shader", "gpu3d_shader_sel", base + 0x18, 29, 3); | ||
286 | clk[ipu1_podf] = imx_clk_divider("ipu1_podf", "ipu1_sel", base + 0x3c, 11, 3); | ||
287 | clk[ipu2_podf] = imx_clk_divider("ipu2_podf", "ipu2_sel", base + 0x3c, 16, 3); | ||
288 | clk[ldb_di0_podf] = imx_clk_divider("ldb_di0_podf", "ldb_di0_sel", base + 0x20, 10, 1); | ||
289 | clk[ldb_di1_podf] = imx_clk_divider("ldb_di1_podf", "ldb_di1_sel", base + 0x20, 11, 1); | ||
290 | clk[ipu1_di0_pre] = imx_clk_divider("ipu1_di0_pre", "ipu1_di0_pre_sel", base + 0x34, 3, 3); | ||
291 | clk[ipu1_di1_pre] = imx_clk_divider("ipu1_di1_pre", "ipu1_di1_pre_sel", base + 0x34, 12, 3); | ||
292 | clk[ipu2_di0_pre] = imx_clk_divider("ipu2_di0_pre", "ipu2_di0_pre_sel", base + 0x38, 3, 3); | ||
293 | clk[ipu2_di1_pre] = imx_clk_divider("ipu2_di1_pre", "ipu2_di1_pre_sel", base + 0x38, 12, 3); | ||
294 | clk[hsi_tx_podf] = imx_clk_divider("hsi_tx_podf", "hsi_tx_sel", base + 0x30, 29, 3); | ||
295 | clk[ssi1_pred] = imx_clk_divider("ssi1_pred", "ssi1_sel", base + 0x28, 6, 3); | ||
296 | clk[ssi1_podf] = imx_clk_divider("ssi1_podf", "ssi1_pred", base + 0x28, 0, 6); | ||
297 | clk[ssi2_pred] = imx_clk_divider("ssi2_pred", "ssi2_sel", base + 0x2c, 6, 3); | ||
298 | clk[ssi2_podf] = imx_clk_divider("ssi2_podf", "ssi2_pred", base + 0x2c, 0, 6); | ||
299 | clk[ssi3_pred] = imx_clk_divider("ssi3_pred", "ssi3_sel", base + 0x28, 22, 3); | ||
300 | clk[ssi3_podf] = imx_clk_divider("ssi3_podf", "ssi3_pred", base + 0x28, 16, 6); | ||
301 | clk[uart_serial_podf] = imx_clk_divider("uart_serial_podf", "pll3_80m", base + 0x24, 0, 6); | ||
302 | clk[usdhc1_podf] = imx_clk_divider("usdhc1_podf", "usdhc1_sel", base + 0x24, 11, 3); | ||
303 | clk[usdhc2_podf] = imx_clk_divider("usdhc2_podf", "usdhc2_sel", base + 0x24, 16, 3); | ||
304 | clk[usdhc3_podf] = imx_clk_divider("usdhc3_podf", "usdhc3_sel", base + 0x24, 19, 3); | ||
305 | clk[usdhc4_podf] = imx_clk_divider("usdhc4_podf", "usdhc4_sel", base + 0x24, 22, 3); | ||
306 | clk[enfc_pred] = imx_clk_divider("enfc_pred", "enfc_sel", base + 0x2c, 18, 3); | ||
307 | clk[enfc_podf] = imx_clk_divider("enfc_podf", "enfc_pred", base + 0x2c, 21, 6); | ||
308 | clk[emi_podf] = imx_clk_divider("emi_podf", "emi_sel", base + 0x1c, 20, 3); | ||
309 | clk[emi_slow_podf] = imx_clk_divider("emi_slow_podf", "emi_slow_sel", base + 0x1c, 23, 3); | ||
310 | clk[vpu_axi_podf] = imx_clk_divider("vpu_axi_podf", "vpu_axi_sel", base + 0x24, 25, 3); | ||
311 | clk[cko1_podf] = imx_clk_divider("cko1_podf", "cko1_sel", base + 0x60, 4, 3); | ||
312 | |||
313 | /* name parent_name reg shift width busy: reg, shift */ | ||
314 | clk[axi] = imx_clk_busy_divider("axi", "axi_sel", base + 0x14, 16, 3, base + 0x48, 0); | ||
315 | clk[mmdc_ch0_axi_podf] = imx_clk_busy_divider("mmdc_ch0_axi_podf", "periph", base + 0x14, 19, 3, base + 0x48, 4); | ||
316 | clk[mmdc_ch1_axi_podf] = imx_clk_busy_divider("mmdc_ch1_axi_podf", "periph2", base + 0x14, 3, 3, base + 0x48, 2); | ||
317 | clk[arm] = imx_clk_busy_divider("arm", "pll1_sw", base + 0x10, 0, 3, base + 0x48, 16); | ||
318 | clk[ahb] = imx_clk_busy_divider("ahb", "periph", base + 0x14, 10, 3, base + 0x48, 1); | ||
319 | |||
320 | /* name parent_name reg shift */ | ||
321 | clk[apbh_dma] = imx_clk_gate2("apbh_dma", "ahb", base + 0x68, 4); | ||
322 | clk[asrc] = imx_clk_gate2("asrc", "asrc_podf", base + 0x68, 6); | ||
323 | clk[can1_ipg] = imx_clk_gate2("can1_ipg", "ipg", base + 0x68, 14); | ||
324 | clk[can1_serial] = imx_clk_gate2("can1_serial", "can_root", base + 0x68, 16); | ||
325 | clk[can2_ipg] = imx_clk_gate2("can2_ipg", "ipg", base + 0x68, 18); | ||
326 | clk[can2_serial] = imx_clk_gate2("can2_serial", "can_root", base + 0x68, 20); | ||
327 | clk[ecspi1] = imx_clk_gate2("ecspi1", "ecspi_root", base + 0x6c, 0); | ||
328 | clk[ecspi2] = imx_clk_gate2("ecspi2", "ecspi_root", base + 0x6c, 2); | ||
329 | clk[ecspi3] = imx_clk_gate2("ecspi3", "ecspi_root", base + 0x6c, 4); | ||
330 | clk[ecspi4] = imx_clk_gate2("ecspi4", "ecspi_root", base + 0x6c, 6); | ||
331 | clk[ecspi5] = imx_clk_gate2("ecspi5", "ecspi_root", base + 0x6c, 8); | ||
332 | clk[enet] = imx_clk_gate2("enet", "ipg", base + 0x6c, 10); | ||
333 | clk[esai] = imx_clk_gate2("esai", "esai_podf", base + 0x6c, 16); | ||
334 | clk[gpt_ipg] = imx_clk_gate2("gpt_ipg", "ipg", base + 0x6c, 20); | ||
335 | clk[gpt_ipg_per] = imx_clk_gate2("gpt_ipg_per", "ipg_per", base + 0x6c, 22); | ||
336 | clk[gpu2d_core] = imx_clk_gate2("gpu2d_core", "gpu2d_core_podf", base + 0x6c, 24); | ||
337 | clk[gpu3d_core] = imx_clk_gate2("gpu3d_core", "gpu3d_core_podf", base + 0x6c, 26); | ||
338 | clk[hdmi_iahb] = imx_clk_gate2("hdmi_iahb", "ahb", base + 0x70, 0); | ||
339 | clk[hdmi_isfr] = imx_clk_gate2("hdmi_isfr", "pll3_pfd1_540m", base + 0x70, 4); | ||
340 | clk[i2c1] = imx_clk_gate2("i2c1", "ipg_per", base + 0x70, 6); | ||
341 | clk[i2c2] = imx_clk_gate2("i2c2", "ipg_per", base + 0x70, 8); | ||
342 | clk[i2c3] = imx_clk_gate2("i2c3", "ipg_per", base + 0x70, 10); | ||
343 | clk[iim] = imx_clk_gate2("iim", "ipg", base + 0x70, 12); | ||
344 | clk[enfc] = imx_clk_gate2("enfc", "enfc_podf", base + 0x70, 14); | ||
345 | clk[ipu1] = imx_clk_gate2("ipu1", "ipu1_podf", base + 0x74, 0); | ||
346 | clk[ipu1_di0] = imx_clk_gate2("ipu1_di0", "ipu1_di0_sel", base + 0x74, 2); | ||
347 | clk[ipu1_di1] = imx_clk_gate2("ipu1_di1", "ipu1_di1_sel", base + 0x74, 4); | ||
348 | clk[ipu2] = imx_clk_gate2("ipu2", "ipu2_podf", base + 0x74, 6); | ||
349 | clk[ipu2_di0] = imx_clk_gate2("ipu2_di0", "ipu2_di0_sel", base + 0x74, 8); | ||
350 | clk[ldb_di0] = imx_clk_gate2("ldb_di0", "ldb_di0_podf", base + 0x74, 12); | ||
351 | clk[ldb_di1] = imx_clk_gate2("ldb_di1", "ldb_di1_podf", base + 0x74, 14); | ||
352 | clk[ipu2_di1] = imx_clk_gate2("ipu2_di1", "ipu2_di1_sel", base + 0x74, 10); | ||
353 | clk[hsi_tx] = imx_clk_gate2("hsi_tx", "hsi_tx_podf", base + 0x74, 16); | ||
354 | clk[mlb] = imx_clk_gate2("mlb", "pll6_mlb", base + 0x74, 18); | ||
355 | clk[mmdc_ch0_axi] = imx_clk_gate2("mmdc_ch0_axi", "mmdc_ch0_axi_podf", base + 0x74, 20); | ||
356 | clk[mmdc_ch1_axi] = imx_clk_gate2("mmdc_ch1_axi", "mmdc_ch1_axi_podf", base + 0x74, 22); | ||
357 | clk[ocram] = imx_clk_gate2("ocram", "ahb", base + 0x74, 28); | ||
358 | clk[openvg_axi] = imx_clk_gate2("openvg_axi", "axi", base + 0x74, 30); | ||
359 | clk[pcie_axi] = imx_clk_gate2("pcie_axi", "pcie_axi_sel", base + 0x78, 0); | ||
360 | clk[pwm1] = imx_clk_gate2("pwm1", "ipg_per", base + 0x78, 16); | ||
361 | clk[pwm2] = imx_clk_gate2("pwm2", "ipg_per", base + 0x78, 18); | ||
362 | clk[pwm3] = imx_clk_gate2("pwm3", "ipg_per", base + 0x78, 20); | ||
363 | clk[pwm4] = imx_clk_gate2("pwm4", "ipg_per", base + 0x78, 22); | ||
364 | clk[gpmi_bch_apb] = imx_clk_gate2("gpmi_bch_apb", "usdhc3", base + 0x78, 24); | ||
365 | clk[gpmi_bch] = imx_clk_gate2("gpmi_bch", "usdhc4", base + 0x78, 26); | ||
366 | clk[gpmi_io] = imx_clk_gate2("gpmi_io", "enfc", base + 0x78, 28); | ||
367 | clk[gpmi_apb] = imx_clk_gate2("gpmi_apb", "usdhc3", base + 0x78, 30); | ||
368 | clk[sata] = imx_clk_gate2("sata", "ipg", base + 0x7c, 4); | ||
369 | clk[sdma] = imx_clk_gate2("sdma", "ahb", base + 0x7c, 6); | ||
370 | clk[spba] = imx_clk_gate2("spba", "ipg", base + 0x7c, 12); | ||
371 | clk[ssi1_ipg] = imx_clk_gate2("ssi1_ipg", "ipg", base + 0x7c, 18); | ||
372 | clk[ssi2_ipg] = imx_clk_gate2("ssi2_ipg", "ipg", base + 0x7c, 20); | ||
373 | clk[ssi3_ipg] = imx_clk_gate2("ssi3_ipg", "ipg", base + 0x7c, 22); | ||
374 | clk[uart_ipg] = imx_clk_gate2("uart_ipg", "ipg", base + 0x7c, 24); | ||
375 | clk[uart_serial] = imx_clk_gate2("uart_serial", "uart_serial_podf", base + 0x7c, 26); | ||
376 | clk[usboh3] = imx_clk_gate2("usboh3", "ipg", base + 0x80, 0); | ||
377 | clk[usdhc1] = imx_clk_gate2("usdhc1", "usdhc1_podf", base + 0x80, 2); | ||
378 | clk[usdhc2] = imx_clk_gate2("usdhc2", "usdhc2_podf", base + 0x80, 4); | ||
379 | clk[usdhc3] = imx_clk_gate2("usdhc3", "usdhc3_podf", base + 0x80, 6); | ||
380 | clk[usdhc4] = imx_clk_gate2("usdhc4", "usdhc4_podf", base + 0x80, 8); | ||
381 | clk[vdo_axi] = imx_clk_gate2("vdo_axi", "vdo_axi_sel", base + 0x80, 12); | ||
382 | clk[vpu_axi] = imx_clk_gate2("vpu_axi", "vpu_axi_podf", base + 0x80, 14); | ||
383 | clk[cko1] = imx_clk_gate("cko1", "cko1_podf", base + 0x60, 7); | ||
384 | |||
385 | for (i = 0; i < ARRAY_SIZE(clk); i++) | ||
386 | if (IS_ERR(clk[i])) | ||
387 | pr_err("i.MX6q clk %d: register failed with %ld\n", | ||
388 | i, PTR_ERR(clk[i])); | ||
389 | |||
390 | clk_register_clkdev(clk[mmdc_ch0_axi], NULL, "mmdc_ch0_axi"); | ||
391 | clk_register_clkdev(clk[mmdc_ch1_axi], NULL, "mmdc_ch1_axi"); | ||
392 | clk_register_clkdev(clk[gpt_ipg], "ipg", "imx-gpt.0"); | ||
393 | clk_register_clkdev(clk[gpt_ipg_per], "per", "imx-gpt.0"); | ||
394 | clk_register_clkdev(clk[twd], NULL, "smp_twd"); | ||
395 | clk_register_clkdev(clk[usboh3], NULL, "usboh3"); | ||
396 | clk_register_clkdev(clk[uart_serial], "per", "2020000.serial"); | ||
397 | clk_register_clkdev(clk[uart_ipg], "ipg", "2020000.serial"); | ||
398 | clk_register_clkdev(clk[uart_serial], "per", "21e8000.serial"); | ||
399 | clk_register_clkdev(clk[uart_ipg], "ipg", "21e8000.serial"); | ||
400 | clk_register_clkdev(clk[uart_serial], "per", "21ec000.serial"); | ||
401 | clk_register_clkdev(clk[uart_ipg], "ipg", "21ec000.serial"); | ||
402 | clk_register_clkdev(clk[uart_serial], "per", "21f0000.serial"); | ||
403 | clk_register_clkdev(clk[uart_ipg], "ipg", "21f0000.serial"); | ||
404 | clk_register_clkdev(clk[uart_serial], "per", "21f4000.serial"); | ||
405 | clk_register_clkdev(clk[uart_ipg], "ipg", "21f4000.serial"); | ||
406 | clk_register_clkdev(clk[enet], NULL, "2188000.ethernet"); | ||
407 | clk_register_clkdev(clk[usdhc1], NULL, "2190000.usdhc"); | ||
408 | clk_register_clkdev(clk[usdhc2], NULL, "2194000.usdhc"); | ||
409 | clk_register_clkdev(clk[usdhc3], NULL, "2198000.usdhc"); | ||
410 | clk_register_clkdev(clk[usdhc4], NULL, "219c000.usdhc"); | ||
411 | clk_register_clkdev(clk[i2c1], NULL, "21a0000.i2c"); | ||
412 | clk_register_clkdev(clk[i2c2], NULL, "21a4000.i2c"); | ||
413 | clk_register_clkdev(clk[i2c3], NULL, "21a8000.i2c"); | ||
414 | clk_register_clkdev(clk[ecspi1], NULL, "2008000.ecspi"); | ||
415 | clk_register_clkdev(clk[ecspi2], NULL, "200c000.ecspi"); | ||
416 | clk_register_clkdev(clk[ecspi3], NULL, "2010000.ecspi"); | ||
417 | clk_register_clkdev(clk[ecspi4], NULL, "2014000.ecspi"); | ||
418 | clk_register_clkdev(clk[ecspi5], NULL, "2018000.ecspi"); | ||
419 | clk_register_clkdev(clk[sdma], NULL, "20ec000.sdma"); | ||
420 | clk_register_clkdev(clk[dummy], NULL, "20bc000.wdog"); | ||
421 | clk_register_clkdev(clk[dummy], NULL, "20c0000.wdog"); | ||
422 | clk_register_clkdev(clk[ssi1_ipg], NULL, "2028000.ssi"); | ||
423 | clk_register_clkdev(clk[cko1_sel], "cko1_sel", NULL); | ||
424 | clk_register_clkdev(clk[ahb], "ahb", NULL); | ||
425 | clk_register_clkdev(clk[cko1], "cko1", NULL); | ||
426 | |||
427 | for (i = 0; i < ARRAY_SIZE(clks_init_on); i++) { | ||
428 | c = clk_get_sys(clks_init_on[i], NULL); | ||
429 | if (IS_ERR(c)) { | ||
430 | pr_err("%s: failed to get clk %s", __func__, | ||
431 | clks_init_on[i]); | ||
432 | return PTR_ERR(c); | ||
433 | } | ||
434 | clk_prepare_enable(c); | ||
435 | } | ||
436 | |||
437 | np = of_find_compatible_node(NULL, NULL, "fsl,imx6q-gpt"); | ||
438 | base = of_iomap(np, 0); | ||
439 | WARN_ON(!base); | ||
440 | irq = irq_of_parse_and_map(np, 0); | ||
441 | mxc_timer_init(NULL, base, irq); | ||
442 | |||
443 | return 0; | ||
444 | } | ||
diff --git a/arch/arm/mach-imx/clk-pfd.c b/arch/arm/mach-imx/clk-pfd.c new file mode 100644 index 000000000000..e2ed4160f329 --- /dev/null +++ b/arch/arm/mach-imx/clk-pfd.c | |||
@@ -0,0 +1,147 @@ | |||
1 | /* | ||
2 | * Copyright 2012 Freescale Semiconductor, Inc. | ||
3 | * Copyright 2012 Linaro Ltd. | ||
4 | * | ||
5 | * The code contained herein is licensed under the GNU General Public | ||
6 | * License. You may obtain a copy of the GNU General Public License | ||
7 | * Version 2 or later at the following locations: | ||
8 | * | ||
9 | * http://www.opensource.org/licenses/gpl-license.html | ||
10 | * http://www.gnu.org/copyleft/gpl.html | ||
11 | */ | ||
12 | |||
13 | #include <linux/clk.h> | ||
14 | #include <linux/clk-provider.h> | ||
15 | #include <linux/io.h> | ||
16 | #include <linux/slab.h> | ||
17 | #include <linux/err.h> | ||
18 | #include "clk.h" | ||
19 | |||
20 | /** | ||
21 | * struct clk_pfd - IMX PFD clock | ||
22 | * @clk_hw: clock source | ||
23 | * @reg: PFD register address | ||
24 | * @idx: the index of PFD encoded in the register | ||
25 | * | ||
26 | * PFD clock found on i.MX6 series. Each register for PFD has 4 clk_pfd | ||
27 | * data encoded, and member idx is used to specify the one. And each | ||
28 | * register has SET, CLR and TOG registers at offset 0x4 0x8 and 0xc. | ||
29 | */ | ||
30 | struct clk_pfd { | ||
31 | struct clk_hw hw; | ||
32 | void __iomem *reg; | ||
33 | u8 idx; | ||
34 | }; | ||
35 | |||
36 | #define to_clk_pfd(_hw) container_of(_hw, struct clk_pfd, hw) | ||
37 | |||
38 | #define SET 0x4 | ||
39 | #define CLR 0x8 | ||
40 | #define OTG 0xc | ||
41 | |||
42 | static int clk_pfd_enable(struct clk_hw *hw) | ||
43 | { | ||
44 | struct clk_pfd *pfd = to_clk_pfd(hw); | ||
45 | |||
46 | writel_relaxed(1 << ((pfd->idx + 1) * 8 - 1), pfd->reg + CLR); | ||
47 | |||
48 | return 0; | ||
49 | } | ||
50 | |||
51 | static void clk_pfd_disable(struct clk_hw *hw) | ||
52 | { | ||
53 | struct clk_pfd *pfd = to_clk_pfd(hw); | ||
54 | |||
55 | writel_relaxed(1 << ((pfd->idx + 1) * 8 - 1), pfd->reg + SET); | ||
56 | } | ||
57 | |||
58 | static unsigned long clk_pfd_recalc_rate(struct clk_hw *hw, | ||
59 | unsigned long parent_rate) | ||
60 | { | ||
61 | struct clk_pfd *pfd = to_clk_pfd(hw); | ||
62 | u64 tmp = parent_rate; | ||
63 | u8 frac = (readl_relaxed(pfd->reg) >> (pfd->idx * 8)) & 0x3f; | ||
64 | |||
65 | tmp *= 18; | ||
66 | do_div(tmp, frac); | ||
67 | |||
68 | return tmp; | ||
69 | } | ||
70 | |||
71 | static long clk_pfd_round_rate(struct clk_hw *hw, unsigned long rate, | ||
72 | unsigned long *prate) | ||
73 | { | ||
74 | u64 tmp = *prate; | ||
75 | u8 frac; | ||
76 | |||
77 | tmp = tmp * 18 + rate / 2; | ||
78 | do_div(tmp, rate); | ||
79 | frac = tmp; | ||
80 | if (frac < 12) | ||
81 | frac = 12; | ||
82 | else if (frac > 35) | ||
83 | frac = 35; | ||
84 | tmp = *prate; | ||
85 | tmp *= 18; | ||
86 | do_div(tmp, frac); | ||
87 | |||
88 | return tmp; | ||
89 | } | ||
90 | |||
91 | static int clk_pfd_set_rate(struct clk_hw *hw, unsigned long rate, | ||
92 | unsigned long parent_rate) | ||
93 | { | ||
94 | struct clk_pfd *pfd = to_clk_pfd(hw); | ||
95 | u64 tmp = parent_rate; | ||
96 | u8 frac; | ||
97 | |||
98 | tmp = tmp * 18 + rate / 2; | ||
99 | do_div(tmp, rate); | ||
100 | frac = tmp; | ||
101 | if (frac < 12) | ||
102 | frac = 12; | ||
103 | else if (frac > 35) | ||
104 | frac = 35; | ||
105 | |||
106 | writel_relaxed(0x3f << (pfd->idx * 8), pfd->reg + CLR); | ||
107 | writel_relaxed(frac << (pfd->idx * 8), pfd->reg + SET); | ||
108 | |||
109 | return 0; | ||
110 | } | ||
111 | |||
112 | static const struct clk_ops clk_pfd_ops = { | ||
113 | .enable = clk_pfd_enable, | ||
114 | .disable = clk_pfd_disable, | ||
115 | .recalc_rate = clk_pfd_recalc_rate, | ||
116 | .round_rate = clk_pfd_round_rate, | ||
117 | .set_rate = clk_pfd_set_rate, | ||
118 | }; | ||
119 | |||
120 | struct clk *imx_clk_pfd(const char *name, const char *parent_name, | ||
121 | void __iomem *reg, u8 idx) | ||
122 | { | ||
123 | struct clk_pfd *pfd; | ||
124 | struct clk *clk; | ||
125 | struct clk_init_data init; | ||
126 | |||
127 | pfd = kzalloc(sizeof(*pfd), GFP_KERNEL); | ||
128 | if (!pfd) | ||
129 | return ERR_PTR(-ENOMEM); | ||
130 | |||
131 | pfd->reg = reg; | ||
132 | pfd->idx = idx; | ||
133 | |||
134 | init.name = name; | ||
135 | init.ops = &clk_pfd_ops; | ||
136 | init.flags = 0; | ||
137 | init.parent_names = &parent_name; | ||
138 | init.num_parents = 1; | ||
139 | |||
140 | pfd->hw.init = &init; | ||
141 | |||
142 | clk = clk_register(NULL, &pfd->hw); | ||
143 | if (IS_ERR(clk)) | ||
144 | kfree(pfd); | ||
145 | |||
146 | return clk; | ||
147 | } | ||
diff --git a/arch/arm/mach-imx/clk-pllv1.c b/arch/arm/mach-imx/clk-pllv1.c new file mode 100644 index 000000000000..2d856f9ccf59 --- /dev/null +++ b/arch/arm/mach-imx/clk-pllv1.c | |||
@@ -0,0 +1,66 @@ | |||
1 | #include <linux/clk.h> | ||
2 | #include <linux/clk-provider.h> | ||
3 | #include <linux/io.h> | ||
4 | #include <linux/slab.h> | ||
5 | #include <linux/kernel.h> | ||
6 | #include <linux/err.h> | ||
7 | #include <mach/common.h> | ||
8 | #include <mach/hardware.h> | ||
9 | #include <mach/clock.h> | ||
10 | #include "clk.h" | ||
11 | |||
12 | /** | ||
13 | * pll v1 | ||
14 | * | ||
15 | * @clk_hw clock source | ||
16 | * @parent the parent clock name | ||
17 | * @base base address of pll registers | ||
18 | * | ||
19 | * PLL clock version 1, found on i.MX1/21/25/27/31/35 | ||
20 | */ | ||
21 | struct clk_pllv1 { | ||
22 | struct clk_hw hw; | ||
23 | void __iomem *base; | ||
24 | }; | ||
25 | |||
26 | #define to_clk_pllv1(clk) (container_of(clk, struct clk_pllv1, clk)) | ||
27 | |||
28 | static unsigned long clk_pllv1_recalc_rate(struct clk_hw *hw, | ||
29 | unsigned long parent_rate) | ||
30 | { | ||
31 | struct clk_pllv1 *pll = to_clk_pllv1(hw); | ||
32 | |||
33 | return mxc_decode_pll(readl(pll->base), parent_rate); | ||
34 | } | ||
35 | |||
36 | struct clk_ops clk_pllv1_ops = { | ||
37 | .recalc_rate = clk_pllv1_recalc_rate, | ||
38 | }; | ||
39 | |||
40 | struct clk *imx_clk_pllv1(const char *name, const char *parent, | ||
41 | void __iomem *base) | ||
42 | { | ||
43 | struct clk_pllv1 *pll; | ||
44 | struct clk *clk; | ||
45 | struct clk_init_data init; | ||
46 | |||
47 | pll = kmalloc(sizeof(*pll), GFP_KERNEL); | ||
48 | if (!pll) | ||
49 | return ERR_PTR(-ENOMEM); | ||
50 | |||
51 | pll->base = base; | ||
52 | |||
53 | init.name = name; | ||
54 | init.ops = &clk_pllv1_ops; | ||
55 | init.flags = 0; | ||
56 | init.parent_names = &parent; | ||
57 | init.num_parents = 1; | ||
58 | |||
59 | pll->hw.init = &init; | ||
60 | |||
61 | clk = clk_register(NULL, &pll->hw); | ||
62 | if (IS_ERR(clk)) | ||
63 | kfree(pll); | ||
64 | |||
65 | return clk; | ||
66 | } | ||
diff --git a/arch/arm/mach-imx/clk-pllv2.c b/arch/arm/mach-imx/clk-pllv2.c new file mode 100644 index 000000000000..4685919deb63 --- /dev/null +++ b/arch/arm/mach-imx/clk-pllv2.c | |||
@@ -0,0 +1,249 @@ | |||
1 | #include <linux/kernel.h> | ||
2 | #include <linux/clk.h> | ||
3 | #include <linux/io.h> | ||
4 | #include <linux/errno.h> | ||
5 | #include <linux/delay.h> | ||
6 | #include <linux/slab.h> | ||
7 | #include <linux/err.h> | ||
8 | |||
9 | #include <asm/div64.h> | ||
10 | |||
11 | #include "clk.h" | ||
12 | |||
13 | #define to_clk_pllv2(clk) (container_of(clk, struct clk_pllv2, clk)) | ||
14 | |||
15 | /* PLL Register Offsets */ | ||
16 | #define MXC_PLL_DP_CTL 0x00 | ||
17 | #define MXC_PLL_DP_CONFIG 0x04 | ||
18 | #define MXC_PLL_DP_OP 0x08 | ||
19 | #define MXC_PLL_DP_MFD 0x0C | ||
20 | #define MXC_PLL_DP_MFN 0x10 | ||
21 | #define MXC_PLL_DP_MFNMINUS 0x14 | ||
22 | #define MXC_PLL_DP_MFNPLUS 0x18 | ||
23 | #define MXC_PLL_DP_HFS_OP 0x1C | ||
24 | #define MXC_PLL_DP_HFS_MFD 0x20 | ||
25 | #define MXC_PLL_DP_HFS_MFN 0x24 | ||
26 | #define MXC_PLL_DP_MFN_TOGC 0x28 | ||
27 | #define MXC_PLL_DP_DESTAT 0x2c | ||
28 | |||
29 | /* PLL Register Bit definitions */ | ||
30 | #define MXC_PLL_DP_CTL_MUL_CTRL 0x2000 | ||
31 | #define MXC_PLL_DP_CTL_DPDCK0_2_EN 0x1000 | ||
32 | #define MXC_PLL_DP_CTL_DPDCK0_2_OFFSET 12 | ||
33 | #define MXC_PLL_DP_CTL_ADE 0x800 | ||
34 | #define MXC_PLL_DP_CTL_REF_CLK_DIV 0x400 | ||
35 | #define MXC_PLL_DP_CTL_REF_CLK_SEL_MASK (3 << 8) | ||
36 | #define MXC_PLL_DP_CTL_REF_CLK_SEL_OFFSET 8 | ||
37 | #define MXC_PLL_DP_CTL_HFSM 0x80 | ||
38 | #define MXC_PLL_DP_CTL_PRE 0x40 | ||
39 | #define MXC_PLL_DP_CTL_UPEN 0x20 | ||
40 | #define MXC_PLL_DP_CTL_RST 0x10 | ||
41 | #define MXC_PLL_DP_CTL_RCP 0x8 | ||
42 | #define MXC_PLL_DP_CTL_PLM 0x4 | ||
43 | #define MXC_PLL_DP_CTL_BRM0 0x2 | ||
44 | #define MXC_PLL_DP_CTL_LRF 0x1 | ||
45 | |||
46 | #define MXC_PLL_DP_CONFIG_BIST 0x8 | ||
47 | #define MXC_PLL_DP_CONFIG_SJC_CE 0x4 | ||
48 | #define MXC_PLL_DP_CONFIG_AREN 0x2 | ||
49 | #define MXC_PLL_DP_CONFIG_LDREQ 0x1 | ||
50 | |||
51 | #define MXC_PLL_DP_OP_MFI_OFFSET 4 | ||
52 | #define MXC_PLL_DP_OP_MFI_MASK (0xF << 4) | ||
53 | #define MXC_PLL_DP_OP_PDF_OFFSET 0 | ||
54 | #define MXC_PLL_DP_OP_PDF_MASK 0xF | ||
55 | |||
56 | #define MXC_PLL_DP_MFD_OFFSET 0 | ||
57 | #define MXC_PLL_DP_MFD_MASK 0x07FFFFFF | ||
58 | |||
59 | #define MXC_PLL_DP_MFN_OFFSET 0x0 | ||
60 | #define MXC_PLL_DP_MFN_MASK 0x07FFFFFF | ||
61 | |||
62 | #define MXC_PLL_DP_MFN_TOGC_TOG_DIS (1 << 17) | ||
63 | #define MXC_PLL_DP_MFN_TOGC_TOG_EN (1 << 16) | ||
64 | #define MXC_PLL_DP_MFN_TOGC_CNT_OFFSET 0x0 | ||
65 | #define MXC_PLL_DP_MFN_TOGC_CNT_MASK 0xFFFF | ||
66 | |||
67 | #define MXC_PLL_DP_DESTAT_TOG_SEL (1 << 31) | ||
68 | #define MXC_PLL_DP_DESTAT_MFN 0x07FFFFFF | ||
69 | |||
70 | #define MAX_DPLL_WAIT_TRIES 1000 /* 1000 * udelay(1) = 1ms */ | ||
71 | |||
72 | struct clk_pllv2 { | ||
73 | struct clk_hw hw; | ||
74 | void __iomem *base; | ||
75 | }; | ||
76 | |||
77 | static unsigned long clk_pllv2_recalc_rate(struct clk_hw *hw, | ||
78 | unsigned long parent_rate) | ||
79 | { | ||
80 | long mfi, mfn, mfd, pdf, ref_clk, mfn_abs; | ||
81 | unsigned long dp_op, dp_mfd, dp_mfn, dp_ctl, pll_hfsm, dbl; | ||
82 | void __iomem *pllbase; | ||
83 | s64 temp; | ||
84 | struct clk_pllv2 *pll = to_clk_pllv2(hw); | ||
85 | |||
86 | pllbase = pll->base; | ||
87 | |||
88 | dp_ctl = __raw_readl(pllbase + MXC_PLL_DP_CTL); | ||
89 | pll_hfsm = dp_ctl & MXC_PLL_DP_CTL_HFSM; | ||
90 | dbl = dp_ctl & MXC_PLL_DP_CTL_DPDCK0_2_EN; | ||
91 | |||
92 | if (pll_hfsm == 0) { | ||
93 | dp_op = __raw_readl(pllbase + MXC_PLL_DP_OP); | ||
94 | dp_mfd = __raw_readl(pllbase + MXC_PLL_DP_MFD); | ||
95 | dp_mfn = __raw_readl(pllbase + MXC_PLL_DP_MFN); | ||
96 | } else { | ||
97 | dp_op = __raw_readl(pllbase + MXC_PLL_DP_HFS_OP); | ||
98 | dp_mfd = __raw_readl(pllbase + MXC_PLL_DP_HFS_MFD); | ||
99 | dp_mfn = __raw_readl(pllbase + MXC_PLL_DP_HFS_MFN); | ||
100 | } | ||
101 | pdf = dp_op & MXC_PLL_DP_OP_PDF_MASK; | ||
102 | mfi = (dp_op & MXC_PLL_DP_OP_MFI_MASK) >> MXC_PLL_DP_OP_MFI_OFFSET; | ||
103 | mfi = (mfi <= 5) ? 5 : mfi; | ||
104 | mfd = dp_mfd & MXC_PLL_DP_MFD_MASK; | ||
105 | mfn = mfn_abs = dp_mfn & MXC_PLL_DP_MFN_MASK; | ||
106 | /* Sign extend to 32-bits */ | ||
107 | if (mfn >= 0x04000000) { | ||
108 | mfn |= 0xFC000000; | ||
109 | mfn_abs = -mfn; | ||
110 | } | ||
111 | |||
112 | ref_clk = 2 * parent_rate; | ||
113 | if (dbl != 0) | ||
114 | ref_clk *= 2; | ||
115 | |||
116 | ref_clk /= (pdf + 1); | ||
117 | temp = (u64) ref_clk * mfn_abs; | ||
118 | do_div(temp, mfd + 1); | ||
119 | if (mfn < 0) | ||
120 | temp = -temp; | ||
121 | temp = (ref_clk * mfi) + temp; | ||
122 | |||
123 | return temp; | ||
124 | } | ||
125 | |||
126 | static int clk_pllv2_set_rate(struct clk_hw *hw, unsigned long rate, | ||
127 | unsigned long parent_rate) | ||
128 | { | ||
129 | struct clk_pllv2 *pll = to_clk_pllv2(hw); | ||
130 | u32 reg; | ||
131 | void __iomem *pllbase; | ||
132 | long mfi, pdf, mfn, mfd = 999999; | ||
133 | s64 temp64; | ||
134 | unsigned long quad_parent_rate; | ||
135 | unsigned long pll_hfsm, dp_ctl; | ||
136 | |||
137 | pllbase = pll->base; | ||
138 | |||
139 | quad_parent_rate = 4 * parent_rate; | ||
140 | pdf = mfi = -1; | ||
141 | while (++pdf < 16 && mfi < 5) | ||
142 | mfi = rate * (pdf+1) / quad_parent_rate; | ||
143 | if (mfi > 15) | ||
144 | return -EINVAL; | ||
145 | pdf--; | ||
146 | |||
147 | temp64 = rate * (pdf+1) - quad_parent_rate * mfi; | ||
148 | do_div(temp64, quad_parent_rate/1000000); | ||
149 | mfn = (long)temp64; | ||
150 | |||
151 | dp_ctl = __raw_readl(pllbase + MXC_PLL_DP_CTL); | ||
152 | /* use dpdck0_2 */ | ||
153 | __raw_writel(dp_ctl | 0x1000L, pllbase + MXC_PLL_DP_CTL); | ||
154 | pll_hfsm = dp_ctl & MXC_PLL_DP_CTL_HFSM; | ||
155 | if (pll_hfsm == 0) { | ||
156 | reg = mfi << 4 | pdf; | ||
157 | __raw_writel(reg, pllbase + MXC_PLL_DP_OP); | ||
158 | __raw_writel(mfd, pllbase + MXC_PLL_DP_MFD); | ||
159 | __raw_writel(mfn, pllbase + MXC_PLL_DP_MFN); | ||
160 | } else { | ||
161 | reg = mfi << 4 | pdf; | ||
162 | __raw_writel(reg, pllbase + MXC_PLL_DP_HFS_OP); | ||
163 | __raw_writel(mfd, pllbase + MXC_PLL_DP_HFS_MFD); | ||
164 | __raw_writel(mfn, pllbase + MXC_PLL_DP_HFS_MFN); | ||
165 | } | ||
166 | |||
167 | return 0; | ||
168 | } | ||
169 | |||
170 | static long clk_pllv2_round_rate(struct clk_hw *hw, unsigned long rate, | ||
171 | unsigned long *prate) | ||
172 | { | ||
173 | return rate; | ||
174 | } | ||
175 | |||
176 | static int clk_pllv2_prepare(struct clk_hw *hw) | ||
177 | { | ||
178 | struct clk_pllv2 *pll = to_clk_pllv2(hw); | ||
179 | u32 reg; | ||
180 | void __iomem *pllbase; | ||
181 | int i = 0; | ||
182 | |||
183 | pllbase = pll->base; | ||
184 | reg = __raw_readl(pllbase + MXC_PLL_DP_CTL) | MXC_PLL_DP_CTL_UPEN; | ||
185 | __raw_writel(reg, pllbase + MXC_PLL_DP_CTL); | ||
186 | |||
187 | /* Wait for lock */ | ||
188 | do { | ||
189 | reg = __raw_readl(pllbase + MXC_PLL_DP_CTL); | ||
190 | if (reg & MXC_PLL_DP_CTL_LRF) | ||
191 | break; | ||
192 | |||
193 | udelay(1); | ||
194 | } while (++i < MAX_DPLL_WAIT_TRIES); | ||
195 | |||
196 | if (i == MAX_DPLL_WAIT_TRIES) { | ||
197 | pr_err("MX5: pll locking failed\n"); | ||
198 | return -EINVAL; | ||
199 | } | ||
200 | |||
201 | return 0; | ||
202 | } | ||
203 | |||
204 | static void clk_pllv2_unprepare(struct clk_hw *hw) | ||
205 | { | ||
206 | struct clk_pllv2 *pll = to_clk_pllv2(hw); | ||
207 | u32 reg; | ||
208 | void __iomem *pllbase; | ||
209 | |||
210 | pllbase = pll->base; | ||
211 | reg = __raw_readl(pllbase + MXC_PLL_DP_CTL) & ~MXC_PLL_DP_CTL_UPEN; | ||
212 | __raw_writel(reg, pllbase + MXC_PLL_DP_CTL); | ||
213 | } | ||
214 | |||
215 | struct clk_ops clk_pllv2_ops = { | ||
216 | .prepare = clk_pllv2_prepare, | ||
217 | .unprepare = clk_pllv2_unprepare, | ||
218 | .recalc_rate = clk_pllv2_recalc_rate, | ||
219 | .round_rate = clk_pllv2_round_rate, | ||
220 | .set_rate = clk_pllv2_set_rate, | ||
221 | }; | ||
222 | |||
223 | struct clk *imx_clk_pllv2(const char *name, const char *parent, | ||
224 | void __iomem *base) | ||
225 | { | ||
226 | struct clk_pllv2 *pll; | ||
227 | struct clk *clk; | ||
228 | struct clk_init_data init; | ||
229 | |||
230 | pll = kzalloc(sizeof(*pll), GFP_KERNEL); | ||
231 | if (!pll) | ||
232 | return ERR_PTR(-ENOMEM); | ||
233 | |||
234 | pll->base = base; | ||
235 | |||
236 | init.name = name; | ||
237 | init.ops = &clk_pllv2_ops; | ||
238 | init.flags = 0; | ||
239 | init.parent_names = &parent; | ||
240 | init.num_parents = 1; | ||
241 | |||
242 | pll->hw.init = &init; | ||
243 | |||
244 | clk = clk_register(NULL, &pll->hw); | ||
245 | if (IS_ERR(clk)) | ||
246 | kfree(pll); | ||
247 | |||
248 | return clk; | ||
249 | } | ||
diff --git a/arch/arm/mach-imx/clk-pllv3.c b/arch/arm/mach-imx/clk-pllv3.c new file mode 100644 index 000000000000..36aac947bce1 --- /dev/null +++ b/arch/arm/mach-imx/clk-pllv3.c | |||
@@ -0,0 +1,419 @@ | |||
1 | /* | ||
2 | * Copyright 2012 Freescale Semiconductor, Inc. | ||
3 | * Copyright 2012 Linaro Ltd. | ||
4 | * | ||
5 | * The code contained herein is licensed under the GNU General Public | ||
6 | * License. You may obtain a copy of the GNU General Public License | ||
7 | * Version 2 or later at the following locations: | ||
8 | * | ||
9 | * http://www.opensource.org/licenses/gpl-license.html | ||
10 | * http://www.gnu.org/copyleft/gpl.html | ||
11 | */ | ||
12 | |||
13 | #include <linux/clk.h> | ||
14 | #include <linux/clk-provider.h> | ||
15 | #include <linux/io.h> | ||
16 | #include <linux/slab.h> | ||
17 | #include <linux/jiffies.h> | ||
18 | #include <linux/err.h> | ||
19 | #include "clk.h" | ||
20 | |||
21 | #define PLL_NUM_OFFSET 0x10 | ||
22 | #define PLL_DENOM_OFFSET 0x20 | ||
23 | |||
24 | #define BM_PLL_POWER (0x1 << 12) | ||
25 | #define BM_PLL_ENABLE (0x1 << 13) | ||
26 | #define BM_PLL_BYPASS (0x1 << 16) | ||
27 | #define BM_PLL_LOCK (0x1 << 31) | ||
28 | |||
29 | /** | ||
30 | * struct clk_pllv3 - IMX PLL clock version 3 | ||
31 | * @clk_hw: clock source | ||
32 | * @base: base address of PLL registers | ||
33 | * @powerup_set: set POWER bit to power up the PLL | ||
34 | * @gate_mask: mask of gate bits | ||
35 | * @div_mask: mask of divider bits | ||
36 | * | ||
37 | * IMX PLL clock version 3, found on i.MX6 series. Divider for pllv3 | ||
38 | * is actually a multiplier, and always sits at bit 0. | ||
39 | */ | ||
40 | struct clk_pllv3 { | ||
41 | struct clk_hw hw; | ||
42 | void __iomem *base; | ||
43 | bool powerup_set; | ||
44 | u32 gate_mask; | ||
45 | u32 div_mask; | ||
46 | }; | ||
47 | |||
48 | #define to_clk_pllv3(_hw) container_of(_hw, struct clk_pllv3, hw) | ||
49 | |||
50 | static int clk_pllv3_prepare(struct clk_hw *hw) | ||
51 | { | ||
52 | struct clk_pllv3 *pll = to_clk_pllv3(hw); | ||
53 | unsigned long timeout = jiffies + msecs_to_jiffies(10); | ||
54 | u32 val; | ||
55 | |||
56 | val = readl_relaxed(pll->base); | ||
57 | val &= ~BM_PLL_BYPASS; | ||
58 | if (pll->powerup_set) | ||
59 | val |= BM_PLL_POWER; | ||
60 | else | ||
61 | val &= ~BM_PLL_POWER; | ||
62 | writel_relaxed(val, pll->base); | ||
63 | |||
64 | /* Wait for PLL to lock */ | ||
65 | while (!(readl_relaxed(pll->base) & BM_PLL_LOCK)) | ||
66 | if (time_after(jiffies, timeout)) | ||
67 | return -ETIMEDOUT; | ||
68 | |||
69 | return 0; | ||
70 | } | ||
71 | |||
72 | static void clk_pllv3_unprepare(struct clk_hw *hw) | ||
73 | { | ||
74 | struct clk_pllv3 *pll = to_clk_pllv3(hw); | ||
75 | u32 val; | ||
76 | |||
77 | val = readl_relaxed(pll->base); | ||
78 | val |= BM_PLL_BYPASS; | ||
79 | if (pll->powerup_set) | ||
80 | val &= ~BM_PLL_POWER; | ||
81 | else | ||
82 | val |= BM_PLL_POWER; | ||
83 | writel_relaxed(val, pll->base); | ||
84 | } | ||
85 | |||
86 | static int clk_pllv3_enable(struct clk_hw *hw) | ||
87 | { | ||
88 | struct clk_pllv3 *pll = to_clk_pllv3(hw); | ||
89 | u32 val; | ||
90 | |||
91 | val = readl_relaxed(pll->base); | ||
92 | val |= pll->gate_mask; | ||
93 | writel_relaxed(val, pll->base); | ||
94 | |||
95 | return 0; | ||
96 | } | ||
97 | |||
98 | static void clk_pllv3_disable(struct clk_hw *hw) | ||
99 | { | ||
100 | struct clk_pllv3 *pll = to_clk_pllv3(hw); | ||
101 | u32 val; | ||
102 | |||
103 | val = readl_relaxed(pll->base); | ||
104 | val &= ~pll->gate_mask; | ||
105 | writel_relaxed(val, pll->base); | ||
106 | } | ||
107 | |||
108 | static unsigned long clk_pllv3_recalc_rate(struct clk_hw *hw, | ||
109 | unsigned long parent_rate) | ||
110 | { | ||
111 | struct clk_pllv3 *pll = to_clk_pllv3(hw); | ||
112 | u32 div = readl_relaxed(pll->base) & pll->div_mask; | ||
113 | |||
114 | return (div == 1) ? parent_rate * 22 : parent_rate * 20; | ||
115 | } | ||
116 | |||
117 | static long clk_pllv3_round_rate(struct clk_hw *hw, unsigned long rate, | ||
118 | unsigned long *prate) | ||
119 | { | ||
120 | unsigned long parent_rate = *prate; | ||
121 | |||
122 | return (rate >= parent_rate * 22) ? parent_rate * 22 : | ||
123 | parent_rate * 20; | ||
124 | } | ||
125 | |||
126 | static int clk_pllv3_set_rate(struct clk_hw *hw, unsigned long rate, | ||
127 | unsigned long parent_rate) | ||
128 | { | ||
129 | struct clk_pllv3 *pll = to_clk_pllv3(hw); | ||
130 | u32 val, div; | ||
131 | |||
132 | if (rate == parent_rate * 22) | ||
133 | div = 1; | ||
134 | else if (rate == parent_rate * 20) | ||
135 | div = 0; | ||
136 | else | ||
137 | return -EINVAL; | ||
138 | |||
139 | val = readl_relaxed(pll->base); | ||
140 | val &= ~pll->div_mask; | ||
141 | val |= div; | ||
142 | writel_relaxed(val, pll->base); | ||
143 | |||
144 | return 0; | ||
145 | } | ||
146 | |||
147 | static const struct clk_ops clk_pllv3_ops = { | ||
148 | .prepare = clk_pllv3_prepare, | ||
149 | .unprepare = clk_pllv3_unprepare, | ||
150 | .enable = clk_pllv3_enable, | ||
151 | .disable = clk_pllv3_disable, | ||
152 | .recalc_rate = clk_pllv3_recalc_rate, | ||
153 | .round_rate = clk_pllv3_round_rate, | ||
154 | .set_rate = clk_pllv3_set_rate, | ||
155 | }; | ||
156 | |||
157 | static unsigned long clk_pllv3_sys_recalc_rate(struct clk_hw *hw, | ||
158 | unsigned long parent_rate) | ||
159 | { | ||
160 | struct clk_pllv3 *pll = to_clk_pllv3(hw); | ||
161 | u32 div = readl_relaxed(pll->base) & pll->div_mask; | ||
162 | |||
163 | return parent_rate * div / 2; | ||
164 | } | ||
165 | |||
166 | static long clk_pllv3_sys_round_rate(struct clk_hw *hw, unsigned long rate, | ||
167 | unsigned long *prate) | ||
168 | { | ||
169 | unsigned long parent_rate = *prate; | ||
170 | unsigned long min_rate = parent_rate * 54 / 2; | ||
171 | unsigned long max_rate = parent_rate * 108 / 2; | ||
172 | u32 div; | ||
173 | |||
174 | if (rate > max_rate) | ||
175 | rate = max_rate; | ||
176 | else if (rate < min_rate) | ||
177 | rate = min_rate; | ||
178 | div = rate * 2 / parent_rate; | ||
179 | |||
180 | return parent_rate * div / 2; | ||
181 | } | ||
182 | |||
183 | static int clk_pllv3_sys_set_rate(struct clk_hw *hw, unsigned long rate, | ||
184 | unsigned long parent_rate) | ||
185 | { | ||
186 | struct clk_pllv3 *pll = to_clk_pllv3(hw); | ||
187 | unsigned long min_rate = parent_rate * 54 / 2; | ||
188 | unsigned long max_rate = parent_rate * 108 / 2; | ||
189 | u32 val, div; | ||
190 | |||
191 | if (rate < min_rate || rate > max_rate) | ||
192 | return -EINVAL; | ||
193 | |||
194 | div = rate * 2 / parent_rate; | ||
195 | val = readl_relaxed(pll->base); | ||
196 | val &= ~pll->div_mask; | ||
197 | val |= div; | ||
198 | writel_relaxed(val, pll->base); | ||
199 | |||
200 | return 0; | ||
201 | } | ||
202 | |||
203 | static const struct clk_ops clk_pllv3_sys_ops = { | ||
204 | .prepare = clk_pllv3_prepare, | ||
205 | .unprepare = clk_pllv3_unprepare, | ||
206 | .enable = clk_pllv3_enable, | ||
207 | .disable = clk_pllv3_disable, | ||
208 | .recalc_rate = clk_pllv3_sys_recalc_rate, | ||
209 | .round_rate = clk_pllv3_sys_round_rate, | ||
210 | .set_rate = clk_pllv3_sys_set_rate, | ||
211 | }; | ||
212 | |||
213 | static unsigned long clk_pllv3_av_recalc_rate(struct clk_hw *hw, | ||
214 | unsigned long parent_rate) | ||
215 | { | ||
216 | struct clk_pllv3 *pll = to_clk_pllv3(hw); | ||
217 | u32 mfn = readl_relaxed(pll->base + PLL_NUM_OFFSET); | ||
218 | u32 mfd = readl_relaxed(pll->base + PLL_DENOM_OFFSET); | ||
219 | u32 div = readl_relaxed(pll->base) & pll->div_mask; | ||
220 | |||
221 | return (parent_rate * div) + ((parent_rate / mfd) * mfn); | ||
222 | } | ||
223 | |||
224 | static long clk_pllv3_av_round_rate(struct clk_hw *hw, unsigned long rate, | ||
225 | unsigned long *prate) | ||
226 | { | ||
227 | unsigned long parent_rate = *prate; | ||
228 | unsigned long min_rate = parent_rate * 27; | ||
229 | unsigned long max_rate = parent_rate * 54; | ||
230 | u32 div; | ||
231 | u32 mfn, mfd = 1000000; | ||
232 | s64 temp64; | ||
233 | |||
234 | if (rate > max_rate) | ||
235 | rate = max_rate; | ||
236 | else if (rate < min_rate) | ||
237 | rate = min_rate; | ||
238 | |||
239 | div = rate / parent_rate; | ||
240 | temp64 = (u64) (rate - div * parent_rate); | ||
241 | temp64 *= mfd; | ||
242 | do_div(temp64, parent_rate); | ||
243 | mfn = temp64; | ||
244 | |||
245 | return parent_rate * div + parent_rate / mfd * mfn; | ||
246 | } | ||
247 | |||
248 | static int clk_pllv3_av_set_rate(struct clk_hw *hw, unsigned long rate, | ||
249 | unsigned long parent_rate) | ||
250 | { | ||
251 | struct clk_pllv3 *pll = to_clk_pllv3(hw); | ||
252 | unsigned long min_rate = parent_rate * 27; | ||
253 | unsigned long max_rate = parent_rate * 54; | ||
254 | u32 val, div; | ||
255 | u32 mfn, mfd = 1000000; | ||
256 | s64 temp64; | ||
257 | |||
258 | if (rate < min_rate || rate > max_rate) | ||
259 | return -EINVAL; | ||
260 | |||
261 | div = rate / parent_rate; | ||
262 | temp64 = (u64) (rate - div * parent_rate); | ||
263 | temp64 *= mfd; | ||
264 | do_div(temp64, parent_rate); | ||
265 | mfn = temp64; | ||
266 | |||
267 | val = readl_relaxed(pll->base); | ||
268 | val &= ~pll->div_mask; | ||
269 | val |= div; | ||
270 | writel_relaxed(val, pll->base); | ||
271 | writel_relaxed(mfn, pll->base + PLL_NUM_OFFSET); | ||
272 | writel_relaxed(mfd, pll->base + PLL_DENOM_OFFSET); | ||
273 | |||
274 | return 0; | ||
275 | } | ||
276 | |||
277 | static const struct clk_ops clk_pllv3_av_ops = { | ||
278 | .prepare = clk_pllv3_prepare, | ||
279 | .unprepare = clk_pllv3_unprepare, | ||
280 | .enable = clk_pllv3_enable, | ||
281 | .disable = clk_pllv3_disable, | ||
282 | .recalc_rate = clk_pllv3_av_recalc_rate, | ||
283 | .round_rate = clk_pllv3_av_round_rate, | ||
284 | .set_rate = clk_pllv3_av_set_rate, | ||
285 | }; | ||
286 | |||
287 | static unsigned long clk_pllv3_enet_recalc_rate(struct clk_hw *hw, | ||
288 | unsigned long parent_rate) | ||
289 | { | ||
290 | struct clk_pllv3 *pll = to_clk_pllv3(hw); | ||
291 | u32 div = readl_relaxed(pll->base) & pll->div_mask; | ||
292 | |||
293 | switch (div) { | ||
294 | case 0: | ||
295 | return 25000000; | ||
296 | case 1: | ||
297 | return 50000000; | ||
298 | case 2: | ||
299 | return 100000000; | ||
300 | case 3: | ||
301 | return 125000000; | ||
302 | } | ||
303 | |||
304 | return 0; | ||
305 | } | ||
306 | |||
307 | static long clk_pllv3_enet_round_rate(struct clk_hw *hw, unsigned long rate, | ||
308 | unsigned long *prate) | ||
309 | { | ||
310 | if (rate >= 125000000) | ||
311 | rate = 125000000; | ||
312 | else if (rate >= 100000000) | ||
313 | rate = 100000000; | ||
314 | else if (rate >= 50000000) | ||
315 | rate = 50000000; | ||
316 | else | ||
317 | rate = 25000000; | ||
318 | return rate; | ||
319 | } | ||
320 | |||
321 | static int clk_pllv3_enet_set_rate(struct clk_hw *hw, unsigned long rate, | ||
322 | unsigned long parent_rate) | ||
323 | { | ||
324 | struct clk_pllv3 *pll = to_clk_pllv3(hw); | ||
325 | u32 val, div; | ||
326 | |||
327 | switch (rate) { | ||
328 | case 25000000: | ||
329 | div = 0; | ||
330 | break; | ||
331 | case 50000000: | ||
332 | div = 1; | ||
333 | break; | ||
334 | case 100000000: | ||
335 | div = 2; | ||
336 | break; | ||
337 | case 125000000: | ||
338 | div = 3; | ||
339 | break; | ||
340 | default: | ||
341 | return -EINVAL; | ||
342 | } | ||
343 | |||
344 | val = readl_relaxed(pll->base); | ||
345 | val &= ~pll->div_mask; | ||
346 | val |= div; | ||
347 | writel_relaxed(val, pll->base); | ||
348 | |||
349 | return 0; | ||
350 | } | ||
351 | |||
352 | static const struct clk_ops clk_pllv3_enet_ops = { | ||
353 | .prepare = clk_pllv3_prepare, | ||
354 | .unprepare = clk_pllv3_unprepare, | ||
355 | .enable = clk_pllv3_enable, | ||
356 | .disable = clk_pllv3_disable, | ||
357 | .recalc_rate = clk_pllv3_enet_recalc_rate, | ||
358 | .round_rate = clk_pllv3_enet_round_rate, | ||
359 | .set_rate = clk_pllv3_enet_set_rate, | ||
360 | }; | ||
361 | |||
362 | static const struct clk_ops clk_pllv3_mlb_ops = { | ||
363 | .prepare = clk_pllv3_prepare, | ||
364 | .unprepare = clk_pllv3_unprepare, | ||
365 | .enable = clk_pllv3_enable, | ||
366 | .disable = clk_pllv3_disable, | ||
367 | }; | ||
368 | |||
369 | struct clk *imx_clk_pllv3(enum imx_pllv3_type type, const char *name, | ||
370 | const char *parent_name, void __iomem *base, | ||
371 | u32 gate_mask, u32 div_mask) | ||
372 | { | ||
373 | struct clk_pllv3 *pll; | ||
374 | const struct clk_ops *ops; | ||
375 | struct clk *clk; | ||
376 | struct clk_init_data init; | ||
377 | |||
378 | pll = kzalloc(sizeof(*pll), GFP_KERNEL); | ||
379 | if (!pll) | ||
380 | return ERR_PTR(-ENOMEM); | ||
381 | |||
382 | switch (type) { | ||
383 | case IMX_PLLV3_SYS: | ||
384 | ops = &clk_pllv3_sys_ops; | ||
385 | break; | ||
386 | case IMX_PLLV3_USB: | ||
387 | ops = &clk_pllv3_ops; | ||
388 | pll->powerup_set = true; | ||
389 | break; | ||
390 | case IMX_PLLV3_AV: | ||
391 | ops = &clk_pllv3_av_ops; | ||
392 | break; | ||
393 | case IMX_PLLV3_ENET: | ||
394 | ops = &clk_pllv3_enet_ops; | ||
395 | break; | ||
396 | case IMX_PLLV3_MLB: | ||
397 | ops = &clk_pllv3_mlb_ops; | ||
398 | break; | ||
399 | default: | ||
400 | ops = &clk_pllv3_ops; | ||
401 | } | ||
402 | pll->base = base; | ||
403 | pll->gate_mask = gate_mask; | ||
404 | pll->div_mask = div_mask; | ||
405 | |||
406 | init.name = name; | ||
407 | init.ops = ops; | ||
408 | init.flags = 0; | ||
409 | init.parent_names = &parent_name; | ||
410 | init.num_parents = 1; | ||
411 | |||
412 | pll->hw.init = &init; | ||
413 | |||
414 | clk = clk_register(NULL, &pll->hw); | ||
415 | if (IS_ERR(clk)) | ||
416 | kfree(pll); | ||
417 | |||
418 | return clk; | ||
419 | } | ||
diff --git a/arch/arm/mach-imx/clk.h b/arch/arm/mach-imx/clk.h new file mode 100644 index 000000000000..1bf64fe2523c --- /dev/null +++ b/arch/arm/mach-imx/clk.h | |||
@@ -0,0 +1,83 @@ | |||
1 | #ifndef __MACH_IMX_CLK_H | ||
2 | #define __MACH_IMX_CLK_H | ||
3 | |||
4 | #include <linux/spinlock.h> | ||
5 | #include <linux/clk-provider.h> | ||
6 | #include <mach/clock.h> | ||
7 | |||
8 | struct clk *imx_clk_pllv1(const char *name, const char *parent, | ||
9 | void __iomem *base); | ||
10 | |||
11 | struct clk *imx_clk_pllv2(const char *name, const char *parent, | ||
12 | void __iomem *base); | ||
13 | |||
14 | enum imx_pllv3_type { | ||
15 | IMX_PLLV3_GENERIC, | ||
16 | IMX_PLLV3_SYS, | ||
17 | IMX_PLLV3_USB, | ||
18 | IMX_PLLV3_AV, | ||
19 | IMX_PLLV3_ENET, | ||
20 | IMX_PLLV3_MLB, | ||
21 | }; | ||
22 | |||
23 | struct clk *imx_clk_pllv3(enum imx_pllv3_type type, const char *name, | ||
24 | const char *parent_name, void __iomem *base, u32 gate_mask, | ||
25 | u32 div_mask); | ||
26 | |||
27 | struct clk *clk_register_gate2(struct device *dev, const char *name, | ||
28 | const char *parent_name, unsigned long flags, | ||
29 | void __iomem *reg, u8 bit_idx, | ||
30 | u8 clk_gate_flags, spinlock_t *lock); | ||
31 | |||
32 | static inline struct clk *imx_clk_gate2(const char *name, const char *parent, | ||
33 | void __iomem *reg, u8 shift) | ||
34 | { | ||
35 | return clk_register_gate2(NULL, name, parent, CLK_SET_RATE_PARENT, reg, | ||
36 | shift, 0, &imx_ccm_lock); | ||
37 | } | ||
38 | |||
39 | struct clk *imx_clk_pfd(const char *name, const char *parent_name, | ||
40 | void __iomem *reg, u8 idx); | ||
41 | |||
42 | struct clk *imx_clk_busy_divider(const char *name, const char *parent_name, | ||
43 | void __iomem *reg, u8 shift, u8 width, | ||
44 | void __iomem *busy_reg, u8 busy_shift); | ||
45 | |||
46 | struct clk *imx_clk_busy_mux(const char *name, void __iomem *reg, u8 shift, | ||
47 | u8 width, void __iomem *busy_reg, u8 busy_shift, | ||
48 | const char **parent_names, int num_parents); | ||
49 | |||
50 | static inline struct clk *imx_clk_fixed(const char *name, int rate) | ||
51 | { | ||
52 | return clk_register_fixed_rate(NULL, name, NULL, CLK_IS_ROOT, rate); | ||
53 | } | ||
54 | |||
55 | static inline struct clk *imx_clk_divider(const char *name, const char *parent, | ||
56 | void __iomem *reg, u8 shift, u8 width) | ||
57 | { | ||
58 | return clk_register_divider(NULL, name, parent, CLK_SET_RATE_PARENT, | ||
59 | reg, shift, width, 0, &imx_ccm_lock); | ||
60 | } | ||
61 | |||
62 | static inline struct clk *imx_clk_gate(const char *name, const char *parent, | ||
63 | void __iomem *reg, u8 shift) | ||
64 | { | ||
65 | return clk_register_gate(NULL, name, parent, CLK_SET_RATE_PARENT, reg, | ||
66 | shift, 0, &imx_ccm_lock); | ||
67 | } | ||
68 | |||
69 | static inline struct clk *imx_clk_mux(const char *name, void __iomem *reg, | ||
70 | u8 shift, u8 width, const char **parents, int num_parents) | ||
71 | { | ||
72 | return clk_register_mux(NULL, name, parents, num_parents, 0, reg, shift, | ||
73 | width, 0, &imx_ccm_lock); | ||
74 | } | ||
75 | |||
76 | static inline struct clk *imx_clk_fixed_factor(const char *name, | ||
77 | const char *parent, unsigned int mult, unsigned int div) | ||
78 | { | ||
79 | return clk_register_fixed_factor(NULL, name, parent, | ||
80 | CLK_SET_RATE_PARENT, mult, div); | ||
81 | } | ||
82 | |||
83 | #endif | ||
diff --git a/arch/arm/mach-imx/clock-imx1.c b/arch/arm/mach-imx/clock-imx1.c deleted file mode 100644 index 4aabeb241563..000000000000 --- a/arch/arm/mach-imx/clock-imx1.c +++ /dev/null | |||
@@ -1,636 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2008 Sascha Hauer <s.hauer@pengutronix.de>, Pengutronix | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License version 2 as | ||
6 | * published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License along | ||
14 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
15 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. | ||
16 | */ | ||
17 | |||
18 | #include <linux/kernel.h> | ||
19 | #include <linux/init.h> | ||
20 | #include <linux/list.h> | ||
21 | #include <linux/math64.h> | ||
22 | #include <linux/err.h> | ||
23 | #include <linux/clk.h> | ||
24 | #include <linux/io.h> | ||
25 | #include <linux/clkdev.h> | ||
26 | |||
27 | #include <mach/clock.h> | ||
28 | #include <mach/hardware.h> | ||
29 | #include <mach/common.h> | ||
30 | |||
31 | #define IO_ADDR_CCM(off) (MX1_IO_ADDRESS(MX1_CCM_BASE_ADDR + (off))) | ||
32 | |||
33 | /* CCM register addresses */ | ||
34 | #define CCM_CSCR IO_ADDR_CCM(0x0) | ||
35 | #define CCM_MPCTL0 IO_ADDR_CCM(0x4) | ||
36 | #define CCM_SPCTL0 IO_ADDR_CCM(0xc) | ||
37 | #define CCM_PCDR IO_ADDR_CCM(0x20) | ||
38 | |||
39 | #define CCM_CSCR_CLKO_OFFSET 29 | ||
40 | #define CCM_CSCR_CLKO_MASK (0x7 << 29) | ||
41 | #define CCM_CSCR_USB_OFFSET 26 | ||
42 | #define CCM_CSCR_USB_MASK (0x7 << 26) | ||
43 | #define CCM_CSCR_OSC_EN_SHIFT 17 | ||
44 | #define CCM_CSCR_SYSTEM_SEL (1 << 16) | ||
45 | #define CCM_CSCR_BCLK_OFFSET 10 | ||
46 | #define CCM_CSCR_BCLK_MASK (0xf << 10) | ||
47 | #define CCM_CSCR_PRESC (1 << 15) | ||
48 | |||
49 | #define CCM_PCDR_PCLK3_OFFSET 16 | ||
50 | #define CCM_PCDR_PCLK3_MASK (0x7f << 16) | ||
51 | #define CCM_PCDR_PCLK2_OFFSET 4 | ||
52 | #define CCM_PCDR_PCLK2_MASK (0xf << 4) | ||
53 | #define CCM_PCDR_PCLK1_OFFSET 0 | ||
54 | #define CCM_PCDR_PCLK1_MASK 0xf | ||
55 | |||
56 | #define IO_ADDR_SCM(off) (MX1_IO_ADDRESS(MX1_SCM_BASE_ADDR + (off))) | ||
57 | |||
58 | /* SCM register addresses */ | ||
59 | #define SCM_GCCR IO_ADDR_SCM(0xc) | ||
60 | |||
61 | #define SCM_GCCR_DMA_CLK_EN_OFFSET 3 | ||
62 | #define SCM_GCCR_CSI_CLK_EN_OFFSET 2 | ||
63 | #define SCM_GCCR_MMA_CLK_EN_OFFSET 1 | ||
64 | #define SCM_GCCR_USBD_CLK_EN_OFFSET 0 | ||
65 | |||
66 | static int _clk_enable(struct clk *clk) | ||
67 | { | ||
68 | unsigned int reg; | ||
69 | |||
70 | reg = __raw_readl(clk->enable_reg); | ||
71 | reg |= 1 << clk->enable_shift; | ||
72 | __raw_writel(reg, clk->enable_reg); | ||
73 | |||
74 | return 0; | ||
75 | } | ||
76 | |||
77 | static void _clk_disable(struct clk *clk) | ||
78 | { | ||
79 | unsigned int reg; | ||
80 | |||
81 | reg = __raw_readl(clk->enable_reg); | ||
82 | reg &= ~(1 << clk->enable_shift); | ||
83 | __raw_writel(reg, clk->enable_reg); | ||
84 | } | ||
85 | |||
86 | static int _clk_can_use_parent(const struct clk *clk_arr[], unsigned int size, | ||
87 | struct clk *parent) | ||
88 | { | ||
89 | int i; | ||
90 | |||
91 | for (i = 0; i < size; i++) | ||
92 | if (parent == clk_arr[i]) | ||
93 | return i; | ||
94 | |||
95 | return -EINVAL; | ||
96 | } | ||
97 | |||
98 | static unsigned long | ||
99 | _clk_simple_round_rate(struct clk *clk, unsigned long rate, unsigned int limit) | ||
100 | { | ||
101 | int div; | ||
102 | unsigned long parent_rate; | ||
103 | |||
104 | parent_rate = clk_get_rate(clk->parent); | ||
105 | |||
106 | div = parent_rate / rate; | ||
107 | if (parent_rate % rate) | ||
108 | div++; | ||
109 | |||
110 | if (div > limit) | ||
111 | div = limit; | ||
112 | |||
113 | return parent_rate / div; | ||
114 | } | ||
115 | |||
116 | static unsigned long _clk_parent_round_rate(struct clk *clk, unsigned long rate) | ||
117 | { | ||
118 | return clk->parent->round_rate(clk->parent, rate); | ||
119 | } | ||
120 | |||
121 | static int _clk_parent_set_rate(struct clk *clk, unsigned long rate) | ||
122 | { | ||
123 | return clk->parent->set_rate(clk->parent, rate); | ||
124 | } | ||
125 | |||
126 | static unsigned long clk16m_get_rate(struct clk *clk) | ||
127 | { | ||
128 | return 16000000; | ||
129 | } | ||
130 | |||
131 | static struct clk clk16m = { | ||
132 | .get_rate = clk16m_get_rate, | ||
133 | .enable = _clk_enable, | ||
134 | .enable_reg = CCM_CSCR, | ||
135 | .enable_shift = CCM_CSCR_OSC_EN_SHIFT, | ||
136 | .disable = _clk_disable, | ||
137 | }; | ||
138 | |||
139 | /* in Hz */ | ||
140 | static unsigned long clk32_rate; | ||
141 | |||
142 | static unsigned long clk32_get_rate(struct clk *clk) | ||
143 | { | ||
144 | return clk32_rate; | ||
145 | } | ||
146 | |||
147 | static struct clk clk32 = { | ||
148 | .get_rate = clk32_get_rate, | ||
149 | }; | ||
150 | |||
151 | static unsigned long clk32_premult_get_rate(struct clk *clk) | ||
152 | { | ||
153 | return clk_get_rate(clk->parent) * 512; | ||
154 | } | ||
155 | |||
156 | static struct clk clk32_premult = { | ||
157 | .parent = &clk32, | ||
158 | .get_rate = clk32_premult_get_rate, | ||
159 | }; | ||
160 | |||
161 | static const struct clk *prem_clk_clocks[] = { | ||
162 | &clk32_premult, | ||
163 | &clk16m, | ||
164 | }; | ||
165 | |||
166 | static int prem_clk_set_parent(struct clk *clk, struct clk *parent) | ||
167 | { | ||
168 | int i; | ||
169 | unsigned int reg = __raw_readl(CCM_CSCR); | ||
170 | |||
171 | i = _clk_can_use_parent(prem_clk_clocks, ARRAY_SIZE(prem_clk_clocks), | ||
172 | parent); | ||
173 | |||
174 | switch (i) { | ||
175 | case 0: | ||
176 | reg &= ~CCM_CSCR_SYSTEM_SEL; | ||
177 | break; | ||
178 | case 1: | ||
179 | reg |= CCM_CSCR_SYSTEM_SEL; | ||
180 | break; | ||
181 | default: | ||
182 | return i; | ||
183 | } | ||
184 | |||
185 | __raw_writel(reg, CCM_CSCR); | ||
186 | |||
187 | return 0; | ||
188 | } | ||
189 | |||
190 | static struct clk prem_clk = { | ||
191 | .set_parent = prem_clk_set_parent, | ||
192 | }; | ||
193 | |||
194 | static unsigned long system_clk_get_rate(struct clk *clk) | ||
195 | { | ||
196 | return mxc_decode_pll(__raw_readl(CCM_SPCTL0), | ||
197 | clk_get_rate(clk->parent)); | ||
198 | } | ||
199 | |||
200 | static struct clk system_clk = { | ||
201 | .parent = &prem_clk, | ||
202 | .get_rate = system_clk_get_rate, | ||
203 | }; | ||
204 | |||
205 | static unsigned long mcu_clk_get_rate(struct clk *clk) | ||
206 | { | ||
207 | return mxc_decode_pll(__raw_readl(CCM_MPCTL0), | ||
208 | clk_get_rate(clk->parent)); | ||
209 | } | ||
210 | |||
211 | static struct clk mcu_clk = { | ||
212 | .parent = &clk32_premult, | ||
213 | .get_rate = mcu_clk_get_rate, | ||
214 | }; | ||
215 | |||
216 | static unsigned long fclk_get_rate(struct clk *clk) | ||
217 | { | ||
218 | unsigned long fclk = clk_get_rate(clk->parent); | ||
219 | |||
220 | if (__raw_readl(CCM_CSCR) & CCM_CSCR_PRESC) | ||
221 | fclk /= 2; | ||
222 | |||
223 | return fclk; | ||
224 | } | ||
225 | |||
226 | static struct clk fclk = { | ||
227 | .parent = &mcu_clk, | ||
228 | .get_rate = fclk_get_rate, | ||
229 | }; | ||
230 | |||
231 | /* | ||
232 | * get hclk ( SDRAM, CSI, Memory Stick, I2C, DMA ) | ||
233 | */ | ||
234 | static unsigned long hclk_get_rate(struct clk *clk) | ||
235 | { | ||
236 | return clk_get_rate(clk->parent) / (((__raw_readl(CCM_CSCR) & | ||
237 | CCM_CSCR_BCLK_MASK) >> CCM_CSCR_BCLK_OFFSET) + 1); | ||
238 | } | ||
239 | |||
240 | static unsigned long hclk_round_rate(struct clk *clk, unsigned long rate) | ||
241 | { | ||
242 | return _clk_simple_round_rate(clk, rate, 16); | ||
243 | } | ||
244 | |||
245 | static int hclk_set_rate(struct clk *clk, unsigned long rate) | ||
246 | { | ||
247 | unsigned int div; | ||
248 | unsigned int reg; | ||
249 | unsigned long parent_rate; | ||
250 | |||
251 | parent_rate = clk_get_rate(clk->parent); | ||
252 | |||
253 | div = parent_rate / rate; | ||
254 | |||
255 | if (div > 16 || div < 1 || ((parent_rate / div) != rate)) | ||
256 | return -EINVAL; | ||
257 | |||
258 | div--; | ||
259 | |||
260 | reg = __raw_readl(CCM_CSCR); | ||
261 | reg &= ~CCM_CSCR_BCLK_MASK; | ||
262 | reg |= div << CCM_CSCR_BCLK_OFFSET; | ||
263 | __raw_writel(reg, CCM_CSCR); | ||
264 | |||
265 | return 0; | ||
266 | } | ||
267 | |||
268 | static struct clk hclk = { | ||
269 | .parent = &system_clk, | ||
270 | .get_rate = hclk_get_rate, | ||
271 | .round_rate = hclk_round_rate, | ||
272 | .set_rate = hclk_set_rate, | ||
273 | }; | ||
274 | |||
275 | static unsigned long clk48m_get_rate(struct clk *clk) | ||
276 | { | ||
277 | return clk_get_rate(clk->parent) / (((__raw_readl(CCM_CSCR) & | ||
278 | CCM_CSCR_USB_MASK) >> CCM_CSCR_USB_OFFSET) + 1); | ||
279 | } | ||
280 | |||
281 | static unsigned long clk48m_round_rate(struct clk *clk, unsigned long rate) | ||
282 | { | ||
283 | return _clk_simple_round_rate(clk, rate, 8); | ||
284 | } | ||
285 | |||
286 | static int clk48m_set_rate(struct clk *clk, unsigned long rate) | ||
287 | { | ||
288 | unsigned int div; | ||
289 | unsigned int reg; | ||
290 | unsigned long parent_rate; | ||
291 | |||
292 | parent_rate = clk_get_rate(clk->parent); | ||
293 | |||
294 | div = parent_rate / rate; | ||
295 | |||
296 | if (div > 8 || div < 1 || ((parent_rate / div) != rate)) | ||
297 | return -EINVAL; | ||
298 | |||
299 | div--; | ||
300 | |||
301 | reg = __raw_readl(CCM_CSCR); | ||
302 | reg &= ~CCM_CSCR_USB_MASK; | ||
303 | reg |= div << CCM_CSCR_USB_OFFSET; | ||
304 | __raw_writel(reg, CCM_CSCR); | ||
305 | |||
306 | return 0; | ||
307 | } | ||
308 | |||
309 | static struct clk clk48m = { | ||
310 | .parent = &system_clk, | ||
311 | .get_rate = clk48m_get_rate, | ||
312 | .round_rate = clk48m_round_rate, | ||
313 | .set_rate = clk48m_set_rate, | ||
314 | }; | ||
315 | |||
316 | /* | ||
317 | * get peripheral clock 1 ( UART[12], Timer[12], PWM ) | ||
318 | */ | ||
319 | static unsigned long perclk1_get_rate(struct clk *clk) | ||
320 | { | ||
321 | return clk_get_rate(clk->parent) / (((__raw_readl(CCM_PCDR) & | ||
322 | CCM_PCDR_PCLK1_MASK) >> CCM_PCDR_PCLK1_OFFSET) + 1); | ||
323 | } | ||
324 | |||
325 | static unsigned long perclk1_round_rate(struct clk *clk, unsigned long rate) | ||
326 | { | ||
327 | return _clk_simple_round_rate(clk, rate, 16); | ||
328 | } | ||
329 | |||
330 | static int perclk1_set_rate(struct clk *clk, unsigned long rate) | ||
331 | { | ||
332 | unsigned int div; | ||
333 | unsigned int reg; | ||
334 | unsigned long parent_rate; | ||
335 | |||
336 | parent_rate = clk_get_rate(clk->parent); | ||
337 | |||
338 | div = parent_rate / rate; | ||
339 | |||
340 | if (div > 16 || div < 1 || ((parent_rate / div) != rate)) | ||
341 | return -EINVAL; | ||
342 | |||
343 | div--; | ||
344 | |||
345 | reg = __raw_readl(CCM_PCDR); | ||
346 | reg &= ~CCM_PCDR_PCLK1_MASK; | ||
347 | reg |= div << CCM_PCDR_PCLK1_OFFSET; | ||
348 | __raw_writel(reg, CCM_PCDR); | ||
349 | |||
350 | return 0; | ||
351 | } | ||
352 | |||
353 | /* | ||
354 | * get peripheral clock 2 ( LCD, SD, SPI[12] ) | ||
355 | */ | ||
356 | static unsigned long perclk2_get_rate(struct clk *clk) | ||
357 | { | ||
358 | return clk_get_rate(clk->parent) / (((__raw_readl(CCM_PCDR) & | ||
359 | CCM_PCDR_PCLK2_MASK) >> CCM_PCDR_PCLK2_OFFSET) + 1); | ||
360 | } | ||
361 | |||
362 | static unsigned long perclk2_round_rate(struct clk *clk, unsigned long rate) | ||
363 | { | ||
364 | return _clk_simple_round_rate(clk, rate, 16); | ||
365 | } | ||
366 | |||
367 | static int perclk2_set_rate(struct clk *clk, unsigned long rate) | ||
368 | { | ||
369 | unsigned int div; | ||
370 | unsigned int reg; | ||
371 | unsigned long parent_rate; | ||
372 | |||
373 | parent_rate = clk_get_rate(clk->parent); | ||
374 | |||
375 | div = parent_rate / rate; | ||
376 | |||
377 | if (div > 16 || div < 1 || ((parent_rate / div) != rate)) | ||
378 | return -EINVAL; | ||
379 | |||
380 | div--; | ||
381 | |||
382 | reg = __raw_readl(CCM_PCDR); | ||
383 | reg &= ~CCM_PCDR_PCLK2_MASK; | ||
384 | reg |= div << CCM_PCDR_PCLK2_OFFSET; | ||
385 | __raw_writel(reg, CCM_PCDR); | ||
386 | |||
387 | return 0; | ||
388 | } | ||
389 | |||
390 | /* | ||
391 | * get peripheral clock 3 ( SSI ) | ||
392 | */ | ||
393 | static unsigned long perclk3_get_rate(struct clk *clk) | ||
394 | { | ||
395 | return clk_get_rate(clk->parent) / (((__raw_readl(CCM_PCDR) & | ||
396 | CCM_PCDR_PCLK3_MASK) >> CCM_PCDR_PCLK3_OFFSET) + 1); | ||
397 | } | ||
398 | |||
399 | static unsigned long perclk3_round_rate(struct clk *clk, unsigned long rate) | ||
400 | { | ||
401 | return _clk_simple_round_rate(clk, rate, 128); | ||
402 | } | ||
403 | |||
404 | static int perclk3_set_rate(struct clk *clk, unsigned long rate) | ||
405 | { | ||
406 | unsigned int div; | ||
407 | unsigned int reg; | ||
408 | unsigned long parent_rate; | ||
409 | |||
410 | parent_rate = clk_get_rate(clk->parent); | ||
411 | |||
412 | div = parent_rate / rate; | ||
413 | |||
414 | if (div > 128 || div < 1 || ((parent_rate / div) != rate)) | ||
415 | return -EINVAL; | ||
416 | |||
417 | div--; | ||
418 | |||
419 | reg = __raw_readl(CCM_PCDR); | ||
420 | reg &= ~CCM_PCDR_PCLK3_MASK; | ||
421 | reg |= div << CCM_PCDR_PCLK3_OFFSET; | ||
422 | __raw_writel(reg, CCM_PCDR); | ||
423 | |||
424 | return 0; | ||
425 | } | ||
426 | |||
427 | static struct clk perclk[] = { | ||
428 | { | ||
429 | .id = 0, | ||
430 | .parent = &system_clk, | ||
431 | .get_rate = perclk1_get_rate, | ||
432 | .round_rate = perclk1_round_rate, | ||
433 | .set_rate = perclk1_set_rate, | ||
434 | }, { | ||
435 | .id = 1, | ||
436 | .parent = &system_clk, | ||
437 | .get_rate = perclk2_get_rate, | ||
438 | .round_rate = perclk2_round_rate, | ||
439 | .set_rate = perclk2_set_rate, | ||
440 | }, { | ||
441 | .id = 2, | ||
442 | .parent = &system_clk, | ||
443 | .get_rate = perclk3_get_rate, | ||
444 | .round_rate = perclk3_round_rate, | ||
445 | .set_rate = perclk3_set_rate, | ||
446 | } | ||
447 | }; | ||
448 | |||
449 | static const struct clk *clko_clocks[] = { | ||
450 | &perclk[0], | ||
451 | &hclk, | ||
452 | &clk48m, | ||
453 | &clk16m, | ||
454 | &prem_clk, | ||
455 | &fclk, | ||
456 | }; | ||
457 | |||
458 | static int clko_set_parent(struct clk *clk, struct clk *parent) | ||
459 | { | ||
460 | int i; | ||
461 | unsigned int reg; | ||
462 | |||
463 | i = _clk_can_use_parent(clko_clocks, ARRAY_SIZE(clko_clocks), parent); | ||
464 | if (i < 0) | ||
465 | return i; | ||
466 | |||
467 | reg = __raw_readl(CCM_CSCR) & ~CCM_CSCR_CLKO_MASK; | ||
468 | reg |= i << CCM_CSCR_CLKO_OFFSET; | ||
469 | __raw_writel(reg, CCM_CSCR); | ||
470 | |||
471 | if (clko_clocks[i]->set_rate && clko_clocks[i]->round_rate) { | ||
472 | clk->set_rate = _clk_parent_set_rate; | ||
473 | clk->round_rate = _clk_parent_round_rate; | ||
474 | } else { | ||
475 | clk->set_rate = NULL; | ||
476 | clk->round_rate = NULL; | ||
477 | } | ||
478 | |||
479 | return 0; | ||
480 | } | ||
481 | |||
482 | static struct clk clko_clk = { | ||
483 | .set_parent = clko_set_parent, | ||
484 | }; | ||
485 | |||
486 | static struct clk dma_clk = { | ||
487 | .parent = &hclk, | ||
488 | .round_rate = _clk_parent_round_rate, | ||
489 | .set_rate = _clk_parent_set_rate, | ||
490 | .enable = _clk_enable, | ||
491 | .enable_reg = SCM_GCCR, | ||
492 | .enable_shift = SCM_GCCR_DMA_CLK_EN_OFFSET, | ||
493 | .disable = _clk_disable, | ||
494 | }; | ||
495 | |||
496 | static struct clk csi_clk = { | ||
497 | .parent = &hclk, | ||
498 | .round_rate = _clk_parent_round_rate, | ||
499 | .set_rate = _clk_parent_set_rate, | ||
500 | .enable = _clk_enable, | ||
501 | .enable_reg = SCM_GCCR, | ||
502 | .enable_shift = SCM_GCCR_CSI_CLK_EN_OFFSET, | ||
503 | .disable = _clk_disable, | ||
504 | }; | ||
505 | |||
506 | static struct clk mma_clk = { | ||
507 | .parent = &hclk, | ||
508 | .round_rate = _clk_parent_round_rate, | ||
509 | .set_rate = _clk_parent_set_rate, | ||
510 | .enable = _clk_enable, | ||
511 | .enable_reg = SCM_GCCR, | ||
512 | .enable_shift = SCM_GCCR_MMA_CLK_EN_OFFSET, | ||
513 | .disable = _clk_disable, | ||
514 | }; | ||
515 | |||
516 | static struct clk usbd_clk = { | ||
517 | .parent = &clk48m, | ||
518 | .round_rate = _clk_parent_round_rate, | ||
519 | .set_rate = _clk_parent_set_rate, | ||
520 | .enable = _clk_enable, | ||
521 | .enable_reg = SCM_GCCR, | ||
522 | .enable_shift = SCM_GCCR_USBD_CLK_EN_OFFSET, | ||
523 | .disable = _clk_disable, | ||
524 | }; | ||
525 | |||
526 | static struct clk gpt_clk = { | ||
527 | .parent = &perclk[0], | ||
528 | .round_rate = _clk_parent_round_rate, | ||
529 | .set_rate = _clk_parent_set_rate, | ||
530 | }; | ||
531 | |||
532 | static struct clk uart_clk = { | ||
533 | .parent = &perclk[0], | ||
534 | .round_rate = _clk_parent_round_rate, | ||
535 | .set_rate = _clk_parent_set_rate, | ||
536 | }; | ||
537 | |||
538 | static struct clk i2c_clk = { | ||
539 | .parent = &hclk, | ||
540 | .round_rate = _clk_parent_round_rate, | ||
541 | .set_rate = _clk_parent_set_rate, | ||
542 | }; | ||
543 | |||
544 | static struct clk spi_clk = { | ||
545 | .parent = &perclk[1], | ||
546 | .round_rate = _clk_parent_round_rate, | ||
547 | .set_rate = _clk_parent_set_rate, | ||
548 | }; | ||
549 | |||
550 | static struct clk sdhc_clk = { | ||
551 | .parent = &perclk[1], | ||
552 | .round_rate = _clk_parent_round_rate, | ||
553 | .set_rate = _clk_parent_set_rate, | ||
554 | }; | ||
555 | |||
556 | static struct clk lcdc_clk = { | ||
557 | .parent = &perclk[1], | ||
558 | .round_rate = _clk_parent_round_rate, | ||
559 | .set_rate = _clk_parent_set_rate, | ||
560 | }; | ||
561 | |||
562 | static struct clk mshc_clk = { | ||
563 | .parent = &hclk, | ||
564 | .round_rate = _clk_parent_round_rate, | ||
565 | .set_rate = _clk_parent_set_rate, | ||
566 | }; | ||
567 | |||
568 | static struct clk ssi_clk = { | ||
569 | .parent = &perclk[2], | ||
570 | .round_rate = _clk_parent_round_rate, | ||
571 | .set_rate = _clk_parent_set_rate, | ||
572 | }; | ||
573 | |||
574 | static struct clk rtc_clk = { | ||
575 | .parent = &clk32, | ||
576 | }; | ||
577 | |||
578 | #define _REGISTER_CLOCK(d, n, c) \ | ||
579 | { \ | ||
580 | .dev_id = d, \ | ||
581 | .con_id = n, \ | ||
582 | .clk = &c, \ | ||
583 | }, | ||
584 | static struct clk_lookup lookups[] __initdata = { | ||
585 | _REGISTER_CLOCK(NULL, "dma", dma_clk) | ||
586 | _REGISTER_CLOCK("mx1-camera.0", NULL, csi_clk) | ||
587 | _REGISTER_CLOCK(NULL, "mma", mma_clk) | ||
588 | _REGISTER_CLOCK("imx_udc.0", NULL, usbd_clk) | ||
589 | _REGISTER_CLOCK(NULL, "gpt", gpt_clk) | ||
590 | _REGISTER_CLOCK("imx1-uart.0", NULL, uart_clk) | ||
591 | _REGISTER_CLOCK("imx1-uart.1", NULL, uart_clk) | ||
592 | _REGISTER_CLOCK("imx1-uart.2", NULL, uart_clk) | ||
593 | _REGISTER_CLOCK("imx-i2c.0", NULL, i2c_clk) | ||
594 | _REGISTER_CLOCK("imx1-cspi.0", NULL, spi_clk) | ||
595 | _REGISTER_CLOCK("imx1-cspi.1", NULL, spi_clk) | ||
596 | _REGISTER_CLOCK("imx-mmc.0", NULL, sdhc_clk) | ||
597 | _REGISTER_CLOCK("imx-fb.0", NULL, lcdc_clk) | ||
598 | _REGISTER_CLOCK(NULL, "mshc", mshc_clk) | ||
599 | _REGISTER_CLOCK(NULL, "ssi", ssi_clk) | ||
600 | _REGISTER_CLOCK("mxc_rtc.0", NULL, rtc_clk) | ||
601 | }; | ||
602 | |||
603 | int __init mx1_clocks_init(unsigned long fref) | ||
604 | { | ||
605 | unsigned int reg; | ||
606 | |||
607 | /* disable clocks we are able to */ | ||
608 | __raw_writel(0, SCM_GCCR); | ||
609 | |||
610 | clk32_rate = fref; | ||
611 | reg = __raw_readl(CCM_CSCR); | ||
612 | |||
613 | /* detect clock reference for system PLL */ | ||
614 | if (reg & CCM_CSCR_SYSTEM_SEL) { | ||
615 | prem_clk.parent = &clk16m; | ||
616 | } else { | ||
617 | /* ensure that oscillator is disabled */ | ||
618 | reg &= ~(1 << CCM_CSCR_OSC_EN_SHIFT); | ||
619 | __raw_writel(reg, CCM_CSCR); | ||
620 | prem_clk.parent = &clk32_premult; | ||
621 | } | ||
622 | |||
623 | /* detect reference for CLKO */ | ||
624 | reg = (reg & CCM_CSCR_CLKO_MASK) >> CCM_CSCR_CLKO_OFFSET; | ||
625 | clko_clk.parent = (struct clk *)clko_clocks[reg]; | ||
626 | |||
627 | clkdev_add_table(lookups, ARRAY_SIZE(lookups)); | ||
628 | |||
629 | clk_enable(&hclk); | ||
630 | clk_enable(&fclk); | ||
631 | |||
632 | mxc_timer_init(&gpt_clk, MX1_IO_ADDRESS(MX1_TIM1_BASE_ADDR), | ||
633 | MX1_TIM1_INT); | ||
634 | |||
635 | return 0; | ||
636 | } | ||
diff --git a/arch/arm/mach-imx/clock-imx21.c b/arch/arm/mach-imx/clock-imx21.c deleted file mode 100644 index ee15d8c9db08..000000000000 --- a/arch/arm/mach-imx/clock-imx21.c +++ /dev/null | |||
@@ -1,1239 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright 2004-2007 Freescale Semiconductor, Inc. All Rights Reserved. | ||
3 | * Copyright 2008 Juergen Beisert, kernel@pengutronix.de | ||
4 | * Copyright 2008 Martin Fuzzey, mfuzzey@gmail.com | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version 2 | ||
9 | * of the License, or (at your option) any later version. | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program; if not, write to the Free Software | ||
17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, | ||
18 | * MA 02110-1301, USA. | ||
19 | */ | ||
20 | |||
21 | #include <linux/clk.h> | ||
22 | #include <linux/io.h> | ||
23 | #include <linux/module.h> | ||
24 | #include <linux/clkdev.h> | ||
25 | |||
26 | #include <mach/clock.h> | ||
27 | #include <mach/hardware.h> | ||
28 | #include <mach/common.h> | ||
29 | #include <asm/div64.h> | ||
30 | |||
31 | #define IO_ADDR_CCM(off) (MX21_IO_ADDRESS(MX21_CCM_BASE_ADDR + (off))) | ||
32 | |||
33 | /* Register offsets */ | ||
34 | #define CCM_CSCR IO_ADDR_CCM(0x0) | ||
35 | #define CCM_MPCTL0 IO_ADDR_CCM(0x4) | ||
36 | #define CCM_MPCTL1 IO_ADDR_CCM(0x8) | ||
37 | #define CCM_SPCTL0 IO_ADDR_CCM(0xc) | ||
38 | #define CCM_SPCTL1 IO_ADDR_CCM(0x10) | ||
39 | #define CCM_OSC26MCTL IO_ADDR_CCM(0x14) | ||
40 | #define CCM_PCDR0 IO_ADDR_CCM(0x18) | ||
41 | #define CCM_PCDR1 IO_ADDR_CCM(0x1c) | ||
42 | #define CCM_PCCR0 IO_ADDR_CCM(0x20) | ||
43 | #define CCM_PCCR1 IO_ADDR_CCM(0x24) | ||
44 | #define CCM_CCSR IO_ADDR_CCM(0x28) | ||
45 | #define CCM_PMCTL IO_ADDR_CCM(0x2c) | ||
46 | #define CCM_PMCOUNT IO_ADDR_CCM(0x30) | ||
47 | #define CCM_WKGDCTL IO_ADDR_CCM(0x34) | ||
48 | |||
49 | #define CCM_CSCR_PRESC_OFFSET 29 | ||
50 | #define CCM_CSCR_PRESC_MASK (0x7 << CCM_CSCR_PRESC_OFFSET) | ||
51 | |||
52 | #define CCM_CSCR_USB_OFFSET 26 | ||
53 | #define CCM_CSCR_USB_MASK (0x7 << CCM_CSCR_USB_OFFSET) | ||
54 | #define CCM_CSCR_SD_OFFSET 24 | ||
55 | #define CCM_CSCR_SD_MASK (0x3 << CCM_CSCR_SD_OFFSET) | ||
56 | #define CCM_CSCR_SPLLRES (1 << 22) | ||
57 | #define CCM_CSCR_MPLLRES (1 << 21) | ||
58 | #define CCM_CSCR_SSI2_OFFSET 20 | ||
59 | #define CCM_CSCR_SSI2 (1 << CCM_CSCR_SSI2_OFFSET) | ||
60 | #define CCM_CSCR_SSI1_OFFSET 19 | ||
61 | #define CCM_CSCR_SSI1 (1 << CCM_CSCR_SSI1_OFFSET) | ||
62 | #define CCM_CSCR_FIR_OFFSET 18 | ||
63 | #define CCM_CSCR_FIR (1 << CCM_CSCR_FIR_OFFSET) | ||
64 | #define CCM_CSCR_SP (1 << 17) | ||
65 | #define CCM_CSCR_MCU (1 << 16) | ||
66 | #define CCM_CSCR_BCLK_OFFSET 10 | ||
67 | #define CCM_CSCR_BCLK_MASK (0xf << CCM_CSCR_BCLK_OFFSET) | ||
68 | #define CCM_CSCR_IPDIV_OFFSET 9 | ||
69 | #define CCM_CSCR_IPDIV (1 << CCM_CSCR_IPDIV_OFFSET) | ||
70 | |||
71 | #define CCM_CSCR_OSC26MDIV (1 << 4) | ||
72 | #define CCM_CSCR_OSC26M (1 << 3) | ||
73 | #define CCM_CSCR_FPM (1 << 2) | ||
74 | #define CCM_CSCR_SPEN (1 << 1) | ||
75 | #define CCM_CSCR_MPEN 1 | ||
76 | |||
77 | #define CCM_MPCTL0_CPLM (1 << 31) | ||
78 | #define CCM_MPCTL0_PD_OFFSET 26 | ||
79 | #define CCM_MPCTL0_PD_MASK (0xf << 26) | ||
80 | #define CCM_MPCTL0_MFD_OFFSET 16 | ||
81 | #define CCM_MPCTL0_MFD_MASK (0x3ff << 16) | ||
82 | #define CCM_MPCTL0_MFI_OFFSET 10 | ||
83 | #define CCM_MPCTL0_MFI_MASK (0xf << 10) | ||
84 | #define CCM_MPCTL0_MFN_OFFSET 0 | ||
85 | #define CCM_MPCTL0_MFN_MASK 0x3ff | ||
86 | |||
87 | #define CCM_MPCTL1_LF (1 << 15) | ||
88 | #define CCM_MPCTL1_BRMO (1 << 6) | ||
89 | |||
90 | #define CCM_SPCTL0_CPLM (1 << 31) | ||
91 | #define CCM_SPCTL0_PD_OFFSET 26 | ||
92 | #define CCM_SPCTL0_PD_MASK (0xf << 26) | ||
93 | #define CCM_SPCTL0_MFD_OFFSET 16 | ||
94 | #define CCM_SPCTL0_MFD_MASK (0x3ff << 16) | ||
95 | #define CCM_SPCTL0_MFI_OFFSET 10 | ||
96 | #define CCM_SPCTL0_MFI_MASK (0xf << 10) | ||
97 | #define CCM_SPCTL0_MFN_OFFSET 0 | ||
98 | #define CCM_SPCTL0_MFN_MASK 0x3ff | ||
99 | |||
100 | #define CCM_SPCTL1_LF (1 << 15) | ||
101 | #define CCM_SPCTL1_BRMO (1 << 6) | ||
102 | |||
103 | #define CCM_OSC26MCTL_PEAK_OFFSET 16 | ||
104 | #define CCM_OSC26MCTL_PEAK_MASK (0x3 << 16) | ||
105 | #define CCM_OSC26MCTL_AGC_OFFSET 8 | ||
106 | #define CCM_OSC26MCTL_AGC_MASK (0x3f << 8) | ||
107 | #define CCM_OSC26MCTL_ANATEST_OFFSET 0 | ||
108 | #define CCM_OSC26MCTL_ANATEST_MASK 0x3f | ||
109 | |||
110 | #define CCM_PCDR0_SSI2BAUDDIV_OFFSET 26 | ||
111 | #define CCM_PCDR0_SSI2BAUDDIV_MASK (0x3f << 26) | ||
112 | #define CCM_PCDR0_SSI1BAUDDIV_OFFSET 16 | ||
113 | #define CCM_PCDR0_SSI1BAUDDIV_MASK (0x3f << 16) | ||
114 | #define CCM_PCDR0_NFCDIV_OFFSET 12 | ||
115 | #define CCM_PCDR0_NFCDIV_MASK (0xf << 12) | ||
116 | #define CCM_PCDR0_48MDIV_OFFSET 5 | ||
117 | #define CCM_PCDR0_48MDIV_MASK (0x7 << CCM_PCDR0_48MDIV_OFFSET) | ||
118 | #define CCM_PCDR0_FIRIDIV_OFFSET 0 | ||
119 | #define CCM_PCDR0_FIRIDIV_MASK 0x1f | ||
120 | #define CCM_PCDR1_PERDIV4_OFFSET 24 | ||
121 | #define CCM_PCDR1_PERDIV4_MASK (0x3f << 24) | ||
122 | #define CCM_PCDR1_PERDIV3_OFFSET 16 | ||
123 | #define CCM_PCDR1_PERDIV3_MASK (0x3f << 16) | ||
124 | #define CCM_PCDR1_PERDIV2_OFFSET 8 | ||
125 | #define CCM_PCDR1_PERDIV2_MASK (0x3f << 8) | ||
126 | #define CCM_PCDR1_PERDIV1_OFFSET 0 | ||
127 | #define CCM_PCDR1_PERDIV1_MASK 0x3f | ||
128 | |||
129 | #define CCM_PCCR_HCLK_CSI_OFFSET 31 | ||
130 | #define CCM_PCCR_HCLK_CSI_REG CCM_PCCR0 | ||
131 | #define CCM_PCCR_HCLK_DMA_OFFSET 30 | ||
132 | #define CCM_PCCR_HCLK_DMA_REG CCM_PCCR0 | ||
133 | #define CCM_PCCR_HCLK_BROM_OFFSET 28 | ||
134 | #define CCM_PCCR_HCLK_BROM_REG CCM_PCCR0 | ||
135 | #define CCM_PCCR_HCLK_EMMA_OFFSET 27 | ||
136 | #define CCM_PCCR_HCLK_EMMA_REG CCM_PCCR0 | ||
137 | #define CCM_PCCR_HCLK_LCDC_OFFSET 26 | ||
138 | #define CCM_PCCR_HCLK_LCDC_REG CCM_PCCR0 | ||
139 | #define CCM_PCCR_HCLK_SLCDC_OFFSET 25 | ||
140 | #define CCM_PCCR_HCLK_SLCDC_REG CCM_PCCR0 | ||
141 | #define CCM_PCCR_HCLK_USBOTG_OFFSET 24 | ||
142 | #define CCM_PCCR_HCLK_USBOTG_REG CCM_PCCR0 | ||
143 | #define CCM_PCCR_HCLK_BMI_OFFSET 23 | ||
144 | #define CCM_PCCR_BMI_MASK (1 << CCM_PCCR_BMI_MASK) | ||
145 | #define CCM_PCCR_HCLK_BMI_REG CCM_PCCR0 | ||
146 | #define CCM_PCCR_PERCLK4_OFFSET 22 | ||
147 | #define CCM_PCCR_PERCLK4_REG CCM_PCCR0 | ||
148 | #define CCM_PCCR_SLCDC_OFFSET 21 | ||
149 | #define CCM_PCCR_SLCDC_REG CCM_PCCR0 | ||
150 | #define CCM_PCCR_FIRI_BAUD_OFFSET 20 | ||
151 | #define CCM_PCCR_FIRI_BAUD_MASK (1 << CCM_PCCR_FIRI_BAUD_MASK) | ||
152 | #define CCM_PCCR_FIRI_BAUD_REG CCM_PCCR0 | ||
153 | #define CCM_PCCR_NFC_OFFSET 19 | ||
154 | #define CCM_PCCR_NFC_REG CCM_PCCR0 | ||
155 | #define CCM_PCCR_LCDC_OFFSET 18 | ||
156 | #define CCM_PCCR_LCDC_REG CCM_PCCR0 | ||
157 | #define CCM_PCCR_SSI1_BAUD_OFFSET 17 | ||
158 | #define CCM_PCCR_SSI1_BAUD_REG CCM_PCCR0 | ||
159 | #define CCM_PCCR_SSI2_BAUD_OFFSET 16 | ||
160 | #define CCM_PCCR_SSI2_BAUD_REG CCM_PCCR0 | ||
161 | #define CCM_PCCR_EMMA_OFFSET 15 | ||
162 | #define CCM_PCCR_EMMA_REG CCM_PCCR0 | ||
163 | #define CCM_PCCR_USBOTG_OFFSET 14 | ||
164 | #define CCM_PCCR_USBOTG_REG CCM_PCCR0 | ||
165 | #define CCM_PCCR_DMA_OFFSET 13 | ||
166 | #define CCM_PCCR_DMA_REG CCM_PCCR0 | ||
167 | #define CCM_PCCR_I2C1_OFFSET 12 | ||
168 | #define CCM_PCCR_I2C1_REG CCM_PCCR0 | ||
169 | #define CCM_PCCR_GPIO_OFFSET 11 | ||
170 | #define CCM_PCCR_GPIO_REG CCM_PCCR0 | ||
171 | #define CCM_PCCR_SDHC2_OFFSET 10 | ||
172 | #define CCM_PCCR_SDHC2_REG CCM_PCCR0 | ||
173 | #define CCM_PCCR_SDHC1_OFFSET 9 | ||
174 | #define CCM_PCCR_SDHC1_REG CCM_PCCR0 | ||
175 | #define CCM_PCCR_FIRI_OFFSET 8 | ||
176 | #define CCM_PCCR_FIRI_MASK (1 << CCM_PCCR_BAUD_MASK) | ||
177 | #define CCM_PCCR_FIRI_REG CCM_PCCR0 | ||
178 | #define CCM_PCCR_SSI2_IPG_OFFSET 7 | ||
179 | #define CCM_PCCR_SSI2_REG CCM_PCCR0 | ||
180 | #define CCM_PCCR_SSI1_IPG_OFFSET 6 | ||
181 | #define CCM_PCCR_SSI1_REG CCM_PCCR0 | ||
182 | #define CCM_PCCR_CSPI2_OFFSET 5 | ||
183 | #define CCM_PCCR_CSPI2_REG CCM_PCCR0 | ||
184 | #define CCM_PCCR_CSPI1_OFFSET 4 | ||
185 | #define CCM_PCCR_CSPI1_REG CCM_PCCR0 | ||
186 | #define CCM_PCCR_UART4_OFFSET 3 | ||
187 | #define CCM_PCCR_UART4_REG CCM_PCCR0 | ||
188 | #define CCM_PCCR_UART3_OFFSET 2 | ||
189 | #define CCM_PCCR_UART3_REG CCM_PCCR0 | ||
190 | #define CCM_PCCR_UART2_OFFSET 1 | ||
191 | #define CCM_PCCR_UART2_REG CCM_PCCR0 | ||
192 | #define CCM_PCCR_UART1_OFFSET 0 | ||
193 | #define CCM_PCCR_UART1_REG CCM_PCCR0 | ||
194 | |||
195 | #define CCM_PCCR_OWIRE_OFFSET 31 | ||
196 | #define CCM_PCCR_OWIRE_REG CCM_PCCR1 | ||
197 | #define CCM_PCCR_KPP_OFFSET 30 | ||
198 | #define CCM_PCCR_KPP_REG CCM_PCCR1 | ||
199 | #define CCM_PCCR_RTC_OFFSET 29 | ||
200 | #define CCM_PCCR_RTC_REG CCM_PCCR1 | ||
201 | #define CCM_PCCR_PWM_OFFSET 28 | ||
202 | #define CCM_PCCR_PWM_REG CCM_PCCR1 | ||
203 | #define CCM_PCCR_GPT3_OFFSET 27 | ||
204 | #define CCM_PCCR_GPT3_REG CCM_PCCR1 | ||
205 | #define CCM_PCCR_GPT2_OFFSET 26 | ||
206 | #define CCM_PCCR_GPT2_REG CCM_PCCR1 | ||
207 | #define CCM_PCCR_GPT1_OFFSET 25 | ||
208 | #define CCM_PCCR_GPT1_REG CCM_PCCR1 | ||
209 | #define CCM_PCCR_WDT_OFFSET 24 | ||
210 | #define CCM_PCCR_WDT_REG CCM_PCCR1 | ||
211 | #define CCM_PCCR_CSPI3_OFFSET 23 | ||
212 | #define CCM_PCCR_CSPI3_REG CCM_PCCR1 | ||
213 | |||
214 | #define CCM_PCCR_CSPI1_MASK (1 << CCM_PCCR_CSPI1_OFFSET) | ||
215 | #define CCM_PCCR_CSPI2_MASK (1 << CCM_PCCR_CSPI2_OFFSET) | ||
216 | #define CCM_PCCR_CSPI3_MASK (1 << CCM_PCCR_CSPI3_OFFSET) | ||
217 | #define CCM_PCCR_DMA_MASK (1 << CCM_PCCR_DMA_OFFSET) | ||
218 | #define CCM_PCCR_EMMA_MASK (1 << CCM_PCCR_EMMA_OFFSET) | ||
219 | #define CCM_PCCR_GPIO_MASK (1 << CCM_PCCR_GPIO_OFFSET) | ||
220 | #define CCM_PCCR_GPT1_MASK (1 << CCM_PCCR_GPT1_OFFSET) | ||
221 | #define CCM_PCCR_GPT2_MASK (1 << CCM_PCCR_GPT2_OFFSET) | ||
222 | #define CCM_PCCR_GPT3_MASK (1 << CCM_PCCR_GPT3_OFFSET) | ||
223 | #define CCM_PCCR_HCLK_BROM_MASK (1 << CCM_PCCR_HCLK_BROM_OFFSET) | ||
224 | #define CCM_PCCR_HCLK_CSI_MASK (1 << CCM_PCCR_HCLK_CSI_OFFSET) | ||
225 | #define CCM_PCCR_HCLK_DMA_MASK (1 << CCM_PCCR_HCLK_DMA_OFFSET) | ||
226 | #define CCM_PCCR_HCLK_EMMA_MASK (1 << CCM_PCCR_HCLK_EMMA_OFFSET) | ||
227 | #define CCM_PCCR_HCLK_LCDC_MASK (1 << CCM_PCCR_HCLK_LCDC_OFFSET) | ||
228 | #define CCM_PCCR_HCLK_SLCDC_MASK (1 << CCM_PCCR_HCLK_SLCDC_OFFSET) | ||
229 | #define CCM_PCCR_HCLK_USBOTG_MASK (1 << CCM_PCCR_HCLK_USBOTG_OFFSET) | ||
230 | #define CCM_PCCR_I2C1_MASK (1 << CCM_PCCR_I2C1_OFFSET) | ||
231 | #define CCM_PCCR_KPP_MASK (1 << CCM_PCCR_KPP_OFFSET) | ||
232 | #define CCM_PCCR_LCDC_MASK (1 << CCM_PCCR_LCDC_OFFSET) | ||
233 | #define CCM_PCCR_NFC_MASK (1 << CCM_PCCR_NFC_OFFSET) | ||
234 | #define CCM_PCCR_OWIRE_MASK (1 << CCM_PCCR_OWIRE_OFFSET) | ||
235 | #define CCM_PCCR_PERCLK4_MASK (1 << CCM_PCCR_PERCLK4_OFFSET) | ||
236 | #define CCM_PCCR_PWM_MASK (1 << CCM_PCCR_PWM_OFFSET) | ||
237 | #define CCM_PCCR_RTC_MASK (1 << CCM_PCCR_RTC_OFFSET) | ||
238 | #define CCM_PCCR_SDHC1_MASK (1 << CCM_PCCR_SDHC1_OFFSET) | ||
239 | #define CCM_PCCR_SDHC2_MASK (1 << CCM_PCCR_SDHC2_OFFSET) | ||
240 | #define CCM_PCCR_SLCDC_MASK (1 << CCM_PCCR_SLCDC_OFFSET) | ||
241 | #define CCM_PCCR_SSI1_BAUD_MASK (1 << CCM_PCCR_SSI1_BAUD_OFFSET) | ||
242 | #define CCM_PCCR_SSI1_IPG_MASK (1 << CCM_PCCR_SSI1_IPG_OFFSET) | ||
243 | #define CCM_PCCR_SSI2_BAUD_MASK (1 << CCM_PCCR_SSI2_BAUD_OFFSET) | ||
244 | #define CCM_PCCR_SSI2_IPG_MASK (1 << CCM_PCCR_SSI2_IPG_OFFSET) | ||
245 | #define CCM_PCCR_UART1_MASK (1 << CCM_PCCR_UART1_OFFSET) | ||
246 | #define CCM_PCCR_UART2_MASK (1 << CCM_PCCR_UART2_OFFSET) | ||
247 | #define CCM_PCCR_UART3_MASK (1 << CCM_PCCR_UART3_OFFSET) | ||
248 | #define CCM_PCCR_UART4_MASK (1 << CCM_PCCR_UART4_OFFSET) | ||
249 | #define CCM_PCCR_USBOTG_MASK (1 << CCM_PCCR_USBOTG_OFFSET) | ||
250 | #define CCM_PCCR_WDT_MASK (1 << CCM_PCCR_WDT_OFFSET) | ||
251 | |||
252 | #define CCM_CCSR_32KSR (1 << 15) | ||
253 | |||
254 | #define CCM_CCSR_CLKMODE1 (1 << 9) | ||
255 | #define CCM_CCSR_CLKMODE0 (1 << 8) | ||
256 | |||
257 | #define CCM_CCSR_CLKOSEL_OFFSET 0 | ||
258 | #define CCM_CCSR_CLKOSEL_MASK 0x1f | ||
259 | |||
260 | #define SYS_FMCR 0x14 /* Functional Muxing Control Reg */ | ||
261 | #define SYS_CHIP_ID 0x00 /* The offset of CHIP ID register */ | ||
262 | |||
263 | static int _clk_enable(struct clk *clk) | ||
264 | { | ||
265 | u32 reg; | ||
266 | |||
267 | reg = __raw_readl(clk->enable_reg); | ||
268 | reg |= 1 << clk->enable_shift; | ||
269 | __raw_writel(reg, clk->enable_reg); | ||
270 | return 0; | ||
271 | } | ||
272 | |||
273 | static void _clk_disable(struct clk *clk) | ||
274 | { | ||
275 | u32 reg; | ||
276 | |||
277 | reg = __raw_readl(clk->enable_reg); | ||
278 | reg &= ~(1 << clk->enable_shift); | ||
279 | __raw_writel(reg, clk->enable_reg); | ||
280 | } | ||
281 | |||
282 | static unsigned long _clk_generic_round_rate(struct clk *clk, | ||
283 | unsigned long rate, | ||
284 | u32 max_divisor) | ||
285 | { | ||
286 | u32 div; | ||
287 | unsigned long parent_rate; | ||
288 | |||
289 | parent_rate = clk_get_rate(clk->parent); | ||
290 | |||
291 | div = parent_rate / rate; | ||
292 | if (parent_rate % rate) | ||
293 | div++; | ||
294 | |||
295 | if (div > max_divisor) | ||
296 | div = max_divisor; | ||
297 | |||
298 | return parent_rate / div; | ||
299 | } | ||
300 | |||
301 | static int _clk_spll_enable(struct clk *clk) | ||
302 | { | ||
303 | u32 reg; | ||
304 | |||
305 | reg = __raw_readl(CCM_CSCR); | ||
306 | reg |= CCM_CSCR_SPEN; | ||
307 | __raw_writel(reg, CCM_CSCR); | ||
308 | |||
309 | while ((__raw_readl(CCM_SPCTL1) & CCM_SPCTL1_LF) == 0) | ||
310 | ; | ||
311 | return 0; | ||
312 | } | ||
313 | |||
314 | static void _clk_spll_disable(struct clk *clk) | ||
315 | { | ||
316 | u32 reg; | ||
317 | |||
318 | reg = __raw_readl(CCM_CSCR); | ||
319 | reg &= ~CCM_CSCR_SPEN; | ||
320 | __raw_writel(reg, CCM_CSCR); | ||
321 | } | ||
322 | |||
323 | |||
324 | #define CSCR() (__raw_readl(CCM_CSCR)) | ||
325 | #define PCDR0() (__raw_readl(CCM_PCDR0)) | ||
326 | #define PCDR1() (__raw_readl(CCM_PCDR1)) | ||
327 | |||
328 | static unsigned long _clk_perclkx_round_rate(struct clk *clk, | ||
329 | unsigned long rate) | ||
330 | { | ||
331 | return _clk_generic_round_rate(clk, rate, 64); | ||
332 | } | ||
333 | |||
334 | static int _clk_perclkx_set_rate(struct clk *clk, unsigned long rate) | ||
335 | { | ||
336 | u32 reg; | ||
337 | u32 div; | ||
338 | unsigned long parent_rate; | ||
339 | |||
340 | parent_rate = clk_get_rate(clk->parent); | ||
341 | |||
342 | if (clk->id < 0 || clk->id > 3) | ||
343 | return -EINVAL; | ||
344 | |||
345 | div = parent_rate / rate; | ||
346 | if (div > 64 || div < 1 || ((parent_rate / div) != rate)) | ||
347 | return -EINVAL; | ||
348 | div--; | ||
349 | |||
350 | reg = | ||
351 | __raw_readl(CCM_PCDR1) & ~(CCM_PCDR1_PERDIV1_MASK << | ||
352 | (clk->id << 3)); | ||
353 | reg |= div << (clk->id << 3); | ||
354 | __raw_writel(reg, CCM_PCDR1); | ||
355 | |||
356 | return 0; | ||
357 | } | ||
358 | |||
359 | static unsigned long _clk_usb_recalc(struct clk *clk) | ||
360 | { | ||
361 | unsigned long usb_pdf; | ||
362 | unsigned long parent_rate; | ||
363 | |||
364 | parent_rate = clk_get_rate(clk->parent); | ||
365 | |||
366 | usb_pdf = (CSCR() & CCM_CSCR_USB_MASK) >> CCM_CSCR_USB_OFFSET; | ||
367 | |||
368 | return parent_rate / (usb_pdf + 1U); | ||
369 | } | ||
370 | |||
371 | static unsigned long _clk_usb_round_rate(struct clk *clk, | ||
372 | unsigned long rate) | ||
373 | { | ||
374 | return _clk_generic_round_rate(clk, rate, 8); | ||
375 | } | ||
376 | |||
377 | static int _clk_usb_set_rate(struct clk *clk, unsigned long rate) | ||
378 | { | ||
379 | u32 reg; | ||
380 | u32 div; | ||
381 | unsigned long parent_rate; | ||
382 | |||
383 | parent_rate = clk_get_rate(clk->parent); | ||
384 | |||
385 | div = parent_rate / rate; | ||
386 | if (div > 8 || div < 1 || ((parent_rate / div) != rate)) | ||
387 | return -EINVAL; | ||
388 | div--; | ||
389 | |||
390 | reg = CSCR() & ~CCM_CSCR_USB_MASK; | ||
391 | reg |= div << CCM_CSCR_USB_OFFSET; | ||
392 | __raw_writel(reg, CCM_CSCR); | ||
393 | |||
394 | return 0; | ||
395 | } | ||
396 | |||
397 | static unsigned long _clk_ssix_recalc(struct clk *clk, unsigned long pdf) | ||
398 | { | ||
399 | unsigned long parent_rate; | ||
400 | |||
401 | parent_rate = clk_get_rate(clk->parent); | ||
402 | |||
403 | pdf = (pdf < 2) ? 124UL : pdf; /* MX21 & MX27 TO1 */ | ||
404 | |||
405 | return 2UL * parent_rate / pdf; | ||
406 | } | ||
407 | |||
408 | static unsigned long _clk_ssi1_recalc(struct clk *clk) | ||
409 | { | ||
410 | return _clk_ssix_recalc(clk, | ||
411 | (PCDR0() & CCM_PCDR0_SSI1BAUDDIV_MASK) | ||
412 | >> CCM_PCDR0_SSI1BAUDDIV_OFFSET); | ||
413 | } | ||
414 | |||
415 | static unsigned long _clk_ssi2_recalc(struct clk *clk) | ||
416 | { | ||
417 | return _clk_ssix_recalc(clk, | ||
418 | (PCDR0() & CCM_PCDR0_SSI2BAUDDIV_MASK) >> | ||
419 | CCM_PCDR0_SSI2BAUDDIV_OFFSET); | ||
420 | } | ||
421 | |||
422 | static unsigned long _clk_nfc_recalc(struct clk *clk) | ||
423 | { | ||
424 | unsigned long nfc_pdf; | ||
425 | unsigned long parent_rate; | ||
426 | |||
427 | parent_rate = clk_get_rate(clk->parent); | ||
428 | |||
429 | nfc_pdf = (PCDR0() & CCM_PCDR0_NFCDIV_MASK) | ||
430 | >> CCM_PCDR0_NFCDIV_OFFSET; | ||
431 | |||
432 | return parent_rate / (nfc_pdf + 1); | ||
433 | } | ||
434 | |||
435 | static unsigned long _clk_parent_round_rate(struct clk *clk, unsigned long rate) | ||
436 | { | ||
437 | return clk->parent->round_rate(clk->parent, rate); | ||
438 | } | ||
439 | |||
440 | static int _clk_parent_set_rate(struct clk *clk, unsigned long rate) | ||
441 | { | ||
442 | return clk->parent->set_rate(clk->parent, rate); | ||
443 | } | ||
444 | |||
445 | static unsigned long external_high_reference; /* in Hz */ | ||
446 | |||
447 | static unsigned long get_high_reference_clock_rate(struct clk *clk) | ||
448 | { | ||
449 | return external_high_reference; | ||
450 | } | ||
451 | |||
452 | /* | ||
453 | * the high frequency external clock reference | ||
454 | * Default case is 26MHz. | ||
455 | */ | ||
456 | static struct clk ckih_clk = { | ||
457 | .get_rate = get_high_reference_clock_rate, | ||
458 | }; | ||
459 | |||
460 | static unsigned long external_low_reference; /* in Hz */ | ||
461 | |||
462 | static unsigned long get_low_reference_clock_rate(struct clk *clk) | ||
463 | { | ||
464 | return external_low_reference; | ||
465 | } | ||
466 | |||
467 | /* | ||
468 | * the low frequency external clock reference | ||
469 | * Default case is 32.768kHz. | ||
470 | */ | ||
471 | static struct clk ckil_clk = { | ||
472 | .get_rate = get_low_reference_clock_rate, | ||
473 | }; | ||
474 | |||
475 | |||
476 | static unsigned long _clk_fpm_recalc(struct clk *clk) | ||
477 | { | ||
478 | return clk_get_rate(clk->parent) * 512; | ||
479 | } | ||
480 | |||
481 | /* Output of frequency pre multiplier */ | ||
482 | static struct clk fpm_clk = { | ||
483 | .parent = &ckil_clk, | ||
484 | .get_rate = _clk_fpm_recalc, | ||
485 | }; | ||
486 | |||
487 | static unsigned long get_mpll_clk(struct clk *clk) | ||
488 | { | ||
489 | uint32_t reg; | ||
490 | unsigned long ref_clk; | ||
491 | unsigned long mfi = 0, mfn = 0, mfd = 0, pdf = 0; | ||
492 | unsigned long long temp; | ||
493 | |||
494 | ref_clk = clk_get_rate(clk->parent); | ||
495 | |||
496 | reg = __raw_readl(CCM_MPCTL0); | ||
497 | pdf = (reg & CCM_MPCTL0_PD_MASK) >> CCM_MPCTL0_PD_OFFSET; | ||
498 | mfd = (reg & CCM_MPCTL0_MFD_MASK) >> CCM_MPCTL0_MFD_OFFSET; | ||
499 | mfi = (reg & CCM_MPCTL0_MFI_MASK) >> CCM_MPCTL0_MFI_OFFSET; | ||
500 | mfn = (reg & CCM_MPCTL0_MFN_MASK) >> CCM_MPCTL0_MFN_OFFSET; | ||
501 | |||
502 | mfi = (mfi <= 5) ? 5 : mfi; | ||
503 | temp = 2LL * ref_clk * mfn; | ||
504 | do_div(temp, mfd + 1); | ||
505 | temp = 2LL * ref_clk * mfi + temp; | ||
506 | do_div(temp, pdf + 1); | ||
507 | |||
508 | return (unsigned long)temp; | ||
509 | } | ||
510 | |||
511 | static struct clk mpll_clk = { | ||
512 | .parent = &ckih_clk, | ||
513 | .get_rate = get_mpll_clk, | ||
514 | }; | ||
515 | |||
516 | static unsigned long _clk_fclk_get_rate(struct clk *clk) | ||
517 | { | ||
518 | unsigned long parent_rate; | ||
519 | u32 div; | ||
520 | |||
521 | div = (CSCR() & CCM_CSCR_PRESC_MASK) >> CCM_CSCR_PRESC_OFFSET; | ||
522 | parent_rate = clk_get_rate(clk->parent); | ||
523 | |||
524 | return parent_rate / (div+1); | ||
525 | } | ||
526 | |||
527 | static struct clk fclk_clk = { | ||
528 | .parent = &mpll_clk, | ||
529 | .get_rate = _clk_fclk_get_rate | ||
530 | }; | ||
531 | |||
532 | static unsigned long get_spll_clk(struct clk *clk) | ||
533 | { | ||
534 | uint32_t reg; | ||
535 | unsigned long ref_clk; | ||
536 | unsigned long mfi = 0, mfn = 0, mfd = 0, pdf = 0; | ||
537 | unsigned long long temp; | ||
538 | |||
539 | ref_clk = clk_get_rate(clk->parent); | ||
540 | |||
541 | reg = __raw_readl(CCM_SPCTL0); | ||
542 | pdf = (reg & CCM_SPCTL0_PD_MASK) >> CCM_SPCTL0_PD_OFFSET; | ||
543 | mfd = (reg & CCM_SPCTL0_MFD_MASK) >> CCM_SPCTL0_MFD_OFFSET; | ||
544 | mfi = (reg & CCM_SPCTL0_MFI_MASK) >> CCM_SPCTL0_MFI_OFFSET; | ||
545 | mfn = (reg & CCM_SPCTL0_MFN_MASK) >> CCM_SPCTL0_MFN_OFFSET; | ||
546 | |||
547 | mfi = (mfi <= 5) ? 5 : mfi; | ||
548 | temp = 2LL * ref_clk * mfn; | ||
549 | do_div(temp, mfd + 1); | ||
550 | temp = 2LL * ref_clk * mfi + temp; | ||
551 | do_div(temp, pdf + 1); | ||
552 | |||
553 | return (unsigned long)temp; | ||
554 | } | ||
555 | |||
556 | static struct clk spll_clk = { | ||
557 | .parent = &ckih_clk, | ||
558 | .get_rate = get_spll_clk, | ||
559 | .enable = _clk_spll_enable, | ||
560 | .disable = _clk_spll_disable, | ||
561 | }; | ||
562 | |||
563 | static unsigned long get_hclk_clk(struct clk *clk) | ||
564 | { | ||
565 | unsigned long rate; | ||
566 | unsigned long bclk_pdf; | ||
567 | |||
568 | bclk_pdf = (CSCR() & CCM_CSCR_BCLK_MASK) | ||
569 | >> CCM_CSCR_BCLK_OFFSET; | ||
570 | |||
571 | rate = clk_get_rate(clk->parent); | ||
572 | return rate / (bclk_pdf + 1); | ||
573 | } | ||
574 | |||
575 | static struct clk hclk_clk = { | ||
576 | .parent = &fclk_clk, | ||
577 | .get_rate = get_hclk_clk, | ||
578 | }; | ||
579 | |||
580 | static unsigned long get_ipg_clk(struct clk *clk) | ||
581 | { | ||
582 | unsigned long rate; | ||
583 | unsigned long ipg_pdf; | ||
584 | |||
585 | ipg_pdf = (CSCR() & CCM_CSCR_IPDIV) >> CCM_CSCR_IPDIV_OFFSET; | ||
586 | |||
587 | rate = clk_get_rate(clk->parent); | ||
588 | return rate / (ipg_pdf + 1); | ||
589 | } | ||
590 | |||
591 | static struct clk ipg_clk = { | ||
592 | .parent = &hclk_clk, | ||
593 | .get_rate = get_ipg_clk, | ||
594 | }; | ||
595 | |||
596 | static unsigned long _clk_perclkx_recalc(struct clk *clk) | ||
597 | { | ||
598 | unsigned long perclk_pdf; | ||
599 | unsigned long parent_rate; | ||
600 | |||
601 | parent_rate = clk_get_rate(clk->parent); | ||
602 | |||
603 | if (clk->id < 0 || clk->id > 3) | ||
604 | return 0; | ||
605 | |||
606 | perclk_pdf = (PCDR1() >> (clk->id << 3)) & CCM_PCDR1_PERDIV1_MASK; | ||
607 | |||
608 | return parent_rate / (perclk_pdf + 1); | ||
609 | } | ||
610 | |||
611 | static struct clk per_clk[] = { | ||
612 | { | ||
613 | .id = 0, | ||
614 | .parent = &mpll_clk, | ||
615 | .get_rate = _clk_perclkx_recalc, | ||
616 | }, { | ||
617 | .id = 1, | ||
618 | .parent = &mpll_clk, | ||
619 | .get_rate = _clk_perclkx_recalc, | ||
620 | }, { | ||
621 | .id = 2, | ||
622 | .parent = &mpll_clk, | ||
623 | .round_rate = _clk_perclkx_round_rate, | ||
624 | .set_rate = _clk_perclkx_set_rate, | ||
625 | .get_rate = _clk_perclkx_recalc, | ||
626 | /* Enable/Disable done via lcd_clkc[1] */ | ||
627 | }, { | ||
628 | .id = 3, | ||
629 | .parent = &mpll_clk, | ||
630 | .round_rate = _clk_perclkx_round_rate, | ||
631 | .set_rate = _clk_perclkx_set_rate, | ||
632 | .get_rate = _clk_perclkx_recalc, | ||
633 | /* Enable/Disable done via csi_clk[1] */ | ||
634 | }, | ||
635 | }; | ||
636 | |||
637 | static struct clk uart_ipg_clk[]; | ||
638 | |||
639 | static struct clk uart_clk[] = { | ||
640 | { | ||
641 | .id = 0, | ||
642 | .parent = &per_clk[0], | ||
643 | .secondary = &uart_ipg_clk[0], | ||
644 | }, { | ||
645 | .id = 1, | ||
646 | .parent = &per_clk[0], | ||
647 | .secondary = &uart_ipg_clk[1], | ||
648 | }, { | ||
649 | .id = 2, | ||
650 | .parent = &per_clk[0], | ||
651 | .secondary = &uart_ipg_clk[2], | ||
652 | }, { | ||
653 | .id = 3, | ||
654 | .parent = &per_clk[0], | ||
655 | .secondary = &uart_ipg_clk[3], | ||
656 | }, | ||
657 | }; | ||
658 | |||
659 | static struct clk uart_ipg_clk[] = { | ||
660 | { | ||
661 | .id = 0, | ||
662 | .parent = &ipg_clk, | ||
663 | .enable = _clk_enable, | ||
664 | .enable_reg = CCM_PCCR_UART1_REG, | ||
665 | .enable_shift = CCM_PCCR_UART1_OFFSET, | ||
666 | .disable = _clk_disable, | ||
667 | }, { | ||
668 | .id = 1, | ||
669 | .parent = &ipg_clk, | ||
670 | .enable = _clk_enable, | ||
671 | .enable_reg = CCM_PCCR_UART2_REG, | ||
672 | .enable_shift = CCM_PCCR_UART2_OFFSET, | ||
673 | .disable = _clk_disable, | ||
674 | }, { | ||
675 | .id = 2, | ||
676 | .parent = &ipg_clk, | ||
677 | .enable = _clk_enable, | ||
678 | .enable_reg = CCM_PCCR_UART3_REG, | ||
679 | .enable_shift = CCM_PCCR_UART3_OFFSET, | ||
680 | .disable = _clk_disable, | ||
681 | }, { | ||
682 | .id = 3, | ||
683 | .parent = &ipg_clk, | ||
684 | .enable = _clk_enable, | ||
685 | .enable_reg = CCM_PCCR_UART4_REG, | ||
686 | .enable_shift = CCM_PCCR_UART4_OFFSET, | ||
687 | .disable = _clk_disable, | ||
688 | }, | ||
689 | }; | ||
690 | |||
691 | static struct clk gpt_ipg_clk[]; | ||
692 | |||
693 | static struct clk gpt_clk[] = { | ||
694 | { | ||
695 | .id = 0, | ||
696 | .parent = &per_clk[0], | ||
697 | .secondary = &gpt_ipg_clk[0], | ||
698 | }, { | ||
699 | .id = 1, | ||
700 | .parent = &per_clk[0], | ||
701 | .secondary = &gpt_ipg_clk[1], | ||
702 | }, { | ||
703 | .id = 2, | ||
704 | .parent = &per_clk[0], | ||
705 | .secondary = &gpt_ipg_clk[2], | ||
706 | }, | ||
707 | }; | ||
708 | |||
709 | static struct clk gpt_ipg_clk[] = { | ||
710 | { | ||
711 | .id = 0, | ||
712 | .parent = &ipg_clk, | ||
713 | .enable = _clk_enable, | ||
714 | .enable_reg = CCM_PCCR_GPT1_REG, | ||
715 | .enable_shift = CCM_PCCR_GPT1_OFFSET, | ||
716 | .disable = _clk_disable, | ||
717 | }, { | ||
718 | .id = 1, | ||
719 | .parent = &ipg_clk, | ||
720 | .enable = _clk_enable, | ||
721 | .enable_reg = CCM_PCCR_GPT2_REG, | ||
722 | .enable_shift = CCM_PCCR_GPT2_OFFSET, | ||
723 | .disable = _clk_disable, | ||
724 | }, { | ||
725 | .id = 2, | ||
726 | .parent = &ipg_clk, | ||
727 | .enable = _clk_enable, | ||
728 | .enable_reg = CCM_PCCR_GPT3_REG, | ||
729 | .enable_shift = CCM_PCCR_GPT3_OFFSET, | ||
730 | .disable = _clk_disable, | ||
731 | }, | ||
732 | }; | ||
733 | |||
734 | static struct clk pwm_clk[] = { | ||
735 | { | ||
736 | .parent = &per_clk[0], | ||
737 | .secondary = &pwm_clk[1], | ||
738 | }, { | ||
739 | .parent = &ipg_clk, | ||
740 | .enable = _clk_enable, | ||
741 | .enable_reg = CCM_PCCR_PWM_REG, | ||
742 | .enable_shift = CCM_PCCR_PWM_OFFSET, | ||
743 | .disable = _clk_disable, | ||
744 | }, | ||
745 | }; | ||
746 | |||
747 | static struct clk sdhc_ipg_clk[]; | ||
748 | |||
749 | static struct clk sdhc_clk[] = { | ||
750 | { | ||
751 | .id = 0, | ||
752 | .parent = &per_clk[1], | ||
753 | .secondary = &sdhc_ipg_clk[0], | ||
754 | }, { | ||
755 | .id = 1, | ||
756 | .parent = &per_clk[1], | ||
757 | .secondary = &sdhc_ipg_clk[1], | ||
758 | }, | ||
759 | }; | ||
760 | |||
761 | static struct clk sdhc_ipg_clk[] = { | ||
762 | { | ||
763 | .id = 0, | ||
764 | .parent = &ipg_clk, | ||
765 | .enable = _clk_enable, | ||
766 | .enable_reg = CCM_PCCR_SDHC1_REG, | ||
767 | .enable_shift = CCM_PCCR_SDHC1_OFFSET, | ||
768 | .disable = _clk_disable, | ||
769 | }, { | ||
770 | .id = 1, | ||
771 | .parent = &ipg_clk, | ||
772 | .enable = _clk_enable, | ||
773 | .enable_reg = CCM_PCCR_SDHC2_REG, | ||
774 | .enable_shift = CCM_PCCR_SDHC2_OFFSET, | ||
775 | .disable = _clk_disable, | ||
776 | }, | ||
777 | }; | ||
778 | |||
779 | static struct clk cspi_ipg_clk[]; | ||
780 | |||
781 | static struct clk cspi_clk[] = { | ||
782 | { | ||
783 | .id = 0, | ||
784 | .parent = &per_clk[1], | ||
785 | .secondary = &cspi_ipg_clk[0], | ||
786 | }, { | ||
787 | .id = 1, | ||
788 | .parent = &per_clk[1], | ||
789 | .secondary = &cspi_ipg_clk[1], | ||
790 | }, { | ||
791 | .id = 2, | ||
792 | .parent = &per_clk[1], | ||
793 | .secondary = &cspi_ipg_clk[2], | ||
794 | }, | ||
795 | }; | ||
796 | |||
797 | static struct clk cspi_ipg_clk[] = { | ||
798 | { | ||
799 | .id = 0, | ||
800 | .parent = &ipg_clk, | ||
801 | .enable = _clk_enable, | ||
802 | .enable_reg = CCM_PCCR_CSPI1_REG, | ||
803 | .enable_shift = CCM_PCCR_CSPI1_OFFSET, | ||
804 | .disable = _clk_disable, | ||
805 | }, { | ||
806 | .id = 1, | ||
807 | .parent = &ipg_clk, | ||
808 | .enable = _clk_enable, | ||
809 | .enable_reg = CCM_PCCR_CSPI2_REG, | ||
810 | .enable_shift = CCM_PCCR_CSPI2_OFFSET, | ||
811 | .disable = _clk_disable, | ||
812 | }, { | ||
813 | .id = 3, | ||
814 | .parent = &ipg_clk, | ||
815 | .enable = _clk_enable, | ||
816 | .enable_reg = CCM_PCCR_CSPI3_REG, | ||
817 | .enable_shift = CCM_PCCR_CSPI3_OFFSET, | ||
818 | .disable = _clk_disable, | ||
819 | }, | ||
820 | }; | ||
821 | |||
822 | static struct clk lcdc_clk[] = { | ||
823 | { | ||
824 | .parent = &per_clk[2], | ||
825 | .secondary = &lcdc_clk[1], | ||
826 | .round_rate = _clk_parent_round_rate, | ||
827 | .set_rate = _clk_parent_set_rate, | ||
828 | }, { | ||
829 | .parent = &ipg_clk, | ||
830 | .secondary = &lcdc_clk[2], | ||
831 | .enable = _clk_enable, | ||
832 | .enable_reg = CCM_PCCR_LCDC_REG, | ||
833 | .enable_shift = CCM_PCCR_LCDC_OFFSET, | ||
834 | .disable = _clk_disable, | ||
835 | }, { | ||
836 | .parent = &hclk_clk, | ||
837 | .enable = _clk_enable, | ||
838 | .enable_reg = CCM_PCCR_HCLK_LCDC_REG, | ||
839 | .enable_shift = CCM_PCCR_HCLK_LCDC_OFFSET, | ||
840 | .disable = _clk_disable, | ||
841 | }, | ||
842 | }; | ||
843 | |||
844 | static struct clk csi_clk[] = { | ||
845 | { | ||
846 | .parent = &per_clk[3], | ||
847 | .secondary = &csi_clk[1], | ||
848 | .round_rate = _clk_parent_round_rate, | ||
849 | .set_rate = _clk_parent_set_rate, | ||
850 | }, { | ||
851 | .parent = &hclk_clk, | ||
852 | .enable = _clk_enable, | ||
853 | .enable_reg = CCM_PCCR_HCLK_CSI_REG, | ||
854 | .enable_shift = CCM_PCCR_HCLK_CSI_OFFSET, | ||
855 | .disable = _clk_disable, | ||
856 | }, | ||
857 | }; | ||
858 | |||
859 | static struct clk usb_clk[] = { | ||
860 | { | ||
861 | .parent = &spll_clk, | ||
862 | .secondary = &usb_clk[1], | ||
863 | .get_rate = _clk_usb_recalc, | ||
864 | .enable = _clk_enable, | ||
865 | .enable_reg = CCM_PCCR_USBOTG_REG, | ||
866 | .enable_shift = CCM_PCCR_USBOTG_OFFSET, | ||
867 | .disable = _clk_disable, | ||
868 | .round_rate = _clk_usb_round_rate, | ||
869 | .set_rate = _clk_usb_set_rate, | ||
870 | }, { | ||
871 | .parent = &hclk_clk, | ||
872 | .enable = _clk_enable, | ||
873 | .enable_reg = CCM_PCCR_HCLK_USBOTG_REG, | ||
874 | .enable_shift = CCM_PCCR_HCLK_USBOTG_OFFSET, | ||
875 | .disable = _clk_disable, | ||
876 | } | ||
877 | }; | ||
878 | |||
879 | static struct clk ssi_ipg_clk[]; | ||
880 | |||
881 | static struct clk ssi_clk[] = { | ||
882 | { | ||
883 | .id = 0, | ||
884 | .parent = &mpll_clk, | ||
885 | .secondary = &ssi_ipg_clk[0], | ||
886 | .get_rate = _clk_ssi1_recalc, | ||
887 | .enable = _clk_enable, | ||
888 | .enable_reg = CCM_PCCR_SSI1_BAUD_REG, | ||
889 | .enable_shift = CCM_PCCR_SSI1_BAUD_OFFSET, | ||
890 | .disable = _clk_disable, | ||
891 | }, { | ||
892 | .id = 1, | ||
893 | .parent = &mpll_clk, | ||
894 | .secondary = &ssi_ipg_clk[1], | ||
895 | .get_rate = _clk_ssi2_recalc, | ||
896 | .enable = _clk_enable, | ||
897 | .enable_reg = CCM_PCCR_SSI2_BAUD_REG, | ||
898 | .enable_shift = CCM_PCCR_SSI2_BAUD_OFFSET, | ||
899 | .disable = _clk_disable, | ||
900 | }, | ||
901 | }; | ||
902 | |||
903 | static struct clk ssi_ipg_clk[] = { | ||
904 | { | ||
905 | .id = 0, | ||
906 | .parent = &ipg_clk, | ||
907 | .enable = _clk_enable, | ||
908 | .enable_reg = CCM_PCCR_SSI1_REG, | ||
909 | .enable_shift = CCM_PCCR_SSI1_IPG_OFFSET, | ||
910 | .disable = _clk_disable, | ||
911 | }, { | ||
912 | .id = 1, | ||
913 | .parent = &ipg_clk, | ||
914 | .enable = _clk_enable, | ||
915 | .enable_reg = CCM_PCCR_SSI2_REG, | ||
916 | .enable_shift = CCM_PCCR_SSI2_IPG_OFFSET, | ||
917 | .disable = _clk_disable, | ||
918 | }, | ||
919 | }; | ||
920 | |||
921 | |||
922 | static struct clk nfc_clk = { | ||
923 | .parent = &fclk_clk, | ||
924 | .get_rate = _clk_nfc_recalc, | ||
925 | .enable = _clk_enable, | ||
926 | .enable_reg = CCM_PCCR_NFC_REG, | ||
927 | .enable_shift = CCM_PCCR_NFC_OFFSET, | ||
928 | .disable = _clk_disable, | ||
929 | }; | ||
930 | |||
931 | static struct clk dma_clk[] = { | ||
932 | { | ||
933 | .parent = &hclk_clk, | ||
934 | .enable = _clk_enable, | ||
935 | .enable_reg = CCM_PCCR_DMA_REG, | ||
936 | .enable_shift = CCM_PCCR_DMA_OFFSET, | ||
937 | .disable = _clk_disable, | ||
938 | .secondary = &dma_clk[1], | ||
939 | }, { | ||
940 | .enable = _clk_enable, | ||
941 | .enable_reg = CCM_PCCR_HCLK_DMA_REG, | ||
942 | .enable_shift = CCM_PCCR_HCLK_DMA_OFFSET, | ||
943 | .disable = _clk_disable, | ||
944 | }, | ||
945 | }; | ||
946 | |||
947 | static struct clk brom_clk = { | ||
948 | .parent = &hclk_clk, | ||
949 | .enable = _clk_enable, | ||
950 | .enable_reg = CCM_PCCR_HCLK_BROM_REG, | ||
951 | .enable_shift = CCM_PCCR_HCLK_BROM_OFFSET, | ||
952 | .disable = _clk_disable, | ||
953 | }; | ||
954 | |||
955 | static struct clk emma_clk[] = { | ||
956 | { | ||
957 | .parent = &hclk_clk, | ||
958 | .enable = _clk_enable, | ||
959 | .enable_reg = CCM_PCCR_EMMA_REG, | ||
960 | .enable_shift = CCM_PCCR_EMMA_OFFSET, | ||
961 | .disable = _clk_disable, | ||
962 | .secondary = &emma_clk[1], | ||
963 | }, { | ||
964 | .enable = _clk_enable, | ||
965 | .enable_reg = CCM_PCCR_HCLK_EMMA_REG, | ||
966 | .enable_shift = CCM_PCCR_HCLK_EMMA_OFFSET, | ||
967 | .disable = _clk_disable, | ||
968 | } | ||
969 | }; | ||
970 | |||
971 | static struct clk slcdc_clk[] = { | ||
972 | { | ||
973 | .parent = &hclk_clk, | ||
974 | .enable = _clk_enable, | ||
975 | .enable_reg = CCM_PCCR_SLCDC_REG, | ||
976 | .enable_shift = CCM_PCCR_SLCDC_OFFSET, | ||
977 | .disable = _clk_disable, | ||
978 | .secondary = &slcdc_clk[1], | ||
979 | }, { | ||
980 | .enable = _clk_enable, | ||
981 | .enable_reg = CCM_PCCR_HCLK_SLCDC_REG, | ||
982 | .enable_shift = CCM_PCCR_HCLK_SLCDC_OFFSET, | ||
983 | .disable = _clk_disable, | ||
984 | } | ||
985 | }; | ||
986 | |||
987 | static struct clk wdog_clk = { | ||
988 | .parent = &ipg_clk, | ||
989 | .enable = _clk_enable, | ||
990 | .enable_reg = CCM_PCCR_WDT_REG, | ||
991 | .enable_shift = CCM_PCCR_WDT_OFFSET, | ||
992 | .disable = _clk_disable, | ||
993 | }; | ||
994 | |||
995 | static struct clk gpio_clk = { | ||
996 | .parent = &ipg_clk, | ||
997 | .enable = _clk_enable, | ||
998 | .enable_reg = CCM_PCCR_GPIO_REG, | ||
999 | .enable_shift = CCM_PCCR_GPIO_OFFSET, | ||
1000 | .disable = _clk_disable, | ||
1001 | }; | ||
1002 | |||
1003 | static struct clk i2c_clk = { | ||
1004 | .id = 0, | ||
1005 | .parent = &ipg_clk, | ||
1006 | .enable = _clk_enable, | ||
1007 | .enable_reg = CCM_PCCR_I2C1_REG, | ||
1008 | .enable_shift = CCM_PCCR_I2C1_OFFSET, | ||
1009 | .disable = _clk_disable, | ||
1010 | }; | ||
1011 | |||
1012 | static struct clk kpp_clk = { | ||
1013 | .parent = &ipg_clk, | ||
1014 | .enable = _clk_enable, | ||
1015 | .enable_reg = CCM_PCCR_KPP_REG, | ||
1016 | .enable_shift = CCM_PCCR_KPP_OFFSET, | ||
1017 | .disable = _clk_disable, | ||
1018 | }; | ||
1019 | |||
1020 | static struct clk owire_clk = { | ||
1021 | .parent = &ipg_clk, | ||
1022 | .enable = _clk_enable, | ||
1023 | .enable_reg = CCM_PCCR_OWIRE_REG, | ||
1024 | .enable_shift = CCM_PCCR_OWIRE_OFFSET, | ||
1025 | .disable = _clk_disable, | ||
1026 | }; | ||
1027 | |||
1028 | static struct clk rtc_clk = { | ||
1029 | .parent = &ipg_clk, | ||
1030 | .enable = _clk_enable, | ||
1031 | .enable_reg = CCM_PCCR_RTC_REG, | ||
1032 | .enable_shift = CCM_PCCR_RTC_OFFSET, | ||
1033 | .disable = _clk_disable, | ||
1034 | }; | ||
1035 | |||
1036 | static unsigned long _clk_clko_round_rate(struct clk *clk, unsigned long rate) | ||
1037 | { | ||
1038 | return _clk_generic_round_rate(clk, rate, 8); | ||
1039 | } | ||
1040 | |||
1041 | static int _clk_clko_set_rate(struct clk *clk, unsigned long rate) | ||
1042 | { | ||
1043 | u32 reg; | ||
1044 | u32 div; | ||
1045 | unsigned long parent_rate; | ||
1046 | |||
1047 | parent_rate = clk_get_rate(clk->parent); | ||
1048 | |||
1049 | div = parent_rate / rate; | ||
1050 | |||
1051 | if (div > 8 || div < 1 || ((parent_rate / div) != rate)) | ||
1052 | return -EINVAL; | ||
1053 | div--; | ||
1054 | |||
1055 | reg = __raw_readl(CCM_PCDR0); | ||
1056 | |||
1057 | if (clk->parent == &usb_clk[0]) { | ||
1058 | reg &= ~CCM_PCDR0_48MDIV_MASK; | ||
1059 | reg |= div << CCM_PCDR0_48MDIV_OFFSET; | ||
1060 | } | ||
1061 | __raw_writel(reg, CCM_PCDR0); | ||
1062 | |||
1063 | return 0; | ||
1064 | } | ||
1065 | |||
1066 | static unsigned long _clk_clko_recalc(struct clk *clk) | ||
1067 | { | ||
1068 | u32 div = 0; | ||
1069 | unsigned long parent_rate; | ||
1070 | |||
1071 | parent_rate = clk_get_rate(clk->parent); | ||
1072 | |||
1073 | if (clk->parent == &usb_clk[0]) /* 48M */ | ||
1074 | div = __raw_readl(CCM_PCDR0) & CCM_PCDR0_48MDIV_MASK | ||
1075 | >> CCM_PCDR0_48MDIV_OFFSET; | ||
1076 | div++; | ||
1077 | |||
1078 | return parent_rate / div; | ||
1079 | } | ||
1080 | |||
1081 | static struct clk clko_clk; | ||
1082 | |||
1083 | static int _clk_clko_set_parent(struct clk *clk, struct clk *parent) | ||
1084 | { | ||
1085 | u32 reg; | ||
1086 | |||
1087 | reg = __raw_readl(CCM_CCSR) & ~CCM_CCSR_CLKOSEL_MASK; | ||
1088 | |||
1089 | if (parent == &ckil_clk) | ||
1090 | reg |= 0 << CCM_CCSR_CLKOSEL_OFFSET; | ||
1091 | else if (parent == &fpm_clk) | ||
1092 | reg |= 1 << CCM_CCSR_CLKOSEL_OFFSET; | ||
1093 | else if (parent == &ckih_clk) | ||
1094 | reg |= 2 << CCM_CCSR_CLKOSEL_OFFSET; | ||
1095 | else if (parent == mpll_clk.parent) | ||
1096 | reg |= 3 << CCM_CCSR_CLKOSEL_OFFSET; | ||
1097 | else if (parent == spll_clk.parent) | ||
1098 | reg |= 4 << CCM_CCSR_CLKOSEL_OFFSET; | ||
1099 | else if (parent == &mpll_clk) | ||
1100 | reg |= 5 << CCM_CCSR_CLKOSEL_OFFSET; | ||
1101 | else if (parent == &spll_clk) | ||
1102 | reg |= 6 << CCM_CCSR_CLKOSEL_OFFSET; | ||
1103 | else if (parent == &fclk_clk) | ||
1104 | reg |= 7 << CCM_CCSR_CLKOSEL_OFFSET; | ||
1105 | else if (parent == &hclk_clk) | ||
1106 | reg |= 8 << CCM_CCSR_CLKOSEL_OFFSET; | ||
1107 | else if (parent == &ipg_clk) | ||
1108 | reg |= 9 << CCM_CCSR_CLKOSEL_OFFSET; | ||
1109 | else if (parent == &per_clk[0]) | ||
1110 | reg |= 0xA << CCM_CCSR_CLKOSEL_OFFSET; | ||
1111 | else if (parent == &per_clk[1]) | ||
1112 | reg |= 0xB << CCM_CCSR_CLKOSEL_OFFSET; | ||
1113 | else if (parent == &per_clk[2]) | ||
1114 | reg |= 0xC << CCM_CCSR_CLKOSEL_OFFSET; | ||
1115 | else if (parent == &per_clk[3]) | ||
1116 | reg |= 0xD << CCM_CCSR_CLKOSEL_OFFSET; | ||
1117 | else if (parent == &ssi_clk[0]) | ||
1118 | reg |= 0xE << CCM_CCSR_CLKOSEL_OFFSET; | ||
1119 | else if (parent == &ssi_clk[1]) | ||
1120 | reg |= 0xF << CCM_CCSR_CLKOSEL_OFFSET; | ||
1121 | else if (parent == &nfc_clk) | ||
1122 | reg |= 0x10 << CCM_CCSR_CLKOSEL_OFFSET; | ||
1123 | else if (parent == &usb_clk[0]) | ||
1124 | reg |= 0x14 << CCM_CCSR_CLKOSEL_OFFSET; | ||
1125 | else if (parent == &clko_clk) | ||
1126 | reg |= 0x15 << CCM_CCSR_CLKOSEL_OFFSET; | ||
1127 | else | ||
1128 | return -EINVAL; | ||
1129 | |||
1130 | __raw_writel(reg, CCM_CCSR); | ||
1131 | |||
1132 | return 0; | ||
1133 | } | ||
1134 | |||
1135 | static struct clk clko_clk = { | ||
1136 | .get_rate = _clk_clko_recalc, | ||
1137 | .set_rate = _clk_clko_set_rate, | ||
1138 | .round_rate = _clk_clko_round_rate, | ||
1139 | .set_parent = _clk_clko_set_parent, | ||
1140 | }; | ||
1141 | |||
1142 | |||
1143 | #define _REGISTER_CLOCK(d, n, c) \ | ||
1144 | { \ | ||
1145 | .dev_id = d, \ | ||
1146 | .con_id = n, \ | ||
1147 | .clk = &c, \ | ||
1148 | }, | ||
1149 | static struct clk_lookup lookups[] = { | ||
1150 | /* It's unlikely that any driver wants one of them directly: | ||
1151 | _REGISTER_CLOCK(NULL, "ckih", ckih_clk) | ||
1152 | _REGISTER_CLOCK(NULL, "ckil", ckil_clk) | ||
1153 | _REGISTER_CLOCK(NULL, "fpm", fpm_clk) | ||
1154 | _REGISTER_CLOCK(NULL, "mpll", mpll_clk) | ||
1155 | _REGISTER_CLOCK(NULL, "spll", spll_clk) | ||
1156 | _REGISTER_CLOCK(NULL, "fclk", fclk_clk) | ||
1157 | _REGISTER_CLOCK(NULL, "hclk", hclk_clk) | ||
1158 | _REGISTER_CLOCK(NULL, "ipg", ipg_clk) | ||
1159 | */ | ||
1160 | _REGISTER_CLOCK(NULL, "perclk1", per_clk[0]) | ||
1161 | _REGISTER_CLOCK(NULL, "perclk2", per_clk[1]) | ||
1162 | _REGISTER_CLOCK(NULL, "perclk3", per_clk[2]) | ||
1163 | _REGISTER_CLOCK(NULL, "perclk4", per_clk[3]) | ||
1164 | _REGISTER_CLOCK(NULL, "clko", clko_clk) | ||
1165 | _REGISTER_CLOCK("imx21-uart.0", NULL, uart_clk[0]) | ||
1166 | _REGISTER_CLOCK("imx21-uart.1", NULL, uart_clk[1]) | ||
1167 | _REGISTER_CLOCK("imx21-uart.2", NULL, uart_clk[2]) | ||
1168 | _REGISTER_CLOCK("imx21-uart.3", NULL, uart_clk[3]) | ||
1169 | _REGISTER_CLOCK(NULL, "gpt1", gpt_clk[0]) | ||
1170 | _REGISTER_CLOCK(NULL, "gpt1", gpt_clk[1]) | ||
1171 | _REGISTER_CLOCK(NULL, "gpt1", gpt_clk[2]) | ||
1172 | _REGISTER_CLOCK(NULL, "pwm", pwm_clk[0]) | ||
1173 | _REGISTER_CLOCK(NULL, "sdhc1", sdhc_clk[0]) | ||
1174 | _REGISTER_CLOCK(NULL, "sdhc2", sdhc_clk[1]) | ||
1175 | _REGISTER_CLOCK("imx21-cspi.0", NULL, cspi_clk[0]) | ||
1176 | _REGISTER_CLOCK("imx21-cspi.1", NULL, cspi_clk[1]) | ||
1177 | _REGISTER_CLOCK("imx21-cspi.2", NULL, cspi_clk[2]) | ||
1178 | _REGISTER_CLOCK("imx-fb.0", NULL, lcdc_clk[0]) | ||
1179 | _REGISTER_CLOCK(NULL, "csi", csi_clk[0]) | ||
1180 | _REGISTER_CLOCK("imx21-hcd.0", NULL, usb_clk[0]) | ||
1181 | _REGISTER_CLOCK(NULL, "ssi1", ssi_clk[0]) | ||
1182 | _REGISTER_CLOCK(NULL, "ssi2", ssi_clk[1]) | ||
1183 | _REGISTER_CLOCK("mxc_nand.0", NULL, nfc_clk) | ||
1184 | _REGISTER_CLOCK(NULL, "dma", dma_clk[0]) | ||
1185 | _REGISTER_CLOCK(NULL, "brom", brom_clk) | ||
1186 | _REGISTER_CLOCK(NULL, "emma", emma_clk[0]) | ||
1187 | _REGISTER_CLOCK(NULL, "slcdc", slcdc_clk[0]) | ||
1188 | _REGISTER_CLOCK("imx2-wdt.0", NULL, wdog_clk) | ||
1189 | _REGISTER_CLOCK(NULL, "gpio", gpio_clk) | ||
1190 | _REGISTER_CLOCK("imx-i2c.0", NULL, i2c_clk) | ||
1191 | _REGISTER_CLOCK("mxc-keypad", NULL, kpp_clk) | ||
1192 | _REGISTER_CLOCK(NULL, "owire", owire_clk) | ||
1193 | _REGISTER_CLOCK(NULL, "rtc", rtc_clk) | ||
1194 | }; | ||
1195 | |||
1196 | /* | ||
1197 | * must be called very early to get information about the | ||
1198 | * available clock rate when the timer framework starts | ||
1199 | */ | ||
1200 | int __init mx21_clocks_init(unsigned long lref, unsigned long href) | ||
1201 | { | ||
1202 | u32 cscr; | ||
1203 | |||
1204 | external_low_reference = lref; | ||
1205 | external_high_reference = href; | ||
1206 | |||
1207 | /* detect clock reference for both system PLL */ | ||
1208 | cscr = CSCR(); | ||
1209 | if (cscr & CCM_CSCR_MCU) | ||
1210 | mpll_clk.parent = &ckih_clk; | ||
1211 | else | ||
1212 | mpll_clk.parent = &fpm_clk; | ||
1213 | |||
1214 | if (cscr & CCM_CSCR_SP) | ||
1215 | spll_clk.parent = &ckih_clk; | ||
1216 | else | ||
1217 | spll_clk.parent = &fpm_clk; | ||
1218 | |||
1219 | clkdev_add_table(lookups, ARRAY_SIZE(lookups)); | ||
1220 | |||
1221 | /* Turn off all clock gates */ | ||
1222 | __raw_writel(0, CCM_PCCR0); | ||
1223 | __raw_writel(CCM_PCCR_GPT1_MASK, CCM_PCCR1); | ||
1224 | |||
1225 | /* This turns of the serial PLL as well */ | ||
1226 | spll_clk.disable(&spll_clk); | ||
1227 | |||
1228 | /* This will propagate to all children and init all the clock rates. */ | ||
1229 | clk_enable(&per_clk[0]); | ||
1230 | clk_enable(&gpio_clk); | ||
1231 | |||
1232 | #if defined(CONFIG_DEBUG_LL) && !defined(CONFIG_DEBUG_ICEDCC) | ||
1233 | clk_enable(&uart_clk[0]); | ||
1234 | #endif | ||
1235 | |||
1236 | mxc_timer_init(&gpt_clk[0], MX21_IO_ADDRESS(MX21_GPT1_BASE_ADDR), | ||
1237 | MX21_INT_GPT1); | ||
1238 | return 0; | ||
1239 | } | ||
diff --git a/arch/arm/mach-imx/clock-imx25.c b/arch/arm/mach-imx/clock-imx25.c deleted file mode 100644 index b0fec74c8c91..000000000000 --- a/arch/arm/mach-imx/clock-imx25.c +++ /dev/null | |||
@@ -1,346 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2009 by Sascha Hauer, Pengutronix | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or | ||
5 | * modify it under the terms of the GNU General Public License | ||
6 | * as published by the Free Software Foundation; either version 2 | ||
7 | * of the License, or (at your option) any later version. | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License | ||
14 | * along with this program; if not, write to the Free Software | ||
15 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, | ||
16 | * MA 02110-1301, USA. | ||
17 | */ | ||
18 | |||
19 | #include <linux/kernel.h> | ||
20 | #include <linux/init.h> | ||
21 | #include <linux/list.h> | ||
22 | #include <linux/clk.h> | ||
23 | #include <linux/io.h> | ||
24 | #include <linux/clkdev.h> | ||
25 | |||
26 | #include <mach/clock.h> | ||
27 | #include <mach/hardware.h> | ||
28 | #include <mach/common.h> | ||
29 | #include <mach/mx25.h> | ||
30 | |||
31 | #define CRM_BASE MX25_IO_ADDRESS(MX25_CRM_BASE_ADDR) | ||
32 | |||
33 | #define CCM_MPCTL 0x00 | ||
34 | #define CCM_UPCTL 0x04 | ||
35 | #define CCM_CCTL 0x08 | ||
36 | #define CCM_CGCR0 0x0C | ||
37 | #define CCM_CGCR1 0x10 | ||
38 | #define CCM_CGCR2 0x14 | ||
39 | #define CCM_PCDR0 0x18 | ||
40 | #define CCM_PCDR1 0x1C | ||
41 | #define CCM_PCDR2 0x20 | ||
42 | #define CCM_PCDR3 0x24 | ||
43 | #define CCM_RCSR 0x28 | ||
44 | #define CCM_CRDR 0x2C | ||
45 | #define CCM_DCVR0 0x30 | ||
46 | #define CCM_DCVR1 0x34 | ||
47 | #define CCM_DCVR2 0x38 | ||
48 | #define CCM_DCVR3 0x3c | ||
49 | #define CCM_LTR0 0x40 | ||
50 | #define CCM_LTR1 0x44 | ||
51 | #define CCM_LTR2 0x48 | ||
52 | #define CCM_LTR3 0x4c | ||
53 | |||
54 | static unsigned long get_rate_mpll(void) | ||
55 | { | ||
56 | ulong mpctl = __raw_readl(CRM_BASE + CCM_MPCTL); | ||
57 | |||
58 | return mxc_decode_pll(mpctl, 24000000); | ||
59 | } | ||
60 | |||
61 | static unsigned long get_rate_upll(void) | ||
62 | { | ||
63 | ulong mpctl = __raw_readl(CRM_BASE + CCM_UPCTL); | ||
64 | |||
65 | return mxc_decode_pll(mpctl, 24000000); | ||
66 | } | ||
67 | |||
68 | unsigned long get_rate_arm(struct clk *clk) | ||
69 | { | ||
70 | unsigned long cctl = readl(CRM_BASE + CCM_CCTL); | ||
71 | unsigned long rate = get_rate_mpll(); | ||
72 | |||
73 | if (cctl & (1 << 14)) | ||
74 | rate = (rate * 3) >> 2; | ||
75 | |||
76 | return rate / ((cctl >> 30) + 1); | ||
77 | } | ||
78 | |||
79 | static unsigned long get_rate_ahb(struct clk *clk) | ||
80 | { | ||
81 | unsigned long cctl = readl(CRM_BASE + CCM_CCTL); | ||
82 | |||
83 | return get_rate_arm(NULL) / (((cctl >> 28) & 0x3) + 1); | ||
84 | } | ||
85 | |||
86 | static unsigned long get_rate_ipg(struct clk *clk) | ||
87 | { | ||
88 | return get_rate_ahb(NULL) >> 1; | ||
89 | } | ||
90 | |||
91 | static unsigned long get_rate_per(int per) | ||
92 | { | ||
93 | unsigned long ofs = (per & 0x3) * 8; | ||
94 | unsigned long reg = per & ~0x3; | ||
95 | unsigned long val = (readl(CRM_BASE + CCM_PCDR0 + reg) >> ofs) & 0x3f; | ||
96 | unsigned long fref; | ||
97 | |||
98 | if (readl(CRM_BASE + 0x64) & (1 << per)) | ||
99 | fref = get_rate_upll(); | ||
100 | else | ||
101 | fref = get_rate_ahb(NULL); | ||
102 | |||
103 | return fref / (val + 1); | ||
104 | } | ||
105 | |||
106 | static unsigned long get_rate_uart(struct clk *clk) | ||
107 | { | ||
108 | return get_rate_per(15); | ||
109 | } | ||
110 | |||
111 | static unsigned long get_rate_ssi2(struct clk *clk) | ||
112 | { | ||
113 | return get_rate_per(14); | ||
114 | } | ||
115 | |||
116 | static unsigned long get_rate_ssi1(struct clk *clk) | ||
117 | { | ||
118 | return get_rate_per(13); | ||
119 | } | ||
120 | |||
121 | static unsigned long get_rate_i2c(struct clk *clk) | ||
122 | { | ||
123 | return get_rate_per(6); | ||
124 | } | ||
125 | |||
126 | static unsigned long get_rate_nfc(struct clk *clk) | ||
127 | { | ||
128 | return get_rate_per(8); | ||
129 | } | ||
130 | |||
131 | static unsigned long get_rate_gpt(struct clk *clk) | ||
132 | { | ||
133 | return get_rate_per(5); | ||
134 | } | ||
135 | |||
136 | static unsigned long get_rate_lcdc(struct clk *clk) | ||
137 | { | ||
138 | return get_rate_per(7); | ||
139 | } | ||
140 | |||
141 | static unsigned long get_rate_esdhc1(struct clk *clk) | ||
142 | { | ||
143 | return get_rate_per(3); | ||
144 | } | ||
145 | |||
146 | static unsigned long get_rate_esdhc2(struct clk *clk) | ||
147 | { | ||
148 | return get_rate_per(4); | ||
149 | } | ||
150 | |||
151 | static unsigned long get_rate_csi(struct clk *clk) | ||
152 | { | ||
153 | return get_rate_per(0); | ||
154 | } | ||
155 | |||
156 | static unsigned long get_rate_otg(struct clk *clk) | ||
157 | { | ||
158 | unsigned long cctl = readl(CRM_BASE + CCM_CCTL); | ||
159 | unsigned long rate = get_rate_upll(); | ||
160 | |||
161 | return (cctl & (1 << 23)) ? 0 : rate / ((0x3F & (cctl >> 16)) + 1); | ||
162 | } | ||
163 | |||
164 | static int clk_cgcr_enable(struct clk *clk) | ||
165 | { | ||
166 | u32 reg; | ||
167 | |||
168 | reg = __raw_readl(clk->enable_reg); | ||
169 | reg |= 1 << clk->enable_shift; | ||
170 | __raw_writel(reg, clk->enable_reg); | ||
171 | |||
172 | return 0; | ||
173 | } | ||
174 | |||
175 | static void clk_cgcr_disable(struct clk *clk) | ||
176 | { | ||
177 | u32 reg; | ||
178 | |||
179 | reg = __raw_readl(clk->enable_reg); | ||
180 | reg &= ~(1 << clk->enable_shift); | ||
181 | __raw_writel(reg, clk->enable_reg); | ||
182 | } | ||
183 | |||
184 | #define DEFINE_CLOCK(name, i, er, es, gr, sr, s) \ | ||
185 | static struct clk name = { \ | ||
186 | .id = i, \ | ||
187 | .enable_reg = CRM_BASE + er, \ | ||
188 | .enable_shift = es, \ | ||
189 | .get_rate = gr, \ | ||
190 | .set_rate = sr, \ | ||
191 | .enable = clk_cgcr_enable, \ | ||
192 | .disable = clk_cgcr_disable, \ | ||
193 | .secondary = s, \ | ||
194 | } | ||
195 | |||
196 | /* | ||
197 | * Note: the following IPG clock gating bits are wrongly marked "Reserved" in | ||
198 | * the i.MX25 Reference Manual Rev 1, table 15-13. The information below is | ||
199 | * taken from the Freescale released BSP. | ||
200 | * | ||
201 | * bit reg offset clock | ||
202 | * | ||
203 | * 0 CGCR1 0 AUDMUX | ||
204 | * 12 CGCR1 12 ESAI | ||
205 | * 16 CGCR1 16 GPIO1 | ||
206 | * 17 CGCR1 17 GPIO2 | ||
207 | * 18 CGCR1 18 GPIO3 | ||
208 | * 23 CGCR1 23 I2C1 | ||
209 | * 24 CGCR1 24 I2C2 | ||
210 | * 25 CGCR1 25 I2C3 | ||
211 | * 27 CGCR1 27 IOMUXC | ||
212 | * 28 CGCR1 28 KPP | ||
213 | * 30 CGCR1 30 OWIRE | ||
214 | * 36 CGCR2 4 RTIC | ||
215 | * 51 CGCR2 19 WDOG | ||
216 | */ | ||
217 | |||
218 | DEFINE_CLOCK(gpt_clk, 0, CCM_CGCR0, 5, get_rate_gpt, NULL, NULL); | ||
219 | DEFINE_CLOCK(uart_per_clk, 0, CCM_CGCR0, 15, get_rate_uart, NULL, NULL); | ||
220 | DEFINE_CLOCK(ssi1_per_clk, 0, CCM_CGCR0, 13, get_rate_ipg, NULL, NULL); | ||
221 | DEFINE_CLOCK(ssi2_per_clk, 0, CCM_CGCR0, 14, get_rate_ipg, NULL, NULL); | ||
222 | DEFINE_CLOCK(cspi1_clk, 0, CCM_CGCR1, 5, get_rate_ipg, NULL, NULL); | ||
223 | DEFINE_CLOCK(cspi2_clk, 0, CCM_CGCR1, 6, get_rate_ipg, NULL, NULL); | ||
224 | DEFINE_CLOCK(cspi3_clk, 0, CCM_CGCR1, 7, get_rate_ipg, NULL, NULL); | ||
225 | DEFINE_CLOCK(esdhc1_ahb_clk, 0, CCM_CGCR0, 21, get_rate_esdhc1, NULL, NULL); | ||
226 | DEFINE_CLOCK(esdhc1_per_clk, 0, CCM_CGCR0, 3, get_rate_esdhc1, NULL, | ||
227 | &esdhc1_ahb_clk); | ||
228 | DEFINE_CLOCK(esdhc2_ahb_clk, 0, CCM_CGCR0, 22, get_rate_esdhc2, NULL, NULL); | ||
229 | DEFINE_CLOCK(esdhc2_per_clk, 0, CCM_CGCR0, 4, get_rate_esdhc2, NULL, | ||
230 | &esdhc2_ahb_clk); | ||
231 | DEFINE_CLOCK(sdma_ahb_clk, 0, CCM_CGCR0, 26, NULL, NULL, NULL); | ||
232 | DEFINE_CLOCK(fec_ahb_clk, 0, CCM_CGCR0, 23, NULL, NULL, NULL); | ||
233 | DEFINE_CLOCK(lcdc_ahb_clk, 0, CCM_CGCR0, 24, NULL, NULL, NULL); | ||
234 | DEFINE_CLOCK(lcdc_per_clk, 0, CCM_CGCR0, 7, NULL, NULL, &lcdc_ahb_clk); | ||
235 | DEFINE_CLOCK(csi_ahb_clk, 0, CCM_CGCR0, 18, get_rate_csi, NULL, NULL); | ||
236 | DEFINE_CLOCK(csi_per_clk, 0, CCM_CGCR0, 0, get_rate_csi, NULL, &csi_ahb_clk); | ||
237 | DEFINE_CLOCK(uart1_clk, 0, CCM_CGCR2, 14, get_rate_uart, NULL, &uart_per_clk); | ||
238 | DEFINE_CLOCK(uart2_clk, 0, CCM_CGCR2, 15, get_rate_uart, NULL, &uart_per_clk); | ||
239 | DEFINE_CLOCK(uart3_clk, 0, CCM_CGCR2, 16, get_rate_uart, NULL, &uart_per_clk); | ||
240 | DEFINE_CLOCK(uart4_clk, 0, CCM_CGCR2, 17, get_rate_uart, NULL, &uart_per_clk); | ||
241 | DEFINE_CLOCK(uart5_clk, 0, CCM_CGCR2, 18, get_rate_uart, NULL, &uart_per_clk); | ||
242 | DEFINE_CLOCK(nfc_clk, 0, CCM_CGCR0, 8, get_rate_nfc, NULL, NULL); | ||
243 | DEFINE_CLOCK(usbotg_clk, 0, CCM_CGCR0, 28, get_rate_otg, NULL, NULL); | ||
244 | DEFINE_CLOCK(pwm1_clk, 0, CCM_CGCR1, 31, get_rate_ipg, NULL, NULL); | ||
245 | DEFINE_CLOCK(pwm2_clk, 0, CCM_CGCR2, 0, get_rate_ipg, NULL, NULL); | ||
246 | DEFINE_CLOCK(pwm3_clk, 0, CCM_CGCR2, 1, get_rate_ipg, NULL, NULL); | ||
247 | DEFINE_CLOCK(pwm4_clk, 0, CCM_CGCR2, 2, get_rate_ipg, NULL, NULL); | ||
248 | DEFINE_CLOCK(kpp_clk, 0, CCM_CGCR1, 28, get_rate_ipg, NULL, NULL); | ||
249 | DEFINE_CLOCK(tsc_clk, 0, CCM_CGCR2, 13, get_rate_ipg, NULL, NULL); | ||
250 | DEFINE_CLOCK(i2c_clk, 0, CCM_CGCR0, 6, get_rate_i2c, NULL, NULL); | ||
251 | DEFINE_CLOCK(fec_clk, 0, CCM_CGCR1, 15, get_rate_ipg, NULL, &fec_ahb_clk); | ||
252 | DEFINE_CLOCK(dryice_clk, 0, CCM_CGCR1, 8, get_rate_ipg, NULL, NULL); | ||
253 | DEFINE_CLOCK(lcdc_clk, 0, CCM_CGCR1, 29, get_rate_lcdc, NULL, &lcdc_per_clk); | ||
254 | DEFINE_CLOCK(wdt_clk, 0, CCM_CGCR2, 19, get_rate_ipg, NULL, NULL); | ||
255 | DEFINE_CLOCK(ssi1_clk, 0, CCM_CGCR2, 11, get_rate_ssi1, NULL, &ssi1_per_clk); | ||
256 | DEFINE_CLOCK(ssi2_clk, 1, CCM_CGCR2, 12, get_rate_ssi2, NULL, &ssi2_per_clk); | ||
257 | DEFINE_CLOCK(sdma_clk, 0, CCM_CGCR2, 6, get_rate_ipg, NULL, &sdma_ahb_clk); | ||
258 | DEFINE_CLOCK(esdhc1_clk, 0, CCM_CGCR1, 13, get_rate_esdhc1, NULL, | ||
259 | &esdhc1_per_clk); | ||
260 | DEFINE_CLOCK(esdhc2_clk, 1, CCM_CGCR1, 14, get_rate_esdhc2, NULL, | ||
261 | &esdhc2_per_clk); | ||
262 | DEFINE_CLOCK(audmux_clk, 0, CCM_CGCR1, 0, NULL, NULL, NULL); | ||
263 | DEFINE_CLOCK(csi_clk, 0, CCM_CGCR1, 4, get_rate_csi, NULL, &csi_per_clk); | ||
264 | DEFINE_CLOCK(can1_clk, 0, CCM_CGCR1, 2, get_rate_ipg, NULL, NULL); | ||
265 | DEFINE_CLOCK(can2_clk, 1, CCM_CGCR1, 3, get_rate_ipg, NULL, NULL); | ||
266 | DEFINE_CLOCK(iim_clk, 0, CCM_CGCR1, 26, NULL, NULL, NULL); | ||
267 | |||
268 | #define _REGISTER_CLOCK(d, n, c) \ | ||
269 | { \ | ||
270 | .dev_id = d, \ | ||
271 | .con_id = n, \ | ||
272 | .clk = &c, \ | ||
273 | }, | ||
274 | |||
275 | static struct clk_lookup lookups[] = { | ||
276 | /* i.mx25 has the i.mx21 type uart */ | ||
277 | _REGISTER_CLOCK("imx21-uart.0", NULL, uart1_clk) | ||
278 | _REGISTER_CLOCK("imx21-uart.1", NULL, uart2_clk) | ||
279 | _REGISTER_CLOCK("imx21-uart.2", NULL, uart3_clk) | ||
280 | _REGISTER_CLOCK("imx21-uart.3", NULL, uart4_clk) | ||
281 | _REGISTER_CLOCK("imx21-uart.4", NULL, uart5_clk) | ||
282 | _REGISTER_CLOCK("mxc-ehci.0", "usb", usbotg_clk) | ||
283 | _REGISTER_CLOCK("mxc-ehci.1", "usb", usbotg_clk) | ||
284 | _REGISTER_CLOCK("mxc-ehci.2", "usb", usbotg_clk) | ||
285 | _REGISTER_CLOCK("fsl-usb2-udc", "usb", usbotg_clk) | ||
286 | _REGISTER_CLOCK("mxc_nand.0", NULL, nfc_clk) | ||
287 | /* i.mx25 has the i.mx35 type cspi */ | ||
288 | _REGISTER_CLOCK("imx35-cspi.0", NULL, cspi1_clk) | ||
289 | _REGISTER_CLOCK("imx35-cspi.1", NULL, cspi2_clk) | ||
290 | _REGISTER_CLOCK("imx35-cspi.2", NULL, cspi3_clk) | ||
291 | _REGISTER_CLOCK("mxc_pwm.0", NULL, pwm1_clk) | ||
292 | _REGISTER_CLOCK("mxc_pwm.1", NULL, pwm2_clk) | ||
293 | _REGISTER_CLOCK("mxc_pwm.2", NULL, pwm3_clk) | ||
294 | _REGISTER_CLOCK("mxc_pwm.3", NULL, pwm4_clk) | ||
295 | _REGISTER_CLOCK("imx-keypad", NULL, kpp_clk) | ||
296 | _REGISTER_CLOCK("mx25-adc", NULL, tsc_clk) | ||
297 | _REGISTER_CLOCK("imx-i2c.0", NULL, i2c_clk) | ||
298 | _REGISTER_CLOCK("imx-i2c.1", NULL, i2c_clk) | ||
299 | _REGISTER_CLOCK("imx-i2c.2", NULL, i2c_clk) | ||
300 | _REGISTER_CLOCK("imx25-fec.0", NULL, fec_clk) | ||
301 | _REGISTER_CLOCK("imxdi_rtc.0", NULL, dryice_clk) | ||
302 | _REGISTER_CLOCK("imx-fb.0", NULL, lcdc_clk) | ||
303 | _REGISTER_CLOCK("imx2-wdt.0", NULL, wdt_clk) | ||
304 | _REGISTER_CLOCK("imx-ssi.0", NULL, ssi1_clk) | ||
305 | _REGISTER_CLOCK("imx-ssi.1", NULL, ssi2_clk) | ||
306 | _REGISTER_CLOCK("sdhci-esdhc-imx25.0", NULL, esdhc1_clk) | ||
307 | _REGISTER_CLOCK("sdhci-esdhc-imx25.1", NULL, esdhc2_clk) | ||
308 | _REGISTER_CLOCK("mx2-camera.0", NULL, csi_clk) | ||
309 | _REGISTER_CLOCK(NULL, "audmux", audmux_clk) | ||
310 | _REGISTER_CLOCK("flexcan.0", NULL, can1_clk) | ||
311 | _REGISTER_CLOCK("flexcan.1", NULL, can2_clk) | ||
312 | /* i.mx25 has the i.mx35 type sdma */ | ||
313 | _REGISTER_CLOCK("imx35-sdma", NULL, sdma_clk) | ||
314 | _REGISTER_CLOCK(NULL, "iim", iim_clk) | ||
315 | }; | ||
316 | |||
317 | int __init mx25_clocks_init(void) | ||
318 | { | ||
319 | clkdev_add_table(lookups, ARRAY_SIZE(lookups)); | ||
320 | |||
321 | /* Turn off all clocks except the ones we need to survive, namely: | ||
322 | * EMI, GPIO1-3 (CCM_CGCR1[18:16]), GPT1, IOMUXC (CCM_CGCR1[27]), IIM, | ||
323 | * SCC | ||
324 | */ | ||
325 | __raw_writel((1 << 19), CRM_BASE + CCM_CGCR0); | ||
326 | __raw_writel((0xf << 16) | (3 << 26), CRM_BASE + CCM_CGCR1); | ||
327 | __raw_writel((1 << 5), CRM_BASE + CCM_CGCR2); | ||
328 | #if defined(CONFIG_DEBUG_LL) && !defined(CONFIG_DEBUG_ICEDCC) | ||
329 | clk_enable(&uart1_clk); | ||
330 | #endif | ||
331 | |||
332 | /* Clock source for lcdc and csi is upll */ | ||
333 | __raw_writel(__raw_readl(CRM_BASE+0x64) | (1 << 7) | (1 << 0), | ||
334 | CRM_BASE + 0x64); | ||
335 | |||
336 | /* Clock source for gpt is ahb_div */ | ||
337 | __raw_writel(__raw_readl(CRM_BASE+0x64) & ~(1 << 5), CRM_BASE + 0x64); | ||
338 | |||
339 | clk_enable(&iim_clk); | ||
340 | imx_print_silicon_rev("i.MX25", mx25_revision()); | ||
341 | clk_disable(&iim_clk); | ||
342 | |||
343 | mxc_timer_init(&gpt_clk, MX25_IO_ADDRESS(MX25_GPT1_BASE_ADDR), 54); | ||
344 | |||
345 | return 0; | ||
346 | } | ||
diff --git a/arch/arm/mach-imx/clock-imx27.c b/arch/arm/mach-imx/clock-imx27.c deleted file mode 100644 index 98e04f5a87dd..000000000000 --- a/arch/arm/mach-imx/clock-imx27.c +++ /dev/null | |||
@@ -1,785 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright 2004-2007 Freescale Semiconductor, Inc. All Rights Reserved. | ||
3 | * Copyright 2008 Juergen Beisert, kernel@pengutronix.de | ||
4 | * Copyright 2008 Martin Fuzzey, mfuzzey@gmail.com | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version 2 | ||
9 | * of the License, or (at your option) any later version. | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program; if not, write to the Free Software | ||
17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, | ||
18 | * MA 02110-1301, USA. | ||
19 | */ | ||
20 | |||
21 | #include <linux/clk.h> | ||
22 | #include <linux/io.h> | ||
23 | #include <linux/module.h> | ||
24 | #include <linux/clkdev.h> | ||
25 | #include <linux/of.h> | ||
26 | |||
27 | #include <asm/div64.h> | ||
28 | |||
29 | #include <mach/clock.h> | ||
30 | #include <mach/common.h> | ||
31 | #include <mach/hardware.h> | ||
32 | |||
33 | #define IO_ADDR_CCM(off) (MX27_IO_ADDRESS(MX27_CCM_BASE_ADDR + (off))) | ||
34 | |||
35 | /* Register offsets */ | ||
36 | #define CCM_CSCR IO_ADDR_CCM(0x0) | ||
37 | #define CCM_MPCTL0 IO_ADDR_CCM(0x4) | ||
38 | #define CCM_MPCTL1 IO_ADDR_CCM(0x8) | ||
39 | #define CCM_SPCTL0 IO_ADDR_CCM(0xc) | ||
40 | #define CCM_SPCTL1 IO_ADDR_CCM(0x10) | ||
41 | #define CCM_OSC26MCTL IO_ADDR_CCM(0x14) | ||
42 | #define CCM_PCDR0 IO_ADDR_CCM(0x18) | ||
43 | #define CCM_PCDR1 IO_ADDR_CCM(0x1c) | ||
44 | #define CCM_PCCR0 IO_ADDR_CCM(0x20) | ||
45 | #define CCM_PCCR1 IO_ADDR_CCM(0x24) | ||
46 | #define CCM_CCSR IO_ADDR_CCM(0x28) | ||
47 | #define CCM_PMCTL IO_ADDR_CCM(0x2c) | ||
48 | #define CCM_PMCOUNT IO_ADDR_CCM(0x30) | ||
49 | #define CCM_WKGDCTL IO_ADDR_CCM(0x34) | ||
50 | |||
51 | #define CCM_CSCR_UPDATE_DIS (1 << 31) | ||
52 | #define CCM_CSCR_SSI2 (1 << 23) | ||
53 | #define CCM_CSCR_SSI1 (1 << 22) | ||
54 | #define CCM_CSCR_VPU (1 << 21) | ||
55 | #define CCM_CSCR_MSHC (1 << 20) | ||
56 | #define CCM_CSCR_SPLLRES (1 << 19) | ||
57 | #define CCM_CSCR_MPLLRES (1 << 18) | ||
58 | #define CCM_CSCR_SP (1 << 17) | ||
59 | #define CCM_CSCR_MCU (1 << 16) | ||
60 | #define CCM_CSCR_OSC26MDIV (1 << 4) | ||
61 | #define CCM_CSCR_OSC26M (1 << 3) | ||
62 | #define CCM_CSCR_FPM (1 << 2) | ||
63 | #define CCM_CSCR_SPEN (1 << 1) | ||
64 | #define CCM_CSCR_MPEN (1 << 0) | ||
65 | |||
66 | /* i.MX27 TO 2+ */ | ||
67 | #define CCM_CSCR_ARM_SRC (1 << 15) | ||
68 | |||
69 | #define CCM_SPCTL1_LF (1 << 15) | ||
70 | #define CCM_SPCTL1_BRMO (1 << 6) | ||
71 | |||
72 | static struct clk mpll_main1_clk, mpll_main2_clk; | ||
73 | |||
74 | static int clk_pccr_enable(struct clk *clk) | ||
75 | { | ||
76 | unsigned long reg; | ||
77 | |||
78 | if (!clk->enable_reg) | ||
79 | return 0; | ||
80 | |||
81 | reg = __raw_readl(clk->enable_reg); | ||
82 | reg |= 1 << clk->enable_shift; | ||
83 | __raw_writel(reg, clk->enable_reg); | ||
84 | |||
85 | return 0; | ||
86 | } | ||
87 | |||
88 | static void clk_pccr_disable(struct clk *clk) | ||
89 | { | ||
90 | unsigned long reg; | ||
91 | |||
92 | if (!clk->enable_reg) | ||
93 | return; | ||
94 | |||
95 | reg = __raw_readl(clk->enable_reg); | ||
96 | reg &= ~(1 << clk->enable_shift); | ||
97 | __raw_writel(reg, clk->enable_reg); | ||
98 | } | ||
99 | |||
100 | static int clk_spll_enable(struct clk *clk) | ||
101 | { | ||
102 | unsigned long reg; | ||
103 | |||
104 | reg = __raw_readl(CCM_CSCR); | ||
105 | reg |= CCM_CSCR_SPEN; | ||
106 | __raw_writel(reg, CCM_CSCR); | ||
107 | |||
108 | while (!(__raw_readl(CCM_SPCTL1) & CCM_SPCTL1_LF)); | ||
109 | |||
110 | return 0; | ||
111 | } | ||
112 | |||
113 | static void clk_spll_disable(struct clk *clk) | ||
114 | { | ||
115 | unsigned long reg; | ||
116 | |||
117 | reg = __raw_readl(CCM_CSCR); | ||
118 | reg &= ~CCM_CSCR_SPEN; | ||
119 | __raw_writel(reg, CCM_CSCR); | ||
120 | } | ||
121 | |||
122 | static int clk_cpu_set_parent(struct clk *clk, struct clk *parent) | ||
123 | { | ||
124 | int cscr = __raw_readl(CCM_CSCR); | ||
125 | |||
126 | if (clk->parent == parent) | ||
127 | return 0; | ||
128 | |||
129 | if (mx27_revision() >= IMX_CHIP_REVISION_2_0) { | ||
130 | if (parent == &mpll_main1_clk) { | ||
131 | cscr |= CCM_CSCR_ARM_SRC; | ||
132 | } else { | ||
133 | if (parent == &mpll_main2_clk) | ||
134 | cscr &= ~CCM_CSCR_ARM_SRC; | ||
135 | else | ||
136 | return -EINVAL; | ||
137 | } | ||
138 | __raw_writel(cscr, CCM_CSCR); | ||
139 | clk->parent = parent; | ||
140 | return 0; | ||
141 | } | ||
142 | return -ENODEV; | ||
143 | } | ||
144 | |||
145 | static unsigned long round_rate_cpu(struct clk *clk, unsigned long rate) | ||
146 | { | ||
147 | int div; | ||
148 | unsigned long parent_rate; | ||
149 | |||
150 | parent_rate = clk_get_rate(clk->parent); | ||
151 | |||
152 | div = parent_rate / rate; | ||
153 | if (parent_rate % rate) | ||
154 | div++; | ||
155 | |||
156 | if (div > 4) | ||
157 | div = 4; | ||
158 | |||
159 | return parent_rate / div; | ||
160 | } | ||
161 | |||
162 | static int set_rate_cpu(struct clk *clk, unsigned long rate) | ||
163 | { | ||
164 | unsigned int div; | ||
165 | uint32_t reg; | ||
166 | unsigned long parent_rate; | ||
167 | |||
168 | parent_rate = clk_get_rate(clk->parent); | ||
169 | |||
170 | div = parent_rate / rate; | ||
171 | |||
172 | if (div > 4 || div < 1 || ((parent_rate / div) != rate)) | ||
173 | return -EINVAL; | ||
174 | |||
175 | div--; | ||
176 | |||
177 | reg = __raw_readl(CCM_CSCR); | ||
178 | if (mx27_revision() >= IMX_CHIP_REVISION_2_0) { | ||
179 | reg &= ~(3 << 12); | ||
180 | reg |= div << 12; | ||
181 | reg &= ~(CCM_CSCR_FPM | CCM_CSCR_SPEN); | ||
182 | __raw_writel(reg | CCM_CSCR_UPDATE_DIS, CCM_CSCR); | ||
183 | } else { | ||
184 | printk(KERN_ERR "Can't set CPU frequency!\n"); | ||
185 | } | ||
186 | |||
187 | return 0; | ||
188 | } | ||
189 | |||
190 | static unsigned long round_rate_per(struct clk *clk, unsigned long rate) | ||
191 | { | ||
192 | u32 div; | ||
193 | unsigned long parent_rate; | ||
194 | |||
195 | parent_rate = clk_get_rate(clk->parent); | ||
196 | |||
197 | div = parent_rate / rate; | ||
198 | if (parent_rate % rate) | ||
199 | div++; | ||
200 | |||
201 | if (div > 64) | ||
202 | div = 64; | ||
203 | |||
204 | return parent_rate / div; | ||
205 | } | ||
206 | |||
207 | static int set_rate_per(struct clk *clk, unsigned long rate) | ||
208 | { | ||
209 | u32 reg; | ||
210 | u32 div; | ||
211 | unsigned long parent_rate; | ||
212 | |||
213 | parent_rate = clk_get_rate(clk->parent); | ||
214 | |||
215 | if (clk->id < 0 || clk->id > 3) | ||
216 | return -EINVAL; | ||
217 | |||
218 | div = parent_rate / rate; | ||
219 | if (div > 64 || div < 1 || ((parent_rate / div) != rate)) | ||
220 | return -EINVAL; | ||
221 | div--; | ||
222 | |||
223 | reg = __raw_readl(CCM_PCDR1) & ~(0x3f << (clk->id << 3)); | ||
224 | reg |= div << (clk->id << 3); | ||
225 | __raw_writel(reg, CCM_PCDR1); | ||
226 | |||
227 | return 0; | ||
228 | } | ||
229 | |||
230 | static unsigned long get_rate_usb(struct clk *clk) | ||
231 | { | ||
232 | unsigned long usb_pdf; | ||
233 | unsigned long parent_rate; | ||
234 | |||
235 | parent_rate = clk_get_rate(clk->parent); | ||
236 | |||
237 | usb_pdf = (__raw_readl(CCM_CSCR) >> 28) & 0x7; | ||
238 | |||
239 | return parent_rate / (usb_pdf + 1U); | ||
240 | } | ||
241 | |||
242 | static unsigned long get_rate_ssix(struct clk *clk, unsigned long pdf) | ||
243 | { | ||
244 | unsigned long parent_rate; | ||
245 | |||
246 | parent_rate = clk_get_rate(clk->parent); | ||
247 | |||
248 | if (mx27_revision() >= IMX_CHIP_REVISION_2_0) | ||
249 | pdf += 4; /* MX27 TO2+ */ | ||
250 | else | ||
251 | pdf = (pdf < 2) ? 124UL : pdf; /* MX21 & MX27 TO1 */ | ||
252 | |||
253 | return 2UL * parent_rate / pdf; | ||
254 | } | ||
255 | |||
256 | static unsigned long get_rate_ssi1(struct clk *clk) | ||
257 | { | ||
258 | return get_rate_ssix(clk, (__raw_readl(CCM_PCDR0) >> 16) & 0x3f); | ||
259 | } | ||
260 | |||
261 | static unsigned long get_rate_ssi2(struct clk *clk) | ||
262 | { | ||
263 | return get_rate_ssix(clk, (__raw_readl(CCM_PCDR0) >> 26) & 0x3f); | ||
264 | } | ||
265 | |||
266 | static unsigned long get_rate_nfc(struct clk *clk) | ||
267 | { | ||
268 | unsigned long nfc_pdf; | ||
269 | unsigned long parent_rate; | ||
270 | |||
271 | parent_rate = clk_get_rate(clk->parent); | ||
272 | |||
273 | if (mx27_revision() >= IMX_CHIP_REVISION_2_0) | ||
274 | nfc_pdf = (__raw_readl(CCM_PCDR0) >> 6) & 0xf; | ||
275 | else | ||
276 | nfc_pdf = (__raw_readl(CCM_PCDR0) >> 12) & 0xf; | ||
277 | |||
278 | return parent_rate / (nfc_pdf + 1); | ||
279 | } | ||
280 | |||
281 | static unsigned long get_rate_vpu(struct clk *clk) | ||
282 | { | ||
283 | unsigned long vpu_pdf; | ||
284 | unsigned long parent_rate; | ||
285 | |||
286 | parent_rate = clk_get_rate(clk->parent); | ||
287 | |||
288 | if (mx27_revision() >= IMX_CHIP_REVISION_2_0) { | ||
289 | vpu_pdf = (__raw_readl(CCM_PCDR0) >> 10) & 0x3f; | ||
290 | vpu_pdf += 4; | ||
291 | } else { | ||
292 | vpu_pdf = (__raw_readl(CCM_PCDR0) >> 8) & 0xf; | ||
293 | vpu_pdf = (vpu_pdf < 2) ? 124 : vpu_pdf; | ||
294 | } | ||
295 | |||
296 | return 2UL * parent_rate / vpu_pdf; | ||
297 | } | ||
298 | |||
299 | static unsigned long round_rate_parent(struct clk *clk, unsigned long rate) | ||
300 | { | ||
301 | return clk->parent->round_rate(clk->parent, rate); | ||
302 | } | ||
303 | |||
304 | static unsigned long get_rate_parent(struct clk *clk) | ||
305 | { | ||
306 | return clk_get_rate(clk->parent); | ||
307 | } | ||
308 | |||
309 | static int set_rate_parent(struct clk *clk, unsigned long rate) | ||
310 | { | ||
311 | return clk->parent->set_rate(clk->parent, rate); | ||
312 | } | ||
313 | |||
314 | /* in Hz */ | ||
315 | static unsigned long external_high_reference = 26000000; | ||
316 | |||
317 | static unsigned long get_rate_high_reference(struct clk *clk) | ||
318 | { | ||
319 | return external_high_reference; | ||
320 | } | ||
321 | |||
322 | /* in Hz */ | ||
323 | static unsigned long external_low_reference = 32768; | ||
324 | |||
325 | static unsigned long get_rate_low_reference(struct clk *clk) | ||
326 | { | ||
327 | return external_low_reference; | ||
328 | } | ||
329 | |||
330 | static unsigned long get_rate_fpm(struct clk *clk) | ||
331 | { | ||
332 | return clk_get_rate(clk->parent) * 1024; | ||
333 | } | ||
334 | |||
335 | static unsigned long get_rate_mpll(struct clk *clk) | ||
336 | { | ||
337 | return mxc_decode_pll(__raw_readl(CCM_MPCTL0), | ||
338 | clk_get_rate(clk->parent)); | ||
339 | } | ||
340 | |||
341 | static unsigned long get_rate_mpll_main(struct clk *clk) | ||
342 | { | ||
343 | unsigned long parent_rate; | ||
344 | |||
345 | parent_rate = clk_get_rate(clk->parent); | ||
346 | |||
347 | /* i.MX27 TO2: | ||
348 | * clk->id == 0: arm clock source path 1 which is from 2 * MPLL / 2 | ||
349 | * clk->id == 1: arm clock source path 2 which is from 2 * MPLL / 3 | ||
350 | */ | ||
351 | if (mx27_revision() >= IMX_CHIP_REVISION_2_0 && clk->id == 1) | ||
352 | return 2UL * parent_rate / 3UL; | ||
353 | |||
354 | return parent_rate; | ||
355 | } | ||
356 | |||
357 | static unsigned long get_rate_spll(struct clk *clk) | ||
358 | { | ||
359 | uint32_t reg; | ||
360 | unsigned long rate; | ||
361 | |||
362 | rate = clk_get_rate(clk->parent); | ||
363 | |||
364 | reg = __raw_readl(CCM_SPCTL0); | ||
365 | |||
366 | /* On TO2 we have to write the value back. Otherwise we | ||
367 | * read 0 from this register the next time. | ||
368 | */ | ||
369 | if (mx27_revision() >= IMX_CHIP_REVISION_2_0) | ||
370 | __raw_writel(reg, CCM_SPCTL0); | ||
371 | |||
372 | return mxc_decode_pll(reg, rate); | ||
373 | } | ||
374 | |||
375 | static unsigned long get_rate_cpu(struct clk *clk) | ||
376 | { | ||
377 | u32 div; | ||
378 | unsigned long rate; | ||
379 | |||
380 | if (mx27_revision() >= IMX_CHIP_REVISION_2_0) | ||
381 | div = (__raw_readl(CCM_CSCR) >> 12) & 0x3; | ||
382 | else | ||
383 | div = (__raw_readl(CCM_CSCR) >> 13) & 0x7; | ||
384 | |||
385 | rate = clk_get_rate(clk->parent); | ||
386 | return rate / (div + 1); | ||
387 | } | ||
388 | |||
389 | static unsigned long get_rate_ahb(struct clk *clk) | ||
390 | { | ||
391 | unsigned long rate, bclk_pdf; | ||
392 | |||
393 | if (mx27_revision() >= IMX_CHIP_REVISION_2_0) | ||
394 | bclk_pdf = (__raw_readl(CCM_CSCR) >> 8) & 0x3; | ||
395 | else | ||
396 | bclk_pdf = (__raw_readl(CCM_CSCR) >> 9) & 0xf; | ||
397 | |||
398 | rate = clk_get_rate(clk->parent); | ||
399 | return rate / (bclk_pdf + 1); | ||
400 | } | ||
401 | |||
402 | static unsigned long get_rate_ipg(struct clk *clk) | ||
403 | { | ||
404 | unsigned long rate, ipg_pdf; | ||
405 | |||
406 | if (mx27_revision() >= IMX_CHIP_REVISION_2_0) | ||
407 | return clk_get_rate(clk->parent); | ||
408 | else | ||
409 | ipg_pdf = (__raw_readl(CCM_CSCR) >> 8) & 1; | ||
410 | |||
411 | rate = clk_get_rate(clk->parent); | ||
412 | return rate / (ipg_pdf + 1); | ||
413 | } | ||
414 | |||
415 | static unsigned long get_rate_per(struct clk *clk) | ||
416 | { | ||
417 | unsigned long perclk_pdf, parent_rate; | ||
418 | |||
419 | parent_rate = clk_get_rate(clk->parent); | ||
420 | |||
421 | if (clk->id < 0 || clk->id > 3) | ||
422 | return 0; | ||
423 | |||
424 | perclk_pdf = (__raw_readl(CCM_PCDR1) >> (clk->id << 3)) & 0x3f; | ||
425 | |||
426 | return parent_rate / (perclk_pdf + 1); | ||
427 | } | ||
428 | |||
429 | /* | ||
430 | * the high frequency external clock reference | ||
431 | * Default case is 26MHz. Could be changed at runtime | ||
432 | * with a call to change_external_high_reference() | ||
433 | */ | ||
434 | static struct clk ckih_clk = { | ||
435 | .get_rate = get_rate_high_reference, | ||
436 | }; | ||
437 | |||
438 | static struct clk mpll_clk = { | ||
439 | .parent = &ckih_clk, | ||
440 | .get_rate = get_rate_mpll, | ||
441 | }; | ||
442 | |||
443 | /* For i.MX27 TO2, it is the MPLL path 1 of ARM core | ||
444 | * It provides the clock source whose rate is same as MPLL | ||
445 | */ | ||
446 | static struct clk mpll_main1_clk = { | ||
447 | .id = 0, | ||
448 | .parent = &mpll_clk, | ||
449 | .get_rate = get_rate_mpll_main, | ||
450 | }; | ||
451 | |||
452 | /* For i.MX27 TO2, it is the MPLL path 2 of ARM core | ||
453 | * It provides the clock source whose rate is same MPLL * 2 / 3 | ||
454 | */ | ||
455 | static struct clk mpll_main2_clk = { | ||
456 | .id = 1, | ||
457 | .parent = &mpll_clk, | ||
458 | .get_rate = get_rate_mpll_main, | ||
459 | }; | ||
460 | |||
461 | static struct clk ahb_clk = { | ||
462 | .parent = &mpll_main2_clk, | ||
463 | .get_rate = get_rate_ahb, | ||
464 | }; | ||
465 | |||
466 | static struct clk ipg_clk = { | ||
467 | .parent = &ahb_clk, | ||
468 | .get_rate = get_rate_ipg, | ||
469 | }; | ||
470 | |||
471 | static struct clk cpu_clk = { | ||
472 | .parent = &mpll_main2_clk, | ||
473 | .set_parent = clk_cpu_set_parent, | ||
474 | .round_rate = round_rate_cpu, | ||
475 | .get_rate = get_rate_cpu, | ||
476 | .set_rate = set_rate_cpu, | ||
477 | }; | ||
478 | |||
479 | static struct clk spll_clk = { | ||
480 | .parent = &ckih_clk, | ||
481 | .get_rate = get_rate_spll, | ||
482 | .enable = clk_spll_enable, | ||
483 | .disable = clk_spll_disable, | ||
484 | }; | ||
485 | |||
486 | /* | ||
487 | * the low frequency external clock reference | ||
488 | * Default case is 32.768kHz. | ||
489 | */ | ||
490 | static struct clk ckil_clk = { | ||
491 | .get_rate = get_rate_low_reference, | ||
492 | }; | ||
493 | |||
494 | /* Output of frequency pre multiplier */ | ||
495 | static struct clk fpm_clk = { | ||
496 | .parent = &ckil_clk, | ||
497 | .get_rate = get_rate_fpm, | ||
498 | }; | ||
499 | |||
500 | #define PCCR0 CCM_PCCR0 | ||
501 | #define PCCR1 CCM_PCCR1 | ||
502 | |||
503 | #define DEFINE_CLOCK(name, i, er, es, gr, s, p) \ | ||
504 | static struct clk name = { \ | ||
505 | .id = i, \ | ||
506 | .enable_reg = er, \ | ||
507 | .enable_shift = es, \ | ||
508 | .get_rate = gr, \ | ||
509 | .enable = clk_pccr_enable, \ | ||
510 | .disable = clk_pccr_disable, \ | ||
511 | .secondary = s, \ | ||
512 | .parent = p, \ | ||
513 | } | ||
514 | |||
515 | #define DEFINE_CLOCK1(name, i, er, es, getsetround, s, p) \ | ||
516 | static struct clk name = { \ | ||
517 | .id = i, \ | ||
518 | .enable_reg = er, \ | ||
519 | .enable_shift = es, \ | ||
520 | .get_rate = get_rate_##getsetround, \ | ||
521 | .set_rate = set_rate_##getsetround, \ | ||
522 | .round_rate = round_rate_##getsetround, \ | ||
523 | .enable = clk_pccr_enable, \ | ||
524 | .disable = clk_pccr_disable, \ | ||
525 | .secondary = s, \ | ||
526 | .parent = p, \ | ||
527 | } | ||
528 | |||
529 | /* Forward declaration to keep the following list in order */ | ||
530 | static struct clk slcdc_clk1, sahara2_clk1, rtic_clk1, fec_clk1, emma_clk1, | ||
531 | dma_clk1, lcdc_clk2, vpu_clk1; | ||
532 | |||
533 | /* All clocks we can gate through PCCRx in the order of PCCRx bits */ | ||
534 | DEFINE_CLOCK(ssi2_clk1, 1, PCCR0, 0, NULL, NULL, &ipg_clk); | ||
535 | DEFINE_CLOCK(ssi1_clk1, 0, PCCR0, 1, NULL, NULL, &ipg_clk); | ||
536 | DEFINE_CLOCK(slcdc_clk, 0, PCCR0, 2, NULL, &slcdc_clk1, &ahb_clk); | ||
537 | DEFINE_CLOCK(sdhc3_clk1, 0, PCCR0, 3, NULL, NULL, &ipg_clk); | ||
538 | DEFINE_CLOCK(sdhc2_clk1, 0, PCCR0, 4, NULL, NULL, &ipg_clk); | ||
539 | DEFINE_CLOCK(sdhc1_clk1, 0, PCCR0, 5, NULL, NULL, &ipg_clk); | ||
540 | DEFINE_CLOCK(scc_clk, 0, PCCR0, 6, NULL, NULL, &ipg_clk); | ||
541 | DEFINE_CLOCK(sahara2_clk, 0, PCCR0, 7, NULL, &sahara2_clk1, &ahb_clk); | ||
542 | DEFINE_CLOCK(rtic_clk, 0, PCCR0, 8, NULL, &rtic_clk1, &ahb_clk); | ||
543 | DEFINE_CLOCK(rtc_clk, 0, PCCR0, 9, NULL, NULL, &ipg_clk); | ||
544 | DEFINE_CLOCK(pwm_clk1, 0, PCCR0, 11, NULL, NULL, &ipg_clk); | ||
545 | DEFINE_CLOCK(owire_clk, 0, PCCR0, 12, NULL, NULL, &ipg_clk); | ||
546 | DEFINE_CLOCK(mstick_clk1, 0, PCCR0, 13, NULL, NULL, &ipg_clk); | ||
547 | DEFINE_CLOCK(lcdc_clk1, 0, PCCR0, 14, NULL, &lcdc_clk2, &ipg_clk); | ||
548 | DEFINE_CLOCK(kpp_clk, 0, PCCR0, 15, NULL, NULL, &ipg_clk); | ||
549 | DEFINE_CLOCK(iim_clk, 0, PCCR0, 16, NULL, NULL, &ipg_clk); | ||
550 | DEFINE_CLOCK(i2c2_clk, 1, PCCR0, 17, NULL, NULL, &ipg_clk); | ||
551 | DEFINE_CLOCK(i2c1_clk, 0, PCCR0, 18, NULL, NULL, &ipg_clk); | ||
552 | DEFINE_CLOCK(gpt6_clk1, 0, PCCR0, 29, NULL, NULL, &ipg_clk); | ||
553 | DEFINE_CLOCK(gpt5_clk1, 0, PCCR0, 20, NULL, NULL, &ipg_clk); | ||
554 | DEFINE_CLOCK(gpt4_clk1, 0, PCCR0, 21, NULL, NULL, &ipg_clk); | ||
555 | DEFINE_CLOCK(gpt3_clk1, 0, PCCR0, 22, NULL, NULL, &ipg_clk); | ||
556 | DEFINE_CLOCK(gpt2_clk1, 0, PCCR0, 23, NULL, NULL, &ipg_clk); | ||
557 | DEFINE_CLOCK(gpt1_clk1, 0, PCCR0, 24, NULL, NULL, &ipg_clk); | ||
558 | DEFINE_CLOCK(gpio_clk, 0, PCCR0, 25, NULL, NULL, &ipg_clk); | ||
559 | DEFINE_CLOCK(fec_clk, 0, PCCR0, 26, NULL, &fec_clk1, &ahb_clk); | ||
560 | DEFINE_CLOCK(emma_clk, 0, PCCR0, 27, NULL, &emma_clk1, &ahb_clk); | ||
561 | DEFINE_CLOCK(dma_clk, 0, PCCR0, 28, NULL, &dma_clk1, &ahb_clk); | ||
562 | DEFINE_CLOCK(cspi13_clk1, 0, PCCR0, 29, NULL, NULL, &ipg_clk); | ||
563 | DEFINE_CLOCK(cspi2_clk1, 0, PCCR0, 30, NULL, NULL, &ipg_clk); | ||
564 | DEFINE_CLOCK(cspi1_clk1, 0, PCCR0, 31, NULL, NULL, &ipg_clk); | ||
565 | |||
566 | DEFINE_CLOCK(mstick_clk, 0, PCCR1, 2, NULL, &mstick_clk1, &ipg_clk); | ||
567 | DEFINE_CLOCK(nfc_clk, 0, PCCR1, 3, get_rate_nfc, NULL, &cpu_clk); | ||
568 | DEFINE_CLOCK(ssi2_clk, 1, PCCR1, 4, get_rate_ssi2, &ssi2_clk1, &mpll_main2_clk); | ||
569 | DEFINE_CLOCK(ssi1_clk, 0, PCCR1, 5, get_rate_ssi1, &ssi1_clk1, &mpll_main2_clk); | ||
570 | DEFINE_CLOCK(vpu_clk, 0, PCCR1, 6, get_rate_vpu, &vpu_clk1, &mpll_main2_clk); | ||
571 | DEFINE_CLOCK1(per4_clk, 3, PCCR1, 7, per, NULL, &mpll_main2_clk); | ||
572 | DEFINE_CLOCK1(per3_clk, 2, PCCR1, 8, per, NULL, &mpll_main2_clk); | ||
573 | DEFINE_CLOCK1(per2_clk, 1, PCCR1, 9, per, NULL, &mpll_main2_clk); | ||
574 | DEFINE_CLOCK1(per1_clk, 0, PCCR1, 10, per, NULL, &mpll_main2_clk); | ||
575 | DEFINE_CLOCK(usb_clk1, 0, PCCR1, 11, NULL, NULL, &ahb_clk); | ||
576 | DEFINE_CLOCK(slcdc_clk1, 0, PCCR1, 12, NULL, NULL, &ahb_clk); | ||
577 | DEFINE_CLOCK(sahara2_clk1, 0, PCCR1, 13, NULL, NULL, &ahb_clk); | ||
578 | DEFINE_CLOCK(rtic_clk1, 0, PCCR1, 14, NULL, NULL, &ahb_clk); | ||
579 | DEFINE_CLOCK(lcdc_clk2, 0, PCCR1, 15, NULL, NULL, &ahb_clk); | ||
580 | DEFINE_CLOCK(vpu_clk1, 0, PCCR1, 16, NULL, NULL, &ahb_clk); | ||
581 | DEFINE_CLOCK(fec_clk1, 0, PCCR1, 17, NULL, NULL, &ahb_clk); | ||
582 | DEFINE_CLOCK(emma_clk1, 0, PCCR1, 18, NULL, NULL, &ahb_clk); | ||
583 | DEFINE_CLOCK(emi_clk, 0, PCCR1, 19, NULL, NULL, &ahb_clk); | ||
584 | DEFINE_CLOCK(dma_clk1, 0, PCCR1, 20, NULL, NULL, &ahb_clk); | ||
585 | DEFINE_CLOCK(csi_clk1, 0, PCCR1, 21, NULL, NULL, &ahb_clk); | ||
586 | DEFINE_CLOCK(brom_clk, 0, PCCR1, 22, NULL, NULL, &ahb_clk); | ||
587 | DEFINE_CLOCK(pata_clk, 0, PCCR1, 23, NULL, NULL, &ahb_clk); | ||
588 | DEFINE_CLOCK(wdog_clk, 0, PCCR1, 24, NULL, NULL, &ipg_clk); | ||
589 | DEFINE_CLOCK(usb_clk, 0, PCCR1, 25, get_rate_usb, &usb_clk1, &spll_clk); | ||
590 | DEFINE_CLOCK(uart6_clk1, 0, PCCR1, 26, NULL, NULL, &ipg_clk); | ||
591 | DEFINE_CLOCK(uart5_clk1, 0, PCCR1, 27, NULL, NULL, &ipg_clk); | ||
592 | DEFINE_CLOCK(uart4_clk1, 0, PCCR1, 28, NULL, NULL, &ipg_clk); | ||
593 | DEFINE_CLOCK(uart3_clk1, 0, PCCR1, 29, NULL, NULL, &ipg_clk); | ||
594 | DEFINE_CLOCK(uart2_clk1, 0, PCCR1, 30, NULL, NULL, &ipg_clk); | ||
595 | DEFINE_CLOCK(uart1_clk1, 0, PCCR1, 31, NULL, NULL, &ipg_clk); | ||
596 | |||
597 | /* Clocks we cannot directly gate, but drivers need their rates */ | ||
598 | DEFINE_CLOCK(cspi1_clk, 0, NULL, 0, NULL, &cspi1_clk1, &per2_clk); | ||
599 | DEFINE_CLOCK(cspi2_clk, 1, NULL, 0, NULL, &cspi2_clk1, &per2_clk); | ||
600 | DEFINE_CLOCK(cspi3_clk, 2, NULL, 0, NULL, &cspi13_clk1, &per2_clk); | ||
601 | DEFINE_CLOCK(sdhc1_clk, 0, NULL, 0, NULL, &sdhc1_clk1, &per2_clk); | ||
602 | DEFINE_CLOCK(sdhc2_clk, 1, NULL, 0, NULL, &sdhc2_clk1, &per2_clk); | ||
603 | DEFINE_CLOCK(sdhc3_clk, 2, NULL, 0, NULL, &sdhc3_clk1, &per2_clk); | ||
604 | DEFINE_CLOCK(pwm_clk, 0, NULL, 0, NULL, &pwm_clk1, &per1_clk); | ||
605 | DEFINE_CLOCK(gpt1_clk, 0, NULL, 0, NULL, &gpt1_clk1, &per1_clk); | ||
606 | DEFINE_CLOCK(gpt2_clk, 1, NULL, 0, NULL, &gpt2_clk1, &per1_clk); | ||
607 | DEFINE_CLOCK(gpt3_clk, 2, NULL, 0, NULL, &gpt3_clk1, &per1_clk); | ||
608 | DEFINE_CLOCK(gpt4_clk, 3, NULL, 0, NULL, &gpt4_clk1, &per1_clk); | ||
609 | DEFINE_CLOCK(gpt5_clk, 4, NULL, 0, NULL, &gpt5_clk1, &per1_clk); | ||
610 | DEFINE_CLOCK(gpt6_clk, 5, NULL, 0, NULL, &gpt6_clk1, &per1_clk); | ||
611 | DEFINE_CLOCK(uart1_clk, 0, NULL, 0, NULL, &uart1_clk1, &per1_clk); | ||
612 | DEFINE_CLOCK(uart2_clk, 1, NULL, 0, NULL, &uart2_clk1, &per1_clk); | ||
613 | DEFINE_CLOCK(uart3_clk, 2, NULL, 0, NULL, &uart3_clk1, &per1_clk); | ||
614 | DEFINE_CLOCK(uart4_clk, 3, NULL, 0, NULL, &uart4_clk1, &per1_clk); | ||
615 | DEFINE_CLOCK(uart5_clk, 4, NULL, 0, NULL, &uart5_clk1, &per1_clk); | ||
616 | DEFINE_CLOCK(uart6_clk, 5, NULL, 0, NULL, &uart6_clk1, &per1_clk); | ||
617 | DEFINE_CLOCK1(lcdc_clk, 0, NULL, 0, parent, &lcdc_clk1, &per3_clk); | ||
618 | DEFINE_CLOCK1(csi_clk, 0, NULL, 0, parent, &csi_clk1, &per4_clk); | ||
619 | |||
620 | #define _REGISTER_CLOCK(d, n, c) \ | ||
621 | { \ | ||
622 | .dev_id = d, \ | ||
623 | .con_id = n, \ | ||
624 | .clk = &c, \ | ||
625 | }, | ||
626 | |||
627 | static struct clk_lookup lookups[] = { | ||
628 | /* i.mx27 has the i.mx21 type uart */ | ||
629 | _REGISTER_CLOCK("imx21-uart.0", NULL, uart1_clk) | ||
630 | _REGISTER_CLOCK("imx21-uart.1", NULL, uart2_clk) | ||
631 | _REGISTER_CLOCK("imx21-uart.2", NULL, uart3_clk) | ||
632 | _REGISTER_CLOCK("imx21-uart.3", NULL, uart4_clk) | ||
633 | _REGISTER_CLOCK("imx21-uart.4", NULL, uart5_clk) | ||
634 | _REGISTER_CLOCK("imx21-uart.5", NULL, uart6_clk) | ||
635 | _REGISTER_CLOCK(NULL, "gpt1", gpt1_clk) | ||
636 | _REGISTER_CLOCK(NULL, "gpt2", gpt2_clk) | ||
637 | _REGISTER_CLOCK(NULL, "gpt3", gpt3_clk) | ||
638 | _REGISTER_CLOCK(NULL, "gpt4", gpt4_clk) | ||
639 | _REGISTER_CLOCK(NULL, "gpt5", gpt5_clk) | ||
640 | _REGISTER_CLOCK(NULL, "gpt6", gpt6_clk) | ||
641 | _REGISTER_CLOCK("mxc_pwm.0", NULL, pwm_clk) | ||
642 | _REGISTER_CLOCK("mxc-mmc.0", NULL, sdhc1_clk) | ||
643 | _REGISTER_CLOCK("mxc-mmc.1", NULL, sdhc2_clk) | ||
644 | _REGISTER_CLOCK("mxc-mmc.2", NULL, sdhc3_clk) | ||
645 | _REGISTER_CLOCK("imx27-cspi.0", NULL, cspi1_clk) | ||
646 | _REGISTER_CLOCK("imx27-cspi.1", NULL, cspi2_clk) | ||
647 | _REGISTER_CLOCK("imx27-cspi.2", NULL, cspi3_clk) | ||
648 | _REGISTER_CLOCK("imx-fb.0", NULL, lcdc_clk) | ||
649 | _REGISTER_CLOCK("mx2-camera.0", NULL, csi_clk) | ||
650 | _REGISTER_CLOCK("fsl-usb2-udc", "usb", usb_clk) | ||
651 | _REGISTER_CLOCK("fsl-usb2-udc", "usb_ahb", usb_clk1) | ||
652 | _REGISTER_CLOCK("mxc-ehci.0", "usb", usb_clk) | ||
653 | _REGISTER_CLOCK("mxc-ehci.0", "usb_ahb", usb_clk1) | ||
654 | _REGISTER_CLOCK("mxc-ehci.1", "usb", usb_clk) | ||
655 | _REGISTER_CLOCK("mxc-ehci.1", "usb_ahb", usb_clk1) | ||
656 | _REGISTER_CLOCK("mxc-ehci.2", "usb", usb_clk) | ||
657 | _REGISTER_CLOCK("mxc-ehci.2", "usb_ahb", usb_clk1) | ||
658 | _REGISTER_CLOCK("imx-ssi.0", NULL, ssi1_clk) | ||
659 | _REGISTER_CLOCK("imx-ssi.1", NULL, ssi2_clk) | ||
660 | _REGISTER_CLOCK("mxc_nand.0", NULL, nfc_clk) | ||
661 | _REGISTER_CLOCK(NULL, "vpu", vpu_clk) | ||
662 | _REGISTER_CLOCK(NULL, "dma", dma_clk) | ||
663 | _REGISTER_CLOCK(NULL, "rtic", rtic_clk) | ||
664 | _REGISTER_CLOCK(NULL, "brom", brom_clk) | ||
665 | _REGISTER_CLOCK(NULL, "emma", emma_clk) | ||
666 | _REGISTER_CLOCK("m2m-emmaprp.0", NULL, emma_clk) | ||
667 | _REGISTER_CLOCK(NULL, "slcdc", slcdc_clk) | ||
668 | _REGISTER_CLOCK("imx27-fec.0", NULL, fec_clk) | ||
669 | _REGISTER_CLOCK(NULL, "emi", emi_clk) | ||
670 | _REGISTER_CLOCK(NULL, "sahara2", sahara2_clk) | ||
671 | _REGISTER_CLOCK("pata_imx", NULL, pata_clk) | ||
672 | _REGISTER_CLOCK(NULL, "mstick", mstick_clk) | ||
673 | _REGISTER_CLOCK("imx2-wdt.0", NULL, wdog_clk) | ||
674 | _REGISTER_CLOCK(NULL, "gpio", gpio_clk) | ||
675 | _REGISTER_CLOCK("imx-i2c.0", NULL, i2c1_clk) | ||
676 | _REGISTER_CLOCK("imx-i2c.1", NULL, i2c2_clk) | ||
677 | _REGISTER_CLOCK(NULL, "iim", iim_clk) | ||
678 | _REGISTER_CLOCK(NULL, "kpp", kpp_clk) | ||
679 | _REGISTER_CLOCK("mxc_w1.0", NULL, owire_clk) | ||
680 | _REGISTER_CLOCK(NULL, "rtc", rtc_clk) | ||
681 | _REGISTER_CLOCK(NULL, "scc", scc_clk) | ||
682 | }; | ||
683 | |||
684 | /* Adjust the clock path for TO2 and later */ | ||
685 | static void __init to2_adjust_clocks(void) | ||
686 | { | ||
687 | unsigned long cscr = __raw_readl(CCM_CSCR); | ||
688 | |||
689 | if (mx27_revision() >= IMX_CHIP_REVISION_2_0) { | ||
690 | if (cscr & CCM_CSCR_ARM_SRC) | ||
691 | cpu_clk.parent = &mpll_main1_clk; | ||
692 | |||
693 | if (!(cscr & CCM_CSCR_SSI2)) | ||
694 | ssi1_clk.parent = &spll_clk; | ||
695 | |||
696 | if (!(cscr & CCM_CSCR_SSI1)) | ||
697 | ssi1_clk.parent = &spll_clk; | ||
698 | |||
699 | if (!(cscr & CCM_CSCR_VPU)) | ||
700 | vpu_clk.parent = &spll_clk; | ||
701 | } else { | ||
702 | cpu_clk.parent = &mpll_clk; | ||
703 | cpu_clk.set_parent = NULL; | ||
704 | cpu_clk.round_rate = NULL; | ||
705 | cpu_clk.set_rate = NULL; | ||
706 | ahb_clk.parent = &mpll_clk; | ||
707 | |||
708 | per1_clk.parent = &mpll_clk; | ||
709 | per2_clk.parent = &mpll_clk; | ||
710 | per3_clk.parent = &mpll_clk; | ||
711 | per4_clk.parent = &mpll_clk; | ||
712 | |||
713 | ssi1_clk.parent = &mpll_clk; | ||
714 | ssi2_clk.parent = &mpll_clk; | ||
715 | |||
716 | vpu_clk.parent = &mpll_clk; | ||
717 | } | ||
718 | } | ||
719 | |||
720 | /* | ||
721 | * must be called very early to get information about the | ||
722 | * available clock rate when the timer framework starts | ||
723 | */ | ||
724 | int __init mx27_clocks_init(unsigned long fref) | ||
725 | { | ||
726 | u32 cscr = __raw_readl(CCM_CSCR); | ||
727 | |||
728 | external_high_reference = fref; | ||
729 | |||
730 | /* detect clock reference for both system PLLs */ | ||
731 | if (cscr & CCM_CSCR_MCU) | ||
732 | mpll_clk.parent = &ckih_clk; | ||
733 | else | ||
734 | mpll_clk.parent = &fpm_clk; | ||
735 | |||
736 | if (cscr & CCM_CSCR_SP) | ||
737 | spll_clk.parent = &ckih_clk; | ||
738 | else | ||
739 | spll_clk.parent = &fpm_clk; | ||
740 | |||
741 | to2_adjust_clocks(); | ||
742 | |||
743 | clkdev_add_table(lookups, ARRAY_SIZE(lookups)); | ||
744 | |||
745 | /* Turn off all clocks we do not need */ | ||
746 | __raw_writel(0, CCM_PCCR0); | ||
747 | __raw_writel((1 << 10) | (1 << 19), CCM_PCCR1); | ||
748 | |||
749 | spll_clk.disable(&spll_clk); | ||
750 | |||
751 | /* enable basic clocks */ | ||
752 | clk_enable(&per1_clk); | ||
753 | clk_enable(&gpio_clk); | ||
754 | clk_enable(&emi_clk); | ||
755 | clk_enable(&iim_clk); | ||
756 | imx_print_silicon_rev("i.MX27", mx27_revision()); | ||
757 | clk_disable(&iim_clk); | ||
758 | |||
759 | #if defined(CONFIG_DEBUG_LL) && !defined(CONFIG_DEBUG_ICEDCC) | ||
760 | clk_enable(&uart1_clk); | ||
761 | #endif | ||
762 | |||
763 | mxc_timer_init(&gpt1_clk, MX27_IO_ADDRESS(MX27_GPT1_BASE_ADDR), | ||
764 | MX27_INT_GPT1); | ||
765 | |||
766 | return 0; | ||
767 | } | ||
768 | |||
769 | #ifdef CONFIG_OF | ||
770 | int __init mx27_clocks_init_dt(void) | ||
771 | { | ||
772 | struct device_node *np; | ||
773 | u32 fref = 26000000; /* default */ | ||
774 | |||
775 | for_each_compatible_node(np, NULL, "fixed-clock") { | ||
776 | if (!of_device_is_compatible(np, "fsl,imx-osc26m")) | ||
777 | continue; | ||
778 | |||
779 | if (!of_property_read_u32(np, "clock-frequency", &fref)) | ||
780 | break; | ||
781 | } | ||
782 | |||
783 | return mx27_clocks_init(fref); | ||
784 | } | ||
785 | #endif | ||
diff --git a/arch/arm/mach-imx/clock-imx31.c b/arch/arm/mach-imx/clock-imx31.c deleted file mode 100644 index 3a943cd4159f..000000000000 --- a/arch/arm/mach-imx/clock-imx31.c +++ /dev/null | |||
@@ -1,630 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright 2005-2007 Freescale Semiconductor, Inc. All Rights Reserved. | ||
3 | * Copyright (C) 2008 by Sascha Hauer <kernel@pengutronix.de> | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or | ||
6 | * modify it under the terms of the GNU General Public License | ||
7 | * as published by the Free Software Foundation; either version 2 | ||
8 | * of the License, or (at your option) any later version. | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program; if not, write to the Free Software | ||
16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, | ||
17 | * MA 02110-1301, USA. | ||
18 | */ | ||
19 | |||
20 | #include <linux/module.h> | ||
21 | #include <linux/spinlock.h> | ||
22 | #include <linux/delay.h> | ||
23 | #include <linux/clk.h> | ||
24 | #include <linux/err.h> | ||
25 | #include <linux/io.h> | ||
26 | #include <linux/clkdev.h> | ||
27 | |||
28 | #include <asm/div64.h> | ||
29 | |||
30 | #include <mach/clock.h> | ||
31 | #include <mach/hardware.h> | ||
32 | #include <mach/mx31.h> | ||
33 | #include <mach/common.h> | ||
34 | |||
35 | #include "crmregs-imx3.h" | ||
36 | |||
37 | #define PRE_DIV_MIN_FREQ 10000000 /* Minimum Frequency after Predivider */ | ||
38 | |||
39 | static void __calc_pre_post_dividers(u32 div, u32 *pre, u32 *post) | ||
40 | { | ||
41 | u32 min_pre, temp_pre, old_err, err; | ||
42 | |||
43 | if (div >= 512) { | ||
44 | *pre = 8; | ||
45 | *post = 64; | ||
46 | } else if (div >= 64) { | ||
47 | min_pre = (div - 1) / 64 + 1; | ||
48 | old_err = 8; | ||
49 | for (temp_pre = 8; temp_pre >= min_pre; temp_pre--) { | ||
50 | err = div % temp_pre; | ||
51 | if (err == 0) { | ||
52 | *pre = temp_pre; | ||
53 | break; | ||
54 | } | ||
55 | err = temp_pre - err; | ||
56 | if (err < old_err) { | ||
57 | old_err = err; | ||
58 | *pre = temp_pre; | ||
59 | } | ||
60 | } | ||
61 | *post = (div + *pre - 1) / *pre; | ||
62 | } else if (div <= 8) { | ||
63 | *pre = div; | ||
64 | *post = 1; | ||
65 | } else { | ||
66 | *pre = 1; | ||
67 | *post = div; | ||
68 | } | ||
69 | } | ||
70 | |||
71 | static struct clk mcu_pll_clk; | ||
72 | static struct clk serial_pll_clk; | ||
73 | static struct clk ipg_clk; | ||
74 | static struct clk ckih_clk; | ||
75 | |||
76 | static int cgr_enable(struct clk *clk) | ||
77 | { | ||
78 | u32 reg; | ||
79 | |||
80 | if (!clk->enable_reg) | ||
81 | return 0; | ||
82 | |||
83 | reg = __raw_readl(clk->enable_reg); | ||
84 | reg |= 3 << clk->enable_shift; | ||
85 | __raw_writel(reg, clk->enable_reg); | ||
86 | |||
87 | return 0; | ||
88 | } | ||
89 | |||
90 | static void cgr_disable(struct clk *clk) | ||
91 | { | ||
92 | u32 reg; | ||
93 | |||
94 | if (!clk->enable_reg) | ||
95 | return; | ||
96 | |||
97 | reg = __raw_readl(clk->enable_reg); | ||
98 | reg &= ~(3 << clk->enable_shift); | ||
99 | |||
100 | /* special case for EMI clock */ | ||
101 | if (clk->enable_reg == MXC_CCM_CGR2 && clk->enable_shift == 8) | ||
102 | reg |= (1 << clk->enable_shift); | ||
103 | |||
104 | __raw_writel(reg, clk->enable_reg); | ||
105 | } | ||
106 | |||
107 | static unsigned long pll_ref_get_rate(void) | ||
108 | { | ||
109 | unsigned long ccmr; | ||
110 | unsigned int prcs; | ||
111 | |||
112 | ccmr = __raw_readl(MXC_CCM_CCMR); | ||
113 | prcs = (ccmr & MXC_CCM_CCMR_PRCS_MASK) >> MXC_CCM_CCMR_PRCS_OFFSET; | ||
114 | if (prcs == 0x1) | ||
115 | return CKIL_CLK_FREQ * 1024; | ||
116 | else | ||
117 | return clk_get_rate(&ckih_clk); | ||
118 | } | ||
119 | |||
120 | static unsigned long usb_pll_get_rate(struct clk *clk) | ||
121 | { | ||
122 | unsigned long reg; | ||
123 | |||
124 | reg = __raw_readl(MXC_CCM_UPCTL); | ||
125 | |||
126 | return mxc_decode_pll(reg, pll_ref_get_rate()); | ||
127 | } | ||
128 | |||
129 | static unsigned long serial_pll_get_rate(struct clk *clk) | ||
130 | { | ||
131 | unsigned long reg; | ||
132 | |||
133 | reg = __raw_readl(MXC_CCM_SRPCTL); | ||
134 | |||
135 | return mxc_decode_pll(reg, pll_ref_get_rate()); | ||
136 | } | ||
137 | |||
138 | static unsigned long mcu_pll_get_rate(struct clk *clk) | ||
139 | { | ||
140 | unsigned long reg, ccmr; | ||
141 | |||
142 | ccmr = __raw_readl(MXC_CCM_CCMR); | ||
143 | |||
144 | if (!(ccmr & MXC_CCM_CCMR_MPE) || (ccmr & MXC_CCM_CCMR_MDS)) | ||
145 | return clk_get_rate(&ckih_clk); | ||
146 | |||
147 | reg = __raw_readl(MXC_CCM_MPCTL); | ||
148 | |||
149 | return mxc_decode_pll(reg, pll_ref_get_rate()); | ||
150 | } | ||
151 | |||
152 | static int usb_pll_enable(struct clk *clk) | ||
153 | { | ||
154 | u32 reg; | ||
155 | |||
156 | reg = __raw_readl(MXC_CCM_CCMR); | ||
157 | reg |= MXC_CCM_CCMR_UPE; | ||
158 | __raw_writel(reg, MXC_CCM_CCMR); | ||
159 | |||
160 | /* No lock bit on MX31, so using max time from spec */ | ||
161 | udelay(80); | ||
162 | |||
163 | return 0; | ||
164 | } | ||
165 | |||
166 | static void usb_pll_disable(struct clk *clk) | ||
167 | { | ||
168 | u32 reg; | ||
169 | |||
170 | reg = __raw_readl(MXC_CCM_CCMR); | ||
171 | reg &= ~MXC_CCM_CCMR_UPE; | ||
172 | __raw_writel(reg, MXC_CCM_CCMR); | ||
173 | } | ||
174 | |||
175 | static int serial_pll_enable(struct clk *clk) | ||
176 | { | ||
177 | u32 reg; | ||
178 | |||
179 | reg = __raw_readl(MXC_CCM_CCMR); | ||
180 | reg |= MXC_CCM_CCMR_SPE; | ||
181 | __raw_writel(reg, MXC_CCM_CCMR); | ||
182 | |||
183 | /* No lock bit on MX31, so using max time from spec */ | ||
184 | udelay(80); | ||
185 | |||
186 | return 0; | ||
187 | } | ||
188 | |||
189 | static void serial_pll_disable(struct clk *clk) | ||
190 | { | ||
191 | u32 reg; | ||
192 | |||
193 | reg = __raw_readl(MXC_CCM_CCMR); | ||
194 | reg &= ~MXC_CCM_CCMR_SPE; | ||
195 | __raw_writel(reg, MXC_CCM_CCMR); | ||
196 | } | ||
197 | |||
198 | #define PDR0(mask, off) ((__raw_readl(MXC_CCM_PDR0) & mask) >> off) | ||
199 | #define PDR1(mask, off) ((__raw_readl(MXC_CCM_PDR1) & mask) >> off) | ||
200 | #define PDR2(mask, off) ((__raw_readl(MXC_CCM_PDR2) & mask) >> off) | ||
201 | |||
202 | static unsigned long mcu_main_get_rate(struct clk *clk) | ||
203 | { | ||
204 | u32 pmcr0 = __raw_readl(MXC_CCM_PMCR0); | ||
205 | |||
206 | if ((pmcr0 & MXC_CCM_PMCR0_DFSUP1) == MXC_CCM_PMCR0_DFSUP1_SPLL) | ||
207 | return clk_get_rate(&serial_pll_clk); | ||
208 | else | ||
209 | return clk_get_rate(&mcu_pll_clk); | ||
210 | } | ||
211 | |||
212 | static unsigned long ahb_get_rate(struct clk *clk) | ||
213 | { | ||
214 | unsigned long max_pdf; | ||
215 | |||
216 | max_pdf = PDR0(MXC_CCM_PDR0_MAX_PODF_MASK, | ||
217 | MXC_CCM_PDR0_MAX_PODF_OFFSET); | ||
218 | return clk_get_rate(clk->parent) / (max_pdf + 1); | ||
219 | } | ||
220 | |||
221 | static unsigned long ipg_get_rate(struct clk *clk) | ||
222 | { | ||
223 | unsigned long ipg_pdf; | ||
224 | |||
225 | ipg_pdf = PDR0(MXC_CCM_PDR0_IPG_PODF_MASK, | ||
226 | MXC_CCM_PDR0_IPG_PODF_OFFSET); | ||
227 | return clk_get_rate(clk->parent) / (ipg_pdf + 1); | ||
228 | } | ||
229 | |||
230 | static unsigned long nfc_get_rate(struct clk *clk) | ||
231 | { | ||
232 | unsigned long nfc_pdf; | ||
233 | |||
234 | nfc_pdf = PDR0(MXC_CCM_PDR0_NFC_PODF_MASK, | ||
235 | MXC_CCM_PDR0_NFC_PODF_OFFSET); | ||
236 | return clk_get_rate(clk->parent) / (nfc_pdf + 1); | ||
237 | } | ||
238 | |||
239 | static unsigned long hsp_get_rate(struct clk *clk) | ||
240 | { | ||
241 | unsigned long hsp_pdf; | ||
242 | |||
243 | hsp_pdf = PDR0(MXC_CCM_PDR0_HSP_PODF_MASK, | ||
244 | MXC_CCM_PDR0_HSP_PODF_OFFSET); | ||
245 | return clk_get_rate(clk->parent) / (hsp_pdf + 1); | ||
246 | } | ||
247 | |||
248 | static unsigned long usb_get_rate(struct clk *clk) | ||
249 | { | ||
250 | unsigned long usb_pdf, usb_prepdf; | ||
251 | |||
252 | usb_pdf = PDR1(MXC_CCM_PDR1_USB_PODF_MASK, | ||
253 | MXC_CCM_PDR1_USB_PODF_OFFSET); | ||
254 | usb_prepdf = PDR1(MXC_CCM_PDR1_USB_PRDF_MASK, | ||
255 | MXC_CCM_PDR1_USB_PRDF_OFFSET); | ||
256 | return clk_get_rate(clk->parent) / (usb_prepdf + 1) / (usb_pdf + 1); | ||
257 | } | ||
258 | |||
259 | static unsigned long csi_get_rate(struct clk *clk) | ||
260 | { | ||
261 | u32 reg, pre, post; | ||
262 | |||
263 | reg = __raw_readl(MXC_CCM_PDR0); | ||
264 | pre = (reg & MXC_CCM_PDR0_CSI_PRDF_MASK) >> | ||
265 | MXC_CCM_PDR0_CSI_PRDF_OFFSET; | ||
266 | pre++; | ||
267 | post = (reg & MXC_CCM_PDR0_CSI_PODF_MASK) >> | ||
268 | MXC_CCM_PDR0_CSI_PODF_OFFSET; | ||
269 | post++; | ||
270 | return clk_get_rate(clk->parent) / (pre * post); | ||
271 | } | ||
272 | |||
273 | static unsigned long csi_round_rate(struct clk *clk, unsigned long rate) | ||
274 | { | ||
275 | u32 pre, post, parent = clk_get_rate(clk->parent); | ||
276 | u32 div = parent / rate; | ||
277 | |||
278 | if (parent % rate) | ||
279 | div++; | ||
280 | |||
281 | __calc_pre_post_dividers(div, &pre, &post); | ||
282 | |||
283 | return parent / (pre * post); | ||
284 | } | ||
285 | |||
286 | static int csi_set_rate(struct clk *clk, unsigned long rate) | ||
287 | { | ||
288 | u32 reg, div, pre, post, parent = clk_get_rate(clk->parent); | ||
289 | |||
290 | div = parent / rate; | ||
291 | |||
292 | if ((parent / div) != rate) | ||
293 | return -EINVAL; | ||
294 | |||
295 | __calc_pre_post_dividers(div, &pre, &post); | ||
296 | |||
297 | /* Set CSI clock divider */ | ||
298 | reg = __raw_readl(MXC_CCM_PDR0) & | ||
299 | ~(MXC_CCM_PDR0_CSI_PODF_MASK | MXC_CCM_PDR0_CSI_PRDF_MASK); | ||
300 | reg |= (post - 1) << MXC_CCM_PDR0_CSI_PODF_OFFSET; | ||
301 | reg |= (pre - 1) << MXC_CCM_PDR0_CSI_PRDF_OFFSET; | ||
302 | __raw_writel(reg, MXC_CCM_PDR0); | ||
303 | |||
304 | return 0; | ||
305 | } | ||
306 | |||
307 | static unsigned long ssi1_get_rate(struct clk *clk) | ||
308 | { | ||
309 | unsigned long ssi1_pdf, ssi1_prepdf; | ||
310 | |||
311 | ssi1_pdf = PDR1(MXC_CCM_PDR1_SSI1_PODF_MASK, | ||
312 | MXC_CCM_PDR1_SSI1_PODF_OFFSET); | ||
313 | ssi1_prepdf = PDR1(MXC_CCM_PDR1_SSI1_PRE_PODF_MASK, | ||
314 | MXC_CCM_PDR1_SSI1_PRE_PODF_OFFSET); | ||
315 | return clk_get_rate(clk->parent) / (ssi1_prepdf + 1) / (ssi1_pdf + 1); | ||
316 | } | ||
317 | |||
318 | static unsigned long ssi2_get_rate(struct clk *clk) | ||
319 | { | ||
320 | unsigned long ssi2_pdf, ssi2_prepdf; | ||
321 | |||
322 | ssi2_pdf = PDR1(MXC_CCM_PDR1_SSI2_PODF_MASK, | ||
323 | MXC_CCM_PDR1_SSI2_PODF_OFFSET); | ||
324 | ssi2_prepdf = PDR1(MXC_CCM_PDR1_SSI2_PRE_PODF_MASK, | ||
325 | MXC_CCM_PDR1_SSI2_PRE_PODF_OFFSET); | ||
326 | return clk_get_rate(clk->parent) / (ssi2_prepdf + 1) / (ssi2_pdf + 1); | ||
327 | } | ||
328 | |||
329 | static unsigned long firi_get_rate(struct clk *clk) | ||
330 | { | ||
331 | unsigned long firi_pdf, firi_prepdf; | ||
332 | |||
333 | firi_pdf = PDR1(MXC_CCM_PDR1_FIRI_PODF_MASK, | ||
334 | MXC_CCM_PDR1_FIRI_PODF_OFFSET); | ||
335 | firi_prepdf = PDR1(MXC_CCM_PDR1_FIRI_PRE_PODF_MASK, | ||
336 | MXC_CCM_PDR1_FIRI_PRE_PODF_OFFSET); | ||
337 | return clk_get_rate(clk->parent) / (firi_prepdf + 1) / (firi_pdf + 1); | ||
338 | } | ||
339 | |||
340 | static unsigned long firi_round_rate(struct clk *clk, unsigned long rate) | ||
341 | { | ||
342 | u32 pre, post; | ||
343 | u32 parent = clk_get_rate(clk->parent); | ||
344 | u32 div = parent / rate; | ||
345 | |||
346 | if (parent % rate) | ||
347 | div++; | ||
348 | |||
349 | __calc_pre_post_dividers(div, &pre, &post); | ||
350 | |||
351 | return parent / (pre * post); | ||
352 | |||
353 | } | ||
354 | |||
355 | static int firi_set_rate(struct clk *clk, unsigned long rate) | ||
356 | { | ||
357 | u32 reg, div, pre, post, parent = clk_get_rate(clk->parent); | ||
358 | |||
359 | div = parent / rate; | ||
360 | |||
361 | if ((parent / div) != rate) | ||
362 | return -EINVAL; | ||
363 | |||
364 | __calc_pre_post_dividers(div, &pre, &post); | ||
365 | |||
366 | /* Set FIRI clock divider */ | ||
367 | reg = __raw_readl(MXC_CCM_PDR1) & | ||
368 | ~(MXC_CCM_PDR1_FIRI_PODF_MASK | MXC_CCM_PDR1_FIRI_PRE_PODF_MASK); | ||
369 | reg |= (pre - 1) << MXC_CCM_PDR1_FIRI_PRE_PODF_OFFSET; | ||
370 | reg |= (post - 1) << MXC_CCM_PDR1_FIRI_PODF_OFFSET; | ||
371 | __raw_writel(reg, MXC_CCM_PDR1); | ||
372 | |||
373 | return 0; | ||
374 | } | ||
375 | |||
376 | static unsigned long mbx_get_rate(struct clk *clk) | ||
377 | { | ||
378 | return clk_get_rate(clk->parent) / 2; | ||
379 | } | ||
380 | |||
381 | static unsigned long mstick1_get_rate(struct clk *clk) | ||
382 | { | ||
383 | unsigned long msti_pdf; | ||
384 | |||
385 | msti_pdf = PDR2(MXC_CCM_PDR2_MST1_PDF_MASK, | ||
386 | MXC_CCM_PDR2_MST1_PDF_OFFSET); | ||
387 | return clk_get_rate(clk->parent) / (msti_pdf + 1); | ||
388 | } | ||
389 | |||
390 | static unsigned long mstick2_get_rate(struct clk *clk) | ||
391 | { | ||
392 | unsigned long msti_pdf; | ||
393 | |||
394 | msti_pdf = PDR2(MXC_CCM_PDR2_MST2_PDF_MASK, | ||
395 | MXC_CCM_PDR2_MST2_PDF_OFFSET); | ||
396 | return clk_get_rate(clk->parent) / (msti_pdf + 1); | ||
397 | } | ||
398 | |||
399 | static unsigned long ckih_rate; | ||
400 | |||
401 | static unsigned long clk_ckih_get_rate(struct clk *clk) | ||
402 | { | ||
403 | return ckih_rate; | ||
404 | } | ||
405 | |||
406 | static unsigned long clk_ckil_get_rate(struct clk *clk) | ||
407 | { | ||
408 | return CKIL_CLK_FREQ; | ||
409 | } | ||
410 | |||
411 | static struct clk ckih_clk = { | ||
412 | .get_rate = clk_ckih_get_rate, | ||
413 | }; | ||
414 | |||
415 | static struct clk mcu_pll_clk = { | ||
416 | .parent = &ckih_clk, | ||
417 | .get_rate = mcu_pll_get_rate, | ||
418 | }; | ||
419 | |||
420 | static struct clk mcu_main_clk = { | ||
421 | .parent = &mcu_pll_clk, | ||
422 | .get_rate = mcu_main_get_rate, | ||
423 | }; | ||
424 | |||
425 | static struct clk serial_pll_clk = { | ||
426 | .parent = &ckih_clk, | ||
427 | .get_rate = serial_pll_get_rate, | ||
428 | .enable = serial_pll_enable, | ||
429 | .disable = serial_pll_disable, | ||
430 | }; | ||
431 | |||
432 | static struct clk usb_pll_clk = { | ||
433 | .parent = &ckih_clk, | ||
434 | .get_rate = usb_pll_get_rate, | ||
435 | .enable = usb_pll_enable, | ||
436 | .disable = usb_pll_disable, | ||
437 | }; | ||
438 | |||
439 | static struct clk ahb_clk = { | ||
440 | .parent = &mcu_main_clk, | ||
441 | .get_rate = ahb_get_rate, | ||
442 | }; | ||
443 | |||
444 | #define DEFINE_CLOCK(name, i, er, es, gr, s, p) \ | ||
445 | static struct clk name = { \ | ||
446 | .id = i, \ | ||
447 | .enable_reg = er, \ | ||
448 | .enable_shift = es, \ | ||
449 | .get_rate = gr, \ | ||
450 | .enable = cgr_enable, \ | ||
451 | .disable = cgr_disable, \ | ||
452 | .secondary = s, \ | ||
453 | .parent = p, \ | ||
454 | } | ||
455 | |||
456 | #define DEFINE_CLOCK1(name, i, er, es, getsetround, s, p) \ | ||
457 | static struct clk name = { \ | ||
458 | .id = i, \ | ||
459 | .enable_reg = er, \ | ||
460 | .enable_shift = es, \ | ||
461 | .get_rate = getsetround##_get_rate, \ | ||
462 | .set_rate = getsetround##_set_rate, \ | ||
463 | .round_rate = getsetround##_round_rate, \ | ||
464 | .enable = cgr_enable, \ | ||
465 | .disable = cgr_disable, \ | ||
466 | .secondary = s, \ | ||
467 | .parent = p, \ | ||
468 | } | ||
469 | |||
470 | DEFINE_CLOCK(perclk_clk, 0, NULL, 0, NULL, NULL, &ipg_clk); | ||
471 | DEFINE_CLOCK(ckil_clk, 0, NULL, 0, clk_ckil_get_rate, NULL, NULL); | ||
472 | |||
473 | DEFINE_CLOCK(sdhc1_clk, 0, MXC_CCM_CGR0, 0, NULL, NULL, &perclk_clk); | ||
474 | DEFINE_CLOCK(sdhc2_clk, 1, MXC_CCM_CGR0, 2, NULL, NULL, &perclk_clk); | ||
475 | DEFINE_CLOCK(gpt_clk, 0, MXC_CCM_CGR0, 4, NULL, NULL, &perclk_clk); | ||
476 | DEFINE_CLOCK(epit1_clk, 0, MXC_CCM_CGR0, 6, NULL, NULL, &perclk_clk); | ||
477 | DEFINE_CLOCK(epit2_clk, 1, MXC_CCM_CGR0, 8, NULL, NULL, &perclk_clk); | ||
478 | DEFINE_CLOCK(iim_clk, 0, MXC_CCM_CGR0, 10, NULL, NULL, &ipg_clk); | ||
479 | DEFINE_CLOCK(pata_clk, 0, MXC_CCM_CGR0, 12, NULL, NULL, &ipg_clk); | ||
480 | DEFINE_CLOCK(sdma_clk1, 0, MXC_CCM_CGR0, 14, NULL, NULL, &ahb_clk); | ||
481 | DEFINE_CLOCK(cspi3_clk, 2, MXC_CCM_CGR0, 16, NULL, NULL, &ipg_clk); | ||
482 | DEFINE_CLOCK(rng_clk, 0, MXC_CCM_CGR0, 18, NULL, NULL, &ipg_clk); | ||
483 | DEFINE_CLOCK(uart1_clk, 0, MXC_CCM_CGR0, 20, NULL, NULL, &perclk_clk); | ||
484 | DEFINE_CLOCK(uart2_clk, 1, MXC_CCM_CGR0, 22, NULL, NULL, &perclk_clk); | ||
485 | DEFINE_CLOCK(ssi1_clk, 0, MXC_CCM_CGR0, 24, ssi1_get_rate, NULL, &serial_pll_clk); | ||
486 | DEFINE_CLOCK(i2c1_clk, 0, MXC_CCM_CGR0, 26, NULL, NULL, &perclk_clk); | ||
487 | DEFINE_CLOCK(i2c2_clk, 1, MXC_CCM_CGR0, 28, NULL, NULL, &perclk_clk); | ||
488 | DEFINE_CLOCK(i2c3_clk, 2, MXC_CCM_CGR0, 30, NULL, NULL, &perclk_clk); | ||
489 | |||
490 | DEFINE_CLOCK(mpeg4_clk, 0, MXC_CCM_CGR1, 0, NULL, NULL, &ahb_clk); | ||
491 | DEFINE_CLOCK(mstick1_clk, 0, MXC_CCM_CGR1, 2, mstick1_get_rate, NULL, &usb_pll_clk); | ||
492 | DEFINE_CLOCK(mstick2_clk, 1, MXC_CCM_CGR1, 4, mstick2_get_rate, NULL, &usb_pll_clk); | ||
493 | DEFINE_CLOCK1(csi_clk, 0, MXC_CCM_CGR1, 6, csi, NULL, &serial_pll_clk); | ||
494 | DEFINE_CLOCK(rtc_clk, 0, MXC_CCM_CGR1, 8, NULL, NULL, &ckil_clk); | ||
495 | DEFINE_CLOCK(wdog_clk, 0, MXC_CCM_CGR1, 10, NULL, NULL, &ipg_clk); | ||
496 | DEFINE_CLOCK(pwm_clk, 0, MXC_CCM_CGR1, 12, NULL, NULL, &perclk_clk); | ||
497 | DEFINE_CLOCK(usb_clk2, 0, MXC_CCM_CGR1, 18, usb_get_rate, NULL, &ahb_clk); | ||
498 | DEFINE_CLOCK(kpp_clk, 0, MXC_CCM_CGR1, 20, NULL, NULL, &ipg_clk); | ||
499 | DEFINE_CLOCK(ipu_clk, 0, MXC_CCM_CGR1, 22, hsp_get_rate, NULL, &mcu_main_clk); | ||
500 | DEFINE_CLOCK(uart3_clk, 2, MXC_CCM_CGR1, 24, NULL, NULL, &perclk_clk); | ||
501 | DEFINE_CLOCK(uart4_clk, 3, MXC_CCM_CGR1, 26, NULL, NULL, &perclk_clk); | ||
502 | DEFINE_CLOCK(uart5_clk, 4, MXC_CCM_CGR1, 28, NULL, NULL, &perclk_clk); | ||
503 | DEFINE_CLOCK(owire_clk, 0, MXC_CCM_CGR1, 30, NULL, NULL, &perclk_clk); | ||
504 | |||
505 | DEFINE_CLOCK(ssi2_clk, 1, MXC_CCM_CGR2, 0, ssi2_get_rate, NULL, &serial_pll_clk); | ||
506 | DEFINE_CLOCK(cspi1_clk, 0, MXC_CCM_CGR2, 2, NULL, NULL, &ipg_clk); | ||
507 | DEFINE_CLOCK(cspi2_clk, 1, MXC_CCM_CGR2, 4, NULL, NULL, &ipg_clk); | ||
508 | DEFINE_CLOCK(mbx_clk, 0, MXC_CCM_CGR2, 6, mbx_get_rate, NULL, &ahb_clk); | ||
509 | DEFINE_CLOCK(emi_clk, 0, MXC_CCM_CGR2, 8, NULL, NULL, &ahb_clk); | ||
510 | DEFINE_CLOCK(rtic_clk, 0, MXC_CCM_CGR2, 10, NULL, NULL, &ahb_clk); | ||
511 | DEFINE_CLOCK1(firi_clk, 0, MXC_CCM_CGR2, 12, firi, NULL, &usb_pll_clk); | ||
512 | |||
513 | DEFINE_CLOCK(sdma_clk2, 0, NULL, 0, NULL, NULL, &ipg_clk); | ||
514 | DEFINE_CLOCK(usb_clk1, 0, NULL, 0, usb_get_rate, NULL, &usb_pll_clk); | ||
515 | DEFINE_CLOCK(nfc_clk, 0, NULL, 0, nfc_get_rate, NULL, &ahb_clk); | ||
516 | DEFINE_CLOCK(scc_clk, 0, NULL, 0, NULL, NULL, &ipg_clk); | ||
517 | DEFINE_CLOCK(ipg_clk, 0, NULL, 0, ipg_get_rate, NULL, &ahb_clk); | ||
518 | |||
519 | #define _REGISTER_CLOCK(d, n, c) \ | ||
520 | { \ | ||
521 | .dev_id = d, \ | ||
522 | .con_id = n, \ | ||
523 | .clk = &c, \ | ||
524 | }, | ||
525 | |||
526 | static struct clk_lookup lookups[] = { | ||
527 | _REGISTER_CLOCK(NULL, "emi", emi_clk) | ||
528 | _REGISTER_CLOCK("imx31-cspi.0", NULL, cspi1_clk) | ||
529 | _REGISTER_CLOCK("imx31-cspi.1", NULL, cspi2_clk) | ||
530 | _REGISTER_CLOCK("imx31-cspi.2", NULL, cspi3_clk) | ||
531 | _REGISTER_CLOCK(NULL, "gpt", gpt_clk) | ||
532 | _REGISTER_CLOCK(NULL, "pwm", pwm_clk) | ||
533 | _REGISTER_CLOCK("imx2-wdt.0", NULL, wdog_clk) | ||
534 | _REGISTER_CLOCK(NULL, "rtc", rtc_clk) | ||
535 | _REGISTER_CLOCK(NULL, "epit", epit1_clk) | ||
536 | _REGISTER_CLOCK(NULL, "epit", epit2_clk) | ||
537 | _REGISTER_CLOCK("mxc_nand.0", NULL, nfc_clk) | ||
538 | _REGISTER_CLOCK("ipu-core", NULL, ipu_clk) | ||
539 | _REGISTER_CLOCK("mx3_sdc_fb", NULL, ipu_clk) | ||
540 | _REGISTER_CLOCK(NULL, "kpp", kpp_clk) | ||
541 | _REGISTER_CLOCK("mxc-ehci.0", "usb", usb_clk1) | ||
542 | _REGISTER_CLOCK("mxc-ehci.0", "usb_ahb", usb_clk2) | ||
543 | _REGISTER_CLOCK("mxc-ehci.1", "usb", usb_clk1) | ||
544 | _REGISTER_CLOCK("mxc-ehci.1", "usb_ahb", usb_clk2) | ||
545 | _REGISTER_CLOCK("mxc-ehci.2", "usb", usb_clk1) | ||
546 | _REGISTER_CLOCK("mxc-ehci.2", "usb_ahb", usb_clk2) | ||
547 | _REGISTER_CLOCK("fsl-usb2-udc", "usb", usb_clk1) | ||
548 | _REGISTER_CLOCK("fsl-usb2-udc", "usb_ahb", usb_clk2) | ||
549 | _REGISTER_CLOCK("mx3-camera.0", NULL, csi_clk) | ||
550 | /* i.mx31 has the i.mx21 type uart */ | ||
551 | _REGISTER_CLOCK("imx21-uart.0", NULL, uart1_clk) | ||
552 | _REGISTER_CLOCK("imx21-uart.1", NULL, uart2_clk) | ||
553 | _REGISTER_CLOCK("imx21-uart.2", NULL, uart3_clk) | ||
554 | _REGISTER_CLOCK("imx21-uart.3", NULL, uart4_clk) | ||
555 | _REGISTER_CLOCK("imx21-uart.4", NULL, uart5_clk) | ||
556 | _REGISTER_CLOCK("imx-i2c.0", NULL, i2c1_clk) | ||
557 | _REGISTER_CLOCK("imx-i2c.1", NULL, i2c2_clk) | ||
558 | _REGISTER_CLOCK("imx-i2c.2", NULL, i2c3_clk) | ||
559 | _REGISTER_CLOCK("mxc_w1.0", NULL, owire_clk) | ||
560 | _REGISTER_CLOCK("mxc-mmc.0", NULL, sdhc1_clk) | ||
561 | _REGISTER_CLOCK("mxc-mmc.1", NULL, sdhc2_clk) | ||
562 | _REGISTER_CLOCK("imx-ssi.0", NULL, ssi1_clk) | ||
563 | _REGISTER_CLOCK("imx-ssi.1", NULL, ssi2_clk) | ||
564 | _REGISTER_CLOCK(NULL, "firi", firi_clk) | ||
565 | _REGISTER_CLOCK("pata_imx", NULL, pata_clk) | ||
566 | _REGISTER_CLOCK(NULL, "rtic", rtic_clk) | ||
567 | _REGISTER_CLOCK(NULL, "rng", rng_clk) | ||
568 | _REGISTER_CLOCK("imx31-sdma", NULL, sdma_clk1) | ||
569 | _REGISTER_CLOCK(NULL, "sdma_ipg", sdma_clk2) | ||
570 | _REGISTER_CLOCK(NULL, "mstick", mstick1_clk) | ||
571 | _REGISTER_CLOCK(NULL, "mstick", mstick2_clk) | ||
572 | _REGISTER_CLOCK(NULL, "scc", scc_clk) | ||
573 | _REGISTER_CLOCK(NULL, "iim", iim_clk) | ||
574 | _REGISTER_CLOCK(NULL, "mpeg4", mpeg4_clk) | ||
575 | _REGISTER_CLOCK(NULL, "mbx", mbx_clk) | ||
576 | }; | ||
577 | |||
578 | int __init mx31_clocks_init(unsigned long fref) | ||
579 | { | ||
580 | u32 reg; | ||
581 | |||
582 | ckih_rate = fref; | ||
583 | |||
584 | clkdev_add_table(lookups, ARRAY_SIZE(lookups)); | ||
585 | |||
586 | /* change the csi_clk parent if necessary */ | ||
587 | reg = __raw_readl(MXC_CCM_CCMR); | ||
588 | if (!(reg & MXC_CCM_CCMR_CSCS)) | ||
589 | if (clk_set_parent(&csi_clk, &usb_pll_clk)) | ||
590 | pr_err("%s: error changing csi_clk parent\n", __func__); | ||
591 | |||
592 | |||
593 | /* Turn off all possible clocks */ | ||
594 | __raw_writel((3 << 4), MXC_CCM_CGR0); | ||
595 | __raw_writel(0, MXC_CCM_CGR1); | ||
596 | __raw_writel((3 << 8) | (3 << 14) | (3 << 16)| | ||
597 | 1 << 27 | 1 << 28, /* Bit 27 and 28 are not defined for | ||
598 | MX32, but still required to be set */ | ||
599 | MXC_CCM_CGR2); | ||
600 | |||
601 | /* | ||
602 | * Before turning off usb_pll make sure ipg_per_clk is generated | ||
603 | * by ipg_clk and not usb_pll. | ||
604 | */ | ||
605 | __raw_writel(__raw_readl(MXC_CCM_CCMR) | (1 << 24), MXC_CCM_CCMR); | ||
606 | |||
607 | usb_pll_disable(&usb_pll_clk); | ||
608 | |||
609 | pr_info("Clock input source is %ld\n", clk_get_rate(&ckih_clk)); | ||
610 | |||
611 | clk_enable(&gpt_clk); | ||
612 | clk_enable(&emi_clk); | ||
613 | clk_enable(&iim_clk); | ||
614 | mx31_revision(); | ||
615 | clk_disable(&iim_clk); | ||
616 | |||
617 | clk_enable(&serial_pll_clk); | ||
618 | |||
619 | if (mx31_revision() >= IMX_CHIP_REVISION_2_0) { | ||
620 | reg = __raw_readl(MXC_CCM_PMCR1); | ||
621 | /* No PLL restart on DVFS switch; enable auto EMI handshake */ | ||
622 | reg |= MXC_CCM_PMCR1_PLLRDIS | MXC_CCM_PMCR1_EMIRQ_EN; | ||
623 | __raw_writel(reg, MXC_CCM_PMCR1); | ||
624 | } | ||
625 | |||
626 | mxc_timer_init(&ipg_clk, MX31_IO_ADDRESS(MX31_GPT1_BASE_ADDR), | ||
627 | MX31_INT_GPT); | ||
628 | |||
629 | return 0; | ||
630 | } | ||
diff --git a/arch/arm/mach-imx/clock-imx35.c b/arch/arm/mach-imx/clock-imx35.c deleted file mode 100644 index e56c1a83eee3..000000000000 --- a/arch/arm/mach-imx/clock-imx35.c +++ /dev/null | |||
@@ -1,536 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2009 by Sascha Hauer, Pengutronix | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or | ||
5 | * modify it under the terms of the GNU General Public License | ||
6 | * as published by the Free Software Foundation; either version 2 | ||
7 | * of the License, or (at your option) any later version. | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License | ||
14 | * along with this program; if not, write to the Free Software | ||
15 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, | ||
16 | * MA 02110-1301, USA. | ||
17 | */ | ||
18 | |||
19 | #include <linux/kernel.h> | ||
20 | #include <linux/init.h> | ||
21 | #include <linux/list.h> | ||
22 | #include <linux/clk.h> | ||
23 | #include <linux/io.h> | ||
24 | #include <linux/clkdev.h> | ||
25 | |||
26 | #include <mach/clock.h> | ||
27 | #include <mach/hardware.h> | ||
28 | #include <mach/common.h> | ||
29 | |||
30 | #include "crmregs-imx3.h" | ||
31 | |||
32 | #ifdef HAVE_SET_RATE_SUPPORT | ||
33 | static void calc_dividers(u32 div, u32 *pre, u32 *post, u32 maxpost) | ||
34 | { | ||
35 | u32 min_pre, temp_pre, old_err, err; | ||
36 | |||
37 | min_pre = (div - 1) / maxpost + 1; | ||
38 | old_err = 8; | ||
39 | |||
40 | for (temp_pre = 8; temp_pre >= min_pre; temp_pre--) { | ||
41 | if (div > (temp_pre * maxpost)) | ||
42 | break; | ||
43 | |||
44 | if (div < (temp_pre * temp_pre)) | ||
45 | continue; | ||
46 | |||
47 | err = div % temp_pre; | ||
48 | |||
49 | if (err == 0) { | ||
50 | *pre = temp_pre; | ||
51 | break; | ||
52 | } | ||
53 | |||
54 | err = temp_pre - err; | ||
55 | |||
56 | if (err < old_err) { | ||
57 | old_err = err; | ||
58 | *pre = temp_pre; | ||
59 | } | ||
60 | } | ||
61 | |||
62 | *post = (div + *pre - 1) / *pre; | ||
63 | } | ||
64 | |||
65 | /* get the best values for a 3-bit divider combined with a 6-bit divider */ | ||
66 | static void calc_dividers_3_6(u32 div, u32 *pre, u32 *post) | ||
67 | { | ||
68 | if (div >= 512) { | ||
69 | *pre = 8; | ||
70 | *post = 64; | ||
71 | } else if (div >= 64) { | ||
72 | calc_dividers(div, pre, post, 64); | ||
73 | } else if (div <= 8) { | ||
74 | *pre = div; | ||
75 | *post = 1; | ||
76 | } else { | ||
77 | *pre = 1; | ||
78 | *post = div; | ||
79 | } | ||
80 | } | ||
81 | |||
82 | /* get the best values for two cascaded 3-bit dividers */ | ||
83 | static void calc_dividers_3_3(u32 div, u32 *pre, u32 *post) | ||
84 | { | ||
85 | if (div >= 64) { | ||
86 | *pre = *post = 8; | ||
87 | } else if (div > 8) { | ||
88 | calc_dividers(div, pre, post, 8); | ||
89 | } else { | ||
90 | *pre = 1; | ||
91 | *post = div; | ||
92 | } | ||
93 | } | ||
94 | #endif | ||
95 | |||
96 | static unsigned long get_rate_mpll(void) | ||
97 | { | ||
98 | ulong mpctl = __raw_readl(MX35_CCM_MPCTL); | ||
99 | |||
100 | return mxc_decode_pll(mpctl, 24000000); | ||
101 | } | ||
102 | |||
103 | static unsigned long get_rate_ppll(void) | ||
104 | { | ||
105 | ulong ppctl = __raw_readl(MX35_CCM_PPCTL); | ||
106 | |||
107 | return mxc_decode_pll(ppctl, 24000000); | ||
108 | } | ||
109 | |||
110 | struct arm_ahb_div { | ||
111 | unsigned char arm, ahb, sel; | ||
112 | }; | ||
113 | |||
114 | static struct arm_ahb_div clk_consumer[] = { | ||
115 | { .arm = 1, .ahb = 4, .sel = 0}, | ||
116 | { .arm = 1, .ahb = 3, .sel = 1}, | ||
117 | { .arm = 2, .ahb = 2, .sel = 0}, | ||
118 | { .arm = 0, .ahb = 0, .sel = 0}, | ||
119 | { .arm = 0, .ahb = 0, .sel = 0}, | ||
120 | { .arm = 0, .ahb = 0, .sel = 0}, | ||
121 | { .arm = 4, .ahb = 1, .sel = 0}, | ||
122 | { .arm = 1, .ahb = 5, .sel = 0}, | ||
123 | { .arm = 1, .ahb = 8, .sel = 0}, | ||
124 | { .arm = 1, .ahb = 6, .sel = 1}, | ||
125 | { .arm = 2, .ahb = 4, .sel = 0}, | ||
126 | { .arm = 0, .ahb = 0, .sel = 0}, | ||
127 | { .arm = 0, .ahb = 0, .sel = 0}, | ||
128 | { .arm = 0, .ahb = 0, .sel = 0}, | ||
129 | { .arm = 4, .ahb = 2, .sel = 0}, | ||
130 | { .arm = 0, .ahb = 0, .sel = 0}, | ||
131 | }; | ||
132 | |||
133 | static unsigned long get_rate_arm(void) | ||
134 | { | ||
135 | unsigned long pdr0 = __raw_readl(MXC_CCM_PDR0); | ||
136 | struct arm_ahb_div *aad; | ||
137 | unsigned long fref = get_rate_mpll(); | ||
138 | |||
139 | aad = &clk_consumer[(pdr0 >> 16) & 0xf]; | ||
140 | if (aad->sel) | ||
141 | fref = fref * 3 / 4; | ||
142 | |||
143 | return fref / aad->arm; | ||
144 | } | ||
145 | |||
146 | static unsigned long get_rate_ahb(struct clk *clk) | ||
147 | { | ||
148 | unsigned long pdr0 = __raw_readl(MXC_CCM_PDR0); | ||
149 | struct arm_ahb_div *aad; | ||
150 | unsigned long fref = get_rate_arm(); | ||
151 | |||
152 | aad = &clk_consumer[(pdr0 >> 16) & 0xf]; | ||
153 | |||
154 | return fref / aad->ahb; | ||
155 | } | ||
156 | |||
157 | static unsigned long get_rate_ipg(struct clk *clk) | ||
158 | { | ||
159 | return get_rate_ahb(NULL) >> 1; | ||
160 | } | ||
161 | |||
162 | static unsigned long get_rate_uart(struct clk *clk) | ||
163 | { | ||
164 | unsigned long pdr3 = __raw_readl(MX35_CCM_PDR3); | ||
165 | unsigned long pdr4 = __raw_readl(MX35_CCM_PDR4); | ||
166 | unsigned long div = ((pdr4 >> 10) & 0x3f) + 1; | ||
167 | |||
168 | if (pdr3 & (1 << 14)) | ||
169 | return get_rate_arm() / div; | ||
170 | else | ||
171 | return get_rate_ppll() / div; | ||
172 | } | ||
173 | |||
174 | static unsigned long get_rate_sdhc(struct clk *clk) | ||
175 | { | ||
176 | unsigned long pdr3 = __raw_readl(MX35_CCM_PDR3); | ||
177 | unsigned long div, rate; | ||
178 | |||
179 | if (pdr3 & (1 << 6)) | ||
180 | rate = get_rate_arm(); | ||
181 | else | ||
182 | rate = get_rate_ppll(); | ||
183 | |||
184 | switch (clk->id) { | ||
185 | default: | ||
186 | case 0: | ||
187 | div = pdr3 & 0x3f; | ||
188 | break; | ||
189 | case 1: | ||
190 | div = (pdr3 >> 8) & 0x3f; | ||
191 | break; | ||
192 | case 2: | ||
193 | div = (pdr3 >> 16) & 0x3f; | ||
194 | break; | ||
195 | } | ||
196 | |||
197 | return rate / (div + 1); | ||
198 | } | ||
199 | |||
200 | static unsigned long get_rate_mshc(struct clk *clk) | ||
201 | { | ||
202 | unsigned long pdr1 = __raw_readl(MXC_CCM_PDR1); | ||
203 | unsigned long div1, div2, rate; | ||
204 | |||
205 | if (pdr1 & (1 << 7)) | ||
206 | rate = get_rate_arm(); | ||
207 | else | ||
208 | rate = get_rate_ppll(); | ||
209 | |||
210 | div1 = (pdr1 >> 29) & 0x7; | ||
211 | div2 = (pdr1 >> 22) & 0x3f; | ||
212 | |||
213 | return rate / ((div1 + 1) * (div2 + 1)); | ||
214 | } | ||
215 | |||
216 | static unsigned long get_rate_ssi(struct clk *clk) | ||
217 | { | ||
218 | unsigned long pdr2 = __raw_readl(MX35_CCM_PDR2); | ||
219 | unsigned long div1, div2, rate; | ||
220 | |||
221 | if (pdr2 & (1 << 6)) | ||
222 | rate = get_rate_arm(); | ||
223 | else | ||
224 | rate = get_rate_ppll(); | ||
225 | |||
226 | switch (clk->id) { | ||
227 | default: | ||
228 | case 0: | ||
229 | div1 = pdr2 & 0x3f; | ||
230 | div2 = (pdr2 >> 24) & 0x7; | ||
231 | break; | ||
232 | case 1: | ||
233 | div1 = (pdr2 >> 8) & 0x3f; | ||
234 | div2 = (pdr2 >> 27) & 0x7; | ||
235 | break; | ||
236 | } | ||
237 | |||
238 | return rate / ((div1 + 1) * (div2 + 1)); | ||
239 | } | ||
240 | |||
241 | static unsigned long get_rate_csi(struct clk *clk) | ||
242 | { | ||
243 | unsigned long pdr2 = __raw_readl(MX35_CCM_PDR2); | ||
244 | unsigned long rate; | ||
245 | |||
246 | if (pdr2 & (1 << 7)) | ||
247 | rate = get_rate_arm(); | ||
248 | else | ||
249 | rate = get_rate_ppll(); | ||
250 | |||
251 | return rate / (((pdr2 >> 16) & 0x3f) + 1); | ||
252 | } | ||
253 | |||
254 | static unsigned long get_rate_otg(struct clk *clk) | ||
255 | { | ||
256 | unsigned long pdr4 = __raw_readl(MX35_CCM_PDR4); | ||
257 | unsigned long rate; | ||
258 | |||
259 | if (pdr4 & (1 << 9)) | ||
260 | rate = get_rate_arm(); | ||
261 | else | ||
262 | rate = get_rate_ppll(); | ||
263 | |||
264 | return rate / (((pdr4 >> 22) & 0x3f) + 1); | ||
265 | } | ||
266 | |||
267 | static unsigned long get_rate_ipg_per(struct clk *clk) | ||
268 | { | ||
269 | unsigned long pdr0 = __raw_readl(MXC_CCM_PDR0); | ||
270 | unsigned long pdr4 = __raw_readl(MX35_CCM_PDR4); | ||
271 | unsigned long div; | ||
272 | |||
273 | if (pdr0 & (1 << 26)) { | ||
274 | div = (pdr4 >> 16) & 0x3f; | ||
275 | return get_rate_arm() / (div + 1); | ||
276 | } else { | ||
277 | div = (pdr0 >> 12) & 0x7; | ||
278 | return get_rate_ahb(NULL) / (div + 1); | ||
279 | } | ||
280 | } | ||
281 | |||
282 | static unsigned long get_rate_hsp(struct clk *clk) | ||
283 | { | ||
284 | unsigned long hsp_podf = (__raw_readl(MXC_CCM_PDR0) >> 20) & 0x03; | ||
285 | unsigned long fref = get_rate_mpll(); | ||
286 | |||
287 | if (fref > 400 * 1000 * 1000) { | ||
288 | switch (hsp_podf) { | ||
289 | case 0: | ||
290 | return fref >> 2; | ||
291 | case 1: | ||
292 | return fref >> 3; | ||
293 | case 2: | ||
294 | return fref / 3; | ||
295 | } | ||
296 | } else { | ||
297 | switch (hsp_podf) { | ||
298 | case 0: | ||
299 | case 2: | ||
300 | return fref / 3; | ||
301 | case 1: | ||
302 | return fref / 6; | ||
303 | } | ||
304 | } | ||
305 | |||
306 | return 0; | ||
307 | } | ||
308 | |||
309 | static int clk_cgr_enable(struct clk *clk) | ||
310 | { | ||
311 | u32 reg; | ||
312 | |||
313 | reg = __raw_readl(clk->enable_reg); | ||
314 | reg |= 3 << clk->enable_shift; | ||
315 | __raw_writel(reg, clk->enable_reg); | ||
316 | |||
317 | return 0; | ||
318 | } | ||
319 | |||
320 | static void clk_cgr_disable(struct clk *clk) | ||
321 | { | ||
322 | u32 reg; | ||
323 | |||
324 | reg = __raw_readl(clk->enable_reg); | ||
325 | reg &= ~(3 << clk->enable_shift); | ||
326 | __raw_writel(reg, clk->enable_reg); | ||
327 | } | ||
328 | |||
329 | #define DEFINE_CLOCK(name, i, er, es, gr, sr) \ | ||
330 | static struct clk name = { \ | ||
331 | .id = i, \ | ||
332 | .enable_reg = er, \ | ||
333 | .enable_shift = es, \ | ||
334 | .get_rate = gr, \ | ||
335 | .set_rate = sr, \ | ||
336 | .enable = clk_cgr_enable, \ | ||
337 | .disable = clk_cgr_disable, \ | ||
338 | } | ||
339 | |||
340 | DEFINE_CLOCK(asrc_clk, 0, MX35_CCM_CGR0, 0, NULL, NULL); | ||
341 | DEFINE_CLOCK(pata_clk, 0, MX35_CCM_CGR0, 2, get_rate_ipg, NULL); | ||
342 | /* DEFINE_CLOCK(audmux_clk, 0, MX35_CCM_CGR0, 4, NULL, NULL); */ | ||
343 | DEFINE_CLOCK(can1_clk, 0, MX35_CCM_CGR0, 6, get_rate_ipg, NULL); | ||
344 | DEFINE_CLOCK(can2_clk, 1, MX35_CCM_CGR0, 8, get_rate_ipg, NULL); | ||
345 | DEFINE_CLOCK(cspi1_clk, 0, MX35_CCM_CGR0, 10, get_rate_ipg, NULL); | ||
346 | DEFINE_CLOCK(cspi2_clk, 1, MX35_CCM_CGR0, 12, get_rate_ipg, NULL); | ||
347 | DEFINE_CLOCK(ect_clk, 0, MX35_CCM_CGR0, 14, get_rate_ipg, NULL); | ||
348 | DEFINE_CLOCK(edio_clk, 0, MX35_CCM_CGR0, 16, NULL, NULL); | ||
349 | DEFINE_CLOCK(emi_clk, 0, MX35_CCM_CGR0, 18, get_rate_ipg, NULL); | ||
350 | DEFINE_CLOCK(epit1_clk, 0, MX35_CCM_CGR0, 20, get_rate_ipg, NULL); | ||
351 | DEFINE_CLOCK(epit2_clk, 1, MX35_CCM_CGR0, 22, get_rate_ipg, NULL); | ||
352 | DEFINE_CLOCK(esai_clk, 0, MX35_CCM_CGR0, 24, NULL, NULL); | ||
353 | DEFINE_CLOCK(esdhc1_clk, 0, MX35_CCM_CGR0, 26, get_rate_sdhc, NULL); | ||
354 | DEFINE_CLOCK(esdhc2_clk, 1, MX35_CCM_CGR0, 28, get_rate_sdhc, NULL); | ||
355 | DEFINE_CLOCK(esdhc3_clk, 2, MX35_CCM_CGR0, 30, get_rate_sdhc, NULL); | ||
356 | |||
357 | DEFINE_CLOCK(fec_clk, 0, MX35_CCM_CGR1, 0, get_rate_ipg, NULL); | ||
358 | DEFINE_CLOCK(gpio1_clk, 0, MX35_CCM_CGR1, 2, NULL, NULL); | ||
359 | DEFINE_CLOCK(gpio2_clk, 1, MX35_CCM_CGR1, 4, NULL, NULL); | ||
360 | DEFINE_CLOCK(gpio3_clk, 2, MX35_CCM_CGR1, 6, NULL, NULL); | ||
361 | DEFINE_CLOCK(gpt_clk, 0, MX35_CCM_CGR1, 8, get_rate_ipg, NULL); | ||
362 | DEFINE_CLOCK(i2c1_clk, 0, MX35_CCM_CGR1, 10, get_rate_ipg_per, NULL); | ||
363 | DEFINE_CLOCK(i2c2_clk, 1, MX35_CCM_CGR1, 12, get_rate_ipg_per, NULL); | ||
364 | DEFINE_CLOCK(i2c3_clk, 2, MX35_CCM_CGR1, 14, get_rate_ipg_per, NULL); | ||
365 | DEFINE_CLOCK(iomuxc_clk, 0, MX35_CCM_CGR1, 16, NULL, NULL); | ||
366 | DEFINE_CLOCK(ipu_clk, 0, MX35_CCM_CGR1, 18, get_rate_hsp, NULL); | ||
367 | DEFINE_CLOCK(kpp_clk, 0, MX35_CCM_CGR1, 20, get_rate_ipg, NULL); | ||
368 | DEFINE_CLOCK(mlb_clk, 0, MX35_CCM_CGR1, 22, get_rate_ahb, NULL); | ||
369 | DEFINE_CLOCK(mshc_clk, 0, MX35_CCM_CGR1, 24, get_rate_mshc, NULL); | ||
370 | DEFINE_CLOCK(owire_clk, 0, MX35_CCM_CGR1, 26, get_rate_ipg_per, NULL); | ||
371 | DEFINE_CLOCK(pwm_clk, 0, MX35_CCM_CGR1, 28, get_rate_ipg_per, NULL); | ||
372 | DEFINE_CLOCK(rngc_clk, 0, MX35_CCM_CGR1, 30, get_rate_ipg, NULL); | ||
373 | |||
374 | DEFINE_CLOCK(rtc_clk, 0, MX35_CCM_CGR2, 0, get_rate_ipg, NULL); | ||
375 | DEFINE_CLOCK(rtic_clk, 0, MX35_CCM_CGR2, 2, get_rate_ahb, NULL); | ||
376 | DEFINE_CLOCK(scc_clk, 0, MX35_CCM_CGR2, 4, get_rate_ipg, NULL); | ||
377 | DEFINE_CLOCK(sdma_clk, 0, MX35_CCM_CGR2, 6, NULL, NULL); | ||
378 | DEFINE_CLOCK(spba_clk, 0, MX35_CCM_CGR2, 8, get_rate_ipg, NULL); | ||
379 | DEFINE_CLOCK(spdif_clk, 0, MX35_CCM_CGR2, 10, NULL, NULL); | ||
380 | DEFINE_CLOCK(ssi1_clk, 0, MX35_CCM_CGR2, 12, get_rate_ssi, NULL); | ||
381 | DEFINE_CLOCK(ssi2_clk, 1, MX35_CCM_CGR2, 14, get_rate_ssi, NULL); | ||
382 | DEFINE_CLOCK(uart1_clk, 0, MX35_CCM_CGR2, 16, get_rate_uart, NULL); | ||
383 | DEFINE_CLOCK(uart2_clk, 1, MX35_CCM_CGR2, 18, get_rate_uart, NULL); | ||
384 | DEFINE_CLOCK(uart3_clk, 2, MX35_CCM_CGR2, 20, get_rate_uart, NULL); | ||
385 | DEFINE_CLOCK(usbotg_clk, 0, MX35_CCM_CGR2, 22, get_rate_otg, NULL); | ||
386 | DEFINE_CLOCK(wdog_clk, 0, MX35_CCM_CGR2, 24, NULL, NULL); | ||
387 | DEFINE_CLOCK(max_clk, 0, MX35_CCM_CGR2, 26, NULL, NULL); | ||
388 | DEFINE_CLOCK(audmux_clk, 0, MX35_CCM_CGR2, 30, NULL, NULL); | ||
389 | |||
390 | DEFINE_CLOCK(csi_clk, 0, MX35_CCM_CGR3, 0, get_rate_csi, NULL); | ||
391 | DEFINE_CLOCK(iim_clk, 0, MX35_CCM_CGR3, 2, NULL, NULL); | ||
392 | DEFINE_CLOCK(gpu2d_clk, 0, MX35_CCM_CGR3, 4, NULL, NULL); | ||
393 | |||
394 | DEFINE_CLOCK(usbahb_clk, 0, 0, 0, get_rate_ahb, NULL); | ||
395 | |||
396 | static int clk_dummy_enable(struct clk *clk) | ||
397 | { | ||
398 | return 0; | ||
399 | } | ||
400 | |||
401 | static void clk_dummy_disable(struct clk *clk) | ||
402 | { | ||
403 | } | ||
404 | |||
405 | static unsigned long get_rate_nfc(struct clk *clk) | ||
406 | { | ||
407 | unsigned long div1; | ||
408 | |||
409 | div1 = (__raw_readl(MX35_CCM_PDR4) >> 28) + 1; | ||
410 | |||
411 | return get_rate_ahb(NULL) / div1; | ||
412 | } | ||
413 | |||
414 | /* NAND Controller: It seems it can't be disabled */ | ||
415 | static struct clk nfc_clk = { | ||
416 | .id = 0, | ||
417 | .enable_reg = 0, | ||
418 | .enable_shift = 0, | ||
419 | .get_rate = get_rate_nfc, | ||
420 | .set_rate = NULL, /* set_rate_nfc, */ | ||
421 | .enable = clk_dummy_enable, | ||
422 | .disable = clk_dummy_disable | ||
423 | }; | ||
424 | |||
425 | #define _REGISTER_CLOCK(d, n, c) \ | ||
426 | { \ | ||
427 | .dev_id = d, \ | ||
428 | .con_id = n, \ | ||
429 | .clk = &c, \ | ||
430 | }, | ||
431 | |||
432 | static struct clk_lookup lookups[] = { | ||
433 | _REGISTER_CLOCK(NULL, "asrc", asrc_clk) | ||
434 | _REGISTER_CLOCK("pata_imx", NULL, pata_clk) | ||
435 | _REGISTER_CLOCK("flexcan.0", NULL, can1_clk) | ||
436 | _REGISTER_CLOCK("flexcan.1", NULL, can2_clk) | ||
437 | _REGISTER_CLOCK("imx35-cspi.0", NULL, cspi1_clk) | ||
438 | _REGISTER_CLOCK("imx35-cspi.1", NULL, cspi2_clk) | ||
439 | _REGISTER_CLOCK(NULL, "ect", ect_clk) | ||
440 | _REGISTER_CLOCK(NULL, "edio", edio_clk) | ||
441 | _REGISTER_CLOCK(NULL, "emi", emi_clk) | ||
442 | _REGISTER_CLOCK("imx-epit.0", NULL, epit1_clk) | ||
443 | _REGISTER_CLOCK("imx-epit.1", NULL, epit2_clk) | ||
444 | _REGISTER_CLOCK(NULL, "esai", esai_clk) | ||
445 | _REGISTER_CLOCK("sdhci-esdhc-imx35.0", NULL, esdhc1_clk) | ||
446 | _REGISTER_CLOCK("sdhci-esdhc-imx35.1", NULL, esdhc2_clk) | ||
447 | _REGISTER_CLOCK("sdhci-esdhc-imx35.2", NULL, esdhc3_clk) | ||
448 | /* i.mx35 has the i.mx27 type fec */ | ||
449 | _REGISTER_CLOCK("imx27-fec.0", NULL, fec_clk) | ||
450 | _REGISTER_CLOCK(NULL, "gpio", gpio1_clk) | ||
451 | _REGISTER_CLOCK(NULL, "gpio", gpio2_clk) | ||
452 | _REGISTER_CLOCK(NULL, "gpio", gpio3_clk) | ||
453 | _REGISTER_CLOCK("gpt.0", NULL, gpt_clk) | ||
454 | _REGISTER_CLOCK("imx-i2c.0", NULL, i2c1_clk) | ||
455 | _REGISTER_CLOCK("imx-i2c.1", NULL, i2c2_clk) | ||
456 | _REGISTER_CLOCK("imx-i2c.2", NULL, i2c3_clk) | ||
457 | _REGISTER_CLOCK(NULL, "iomuxc", iomuxc_clk) | ||
458 | _REGISTER_CLOCK("ipu-core", NULL, ipu_clk) | ||
459 | _REGISTER_CLOCK("mx3_sdc_fb", NULL, ipu_clk) | ||
460 | _REGISTER_CLOCK(NULL, "kpp", kpp_clk) | ||
461 | _REGISTER_CLOCK(NULL, "mlb", mlb_clk) | ||
462 | _REGISTER_CLOCK(NULL, "mshc", mshc_clk) | ||
463 | _REGISTER_CLOCK("mxc_w1", NULL, owire_clk) | ||
464 | _REGISTER_CLOCK(NULL, "pwm", pwm_clk) | ||
465 | _REGISTER_CLOCK(NULL, "rngc", rngc_clk) | ||
466 | _REGISTER_CLOCK(NULL, "rtc", rtc_clk) | ||
467 | _REGISTER_CLOCK(NULL, "rtic", rtic_clk) | ||
468 | _REGISTER_CLOCK(NULL, "scc", scc_clk) | ||
469 | _REGISTER_CLOCK("imx35-sdma", NULL, sdma_clk) | ||
470 | _REGISTER_CLOCK(NULL, "spba", spba_clk) | ||
471 | _REGISTER_CLOCK(NULL, "spdif", spdif_clk) | ||
472 | _REGISTER_CLOCK("imx-ssi.0", NULL, ssi1_clk) | ||
473 | _REGISTER_CLOCK("imx-ssi.1", NULL, ssi2_clk) | ||
474 | /* i.mx35 has the i.mx21 type uart */ | ||
475 | _REGISTER_CLOCK("imx21-uart.0", NULL, uart1_clk) | ||
476 | _REGISTER_CLOCK("imx21-uart.1", NULL, uart2_clk) | ||
477 | _REGISTER_CLOCK("imx21-uart.2", NULL, uart3_clk) | ||
478 | _REGISTER_CLOCK("mxc-ehci.0", "usb", usbotg_clk) | ||
479 | _REGISTER_CLOCK("mxc-ehci.1", "usb", usbotg_clk) | ||
480 | _REGISTER_CLOCK("mxc-ehci.2", "usb", usbotg_clk) | ||
481 | _REGISTER_CLOCK("fsl-usb2-udc", "usb", usbotg_clk) | ||
482 | _REGISTER_CLOCK("fsl-usb2-udc", "usb_ahb", usbahb_clk) | ||
483 | _REGISTER_CLOCK("imx2-wdt.0", NULL, wdog_clk) | ||
484 | _REGISTER_CLOCK(NULL, "max", max_clk) | ||
485 | _REGISTER_CLOCK(NULL, "audmux", audmux_clk) | ||
486 | _REGISTER_CLOCK("mx3-camera.0", NULL, csi_clk) | ||
487 | _REGISTER_CLOCK(NULL, "iim", iim_clk) | ||
488 | _REGISTER_CLOCK(NULL, "gpu2d", gpu2d_clk) | ||
489 | _REGISTER_CLOCK("mxc_nand.0", NULL, nfc_clk) | ||
490 | }; | ||
491 | |||
492 | int __init mx35_clocks_init() | ||
493 | { | ||
494 | unsigned int cgr2 = 3 << 26; | ||
495 | |||
496 | #if defined(CONFIG_DEBUG_LL) && !defined(CONFIG_DEBUG_ICEDCC) | ||
497 | cgr2 |= 3 << 16; | ||
498 | #endif | ||
499 | |||
500 | clkdev_add_table(lookups, ARRAY_SIZE(lookups)); | ||
501 | |||
502 | /* Turn off all clocks except the ones we need to survive, namely: | ||
503 | * EMI, GPIO1/2/3, GPT, IOMUX, MAX and eventually uart | ||
504 | */ | ||
505 | __raw_writel((3 << 18), MX35_CCM_CGR0); | ||
506 | __raw_writel((3 << 2) | (3 << 4) | (3 << 6) | (3 << 8) | (3 << 16), | ||
507 | MX35_CCM_CGR1); | ||
508 | __raw_writel(cgr2, MX35_CCM_CGR2); | ||
509 | __raw_writel(0, MX35_CCM_CGR3); | ||
510 | |||
511 | clk_enable(&iim_clk); | ||
512 | imx_print_silicon_rev("i.MX35", mx35_revision()); | ||
513 | clk_disable(&iim_clk); | ||
514 | |||
515 | /* | ||
516 | * Check if we came up in internal boot mode. If yes, we need some | ||
517 | * extra clocks turned on, otherwise the MX35 boot ROM code will | ||
518 | * hang after a watchdog reset. | ||
519 | */ | ||
520 | if (!(__raw_readl(MX35_CCM_RCSR) & (3 << 10))) { | ||
521 | /* Additionally turn on UART1, SCC, and IIM clocks */ | ||
522 | clk_enable(&iim_clk); | ||
523 | clk_enable(&uart1_clk); | ||
524 | clk_enable(&scc_clk); | ||
525 | } | ||
526 | |||
527 | #ifdef CONFIG_MXC_USE_EPIT | ||
528 | epit_timer_init(&epit1_clk, | ||
529 | MX35_IO_ADDRESS(MX35_EPIT1_BASE_ADDR), MX35_INT_EPIT1); | ||
530 | #else | ||
531 | mxc_timer_init(&gpt_clk, | ||
532 | MX35_IO_ADDRESS(MX35_GPT1_BASE_ADDR), MX35_INT_GPT); | ||
533 | #endif | ||
534 | |||
535 | return 0; | ||
536 | } | ||
diff --git a/arch/arm/mach-imx/clock-imx6q.c b/arch/arm/mach-imx/clock-imx6q.c deleted file mode 100644 index 111c328f5420..000000000000 --- a/arch/arm/mach-imx/clock-imx6q.c +++ /dev/null | |||
@@ -1,2111 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright 2011 Freescale Semiconductor, Inc. | ||
3 | * Copyright 2011 Linaro Ltd. | ||
4 | * | ||
5 | * The code contained herein is licensed under the GNU General Public | ||
6 | * License. You may obtain a copy of the GNU General Public License | ||
7 | * Version 2 or later at the following locations: | ||
8 | * | ||
9 | * http://www.opensource.org/licenses/gpl-license.html | ||
10 | * http://www.gnu.org/copyleft/gpl.html | ||
11 | */ | ||
12 | |||
13 | #include <linux/init.h> | ||
14 | #include <linux/types.h> | ||
15 | #include <linux/clk.h> | ||
16 | #include <linux/clkdev.h> | ||
17 | #include <linux/io.h> | ||
18 | #include <linux/of.h> | ||
19 | #include <linux/of_address.h> | ||
20 | #include <linux/of_irq.h> | ||
21 | #include <asm/div64.h> | ||
22 | #include <asm/mach/map.h> | ||
23 | #include <mach/clock.h> | ||
24 | #include <mach/common.h> | ||
25 | #include <mach/hardware.h> | ||
26 | |||
27 | #define PLL_BASE IMX_IO_ADDRESS(MX6Q_ANATOP_BASE_ADDR) | ||
28 | #define PLL1_SYS (PLL_BASE + 0x000) | ||
29 | #define PLL2_BUS (PLL_BASE + 0x030) | ||
30 | #define PLL3_USB_OTG (PLL_BASE + 0x010) | ||
31 | #define PLL4_AUDIO (PLL_BASE + 0x070) | ||
32 | #define PLL5_VIDEO (PLL_BASE + 0x0a0) | ||
33 | #define PLL6_MLB (PLL_BASE + 0x0d0) | ||
34 | #define PLL7_USB_HOST (PLL_BASE + 0x020) | ||
35 | #define PLL8_ENET (PLL_BASE + 0x0e0) | ||
36 | #define PFD_480 (PLL_BASE + 0x0f0) | ||
37 | #define PFD_528 (PLL_BASE + 0x100) | ||
38 | #define PLL_NUM_OFFSET 0x010 | ||
39 | #define PLL_DENOM_OFFSET 0x020 | ||
40 | |||
41 | #define PFD0 7 | ||
42 | #define PFD1 15 | ||
43 | #define PFD2 23 | ||
44 | #define PFD3 31 | ||
45 | #define PFD_FRAC_MASK 0x3f | ||
46 | |||
47 | #define BM_PLL_BYPASS (0x1 << 16) | ||
48 | #define BM_PLL_ENABLE (0x1 << 13) | ||
49 | #define BM_PLL_POWER_DOWN (0x1 << 12) | ||
50 | #define BM_PLL_LOCK (0x1 << 31) | ||
51 | #define BP_PLL_SYS_DIV_SELECT 0 | ||
52 | #define BM_PLL_SYS_DIV_SELECT (0x7f << 0) | ||
53 | #define BP_PLL_BUS_DIV_SELECT 0 | ||
54 | #define BM_PLL_BUS_DIV_SELECT (0x1 << 0) | ||
55 | #define BP_PLL_USB_DIV_SELECT 0 | ||
56 | #define BM_PLL_USB_DIV_SELECT (0x3 << 0) | ||
57 | #define BP_PLL_AV_DIV_SELECT 0 | ||
58 | #define BM_PLL_AV_DIV_SELECT (0x7f << 0) | ||
59 | #define BP_PLL_ENET_DIV_SELECT 0 | ||
60 | #define BM_PLL_ENET_DIV_SELECT (0x3 << 0) | ||
61 | #define BM_PLL_ENET_EN_PCIE (0x1 << 19) | ||
62 | #define BM_PLL_ENET_EN_SATA (0x1 << 20) | ||
63 | |||
64 | #define CCM_BASE IMX_IO_ADDRESS(MX6Q_CCM_BASE_ADDR) | ||
65 | #define CCR (CCM_BASE + 0x00) | ||
66 | #define CCDR (CCM_BASE + 0x04) | ||
67 | #define CSR (CCM_BASE + 0x08) | ||
68 | #define CCSR (CCM_BASE + 0x0c) | ||
69 | #define CACRR (CCM_BASE + 0x10) | ||
70 | #define CBCDR (CCM_BASE + 0x14) | ||
71 | #define CBCMR (CCM_BASE + 0x18) | ||
72 | #define CSCMR1 (CCM_BASE + 0x1c) | ||
73 | #define CSCMR2 (CCM_BASE + 0x20) | ||
74 | #define CSCDR1 (CCM_BASE + 0x24) | ||
75 | #define CS1CDR (CCM_BASE + 0x28) | ||
76 | #define CS2CDR (CCM_BASE + 0x2c) | ||
77 | #define CDCDR (CCM_BASE + 0x30) | ||
78 | #define CHSCCDR (CCM_BASE + 0x34) | ||
79 | #define CSCDR2 (CCM_BASE + 0x38) | ||
80 | #define CSCDR3 (CCM_BASE + 0x3c) | ||
81 | #define CSCDR4 (CCM_BASE + 0x40) | ||
82 | #define CWDR (CCM_BASE + 0x44) | ||
83 | #define CDHIPR (CCM_BASE + 0x48) | ||
84 | #define CDCR (CCM_BASE + 0x4c) | ||
85 | #define CTOR (CCM_BASE + 0x50) | ||
86 | #define CLPCR (CCM_BASE + 0x54) | ||
87 | #define CISR (CCM_BASE + 0x58) | ||
88 | #define CIMR (CCM_BASE + 0x5c) | ||
89 | #define CCOSR (CCM_BASE + 0x60) | ||
90 | #define CGPR (CCM_BASE + 0x64) | ||
91 | #define CCGR0 (CCM_BASE + 0x68) | ||
92 | #define CCGR1 (CCM_BASE + 0x6c) | ||
93 | #define CCGR2 (CCM_BASE + 0x70) | ||
94 | #define CCGR3 (CCM_BASE + 0x74) | ||
95 | #define CCGR4 (CCM_BASE + 0x78) | ||
96 | #define CCGR5 (CCM_BASE + 0x7c) | ||
97 | #define CCGR6 (CCM_BASE + 0x80) | ||
98 | #define CCGR7 (CCM_BASE + 0x84) | ||
99 | #define CMEOR (CCM_BASE + 0x88) | ||
100 | |||
101 | #define CG0 0 | ||
102 | #define CG1 2 | ||
103 | #define CG2 4 | ||
104 | #define CG3 6 | ||
105 | #define CG4 8 | ||
106 | #define CG5 10 | ||
107 | #define CG6 12 | ||
108 | #define CG7 14 | ||
109 | #define CG8 16 | ||
110 | #define CG9 18 | ||
111 | #define CG10 20 | ||
112 | #define CG11 22 | ||
113 | #define CG12 24 | ||
114 | #define CG13 26 | ||
115 | #define CG14 28 | ||
116 | #define CG15 30 | ||
117 | |||
118 | #define BM_CCSR_PLL1_SW_SEL (0x1 << 2) | ||
119 | #define BM_CCSR_STEP_SEL (0x1 << 8) | ||
120 | |||
121 | #define BP_CACRR_ARM_PODF 0 | ||
122 | #define BM_CACRR_ARM_PODF (0x7 << 0) | ||
123 | |||
124 | #define BP_CBCDR_PERIPH2_CLK2_PODF 0 | ||
125 | #define BM_CBCDR_PERIPH2_CLK2_PODF (0x7 << 0) | ||
126 | #define BP_CBCDR_MMDC_CH1_AXI_PODF 3 | ||
127 | #define BM_CBCDR_MMDC_CH1_AXI_PODF (0x7 << 3) | ||
128 | #define BP_CBCDR_AXI_SEL 6 | ||
129 | #define BM_CBCDR_AXI_SEL (0x3 << 6) | ||
130 | #define BP_CBCDR_IPG_PODF 8 | ||
131 | #define BM_CBCDR_IPG_PODF (0x3 << 8) | ||
132 | #define BP_CBCDR_AHB_PODF 10 | ||
133 | #define BM_CBCDR_AHB_PODF (0x7 << 10) | ||
134 | #define BP_CBCDR_AXI_PODF 16 | ||
135 | #define BM_CBCDR_AXI_PODF (0x7 << 16) | ||
136 | #define BP_CBCDR_MMDC_CH0_AXI_PODF 19 | ||
137 | #define BM_CBCDR_MMDC_CH0_AXI_PODF (0x7 << 19) | ||
138 | #define BP_CBCDR_PERIPH_CLK_SEL 25 | ||
139 | #define BM_CBCDR_PERIPH_CLK_SEL (0x1 << 25) | ||
140 | #define BP_CBCDR_PERIPH2_CLK_SEL 26 | ||
141 | #define BM_CBCDR_PERIPH2_CLK_SEL (0x1 << 26) | ||
142 | #define BP_CBCDR_PERIPH_CLK2_PODF 27 | ||
143 | #define BM_CBCDR_PERIPH_CLK2_PODF (0x7 << 27) | ||
144 | |||
145 | #define BP_CBCMR_GPU2D_AXI_SEL 0 | ||
146 | #define BM_CBCMR_GPU2D_AXI_SEL (0x1 << 0) | ||
147 | #define BP_CBCMR_GPU3D_AXI_SEL 1 | ||
148 | #define BM_CBCMR_GPU3D_AXI_SEL (0x1 << 1) | ||
149 | #define BP_CBCMR_GPU3D_CORE_SEL 4 | ||
150 | #define BM_CBCMR_GPU3D_CORE_SEL (0x3 << 4) | ||
151 | #define BP_CBCMR_GPU3D_SHADER_SEL 8 | ||
152 | #define BM_CBCMR_GPU3D_SHADER_SEL (0x3 << 8) | ||
153 | #define BP_CBCMR_PCIE_AXI_SEL 10 | ||
154 | #define BM_CBCMR_PCIE_AXI_SEL (0x1 << 10) | ||
155 | #define BP_CBCMR_VDO_AXI_SEL 11 | ||
156 | #define BM_CBCMR_VDO_AXI_SEL (0x1 << 11) | ||
157 | #define BP_CBCMR_PERIPH_CLK2_SEL 12 | ||
158 | #define BM_CBCMR_PERIPH_CLK2_SEL (0x3 << 12) | ||
159 | #define BP_CBCMR_VPU_AXI_SEL 14 | ||
160 | #define BM_CBCMR_VPU_AXI_SEL (0x3 << 14) | ||
161 | #define BP_CBCMR_GPU2D_CORE_SEL 16 | ||
162 | #define BM_CBCMR_GPU2D_CORE_SEL (0x3 << 16) | ||
163 | #define BP_CBCMR_PRE_PERIPH_CLK_SEL 18 | ||
164 | #define BM_CBCMR_PRE_PERIPH_CLK_SEL (0x3 << 18) | ||
165 | #define BP_CBCMR_PERIPH2_CLK2_SEL 20 | ||
166 | #define BM_CBCMR_PERIPH2_CLK2_SEL (0x1 << 20) | ||
167 | #define BP_CBCMR_PRE_PERIPH2_CLK_SEL 21 | ||
168 | #define BM_CBCMR_PRE_PERIPH2_CLK_SEL (0x3 << 21) | ||
169 | #define BP_CBCMR_GPU2D_CORE_PODF 23 | ||
170 | #define BM_CBCMR_GPU2D_CORE_PODF (0x7 << 23) | ||
171 | #define BP_CBCMR_GPU3D_CORE_PODF 26 | ||
172 | #define BM_CBCMR_GPU3D_CORE_PODF (0x7 << 26) | ||
173 | #define BP_CBCMR_GPU3D_SHADER_PODF 29 | ||
174 | #define BM_CBCMR_GPU3D_SHADER_PODF (0x7 << 29) | ||
175 | |||
176 | #define BP_CSCMR1_PERCLK_PODF 0 | ||
177 | #define BM_CSCMR1_PERCLK_PODF (0x3f << 0) | ||
178 | #define BP_CSCMR1_SSI1_SEL 10 | ||
179 | #define BM_CSCMR1_SSI1_SEL (0x3 << 10) | ||
180 | #define BP_CSCMR1_SSI2_SEL 12 | ||
181 | #define BM_CSCMR1_SSI2_SEL (0x3 << 12) | ||
182 | #define BP_CSCMR1_SSI3_SEL 14 | ||
183 | #define BM_CSCMR1_SSI3_SEL (0x3 << 14) | ||
184 | #define BP_CSCMR1_USDHC1_SEL 16 | ||
185 | #define BM_CSCMR1_USDHC1_SEL (0x1 << 16) | ||
186 | #define BP_CSCMR1_USDHC2_SEL 17 | ||
187 | #define BM_CSCMR1_USDHC2_SEL (0x1 << 17) | ||
188 | #define BP_CSCMR1_USDHC3_SEL 18 | ||
189 | #define BM_CSCMR1_USDHC3_SEL (0x1 << 18) | ||
190 | #define BP_CSCMR1_USDHC4_SEL 19 | ||
191 | #define BM_CSCMR1_USDHC4_SEL (0x1 << 19) | ||
192 | #define BP_CSCMR1_EMI_PODF 20 | ||
193 | #define BM_CSCMR1_EMI_PODF (0x7 << 20) | ||
194 | #define BP_CSCMR1_EMI_SLOW_PODF 23 | ||
195 | #define BM_CSCMR1_EMI_SLOW_PODF (0x7 << 23) | ||
196 | #define BP_CSCMR1_EMI_SEL 27 | ||
197 | #define BM_CSCMR1_EMI_SEL (0x3 << 27) | ||
198 | #define BP_CSCMR1_EMI_SLOW_SEL 29 | ||
199 | #define BM_CSCMR1_EMI_SLOW_SEL (0x3 << 29) | ||
200 | |||
201 | #define BP_CSCMR2_CAN_PODF 2 | ||
202 | #define BM_CSCMR2_CAN_PODF (0x3f << 2) | ||
203 | #define BM_CSCMR2_LDB_DI0_IPU_DIV (0x1 << 10) | ||
204 | #define BM_CSCMR2_LDB_DI1_IPU_DIV (0x1 << 11) | ||
205 | #define BP_CSCMR2_ESAI_SEL 19 | ||
206 | #define BM_CSCMR2_ESAI_SEL (0x3 << 19) | ||
207 | |||
208 | #define BP_CSCDR1_UART_PODF 0 | ||
209 | #define BM_CSCDR1_UART_PODF (0x3f << 0) | ||
210 | #define BP_CSCDR1_USDHC1_PODF 11 | ||
211 | #define BM_CSCDR1_USDHC1_PODF (0x7 << 11) | ||
212 | #define BP_CSCDR1_USDHC2_PODF 16 | ||
213 | #define BM_CSCDR1_USDHC2_PODF (0x7 << 16) | ||
214 | #define BP_CSCDR1_USDHC3_PODF 19 | ||
215 | #define BM_CSCDR1_USDHC3_PODF (0x7 << 19) | ||
216 | #define BP_CSCDR1_USDHC4_PODF 22 | ||
217 | #define BM_CSCDR1_USDHC4_PODF (0x7 << 22) | ||
218 | #define BP_CSCDR1_VPU_AXI_PODF 25 | ||
219 | #define BM_CSCDR1_VPU_AXI_PODF (0x7 << 25) | ||
220 | |||
221 | #define BP_CS1CDR_SSI1_PODF 0 | ||
222 | #define BM_CS1CDR_SSI1_PODF (0x3f << 0) | ||
223 | #define BP_CS1CDR_SSI1_PRED 6 | ||
224 | #define BM_CS1CDR_SSI1_PRED (0x7 << 6) | ||
225 | #define BP_CS1CDR_ESAI_PRED 9 | ||
226 | #define BM_CS1CDR_ESAI_PRED (0x7 << 9) | ||
227 | #define BP_CS1CDR_SSI3_PODF 16 | ||
228 | #define BM_CS1CDR_SSI3_PODF (0x3f << 16) | ||
229 | #define BP_CS1CDR_SSI3_PRED 22 | ||
230 | #define BM_CS1CDR_SSI3_PRED (0x7 << 22) | ||
231 | #define BP_CS1CDR_ESAI_PODF 25 | ||
232 | #define BM_CS1CDR_ESAI_PODF (0x7 << 25) | ||
233 | |||
234 | #define BP_CS2CDR_SSI2_PODF 0 | ||
235 | #define BM_CS2CDR_SSI2_PODF (0x3f << 0) | ||
236 | #define BP_CS2CDR_SSI2_PRED 6 | ||
237 | #define BM_CS2CDR_SSI2_PRED (0x7 << 6) | ||
238 | #define BP_CS2CDR_LDB_DI0_SEL 9 | ||
239 | #define BM_CS2CDR_LDB_DI0_SEL (0x7 << 9) | ||
240 | #define BP_CS2CDR_LDB_DI1_SEL 12 | ||
241 | #define BM_CS2CDR_LDB_DI1_SEL (0x7 << 12) | ||
242 | #define BP_CS2CDR_ENFC_SEL 16 | ||
243 | #define BM_CS2CDR_ENFC_SEL (0x3 << 16) | ||
244 | #define BP_CS2CDR_ENFC_PRED 18 | ||
245 | #define BM_CS2CDR_ENFC_PRED (0x7 << 18) | ||
246 | #define BP_CS2CDR_ENFC_PODF 21 | ||
247 | #define BM_CS2CDR_ENFC_PODF (0x3f << 21) | ||
248 | |||
249 | #define BP_CDCDR_ASRC_SERIAL_SEL 7 | ||
250 | #define BM_CDCDR_ASRC_SERIAL_SEL (0x3 << 7) | ||
251 | #define BP_CDCDR_ASRC_SERIAL_PODF 9 | ||
252 | #define BM_CDCDR_ASRC_SERIAL_PODF (0x7 << 9) | ||
253 | #define BP_CDCDR_ASRC_SERIAL_PRED 12 | ||
254 | #define BM_CDCDR_ASRC_SERIAL_PRED (0x7 << 12) | ||
255 | #define BP_CDCDR_SPDIF_SEL 20 | ||
256 | #define BM_CDCDR_SPDIF_SEL (0x3 << 20) | ||
257 | #define BP_CDCDR_SPDIF_PODF 22 | ||
258 | #define BM_CDCDR_SPDIF_PODF (0x7 << 22) | ||
259 | #define BP_CDCDR_SPDIF_PRED 25 | ||
260 | #define BM_CDCDR_SPDIF_PRED (0x7 << 25) | ||
261 | #define BP_CDCDR_HSI_TX_PODF 29 | ||
262 | #define BM_CDCDR_HSI_TX_PODF (0x7 << 29) | ||
263 | #define BP_CDCDR_HSI_TX_SEL 28 | ||
264 | #define BM_CDCDR_HSI_TX_SEL (0x1 << 28) | ||
265 | |||
266 | #define BP_CHSCCDR_IPU1_DI0_SEL 0 | ||
267 | #define BM_CHSCCDR_IPU1_DI0_SEL (0x7 << 0) | ||
268 | #define BP_CHSCCDR_IPU1_DI0_PRE_PODF 3 | ||
269 | #define BM_CHSCCDR_IPU1_DI0_PRE_PODF (0x7 << 3) | ||
270 | #define BP_CHSCCDR_IPU1_DI0_PRE_SEL 6 | ||
271 | #define BM_CHSCCDR_IPU1_DI0_PRE_SEL (0x7 << 6) | ||
272 | #define BP_CHSCCDR_IPU1_DI1_SEL 9 | ||
273 | #define BM_CHSCCDR_IPU1_DI1_SEL (0x7 << 9) | ||
274 | #define BP_CHSCCDR_IPU1_DI1_PRE_PODF 12 | ||
275 | #define BM_CHSCCDR_IPU1_DI1_PRE_PODF (0x7 << 12) | ||
276 | #define BP_CHSCCDR_IPU1_DI1_PRE_SEL 15 | ||
277 | #define BM_CHSCCDR_IPU1_DI1_PRE_SEL (0x7 << 15) | ||
278 | |||
279 | #define BP_CSCDR2_IPU2_DI0_SEL 0 | ||
280 | #define BM_CSCDR2_IPU2_DI0_SEL (0x7) | ||
281 | #define BP_CSCDR2_IPU2_DI0_PRE_PODF 3 | ||
282 | #define BM_CSCDR2_IPU2_DI0_PRE_PODF (0x7 << 3) | ||
283 | #define BP_CSCDR2_IPU2_DI0_PRE_SEL 6 | ||
284 | #define BM_CSCDR2_IPU2_DI0_PRE_SEL (0x7 << 6) | ||
285 | #define BP_CSCDR2_IPU2_DI1_SEL 9 | ||
286 | #define BM_CSCDR2_IPU2_DI1_SEL (0x7 << 9) | ||
287 | #define BP_CSCDR2_IPU2_DI1_PRE_PODF 12 | ||
288 | #define BM_CSCDR2_IPU2_DI1_PRE_PODF (0x7 << 12) | ||
289 | #define BP_CSCDR2_IPU2_DI1_PRE_SEL 15 | ||
290 | #define BM_CSCDR2_IPU2_DI1_PRE_SEL (0x7 << 15) | ||
291 | #define BP_CSCDR2_ECSPI_CLK_PODF 19 | ||
292 | #define BM_CSCDR2_ECSPI_CLK_PODF (0x3f << 19) | ||
293 | |||
294 | #define BP_CSCDR3_IPU1_HSP_SEL 9 | ||
295 | #define BM_CSCDR3_IPU1_HSP_SEL (0x3 << 9) | ||
296 | #define BP_CSCDR3_IPU1_HSP_PODF 11 | ||
297 | #define BM_CSCDR3_IPU1_HSP_PODF (0x7 << 11) | ||
298 | #define BP_CSCDR3_IPU2_HSP_SEL 14 | ||
299 | #define BM_CSCDR3_IPU2_HSP_SEL (0x3 << 14) | ||
300 | #define BP_CSCDR3_IPU2_HSP_PODF 16 | ||
301 | #define BM_CSCDR3_IPU2_HSP_PODF (0x7 << 16) | ||
302 | |||
303 | #define BM_CDHIPR_AXI_PODF_BUSY (0x1 << 0) | ||
304 | #define BM_CDHIPR_AHB_PODF_BUSY (0x1 << 1) | ||
305 | #define BM_CDHIPR_MMDC_CH1_PODF_BUSY (0x1 << 2) | ||
306 | #define BM_CDHIPR_PERIPH2_SEL_BUSY (0x1 << 3) | ||
307 | #define BM_CDHIPR_MMDC_CH0_PODF_BUSY (0x1 << 4) | ||
308 | #define BM_CDHIPR_PERIPH_SEL_BUSY (0x1 << 5) | ||
309 | #define BM_CDHIPR_ARM_PODF_BUSY (0x1 << 16) | ||
310 | |||
311 | #define BP_CLPCR_LPM 0 | ||
312 | #define BM_CLPCR_LPM (0x3 << 0) | ||
313 | #define BM_CLPCR_BYPASS_PMIC_READY (0x1 << 2) | ||
314 | #define BM_CLPCR_ARM_CLK_DIS_ON_LPM (0x1 << 5) | ||
315 | #define BM_CLPCR_SBYOS (0x1 << 6) | ||
316 | #define BM_CLPCR_DIS_REF_OSC (0x1 << 7) | ||
317 | #define BM_CLPCR_VSTBY (0x1 << 8) | ||
318 | #define BP_CLPCR_STBY_COUNT 9 | ||
319 | #define BM_CLPCR_STBY_COUNT (0x3 << 9) | ||
320 | #define BM_CLPCR_COSC_PWRDOWN (0x1 << 11) | ||
321 | #define BM_CLPCR_WB_PER_AT_LPM (0x1 << 16) | ||
322 | #define BM_CLPCR_WB_CORE_AT_LPM (0x1 << 17) | ||
323 | #define BM_CLPCR_BYP_MMDC_CH0_LPM_HS (0x1 << 19) | ||
324 | #define BM_CLPCR_BYP_MMDC_CH1_LPM_HS (0x1 << 21) | ||
325 | #define BM_CLPCR_MASK_CORE0_WFI (0x1 << 22) | ||
326 | #define BM_CLPCR_MASK_CORE1_WFI (0x1 << 23) | ||
327 | #define BM_CLPCR_MASK_CORE2_WFI (0x1 << 24) | ||
328 | #define BM_CLPCR_MASK_CORE3_WFI (0x1 << 25) | ||
329 | #define BM_CLPCR_MASK_SCU_IDLE (0x1 << 26) | ||
330 | #define BM_CLPCR_MASK_L2CC_IDLE (0x1 << 27) | ||
331 | |||
332 | #define BP_CCOSR_CKO1_EN 7 | ||
333 | #define BP_CCOSR_CKO1_PODF 4 | ||
334 | #define BM_CCOSR_CKO1_PODF (0x7 << 4) | ||
335 | #define BP_CCOSR_CKO1_SEL 0 | ||
336 | #define BM_CCOSR_CKO1_SEL (0xf << 0) | ||
337 | |||
338 | #define FREQ_480M 480000000 | ||
339 | #define FREQ_528M 528000000 | ||
340 | #define FREQ_594M 594000000 | ||
341 | #define FREQ_650M 650000000 | ||
342 | #define FREQ_1300M 1300000000 | ||
343 | |||
344 | static struct clk pll1_sys; | ||
345 | static struct clk pll2_bus; | ||
346 | static struct clk pll3_usb_otg; | ||
347 | static struct clk pll4_audio; | ||
348 | static struct clk pll5_video; | ||
349 | static struct clk pll6_mlb; | ||
350 | static struct clk pll7_usb_host; | ||
351 | static struct clk pll8_enet; | ||
352 | static struct clk apbh_dma_clk; | ||
353 | static struct clk arm_clk; | ||
354 | static struct clk ipg_clk; | ||
355 | static struct clk ahb_clk; | ||
356 | static struct clk axi_clk; | ||
357 | static struct clk mmdc_ch0_axi_clk; | ||
358 | static struct clk mmdc_ch1_axi_clk; | ||
359 | static struct clk periph_clk; | ||
360 | static struct clk periph_pre_clk; | ||
361 | static struct clk periph_clk2_clk; | ||
362 | static struct clk periph2_clk; | ||
363 | static struct clk periph2_pre_clk; | ||
364 | static struct clk periph2_clk2_clk; | ||
365 | static struct clk gpu2d_core_clk; | ||
366 | static struct clk gpu3d_core_clk; | ||
367 | static struct clk gpu3d_shader_clk; | ||
368 | static struct clk ipg_perclk; | ||
369 | static struct clk emi_clk; | ||
370 | static struct clk emi_slow_clk; | ||
371 | static struct clk can1_clk; | ||
372 | static struct clk uart_clk; | ||
373 | static struct clk usdhc1_clk; | ||
374 | static struct clk usdhc2_clk; | ||
375 | static struct clk usdhc3_clk; | ||
376 | static struct clk usdhc4_clk; | ||
377 | static struct clk vpu_clk; | ||
378 | static struct clk hsi_tx_clk; | ||
379 | static struct clk ipu1_di0_pre_clk; | ||
380 | static struct clk ipu1_di1_pre_clk; | ||
381 | static struct clk ipu2_di0_pre_clk; | ||
382 | static struct clk ipu2_di1_pre_clk; | ||
383 | static struct clk ipu1_clk; | ||
384 | static struct clk ipu2_clk; | ||
385 | static struct clk ssi1_clk; | ||
386 | static struct clk ssi3_clk; | ||
387 | static struct clk esai_clk; | ||
388 | static struct clk ssi2_clk; | ||
389 | static struct clk spdif_clk; | ||
390 | static struct clk asrc_serial_clk; | ||
391 | static struct clk gpu2d_axi_clk; | ||
392 | static struct clk gpu3d_axi_clk; | ||
393 | static struct clk pcie_clk; | ||
394 | static struct clk vdo_axi_clk; | ||
395 | static struct clk ldb_di0_clk; | ||
396 | static struct clk ldb_di1_clk; | ||
397 | static struct clk ipu1_di0_clk; | ||
398 | static struct clk ipu1_di1_clk; | ||
399 | static struct clk ipu2_di0_clk; | ||
400 | static struct clk ipu2_di1_clk; | ||
401 | static struct clk enfc_clk; | ||
402 | static struct clk cko1_clk; | ||
403 | static struct clk dummy_clk = {}; | ||
404 | |||
405 | static unsigned long external_high_reference; | ||
406 | static unsigned long external_low_reference; | ||
407 | static unsigned long oscillator_reference; | ||
408 | |||
409 | static unsigned long get_oscillator_reference_clock_rate(struct clk *clk) | ||
410 | { | ||
411 | return oscillator_reference; | ||
412 | } | ||
413 | |||
414 | static unsigned long get_high_reference_clock_rate(struct clk *clk) | ||
415 | { | ||
416 | return external_high_reference; | ||
417 | } | ||
418 | |||
419 | static unsigned long get_low_reference_clock_rate(struct clk *clk) | ||
420 | { | ||
421 | return external_low_reference; | ||
422 | } | ||
423 | |||
424 | static struct clk ckil_clk = { | ||
425 | .get_rate = get_low_reference_clock_rate, | ||
426 | }; | ||
427 | |||
428 | static struct clk ckih_clk = { | ||
429 | .get_rate = get_high_reference_clock_rate, | ||
430 | }; | ||
431 | |||
432 | static struct clk osc_clk = { | ||
433 | .get_rate = get_oscillator_reference_clock_rate, | ||
434 | }; | ||
435 | |||
436 | static inline void __iomem *pll_get_reg_addr(struct clk *pll) | ||
437 | { | ||
438 | if (pll == &pll1_sys) | ||
439 | return PLL1_SYS; | ||
440 | else if (pll == &pll2_bus) | ||
441 | return PLL2_BUS; | ||
442 | else if (pll == &pll3_usb_otg) | ||
443 | return PLL3_USB_OTG; | ||
444 | else if (pll == &pll4_audio) | ||
445 | return PLL4_AUDIO; | ||
446 | else if (pll == &pll5_video) | ||
447 | return PLL5_VIDEO; | ||
448 | else if (pll == &pll6_mlb) | ||
449 | return PLL6_MLB; | ||
450 | else if (pll == &pll7_usb_host) | ||
451 | return PLL7_USB_HOST; | ||
452 | else if (pll == &pll8_enet) | ||
453 | return PLL8_ENET; | ||
454 | else | ||
455 | BUG(); | ||
456 | |||
457 | return NULL; | ||
458 | } | ||
459 | |||
460 | static int pll_enable(struct clk *clk) | ||
461 | { | ||
462 | int timeout = 0x100000; | ||
463 | void __iomem *reg; | ||
464 | u32 val; | ||
465 | |||
466 | reg = pll_get_reg_addr(clk); | ||
467 | val = readl_relaxed(reg); | ||
468 | val &= ~BM_PLL_BYPASS; | ||
469 | val &= ~BM_PLL_POWER_DOWN; | ||
470 | /* 480MHz PLLs have the opposite definition for power bit */ | ||
471 | if (clk == &pll3_usb_otg || clk == &pll7_usb_host) | ||
472 | val |= BM_PLL_POWER_DOWN; | ||
473 | writel_relaxed(val, reg); | ||
474 | |||
475 | /* Wait for PLL to lock */ | ||
476 | while (!(readl_relaxed(reg) & BM_PLL_LOCK) && --timeout) | ||
477 | cpu_relax(); | ||
478 | |||
479 | if (unlikely(!timeout)) | ||
480 | return -EBUSY; | ||
481 | |||
482 | /* Enable the PLL output now */ | ||
483 | val = readl_relaxed(reg); | ||
484 | val |= BM_PLL_ENABLE; | ||
485 | writel_relaxed(val, reg); | ||
486 | |||
487 | return 0; | ||
488 | } | ||
489 | |||
490 | static void pll_disable(struct clk *clk) | ||
491 | { | ||
492 | void __iomem *reg; | ||
493 | u32 val; | ||
494 | |||
495 | reg = pll_get_reg_addr(clk); | ||
496 | val = readl_relaxed(reg); | ||
497 | val &= ~BM_PLL_ENABLE; | ||
498 | val |= BM_PLL_BYPASS; | ||
499 | val |= BM_PLL_POWER_DOWN; | ||
500 | if (clk == &pll3_usb_otg || clk == &pll7_usb_host) | ||
501 | val &= ~BM_PLL_POWER_DOWN; | ||
502 | writel_relaxed(val, reg); | ||
503 | } | ||
504 | |||
505 | static unsigned long pll1_sys_get_rate(struct clk *clk) | ||
506 | { | ||
507 | u32 div = (readl_relaxed(PLL1_SYS) & BM_PLL_SYS_DIV_SELECT) >> | ||
508 | BP_PLL_SYS_DIV_SELECT; | ||
509 | |||
510 | return clk_get_rate(clk->parent) * div / 2; | ||
511 | } | ||
512 | |||
513 | static int pll1_sys_set_rate(struct clk *clk, unsigned long rate) | ||
514 | { | ||
515 | u32 val, div; | ||
516 | |||
517 | if (rate < FREQ_650M || rate > FREQ_1300M) | ||
518 | return -EINVAL; | ||
519 | |||
520 | div = rate * 2 / clk_get_rate(clk->parent); | ||
521 | val = readl_relaxed(PLL1_SYS); | ||
522 | val &= ~BM_PLL_SYS_DIV_SELECT; | ||
523 | val |= div << BP_PLL_SYS_DIV_SELECT; | ||
524 | writel_relaxed(val, PLL1_SYS); | ||
525 | |||
526 | return 0; | ||
527 | } | ||
528 | |||
529 | static unsigned long pll8_enet_get_rate(struct clk *clk) | ||
530 | { | ||
531 | u32 div = (readl_relaxed(PLL8_ENET) & BM_PLL_ENET_DIV_SELECT) >> | ||
532 | BP_PLL_ENET_DIV_SELECT; | ||
533 | |||
534 | switch (div) { | ||
535 | case 0: | ||
536 | return 25000000; | ||
537 | case 1: | ||
538 | return 50000000; | ||
539 | case 2: | ||
540 | return 100000000; | ||
541 | case 3: | ||
542 | return 125000000; | ||
543 | } | ||
544 | |||
545 | return 0; | ||
546 | } | ||
547 | |||
548 | static int pll8_enet_set_rate(struct clk *clk, unsigned long rate) | ||
549 | { | ||
550 | u32 val, div; | ||
551 | |||
552 | switch (rate) { | ||
553 | case 25000000: | ||
554 | div = 0; | ||
555 | break; | ||
556 | case 50000000: | ||
557 | div = 1; | ||
558 | break; | ||
559 | case 100000000: | ||
560 | div = 2; | ||
561 | break; | ||
562 | case 125000000: | ||
563 | div = 3; | ||
564 | break; | ||
565 | default: | ||
566 | return -EINVAL; | ||
567 | } | ||
568 | |||
569 | val = readl_relaxed(PLL8_ENET); | ||
570 | val &= ~BM_PLL_ENET_DIV_SELECT; | ||
571 | val |= div << BP_PLL_ENET_DIV_SELECT; | ||
572 | writel_relaxed(val, PLL8_ENET); | ||
573 | |||
574 | return 0; | ||
575 | } | ||
576 | |||
577 | static unsigned long pll_av_get_rate(struct clk *clk) | ||
578 | { | ||
579 | void __iomem *reg = (clk == &pll4_audio) ? PLL4_AUDIO : PLL5_VIDEO; | ||
580 | unsigned long parent_rate = clk_get_rate(clk->parent); | ||
581 | u32 mfn = readl_relaxed(reg + PLL_NUM_OFFSET); | ||
582 | u32 mfd = readl_relaxed(reg + PLL_DENOM_OFFSET); | ||
583 | u32 div = (readl_relaxed(reg) & BM_PLL_AV_DIV_SELECT) >> | ||
584 | BP_PLL_AV_DIV_SELECT; | ||
585 | |||
586 | return (parent_rate * div) + ((parent_rate / mfd) * mfn); | ||
587 | } | ||
588 | |||
589 | static int pll_av_set_rate(struct clk *clk, unsigned long rate) | ||
590 | { | ||
591 | void __iomem *reg = (clk == &pll4_audio) ? PLL4_AUDIO : PLL5_VIDEO; | ||
592 | unsigned int parent_rate = clk_get_rate(clk->parent); | ||
593 | u32 val, div; | ||
594 | u32 mfn, mfd = 1000000; | ||
595 | s64 temp64; | ||
596 | |||
597 | if (rate < FREQ_650M || rate > FREQ_1300M) | ||
598 | return -EINVAL; | ||
599 | |||
600 | div = rate / parent_rate; | ||
601 | temp64 = (u64) (rate - div * parent_rate); | ||
602 | temp64 *= mfd; | ||
603 | do_div(temp64, parent_rate); | ||
604 | mfn = temp64; | ||
605 | |||
606 | val = readl_relaxed(reg); | ||
607 | val &= ~BM_PLL_AV_DIV_SELECT; | ||
608 | val |= div << BP_PLL_AV_DIV_SELECT; | ||
609 | writel_relaxed(val, reg); | ||
610 | writel_relaxed(mfn, reg + PLL_NUM_OFFSET); | ||
611 | writel_relaxed(mfd, reg + PLL_DENOM_OFFSET); | ||
612 | |||
613 | return 0; | ||
614 | } | ||
615 | |||
616 | static void __iomem *pll_get_div_reg_bit(struct clk *clk, u32 *bp, u32 *bm) | ||
617 | { | ||
618 | void __iomem *reg; | ||
619 | |||
620 | if (clk == &pll2_bus) { | ||
621 | reg = PLL2_BUS; | ||
622 | *bp = BP_PLL_BUS_DIV_SELECT; | ||
623 | *bm = BM_PLL_BUS_DIV_SELECT; | ||
624 | } else if (clk == &pll3_usb_otg) { | ||
625 | reg = PLL3_USB_OTG; | ||
626 | *bp = BP_PLL_USB_DIV_SELECT; | ||
627 | *bm = BM_PLL_USB_DIV_SELECT; | ||
628 | } else if (clk == &pll7_usb_host) { | ||
629 | reg = PLL7_USB_HOST; | ||
630 | *bp = BP_PLL_USB_DIV_SELECT; | ||
631 | *bm = BM_PLL_USB_DIV_SELECT; | ||
632 | } else { | ||
633 | BUG(); | ||
634 | } | ||
635 | |||
636 | return reg; | ||
637 | } | ||
638 | |||
639 | static unsigned long pll_get_rate(struct clk *clk) | ||
640 | { | ||
641 | void __iomem *reg; | ||
642 | u32 div, bp, bm; | ||
643 | |||
644 | reg = pll_get_div_reg_bit(clk, &bp, &bm); | ||
645 | div = (readl_relaxed(reg) & bm) >> bp; | ||
646 | |||
647 | return (div == 1) ? clk_get_rate(clk->parent) * 22 : | ||
648 | clk_get_rate(clk->parent) * 20; | ||
649 | } | ||
650 | |||
651 | static int pll_set_rate(struct clk *clk, unsigned long rate) | ||
652 | { | ||
653 | void __iomem *reg; | ||
654 | u32 val, div, bp, bm; | ||
655 | |||
656 | if (rate == FREQ_528M) | ||
657 | div = 1; | ||
658 | else if (rate == FREQ_480M) | ||
659 | div = 0; | ||
660 | else | ||
661 | return -EINVAL; | ||
662 | |||
663 | reg = pll_get_div_reg_bit(clk, &bp, &bm); | ||
664 | val = readl_relaxed(reg); | ||
665 | val &= ~bm; | ||
666 | val |= div << bp; | ||
667 | writel_relaxed(val, reg); | ||
668 | |||
669 | return 0; | ||
670 | } | ||
671 | |||
672 | #define pll2_bus_get_rate pll_get_rate | ||
673 | #define pll2_bus_set_rate pll_set_rate | ||
674 | #define pll3_usb_otg_get_rate pll_get_rate | ||
675 | #define pll3_usb_otg_set_rate pll_set_rate | ||
676 | #define pll7_usb_host_get_rate pll_get_rate | ||
677 | #define pll7_usb_host_set_rate pll_set_rate | ||
678 | #define pll4_audio_get_rate pll_av_get_rate | ||
679 | #define pll4_audio_set_rate pll_av_set_rate | ||
680 | #define pll5_video_get_rate pll_av_get_rate | ||
681 | #define pll5_video_set_rate pll_av_set_rate | ||
682 | #define pll6_mlb_get_rate NULL | ||
683 | #define pll6_mlb_set_rate NULL | ||
684 | |||
685 | #define DEF_PLL(name) \ | ||
686 | static struct clk name = { \ | ||
687 | .enable = pll_enable, \ | ||
688 | .disable = pll_disable, \ | ||
689 | .get_rate = name##_get_rate, \ | ||
690 | .set_rate = name##_set_rate, \ | ||
691 | .parent = &osc_clk, \ | ||
692 | } | ||
693 | |||
694 | DEF_PLL(pll1_sys); | ||
695 | DEF_PLL(pll2_bus); | ||
696 | DEF_PLL(pll3_usb_otg); | ||
697 | DEF_PLL(pll4_audio); | ||
698 | DEF_PLL(pll5_video); | ||
699 | DEF_PLL(pll6_mlb); | ||
700 | DEF_PLL(pll7_usb_host); | ||
701 | DEF_PLL(pll8_enet); | ||
702 | |||
703 | static unsigned long pfd_get_rate(struct clk *clk) | ||
704 | { | ||
705 | u64 tmp = (u64) clk_get_rate(clk->parent) * 18; | ||
706 | u32 frac, bp_frac; | ||
707 | |||
708 | if (apbh_dma_clk.usecount == 0) | ||
709 | apbh_dma_clk.enable(&apbh_dma_clk); | ||
710 | |||
711 | bp_frac = clk->enable_shift - 7; | ||
712 | frac = readl_relaxed(clk->enable_reg) >> bp_frac & PFD_FRAC_MASK; | ||
713 | do_div(tmp, frac); | ||
714 | |||
715 | return tmp; | ||
716 | } | ||
717 | |||
718 | static int pfd_set_rate(struct clk *clk, unsigned long rate) | ||
719 | { | ||
720 | u32 val, frac, bp_frac; | ||
721 | u64 tmp = (u64) clk_get_rate(clk->parent) * 18; | ||
722 | |||
723 | if (apbh_dma_clk.usecount == 0) | ||
724 | apbh_dma_clk.enable(&apbh_dma_clk); | ||
725 | |||
726 | /* | ||
727 | * Round up the divider so that we don't set a rate | ||
728 | * higher than what is requested | ||
729 | */ | ||
730 | tmp += rate / 2; | ||
731 | do_div(tmp, rate); | ||
732 | frac = tmp; | ||
733 | frac = (frac < 12) ? 12 : frac; | ||
734 | frac = (frac > 35) ? 35 : frac; | ||
735 | |||
736 | /* | ||
737 | * The frac field always starts from 7 bits lower | ||
738 | * position of enable bit | ||
739 | */ | ||
740 | bp_frac = clk->enable_shift - 7; | ||
741 | val = readl_relaxed(clk->enable_reg); | ||
742 | val &= ~(PFD_FRAC_MASK << bp_frac); | ||
743 | val |= frac << bp_frac; | ||
744 | writel_relaxed(val, clk->enable_reg); | ||
745 | |||
746 | tmp = (u64) clk_get_rate(clk->parent) * 18; | ||
747 | do_div(tmp, frac); | ||
748 | |||
749 | if (apbh_dma_clk.usecount == 0) | ||
750 | apbh_dma_clk.disable(&apbh_dma_clk); | ||
751 | |||
752 | return 0; | ||
753 | } | ||
754 | |||
755 | static unsigned long pfd_round_rate(struct clk *clk, unsigned long rate) | ||
756 | { | ||
757 | u32 frac; | ||
758 | u64 tmp; | ||
759 | |||
760 | tmp = (u64) clk_get_rate(clk->parent) * 18; | ||
761 | tmp += rate / 2; | ||
762 | do_div(tmp, rate); | ||
763 | frac = tmp; | ||
764 | frac = (frac < 12) ? 12 : frac; | ||
765 | frac = (frac > 35) ? 35 : frac; | ||
766 | tmp = (u64) clk_get_rate(clk->parent) * 18; | ||
767 | do_div(tmp, frac); | ||
768 | |||
769 | return tmp; | ||
770 | } | ||
771 | |||
772 | static int pfd_enable(struct clk *clk) | ||
773 | { | ||
774 | u32 val; | ||
775 | |||
776 | if (apbh_dma_clk.usecount == 0) | ||
777 | apbh_dma_clk.enable(&apbh_dma_clk); | ||
778 | |||
779 | val = readl_relaxed(clk->enable_reg); | ||
780 | val &= ~(1 << clk->enable_shift); | ||
781 | writel_relaxed(val, clk->enable_reg); | ||
782 | |||
783 | if (apbh_dma_clk.usecount == 0) | ||
784 | apbh_dma_clk.disable(&apbh_dma_clk); | ||
785 | |||
786 | return 0; | ||
787 | } | ||
788 | |||
789 | static void pfd_disable(struct clk *clk) | ||
790 | { | ||
791 | u32 val; | ||
792 | |||
793 | if (apbh_dma_clk.usecount == 0) | ||
794 | apbh_dma_clk.enable(&apbh_dma_clk); | ||
795 | |||
796 | val = readl_relaxed(clk->enable_reg); | ||
797 | val |= 1 << clk->enable_shift; | ||
798 | writel_relaxed(val, clk->enable_reg); | ||
799 | |||
800 | if (apbh_dma_clk.usecount == 0) | ||
801 | apbh_dma_clk.disable(&apbh_dma_clk); | ||
802 | } | ||
803 | |||
804 | #define DEF_PFD(name, er, es, p) \ | ||
805 | static struct clk name = { \ | ||
806 | .enable_reg = er, \ | ||
807 | .enable_shift = es, \ | ||
808 | .enable = pfd_enable, \ | ||
809 | .disable = pfd_disable, \ | ||
810 | .get_rate = pfd_get_rate, \ | ||
811 | .set_rate = pfd_set_rate, \ | ||
812 | .round_rate = pfd_round_rate, \ | ||
813 | .parent = p, \ | ||
814 | } | ||
815 | |||
816 | DEF_PFD(pll2_pfd_352m, PFD_528, PFD0, &pll2_bus); | ||
817 | DEF_PFD(pll2_pfd_594m, PFD_528, PFD1, &pll2_bus); | ||
818 | DEF_PFD(pll2_pfd_400m, PFD_528, PFD2, &pll2_bus); | ||
819 | DEF_PFD(pll3_pfd_720m, PFD_480, PFD0, &pll3_usb_otg); | ||
820 | DEF_PFD(pll3_pfd_540m, PFD_480, PFD1, &pll3_usb_otg); | ||
821 | DEF_PFD(pll3_pfd_508m, PFD_480, PFD2, &pll3_usb_otg); | ||
822 | DEF_PFD(pll3_pfd_454m, PFD_480, PFD3, &pll3_usb_otg); | ||
823 | |||
824 | static unsigned long twd_clk_get_rate(struct clk *clk) | ||
825 | { | ||
826 | return clk_get_rate(clk->parent) / 2; | ||
827 | } | ||
828 | |||
829 | static struct clk twd_clk = { | ||
830 | .parent = &arm_clk, | ||
831 | .get_rate = twd_clk_get_rate, | ||
832 | }; | ||
833 | |||
834 | static unsigned long pll2_200m_get_rate(struct clk *clk) | ||
835 | { | ||
836 | return clk_get_rate(clk->parent) / 2; | ||
837 | } | ||
838 | |||
839 | static struct clk pll2_200m = { | ||
840 | .parent = &pll2_pfd_400m, | ||
841 | .get_rate = pll2_200m_get_rate, | ||
842 | }; | ||
843 | |||
844 | static unsigned long pll3_120m_get_rate(struct clk *clk) | ||
845 | { | ||
846 | return clk_get_rate(clk->parent) / 4; | ||
847 | } | ||
848 | |||
849 | static struct clk pll3_120m = { | ||
850 | .parent = &pll3_usb_otg, | ||
851 | .get_rate = pll3_120m_get_rate, | ||
852 | }; | ||
853 | |||
854 | static unsigned long pll3_80m_get_rate(struct clk *clk) | ||
855 | { | ||
856 | return clk_get_rate(clk->parent) / 6; | ||
857 | } | ||
858 | |||
859 | static struct clk pll3_80m = { | ||
860 | .parent = &pll3_usb_otg, | ||
861 | .get_rate = pll3_80m_get_rate, | ||
862 | }; | ||
863 | |||
864 | static unsigned long pll3_60m_get_rate(struct clk *clk) | ||
865 | { | ||
866 | return clk_get_rate(clk->parent) / 8; | ||
867 | } | ||
868 | |||
869 | static struct clk pll3_60m = { | ||
870 | .parent = &pll3_usb_otg, | ||
871 | .get_rate = pll3_60m_get_rate, | ||
872 | }; | ||
873 | |||
874 | static int pll1_sw_clk_set_parent(struct clk *clk, struct clk *parent) | ||
875 | { | ||
876 | u32 val = readl_relaxed(CCSR); | ||
877 | |||
878 | if (parent == &pll1_sys) { | ||
879 | val &= ~BM_CCSR_PLL1_SW_SEL; | ||
880 | val &= ~BM_CCSR_STEP_SEL; | ||
881 | } else if (parent == &osc_clk) { | ||
882 | val |= BM_CCSR_PLL1_SW_SEL; | ||
883 | val &= ~BM_CCSR_STEP_SEL; | ||
884 | } else if (parent == &pll2_pfd_400m) { | ||
885 | val |= BM_CCSR_PLL1_SW_SEL; | ||
886 | val |= BM_CCSR_STEP_SEL; | ||
887 | } else { | ||
888 | return -EINVAL; | ||
889 | } | ||
890 | |||
891 | writel_relaxed(val, CCSR); | ||
892 | |||
893 | return 0; | ||
894 | } | ||
895 | |||
896 | static struct clk pll1_sw_clk = { | ||
897 | .parent = &pll1_sys, | ||
898 | .set_parent = pll1_sw_clk_set_parent, | ||
899 | }; | ||
900 | |||
901 | static void calc_pred_podf_dividers(u32 div, u32 *pred, u32 *podf) | ||
902 | { | ||
903 | u32 min_pred, temp_pred, old_err, err; | ||
904 | |||
905 | if (div >= 512) { | ||
906 | *pred = 8; | ||
907 | *podf = 64; | ||
908 | } else if (div >= 8) { | ||
909 | min_pred = (div - 1) / 64 + 1; | ||
910 | old_err = 8; | ||
911 | for (temp_pred = 8; temp_pred >= min_pred; temp_pred--) { | ||
912 | err = div % temp_pred; | ||
913 | if (err == 0) { | ||
914 | *pred = temp_pred; | ||
915 | break; | ||
916 | } | ||
917 | err = temp_pred - err; | ||
918 | if (err < old_err) { | ||
919 | old_err = err; | ||
920 | *pred = temp_pred; | ||
921 | } | ||
922 | } | ||
923 | *podf = (div + *pred - 1) / *pred; | ||
924 | } else if (div < 8) { | ||
925 | *pred = div; | ||
926 | *podf = 1; | ||
927 | } | ||
928 | } | ||
929 | |||
930 | static int _clk_enable(struct clk *clk) | ||
931 | { | ||
932 | u32 reg; | ||
933 | reg = readl_relaxed(clk->enable_reg); | ||
934 | reg |= 0x3 << clk->enable_shift; | ||
935 | writel_relaxed(reg, clk->enable_reg); | ||
936 | |||
937 | return 0; | ||
938 | } | ||
939 | |||
940 | static void _clk_disable(struct clk *clk) | ||
941 | { | ||
942 | u32 reg; | ||
943 | reg = readl_relaxed(clk->enable_reg); | ||
944 | reg &= ~(0x3 << clk->enable_shift); | ||
945 | writel_relaxed(reg, clk->enable_reg); | ||
946 | } | ||
947 | |||
948 | static int _clk_enable_1b(struct clk *clk) | ||
949 | { | ||
950 | u32 reg; | ||
951 | reg = readl_relaxed(clk->enable_reg); | ||
952 | reg |= 0x1 << clk->enable_shift; | ||
953 | writel_relaxed(reg, clk->enable_reg); | ||
954 | |||
955 | return 0; | ||
956 | } | ||
957 | |||
958 | static void _clk_disable_1b(struct clk *clk) | ||
959 | { | ||
960 | u32 reg; | ||
961 | reg = readl_relaxed(clk->enable_reg); | ||
962 | reg &= ~(0x1 << clk->enable_shift); | ||
963 | writel_relaxed(reg, clk->enable_reg); | ||
964 | } | ||
965 | |||
966 | struct divider { | ||
967 | struct clk *clk; | ||
968 | void __iomem *reg; | ||
969 | u32 bp_pred; | ||
970 | u32 bm_pred; | ||
971 | u32 bp_podf; | ||
972 | u32 bm_podf; | ||
973 | }; | ||
974 | |||
975 | #define DEF_CLK_DIV1(d, c, r, b) \ | ||
976 | static struct divider d = { \ | ||
977 | .clk = c, \ | ||
978 | .reg = r, \ | ||
979 | .bp_podf = BP_##r##_##b##_PODF, \ | ||
980 | .bm_podf = BM_##r##_##b##_PODF, \ | ||
981 | } | ||
982 | |||
983 | DEF_CLK_DIV1(arm_div, &arm_clk, CACRR, ARM); | ||
984 | DEF_CLK_DIV1(ipg_div, &ipg_clk, CBCDR, IPG); | ||
985 | DEF_CLK_DIV1(ahb_div, &ahb_clk, CBCDR, AHB); | ||
986 | DEF_CLK_DIV1(axi_div, &axi_clk, CBCDR, AXI); | ||
987 | DEF_CLK_DIV1(mmdc_ch0_axi_div, &mmdc_ch0_axi_clk, CBCDR, MMDC_CH0_AXI); | ||
988 | DEF_CLK_DIV1(mmdc_ch1_axi_div, &mmdc_ch1_axi_clk, CBCDR, MMDC_CH1_AXI); | ||
989 | DEF_CLK_DIV1(periph_clk2_div, &periph_clk2_clk, CBCDR, PERIPH_CLK2); | ||
990 | DEF_CLK_DIV1(periph2_clk2_div, &periph2_clk2_clk, CBCDR, PERIPH2_CLK2); | ||
991 | DEF_CLK_DIV1(gpu2d_core_div, &gpu2d_core_clk, CBCMR, GPU2D_CORE); | ||
992 | DEF_CLK_DIV1(gpu3d_core_div, &gpu3d_core_clk, CBCMR, GPU3D_CORE); | ||
993 | DEF_CLK_DIV1(gpu3d_shader_div, &gpu3d_shader_clk, CBCMR, GPU3D_SHADER); | ||
994 | DEF_CLK_DIV1(ipg_perclk_div, &ipg_perclk, CSCMR1, PERCLK); | ||
995 | DEF_CLK_DIV1(emi_div, &emi_clk, CSCMR1, EMI); | ||
996 | DEF_CLK_DIV1(emi_slow_div, &emi_slow_clk, CSCMR1, EMI_SLOW); | ||
997 | DEF_CLK_DIV1(can_div, &can1_clk, CSCMR2, CAN); | ||
998 | DEF_CLK_DIV1(uart_div, &uart_clk, CSCDR1, UART); | ||
999 | DEF_CLK_DIV1(usdhc1_div, &usdhc1_clk, CSCDR1, USDHC1); | ||
1000 | DEF_CLK_DIV1(usdhc2_div, &usdhc2_clk, CSCDR1, USDHC2); | ||
1001 | DEF_CLK_DIV1(usdhc3_div, &usdhc3_clk, CSCDR1, USDHC3); | ||
1002 | DEF_CLK_DIV1(usdhc4_div, &usdhc4_clk, CSCDR1, USDHC4); | ||
1003 | DEF_CLK_DIV1(vpu_div, &vpu_clk, CSCDR1, VPU_AXI); | ||
1004 | DEF_CLK_DIV1(hsi_tx_div, &hsi_tx_clk, CDCDR, HSI_TX); | ||
1005 | DEF_CLK_DIV1(ipu1_di0_pre_div, &ipu1_di0_pre_clk, CHSCCDR, IPU1_DI0_PRE); | ||
1006 | DEF_CLK_DIV1(ipu1_di1_pre_div, &ipu1_di1_pre_clk, CHSCCDR, IPU1_DI1_PRE); | ||
1007 | DEF_CLK_DIV1(ipu2_di0_pre_div, &ipu2_di0_pre_clk, CSCDR2, IPU2_DI0_PRE); | ||
1008 | DEF_CLK_DIV1(ipu2_di1_pre_div, &ipu2_di1_pre_clk, CSCDR2, IPU2_DI1_PRE); | ||
1009 | DEF_CLK_DIV1(ipu1_div, &ipu1_clk, CSCDR3, IPU1_HSP); | ||
1010 | DEF_CLK_DIV1(ipu2_div, &ipu2_clk, CSCDR3, IPU2_HSP); | ||
1011 | DEF_CLK_DIV1(cko1_div, &cko1_clk, CCOSR, CKO1); | ||
1012 | |||
1013 | #define DEF_CLK_DIV2(d, c, r, b) \ | ||
1014 | static struct divider d = { \ | ||
1015 | .clk = c, \ | ||
1016 | .reg = r, \ | ||
1017 | .bp_pred = BP_##r##_##b##_PRED, \ | ||
1018 | .bm_pred = BM_##r##_##b##_PRED, \ | ||
1019 | .bp_podf = BP_##r##_##b##_PODF, \ | ||
1020 | .bm_podf = BM_##r##_##b##_PODF, \ | ||
1021 | } | ||
1022 | |||
1023 | DEF_CLK_DIV2(ssi1_div, &ssi1_clk, CS1CDR, SSI1); | ||
1024 | DEF_CLK_DIV2(ssi3_div, &ssi3_clk, CS1CDR, SSI3); | ||
1025 | DEF_CLK_DIV2(esai_div, &esai_clk, CS1CDR, ESAI); | ||
1026 | DEF_CLK_DIV2(ssi2_div, &ssi2_clk, CS2CDR, SSI2); | ||
1027 | DEF_CLK_DIV2(enfc_div, &enfc_clk, CS2CDR, ENFC); | ||
1028 | DEF_CLK_DIV2(spdif_div, &spdif_clk, CDCDR, SPDIF); | ||
1029 | DEF_CLK_DIV2(asrc_serial_div, &asrc_serial_clk, CDCDR, ASRC_SERIAL); | ||
1030 | |||
1031 | static struct divider *dividers[] = { | ||
1032 | &arm_div, | ||
1033 | &ipg_div, | ||
1034 | &ahb_div, | ||
1035 | &axi_div, | ||
1036 | &mmdc_ch0_axi_div, | ||
1037 | &mmdc_ch1_axi_div, | ||
1038 | &periph_clk2_div, | ||
1039 | &periph2_clk2_div, | ||
1040 | &gpu2d_core_div, | ||
1041 | &gpu3d_core_div, | ||
1042 | &gpu3d_shader_div, | ||
1043 | &ipg_perclk_div, | ||
1044 | &emi_div, | ||
1045 | &emi_slow_div, | ||
1046 | &can_div, | ||
1047 | &uart_div, | ||
1048 | &usdhc1_div, | ||
1049 | &usdhc2_div, | ||
1050 | &usdhc3_div, | ||
1051 | &usdhc4_div, | ||
1052 | &vpu_div, | ||
1053 | &hsi_tx_div, | ||
1054 | &ipu1_di0_pre_div, | ||
1055 | &ipu1_di1_pre_div, | ||
1056 | &ipu2_di0_pre_div, | ||
1057 | &ipu2_di1_pre_div, | ||
1058 | &ipu1_div, | ||
1059 | &ipu2_div, | ||
1060 | &ssi1_div, | ||
1061 | &ssi3_div, | ||
1062 | &esai_div, | ||
1063 | &ssi2_div, | ||
1064 | &enfc_div, | ||
1065 | &spdif_div, | ||
1066 | &asrc_serial_div, | ||
1067 | &cko1_div, | ||
1068 | }; | ||
1069 | |||
1070 | static unsigned long ldb_di_clk_get_rate(struct clk *clk) | ||
1071 | { | ||
1072 | u32 val = readl_relaxed(CSCMR2); | ||
1073 | |||
1074 | val &= (clk == &ldb_di0_clk) ? BM_CSCMR2_LDB_DI0_IPU_DIV : | ||
1075 | BM_CSCMR2_LDB_DI1_IPU_DIV; | ||
1076 | if (val) | ||
1077 | return clk_get_rate(clk->parent) / 7; | ||
1078 | else | ||
1079 | return clk_get_rate(clk->parent) * 2 / 7; | ||
1080 | } | ||
1081 | |||
1082 | static int ldb_di_clk_set_rate(struct clk *clk, unsigned long rate) | ||
1083 | { | ||
1084 | unsigned long parent_rate = clk_get_rate(clk->parent); | ||
1085 | u32 val = readl_relaxed(CSCMR2); | ||
1086 | |||
1087 | if (rate * 7 <= parent_rate + parent_rate / 20) | ||
1088 | val |= BM_CSCMR2_LDB_DI0_IPU_DIV; | ||
1089 | else | ||
1090 | val &= ~BM_CSCMR2_LDB_DI0_IPU_DIV; | ||
1091 | |||
1092 | writel_relaxed(val, CSCMR2); | ||
1093 | |||
1094 | return 0; | ||
1095 | } | ||
1096 | |||
1097 | static unsigned long ldb_di_clk_round_rate(struct clk *clk, unsigned long rate) | ||
1098 | { | ||
1099 | unsigned long parent_rate = clk_get_rate(clk->parent); | ||
1100 | |||
1101 | if (rate * 7 <= parent_rate + parent_rate / 20) | ||
1102 | return parent_rate / 7; | ||
1103 | else | ||
1104 | return 2 * parent_rate / 7; | ||
1105 | } | ||
1106 | |||
1107 | static unsigned long _clk_get_rate(struct clk *clk) | ||
1108 | { | ||
1109 | struct divider *d; | ||
1110 | u32 val, pred, podf; | ||
1111 | int i, num; | ||
1112 | |||
1113 | if (clk == &ldb_di0_clk || clk == &ldb_di1_clk) | ||
1114 | return ldb_di_clk_get_rate(clk); | ||
1115 | |||
1116 | num = ARRAY_SIZE(dividers); | ||
1117 | for (i = 0; i < num; i++) | ||
1118 | if (dividers[i]->clk == clk) { | ||
1119 | d = dividers[i]; | ||
1120 | break; | ||
1121 | } | ||
1122 | if (i == num) | ||
1123 | return clk_get_rate(clk->parent); | ||
1124 | |||
1125 | val = readl_relaxed(d->reg); | ||
1126 | pred = ((val & d->bm_pred) >> d->bp_pred) + 1; | ||
1127 | podf = ((val & d->bm_podf) >> d->bp_podf) + 1; | ||
1128 | |||
1129 | return clk_get_rate(clk->parent) / (pred * podf); | ||
1130 | } | ||
1131 | |||
1132 | static int clk_busy_wait(struct clk *clk) | ||
1133 | { | ||
1134 | int timeout = 0x100000; | ||
1135 | u32 bm; | ||
1136 | |||
1137 | if (clk == &axi_clk) | ||
1138 | bm = BM_CDHIPR_AXI_PODF_BUSY; | ||
1139 | else if (clk == &ahb_clk) | ||
1140 | bm = BM_CDHIPR_AHB_PODF_BUSY; | ||
1141 | else if (clk == &mmdc_ch0_axi_clk) | ||
1142 | bm = BM_CDHIPR_MMDC_CH0_PODF_BUSY; | ||
1143 | else if (clk == &periph_clk) | ||
1144 | bm = BM_CDHIPR_PERIPH_SEL_BUSY; | ||
1145 | else if (clk == &arm_clk) | ||
1146 | bm = BM_CDHIPR_ARM_PODF_BUSY; | ||
1147 | else | ||
1148 | return -EINVAL; | ||
1149 | |||
1150 | while ((readl_relaxed(CDHIPR) & bm) && --timeout) | ||
1151 | cpu_relax(); | ||
1152 | |||
1153 | if (unlikely(!timeout)) | ||
1154 | return -EBUSY; | ||
1155 | |||
1156 | return 0; | ||
1157 | } | ||
1158 | |||
1159 | static int _clk_set_rate(struct clk *clk, unsigned long rate) | ||
1160 | { | ||
1161 | unsigned long parent_rate = clk_get_rate(clk->parent); | ||
1162 | struct divider *d; | ||
1163 | u32 val, div, max_div, pred = 0, podf; | ||
1164 | int i, num; | ||
1165 | |||
1166 | if (clk == &ldb_di0_clk || clk == &ldb_di1_clk) | ||
1167 | return ldb_di_clk_set_rate(clk, rate); | ||
1168 | |||
1169 | num = ARRAY_SIZE(dividers); | ||
1170 | for (i = 0; i < num; i++) | ||
1171 | if (dividers[i]->clk == clk) { | ||
1172 | d = dividers[i]; | ||
1173 | break; | ||
1174 | } | ||
1175 | if (i == num) | ||
1176 | return -EINVAL; | ||
1177 | |||
1178 | max_div = ((d->bm_pred >> d->bp_pred) + 1) * | ||
1179 | ((d->bm_podf >> d->bp_podf) + 1); | ||
1180 | |||
1181 | div = parent_rate / rate; | ||
1182 | if (div == 0) | ||
1183 | div++; | ||
1184 | |||
1185 | if ((parent_rate / div != rate) || div > max_div) | ||
1186 | return -EINVAL; | ||
1187 | |||
1188 | if (d->bm_pred) { | ||
1189 | calc_pred_podf_dividers(div, &pred, &podf); | ||
1190 | } else { | ||
1191 | pred = 1; | ||
1192 | podf = div; | ||
1193 | } | ||
1194 | |||
1195 | val = readl_relaxed(d->reg); | ||
1196 | val &= ~(d->bm_pred | d->bm_podf); | ||
1197 | val |= (pred - 1) << d->bp_pred | (podf - 1) << d->bp_podf; | ||
1198 | writel_relaxed(val, d->reg); | ||
1199 | |||
1200 | if (clk == &axi_clk || clk == &ahb_clk || | ||
1201 | clk == &mmdc_ch0_axi_clk || clk == &arm_clk) | ||
1202 | return clk_busy_wait(clk); | ||
1203 | |||
1204 | return 0; | ||
1205 | } | ||
1206 | |||
1207 | static unsigned long _clk_round_rate(struct clk *clk, unsigned long rate) | ||
1208 | { | ||
1209 | unsigned long parent_rate = clk_get_rate(clk->parent); | ||
1210 | u32 div = parent_rate / rate; | ||
1211 | u32 div_max, pred = 0, podf; | ||
1212 | struct divider *d; | ||
1213 | int i, num; | ||
1214 | |||
1215 | if (clk == &ldb_di0_clk || clk == &ldb_di1_clk) | ||
1216 | return ldb_di_clk_round_rate(clk, rate); | ||
1217 | |||
1218 | num = ARRAY_SIZE(dividers); | ||
1219 | for (i = 0; i < num; i++) | ||
1220 | if (dividers[i]->clk == clk) { | ||
1221 | d = dividers[i]; | ||
1222 | break; | ||
1223 | } | ||
1224 | if (i == num) | ||
1225 | return -EINVAL; | ||
1226 | |||
1227 | if (div == 0 || parent_rate % rate) | ||
1228 | div++; | ||
1229 | |||
1230 | if (d->bm_pred) { | ||
1231 | calc_pred_podf_dividers(div, &pred, &podf); | ||
1232 | div = pred * podf; | ||
1233 | } else { | ||
1234 | div_max = (d->bm_podf >> d->bp_podf) + 1; | ||
1235 | if (div > div_max) | ||
1236 | div = div_max; | ||
1237 | } | ||
1238 | |||
1239 | return parent_rate / div; | ||
1240 | } | ||
1241 | |||
1242 | struct multiplexer { | ||
1243 | struct clk *clk; | ||
1244 | void __iomem *reg; | ||
1245 | u32 bp; | ||
1246 | u32 bm; | ||
1247 | int pnum; | ||
1248 | struct clk *parents[]; | ||
1249 | }; | ||
1250 | |||
1251 | static struct multiplexer axi_mux = { | ||
1252 | .clk = &axi_clk, | ||
1253 | .reg = CBCDR, | ||
1254 | .bp = BP_CBCDR_AXI_SEL, | ||
1255 | .bm = BM_CBCDR_AXI_SEL, | ||
1256 | .parents = { | ||
1257 | &periph_clk, | ||
1258 | &pll2_pfd_400m, | ||
1259 | &pll3_pfd_540m, | ||
1260 | NULL | ||
1261 | }, | ||
1262 | }; | ||
1263 | |||
1264 | static struct multiplexer periph_mux = { | ||
1265 | .clk = &periph_clk, | ||
1266 | .reg = CBCDR, | ||
1267 | .bp = BP_CBCDR_PERIPH_CLK_SEL, | ||
1268 | .bm = BM_CBCDR_PERIPH_CLK_SEL, | ||
1269 | .parents = { | ||
1270 | &periph_pre_clk, | ||
1271 | &periph_clk2_clk, | ||
1272 | NULL | ||
1273 | }, | ||
1274 | }; | ||
1275 | |||
1276 | static struct multiplexer periph_pre_mux = { | ||
1277 | .clk = &periph_pre_clk, | ||
1278 | .reg = CBCMR, | ||
1279 | .bp = BP_CBCMR_PRE_PERIPH_CLK_SEL, | ||
1280 | .bm = BM_CBCMR_PRE_PERIPH_CLK_SEL, | ||
1281 | .parents = { | ||
1282 | &pll2_bus, | ||
1283 | &pll2_pfd_400m, | ||
1284 | &pll2_pfd_352m, | ||
1285 | &pll2_200m, | ||
1286 | NULL | ||
1287 | }, | ||
1288 | }; | ||
1289 | |||
1290 | static struct multiplexer periph_clk2_mux = { | ||
1291 | .clk = &periph_clk2_clk, | ||
1292 | .reg = CBCMR, | ||
1293 | .bp = BP_CBCMR_PERIPH_CLK2_SEL, | ||
1294 | .bm = BM_CBCMR_PERIPH_CLK2_SEL, | ||
1295 | .parents = { | ||
1296 | &pll3_usb_otg, | ||
1297 | &osc_clk, | ||
1298 | NULL | ||
1299 | }, | ||
1300 | }; | ||
1301 | |||
1302 | static struct multiplexer periph2_mux = { | ||
1303 | .clk = &periph2_clk, | ||
1304 | .reg = CBCDR, | ||
1305 | .bp = BP_CBCDR_PERIPH2_CLK_SEL, | ||
1306 | .bm = BM_CBCDR_PERIPH2_CLK_SEL, | ||
1307 | .parents = { | ||
1308 | &periph2_pre_clk, | ||
1309 | &periph2_clk2_clk, | ||
1310 | NULL | ||
1311 | }, | ||
1312 | }; | ||
1313 | |||
1314 | static struct multiplexer periph2_pre_mux = { | ||
1315 | .clk = &periph2_pre_clk, | ||
1316 | .reg = CBCMR, | ||
1317 | .bp = BP_CBCMR_PRE_PERIPH2_CLK_SEL, | ||
1318 | .bm = BM_CBCMR_PRE_PERIPH2_CLK_SEL, | ||
1319 | .parents = { | ||
1320 | &pll2_bus, | ||
1321 | &pll2_pfd_400m, | ||
1322 | &pll2_pfd_352m, | ||
1323 | &pll2_200m, | ||
1324 | NULL | ||
1325 | }, | ||
1326 | }; | ||
1327 | |||
1328 | static struct multiplexer periph2_clk2_mux = { | ||
1329 | .clk = &periph2_clk2_clk, | ||
1330 | .reg = CBCMR, | ||
1331 | .bp = BP_CBCMR_PERIPH2_CLK2_SEL, | ||
1332 | .bm = BM_CBCMR_PERIPH2_CLK2_SEL, | ||
1333 | .parents = { | ||
1334 | &pll3_usb_otg, | ||
1335 | &osc_clk, | ||
1336 | NULL | ||
1337 | }, | ||
1338 | }; | ||
1339 | |||
1340 | static struct multiplexer gpu2d_axi_mux = { | ||
1341 | .clk = &gpu2d_axi_clk, | ||
1342 | .reg = CBCMR, | ||
1343 | .bp = BP_CBCMR_GPU2D_AXI_SEL, | ||
1344 | .bm = BM_CBCMR_GPU2D_AXI_SEL, | ||
1345 | .parents = { | ||
1346 | &axi_clk, | ||
1347 | &ahb_clk, | ||
1348 | NULL | ||
1349 | }, | ||
1350 | }; | ||
1351 | |||
1352 | static struct multiplexer gpu3d_axi_mux = { | ||
1353 | .clk = &gpu3d_axi_clk, | ||
1354 | .reg = CBCMR, | ||
1355 | .bp = BP_CBCMR_GPU3D_AXI_SEL, | ||
1356 | .bm = BM_CBCMR_GPU3D_AXI_SEL, | ||
1357 | .parents = { | ||
1358 | &axi_clk, | ||
1359 | &ahb_clk, | ||
1360 | NULL | ||
1361 | }, | ||
1362 | }; | ||
1363 | |||
1364 | static struct multiplexer gpu3d_core_mux = { | ||
1365 | .clk = &gpu3d_core_clk, | ||
1366 | .reg = CBCMR, | ||
1367 | .bp = BP_CBCMR_GPU3D_CORE_SEL, | ||
1368 | .bm = BM_CBCMR_GPU3D_CORE_SEL, | ||
1369 | .parents = { | ||
1370 | &mmdc_ch0_axi_clk, | ||
1371 | &pll3_usb_otg, | ||
1372 | &pll2_pfd_594m, | ||
1373 | &pll2_pfd_400m, | ||
1374 | NULL | ||
1375 | }, | ||
1376 | }; | ||
1377 | |||
1378 | static struct multiplexer gpu3d_shader_mux = { | ||
1379 | .clk = &gpu3d_shader_clk, | ||
1380 | .reg = CBCMR, | ||
1381 | .bp = BP_CBCMR_GPU3D_SHADER_SEL, | ||
1382 | .bm = BM_CBCMR_GPU3D_SHADER_SEL, | ||
1383 | .parents = { | ||
1384 | &mmdc_ch0_axi_clk, | ||
1385 | &pll3_usb_otg, | ||
1386 | &pll2_pfd_594m, | ||
1387 | &pll3_pfd_720m, | ||
1388 | NULL | ||
1389 | }, | ||
1390 | }; | ||
1391 | |||
1392 | static struct multiplexer pcie_axi_mux = { | ||
1393 | .clk = &pcie_clk, | ||
1394 | .reg = CBCMR, | ||
1395 | .bp = BP_CBCMR_PCIE_AXI_SEL, | ||
1396 | .bm = BM_CBCMR_PCIE_AXI_SEL, | ||
1397 | .parents = { | ||
1398 | &axi_clk, | ||
1399 | &ahb_clk, | ||
1400 | NULL | ||
1401 | }, | ||
1402 | }; | ||
1403 | |||
1404 | static struct multiplexer vdo_axi_mux = { | ||
1405 | .clk = &vdo_axi_clk, | ||
1406 | .reg = CBCMR, | ||
1407 | .bp = BP_CBCMR_VDO_AXI_SEL, | ||
1408 | .bm = BM_CBCMR_VDO_AXI_SEL, | ||
1409 | .parents = { | ||
1410 | &axi_clk, | ||
1411 | &ahb_clk, | ||
1412 | NULL | ||
1413 | }, | ||
1414 | }; | ||
1415 | |||
1416 | static struct multiplexer vpu_axi_mux = { | ||
1417 | .clk = &vpu_clk, | ||
1418 | .reg = CBCMR, | ||
1419 | .bp = BP_CBCMR_VPU_AXI_SEL, | ||
1420 | .bm = BM_CBCMR_VPU_AXI_SEL, | ||
1421 | .parents = { | ||
1422 | &axi_clk, | ||
1423 | &pll2_pfd_400m, | ||
1424 | &pll2_pfd_352m, | ||
1425 | NULL | ||
1426 | }, | ||
1427 | }; | ||
1428 | |||
1429 | static struct multiplexer gpu2d_core_mux = { | ||
1430 | .clk = &gpu2d_core_clk, | ||
1431 | .reg = CBCMR, | ||
1432 | .bp = BP_CBCMR_GPU2D_CORE_SEL, | ||
1433 | .bm = BM_CBCMR_GPU2D_CORE_SEL, | ||
1434 | .parents = { | ||
1435 | &axi_clk, | ||
1436 | &pll3_usb_otg, | ||
1437 | &pll2_pfd_352m, | ||
1438 | &pll2_pfd_400m, | ||
1439 | NULL | ||
1440 | }, | ||
1441 | }; | ||
1442 | |||
1443 | #define DEF_SSI_MUX(id) \ | ||
1444 | static struct multiplexer ssi##id##_mux = { \ | ||
1445 | .clk = &ssi##id##_clk, \ | ||
1446 | .reg = CSCMR1, \ | ||
1447 | .bp = BP_CSCMR1_SSI##id##_SEL, \ | ||
1448 | .bm = BM_CSCMR1_SSI##id##_SEL, \ | ||
1449 | .parents = { \ | ||
1450 | &pll3_pfd_508m, \ | ||
1451 | &pll3_pfd_454m, \ | ||
1452 | &pll4_audio, \ | ||
1453 | NULL \ | ||
1454 | }, \ | ||
1455 | } | ||
1456 | |||
1457 | DEF_SSI_MUX(1); | ||
1458 | DEF_SSI_MUX(2); | ||
1459 | DEF_SSI_MUX(3); | ||
1460 | |||
1461 | #define DEF_USDHC_MUX(id) \ | ||
1462 | static struct multiplexer usdhc##id##_mux = { \ | ||
1463 | .clk = &usdhc##id##_clk, \ | ||
1464 | .reg = CSCMR1, \ | ||
1465 | .bp = BP_CSCMR1_USDHC##id##_SEL, \ | ||
1466 | .bm = BM_CSCMR1_USDHC##id##_SEL, \ | ||
1467 | .parents = { \ | ||
1468 | &pll2_pfd_400m, \ | ||
1469 | &pll2_pfd_352m, \ | ||
1470 | NULL \ | ||
1471 | }, \ | ||
1472 | } | ||
1473 | |||
1474 | DEF_USDHC_MUX(1); | ||
1475 | DEF_USDHC_MUX(2); | ||
1476 | DEF_USDHC_MUX(3); | ||
1477 | DEF_USDHC_MUX(4); | ||
1478 | |||
1479 | static struct multiplexer emi_mux = { | ||
1480 | .clk = &emi_clk, | ||
1481 | .reg = CSCMR1, | ||
1482 | .bp = BP_CSCMR1_EMI_SEL, | ||
1483 | .bm = BM_CSCMR1_EMI_SEL, | ||
1484 | .parents = { | ||
1485 | &axi_clk, | ||
1486 | &pll3_usb_otg, | ||
1487 | &pll2_pfd_400m, | ||
1488 | &pll2_pfd_352m, | ||
1489 | NULL | ||
1490 | }, | ||
1491 | }; | ||
1492 | |||
1493 | static struct multiplexer emi_slow_mux = { | ||
1494 | .clk = &emi_slow_clk, | ||
1495 | .reg = CSCMR1, | ||
1496 | .bp = BP_CSCMR1_EMI_SLOW_SEL, | ||
1497 | .bm = BM_CSCMR1_EMI_SLOW_SEL, | ||
1498 | .parents = { | ||
1499 | &axi_clk, | ||
1500 | &pll3_usb_otg, | ||
1501 | &pll2_pfd_400m, | ||
1502 | &pll2_pfd_352m, | ||
1503 | NULL | ||
1504 | }, | ||
1505 | }; | ||
1506 | |||
1507 | static struct multiplexer esai_mux = { | ||
1508 | .clk = &esai_clk, | ||
1509 | .reg = CSCMR2, | ||
1510 | .bp = BP_CSCMR2_ESAI_SEL, | ||
1511 | .bm = BM_CSCMR2_ESAI_SEL, | ||
1512 | .parents = { | ||
1513 | &pll4_audio, | ||
1514 | &pll3_pfd_508m, | ||
1515 | &pll3_pfd_454m, | ||
1516 | &pll3_usb_otg, | ||
1517 | NULL | ||
1518 | }, | ||
1519 | }; | ||
1520 | |||
1521 | #define DEF_LDB_DI_MUX(id) \ | ||
1522 | static struct multiplexer ldb_di##id##_mux = { \ | ||
1523 | .clk = &ldb_di##id##_clk, \ | ||
1524 | .reg = CS2CDR, \ | ||
1525 | .bp = BP_CS2CDR_LDB_DI##id##_SEL, \ | ||
1526 | .bm = BM_CS2CDR_LDB_DI##id##_SEL, \ | ||
1527 | .parents = { \ | ||
1528 | &pll5_video, \ | ||
1529 | &pll2_pfd_352m, \ | ||
1530 | &pll2_pfd_400m, \ | ||
1531 | &pll3_pfd_540m, \ | ||
1532 | &pll3_usb_otg, \ | ||
1533 | NULL \ | ||
1534 | }, \ | ||
1535 | } | ||
1536 | |||
1537 | DEF_LDB_DI_MUX(0); | ||
1538 | DEF_LDB_DI_MUX(1); | ||
1539 | |||
1540 | static struct multiplexer enfc_mux = { | ||
1541 | .clk = &enfc_clk, | ||
1542 | .reg = CS2CDR, | ||
1543 | .bp = BP_CS2CDR_ENFC_SEL, | ||
1544 | .bm = BM_CS2CDR_ENFC_SEL, | ||
1545 | .parents = { | ||
1546 | &pll2_pfd_352m, | ||
1547 | &pll2_bus, | ||
1548 | &pll3_usb_otg, | ||
1549 | &pll2_pfd_400m, | ||
1550 | NULL | ||
1551 | }, | ||
1552 | }; | ||
1553 | |||
1554 | static struct multiplexer spdif_mux = { | ||
1555 | .clk = &spdif_clk, | ||
1556 | .reg = CDCDR, | ||
1557 | .bp = BP_CDCDR_SPDIF_SEL, | ||
1558 | .bm = BM_CDCDR_SPDIF_SEL, | ||
1559 | .parents = { | ||
1560 | &pll4_audio, | ||
1561 | &pll3_pfd_508m, | ||
1562 | &pll3_pfd_454m, | ||
1563 | &pll3_usb_otg, | ||
1564 | NULL | ||
1565 | }, | ||
1566 | }; | ||
1567 | |||
1568 | static struct multiplexer asrc_serial_mux = { | ||
1569 | .clk = &asrc_serial_clk, | ||
1570 | .reg = CDCDR, | ||
1571 | .bp = BP_CDCDR_ASRC_SERIAL_SEL, | ||
1572 | .bm = BM_CDCDR_ASRC_SERIAL_SEL, | ||
1573 | .parents = { | ||
1574 | &pll4_audio, | ||
1575 | &pll3_pfd_508m, | ||
1576 | &pll3_pfd_454m, | ||
1577 | &pll3_usb_otg, | ||
1578 | NULL | ||
1579 | }, | ||
1580 | }; | ||
1581 | |||
1582 | static struct multiplexer hsi_tx_mux = { | ||
1583 | .clk = &hsi_tx_clk, | ||
1584 | .reg = CDCDR, | ||
1585 | .bp = BP_CDCDR_HSI_TX_SEL, | ||
1586 | .bm = BM_CDCDR_HSI_TX_SEL, | ||
1587 | .parents = { | ||
1588 | &pll3_120m, | ||
1589 | &pll2_pfd_400m, | ||
1590 | NULL | ||
1591 | }, | ||
1592 | }; | ||
1593 | |||
1594 | #define DEF_IPU_DI_PRE_MUX(r, i, d) \ | ||
1595 | static struct multiplexer ipu##i##_di##d##_pre_mux = { \ | ||
1596 | .clk = &ipu##i##_di##d##_pre_clk, \ | ||
1597 | .reg = r, \ | ||
1598 | .bp = BP_##r##_IPU##i##_DI##d##_PRE_SEL, \ | ||
1599 | .bm = BM_##r##_IPU##i##_DI##d##_PRE_SEL, \ | ||
1600 | .parents = { \ | ||
1601 | &mmdc_ch0_axi_clk, \ | ||
1602 | &pll3_usb_otg, \ | ||
1603 | &pll5_video, \ | ||
1604 | &pll2_pfd_352m, \ | ||
1605 | &pll2_pfd_400m, \ | ||
1606 | &pll3_pfd_540m, \ | ||
1607 | NULL \ | ||
1608 | }, \ | ||
1609 | } | ||
1610 | |||
1611 | DEF_IPU_DI_PRE_MUX(CHSCCDR, 1, 0); | ||
1612 | DEF_IPU_DI_PRE_MUX(CHSCCDR, 1, 1); | ||
1613 | DEF_IPU_DI_PRE_MUX(CSCDR2, 2, 0); | ||
1614 | DEF_IPU_DI_PRE_MUX(CSCDR2, 2, 1); | ||
1615 | |||
1616 | #define DEF_IPU_DI_MUX(r, i, d) \ | ||
1617 | static struct multiplexer ipu##i##_di##d##_mux = { \ | ||
1618 | .clk = &ipu##i##_di##d##_clk, \ | ||
1619 | .reg = r, \ | ||
1620 | .bp = BP_##r##_IPU##i##_DI##d##_SEL, \ | ||
1621 | .bm = BM_##r##_IPU##i##_DI##d##_SEL, \ | ||
1622 | .parents = { \ | ||
1623 | &ipu##i##_di##d##_pre_clk, \ | ||
1624 | &dummy_clk, \ | ||
1625 | &dummy_clk, \ | ||
1626 | &ldb_di0_clk, \ | ||
1627 | &ldb_di1_clk, \ | ||
1628 | NULL \ | ||
1629 | }, \ | ||
1630 | } | ||
1631 | |||
1632 | DEF_IPU_DI_MUX(CHSCCDR, 1, 0); | ||
1633 | DEF_IPU_DI_MUX(CHSCCDR, 1, 1); | ||
1634 | DEF_IPU_DI_MUX(CSCDR2, 2, 0); | ||
1635 | DEF_IPU_DI_MUX(CSCDR2, 2, 1); | ||
1636 | |||
1637 | #define DEF_IPU_MUX(id) \ | ||
1638 | static struct multiplexer ipu##id##_mux = { \ | ||
1639 | .clk = &ipu##id##_clk, \ | ||
1640 | .reg = CSCDR3, \ | ||
1641 | .bp = BP_CSCDR3_IPU##id##_HSP_SEL, \ | ||
1642 | .bm = BM_CSCDR3_IPU##id##_HSP_SEL, \ | ||
1643 | .parents = { \ | ||
1644 | &mmdc_ch0_axi_clk, \ | ||
1645 | &pll2_pfd_400m, \ | ||
1646 | &pll3_120m, \ | ||
1647 | &pll3_pfd_540m, \ | ||
1648 | NULL \ | ||
1649 | }, \ | ||
1650 | } | ||
1651 | |||
1652 | DEF_IPU_MUX(1); | ||
1653 | DEF_IPU_MUX(2); | ||
1654 | |||
1655 | static struct multiplexer cko1_mux = { | ||
1656 | .clk = &cko1_clk, | ||
1657 | .reg = CCOSR, | ||
1658 | .bp = BP_CCOSR_CKO1_SEL, | ||
1659 | .bm = BM_CCOSR_CKO1_SEL, | ||
1660 | .parents = { | ||
1661 | &pll3_usb_otg, | ||
1662 | &pll2_bus, | ||
1663 | &pll1_sys, | ||
1664 | &pll5_video, | ||
1665 | &dummy_clk, | ||
1666 | &axi_clk, | ||
1667 | &enfc_clk, | ||
1668 | &ipu1_di0_clk, | ||
1669 | &ipu1_di1_clk, | ||
1670 | &ipu2_di0_clk, | ||
1671 | &ipu2_di1_clk, | ||
1672 | &ahb_clk, | ||
1673 | &ipg_clk, | ||
1674 | &ipg_perclk, | ||
1675 | &ckil_clk, | ||
1676 | &pll4_audio, | ||
1677 | NULL | ||
1678 | }, | ||
1679 | }; | ||
1680 | |||
1681 | static struct multiplexer *multiplexers[] = { | ||
1682 | &axi_mux, | ||
1683 | &periph_mux, | ||
1684 | &periph_pre_mux, | ||
1685 | &periph_clk2_mux, | ||
1686 | &periph2_mux, | ||
1687 | &periph2_pre_mux, | ||
1688 | &periph2_clk2_mux, | ||
1689 | &gpu2d_axi_mux, | ||
1690 | &gpu3d_axi_mux, | ||
1691 | &gpu3d_core_mux, | ||
1692 | &gpu3d_shader_mux, | ||
1693 | &pcie_axi_mux, | ||
1694 | &vdo_axi_mux, | ||
1695 | &vpu_axi_mux, | ||
1696 | &gpu2d_core_mux, | ||
1697 | &ssi1_mux, | ||
1698 | &ssi2_mux, | ||
1699 | &ssi3_mux, | ||
1700 | &usdhc1_mux, | ||
1701 | &usdhc2_mux, | ||
1702 | &usdhc3_mux, | ||
1703 | &usdhc4_mux, | ||
1704 | &emi_mux, | ||
1705 | &emi_slow_mux, | ||
1706 | &esai_mux, | ||
1707 | &ldb_di0_mux, | ||
1708 | &ldb_di1_mux, | ||
1709 | &enfc_mux, | ||
1710 | &spdif_mux, | ||
1711 | &asrc_serial_mux, | ||
1712 | &hsi_tx_mux, | ||
1713 | &ipu1_di0_pre_mux, | ||
1714 | &ipu1_di0_mux, | ||
1715 | &ipu1_di1_pre_mux, | ||
1716 | &ipu1_di1_mux, | ||
1717 | &ipu2_di0_pre_mux, | ||
1718 | &ipu2_di0_mux, | ||
1719 | &ipu2_di1_pre_mux, | ||
1720 | &ipu2_di1_mux, | ||
1721 | &ipu1_mux, | ||
1722 | &ipu2_mux, | ||
1723 | &cko1_mux, | ||
1724 | }; | ||
1725 | |||
1726 | static int _clk_set_parent(struct clk *clk, struct clk *parent) | ||
1727 | { | ||
1728 | struct multiplexer *m; | ||
1729 | int i, num; | ||
1730 | u32 val; | ||
1731 | |||
1732 | num = ARRAY_SIZE(multiplexers); | ||
1733 | for (i = 0; i < num; i++) | ||
1734 | if (multiplexers[i]->clk == clk) { | ||
1735 | m = multiplexers[i]; | ||
1736 | break; | ||
1737 | } | ||
1738 | if (i == num) | ||
1739 | return -EINVAL; | ||
1740 | |||
1741 | i = 0; | ||
1742 | while (m->parents[i]) { | ||
1743 | if (parent == m->parents[i]) | ||
1744 | break; | ||
1745 | i++; | ||
1746 | } | ||
1747 | if (!m->parents[i] || m->parents[i] == &dummy_clk) | ||
1748 | return -EINVAL; | ||
1749 | |||
1750 | val = readl_relaxed(m->reg); | ||
1751 | val &= ~m->bm; | ||
1752 | val |= i << m->bp; | ||
1753 | writel_relaxed(val, m->reg); | ||
1754 | |||
1755 | if (clk == &periph_clk) | ||
1756 | return clk_busy_wait(clk); | ||
1757 | |||
1758 | return 0; | ||
1759 | } | ||
1760 | |||
1761 | #define DEF_NG_CLK(name, p) \ | ||
1762 | static struct clk name = { \ | ||
1763 | .get_rate = _clk_get_rate, \ | ||
1764 | .set_rate = _clk_set_rate, \ | ||
1765 | .round_rate = _clk_round_rate, \ | ||
1766 | .set_parent = _clk_set_parent, \ | ||
1767 | .parent = p, \ | ||
1768 | } | ||
1769 | |||
1770 | DEF_NG_CLK(periph_clk2_clk, &osc_clk); | ||
1771 | DEF_NG_CLK(periph_pre_clk, &pll2_bus); | ||
1772 | DEF_NG_CLK(periph_clk, &periph_pre_clk); | ||
1773 | DEF_NG_CLK(periph2_clk2_clk, &osc_clk); | ||
1774 | DEF_NG_CLK(periph2_pre_clk, &pll2_bus); | ||
1775 | DEF_NG_CLK(periph2_clk, &periph2_pre_clk); | ||
1776 | DEF_NG_CLK(axi_clk, &periph_clk); | ||
1777 | DEF_NG_CLK(emi_clk, &axi_clk); | ||
1778 | DEF_NG_CLK(arm_clk, &pll1_sw_clk); | ||
1779 | DEF_NG_CLK(ahb_clk, &periph_clk); | ||
1780 | DEF_NG_CLK(ipg_clk, &ahb_clk); | ||
1781 | DEF_NG_CLK(ipg_perclk, &ipg_clk); | ||
1782 | DEF_NG_CLK(ipu1_di0_pre_clk, &pll3_pfd_540m); | ||
1783 | DEF_NG_CLK(ipu1_di1_pre_clk, &pll3_pfd_540m); | ||
1784 | DEF_NG_CLK(ipu2_di0_pre_clk, &pll3_pfd_540m); | ||
1785 | DEF_NG_CLK(ipu2_di1_pre_clk, &pll3_pfd_540m); | ||
1786 | DEF_NG_CLK(asrc_serial_clk, &pll3_usb_otg); | ||
1787 | |||
1788 | #define DEF_CLK(name, er, es, p, s) \ | ||
1789 | static struct clk name = { \ | ||
1790 | .enable_reg = er, \ | ||
1791 | .enable_shift = es, \ | ||
1792 | .enable = _clk_enable, \ | ||
1793 | .disable = _clk_disable, \ | ||
1794 | .get_rate = _clk_get_rate, \ | ||
1795 | .set_rate = _clk_set_rate, \ | ||
1796 | .round_rate = _clk_round_rate, \ | ||
1797 | .set_parent = _clk_set_parent, \ | ||
1798 | .parent = p, \ | ||
1799 | .secondary = s, \ | ||
1800 | } | ||
1801 | |||
1802 | #define DEF_CLK_1B(name, er, es, p, s) \ | ||
1803 | static struct clk name = { \ | ||
1804 | .enable_reg = er, \ | ||
1805 | .enable_shift = es, \ | ||
1806 | .enable = _clk_enable_1b, \ | ||
1807 | .disable = _clk_disable_1b, \ | ||
1808 | .get_rate = _clk_get_rate, \ | ||
1809 | .set_rate = _clk_set_rate, \ | ||
1810 | .round_rate = _clk_round_rate, \ | ||
1811 | .set_parent = _clk_set_parent, \ | ||
1812 | .parent = p, \ | ||
1813 | .secondary = s, \ | ||
1814 | } | ||
1815 | |||
1816 | DEF_CLK(aips_tz1_clk, CCGR0, CG0, &ahb_clk, NULL); | ||
1817 | DEF_CLK(aips_tz2_clk, CCGR0, CG1, &ahb_clk, NULL); | ||
1818 | DEF_CLK(apbh_dma_clk, CCGR0, CG2, &ahb_clk, NULL); | ||
1819 | DEF_CLK(asrc_clk, CCGR0, CG3, &pll4_audio, NULL); | ||
1820 | DEF_CLK(can1_serial_clk, CCGR0, CG8, &pll3_usb_otg, NULL); | ||
1821 | DEF_CLK(can1_clk, CCGR0, CG7, &pll3_usb_otg, &can1_serial_clk); | ||
1822 | DEF_CLK(can2_serial_clk, CCGR0, CG10, &pll3_usb_otg, NULL); | ||
1823 | DEF_CLK(can2_clk, CCGR0, CG9, &pll3_usb_otg, &can2_serial_clk); | ||
1824 | DEF_CLK(ecspi1_clk, CCGR1, CG0, &pll3_60m, NULL); | ||
1825 | DEF_CLK(ecspi2_clk, CCGR1, CG1, &pll3_60m, NULL); | ||
1826 | DEF_CLK(ecspi3_clk, CCGR1, CG2, &pll3_60m, NULL); | ||
1827 | DEF_CLK(ecspi4_clk, CCGR1, CG3, &pll3_60m, NULL); | ||
1828 | DEF_CLK(ecspi5_clk, CCGR1, CG4, &pll3_60m, NULL); | ||
1829 | DEF_CLK(enet_clk, CCGR1, CG5, &ipg_clk, NULL); | ||
1830 | DEF_CLK(esai_clk, CCGR1, CG8, &pll3_usb_otg, NULL); | ||
1831 | DEF_CLK(gpt_serial_clk, CCGR1, CG11, &ipg_perclk, NULL); | ||
1832 | DEF_CLK(gpt_clk, CCGR1, CG10, &ipg_perclk, &gpt_serial_clk); | ||
1833 | DEF_CLK(gpu2d_core_clk, CCGR1, CG12, &pll2_pfd_352m, &gpu2d_axi_clk); | ||
1834 | DEF_CLK(gpu3d_core_clk, CCGR1, CG13, &pll2_pfd_594m, &gpu3d_axi_clk); | ||
1835 | DEF_CLK(gpu3d_shader_clk, CCGR1, CG13, &pll3_pfd_720m, &gpu3d_axi_clk); | ||
1836 | DEF_CLK(hdmi_iahb_clk, CCGR2, CG0, &ahb_clk, NULL); | ||
1837 | DEF_CLK(hdmi_isfr_clk, CCGR2, CG2, &pll3_pfd_540m, &hdmi_iahb_clk); | ||
1838 | DEF_CLK(i2c1_clk, CCGR2, CG3, &ipg_perclk, NULL); | ||
1839 | DEF_CLK(i2c2_clk, CCGR2, CG4, &ipg_perclk, NULL); | ||
1840 | DEF_CLK(i2c3_clk, CCGR2, CG5, &ipg_perclk, NULL); | ||
1841 | DEF_CLK(iim_clk, CCGR2, CG6, &ipg_clk, NULL); | ||
1842 | DEF_CLK(enfc_clk, CCGR2, CG7, &pll2_pfd_352m, NULL); | ||
1843 | DEF_CLK(ipu1_clk, CCGR3, CG0, &mmdc_ch0_axi_clk, NULL); | ||
1844 | DEF_CLK(ipu1_di0_clk, CCGR3, CG1, &ipu1_di0_pre_clk, NULL); | ||
1845 | DEF_CLK(ipu1_di1_clk, CCGR3, CG2, &ipu1_di1_pre_clk, NULL); | ||
1846 | DEF_CLK(ipu2_clk, CCGR3, CG3, &mmdc_ch0_axi_clk, NULL); | ||
1847 | DEF_CLK(ipu2_di0_clk, CCGR3, CG4, &ipu2_di0_pre_clk, NULL); | ||
1848 | DEF_CLK(ipu2_di1_clk, CCGR3, CG5, &ipu2_di1_pre_clk, NULL); | ||
1849 | DEF_CLK(ldb_di0_clk, CCGR3, CG6, &pll3_pfd_540m, NULL); | ||
1850 | DEF_CLK(ldb_di1_clk, CCGR3, CG7, &pll3_pfd_540m, NULL); | ||
1851 | DEF_CLK(hsi_tx_clk, CCGR3, CG8, &pll2_pfd_400m, NULL); | ||
1852 | DEF_CLK(mlb_clk, CCGR3, CG9, &pll6_mlb, NULL); | ||
1853 | DEF_CLK(mmdc_ch0_ipg_clk, CCGR3, CG12, &ipg_clk, NULL); | ||
1854 | DEF_CLK(mmdc_ch0_axi_clk, CCGR3, CG10, &periph_clk, &mmdc_ch0_ipg_clk); | ||
1855 | DEF_CLK(mmdc_ch1_ipg_clk, CCGR3, CG13, &ipg_clk, NULL); | ||
1856 | DEF_CLK(mmdc_ch1_axi_clk, CCGR3, CG11, &periph2_clk, &mmdc_ch1_ipg_clk); | ||
1857 | DEF_CLK(openvg_axi_clk, CCGR3, CG13, &axi_clk, NULL); | ||
1858 | DEF_CLK(pwm1_clk, CCGR4, CG8, &ipg_perclk, NULL); | ||
1859 | DEF_CLK(pwm2_clk, CCGR4, CG9, &ipg_perclk, NULL); | ||
1860 | DEF_CLK(pwm3_clk, CCGR4, CG10, &ipg_perclk, NULL); | ||
1861 | DEF_CLK(pwm4_clk, CCGR4, CG11, &ipg_perclk, NULL); | ||
1862 | DEF_CLK(gpmi_bch_apb_clk, CCGR4, CG12, &usdhc3_clk, NULL); | ||
1863 | DEF_CLK(gpmi_bch_clk, CCGR4, CG13, &usdhc4_clk, &gpmi_bch_apb_clk); | ||
1864 | DEF_CLK(gpmi_apb_clk, CCGR4, CG15, &usdhc3_clk, &gpmi_bch_clk); | ||
1865 | DEF_CLK(gpmi_io_clk, CCGR4, CG14, &enfc_clk, &gpmi_apb_clk); | ||
1866 | DEF_CLK(sdma_clk, CCGR5, CG3, &ahb_clk, NULL); | ||
1867 | DEF_CLK(spba_clk, CCGR5, CG6, &ipg_clk, NULL); | ||
1868 | DEF_CLK(spdif_clk, CCGR5, CG7, &pll3_usb_otg, &spba_clk); | ||
1869 | DEF_CLK(ssi1_clk, CCGR5, CG9, &pll3_pfd_508m, NULL); | ||
1870 | DEF_CLK(ssi2_clk, CCGR5, CG10, &pll3_pfd_508m, NULL); | ||
1871 | DEF_CLK(ssi3_clk, CCGR5, CG11, &pll3_pfd_508m, NULL); | ||
1872 | DEF_CLK(uart_serial_clk, CCGR5, CG13, &pll3_usb_otg, NULL); | ||
1873 | DEF_CLK(uart_clk, CCGR5, CG12, &pll3_80m, &uart_serial_clk); | ||
1874 | DEF_CLK(usboh3_clk, CCGR6, CG0, &ipg_clk, NULL); | ||
1875 | DEF_CLK(usdhc1_clk, CCGR6, CG1, &pll2_pfd_400m, NULL); | ||
1876 | DEF_CLK(usdhc2_clk, CCGR6, CG2, &pll2_pfd_400m, NULL); | ||
1877 | DEF_CLK(usdhc3_clk, CCGR6, CG3, &pll2_pfd_400m, NULL); | ||
1878 | DEF_CLK(usdhc4_clk, CCGR6, CG4, &pll2_pfd_400m, NULL); | ||
1879 | DEF_CLK(emi_slow_clk, CCGR6, CG5, &axi_clk, NULL); | ||
1880 | DEF_CLK(vdo_axi_clk, CCGR6, CG6, &axi_clk, NULL); | ||
1881 | DEF_CLK(vpu_clk, CCGR6, CG7, &axi_clk, NULL); | ||
1882 | DEF_CLK_1B(cko1_clk, CCOSR, BP_CCOSR_CKO1_EN, &pll2_bus, NULL); | ||
1883 | |||
1884 | static int pcie_clk_enable(struct clk *clk) | ||
1885 | { | ||
1886 | u32 val; | ||
1887 | |||
1888 | val = readl_relaxed(PLL8_ENET); | ||
1889 | val |= BM_PLL_ENET_EN_PCIE; | ||
1890 | writel_relaxed(val, PLL8_ENET); | ||
1891 | |||
1892 | return _clk_enable(clk); | ||
1893 | } | ||
1894 | |||
1895 | static void pcie_clk_disable(struct clk *clk) | ||
1896 | { | ||
1897 | u32 val; | ||
1898 | |||
1899 | _clk_disable(clk); | ||
1900 | |||
1901 | val = readl_relaxed(PLL8_ENET); | ||
1902 | val &= BM_PLL_ENET_EN_PCIE; | ||
1903 | writel_relaxed(val, PLL8_ENET); | ||
1904 | } | ||
1905 | |||
1906 | static struct clk pcie_clk = { | ||
1907 | .enable_reg = CCGR4, | ||
1908 | .enable_shift = CG0, | ||
1909 | .enable = pcie_clk_enable, | ||
1910 | .disable = pcie_clk_disable, | ||
1911 | .set_parent = _clk_set_parent, | ||
1912 | .parent = &axi_clk, | ||
1913 | .secondary = &pll8_enet, | ||
1914 | }; | ||
1915 | |||
1916 | static int sata_clk_enable(struct clk *clk) | ||
1917 | { | ||
1918 | u32 val; | ||
1919 | |||
1920 | val = readl_relaxed(PLL8_ENET); | ||
1921 | val |= BM_PLL_ENET_EN_SATA; | ||
1922 | writel_relaxed(val, PLL8_ENET); | ||
1923 | |||
1924 | return _clk_enable(clk); | ||
1925 | } | ||
1926 | |||
1927 | static void sata_clk_disable(struct clk *clk) | ||
1928 | { | ||
1929 | u32 val; | ||
1930 | |||
1931 | _clk_disable(clk); | ||
1932 | |||
1933 | val = readl_relaxed(PLL8_ENET); | ||
1934 | val &= BM_PLL_ENET_EN_SATA; | ||
1935 | writel_relaxed(val, PLL8_ENET); | ||
1936 | } | ||
1937 | |||
1938 | static struct clk sata_clk = { | ||
1939 | .enable_reg = CCGR5, | ||
1940 | .enable_shift = CG2, | ||
1941 | .enable = sata_clk_enable, | ||
1942 | .disable = sata_clk_disable, | ||
1943 | .parent = &ipg_clk, | ||
1944 | .secondary = &pll8_enet, | ||
1945 | }; | ||
1946 | |||
1947 | #define _REGISTER_CLOCK(d, n, c) \ | ||
1948 | { \ | ||
1949 | .dev_id = d, \ | ||
1950 | .con_id = n, \ | ||
1951 | .clk = &c, \ | ||
1952 | } | ||
1953 | |||
1954 | static struct clk_lookup lookups[] = { | ||
1955 | _REGISTER_CLOCK("2020000.uart", NULL, uart_clk), | ||
1956 | _REGISTER_CLOCK("21e8000.uart", NULL, uart_clk), | ||
1957 | _REGISTER_CLOCK("21ec000.uart", NULL, uart_clk), | ||
1958 | _REGISTER_CLOCK("21f0000.uart", NULL, uart_clk), | ||
1959 | _REGISTER_CLOCK("21f4000.uart", NULL, uart_clk), | ||
1960 | _REGISTER_CLOCK("2188000.enet", NULL, enet_clk), | ||
1961 | _REGISTER_CLOCK("2190000.usdhc", NULL, usdhc1_clk), | ||
1962 | _REGISTER_CLOCK("2194000.usdhc", NULL, usdhc2_clk), | ||
1963 | _REGISTER_CLOCK("2198000.usdhc", NULL, usdhc3_clk), | ||
1964 | _REGISTER_CLOCK("219c000.usdhc", NULL, usdhc4_clk), | ||
1965 | _REGISTER_CLOCK("21a0000.i2c", NULL, i2c1_clk), | ||
1966 | _REGISTER_CLOCK("21a4000.i2c", NULL, i2c2_clk), | ||
1967 | _REGISTER_CLOCK("21a8000.i2c", NULL, i2c3_clk), | ||
1968 | _REGISTER_CLOCK("2008000.ecspi", NULL, ecspi1_clk), | ||
1969 | _REGISTER_CLOCK("200c000.ecspi", NULL, ecspi2_clk), | ||
1970 | _REGISTER_CLOCK("2010000.ecspi", NULL, ecspi3_clk), | ||
1971 | _REGISTER_CLOCK("2014000.ecspi", NULL, ecspi4_clk), | ||
1972 | _REGISTER_CLOCK("2018000.ecspi", NULL, ecspi5_clk), | ||
1973 | _REGISTER_CLOCK("20ec000.sdma", NULL, sdma_clk), | ||
1974 | _REGISTER_CLOCK("20bc000.wdog", NULL, dummy_clk), | ||
1975 | _REGISTER_CLOCK("20c0000.wdog", NULL, dummy_clk), | ||
1976 | _REGISTER_CLOCK("smp_twd", NULL, twd_clk), | ||
1977 | _REGISTER_CLOCK(NULL, "ckih", ckih_clk), | ||
1978 | _REGISTER_CLOCK(NULL, "ckil_clk", ckil_clk), | ||
1979 | _REGISTER_CLOCK(NULL, "aips_tz1_clk", aips_tz1_clk), | ||
1980 | _REGISTER_CLOCK(NULL, "aips_tz2_clk", aips_tz2_clk), | ||
1981 | _REGISTER_CLOCK(NULL, "asrc_clk", asrc_clk), | ||
1982 | _REGISTER_CLOCK(NULL, "can2_clk", can2_clk), | ||
1983 | _REGISTER_CLOCK(NULL, "hdmi_isfr_clk", hdmi_isfr_clk), | ||
1984 | _REGISTER_CLOCK(NULL, "iim_clk", iim_clk), | ||
1985 | _REGISTER_CLOCK(NULL, "mlb_clk", mlb_clk), | ||
1986 | _REGISTER_CLOCK(NULL, "openvg_axi_clk", openvg_axi_clk), | ||
1987 | _REGISTER_CLOCK(NULL, "pwm1_clk", pwm1_clk), | ||
1988 | _REGISTER_CLOCK(NULL, "pwm2_clk", pwm2_clk), | ||
1989 | _REGISTER_CLOCK(NULL, "pwm3_clk", pwm3_clk), | ||
1990 | _REGISTER_CLOCK(NULL, "pwm4_clk", pwm4_clk), | ||
1991 | _REGISTER_CLOCK(NULL, "gpmi_io_clk", gpmi_io_clk), | ||
1992 | _REGISTER_CLOCK(NULL, "usboh3_clk", usboh3_clk), | ||
1993 | _REGISTER_CLOCK(NULL, "sata_clk", sata_clk), | ||
1994 | _REGISTER_CLOCK(NULL, "cko1_clk", cko1_clk), | ||
1995 | }; | ||
1996 | |||
1997 | int imx6q_set_lpm(enum mxc_cpu_pwr_mode mode) | ||
1998 | { | ||
1999 | u32 val = readl_relaxed(CLPCR); | ||
2000 | |||
2001 | val &= ~BM_CLPCR_LPM; | ||
2002 | switch (mode) { | ||
2003 | case WAIT_CLOCKED: | ||
2004 | break; | ||
2005 | case WAIT_UNCLOCKED: | ||
2006 | val |= 0x1 << BP_CLPCR_LPM; | ||
2007 | break; | ||
2008 | case STOP_POWER_ON: | ||
2009 | val |= 0x2 << BP_CLPCR_LPM; | ||
2010 | break; | ||
2011 | case WAIT_UNCLOCKED_POWER_OFF: | ||
2012 | val |= 0x1 << BP_CLPCR_LPM; | ||
2013 | val &= ~BM_CLPCR_VSTBY; | ||
2014 | val &= ~BM_CLPCR_SBYOS; | ||
2015 | break; | ||
2016 | case STOP_POWER_OFF: | ||
2017 | val |= 0x2 << BP_CLPCR_LPM; | ||
2018 | val |= 0x3 << BP_CLPCR_STBY_COUNT; | ||
2019 | val |= BM_CLPCR_VSTBY; | ||
2020 | val |= BM_CLPCR_SBYOS; | ||
2021 | break; | ||
2022 | default: | ||
2023 | return -EINVAL; | ||
2024 | } | ||
2025 | writel_relaxed(val, CLPCR); | ||
2026 | |||
2027 | return 0; | ||
2028 | } | ||
2029 | |||
2030 | static struct map_desc imx6q_clock_desc[] = { | ||
2031 | imx_map_entry(MX6Q, CCM, MT_DEVICE), | ||
2032 | imx_map_entry(MX6Q, ANATOP, MT_DEVICE), | ||
2033 | }; | ||
2034 | |||
2035 | void __init imx6q_clock_map_io(void) | ||
2036 | { | ||
2037 | iotable_init(imx6q_clock_desc, ARRAY_SIZE(imx6q_clock_desc)); | ||
2038 | } | ||
2039 | |||
2040 | int __init mx6q_clocks_init(void) | ||
2041 | { | ||
2042 | struct device_node *np; | ||
2043 | void __iomem *base; | ||
2044 | int i, irq; | ||
2045 | |||
2046 | /* retrieve the freqency of fixed clocks from device tree */ | ||
2047 | for_each_compatible_node(np, NULL, "fixed-clock") { | ||
2048 | u32 rate; | ||
2049 | if (of_property_read_u32(np, "clock-frequency", &rate)) | ||
2050 | continue; | ||
2051 | |||
2052 | if (of_device_is_compatible(np, "fsl,imx-ckil")) | ||
2053 | external_low_reference = rate; | ||
2054 | else if (of_device_is_compatible(np, "fsl,imx-ckih1")) | ||
2055 | external_high_reference = rate; | ||
2056 | else if (of_device_is_compatible(np, "fsl,imx-osc")) | ||
2057 | oscillator_reference = rate; | ||
2058 | } | ||
2059 | |||
2060 | for (i = 0; i < ARRAY_SIZE(lookups); i++) | ||
2061 | clkdev_add(&lookups[i]); | ||
2062 | |||
2063 | /* only keep necessary clocks on */ | ||
2064 | writel_relaxed(0x3 << CG0 | 0x3 << CG1 | 0x3 << CG2, CCGR0); | ||
2065 | writel_relaxed(0x3 << CG8 | 0x3 << CG9 | 0x3 << CG10, CCGR2); | ||
2066 | writel_relaxed(0x3 << CG10 | 0x3 << CG12, CCGR3); | ||
2067 | writel_relaxed(0x3 << CG4 | 0x3 << CG6 | 0x3 << CG7, CCGR4); | ||
2068 | writel_relaxed(0x3 << CG0, CCGR5); | ||
2069 | writel_relaxed(0, CCGR6); | ||
2070 | writel_relaxed(0, CCGR7); | ||
2071 | |||
2072 | clk_enable(&uart_clk); | ||
2073 | clk_enable(&mmdc_ch0_axi_clk); | ||
2074 | |||
2075 | clk_set_rate(&pll4_audio, FREQ_650M); | ||
2076 | clk_set_rate(&pll5_video, FREQ_650M); | ||
2077 | clk_set_parent(&ipu1_di0_clk, &ipu1_di0_pre_clk); | ||
2078 | clk_set_parent(&ipu1_di0_pre_clk, &pll5_video); | ||
2079 | clk_set_parent(&gpu3d_shader_clk, &pll2_pfd_594m); | ||
2080 | clk_set_rate(&gpu3d_shader_clk, FREQ_594M); | ||
2081 | clk_set_parent(&gpu3d_core_clk, &mmdc_ch0_axi_clk); | ||
2082 | clk_set_rate(&gpu3d_core_clk, FREQ_528M); | ||
2083 | clk_set_parent(&asrc_serial_clk, &pll3_usb_otg); | ||
2084 | clk_set_rate(&asrc_serial_clk, 1500000); | ||
2085 | clk_set_rate(&enfc_clk, 11000000); | ||
2086 | |||
2087 | /* | ||
2088 | * Before pinctrl API is available, we have to rely on the pad | ||
2089 | * configuration set up by bootloader. For usdhc example here, | ||
2090 | * u-boot sets up the pads for 49.5 MHz case, and we have to lower | ||
2091 | * the usdhc clock from 198 to 49.5 MHz to match the pad configuration. | ||
2092 | * | ||
2093 | * FIXME: This is should be removed after pinctrl API is available. | ||
2094 | * At that time, usdhc driver can call pinctrl API to change pad | ||
2095 | * configuration dynamically per different usdhc clock settings. | ||
2096 | */ | ||
2097 | clk_set_rate(&usdhc1_clk, 49500000); | ||
2098 | clk_set_rate(&usdhc2_clk, 49500000); | ||
2099 | clk_set_rate(&usdhc3_clk, 49500000); | ||
2100 | clk_set_rate(&usdhc4_clk, 49500000); | ||
2101 | |||
2102 | clk_set_parent(&cko1_clk, &ahb_clk); | ||
2103 | |||
2104 | np = of_find_compatible_node(NULL, NULL, "fsl,imx6q-gpt"); | ||
2105 | base = of_iomap(np, 0); | ||
2106 | WARN_ON(!base); | ||
2107 | irq = irq_of_parse_and_map(np, 0); | ||
2108 | mxc_timer_init(&gpt_clk, base, irq); | ||
2109 | |||
2110 | return 0; | ||
2111 | } | ||
diff --git a/arch/arm/mach-imx/clock-mx51-mx53.c b/arch/arm/mach-imx/clock-mx51-mx53.c deleted file mode 100644 index 08470504a088..000000000000 --- a/arch/arm/mach-imx/clock-mx51-mx53.c +++ /dev/null | |||
@@ -1,1675 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright 2008-2010 Freescale Semiconductor, Inc. All Rights Reserved. | ||
3 | * Copyright (C) 2009-2010 Amit Kucheria <amit.kucheria@canonical.com> | ||
4 | * | ||
5 | * The code contained herein is licensed under the GNU General Public | ||
6 | * License. You may obtain a copy of the GNU General Public License | ||
7 | * Version 2 or later at the following locations: | ||
8 | * | ||
9 | * http://www.opensource.org/licenses/gpl-license.html | ||
10 | * http://www.gnu.org/copyleft/gpl.html | ||
11 | */ | ||
12 | |||
13 | #include <linux/mm.h> | ||
14 | #include <linux/delay.h> | ||
15 | #include <linux/clk.h> | ||
16 | #include <linux/io.h> | ||
17 | #include <linux/clkdev.h> | ||
18 | #include <linux/of.h> | ||
19 | |||
20 | #include <asm/div64.h> | ||
21 | |||
22 | #include <mach/hardware.h> | ||
23 | #include <mach/common.h> | ||
24 | #include <mach/clock.h> | ||
25 | |||
26 | #include "crm-regs-imx5.h" | ||
27 | |||
28 | /* External clock values passed-in by the board code */ | ||
29 | static unsigned long external_high_reference, external_low_reference; | ||
30 | static unsigned long oscillator_reference, ckih2_reference; | ||
31 | |||
32 | static struct clk osc_clk; | ||
33 | static struct clk pll1_main_clk; | ||
34 | static struct clk pll1_sw_clk; | ||
35 | static struct clk pll2_sw_clk; | ||
36 | static struct clk pll3_sw_clk; | ||
37 | static struct clk mx53_pll4_sw_clk; | ||
38 | static struct clk lp_apm_clk; | ||
39 | static struct clk periph_apm_clk; | ||
40 | static struct clk ahb_clk; | ||
41 | static struct clk ipg_clk; | ||
42 | static struct clk usboh3_clk; | ||
43 | static struct clk emi_fast_clk; | ||
44 | static struct clk ipu_clk; | ||
45 | static struct clk mipi_hsc1_clk; | ||
46 | static struct clk esdhc1_clk; | ||
47 | static struct clk esdhc2_clk; | ||
48 | static struct clk esdhc3_mx53_clk; | ||
49 | |||
50 | #define MAX_DPLL_WAIT_TRIES 1000 /* 1000 * udelay(1) = 1ms */ | ||
51 | |||
52 | /* calculate best pre and post dividers to get the required divider */ | ||
53 | static void __calc_pre_post_dividers(u32 div, u32 *pre, u32 *post, | ||
54 | u32 max_pre, u32 max_post) | ||
55 | { | ||
56 | if (div >= max_pre * max_post) { | ||
57 | *pre = max_pre; | ||
58 | *post = max_post; | ||
59 | } else if (div >= max_pre) { | ||
60 | u32 min_pre, temp_pre, old_err, err; | ||
61 | min_pre = DIV_ROUND_UP(div, max_post); | ||
62 | old_err = max_pre; | ||
63 | for (temp_pre = max_pre; temp_pre >= min_pre; temp_pre--) { | ||
64 | err = div % temp_pre; | ||
65 | if (err == 0) { | ||
66 | *pre = temp_pre; | ||
67 | break; | ||
68 | } | ||
69 | err = temp_pre - err; | ||
70 | if (err < old_err) { | ||
71 | old_err = err; | ||
72 | *pre = temp_pre; | ||
73 | } | ||
74 | } | ||
75 | *post = DIV_ROUND_UP(div, *pre); | ||
76 | } else { | ||
77 | *pre = div; | ||
78 | *post = 1; | ||
79 | } | ||
80 | } | ||
81 | |||
82 | static void _clk_ccgr_setclk(struct clk *clk, unsigned mode) | ||
83 | { | ||
84 | u32 reg = __raw_readl(clk->enable_reg); | ||
85 | |||
86 | reg &= ~(MXC_CCM_CCGRx_CG_MASK << clk->enable_shift); | ||
87 | reg |= mode << clk->enable_shift; | ||
88 | |||
89 | __raw_writel(reg, clk->enable_reg); | ||
90 | } | ||
91 | |||
92 | static int _clk_ccgr_enable(struct clk *clk) | ||
93 | { | ||
94 | _clk_ccgr_setclk(clk, MXC_CCM_CCGRx_MOD_ON); | ||
95 | return 0; | ||
96 | } | ||
97 | |||
98 | static void _clk_ccgr_disable(struct clk *clk) | ||
99 | { | ||
100 | _clk_ccgr_setclk(clk, MXC_CCM_CCGRx_MOD_OFF); | ||
101 | } | ||
102 | |||
103 | static int _clk_ccgr_enable_inrun(struct clk *clk) | ||
104 | { | ||
105 | _clk_ccgr_setclk(clk, MXC_CCM_CCGRx_MOD_IDLE); | ||
106 | return 0; | ||
107 | } | ||
108 | |||
109 | static void _clk_ccgr_disable_inwait(struct clk *clk) | ||
110 | { | ||
111 | _clk_ccgr_setclk(clk, MXC_CCM_CCGRx_MOD_IDLE); | ||
112 | } | ||
113 | |||
114 | /* | ||
115 | * For the 4-to-1 muxed input clock | ||
116 | */ | ||
117 | static inline u32 _get_mux(struct clk *parent, struct clk *m0, | ||
118 | struct clk *m1, struct clk *m2, struct clk *m3) | ||
119 | { | ||
120 | if (parent == m0) | ||
121 | return 0; | ||
122 | else if (parent == m1) | ||
123 | return 1; | ||
124 | else if (parent == m2) | ||
125 | return 2; | ||
126 | else if (parent == m3) | ||
127 | return 3; | ||
128 | else | ||
129 | BUG(); | ||
130 | |||
131 | return -EINVAL; | ||
132 | } | ||
133 | |||
134 | static inline void __iomem *_mx51_get_pll_base(struct clk *pll) | ||
135 | { | ||
136 | if (pll == &pll1_main_clk) | ||
137 | return MX51_DPLL1_BASE; | ||
138 | else if (pll == &pll2_sw_clk) | ||
139 | return MX51_DPLL2_BASE; | ||
140 | else if (pll == &pll3_sw_clk) | ||
141 | return MX51_DPLL3_BASE; | ||
142 | else | ||
143 | BUG(); | ||
144 | |||
145 | return NULL; | ||
146 | } | ||
147 | |||
148 | static inline void __iomem *_mx53_get_pll_base(struct clk *pll) | ||
149 | { | ||
150 | if (pll == &pll1_main_clk) | ||
151 | return MX53_DPLL1_BASE; | ||
152 | else if (pll == &pll2_sw_clk) | ||
153 | return MX53_DPLL2_BASE; | ||
154 | else if (pll == &pll3_sw_clk) | ||
155 | return MX53_DPLL3_BASE; | ||
156 | else if (pll == &mx53_pll4_sw_clk) | ||
157 | return MX53_DPLL4_BASE; | ||
158 | else | ||
159 | BUG(); | ||
160 | |||
161 | return NULL; | ||
162 | } | ||
163 | |||
164 | static inline void __iomem *_get_pll_base(struct clk *pll) | ||
165 | { | ||
166 | if (cpu_is_mx51()) | ||
167 | return _mx51_get_pll_base(pll); | ||
168 | else | ||
169 | return _mx53_get_pll_base(pll); | ||
170 | } | ||
171 | |||
172 | static unsigned long clk_pll_get_rate(struct clk *clk) | ||
173 | { | ||
174 | long mfi, mfn, mfd, pdf, ref_clk, mfn_abs; | ||
175 | unsigned long dp_op, dp_mfd, dp_mfn, dp_ctl, pll_hfsm, dbl; | ||
176 | void __iomem *pllbase; | ||
177 | s64 temp; | ||
178 | unsigned long parent_rate; | ||
179 | |||
180 | parent_rate = clk_get_rate(clk->parent); | ||
181 | |||
182 | pllbase = _get_pll_base(clk); | ||
183 | |||
184 | dp_ctl = __raw_readl(pllbase + MXC_PLL_DP_CTL); | ||
185 | pll_hfsm = dp_ctl & MXC_PLL_DP_CTL_HFSM; | ||
186 | dbl = dp_ctl & MXC_PLL_DP_CTL_DPDCK0_2_EN; | ||
187 | |||
188 | if (pll_hfsm == 0) { | ||
189 | dp_op = __raw_readl(pllbase + MXC_PLL_DP_OP); | ||
190 | dp_mfd = __raw_readl(pllbase + MXC_PLL_DP_MFD); | ||
191 | dp_mfn = __raw_readl(pllbase + MXC_PLL_DP_MFN); | ||
192 | } else { | ||
193 | dp_op = __raw_readl(pllbase + MXC_PLL_DP_HFS_OP); | ||
194 | dp_mfd = __raw_readl(pllbase + MXC_PLL_DP_HFS_MFD); | ||
195 | dp_mfn = __raw_readl(pllbase + MXC_PLL_DP_HFS_MFN); | ||
196 | } | ||
197 | pdf = dp_op & MXC_PLL_DP_OP_PDF_MASK; | ||
198 | mfi = (dp_op & MXC_PLL_DP_OP_MFI_MASK) >> MXC_PLL_DP_OP_MFI_OFFSET; | ||
199 | mfi = (mfi <= 5) ? 5 : mfi; | ||
200 | mfd = dp_mfd & MXC_PLL_DP_MFD_MASK; | ||
201 | mfn = mfn_abs = dp_mfn & MXC_PLL_DP_MFN_MASK; | ||
202 | /* Sign extend to 32-bits */ | ||
203 | if (mfn >= 0x04000000) { | ||
204 | mfn |= 0xFC000000; | ||
205 | mfn_abs = -mfn; | ||
206 | } | ||
207 | |||
208 | ref_clk = 2 * parent_rate; | ||
209 | if (dbl != 0) | ||
210 | ref_clk *= 2; | ||
211 | |||
212 | ref_clk /= (pdf + 1); | ||
213 | temp = (u64) ref_clk * mfn_abs; | ||
214 | do_div(temp, mfd + 1); | ||
215 | if (mfn < 0) | ||
216 | temp = -temp; | ||
217 | temp = (ref_clk * mfi) + temp; | ||
218 | |||
219 | return temp; | ||
220 | } | ||
221 | |||
222 | static int _clk_pll_set_rate(struct clk *clk, unsigned long rate) | ||
223 | { | ||
224 | u32 reg; | ||
225 | void __iomem *pllbase; | ||
226 | |||
227 | long mfi, pdf, mfn, mfd = 999999; | ||
228 | s64 temp64; | ||
229 | unsigned long quad_parent_rate; | ||
230 | unsigned long pll_hfsm, dp_ctl; | ||
231 | unsigned long parent_rate; | ||
232 | |||
233 | parent_rate = clk_get_rate(clk->parent); | ||
234 | |||
235 | pllbase = _get_pll_base(clk); | ||
236 | |||
237 | quad_parent_rate = 4 * parent_rate; | ||
238 | pdf = mfi = -1; | ||
239 | while (++pdf < 16 && mfi < 5) | ||
240 | mfi = rate * (pdf+1) / quad_parent_rate; | ||
241 | if (mfi > 15) | ||
242 | return -EINVAL; | ||
243 | pdf--; | ||
244 | |||
245 | temp64 = rate * (pdf+1) - quad_parent_rate * mfi; | ||
246 | do_div(temp64, quad_parent_rate/1000000); | ||
247 | mfn = (long)temp64; | ||
248 | |||
249 | dp_ctl = __raw_readl(pllbase + MXC_PLL_DP_CTL); | ||
250 | /* use dpdck0_2 */ | ||
251 | __raw_writel(dp_ctl | 0x1000L, pllbase + MXC_PLL_DP_CTL); | ||
252 | pll_hfsm = dp_ctl & MXC_PLL_DP_CTL_HFSM; | ||
253 | if (pll_hfsm == 0) { | ||
254 | reg = mfi << 4 | pdf; | ||
255 | __raw_writel(reg, pllbase + MXC_PLL_DP_OP); | ||
256 | __raw_writel(mfd, pllbase + MXC_PLL_DP_MFD); | ||
257 | __raw_writel(mfn, pllbase + MXC_PLL_DP_MFN); | ||
258 | } else { | ||
259 | reg = mfi << 4 | pdf; | ||
260 | __raw_writel(reg, pllbase + MXC_PLL_DP_HFS_OP); | ||
261 | __raw_writel(mfd, pllbase + MXC_PLL_DP_HFS_MFD); | ||
262 | __raw_writel(mfn, pllbase + MXC_PLL_DP_HFS_MFN); | ||
263 | } | ||
264 | |||
265 | return 0; | ||
266 | } | ||
267 | |||
268 | static int _clk_pll_enable(struct clk *clk) | ||
269 | { | ||
270 | u32 reg; | ||
271 | void __iomem *pllbase; | ||
272 | int i = 0; | ||
273 | |||
274 | pllbase = _get_pll_base(clk); | ||
275 | reg = __raw_readl(pllbase + MXC_PLL_DP_CTL); | ||
276 | if (reg & MXC_PLL_DP_CTL_UPEN) | ||
277 | return 0; | ||
278 | |||
279 | reg |= MXC_PLL_DP_CTL_UPEN; | ||
280 | __raw_writel(reg, pllbase + MXC_PLL_DP_CTL); | ||
281 | |||
282 | /* Wait for lock */ | ||
283 | do { | ||
284 | reg = __raw_readl(pllbase + MXC_PLL_DP_CTL); | ||
285 | if (reg & MXC_PLL_DP_CTL_LRF) | ||
286 | break; | ||
287 | |||
288 | udelay(1); | ||
289 | } while (++i < MAX_DPLL_WAIT_TRIES); | ||
290 | |||
291 | if (i == MAX_DPLL_WAIT_TRIES) { | ||
292 | pr_err("MX5: pll locking failed\n"); | ||
293 | return -EINVAL; | ||
294 | } | ||
295 | |||
296 | return 0; | ||
297 | } | ||
298 | |||
299 | static void _clk_pll_disable(struct clk *clk) | ||
300 | { | ||
301 | u32 reg; | ||
302 | void __iomem *pllbase; | ||
303 | |||
304 | pllbase = _get_pll_base(clk); | ||
305 | reg = __raw_readl(pllbase + MXC_PLL_DP_CTL) & ~MXC_PLL_DP_CTL_UPEN; | ||
306 | __raw_writel(reg, pllbase + MXC_PLL_DP_CTL); | ||
307 | } | ||
308 | |||
309 | static int _clk_pll1_sw_set_parent(struct clk *clk, struct clk *parent) | ||
310 | { | ||
311 | u32 reg, step; | ||
312 | |||
313 | reg = __raw_readl(MXC_CCM_CCSR); | ||
314 | |||
315 | /* When switching from pll_main_clk to a bypass clock, first select a | ||
316 | * multiplexed clock in 'step_sel', then shift the glitchless mux | ||
317 | * 'pll1_sw_clk_sel'. | ||
318 | * | ||
319 | * When switching back, do it in reverse order | ||
320 | */ | ||
321 | if (parent == &pll1_main_clk) { | ||
322 | /* Switch to pll1_main_clk */ | ||
323 | reg &= ~MXC_CCM_CCSR_PLL1_SW_CLK_SEL; | ||
324 | __raw_writel(reg, MXC_CCM_CCSR); | ||
325 | /* step_clk mux switched to lp_apm, to save power. */ | ||
326 | reg = __raw_readl(MXC_CCM_CCSR); | ||
327 | reg &= ~MXC_CCM_CCSR_STEP_SEL_MASK; | ||
328 | reg |= (MXC_CCM_CCSR_STEP_SEL_LP_APM << | ||
329 | MXC_CCM_CCSR_STEP_SEL_OFFSET); | ||
330 | } else { | ||
331 | if (parent == &lp_apm_clk) { | ||
332 | step = MXC_CCM_CCSR_STEP_SEL_LP_APM; | ||
333 | } else if (parent == &pll2_sw_clk) { | ||
334 | step = MXC_CCM_CCSR_STEP_SEL_PLL2_DIVIDED; | ||
335 | } else if (parent == &pll3_sw_clk) { | ||
336 | step = MXC_CCM_CCSR_STEP_SEL_PLL3_DIVIDED; | ||
337 | } else | ||
338 | return -EINVAL; | ||
339 | |||
340 | reg &= ~MXC_CCM_CCSR_STEP_SEL_MASK; | ||
341 | reg |= (step << MXC_CCM_CCSR_STEP_SEL_OFFSET); | ||
342 | |||
343 | __raw_writel(reg, MXC_CCM_CCSR); | ||
344 | /* Switch to step_clk */ | ||
345 | reg = __raw_readl(MXC_CCM_CCSR); | ||
346 | reg |= MXC_CCM_CCSR_PLL1_SW_CLK_SEL; | ||
347 | } | ||
348 | __raw_writel(reg, MXC_CCM_CCSR); | ||
349 | return 0; | ||
350 | } | ||
351 | |||
352 | static unsigned long clk_pll1_sw_get_rate(struct clk *clk) | ||
353 | { | ||
354 | u32 reg, div; | ||
355 | unsigned long parent_rate; | ||
356 | |||
357 | parent_rate = clk_get_rate(clk->parent); | ||
358 | |||
359 | reg = __raw_readl(MXC_CCM_CCSR); | ||
360 | |||
361 | if (clk->parent == &pll2_sw_clk) { | ||
362 | div = ((reg & MXC_CCM_CCSR_PLL2_PODF_MASK) >> | ||
363 | MXC_CCM_CCSR_PLL2_PODF_OFFSET) + 1; | ||
364 | } else if (clk->parent == &pll3_sw_clk) { | ||
365 | div = ((reg & MXC_CCM_CCSR_PLL3_PODF_MASK) >> | ||
366 | MXC_CCM_CCSR_PLL3_PODF_OFFSET) + 1; | ||
367 | } else | ||
368 | div = 1; | ||
369 | return parent_rate / div; | ||
370 | } | ||
371 | |||
372 | static int _clk_pll2_sw_set_parent(struct clk *clk, struct clk *parent) | ||
373 | { | ||
374 | u32 reg; | ||
375 | |||
376 | reg = __raw_readl(MXC_CCM_CCSR); | ||
377 | |||
378 | if (parent == &pll2_sw_clk) | ||
379 | reg &= ~MXC_CCM_CCSR_PLL2_SW_CLK_SEL; | ||
380 | else | ||
381 | reg |= MXC_CCM_CCSR_PLL2_SW_CLK_SEL; | ||
382 | |||
383 | __raw_writel(reg, MXC_CCM_CCSR); | ||
384 | return 0; | ||
385 | } | ||
386 | |||
387 | static int _clk_lp_apm_set_parent(struct clk *clk, struct clk *parent) | ||
388 | { | ||
389 | u32 reg; | ||
390 | |||
391 | if (parent == &osc_clk) | ||
392 | reg = __raw_readl(MXC_CCM_CCSR) & ~MXC_CCM_CCSR_LP_APM_SEL; | ||
393 | else | ||
394 | return -EINVAL; | ||
395 | |||
396 | __raw_writel(reg, MXC_CCM_CCSR); | ||
397 | |||
398 | return 0; | ||
399 | } | ||
400 | |||
401 | static unsigned long clk_cpu_get_rate(struct clk *clk) | ||
402 | { | ||
403 | u32 cacrr, div; | ||
404 | unsigned long parent_rate; | ||
405 | |||
406 | parent_rate = clk_get_rate(clk->parent); | ||
407 | cacrr = __raw_readl(MXC_CCM_CACRR); | ||
408 | div = (cacrr & MXC_CCM_CACRR_ARM_PODF_MASK) + 1; | ||
409 | |||
410 | return parent_rate / div; | ||
411 | } | ||
412 | |||
413 | static int clk_cpu_set_rate(struct clk *clk, unsigned long rate) | ||
414 | { | ||
415 | u32 reg, cpu_podf; | ||
416 | unsigned long parent_rate; | ||
417 | |||
418 | parent_rate = clk_get_rate(clk->parent); | ||
419 | cpu_podf = parent_rate / rate - 1; | ||
420 | /* use post divider to change freq */ | ||
421 | reg = __raw_readl(MXC_CCM_CACRR); | ||
422 | reg &= ~MXC_CCM_CACRR_ARM_PODF_MASK; | ||
423 | reg |= cpu_podf << MXC_CCM_CACRR_ARM_PODF_OFFSET; | ||
424 | __raw_writel(reg, MXC_CCM_CACRR); | ||
425 | |||
426 | return 0; | ||
427 | } | ||
428 | |||
429 | static int _clk_periph_apm_set_parent(struct clk *clk, struct clk *parent) | ||
430 | { | ||
431 | u32 reg, mux; | ||
432 | int i = 0; | ||
433 | |||
434 | mux = _get_mux(parent, &pll1_sw_clk, &pll3_sw_clk, &lp_apm_clk, NULL); | ||
435 | |||
436 | reg = __raw_readl(MXC_CCM_CBCMR) & ~MXC_CCM_CBCMR_PERIPH_CLK_SEL_MASK; | ||
437 | reg |= mux << MXC_CCM_CBCMR_PERIPH_CLK_SEL_OFFSET; | ||
438 | __raw_writel(reg, MXC_CCM_CBCMR); | ||
439 | |||
440 | /* Wait for lock */ | ||
441 | do { | ||
442 | reg = __raw_readl(MXC_CCM_CDHIPR); | ||
443 | if (!(reg & MXC_CCM_CDHIPR_PERIPH_CLK_SEL_BUSY)) | ||
444 | break; | ||
445 | |||
446 | udelay(1); | ||
447 | } while (++i < MAX_DPLL_WAIT_TRIES); | ||
448 | |||
449 | if (i == MAX_DPLL_WAIT_TRIES) { | ||
450 | pr_err("MX5: Set parent for periph_apm clock failed\n"); | ||
451 | return -EINVAL; | ||
452 | } | ||
453 | |||
454 | return 0; | ||
455 | } | ||
456 | |||
457 | static int _clk_main_bus_set_parent(struct clk *clk, struct clk *parent) | ||
458 | { | ||
459 | u32 reg; | ||
460 | |||
461 | reg = __raw_readl(MXC_CCM_CBCDR); | ||
462 | |||
463 | if (parent == &pll2_sw_clk) | ||
464 | reg &= ~MXC_CCM_CBCDR_PERIPH_CLK_SEL; | ||
465 | else if (parent == &periph_apm_clk) | ||
466 | reg |= MXC_CCM_CBCDR_PERIPH_CLK_SEL; | ||
467 | else | ||
468 | return -EINVAL; | ||
469 | |||
470 | __raw_writel(reg, MXC_CCM_CBCDR); | ||
471 | |||
472 | return 0; | ||
473 | } | ||
474 | |||
475 | static struct clk main_bus_clk = { | ||
476 | .parent = &pll2_sw_clk, | ||
477 | .set_parent = _clk_main_bus_set_parent, | ||
478 | }; | ||
479 | |||
480 | static unsigned long clk_ahb_get_rate(struct clk *clk) | ||
481 | { | ||
482 | u32 reg, div; | ||
483 | unsigned long parent_rate; | ||
484 | |||
485 | parent_rate = clk_get_rate(clk->parent); | ||
486 | |||
487 | reg = __raw_readl(MXC_CCM_CBCDR); | ||
488 | div = ((reg & MXC_CCM_CBCDR_AHB_PODF_MASK) >> | ||
489 | MXC_CCM_CBCDR_AHB_PODF_OFFSET) + 1; | ||
490 | return parent_rate / div; | ||
491 | } | ||
492 | |||
493 | |||
494 | static int _clk_ahb_set_rate(struct clk *clk, unsigned long rate) | ||
495 | { | ||
496 | u32 reg, div; | ||
497 | unsigned long parent_rate; | ||
498 | int i = 0; | ||
499 | |||
500 | parent_rate = clk_get_rate(clk->parent); | ||
501 | |||
502 | div = parent_rate / rate; | ||
503 | if (div > 8 || div < 1 || ((parent_rate / div) != rate)) | ||
504 | return -EINVAL; | ||
505 | |||
506 | reg = __raw_readl(MXC_CCM_CBCDR); | ||
507 | reg &= ~MXC_CCM_CBCDR_AHB_PODF_MASK; | ||
508 | reg |= (div - 1) << MXC_CCM_CBCDR_AHB_PODF_OFFSET; | ||
509 | __raw_writel(reg, MXC_CCM_CBCDR); | ||
510 | |||
511 | /* Wait for lock */ | ||
512 | do { | ||
513 | reg = __raw_readl(MXC_CCM_CDHIPR); | ||
514 | if (!(reg & MXC_CCM_CDHIPR_AHB_PODF_BUSY)) | ||
515 | break; | ||
516 | |||
517 | udelay(1); | ||
518 | } while (++i < MAX_DPLL_WAIT_TRIES); | ||
519 | |||
520 | if (i == MAX_DPLL_WAIT_TRIES) { | ||
521 | pr_err("MX5: clk_ahb_set_rate failed\n"); | ||
522 | return -EINVAL; | ||
523 | } | ||
524 | |||
525 | return 0; | ||
526 | } | ||
527 | |||
528 | static unsigned long _clk_ahb_round_rate(struct clk *clk, | ||
529 | unsigned long rate) | ||
530 | { | ||
531 | u32 div; | ||
532 | unsigned long parent_rate; | ||
533 | |||
534 | parent_rate = clk_get_rate(clk->parent); | ||
535 | |||
536 | div = parent_rate / rate; | ||
537 | if (div > 8) | ||
538 | div = 8; | ||
539 | else if (div == 0) | ||
540 | div++; | ||
541 | return parent_rate / div; | ||
542 | } | ||
543 | |||
544 | |||
545 | static int _clk_max_enable(struct clk *clk) | ||
546 | { | ||
547 | u32 reg; | ||
548 | |||
549 | _clk_ccgr_enable(clk); | ||
550 | |||
551 | /* Handshake with MAX when LPM is entered. */ | ||
552 | reg = __raw_readl(MXC_CCM_CLPCR); | ||
553 | if (cpu_is_mx51()) | ||
554 | reg &= ~MX51_CCM_CLPCR_BYPASS_MAX_LPM_HS; | ||
555 | else if (cpu_is_mx53()) | ||
556 | reg &= ~MX53_CCM_CLPCR_BYPASS_MAX_LPM_HS; | ||
557 | __raw_writel(reg, MXC_CCM_CLPCR); | ||
558 | |||
559 | return 0; | ||
560 | } | ||
561 | |||
562 | static void _clk_max_disable(struct clk *clk) | ||
563 | { | ||
564 | u32 reg; | ||
565 | |||
566 | _clk_ccgr_disable_inwait(clk); | ||
567 | |||
568 | /* No Handshake with MAX when LPM is entered as its disabled. */ | ||
569 | reg = __raw_readl(MXC_CCM_CLPCR); | ||
570 | if (cpu_is_mx51()) | ||
571 | reg |= MX51_CCM_CLPCR_BYPASS_MAX_LPM_HS; | ||
572 | else if (cpu_is_mx53()) | ||
573 | reg &= ~MX53_CCM_CLPCR_BYPASS_MAX_LPM_HS; | ||
574 | __raw_writel(reg, MXC_CCM_CLPCR); | ||
575 | } | ||
576 | |||
577 | static unsigned long clk_ipg_get_rate(struct clk *clk) | ||
578 | { | ||
579 | u32 reg, div; | ||
580 | unsigned long parent_rate; | ||
581 | |||
582 | parent_rate = clk_get_rate(clk->parent); | ||
583 | |||
584 | reg = __raw_readl(MXC_CCM_CBCDR); | ||
585 | div = ((reg & MXC_CCM_CBCDR_IPG_PODF_MASK) >> | ||
586 | MXC_CCM_CBCDR_IPG_PODF_OFFSET) + 1; | ||
587 | |||
588 | return parent_rate / div; | ||
589 | } | ||
590 | |||
591 | static unsigned long clk_ipg_per_get_rate(struct clk *clk) | ||
592 | { | ||
593 | u32 reg, prediv1, prediv2, podf; | ||
594 | unsigned long parent_rate; | ||
595 | |||
596 | parent_rate = clk_get_rate(clk->parent); | ||
597 | |||
598 | if (clk->parent == &main_bus_clk || clk->parent == &lp_apm_clk) { | ||
599 | /* the main_bus_clk is the one before the DVFS engine */ | ||
600 | reg = __raw_readl(MXC_CCM_CBCDR); | ||
601 | prediv1 = ((reg & MXC_CCM_CBCDR_PERCLK_PRED1_MASK) >> | ||
602 | MXC_CCM_CBCDR_PERCLK_PRED1_OFFSET) + 1; | ||
603 | prediv2 = ((reg & MXC_CCM_CBCDR_PERCLK_PRED2_MASK) >> | ||
604 | MXC_CCM_CBCDR_PERCLK_PRED2_OFFSET) + 1; | ||
605 | podf = ((reg & MXC_CCM_CBCDR_PERCLK_PODF_MASK) >> | ||
606 | MXC_CCM_CBCDR_PERCLK_PODF_OFFSET) + 1; | ||
607 | return parent_rate / (prediv1 * prediv2 * podf); | ||
608 | } else if (clk->parent == &ipg_clk) | ||
609 | return parent_rate; | ||
610 | else | ||
611 | BUG(); | ||
612 | } | ||
613 | |||
614 | static int _clk_ipg_per_set_parent(struct clk *clk, struct clk *parent) | ||
615 | { | ||
616 | u32 reg; | ||
617 | |||
618 | reg = __raw_readl(MXC_CCM_CBCMR); | ||
619 | |||
620 | reg &= ~MXC_CCM_CBCMR_PERCLK_LP_APM_CLK_SEL; | ||
621 | reg &= ~MXC_CCM_CBCMR_PERCLK_IPG_CLK_SEL; | ||
622 | |||
623 | if (parent == &ipg_clk) | ||
624 | reg |= MXC_CCM_CBCMR_PERCLK_IPG_CLK_SEL; | ||
625 | else if (parent == &lp_apm_clk) | ||
626 | reg |= MXC_CCM_CBCMR_PERCLK_LP_APM_CLK_SEL; | ||
627 | else if (parent != &main_bus_clk) | ||
628 | return -EINVAL; | ||
629 | |||
630 | __raw_writel(reg, MXC_CCM_CBCMR); | ||
631 | |||
632 | return 0; | ||
633 | } | ||
634 | |||
635 | #define clk_nfc_set_parent NULL | ||
636 | |||
637 | static unsigned long clk_nfc_get_rate(struct clk *clk) | ||
638 | { | ||
639 | unsigned long rate; | ||
640 | u32 reg, div; | ||
641 | |||
642 | reg = __raw_readl(MXC_CCM_CBCDR); | ||
643 | div = ((reg & MXC_CCM_CBCDR_NFC_PODF_MASK) >> | ||
644 | MXC_CCM_CBCDR_NFC_PODF_OFFSET) + 1; | ||
645 | rate = clk_get_rate(clk->parent) / div; | ||
646 | WARN_ON(rate == 0); | ||
647 | return rate; | ||
648 | } | ||
649 | |||
650 | static unsigned long clk_nfc_round_rate(struct clk *clk, | ||
651 | unsigned long rate) | ||
652 | { | ||
653 | u32 div; | ||
654 | unsigned long parent_rate = clk_get_rate(clk->parent); | ||
655 | |||
656 | if (!rate) | ||
657 | return -EINVAL; | ||
658 | |||
659 | div = parent_rate / rate; | ||
660 | |||
661 | if (parent_rate % rate) | ||
662 | div++; | ||
663 | |||
664 | if (div > 8) | ||
665 | return -EINVAL; | ||
666 | |||
667 | return parent_rate / div; | ||
668 | |||
669 | } | ||
670 | |||
671 | static int clk_nfc_set_rate(struct clk *clk, unsigned long rate) | ||
672 | { | ||
673 | u32 reg, div; | ||
674 | |||
675 | div = clk_get_rate(clk->parent) / rate; | ||
676 | if (div == 0) | ||
677 | div++; | ||
678 | if (((clk_get_rate(clk->parent) / div) != rate) || (div > 8)) | ||
679 | return -EINVAL; | ||
680 | |||
681 | reg = __raw_readl(MXC_CCM_CBCDR); | ||
682 | reg &= ~MXC_CCM_CBCDR_NFC_PODF_MASK; | ||
683 | reg |= (div - 1) << MXC_CCM_CBCDR_NFC_PODF_OFFSET; | ||
684 | __raw_writel(reg, MXC_CCM_CBCDR); | ||
685 | |||
686 | while (__raw_readl(MXC_CCM_CDHIPR) & | ||
687 | MXC_CCM_CDHIPR_NFC_IPG_INT_MEM_PODF_BUSY){ | ||
688 | } | ||
689 | |||
690 | return 0; | ||
691 | } | ||
692 | |||
693 | static unsigned long get_high_reference_clock_rate(struct clk *clk) | ||
694 | { | ||
695 | return external_high_reference; | ||
696 | } | ||
697 | |||
698 | static unsigned long get_low_reference_clock_rate(struct clk *clk) | ||
699 | { | ||
700 | return external_low_reference; | ||
701 | } | ||
702 | |||
703 | static unsigned long get_oscillator_reference_clock_rate(struct clk *clk) | ||
704 | { | ||
705 | return oscillator_reference; | ||
706 | } | ||
707 | |||
708 | static unsigned long get_ckih2_reference_clock_rate(struct clk *clk) | ||
709 | { | ||
710 | return ckih2_reference; | ||
711 | } | ||
712 | |||
713 | static unsigned long clk_emi_slow_get_rate(struct clk *clk) | ||
714 | { | ||
715 | u32 reg, div; | ||
716 | |||
717 | reg = __raw_readl(MXC_CCM_CBCDR); | ||
718 | div = ((reg & MXC_CCM_CBCDR_EMI_PODF_MASK) >> | ||
719 | MXC_CCM_CBCDR_EMI_PODF_OFFSET) + 1; | ||
720 | |||
721 | return clk_get_rate(clk->parent) / div; | ||
722 | } | ||
723 | |||
724 | static unsigned long _clk_ddr_hf_get_rate(struct clk *clk) | ||
725 | { | ||
726 | unsigned long rate; | ||
727 | u32 reg, div; | ||
728 | |||
729 | reg = __raw_readl(MXC_CCM_CBCDR); | ||
730 | div = ((reg & MXC_CCM_CBCDR_DDR_PODF_MASK) >> | ||
731 | MXC_CCM_CBCDR_DDR_PODF_OFFSET) + 1; | ||
732 | rate = clk_get_rate(clk->parent) / div; | ||
733 | |||
734 | return rate; | ||
735 | } | ||
736 | |||
737 | /* External high frequency clock */ | ||
738 | static struct clk ckih_clk = { | ||
739 | .get_rate = get_high_reference_clock_rate, | ||
740 | }; | ||
741 | |||
742 | static struct clk ckih2_clk = { | ||
743 | .get_rate = get_ckih2_reference_clock_rate, | ||
744 | }; | ||
745 | |||
746 | static struct clk osc_clk = { | ||
747 | .get_rate = get_oscillator_reference_clock_rate, | ||
748 | }; | ||
749 | |||
750 | /* External low frequency (32kHz) clock */ | ||
751 | static struct clk ckil_clk = { | ||
752 | .get_rate = get_low_reference_clock_rate, | ||
753 | }; | ||
754 | |||
755 | static struct clk pll1_main_clk = { | ||
756 | .parent = &osc_clk, | ||
757 | .get_rate = clk_pll_get_rate, | ||
758 | .enable = _clk_pll_enable, | ||
759 | .disable = _clk_pll_disable, | ||
760 | }; | ||
761 | |||
762 | /* Clock tree block diagram (WIP): | ||
763 | * CCM: Clock Controller Module | ||
764 | * | ||
765 | * PLL output -> | | ||
766 | * | CCM Switcher -> CCM_CLK_ROOT_GEN -> | ||
767 | * PLL bypass -> | | ||
768 | * | ||
769 | */ | ||
770 | |||
771 | /* PLL1 SW supplies to ARM core */ | ||
772 | static struct clk pll1_sw_clk = { | ||
773 | .parent = &pll1_main_clk, | ||
774 | .set_parent = _clk_pll1_sw_set_parent, | ||
775 | .get_rate = clk_pll1_sw_get_rate, | ||
776 | }; | ||
777 | |||
778 | /* PLL2 SW supplies to AXI/AHB/IP buses */ | ||
779 | static struct clk pll2_sw_clk = { | ||
780 | .parent = &osc_clk, | ||
781 | .get_rate = clk_pll_get_rate, | ||
782 | .set_rate = _clk_pll_set_rate, | ||
783 | .set_parent = _clk_pll2_sw_set_parent, | ||
784 | .enable = _clk_pll_enable, | ||
785 | .disable = _clk_pll_disable, | ||
786 | }; | ||
787 | |||
788 | /* PLL3 SW supplies to serial clocks like USB, SSI, etc. */ | ||
789 | static struct clk pll3_sw_clk = { | ||
790 | .parent = &osc_clk, | ||
791 | .set_rate = _clk_pll_set_rate, | ||
792 | .get_rate = clk_pll_get_rate, | ||
793 | .enable = _clk_pll_enable, | ||
794 | .disable = _clk_pll_disable, | ||
795 | }; | ||
796 | |||
797 | /* PLL4 SW supplies to LVDS Display Bridge(LDB) */ | ||
798 | static struct clk mx53_pll4_sw_clk = { | ||
799 | .parent = &osc_clk, | ||
800 | .set_rate = _clk_pll_set_rate, | ||
801 | .enable = _clk_pll_enable, | ||
802 | .disable = _clk_pll_disable, | ||
803 | }; | ||
804 | |||
805 | /* Low-power Audio Playback Mode clock */ | ||
806 | static struct clk lp_apm_clk = { | ||
807 | .parent = &osc_clk, | ||
808 | .set_parent = _clk_lp_apm_set_parent, | ||
809 | }; | ||
810 | |||
811 | static struct clk periph_apm_clk = { | ||
812 | .parent = &pll1_sw_clk, | ||
813 | .set_parent = _clk_periph_apm_set_parent, | ||
814 | }; | ||
815 | |||
816 | static struct clk cpu_clk = { | ||
817 | .parent = &pll1_sw_clk, | ||
818 | .get_rate = clk_cpu_get_rate, | ||
819 | .set_rate = clk_cpu_set_rate, | ||
820 | }; | ||
821 | |||
822 | static struct clk ahb_clk = { | ||
823 | .parent = &main_bus_clk, | ||
824 | .get_rate = clk_ahb_get_rate, | ||
825 | .set_rate = _clk_ahb_set_rate, | ||
826 | .round_rate = _clk_ahb_round_rate, | ||
827 | }; | ||
828 | |||
829 | static struct clk iim_clk = { | ||
830 | .parent = &ipg_clk, | ||
831 | .enable_reg = MXC_CCM_CCGR0, | ||
832 | .enable_shift = MXC_CCM_CCGRx_CG15_OFFSET, | ||
833 | }; | ||
834 | |||
835 | /* Main IP interface clock for access to registers */ | ||
836 | static struct clk ipg_clk = { | ||
837 | .parent = &ahb_clk, | ||
838 | .get_rate = clk_ipg_get_rate, | ||
839 | }; | ||
840 | |||
841 | static struct clk ipg_perclk = { | ||
842 | .parent = &lp_apm_clk, | ||
843 | .get_rate = clk_ipg_per_get_rate, | ||
844 | .set_parent = _clk_ipg_per_set_parent, | ||
845 | }; | ||
846 | |||
847 | static struct clk ahb_max_clk = { | ||
848 | .parent = &ahb_clk, | ||
849 | .enable_reg = MXC_CCM_CCGR0, | ||
850 | .enable_shift = MXC_CCM_CCGRx_CG14_OFFSET, | ||
851 | .enable = _clk_max_enable, | ||
852 | .disable = _clk_max_disable, | ||
853 | }; | ||
854 | |||
855 | static struct clk aips_tz1_clk = { | ||
856 | .parent = &ahb_clk, | ||
857 | .secondary = &ahb_max_clk, | ||
858 | .enable_reg = MXC_CCM_CCGR0, | ||
859 | .enable_shift = MXC_CCM_CCGRx_CG12_OFFSET, | ||
860 | .enable = _clk_ccgr_enable, | ||
861 | .disable = _clk_ccgr_disable_inwait, | ||
862 | }; | ||
863 | |||
864 | static struct clk aips_tz2_clk = { | ||
865 | .parent = &ahb_clk, | ||
866 | .secondary = &ahb_max_clk, | ||
867 | .enable_reg = MXC_CCM_CCGR0, | ||
868 | .enable_shift = MXC_CCM_CCGRx_CG13_OFFSET, | ||
869 | .enable = _clk_ccgr_enable, | ||
870 | .disable = _clk_ccgr_disable_inwait, | ||
871 | }; | ||
872 | |||
873 | static struct clk gpc_dvfs_clk = { | ||
874 | .enable_reg = MXC_CCM_CCGR5, | ||
875 | .enable_shift = MXC_CCM_CCGRx_CG12_OFFSET, | ||
876 | .enable = _clk_ccgr_enable, | ||
877 | .disable = _clk_ccgr_disable, | ||
878 | }; | ||
879 | |||
880 | static struct clk gpt_32k_clk = { | ||
881 | .id = 0, | ||
882 | .parent = &ckil_clk, | ||
883 | }; | ||
884 | |||
885 | static struct clk dummy_clk = { | ||
886 | .id = 0, | ||
887 | }; | ||
888 | |||
889 | static struct clk emi_slow_clk = { | ||
890 | .parent = &pll2_sw_clk, | ||
891 | .enable_reg = MXC_CCM_CCGR5, | ||
892 | .enable_shift = MXC_CCM_CCGRx_CG8_OFFSET, | ||
893 | .enable = _clk_ccgr_enable, | ||
894 | .disable = _clk_ccgr_disable_inwait, | ||
895 | .get_rate = clk_emi_slow_get_rate, | ||
896 | }; | ||
897 | |||
898 | static int clk_ipu_enable(struct clk *clk) | ||
899 | { | ||
900 | u32 reg; | ||
901 | |||
902 | _clk_ccgr_enable(clk); | ||
903 | |||
904 | /* Enable handshake with IPU when certain clock rates are changed */ | ||
905 | reg = __raw_readl(MXC_CCM_CCDR); | ||
906 | reg &= ~MXC_CCM_CCDR_IPU_HS_MASK; | ||
907 | __raw_writel(reg, MXC_CCM_CCDR); | ||
908 | |||
909 | /* Enable handshake with IPU when LPM is entered */ | ||
910 | reg = __raw_readl(MXC_CCM_CLPCR); | ||
911 | reg &= ~MXC_CCM_CLPCR_BYPASS_IPU_LPM_HS; | ||
912 | __raw_writel(reg, MXC_CCM_CLPCR); | ||
913 | |||
914 | return 0; | ||
915 | } | ||
916 | |||
917 | static void clk_ipu_disable(struct clk *clk) | ||
918 | { | ||
919 | u32 reg; | ||
920 | |||
921 | _clk_ccgr_disable(clk); | ||
922 | |||
923 | /* Disable handshake with IPU whe dividers are changed */ | ||
924 | reg = __raw_readl(MXC_CCM_CCDR); | ||
925 | reg |= MXC_CCM_CCDR_IPU_HS_MASK; | ||
926 | __raw_writel(reg, MXC_CCM_CCDR); | ||
927 | |||
928 | /* Disable handshake with IPU when LPM is entered */ | ||
929 | reg = __raw_readl(MXC_CCM_CLPCR); | ||
930 | reg |= MXC_CCM_CLPCR_BYPASS_IPU_LPM_HS; | ||
931 | __raw_writel(reg, MXC_CCM_CLPCR); | ||
932 | } | ||
933 | |||
934 | static struct clk ahbmux1_clk = { | ||
935 | .parent = &ahb_clk, | ||
936 | .secondary = &ahb_max_clk, | ||
937 | .enable_reg = MXC_CCM_CCGR0, | ||
938 | .enable_shift = MXC_CCM_CCGRx_CG8_OFFSET, | ||
939 | .enable = _clk_ccgr_enable, | ||
940 | .disable = _clk_ccgr_disable_inwait, | ||
941 | }; | ||
942 | |||
943 | static struct clk ipu_sec_clk = { | ||
944 | .parent = &emi_fast_clk, | ||
945 | .secondary = &ahbmux1_clk, | ||
946 | }; | ||
947 | |||
948 | static struct clk ddr_hf_clk = { | ||
949 | .parent = &pll1_sw_clk, | ||
950 | .get_rate = _clk_ddr_hf_get_rate, | ||
951 | }; | ||
952 | |||
953 | static struct clk ddr_clk = { | ||
954 | .parent = &ddr_hf_clk, | ||
955 | }; | ||
956 | |||
957 | /* clock definitions for MIPI HSC unit which has been removed | ||
958 | * from documentation, but not from hardware | ||
959 | */ | ||
960 | static int _clk_hsc_enable(struct clk *clk) | ||
961 | { | ||
962 | u32 reg; | ||
963 | |||
964 | _clk_ccgr_enable(clk); | ||
965 | /* Handshake with IPU when certain clock rates are changed. */ | ||
966 | reg = __raw_readl(MXC_CCM_CCDR); | ||
967 | reg &= ~MXC_CCM_CCDR_HSC_HS_MASK; | ||
968 | __raw_writel(reg, MXC_CCM_CCDR); | ||
969 | |||
970 | reg = __raw_readl(MXC_CCM_CLPCR); | ||
971 | reg &= ~MXC_CCM_CLPCR_BYPASS_HSC_LPM_HS; | ||
972 | __raw_writel(reg, MXC_CCM_CLPCR); | ||
973 | |||
974 | return 0; | ||
975 | } | ||
976 | |||
977 | static void _clk_hsc_disable(struct clk *clk) | ||
978 | { | ||
979 | u32 reg; | ||
980 | |||
981 | _clk_ccgr_disable(clk); | ||
982 | /* No handshake with HSC as its not enabled. */ | ||
983 | reg = __raw_readl(MXC_CCM_CCDR); | ||
984 | reg |= MXC_CCM_CCDR_HSC_HS_MASK; | ||
985 | __raw_writel(reg, MXC_CCM_CCDR); | ||
986 | |||
987 | reg = __raw_readl(MXC_CCM_CLPCR); | ||
988 | reg |= MXC_CCM_CLPCR_BYPASS_HSC_LPM_HS; | ||
989 | __raw_writel(reg, MXC_CCM_CLPCR); | ||
990 | } | ||
991 | |||
992 | static struct clk mipi_hsp_clk = { | ||
993 | .parent = &ipu_clk, | ||
994 | .enable_reg = MXC_CCM_CCGR4, | ||
995 | .enable_shift = MXC_CCM_CCGRx_CG6_OFFSET, | ||
996 | .enable = _clk_hsc_enable, | ||
997 | .disable = _clk_hsc_disable, | ||
998 | .secondary = &mipi_hsc1_clk, | ||
999 | }; | ||
1000 | |||
1001 | #define DEFINE_CLOCK_CCGR(name, i, er, es, pfx, p, s) \ | ||
1002 | static struct clk name = { \ | ||
1003 | .id = i, \ | ||
1004 | .enable_reg = er, \ | ||
1005 | .enable_shift = es, \ | ||
1006 | .get_rate = pfx##_get_rate, \ | ||
1007 | .set_rate = pfx##_set_rate, \ | ||
1008 | .round_rate = pfx##_round_rate, \ | ||
1009 | .set_parent = pfx##_set_parent, \ | ||
1010 | .enable = _clk_ccgr_enable, \ | ||
1011 | .disable = _clk_ccgr_disable, \ | ||
1012 | .parent = p, \ | ||
1013 | .secondary = s, \ | ||
1014 | } | ||
1015 | |||
1016 | #define DEFINE_CLOCK_MAX(name, i, er, es, pfx, p, s) \ | ||
1017 | static struct clk name = { \ | ||
1018 | .id = i, \ | ||
1019 | .enable_reg = er, \ | ||
1020 | .enable_shift = es, \ | ||
1021 | .get_rate = pfx##_get_rate, \ | ||
1022 | .set_rate = pfx##_set_rate, \ | ||
1023 | .set_parent = pfx##_set_parent, \ | ||
1024 | .enable = _clk_max_enable, \ | ||
1025 | .disable = _clk_max_disable, \ | ||
1026 | .parent = p, \ | ||
1027 | .secondary = s, \ | ||
1028 | } | ||
1029 | |||
1030 | #define CLK_GET_RATE(name, nr, bitsname) \ | ||
1031 | static unsigned long clk_##name##_get_rate(struct clk *clk) \ | ||
1032 | { \ | ||
1033 | u32 reg, pred, podf; \ | ||
1034 | \ | ||
1035 | reg = __raw_readl(MXC_CCM_CSCDR##nr); \ | ||
1036 | pred = (reg & MXC_CCM_CSCDR##nr##_##bitsname##_CLK_PRED_MASK) \ | ||
1037 | >> MXC_CCM_CSCDR##nr##_##bitsname##_CLK_PRED_OFFSET; \ | ||
1038 | podf = (reg & MXC_CCM_CSCDR##nr##_##bitsname##_CLK_PODF_MASK) \ | ||
1039 | >> MXC_CCM_CSCDR##nr##_##bitsname##_CLK_PODF_OFFSET; \ | ||
1040 | \ | ||
1041 | return DIV_ROUND_CLOSEST(clk_get_rate(clk->parent), \ | ||
1042 | (pred + 1) * (podf + 1)); \ | ||
1043 | } | ||
1044 | |||
1045 | #define CLK_SET_PARENT(name, nr, bitsname) \ | ||
1046 | static int clk_##name##_set_parent(struct clk *clk, struct clk *parent) \ | ||
1047 | { \ | ||
1048 | u32 reg, mux; \ | ||
1049 | \ | ||
1050 | mux = _get_mux(parent, &pll1_sw_clk, &pll2_sw_clk, \ | ||
1051 | &pll3_sw_clk, &lp_apm_clk); \ | ||
1052 | reg = __raw_readl(MXC_CCM_CSCMR##nr) & \ | ||
1053 | ~MXC_CCM_CSCMR##nr##_##bitsname##_CLK_SEL_MASK; \ | ||
1054 | reg |= mux << MXC_CCM_CSCMR##nr##_##bitsname##_CLK_SEL_OFFSET; \ | ||
1055 | __raw_writel(reg, MXC_CCM_CSCMR##nr); \ | ||
1056 | \ | ||
1057 | return 0; \ | ||
1058 | } | ||
1059 | |||
1060 | #define CLK_SET_RATE(name, nr, bitsname) \ | ||
1061 | static int clk_##name##_set_rate(struct clk *clk, unsigned long rate) \ | ||
1062 | { \ | ||
1063 | u32 reg, div, parent_rate; \ | ||
1064 | u32 pre = 0, post = 0; \ | ||
1065 | \ | ||
1066 | parent_rate = clk_get_rate(clk->parent); \ | ||
1067 | div = parent_rate / rate; \ | ||
1068 | \ | ||
1069 | if ((parent_rate / div) != rate) \ | ||
1070 | return -EINVAL; \ | ||
1071 | \ | ||
1072 | __calc_pre_post_dividers(div, &pre, &post, \ | ||
1073 | (MXC_CCM_CSCDR##nr##_##bitsname##_CLK_PRED_MASK >> \ | ||
1074 | MXC_CCM_CSCDR##nr##_##bitsname##_CLK_PRED_OFFSET) + 1, \ | ||
1075 | (MXC_CCM_CSCDR##nr##_##bitsname##_CLK_PODF_MASK >> \ | ||
1076 | MXC_CCM_CSCDR##nr##_##bitsname##_CLK_PODF_OFFSET) + 1);\ | ||
1077 | \ | ||
1078 | /* Set sdhc1 clock divider */ \ | ||
1079 | reg = __raw_readl(MXC_CCM_CSCDR##nr) & \ | ||
1080 | ~(MXC_CCM_CSCDR##nr##_##bitsname##_CLK_PRED_MASK \ | ||
1081 | | MXC_CCM_CSCDR##nr##_##bitsname##_CLK_PODF_MASK); \ | ||
1082 | reg |= (post - 1) << \ | ||
1083 | MXC_CCM_CSCDR##nr##_##bitsname##_CLK_PODF_OFFSET; \ | ||
1084 | reg |= (pre - 1) << \ | ||
1085 | MXC_CCM_CSCDR##nr##_##bitsname##_CLK_PRED_OFFSET; \ | ||
1086 | __raw_writel(reg, MXC_CCM_CSCDR##nr); \ | ||
1087 | \ | ||
1088 | return 0; \ | ||
1089 | } | ||
1090 | |||
1091 | /* UART */ | ||
1092 | CLK_GET_RATE(uart, 1, UART) | ||
1093 | CLK_SET_PARENT(uart, 1, UART) | ||
1094 | |||
1095 | static struct clk uart_root_clk = { | ||
1096 | .parent = &pll2_sw_clk, | ||
1097 | .get_rate = clk_uart_get_rate, | ||
1098 | .set_parent = clk_uart_set_parent, | ||
1099 | }; | ||
1100 | |||
1101 | /* USBOH3 */ | ||
1102 | CLK_GET_RATE(usboh3, 1, USBOH3) | ||
1103 | CLK_SET_PARENT(usboh3, 1, USBOH3) | ||
1104 | |||
1105 | static struct clk usboh3_clk = { | ||
1106 | .parent = &pll2_sw_clk, | ||
1107 | .get_rate = clk_usboh3_get_rate, | ||
1108 | .set_parent = clk_usboh3_set_parent, | ||
1109 | .enable = _clk_ccgr_enable, | ||
1110 | .disable = _clk_ccgr_disable, | ||
1111 | .enable_reg = MXC_CCM_CCGR2, | ||
1112 | .enable_shift = MXC_CCM_CCGRx_CG14_OFFSET, | ||
1113 | }; | ||
1114 | |||
1115 | static struct clk usb_ahb_clk = { | ||
1116 | .parent = &ipg_clk, | ||
1117 | .enable = _clk_ccgr_enable, | ||
1118 | .disable = _clk_ccgr_disable, | ||
1119 | .enable_reg = MXC_CCM_CCGR2, | ||
1120 | .enable_shift = MXC_CCM_CCGRx_CG13_OFFSET, | ||
1121 | }; | ||
1122 | |||
1123 | static int clk_usb_phy1_set_parent(struct clk *clk, struct clk *parent) | ||
1124 | { | ||
1125 | u32 reg; | ||
1126 | |||
1127 | reg = __raw_readl(MXC_CCM_CSCMR1) & ~MXC_CCM_CSCMR1_USB_PHY_CLK_SEL; | ||
1128 | |||
1129 | if (parent == &pll3_sw_clk) | ||
1130 | reg |= 1 << MXC_CCM_CSCMR1_USB_PHY_CLK_SEL_OFFSET; | ||
1131 | |||
1132 | __raw_writel(reg, MXC_CCM_CSCMR1); | ||
1133 | |||
1134 | return 0; | ||
1135 | } | ||
1136 | |||
1137 | static struct clk usb_phy1_clk = { | ||
1138 | .parent = &pll3_sw_clk, | ||
1139 | .set_parent = clk_usb_phy1_set_parent, | ||
1140 | .enable = _clk_ccgr_enable, | ||
1141 | .enable_reg = MXC_CCM_CCGR2, | ||
1142 | .enable_shift = MXC_CCM_CCGRx_CG0_OFFSET, | ||
1143 | .disable = _clk_ccgr_disable, | ||
1144 | }; | ||
1145 | |||
1146 | /* eCSPI */ | ||
1147 | CLK_GET_RATE(ecspi, 2, CSPI) | ||
1148 | CLK_SET_PARENT(ecspi, 1, CSPI) | ||
1149 | |||
1150 | static struct clk ecspi_main_clk = { | ||
1151 | .parent = &pll3_sw_clk, | ||
1152 | .get_rate = clk_ecspi_get_rate, | ||
1153 | .set_parent = clk_ecspi_set_parent, | ||
1154 | }; | ||
1155 | |||
1156 | /* eSDHC */ | ||
1157 | CLK_GET_RATE(esdhc1, 1, ESDHC1_MSHC1) | ||
1158 | CLK_SET_PARENT(esdhc1, 1, ESDHC1_MSHC1) | ||
1159 | CLK_SET_RATE(esdhc1, 1, ESDHC1_MSHC1) | ||
1160 | |||
1161 | /* mx51 specific */ | ||
1162 | CLK_GET_RATE(esdhc2, 1, ESDHC2_MSHC2) | ||
1163 | CLK_SET_PARENT(esdhc2, 1, ESDHC2_MSHC2) | ||
1164 | CLK_SET_RATE(esdhc2, 1, ESDHC2_MSHC2) | ||
1165 | |||
1166 | static int clk_esdhc3_set_parent(struct clk *clk, struct clk *parent) | ||
1167 | { | ||
1168 | u32 reg; | ||
1169 | |||
1170 | reg = __raw_readl(MXC_CCM_CSCMR1); | ||
1171 | if (parent == &esdhc1_clk) | ||
1172 | reg &= ~MXC_CCM_CSCMR1_ESDHC3_CLK_SEL; | ||
1173 | else if (parent == &esdhc2_clk) | ||
1174 | reg |= MXC_CCM_CSCMR1_ESDHC3_CLK_SEL; | ||
1175 | else | ||
1176 | return -EINVAL; | ||
1177 | __raw_writel(reg, MXC_CCM_CSCMR1); | ||
1178 | |||
1179 | return 0; | ||
1180 | } | ||
1181 | |||
1182 | static int clk_esdhc4_set_parent(struct clk *clk, struct clk *parent) | ||
1183 | { | ||
1184 | u32 reg; | ||
1185 | |||
1186 | reg = __raw_readl(MXC_CCM_CSCMR1); | ||
1187 | if (parent == &esdhc1_clk) | ||
1188 | reg &= ~MXC_CCM_CSCMR1_ESDHC4_CLK_SEL; | ||
1189 | else if (parent == &esdhc2_clk) | ||
1190 | reg |= MXC_CCM_CSCMR1_ESDHC4_CLK_SEL; | ||
1191 | else | ||
1192 | return -EINVAL; | ||
1193 | __raw_writel(reg, MXC_CCM_CSCMR1); | ||
1194 | |||
1195 | return 0; | ||
1196 | } | ||
1197 | |||
1198 | /* mx53 specific */ | ||
1199 | static int clk_esdhc2_mx53_set_parent(struct clk *clk, struct clk *parent) | ||
1200 | { | ||
1201 | u32 reg; | ||
1202 | |||
1203 | reg = __raw_readl(MXC_CCM_CSCMR1); | ||
1204 | if (parent == &esdhc1_clk) | ||
1205 | reg &= ~MXC_CCM_CSCMR1_ESDHC2_MSHC2_MX53_CLK_SEL; | ||
1206 | else if (parent == &esdhc3_mx53_clk) | ||
1207 | reg |= MXC_CCM_CSCMR1_ESDHC2_MSHC2_MX53_CLK_SEL; | ||
1208 | else | ||
1209 | return -EINVAL; | ||
1210 | __raw_writel(reg, MXC_CCM_CSCMR1); | ||
1211 | |||
1212 | return 0; | ||
1213 | } | ||
1214 | |||
1215 | CLK_GET_RATE(esdhc3_mx53, 1, ESDHC3_MX53) | ||
1216 | CLK_SET_PARENT(esdhc3_mx53, 1, ESDHC3_MX53) | ||
1217 | CLK_SET_RATE(esdhc3_mx53, 1, ESDHC3_MX53) | ||
1218 | |||
1219 | static int clk_esdhc4_mx53_set_parent(struct clk *clk, struct clk *parent) | ||
1220 | { | ||
1221 | u32 reg; | ||
1222 | |||
1223 | reg = __raw_readl(MXC_CCM_CSCMR1); | ||
1224 | if (parent == &esdhc1_clk) | ||
1225 | reg &= ~MXC_CCM_CSCMR1_ESDHC4_CLK_SEL; | ||
1226 | else if (parent == &esdhc3_mx53_clk) | ||
1227 | reg |= MXC_CCM_CSCMR1_ESDHC4_CLK_SEL; | ||
1228 | else | ||
1229 | return -EINVAL; | ||
1230 | __raw_writel(reg, MXC_CCM_CSCMR1); | ||
1231 | |||
1232 | return 0; | ||
1233 | } | ||
1234 | |||
1235 | #define DEFINE_CLOCK_FULL(name, i, er, es, gr, sr, e, d, p, s) \ | ||
1236 | static struct clk name = { \ | ||
1237 | .id = i, \ | ||
1238 | .enable_reg = er, \ | ||
1239 | .enable_shift = es, \ | ||
1240 | .get_rate = gr, \ | ||
1241 | .set_rate = sr, \ | ||
1242 | .enable = e, \ | ||
1243 | .disable = d, \ | ||
1244 | .parent = p, \ | ||
1245 | .secondary = s, \ | ||
1246 | } | ||
1247 | |||
1248 | #define DEFINE_CLOCK(name, i, er, es, gr, sr, p, s) \ | ||
1249 | DEFINE_CLOCK_FULL(name, i, er, es, gr, sr, _clk_ccgr_enable, _clk_ccgr_disable, p, s) | ||
1250 | |||
1251 | /* Shared peripheral bus arbiter */ | ||
1252 | DEFINE_CLOCK(spba_clk, 0, MXC_CCM_CCGR5, MXC_CCM_CCGRx_CG0_OFFSET, | ||
1253 | NULL, NULL, &ipg_clk, NULL); | ||
1254 | |||
1255 | /* UART */ | ||
1256 | DEFINE_CLOCK(uart1_ipg_clk, 0, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG3_OFFSET, | ||
1257 | NULL, NULL, &ipg_clk, &aips_tz1_clk); | ||
1258 | DEFINE_CLOCK(uart2_ipg_clk, 1, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG5_OFFSET, | ||
1259 | NULL, NULL, &ipg_clk, &aips_tz1_clk); | ||
1260 | DEFINE_CLOCK(uart3_ipg_clk, 2, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG7_OFFSET, | ||
1261 | NULL, NULL, &ipg_clk, &spba_clk); | ||
1262 | DEFINE_CLOCK(uart4_ipg_clk, 3, MXC_CCM_CCGR7, MXC_CCM_CCGRx_CG4_OFFSET, | ||
1263 | NULL, NULL, &ipg_clk, &spba_clk); | ||
1264 | DEFINE_CLOCK(uart5_ipg_clk, 4, MXC_CCM_CCGR7, MXC_CCM_CCGRx_CG6_OFFSET, | ||
1265 | NULL, NULL, &ipg_clk, &spba_clk); | ||
1266 | DEFINE_CLOCK(uart1_clk, 0, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG4_OFFSET, | ||
1267 | NULL, NULL, &uart_root_clk, &uart1_ipg_clk); | ||
1268 | DEFINE_CLOCK(uart2_clk, 1, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG6_OFFSET, | ||
1269 | NULL, NULL, &uart_root_clk, &uart2_ipg_clk); | ||
1270 | DEFINE_CLOCK(uart3_clk, 2, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG8_OFFSET, | ||
1271 | NULL, NULL, &uart_root_clk, &uart3_ipg_clk); | ||
1272 | DEFINE_CLOCK(uart4_clk, 3, MXC_CCM_CCGR7, MXC_CCM_CCGRx_CG5_OFFSET, | ||
1273 | NULL, NULL, &uart_root_clk, &uart4_ipg_clk); | ||
1274 | DEFINE_CLOCK(uart5_clk, 4, MXC_CCM_CCGR7, MXC_CCM_CCGRx_CG7_OFFSET, | ||
1275 | NULL, NULL, &uart_root_clk, &uart5_ipg_clk); | ||
1276 | |||
1277 | /* GPT */ | ||
1278 | DEFINE_CLOCK(gpt_ipg_clk, 0, MXC_CCM_CCGR2, MXC_CCM_CCGRx_CG10_OFFSET, | ||
1279 | NULL, NULL, &ipg_clk, NULL); | ||
1280 | DEFINE_CLOCK(gpt_clk, 0, MXC_CCM_CCGR2, MXC_CCM_CCGRx_CG9_OFFSET, | ||
1281 | NULL, NULL, &ipg_clk, &gpt_ipg_clk); | ||
1282 | |||
1283 | DEFINE_CLOCK(pwm1_clk, 0, MXC_CCM_CCGR2, MXC_CCM_CCGRx_CG6_OFFSET, | ||
1284 | NULL, NULL, &ipg_perclk, NULL); | ||
1285 | DEFINE_CLOCK(pwm2_clk, 0, MXC_CCM_CCGR2, MXC_CCM_CCGRx_CG8_OFFSET, | ||
1286 | NULL, NULL, &ipg_perclk, NULL); | ||
1287 | |||
1288 | /* I2C */ | ||
1289 | DEFINE_CLOCK(i2c1_clk, 0, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG9_OFFSET, | ||
1290 | NULL, NULL, &ipg_perclk, NULL); | ||
1291 | DEFINE_CLOCK(i2c2_clk, 1, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG10_OFFSET, | ||
1292 | NULL, NULL, &ipg_perclk, NULL); | ||
1293 | DEFINE_CLOCK(hsi2c_clk, 0, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG11_OFFSET, | ||
1294 | NULL, NULL, &ipg_clk, NULL); | ||
1295 | DEFINE_CLOCK(i2c3_mx53_clk, 0, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG11_OFFSET, | ||
1296 | NULL, NULL, &ipg_perclk, NULL); | ||
1297 | |||
1298 | /* FEC */ | ||
1299 | DEFINE_CLOCK(fec_clk, 0, MXC_CCM_CCGR2, MXC_CCM_CCGRx_CG12_OFFSET, | ||
1300 | NULL, NULL, &ipg_clk, NULL); | ||
1301 | |||
1302 | /* NFC */ | ||
1303 | DEFINE_CLOCK_CCGR(nfc_clk, 0, MXC_CCM_CCGR5, MXC_CCM_CCGRx_CG10_OFFSET, | ||
1304 | clk_nfc, &emi_slow_clk, NULL); | ||
1305 | |||
1306 | /* SSI */ | ||
1307 | DEFINE_CLOCK(ssi1_ipg_clk, 0, MXC_CCM_CCGR3, MXC_CCM_CCGRx_CG8_OFFSET, | ||
1308 | NULL, NULL, &ipg_clk, NULL); | ||
1309 | DEFINE_CLOCK(ssi1_clk, 0, MXC_CCM_CCGR3, MXC_CCM_CCGRx_CG9_OFFSET, | ||
1310 | NULL, NULL, &pll3_sw_clk, &ssi1_ipg_clk); | ||
1311 | DEFINE_CLOCK(ssi2_ipg_clk, 1, MXC_CCM_CCGR3, MXC_CCM_CCGRx_CG10_OFFSET, | ||
1312 | NULL, NULL, &ipg_clk, NULL); | ||
1313 | DEFINE_CLOCK(ssi2_clk, 1, MXC_CCM_CCGR3, MXC_CCM_CCGRx_CG11_OFFSET, | ||
1314 | NULL, NULL, &pll3_sw_clk, &ssi2_ipg_clk); | ||
1315 | DEFINE_CLOCK(ssi3_ipg_clk, 2, MXC_CCM_CCGR3, MXC_CCM_CCGRx_CG12_OFFSET, | ||
1316 | NULL, NULL, &ipg_clk, NULL); | ||
1317 | DEFINE_CLOCK(ssi3_clk, 2, MXC_CCM_CCGR3, MXC_CCM_CCGRx_CG13_OFFSET, | ||
1318 | NULL, NULL, &pll3_sw_clk, &ssi3_ipg_clk); | ||
1319 | |||
1320 | /* eCSPI */ | ||
1321 | DEFINE_CLOCK_FULL(ecspi1_ipg_clk, 0, MXC_CCM_CCGR4, MXC_CCM_CCGRx_CG9_OFFSET, | ||
1322 | NULL, NULL, _clk_ccgr_enable_inrun, _clk_ccgr_disable, | ||
1323 | &ipg_clk, &spba_clk); | ||
1324 | DEFINE_CLOCK(ecspi1_clk, 0, MXC_CCM_CCGR4, MXC_CCM_CCGRx_CG10_OFFSET, | ||
1325 | NULL, NULL, &ecspi_main_clk, &ecspi1_ipg_clk); | ||
1326 | DEFINE_CLOCK_FULL(ecspi2_ipg_clk, 0, MXC_CCM_CCGR4, MXC_CCM_CCGRx_CG11_OFFSET, | ||
1327 | NULL, NULL, _clk_ccgr_enable_inrun, _clk_ccgr_disable, | ||
1328 | &ipg_clk, &aips_tz2_clk); | ||
1329 | DEFINE_CLOCK(ecspi2_clk, 0, MXC_CCM_CCGR4, MXC_CCM_CCGRx_CG12_OFFSET, | ||
1330 | NULL, NULL, &ecspi_main_clk, &ecspi2_ipg_clk); | ||
1331 | |||
1332 | /* CSPI */ | ||
1333 | DEFINE_CLOCK(cspi_ipg_clk, 0, MXC_CCM_CCGR4, MXC_CCM_CCGRx_CG9_OFFSET, | ||
1334 | NULL, NULL, &ipg_clk, &aips_tz2_clk); | ||
1335 | DEFINE_CLOCK(cspi_clk, 0, MXC_CCM_CCGR4, MXC_CCM_CCGRx_CG13_OFFSET, | ||
1336 | NULL, NULL, &ipg_clk, &cspi_ipg_clk); | ||
1337 | |||
1338 | /* SDMA */ | ||
1339 | DEFINE_CLOCK(sdma_clk, 1, MXC_CCM_CCGR4, MXC_CCM_CCGRx_CG15_OFFSET, | ||
1340 | NULL, NULL, &ahb_clk, NULL); | ||
1341 | |||
1342 | /* eSDHC */ | ||
1343 | DEFINE_CLOCK_FULL(esdhc1_ipg_clk, 0, MXC_CCM_CCGR3, MXC_CCM_CCGRx_CG0_OFFSET, | ||
1344 | NULL, NULL, _clk_max_enable, _clk_max_disable, &ipg_clk, NULL); | ||
1345 | DEFINE_CLOCK_MAX(esdhc1_clk, 0, MXC_CCM_CCGR3, MXC_CCM_CCGRx_CG1_OFFSET, | ||
1346 | clk_esdhc1, &pll2_sw_clk, &esdhc1_ipg_clk); | ||
1347 | DEFINE_CLOCK_FULL(esdhc2_ipg_clk, 1, MXC_CCM_CCGR3, MXC_CCM_CCGRx_CG2_OFFSET, | ||
1348 | NULL, NULL, _clk_max_enable, _clk_max_disable, &ipg_clk, NULL); | ||
1349 | DEFINE_CLOCK_FULL(esdhc3_ipg_clk, 2, MXC_CCM_CCGR3, MXC_CCM_CCGRx_CG4_OFFSET, | ||
1350 | NULL, NULL, _clk_max_enable, _clk_max_disable, &ipg_clk, NULL); | ||
1351 | DEFINE_CLOCK_FULL(esdhc4_ipg_clk, 3, MXC_CCM_CCGR3, MXC_CCM_CCGRx_CG6_OFFSET, | ||
1352 | NULL, NULL, _clk_max_enable, _clk_max_disable, &ipg_clk, NULL); | ||
1353 | |||
1354 | /* mx51 specific */ | ||
1355 | DEFINE_CLOCK_MAX(esdhc2_clk, 1, MXC_CCM_CCGR3, MXC_CCM_CCGRx_CG3_OFFSET, | ||
1356 | clk_esdhc2, &pll2_sw_clk, &esdhc2_ipg_clk); | ||
1357 | |||
1358 | static struct clk esdhc3_clk = { | ||
1359 | .id = 2, | ||
1360 | .parent = &esdhc1_clk, | ||
1361 | .set_parent = clk_esdhc3_set_parent, | ||
1362 | .enable_reg = MXC_CCM_CCGR3, | ||
1363 | .enable_shift = MXC_CCM_CCGRx_CG5_OFFSET, | ||
1364 | .enable = _clk_max_enable, | ||
1365 | .disable = _clk_max_disable, | ||
1366 | .secondary = &esdhc3_ipg_clk, | ||
1367 | }; | ||
1368 | static struct clk esdhc4_clk = { | ||
1369 | .id = 3, | ||
1370 | .parent = &esdhc1_clk, | ||
1371 | .set_parent = clk_esdhc4_set_parent, | ||
1372 | .enable_reg = MXC_CCM_CCGR3, | ||
1373 | .enable_shift = MXC_CCM_CCGRx_CG7_OFFSET, | ||
1374 | .enable = _clk_max_enable, | ||
1375 | .disable = _clk_max_disable, | ||
1376 | .secondary = &esdhc4_ipg_clk, | ||
1377 | }; | ||
1378 | |||
1379 | /* mx53 specific */ | ||
1380 | static struct clk esdhc2_mx53_clk = { | ||
1381 | .id = 2, | ||
1382 | .parent = &esdhc1_clk, | ||
1383 | .set_parent = clk_esdhc2_mx53_set_parent, | ||
1384 | .enable_reg = MXC_CCM_CCGR3, | ||
1385 | .enable_shift = MXC_CCM_CCGRx_CG3_OFFSET, | ||
1386 | .enable = _clk_max_enable, | ||
1387 | .disable = _clk_max_disable, | ||
1388 | .secondary = &esdhc3_ipg_clk, | ||
1389 | }; | ||
1390 | |||
1391 | DEFINE_CLOCK_MAX(esdhc3_mx53_clk, 2, MXC_CCM_CCGR3, MXC_CCM_CCGRx_CG5_OFFSET, | ||
1392 | clk_esdhc3_mx53, &pll2_sw_clk, &esdhc2_ipg_clk); | ||
1393 | |||
1394 | static struct clk esdhc4_mx53_clk = { | ||
1395 | .id = 3, | ||
1396 | .parent = &esdhc1_clk, | ||
1397 | .set_parent = clk_esdhc4_mx53_set_parent, | ||
1398 | .enable_reg = MXC_CCM_CCGR3, | ||
1399 | .enable_shift = MXC_CCM_CCGRx_CG7_OFFSET, | ||
1400 | .enable = _clk_max_enable, | ||
1401 | .disable = _clk_max_disable, | ||
1402 | .secondary = &esdhc4_ipg_clk, | ||
1403 | }; | ||
1404 | |||
1405 | static struct clk sata_clk = { | ||
1406 | .parent = &ipg_clk, | ||
1407 | .enable = _clk_max_enable, | ||
1408 | .enable_reg = MXC_CCM_CCGR4, | ||
1409 | .enable_shift = MXC_CCM_CCGRx_CG1_OFFSET, | ||
1410 | .disable = _clk_max_disable, | ||
1411 | }; | ||
1412 | |||
1413 | static struct clk ahci_phy_clk = { | ||
1414 | .parent = &usb_phy1_clk, | ||
1415 | }; | ||
1416 | |||
1417 | static struct clk ahci_dma_clk = { | ||
1418 | .parent = &ahb_clk, | ||
1419 | }; | ||
1420 | |||
1421 | DEFINE_CLOCK(mipi_esc_clk, 0, MXC_CCM_CCGR4, MXC_CCM_CCGRx_CG5_OFFSET, NULL, NULL, NULL, &pll2_sw_clk); | ||
1422 | DEFINE_CLOCK(mipi_hsc2_clk, 0, MXC_CCM_CCGR4, MXC_CCM_CCGRx_CG4_OFFSET, NULL, NULL, &mipi_esc_clk, &pll2_sw_clk); | ||
1423 | DEFINE_CLOCK(mipi_hsc1_clk, 0, MXC_CCM_CCGR4, MXC_CCM_CCGRx_CG3_OFFSET, NULL, NULL, &mipi_hsc2_clk, &pll2_sw_clk); | ||
1424 | |||
1425 | /* IPU */ | ||
1426 | DEFINE_CLOCK_FULL(ipu_clk, 0, MXC_CCM_CCGR5, MXC_CCM_CCGRx_CG5_OFFSET, | ||
1427 | NULL, NULL, clk_ipu_enable, clk_ipu_disable, &ahb_clk, &ipu_sec_clk); | ||
1428 | |||
1429 | DEFINE_CLOCK_FULL(emi_fast_clk, 0, MXC_CCM_CCGR5, MXC_CCM_CCGRx_CG7_OFFSET, | ||
1430 | NULL, NULL, _clk_ccgr_enable, _clk_ccgr_disable_inwait, | ||
1431 | &ddr_clk, NULL); | ||
1432 | |||
1433 | DEFINE_CLOCK(ipu_di0_clk, 0, MXC_CCM_CCGR6, MXC_CCM_CCGRx_CG5_OFFSET, | ||
1434 | NULL, NULL, &pll3_sw_clk, NULL); | ||
1435 | DEFINE_CLOCK(ipu_di1_clk, 0, MXC_CCM_CCGR6, MXC_CCM_CCGRx_CG6_OFFSET, | ||
1436 | NULL, NULL, &pll3_sw_clk, NULL); | ||
1437 | |||
1438 | /* PATA */ | ||
1439 | DEFINE_CLOCK(pata_clk, 0, MXC_CCM_CCGR4, MXC_CCM_CCGRx_CG0_OFFSET, | ||
1440 | NULL, NULL, &ipg_clk, &spba_clk); | ||
1441 | |||
1442 | #define _REGISTER_CLOCK(d, n, c) \ | ||
1443 | { \ | ||
1444 | .dev_id = d, \ | ||
1445 | .con_id = n, \ | ||
1446 | .clk = &c, \ | ||
1447 | }, | ||
1448 | |||
1449 | static struct clk_lookup mx51_lookups[] = { | ||
1450 | /* i.mx51 has the i.mx21 type uart */ | ||
1451 | _REGISTER_CLOCK("imx21-uart.0", NULL, uart1_clk) | ||
1452 | _REGISTER_CLOCK("imx21-uart.1", NULL, uart2_clk) | ||
1453 | _REGISTER_CLOCK("imx21-uart.2", NULL, uart3_clk) | ||
1454 | _REGISTER_CLOCK(NULL, "gpt", gpt_clk) | ||
1455 | /* i.mx51 has the i.mx27 type fec */ | ||
1456 | _REGISTER_CLOCK("imx27-fec.0", NULL, fec_clk) | ||
1457 | _REGISTER_CLOCK("mxc_pwm.0", "pwm", pwm1_clk) | ||
1458 | _REGISTER_CLOCK("mxc_pwm.1", "pwm", pwm2_clk) | ||
1459 | _REGISTER_CLOCK("imx-i2c.0", NULL, i2c1_clk) | ||
1460 | _REGISTER_CLOCK("imx-i2c.1", NULL, i2c2_clk) | ||
1461 | _REGISTER_CLOCK("imx-i2c.2", NULL, hsi2c_clk) | ||
1462 | _REGISTER_CLOCK("mxc-ehci.0", "usb", usboh3_clk) | ||
1463 | _REGISTER_CLOCK("mxc-ehci.0", "usb_ahb", usb_ahb_clk) | ||
1464 | _REGISTER_CLOCK("mxc-ehci.0", "usb_phy1", usb_phy1_clk) | ||
1465 | _REGISTER_CLOCK("mxc-ehci.1", "usb", usboh3_clk) | ||
1466 | _REGISTER_CLOCK("mxc-ehci.1", "usb_ahb", usb_ahb_clk) | ||
1467 | _REGISTER_CLOCK("mxc-ehci.2", "usb", usboh3_clk) | ||
1468 | _REGISTER_CLOCK("mxc-ehci.2", "usb_ahb", usb_ahb_clk) | ||
1469 | _REGISTER_CLOCK("fsl-usb2-udc", "usb", usboh3_clk) | ||
1470 | _REGISTER_CLOCK("fsl-usb2-udc", "usb_ahb", ahb_clk) | ||
1471 | _REGISTER_CLOCK("imx-keypad", NULL, dummy_clk) | ||
1472 | _REGISTER_CLOCK("mxc_nand", NULL, nfc_clk) | ||
1473 | _REGISTER_CLOCK("imx-ssi.0", NULL, ssi1_clk) | ||
1474 | _REGISTER_CLOCK("imx-ssi.1", NULL, ssi2_clk) | ||
1475 | _REGISTER_CLOCK("imx-ssi.2", NULL, ssi3_clk) | ||
1476 | /* i.mx51 has the i.mx35 type sdma */ | ||
1477 | _REGISTER_CLOCK("imx35-sdma", NULL, sdma_clk) | ||
1478 | _REGISTER_CLOCK(NULL, "ckih", ckih_clk) | ||
1479 | _REGISTER_CLOCK(NULL, "ckih2", ckih2_clk) | ||
1480 | _REGISTER_CLOCK(NULL, "gpt_32k", gpt_32k_clk) | ||
1481 | _REGISTER_CLOCK("imx51-ecspi.0", NULL, ecspi1_clk) | ||
1482 | _REGISTER_CLOCK("imx51-ecspi.1", NULL, ecspi2_clk) | ||
1483 | /* i.mx51 has the i.mx35 type cspi */ | ||
1484 | _REGISTER_CLOCK("imx35-cspi.0", NULL, cspi_clk) | ||
1485 | _REGISTER_CLOCK("sdhci-esdhc-imx51.0", NULL, esdhc1_clk) | ||
1486 | _REGISTER_CLOCK("sdhci-esdhc-imx51.1", NULL, esdhc2_clk) | ||
1487 | _REGISTER_CLOCK("sdhci-esdhc-imx51.2", NULL, esdhc3_clk) | ||
1488 | _REGISTER_CLOCK("sdhci-esdhc-imx51.3", NULL, esdhc4_clk) | ||
1489 | _REGISTER_CLOCK(NULL, "cpu_clk", cpu_clk) | ||
1490 | _REGISTER_CLOCK(NULL, "iim_clk", iim_clk) | ||
1491 | _REGISTER_CLOCK("imx2-wdt.0", NULL, dummy_clk) | ||
1492 | _REGISTER_CLOCK("imx2-wdt.1", NULL, dummy_clk) | ||
1493 | _REGISTER_CLOCK(NULL, "mipi_hsp", mipi_hsp_clk) | ||
1494 | _REGISTER_CLOCK("imx-ipuv3", NULL, ipu_clk) | ||
1495 | _REGISTER_CLOCK("imx-ipuv3", "di0", ipu_di0_clk) | ||
1496 | _REGISTER_CLOCK("imx-ipuv3", "di1", ipu_di1_clk) | ||
1497 | _REGISTER_CLOCK(NULL, "gpc_dvfs", gpc_dvfs_clk) | ||
1498 | _REGISTER_CLOCK("pata_imx", NULL, pata_clk) | ||
1499 | }; | ||
1500 | |||
1501 | static struct clk_lookup mx53_lookups[] = { | ||
1502 | /* i.mx53 has the i.mx21 type uart */ | ||
1503 | _REGISTER_CLOCK("imx21-uart.0", NULL, uart1_clk) | ||
1504 | _REGISTER_CLOCK("imx21-uart.1", NULL, uart2_clk) | ||
1505 | _REGISTER_CLOCK("imx21-uart.2", NULL, uart3_clk) | ||
1506 | _REGISTER_CLOCK("imx21-uart.3", NULL, uart4_clk) | ||
1507 | _REGISTER_CLOCK("imx21-uart.4", NULL, uart5_clk) | ||
1508 | _REGISTER_CLOCK(NULL, "gpt", gpt_clk) | ||
1509 | /* i.mx53 has the i.mx25 type fec */ | ||
1510 | _REGISTER_CLOCK("imx25-fec.0", NULL, fec_clk) | ||
1511 | _REGISTER_CLOCK(NULL, "iim_clk", iim_clk) | ||
1512 | _REGISTER_CLOCK("imx-i2c.0", NULL, i2c1_clk) | ||
1513 | _REGISTER_CLOCK("imx-i2c.1", NULL, i2c2_clk) | ||
1514 | _REGISTER_CLOCK("imx-i2c.2", NULL, i2c3_mx53_clk) | ||
1515 | /* i.mx53 has the i.mx51 type ecspi */ | ||
1516 | _REGISTER_CLOCK("imx51-ecspi.0", NULL, ecspi1_clk) | ||
1517 | _REGISTER_CLOCK("imx51-ecspi.1", NULL, ecspi2_clk) | ||
1518 | /* i.mx53 has the i.mx25 type cspi */ | ||
1519 | _REGISTER_CLOCK("imx35-cspi.0", NULL, cspi_clk) | ||
1520 | _REGISTER_CLOCK("sdhci-esdhc-imx53.0", NULL, esdhc1_clk) | ||
1521 | _REGISTER_CLOCK("sdhci-esdhc-imx53.1", NULL, esdhc2_mx53_clk) | ||
1522 | _REGISTER_CLOCK("sdhci-esdhc-imx53.2", NULL, esdhc3_mx53_clk) | ||
1523 | _REGISTER_CLOCK("sdhci-esdhc-imx53.3", NULL, esdhc4_mx53_clk) | ||
1524 | _REGISTER_CLOCK("imx2-wdt.0", NULL, dummy_clk) | ||
1525 | _REGISTER_CLOCK("imx2-wdt.1", NULL, dummy_clk) | ||
1526 | /* i.mx53 has the i.mx35 type sdma */ | ||
1527 | _REGISTER_CLOCK("imx35-sdma", NULL, sdma_clk) | ||
1528 | _REGISTER_CLOCK("imx-ssi.0", NULL, ssi1_clk) | ||
1529 | _REGISTER_CLOCK("imx-ssi.1", NULL, ssi2_clk) | ||
1530 | _REGISTER_CLOCK("imx-ssi.2", NULL, ssi3_clk) | ||
1531 | _REGISTER_CLOCK("imx-keypad", NULL, dummy_clk) | ||
1532 | _REGISTER_CLOCK("pata_imx", NULL, pata_clk) | ||
1533 | _REGISTER_CLOCK("imx53-ahci.0", "ahci", sata_clk) | ||
1534 | _REGISTER_CLOCK("imx53-ahci.0", "ahci_phy", ahci_phy_clk) | ||
1535 | _REGISTER_CLOCK("imx53-ahci.0", "ahci_dma", ahci_dma_clk) | ||
1536 | }; | ||
1537 | |||
1538 | static void clk_tree_init(void) | ||
1539 | { | ||
1540 | u32 reg; | ||
1541 | |||
1542 | ipg_perclk.set_parent(&ipg_perclk, &lp_apm_clk); | ||
1543 | |||
1544 | /* | ||
1545 | * Initialise the IPG PER CLK dividers to 3. IPG_PER_CLK should be at | ||
1546 | * 8MHz, its derived from lp_apm. | ||
1547 | * | ||
1548 | * FIXME: Verify if true for all boards | ||
1549 | */ | ||
1550 | reg = __raw_readl(MXC_CCM_CBCDR); | ||
1551 | reg &= ~MXC_CCM_CBCDR_PERCLK_PRED1_MASK; | ||
1552 | reg &= ~MXC_CCM_CBCDR_PERCLK_PRED2_MASK; | ||
1553 | reg &= ~MXC_CCM_CBCDR_PERCLK_PODF_MASK; | ||
1554 | reg |= (2 << MXC_CCM_CBCDR_PERCLK_PRED1_OFFSET); | ||
1555 | __raw_writel(reg, MXC_CCM_CBCDR); | ||
1556 | } | ||
1557 | |||
1558 | int __init mx51_clocks_init(unsigned long ckil, unsigned long osc, | ||
1559 | unsigned long ckih1, unsigned long ckih2) | ||
1560 | { | ||
1561 | int i; | ||
1562 | |||
1563 | external_low_reference = ckil; | ||
1564 | external_high_reference = ckih1; | ||
1565 | ckih2_reference = ckih2; | ||
1566 | oscillator_reference = osc; | ||
1567 | |||
1568 | for (i = 0; i < ARRAY_SIZE(mx51_lookups); i++) | ||
1569 | clkdev_add(&mx51_lookups[i]); | ||
1570 | |||
1571 | clk_tree_init(); | ||
1572 | |||
1573 | clk_enable(&cpu_clk); | ||
1574 | clk_enable(&main_bus_clk); | ||
1575 | |||
1576 | clk_enable(&iim_clk); | ||
1577 | imx_print_silicon_rev("i.MX51", mx51_revision()); | ||
1578 | clk_disable(&iim_clk); | ||
1579 | |||
1580 | /* move usb_phy_clk to 24MHz */ | ||
1581 | clk_set_parent(&usb_phy1_clk, &osc_clk); | ||
1582 | |||
1583 | /* set the usboh3_clk parent to pll2_sw_clk */ | ||
1584 | clk_set_parent(&usboh3_clk, &pll2_sw_clk); | ||
1585 | |||
1586 | /* Set SDHC parents to be PLL2 */ | ||
1587 | clk_set_parent(&esdhc1_clk, &pll2_sw_clk); | ||
1588 | clk_set_parent(&esdhc2_clk, &pll2_sw_clk); | ||
1589 | |||
1590 | /* set SDHC root clock as 166.25MHZ*/ | ||
1591 | clk_set_rate(&esdhc1_clk, 166250000); | ||
1592 | clk_set_rate(&esdhc2_clk, 166250000); | ||
1593 | |||
1594 | /* System timer */ | ||
1595 | mxc_timer_init(&gpt_clk, MX51_IO_ADDRESS(MX51_GPT1_BASE_ADDR), | ||
1596 | MX51_INT_GPT); | ||
1597 | return 0; | ||
1598 | } | ||
1599 | |||
1600 | int __init mx53_clocks_init(unsigned long ckil, unsigned long osc, | ||
1601 | unsigned long ckih1, unsigned long ckih2) | ||
1602 | { | ||
1603 | int i; | ||
1604 | |||
1605 | external_low_reference = ckil; | ||
1606 | external_high_reference = ckih1; | ||
1607 | ckih2_reference = ckih2; | ||
1608 | oscillator_reference = osc; | ||
1609 | |||
1610 | for (i = 0; i < ARRAY_SIZE(mx53_lookups); i++) | ||
1611 | clkdev_add(&mx53_lookups[i]); | ||
1612 | |||
1613 | clk_tree_init(); | ||
1614 | |||
1615 | clk_set_parent(&uart_root_clk, &pll3_sw_clk); | ||
1616 | clk_enable(&cpu_clk); | ||
1617 | clk_enable(&main_bus_clk); | ||
1618 | |||
1619 | clk_enable(&iim_clk); | ||
1620 | imx_print_silicon_rev("i.MX53", mx53_revision()); | ||
1621 | clk_disable(&iim_clk); | ||
1622 | |||
1623 | /* Set SDHC parents to be PLL2 */ | ||
1624 | clk_set_parent(&esdhc1_clk, &pll2_sw_clk); | ||
1625 | clk_set_parent(&esdhc3_mx53_clk, &pll2_sw_clk); | ||
1626 | |||
1627 | /* set SDHC root clock as 200MHZ*/ | ||
1628 | clk_set_rate(&esdhc1_clk, 200000000); | ||
1629 | clk_set_rate(&esdhc3_mx53_clk, 200000000); | ||
1630 | |||
1631 | /* System timer */ | ||
1632 | mxc_timer_init(&gpt_clk, MX53_IO_ADDRESS(MX53_GPT1_BASE_ADDR), | ||
1633 | MX53_INT_GPT); | ||
1634 | return 0; | ||
1635 | } | ||
1636 | |||
1637 | #ifdef CONFIG_OF | ||
1638 | static void __init clk_get_freq_dt(unsigned long *ckil, unsigned long *osc, | ||
1639 | unsigned long *ckih1, unsigned long *ckih2) | ||
1640 | { | ||
1641 | struct device_node *np; | ||
1642 | |||
1643 | /* retrieve the freqency of fixed clocks from device tree */ | ||
1644 | for_each_compatible_node(np, NULL, "fixed-clock") { | ||
1645 | u32 rate; | ||
1646 | if (of_property_read_u32(np, "clock-frequency", &rate)) | ||
1647 | continue; | ||
1648 | |||
1649 | if (of_device_is_compatible(np, "fsl,imx-ckil")) | ||
1650 | *ckil = rate; | ||
1651 | else if (of_device_is_compatible(np, "fsl,imx-osc")) | ||
1652 | *osc = rate; | ||
1653 | else if (of_device_is_compatible(np, "fsl,imx-ckih1")) | ||
1654 | *ckih1 = rate; | ||
1655 | else if (of_device_is_compatible(np, "fsl,imx-ckih2")) | ||
1656 | *ckih2 = rate; | ||
1657 | } | ||
1658 | } | ||
1659 | |||
1660 | int __init mx51_clocks_init_dt(void) | ||
1661 | { | ||
1662 | unsigned long ckil, osc, ckih1, ckih2; | ||
1663 | |||
1664 | clk_get_freq_dt(&ckil, &osc, &ckih1, &ckih2); | ||
1665 | return mx51_clocks_init(ckil, osc, ckih1, ckih2); | ||
1666 | } | ||
1667 | |||
1668 | int __init mx53_clocks_init_dt(void) | ||
1669 | { | ||
1670 | unsigned long ckil, osc, ckih1, ckih2; | ||
1671 | |||
1672 | clk_get_freq_dt(&ckil, &osc, &ckih1, &ckih2); | ||
1673 | return mx53_clocks_init(ckil, osc, ckih1, ckih2); | ||
1674 | } | ||
1675 | #endif | ||
diff --git a/arch/arm/mach-imx/cpu-imx5.c b/arch/arm/mach-imx/cpu-imx5.c index aa15c517d06e..8eb15a2fcaf9 100644 --- a/arch/arm/mach-imx/cpu-imx5.c +++ b/arch/arm/mach-imx/cpu-imx5.c | |||
@@ -62,11 +62,8 @@ EXPORT_SYMBOL(mx51_revision); | |||
62 | * Dependent on link order - so the assumption is that vfp_init is called | 62 | * Dependent on link order - so the assumption is that vfp_init is called |
63 | * before us. | 63 | * before us. |
64 | */ | 64 | */ |
65 | static int __init mx51_neon_fixup(void) | 65 | int __init mx51_neon_fixup(void) |
66 | { | 66 | { |
67 | if (!cpu_is_mx51()) | ||
68 | return 0; | ||
69 | |||
70 | if (mx51_revision() < IMX_CHIP_REVISION_3_0 && | 67 | if (mx51_revision() < IMX_CHIP_REVISION_3_0 && |
71 | (elf_hwcap & HWCAP_NEON)) { | 68 | (elf_hwcap & HWCAP_NEON)) { |
72 | elf_hwcap &= ~HWCAP_NEON; | 69 | elf_hwcap &= ~HWCAP_NEON; |
@@ -75,7 +72,6 @@ static int __init mx51_neon_fixup(void) | |||
75 | return 0; | 72 | return 0; |
76 | } | 73 | } |
77 | 74 | ||
78 | late_initcall(mx51_neon_fixup); | ||
79 | #endif | 75 | #endif |
80 | 76 | ||
81 | static int get_mx53_srev(void) | 77 | static int get_mx53_srev(void) |
diff --git a/arch/arm/mach-imx/crmregs-imx3.h b/arch/arm/mach-imx/crmregs-imx3.h index 53141273df45..a1dfde53e335 100644 --- a/arch/arm/mach-imx/crmregs-imx3.h +++ b/arch/arm/mach-imx/crmregs-imx3.h | |||
@@ -24,48 +24,47 @@ | |||
24 | #define CKIH_CLK_FREQ_27MHZ 27000000 | 24 | #define CKIH_CLK_FREQ_27MHZ 27000000 |
25 | #define CKIL_CLK_FREQ 32768 | 25 | #define CKIL_CLK_FREQ 32768 |
26 | 26 | ||
27 | #define MXC_CCM_BASE (cpu_is_mx31() ? \ | 27 | extern void __iomem *mx3_ccm_base; |
28 | MX31_IO_ADDRESS(MX31_CCM_BASE_ADDR) : MX35_IO_ADDRESS(MX35_CCM_BASE_ADDR)) | ||
29 | 28 | ||
30 | /* Register addresses */ | 29 | /* Register addresses */ |
31 | #define MXC_CCM_CCMR (MXC_CCM_BASE + 0x00) | 30 | #define MXC_CCM_CCMR 0x00 |
32 | #define MXC_CCM_PDR0 (MXC_CCM_BASE + 0x04) | 31 | #define MXC_CCM_PDR0 0x04 |
33 | #define MXC_CCM_PDR1 (MXC_CCM_BASE + 0x08) | 32 | #define MXC_CCM_PDR1 0x08 |
34 | #define MX35_CCM_PDR2 (MXC_CCM_BASE + 0x0C) | 33 | #define MX35_CCM_PDR2 0x0C |
35 | #define MXC_CCM_RCSR (MXC_CCM_BASE + 0x0C) | 34 | #define MXC_CCM_RCSR 0x0C |
36 | #define MX35_CCM_PDR3 (MXC_CCM_BASE + 0x10) | 35 | #define MX35_CCM_PDR3 0x10 |
37 | #define MXC_CCM_MPCTL (MXC_CCM_BASE + 0x10) | 36 | #define MXC_CCM_MPCTL 0x10 |
38 | #define MX35_CCM_PDR4 (MXC_CCM_BASE + 0x14) | 37 | #define MX35_CCM_PDR4 0x14 |
39 | #define MXC_CCM_UPCTL (MXC_CCM_BASE + 0x14) | 38 | #define MXC_CCM_UPCTL 0x14 |
40 | #define MX35_CCM_RCSR (MXC_CCM_BASE + 0x18) | 39 | #define MX35_CCM_RCSR 0x18 |
41 | #define MXC_CCM_SRPCTL (MXC_CCM_BASE + 0x18) | 40 | #define MXC_CCM_SRPCTL 0x18 |
42 | #define MX35_CCM_MPCTL (MXC_CCM_BASE + 0x1C) | 41 | #define MX35_CCM_MPCTL 0x1C |
43 | #define MXC_CCM_COSR (MXC_CCM_BASE + 0x1C) | 42 | #define MXC_CCM_COSR 0x1C |
44 | #define MX35_CCM_PPCTL (MXC_CCM_BASE + 0x20) | 43 | #define MX35_CCM_PPCTL 0x20 |
45 | #define MXC_CCM_CGR0 (MXC_CCM_BASE + 0x20) | 44 | #define MXC_CCM_CGR0 0x20 |
46 | #define MX35_CCM_ACMR (MXC_CCM_BASE + 0x24) | 45 | #define MX35_CCM_ACMR 0x24 |
47 | #define MXC_CCM_CGR1 (MXC_CCM_BASE + 0x24) | 46 | #define MXC_CCM_CGR1 0x24 |
48 | #define MX35_CCM_COSR (MXC_CCM_BASE + 0x28) | 47 | #define MX35_CCM_COSR 0x28 |
49 | #define MXC_CCM_CGR2 (MXC_CCM_BASE + 0x28) | 48 | #define MXC_CCM_CGR2 0x28 |
50 | #define MX35_CCM_CGR0 (MXC_CCM_BASE + 0x2C) | 49 | #define MX35_CCM_CGR0 0x2C |
51 | #define MXC_CCM_WIMR (MXC_CCM_BASE + 0x2C) | 50 | #define MXC_CCM_WIMR 0x2C |
52 | #define MX35_CCM_CGR1 (MXC_CCM_BASE + 0x30) | 51 | #define MX35_CCM_CGR1 0x30 |
53 | #define MXC_CCM_LDC (MXC_CCM_BASE + 0x30) | 52 | #define MXC_CCM_LDC 0x30 |
54 | #define MX35_CCM_CGR2 (MXC_CCM_BASE + 0x34) | 53 | #define MX35_CCM_CGR2 0x34 |
55 | #define MXC_CCM_DCVR0 (MXC_CCM_BASE + 0x34) | 54 | #define MXC_CCM_DCVR0 0x34 |
56 | #define MX35_CCM_CGR3 (MXC_CCM_BASE + 0x38) | 55 | #define MX35_CCM_CGR3 0x38 |
57 | #define MXC_CCM_DCVR1 (MXC_CCM_BASE + 0x38) | 56 | #define MXC_CCM_DCVR1 0x38 |
58 | #define MXC_CCM_DCVR2 (MXC_CCM_BASE + 0x3C) | 57 | #define MXC_CCM_DCVR2 0x3C |
59 | #define MXC_CCM_DCVR3 (MXC_CCM_BASE + 0x40) | 58 | #define MXC_CCM_DCVR3 0x40 |
60 | #define MXC_CCM_LTR0 (MXC_CCM_BASE + 0x44) | 59 | #define MXC_CCM_LTR0 0x44 |
61 | #define MXC_CCM_LTR1 (MXC_CCM_BASE + 0x48) | 60 | #define MXC_CCM_LTR1 0x48 |
62 | #define MXC_CCM_LTR2 (MXC_CCM_BASE + 0x4C) | 61 | #define MXC_CCM_LTR2 0x4C |
63 | #define MXC_CCM_LTR3 (MXC_CCM_BASE + 0x50) | 62 | #define MXC_CCM_LTR3 0x50 |
64 | #define MXC_CCM_LTBR0 (MXC_CCM_BASE + 0x54) | 63 | #define MXC_CCM_LTBR0 0x54 |
65 | #define MXC_CCM_LTBR1 (MXC_CCM_BASE + 0x58) | 64 | #define MXC_CCM_LTBR1 0x58 |
66 | #define MXC_CCM_PMCR0 (MXC_CCM_BASE + 0x5C) | 65 | #define MXC_CCM_PMCR0 0x5C |
67 | #define MXC_CCM_PMCR1 (MXC_CCM_BASE + 0x60) | 66 | #define MXC_CCM_PMCR1 0x60 |
68 | #define MXC_CCM_PDR2 (MXC_CCM_BASE + 0x64) | 67 | #define MXC_CCM_PDR2 0x64 |
69 | 68 | ||
70 | /* Register bit definitions */ | 69 | /* Register bit definitions */ |
71 | #define MXC_CCM_CCMR_WBEN (1 << 27) | 70 | #define MXC_CCM_CCMR_WBEN (1 << 27) |
diff --git a/arch/arm/mach-imx/imx51-dt.c b/arch/arm/mach-imx/imx51-dt.c index 5f577fbda2c8..18e78dba4298 100644 --- a/arch/arm/mach-imx/imx51-dt.c +++ b/arch/arm/mach-imx/imx51-dt.c | |||
@@ -118,6 +118,7 @@ DT_MACHINE_START(IMX51_DT, "Freescale i.MX51 (Device Tree Support)") | |||
118 | .handle_irq = imx51_handle_irq, | 118 | .handle_irq = imx51_handle_irq, |
119 | .timer = &imx51_timer, | 119 | .timer = &imx51_timer, |
120 | .init_machine = imx51_dt_init, | 120 | .init_machine = imx51_dt_init, |
121 | .init_late = imx51_init_late, | ||
121 | .dt_compat = imx51_dt_board_compat, | 122 | .dt_compat = imx51_dt_board_compat, |
122 | .restart = mxc_restart, | 123 | .restart = mxc_restart, |
123 | MACHINE_END | 124 | MACHINE_END |
diff --git a/arch/arm/mach-imx/imx53-dt.c b/arch/arm/mach-imx/imx53-dt.c index 574eca4b89a5..eb04b6248e48 100644 --- a/arch/arm/mach-imx/imx53-dt.c +++ b/arch/arm/mach-imx/imx53-dt.c | |||
@@ -10,6 +10,9 @@ | |||
10 | * http://www.gnu.org/copyleft/gpl.html | 10 | * http://www.gnu.org/copyleft/gpl.html |
11 | */ | 11 | */ |
12 | 12 | ||
13 | #include <linux/clk.h> | ||
14 | #include <linux/clkdev.h> | ||
15 | #include <linux/err.h> | ||
13 | #include <linux/io.h> | 16 | #include <linux/io.h> |
14 | #include <linux/irq.h> | 17 | #include <linux/irq.h> |
15 | #include <linux/irqdomain.h> | 18 | #include <linux/irqdomain.h> |
@@ -81,6 +84,19 @@ static const struct of_device_id imx53_iomuxc_of_match[] __initconst = { | |||
81 | { /* sentinel */ } | 84 | { /* sentinel */ } |
82 | }; | 85 | }; |
83 | 86 | ||
87 | static void __init imx53_qsb_init(void) | ||
88 | { | ||
89 | struct clk *clk; | ||
90 | |||
91 | clk = clk_get_sys(NULL, "ssi_ext1"); | ||
92 | if (IS_ERR(clk)) { | ||
93 | pr_err("failed to get clk ssi_ext1\n"); | ||
94 | return; | ||
95 | } | ||
96 | |||
97 | clk_register_clkdev(clk, NULL, "0-000a"); | ||
98 | } | ||
99 | |||
84 | static void __init imx53_dt_init(void) | 100 | static void __init imx53_dt_init(void) |
85 | { | 101 | { |
86 | struct device_node *node; | 102 | struct device_node *node; |
@@ -99,6 +115,9 @@ static void __init imx53_dt_init(void) | |||
99 | of_node_put(node); | 115 | of_node_put(node); |
100 | } | 116 | } |
101 | 117 | ||
118 | if (of_machine_is_compatible("fsl,imx53-qsb")) | ||
119 | imx53_qsb_init(); | ||
120 | |||
102 | of_platform_populate(NULL, of_default_bus_match_table, | 121 | of_platform_populate(NULL, of_default_bus_match_table, |
103 | imx53_auxdata_lookup, NULL); | 122 | imx53_auxdata_lookup, NULL); |
104 | } | 123 | } |
diff --git a/arch/arm/mach-imx/lluart.c b/arch/arm/mach-imx/lluart.c index 0213f8dcee81..c40a34c00489 100644 --- a/arch/arm/mach-imx/lluart.c +++ b/arch/arm/mach-imx/lluart.c | |||
@@ -17,6 +17,12 @@ | |||
17 | #include <mach/hardware.h> | 17 | #include <mach/hardware.h> |
18 | 18 | ||
19 | static struct map_desc imx_lluart_desc = { | 19 | static struct map_desc imx_lluart_desc = { |
20 | #ifdef CONFIG_DEBUG_IMX6Q_UART2 | ||
21 | .virtual = MX6Q_IO_P2V(MX6Q_UART2_BASE_ADDR), | ||
22 | .pfn = __phys_to_pfn(MX6Q_UART2_BASE_ADDR), | ||
23 | .length = MX6Q_UART2_SIZE, | ||
24 | .type = MT_DEVICE, | ||
25 | #endif | ||
20 | #ifdef CONFIG_DEBUG_IMX6Q_UART4 | 26 | #ifdef CONFIG_DEBUG_IMX6Q_UART4 |
21 | .virtual = MX6Q_IO_P2V(MX6Q_UART4_BASE_ADDR), | 27 | .virtual = MX6Q_IO_P2V(MX6Q_UART4_BASE_ADDR), |
22 | .pfn = __phys_to_pfn(MX6Q_UART4_BASE_ADDR), | 28 | .pfn = __phys_to_pfn(MX6Q_UART4_BASE_ADDR), |
diff --git a/arch/arm/mach-imx/mach-cpuimx51sd.c b/arch/arm/mach-imx/mach-cpuimx51sd.c index ce341a6874fc..ac50f1671e38 100644 --- a/arch/arm/mach-imx/mach-cpuimx51sd.c +++ b/arch/arm/mach-imx/mach-cpuimx51sd.c | |||
@@ -369,5 +369,6 @@ MACHINE_START(EUKREA_CPUIMX51SD, "Eukrea CPUIMX51SD") | |||
369 | .handle_irq = imx51_handle_irq, | 369 | .handle_irq = imx51_handle_irq, |
370 | .timer = &mxc_timer, | 370 | .timer = &mxc_timer, |
371 | .init_machine = eukrea_cpuimx51sd_init, | 371 | .init_machine = eukrea_cpuimx51sd_init, |
372 | .init_late = imx51_init_late, | ||
372 | .restart = mxc_restart, | 373 | .restart = mxc_restart, |
373 | MACHINE_END | 374 | MACHINE_END |
diff --git a/arch/arm/mach-imx/mach-imx6q.c b/arch/arm/mach-imx/mach-imx6q.c index 3df360a52c17..b47e98b7d539 100644 --- a/arch/arm/mach-imx/mach-imx6q.c +++ b/arch/arm/mach-imx/mach-imx6q.c | |||
@@ -10,6 +10,8 @@ | |||
10 | * http://www.gnu.org/copyleft/gpl.html | 10 | * http://www.gnu.org/copyleft/gpl.html |
11 | */ | 11 | */ |
12 | 12 | ||
13 | #include <linux/clk.h> | ||
14 | #include <linux/clkdev.h> | ||
13 | #include <linux/delay.h> | 15 | #include <linux/delay.h> |
14 | #include <linux/init.h> | 16 | #include <linux/init.h> |
15 | #include <linux/io.h> | 17 | #include <linux/io.h> |
@@ -64,18 +66,53 @@ soft: | |||
64 | /* For imx6q sabrelite board: set KSZ9021RN RGMII pad skew */ | 66 | /* For imx6q sabrelite board: set KSZ9021RN RGMII pad skew */ |
65 | static int ksz9021rn_phy_fixup(struct phy_device *phydev) | 67 | static int ksz9021rn_phy_fixup(struct phy_device *phydev) |
66 | { | 68 | { |
67 | /* min rx data delay */ | 69 | if (IS_ENABLED(CONFIG_PHYLIB)) { |
68 | phy_write(phydev, 0x0b, 0x8105); | 70 | /* min rx data delay */ |
69 | phy_write(phydev, 0x0c, 0x0000); | 71 | phy_write(phydev, 0x0b, 0x8105); |
72 | phy_write(phydev, 0x0c, 0x0000); | ||
70 | 73 | ||
71 | /* max rx/tx clock delay, min rx/tx control delay */ | 74 | /* max rx/tx clock delay, min rx/tx control delay */ |
72 | phy_write(phydev, 0x0b, 0x8104); | 75 | phy_write(phydev, 0x0b, 0x8104); |
73 | phy_write(phydev, 0x0c, 0xf0f0); | 76 | phy_write(phydev, 0x0c, 0xf0f0); |
74 | phy_write(phydev, 0x0b, 0x104); | 77 | phy_write(phydev, 0x0b, 0x104); |
78 | } | ||
75 | 79 | ||
76 | return 0; | 80 | return 0; |
77 | } | 81 | } |
78 | 82 | ||
83 | static void __init imx6q_sabrelite_cko1_setup(void) | ||
84 | { | ||
85 | struct clk *cko1_sel, *ahb, *cko1; | ||
86 | unsigned long rate; | ||
87 | |||
88 | cko1_sel = clk_get_sys(NULL, "cko1_sel"); | ||
89 | ahb = clk_get_sys(NULL, "ahb"); | ||
90 | cko1 = clk_get_sys(NULL, "cko1"); | ||
91 | if (IS_ERR(cko1_sel) || IS_ERR(ahb) || IS_ERR(cko1)) { | ||
92 | pr_err("cko1 setup failed!\n"); | ||
93 | goto put_clk; | ||
94 | } | ||
95 | clk_set_parent(cko1_sel, ahb); | ||
96 | rate = clk_round_rate(cko1, 16000000); | ||
97 | clk_set_rate(cko1, rate); | ||
98 | clk_register_clkdev(cko1, NULL, "0-000a"); | ||
99 | put_clk: | ||
100 | if (!IS_ERR(cko1_sel)) | ||
101 | clk_put(cko1_sel); | ||
102 | if (!IS_ERR(ahb)) | ||
103 | clk_put(ahb); | ||
104 | if (!IS_ERR(cko1)) | ||
105 | clk_put(cko1); | ||
106 | } | ||
107 | |||
108 | static void __init imx6q_sabrelite_init(void) | ||
109 | { | ||
110 | if (IS_ENABLED(CONFIG_PHYLIB)) | ||
111 | phy_register_fixup_for_uid(PHY_ID_KSZ9021, MICREL_PHY_ID_MASK, | ||
112 | ksz9021rn_phy_fixup); | ||
113 | imx6q_sabrelite_cko1_setup(); | ||
114 | } | ||
115 | |||
79 | static void __init imx6q_init_machine(void) | 116 | static void __init imx6q_init_machine(void) |
80 | { | 117 | { |
81 | /* | 118 | /* |
@@ -85,8 +122,7 @@ static void __init imx6q_init_machine(void) | |||
85 | pinctrl_provide_dummies(); | 122 | pinctrl_provide_dummies(); |
86 | 123 | ||
87 | if (of_machine_is_compatible("fsl,imx6q-sabrelite")) | 124 | if (of_machine_is_compatible("fsl,imx6q-sabrelite")) |
88 | phy_register_fixup_for_uid(PHY_ID_KSZ9021, MICREL_PHY_ID_MASK, | 125 | imx6q_sabrelite_init(); |
89 | ksz9021rn_phy_fixup); | ||
90 | 126 | ||
91 | of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); | 127 | of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); |
92 | 128 | ||
@@ -139,6 +175,7 @@ static struct sys_timer imx6q_timer = { | |||
139 | static const char *imx6q_dt_compat[] __initdata = { | 175 | static const char *imx6q_dt_compat[] __initdata = { |
140 | "fsl,imx6q-arm2", | 176 | "fsl,imx6q-arm2", |
141 | "fsl,imx6q-sabrelite", | 177 | "fsl,imx6q-sabrelite", |
178 | "fsl,imx6q-sabresd", | ||
142 | "fsl,imx6q", | 179 | "fsl,imx6q", |
143 | NULL, | 180 | NULL, |
144 | }; | 181 | }; |
diff --git a/arch/arm/mach-imx/mach-mx51_3ds.c b/arch/arm/mach-imx/mach-mx51_3ds.c index 83eab4176ca4..3c5b163923f6 100644 --- a/arch/arm/mach-imx/mach-mx51_3ds.c +++ b/arch/arm/mach-imx/mach-mx51_3ds.c | |||
@@ -175,5 +175,6 @@ MACHINE_START(MX51_3DS, "Freescale MX51 3-Stack Board") | |||
175 | .handle_irq = imx51_handle_irq, | 175 | .handle_irq = imx51_handle_irq, |
176 | .timer = &mx51_3ds_timer, | 176 | .timer = &mx51_3ds_timer, |
177 | .init_machine = mx51_3ds_init, | 177 | .init_machine = mx51_3ds_init, |
178 | .init_late = imx51_init_late, | ||
178 | .restart = mxc_restart, | 179 | .restart = mxc_restart, |
179 | MACHINE_END | 180 | MACHINE_END |
diff --git a/arch/arm/mach-imx/mach-mx51_babbage.c b/arch/arm/mach-imx/mach-mx51_babbage.c index e4b822e9f719..dde397014d4b 100644 --- a/arch/arm/mach-imx/mach-mx51_babbage.c +++ b/arch/arm/mach-imx/mach-mx51_babbage.c | |||
@@ -163,6 +163,12 @@ static iomux_v3_cfg_t mx51babbage_pads[] = { | |||
163 | MX51_PAD_CSPI1_SCLK__ECSPI1_SCLK, | 163 | MX51_PAD_CSPI1_SCLK__ECSPI1_SCLK, |
164 | MX51_PAD_CSPI1_SS0__GPIO4_24, | 164 | MX51_PAD_CSPI1_SS0__GPIO4_24, |
165 | MX51_PAD_CSPI1_SS1__GPIO4_25, | 165 | MX51_PAD_CSPI1_SS1__GPIO4_25, |
166 | |||
167 | /* Audio */ | ||
168 | MX51_PAD_AUD3_BB_TXD__AUD3_TXD, | ||
169 | MX51_PAD_AUD3_BB_RXD__AUD3_RXD, | ||
170 | MX51_PAD_AUD3_BB_CK__AUD3_TXC, | ||
171 | MX51_PAD_AUD3_BB_FS__AUD3_TXFS, | ||
166 | }; | 172 | }; |
167 | 173 | ||
168 | /* Serial ports */ | 174 | /* Serial ports */ |
@@ -426,5 +432,6 @@ MACHINE_START(MX51_BABBAGE, "Freescale MX51 Babbage Board") | |||
426 | .handle_irq = imx51_handle_irq, | 432 | .handle_irq = imx51_handle_irq, |
427 | .timer = &mx51_babbage_timer, | 433 | .timer = &mx51_babbage_timer, |
428 | .init_machine = mx51_babbage_init, | 434 | .init_machine = mx51_babbage_init, |
435 | .init_late = imx51_init_late, | ||
429 | .restart = mxc_restart, | 436 | .restart = mxc_restart, |
430 | MACHINE_END | 437 | MACHINE_END |
diff --git a/arch/arm/mach-imx/mach-mx51_efikamx.c b/arch/arm/mach-imx/mach-mx51_efikamx.c index 86e96ef11f9d..8d09c0126cab 100644 --- a/arch/arm/mach-imx/mach-mx51_efikamx.c +++ b/arch/arm/mach-imx/mach-mx51_efikamx.c | |||
@@ -207,29 +207,32 @@ static void mx51_efikamx_power_off(void) | |||
207 | 207 | ||
208 | static int __init mx51_efikamx_power_init(void) | 208 | static int __init mx51_efikamx_power_init(void) |
209 | { | 209 | { |
210 | if (machine_is_mx51_efikamx()) { | 210 | pwgt1 = regulator_get(NULL, "pwgt1"); |
211 | pwgt1 = regulator_get(NULL, "pwgt1"); | 211 | pwgt2 = regulator_get(NULL, "pwgt2"); |
212 | pwgt2 = regulator_get(NULL, "pwgt2"); | 212 | if (!IS_ERR(pwgt1) && !IS_ERR(pwgt2)) { |
213 | if (!IS_ERR(pwgt1) && !IS_ERR(pwgt2)) { | 213 | regulator_enable(pwgt1); |
214 | regulator_enable(pwgt1); | 214 | regulator_enable(pwgt2); |
215 | regulator_enable(pwgt2); | 215 | } |
216 | } | 216 | gpio_request(EFIKAMX_POWEROFF, "poweroff"); |
217 | gpio_request(EFIKAMX_POWEROFF, "poweroff"); | 217 | pm_power_off = mx51_efikamx_power_off; |
218 | pm_power_off = mx51_efikamx_power_off; | 218 | |
219 | 219 | /* enable coincell charger. maybe need a small power driver ? */ | |
220 | /* enable coincell charger. maybe need a small power driver ? */ | 220 | coincell = regulator_get(NULL, "coincell"); |
221 | coincell = regulator_get(NULL, "coincell"); | 221 | if (!IS_ERR(coincell)) { |
222 | if (!IS_ERR(coincell)) { | 222 | regulator_set_voltage(coincell, 3000000, 3000000); |
223 | regulator_set_voltage(coincell, 3000000, 3000000); | 223 | regulator_enable(coincell); |
224 | regulator_enable(coincell); | ||
225 | } | ||
226 | |||
227 | regulator_has_full_constraints(); | ||
228 | } | 224 | } |
229 | 225 | ||
226 | regulator_has_full_constraints(); | ||
227 | |||
230 | return 0; | 228 | return 0; |
231 | } | 229 | } |
232 | late_initcall(mx51_efikamx_power_init); | 230 | |
231 | static void __init mx51_efikamx_init_late(void) | ||
232 | { | ||
233 | imx51_init_late(); | ||
234 | mx51_efikamx_power_init(); | ||
235 | } | ||
233 | 236 | ||
234 | static void __init mx51_efikamx_init(void) | 237 | static void __init mx51_efikamx_init(void) |
235 | { | 238 | { |
@@ -292,5 +295,6 @@ MACHINE_START(MX51_EFIKAMX, "Genesi Efika MX (Smarttop)") | |||
292 | .handle_irq = imx51_handle_irq, | 295 | .handle_irq = imx51_handle_irq, |
293 | .timer = &mx51_efikamx_timer, | 296 | .timer = &mx51_efikamx_timer, |
294 | .init_machine = mx51_efikamx_init, | 297 | .init_machine = mx51_efikamx_init, |
298 | .init_late = mx51_efikamx_init_late, | ||
295 | .restart = mx51_efikamx_restart, | 299 | .restart = mx51_efikamx_restart, |
296 | MACHINE_END | 300 | MACHINE_END |
diff --git a/arch/arm/mach-imx/mach-mx51_efikasb.c b/arch/arm/mach-imx/mach-mx51_efikasb.c index 88f837a6cc76..fdbd181b97ef 100644 --- a/arch/arm/mach-imx/mach-mx51_efikasb.c +++ b/arch/arm/mach-imx/mach-mx51_efikasb.c | |||
@@ -211,22 +211,25 @@ static void mx51_efikasb_power_off(void) | |||
211 | 211 | ||
212 | static int __init mx51_efikasb_power_init(void) | 212 | static int __init mx51_efikasb_power_init(void) |
213 | { | 213 | { |
214 | if (machine_is_mx51_efikasb()) { | 214 | pwgt1 = regulator_get(NULL, "pwgt1"); |
215 | pwgt1 = regulator_get(NULL, "pwgt1"); | 215 | pwgt2 = regulator_get(NULL, "pwgt2"); |
216 | pwgt2 = regulator_get(NULL, "pwgt2"); | 216 | if (!IS_ERR(pwgt1) && !IS_ERR(pwgt2)) { |
217 | if (!IS_ERR(pwgt1) && !IS_ERR(pwgt2)) { | 217 | regulator_enable(pwgt1); |
218 | regulator_enable(pwgt1); | 218 | regulator_enable(pwgt2); |
219 | regulator_enable(pwgt2); | ||
220 | } | ||
221 | gpio_request(EFIKASB_POWEROFF, "poweroff"); | ||
222 | pm_power_off = mx51_efikasb_power_off; | ||
223 | |||
224 | regulator_has_full_constraints(); | ||
225 | } | 219 | } |
220 | gpio_request(EFIKASB_POWEROFF, "poweroff"); | ||
221 | pm_power_off = mx51_efikasb_power_off; | ||
222 | |||
223 | regulator_has_full_constraints(); | ||
226 | 224 | ||
227 | return 0; | 225 | return 0; |
228 | } | 226 | } |
229 | late_initcall(mx51_efikasb_power_init); | 227 | |
228 | static void __init mx51_efikasb_init_late(void) | ||
229 | { | ||
230 | imx51_init_late(); | ||
231 | mx51_efikasb_power_init(); | ||
232 | } | ||
230 | 233 | ||
231 | /* 01 R1.3 board | 234 | /* 01 R1.3 board |
232 | 10 R2.0 board */ | 235 | 10 R2.0 board */ |
@@ -287,6 +290,7 @@ MACHINE_START(MX51_EFIKASB, "Genesi Efika MX (Smartbook)") | |||
287 | .init_irq = mx51_init_irq, | 290 | .init_irq = mx51_init_irq, |
288 | .handle_irq = imx51_handle_irq, | 291 | .handle_irq = imx51_handle_irq, |
289 | .init_machine = efikasb_board_init, | 292 | .init_machine = efikasb_board_init, |
293 | .init_late = mx51_efikasb_init_late, | ||
290 | .timer = &mx51_efikasb_timer, | 294 | .timer = &mx51_efikasb_timer, |
291 | .restart = mxc_restart, | 295 | .restart = mxc_restart, |
292 | MACHINE_END | 296 | MACHINE_END |
diff --git a/arch/arm/mach-imx/mach-pcm037.c b/arch/arm/mach-imx/mach-pcm037.c index 10c9795934a3..0a40004154f2 100644 --- a/arch/arm/mach-imx/mach-pcm037.c +++ b/arch/arm/mach-imx/mach-pcm037.c | |||
@@ -694,6 +694,11 @@ static void __init pcm037_reserve(void) | |||
694 | MX3_CAMERA_BUF_SIZE); | 694 | MX3_CAMERA_BUF_SIZE); |
695 | } | 695 | } |
696 | 696 | ||
697 | static void __init pcm037_init_late(void) | ||
698 | { | ||
699 | pcm037_eet_init_devices(); | ||
700 | } | ||
701 | |||
697 | MACHINE_START(PCM037, "Phytec Phycore pcm037") | 702 | MACHINE_START(PCM037, "Phytec Phycore pcm037") |
698 | /* Maintainer: Pengutronix */ | 703 | /* Maintainer: Pengutronix */ |
699 | .atag_offset = 0x100, | 704 | .atag_offset = 0x100, |
@@ -704,5 +709,6 @@ MACHINE_START(PCM037, "Phytec Phycore pcm037") | |||
704 | .handle_irq = imx31_handle_irq, | 709 | .handle_irq = imx31_handle_irq, |
705 | .timer = &pcm037_timer, | 710 | .timer = &pcm037_timer, |
706 | .init_machine = pcm037_init, | 711 | .init_machine = pcm037_init, |
712 | .init_late = pcm037_init_late, | ||
707 | .restart = mxc_restart, | 713 | .restart = mxc_restart, |
708 | MACHINE_END | 714 | MACHINE_END |
diff --git a/arch/arm/mach-imx/mach-pcm037_eet.c b/arch/arm/mach-imx/mach-pcm037_eet.c index 1b7606bef8f4..11ffa81ad17d 100644 --- a/arch/arm/mach-imx/mach-pcm037_eet.c +++ b/arch/arm/mach-imx/mach-pcm037_eet.c | |||
@@ -160,9 +160,9 @@ static const struct gpio_keys_platform_data | |||
160 | .rep = 0, /* No auto-repeat */ | 160 | .rep = 0, /* No auto-repeat */ |
161 | }; | 161 | }; |
162 | 162 | ||
163 | static int __init eet_init_devices(void) | 163 | int __init pcm037_eet_init_devices(void) |
164 | { | 164 | { |
165 | if (!machine_is_pcm037() || pcm037_variant() != PCM037_EET) | 165 | if (pcm037_variant() != PCM037_EET) |
166 | return 0; | 166 | return 0; |
167 | 167 | ||
168 | mxc_iomux_setup_multiple_pins(pcm037_eet_pins, | 168 | mxc_iomux_setup_multiple_pins(pcm037_eet_pins, |
@@ -176,4 +176,3 @@ static int __init eet_init_devices(void) | |||
176 | 176 | ||
177 | return 0; | 177 | return 0; |
178 | } | 178 | } |
179 | late_initcall(eet_init_devices); | ||
diff --git a/arch/arm/mach-imx/mm-imx3.c b/arch/arm/mach-imx/mm-imx3.c index 9128d15b1eb7..967ed5b35a45 100644 --- a/arch/arm/mach-imx/mm-imx3.c +++ b/arch/arm/mach-imx/mm-imx3.c | |||
@@ -32,6 +32,10 @@ | |||
32 | #include <mach/iomux-v3.h> | 32 | #include <mach/iomux-v3.h> |
33 | #include <mach/irqs.h> | 33 | #include <mach/irqs.h> |
34 | 34 | ||
35 | #include "crmregs-imx3.h" | ||
36 | |||
37 | void __iomem *mx3_ccm_base; | ||
38 | |||
35 | static void imx3_idle(void) | 39 | static void imx3_idle(void) |
36 | { | 40 | { |
37 | unsigned long reg = 0; | 41 | unsigned long reg = 0; |
@@ -138,6 +142,7 @@ void __init imx31_init_early(void) | |||
138 | mxc_arch_reset_init(MX31_IO_ADDRESS(MX31_WDOG_BASE_ADDR)); | 142 | mxc_arch_reset_init(MX31_IO_ADDRESS(MX31_WDOG_BASE_ADDR)); |
139 | arch_ioremap_caller = imx3_ioremap_caller; | 143 | arch_ioremap_caller = imx3_ioremap_caller; |
140 | arm_pm_idle = imx3_idle; | 144 | arm_pm_idle = imx3_idle; |
145 | mx3_ccm_base = MX31_IO_ADDRESS(MX31_CCM_BASE_ADDR); | ||
141 | } | 146 | } |
142 | 147 | ||
143 | void __init mx31_init_irq(void) | 148 | void __init mx31_init_irq(void) |
@@ -211,6 +216,7 @@ void __init imx35_init_early(void) | |||
211 | mxc_arch_reset_init(MX35_IO_ADDRESS(MX35_WDOG_BASE_ADDR)); | 216 | mxc_arch_reset_init(MX35_IO_ADDRESS(MX35_WDOG_BASE_ADDR)); |
212 | arm_pm_idle = imx3_idle; | 217 | arm_pm_idle = imx3_idle; |
213 | arch_ioremap_caller = imx3_ioremap_caller; | 218 | arch_ioremap_caller = imx3_ioremap_caller; |
219 | mx3_ccm_base = MX35_IO_ADDRESS(MX35_CCM_BASE_ADDR); | ||
214 | } | 220 | } |
215 | 221 | ||
216 | void __init mx35_init_irq(void) | 222 | void __init mx35_init_irq(void) |
diff --git a/arch/arm/mach-imx/mm-imx5.c b/arch/arm/mach-imx/mm-imx5.c index ba91e6b31cf4..feeee17da96b 100644 --- a/arch/arm/mach-imx/mm-imx5.c +++ b/arch/arm/mach-imx/mm-imx5.c | |||
@@ -33,6 +33,7 @@ static void imx5_idle(void) | |||
33 | gpc_dvfs_clk = clk_get(NULL, "gpc_dvfs"); | 33 | gpc_dvfs_clk = clk_get(NULL, "gpc_dvfs"); |
34 | if (IS_ERR(gpc_dvfs_clk)) | 34 | if (IS_ERR(gpc_dvfs_clk)) |
35 | return; | 35 | return; |
36 | clk_prepare(gpc_dvfs_clk); | ||
36 | } | 37 | } |
37 | clk_enable(gpc_dvfs_clk); | 38 | clk_enable(gpc_dvfs_clk); |
38 | mx5_cpu_lp_set(WAIT_UNCLOCKED_POWER_OFF); | 39 | mx5_cpu_lp_set(WAIT_UNCLOCKED_POWER_OFF); |
@@ -236,3 +237,8 @@ void __init imx53_soc_init(void) | |||
236 | platform_device_register_simple("imx31-audmux", 0, imx53_audmux_res, | 237 | platform_device_register_simple("imx31-audmux", 0, imx53_audmux_res, |
237 | ARRAY_SIZE(imx53_audmux_res)); | 238 | ARRAY_SIZE(imx53_audmux_res)); |
238 | } | 239 | } |
240 | |||
241 | void __init imx51_init_late(void) | ||
242 | { | ||
243 | mx51_neon_fixup(); | ||
244 | } | ||
diff --git a/arch/arm/mach-imx/pcm037.h b/arch/arm/mach-imx/pcm037.h index d6929721a5fd..7d167690e17d 100644 --- a/arch/arm/mach-imx/pcm037.h +++ b/arch/arm/mach-imx/pcm037.h | |||
@@ -8,4 +8,10 @@ enum pcm037_board_variant { | |||
8 | 8 | ||
9 | extern enum pcm037_board_variant pcm037_variant(void); | 9 | extern enum pcm037_board_variant pcm037_variant(void); |
10 | 10 | ||
11 | #ifdef CONFIG_MACH_PCM037_EET | ||
12 | int pcm037_eet_init_devices(void); | ||
13 | #else | ||
14 | static inline int pcm037_eet_init_devices(void) { return 0; } | ||
15 | #endif | ||
16 | |||
11 | #endif | 17 | #endif |
diff --git a/arch/arm/mach-imx/pm-imx3.c b/arch/arm/mach-imx/pm-imx3.c index b3752439632e..822103bdb709 100644 --- a/arch/arm/mach-imx/pm-imx3.c +++ b/arch/arm/mach-imx/pm-imx3.c | |||
@@ -21,14 +21,14 @@ | |||
21 | */ | 21 | */ |
22 | void mx3_cpu_lp_set(enum mx3_cpu_pwr_mode mode) | 22 | void mx3_cpu_lp_set(enum mx3_cpu_pwr_mode mode) |
23 | { | 23 | { |
24 | int reg = __raw_readl(MXC_CCM_CCMR); | 24 | int reg = __raw_readl(mx3_ccm_base + MXC_CCM_CCMR); |
25 | reg &= ~MXC_CCM_CCMR_LPM_MASK; | 25 | reg &= ~MXC_CCM_CCMR_LPM_MASK; |
26 | 26 | ||
27 | switch (mode) { | 27 | switch (mode) { |
28 | case MX3_WAIT: | 28 | case MX3_WAIT: |
29 | if (cpu_is_mx35()) | 29 | if (cpu_is_mx35()) |
30 | reg |= MXC_CCM_CCMR_LPM_WAIT_MX35; | 30 | reg |= MXC_CCM_CCMR_LPM_WAIT_MX35; |
31 | __raw_writel(reg, MXC_CCM_CCMR); | 31 | __raw_writel(reg, mx3_ccm_base + MXC_CCM_CCMR); |
32 | break; | 32 | break; |
33 | default: | 33 | default: |
34 | pr_err("Unknown cpu power mode: %d\n", mode); | 34 | pr_err("Unknown cpu power mode: %d\n", mode); |
diff --git a/arch/arm/mach-kirkwood/board-dreamplug.c b/arch/arm/mach-kirkwood/board-dreamplug.c index 985453994dd3..55e357ab2923 100644 --- a/arch/arm/mach-kirkwood/board-dreamplug.c +++ b/arch/arm/mach-kirkwood/board-dreamplug.c | |||
@@ -27,7 +27,6 @@ | |||
27 | #include <linux/mtd/physmap.h> | 27 | #include <linux/mtd/physmap.h> |
28 | #include <linux/spi/flash.h> | 28 | #include <linux/spi/flash.h> |
29 | #include <linux/spi/spi.h> | 29 | #include <linux/spi/spi.h> |
30 | #include <linux/spi/orion_spi.h> | ||
31 | #include <asm/mach-types.h> | 30 | #include <asm/mach-types.h> |
32 | #include <asm/mach/arch.h> | 31 | #include <asm/mach/arch.h> |
33 | #include <asm/mach/map.h> | 32 | #include <asm/mach/map.h> |
diff --git a/arch/arm/mach-kirkwood/board-dt.c b/arch/arm/mach-kirkwood/board-dt.c index 10d1969b9e3a..edc3f8a9d45e 100644 --- a/arch/arm/mach-kirkwood/board-dt.c +++ b/arch/arm/mach-kirkwood/board-dt.c | |||
@@ -43,6 +43,9 @@ static void __init kirkwood_dt_init(void) | |||
43 | kirkwood_l2_init(); | 43 | kirkwood_l2_init(); |
44 | #endif | 44 | #endif |
45 | 45 | ||
46 | /* Setup root of clk tree */ | ||
47 | kirkwood_clk_init(); | ||
48 | |||
46 | /* internal devices that every board has */ | 49 | /* internal devices that every board has */ |
47 | kirkwood_wdt_init(); | 50 | kirkwood_wdt_init(); |
48 | kirkwood_xor0_init(); | 51 | kirkwood_xor0_init(); |
diff --git a/arch/arm/mach-kirkwood/common.c b/arch/arm/mach-kirkwood/common.c index 3ad037385a5e..25fb3fd418ef 100644 --- a/arch/arm/mach-kirkwood/common.c +++ b/arch/arm/mach-kirkwood/common.c | |||
@@ -15,7 +15,8 @@ | |||
15 | #include <linux/ata_platform.h> | 15 | #include <linux/ata_platform.h> |
16 | #include <linux/mtd/nand.h> | 16 | #include <linux/mtd/nand.h> |
17 | #include <linux/dma-mapping.h> | 17 | #include <linux/dma-mapping.h> |
18 | #include <linux/of.h> | 18 | #include <linux/clk-provider.h> |
19 | #include <linux/spinlock.h> | ||
19 | #include <net/dsa.h> | 20 | #include <net/dsa.h> |
20 | #include <asm/page.h> | 21 | #include <asm/page.h> |
21 | #include <asm/timex.h> | 22 | #include <asm/timex.h> |
@@ -32,6 +33,7 @@ | |||
32 | #include <plat/common.h> | 33 | #include <plat/common.h> |
33 | #include <plat/time.h> | 34 | #include <plat/time.h> |
34 | #include <plat/addr-map.h> | 35 | #include <plat/addr-map.h> |
36 | #include <plat/mv_xor.h> | ||
35 | #include "common.h" | 37 | #include "common.h" |
36 | 38 | ||
37 | /***************************************************************************** | 39 | /***************************************************************************** |
@@ -61,20 +63,188 @@ void __init kirkwood_map_io(void) | |||
61 | iotable_init(kirkwood_io_desc, ARRAY_SIZE(kirkwood_io_desc)); | 63 | iotable_init(kirkwood_io_desc, ARRAY_SIZE(kirkwood_io_desc)); |
62 | } | 64 | } |
63 | 65 | ||
64 | /* | 66 | /***************************************************************************** |
65 | * Default clock control bits. Any bit _not_ set in this variable | 67 | * CLK tree |
66 | * will be cleared from the hardware after platform devices have been | 68 | ****************************************************************************/ |
67 | * registered. Some reserved bits must be set to 1. | 69 | |
68 | */ | 70 | static void disable_sata0(void) |
69 | unsigned int kirkwood_clk_ctrl = CGC_DUNIT | CGC_RESERVED; | 71 | { |
72 | /* Disable PLL and IVREF */ | ||
73 | writel(readl(SATA0_PHY_MODE_2) & ~0xf, SATA0_PHY_MODE_2); | ||
74 | /* Disable PHY */ | ||
75 | writel(readl(SATA0_IF_CTRL) | 0x200, SATA0_IF_CTRL); | ||
76 | } | ||
77 | |||
78 | static void disable_sata1(void) | ||
79 | { | ||
80 | /* Disable PLL and IVREF */ | ||
81 | writel(readl(SATA1_PHY_MODE_2) & ~0xf, SATA1_PHY_MODE_2); | ||
82 | /* Disable PHY */ | ||
83 | writel(readl(SATA1_IF_CTRL) | 0x200, SATA1_IF_CTRL); | ||
84 | } | ||
85 | |||
86 | static void disable_pcie0(void) | ||
87 | { | ||
88 | writel(readl(PCIE_LINK_CTRL) | 0x10, PCIE_LINK_CTRL); | ||
89 | while (1) | ||
90 | if (readl(PCIE_STATUS) & 0x1) | ||
91 | break; | ||
92 | writel(readl(PCIE_LINK_CTRL) & ~0x10, PCIE_LINK_CTRL); | ||
93 | } | ||
94 | |||
95 | static void disable_pcie1(void) | ||
96 | { | ||
97 | u32 dev, rev; | ||
98 | |||
99 | kirkwood_pcie_id(&dev, &rev); | ||
100 | |||
101 | if (dev == MV88F6282_DEV_ID) { | ||
102 | writel(readl(PCIE1_LINK_CTRL) | 0x10, PCIE1_LINK_CTRL); | ||
103 | while (1) | ||
104 | if (readl(PCIE1_STATUS) & 0x1) | ||
105 | break; | ||
106 | writel(readl(PCIE1_LINK_CTRL) & ~0x10, PCIE1_LINK_CTRL); | ||
107 | } | ||
108 | } | ||
109 | |||
110 | /* An extended version of the gated clk. This calls fn() before | ||
111 | * disabling the clock. We use this to turn off PHYs etc. */ | ||
112 | struct clk_gate_fn { | ||
113 | struct clk_gate gate; | ||
114 | void (*fn)(void); | ||
115 | }; | ||
116 | |||
117 | #define to_clk_gate_fn(_gate) container_of(_gate, struct clk_gate_fn, gate) | ||
118 | #define to_clk_gate(_hw) container_of(_hw, struct clk_gate, hw) | ||
119 | |||
120 | static void clk_gate_fn_disable(struct clk_hw *hw) | ||
121 | { | ||
122 | struct clk_gate *gate = to_clk_gate(hw); | ||
123 | struct clk_gate_fn *gate_fn = to_clk_gate_fn(gate); | ||
124 | |||
125 | if (gate_fn->fn) | ||
126 | gate_fn->fn(); | ||
127 | |||
128 | clk_gate_ops.disable(hw); | ||
129 | } | ||
130 | |||
131 | static struct clk_ops clk_gate_fn_ops; | ||
132 | |||
133 | static struct clk __init *clk_register_gate_fn(struct device *dev, | ||
134 | const char *name, | ||
135 | const char *parent_name, unsigned long flags, | ||
136 | void __iomem *reg, u8 bit_idx, | ||
137 | u8 clk_gate_flags, spinlock_t *lock, | ||
138 | void (*fn)(void)) | ||
139 | { | ||
140 | struct clk_gate_fn *gate_fn; | ||
141 | struct clk *clk; | ||
142 | struct clk_init_data init; | ||
143 | |||
144 | gate_fn = kzalloc(sizeof(struct clk_gate_fn), GFP_KERNEL); | ||
145 | if (!gate_fn) { | ||
146 | pr_err("%s: could not allocate gated clk\n", __func__); | ||
147 | return ERR_PTR(-ENOMEM); | ||
148 | } | ||
149 | |||
150 | init.name = name; | ||
151 | init.ops = &clk_gate_fn_ops; | ||
152 | init.flags = flags; | ||
153 | init.parent_names = (parent_name ? &parent_name : NULL); | ||
154 | init.num_parents = (parent_name ? 1 : 0); | ||
155 | |||
156 | /* struct clk_gate assignments */ | ||
157 | gate_fn->gate.reg = reg; | ||
158 | gate_fn->gate.bit_idx = bit_idx; | ||
159 | gate_fn->gate.flags = clk_gate_flags; | ||
160 | gate_fn->gate.lock = lock; | ||
161 | gate_fn->gate.hw.init = &init; | ||
162 | |||
163 | /* ops is the gate ops, but with our disable function */ | ||
164 | if (clk_gate_fn_ops.disable != clk_gate_fn_disable) { | ||
165 | clk_gate_fn_ops = clk_gate_ops; | ||
166 | clk_gate_fn_ops.disable = clk_gate_fn_disable; | ||
167 | } | ||
70 | 168 | ||
169 | clk = clk_register(dev, &gate_fn->gate.hw); | ||
170 | |||
171 | if (IS_ERR(clk)) | ||
172 | kfree(gate_fn); | ||
173 | |||
174 | return clk; | ||
175 | } | ||
176 | |||
177 | static DEFINE_SPINLOCK(gating_lock); | ||
178 | static struct clk *tclk; | ||
179 | |||
180 | static struct clk __init *kirkwood_register_gate(const char *name, u8 bit_idx) | ||
181 | { | ||
182 | return clk_register_gate(NULL, name, "tclk", 0, | ||
183 | (void __iomem *)CLOCK_GATING_CTRL, | ||
184 | bit_idx, 0, &gating_lock); | ||
185 | } | ||
186 | |||
187 | static struct clk __init *kirkwood_register_gate_fn(const char *name, | ||
188 | u8 bit_idx, | ||
189 | void (*fn)(void)) | ||
190 | { | ||
191 | return clk_register_gate_fn(NULL, name, "tclk", 0, | ||
192 | (void __iomem *)CLOCK_GATING_CTRL, | ||
193 | bit_idx, 0, &gating_lock, fn); | ||
194 | } | ||
195 | |||
196 | void __init kirkwood_clk_init(void) | ||
197 | { | ||
198 | struct clk *runit, *ge0, *ge1, *sata0, *sata1, *usb0, *sdio; | ||
199 | struct clk *crypto, *xor0, *xor1, *pex0, *pex1, *audio; | ||
200 | |||
201 | tclk = clk_register_fixed_rate(NULL, "tclk", NULL, | ||
202 | CLK_IS_ROOT, kirkwood_tclk); | ||
203 | |||
204 | runit = kirkwood_register_gate("runit", CGC_BIT_RUNIT); | ||
205 | ge0 = kirkwood_register_gate("ge0", CGC_BIT_GE0); | ||
206 | ge1 = kirkwood_register_gate("ge1", CGC_BIT_GE1); | ||
207 | sata0 = kirkwood_register_gate_fn("sata0", CGC_BIT_SATA0, | ||
208 | disable_sata0); | ||
209 | sata1 = kirkwood_register_gate_fn("sata1", CGC_BIT_SATA1, | ||
210 | disable_sata1); | ||
211 | usb0 = kirkwood_register_gate("usb0", CGC_BIT_USB0); | ||
212 | sdio = kirkwood_register_gate("sdio", CGC_BIT_SDIO); | ||
213 | crypto = kirkwood_register_gate("crypto", CGC_BIT_CRYPTO); | ||
214 | xor0 = kirkwood_register_gate("xor0", CGC_BIT_XOR0); | ||
215 | xor1 = kirkwood_register_gate("xor1", CGC_BIT_XOR1); | ||
216 | pex0 = kirkwood_register_gate_fn("pex0", CGC_BIT_PEX0, | ||
217 | disable_pcie0); | ||
218 | pex1 = kirkwood_register_gate_fn("pex1", CGC_BIT_PEX1, | ||
219 | disable_pcie1); | ||
220 | audio = kirkwood_register_gate("audio", CGC_BIT_AUDIO); | ||
221 | kirkwood_register_gate("tdm", CGC_BIT_TDM); | ||
222 | kirkwood_register_gate("tsu", CGC_BIT_TSU); | ||
223 | |||
224 | /* clkdev entries, mapping clks to devices */ | ||
225 | orion_clkdev_add(NULL, "orion_spi.0", runit); | ||
226 | orion_clkdev_add(NULL, "orion_spi.1", runit); | ||
227 | orion_clkdev_add(NULL, MV643XX_ETH_NAME ".0", ge0); | ||
228 | orion_clkdev_add(NULL, MV643XX_ETH_NAME ".1", ge1); | ||
229 | orion_clkdev_add(NULL, "orion_wdt", tclk); | ||
230 | orion_clkdev_add("0", "sata_mv.0", sata0); | ||
231 | orion_clkdev_add("1", "sata_mv.0", sata1); | ||
232 | orion_clkdev_add(NULL, "orion-ehci.0", usb0); | ||
233 | orion_clkdev_add(NULL, "orion_nand", runit); | ||
234 | orion_clkdev_add(NULL, "mvsdio", sdio); | ||
235 | orion_clkdev_add(NULL, "mv_crypto", crypto); | ||
236 | orion_clkdev_add(NULL, MV_XOR_SHARED_NAME ".0", xor0); | ||
237 | orion_clkdev_add(NULL, MV_XOR_SHARED_NAME ".1", xor1); | ||
238 | orion_clkdev_add("0", "pcie", pex0); | ||
239 | orion_clkdev_add("1", "pcie", pex1); | ||
240 | orion_clkdev_add(NULL, "kirkwood-i2s", audio); | ||
241 | } | ||
71 | 242 | ||
72 | /***************************************************************************** | 243 | /***************************************************************************** |
73 | * EHCI0 | 244 | * EHCI0 |
74 | ****************************************************************************/ | 245 | ****************************************************************************/ |
75 | void __init kirkwood_ehci_init(void) | 246 | void __init kirkwood_ehci_init(void) |
76 | { | 247 | { |
77 | kirkwood_clk_ctrl |= CGC_USB0; | ||
78 | orion_ehci_init(USB_PHYS_BASE, IRQ_KIRKWOOD_USB, EHCI_PHY_NA); | 248 | orion_ehci_init(USB_PHYS_BASE, IRQ_KIRKWOOD_USB, EHCI_PHY_NA); |
79 | } | 249 | } |
80 | 250 | ||
@@ -84,11 +254,9 @@ void __init kirkwood_ehci_init(void) | |||
84 | ****************************************************************************/ | 254 | ****************************************************************************/ |
85 | void __init kirkwood_ge00_init(struct mv643xx_eth_platform_data *eth_data) | 255 | void __init kirkwood_ge00_init(struct mv643xx_eth_platform_data *eth_data) |
86 | { | 256 | { |
87 | kirkwood_clk_ctrl |= CGC_GE0; | ||
88 | |||
89 | orion_ge00_init(eth_data, | 257 | orion_ge00_init(eth_data, |
90 | GE00_PHYS_BASE, IRQ_KIRKWOOD_GE00_SUM, | 258 | GE00_PHYS_BASE, IRQ_KIRKWOOD_GE00_SUM, |
91 | IRQ_KIRKWOOD_GE00_ERR, kirkwood_tclk); | 259 | IRQ_KIRKWOOD_GE00_ERR); |
92 | } | 260 | } |
93 | 261 | ||
94 | 262 | ||
@@ -97,12 +265,9 @@ void __init kirkwood_ge00_init(struct mv643xx_eth_platform_data *eth_data) | |||
97 | ****************************************************************************/ | 265 | ****************************************************************************/ |
98 | void __init kirkwood_ge01_init(struct mv643xx_eth_platform_data *eth_data) | 266 | void __init kirkwood_ge01_init(struct mv643xx_eth_platform_data *eth_data) |
99 | { | 267 | { |
100 | |||
101 | kirkwood_clk_ctrl |= CGC_GE1; | ||
102 | |||
103 | orion_ge01_init(eth_data, | 268 | orion_ge01_init(eth_data, |
104 | GE01_PHYS_BASE, IRQ_KIRKWOOD_GE01_SUM, | 269 | GE01_PHYS_BASE, IRQ_KIRKWOOD_GE01_SUM, |
105 | IRQ_KIRKWOOD_GE01_ERR, kirkwood_tclk); | 270 | IRQ_KIRKWOOD_GE01_ERR); |
106 | } | 271 | } |
107 | 272 | ||
108 | 273 | ||
@@ -144,7 +309,6 @@ static struct platform_device kirkwood_nand_flash = { | |||
144 | void __init kirkwood_nand_init(struct mtd_partition *parts, int nr_parts, | 309 | void __init kirkwood_nand_init(struct mtd_partition *parts, int nr_parts, |
145 | int chip_delay) | 310 | int chip_delay) |
146 | { | 311 | { |
147 | kirkwood_clk_ctrl |= CGC_RUNIT; | ||
148 | kirkwood_nand_data.parts = parts; | 312 | kirkwood_nand_data.parts = parts; |
149 | kirkwood_nand_data.nr_parts = nr_parts; | 313 | kirkwood_nand_data.nr_parts = nr_parts; |
150 | kirkwood_nand_data.chip_delay = chip_delay; | 314 | kirkwood_nand_data.chip_delay = chip_delay; |
@@ -154,7 +318,6 @@ void __init kirkwood_nand_init(struct mtd_partition *parts, int nr_parts, | |||
154 | void __init kirkwood_nand_init_rnb(struct mtd_partition *parts, int nr_parts, | 318 | void __init kirkwood_nand_init_rnb(struct mtd_partition *parts, int nr_parts, |
155 | int (*dev_ready)(struct mtd_info *)) | 319 | int (*dev_ready)(struct mtd_info *)) |
156 | { | 320 | { |
157 | kirkwood_clk_ctrl |= CGC_RUNIT; | ||
158 | kirkwood_nand_data.parts = parts; | 321 | kirkwood_nand_data.parts = parts; |
159 | kirkwood_nand_data.nr_parts = nr_parts; | 322 | kirkwood_nand_data.nr_parts = nr_parts; |
160 | kirkwood_nand_data.dev_ready = dev_ready; | 323 | kirkwood_nand_data.dev_ready = dev_ready; |
@@ -175,10 +338,6 @@ static void __init kirkwood_rtc_init(void) | |||
175 | ****************************************************************************/ | 338 | ****************************************************************************/ |
176 | void __init kirkwood_sata_init(struct mv_sata_platform_data *sata_data) | 339 | void __init kirkwood_sata_init(struct mv_sata_platform_data *sata_data) |
177 | { | 340 | { |
178 | kirkwood_clk_ctrl |= CGC_SATA0; | ||
179 | if (sata_data->n_ports > 1) | ||
180 | kirkwood_clk_ctrl |= CGC_SATA1; | ||
181 | |||
182 | orion_sata_init(sata_data, SATA_PHYS_BASE, IRQ_KIRKWOOD_SATA); | 341 | orion_sata_init(sata_data, SATA_PHYS_BASE, IRQ_KIRKWOOD_SATA); |
183 | } | 342 | } |
184 | 343 | ||
@@ -221,7 +380,6 @@ void __init kirkwood_sdio_init(struct mvsdio_platform_data *mvsdio_data) | |||
221 | mvsdio_data->clock = 100000000; | 380 | mvsdio_data->clock = 100000000; |
222 | else | 381 | else |
223 | mvsdio_data->clock = 200000000; | 382 | mvsdio_data->clock = 200000000; |
224 | kirkwood_clk_ctrl |= CGC_SDIO; | ||
225 | kirkwood_sdio.dev.platform_data = mvsdio_data; | 383 | kirkwood_sdio.dev.platform_data = mvsdio_data; |
226 | platform_device_register(&kirkwood_sdio); | 384 | platform_device_register(&kirkwood_sdio); |
227 | } | 385 | } |
@@ -232,8 +390,7 @@ void __init kirkwood_sdio_init(struct mvsdio_platform_data *mvsdio_data) | |||
232 | ****************************************************************************/ | 390 | ****************************************************************************/ |
233 | void __init kirkwood_spi_init() | 391 | void __init kirkwood_spi_init() |
234 | { | 392 | { |
235 | kirkwood_clk_ctrl |= CGC_RUNIT; | 393 | orion_spi_init(SPI_PHYS_BASE); |
236 | orion_spi_init(SPI_PHYS_BASE, kirkwood_tclk); | ||
237 | } | 394 | } |
238 | 395 | ||
239 | 396 | ||
@@ -253,7 +410,7 @@ void __init kirkwood_i2c_init(void) | |||
253 | void __init kirkwood_uart0_init(void) | 410 | void __init kirkwood_uart0_init(void) |
254 | { | 411 | { |
255 | orion_uart0_init(UART0_VIRT_BASE, UART0_PHYS_BASE, | 412 | orion_uart0_init(UART0_VIRT_BASE, UART0_PHYS_BASE, |
256 | IRQ_KIRKWOOD_UART_0, kirkwood_tclk); | 413 | IRQ_KIRKWOOD_UART_0, tclk); |
257 | } | 414 | } |
258 | 415 | ||
259 | 416 | ||
@@ -263,7 +420,7 @@ void __init kirkwood_uart0_init(void) | |||
263 | void __init kirkwood_uart1_init(void) | 420 | void __init kirkwood_uart1_init(void) |
264 | { | 421 | { |
265 | orion_uart1_init(UART1_VIRT_BASE, UART1_PHYS_BASE, | 422 | orion_uart1_init(UART1_VIRT_BASE, UART1_PHYS_BASE, |
266 | IRQ_KIRKWOOD_UART_1, kirkwood_tclk); | 423 | IRQ_KIRKWOOD_UART_1, tclk); |
267 | } | 424 | } |
268 | 425 | ||
269 | /***************************************************************************** | 426 | /***************************************************************************** |
@@ -271,7 +428,6 @@ void __init kirkwood_uart1_init(void) | |||
271 | ****************************************************************************/ | 428 | ****************************************************************************/ |
272 | void __init kirkwood_crypto_init(void) | 429 | void __init kirkwood_crypto_init(void) |
273 | { | 430 | { |
274 | kirkwood_clk_ctrl |= CGC_CRYPTO; | ||
275 | orion_crypto_init(CRYPTO_PHYS_BASE, KIRKWOOD_SRAM_PHYS_BASE, | 431 | orion_crypto_init(CRYPTO_PHYS_BASE, KIRKWOOD_SRAM_PHYS_BASE, |
276 | KIRKWOOD_SRAM_SIZE, IRQ_KIRKWOOD_CRYPTO); | 432 | KIRKWOOD_SRAM_SIZE, IRQ_KIRKWOOD_CRYPTO); |
277 | } | 433 | } |
@@ -282,8 +438,6 @@ void __init kirkwood_crypto_init(void) | |||
282 | ****************************************************************************/ | 438 | ****************************************************************************/ |
283 | void __init kirkwood_xor0_init(void) | 439 | void __init kirkwood_xor0_init(void) |
284 | { | 440 | { |
285 | kirkwood_clk_ctrl |= CGC_XOR0; | ||
286 | |||
287 | orion_xor0_init(XOR0_PHYS_BASE, XOR0_HIGH_PHYS_BASE, | 441 | orion_xor0_init(XOR0_PHYS_BASE, XOR0_HIGH_PHYS_BASE, |
288 | IRQ_KIRKWOOD_XOR_00, IRQ_KIRKWOOD_XOR_01); | 442 | IRQ_KIRKWOOD_XOR_00, IRQ_KIRKWOOD_XOR_01); |
289 | } | 443 | } |
@@ -294,8 +448,6 @@ void __init kirkwood_xor0_init(void) | |||
294 | ****************************************************************************/ | 448 | ****************************************************************************/ |
295 | void __init kirkwood_xor1_init(void) | 449 | void __init kirkwood_xor1_init(void) |
296 | { | 450 | { |
297 | kirkwood_clk_ctrl |= CGC_XOR1; | ||
298 | |||
299 | orion_xor1_init(XOR1_PHYS_BASE, XOR1_HIGH_PHYS_BASE, | 451 | orion_xor1_init(XOR1_PHYS_BASE, XOR1_HIGH_PHYS_BASE, |
300 | IRQ_KIRKWOOD_XOR_10, IRQ_KIRKWOOD_XOR_11); | 452 | IRQ_KIRKWOOD_XOR_10, IRQ_KIRKWOOD_XOR_11); |
301 | } | 453 | } |
@@ -306,7 +458,7 @@ void __init kirkwood_xor1_init(void) | |||
306 | ****************************************************************************/ | 458 | ****************************************************************************/ |
307 | void __init kirkwood_wdt_init(void) | 459 | void __init kirkwood_wdt_init(void) |
308 | { | 460 | { |
309 | orion_wdt_init(kirkwood_tclk); | 461 | orion_wdt_init(); |
310 | } | 462 | } |
311 | 463 | ||
312 | 464 | ||
@@ -382,7 +534,6 @@ static struct platform_device kirkwood_pcm_device = { | |||
382 | 534 | ||
383 | void __init kirkwood_audio_init(void) | 535 | void __init kirkwood_audio_init(void) |
384 | { | 536 | { |
385 | kirkwood_clk_ctrl |= CGC_AUDIO; | ||
386 | platform_device_register(&kirkwood_i2s_device); | 537 | platform_device_register(&kirkwood_i2s_device); |
387 | platform_device_register(&kirkwood_pcm_device); | 538 | platform_device_register(&kirkwood_pcm_device); |
388 | } | 539 | } |
@@ -466,6 +617,9 @@ void __init kirkwood_init(void) | |||
466 | kirkwood_l2_init(); | 617 | kirkwood_l2_init(); |
467 | #endif | 618 | #endif |
468 | 619 | ||
620 | /* Setup root of clk tree */ | ||
621 | kirkwood_clk_init(); | ||
622 | |||
469 | /* internal devices that every board has */ | 623 | /* internal devices that every board has */ |
470 | kirkwood_rtc_init(); | 624 | kirkwood_rtc_init(); |
471 | kirkwood_wdt_init(); | 625 | kirkwood_wdt_init(); |
@@ -478,72 +632,6 @@ void __init kirkwood_init(void) | |||
478 | #endif | 632 | #endif |
479 | } | 633 | } |
480 | 634 | ||
481 | static int __init kirkwood_clock_gate(void) | ||
482 | { | ||
483 | unsigned int curr = readl(CLOCK_GATING_CTRL); | ||
484 | u32 dev, rev; | ||
485 | |||
486 | #ifdef CONFIG_OF | ||
487 | struct device_node *np; | ||
488 | #endif | ||
489 | kirkwood_pcie_id(&dev, &rev); | ||
490 | printk(KERN_DEBUG "Gating clock of unused units\n"); | ||
491 | printk(KERN_DEBUG "before: 0x%08x\n", curr); | ||
492 | |||
493 | /* Make sure those units are accessible */ | ||
494 | writel(curr | CGC_SATA0 | CGC_SATA1 | CGC_PEX0 | CGC_PEX1, CLOCK_GATING_CTRL); | ||
495 | |||
496 | #ifdef CONFIG_OF | ||
497 | np = of_find_compatible_node(NULL, NULL, "mrvl,orion-nand"); | ||
498 | if (np && of_device_is_available(np)) { | ||
499 | kirkwood_clk_ctrl |= CGC_RUNIT; | ||
500 | of_node_put(np); | ||
501 | } | ||
502 | #endif | ||
503 | |||
504 | /* For SATA: first shutdown the phy */ | ||
505 | if (!(kirkwood_clk_ctrl & CGC_SATA0)) { | ||
506 | /* Disable PLL and IVREF */ | ||
507 | writel(readl(SATA0_PHY_MODE_2) & ~0xf, SATA0_PHY_MODE_2); | ||
508 | /* Disable PHY */ | ||
509 | writel(readl(SATA0_IF_CTRL) | 0x200, SATA0_IF_CTRL); | ||
510 | } | ||
511 | if (!(kirkwood_clk_ctrl & CGC_SATA1)) { | ||
512 | /* Disable PLL and IVREF */ | ||
513 | writel(readl(SATA1_PHY_MODE_2) & ~0xf, SATA1_PHY_MODE_2); | ||
514 | /* Disable PHY */ | ||
515 | writel(readl(SATA1_IF_CTRL) | 0x200, SATA1_IF_CTRL); | ||
516 | } | ||
517 | |||
518 | /* For PCIe: first shutdown the phy */ | ||
519 | if (!(kirkwood_clk_ctrl & CGC_PEX0)) { | ||
520 | writel(readl(PCIE_LINK_CTRL) | 0x10, PCIE_LINK_CTRL); | ||
521 | while (1) | ||
522 | if (readl(PCIE_STATUS) & 0x1) | ||
523 | break; | ||
524 | writel(readl(PCIE_LINK_CTRL) & ~0x10, PCIE_LINK_CTRL); | ||
525 | } | ||
526 | |||
527 | /* For PCIe 1: first shutdown the phy */ | ||
528 | if (dev == MV88F6282_DEV_ID) { | ||
529 | if (!(kirkwood_clk_ctrl & CGC_PEX1)) { | ||
530 | writel(readl(PCIE1_LINK_CTRL) | 0x10, PCIE1_LINK_CTRL); | ||
531 | while (1) | ||
532 | if (readl(PCIE1_STATUS) & 0x1) | ||
533 | break; | ||
534 | writel(readl(PCIE1_LINK_CTRL) & ~0x10, PCIE1_LINK_CTRL); | ||
535 | } | ||
536 | } else /* keep this bit set for devices that don't have PCIe1 */ | ||
537 | kirkwood_clk_ctrl |= CGC_PEX1; | ||
538 | |||
539 | /* Now gate clock the required units */ | ||
540 | writel(kirkwood_clk_ctrl, CLOCK_GATING_CTRL); | ||
541 | printk(KERN_DEBUG " after: 0x%08x\n", readl(CLOCK_GATING_CTRL)); | ||
542 | |||
543 | return 0; | ||
544 | } | ||
545 | late_initcall(kirkwood_clock_gate); | ||
546 | |||
547 | void kirkwood_restart(char mode, const char *cmd) | 635 | void kirkwood_restart(char mode, const char *cmd) |
548 | { | 636 | { |
549 | /* | 637 | /* |
diff --git a/arch/arm/mach-kirkwood/common.h b/arch/arm/mach-kirkwood/common.h index a34c41a5172e..9248fa2c165b 100644 --- a/arch/arm/mach-kirkwood/common.h +++ b/arch/arm/mach-kirkwood/common.h | |||
@@ -50,6 +50,7 @@ void kirkwood_nand_init(struct mtd_partition *parts, int nr_parts, int delay); | |||
50 | void kirkwood_nand_init_rnb(struct mtd_partition *parts, int nr_parts, int (*dev_ready)(struct mtd_info *)); | 50 | void kirkwood_nand_init_rnb(struct mtd_partition *parts, int nr_parts, int (*dev_ready)(struct mtd_info *)); |
51 | void kirkwood_audio_init(void); | 51 | void kirkwood_audio_init(void); |
52 | void kirkwood_restart(char, const char *); | 52 | void kirkwood_restart(char, const char *); |
53 | void kirkwood_clk_init(void); | ||
53 | 54 | ||
54 | /* board init functions for boards not fully converted to fdt */ | 55 | /* board init functions for boards not fully converted to fdt */ |
55 | #ifdef CONFIG_MACH_DREAMPLUG_DT | 56 | #ifdef CONFIG_MACH_DREAMPLUG_DT |
diff --git a/arch/arm/mach-kirkwood/include/mach/bridge-regs.h b/arch/arm/mach-kirkwood/include/mach/bridge-regs.h index 957bd7997d7e..3eee37a3b501 100644 --- a/arch/arm/mach-kirkwood/include/mach/bridge-regs.h +++ b/arch/arm/mach-kirkwood/include/mach/bridge-regs.h | |||
@@ -43,6 +43,22 @@ | |||
43 | #define L2_WRITETHROUGH 0x00000010 | 43 | #define L2_WRITETHROUGH 0x00000010 |
44 | 44 | ||
45 | #define CLOCK_GATING_CTRL (BRIDGE_VIRT_BASE | 0x11c) | 45 | #define CLOCK_GATING_CTRL (BRIDGE_VIRT_BASE | 0x11c) |
46 | #define CGC_BIT_GE0 (0) | ||
47 | #define CGC_BIT_PEX0 (2) | ||
48 | #define CGC_BIT_USB0 (3) | ||
49 | #define CGC_BIT_SDIO (4) | ||
50 | #define CGC_BIT_TSU (5) | ||
51 | #define CGC_BIT_DUNIT (6) | ||
52 | #define CGC_BIT_RUNIT (7) | ||
53 | #define CGC_BIT_XOR0 (8) | ||
54 | #define CGC_BIT_AUDIO (9) | ||
55 | #define CGC_BIT_SATA0 (14) | ||
56 | #define CGC_BIT_SATA1 (15) | ||
57 | #define CGC_BIT_XOR1 (16) | ||
58 | #define CGC_BIT_CRYPTO (17) | ||
59 | #define CGC_BIT_PEX1 (18) | ||
60 | #define CGC_BIT_GE1 (19) | ||
61 | #define CGC_BIT_TDM (20) | ||
46 | #define CGC_GE0 (1 << 0) | 62 | #define CGC_GE0 (1 << 0) |
47 | #define CGC_PEX0 (1 << 2) | 63 | #define CGC_PEX0 (1 << 2) |
48 | #define CGC_USB0 (1 << 3) | 64 | #define CGC_USB0 (1 << 3) |
diff --git a/arch/arm/mach-kirkwood/mv88f6281gtw_ge-setup.c b/arch/arm/mach-kirkwood/mv88f6281gtw_ge-setup.c index 85f6169c2484..6d8364a97810 100644 --- a/arch/arm/mach-kirkwood/mv88f6281gtw_ge-setup.c +++ b/arch/arm/mach-kirkwood/mv88f6281gtw_ge-setup.c | |||
@@ -23,7 +23,6 @@ | |||
23 | #include <linux/gpio_keys.h> | 23 | #include <linux/gpio_keys.h> |
24 | #include <linux/spi/flash.h> | 24 | #include <linux/spi/flash.h> |
25 | #include <linux/spi/spi.h> | 25 | #include <linux/spi/spi.h> |
26 | #include <linux/spi/orion_spi.h> | ||
27 | #include <net/dsa.h> | 26 | #include <net/dsa.h> |
28 | #include <asm/mach-types.h> | 27 | #include <asm/mach-types.h> |
29 | #include <asm/mach/arch.h> | 28 | #include <asm/mach/arch.h> |
diff --git a/arch/arm/mach-kirkwood/pcie.c b/arch/arm/mach-kirkwood/pcie.c index de373176ee67..6e8b2efa3c35 100644 --- a/arch/arm/mach-kirkwood/pcie.c +++ b/arch/arm/mach-kirkwood/pcie.c | |||
@@ -11,6 +11,7 @@ | |||
11 | #include <linux/kernel.h> | 11 | #include <linux/kernel.h> |
12 | #include <linux/pci.h> | 12 | #include <linux/pci.h> |
13 | #include <linux/slab.h> | 13 | #include <linux/slab.h> |
14 | #include <linux/clk.h> | ||
14 | #include <video/vga.h> | 15 | #include <video/vga.h> |
15 | #include <asm/irq.h> | 16 | #include <asm/irq.h> |
16 | #include <asm/mach/pci.h> | 17 | #include <asm/mach/pci.h> |
@@ -19,6 +20,23 @@ | |||
19 | #include <plat/addr-map.h> | 20 | #include <plat/addr-map.h> |
20 | #include "common.h" | 21 | #include "common.h" |
21 | 22 | ||
23 | static void kirkwood_enable_pcie_clk(const char *port) | ||
24 | { | ||
25 | struct clk *clk; | ||
26 | |||
27 | clk = clk_get_sys("pcie", port); | ||
28 | if (IS_ERR(clk)) { | ||
29 | printk(KERN_ERR "PCIE clock %s missing\n", port); | ||
30 | return; | ||
31 | } | ||
32 | clk_prepare_enable(clk); | ||
33 | clk_put(clk); | ||
34 | } | ||
35 | |||
36 | /* This function is called very early in the boot when probing the | ||
37 | hardware to determine what we actually are, and what rate tclk is | ||
38 | ticking at. Hence calling kirkwood_enable_pcie_clk() is not | ||
39 | possible since the clk tree has not been created yet. */ | ||
22 | void kirkwood_enable_pcie(void) | 40 | void kirkwood_enable_pcie(void) |
23 | { | 41 | { |
24 | u32 curr = readl(CLOCK_GATING_CTRL); | 42 | u32 curr = readl(CLOCK_GATING_CTRL); |
@@ -26,7 +44,7 @@ void kirkwood_enable_pcie(void) | |||
26 | writel(curr | CGC_PEX0, CLOCK_GATING_CTRL); | 44 | writel(curr | CGC_PEX0, CLOCK_GATING_CTRL); |
27 | } | 45 | } |
28 | 46 | ||
29 | void __init kirkwood_pcie_id(u32 *dev, u32 *rev) | 47 | void kirkwood_pcie_id(u32 *dev, u32 *rev) |
30 | { | 48 | { |
31 | kirkwood_enable_pcie(); | 49 | kirkwood_enable_pcie(); |
32 | *dev = orion_pcie_dev_id((void __iomem *)PCIE_VIRT_BASE); | 50 | *dev = orion_pcie_dev_id((void __iomem *)PCIE_VIRT_BASE); |
@@ -159,7 +177,6 @@ static void __init pcie1_ioresources_init(struct pcie_port *pp) | |||
159 | 177 | ||
160 | static int __init kirkwood_pcie_setup(int nr, struct pci_sys_data *sys) | 178 | static int __init kirkwood_pcie_setup(int nr, struct pci_sys_data *sys) |
161 | { | 179 | { |
162 | extern unsigned int kirkwood_clk_ctrl; | ||
163 | struct pcie_port *pp; | 180 | struct pcie_port *pp; |
164 | int index; | 181 | int index; |
165 | 182 | ||
@@ -178,11 +195,11 @@ static int __init kirkwood_pcie_setup(int nr, struct pci_sys_data *sys) | |||
178 | 195 | ||
179 | switch (index) { | 196 | switch (index) { |
180 | case 0: | 197 | case 0: |
181 | kirkwood_clk_ctrl |= CGC_PEX0; | 198 | kirkwood_enable_pcie_clk("0"); |
182 | pcie0_ioresources_init(pp); | 199 | pcie0_ioresources_init(pp); |
183 | break; | 200 | break; |
184 | case 1: | 201 | case 1: |
185 | kirkwood_clk_ctrl |= CGC_PEX1; | 202 | kirkwood_enable_pcie_clk("1"); |
186 | pcie1_ioresources_init(pp); | 203 | pcie1_ioresources_init(pp); |
187 | break; | 204 | break; |
188 | default: | 205 | default: |
diff --git a/arch/arm/mach-kirkwood/rd88f6192-nas-setup.c b/arch/arm/mach-kirkwood/rd88f6192-nas-setup.c index fd2c9c8b6831..f742a66a7045 100644 --- a/arch/arm/mach-kirkwood/rd88f6192-nas-setup.c +++ b/arch/arm/mach-kirkwood/rd88f6192-nas-setup.c | |||
@@ -16,7 +16,6 @@ | |||
16 | #include <linux/gpio.h> | 16 | #include <linux/gpio.h> |
17 | #include <linux/spi/flash.h> | 17 | #include <linux/spi/flash.h> |
18 | #include <linux/spi/spi.h> | 18 | #include <linux/spi/spi.h> |
19 | #include <linux/spi/orion_spi.h> | ||
20 | #include <asm/mach-types.h> | 19 | #include <asm/mach-types.h> |
21 | #include <asm/mach/arch.h> | 20 | #include <asm/mach/arch.h> |
22 | #include <mach/kirkwood.h> | 21 | #include <mach/kirkwood.h> |
diff --git a/arch/arm/mach-kirkwood/t5325-setup.c b/arch/arm/mach-kirkwood/t5325-setup.c index f9d2a11b7f96..bad738e44044 100644 --- a/arch/arm/mach-kirkwood/t5325-setup.c +++ b/arch/arm/mach-kirkwood/t5325-setup.c | |||
@@ -16,7 +16,6 @@ | |||
16 | #include <linux/mtd/physmap.h> | 16 | #include <linux/mtd/physmap.h> |
17 | #include <linux/spi/flash.h> | 17 | #include <linux/spi/flash.h> |
18 | #include <linux/spi/spi.h> | 18 | #include <linux/spi/spi.h> |
19 | #include <linux/spi/orion_spi.h> | ||
20 | #include <linux/i2c.h> | 19 | #include <linux/i2c.h> |
21 | #include <linux/mv643xx_eth.h> | 20 | #include <linux/mv643xx_eth.h> |
22 | #include <linux/ata_platform.h> | 21 | #include <linux/ata_platform.h> |
diff --git a/arch/arm/mach-kirkwood/tsx1x-common.c b/arch/arm/mach-kirkwood/tsx1x-common.c index 24294b2bc469..8943ede29b44 100644 --- a/arch/arm/mach-kirkwood/tsx1x-common.c +++ b/arch/arm/mach-kirkwood/tsx1x-common.c | |||
@@ -4,7 +4,6 @@ | |||
4 | #include <linux/mtd/physmap.h> | 4 | #include <linux/mtd/physmap.h> |
5 | #include <linux/spi/flash.h> | 5 | #include <linux/spi/flash.h> |
6 | #include <linux/spi/spi.h> | 6 | #include <linux/spi/spi.h> |
7 | #include <linux/spi/orion_spi.h> | ||
8 | #include <linux/serial_reg.h> | 7 | #include <linux/serial_reg.h> |
9 | #include <mach/kirkwood.h> | 8 | #include <mach/kirkwood.h> |
10 | #include "common.h" | 9 | #include "common.h" |
diff --git a/arch/arm/mach-msm/board-halibut.c b/arch/arm/mach-msm/board-halibut.c index 26aac363a064..4fa3e99d9a62 100644 --- a/arch/arm/mach-msm/board-halibut.c +++ b/arch/arm/mach-msm/board-halibut.c | |||
@@ -94,6 +94,11 @@ static void __init halibut_map_io(void) | |||
94 | msm_clock_init(msm_clocks_7x01a, msm_num_clocks_7x01a); | 94 | msm_clock_init(msm_clocks_7x01a, msm_num_clocks_7x01a); |
95 | } | 95 | } |
96 | 96 | ||
97 | static void __init halibut_init_late(void) | ||
98 | { | ||
99 | smd_debugfs_init(); | ||
100 | } | ||
101 | |||
97 | MACHINE_START(HALIBUT, "Halibut Board (QCT SURF7200A)") | 102 | MACHINE_START(HALIBUT, "Halibut Board (QCT SURF7200A)") |
98 | .atag_offset = 0x100, | 103 | .atag_offset = 0x100, |
99 | .fixup = halibut_fixup, | 104 | .fixup = halibut_fixup, |
@@ -101,5 +106,6 @@ MACHINE_START(HALIBUT, "Halibut Board (QCT SURF7200A)") | |||
101 | .init_early = halibut_init_early, | 106 | .init_early = halibut_init_early, |
102 | .init_irq = halibut_init_irq, | 107 | .init_irq = halibut_init_irq, |
103 | .init_machine = halibut_init, | 108 | .init_machine = halibut_init, |
109 | .init_late = halibut_init_late, | ||
104 | .timer = &msm_timer, | 110 | .timer = &msm_timer, |
105 | MACHINE_END | 111 | MACHINE_END |
diff --git a/arch/arm/mach-msm/board-mahimahi.c b/arch/arm/mach-msm/board-mahimahi.c index 5a4882fc6f7a..cf1f89a5dc62 100644 --- a/arch/arm/mach-msm/board-mahimahi.c +++ b/arch/arm/mach-msm/board-mahimahi.c | |||
@@ -71,6 +71,11 @@ static void __init mahimahi_map_io(void) | |||
71 | msm_clock_init(); | 71 | msm_clock_init(); |
72 | } | 72 | } |
73 | 73 | ||
74 | static void __init mahimahi_init_late(void) | ||
75 | { | ||
76 | smd_debugfs_init(); | ||
77 | } | ||
78 | |||
74 | extern struct sys_timer msm_timer; | 79 | extern struct sys_timer msm_timer; |
75 | 80 | ||
76 | MACHINE_START(MAHIMAHI, "mahimahi") | 81 | MACHINE_START(MAHIMAHI, "mahimahi") |
@@ -79,5 +84,6 @@ MACHINE_START(MAHIMAHI, "mahimahi") | |||
79 | .map_io = mahimahi_map_io, | 84 | .map_io = mahimahi_map_io, |
80 | .init_irq = msm_init_irq, | 85 | .init_irq = msm_init_irq, |
81 | .init_machine = mahimahi_init, | 86 | .init_machine = mahimahi_init, |
87 | .init_late = mahimahi_init_late, | ||
82 | .timer = &msm_timer, | 88 | .timer = &msm_timer, |
83 | MACHINE_END | 89 | MACHINE_END |
diff --git a/arch/arm/mach-msm/board-msm7x27.c b/arch/arm/mach-msm/board-msm7x27.c index 6d84ee740df4..451ab1d43c92 100644 --- a/arch/arm/mach-msm/board-msm7x27.c +++ b/arch/arm/mach-msm/board-msm7x27.c | |||
@@ -128,11 +128,17 @@ static void __init msm7x2x_map_io(void) | |||
128 | #endif | 128 | #endif |
129 | } | 129 | } |
130 | 130 | ||
131 | static void __init msm7x2x_init_late(void) | ||
132 | { | ||
133 | smd_debugfs_init(); | ||
134 | } | ||
135 | |||
131 | MACHINE_START(MSM7X27_SURF, "QCT MSM7x27 SURF") | 136 | MACHINE_START(MSM7X27_SURF, "QCT MSM7x27 SURF") |
132 | .atag_offset = 0x100, | 137 | .atag_offset = 0x100, |
133 | .map_io = msm7x2x_map_io, | 138 | .map_io = msm7x2x_map_io, |
134 | .init_irq = msm7x2x_init_irq, | 139 | .init_irq = msm7x2x_init_irq, |
135 | .init_machine = msm7x2x_init, | 140 | .init_machine = msm7x2x_init, |
141 | .init_late = msm7x2x_init_late, | ||
136 | .timer = &msm_timer, | 142 | .timer = &msm_timer, |
137 | MACHINE_END | 143 | MACHINE_END |
138 | 144 | ||
@@ -141,6 +147,7 @@ MACHINE_START(MSM7X27_FFA, "QCT MSM7x27 FFA") | |||
141 | .map_io = msm7x2x_map_io, | 147 | .map_io = msm7x2x_map_io, |
142 | .init_irq = msm7x2x_init_irq, | 148 | .init_irq = msm7x2x_init_irq, |
143 | .init_machine = msm7x2x_init, | 149 | .init_machine = msm7x2x_init, |
150 | .init_late = msm7x2x_init_late, | ||
144 | .timer = &msm_timer, | 151 | .timer = &msm_timer, |
145 | MACHINE_END | 152 | MACHINE_END |
146 | 153 | ||
@@ -149,6 +156,7 @@ MACHINE_START(MSM7X25_SURF, "QCT MSM7x25 SURF") | |||
149 | .map_io = msm7x2x_map_io, | 156 | .map_io = msm7x2x_map_io, |
150 | .init_irq = msm7x2x_init_irq, | 157 | .init_irq = msm7x2x_init_irq, |
151 | .init_machine = msm7x2x_init, | 158 | .init_machine = msm7x2x_init, |
159 | .init_late = msm7x2x_init_late, | ||
152 | .timer = &msm_timer, | 160 | .timer = &msm_timer, |
153 | MACHINE_END | 161 | MACHINE_END |
154 | 162 | ||
@@ -157,5 +165,6 @@ MACHINE_START(MSM7X25_FFA, "QCT MSM7x25 FFA") | |||
157 | .map_io = msm7x2x_map_io, | 165 | .map_io = msm7x2x_map_io, |
158 | .init_irq = msm7x2x_init_irq, | 166 | .init_irq = msm7x2x_init_irq, |
159 | .init_machine = msm7x2x_init, | 167 | .init_machine = msm7x2x_init, |
168 | .init_late = msm7x2x_init_late, | ||
160 | .timer = &msm_timer, | 169 | .timer = &msm_timer, |
161 | MACHINE_END | 170 | MACHINE_END |
diff --git a/arch/arm/mach-msm/board-msm7x30.c b/arch/arm/mach-msm/board-msm7x30.c index 75b3cfcada6d..a5001378135d 100644 --- a/arch/arm/mach-msm/board-msm7x30.c +++ b/arch/arm/mach-msm/board-msm7x30.c | |||
@@ -119,6 +119,11 @@ static void __init msm7x30_map_io(void) | |||
119 | msm_clock_init(msm_clocks_7x30, msm_num_clocks_7x30); | 119 | msm_clock_init(msm_clocks_7x30, msm_num_clocks_7x30); |
120 | } | 120 | } |
121 | 121 | ||
122 | static void __init msm7x30_init_late(void) | ||
123 | { | ||
124 | smd_debugfs_init(); | ||
125 | } | ||
126 | |||
122 | MACHINE_START(MSM7X30_SURF, "QCT MSM7X30 SURF") | 127 | MACHINE_START(MSM7X30_SURF, "QCT MSM7X30 SURF") |
123 | .atag_offset = 0x100, | 128 | .atag_offset = 0x100, |
124 | .fixup = msm7x30_fixup, | 129 | .fixup = msm7x30_fixup, |
@@ -126,6 +131,7 @@ MACHINE_START(MSM7X30_SURF, "QCT MSM7X30 SURF") | |||
126 | .map_io = msm7x30_map_io, | 131 | .map_io = msm7x30_map_io, |
127 | .init_irq = msm7x30_init_irq, | 132 | .init_irq = msm7x30_init_irq, |
128 | .init_machine = msm7x30_init, | 133 | .init_machine = msm7x30_init, |
134 | .init_late = msm7x30_init_late, | ||
129 | .timer = &msm_timer, | 135 | .timer = &msm_timer, |
130 | MACHINE_END | 136 | MACHINE_END |
131 | 137 | ||
@@ -136,6 +142,7 @@ MACHINE_START(MSM7X30_FFA, "QCT MSM7X30 FFA") | |||
136 | .map_io = msm7x30_map_io, | 142 | .map_io = msm7x30_map_io, |
137 | .init_irq = msm7x30_init_irq, | 143 | .init_irq = msm7x30_init_irq, |
138 | .init_machine = msm7x30_init, | 144 | .init_machine = msm7x30_init, |
145 | .init_late = msm7x30_init_late, | ||
139 | .timer = &msm_timer, | 146 | .timer = &msm_timer, |
140 | MACHINE_END | 147 | MACHINE_END |
141 | 148 | ||
@@ -146,5 +153,6 @@ MACHINE_START(MSM7X30_FLUID, "QCT MSM7X30 FLUID") | |||
146 | .map_io = msm7x30_map_io, | 153 | .map_io = msm7x30_map_io, |
147 | .init_irq = msm7x30_init_irq, | 154 | .init_irq = msm7x30_init_irq, |
148 | .init_machine = msm7x30_init, | 155 | .init_machine = msm7x30_init, |
156 | .init_late = msm7x30_init_late, | ||
149 | .timer = &msm_timer, | 157 | .timer = &msm_timer, |
150 | MACHINE_END | 158 | MACHINE_END |
diff --git a/arch/arm/mach-msm/board-msm8960.c b/arch/arm/mach-msm/board-msm8960.c index ed3598128530..65f4a1daa2e5 100644 --- a/arch/arm/mach-msm/board-msm8960.c +++ b/arch/arm/mach-msm/board-msm8960.c | |||
@@ -93,6 +93,11 @@ static void __init msm8960_rumi3_init(void) | |||
93 | platform_add_devices(rumi3_devices, ARRAY_SIZE(rumi3_devices)); | 93 | platform_add_devices(rumi3_devices, ARRAY_SIZE(rumi3_devices)); |
94 | } | 94 | } |
95 | 95 | ||
96 | static void __init msm8960_init_late(void) | ||
97 | { | ||
98 | smd_debugfs_init(); | ||
99 | } | ||
100 | |||
96 | MACHINE_START(MSM8960_SIM, "QCT MSM8960 SIMULATOR") | 101 | MACHINE_START(MSM8960_SIM, "QCT MSM8960 SIMULATOR") |
97 | .fixup = msm8960_fixup, | 102 | .fixup = msm8960_fixup, |
98 | .reserve = msm8960_reserve, | 103 | .reserve = msm8960_reserve, |
@@ -101,6 +106,7 @@ MACHINE_START(MSM8960_SIM, "QCT MSM8960 SIMULATOR") | |||
101 | .timer = &msm_timer, | 106 | .timer = &msm_timer, |
102 | .handle_irq = gic_handle_irq, | 107 | .handle_irq = gic_handle_irq, |
103 | .init_machine = msm8960_sim_init, | 108 | .init_machine = msm8960_sim_init, |
109 | .init_late = msm8960_init_late, | ||
104 | MACHINE_END | 110 | MACHINE_END |
105 | 111 | ||
106 | MACHINE_START(MSM8960_RUMI3, "QCT MSM8960 RUMI3") | 112 | MACHINE_START(MSM8960_RUMI3, "QCT MSM8960 RUMI3") |
@@ -111,5 +117,6 @@ MACHINE_START(MSM8960_RUMI3, "QCT MSM8960 RUMI3") | |||
111 | .timer = &msm_timer, | 117 | .timer = &msm_timer, |
112 | .handle_irq = gic_handle_irq, | 118 | .handle_irq = gic_handle_irq, |
113 | .init_machine = msm8960_rumi3_init, | 119 | .init_machine = msm8960_rumi3_init, |
120 | .init_late = msm8960_init_late, | ||
114 | MACHINE_END | 121 | MACHINE_END |
115 | 122 | ||
diff --git a/arch/arm/mach-msm/board-msm8x60.c b/arch/arm/mach-msm/board-msm8x60.c index fb3496a52ef4..e37a724cd1eb 100644 --- a/arch/arm/mach-msm/board-msm8x60.c +++ b/arch/arm/mach-msm/board-msm8x60.c | |||
@@ -81,6 +81,11 @@ static void __init msm8x60_init(void) | |||
81 | { | 81 | { |
82 | } | 82 | } |
83 | 83 | ||
84 | static void __init msm8x60_init_late(void) | ||
85 | { | ||
86 | smd_debugfs_init(); | ||
87 | } | ||
88 | |||
84 | #ifdef CONFIG_OF | 89 | #ifdef CONFIG_OF |
85 | static struct of_dev_auxdata msm_auxdata_lookup[] __initdata = { | 90 | static struct of_dev_auxdata msm_auxdata_lookup[] __initdata = { |
86 | {} | 91 | {} |
@@ -111,6 +116,7 @@ MACHINE_START(MSM8X60_RUMI3, "QCT MSM8X60 RUMI3") | |||
111 | .init_irq = msm8x60_init_irq, | 116 | .init_irq = msm8x60_init_irq, |
112 | .handle_irq = gic_handle_irq, | 117 | .handle_irq = gic_handle_irq, |
113 | .init_machine = msm8x60_init, | 118 | .init_machine = msm8x60_init, |
119 | .init_late = msm8x60_init_late, | ||
114 | .timer = &msm_timer, | 120 | .timer = &msm_timer, |
115 | MACHINE_END | 121 | MACHINE_END |
116 | 122 | ||
@@ -121,6 +127,7 @@ MACHINE_START(MSM8X60_SURF, "QCT MSM8X60 SURF") | |||
121 | .init_irq = msm8x60_init_irq, | 127 | .init_irq = msm8x60_init_irq, |
122 | .handle_irq = gic_handle_irq, | 128 | .handle_irq = gic_handle_irq, |
123 | .init_machine = msm8x60_init, | 129 | .init_machine = msm8x60_init, |
130 | .init_late = msm8x60_init_late, | ||
124 | .timer = &msm_timer, | 131 | .timer = &msm_timer, |
125 | MACHINE_END | 132 | MACHINE_END |
126 | 133 | ||
@@ -131,6 +138,7 @@ MACHINE_START(MSM8X60_SIM, "QCT MSM8X60 SIMULATOR") | |||
131 | .init_irq = msm8x60_init_irq, | 138 | .init_irq = msm8x60_init_irq, |
132 | .handle_irq = gic_handle_irq, | 139 | .handle_irq = gic_handle_irq, |
133 | .init_machine = msm8x60_init, | 140 | .init_machine = msm8x60_init, |
141 | .init_late = msm8x60_init_late, | ||
134 | .timer = &msm_timer, | 142 | .timer = &msm_timer, |
135 | MACHINE_END | 143 | MACHINE_END |
136 | 144 | ||
@@ -141,6 +149,7 @@ MACHINE_START(MSM8X60_FFA, "QCT MSM8X60 FFA") | |||
141 | .init_irq = msm8x60_init_irq, | 149 | .init_irq = msm8x60_init_irq, |
142 | .handle_irq = gic_handle_irq, | 150 | .handle_irq = gic_handle_irq, |
143 | .init_machine = msm8x60_init, | 151 | .init_machine = msm8x60_init, |
152 | .init_late = msm8x60_init_late, | ||
144 | .timer = &msm_timer, | 153 | .timer = &msm_timer, |
145 | MACHINE_END | 154 | MACHINE_END |
146 | 155 | ||
@@ -150,6 +159,7 @@ DT_MACHINE_START(MSM_DT, "Qualcomm MSM (Flattened Device Tree)") | |||
150 | .map_io = msm8x60_map_io, | 159 | .map_io = msm8x60_map_io, |
151 | .init_irq = msm8x60_init_irq, | 160 | .init_irq = msm8x60_init_irq, |
152 | .init_machine = msm8x60_dt_init, | 161 | .init_machine = msm8x60_dt_init, |
162 | .init_late = msm8x60_init_late, | ||
153 | .timer = &msm_timer, | 163 | .timer = &msm_timer, |
154 | .dt_compat = msm8x60_fluid_match, | 164 | .dt_compat = msm8x60_fluid_match, |
155 | MACHINE_END | 165 | MACHINE_END |
diff --git a/arch/arm/mach-msm/board-qsd8x50.c b/arch/arm/mach-msm/board-qsd8x50.c index fbaa4ed95a3c..c8fe0edb9761 100644 --- a/arch/arm/mach-msm/board-qsd8x50.c +++ b/arch/arm/mach-msm/board-qsd8x50.c | |||
@@ -190,11 +190,17 @@ static void __init qsd8x50_init(void) | |||
190 | qsd8x50_init_mmc(); | 190 | qsd8x50_init_mmc(); |
191 | } | 191 | } |
192 | 192 | ||
193 | static void __init qsd8x50_init_late(void) | ||
194 | { | ||
195 | smd_debugfs_init(); | ||
196 | } | ||
197 | |||
193 | MACHINE_START(QSD8X50_SURF, "QCT QSD8X50 SURF") | 198 | MACHINE_START(QSD8X50_SURF, "QCT QSD8X50 SURF") |
194 | .atag_offset = 0x100, | 199 | .atag_offset = 0x100, |
195 | .map_io = qsd8x50_map_io, | 200 | .map_io = qsd8x50_map_io, |
196 | .init_irq = qsd8x50_init_irq, | 201 | .init_irq = qsd8x50_init_irq, |
197 | .init_machine = qsd8x50_init, | 202 | .init_machine = qsd8x50_init, |
203 | .init_late = qsd8x50_init_late, | ||
198 | .timer = &msm_timer, | 204 | .timer = &msm_timer, |
199 | MACHINE_END | 205 | MACHINE_END |
200 | 206 | ||
@@ -203,5 +209,6 @@ MACHINE_START(QSD8X50A_ST1_5, "QCT QSD8X50A ST1.5") | |||
203 | .map_io = qsd8x50_map_io, | 209 | .map_io = qsd8x50_map_io, |
204 | .init_irq = qsd8x50_init_irq, | 210 | .init_irq = qsd8x50_init_irq, |
205 | .init_machine = qsd8x50_init, | 211 | .init_machine = qsd8x50_init, |
212 | .init_late = qsd8x50_init_late, | ||
206 | .timer = &msm_timer, | 213 | .timer = &msm_timer, |
207 | MACHINE_END | 214 | MACHINE_END |
diff --git a/arch/arm/mach-msm/board-sapphire.c b/arch/arm/mach-msm/board-sapphire.c index 4a8ea0d40b6f..2e569ab10eef 100644 --- a/arch/arm/mach-msm/board-sapphire.c +++ b/arch/arm/mach-msm/board-sapphire.c | |||
@@ -101,6 +101,11 @@ static void __init sapphire_map_io(void) | |||
101 | msm_clock_init(); | 101 | msm_clock_init(); |
102 | } | 102 | } |
103 | 103 | ||
104 | static void __init sapphire_init_late(void) | ||
105 | { | ||
106 | smd_debugfs_init(); | ||
107 | } | ||
108 | |||
104 | MACHINE_START(SAPPHIRE, "sapphire") | 109 | MACHINE_START(SAPPHIRE, "sapphire") |
105 | /* Maintainer: Brian Swetland <swetland@google.com> */ | 110 | /* Maintainer: Brian Swetland <swetland@google.com> */ |
106 | .atag_offset = 0x100, | 111 | .atag_offset = 0x100, |
@@ -108,5 +113,6 @@ MACHINE_START(SAPPHIRE, "sapphire") | |||
108 | .map_io = sapphire_map_io, | 113 | .map_io = sapphire_map_io, |
109 | .init_irq = sapphire_init_irq, | 114 | .init_irq = sapphire_init_irq, |
110 | .init_machine = sapphire_init, | 115 | .init_machine = sapphire_init, |
116 | .init_late = sapphire_init_late, | ||
111 | .timer = &msm_timer, | 117 | .timer = &msm_timer, |
112 | MACHINE_END | 118 | MACHINE_END |
diff --git a/arch/arm/mach-msm/board-trout.c b/arch/arm/mach-msm/board-trout.c index d4060a37e23d..bbe13f12fa01 100644 --- a/arch/arm/mach-msm/board-trout.c +++ b/arch/arm/mach-msm/board-trout.c | |||
@@ -98,6 +98,11 @@ static void __init trout_map_io(void) | |||
98 | msm_clock_init(msm_clocks_7x01a, msm_num_clocks_7x01a); | 98 | msm_clock_init(msm_clocks_7x01a, msm_num_clocks_7x01a); |
99 | } | 99 | } |
100 | 100 | ||
101 | static void __init trout_init_late(void) | ||
102 | { | ||
103 | smd_debugfs_init(); | ||
104 | } | ||
105 | |||
101 | MACHINE_START(TROUT, "HTC Dream") | 106 | MACHINE_START(TROUT, "HTC Dream") |
102 | .atag_offset = 0x100, | 107 | .atag_offset = 0x100, |
103 | .fixup = trout_fixup, | 108 | .fixup = trout_fixup, |
@@ -105,5 +110,6 @@ MACHINE_START(TROUT, "HTC Dream") | |||
105 | .init_early = trout_init_early, | 110 | .init_early = trout_init_early, |
106 | .init_irq = trout_init_irq, | 111 | .init_irq = trout_init_irq, |
107 | .init_machine = trout_init, | 112 | .init_machine = trout_init, |
113 | .init_late = trout_init_late, | ||
108 | .timer = &msm_timer, | 114 | .timer = &msm_timer, |
109 | MACHINE_END | 115 | MACHINE_END |
diff --git a/arch/arm/mach-msm/include/mach/board.h b/arch/arm/mach-msm/include/mach/board.h index 2ce8f1f2fc4d..435f8edfafd1 100644 --- a/arch/arm/mach-msm/include/mach/board.h +++ b/arch/arm/mach-msm/include/mach/board.h | |||
@@ -47,4 +47,10 @@ int __init msm_add_sdcc(unsigned int controller, | |||
47 | struct msm_mmc_platform_data *plat, | 47 | struct msm_mmc_platform_data *plat, |
48 | unsigned int stat_irq, unsigned long stat_irq_flags); | 48 | unsigned int stat_irq, unsigned long stat_irq_flags); |
49 | 49 | ||
50 | #if defined(CONFIG_MSM_SMD) && defined(CONFIG_DEBUG_FS) | ||
51 | int smd_debugfs_init(void); | ||
52 | #else | ||
53 | static inline int smd_debugfs_init(void) { return 0; } | ||
54 | #endif | ||
55 | |||
50 | #endif | 56 | #endif |
diff --git a/arch/arm/mach-msm/smd_debug.c b/arch/arm/mach-msm/smd_debug.c index c56df9e932ae..8056b3e5590f 100644 --- a/arch/arm/mach-msm/smd_debug.c +++ b/arch/arm/mach-msm/smd_debug.c | |||
@@ -216,7 +216,7 @@ static void debug_create(const char *name, umode_t mode, | |||
216 | debugfs_create_file(name, mode, dent, fill, &debug_ops); | 216 | debugfs_create_file(name, mode, dent, fill, &debug_ops); |
217 | } | 217 | } |
218 | 218 | ||
219 | static int smd_debugfs_init(void) | 219 | int __init smd_debugfs_init(void) |
220 | { | 220 | { |
221 | struct dentry *dent; | 221 | struct dentry *dent; |
222 | 222 | ||
@@ -234,7 +234,6 @@ static int smd_debugfs_init(void) | |||
234 | return 0; | 234 | return 0; |
235 | } | 235 | } |
236 | 236 | ||
237 | late_initcall(smd_debugfs_init); | ||
238 | #endif | 237 | #endif |
239 | 238 | ||
240 | 239 | ||
diff --git a/arch/arm/mach-mv78xx0/common.c b/arch/arm/mach-mv78xx0/common.c index a5dcf766a3f9..b4c53b846c9c 100644 --- a/arch/arm/mach-mv78xx0/common.c +++ b/arch/arm/mach-mv78xx0/common.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/platform_device.h> | 13 | #include <linux/platform_device.h> |
14 | #include <linux/serial_8250.h> | 14 | #include <linux/serial_8250.h> |
15 | #include <linux/ata_platform.h> | 15 | #include <linux/ata_platform.h> |
16 | #include <linux/clk-provider.h> | ||
16 | #include <linux/ethtool.h> | 17 | #include <linux/ethtool.h> |
17 | #include <asm/mach/map.h> | 18 | #include <asm/mach/map.h> |
18 | #include <asm/mach/time.h> | 19 | #include <asm/mach/time.h> |
@@ -103,24 +104,24 @@ static void get_pclk_l2clk(int hclk, int core_index, int *pclk, int *l2clk) | |||
103 | 104 | ||
104 | static int get_tclk(void) | 105 | static int get_tclk(void) |
105 | { | 106 | { |
106 | int tclk; | 107 | int tclk_freq; |
107 | 108 | ||
108 | /* | 109 | /* |
109 | * TCLK tick rate is configured by DEV_A[2:0] strap pins. | 110 | * TCLK tick rate is configured by DEV_A[2:0] strap pins. |
110 | */ | 111 | */ |
111 | switch ((readl(SAMPLE_AT_RESET_HIGH) >> 6) & 7) { | 112 | switch ((readl(SAMPLE_AT_RESET_HIGH) >> 6) & 7) { |
112 | case 1: | 113 | case 1: |
113 | tclk = 166666667; | 114 | tclk_freq = 166666667; |
114 | break; | 115 | break; |
115 | case 3: | 116 | case 3: |
116 | tclk = 200000000; | 117 | tclk_freq = 200000000; |
117 | break; | 118 | break; |
118 | default: | 119 | default: |
119 | panic("unknown TCLK PLL setting: %.8x\n", | 120 | panic("unknown TCLK PLL setting: %.8x\n", |
120 | readl(SAMPLE_AT_RESET_HIGH)); | 121 | readl(SAMPLE_AT_RESET_HIGH)); |
121 | } | 122 | } |
122 | 123 | ||
123 | return tclk; | 124 | return tclk_freq; |
124 | } | 125 | } |
125 | 126 | ||
126 | 127 | ||
@@ -166,6 +167,19 @@ void __init mv78xx0_map_io(void) | |||
166 | 167 | ||
167 | 168 | ||
168 | /***************************************************************************** | 169 | /***************************************************************************** |
170 | * CLK tree | ||
171 | ****************************************************************************/ | ||
172 | static struct clk *tclk; | ||
173 | |||
174 | static void __init clk_init(void) | ||
175 | { | ||
176 | tclk = clk_register_fixed_rate(NULL, "tclk", NULL, CLK_IS_ROOT, | ||
177 | get_tclk()); | ||
178 | |||
179 | orion_clkdev_init(tclk); | ||
180 | } | ||
181 | |||
182 | /***************************************************************************** | ||
169 | * EHCI | 183 | * EHCI |
170 | ****************************************************************************/ | 184 | ****************************************************************************/ |
171 | void __init mv78xx0_ehci0_init(void) | 185 | void __init mv78xx0_ehci0_init(void) |
@@ -199,7 +213,7 @@ void __init mv78xx0_ge00_init(struct mv643xx_eth_platform_data *eth_data) | |||
199 | { | 213 | { |
200 | orion_ge00_init(eth_data, | 214 | orion_ge00_init(eth_data, |
201 | GE00_PHYS_BASE, IRQ_MV78XX0_GE00_SUM, | 215 | GE00_PHYS_BASE, IRQ_MV78XX0_GE00_SUM, |
202 | IRQ_MV78XX0_GE_ERR, get_tclk()); | 216 | IRQ_MV78XX0_GE_ERR); |
203 | } | 217 | } |
204 | 218 | ||
205 | 219 | ||
@@ -210,7 +224,7 @@ void __init mv78xx0_ge01_init(struct mv643xx_eth_platform_data *eth_data) | |||
210 | { | 224 | { |
211 | orion_ge01_init(eth_data, | 225 | orion_ge01_init(eth_data, |
212 | GE01_PHYS_BASE, IRQ_MV78XX0_GE01_SUM, | 226 | GE01_PHYS_BASE, IRQ_MV78XX0_GE01_SUM, |
213 | NO_IRQ, get_tclk()); | 227 | NO_IRQ); |
214 | } | 228 | } |
215 | 229 | ||
216 | 230 | ||
@@ -234,7 +248,7 @@ void __init mv78xx0_ge10_init(struct mv643xx_eth_platform_data *eth_data) | |||
234 | 248 | ||
235 | orion_ge10_init(eth_data, | 249 | orion_ge10_init(eth_data, |
236 | GE10_PHYS_BASE, IRQ_MV78XX0_GE10_SUM, | 250 | GE10_PHYS_BASE, IRQ_MV78XX0_GE10_SUM, |
237 | NO_IRQ, get_tclk()); | 251 | NO_IRQ); |
238 | } | 252 | } |
239 | 253 | ||
240 | 254 | ||
@@ -258,7 +272,7 @@ void __init mv78xx0_ge11_init(struct mv643xx_eth_platform_data *eth_data) | |||
258 | 272 | ||
259 | orion_ge11_init(eth_data, | 273 | orion_ge11_init(eth_data, |
260 | GE11_PHYS_BASE, IRQ_MV78XX0_GE11_SUM, | 274 | GE11_PHYS_BASE, IRQ_MV78XX0_GE11_SUM, |
261 | NO_IRQ, get_tclk()); | 275 | NO_IRQ); |
262 | } | 276 | } |
263 | 277 | ||
264 | /***************************************************************************** | 278 | /***************************************************************************** |
@@ -285,7 +299,7 @@ void __init mv78xx0_sata_init(struct mv_sata_platform_data *sata_data) | |||
285 | void __init mv78xx0_uart0_init(void) | 299 | void __init mv78xx0_uart0_init(void) |
286 | { | 300 | { |
287 | orion_uart0_init(UART0_VIRT_BASE, UART0_PHYS_BASE, | 301 | orion_uart0_init(UART0_VIRT_BASE, UART0_PHYS_BASE, |
288 | IRQ_MV78XX0_UART_0, get_tclk()); | 302 | IRQ_MV78XX0_UART_0, tclk); |
289 | } | 303 | } |
290 | 304 | ||
291 | 305 | ||
@@ -295,7 +309,7 @@ void __init mv78xx0_uart0_init(void) | |||
295 | void __init mv78xx0_uart1_init(void) | 309 | void __init mv78xx0_uart1_init(void) |
296 | { | 310 | { |
297 | orion_uart1_init(UART1_VIRT_BASE, UART1_PHYS_BASE, | 311 | orion_uart1_init(UART1_VIRT_BASE, UART1_PHYS_BASE, |
298 | IRQ_MV78XX0_UART_1, get_tclk()); | 312 | IRQ_MV78XX0_UART_1, tclk); |
299 | } | 313 | } |
300 | 314 | ||
301 | 315 | ||
@@ -305,7 +319,7 @@ void __init mv78xx0_uart1_init(void) | |||
305 | void __init mv78xx0_uart2_init(void) | 319 | void __init mv78xx0_uart2_init(void) |
306 | { | 320 | { |
307 | orion_uart2_init(UART2_VIRT_BASE, UART2_PHYS_BASE, | 321 | orion_uart2_init(UART2_VIRT_BASE, UART2_PHYS_BASE, |
308 | IRQ_MV78XX0_UART_2, get_tclk()); | 322 | IRQ_MV78XX0_UART_2, tclk); |
309 | } | 323 | } |
310 | 324 | ||
311 | /***************************************************************************** | 325 | /***************************************************************************** |
@@ -314,7 +328,7 @@ void __init mv78xx0_uart2_init(void) | |||
314 | void __init mv78xx0_uart3_init(void) | 328 | void __init mv78xx0_uart3_init(void) |
315 | { | 329 | { |
316 | orion_uart3_init(UART3_VIRT_BASE, UART3_PHYS_BASE, | 330 | orion_uart3_init(UART3_VIRT_BASE, UART3_PHYS_BASE, |
317 | IRQ_MV78XX0_UART_3, get_tclk()); | 331 | IRQ_MV78XX0_UART_3, tclk); |
318 | } | 332 | } |
319 | 333 | ||
320 | /***************************************************************************** | 334 | /***************************************************************************** |
@@ -378,25 +392,26 @@ void __init mv78xx0_init(void) | |||
378 | int hclk; | 392 | int hclk; |
379 | int pclk; | 393 | int pclk; |
380 | int l2clk; | 394 | int l2clk; |
381 | int tclk; | ||
382 | 395 | ||
383 | core_index = mv78xx0_core_index(); | 396 | core_index = mv78xx0_core_index(); |
384 | hclk = get_hclk(); | 397 | hclk = get_hclk(); |
385 | get_pclk_l2clk(hclk, core_index, &pclk, &l2clk); | 398 | get_pclk_l2clk(hclk, core_index, &pclk, &l2clk); |
386 | tclk = get_tclk(); | ||
387 | 399 | ||
388 | printk(KERN_INFO "%s ", mv78xx0_id()); | 400 | printk(KERN_INFO "%s ", mv78xx0_id()); |
389 | printk("core #%d, ", core_index); | 401 | printk("core #%d, ", core_index); |
390 | printk("PCLK = %dMHz, ", (pclk + 499999) / 1000000); | 402 | printk("PCLK = %dMHz, ", (pclk + 499999) / 1000000); |
391 | printk("L2 = %dMHz, ", (l2clk + 499999) / 1000000); | 403 | printk("L2 = %dMHz, ", (l2clk + 499999) / 1000000); |
392 | printk("HCLK = %dMHz, ", (hclk + 499999) / 1000000); | 404 | printk("HCLK = %dMHz, ", (hclk + 499999) / 1000000); |
393 | printk("TCLK = %dMHz\n", (tclk + 499999) / 1000000); | 405 | printk("TCLK = %dMHz\n", (get_tclk() + 499999) / 1000000); |
394 | 406 | ||
395 | mv78xx0_setup_cpu_mbus(); | 407 | mv78xx0_setup_cpu_mbus(); |
396 | 408 | ||
397 | #ifdef CONFIG_CACHE_FEROCEON_L2 | 409 | #ifdef CONFIG_CACHE_FEROCEON_L2 |
398 | feroceon_l2_init(is_l2_writethrough()); | 410 | feroceon_l2_init(is_l2_writethrough()); |
399 | #endif | 411 | #endif |
412 | |||
413 | /* Setup root of clk tree */ | ||
414 | clk_init(); | ||
400 | } | 415 | } |
401 | 416 | ||
402 | void mv78xx0_restart(char mode, const char *cmd) | 417 | void mv78xx0_restart(char mode, const char *cmd) |
diff --git a/arch/arm/mach-mxs/Kconfig b/arch/arm/mach-mxs/Kconfig index 07d5383d68ee..91cf0625819c 100644 --- a/arch/arm/mach-mxs/Kconfig +++ b/arch/arm/mach-mxs/Kconfig | |||
@@ -7,18 +7,28 @@ config MXS_OCOTP | |||
7 | 7 | ||
8 | config SOC_IMX23 | 8 | config SOC_IMX23 |
9 | bool | 9 | bool |
10 | select ARM_AMBA | ||
10 | select CPU_ARM926T | 11 | select CPU_ARM926T |
11 | select HAVE_PWM | 12 | select HAVE_PWM |
12 | select PINCTRL_IMX23 | 13 | select PINCTRL_IMX23 |
13 | 14 | ||
14 | config SOC_IMX28 | 15 | config SOC_IMX28 |
15 | bool | 16 | bool |
17 | select ARM_AMBA | ||
16 | select CPU_ARM926T | 18 | select CPU_ARM926T |
17 | select HAVE_PWM | 19 | select HAVE_PWM |
18 | select PINCTRL_IMX28 | 20 | select PINCTRL_IMX28 |
19 | 21 | ||
20 | comment "MXS platforms:" | 22 | comment "MXS platforms:" |
21 | 23 | ||
24 | config MACH_MXS_DT | ||
25 | bool "Support MXS platforms from device tree" | ||
26 | select SOC_IMX23 | ||
27 | select SOC_IMX28 | ||
28 | help | ||
29 | Include support for Freescale MXS platforms(i.MX23 and i.MX28) | ||
30 | using the device tree for discovery | ||
31 | |||
22 | config MACH_STMP378X_DEVB | 32 | config MACH_STMP378X_DEVB |
23 | bool "Support STMP378x_devb Platform" | 33 | bool "Support STMP378x_devb Platform" |
24 | select SOC_IMX23 | 34 | select SOC_IMX23 |
diff --git a/arch/arm/mach-mxs/Makefile b/arch/arm/mach-mxs/Makefile index 908bf9a567f1..e41590ccb437 100644 --- a/arch/arm/mach-mxs/Makefile +++ b/arch/arm/mach-mxs/Makefile | |||
@@ -1,12 +1,10 @@ | |||
1 | # Common support | 1 | # Common support |
2 | obj-y := clock.o devices.o icoll.o iomux.o system.o timer.o mm.o | 2 | obj-y := devices.o icoll.o iomux.o system.o timer.o mm.o |
3 | 3 | ||
4 | obj-$(CONFIG_MXS_OCOTP) += ocotp.o | 4 | obj-$(CONFIG_MXS_OCOTP) += ocotp.o |
5 | obj-$(CONFIG_PM) += pm.o | 5 | obj-$(CONFIG_PM) += pm.o |
6 | 6 | ||
7 | obj-$(CONFIG_SOC_IMX23) += clock-mx23.o | 7 | obj-$(CONFIG_MACH_MXS_DT) += mach-mxs.o |
8 | obj-$(CONFIG_SOC_IMX28) += clock-mx28.o | ||
9 | |||
10 | obj-$(CONFIG_MACH_STMP378X_DEVB) += mach-stmp378x_devb.o | 8 | obj-$(CONFIG_MACH_STMP378X_DEVB) += mach-stmp378x_devb.o |
11 | obj-$(CONFIG_MACH_MX23EVK) += mach-mx23evk.o | 9 | obj-$(CONFIG_MACH_MX23EVK) += mach-mx23evk.o |
12 | obj-$(CONFIG_MACH_MX28EVK) += mach-mx28evk.o | 10 | obj-$(CONFIG_MACH_MX28EVK) += mach-mx28evk.o |
diff --git a/arch/arm/mach-mxs/clock-mx23.c b/arch/arm/mach-mxs/clock-mx23.c deleted file mode 100644 index e3ac52c34019..000000000000 --- a/arch/arm/mach-mxs/clock-mx23.c +++ /dev/null | |||
@@ -1,536 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2009-2010 Freescale Semiconductor, Inc. All Rights Reserved. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License as published by | ||
6 | * the Free Software Foundation; either version 2 of the License, or | ||
7 | * (at your option) any later version. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License along | ||
15 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
16 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||
17 | */ | ||
18 | |||
19 | #include <linux/mm.h> | ||
20 | #include <linux/delay.h> | ||
21 | #include <linux/clk.h> | ||
22 | #include <linux/io.h> | ||
23 | #include <linux/jiffies.h> | ||
24 | #include <linux/clkdev.h> | ||
25 | |||
26 | #include <asm/clkdev.h> | ||
27 | #include <asm/div64.h> | ||
28 | |||
29 | #include <mach/mx23.h> | ||
30 | #include <mach/common.h> | ||
31 | #include <mach/clock.h> | ||
32 | |||
33 | #include "regs-clkctrl-mx23.h" | ||
34 | |||
35 | #define CLKCTRL_BASE_ADDR MX23_IO_ADDRESS(MX23_CLKCTRL_BASE_ADDR) | ||
36 | #define DIGCTRL_BASE_ADDR MX23_IO_ADDRESS(MX23_DIGCTL_BASE_ADDR) | ||
37 | |||
38 | #define PARENT_RATE_SHIFT 8 | ||
39 | |||
40 | static int _raw_clk_enable(struct clk *clk) | ||
41 | { | ||
42 | u32 reg; | ||
43 | |||
44 | if (clk->enable_reg) { | ||
45 | reg = __raw_readl(clk->enable_reg); | ||
46 | reg &= ~(1 << clk->enable_shift); | ||
47 | __raw_writel(reg, clk->enable_reg); | ||
48 | } | ||
49 | |||
50 | return 0; | ||
51 | } | ||
52 | |||
53 | static void _raw_clk_disable(struct clk *clk) | ||
54 | { | ||
55 | u32 reg; | ||
56 | |||
57 | if (clk->enable_reg) { | ||
58 | reg = __raw_readl(clk->enable_reg); | ||
59 | reg |= 1 << clk->enable_shift; | ||
60 | __raw_writel(reg, clk->enable_reg); | ||
61 | } | ||
62 | } | ||
63 | |||
64 | /* | ||
65 | * ref_xtal_clk | ||
66 | */ | ||
67 | static unsigned long ref_xtal_clk_get_rate(struct clk *clk) | ||
68 | { | ||
69 | return 24000000; | ||
70 | } | ||
71 | |||
72 | static struct clk ref_xtal_clk = { | ||
73 | .get_rate = ref_xtal_clk_get_rate, | ||
74 | }; | ||
75 | |||
76 | /* | ||
77 | * pll_clk | ||
78 | */ | ||
79 | static unsigned long pll_clk_get_rate(struct clk *clk) | ||
80 | { | ||
81 | return 480000000; | ||
82 | } | ||
83 | |||
84 | static int pll_clk_enable(struct clk *clk) | ||
85 | { | ||
86 | __raw_writel(BM_CLKCTRL_PLLCTRL0_POWER | | ||
87 | BM_CLKCTRL_PLLCTRL0_EN_USB_CLKS, | ||
88 | CLKCTRL_BASE_ADDR + HW_CLKCTRL_PLLCTRL0_SET); | ||
89 | |||
90 | /* Only a 10us delay is need. PLLCTRL1 LOCK bitfied is only a timer | ||
91 | * and is incorrect (excessive). Per definition of the PLLCTRL0 | ||
92 | * POWER field, waiting at least 10us. | ||
93 | */ | ||
94 | udelay(10); | ||
95 | |||
96 | return 0; | ||
97 | } | ||
98 | |||
99 | static void pll_clk_disable(struct clk *clk) | ||
100 | { | ||
101 | __raw_writel(BM_CLKCTRL_PLLCTRL0_POWER | | ||
102 | BM_CLKCTRL_PLLCTRL0_EN_USB_CLKS, | ||
103 | CLKCTRL_BASE_ADDR + HW_CLKCTRL_PLLCTRL0_CLR); | ||
104 | } | ||
105 | |||
106 | static struct clk pll_clk = { | ||
107 | .get_rate = pll_clk_get_rate, | ||
108 | .enable = pll_clk_enable, | ||
109 | .disable = pll_clk_disable, | ||
110 | .parent = &ref_xtal_clk, | ||
111 | }; | ||
112 | |||
113 | /* | ||
114 | * ref_clk | ||
115 | */ | ||
116 | #define _CLK_GET_RATE_REF(name, sr, ss) \ | ||
117 | static unsigned long name##_get_rate(struct clk *clk) \ | ||
118 | { \ | ||
119 | unsigned long parent_rate; \ | ||
120 | u32 reg, div; \ | ||
121 | \ | ||
122 | reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_##sr); \ | ||
123 | div = (reg >> BP_CLKCTRL_##sr##_##ss##FRAC) & 0x3f; \ | ||
124 | parent_rate = clk_get_rate(clk->parent); \ | ||
125 | \ | ||
126 | return SH_DIV((parent_rate >> PARENT_RATE_SHIFT) * 18, \ | ||
127 | div, PARENT_RATE_SHIFT); \ | ||
128 | } | ||
129 | |||
130 | _CLK_GET_RATE_REF(ref_cpu_clk, FRAC, CPU) | ||
131 | _CLK_GET_RATE_REF(ref_emi_clk, FRAC, EMI) | ||
132 | _CLK_GET_RATE_REF(ref_pix_clk, FRAC, PIX) | ||
133 | _CLK_GET_RATE_REF(ref_io_clk, FRAC, IO) | ||
134 | |||
135 | #define _DEFINE_CLOCK_REF(name, er, es) \ | ||
136 | static struct clk name = { \ | ||
137 | .enable_reg = CLKCTRL_BASE_ADDR + HW_CLKCTRL_##er, \ | ||
138 | .enable_shift = BP_CLKCTRL_##er##_CLKGATE##es, \ | ||
139 | .get_rate = name##_get_rate, \ | ||
140 | .enable = _raw_clk_enable, \ | ||
141 | .disable = _raw_clk_disable, \ | ||
142 | .parent = &pll_clk, \ | ||
143 | } | ||
144 | |||
145 | _DEFINE_CLOCK_REF(ref_cpu_clk, FRAC, CPU); | ||
146 | _DEFINE_CLOCK_REF(ref_emi_clk, FRAC, EMI); | ||
147 | _DEFINE_CLOCK_REF(ref_pix_clk, FRAC, PIX); | ||
148 | _DEFINE_CLOCK_REF(ref_io_clk, FRAC, IO); | ||
149 | |||
150 | /* | ||
151 | * General clocks | ||
152 | * | ||
153 | * clk_get_rate | ||
154 | */ | ||
155 | static unsigned long rtc_clk_get_rate(struct clk *clk) | ||
156 | { | ||
157 | /* ref_xtal_clk is implemented as the only parent */ | ||
158 | return clk_get_rate(clk->parent) / 768; | ||
159 | } | ||
160 | |||
161 | static unsigned long clk32k_clk_get_rate(struct clk *clk) | ||
162 | { | ||
163 | return clk->parent->get_rate(clk->parent) / 750; | ||
164 | } | ||
165 | |||
166 | #define _CLK_GET_RATE(name, rs) \ | ||
167 | static unsigned long name##_get_rate(struct clk *clk) \ | ||
168 | { \ | ||
169 | u32 reg, div; \ | ||
170 | \ | ||
171 | reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_##rs); \ | ||
172 | \ | ||
173 | if (clk->parent == &ref_xtal_clk) \ | ||
174 | div = (reg & BM_CLKCTRL_##rs##_DIV_XTAL) >> \ | ||
175 | BP_CLKCTRL_##rs##_DIV_XTAL; \ | ||
176 | else \ | ||
177 | div = (reg & BM_CLKCTRL_##rs##_DIV_##rs) >> \ | ||
178 | BP_CLKCTRL_##rs##_DIV_##rs; \ | ||
179 | \ | ||
180 | if (!div) \ | ||
181 | return -EINVAL; \ | ||
182 | \ | ||
183 | return clk_get_rate(clk->parent) / div; \ | ||
184 | } | ||
185 | |||
186 | _CLK_GET_RATE(cpu_clk, CPU) | ||
187 | _CLK_GET_RATE(emi_clk, EMI) | ||
188 | |||
189 | #define _CLK_GET_RATE1(name, rs) \ | ||
190 | static unsigned long name##_get_rate(struct clk *clk) \ | ||
191 | { \ | ||
192 | u32 reg, div; \ | ||
193 | \ | ||
194 | reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_##rs); \ | ||
195 | div = (reg & BM_CLKCTRL_##rs##_DIV) >> BP_CLKCTRL_##rs##_DIV; \ | ||
196 | \ | ||
197 | if (!div) \ | ||
198 | return -EINVAL; \ | ||
199 | \ | ||
200 | return clk_get_rate(clk->parent) / div; \ | ||
201 | } | ||
202 | |||
203 | _CLK_GET_RATE1(hbus_clk, HBUS) | ||
204 | _CLK_GET_RATE1(xbus_clk, XBUS) | ||
205 | _CLK_GET_RATE1(ssp_clk, SSP) | ||
206 | _CLK_GET_RATE1(gpmi_clk, GPMI) | ||
207 | _CLK_GET_RATE1(lcdif_clk, PIX) | ||
208 | |||
209 | #define _CLK_GET_RATE_STUB(name) \ | ||
210 | static unsigned long name##_get_rate(struct clk *clk) \ | ||
211 | { \ | ||
212 | return clk_get_rate(clk->parent); \ | ||
213 | } | ||
214 | |||
215 | _CLK_GET_RATE_STUB(uart_clk) | ||
216 | _CLK_GET_RATE_STUB(audio_clk) | ||
217 | _CLK_GET_RATE_STUB(pwm_clk) | ||
218 | |||
219 | /* | ||
220 | * clk_set_rate | ||
221 | */ | ||
222 | static int cpu_clk_set_rate(struct clk *clk, unsigned long rate) | ||
223 | { | ||
224 | u32 reg, bm_busy, div_max, d, f, div, frac; | ||
225 | unsigned long diff, parent_rate, calc_rate; | ||
226 | |||
227 | parent_rate = clk_get_rate(clk->parent); | ||
228 | |||
229 | if (clk->parent == &ref_xtal_clk) { | ||
230 | div_max = BM_CLKCTRL_CPU_DIV_XTAL >> BP_CLKCTRL_CPU_DIV_XTAL; | ||
231 | bm_busy = BM_CLKCTRL_CPU_BUSY_REF_XTAL; | ||
232 | div = DIV_ROUND_UP(parent_rate, rate); | ||
233 | if (div == 0 || div > div_max) | ||
234 | return -EINVAL; | ||
235 | } else { | ||
236 | div_max = BM_CLKCTRL_CPU_DIV_CPU >> BP_CLKCTRL_CPU_DIV_CPU; | ||
237 | bm_busy = BM_CLKCTRL_CPU_BUSY_REF_CPU; | ||
238 | rate >>= PARENT_RATE_SHIFT; | ||
239 | parent_rate >>= PARENT_RATE_SHIFT; | ||
240 | diff = parent_rate; | ||
241 | div = frac = 1; | ||
242 | for (d = 1; d <= div_max; d++) { | ||
243 | f = parent_rate * 18 / d / rate; | ||
244 | if ((parent_rate * 18 / d) % rate) | ||
245 | f++; | ||
246 | if (f < 18 || f > 35) | ||
247 | continue; | ||
248 | |||
249 | calc_rate = parent_rate * 18 / f / d; | ||
250 | if (calc_rate > rate) | ||
251 | continue; | ||
252 | |||
253 | if (rate - calc_rate < diff) { | ||
254 | frac = f; | ||
255 | div = d; | ||
256 | diff = rate - calc_rate; | ||
257 | } | ||
258 | |||
259 | if (diff == 0) | ||
260 | break; | ||
261 | } | ||
262 | |||
263 | if (diff == parent_rate) | ||
264 | return -EINVAL; | ||
265 | |||
266 | reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_FRAC); | ||
267 | reg &= ~BM_CLKCTRL_FRAC_CPUFRAC; | ||
268 | reg |= frac; | ||
269 | __raw_writel(reg, CLKCTRL_BASE_ADDR + HW_CLKCTRL_FRAC); | ||
270 | } | ||
271 | |||
272 | reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_CPU); | ||
273 | reg &= ~BM_CLKCTRL_CPU_DIV_CPU; | ||
274 | reg |= div << BP_CLKCTRL_CPU_DIV_CPU; | ||
275 | __raw_writel(reg, CLKCTRL_BASE_ADDR + HW_CLKCTRL_CPU); | ||
276 | |||
277 | mxs_clkctrl_timeout(HW_CLKCTRL_CPU, bm_busy); | ||
278 | |||
279 | return 0; | ||
280 | } | ||
281 | |||
282 | #define _CLK_SET_RATE(name, dr) \ | ||
283 | static int name##_set_rate(struct clk *clk, unsigned long rate) \ | ||
284 | { \ | ||
285 | u32 reg, div_max, div; \ | ||
286 | unsigned long parent_rate; \ | ||
287 | \ | ||
288 | parent_rate = clk_get_rate(clk->parent); \ | ||
289 | div_max = BM_CLKCTRL_##dr##_DIV >> BP_CLKCTRL_##dr##_DIV; \ | ||
290 | \ | ||
291 | div = DIV_ROUND_UP(parent_rate, rate); \ | ||
292 | if (div == 0 || div > div_max) \ | ||
293 | return -EINVAL; \ | ||
294 | \ | ||
295 | reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_##dr); \ | ||
296 | reg &= ~BM_CLKCTRL_##dr##_DIV; \ | ||
297 | reg |= div << BP_CLKCTRL_##dr##_DIV; \ | ||
298 | if (reg & (1 << clk->enable_shift)) { \ | ||
299 | pr_err("%s: clock is gated\n", __func__); \ | ||
300 | return -EINVAL; \ | ||
301 | } \ | ||
302 | __raw_writel(reg, CLKCTRL_BASE_ADDR + HW_CLKCTRL_##dr); \ | ||
303 | \ | ||
304 | mxs_clkctrl_timeout(HW_CLKCTRL_##dr, BM_CLKCTRL_##dr##_BUSY); \ | ||
305 | return 0; \ | ||
306 | } | ||
307 | |||
308 | _CLK_SET_RATE(xbus_clk, XBUS) | ||
309 | _CLK_SET_RATE(ssp_clk, SSP) | ||
310 | _CLK_SET_RATE(gpmi_clk, GPMI) | ||
311 | _CLK_SET_RATE(lcdif_clk, PIX) | ||
312 | |||
313 | #define _CLK_SET_RATE_STUB(name) \ | ||
314 | static int name##_set_rate(struct clk *clk, unsigned long rate) \ | ||
315 | { \ | ||
316 | return -EINVAL; \ | ||
317 | } | ||
318 | |||
319 | _CLK_SET_RATE_STUB(emi_clk) | ||
320 | _CLK_SET_RATE_STUB(uart_clk) | ||
321 | _CLK_SET_RATE_STUB(audio_clk) | ||
322 | _CLK_SET_RATE_STUB(pwm_clk) | ||
323 | _CLK_SET_RATE_STUB(clk32k_clk) | ||
324 | |||
325 | /* | ||
326 | * clk_set_parent | ||
327 | */ | ||
328 | #define _CLK_SET_PARENT(name, bit) \ | ||
329 | static int name##_set_parent(struct clk *clk, struct clk *parent) \ | ||
330 | { \ | ||
331 | if (parent != clk->parent) { \ | ||
332 | __raw_writel(BM_CLKCTRL_CLKSEQ_BYPASS_##bit, \ | ||
333 | CLKCTRL_BASE_ADDR + HW_CLKCTRL_CLKSEQ_TOG); \ | ||
334 | clk->parent = parent; \ | ||
335 | } \ | ||
336 | \ | ||
337 | return 0; \ | ||
338 | } | ||
339 | |||
340 | _CLK_SET_PARENT(cpu_clk, CPU) | ||
341 | _CLK_SET_PARENT(emi_clk, EMI) | ||
342 | _CLK_SET_PARENT(ssp_clk, SSP) | ||
343 | _CLK_SET_PARENT(gpmi_clk, GPMI) | ||
344 | _CLK_SET_PARENT(lcdif_clk, PIX) | ||
345 | |||
346 | #define _CLK_SET_PARENT_STUB(name) \ | ||
347 | static int name##_set_parent(struct clk *clk, struct clk *parent) \ | ||
348 | { \ | ||
349 | if (parent != clk->parent) \ | ||
350 | return -EINVAL; \ | ||
351 | else \ | ||
352 | return 0; \ | ||
353 | } | ||
354 | |||
355 | _CLK_SET_PARENT_STUB(uart_clk) | ||
356 | _CLK_SET_PARENT_STUB(audio_clk) | ||
357 | _CLK_SET_PARENT_STUB(pwm_clk) | ||
358 | _CLK_SET_PARENT_STUB(clk32k_clk) | ||
359 | |||
360 | /* | ||
361 | * clk definition | ||
362 | */ | ||
363 | static struct clk cpu_clk = { | ||
364 | .get_rate = cpu_clk_get_rate, | ||
365 | .set_rate = cpu_clk_set_rate, | ||
366 | .set_parent = cpu_clk_set_parent, | ||
367 | .parent = &ref_cpu_clk, | ||
368 | }; | ||
369 | |||
370 | static struct clk hbus_clk = { | ||
371 | .get_rate = hbus_clk_get_rate, | ||
372 | .parent = &cpu_clk, | ||
373 | }; | ||
374 | |||
375 | static struct clk xbus_clk = { | ||
376 | .get_rate = xbus_clk_get_rate, | ||
377 | .set_rate = xbus_clk_set_rate, | ||
378 | .parent = &ref_xtal_clk, | ||
379 | }; | ||
380 | |||
381 | static struct clk rtc_clk = { | ||
382 | .get_rate = rtc_clk_get_rate, | ||
383 | .parent = &ref_xtal_clk, | ||
384 | }; | ||
385 | |||
386 | /* usb_clk gate is controlled in DIGCTRL other than CLKCTRL */ | ||
387 | static struct clk usb_clk = { | ||
388 | .enable_reg = DIGCTRL_BASE_ADDR, | ||
389 | .enable_shift = 2, | ||
390 | .enable = _raw_clk_enable, | ||
391 | .disable = _raw_clk_disable, | ||
392 | .parent = &pll_clk, | ||
393 | }; | ||
394 | |||
395 | #define _DEFINE_CLOCK(name, er, es, p) \ | ||
396 | static struct clk name = { \ | ||
397 | .enable_reg = CLKCTRL_BASE_ADDR + HW_CLKCTRL_##er, \ | ||
398 | .enable_shift = BP_CLKCTRL_##er##_##es, \ | ||
399 | .get_rate = name##_get_rate, \ | ||
400 | .set_rate = name##_set_rate, \ | ||
401 | .set_parent = name##_set_parent, \ | ||
402 | .enable = _raw_clk_enable, \ | ||
403 | .disable = _raw_clk_disable, \ | ||
404 | .parent = p, \ | ||
405 | } | ||
406 | |||
407 | _DEFINE_CLOCK(emi_clk, EMI, CLKGATE, &ref_xtal_clk); | ||
408 | _DEFINE_CLOCK(ssp_clk, SSP, CLKGATE, &ref_xtal_clk); | ||
409 | _DEFINE_CLOCK(gpmi_clk, GPMI, CLKGATE, &ref_xtal_clk); | ||
410 | _DEFINE_CLOCK(lcdif_clk, PIX, CLKGATE, &ref_xtal_clk); | ||
411 | _DEFINE_CLOCK(uart_clk, XTAL, UART_CLK_GATE, &ref_xtal_clk); | ||
412 | _DEFINE_CLOCK(audio_clk, XTAL, FILT_CLK24M_GATE, &ref_xtal_clk); | ||
413 | _DEFINE_CLOCK(pwm_clk, XTAL, PWM_CLK24M_GATE, &ref_xtal_clk); | ||
414 | _DEFINE_CLOCK(clk32k_clk, XTAL, TIMROT_CLK32K_GATE, &ref_xtal_clk); | ||
415 | |||
416 | #define _REGISTER_CLOCK(d, n, c) \ | ||
417 | { \ | ||
418 | .dev_id = d, \ | ||
419 | .con_id = n, \ | ||
420 | .clk = &c, \ | ||
421 | }, | ||
422 | |||
423 | static struct clk_lookup lookups[] = { | ||
424 | /* for amba bus driver */ | ||
425 | _REGISTER_CLOCK("duart", "apb_pclk", xbus_clk) | ||
426 | /* for amba-pl011 driver */ | ||
427 | _REGISTER_CLOCK("duart", NULL, uart_clk) | ||
428 | _REGISTER_CLOCK("mxs-auart.0", NULL, uart_clk) | ||
429 | _REGISTER_CLOCK("rtc", NULL, rtc_clk) | ||
430 | _REGISTER_CLOCK("mxs-dma-apbh", NULL, hbus_clk) | ||
431 | _REGISTER_CLOCK("mxs-dma-apbx", NULL, xbus_clk) | ||
432 | _REGISTER_CLOCK("mxs-mmc.0", NULL, ssp_clk) | ||
433 | _REGISTER_CLOCK("mxs-mmc.1", NULL, ssp_clk) | ||
434 | _REGISTER_CLOCK(NULL, "usb", usb_clk) | ||
435 | _REGISTER_CLOCK(NULL, "audio", audio_clk) | ||
436 | _REGISTER_CLOCK("mxs-pwm.0", NULL, pwm_clk) | ||
437 | _REGISTER_CLOCK("mxs-pwm.1", NULL, pwm_clk) | ||
438 | _REGISTER_CLOCK("mxs-pwm.2", NULL, pwm_clk) | ||
439 | _REGISTER_CLOCK("mxs-pwm.3", NULL, pwm_clk) | ||
440 | _REGISTER_CLOCK("mxs-pwm.4", NULL, pwm_clk) | ||
441 | _REGISTER_CLOCK("imx23-fb", NULL, lcdif_clk) | ||
442 | _REGISTER_CLOCK("imx23-gpmi-nand", NULL, gpmi_clk) | ||
443 | }; | ||
444 | |||
445 | static int clk_misc_init(void) | ||
446 | { | ||
447 | u32 reg; | ||
448 | int ret; | ||
449 | |||
450 | /* Fix up parent per register setting */ | ||
451 | reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_CLKSEQ); | ||
452 | cpu_clk.parent = (reg & BM_CLKCTRL_CLKSEQ_BYPASS_CPU) ? | ||
453 | &ref_xtal_clk : &ref_cpu_clk; | ||
454 | emi_clk.parent = (reg & BM_CLKCTRL_CLKSEQ_BYPASS_EMI) ? | ||
455 | &ref_xtal_clk : &ref_emi_clk; | ||
456 | ssp_clk.parent = (reg & BM_CLKCTRL_CLKSEQ_BYPASS_SSP) ? | ||
457 | &ref_xtal_clk : &ref_io_clk; | ||
458 | gpmi_clk.parent = (reg & BM_CLKCTRL_CLKSEQ_BYPASS_GPMI) ? | ||
459 | &ref_xtal_clk : &ref_io_clk; | ||
460 | lcdif_clk.parent = (reg & BM_CLKCTRL_CLKSEQ_BYPASS_PIX) ? | ||
461 | &ref_xtal_clk : &ref_pix_clk; | ||
462 | |||
463 | /* Use int div over frac when both are available */ | ||
464 | __raw_writel(BM_CLKCTRL_CPU_DIV_XTAL_FRAC_EN, | ||
465 | CLKCTRL_BASE_ADDR + HW_CLKCTRL_CPU_CLR); | ||
466 | __raw_writel(BM_CLKCTRL_CPU_DIV_CPU_FRAC_EN, | ||
467 | CLKCTRL_BASE_ADDR + HW_CLKCTRL_CPU_CLR); | ||
468 | __raw_writel(BM_CLKCTRL_HBUS_DIV_FRAC_EN, | ||
469 | CLKCTRL_BASE_ADDR + HW_CLKCTRL_HBUS_CLR); | ||
470 | |||
471 | reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_XBUS); | ||
472 | reg &= ~BM_CLKCTRL_XBUS_DIV_FRAC_EN; | ||
473 | __raw_writel(reg, CLKCTRL_BASE_ADDR + HW_CLKCTRL_XBUS); | ||
474 | |||
475 | reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_SSP); | ||
476 | reg &= ~BM_CLKCTRL_SSP_DIV_FRAC_EN; | ||
477 | __raw_writel(reg, CLKCTRL_BASE_ADDR + HW_CLKCTRL_SSP); | ||
478 | |||
479 | reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_GPMI); | ||
480 | reg &= ~BM_CLKCTRL_GPMI_DIV_FRAC_EN; | ||
481 | __raw_writel(reg, CLKCTRL_BASE_ADDR + HW_CLKCTRL_GPMI); | ||
482 | |||
483 | reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_PIX); | ||
484 | reg &= ~BM_CLKCTRL_PIX_DIV_FRAC_EN; | ||
485 | __raw_writel(reg, CLKCTRL_BASE_ADDR + HW_CLKCTRL_PIX); | ||
486 | |||
487 | /* | ||
488 | * Set safe hbus clock divider. A divider of 3 ensure that | ||
489 | * the Vddd voltage required for the cpu clock is sufficiently | ||
490 | * high for the hbus clock. | ||
491 | */ | ||
492 | reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_HBUS); | ||
493 | reg &= BM_CLKCTRL_HBUS_DIV; | ||
494 | reg |= 3 << BP_CLKCTRL_HBUS_DIV; | ||
495 | __raw_writel(reg, CLKCTRL_BASE_ADDR + HW_CLKCTRL_HBUS); | ||
496 | |||
497 | ret = mxs_clkctrl_timeout(HW_CLKCTRL_HBUS, BM_CLKCTRL_HBUS_BUSY); | ||
498 | |||
499 | /* Gate off cpu clock in WFI for power saving */ | ||
500 | __raw_writel(BM_CLKCTRL_CPU_INTERRUPT_WAIT, | ||
501 | CLKCTRL_BASE_ADDR + HW_CLKCTRL_CPU_SET); | ||
502 | |||
503 | /* | ||
504 | * 480 MHz seems too high to be ssp clock source directly, | ||
505 | * so set frac to get a 288 MHz ref_io. | ||
506 | */ | ||
507 | reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_FRAC); | ||
508 | reg &= ~BM_CLKCTRL_FRAC_IOFRAC; | ||
509 | reg |= 30 << BP_CLKCTRL_FRAC_IOFRAC; | ||
510 | __raw_writel(reg, CLKCTRL_BASE_ADDR + HW_CLKCTRL_FRAC); | ||
511 | |||
512 | return ret; | ||
513 | } | ||
514 | |||
515 | int __init mx23_clocks_init(void) | ||
516 | { | ||
517 | clk_misc_init(); | ||
518 | |||
519 | /* | ||
520 | * source ssp clock from ref_io than ref_xtal, | ||
521 | * as ref_xtal only provides 24 MHz as maximum. | ||
522 | */ | ||
523 | clk_set_parent(&ssp_clk, &ref_io_clk); | ||
524 | |||
525 | clk_prepare_enable(&cpu_clk); | ||
526 | clk_prepare_enable(&hbus_clk); | ||
527 | clk_prepare_enable(&xbus_clk); | ||
528 | clk_prepare_enable(&emi_clk); | ||
529 | clk_prepare_enable(&uart_clk); | ||
530 | |||
531 | clkdev_add_table(lookups, ARRAY_SIZE(lookups)); | ||
532 | |||
533 | mxs_timer_init(&clk32k_clk, MX23_INT_TIMER0); | ||
534 | |||
535 | return 0; | ||
536 | } | ||
diff --git a/arch/arm/mach-mxs/clock-mx28.c b/arch/arm/mach-mxs/clock-mx28.c deleted file mode 100644 index cea29c99e214..000000000000 --- a/arch/arm/mach-mxs/clock-mx28.c +++ /dev/null | |||
@@ -1,803 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2009-2010 Freescale Semiconductor, Inc. All Rights Reserved. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License as published by | ||
6 | * the Free Software Foundation; either version 2 of the License, or | ||
7 | * (at your option) any later version. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License along | ||
15 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
16 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||
17 | */ | ||
18 | |||
19 | #include <linux/mm.h> | ||
20 | #include <linux/delay.h> | ||
21 | #include <linux/clk.h> | ||
22 | #include <linux/io.h> | ||
23 | #include <linux/jiffies.h> | ||
24 | #include <linux/clkdev.h> | ||
25 | #include <linux/spinlock.h> | ||
26 | |||
27 | #include <asm/clkdev.h> | ||
28 | #include <asm/div64.h> | ||
29 | |||
30 | #include <mach/mx28.h> | ||
31 | #include <mach/common.h> | ||
32 | #include <mach/clock.h> | ||
33 | #include <mach/digctl.h> | ||
34 | |||
35 | #include "regs-clkctrl-mx28.h" | ||
36 | |||
37 | #define CLKCTRL_BASE_ADDR MX28_IO_ADDRESS(MX28_CLKCTRL_BASE_ADDR) | ||
38 | #define DIGCTRL_BASE_ADDR MX28_IO_ADDRESS(MX28_DIGCTL_BASE_ADDR) | ||
39 | |||
40 | #define PARENT_RATE_SHIFT 8 | ||
41 | |||
42 | static struct clk pll2_clk; | ||
43 | static struct clk cpu_clk; | ||
44 | static struct clk emi_clk; | ||
45 | static struct clk saif0_clk; | ||
46 | static struct clk saif1_clk; | ||
47 | static struct clk clk32k_clk; | ||
48 | static DEFINE_SPINLOCK(clkmux_lock); | ||
49 | |||
50 | /* | ||
51 | * HW_SAIF_CLKMUX_SEL: | ||
52 | * DIRECT(0x0): SAIF0 clock pins selected for SAIF0 input clocks, and SAIF1 | ||
53 | * clock pins selected for SAIF1 input clocks. | ||
54 | * CROSSINPUT(0x1): SAIF1 clock inputs selected for SAIF0 input clocks, and | ||
55 | * SAIF0 clock inputs selected for SAIF1 input clocks. | ||
56 | * EXTMSTR0(0x2): SAIF0 clock pin selected for both SAIF0 and SAIF1 input | ||
57 | * clocks. | ||
58 | * EXTMSTR1(0x3): SAIF1 clock pin selected for both SAIF0 and SAIF1 input | ||
59 | * clocks. | ||
60 | */ | ||
61 | int mxs_saif_clkmux_select(unsigned int clkmux) | ||
62 | { | ||
63 | if (clkmux > 0x3) | ||
64 | return -EINVAL; | ||
65 | |||
66 | spin_lock(&clkmux_lock); | ||
67 | __raw_writel(BM_DIGCTL_CTRL_SAIF_CLKMUX, | ||
68 | DIGCTRL_BASE_ADDR + HW_DIGCTL_CTRL + MXS_CLR_ADDR); | ||
69 | __raw_writel(clkmux << BP_DIGCTL_CTRL_SAIF_CLKMUX, | ||
70 | DIGCTRL_BASE_ADDR + HW_DIGCTL_CTRL + MXS_SET_ADDR); | ||
71 | spin_unlock(&clkmux_lock); | ||
72 | |||
73 | return 0; | ||
74 | } | ||
75 | |||
76 | static int _raw_clk_enable(struct clk *clk) | ||
77 | { | ||
78 | u32 reg; | ||
79 | |||
80 | if (clk->enable_reg) { | ||
81 | reg = __raw_readl(clk->enable_reg); | ||
82 | reg &= ~(1 << clk->enable_shift); | ||
83 | __raw_writel(reg, clk->enable_reg); | ||
84 | } | ||
85 | |||
86 | return 0; | ||
87 | } | ||
88 | |||
89 | static void _raw_clk_disable(struct clk *clk) | ||
90 | { | ||
91 | u32 reg; | ||
92 | |||
93 | if (clk->enable_reg) { | ||
94 | reg = __raw_readl(clk->enable_reg); | ||
95 | reg |= 1 << clk->enable_shift; | ||
96 | __raw_writel(reg, clk->enable_reg); | ||
97 | } | ||
98 | } | ||
99 | |||
100 | /* | ||
101 | * ref_xtal_clk | ||
102 | */ | ||
103 | static unsigned long ref_xtal_clk_get_rate(struct clk *clk) | ||
104 | { | ||
105 | return 24000000; | ||
106 | } | ||
107 | |||
108 | static struct clk ref_xtal_clk = { | ||
109 | .get_rate = ref_xtal_clk_get_rate, | ||
110 | }; | ||
111 | |||
112 | /* | ||
113 | * pll_clk | ||
114 | */ | ||
115 | static unsigned long pll0_clk_get_rate(struct clk *clk) | ||
116 | { | ||
117 | return 480000000; | ||
118 | } | ||
119 | |||
120 | static unsigned long pll1_clk_get_rate(struct clk *clk) | ||
121 | { | ||
122 | return 480000000; | ||
123 | } | ||
124 | |||
125 | static unsigned long pll2_clk_get_rate(struct clk *clk) | ||
126 | { | ||
127 | return 50000000; | ||
128 | } | ||
129 | |||
130 | #define _CLK_ENABLE_PLL(name, r, g) \ | ||
131 | static int name##_enable(struct clk *clk) \ | ||
132 | { \ | ||
133 | __raw_writel(BM_CLKCTRL_##r##CTRL0_POWER, \ | ||
134 | CLKCTRL_BASE_ADDR + HW_CLKCTRL_##r##CTRL0_SET); \ | ||
135 | udelay(10); \ | ||
136 | \ | ||
137 | if (clk == &pll2_clk) \ | ||
138 | __raw_writel(BM_CLKCTRL_##r##CTRL0_##g, \ | ||
139 | CLKCTRL_BASE_ADDR + HW_CLKCTRL_##r##CTRL0_CLR); \ | ||
140 | else \ | ||
141 | __raw_writel(BM_CLKCTRL_##r##CTRL0_##g, \ | ||
142 | CLKCTRL_BASE_ADDR + HW_CLKCTRL_##r##CTRL0_SET); \ | ||
143 | \ | ||
144 | return 0; \ | ||
145 | } | ||
146 | |||
147 | _CLK_ENABLE_PLL(pll0_clk, PLL0, EN_USB_CLKS) | ||
148 | _CLK_ENABLE_PLL(pll1_clk, PLL1, EN_USB_CLKS) | ||
149 | _CLK_ENABLE_PLL(pll2_clk, PLL2, CLKGATE) | ||
150 | |||
151 | #define _CLK_DISABLE_PLL(name, r, g) \ | ||
152 | static void name##_disable(struct clk *clk) \ | ||
153 | { \ | ||
154 | __raw_writel(BM_CLKCTRL_##r##CTRL0_POWER, \ | ||
155 | CLKCTRL_BASE_ADDR + HW_CLKCTRL_##r##CTRL0_CLR); \ | ||
156 | \ | ||
157 | if (clk == &pll2_clk) \ | ||
158 | __raw_writel(BM_CLKCTRL_##r##CTRL0_##g, \ | ||
159 | CLKCTRL_BASE_ADDR + HW_CLKCTRL_##r##CTRL0_SET); \ | ||
160 | else \ | ||
161 | __raw_writel(BM_CLKCTRL_##r##CTRL0_##g, \ | ||
162 | CLKCTRL_BASE_ADDR + HW_CLKCTRL_##r##CTRL0_CLR); \ | ||
163 | \ | ||
164 | } | ||
165 | |||
166 | _CLK_DISABLE_PLL(pll0_clk, PLL0, EN_USB_CLKS) | ||
167 | _CLK_DISABLE_PLL(pll1_clk, PLL1, EN_USB_CLKS) | ||
168 | _CLK_DISABLE_PLL(pll2_clk, PLL2, CLKGATE) | ||
169 | |||
170 | #define _DEFINE_CLOCK_PLL(name) \ | ||
171 | static struct clk name = { \ | ||
172 | .get_rate = name##_get_rate, \ | ||
173 | .enable = name##_enable, \ | ||
174 | .disable = name##_disable, \ | ||
175 | .parent = &ref_xtal_clk, \ | ||
176 | } | ||
177 | |||
178 | _DEFINE_CLOCK_PLL(pll0_clk); | ||
179 | _DEFINE_CLOCK_PLL(pll1_clk); | ||
180 | _DEFINE_CLOCK_PLL(pll2_clk); | ||
181 | |||
182 | /* | ||
183 | * ref_clk | ||
184 | */ | ||
185 | #define _CLK_GET_RATE_REF(name, sr, ss) \ | ||
186 | static unsigned long name##_get_rate(struct clk *clk) \ | ||
187 | { \ | ||
188 | unsigned long parent_rate; \ | ||
189 | u32 reg, div; \ | ||
190 | \ | ||
191 | reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_##sr); \ | ||
192 | div = (reg >> BP_CLKCTRL_##sr##_##ss##FRAC) & 0x3f; \ | ||
193 | parent_rate = clk_get_rate(clk->parent); \ | ||
194 | \ | ||
195 | return SH_DIV((parent_rate >> PARENT_RATE_SHIFT) * 18, \ | ||
196 | div, PARENT_RATE_SHIFT); \ | ||
197 | } | ||
198 | |||
199 | _CLK_GET_RATE_REF(ref_cpu_clk, FRAC0, CPU) | ||
200 | _CLK_GET_RATE_REF(ref_emi_clk, FRAC0, EMI) | ||
201 | _CLK_GET_RATE_REF(ref_io0_clk, FRAC0, IO0) | ||
202 | _CLK_GET_RATE_REF(ref_io1_clk, FRAC0, IO1) | ||
203 | _CLK_GET_RATE_REF(ref_pix_clk, FRAC1, PIX) | ||
204 | _CLK_GET_RATE_REF(ref_gpmi_clk, FRAC1, GPMI) | ||
205 | |||
206 | #define _DEFINE_CLOCK_REF(name, er, es) \ | ||
207 | static struct clk name = { \ | ||
208 | .enable_reg = CLKCTRL_BASE_ADDR + HW_CLKCTRL_##er, \ | ||
209 | .enable_shift = BP_CLKCTRL_##er##_CLKGATE##es, \ | ||
210 | .get_rate = name##_get_rate, \ | ||
211 | .enable = _raw_clk_enable, \ | ||
212 | .disable = _raw_clk_disable, \ | ||
213 | .parent = &pll0_clk, \ | ||
214 | } | ||
215 | |||
216 | _DEFINE_CLOCK_REF(ref_cpu_clk, FRAC0, CPU); | ||
217 | _DEFINE_CLOCK_REF(ref_emi_clk, FRAC0, EMI); | ||
218 | _DEFINE_CLOCK_REF(ref_io0_clk, FRAC0, IO0); | ||
219 | _DEFINE_CLOCK_REF(ref_io1_clk, FRAC0, IO1); | ||
220 | _DEFINE_CLOCK_REF(ref_pix_clk, FRAC1, PIX); | ||
221 | _DEFINE_CLOCK_REF(ref_gpmi_clk, FRAC1, GPMI); | ||
222 | |||
223 | /* | ||
224 | * General clocks | ||
225 | * | ||
226 | * clk_get_rate | ||
227 | */ | ||
228 | static unsigned long lradc_clk_get_rate(struct clk *clk) | ||
229 | { | ||
230 | return clk_get_rate(clk->parent) / 16; | ||
231 | } | ||
232 | |||
233 | static unsigned long rtc_clk_get_rate(struct clk *clk) | ||
234 | { | ||
235 | /* ref_xtal_clk is implemented as the only parent */ | ||
236 | return clk_get_rate(clk->parent) / 768; | ||
237 | } | ||
238 | |||
239 | static unsigned long clk32k_clk_get_rate(struct clk *clk) | ||
240 | { | ||
241 | return clk->parent->get_rate(clk->parent) / 750; | ||
242 | } | ||
243 | |||
244 | static unsigned long spdif_clk_get_rate(struct clk *clk) | ||
245 | { | ||
246 | return clk_get_rate(clk->parent) / 4; | ||
247 | } | ||
248 | |||
249 | #define _CLK_GET_RATE(name, rs) \ | ||
250 | static unsigned long name##_get_rate(struct clk *clk) \ | ||
251 | { \ | ||
252 | u32 reg, div; \ | ||
253 | \ | ||
254 | reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_##rs); \ | ||
255 | \ | ||
256 | if (clk->parent == &ref_xtal_clk) \ | ||
257 | div = (reg & BM_CLKCTRL_##rs##_DIV_XTAL) >> \ | ||
258 | BP_CLKCTRL_##rs##_DIV_XTAL; \ | ||
259 | else \ | ||
260 | div = (reg & BM_CLKCTRL_##rs##_DIV_##rs) >> \ | ||
261 | BP_CLKCTRL_##rs##_DIV_##rs; \ | ||
262 | \ | ||
263 | if (!div) \ | ||
264 | return -EINVAL; \ | ||
265 | \ | ||
266 | return clk_get_rate(clk->parent) / div; \ | ||
267 | } | ||
268 | |||
269 | _CLK_GET_RATE(cpu_clk, CPU) | ||
270 | _CLK_GET_RATE(emi_clk, EMI) | ||
271 | |||
272 | #define _CLK_GET_RATE1(name, rs) \ | ||
273 | static unsigned long name##_get_rate(struct clk *clk) \ | ||
274 | { \ | ||
275 | u32 reg, div; \ | ||
276 | \ | ||
277 | reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_##rs); \ | ||
278 | div = (reg & BM_CLKCTRL_##rs##_DIV) >> BP_CLKCTRL_##rs##_DIV; \ | ||
279 | \ | ||
280 | if (!div) \ | ||
281 | return -EINVAL; \ | ||
282 | \ | ||
283 | if (clk == &saif0_clk || clk == &saif1_clk) \ | ||
284 | return clk_get_rate(clk->parent) >> 16 * div; \ | ||
285 | else \ | ||
286 | return clk_get_rate(clk->parent) / div; \ | ||
287 | } | ||
288 | |||
289 | _CLK_GET_RATE1(hbus_clk, HBUS) | ||
290 | _CLK_GET_RATE1(xbus_clk, XBUS) | ||
291 | _CLK_GET_RATE1(ssp0_clk, SSP0) | ||
292 | _CLK_GET_RATE1(ssp1_clk, SSP1) | ||
293 | _CLK_GET_RATE1(ssp2_clk, SSP2) | ||
294 | _CLK_GET_RATE1(ssp3_clk, SSP3) | ||
295 | _CLK_GET_RATE1(gpmi_clk, GPMI) | ||
296 | _CLK_GET_RATE1(lcdif_clk, DIS_LCDIF) | ||
297 | _CLK_GET_RATE1(saif0_clk, SAIF0) | ||
298 | _CLK_GET_RATE1(saif1_clk, SAIF1) | ||
299 | |||
300 | #define _CLK_GET_RATE_STUB(name) \ | ||
301 | static unsigned long name##_get_rate(struct clk *clk) \ | ||
302 | { \ | ||
303 | return clk_get_rate(clk->parent); \ | ||
304 | } | ||
305 | |||
306 | _CLK_GET_RATE_STUB(uart_clk) | ||
307 | _CLK_GET_RATE_STUB(pwm_clk) | ||
308 | _CLK_GET_RATE_STUB(can0_clk) | ||
309 | _CLK_GET_RATE_STUB(can1_clk) | ||
310 | _CLK_GET_RATE_STUB(fec_clk) | ||
311 | |||
312 | /* | ||
313 | * clk_set_rate | ||
314 | */ | ||
315 | /* fool compiler */ | ||
316 | #define BM_CLKCTRL_CPU_DIV 0 | ||
317 | #define BP_CLKCTRL_CPU_DIV 0 | ||
318 | #define BM_CLKCTRL_CPU_BUSY 0 | ||
319 | |||
320 | #define _CLK_SET_RATE(name, dr, fr, fs) \ | ||
321 | static int name##_set_rate(struct clk *clk, unsigned long rate) \ | ||
322 | { \ | ||
323 | u32 reg, bm_busy, div_max, d, f, div, frac; \ | ||
324 | unsigned long diff, parent_rate, calc_rate; \ | ||
325 | \ | ||
326 | div_max = BM_CLKCTRL_##dr##_DIV >> BP_CLKCTRL_##dr##_DIV; \ | ||
327 | bm_busy = BM_CLKCTRL_##dr##_BUSY; \ | ||
328 | \ | ||
329 | if (clk->parent == &ref_xtal_clk) { \ | ||
330 | parent_rate = clk_get_rate(clk->parent); \ | ||
331 | div = DIV_ROUND_UP(parent_rate, rate); \ | ||
332 | if (clk == &cpu_clk) { \ | ||
333 | div_max = BM_CLKCTRL_CPU_DIV_XTAL >> \ | ||
334 | BP_CLKCTRL_CPU_DIV_XTAL; \ | ||
335 | bm_busy = BM_CLKCTRL_CPU_BUSY_REF_XTAL; \ | ||
336 | } \ | ||
337 | if (div == 0 || div > div_max) \ | ||
338 | return -EINVAL; \ | ||
339 | } else { \ | ||
340 | /* \ | ||
341 | * hack alert: this block modifies clk->parent, too, \ | ||
342 | * so the base to use it the grand parent. \ | ||
343 | */ \ | ||
344 | parent_rate = clk_get_rate(clk->parent->parent); \ | ||
345 | rate >>= PARENT_RATE_SHIFT; \ | ||
346 | parent_rate >>= PARENT_RATE_SHIFT; \ | ||
347 | diff = parent_rate; \ | ||
348 | div = frac = 1; \ | ||
349 | if (clk == &cpu_clk) { \ | ||
350 | div_max = BM_CLKCTRL_CPU_DIV_CPU >> \ | ||
351 | BP_CLKCTRL_CPU_DIV_CPU; \ | ||
352 | bm_busy = BM_CLKCTRL_CPU_BUSY_REF_CPU; \ | ||
353 | } \ | ||
354 | for (d = 1; d <= div_max; d++) { \ | ||
355 | f = parent_rate * 18 / d / rate; \ | ||
356 | if ((parent_rate * 18 / d) % rate) \ | ||
357 | f++; \ | ||
358 | if (f < 18 || f > 35) \ | ||
359 | continue; \ | ||
360 | \ | ||
361 | calc_rate = parent_rate * 18 / f / d; \ | ||
362 | if (calc_rate > rate) \ | ||
363 | continue; \ | ||
364 | \ | ||
365 | if (rate - calc_rate < diff) { \ | ||
366 | frac = f; \ | ||
367 | div = d; \ | ||
368 | diff = rate - calc_rate; \ | ||
369 | } \ | ||
370 | \ | ||
371 | if (diff == 0) \ | ||
372 | break; \ | ||
373 | } \ | ||
374 | \ | ||
375 | if (diff == parent_rate) \ | ||
376 | return -EINVAL; \ | ||
377 | \ | ||
378 | reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_##fr); \ | ||
379 | reg &= ~BM_CLKCTRL_##fr##_##fs##FRAC; \ | ||
380 | reg |= frac << BP_CLKCTRL_##fr##_##fs##FRAC; \ | ||
381 | __raw_writel(reg, CLKCTRL_BASE_ADDR + HW_CLKCTRL_##fr); \ | ||
382 | } \ | ||
383 | \ | ||
384 | reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_##dr); \ | ||
385 | if (clk == &cpu_clk) { \ | ||
386 | reg &= ~BM_CLKCTRL_CPU_DIV_CPU; \ | ||
387 | reg |= div << BP_CLKCTRL_CPU_DIV_CPU; \ | ||
388 | } else { \ | ||
389 | reg &= ~BM_CLKCTRL_##dr##_DIV; \ | ||
390 | reg |= div << BP_CLKCTRL_##dr##_DIV; \ | ||
391 | if (reg & (1 << clk->enable_shift)) { \ | ||
392 | pr_err("%s: clock is gated\n", __func__); \ | ||
393 | return -EINVAL; \ | ||
394 | } \ | ||
395 | } \ | ||
396 | __raw_writel(reg, CLKCTRL_BASE_ADDR + HW_CLKCTRL_##dr); \ | ||
397 | \ | ||
398 | return mxs_clkctrl_timeout(HW_CLKCTRL_##dr, bm_busy); \ | ||
399 | } | ||
400 | |||
401 | _CLK_SET_RATE(cpu_clk, CPU, FRAC0, CPU) | ||
402 | _CLK_SET_RATE(ssp0_clk, SSP0, FRAC0, IO0) | ||
403 | _CLK_SET_RATE(ssp1_clk, SSP1, FRAC0, IO0) | ||
404 | _CLK_SET_RATE(ssp2_clk, SSP2, FRAC0, IO1) | ||
405 | _CLK_SET_RATE(ssp3_clk, SSP3, FRAC0, IO1) | ||
406 | _CLK_SET_RATE(lcdif_clk, DIS_LCDIF, FRAC1, PIX) | ||
407 | _CLK_SET_RATE(gpmi_clk, GPMI, FRAC1, GPMI) | ||
408 | |||
409 | #define _CLK_SET_RATE1(name, dr) \ | ||
410 | static int name##_set_rate(struct clk *clk, unsigned long rate) \ | ||
411 | { \ | ||
412 | u32 reg, div_max, div; \ | ||
413 | unsigned long parent_rate; \ | ||
414 | \ | ||
415 | parent_rate = clk_get_rate(clk->parent); \ | ||
416 | div_max = BM_CLKCTRL_##dr##_DIV >> BP_CLKCTRL_##dr##_DIV; \ | ||
417 | \ | ||
418 | div = DIV_ROUND_UP(parent_rate, rate); \ | ||
419 | if (div == 0 || div > div_max) \ | ||
420 | return -EINVAL; \ | ||
421 | \ | ||
422 | reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_##dr); \ | ||
423 | reg &= ~BM_CLKCTRL_##dr##_DIV; \ | ||
424 | reg |= div << BP_CLKCTRL_##dr##_DIV; \ | ||
425 | if (reg & (1 << clk->enable_shift)) { \ | ||
426 | pr_err("%s: clock is gated\n", __func__); \ | ||
427 | return -EINVAL; \ | ||
428 | } \ | ||
429 | __raw_writel(reg, CLKCTRL_BASE_ADDR + HW_CLKCTRL_##dr); \ | ||
430 | \ | ||
431 | return mxs_clkctrl_timeout(HW_CLKCTRL_##dr, BM_CLKCTRL_##dr##_BUSY);\ | ||
432 | } | ||
433 | |||
434 | _CLK_SET_RATE1(xbus_clk, XBUS) | ||
435 | |||
436 | /* saif clock uses 16 bits frac div */ | ||
437 | #define _CLK_SET_RATE_SAIF(name, rs) \ | ||
438 | static int name##_set_rate(struct clk *clk, unsigned long rate) \ | ||
439 | { \ | ||
440 | u16 div; \ | ||
441 | u32 reg; \ | ||
442 | u64 lrate; \ | ||
443 | unsigned long parent_rate; \ | ||
444 | \ | ||
445 | parent_rate = clk_get_rate(clk->parent); \ | ||
446 | if (rate > parent_rate) \ | ||
447 | return -EINVAL; \ | ||
448 | \ | ||
449 | lrate = (u64)rate << 16; \ | ||
450 | do_div(lrate, parent_rate); \ | ||
451 | div = (u16)lrate; \ | ||
452 | \ | ||
453 | if (!div) \ | ||
454 | return -EINVAL; \ | ||
455 | \ | ||
456 | reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_##rs); \ | ||
457 | reg &= ~BM_CLKCTRL_##rs##_DIV; \ | ||
458 | reg |= div << BP_CLKCTRL_##rs##_DIV; \ | ||
459 | if (reg & (1 << clk->enable_shift)) { \ | ||
460 | pr_err("%s: clock is gated\n", __func__); \ | ||
461 | return -EINVAL; \ | ||
462 | } \ | ||
463 | __raw_writel(reg, CLKCTRL_BASE_ADDR + HW_CLKCTRL_##rs); \ | ||
464 | \ | ||
465 | return mxs_clkctrl_timeout(HW_CLKCTRL_##rs, BM_CLKCTRL_##rs##_BUSY);\ | ||
466 | } | ||
467 | |||
468 | _CLK_SET_RATE_SAIF(saif0_clk, SAIF0) | ||
469 | _CLK_SET_RATE_SAIF(saif1_clk, SAIF1) | ||
470 | |||
471 | #define _CLK_SET_RATE_STUB(name) \ | ||
472 | static int name##_set_rate(struct clk *clk, unsigned long rate) \ | ||
473 | { \ | ||
474 | return -EINVAL; \ | ||
475 | } | ||
476 | |||
477 | _CLK_SET_RATE_STUB(emi_clk) | ||
478 | _CLK_SET_RATE_STUB(uart_clk) | ||
479 | _CLK_SET_RATE_STUB(pwm_clk) | ||
480 | _CLK_SET_RATE_STUB(spdif_clk) | ||
481 | _CLK_SET_RATE_STUB(clk32k_clk) | ||
482 | _CLK_SET_RATE_STUB(can0_clk) | ||
483 | _CLK_SET_RATE_STUB(can1_clk) | ||
484 | _CLK_SET_RATE_STUB(fec_clk) | ||
485 | |||
486 | /* | ||
487 | * clk_set_parent | ||
488 | */ | ||
489 | #define _CLK_SET_PARENT(name, bit) \ | ||
490 | static int name##_set_parent(struct clk *clk, struct clk *parent) \ | ||
491 | { \ | ||
492 | if (parent != clk->parent) { \ | ||
493 | __raw_writel(BM_CLKCTRL_CLKSEQ_BYPASS_##bit, \ | ||
494 | CLKCTRL_BASE_ADDR + HW_CLKCTRL_CLKSEQ_TOG); \ | ||
495 | clk->parent = parent; \ | ||
496 | } \ | ||
497 | \ | ||
498 | return 0; \ | ||
499 | } | ||
500 | |||
501 | _CLK_SET_PARENT(cpu_clk, CPU) | ||
502 | _CLK_SET_PARENT(emi_clk, EMI) | ||
503 | _CLK_SET_PARENT(ssp0_clk, SSP0) | ||
504 | _CLK_SET_PARENT(ssp1_clk, SSP1) | ||
505 | _CLK_SET_PARENT(ssp2_clk, SSP2) | ||
506 | _CLK_SET_PARENT(ssp3_clk, SSP3) | ||
507 | _CLK_SET_PARENT(lcdif_clk, DIS_LCDIF) | ||
508 | _CLK_SET_PARENT(gpmi_clk, GPMI) | ||
509 | _CLK_SET_PARENT(saif0_clk, SAIF0) | ||
510 | _CLK_SET_PARENT(saif1_clk, SAIF1) | ||
511 | |||
512 | #define _CLK_SET_PARENT_STUB(name) \ | ||
513 | static int name##_set_parent(struct clk *clk, struct clk *parent) \ | ||
514 | { \ | ||
515 | if (parent != clk->parent) \ | ||
516 | return -EINVAL; \ | ||
517 | else \ | ||
518 | return 0; \ | ||
519 | } | ||
520 | |||
521 | _CLK_SET_PARENT_STUB(pwm_clk) | ||
522 | _CLK_SET_PARENT_STUB(uart_clk) | ||
523 | _CLK_SET_PARENT_STUB(clk32k_clk) | ||
524 | _CLK_SET_PARENT_STUB(spdif_clk) | ||
525 | _CLK_SET_PARENT_STUB(fec_clk) | ||
526 | _CLK_SET_PARENT_STUB(can0_clk) | ||
527 | _CLK_SET_PARENT_STUB(can1_clk) | ||
528 | |||
529 | /* | ||
530 | * clk definition | ||
531 | */ | ||
532 | static struct clk cpu_clk = { | ||
533 | .get_rate = cpu_clk_get_rate, | ||
534 | .set_rate = cpu_clk_set_rate, | ||
535 | .set_parent = cpu_clk_set_parent, | ||
536 | .parent = &ref_cpu_clk, | ||
537 | }; | ||
538 | |||
539 | static struct clk hbus_clk = { | ||
540 | .get_rate = hbus_clk_get_rate, | ||
541 | .parent = &cpu_clk, | ||
542 | }; | ||
543 | |||
544 | static struct clk xbus_clk = { | ||
545 | .get_rate = xbus_clk_get_rate, | ||
546 | .set_rate = xbus_clk_set_rate, | ||
547 | .parent = &ref_xtal_clk, | ||
548 | }; | ||
549 | |||
550 | static struct clk lradc_clk = { | ||
551 | .get_rate = lradc_clk_get_rate, | ||
552 | .parent = &clk32k_clk, | ||
553 | }; | ||
554 | |||
555 | static struct clk rtc_clk = { | ||
556 | .get_rate = rtc_clk_get_rate, | ||
557 | .parent = &ref_xtal_clk, | ||
558 | }; | ||
559 | |||
560 | /* usb_clk gate is controlled in DIGCTRL other than CLKCTRL */ | ||
561 | static struct clk usb0_clk = { | ||
562 | .enable_reg = DIGCTRL_BASE_ADDR, | ||
563 | .enable_shift = 2, | ||
564 | .enable = _raw_clk_enable, | ||
565 | .disable = _raw_clk_disable, | ||
566 | .parent = &pll0_clk, | ||
567 | }; | ||
568 | |||
569 | static struct clk usb1_clk = { | ||
570 | .enable_reg = DIGCTRL_BASE_ADDR, | ||
571 | .enable_shift = 16, | ||
572 | .enable = _raw_clk_enable, | ||
573 | .disable = _raw_clk_disable, | ||
574 | .parent = &pll1_clk, | ||
575 | }; | ||
576 | |||
577 | #define _DEFINE_CLOCK(name, er, es, p) \ | ||
578 | static struct clk name = { \ | ||
579 | .enable_reg = CLKCTRL_BASE_ADDR + HW_CLKCTRL_##er, \ | ||
580 | .enable_shift = BP_CLKCTRL_##er##_##es, \ | ||
581 | .get_rate = name##_get_rate, \ | ||
582 | .set_rate = name##_set_rate, \ | ||
583 | .set_parent = name##_set_parent, \ | ||
584 | .enable = _raw_clk_enable, \ | ||
585 | .disable = _raw_clk_disable, \ | ||
586 | .parent = p, \ | ||
587 | } | ||
588 | |||
589 | _DEFINE_CLOCK(emi_clk, EMI, CLKGATE, &ref_xtal_clk); | ||
590 | _DEFINE_CLOCK(ssp0_clk, SSP0, CLKGATE, &ref_xtal_clk); | ||
591 | _DEFINE_CLOCK(ssp1_clk, SSP1, CLKGATE, &ref_xtal_clk); | ||
592 | _DEFINE_CLOCK(ssp2_clk, SSP2, CLKGATE, &ref_xtal_clk); | ||
593 | _DEFINE_CLOCK(ssp3_clk, SSP3, CLKGATE, &ref_xtal_clk); | ||
594 | _DEFINE_CLOCK(lcdif_clk, DIS_LCDIF, CLKGATE, &ref_xtal_clk); | ||
595 | _DEFINE_CLOCK(gpmi_clk, GPMI, CLKGATE, &ref_xtal_clk); | ||
596 | _DEFINE_CLOCK(saif0_clk, SAIF0, CLKGATE, &ref_xtal_clk); | ||
597 | _DEFINE_CLOCK(saif1_clk, SAIF1, CLKGATE, &ref_xtal_clk); | ||
598 | _DEFINE_CLOCK(can0_clk, FLEXCAN, STOP_CAN0, &ref_xtal_clk); | ||
599 | _DEFINE_CLOCK(can1_clk, FLEXCAN, STOP_CAN1, &ref_xtal_clk); | ||
600 | _DEFINE_CLOCK(pwm_clk, XTAL, PWM_CLK24M_GATE, &ref_xtal_clk); | ||
601 | _DEFINE_CLOCK(uart_clk, XTAL, UART_CLK_GATE, &ref_xtal_clk); | ||
602 | _DEFINE_CLOCK(clk32k_clk, XTAL, TIMROT_CLK32K_GATE, &ref_xtal_clk); | ||
603 | _DEFINE_CLOCK(spdif_clk, SPDIF, CLKGATE, &pll0_clk); | ||
604 | _DEFINE_CLOCK(fec_clk, ENET, DISABLE, &hbus_clk); | ||
605 | |||
606 | #define _REGISTER_CLOCK(d, n, c) \ | ||
607 | { \ | ||
608 | .dev_id = d, \ | ||
609 | .con_id = n, \ | ||
610 | .clk = &c, \ | ||
611 | }, | ||
612 | |||
613 | static struct clk_lookup lookups[] = { | ||
614 | /* for amba bus driver */ | ||
615 | _REGISTER_CLOCK("duart", "apb_pclk", xbus_clk) | ||
616 | /* for amba-pl011 driver */ | ||
617 | _REGISTER_CLOCK("duart", NULL, uart_clk) | ||
618 | _REGISTER_CLOCK("imx28-fec.0", NULL, fec_clk) | ||
619 | _REGISTER_CLOCK("imx28-fec.1", NULL, fec_clk) | ||
620 | _REGISTER_CLOCK("imx28-gpmi-nand", NULL, gpmi_clk) | ||
621 | _REGISTER_CLOCK("mxs-auart.0", NULL, uart_clk) | ||
622 | _REGISTER_CLOCK("mxs-auart.1", NULL, uart_clk) | ||
623 | _REGISTER_CLOCK("mxs-auart.2", NULL, uart_clk) | ||
624 | _REGISTER_CLOCK("mxs-auart.3", NULL, uart_clk) | ||
625 | _REGISTER_CLOCK("mxs-auart.4", NULL, uart_clk) | ||
626 | _REGISTER_CLOCK("rtc", NULL, rtc_clk) | ||
627 | _REGISTER_CLOCK("pll2", NULL, pll2_clk) | ||
628 | _REGISTER_CLOCK("mxs-dma-apbh", NULL, hbus_clk) | ||
629 | _REGISTER_CLOCK("mxs-dma-apbx", NULL, xbus_clk) | ||
630 | _REGISTER_CLOCK("mxs-mmc.0", NULL, ssp0_clk) | ||
631 | _REGISTER_CLOCK("mxs-mmc.1", NULL, ssp1_clk) | ||
632 | _REGISTER_CLOCK("mxs-mmc.2", NULL, ssp2_clk) | ||
633 | _REGISTER_CLOCK("mxs-mmc.3", NULL, ssp3_clk) | ||
634 | _REGISTER_CLOCK("flexcan.0", NULL, can0_clk) | ||
635 | _REGISTER_CLOCK("flexcan.1", NULL, can1_clk) | ||
636 | _REGISTER_CLOCK(NULL, "usb0", usb0_clk) | ||
637 | _REGISTER_CLOCK(NULL, "usb1", usb1_clk) | ||
638 | _REGISTER_CLOCK("mxs-pwm.0", NULL, pwm_clk) | ||
639 | _REGISTER_CLOCK("mxs-pwm.1", NULL, pwm_clk) | ||
640 | _REGISTER_CLOCK("mxs-pwm.2", NULL, pwm_clk) | ||
641 | _REGISTER_CLOCK("mxs-pwm.3", NULL, pwm_clk) | ||
642 | _REGISTER_CLOCK("mxs-pwm.4", NULL, pwm_clk) | ||
643 | _REGISTER_CLOCK("mxs-pwm.5", NULL, pwm_clk) | ||
644 | _REGISTER_CLOCK("mxs-pwm.6", NULL, pwm_clk) | ||
645 | _REGISTER_CLOCK("mxs-pwm.7", NULL, pwm_clk) | ||
646 | _REGISTER_CLOCK(NULL, "lradc", lradc_clk) | ||
647 | _REGISTER_CLOCK(NULL, "spdif", spdif_clk) | ||
648 | _REGISTER_CLOCK("imx28-fb", NULL, lcdif_clk) | ||
649 | _REGISTER_CLOCK("mxs-saif.0", NULL, saif0_clk) | ||
650 | _REGISTER_CLOCK("mxs-saif.1", NULL, saif1_clk) | ||
651 | }; | ||
652 | |||
653 | static int clk_misc_init(void) | ||
654 | { | ||
655 | u32 reg; | ||
656 | int ret; | ||
657 | |||
658 | /* Fix up parent per register setting */ | ||
659 | reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_CLKSEQ); | ||
660 | cpu_clk.parent = (reg & BM_CLKCTRL_CLKSEQ_BYPASS_CPU) ? | ||
661 | &ref_xtal_clk : &ref_cpu_clk; | ||
662 | emi_clk.parent = (reg & BM_CLKCTRL_CLKSEQ_BYPASS_EMI) ? | ||
663 | &ref_xtal_clk : &ref_emi_clk; | ||
664 | ssp0_clk.parent = (reg & BM_CLKCTRL_CLKSEQ_BYPASS_SSP0) ? | ||
665 | &ref_xtal_clk : &ref_io0_clk; | ||
666 | ssp1_clk.parent = (reg & BM_CLKCTRL_CLKSEQ_BYPASS_SSP1) ? | ||
667 | &ref_xtal_clk : &ref_io0_clk; | ||
668 | ssp2_clk.parent = (reg & BM_CLKCTRL_CLKSEQ_BYPASS_SSP2) ? | ||
669 | &ref_xtal_clk : &ref_io1_clk; | ||
670 | ssp3_clk.parent = (reg & BM_CLKCTRL_CLKSEQ_BYPASS_SSP3) ? | ||
671 | &ref_xtal_clk : &ref_io1_clk; | ||
672 | lcdif_clk.parent = (reg & BM_CLKCTRL_CLKSEQ_BYPASS_DIS_LCDIF) ? | ||
673 | &ref_xtal_clk : &ref_pix_clk; | ||
674 | gpmi_clk.parent = (reg & BM_CLKCTRL_CLKSEQ_BYPASS_GPMI) ? | ||
675 | &ref_xtal_clk : &ref_gpmi_clk; | ||
676 | saif0_clk.parent = (reg & BM_CLKCTRL_CLKSEQ_BYPASS_SAIF0) ? | ||
677 | &ref_xtal_clk : &pll0_clk; | ||
678 | saif1_clk.parent = (reg & BM_CLKCTRL_CLKSEQ_BYPASS_SAIF1) ? | ||
679 | &ref_xtal_clk : &pll0_clk; | ||
680 | |||
681 | /* Use int div over frac when both are available */ | ||
682 | __raw_writel(BM_CLKCTRL_CPU_DIV_XTAL_FRAC_EN, | ||
683 | CLKCTRL_BASE_ADDR + HW_CLKCTRL_CPU_CLR); | ||
684 | __raw_writel(BM_CLKCTRL_CPU_DIV_CPU_FRAC_EN, | ||
685 | CLKCTRL_BASE_ADDR + HW_CLKCTRL_CPU_CLR); | ||
686 | __raw_writel(BM_CLKCTRL_HBUS_DIV_FRAC_EN, | ||
687 | CLKCTRL_BASE_ADDR + HW_CLKCTRL_HBUS_CLR); | ||
688 | |||
689 | reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_XBUS); | ||
690 | reg &= ~BM_CLKCTRL_XBUS_DIV_FRAC_EN; | ||
691 | __raw_writel(reg, CLKCTRL_BASE_ADDR + HW_CLKCTRL_XBUS); | ||
692 | |||
693 | reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_SSP0); | ||
694 | reg &= ~BM_CLKCTRL_SSP0_DIV_FRAC_EN; | ||
695 | __raw_writel(reg, CLKCTRL_BASE_ADDR + HW_CLKCTRL_SSP0); | ||
696 | |||
697 | reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_SSP1); | ||
698 | reg &= ~BM_CLKCTRL_SSP1_DIV_FRAC_EN; | ||
699 | __raw_writel(reg, CLKCTRL_BASE_ADDR + HW_CLKCTRL_SSP1); | ||
700 | |||
701 | reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_SSP2); | ||
702 | reg &= ~BM_CLKCTRL_SSP2_DIV_FRAC_EN; | ||
703 | __raw_writel(reg, CLKCTRL_BASE_ADDR + HW_CLKCTRL_SSP2); | ||
704 | |||
705 | reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_SSP3); | ||
706 | reg &= ~BM_CLKCTRL_SSP3_DIV_FRAC_EN; | ||
707 | __raw_writel(reg, CLKCTRL_BASE_ADDR + HW_CLKCTRL_SSP3); | ||
708 | |||
709 | reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_GPMI); | ||
710 | reg &= ~BM_CLKCTRL_GPMI_DIV_FRAC_EN; | ||
711 | __raw_writel(reg, CLKCTRL_BASE_ADDR + HW_CLKCTRL_GPMI); | ||
712 | |||
713 | reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_DIS_LCDIF); | ||
714 | reg &= ~BM_CLKCTRL_DIS_LCDIF_DIV_FRAC_EN; | ||
715 | __raw_writel(reg, CLKCTRL_BASE_ADDR + HW_CLKCTRL_DIS_LCDIF); | ||
716 | |||
717 | /* SAIF has to use frac div for functional operation */ | ||
718 | reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_SAIF0); | ||
719 | reg |= BM_CLKCTRL_SAIF0_DIV_FRAC_EN; | ||
720 | __raw_writel(reg, CLKCTRL_BASE_ADDR + HW_CLKCTRL_SAIF0); | ||
721 | |||
722 | reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_SAIF1); | ||
723 | reg |= BM_CLKCTRL_SAIF1_DIV_FRAC_EN; | ||
724 | __raw_writel(reg, CLKCTRL_BASE_ADDR + HW_CLKCTRL_SAIF1); | ||
725 | |||
726 | /* | ||
727 | * Set safe hbus clock divider. A divider of 3 ensure that | ||
728 | * the Vddd voltage required for the cpu clock is sufficiently | ||
729 | * high for the hbus clock. | ||
730 | */ | ||
731 | reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_HBUS); | ||
732 | reg &= BM_CLKCTRL_HBUS_DIV; | ||
733 | reg |= 3 << BP_CLKCTRL_HBUS_DIV; | ||
734 | __raw_writel(reg, CLKCTRL_BASE_ADDR + HW_CLKCTRL_HBUS); | ||
735 | |||
736 | ret = mxs_clkctrl_timeout(HW_CLKCTRL_HBUS, BM_CLKCTRL_HBUS_ASM_BUSY); | ||
737 | |||
738 | /* Gate off cpu clock in WFI for power saving */ | ||
739 | __raw_writel(BM_CLKCTRL_CPU_INTERRUPT_WAIT, | ||
740 | CLKCTRL_BASE_ADDR + HW_CLKCTRL_CPU_SET); | ||
741 | |||
742 | /* | ||
743 | * Extra fec clock setting | ||
744 | * The DENX M28 uses an external clock source | ||
745 | * and the clock output must not be enabled | ||
746 | */ | ||
747 | if (!machine_is_m28evk()) { | ||
748 | reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_ENET); | ||
749 | reg &= ~BM_CLKCTRL_ENET_SLEEP; | ||
750 | reg |= BM_CLKCTRL_ENET_CLK_OUT_EN; | ||
751 | __raw_writel(reg, CLKCTRL_BASE_ADDR + HW_CLKCTRL_ENET); | ||
752 | } | ||
753 | |||
754 | /* | ||
755 | * 480 MHz seems too high to be ssp clock source directly, | ||
756 | * so set frac0 to get a 288 MHz ref_io0. | ||
757 | */ | ||
758 | reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_FRAC0); | ||
759 | reg &= ~BM_CLKCTRL_FRAC0_IO0FRAC; | ||
760 | reg |= 30 << BP_CLKCTRL_FRAC0_IO0FRAC; | ||
761 | __raw_writel(reg, CLKCTRL_BASE_ADDR + HW_CLKCTRL_FRAC0); | ||
762 | |||
763 | return ret; | ||
764 | } | ||
765 | |||
766 | int __init mx28_clocks_init(void) | ||
767 | { | ||
768 | clk_misc_init(); | ||
769 | |||
770 | /* | ||
771 | * source ssp clock from ref_io0 than ref_xtal, | ||
772 | * as ref_xtal only provides 24 MHz as maximum. | ||
773 | */ | ||
774 | clk_set_parent(&ssp0_clk, &ref_io0_clk); | ||
775 | clk_set_parent(&ssp1_clk, &ref_io0_clk); | ||
776 | clk_set_parent(&ssp2_clk, &ref_io1_clk); | ||
777 | clk_set_parent(&ssp3_clk, &ref_io1_clk); | ||
778 | |||
779 | clk_prepare_enable(&cpu_clk); | ||
780 | clk_prepare_enable(&hbus_clk); | ||
781 | clk_prepare_enable(&xbus_clk); | ||
782 | clk_prepare_enable(&emi_clk); | ||
783 | clk_prepare_enable(&uart_clk); | ||
784 | |||
785 | clk_set_parent(&lcdif_clk, &ref_pix_clk); | ||
786 | clk_set_parent(&saif0_clk, &pll0_clk); | ||
787 | clk_set_parent(&saif1_clk, &pll0_clk); | ||
788 | |||
789 | /* | ||
790 | * Set an initial clock rate for the saif internal logic to work | ||
791 | * properly. This is important when working in EXTMASTER mode that | ||
792 | * uses the other saif's BITCLK&LRCLK but it still needs a basic | ||
793 | * clock which should be fast enough for the internal logic. | ||
794 | */ | ||
795 | clk_set_rate(&saif0_clk, 24000000); | ||
796 | clk_set_rate(&saif1_clk, 24000000); | ||
797 | |||
798 | clkdev_add_table(lookups, ARRAY_SIZE(lookups)); | ||
799 | |||
800 | mxs_timer_init(&clk32k_clk, MX28_INT_TIMER0); | ||
801 | |||
802 | return 0; | ||
803 | } | ||
diff --git a/arch/arm/mach-mxs/clock.c b/arch/arm/mach-mxs/clock.c deleted file mode 100644 index 97a6f4acc6cc..000000000000 --- a/arch/arm/mach-mxs/clock.c +++ /dev/null | |||
@@ -1,211 +0,0 @@ | |||
1 | /* | ||
2 | * Based on arch/arm/plat-omap/clock.c | ||
3 | * | ||
4 | * Copyright (C) 2004 - 2005 Nokia corporation | ||
5 | * Written by Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com> | ||
6 | * Modified for omap shared clock framework by Tony Lindgren <tony@atomide.com> | ||
7 | * Copyright 2007 Freescale Semiconductor, Inc. All Rights Reserved. | ||
8 | * Copyright 2008 Juergen Beisert, kernel@pengutronix.de | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or | ||
11 | * modify it under the terms of the GNU General Public License | ||
12 | * as published by the Free Software Foundation; either version 2 | ||
13 | * of the License, or (at your option) any later version. | ||
14 | * This program is distributed in the hope that it will be useful, | ||
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
17 | * GNU General Public License for more details. | ||
18 | * | ||
19 | * You should have received a copy of the GNU General Public License | ||
20 | * along with this program; if not, write to the Free Software | ||
21 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, | ||
22 | * MA 02110-1301, USA. | ||
23 | */ | ||
24 | |||
25 | /* #define DEBUG */ | ||
26 | |||
27 | #include <linux/clk.h> | ||
28 | #include <linux/err.h> | ||
29 | #include <linux/errno.h> | ||
30 | #include <linux/init.h> | ||
31 | #include <linux/io.h> | ||
32 | #include <linux/kernel.h> | ||
33 | #include <linux/list.h> | ||
34 | #include <linux/module.h> | ||
35 | #include <linux/mutex.h> | ||
36 | #include <linux/platform_device.h> | ||
37 | #include <linux/proc_fs.h> | ||
38 | #include <linux/semaphore.h> | ||
39 | #include <linux/string.h> | ||
40 | |||
41 | #include <mach/clock.h> | ||
42 | |||
43 | static LIST_HEAD(clocks); | ||
44 | static DEFINE_MUTEX(clocks_mutex); | ||
45 | |||
46 | /*------------------------------------------------------------------------- | ||
47 | * Standard clock functions defined in include/linux/clk.h | ||
48 | *-------------------------------------------------------------------------*/ | ||
49 | |||
50 | static void __clk_disable(struct clk *clk) | ||
51 | { | ||
52 | if (clk == NULL || IS_ERR(clk)) | ||
53 | return; | ||
54 | WARN_ON(!clk->usecount); | ||
55 | |||
56 | if (!(--clk->usecount)) { | ||
57 | if (clk->disable) | ||
58 | clk->disable(clk); | ||
59 | __clk_disable(clk->parent); | ||
60 | } | ||
61 | } | ||
62 | |||
63 | static int __clk_enable(struct clk *clk) | ||
64 | { | ||
65 | if (clk == NULL || IS_ERR(clk)) | ||
66 | return -EINVAL; | ||
67 | |||
68 | if (clk->usecount++ == 0) { | ||
69 | __clk_enable(clk->parent); | ||
70 | |||
71 | if (clk->enable) | ||
72 | clk->enable(clk); | ||
73 | } | ||
74 | return 0; | ||
75 | } | ||
76 | |||
77 | /* | ||
78 | * The clk_enable/clk_disable could be called by drivers in atomic context, | ||
79 | * so they should not really hold mutex. Instead, clk_prepare/clk_unprepare | ||
80 | * can hold a mutex, as the pair will only be called in non-atomic context. | ||
81 | * Before migrating to common clk framework, we can have __clk_enable and | ||
82 | * __clk_disable called in clk_prepare/clk_unprepare with mutex held and | ||
83 | * leave clk_enable/clk_disable as the dummy functions. | ||
84 | */ | ||
85 | int clk_prepare(struct clk *clk) | ||
86 | { | ||
87 | int ret = 0; | ||
88 | |||
89 | if (clk == NULL || IS_ERR(clk)) | ||
90 | return -EINVAL; | ||
91 | |||
92 | mutex_lock(&clocks_mutex); | ||
93 | ret = __clk_enable(clk); | ||
94 | mutex_unlock(&clocks_mutex); | ||
95 | |||
96 | return ret; | ||
97 | } | ||
98 | EXPORT_SYMBOL(clk_prepare); | ||
99 | |||
100 | void clk_unprepare(struct clk *clk) | ||
101 | { | ||
102 | if (clk == NULL || IS_ERR(clk)) | ||
103 | return; | ||
104 | |||
105 | mutex_lock(&clocks_mutex); | ||
106 | __clk_disable(clk); | ||
107 | mutex_unlock(&clocks_mutex); | ||
108 | } | ||
109 | EXPORT_SYMBOL(clk_unprepare); | ||
110 | |||
111 | int clk_enable(struct clk *clk) | ||
112 | { | ||
113 | return 0; | ||
114 | } | ||
115 | EXPORT_SYMBOL(clk_enable); | ||
116 | |||
117 | void clk_disable(struct clk *clk) | ||
118 | { | ||
119 | /* nothing to do */ | ||
120 | } | ||
121 | EXPORT_SYMBOL(clk_disable); | ||
122 | |||
123 | /* Retrieve the *current* clock rate. If the clock itself | ||
124 | * does not provide a special calculation routine, ask | ||
125 | * its parent and so on, until one is able to return | ||
126 | * a valid clock rate | ||
127 | */ | ||
128 | unsigned long clk_get_rate(struct clk *clk) | ||
129 | { | ||
130 | if (clk == NULL || IS_ERR(clk)) | ||
131 | return 0UL; | ||
132 | |||
133 | if (clk->get_rate) | ||
134 | return clk->get_rate(clk); | ||
135 | |||
136 | return clk_get_rate(clk->parent); | ||
137 | } | ||
138 | EXPORT_SYMBOL(clk_get_rate); | ||
139 | |||
140 | /* Round the requested clock rate to the nearest supported | ||
141 | * rate that is less than or equal to the requested rate. | ||
142 | * This is dependent on the clock's current parent. | ||
143 | */ | ||
144 | long clk_round_rate(struct clk *clk, unsigned long rate) | ||
145 | { | ||
146 | if (clk == NULL || IS_ERR(clk) || !clk->round_rate) | ||
147 | return 0; | ||
148 | |||
149 | return clk->round_rate(clk, rate); | ||
150 | } | ||
151 | EXPORT_SYMBOL(clk_round_rate); | ||
152 | |||
153 | /* Set the clock to the requested clock rate. The rate must | ||
154 | * match a supported rate exactly based on what clk_round_rate returns | ||
155 | */ | ||
156 | int clk_set_rate(struct clk *clk, unsigned long rate) | ||
157 | { | ||
158 | int ret = -EINVAL; | ||
159 | |||
160 | if (clk == NULL || IS_ERR(clk) || clk->set_rate == NULL || rate == 0) | ||
161 | return ret; | ||
162 | |||
163 | mutex_lock(&clocks_mutex); | ||
164 | ret = clk->set_rate(clk, rate); | ||
165 | mutex_unlock(&clocks_mutex); | ||
166 | |||
167 | return ret; | ||
168 | } | ||
169 | EXPORT_SYMBOL(clk_set_rate); | ||
170 | |||
171 | /* Set the clock's parent to another clock source */ | ||
172 | int clk_set_parent(struct clk *clk, struct clk *parent) | ||
173 | { | ||
174 | int ret = -EINVAL; | ||
175 | struct clk *old; | ||
176 | |||
177 | if (clk == NULL || IS_ERR(clk) || parent == NULL || | ||
178 | IS_ERR(parent) || clk->set_parent == NULL) | ||
179 | return ret; | ||
180 | |||
181 | if (clk->usecount) | ||
182 | clk_prepare_enable(parent); | ||
183 | |||
184 | mutex_lock(&clocks_mutex); | ||
185 | ret = clk->set_parent(clk, parent); | ||
186 | if (ret == 0) { | ||
187 | old = clk->parent; | ||
188 | clk->parent = parent; | ||
189 | } else { | ||
190 | old = parent; | ||
191 | } | ||
192 | mutex_unlock(&clocks_mutex); | ||
193 | |||
194 | if (clk->usecount) | ||
195 | clk_disable(old); | ||
196 | |||
197 | return ret; | ||
198 | } | ||
199 | EXPORT_SYMBOL(clk_set_parent); | ||
200 | |||
201 | /* Retrieve the clock's parent clock source */ | ||
202 | struct clk *clk_get_parent(struct clk *clk) | ||
203 | { | ||
204 | struct clk *ret = NULL; | ||
205 | |||
206 | if (clk == NULL || IS_ERR(clk)) | ||
207 | return ret; | ||
208 | |||
209 | return clk->parent; | ||
210 | } | ||
211 | EXPORT_SYMBOL(clk_get_parent); | ||
diff --git a/arch/arm/mach-mxs/devices/Kconfig b/arch/arm/mach-mxs/devices/Kconfig index b8913df4cfa2..19659de1c4e8 100644 --- a/arch/arm/mach-mxs/devices/Kconfig +++ b/arch/arm/mach-mxs/devices/Kconfig | |||
@@ -1,6 +1,5 @@ | |||
1 | config MXS_HAVE_AMBA_DUART | 1 | config MXS_HAVE_AMBA_DUART |
2 | bool | 2 | bool |
3 | select ARM_AMBA | ||
4 | 3 | ||
5 | config MXS_HAVE_PLATFORM_AUART | 4 | config MXS_HAVE_PLATFORM_AUART |
6 | bool | 5 | bool |
diff --git a/arch/arm/mach-mxs/devices/platform-dma.c b/arch/arm/mach-mxs/devices/platform-dma.c index 6a0202b1016c..46824501de00 100644 --- a/arch/arm/mach-mxs/devices/platform-dma.c +++ b/arch/arm/mach-mxs/devices/platform-dma.c | |||
@@ -14,7 +14,7 @@ | |||
14 | #include <mach/mx28.h> | 14 | #include <mach/mx28.h> |
15 | #include <mach/devices-common.h> | 15 | #include <mach/devices-common.h> |
16 | 16 | ||
17 | static struct platform_device *__init mxs_add_dma(const char *devid, | 17 | struct platform_device *__init mxs_add_dma(const char *devid, |
18 | resource_size_t base) | 18 | resource_size_t base) |
19 | { | 19 | { |
20 | struct resource res[] = { | 20 | struct resource res[] = { |
@@ -29,22 +29,3 @@ static struct platform_device *__init mxs_add_dma(const char *devid, | |||
29 | res, ARRAY_SIZE(res), NULL, 0, | 29 | res, ARRAY_SIZE(res), NULL, 0, |
30 | DMA_BIT_MASK(32)); | 30 | DMA_BIT_MASK(32)); |
31 | } | 31 | } |
32 | |||
33 | static int __init mxs_add_mxs_dma(void) | ||
34 | { | ||
35 | char *apbh = "mxs-dma-apbh"; | ||
36 | char *apbx = "mxs-dma-apbx"; | ||
37 | |||
38 | if (cpu_is_mx23()) { | ||
39 | mxs_add_dma(apbh, MX23_APBH_DMA_BASE_ADDR); | ||
40 | mxs_add_dma(apbx, MX23_APBX_DMA_BASE_ADDR); | ||
41 | } | ||
42 | |||
43 | if (cpu_is_mx28()) { | ||
44 | mxs_add_dma(apbh, MX28_APBH_DMA_BASE_ADDR); | ||
45 | mxs_add_dma(apbx, MX28_APBX_DMA_BASE_ADDR); | ||
46 | } | ||
47 | |||
48 | return 0; | ||
49 | } | ||
50 | arch_initcall(mxs_add_mxs_dma); | ||
diff --git a/arch/arm/mach-mxs/devices/platform-gpio-mxs.c b/arch/arm/mach-mxs/devices/platform-gpio-mxs.c index ed0885e414e0..cd99f19ec637 100644 --- a/arch/arm/mach-mxs/devices/platform-gpio-mxs.c +++ b/arch/arm/mach-mxs/devices/platform-gpio-mxs.c | |||
@@ -14,7 +14,7 @@ | |||
14 | #include <mach/devices-common.h> | 14 | #include <mach/devices-common.h> |
15 | 15 | ||
16 | struct platform_device *__init mxs_add_gpio( | 16 | struct platform_device *__init mxs_add_gpio( |
17 | int id, resource_size_t iobase, int irq) | 17 | char *name, int id, resource_size_t iobase, int irq) |
18 | { | 18 | { |
19 | struct resource res[] = { | 19 | struct resource res[] = { |
20 | { | 20 | { |
@@ -29,25 +29,5 @@ struct platform_device *__init mxs_add_gpio( | |||
29 | }; | 29 | }; |
30 | 30 | ||
31 | return platform_device_register_resndata(&mxs_apbh_bus, | 31 | return platform_device_register_resndata(&mxs_apbh_bus, |
32 | "gpio-mxs", id, res, ARRAY_SIZE(res), NULL, 0); | 32 | name, id, res, ARRAY_SIZE(res), NULL, 0); |
33 | } | 33 | } |
34 | |||
35 | static int __init mxs_add_mxs_gpio(void) | ||
36 | { | ||
37 | if (cpu_is_mx23()) { | ||
38 | mxs_add_gpio(0, MX23_PINCTRL_BASE_ADDR, MX23_INT_GPIO0); | ||
39 | mxs_add_gpio(1, MX23_PINCTRL_BASE_ADDR, MX23_INT_GPIO1); | ||
40 | mxs_add_gpio(2, MX23_PINCTRL_BASE_ADDR, MX23_INT_GPIO2); | ||
41 | } | ||
42 | |||
43 | if (cpu_is_mx28()) { | ||
44 | mxs_add_gpio(0, MX28_PINCTRL_BASE_ADDR, MX28_INT_GPIO0); | ||
45 | mxs_add_gpio(1, MX28_PINCTRL_BASE_ADDR, MX28_INT_GPIO1); | ||
46 | mxs_add_gpio(2, MX28_PINCTRL_BASE_ADDR, MX28_INT_GPIO2); | ||
47 | mxs_add_gpio(3, MX28_PINCTRL_BASE_ADDR, MX28_INT_GPIO3); | ||
48 | mxs_add_gpio(4, MX28_PINCTRL_BASE_ADDR, MX28_INT_GPIO4); | ||
49 | } | ||
50 | |||
51 | return 0; | ||
52 | } | ||
53 | postcore_initcall(mxs_add_mxs_gpio); | ||
diff --git a/arch/arm/mach-mxs/devices/platform-mxs-mmc.c b/arch/arm/mach-mxs/devices/platform-mxs-mmc.c index bef9d923f54e..b33c9d05c552 100644 --- a/arch/arm/mach-mxs/devices/platform-mxs-mmc.c +++ b/arch/arm/mach-mxs/devices/platform-mxs-mmc.c | |||
@@ -17,8 +17,9 @@ | |||
17 | #include <mach/mx28.h> | 17 | #include <mach/mx28.h> |
18 | #include <mach/devices-common.h> | 18 | #include <mach/devices-common.h> |
19 | 19 | ||
20 | #define mxs_mxs_mmc_data_entry_single(soc, _id, hwid) \ | 20 | #define mxs_mxs_mmc_data_entry_single(soc, _devid, _id, hwid) \ |
21 | { \ | 21 | { \ |
22 | .devid = _devid, \ | ||
22 | .id = _id, \ | 23 | .id = _id, \ |
23 | .iobase = soc ## _SSP ## hwid ## _BASE_ADDR, \ | 24 | .iobase = soc ## _SSP ## hwid ## _BASE_ADDR, \ |
24 | .dma = soc ## _DMA_SSP ## hwid, \ | 25 | .dma = soc ## _DMA_SSP ## hwid, \ |
@@ -26,23 +27,23 @@ | |||
26 | .irq_dma = soc ## _INT_SSP ## hwid ## _DMA, \ | 27 | .irq_dma = soc ## _INT_SSP ## hwid ## _DMA, \ |
27 | } | 28 | } |
28 | 29 | ||
29 | #define mxs_mxs_mmc_data_entry(soc, _id, hwid) \ | 30 | #define mxs_mxs_mmc_data_entry(soc, _devid, _id, hwid) \ |
30 | [_id] = mxs_mxs_mmc_data_entry_single(soc, _id, hwid) | 31 | [_id] = mxs_mxs_mmc_data_entry_single(soc, _devid, _id, hwid) |
31 | 32 | ||
32 | 33 | ||
33 | #ifdef CONFIG_SOC_IMX23 | 34 | #ifdef CONFIG_SOC_IMX23 |
34 | const struct mxs_mxs_mmc_data mx23_mxs_mmc_data[] __initconst = { | 35 | const struct mxs_mxs_mmc_data mx23_mxs_mmc_data[] __initconst = { |
35 | mxs_mxs_mmc_data_entry(MX23, 0, 1), | 36 | mxs_mxs_mmc_data_entry(MX23, "imx23-mmc", 0, 1), |
36 | mxs_mxs_mmc_data_entry(MX23, 1, 2), | 37 | mxs_mxs_mmc_data_entry(MX23, "imx23-mmc", 1, 2), |
37 | }; | 38 | }; |
38 | #endif | 39 | #endif |
39 | 40 | ||
40 | #ifdef CONFIG_SOC_IMX28 | 41 | #ifdef CONFIG_SOC_IMX28 |
41 | const struct mxs_mxs_mmc_data mx28_mxs_mmc_data[] __initconst = { | 42 | const struct mxs_mxs_mmc_data mx28_mxs_mmc_data[] __initconst = { |
42 | mxs_mxs_mmc_data_entry(MX28, 0, 0), | 43 | mxs_mxs_mmc_data_entry(MX28, "imx28-mmc", 0, 0), |
43 | mxs_mxs_mmc_data_entry(MX28, 1, 1), | 44 | mxs_mxs_mmc_data_entry(MX28, "imx28-mmc", 1, 1), |
44 | mxs_mxs_mmc_data_entry(MX28, 2, 2), | 45 | mxs_mxs_mmc_data_entry(MX28, "imx28-mmc", 2, 2), |
45 | mxs_mxs_mmc_data_entry(MX28, 3, 3), | 46 | mxs_mxs_mmc_data_entry(MX28, "imx28-mmc", 3, 3), |
46 | }; | 47 | }; |
47 | #endif | 48 | #endif |
48 | 49 | ||
@@ -70,6 +71,6 @@ struct platform_device *__init mxs_add_mxs_mmc( | |||
70 | }, | 71 | }, |
71 | }; | 72 | }; |
72 | 73 | ||
73 | return mxs_add_platform_device("mxs-mmc", data->id, | 74 | return mxs_add_platform_device(data->devid, data->id, |
74 | res, ARRAY_SIZE(res), pdata, sizeof(*pdata)); | 75 | res, ARRAY_SIZE(res), pdata, sizeof(*pdata)); |
75 | } | 76 | } |
diff --git a/arch/arm/mach-mxs/include/mach/clock.h b/arch/arm/mach-mxs/include/mach/clock.h deleted file mode 100644 index 592c9ab5d760..000000000000 --- a/arch/arm/mach-mxs/include/mach/clock.h +++ /dev/null | |||
@@ -1,62 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright 2005-2007 Freescale Semiconductor, Inc. All Rights Reserved. | ||
3 | * Copyright 2008 Juergen Beisert, kernel@pengutronix.de | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or | ||
6 | * modify it under the terms of the GNU General Public License | ||
7 | * as published by the Free Software Foundation; either version 2 | ||
8 | * of the License, or (at your option) any later version. | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program; if not, write to the Free Software | ||
16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, | ||
17 | * MA 02110-1301, USA. | ||
18 | */ | ||
19 | |||
20 | #ifndef __MACH_MXS_CLOCK_H__ | ||
21 | #define __MACH_MXS_CLOCK_H__ | ||
22 | |||
23 | #ifndef __ASSEMBLY__ | ||
24 | #include <linux/list.h> | ||
25 | |||
26 | struct module; | ||
27 | |||
28 | struct clk { | ||
29 | int id; | ||
30 | /* Source clock this clk depends on */ | ||
31 | struct clk *parent; | ||
32 | /* Reference count of clock enable/disable */ | ||
33 | __s8 usecount; | ||
34 | /* Register bit position for clock's enable/disable control. */ | ||
35 | u8 enable_shift; | ||
36 | /* Register address for clock's enable/disable control. */ | ||
37 | void __iomem *enable_reg; | ||
38 | u32 flags; | ||
39 | /* get the current clock rate (always a fresh value) */ | ||
40 | unsigned long (*get_rate) (struct clk *); | ||
41 | /* Function ptr to set the clock to a new rate. The rate must match a | ||
42 | supported rate returned from round_rate. Leave blank if clock is not | ||
43 | programmable */ | ||
44 | int (*set_rate) (struct clk *, unsigned long); | ||
45 | /* Function ptr to round the requested clock rate to the nearest | ||
46 | supported rate that is less than or equal to the requested rate. */ | ||
47 | unsigned long (*round_rate) (struct clk *, unsigned long); | ||
48 | /* Function ptr to enable the clock. Leave blank if clock can not | ||
49 | be gated. */ | ||
50 | int (*enable) (struct clk *); | ||
51 | /* Function ptr to disable the clock. Leave blank if clock can not | ||
52 | be gated. */ | ||
53 | void (*disable) (struct clk *); | ||
54 | /* Function ptr to set the parent clock of the clock. */ | ||
55 | int (*set_parent) (struct clk *, struct clk *); | ||
56 | }; | ||
57 | |||
58 | int clk_register(struct clk *clk); | ||
59 | void clk_unregister(struct clk *clk); | ||
60 | |||
61 | #endif /* __ASSEMBLY__ */ | ||
62 | #endif /* __MACH_MXS_CLOCK_H__ */ | ||
diff --git a/arch/arm/mach-mxs/include/mach/common.h b/arch/arm/mach-mxs/include/mach/common.h index 8d88399b73ef..de6c7ba42544 100644 --- a/arch/arm/mach-mxs/include/mach/common.h +++ b/arch/arm/mach-mxs/include/mach/common.h | |||
@@ -11,28 +11,27 @@ | |||
11 | #ifndef __MACH_MXS_COMMON_H__ | 11 | #ifndef __MACH_MXS_COMMON_H__ |
12 | #define __MACH_MXS_COMMON_H__ | 12 | #define __MACH_MXS_COMMON_H__ |
13 | 13 | ||
14 | struct clk; | ||
15 | |||
16 | extern const u32 *mxs_get_ocotp(void); | 14 | extern const u32 *mxs_get_ocotp(void); |
17 | extern int mxs_reset_block(void __iomem *); | 15 | extern int mxs_reset_block(void __iomem *); |
18 | extern void mxs_timer_init(struct clk *, int); | 16 | extern void mxs_timer_init(int); |
19 | extern void mxs_restart(char, const char *); | 17 | extern void mxs_restart(char, const char *); |
20 | extern int mxs_saif_clkmux_select(unsigned int clkmux); | 18 | extern int mxs_saif_clkmux_select(unsigned int clkmux); |
21 | 19 | ||
22 | extern void mx23_soc_init(void); | 20 | extern void mx23_soc_init(void); |
23 | extern int mx23_register_gpios(void); | ||
24 | extern int mx23_clocks_init(void); | 21 | extern int mx23_clocks_init(void); |
25 | extern void mx23_map_io(void); | 22 | extern void mx23_map_io(void); |
26 | extern void mx23_init_irq(void); | 23 | extern void mx23_init_irq(void); |
27 | 24 | ||
28 | extern void mx28_soc_init(void); | 25 | extern void mx28_soc_init(void); |
29 | extern int mx28_register_gpios(void); | ||
30 | extern int mx28_clocks_init(void); | 26 | extern int mx28_clocks_init(void); |
31 | extern void mx28_map_io(void); | 27 | extern void mx28_map_io(void); |
32 | extern void mx28_init_irq(void); | 28 | extern void mx28_init_irq(void); |
33 | 29 | ||
34 | extern void icoll_init_irq(void); | 30 | extern void icoll_init_irq(void); |
35 | 31 | ||
36 | extern int mxs_clkctrl_timeout(unsigned int reg_offset, unsigned int mask); | 32 | extern struct platform_device *mxs_add_dma(const char *devid, |
33 | resource_size_t base); | ||
34 | extern struct platform_device *mxs_add_gpio(char *name, int id, | ||
35 | resource_size_t iobase, int irq); | ||
37 | 36 | ||
38 | #endif /* __MACH_MXS_COMMON_H__ */ | 37 | #endif /* __MACH_MXS_COMMON_H__ */ |
diff --git a/arch/arm/mach-mxs/include/mach/devices-common.h b/arch/arm/mach-mxs/include/mach/devices-common.h index 21e45a70d344..e8b1d958240b 100644 --- a/arch/arm/mach-mxs/include/mach/devices-common.h +++ b/arch/arm/mach-mxs/include/mach/devices-common.h | |||
@@ -82,8 +82,9 @@ struct platform_device * __init mxs_add_mxs_i2c( | |||
82 | const struct mxs_mxs_i2c_data *data); | 82 | const struct mxs_mxs_i2c_data *data); |
83 | 83 | ||
84 | /* mmc */ | 84 | /* mmc */ |
85 | #include <mach/mmc.h> | 85 | #include <linux/mmc/mxs-mmc.h> |
86 | struct mxs_mxs_mmc_data { | 86 | struct mxs_mxs_mmc_data { |
87 | const char *devid; | ||
87 | int id; | 88 | int id; |
88 | resource_size_t iobase; | 89 | resource_size_t iobase; |
89 | resource_size_t dma; | 90 | resource_size_t dma; |
diff --git a/arch/arm/mach-mxs/include/mach/mmc.h b/arch/arm/mach-mxs/include/mach/mmc.h deleted file mode 100644 index 211547a05564..000000000000 --- a/arch/arm/mach-mxs/include/mach/mmc.h +++ /dev/null | |||
@@ -1,18 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright 2011 Freescale Semiconductor, Inc. All Rights Reserved. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License version 2 as | ||
6 | * published by the Free Software Foundation. | ||
7 | */ | ||
8 | |||
9 | #ifndef __MACH_MXS_MMC_H__ | ||
10 | #define __MACH_MXS_MMC_H__ | ||
11 | |||
12 | struct mxs_mmc_platform_data { | ||
13 | int wp_gpio; /* write protect pin */ | ||
14 | unsigned int flags; | ||
15 | #define SLOTF_4_BIT_CAPABLE (1 << 0) | ||
16 | #define SLOTF_8_BIT_CAPABLE (1 << 1) | ||
17 | }; | ||
18 | #endif /* __MACH_MXS_MMC_H__ */ | ||
diff --git a/arch/arm/mach-mxs/mach-mx28evk.c b/arch/arm/mach-mxs/mach-mx28evk.c index da4610ebe9e6..dafd48e86c8c 100644 --- a/arch/arm/mach-mxs/mach-mx28evk.c +++ b/arch/arm/mach-mxs/mach-mx28evk.c | |||
@@ -226,7 +226,7 @@ static void __init mx28evk_fec_reset(void) | |||
226 | struct clk *clk; | 226 | struct clk *clk; |
227 | 227 | ||
228 | /* Enable fec phy clock */ | 228 | /* Enable fec phy clock */ |
229 | clk = clk_get_sys("pll2", NULL); | 229 | clk = clk_get_sys("enet_out", NULL); |
230 | if (!IS_ERR(clk)) | 230 | if (!IS_ERR(clk)) |
231 | clk_prepare_enable(clk); | 231 | clk_prepare_enable(clk); |
232 | 232 | ||
diff --git a/arch/arm/mach-mxs/mach-mxs.c b/arch/arm/mach-mxs/mach-mxs.c new file mode 100644 index 000000000000..8cac94b33020 --- /dev/null +++ b/arch/arm/mach-mxs/mach-mxs.c | |||
@@ -0,0 +1,121 @@ | |||
1 | /* | ||
2 | * Copyright 2012 Freescale Semiconductor, Inc. | ||
3 | * Copyright 2012 Linaro Ltd. | ||
4 | * | ||
5 | * The code contained herein is licensed under the GNU General Public | ||
6 | * License. You may obtain a copy of the GNU General Public License | ||
7 | * Version 2 or later at the following locations: | ||
8 | * | ||
9 | * http://www.opensource.org/licenses/gpl-license.html | ||
10 | * http://www.gnu.org/copyleft/gpl.html | ||
11 | */ | ||
12 | |||
13 | #include <linux/clk.h> | ||
14 | #include <linux/clkdev.h> | ||
15 | #include <linux/err.h> | ||
16 | #include <linux/init.h> | ||
17 | #include <linux/init.h> | ||
18 | #include <linux/irqdomain.h> | ||
19 | #include <linux/of_irq.h> | ||
20 | #include <linux/of_platform.h> | ||
21 | #include <asm/mach/arch.h> | ||
22 | #include <asm/mach/time.h> | ||
23 | #include <mach/common.h> | ||
24 | |||
25 | static int __init mxs_icoll_add_irq_domain(struct device_node *np, | ||
26 | struct device_node *interrupt_parent) | ||
27 | { | ||
28 | irq_domain_add_legacy(np, 128, 0, 0, &irq_domain_simple_ops, NULL); | ||
29 | |||
30 | return 0; | ||
31 | } | ||
32 | |||
33 | static int __init mxs_gpio_add_irq_domain(struct device_node *np, | ||
34 | struct device_node *interrupt_parent) | ||
35 | { | ||
36 | static int gpio_irq_base = MXS_GPIO_IRQ_START; | ||
37 | |||
38 | irq_domain_add_legacy(np, 32, gpio_irq_base, 0, &irq_domain_simple_ops, NULL); | ||
39 | gpio_irq_base += 32; | ||
40 | |||
41 | return 0; | ||
42 | } | ||
43 | |||
44 | static const struct of_device_id mxs_irq_match[] __initconst = { | ||
45 | { .compatible = "fsl,mxs-icoll", .data = mxs_icoll_add_irq_domain, }, | ||
46 | { .compatible = "fsl,mxs-gpio", .data = mxs_gpio_add_irq_domain, }, | ||
47 | { /* sentinel */ } | ||
48 | }; | ||
49 | |||
50 | static void __init mxs_dt_init_irq(void) | ||
51 | { | ||
52 | icoll_init_irq(); | ||
53 | of_irq_init(mxs_irq_match); | ||
54 | } | ||
55 | |||
56 | static void __init imx23_timer_init(void) | ||
57 | { | ||
58 | mx23_clocks_init(); | ||
59 | } | ||
60 | |||
61 | static struct sys_timer imx23_timer = { | ||
62 | .init = imx23_timer_init, | ||
63 | }; | ||
64 | |||
65 | static void __init imx28_timer_init(void) | ||
66 | { | ||
67 | mx28_clocks_init(); | ||
68 | } | ||
69 | |||
70 | static struct sys_timer imx28_timer = { | ||
71 | .init = imx28_timer_init, | ||
72 | }; | ||
73 | |||
74 | static void __init imx28_evk_init(void) | ||
75 | { | ||
76 | struct clk *clk; | ||
77 | |||
78 | /* Enable fec phy clock */ | ||
79 | clk = clk_get_sys("enet_out", NULL); | ||
80 | if (!IS_ERR(clk)) | ||
81 | clk_prepare_enable(clk); | ||
82 | } | ||
83 | |||
84 | static void __init mxs_machine_init(void) | ||
85 | { | ||
86 | if (of_machine_is_compatible("fsl,imx28-evk")) | ||
87 | imx28_evk_init(); | ||
88 | |||
89 | of_platform_populate(NULL, of_default_bus_match_table, | ||
90 | NULL, NULL); | ||
91 | } | ||
92 | |||
93 | static const char *imx23_dt_compat[] __initdata = { | ||
94 | "fsl,imx23-evk", | ||
95 | "fsl,imx23", | ||
96 | NULL, | ||
97 | }; | ||
98 | |||
99 | static const char *imx28_dt_compat[] __initdata = { | ||
100 | "fsl,imx28-evk", | ||
101 | "fsl,imx28", | ||
102 | NULL, | ||
103 | }; | ||
104 | |||
105 | DT_MACHINE_START(IMX23, "Freescale i.MX23 (Device Tree)") | ||
106 | .map_io = mx23_map_io, | ||
107 | .init_irq = mxs_dt_init_irq, | ||
108 | .timer = &imx23_timer, | ||
109 | .init_machine = mxs_machine_init, | ||
110 | .dt_compat = imx23_dt_compat, | ||
111 | .restart = mxs_restart, | ||
112 | MACHINE_END | ||
113 | |||
114 | DT_MACHINE_START(IMX28, "Freescale i.MX28 (Device Tree)") | ||
115 | .map_io = mx28_map_io, | ||
116 | .init_irq = mxs_dt_init_irq, | ||
117 | .timer = &imx28_timer, | ||
118 | .init_machine = mxs_machine_init, | ||
119 | .dt_compat = imx28_dt_compat, | ||
120 | .restart = mxs_restart, | ||
121 | MACHINE_END | ||
diff --git a/arch/arm/mach-mxs/mm.c b/arch/arm/mach-mxs/mm.c index 67a384edcf5b..dccb67a9e7c4 100644 --- a/arch/arm/mach-mxs/mm.c +++ b/arch/arm/mach-mxs/mm.c | |||
@@ -66,9 +66,25 @@ void __init mx28_init_irq(void) | |||
66 | void __init mx23_soc_init(void) | 66 | void __init mx23_soc_init(void) |
67 | { | 67 | { |
68 | pinctrl_provide_dummies(); | 68 | pinctrl_provide_dummies(); |
69 | |||
70 | mxs_add_dma("imx23-dma-apbh", MX23_APBH_DMA_BASE_ADDR); | ||
71 | mxs_add_dma("imx23-dma-apbx", MX23_APBX_DMA_BASE_ADDR); | ||
72 | |||
73 | mxs_add_gpio("imx23-gpio", 0, MX23_PINCTRL_BASE_ADDR, MX23_INT_GPIO0); | ||
74 | mxs_add_gpio("imx23-gpio", 1, MX23_PINCTRL_BASE_ADDR, MX23_INT_GPIO1); | ||
75 | mxs_add_gpio("imx23-gpio", 2, MX23_PINCTRL_BASE_ADDR, MX23_INT_GPIO2); | ||
69 | } | 76 | } |
70 | 77 | ||
71 | void __init mx28_soc_init(void) | 78 | void __init mx28_soc_init(void) |
72 | { | 79 | { |
73 | pinctrl_provide_dummies(); | 80 | pinctrl_provide_dummies(); |
81 | |||
82 | mxs_add_dma("imx28-dma-apbh", MX23_APBH_DMA_BASE_ADDR); | ||
83 | mxs_add_dma("imx28-dma-apbx", MX23_APBX_DMA_BASE_ADDR); | ||
84 | |||
85 | mxs_add_gpio("imx28-gpio", 0, MX28_PINCTRL_BASE_ADDR, MX28_INT_GPIO0); | ||
86 | mxs_add_gpio("imx28-gpio", 1, MX28_PINCTRL_BASE_ADDR, MX28_INT_GPIO1); | ||
87 | mxs_add_gpio("imx28-gpio", 2, MX28_PINCTRL_BASE_ADDR, MX28_INT_GPIO2); | ||
88 | mxs_add_gpio("imx28-gpio", 3, MX28_PINCTRL_BASE_ADDR, MX28_INT_GPIO3); | ||
89 | mxs_add_gpio("imx28-gpio", 4, MX28_PINCTRL_BASE_ADDR, MX28_INT_GPIO4); | ||
74 | } | 90 | } |
diff --git a/arch/arm/mach-mxs/regs-clkctrl-mx23.h b/arch/arm/mach-mxs/regs-clkctrl-mx23.h deleted file mode 100644 index 0ea5c9d0e2b2..000000000000 --- a/arch/arm/mach-mxs/regs-clkctrl-mx23.h +++ /dev/null | |||
@@ -1,331 +0,0 @@ | |||
1 | /* | ||
2 | * Freescale CLKCTRL Register Definitions | ||
3 | * | ||
4 | * Copyright 2008 Embedded Alley Solutions, Inc All Rights Reserved. | ||
5 | * Copyright 2008-2010 Freescale Semiconductor, Inc. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
20 | * | ||
21 | * This file is created by xml file. Don't Edit it. | ||
22 | * | ||
23 | * Xml Revision: 1.48 | ||
24 | * Template revision: 26195 | ||
25 | */ | ||
26 | |||
27 | #ifndef __REGS_CLKCTRL_MX23_H__ | ||
28 | #define __REGS_CLKCTRL_MX23_H__ | ||
29 | |||
30 | |||
31 | #define HW_CLKCTRL_PLLCTRL0 (0x00000000) | ||
32 | #define HW_CLKCTRL_PLLCTRL0_SET (0x00000004) | ||
33 | #define HW_CLKCTRL_PLLCTRL0_CLR (0x00000008) | ||
34 | #define HW_CLKCTRL_PLLCTRL0_TOG (0x0000000c) | ||
35 | |||
36 | #define BP_CLKCTRL_PLLCTRL0_LFR_SEL 28 | ||
37 | #define BM_CLKCTRL_PLLCTRL0_LFR_SEL 0x30000000 | ||
38 | #define BF_CLKCTRL_PLLCTRL0_LFR_SEL(v) \ | ||
39 | (((v) << 28) & BM_CLKCTRL_PLLCTRL0_LFR_SEL) | ||
40 | #define BV_CLKCTRL_PLLCTRL0_LFR_SEL__DEFAULT 0x0 | ||
41 | #define BV_CLKCTRL_PLLCTRL0_LFR_SEL__TIMES_2 0x1 | ||
42 | #define BV_CLKCTRL_PLLCTRL0_LFR_SEL__TIMES_05 0x2 | ||
43 | #define BV_CLKCTRL_PLLCTRL0_LFR_SEL__UNDEFINED 0x3 | ||
44 | #define BP_CLKCTRL_PLLCTRL0_CP_SEL 24 | ||
45 | #define BM_CLKCTRL_PLLCTRL0_CP_SEL 0x03000000 | ||
46 | #define BF_CLKCTRL_PLLCTRL0_CP_SEL(v) \ | ||
47 | (((v) << 24) & BM_CLKCTRL_PLLCTRL0_CP_SEL) | ||
48 | #define BV_CLKCTRL_PLLCTRL0_CP_SEL__DEFAULT 0x0 | ||
49 | #define BV_CLKCTRL_PLLCTRL0_CP_SEL__TIMES_2 0x1 | ||
50 | #define BV_CLKCTRL_PLLCTRL0_CP_SEL__TIMES_05 0x2 | ||
51 | #define BV_CLKCTRL_PLLCTRL0_CP_SEL__UNDEFINED 0x3 | ||
52 | #define BP_CLKCTRL_PLLCTRL0_DIV_SEL 20 | ||
53 | #define BM_CLKCTRL_PLLCTRL0_DIV_SEL 0x00300000 | ||
54 | #define BF_CLKCTRL_PLLCTRL0_DIV_SEL(v) \ | ||
55 | (((v) << 20) & BM_CLKCTRL_PLLCTRL0_DIV_SEL) | ||
56 | #define BV_CLKCTRL_PLLCTRL0_DIV_SEL__DEFAULT 0x0 | ||
57 | #define BV_CLKCTRL_PLLCTRL0_DIV_SEL__LOWER 0x1 | ||
58 | #define BV_CLKCTRL_PLLCTRL0_DIV_SEL__LOWEST 0x2 | ||
59 | #define BV_CLKCTRL_PLLCTRL0_DIV_SEL__UNDEFINED 0x3 | ||
60 | #define BM_CLKCTRL_PLLCTRL0_EN_USB_CLKS 0x00040000 | ||
61 | #define BM_CLKCTRL_PLLCTRL0_POWER 0x00010000 | ||
62 | |||
63 | #define HW_CLKCTRL_PLLCTRL1 (0x00000010) | ||
64 | |||
65 | #define BM_CLKCTRL_PLLCTRL1_LOCK 0x80000000 | ||
66 | #define BM_CLKCTRL_PLLCTRL1_FORCE_LOCK 0x40000000 | ||
67 | #define BP_CLKCTRL_PLLCTRL1_LOCK_COUNT 0 | ||
68 | #define BM_CLKCTRL_PLLCTRL1_LOCK_COUNT 0x0000FFFF | ||
69 | #define BF_CLKCTRL_PLLCTRL1_LOCK_COUNT(v) \ | ||
70 | (((v) << 0) & BM_CLKCTRL_PLLCTRL1_LOCK_COUNT) | ||
71 | |||
72 | #define HW_CLKCTRL_CPU (0x00000020) | ||
73 | #define HW_CLKCTRL_CPU_SET (0x00000024) | ||
74 | #define HW_CLKCTRL_CPU_CLR (0x00000028) | ||
75 | #define HW_CLKCTRL_CPU_TOG (0x0000002c) | ||
76 | |||
77 | #define BM_CLKCTRL_CPU_BUSY_REF_XTAL 0x20000000 | ||
78 | #define BM_CLKCTRL_CPU_BUSY_REF_CPU 0x10000000 | ||
79 | #define BM_CLKCTRL_CPU_DIV_XTAL_FRAC_EN 0x04000000 | ||
80 | #define BP_CLKCTRL_CPU_DIV_XTAL 16 | ||
81 | #define BM_CLKCTRL_CPU_DIV_XTAL 0x03FF0000 | ||
82 | #define BF_CLKCTRL_CPU_DIV_XTAL(v) \ | ||
83 | (((v) << 16) & BM_CLKCTRL_CPU_DIV_XTAL) | ||
84 | #define BM_CLKCTRL_CPU_INTERRUPT_WAIT 0x00001000 | ||
85 | #define BM_CLKCTRL_CPU_DIV_CPU_FRAC_EN 0x00000400 | ||
86 | #define BP_CLKCTRL_CPU_DIV_CPU 0 | ||
87 | #define BM_CLKCTRL_CPU_DIV_CPU 0x0000003F | ||
88 | #define BF_CLKCTRL_CPU_DIV_CPU(v) \ | ||
89 | (((v) << 0) & BM_CLKCTRL_CPU_DIV_CPU) | ||
90 | |||
91 | #define HW_CLKCTRL_HBUS (0x00000030) | ||
92 | #define HW_CLKCTRL_HBUS_SET (0x00000034) | ||
93 | #define HW_CLKCTRL_HBUS_CLR (0x00000038) | ||
94 | #define HW_CLKCTRL_HBUS_TOG (0x0000003c) | ||
95 | |||
96 | #define BM_CLKCTRL_HBUS_BUSY 0x20000000 | ||
97 | #define BM_CLKCTRL_HBUS_DCP_AS_ENABLE 0x10000000 | ||
98 | #define BM_CLKCTRL_HBUS_PXP_AS_ENABLE 0x08000000 | ||
99 | #define BM_CLKCTRL_HBUS_APBHDMA_AS_ENABLE 0x04000000 | ||
100 | #define BM_CLKCTRL_HBUS_APBXDMA_AS_ENABLE 0x02000000 | ||
101 | #define BM_CLKCTRL_HBUS_TRAFFIC_JAM_AS_ENABLE 0x01000000 | ||
102 | #define BM_CLKCTRL_HBUS_TRAFFIC_AS_ENABLE 0x00800000 | ||
103 | #define BM_CLKCTRL_HBUS_CPU_DATA_AS_ENABLE 0x00400000 | ||
104 | #define BM_CLKCTRL_HBUS_CPU_INSTR_AS_ENABLE 0x00200000 | ||
105 | #define BM_CLKCTRL_HBUS_AUTO_SLOW_MODE 0x00100000 | ||
106 | #define BP_CLKCTRL_HBUS_SLOW_DIV 16 | ||
107 | #define BM_CLKCTRL_HBUS_SLOW_DIV 0x00070000 | ||
108 | #define BF_CLKCTRL_HBUS_SLOW_DIV(v) \ | ||
109 | (((v) << 16) & BM_CLKCTRL_HBUS_SLOW_DIV) | ||
110 | #define BV_CLKCTRL_HBUS_SLOW_DIV__BY1 0x0 | ||
111 | #define BV_CLKCTRL_HBUS_SLOW_DIV__BY2 0x1 | ||
112 | #define BV_CLKCTRL_HBUS_SLOW_DIV__BY4 0x2 | ||
113 | #define BV_CLKCTRL_HBUS_SLOW_DIV__BY8 0x3 | ||
114 | #define BV_CLKCTRL_HBUS_SLOW_DIV__BY16 0x4 | ||
115 | #define BV_CLKCTRL_HBUS_SLOW_DIV__BY32 0x5 | ||
116 | #define BM_CLKCTRL_HBUS_DIV_FRAC_EN 0x00000020 | ||
117 | #define BP_CLKCTRL_HBUS_DIV 0 | ||
118 | #define BM_CLKCTRL_HBUS_DIV 0x0000001F | ||
119 | #define BF_CLKCTRL_HBUS_DIV(v) \ | ||
120 | (((v) << 0) & BM_CLKCTRL_HBUS_DIV) | ||
121 | |||
122 | #define HW_CLKCTRL_XBUS (0x00000040) | ||
123 | |||
124 | #define BM_CLKCTRL_XBUS_BUSY 0x80000000 | ||
125 | #define BM_CLKCTRL_XBUS_DIV_FRAC_EN 0x00000400 | ||
126 | #define BP_CLKCTRL_XBUS_DIV 0 | ||
127 | #define BM_CLKCTRL_XBUS_DIV 0x000003FF | ||
128 | #define BF_CLKCTRL_XBUS_DIV(v) \ | ||
129 | (((v) << 0) & BM_CLKCTRL_XBUS_DIV) | ||
130 | |||
131 | #define HW_CLKCTRL_XTAL (0x00000050) | ||
132 | #define HW_CLKCTRL_XTAL_SET (0x00000054) | ||
133 | #define HW_CLKCTRL_XTAL_CLR (0x00000058) | ||
134 | #define HW_CLKCTRL_XTAL_TOG (0x0000005c) | ||
135 | |||
136 | #define BP_CLKCTRL_XTAL_UART_CLK_GATE 31 | ||
137 | #define BM_CLKCTRL_XTAL_UART_CLK_GATE 0x80000000 | ||
138 | #define BP_CLKCTRL_XTAL_FILT_CLK24M_GATE 30 | ||
139 | #define BM_CLKCTRL_XTAL_FILT_CLK24M_GATE 0x40000000 | ||
140 | #define BP_CLKCTRL_XTAL_PWM_CLK24M_GATE 29 | ||
141 | #define BM_CLKCTRL_XTAL_PWM_CLK24M_GATE 0x20000000 | ||
142 | #define BM_CLKCTRL_XTAL_DRI_CLK24M_GATE 0x10000000 | ||
143 | #define BM_CLKCTRL_XTAL_DIGCTRL_CLK1M_GATE 0x08000000 | ||
144 | #define BP_CLKCTRL_XTAL_TIMROT_CLK32K_GATE 26 | ||
145 | #define BM_CLKCTRL_XTAL_TIMROT_CLK32K_GATE 0x04000000 | ||
146 | #define BP_CLKCTRL_XTAL_DIV_UART 0 | ||
147 | #define BM_CLKCTRL_XTAL_DIV_UART 0x00000003 | ||
148 | #define BF_CLKCTRL_XTAL_DIV_UART(v) \ | ||
149 | (((v) << 0) & BM_CLKCTRL_XTAL_DIV_UART) | ||
150 | |||
151 | #define HW_CLKCTRL_PIX (0x00000060) | ||
152 | |||
153 | #define BP_CLKCTRL_PIX_CLKGATE 31 | ||
154 | #define BM_CLKCTRL_PIX_CLKGATE 0x80000000 | ||
155 | #define BM_CLKCTRL_PIX_BUSY 0x20000000 | ||
156 | #define BM_CLKCTRL_PIX_DIV_FRAC_EN 0x00001000 | ||
157 | #define BP_CLKCTRL_PIX_DIV 0 | ||
158 | #define BM_CLKCTRL_PIX_DIV 0x00000FFF | ||
159 | #define BF_CLKCTRL_PIX_DIV(v) \ | ||
160 | (((v) << 0) & BM_CLKCTRL_PIX_DIV) | ||
161 | |||
162 | #define HW_CLKCTRL_SSP (0x00000070) | ||
163 | |||
164 | #define BP_CLKCTRL_SSP_CLKGATE 31 | ||
165 | #define BM_CLKCTRL_SSP_CLKGATE 0x80000000 | ||
166 | #define BM_CLKCTRL_SSP_BUSY 0x20000000 | ||
167 | #define BM_CLKCTRL_SSP_DIV_FRAC_EN 0x00000200 | ||
168 | #define BP_CLKCTRL_SSP_DIV 0 | ||
169 | #define BM_CLKCTRL_SSP_DIV 0x000001FF | ||
170 | #define BF_CLKCTRL_SSP_DIV(v) \ | ||
171 | (((v) << 0) & BM_CLKCTRL_SSP_DIV) | ||
172 | |||
173 | #define HW_CLKCTRL_GPMI (0x00000080) | ||
174 | |||
175 | #define BP_CLKCTRL_GPMI_CLKGATE 31 | ||
176 | #define BM_CLKCTRL_GPMI_CLKGATE 0x80000000 | ||
177 | #define BM_CLKCTRL_GPMI_BUSY 0x20000000 | ||
178 | #define BM_CLKCTRL_GPMI_DIV_FRAC_EN 0x00000400 | ||
179 | #define BP_CLKCTRL_GPMI_DIV 0 | ||
180 | #define BM_CLKCTRL_GPMI_DIV 0x000003FF | ||
181 | #define BF_CLKCTRL_GPMI_DIV(v) \ | ||
182 | (((v) << 0) & BM_CLKCTRL_GPMI_DIV) | ||
183 | |||
184 | #define HW_CLKCTRL_SPDIF (0x00000090) | ||
185 | |||
186 | #define BM_CLKCTRL_SPDIF_CLKGATE 0x80000000 | ||
187 | |||
188 | #define HW_CLKCTRL_EMI (0x000000a0) | ||
189 | |||
190 | #define BP_CLKCTRL_EMI_CLKGATE 31 | ||
191 | #define BM_CLKCTRL_EMI_CLKGATE 0x80000000 | ||
192 | #define BM_CLKCTRL_EMI_SYNC_MODE_EN 0x40000000 | ||
193 | #define BM_CLKCTRL_EMI_BUSY_REF_XTAL 0x20000000 | ||
194 | #define BM_CLKCTRL_EMI_BUSY_REF_EMI 0x10000000 | ||
195 | #define BM_CLKCTRL_EMI_BUSY_REF_CPU 0x08000000 | ||
196 | #define BM_CLKCTRL_EMI_BUSY_SYNC_MODE 0x04000000 | ||
197 | #define BM_CLKCTRL_EMI_BUSY_DCC_RESYNC 0x00020000 | ||
198 | #define BM_CLKCTRL_EMI_DCC_RESYNC_ENABLE 0x00010000 | ||
199 | #define BP_CLKCTRL_EMI_DIV_XTAL 8 | ||
200 | #define BM_CLKCTRL_EMI_DIV_XTAL 0x00000F00 | ||
201 | #define BF_CLKCTRL_EMI_DIV_XTAL(v) \ | ||
202 | (((v) << 8) & BM_CLKCTRL_EMI_DIV_XTAL) | ||
203 | #define BP_CLKCTRL_EMI_DIV_EMI 0 | ||
204 | #define BM_CLKCTRL_EMI_DIV_EMI 0x0000003F | ||
205 | #define BF_CLKCTRL_EMI_DIV_EMI(v) \ | ||
206 | (((v) << 0) & BM_CLKCTRL_EMI_DIV_EMI) | ||
207 | |||
208 | #define HW_CLKCTRL_IR (0x000000b0) | ||
209 | |||
210 | #define BM_CLKCTRL_IR_CLKGATE 0x80000000 | ||
211 | #define BM_CLKCTRL_IR_AUTO_DIV 0x20000000 | ||
212 | #define BM_CLKCTRL_IR_IR_BUSY 0x10000000 | ||
213 | #define BM_CLKCTRL_IR_IROV_BUSY 0x08000000 | ||
214 | #define BP_CLKCTRL_IR_IROV_DIV 16 | ||
215 | #define BM_CLKCTRL_IR_IROV_DIV 0x01FF0000 | ||
216 | #define BF_CLKCTRL_IR_IROV_DIV(v) \ | ||
217 | (((v) << 16) & BM_CLKCTRL_IR_IROV_DIV) | ||
218 | #define BP_CLKCTRL_IR_IR_DIV 0 | ||
219 | #define BM_CLKCTRL_IR_IR_DIV 0x000003FF | ||
220 | #define BF_CLKCTRL_IR_IR_DIV(v) \ | ||
221 | (((v) << 0) & BM_CLKCTRL_IR_IR_DIV) | ||
222 | |||
223 | #define HW_CLKCTRL_SAIF (0x000000c0) | ||
224 | |||
225 | #define BM_CLKCTRL_SAIF_CLKGATE 0x80000000 | ||
226 | #define BM_CLKCTRL_SAIF_BUSY 0x20000000 | ||
227 | #define BM_CLKCTRL_SAIF_DIV_FRAC_EN 0x00010000 | ||
228 | #define BP_CLKCTRL_SAIF_DIV 0 | ||
229 | #define BM_CLKCTRL_SAIF_DIV 0x0000FFFF | ||
230 | #define BF_CLKCTRL_SAIF_DIV(v) \ | ||
231 | (((v) << 0) & BM_CLKCTRL_SAIF_DIV) | ||
232 | |||
233 | #define HW_CLKCTRL_TV (0x000000d0) | ||
234 | |||
235 | #define BM_CLKCTRL_TV_CLK_TV108M_GATE 0x80000000 | ||
236 | #define BM_CLKCTRL_TV_CLK_TV_GATE 0x40000000 | ||
237 | |||
238 | #define HW_CLKCTRL_ETM (0x000000e0) | ||
239 | |||
240 | #define BM_CLKCTRL_ETM_CLKGATE 0x80000000 | ||
241 | #define BM_CLKCTRL_ETM_BUSY 0x20000000 | ||
242 | #define BM_CLKCTRL_ETM_DIV_FRAC_EN 0x00000040 | ||
243 | #define BP_CLKCTRL_ETM_DIV 0 | ||
244 | #define BM_CLKCTRL_ETM_DIV 0x0000003F | ||
245 | #define BF_CLKCTRL_ETM_DIV(v) \ | ||
246 | (((v) << 0) & BM_CLKCTRL_ETM_DIV) | ||
247 | |||
248 | #define HW_CLKCTRL_FRAC (0x000000f0) | ||
249 | #define HW_CLKCTRL_FRAC_SET (0x000000f4) | ||
250 | #define HW_CLKCTRL_FRAC_CLR (0x000000f8) | ||
251 | #define HW_CLKCTRL_FRAC_TOG (0x000000fc) | ||
252 | |||
253 | #define BP_CLKCTRL_FRAC_CLKGATEIO 31 | ||
254 | #define BM_CLKCTRL_FRAC_CLKGATEIO 0x80000000 | ||
255 | #define BM_CLKCTRL_FRAC_IO_STABLE 0x40000000 | ||
256 | #define BP_CLKCTRL_FRAC_IOFRAC 24 | ||
257 | #define BM_CLKCTRL_FRAC_IOFRAC 0x3F000000 | ||
258 | #define BF_CLKCTRL_FRAC_IOFRAC(v) \ | ||
259 | (((v) << 24) & BM_CLKCTRL_FRAC_IOFRAC) | ||
260 | #define BP_CLKCTRL_FRAC_CLKGATEPIX 23 | ||
261 | #define BM_CLKCTRL_FRAC_CLKGATEPIX 0x00800000 | ||
262 | #define BM_CLKCTRL_FRAC_PIX_STABLE 0x00400000 | ||
263 | #define BP_CLKCTRL_FRAC_PIXFRAC 16 | ||
264 | #define BM_CLKCTRL_FRAC_PIXFRAC 0x003F0000 | ||
265 | #define BF_CLKCTRL_FRAC_PIXFRAC(v) \ | ||
266 | (((v) << 16) & BM_CLKCTRL_FRAC_PIXFRAC) | ||
267 | #define BP_CLKCTRL_FRAC_CLKGATEEMI 15 | ||
268 | #define BM_CLKCTRL_FRAC_CLKGATEEMI 0x00008000 | ||
269 | #define BM_CLKCTRL_FRAC_EMI_STABLE 0x00004000 | ||
270 | #define BP_CLKCTRL_FRAC_EMIFRAC 8 | ||
271 | #define BM_CLKCTRL_FRAC_EMIFRAC 0x00003F00 | ||
272 | #define BF_CLKCTRL_FRAC_EMIFRAC(v) \ | ||
273 | (((v) << 8) & BM_CLKCTRL_FRAC_EMIFRAC) | ||
274 | #define BP_CLKCTRL_FRAC_CLKGATECPU 7 | ||
275 | #define BM_CLKCTRL_FRAC_CLKGATECPU 0x00000080 | ||
276 | #define BM_CLKCTRL_FRAC_CPU_STABLE 0x00000040 | ||
277 | #define BP_CLKCTRL_FRAC_CPUFRAC 0 | ||
278 | #define BM_CLKCTRL_FRAC_CPUFRAC 0x0000003F | ||
279 | #define BF_CLKCTRL_FRAC_CPUFRAC(v) \ | ||
280 | (((v) << 0) & BM_CLKCTRL_FRAC_CPUFRAC) | ||
281 | |||
282 | #define HW_CLKCTRL_FRAC1 (0x00000100) | ||
283 | #define HW_CLKCTRL_FRAC1_SET (0x00000104) | ||
284 | #define HW_CLKCTRL_FRAC1_CLR (0x00000108) | ||
285 | #define HW_CLKCTRL_FRAC1_TOG (0x0000010c) | ||
286 | |||
287 | #define BM_CLKCTRL_FRAC1_CLKGATEVID 0x80000000 | ||
288 | #define BM_CLKCTRL_FRAC1_VID_STABLE 0x40000000 | ||
289 | |||
290 | #define HW_CLKCTRL_CLKSEQ (0x00000110) | ||
291 | #define HW_CLKCTRL_CLKSEQ_SET (0x00000114) | ||
292 | #define HW_CLKCTRL_CLKSEQ_CLR (0x00000118) | ||
293 | #define HW_CLKCTRL_CLKSEQ_TOG (0x0000011c) | ||
294 | |||
295 | #define BM_CLKCTRL_CLKSEQ_BYPASS_ETM 0x00000100 | ||
296 | #define BM_CLKCTRL_CLKSEQ_BYPASS_CPU 0x00000080 | ||
297 | #define BM_CLKCTRL_CLKSEQ_BYPASS_EMI 0x00000040 | ||
298 | #define BM_CLKCTRL_CLKSEQ_BYPASS_SSP 0x00000020 | ||
299 | #define BM_CLKCTRL_CLKSEQ_BYPASS_GPMI 0x00000010 | ||
300 | #define BM_CLKCTRL_CLKSEQ_BYPASS_IR 0x00000008 | ||
301 | #define BM_CLKCTRL_CLKSEQ_BYPASS_PIX 0x00000002 | ||
302 | #define BM_CLKCTRL_CLKSEQ_BYPASS_SAIF 0x00000001 | ||
303 | |||
304 | #define HW_CLKCTRL_RESET (0x00000120) | ||
305 | |||
306 | #define BM_CLKCTRL_RESET_CHIP 0x00000002 | ||
307 | #define BM_CLKCTRL_RESET_DIG 0x00000001 | ||
308 | |||
309 | #define HW_CLKCTRL_STATUS (0x00000130) | ||
310 | |||
311 | #define BP_CLKCTRL_STATUS_CPU_LIMIT 30 | ||
312 | #define BM_CLKCTRL_STATUS_CPU_LIMIT 0xC0000000 | ||
313 | #define BF_CLKCTRL_STATUS_CPU_LIMIT(v) \ | ||
314 | (((v) << 30) & BM_CLKCTRL_STATUS_CPU_LIMIT) | ||
315 | |||
316 | #define HW_CLKCTRL_VERSION (0x00000140) | ||
317 | |||
318 | #define BP_CLKCTRL_VERSION_MAJOR 24 | ||
319 | #define BM_CLKCTRL_VERSION_MAJOR 0xFF000000 | ||
320 | #define BF_CLKCTRL_VERSION_MAJOR(v) \ | ||
321 | (((v) << 24) & BM_CLKCTRL_VERSION_MAJOR) | ||
322 | #define BP_CLKCTRL_VERSION_MINOR 16 | ||
323 | #define BM_CLKCTRL_VERSION_MINOR 0x00FF0000 | ||
324 | #define BF_CLKCTRL_VERSION_MINOR(v) \ | ||
325 | (((v) << 16) & BM_CLKCTRL_VERSION_MINOR) | ||
326 | #define BP_CLKCTRL_VERSION_STEP 0 | ||
327 | #define BM_CLKCTRL_VERSION_STEP 0x0000FFFF | ||
328 | #define BF_CLKCTRL_VERSION_STEP(v) \ | ||
329 | (((v) << 0) & BM_CLKCTRL_VERSION_STEP) | ||
330 | |||
331 | #endif /* __REGS_CLKCTRL_MX23_H__ */ | ||
diff --git a/arch/arm/mach-mxs/regs-clkctrl-mx28.h b/arch/arm/mach-mxs/regs-clkctrl-mx28.h deleted file mode 100644 index 7d1b061d7943..000000000000 --- a/arch/arm/mach-mxs/regs-clkctrl-mx28.h +++ /dev/null | |||
@@ -1,486 +0,0 @@ | |||
1 | /* | ||
2 | * Freescale CLKCTRL Register Definitions | ||
3 | * | ||
4 | * Copyright 2009-2010 Freescale Semiconductor, Inc. All Rights Reserved. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
19 | * | ||
20 | * This file is created by xml file. Don't Edit it. | ||
21 | * | ||
22 | * Xml Revision: 1.48 | ||
23 | * Template revision: 26195 | ||
24 | */ | ||
25 | |||
26 | #ifndef __REGS_CLKCTRL_MX28_H__ | ||
27 | #define __REGS_CLKCTRL_MX28_H__ | ||
28 | |||
29 | #define HW_CLKCTRL_PLL0CTRL0 (0x00000000) | ||
30 | #define HW_CLKCTRL_PLL0CTRL0_SET (0x00000004) | ||
31 | #define HW_CLKCTRL_PLL0CTRL0_CLR (0x00000008) | ||
32 | #define HW_CLKCTRL_PLL0CTRL0_TOG (0x0000000c) | ||
33 | |||
34 | #define BP_CLKCTRL_PLL0CTRL0_LFR_SEL 28 | ||
35 | #define BM_CLKCTRL_PLL0CTRL0_LFR_SEL 0x30000000 | ||
36 | #define BF_CLKCTRL_PLL0CTRL0_LFR_SEL(v) \ | ||
37 | (((v) << 28) & BM_CLKCTRL_PLL0CTRL0_LFR_SEL) | ||
38 | #define BV_CLKCTRL_PLL0CTRL0_LFR_SEL__DEFAULT 0x0 | ||
39 | #define BV_CLKCTRL_PLL0CTRL0_LFR_SEL__TIMES_2 0x1 | ||
40 | #define BV_CLKCTRL_PLL0CTRL0_LFR_SEL__TIMES_05 0x2 | ||
41 | #define BV_CLKCTRL_PLL0CTRL0_LFR_SEL__UNDEFINED 0x3 | ||
42 | #define BP_CLKCTRL_PLL0CTRL0_CP_SEL 24 | ||
43 | #define BM_CLKCTRL_PLL0CTRL0_CP_SEL 0x03000000 | ||
44 | #define BF_CLKCTRL_PLL0CTRL0_CP_SEL(v) \ | ||
45 | (((v) << 24) & BM_CLKCTRL_PLL0CTRL0_CP_SEL) | ||
46 | #define BV_CLKCTRL_PLL0CTRL0_CP_SEL__DEFAULT 0x0 | ||
47 | #define BV_CLKCTRL_PLL0CTRL0_CP_SEL__TIMES_2 0x1 | ||
48 | #define BV_CLKCTRL_PLL0CTRL0_CP_SEL__TIMES_05 0x2 | ||
49 | #define BV_CLKCTRL_PLL0CTRL0_CP_SEL__UNDEFINED 0x3 | ||
50 | #define BP_CLKCTRL_PLL0CTRL0_DIV_SEL 20 | ||
51 | #define BM_CLKCTRL_PLL0CTRL0_DIV_SEL 0x00300000 | ||
52 | #define BF_CLKCTRL_PLL0CTRL0_DIV_SEL(v) \ | ||
53 | (((v) << 20) & BM_CLKCTRL_PLL0CTRL0_DIV_SEL) | ||
54 | #define BV_CLKCTRL_PLL0CTRL0_DIV_SEL__DEFAULT 0x0 | ||
55 | #define BV_CLKCTRL_PLL0CTRL0_DIV_SEL__LOWER 0x1 | ||
56 | #define BV_CLKCTRL_PLL0CTRL0_DIV_SEL__LOWEST 0x2 | ||
57 | #define BV_CLKCTRL_PLL0CTRL0_DIV_SEL__UNDEFINED 0x3 | ||
58 | #define BM_CLKCTRL_PLL0CTRL0_EN_USB_CLKS 0x00040000 | ||
59 | #define BM_CLKCTRL_PLL0CTRL0_POWER 0x00020000 | ||
60 | |||
61 | #define HW_CLKCTRL_PLL0CTRL1 (0x00000010) | ||
62 | |||
63 | #define BM_CLKCTRL_PLL0CTRL1_LOCK 0x80000000 | ||
64 | #define BM_CLKCTRL_PLL0CTRL1_FORCE_LOCK 0x40000000 | ||
65 | #define BP_CLKCTRL_PLL0CTRL1_LOCK_COUNT 0 | ||
66 | #define BM_CLKCTRL_PLL0CTRL1_LOCK_COUNT 0x0000FFFF | ||
67 | #define BF_CLKCTRL_PLL0CTRL1_LOCK_COUNT(v) \ | ||
68 | (((v) << 0) & BM_CLKCTRL_PLL0CTRL1_LOCK_COUNT) | ||
69 | |||
70 | #define HW_CLKCTRL_PLL1CTRL0 (0x00000020) | ||
71 | #define HW_CLKCTRL_PLL1CTRL0_SET (0x00000024) | ||
72 | #define HW_CLKCTRL_PLL1CTRL0_CLR (0x00000028) | ||
73 | #define HW_CLKCTRL_PLL1CTRL0_TOG (0x0000002c) | ||
74 | |||
75 | #define BM_CLKCTRL_PLL1CTRL0_CLKGATEEMI 0x80000000 | ||
76 | #define BP_CLKCTRL_PLL1CTRL0_LFR_SEL 28 | ||
77 | #define BM_CLKCTRL_PLL1CTRL0_LFR_SEL 0x30000000 | ||
78 | #define BF_CLKCTRL_PLL1CTRL0_LFR_SEL(v) \ | ||
79 | (((v) << 28) & BM_CLKCTRL_PLL1CTRL0_LFR_SEL) | ||
80 | #define BV_CLKCTRL_PLL1CTRL0_LFR_SEL__DEFAULT 0x0 | ||
81 | #define BV_CLKCTRL_PLL1CTRL0_LFR_SEL__TIMES_2 0x1 | ||
82 | #define BV_CLKCTRL_PLL1CTRL0_LFR_SEL__TIMES_05 0x2 | ||
83 | #define BV_CLKCTRL_PLL1CTRL0_LFR_SEL__UNDEFINED 0x3 | ||
84 | #define BP_CLKCTRL_PLL1CTRL0_CP_SEL 24 | ||
85 | #define BM_CLKCTRL_PLL1CTRL0_CP_SEL 0x03000000 | ||
86 | #define BF_CLKCTRL_PLL1CTRL0_CP_SEL(v) \ | ||
87 | (((v) << 24) & BM_CLKCTRL_PLL1CTRL0_CP_SEL) | ||
88 | #define BV_CLKCTRL_PLL1CTRL0_CP_SEL__DEFAULT 0x0 | ||
89 | #define BV_CLKCTRL_PLL1CTRL0_CP_SEL__TIMES_2 0x1 | ||
90 | #define BV_CLKCTRL_PLL1CTRL0_CP_SEL__TIMES_05 0x2 | ||
91 | #define BV_CLKCTRL_PLL1CTRL0_CP_SEL__UNDEFINED 0x3 | ||
92 | #define BP_CLKCTRL_PLL1CTRL0_DIV_SEL 20 | ||
93 | #define BM_CLKCTRL_PLL1CTRL0_DIV_SEL 0x00300000 | ||
94 | #define BF_CLKCTRL_PLL1CTRL0_DIV_SEL(v) \ | ||
95 | (((v) << 20) & BM_CLKCTRL_PLL1CTRL0_DIV_SEL) | ||
96 | #define BV_CLKCTRL_PLL1CTRL0_DIV_SEL__DEFAULT 0x0 | ||
97 | #define BV_CLKCTRL_PLL1CTRL0_DIV_SEL__LOWER 0x1 | ||
98 | #define BV_CLKCTRL_PLL1CTRL0_DIV_SEL__LOWEST 0x2 | ||
99 | #define BV_CLKCTRL_PLL1CTRL0_DIV_SEL__UNDEFINED 0x3 | ||
100 | #define BM_CLKCTRL_PLL1CTRL0_EN_USB_CLKS 0x00040000 | ||
101 | #define BM_CLKCTRL_PLL1CTRL0_POWER 0x00020000 | ||
102 | |||
103 | #define HW_CLKCTRL_PLL1CTRL1 (0x00000030) | ||
104 | |||
105 | #define BM_CLKCTRL_PLL1CTRL1_LOCK 0x80000000 | ||
106 | #define BM_CLKCTRL_PLL1CTRL1_FORCE_LOCK 0x40000000 | ||
107 | #define BP_CLKCTRL_PLL1CTRL1_LOCK_COUNT 0 | ||
108 | #define BM_CLKCTRL_PLL1CTRL1_LOCK_COUNT 0x0000FFFF | ||
109 | #define BF_CLKCTRL_PLL1CTRL1_LOCK_COUNT(v) \ | ||
110 | (((v) << 0) & BM_CLKCTRL_PLL1CTRL1_LOCK_COUNT) | ||
111 | |||
112 | #define HW_CLKCTRL_PLL2CTRL0 (0x00000040) | ||
113 | #define HW_CLKCTRL_PLL2CTRL0_SET (0x00000044) | ||
114 | #define HW_CLKCTRL_PLL2CTRL0_CLR (0x00000048) | ||
115 | #define HW_CLKCTRL_PLL2CTRL0_TOG (0x0000004c) | ||
116 | |||
117 | #define BM_CLKCTRL_PLL2CTRL0_CLKGATE 0x80000000 | ||
118 | #define BP_CLKCTRL_PLL2CTRL0_LFR_SEL 28 | ||
119 | #define BM_CLKCTRL_PLL2CTRL0_LFR_SEL 0x30000000 | ||
120 | #define BF_CLKCTRL_PLL2CTRL0_LFR_SEL(v) \ | ||
121 | (((v) << 28) & BM_CLKCTRL_PLL2CTRL0_LFR_SEL) | ||
122 | #define BM_CLKCTRL_PLL2CTRL0_HOLD_RING_OFF_B 0x04000000 | ||
123 | #define BP_CLKCTRL_PLL2CTRL0_CP_SEL 24 | ||
124 | #define BM_CLKCTRL_PLL2CTRL0_CP_SEL 0x03000000 | ||
125 | #define BF_CLKCTRL_PLL2CTRL0_CP_SEL(v) \ | ||
126 | (((v) << 24) & BM_CLKCTRL_PLL2CTRL0_CP_SEL) | ||
127 | #define BM_CLKCTRL_PLL2CTRL0_POWER 0x00800000 | ||
128 | |||
129 | #define HW_CLKCTRL_CPU (0x00000050) | ||
130 | #define HW_CLKCTRL_CPU_SET (0x00000054) | ||
131 | #define HW_CLKCTRL_CPU_CLR (0x00000058) | ||
132 | #define HW_CLKCTRL_CPU_TOG (0x0000005c) | ||
133 | |||
134 | #define BM_CLKCTRL_CPU_BUSY_REF_XTAL 0x20000000 | ||
135 | #define BM_CLKCTRL_CPU_BUSY_REF_CPU 0x10000000 | ||
136 | #define BM_CLKCTRL_CPU_DIV_XTAL_FRAC_EN 0x04000000 | ||
137 | #define BP_CLKCTRL_CPU_DIV_XTAL 16 | ||
138 | #define BM_CLKCTRL_CPU_DIV_XTAL 0x03FF0000 | ||
139 | #define BF_CLKCTRL_CPU_DIV_XTAL(v) \ | ||
140 | (((v) << 16) & BM_CLKCTRL_CPU_DIV_XTAL) | ||
141 | #define BM_CLKCTRL_CPU_INTERRUPT_WAIT 0x00001000 | ||
142 | #define BM_CLKCTRL_CPU_DIV_CPU_FRAC_EN 0x00000400 | ||
143 | #define BP_CLKCTRL_CPU_DIV_CPU 0 | ||
144 | #define BM_CLKCTRL_CPU_DIV_CPU 0x0000003F | ||
145 | #define BF_CLKCTRL_CPU_DIV_CPU(v) \ | ||
146 | (((v) << 0) & BM_CLKCTRL_CPU_DIV_CPU) | ||
147 | |||
148 | #define HW_CLKCTRL_HBUS (0x00000060) | ||
149 | #define HW_CLKCTRL_HBUS_SET (0x00000064) | ||
150 | #define HW_CLKCTRL_HBUS_CLR (0x00000068) | ||
151 | #define HW_CLKCTRL_HBUS_TOG (0x0000006c) | ||
152 | |||
153 | #define BM_CLKCTRL_HBUS_ASM_BUSY 0x80000000 | ||
154 | #define BM_CLKCTRL_HBUS_DCP_AS_ENABLE 0x40000000 | ||
155 | #define BM_CLKCTRL_HBUS_PXP_AS_ENABLE 0x20000000 | ||
156 | #define BM_CLKCTRL_HBUS_ASM_EMIPORT_AS_ENABLE 0x08000000 | ||
157 | #define BM_CLKCTRL_HBUS_APBHDMA_AS_ENABLE 0x04000000 | ||
158 | #define BM_CLKCTRL_HBUS_APBXDMA_AS_ENABLE 0x02000000 | ||
159 | #define BM_CLKCTRL_HBUS_TRAFFIC_JAM_AS_ENABLE 0x01000000 | ||
160 | #define BM_CLKCTRL_HBUS_TRAFFIC_AS_ENABLE 0x00800000 | ||
161 | #define BM_CLKCTRL_HBUS_CPU_DATA_AS_ENABLE 0x00400000 | ||
162 | #define BM_CLKCTRL_HBUS_CPU_INSTR_AS_ENABLE 0x00200000 | ||
163 | #define BM_CLKCTRL_HBUS_ASM_ENABLE 0x00100000 | ||
164 | #define BM_CLKCTRL_HBUS_AUTO_CLEAR_DIV_ENABLE 0x00080000 | ||
165 | #define BP_CLKCTRL_HBUS_SLOW_DIV 16 | ||
166 | #define BM_CLKCTRL_HBUS_SLOW_DIV 0x00070000 | ||
167 | #define BF_CLKCTRL_HBUS_SLOW_DIV(v) \ | ||
168 | (((v) << 16) & BM_CLKCTRL_HBUS_SLOW_DIV) | ||
169 | #define BV_CLKCTRL_HBUS_SLOW_DIV__BY1 0x0 | ||
170 | #define BV_CLKCTRL_HBUS_SLOW_DIV__BY2 0x1 | ||
171 | #define BV_CLKCTRL_HBUS_SLOW_DIV__BY4 0x2 | ||
172 | #define BV_CLKCTRL_HBUS_SLOW_DIV__BY8 0x3 | ||
173 | #define BV_CLKCTRL_HBUS_SLOW_DIV__BY16 0x4 | ||
174 | #define BV_CLKCTRL_HBUS_SLOW_DIV__BY32 0x5 | ||
175 | #define BM_CLKCTRL_HBUS_DIV_FRAC_EN 0x00000020 | ||
176 | #define BP_CLKCTRL_HBUS_DIV 0 | ||
177 | #define BM_CLKCTRL_HBUS_DIV 0x0000001F | ||
178 | #define BF_CLKCTRL_HBUS_DIV(v) \ | ||
179 | (((v) << 0) & BM_CLKCTRL_HBUS_DIV) | ||
180 | |||
181 | #define HW_CLKCTRL_XBUS (0x00000070) | ||
182 | |||
183 | #define BM_CLKCTRL_XBUS_BUSY 0x80000000 | ||
184 | #define BM_CLKCTRL_XBUS_AUTO_CLEAR_DIV_ENABLE 0x00000800 | ||
185 | #define BM_CLKCTRL_XBUS_DIV_FRAC_EN 0x00000400 | ||
186 | #define BP_CLKCTRL_XBUS_DIV 0 | ||
187 | #define BM_CLKCTRL_XBUS_DIV 0x000003FF | ||
188 | #define BF_CLKCTRL_XBUS_DIV(v) \ | ||
189 | (((v) << 0) & BM_CLKCTRL_XBUS_DIV) | ||
190 | |||
191 | #define HW_CLKCTRL_XTAL (0x00000080) | ||
192 | #define HW_CLKCTRL_XTAL_SET (0x00000084) | ||
193 | #define HW_CLKCTRL_XTAL_CLR (0x00000088) | ||
194 | #define HW_CLKCTRL_XTAL_TOG (0x0000008c) | ||
195 | |||
196 | #define BP_CLKCTRL_XTAL_UART_CLK_GATE 31 | ||
197 | #define BM_CLKCTRL_XTAL_UART_CLK_GATE 0x80000000 | ||
198 | #define BP_CLKCTRL_XTAL_PWM_CLK24M_GATE 29 | ||
199 | #define BM_CLKCTRL_XTAL_PWM_CLK24M_GATE 0x20000000 | ||
200 | #define BP_CLKCTRL_XTAL_TIMROT_CLK32K_GATE 26 | ||
201 | #define BM_CLKCTRL_XTAL_TIMROT_CLK32K_GATE 0x04000000 | ||
202 | #define BP_CLKCTRL_XTAL_DIV_UART 0 | ||
203 | #define BM_CLKCTRL_XTAL_DIV_UART 0x00000003 | ||
204 | #define BF_CLKCTRL_XTAL_DIV_UART(v) \ | ||
205 | (((v) << 0) & BM_CLKCTRL_XTAL_DIV_UART) | ||
206 | |||
207 | #define HW_CLKCTRL_SSP0 (0x00000090) | ||
208 | |||
209 | #define BP_CLKCTRL_SSP0_CLKGATE 31 | ||
210 | #define BM_CLKCTRL_SSP0_CLKGATE 0x80000000 | ||
211 | #define BM_CLKCTRL_SSP0_BUSY 0x20000000 | ||
212 | #define BM_CLKCTRL_SSP0_DIV_FRAC_EN 0x00000200 | ||
213 | #define BP_CLKCTRL_SSP0_DIV 0 | ||
214 | #define BM_CLKCTRL_SSP0_DIV 0x000001FF | ||
215 | #define BF_CLKCTRL_SSP0_DIV(v) \ | ||
216 | (((v) << 0) & BM_CLKCTRL_SSP0_DIV) | ||
217 | |||
218 | #define HW_CLKCTRL_SSP1 (0x000000a0) | ||
219 | |||
220 | #define BP_CLKCTRL_SSP1_CLKGATE 31 | ||
221 | #define BM_CLKCTRL_SSP1_CLKGATE 0x80000000 | ||
222 | #define BM_CLKCTRL_SSP1_BUSY 0x20000000 | ||
223 | #define BM_CLKCTRL_SSP1_DIV_FRAC_EN 0x00000200 | ||
224 | #define BP_CLKCTRL_SSP1_DIV 0 | ||
225 | #define BM_CLKCTRL_SSP1_DIV 0x000001FF | ||
226 | #define BF_CLKCTRL_SSP1_DIV(v) \ | ||
227 | (((v) << 0) & BM_CLKCTRL_SSP1_DIV) | ||
228 | |||
229 | #define HW_CLKCTRL_SSP2 (0x000000b0) | ||
230 | |||
231 | #define BP_CLKCTRL_SSP2_CLKGATE 31 | ||
232 | #define BM_CLKCTRL_SSP2_CLKGATE 0x80000000 | ||
233 | #define BM_CLKCTRL_SSP2_BUSY 0x20000000 | ||
234 | #define BM_CLKCTRL_SSP2_DIV_FRAC_EN 0x00000200 | ||
235 | #define BP_CLKCTRL_SSP2_DIV 0 | ||
236 | #define BM_CLKCTRL_SSP2_DIV 0x000001FF | ||
237 | #define BF_CLKCTRL_SSP2_DIV(v) \ | ||
238 | (((v) << 0) & BM_CLKCTRL_SSP2_DIV) | ||
239 | |||
240 | #define HW_CLKCTRL_SSP3 (0x000000c0) | ||
241 | |||
242 | #define BP_CLKCTRL_SSP3_CLKGATE 31 | ||
243 | #define BM_CLKCTRL_SSP3_CLKGATE 0x80000000 | ||
244 | #define BM_CLKCTRL_SSP3_BUSY 0x20000000 | ||
245 | #define BM_CLKCTRL_SSP3_DIV_FRAC_EN 0x00000200 | ||
246 | #define BP_CLKCTRL_SSP3_DIV 0 | ||
247 | #define BM_CLKCTRL_SSP3_DIV 0x000001FF | ||
248 | #define BF_CLKCTRL_SSP3_DIV(v) \ | ||
249 | (((v) << 0) & BM_CLKCTRL_SSP3_DIV) | ||
250 | |||
251 | #define HW_CLKCTRL_GPMI (0x000000d0) | ||
252 | |||
253 | #define BP_CLKCTRL_GPMI_CLKGATE 31 | ||
254 | #define BM_CLKCTRL_GPMI_CLKGATE 0x80000000 | ||
255 | #define BM_CLKCTRL_GPMI_BUSY 0x20000000 | ||
256 | #define BM_CLKCTRL_GPMI_DIV_FRAC_EN 0x00000400 | ||
257 | #define BP_CLKCTRL_GPMI_DIV 0 | ||
258 | #define BM_CLKCTRL_GPMI_DIV 0x000003FF | ||
259 | #define BF_CLKCTRL_GPMI_DIV(v) \ | ||
260 | (((v) << 0) & BM_CLKCTRL_GPMI_DIV) | ||
261 | |||
262 | #define HW_CLKCTRL_SPDIF (0x000000e0) | ||
263 | |||
264 | #define BP_CLKCTRL_SPDIF_CLKGATE 31 | ||
265 | #define BM_CLKCTRL_SPDIF_CLKGATE 0x80000000 | ||
266 | |||
267 | #define HW_CLKCTRL_EMI (0x000000f0) | ||
268 | |||
269 | #define BP_CLKCTRL_EMI_CLKGATE 31 | ||
270 | #define BM_CLKCTRL_EMI_CLKGATE 0x80000000 | ||
271 | #define BM_CLKCTRL_EMI_SYNC_MODE_EN 0x40000000 | ||
272 | #define BM_CLKCTRL_EMI_BUSY_REF_XTAL 0x20000000 | ||
273 | #define BM_CLKCTRL_EMI_BUSY_REF_EMI 0x10000000 | ||
274 | #define BM_CLKCTRL_EMI_BUSY_REF_CPU 0x08000000 | ||
275 | #define BM_CLKCTRL_EMI_BUSY_SYNC_MODE 0x04000000 | ||
276 | #define BM_CLKCTRL_EMI_BUSY_DCC_RESYNC 0x00020000 | ||
277 | #define BM_CLKCTRL_EMI_DCC_RESYNC_ENABLE 0x00010000 | ||
278 | #define BP_CLKCTRL_EMI_DIV_XTAL 8 | ||
279 | #define BM_CLKCTRL_EMI_DIV_XTAL 0x00000F00 | ||
280 | #define BF_CLKCTRL_EMI_DIV_XTAL(v) \ | ||
281 | (((v) << 8) & BM_CLKCTRL_EMI_DIV_XTAL) | ||
282 | #define BP_CLKCTRL_EMI_DIV_EMI 0 | ||
283 | #define BM_CLKCTRL_EMI_DIV_EMI 0x0000003F | ||
284 | #define BF_CLKCTRL_EMI_DIV_EMI(v) \ | ||
285 | (((v) << 0) & BM_CLKCTRL_EMI_DIV_EMI) | ||
286 | |||
287 | #define HW_CLKCTRL_SAIF0 (0x00000100) | ||
288 | |||
289 | #define BP_CLKCTRL_SAIF0_CLKGATE 31 | ||
290 | #define BM_CLKCTRL_SAIF0_CLKGATE 0x80000000 | ||
291 | #define BM_CLKCTRL_SAIF0_BUSY 0x20000000 | ||
292 | #define BM_CLKCTRL_SAIF0_DIV_FRAC_EN 0x00010000 | ||
293 | #define BP_CLKCTRL_SAIF0_DIV 0 | ||
294 | #define BM_CLKCTRL_SAIF0_DIV 0x0000FFFF | ||
295 | #define BF_CLKCTRL_SAIF0_DIV(v) \ | ||
296 | (((v) << 0) & BM_CLKCTRL_SAIF0_DIV) | ||
297 | |||
298 | #define HW_CLKCTRL_SAIF1 (0x00000110) | ||
299 | |||
300 | #define BP_CLKCTRL_SAIF1_CLKGATE 31 | ||
301 | #define BM_CLKCTRL_SAIF1_CLKGATE 0x80000000 | ||
302 | #define BM_CLKCTRL_SAIF1_BUSY 0x20000000 | ||
303 | #define BM_CLKCTRL_SAIF1_DIV_FRAC_EN 0x00010000 | ||
304 | #define BP_CLKCTRL_SAIF1_DIV 0 | ||
305 | #define BM_CLKCTRL_SAIF1_DIV 0x0000FFFF | ||
306 | #define BF_CLKCTRL_SAIF1_DIV(v) \ | ||
307 | (((v) << 0) & BM_CLKCTRL_SAIF1_DIV) | ||
308 | |||
309 | #define HW_CLKCTRL_DIS_LCDIF (0x00000120) | ||
310 | |||
311 | #define BP_CLKCTRL_DIS_LCDIF_CLKGATE 31 | ||
312 | #define BM_CLKCTRL_DIS_LCDIF_CLKGATE 0x80000000 | ||
313 | #define BM_CLKCTRL_DIS_LCDIF_BUSY 0x20000000 | ||
314 | #define BM_CLKCTRL_DIS_LCDIF_DIV_FRAC_EN 0x00002000 | ||
315 | #define BP_CLKCTRL_DIS_LCDIF_DIV 0 | ||
316 | #define BM_CLKCTRL_DIS_LCDIF_DIV 0x00001FFF | ||
317 | #define BF_CLKCTRL_DIS_LCDIF_DIV(v) \ | ||
318 | (((v) << 0) & BM_CLKCTRL_DIS_LCDIF_DIV) | ||
319 | |||
320 | #define HW_CLKCTRL_ETM (0x00000130) | ||
321 | |||
322 | #define BM_CLKCTRL_ETM_CLKGATE 0x80000000 | ||
323 | #define BM_CLKCTRL_ETM_BUSY 0x20000000 | ||
324 | #define BM_CLKCTRL_ETM_DIV_FRAC_EN 0x00000080 | ||
325 | #define BP_CLKCTRL_ETM_DIV 0 | ||
326 | #define BM_CLKCTRL_ETM_DIV 0x0000007F | ||
327 | #define BF_CLKCTRL_ETM_DIV(v) \ | ||
328 | (((v) << 0) & BM_CLKCTRL_ETM_DIV) | ||
329 | |||
330 | #define HW_CLKCTRL_ENET (0x00000140) | ||
331 | |||
332 | #define BM_CLKCTRL_ENET_SLEEP 0x80000000 | ||
333 | #define BP_CLKCTRL_ENET_DISABLE 30 | ||
334 | #define BM_CLKCTRL_ENET_DISABLE 0x40000000 | ||
335 | #define BM_CLKCTRL_ENET_STATUS 0x20000000 | ||
336 | #define BM_CLKCTRL_ENET_BUSY_TIME 0x08000000 | ||
337 | #define BP_CLKCTRL_ENET_DIV_TIME 21 | ||
338 | #define BM_CLKCTRL_ENET_DIV_TIME 0x07E00000 | ||
339 | #define BF_CLKCTRL_ENET_DIV_TIME(v) \ | ||
340 | (((v) << 21) & BM_CLKCTRL_ENET_DIV_TIME) | ||
341 | #define BM_CLKCTRL_ENET_BUSY 0x08000000 | ||
342 | #define BP_CLKCTRL_ENET_DIV 21 | ||
343 | #define BM_CLKCTRL_ENET_DIV 0x07E00000 | ||
344 | #define BF_CLKCTRL_ENET_DIV(v) \ | ||
345 | (((v) << 21) & BM_CLKCTRL_ENET_DIV) | ||
346 | #define BP_CLKCTRL_ENET_TIME_SEL 19 | ||
347 | #define BM_CLKCTRL_ENET_TIME_SEL 0x00180000 | ||
348 | #define BF_CLKCTRL_ENET_TIME_SEL(v) \ | ||
349 | (((v) << 19) & BM_CLKCTRL_ENET_TIME_SEL) | ||
350 | #define BV_CLKCTRL_ENET_TIME_SEL__XTAL 0x0 | ||
351 | #define BV_CLKCTRL_ENET_TIME_SEL__PLL 0x1 | ||
352 | #define BV_CLKCTRL_ENET_TIME_SEL__RMII_CLK 0x2 | ||
353 | #define BV_CLKCTRL_ENET_TIME_SEL__UNDEFINED 0x3 | ||
354 | #define BM_CLKCTRL_ENET_CLK_OUT_EN 0x00040000 | ||
355 | #define BM_CLKCTRL_ENET_RESET_BY_SW_CHIP 0x00020000 | ||
356 | #define BM_CLKCTRL_ENET_RESET_BY_SW 0x00010000 | ||
357 | |||
358 | #define HW_CLKCTRL_HSADC (0x00000150) | ||
359 | |||
360 | #define BM_CLKCTRL_HSADC_RESETB 0x40000000 | ||
361 | #define BP_CLKCTRL_HSADC_FREQDIV 28 | ||
362 | #define BM_CLKCTRL_HSADC_FREQDIV 0x30000000 | ||
363 | #define BF_CLKCTRL_HSADC_FREQDIV(v) \ | ||
364 | (((v) << 28) & BM_CLKCTRL_HSADC_FREQDIV) | ||
365 | |||
366 | #define HW_CLKCTRL_FLEXCAN (0x00000160) | ||
367 | |||
368 | #define BP_CLKCTRL_FLEXCAN_STOP_CAN0 30 | ||
369 | #define BM_CLKCTRL_FLEXCAN_STOP_CAN0 0x40000000 | ||
370 | #define BM_CLKCTRL_FLEXCAN_CAN0_STATUS 0x20000000 | ||
371 | #define BP_CLKCTRL_FLEXCAN_STOP_CAN1 28 | ||
372 | #define BM_CLKCTRL_FLEXCAN_STOP_CAN1 0x10000000 | ||
373 | #define BM_CLKCTRL_FLEXCAN_CAN1_STATUS 0x08000000 | ||
374 | |||
375 | #define HW_CLKCTRL_FRAC0 (0x000001b0) | ||
376 | #define HW_CLKCTRL_FRAC0_SET (0x000001b4) | ||
377 | #define HW_CLKCTRL_FRAC0_CLR (0x000001b8) | ||
378 | #define HW_CLKCTRL_FRAC0_TOG (0x000001bc) | ||
379 | |||
380 | #define BP_CLKCTRL_FRAC0_CLKGATEIO0 31 | ||
381 | #define BM_CLKCTRL_FRAC0_CLKGATEIO0 0x80000000 | ||
382 | #define BM_CLKCTRL_FRAC0_IO0_STABLE 0x40000000 | ||
383 | #define BP_CLKCTRL_FRAC0_IO0FRAC 24 | ||
384 | #define BM_CLKCTRL_FRAC0_IO0FRAC 0x3F000000 | ||
385 | #define BF_CLKCTRL_FRAC0_IO0FRAC(v) \ | ||
386 | (((v) << 24) & BM_CLKCTRL_FRAC0_IO0FRAC) | ||
387 | #define BP_CLKCTRL_FRAC0_CLKGATEIO1 23 | ||
388 | #define BM_CLKCTRL_FRAC0_CLKGATEIO1 0x00800000 | ||
389 | #define BM_CLKCTRL_FRAC0_IO1_STABLE 0x00400000 | ||
390 | #define BP_CLKCTRL_FRAC0_IO1FRAC 16 | ||
391 | #define BM_CLKCTRL_FRAC0_IO1FRAC 0x003F0000 | ||
392 | #define BF_CLKCTRL_FRAC0_IO1FRAC(v) \ | ||
393 | (((v) << 16) & BM_CLKCTRL_FRAC0_IO1FRAC) | ||
394 | #define BP_CLKCTRL_FRAC0_CLKGATEEMI 15 | ||
395 | #define BM_CLKCTRL_FRAC0_CLKGATEEMI 0x00008000 | ||
396 | #define BM_CLKCTRL_FRAC0_EMI_STABLE 0x00004000 | ||
397 | #define BP_CLKCTRL_FRAC0_EMIFRAC 8 | ||
398 | #define BM_CLKCTRL_FRAC0_EMIFRAC 0x00003F00 | ||
399 | #define BF_CLKCTRL_FRAC0_EMIFRAC(v) \ | ||
400 | (((v) << 8) & BM_CLKCTRL_FRAC0_EMIFRAC) | ||
401 | #define BP_CLKCTRL_FRAC0_CLKGATECPU 7 | ||
402 | #define BM_CLKCTRL_FRAC0_CLKGATECPU 0x00000080 | ||
403 | #define BM_CLKCTRL_FRAC0_CPU_STABLE 0x00000040 | ||
404 | #define BP_CLKCTRL_FRAC0_CPUFRAC 0 | ||
405 | #define BM_CLKCTRL_FRAC0_CPUFRAC 0x0000003F | ||
406 | #define BF_CLKCTRL_FRAC0_CPUFRAC(v) \ | ||
407 | (((v) << 0) & BM_CLKCTRL_FRAC0_CPUFRAC) | ||
408 | |||
409 | #define HW_CLKCTRL_FRAC1 (0x000001c0) | ||
410 | #define HW_CLKCTRL_FRAC1_SET (0x000001c4) | ||
411 | #define HW_CLKCTRL_FRAC1_CLR (0x000001c8) | ||
412 | #define HW_CLKCTRL_FRAC1_TOG (0x000001cc) | ||
413 | |||
414 | #define BP_CLKCTRL_FRAC1_CLKGATEGPMI 23 | ||
415 | #define BM_CLKCTRL_FRAC1_CLKGATEGPMI 0x00800000 | ||
416 | #define BM_CLKCTRL_FRAC1_GPMI_STABLE 0x00400000 | ||
417 | #define BP_CLKCTRL_FRAC1_GPMIFRAC 16 | ||
418 | #define BM_CLKCTRL_FRAC1_GPMIFRAC 0x003F0000 | ||
419 | #define BF_CLKCTRL_FRAC1_GPMIFRAC(v) \ | ||
420 | (((v) << 16) & BM_CLKCTRL_FRAC1_GPMIFRAC) | ||
421 | #define BP_CLKCTRL_FRAC1_CLKGATEHSADC 15 | ||
422 | #define BM_CLKCTRL_FRAC1_CLKGATEHSADC 0x00008000 | ||
423 | #define BM_CLKCTRL_FRAC1_HSADC_STABLE 0x00004000 | ||
424 | #define BP_CLKCTRL_FRAC1_HSADCFRAC 8 | ||
425 | #define BM_CLKCTRL_FRAC1_HSADCFRAC 0x00003F00 | ||
426 | #define BF_CLKCTRL_FRAC1_HSADCFRAC(v) \ | ||
427 | (((v) << 8) & BM_CLKCTRL_FRAC1_HSADCFRAC) | ||
428 | #define BP_CLKCTRL_FRAC1_CLKGATEPIX 7 | ||
429 | #define BM_CLKCTRL_FRAC1_CLKGATEPIX 0x00000080 | ||
430 | #define BM_CLKCTRL_FRAC1_PIX_STABLE 0x00000040 | ||
431 | #define BP_CLKCTRL_FRAC1_PIXFRAC 0 | ||
432 | #define BM_CLKCTRL_FRAC1_PIXFRAC 0x0000003F | ||
433 | #define BF_CLKCTRL_FRAC1_PIXFRAC(v) \ | ||
434 | (((v) << 0) & BM_CLKCTRL_FRAC1_PIXFRAC) | ||
435 | |||
436 | #define HW_CLKCTRL_CLKSEQ (0x000001d0) | ||
437 | #define HW_CLKCTRL_CLKSEQ_SET (0x000001d4) | ||
438 | #define HW_CLKCTRL_CLKSEQ_CLR (0x000001d8) | ||
439 | #define HW_CLKCTRL_CLKSEQ_TOG (0x000001dc) | ||
440 | |||
441 | #define BM_CLKCTRL_CLKSEQ_BYPASS_CPU 0x00040000 | ||
442 | #define BM_CLKCTRL_CLKSEQ_BYPASS_DIS_LCDIF 0x00004000 | ||
443 | #define BV_CLKCTRL_CLKSEQ_BYPASS_DIS_LCDIF__BYPASS 0x1 | ||
444 | #define BV_CLKCTRL_CLKSEQ_BYPASS_DIS_LCDIF__PFD 0x0 | ||
445 | #define BM_CLKCTRL_CLKSEQ_BYPASS_ETM 0x00000100 | ||
446 | #define BM_CLKCTRL_CLKSEQ_BYPASS_EMI 0x00000080 | ||
447 | #define BM_CLKCTRL_CLKSEQ_BYPASS_SSP3 0x00000040 | ||
448 | #define BM_CLKCTRL_CLKSEQ_BYPASS_SSP2 0x00000020 | ||
449 | #define BM_CLKCTRL_CLKSEQ_BYPASS_SSP1 0x00000010 | ||
450 | #define BM_CLKCTRL_CLKSEQ_BYPASS_SSP0 0x00000008 | ||
451 | #define BM_CLKCTRL_CLKSEQ_BYPASS_GPMI 0x00000004 | ||
452 | #define BM_CLKCTRL_CLKSEQ_BYPASS_SAIF1 0x00000002 | ||
453 | #define BM_CLKCTRL_CLKSEQ_BYPASS_SAIF0 0x00000001 | ||
454 | |||
455 | #define HW_CLKCTRL_RESET (0x000001e0) | ||
456 | |||
457 | #define BM_CLKCTRL_RESET_WDOG_POR_DISABLE 0x00000020 | ||
458 | #define BM_CLKCTRL_RESET_EXTERNAL_RESET_ENABLE 0x00000010 | ||
459 | #define BM_CLKCTRL_RESET_THERMAL_RESET_ENABLE 0x00000008 | ||
460 | #define BM_CLKCTRL_RESET_THERMAL_RESET_DEFAULT 0x00000004 | ||
461 | #define BM_CLKCTRL_RESET_CHIP 0x00000002 | ||
462 | #define BM_CLKCTRL_RESET_DIG 0x00000001 | ||
463 | |||
464 | #define HW_CLKCTRL_STATUS (0x000001f0) | ||
465 | |||
466 | #define BP_CLKCTRL_STATUS_CPU_LIMIT 30 | ||
467 | #define BM_CLKCTRL_STATUS_CPU_LIMIT 0xC0000000 | ||
468 | #define BF_CLKCTRL_STATUS_CPU_LIMIT(v) \ | ||
469 | (((v) << 30) & BM_CLKCTRL_STATUS_CPU_LIMIT) | ||
470 | |||
471 | #define HW_CLKCTRL_VERSION (0x00000200) | ||
472 | |||
473 | #define BP_CLKCTRL_VERSION_MAJOR 24 | ||
474 | #define BM_CLKCTRL_VERSION_MAJOR 0xFF000000 | ||
475 | #define BF_CLKCTRL_VERSION_MAJOR(v) \ | ||
476 | (((v) << 24) & BM_CLKCTRL_VERSION_MAJOR) | ||
477 | #define BP_CLKCTRL_VERSION_MINOR 16 | ||
478 | #define BM_CLKCTRL_VERSION_MINOR 0x00FF0000 | ||
479 | #define BF_CLKCTRL_VERSION_MINOR(v) \ | ||
480 | (((v) << 16) & BM_CLKCTRL_VERSION_MINOR) | ||
481 | #define BP_CLKCTRL_VERSION_STEP 0 | ||
482 | #define BM_CLKCTRL_VERSION_STEP 0x0000FFFF | ||
483 | #define BF_CLKCTRL_VERSION_STEP(v) \ | ||
484 | (((v) << 0) & BM_CLKCTRL_VERSION_STEP) | ||
485 | |||
486 | #endif /* __REGS_CLKCTRL_MX28_H__ */ | ||
diff --git a/arch/arm/mach-mxs/system.c b/arch/arm/mach-mxs/system.c index 80ac1fca8a00..30042e23bfa7 100644 --- a/arch/arm/mach-mxs/system.c +++ b/arch/arm/mach-mxs/system.c | |||
@@ -37,8 +37,6 @@ | |||
37 | #define MXS_MODULE_CLKGATE (1 << 30) | 37 | #define MXS_MODULE_CLKGATE (1 << 30) |
38 | #define MXS_MODULE_SFTRST (1 << 31) | 38 | #define MXS_MODULE_SFTRST (1 << 31) |
39 | 39 | ||
40 | #define CLKCTRL_TIMEOUT 10 /* 10 ms */ | ||
41 | |||
42 | static void __iomem *mxs_clkctrl_reset_addr; | 40 | static void __iomem *mxs_clkctrl_reset_addr; |
43 | 41 | ||
44 | /* | 42 | /* |
@@ -139,17 +137,3 @@ error: | |||
139 | return -ETIMEDOUT; | 137 | return -ETIMEDOUT; |
140 | } | 138 | } |
141 | EXPORT_SYMBOL(mxs_reset_block); | 139 | EXPORT_SYMBOL(mxs_reset_block); |
142 | |||
143 | int mxs_clkctrl_timeout(unsigned int reg_offset, unsigned int mask) | ||
144 | { | ||
145 | unsigned long timeout = jiffies + msecs_to_jiffies(CLKCTRL_TIMEOUT); | ||
146 | while (readl_relaxed(MXS_IO_ADDRESS(MXS_CLKCTRL_BASE_ADDR) | ||
147 | + reg_offset) & mask) { | ||
148 | if (time_after(jiffies, timeout)) { | ||
149 | pr_err("Timeout at CLKCTRL + 0x%x\n", reg_offset); | ||
150 | return -ETIMEDOUT; | ||
151 | } | ||
152 | } | ||
153 | |||
154 | return 0; | ||
155 | } | ||
diff --git a/arch/arm/mach-mxs/timer.c b/arch/arm/mach-mxs/timer.c index 564a63279f18..02d36de9c4e8 100644 --- a/arch/arm/mach-mxs/timer.c +++ b/arch/arm/mach-mxs/timer.c | |||
@@ -20,6 +20,7 @@ | |||
20 | * MA 02110-1301, USA. | 20 | * MA 02110-1301, USA. |
21 | */ | 21 | */ |
22 | 22 | ||
23 | #include <linux/err.h> | ||
23 | #include <linux/interrupt.h> | 24 | #include <linux/interrupt.h> |
24 | #include <linux/irq.h> | 25 | #include <linux/irq.h> |
25 | #include <linux/clockchips.h> | 26 | #include <linux/clockchips.h> |
@@ -243,8 +244,16 @@ static int __init mxs_clocksource_init(struct clk *timer_clk) | |||
243 | return 0; | 244 | return 0; |
244 | } | 245 | } |
245 | 246 | ||
246 | void __init mxs_timer_init(struct clk *timer_clk, int irq) | 247 | void __init mxs_timer_init(int irq) |
247 | { | 248 | { |
249 | struct clk *timer_clk; | ||
250 | |||
251 | timer_clk = clk_get_sys("timrot", NULL); | ||
252 | if (IS_ERR(timer_clk)) { | ||
253 | pr_err("%s: failed to get clk\n", __func__); | ||
254 | return; | ||
255 | } | ||
256 | |||
248 | clk_prepare_enable(timer_clk); | 257 | clk_prepare_enable(timer_clk); |
249 | 258 | ||
250 | /* | 259 | /* |
diff --git a/arch/arm/mach-omap1/board-ams-delta.c b/arch/arm/mach-omap1/board-ams-delta.c index c1b681ef4cba..f2f8a5847018 100644 --- a/arch/arm/mach-omap1/board-ams-delta.c +++ b/arch/arm/mach-omap1/board-ams-delta.c | |||
@@ -595,7 +595,12 @@ gpio_free: | |||
595 | gpio_free(AMS_DELTA_GPIO_PIN_MODEM_IRQ); | 595 | gpio_free(AMS_DELTA_GPIO_PIN_MODEM_IRQ); |
596 | return err; | 596 | return err; |
597 | } | 597 | } |
598 | late_initcall(late_init); | 598 | |
599 | static void __init ams_delta_init_late(void) | ||
600 | { | ||
601 | omap1_init_late(); | ||
602 | late_init(); | ||
603 | } | ||
599 | 604 | ||
600 | static void __init ams_delta_map_io(void) | 605 | static void __init ams_delta_map_io(void) |
601 | { | 606 | { |
@@ -611,6 +616,7 @@ MACHINE_START(AMS_DELTA, "Amstrad E3 (Delta)") | |||
611 | .reserve = omap_reserve, | 616 | .reserve = omap_reserve, |
612 | .init_irq = omap1_init_irq, | 617 | .init_irq = omap1_init_irq, |
613 | .init_machine = ams_delta_init, | 618 | .init_machine = ams_delta_init, |
619 | .init_late = ams_delta_init_late, | ||
614 | .timer = &omap1_timer, | 620 | .timer = &omap1_timer, |
615 | .restart = omap1_restart, | 621 | .restart = omap1_restart, |
616 | MACHINE_END | 622 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/board-fsample.c b/arch/arm/mach-omap1/board-fsample.c index 4a4afb371022..c7364fdbda05 100644 --- a/arch/arm/mach-omap1/board-fsample.c +++ b/arch/arm/mach-omap1/board-fsample.c | |||
@@ -369,6 +369,7 @@ MACHINE_START(OMAP_FSAMPLE, "OMAP730 F-Sample") | |||
369 | .reserve = omap_reserve, | 369 | .reserve = omap_reserve, |
370 | .init_irq = omap1_init_irq, | 370 | .init_irq = omap1_init_irq, |
371 | .init_machine = omap_fsample_init, | 371 | .init_machine = omap_fsample_init, |
372 | .init_late = omap1_init_late, | ||
372 | .timer = &omap1_timer, | 373 | .timer = &omap1_timer, |
373 | .restart = omap1_restart, | 374 | .restart = omap1_restart, |
374 | MACHINE_END | 375 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/board-generic.c b/arch/arm/mach-omap1/board-generic.c index 9a5fe581bc1c..e75e2d55a2d7 100644 --- a/arch/arm/mach-omap1/board-generic.c +++ b/arch/arm/mach-omap1/board-generic.c | |||
@@ -88,6 +88,7 @@ MACHINE_START(OMAP_GENERIC, "Generic OMAP1510/1610/1710") | |||
88 | .reserve = omap_reserve, | 88 | .reserve = omap_reserve, |
89 | .init_irq = omap1_init_irq, | 89 | .init_irq = omap1_init_irq, |
90 | .init_machine = omap_generic_init, | 90 | .init_machine = omap_generic_init, |
91 | .init_late = omap1_init_late, | ||
91 | .timer = &omap1_timer, | 92 | .timer = &omap1_timer, |
92 | .restart = omap1_restart, | 93 | .restart = omap1_restart, |
93 | MACHINE_END | 94 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/board-h2.c b/arch/arm/mach-omap1/board-h2.c index 057ec13f0649..7e503686f7af 100644 --- a/arch/arm/mach-omap1/board-h2.c +++ b/arch/arm/mach-omap1/board-h2.c | |||
@@ -431,6 +431,7 @@ MACHINE_START(OMAP_H2, "TI-H2") | |||
431 | .reserve = omap_reserve, | 431 | .reserve = omap_reserve, |
432 | .init_irq = omap1_init_irq, | 432 | .init_irq = omap1_init_irq, |
433 | .init_machine = h2_init, | 433 | .init_machine = h2_init, |
434 | .init_late = omap1_init_late, | ||
434 | .timer = &omap1_timer, | 435 | .timer = &omap1_timer, |
435 | .restart = omap1_restart, | 436 | .restart = omap1_restart, |
436 | MACHINE_END | 437 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/board-h3.c b/arch/arm/mach-omap1/board-h3.c index f6ddf8759657..9fb03f189d93 100644 --- a/arch/arm/mach-omap1/board-h3.c +++ b/arch/arm/mach-omap1/board-h3.c | |||
@@ -425,6 +425,7 @@ MACHINE_START(OMAP_H3, "TI OMAP1710 H3 board") | |||
425 | .reserve = omap_reserve, | 425 | .reserve = omap_reserve, |
426 | .init_irq = omap1_init_irq, | 426 | .init_irq = omap1_init_irq, |
427 | .init_machine = h3_init, | 427 | .init_machine = h3_init, |
428 | .init_late = omap1_init_late, | ||
428 | .timer = &omap1_timer, | 429 | .timer = &omap1_timer, |
429 | .restart = omap1_restart, | 430 | .restart = omap1_restart, |
430 | MACHINE_END | 431 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/board-htcherald.c b/arch/arm/mach-omap1/board-htcherald.c index 60c06ee23855..118a9d4a4c54 100644 --- a/arch/arm/mach-omap1/board-htcherald.c +++ b/arch/arm/mach-omap1/board-htcherald.c | |||
@@ -605,6 +605,7 @@ MACHINE_START(HERALD, "HTC Herald") | |||
605 | .reserve = omap_reserve, | 605 | .reserve = omap_reserve, |
606 | .init_irq = omap1_init_irq, | 606 | .init_irq = omap1_init_irq, |
607 | .init_machine = htcherald_init, | 607 | .init_machine = htcherald_init, |
608 | .init_late = omap1_init_late, | ||
608 | .timer = &omap1_timer, | 609 | .timer = &omap1_timer, |
609 | .restart = omap1_restart, | 610 | .restart = omap1_restart, |
610 | MACHINE_END | 611 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/board-innovator.c b/arch/arm/mach-omap1/board-innovator.c index 67d7fd57a692..7970223a559d 100644 --- a/arch/arm/mach-omap1/board-innovator.c +++ b/arch/arm/mach-omap1/board-innovator.c | |||
@@ -457,6 +457,7 @@ MACHINE_START(OMAP_INNOVATOR, "TI-Innovator") | |||
457 | .reserve = omap_reserve, | 457 | .reserve = omap_reserve, |
458 | .init_irq = omap1_init_irq, | 458 | .init_irq = omap1_init_irq, |
459 | .init_machine = innovator_init, | 459 | .init_machine = innovator_init, |
460 | .init_late = omap1_init_late, | ||
460 | .timer = &omap1_timer, | 461 | .timer = &omap1_timer, |
461 | .restart = omap1_restart, | 462 | .restart = omap1_restart, |
462 | MACHINE_END | 463 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/board-nokia770.c b/arch/arm/mach-omap1/board-nokia770.c index d21dcc2fbc5a..7212ae97f44a 100644 --- a/arch/arm/mach-omap1/board-nokia770.c +++ b/arch/arm/mach-omap1/board-nokia770.c | |||
@@ -255,6 +255,7 @@ MACHINE_START(NOKIA770, "Nokia 770") | |||
255 | .reserve = omap_reserve, | 255 | .reserve = omap_reserve, |
256 | .init_irq = omap1_init_irq, | 256 | .init_irq = omap1_init_irq, |
257 | .init_machine = omap_nokia770_init, | 257 | .init_machine = omap_nokia770_init, |
258 | .init_late = omap1_init_late, | ||
258 | .timer = &omap1_timer, | 259 | .timer = &omap1_timer, |
259 | .restart = omap1_restart, | 260 | .restart = omap1_restart, |
260 | MACHINE_END | 261 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/board-osk.c b/arch/arm/mach-omap1/board-osk.c index a5f85dda3f69..da8d872d3d1c 100644 --- a/arch/arm/mach-omap1/board-osk.c +++ b/arch/arm/mach-omap1/board-osk.c | |||
@@ -574,6 +574,7 @@ MACHINE_START(OMAP_OSK, "TI-OSK") | |||
574 | .reserve = omap_reserve, | 574 | .reserve = omap_reserve, |
575 | .init_irq = omap1_init_irq, | 575 | .init_irq = omap1_init_irq, |
576 | .init_machine = osk_init, | 576 | .init_machine = osk_init, |
577 | .init_late = omap1_init_late, | ||
577 | .timer = &omap1_timer, | 578 | .timer = &omap1_timer, |
578 | .restart = omap1_restart, | 579 | .restart = omap1_restart, |
579 | MACHINE_END | 580 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/board-palmte.c b/arch/arm/mach-omap1/board-palmte.c index a60e6c22f816..949b62a73693 100644 --- a/arch/arm/mach-omap1/board-palmte.c +++ b/arch/arm/mach-omap1/board-palmte.c | |||
@@ -267,6 +267,7 @@ MACHINE_START(OMAP_PALMTE, "OMAP310 based Palm Tungsten E") | |||
267 | .reserve = omap_reserve, | 267 | .reserve = omap_reserve, |
268 | .init_irq = omap1_init_irq, | 268 | .init_irq = omap1_init_irq, |
269 | .init_machine = omap_palmte_init, | 269 | .init_machine = omap_palmte_init, |
270 | .init_late = omap1_init_late, | ||
270 | .timer = &omap1_timer, | 271 | .timer = &omap1_timer, |
271 | .restart = omap1_restart, | 272 | .restart = omap1_restart, |
272 | MACHINE_END | 273 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/board-palmtt.c b/arch/arm/mach-omap1/board-palmtt.c index 8d854878547b..7f1e1cf2bf46 100644 --- a/arch/arm/mach-omap1/board-palmtt.c +++ b/arch/arm/mach-omap1/board-palmtt.c | |||
@@ -313,6 +313,7 @@ MACHINE_START(OMAP_PALMTT, "OMAP1510 based Palm Tungsten|T") | |||
313 | .reserve = omap_reserve, | 313 | .reserve = omap_reserve, |
314 | .init_irq = omap1_init_irq, | 314 | .init_irq = omap1_init_irq, |
315 | .init_machine = omap_palmtt_init, | 315 | .init_machine = omap_palmtt_init, |
316 | .init_late = omap1_init_late, | ||
316 | .timer = &omap1_timer, | 317 | .timer = &omap1_timer, |
317 | .restart = omap1_restart, | 318 | .restart = omap1_restart, |
318 | MACHINE_END | 319 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/board-palmz71.c b/arch/arm/mach-omap1/board-palmz71.c index 61ed4f0247ce..3c71c6bace2c 100644 --- a/arch/arm/mach-omap1/board-palmz71.c +++ b/arch/arm/mach-omap1/board-palmz71.c | |||
@@ -330,6 +330,7 @@ MACHINE_START(OMAP_PALMZ71, "OMAP310 based Palm Zire71") | |||
330 | .reserve = omap_reserve, | 330 | .reserve = omap_reserve, |
331 | .init_irq = omap1_init_irq, | 331 | .init_irq = omap1_init_irq, |
332 | .init_machine = omap_palmz71_init, | 332 | .init_machine = omap_palmz71_init, |
333 | .init_late = omap1_init_late, | ||
333 | .timer = &omap1_timer, | 334 | .timer = &omap1_timer, |
334 | .restart = omap1_restart, | 335 | .restart = omap1_restart, |
335 | MACHINE_END | 336 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/board-perseus2.c b/arch/arm/mach-omap1/board-perseus2.c index a2c88890e767..f2cb24387c22 100644 --- a/arch/arm/mach-omap1/board-perseus2.c +++ b/arch/arm/mach-omap1/board-perseus2.c | |||
@@ -331,6 +331,7 @@ MACHINE_START(OMAP_PERSEUS2, "OMAP730 Perseus2") | |||
331 | .reserve = omap_reserve, | 331 | .reserve = omap_reserve, |
332 | .init_irq = omap1_init_irq, | 332 | .init_irq = omap1_init_irq, |
333 | .init_machine = omap_perseus2_init, | 333 | .init_machine = omap_perseus2_init, |
334 | .init_late = omap1_init_late, | ||
334 | .timer = &omap1_timer, | 335 | .timer = &omap1_timer, |
335 | .restart = omap1_restart, | 336 | .restart = omap1_restart, |
336 | MACHINE_END | 337 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/board-sx1.c b/arch/arm/mach-omap1/board-sx1.c index f34cb74a9f41..3b7b82b13684 100644 --- a/arch/arm/mach-omap1/board-sx1.c +++ b/arch/arm/mach-omap1/board-sx1.c | |||
@@ -407,6 +407,7 @@ MACHINE_START(SX1, "OMAP310 based Siemens SX1") | |||
407 | .reserve = omap_reserve, | 407 | .reserve = omap_reserve, |
408 | .init_irq = omap1_init_irq, | 408 | .init_irq = omap1_init_irq, |
409 | .init_machine = omap_sx1_init, | 409 | .init_machine = omap_sx1_init, |
410 | .init_late = omap1_init_late, | ||
410 | .timer = &omap1_timer, | 411 | .timer = &omap1_timer, |
411 | .restart = omap1_restart, | 412 | .restart = omap1_restart, |
412 | MACHINE_END | 413 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/board-voiceblue.c b/arch/arm/mach-omap1/board-voiceblue.c index 37232d04233f..afd67f0ec495 100644 --- a/arch/arm/mach-omap1/board-voiceblue.c +++ b/arch/arm/mach-omap1/board-voiceblue.c | |||
@@ -294,6 +294,7 @@ MACHINE_START(VOICEBLUE, "VoiceBlue OMAP5910") | |||
294 | .reserve = omap_reserve, | 294 | .reserve = omap_reserve, |
295 | .init_irq = omap1_init_irq, | 295 | .init_irq = omap1_init_irq, |
296 | .init_machine = voiceblue_init, | 296 | .init_machine = voiceblue_init, |
297 | .init_late = omap1_init_late, | ||
297 | .timer = &omap1_timer, | 298 | .timer = &omap1_timer, |
298 | .restart = voiceblue_restart, | 299 | .restart = voiceblue_restart, |
299 | MACHINE_END | 300 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/common.h b/arch/arm/mach-omap1/common.h index bb7779b57795..c2552b24f9f2 100644 --- a/arch/arm/mach-omap1/common.h +++ b/arch/arm/mach-omap1/common.h | |||
@@ -53,8 +53,18 @@ static inline void omap16xx_map_io(void) | |||
53 | } | 53 | } |
54 | #endif | 54 | #endif |
55 | 55 | ||
56 | #ifdef CONFIG_OMAP_SERIAL_WAKE | ||
57 | int omap_serial_wakeup_init(void); | ||
58 | #else | ||
59 | static inline int omap_serial_wakeup_init(void) | ||
60 | { | ||
61 | return 0; | ||
62 | } | ||
63 | #endif | ||
64 | |||
56 | void omap1_init_early(void); | 65 | void omap1_init_early(void); |
57 | void omap1_init_irq(void); | 66 | void omap1_init_irq(void); |
67 | void omap1_init_late(void); | ||
58 | void omap1_restart(char, const char *); | 68 | void omap1_restart(char, const char *); |
59 | 69 | ||
60 | extern void __init omap_check_revision(void); | 70 | extern void __init omap_check_revision(void); |
@@ -63,7 +73,14 @@ extern void omap1_nand_cmd_ctl(struct mtd_info *mtd, int cmd, | |||
63 | unsigned int ctrl); | 73 | unsigned int ctrl); |
64 | 74 | ||
65 | extern struct sys_timer omap1_timer; | 75 | extern struct sys_timer omap1_timer; |
66 | extern bool omap_32k_timer_init(void); | 76 | #ifdef CONFIG_OMAP_32K_TIMER |
77 | extern int omap_32k_timer_init(void); | ||
78 | #else | ||
79 | static inline int __init omap_32k_timer_init(void) | ||
80 | { | ||
81 | return -ENODEV; | ||
82 | } | ||
83 | #endif | ||
67 | 84 | ||
68 | extern u32 omap_irq_flags; | 85 | extern u32 omap_irq_flags; |
69 | 86 | ||
diff --git a/arch/arm/mach-omap1/devices.c b/arch/arm/mach-omap1/devices.c index dcd8ddbec2bb..fa1fa4deb6aa 100644 --- a/arch/arm/mach-omap1/devices.c +++ b/arch/arm/mach-omap1/devices.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <plat/tc.h> | 22 | #include <plat/tc.h> |
23 | #include <plat/board.h> | 23 | #include <plat/board.h> |
24 | #include <plat/mux.h> | 24 | #include <plat/mux.h> |
25 | #include <plat/dma.h> | ||
25 | #include <plat/mmc.h> | 26 | #include <plat/mmc.h> |
26 | #include <plat/omap7xx.h> | 27 | #include <plat/omap7xx.h> |
27 | 28 | ||
@@ -31,6 +32,22 @@ | |||
31 | #include "common.h" | 32 | #include "common.h" |
32 | #include "clock.h" | 33 | #include "clock.h" |
33 | 34 | ||
35 | #if defined(CONFIG_SND_SOC) || defined(CONFIG_SND_SOC_MODULE) | ||
36 | |||
37 | static struct platform_device omap_pcm = { | ||
38 | .name = "omap-pcm-audio", | ||
39 | .id = -1, | ||
40 | }; | ||
41 | |||
42 | static void omap_init_audio(void) | ||
43 | { | ||
44 | platform_device_register(&omap_pcm); | ||
45 | } | ||
46 | |||
47 | #else | ||
48 | static inline void omap_init_audio(void) {} | ||
49 | #endif | ||
50 | |||
34 | /*-------------------------------------------------------------------------*/ | 51 | /*-------------------------------------------------------------------------*/ |
35 | 52 | ||
36 | #if defined(CONFIG_RTC_DRV_OMAP) || defined(CONFIG_RTC_DRV_OMAP_MODULE) | 53 | #if defined(CONFIG_RTC_DRV_OMAP) || defined(CONFIG_RTC_DRV_OMAP_MODULE) |
@@ -128,6 +145,56 @@ static inline void omap1_mmc_mux(struct omap_mmc_platform_data *mmc_controller, | |||
128 | } | 145 | } |
129 | } | 146 | } |
130 | 147 | ||
148 | #define OMAP_MMC_NR_RES 4 | ||
149 | |||
150 | /* | ||
151 | * Register MMC devices. | ||
152 | */ | ||
153 | static int __init omap_mmc_add(const char *name, int id, unsigned long base, | ||
154 | unsigned long size, unsigned int irq, | ||
155 | unsigned rx_req, unsigned tx_req, | ||
156 | struct omap_mmc_platform_data *data) | ||
157 | { | ||
158 | struct platform_device *pdev; | ||
159 | struct resource res[OMAP_MMC_NR_RES]; | ||
160 | int ret; | ||
161 | |||
162 | pdev = platform_device_alloc(name, id); | ||
163 | if (!pdev) | ||
164 | return -ENOMEM; | ||
165 | |||
166 | memset(res, 0, OMAP_MMC_NR_RES * sizeof(struct resource)); | ||
167 | res[0].start = base; | ||
168 | res[0].end = base + size - 1; | ||
169 | res[0].flags = IORESOURCE_MEM; | ||
170 | res[1].start = res[1].end = irq; | ||
171 | res[1].flags = IORESOURCE_IRQ; | ||
172 | res[2].start = rx_req; | ||
173 | res[2].name = "rx"; | ||
174 | res[2].flags = IORESOURCE_DMA; | ||
175 | res[3].start = tx_req; | ||
176 | res[3].name = "tx"; | ||
177 | res[3].flags = IORESOURCE_DMA; | ||
178 | |||
179 | ret = platform_device_add_resources(pdev, res, ARRAY_SIZE(res)); | ||
180 | if (ret == 0) | ||
181 | ret = platform_device_add_data(pdev, data, sizeof(*data)); | ||
182 | if (ret) | ||
183 | goto fail; | ||
184 | |||
185 | ret = platform_device_add(pdev); | ||
186 | if (ret) | ||
187 | goto fail; | ||
188 | |||
189 | /* return device handle to board setup code */ | ||
190 | data->dev = &pdev->dev; | ||
191 | return 0; | ||
192 | |||
193 | fail: | ||
194 | platform_device_put(pdev); | ||
195 | return ret; | ||
196 | } | ||
197 | |||
131 | void __init omap1_init_mmc(struct omap_mmc_platform_data **mmc_data, | 198 | void __init omap1_init_mmc(struct omap_mmc_platform_data **mmc_data, |
132 | int nr_controllers) | 199 | int nr_controllers) |
133 | { | 200 | { |
@@ -135,6 +202,7 @@ void __init omap1_init_mmc(struct omap_mmc_platform_data **mmc_data, | |||
135 | 202 | ||
136 | for (i = 0; i < nr_controllers; i++) { | 203 | for (i = 0; i < nr_controllers; i++) { |
137 | unsigned long base, size; | 204 | unsigned long base, size; |
205 | unsigned rx_req, tx_req; | ||
138 | unsigned int irq = 0; | 206 | unsigned int irq = 0; |
139 | 207 | ||
140 | if (!mmc_data[i]) | 208 | if (!mmc_data[i]) |
@@ -146,19 +214,24 @@ void __init omap1_init_mmc(struct omap_mmc_platform_data **mmc_data, | |||
146 | case 0: | 214 | case 0: |
147 | base = OMAP1_MMC1_BASE; | 215 | base = OMAP1_MMC1_BASE; |
148 | irq = INT_MMC; | 216 | irq = INT_MMC; |
217 | rx_req = OMAP_DMA_MMC_RX; | ||
218 | tx_req = OMAP_DMA_MMC_TX; | ||
149 | break; | 219 | break; |
150 | case 1: | 220 | case 1: |
151 | if (!cpu_is_omap16xx()) | 221 | if (!cpu_is_omap16xx()) |
152 | return; | 222 | return; |
153 | base = OMAP1_MMC2_BASE; | 223 | base = OMAP1_MMC2_BASE; |
154 | irq = INT_1610_MMC2; | 224 | irq = INT_1610_MMC2; |
225 | rx_req = OMAP_DMA_MMC2_RX; | ||
226 | tx_req = OMAP_DMA_MMC2_TX; | ||
155 | break; | 227 | break; |
156 | default: | 228 | default: |
157 | continue; | 229 | continue; |
158 | } | 230 | } |
159 | size = OMAP1_MMC_SIZE; | 231 | size = OMAP1_MMC_SIZE; |
160 | 232 | ||
161 | omap_mmc_add("mmci-omap", i, base, size, irq, mmc_data[i]); | 233 | omap_mmc_add("mmci-omap", i, base, size, irq, |
234 | rx_req, tx_req, mmc_data[i]); | ||
162 | }; | 235 | }; |
163 | } | 236 | } |
164 | 237 | ||
@@ -242,23 +315,48 @@ void __init omap1_camera_init(void *info) | |||
242 | 315 | ||
243 | static inline void omap_init_sti(void) {} | 316 | static inline void omap_init_sti(void) {} |
244 | 317 | ||
245 | #if defined(CONFIG_SND_SOC) || defined(CONFIG_SND_SOC_MODULE) | 318 | /* Numbering for the SPI-capable controllers when used for SPI: |
319 | * spi = 1 | ||
320 | * uwire = 2 | ||
321 | * mmc1..2 = 3..4 | ||
322 | * mcbsp1..3 = 5..7 | ||
323 | */ | ||
246 | 324 | ||
247 | static struct platform_device omap_pcm = { | 325 | #if defined(CONFIG_SPI_OMAP_UWIRE) || defined(CONFIG_SPI_OMAP_UWIRE_MODULE) |
248 | .name = "omap-pcm-audio", | 326 | |
249 | .id = -1, | 327 | #define OMAP_UWIRE_BASE 0xfffb3000 |
328 | |||
329 | static struct resource uwire_resources[] = { | ||
330 | { | ||
331 | .start = OMAP_UWIRE_BASE, | ||
332 | .end = OMAP_UWIRE_BASE + 0x20, | ||
333 | .flags = IORESOURCE_MEM, | ||
334 | }, | ||
250 | }; | 335 | }; |
251 | 336 | ||
252 | static void omap_init_audio(void) | 337 | static struct platform_device omap_uwire_device = { |
338 | .name = "omap_uwire", | ||
339 | .id = -1, | ||
340 | .num_resources = ARRAY_SIZE(uwire_resources), | ||
341 | .resource = uwire_resources, | ||
342 | }; | ||
343 | |||
344 | static void omap_init_uwire(void) | ||
253 | { | 345 | { |
254 | platform_device_register(&omap_pcm); | 346 | /* FIXME define and use a boot tag; not all boards will be hooking |
255 | } | 347 | * up devices to the microwire controller, and multi-board configs |
348 | * mean that CONFIG_SPI_OMAP_UWIRE may be configured anyway... | ||
349 | */ | ||
256 | 350 | ||
351 | /* board-specific code must configure chipselects (only a few | ||
352 | * are normally used) and SCLK/SDI/SDO (each has two choices). | ||
353 | */ | ||
354 | (void) platform_device_register(&omap_uwire_device); | ||
355 | } | ||
257 | #else | 356 | #else |
258 | static inline void omap_init_audio(void) {} | 357 | static inline void omap_init_uwire(void) {} |
259 | #endif | 358 | #endif |
260 | 359 | ||
261 | /*-------------------------------------------------------------------------*/ | ||
262 | 360 | ||
263 | /* | 361 | /* |
264 | * This gets called after board-specific INIT_MACHINE, and initializes most | 362 | * This gets called after board-specific INIT_MACHINE, and initializes most |
@@ -292,11 +390,12 @@ static int __init omap1_init_devices(void) | |||
292 | * in alphabetical order so they're easier to sort through. | 390 | * in alphabetical order so they're easier to sort through. |
293 | */ | 391 | */ |
294 | 392 | ||
393 | omap_init_audio(); | ||
295 | omap_init_mbox(); | 394 | omap_init_mbox(); |
296 | omap_init_rtc(); | 395 | omap_init_rtc(); |
297 | omap_init_spi100k(); | 396 | omap_init_spi100k(); |
298 | omap_init_sti(); | 397 | omap_init_sti(); |
299 | omap_init_audio(); | 398 | omap_init_uwire(); |
300 | 399 | ||
301 | return 0; | 400 | return 0; |
302 | } | 401 | } |
diff --git a/arch/arm/mach-omap1/io.c b/arch/arm/mach-omap1/io.c index 71ce017bf5d8..6c95a59f0f16 100644 --- a/arch/arm/mach-omap1/io.c +++ b/arch/arm/mach-omap1/io.c | |||
@@ -137,6 +137,11 @@ void __init omap1_init_early(void) | |||
137 | omap_init_consistent_dma_size(); | 137 | omap_init_consistent_dma_size(); |
138 | } | 138 | } |
139 | 139 | ||
140 | void __init omap1_init_late(void) | ||
141 | { | ||
142 | omap_serial_wakeup_init(); | ||
143 | } | ||
144 | |||
140 | /* | 145 | /* |
141 | * NOTE: Please use ioremap + __raw_read/write where possible instead of these | 146 | * NOTE: Please use ioremap + __raw_read/write where possible instead of these |
142 | */ | 147 | */ |
diff --git a/arch/arm/mach-omap1/serial.c b/arch/arm/mach-omap1/serial.c index 93ae8f29727e..6809c9e56c93 100644 --- a/arch/arm/mach-omap1/serial.c +++ b/arch/arm/mach-omap1/serial.c | |||
@@ -237,7 +237,7 @@ static void __init omap_serial_set_port_wakeup(int gpio_nr) | |||
237 | enable_irq_wake(gpio_to_irq(gpio_nr)); | 237 | enable_irq_wake(gpio_to_irq(gpio_nr)); |
238 | } | 238 | } |
239 | 239 | ||
240 | static int __init omap_serial_wakeup_init(void) | 240 | int __init omap_serial_wakeup_init(void) |
241 | { | 241 | { |
242 | if (!cpu_is_omap16xx()) | 242 | if (!cpu_is_omap16xx()) |
243 | return 0; | 243 | return 0; |
@@ -251,7 +251,6 @@ static int __init omap_serial_wakeup_init(void) | |||
251 | 251 | ||
252 | return 0; | 252 | return 0; |
253 | } | 253 | } |
254 | late_initcall(omap_serial_wakeup_init); | ||
255 | 254 | ||
256 | #endif /* CONFIG_OMAP_SERIAL_WAKE */ | 255 | #endif /* CONFIG_OMAP_SERIAL_WAKE */ |
257 | 256 | ||
diff --git a/arch/arm/mach-omap1/time.c b/arch/arm/mach-omap1/time.c index 4d8dd9a1b04c..4062480bfec7 100644 --- a/arch/arm/mach-omap1/time.c +++ b/arch/arm/mach-omap1/time.c | |||
@@ -232,20 +232,6 @@ static inline void omap_mpu_timer_init(void) | |||
232 | } | 232 | } |
233 | #endif /* CONFIG_OMAP_MPU_TIMER */ | 233 | #endif /* CONFIG_OMAP_MPU_TIMER */ |
234 | 234 | ||
235 | static inline int omap_32k_timer_usable(void) | ||
236 | { | ||
237 | int res = false; | ||
238 | |||
239 | if (cpu_is_omap730() || cpu_is_omap15xx()) | ||
240 | return res; | ||
241 | |||
242 | #ifdef CONFIG_OMAP_32K_TIMER | ||
243 | res = omap_32k_timer_init(); | ||
244 | #endif | ||
245 | |||
246 | return res; | ||
247 | } | ||
248 | |||
249 | /* | 235 | /* |
250 | * --------------------------------------------------------------------------- | 236 | * --------------------------------------------------------------------------- |
251 | * Timer initialization | 237 | * Timer initialization |
@@ -253,7 +239,7 @@ static inline int omap_32k_timer_usable(void) | |||
253 | */ | 239 | */ |
254 | static void __init omap1_timer_init(void) | 240 | static void __init omap1_timer_init(void) |
255 | { | 241 | { |
256 | if (!omap_32k_timer_usable()) | 242 | if (omap_32k_timer_init() != 0) |
257 | omap_mpu_timer_init(); | 243 | omap_mpu_timer_init(); |
258 | } | 244 | } |
259 | 245 | ||
diff --git a/arch/arm/mach-omap1/timer32k.c b/arch/arm/mach-omap1/timer32k.c index 325b9a0aa4a0..eae49c3980c9 100644 --- a/arch/arm/mach-omap1/timer32k.c +++ b/arch/arm/mach-omap1/timer32k.c | |||
@@ -71,6 +71,7 @@ | |||
71 | 71 | ||
72 | /* 16xx specific defines */ | 72 | /* 16xx specific defines */ |
73 | #define OMAP1_32K_TIMER_BASE 0xfffb9000 | 73 | #define OMAP1_32K_TIMER_BASE 0xfffb9000 |
74 | #define OMAP1_32KSYNC_TIMER_BASE 0xfffbc400 | ||
74 | #define OMAP1_32K_TIMER_CR 0x08 | 75 | #define OMAP1_32K_TIMER_CR 0x08 |
75 | #define OMAP1_32K_TIMER_TVR 0x00 | 76 | #define OMAP1_32K_TIMER_TVR 0x00 |
76 | #define OMAP1_32K_TIMER_TCR 0x04 | 77 | #define OMAP1_32K_TIMER_TCR 0x04 |
@@ -182,10 +183,29 @@ static __init void omap_init_32k_timer(void) | |||
182 | * Timer initialization | 183 | * Timer initialization |
183 | * --------------------------------------------------------------------------- | 184 | * --------------------------------------------------------------------------- |
184 | */ | 185 | */ |
185 | bool __init omap_32k_timer_init(void) | 186 | int __init omap_32k_timer_init(void) |
186 | { | 187 | { |
187 | omap_init_clocksource_32k(); | 188 | int ret = -ENODEV; |
188 | omap_init_32k_timer(); | ||
189 | 189 | ||
190 | return true; | 190 | if (cpu_is_omap16xx()) { |
191 | void __iomem *base; | ||
192 | struct clk *sync32k_ick; | ||
193 | |||
194 | base = ioremap(OMAP1_32KSYNC_TIMER_BASE, SZ_1K); | ||
195 | if (!base) { | ||
196 | pr_err("32k_counter: failed to map base addr\n"); | ||
197 | return -ENODEV; | ||
198 | } | ||
199 | |||
200 | sync32k_ick = clk_get(NULL, "omap_32ksync_ick"); | ||
201 | if (!IS_ERR(sync32k_ick)) | ||
202 | clk_enable(sync32k_ick); | ||
203 | |||
204 | ret = omap_init_clocksource_32k(base); | ||
205 | } | ||
206 | |||
207 | if (!ret) | ||
208 | omap_init_32k_timer(); | ||
209 | |||
210 | return ret; | ||
191 | } | 211 | } |
diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig index 964ee67a3b77..4cf5142f22cc 100644 --- a/arch/arm/mach-omap2/Kconfig +++ b/arch/arm/mach-omap2/Kconfig | |||
@@ -78,12 +78,12 @@ config SOC_OMAP3430 | |||
78 | default y | 78 | default y |
79 | select ARCH_OMAP_OTG | 79 | select ARCH_OMAP_OTG |
80 | 80 | ||
81 | config SOC_OMAPTI81XX | 81 | config SOC_TI81XX |
82 | bool "TI81XX support" | 82 | bool "TI81XX support" |
83 | depends on ARCH_OMAP3 | 83 | depends on ARCH_OMAP3 |
84 | default y | 84 | default y |
85 | 85 | ||
86 | config SOC_OMAPAM33XX | 86 | config SOC_AM33XX |
87 | bool "AM33XX support" | 87 | bool "AM33XX support" |
88 | depends on ARCH_OMAP3 | 88 | depends on ARCH_OMAP3 |
89 | default y | 89 | default y |
@@ -320,12 +320,12 @@ config MACH_OMAP_3630SDP | |||
320 | 320 | ||
321 | config MACH_TI8168EVM | 321 | config MACH_TI8168EVM |
322 | bool "TI8168 Evaluation Module" | 322 | bool "TI8168 Evaluation Module" |
323 | depends on SOC_OMAPTI81XX | 323 | depends on SOC_TI81XX |
324 | default y | 324 | default y |
325 | 325 | ||
326 | config MACH_TI8148EVM | 326 | config MACH_TI8148EVM |
327 | bool "TI8148 Evaluation Module" | 327 | bool "TI8148 Evaluation Module" |
328 | depends on SOC_OMAPTI81XX | 328 | depends on SOC_TI81XX |
329 | default y | 329 | default y |
330 | 330 | ||
331 | config MACH_OMAP_4430SDP | 331 | config MACH_OMAP_4430SDP |
diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile index 385c083d24b2..fa742f3c2629 100644 --- a/arch/arm/mach-omap2/Makefile +++ b/arch/arm/mach-omap2/Makefile | |||
@@ -24,10 +24,11 @@ endif | |||
24 | obj-$(CONFIG_TWL4030_CORE) += omap_twl.o | 24 | obj-$(CONFIG_TWL4030_CORE) += omap_twl.o |
25 | 25 | ||
26 | # SMP support ONLY available for OMAP4 | 26 | # SMP support ONLY available for OMAP4 |
27 | |||
27 | obj-$(CONFIG_SMP) += omap-smp.o omap-headsmp.o | 28 | obj-$(CONFIG_SMP) += omap-smp.o omap-headsmp.o |
28 | obj-$(CONFIG_HOTPLUG_CPU) += omap-hotplug.o | 29 | obj-$(CONFIG_HOTPLUG_CPU) += omap-hotplug.o |
29 | obj-$(CONFIG_ARCH_OMAP4) += omap4-common.o omap-wakeupgen.o \ | 30 | obj-$(CONFIG_ARCH_OMAP4) += omap4-common.o omap-wakeupgen.o |
30 | sleep44xx.o | 31 | obj-$(CONFIG_ARCH_OMAP4) += sleep44xx.o |
31 | 32 | ||
32 | plus_sec := $(call as-instr,.arch_extension sec,+sec) | 33 | plus_sec := $(call as-instr,.arch_extension sec,+sec) |
33 | AFLAGS_omap-headsmp.o :=-Wa,-march=armv7-a$(plus_sec) | 34 | AFLAGS_omap-headsmp.o :=-Wa,-march=armv7-a$(plus_sec) |
@@ -64,10 +65,10 @@ endif | |||
64 | ifeq ($(CONFIG_PM),y) | 65 | ifeq ($(CONFIG_PM),y) |
65 | obj-$(CONFIG_ARCH_OMAP2) += pm24xx.o | 66 | obj-$(CONFIG_ARCH_OMAP2) += pm24xx.o |
66 | obj-$(CONFIG_ARCH_OMAP2) += sleep24xx.o | 67 | obj-$(CONFIG_ARCH_OMAP2) += sleep24xx.o |
67 | obj-$(CONFIG_ARCH_OMAP3) += pm34xx.o sleep34xx.o \ | 68 | obj-$(CONFIG_ARCH_OMAP3) += pm34xx.o sleep34xx.o |
68 | cpuidle34xx.o | 69 | obj-$(CONFIG_ARCH_OMAP3) += cpuidle34xx.o |
69 | obj-$(CONFIG_ARCH_OMAP4) += pm44xx.o omap-mpuss-lowpower.o \ | 70 | obj-$(CONFIG_ARCH_OMAP4) += pm44xx.o omap-mpuss-lowpower.o |
70 | cpuidle44xx.o | 71 | obj-$(CONFIG_ARCH_OMAP4) += cpuidle44xx.o |
71 | obj-$(CONFIG_PM_DEBUG) += pm-debug.o | 72 | obj-$(CONFIG_PM_DEBUG) += pm-debug.o |
72 | obj-$(CONFIG_OMAP_SMARTREFLEX) += sr_device.o smartreflex.o | 73 | obj-$(CONFIG_OMAP_SMARTREFLEX) += sr_device.o smartreflex.o |
73 | obj-$(CONFIG_OMAP_SMARTREFLEX_CLASS3) += smartreflex-class3.o | 74 | obj-$(CONFIG_OMAP_SMARTREFLEX_CLASS3) += smartreflex-class3.o |
@@ -84,90 +85,86 @@ endif | |||
84 | # PRCM | 85 | # PRCM |
85 | obj-y += prm_common.o | 86 | obj-y += prm_common.o |
86 | obj-$(CONFIG_ARCH_OMAP2) += prcm.o cm2xxx_3xxx.o prm2xxx_3xxx.o | 87 | obj-$(CONFIG_ARCH_OMAP2) += prcm.o cm2xxx_3xxx.o prm2xxx_3xxx.o |
87 | obj-$(CONFIG_ARCH_OMAP3) += prcm.o cm2xxx_3xxx.o prm2xxx_3xxx.o \ | 88 | obj-$(CONFIG_ARCH_OMAP3) += prcm.o cm2xxx_3xxx.o prm2xxx_3xxx.o |
88 | vc3xxx_data.o vp3xxx_data.o | 89 | obj-$(CONFIG_ARCH_OMAP3) += vc3xxx_data.o vp3xxx_data.o |
89 | # XXX The presence of cm2xxx_3xxx.o on the line below is temporary and | 90 | obj-$(CONFIG_ARCH_OMAP4) += prcm.o cminst44xx.o cm44xx.o |
90 | # will be removed once the OMAP4 part of the codebase is converted to | 91 | obj-$(CONFIG_ARCH_OMAP4) += prcm_mpu44xx.o prminst44xx.o |
91 | # use OMAP4-specific PRCM functions. | 92 | obj-$(CONFIG_ARCH_OMAP4) += vc44xx_data.o vp44xx_data.o prm44xx.o |
92 | obj-$(CONFIG_ARCH_OMAP4) += prcm.o cm2xxx_3xxx.o cminst44xx.o \ | ||
93 | cm44xx.o prcm_mpu44xx.o \ | ||
94 | prminst44xx.o vc44xx_data.o \ | ||
95 | vp44xx_data.o prm44xx.o | ||
96 | 93 | ||
97 | # OMAP voltage domains | 94 | # OMAP voltage domains |
98 | voltagedomain-common := voltage.o vc.o vp.o | 95 | voltagedomain-common := voltage.o vc.o vp.o |
99 | obj-$(CONFIG_ARCH_OMAP2) += $(voltagedomain-common) \ | 96 | obj-$(CONFIG_ARCH_OMAP2) += $(voltagedomain-common) |
100 | voltagedomains2xxx_data.o | 97 | obj-$(CONFIG_ARCH_OMAP2) += voltagedomains2xxx_data.o |
101 | obj-$(CONFIG_ARCH_OMAP3) += $(voltagedomain-common) \ | 98 | obj-$(CONFIG_ARCH_OMAP3) += $(voltagedomain-common) |
102 | voltagedomains3xxx_data.o | 99 | obj-$(CONFIG_ARCH_OMAP3) += voltagedomains3xxx_data.o |
103 | obj-$(CONFIG_ARCH_OMAP4) += $(voltagedomain-common) \ | 100 | obj-$(CONFIG_ARCH_OMAP4) += $(voltagedomain-common) |
104 | voltagedomains44xx_data.o | 101 | obj-$(CONFIG_ARCH_OMAP4) += voltagedomains44xx_data.o |
105 | 102 | ||
106 | # OMAP powerdomain framework | 103 | # OMAP powerdomain framework |
107 | powerdomain-common += powerdomain.o powerdomain-common.o | 104 | powerdomain-common += powerdomain.o powerdomain-common.o |
108 | obj-$(CONFIG_ARCH_OMAP2) += $(powerdomain-common) \ | 105 | obj-$(CONFIG_ARCH_OMAP2) += $(powerdomain-common) |
109 | powerdomain2xxx_3xxx.o \ | 106 | obj-$(CONFIG_ARCH_OMAP2) += powerdomains2xxx_data.o |
110 | powerdomains2xxx_data.o \ | 107 | obj-$(CONFIG_ARCH_OMAP2) += powerdomain2xxx_3xxx.o |
111 | powerdomains2xxx_3xxx_data.o | 108 | obj-$(CONFIG_ARCH_OMAP2) += powerdomains2xxx_3xxx_data.o |
112 | obj-$(CONFIG_ARCH_OMAP3) += $(powerdomain-common) \ | 109 | obj-$(CONFIG_ARCH_OMAP3) += $(powerdomain-common) |
113 | powerdomain2xxx_3xxx.o \ | 110 | obj-$(CONFIG_ARCH_OMAP3) += powerdomain2xxx_3xxx.o |
114 | powerdomains3xxx_data.o \ | 111 | obj-$(CONFIG_ARCH_OMAP3) += powerdomains3xxx_data.o |
115 | powerdomains2xxx_3xxx_data.o | 112 | obj-$(CONFIG_ARCH_OMAP3) += powerdomains2xxx_3xxx_data.o |
116 | obj-$(CONFIG_ARCH_OMAP4) += $(powerdomain-common) \ | 113 | obj-$(CONFIG_ARCH_OMAP4) += $(powerdomain-common) |
117 | powerdomain44xx.o \ | 114 | obj-$(CONFIG_ARCH_OMAP4) += powerdomain44xx.o |
118 | powerdomains44xx_data.o | 115 | obj-$(CONFIG_ARCH_OMAP4) += powerdomains44xx_data.o |
119 | 116 | ||
120 | # PRCM clockdomain control | 117 | # PRCM clockdomain control |
121 | clockdomain-common += clockdomain.o \ | 118 | clockdomain-common += clockdomain.o |
122 | clockdomains_common_data.o | 119 | clockdomain-common += clockdomains_common_data.o |
123 | obj-$(CONFIG_ARCH_OMAP2) += $(clockdomain-common) \ | 120 | obj-$(CONFIG_ARCH_OMAP2) += $(clockdomain-common) |
124 | clockdomain2xxx_3xxx.o \ | 121 | obj-$(CONFIG_ARCH_OMAP2) += clockdomain2xxx_3xxx.o |
125 | clockdomains2xxx_3xxx_data.o | 122 | obj-$(CONFIG_ARCH_OMAP2) += clockdomains2xxx_3xxx_data.o |
126 | obj-$(CONFIG_SOC_OMAP2420) += clockdomains2420_data.o | 123 | obj-$(CONFIG_SOC_OMAP2420) += clockdomains2420_data.o |
127 | obj-$(CONFIG_SOC_OMAP2430) += clockdomains2430_data.o | 124 | obj-$(CONFIG_SOC_OMAP2430) += clockdomains2430_data.o |
128 | obj-$(CONFIG_ARCH_OMAP3) += $(clockdomain-common) \ | 125 | obj-$(CONFIG_ARCH_OMAP3) += $(clockdomain-common) |
129 | clockdomain2xxx_3xxx.o \ | 126 | obj-$(CONFIG_ARCH_OMAP3) += clockdomain2xxx_3xxx.o |
130 | clockdomains2xxx_3xxx_data.o \ | 127 | obj-$(CONFIG_ARCH_OMAP3) += clockdomains2xxx_3xxx_data.o |
131 | clockdomains3xxx_data.o | 128 | obj-$(CONFIG_ARCH_OMAP3) += clockdomains3xxx_data.o |
132 | obj-$(CONFIG_ARCH_OMAP4) += $(clockdomain-common) \ | 129 | obj-$(CONFIG_ARCH_OMAP4) += $(clockdomain-common) |
133 | clockdomain44xx.o \ | 130 | obj-$(CONFIG_ARCH_OMAP4) += clockdomain44xx.o |
134 | clockdomains44xx_data.o | 131 | obj-$(CONFIG_ARCH_OMAP4) += clockdomains44xx_data.o |
135 | 132 | ||
136 | # Clock framework | 133 | # Clock framework |
137 | obj-$(CONFIG_ARCH_OMAP2) += $(clock-common) clock2xxx.o \ | 134 | obj-$(CONFIG_ARCH_OMAP2) += $(clock-common) clock2xxx.o |
138 | clkt2xxx_sys.o \ | 135 | obj-$(CONFIG_ARCH_OMAP2) += clkt2xxx_sys.o |
139 | clkt2xxx_dpllcore.o \ | 136 | obj-$(CONFIG_ARCH_OMAP2) += clkt2xxx_dpllcore.o |
140 | clkt2xxx_virt_prcm_set.o \ | 137 | obj-$(CONFIG_ARCH_OMAP2) += clkt2xxx_virt_prcm_set.o |
141 | clkt2xxx_apll.o clkt2xxx_osc.o \ | 138 | obj-$(CONFIG_ARCH_OMAP2) += clkt2xxx_apll.o clkt2xxx_osc.o |
142 | clkt2xxx_dpll.o clkt_iclk.o | 139 | obj-$(CONFIG_ARCH_OMAP2) += clkt2xxx_dpll.o clkt_iclk.o |
143 | obj-$(CONFIG_SOC_OMAP2420) += clock2420_data.o | 140 | obj-$(CONFIG_SOC_OMAP2420) += clock2420_data.o |
144 | obj-$(CONFIG_SOC_OMAP2430) += clock2430.o clock2430_data.o | 141 | obj-$(CONFIG_SOC_OMAP2430) += clock2430.o clock2430_data.o |
145 | obj-$(CONFIG_ARCH_OMAP3) += $(clock-common) clock3xxx.o \ | 142 | obj-$(CONFIG_ARCH_OMAP3) += $(clock-common) clock3xxx.o |
146 | clock34xx.o clkt34xx_dpll3m2.o \ | 143 | obj-$(CONFIG_ARCH_OMAP3) += clock34xx.o clkt34xx_dpll3m2.o |
147 | clock3517.o clock36xx.o \ | 144 | obj-$(CONFIG_ARCH_OMAP3) += clock3517.o clock36xx.o |
148 | dpll3xxx.o clock3xxx_data.o \ | 145 | obj-$(CONFIG_ARCH_OMAP3) += dpll3xxx.o clock3xxx_data.o |
149 | clkt_iclk.o | 146 | obj-$(CONFIG_ARCH_OMAP3) += clkt_iclk.o |
150 | obj-$(CONFIG_ARCH_OMAP4) += $(clock-common) clock44xx_data.o \ | 147 | obj-$(CONFIG_ARCH_OMAP4) += $(clock-common) clock44xx_data.o |
151 | dpll3xxx.o dpll44xx.o | 148 | obj-$(CONFIG_ARCH_OMAP4) += dpll3xxx.o dpll44xx.o |
152 | 149 | ||
153 | # OMAP2 clock rate set data (old "OPP" data) | 150 | # OMAP2 clock rate set data (old "OPP" data) |
154 | obj-$(CONFIG_SOC_OMAP2420) += opp2420_data.o | 151 | obj-$(CONFIG_SOC_OMAP2420) += opp2420_data.o |
155 | obj-$(CONFIG_SOC_OMAP2430) += opp2430_data.o | 152 | obj-$(CONFIG_SOC_OMAP2430) += opp2430_data.o |
156 | 153 | ||
157 | # hwmod data | 154 | # hwmod data |
158 | obj-$(CONFIG_SOC_OMAP2420) += omap_hwmod_2xxx_ipblock_data.o \ | 155 | obj-$(CONFIG_SOC_OMAP2420) += omap_hwmod_2xxx_ipblock_data.o |
159 | omap_hwmod_2xxx_3xxx_ipblock_data.o \ | 156 | obj-$(CONFIG_SOC_OMAP2420) += omap_hwmod_2xxx_3xxx_ipblock_data.o |
160 | omap_hwmod_2xxx_interconnect_data.o \ | 157 | obj-$(CONFIG_SOC_OMAP2420) += omap_hwmod_2xxx_interconnect_data.o |
161 | omap_hwmod_2xxx_3xxx_interconnect_data.o \ | 158 | obj-$(CONFIG_SOC_OMAP2420) += omap_hwmod_2xxx_3xxx_interconnect_data.o |
162 | omap_hwmod_2420_data.o | 159 | obj-$(CONFIG_SOC_OMAP2420) += omap_hwmod_2420_data.o |
163 | obj-$(CONFIG_SOC_OMAP2430) += omap_hwmod_2xxx_ipblock_data.o \ | 160 | obj-$(CONFIG_SOC_OMAP2430) += omap_hwmod_2xxx_ipblock_data.o |
164 | omap_hwmod_2xxx_3xxx_ipblock_data.o \ | 161 | obj-$(CONFIG_SOC_OMAP2430) += omap_hwmod_2xxx_3xxx_ipblock_data.o |
165 | omap_hwmod_2xxx_interconnect_data.o \ | 162 | obj-$(CONFIG_SOC_OMAP2430) += omap_hwmod_2xxx_interconnect_data.o |
166 | omap_hwmod_2xxx_3xxx_interconnect_data.o \ | 163 | obj-$(CONFIG_SOC_OMAP2430) += omap_hwmod_2xxx_3xxx_interconnect_data.o |
167 | omap_hwmod_2430_data.o | 164 | obj-$(CONFIG_SOC_OMAP2430) += omap_hwmod_2430_data.o |
168 | obj-$(CONFIG_ARCH_OMAP3) += omap_hwmod_2xxx_3xxx_ipblock_data.o \ | 165 | obj-$(CONFIG_ARCH_OMAP3) += omap_hwmod_2xxx_3xxx_ipblock_data.o |
169 | omap_hwmod_2xxx_3xxx_interconnect_data.o \ | 166 | obj-$(CONFIG_ARCH_OMAP3) += omap_hwmod_2xxx_3xxx_interconnect_data.o |
170 | omap_hwmod_3xxx_data.o | 167 | obj-$(CONFIG_ARCH_OMAP3) += omap_hwmod_3xxx_data.o |
171 | obj-$(CONFIG_ARCH_OMAP4) += omap_hwmod_44xx_data.o | 168 | obj-$(CONFIG_ARCH_OMAP4) += omap_hwmod_44xx_data.o |
172 | 169 | ||
173 | # EMU peripherals | 170 | # EMU peripherals |
@@ -208,23 +205,19 @@ obj-$(CONFIG_MACH_OMAP3EVM) += board-omap3evm.o | |||
208 | obj-$(CONFIG_MACH_OMAP3_PANDORA) += board-omap3pandora.o | 205 | obj-$(CONFIG_MACH_OMAP3_PANDORA) += board-omap3pandora.o |
209 | obj-$(CONFIG_MACH_OMAP_3430SDP) += board-3430sdp.o | 206 | obj-$(CONFIG_MACH_OMAP_3430SDP) += board-3430sdp.o |
210 | obj-$(CONFIG_MACH_NOKIA_N8X0) += board-n8x0.o | 207 | obj-$(CONFIG_MACH_NOKIA_N8X0) += board-n8x0.o |
211 | obj-$(CONFIG_MACH_NOKIA_RM680) += board-rm680.o \ | 208 | obj-$(CONFIG_MACH_NOKIA_RM680) += board-rm680.o sdram-nokia.o |
212 | sdram-nokia.o | 209 | obj-$(CONFIG_MACH_NOKIA_RX51) += board-rx51.o sdram-nokia.o |
213 | obj-$(CONFIG_MACH_NOKIA_RX51) += board-rx51.o \ | 210 | obj-$(CONFIG_MACH_NOKIA_RX51) += board-rx51-peripherals.o |
214 | sdram-nokia.o \ | 211 | obj-$(CONFIG_MACH_NOKIA_RX51) += board-rx51-video.o |
215 | board-rx51-peripherals.o \ | 212 | obj-$(CONFIG_MACH_OMAP_ZOOM2) += board-zoom.o board-zoom-peripherals.o |
216 | board-rx51-video.o | 213 | obj-$(CONFIG_MACH_OMAP_ZOOM2) += board-zoom-display.o |
217 | obj-$(CONFIG_MACH_OMAP_ZOOM2) += board-zoom.o \ | 214 | obj-$(CONFIG_MACH_OMAP_ZOOM2) += board-zoom-debugboard.o |
218 | board-zoom-peripherals.o \ | 215 | obj-$(CONFIG_MACH_OMAP_ZOOM3) += board-zoom.o board-zoom-peripherals.o |
219 | board-zoom-display.o \ | 216 | obj-$(CONFIG_MACH_OMAP_ZOOM3) += board-zoom-display.o |
220 | board-zoom-debugboard.o | 217 | obj-$(CONFIG_MACH_OMAP_ZOOM3) += board-zoom-debugboard.o |
221 | obj-$(CONFIG_MACH_OMAP_ZOOM3) += board-zoom.o \ | 218 | obj-$(CONFIG_MACH_OMAP_3630SDP) += board-3630sdp.o |
222 | board-zoom-peripherals.o \ | 219 | obj-$(CONFIG_MACH_OMAP_3630SDP) += board-zoom-peripherals.o |
223 | board-zoom-display.o \ | 220 | obj-$(CONFIG_MACH_OMAP_3630SDP) += board-zoom-display.o |
224 | board-zoom-debugboard.o | ||
225 | obj-$(CONFIG_MACH_OMAP_3630SDP) += board-3630sdp.o \ | ||
226 | board-zoom-peripherals.o \ | ||
227 | board-zoom-display.o | ||
228 | obj-$(CONFIG_MACH_CM_T35) += board-cm-t35.o | 221 | obj-$(CONFIG_MACH_CM_T35) += board-cm-t35.o |
229 | obj-$(CONFIG_MACH_CM_T3517) += board-cm-t3517.o | 222 | obj-$(CONFIG_MACH_CM_T3517) += board-cm-t3517.o |
230 | obj-$(CONFIG_MACH_IGEP0020) += board-igep0020.o | 223 | obj-$(CONFIG_MACH_IGEP0020) += board-igep0020.o |
diff --git a/arch/arm/mach-omap2/board-2430sdp.c b/arch/arm/mach-omap2/board-2430sdp.c index e658f835d0de..99ca6bad5c30 100644 --- a/arch/arm/mach-omap2/board-2430sdp.c +++ b/arch/arm/mach-omap2/board-2430sdp.c | |||
@@ -303,6 +303,7 @@ MACHINE_START(OMAP_2430SDP, "OMAP2430 sdp2430 board") | |||
303 | .init_irq = omap2_init_irq, | 303 | .init_irq = omap2_init_irq, |
304 | .handle_irq = omap2_intc_handle_irq, | 304 | .handle_irq = omap2_intc_handle_irq, |
305 | .init_machine = omap_2430sdp_init, | 305 | .init_machine = omap_2430sdp_init, |
306 | .init_late = omap2430_init_late, | ||
306 | .timer = &omap2_timer, | 307 | .timer = &omap2_timer, |
307 | .restart = omap_prcm_restart, | 308 | .restart = omap_prcm_restart, |
308 | MACHINE_END | 309 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-3430sdp.c b/arch/arm/mach-omap2/board-3430sdp.c index 37abb0d49b51..a98c688058a9 100644 --- a/arch/arm/mach-omap2/board-3430sdp.c +++ b/arch/arm/mach-omap2/board-3430sdp.c | |||
@@ -605,6 +605,7 @@ MACHINE_START(OMAP_3430SDP, "OMAP3430 3430SDP board") | |||
605 | .init_irq = omap3_init_irq, | 605 | .init_irq = omap3_init_irq, |
606 | .handle_irq = omap3_intc_handle_irq, | 606 | .handle_irq = omap3_intc_handle_irq, |
607 | .init_machine = omap_3430sdp_init, | 607 | .init_machine = omap_3430sdp_init, |
608 | .init_late = omap3430_init_late, | ||
608 | .timer = &omap3_timer, | 609 | .timer = &omap3_timer, |
609 | .restart = omap_prcm_restart, | 610 | .restart = omap_prcm_restart, |
610 | MACHINE_END | 611 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-3630sdp.c b/arch/arm/mach-omap2/board-3630sdp.c index 6ef350d1ae4f..2dc9ba523c7a 100644 --- a/arch/arm/mach-omap2/board-3630sdp.c +++ b/arch/arm/mach-omap2/board-3630sdp.c | |||
@@ -217,6 +217,7 @@ MACHINE_START(OMAP_3630SDP, "OMAP 3630SDP board") | |||
217 | .init_irq = omap3_init_irq, | 217 | .init_irq = omap3_init_irq, |
218 | .handle_irq = omap3_intc_handle_irq, | 218 | .handle_irq = omap3_intc_handle_irq, |
219 | .init_machine = omap_sdp_init, | 219 | .init_machine = omap_sdp_init, |
220 | .init_late = omap3630_init_late, | ||
220 | .timer = &omap3_timer, | 221 | .timer = &omap3_timer, |
221 | .restart = omap_prcm_restart, | 222 | .restart = omap_prcm_restart, |
222 | MACHINE_END | 223 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c index 94af6cde2e36..8e17284a803f 100644 --- a/arch/arm/mach-omap2/board-4430sdp.c +++ b/arch/arm/mach-omap2/board-4430sdp.c | |||
@@ -912,6 +912,7 @@ MACHINE_START(OMAP_4430SDP, "OMAP4430 4430SDP board") | |||
912 | .init_irq = gic_init_irq, | 912 | .init_irq = gic_init_irq, |
913 | .handle_irq = gic_handle_irq, | 913 | .handle_irq = gic_handle_irq, |
914 | .init_machine = omap_4430sdp_init, | 914 | .init_machine = omap_4430sdp_init, |
915 | .init_late = omap4430_init_late, | ||
915 | .timer = &omap4_timer, | 916 | .timer = &omap4_timer, |
916 | .restart = omap_prcm_restart, | 917 | .restart = omap_prcm_restart, |
917 | MACHINE_END | 918 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-am3517crane.c b/arch/arm/mach-omap2/board-am3517crane.c index 3b8a53c1f2a8..92432c28673d 100644 --- a/arch/arm/mach-omap2/board-am3517crane.c +++ b/arch/arm/mach-omap2/board-am3517crane.c | |||
@@ -102,6 +102,7 @@ MACHINE_START(CRANEBOARD, "AM3517/05 CRANEBOARD") | |||
102 | .init_irq = omap3_init_irq, | 102 | .init_irq = omap3_init_irq, |
103 | .handle_irq = omap3_intc_handle_irq, | 103 | .handle_irq = omap3_intc_handle_irq, |
104 | .init_machine = am3517_crane_init, | 104 | .init_machine = am3517_crane_init, |
105 | .init_late = am35xx_init_late, | ||
105 | .timer = &omap3_timer, | 106 | .timer = &omap3_timer, |
106 | .restart = omap_prcm_restart, | 107 | .restart = omap_prcm_restart, |
107 | MACHINE_END | 108 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-am3517evm.c b/arch/arm/mach-omap2/board-am3517evm.c index 99790eb646e8..18f601096ce1 100644 --- a/arch/arm/mach-omap2/board-am3517evm.c +++ b/arch/arm/mach-omap2/board-am3517evm.c | |||
@@ -385,6 +385,7 @@ MACHINE_START(OMAP3517EVM, "OMAP3517/AM3517 EVM") | |||
385 | .init_irq = omap3_init_irq, | 385 | .init_irq = omap3_init_irq, |
386 | .handle_irq = omap3_intc_handle_irq, | 386 | .handle_irq = omap3_intc_handle_irq, |
387 | .init_machine = am3517_evm_init, | 387 | .init_machine = am3517_evm_init, |
388 | .init_late = am35xx_init_late, | ||
388 | .timer = &omap3_timer, | 389 | .timer = &omap3_timer, |
389 | .restart = omap_prcm_restart, | 390 | .restart = omap_prcm_restart, |
390 | MACHINE_END | 391 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-apollon.c b/arch/arm/mach-omap2/board-apollon.c index 768ece2e9c3b..502c31e123be 100644 --- a/arch/arm/mach-omap2/board-apollon.c +++ b/arch/arm/mach-omap2/board-apollon.c | |||
@@ -356,6 +356,7 @@ MACHINE_START(OMAP_APOLLON, "OMAP24xx Apollon") | |||
356 | .init_irq = omap2_init_irq, | 356 | .init_irq = omap2_init_irq, |
357 | .handle_irq = omap2_intc_handle_irq, | 357 | .handle_irq = omap2_intc_handle_irq, |
358 | .init_machine = omap_apollon_init, | 358 | .init_machine = omap_apollon_init, |
359 | .init_late = omap2420_init_late, | ||
359 | .timer = &omap2_timer, | 360 | .timer = &omap2_timer, |
360 | .restart = omap_prcm_restart, | 361 | .restart = omap_prcm_restart, |
361 | MACHINE_END | 362 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-cm-t35.c b/arch/arm/mach-omap2/board-cm-t35.c index c03df142ea67..ded100c80a91 100644 --- a/arch/arm/mach-omap2/board-cm-t35.c +++ b/arch/arm/mach-omap2/board-cm-t35.c | |||
@@ -669,6 +669,7 @@ MACHINE_START(CM_T35, "Compulab CM-T35") | |||
669 | .init_irq = omap3_init_irq, | 669 | .init_irq = omap3_init_irq, |
670 | .handle_irq = omap3_intc_handle_irq, | 670 | .handle_irq = omap3_intc_handle_irq, |
671 | .init_machine = cm_t35_init, | 671 | .init_machine = cm_t35_init, |
672 | .init_late = omap35xx_init_late, | ||
672 | .timer = &omap3_timer, | 673 | .timer = &omap3_timer, |
673 | .restart = omap_prcm_restart, | 674 | .restart = omap_prcm_restart, |
674 | MACHINE_END | 675 | MACHINE_END |
@@ -681,6 +682,7 @@ MACHINE_START(CM_T3730, "Compulab CM-T3730") | |||
681 | .init_irq = omap3_init_irq, | 682 | .init_irq = omap3_init_irq, |
682 | .handle_irq = omap3_intc_handle_irq, | 683 | .handle_irq = omap3_intc_handle_irq, |
683 | .init_machine = cm_t3730_init, | 684 | .init_machine = cm_t3730_init, |
685 | .init_late = omap3630_init_late, | ||
684 | .timer = &omap3_timer, | 686 | .timer = &omap3_timer, |
685 | .restart = omap_prcm_restart, | 687 | .restart = omap_prcm_restart, |
686 | MACHINE_END | 688 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-cm-t3517.c b/arch/arm/mach-omap2/board-cm-t3517.c index 9e66e167e4f3..a33ad4641d9a 100644 --- a/arch/arm/mach-omap2/board-cm-t3517.c +++ b/arch/arm/mach-omap2/board-cm-t3517.c | |||
@@ -303,6 +303,7 @@ MACHINE_START(CM_T3517, "Compulab CM-T3517") | |||
303 | .init_irq = omap3_init_irq, | 303 | .init_irq = omap3_init_irq, |
304 | .handle_irq = omap3_intc_handle_irq, | 304 | .handle_irq = omap3_intc_handle_irq, |
305 | .init_machine = cm_t3517_init, | 305 | .init_machine = cm_t3517_init, |
306 | .init_late = am35xx_init_late, | ||
306 | .timer = &omap3_timer, | 307 | .timer = &omap3_timer, |
307 | .restart = omap_prcm_restart, | 308 | .restart = omap_prcm_restart, |
308 | MACHINE_END | 309 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-devkit8000.c b/arch/arm/mach-omap2/board-devkit8000.c index b063f0d2faa6..6567c1cd5572 100644 --- a/arch/arm/mach-omap2/board-devkit8000.c +++ b/arch/arm/mach-omap2/board-devkit8000.c | |||
@@ -644,6 +644,7 @@ MACHINE_START(DEVKIT8000, "OMAP3 Devkit8000") | |||
644 | .init_irq = omap3_init_irq, | 644 | .init_irq = omap3_init_irq, |
645 | .handle_irq = omap3_intc_handle_irq, | 645 | .handle_irq = omap3_intc_handle_irq, |
646 | .init_machine = devkit8000_init, | 646 | .init_machine = devkit8000_init, |
647 | .init_late = omap35xx_init_late, | ||
647 | .timer = &omap3_secure_timer, | 648 | .timer = &omap3_secure_timer, |
648 | .restart = omap_prcm_restart, | 649 | .restart = omap_prcm_restart, |
649 | MACHINE_END | 650 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-generic.c b/arch/arm/mach-omap2/board-generic.c index 7302ba7ff1b9..202934657867 100644 --- a/arch/arm/mach-omap2/board-generic.c +++ b/arch/arm/mach-omap2/board-generic.c | |||
@@ -125,6 +125,7 @@ DT_MACHINE_START(OMAP4_DT, "Generic OMAP4 (Flattened Device Tree)") | |||
125 | .init_irq = omap_init_irq, | 125 | .init_irq = omap_init_irq, |
126 | .handle_irq = gic_handle_irq, | 126 | .handle_irq = gic_handle_irq, |
127 | .init_machine = omap_generic_init, | 127 | .init_machine = omap_generic_init, |
128 | .init_late = omap4430_init_late, | ||
128 | .timer = &omap4_timer, | 129 | .timer = &omap4_timer, |
129 | .dt_compat = omap4_boards_compat, | 130 | .dt_compat = omap4_boards_compat, |
130 | .restart = omap_prcm_restart, | 131 | .restart = omap_prcm_restart, |
diff --git a/arch/arm/mach-omap2/board-h4.c b/arch/arm/mach-omap2/board-h4.c index 0bbbabe28fcc..876becf8205a 100644 --- a/arch/arm/mach-omap2/board-h4.c +++ b/arch/arm/mach-omap2/board-h4.c | |||
@@ -398,6 +398,7 @@ MACHINE_START(OMAP_H4, "OMAP2420 H4 board") | |||
398 | .init_irq = omap2_init_irq, | 398 | .init_irq = omap2_init_irq, |
399 | .handle_irq = omap2_intc_handle_irq, | 399 | .handle_irq = omap2_intc_handle_irq, |
400 | .init_machine = omap_h4_init, | 400 | .init_machine = omap_h4_init, |
401 | .init_late = omap2420_init_late, | ||
401 | .timer = &omap2_timer, | 402 | .timer = &omap2_timer, |
402 | .restart = omap_prcm_restart, | 403 | .restart = omap_prcm_restart, |
403 | MACHINE_END | 404 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-igep0020.c b/arch/arm/mach-omap2/board-igep0020.c index 7a274098f67b..74915295482e 100644 --- a/arch/arm/mach-omap2/board-igep0020.c +++ b/arch/arm/mach-omap2/board-igep0020.c | |||
@@ -650,6 +650,7 @@ MACHINE_START(IGEP0020, "IGEP v2 board") | |||
650 | .init_irq = omap3_init_irq, | 650 | .init_irq = omap3_init_irq, |
651 | .handle_irq = omap3_intc_handle_irq, | 651 | .handle_irq = omap3_intc_handle_irq, |
652 | .init_machine = igep_init, | 652 | .init_machine = igep_init, |
653 | .init_late = omap35xx_init_late, | ||
653 | .timer = &omap3_timer, | 654 | .timer = &omap3_timer, |
654 | .restart = omap_prcm_restart, | 655 | .restart = omap_prcm_restart, |
655 | MACHINE_END | 656 | MACHINE_END |
@@ -662,6 +663,7 @@ MACHINE_START(IGEP0030, "IGEP OMAP3 module") | |||
662 | .init_irq = omap3_init_irq, | 663 | .init_irq = omap3_init_irq, |
663 | .handle_irq = omap3_intc_handle_irq, | 664 | .handle_irq = omap3_intc_handle_irq, |
664 | .init_machine = igep_init, | 665 | .init_machine = igep_init, |
666 | .init_late = omap35xx_init_late, | ||
665 | .timer = &omap3_timer, | 667 | .timer = &omap3_timer, |
666 | .restart = omap_prcm_restart, | 668 | .restart = omap_prcm_restart, |
667 | MACHINE_END | 669 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-ldp.c b/arch/arm/mach-omap2/board-ldp.c index 1b6049567ab4..ef9e82977499 100644 --- a/arch/arm/mach-omap2/board-ldp.c +++ b/arch/arm/mach-omap2/board-ldp.c | |||
@@ -442,6 +442,7 @@ MACHINE_START(OMAP_LDP, "OMAP LDP board") | |||
442 | .init_irq = omap3_init_irq, | 442 | .init_irq = omap3_init_irq, |
443 | .handle_irq = omap3_intc_handle_irq, | 443 | .handle_irq = omap3_intc_handle_irq, |
444 | .init_machine = omap_ldp_init, | 444 | .init_machine = omap_ldp_init, |
445 | .init_late = omap3430_init_late, | ||
445 | .timer = &omap3_timer, | 446 | .timer = &omap3_timer, |
446 | .restart = omap_prcm_restart, | 447 | .restart = omap_prcm_restart, |
447 | MACHINE_END | 448 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-n8x0.c b/arch/arm/mach-omap2/board-n8x0.c index 518091c5f77c..8ca14e88a31a 100644 --- a/arch/arm/mach-omap2/board-n8x0.c +++ b/arch/arm/mach-omap2/board-n8x0.c | |||
@@ -694,6 +694,7 @@ MACHINE_START(NOKIA_N800, "Nokia N800") | |||
694 | .init_irq = omap2_init_irq, | 694 | .init_irq = omap2_init_irq, |
695 | .handle_irq = omap2_intc_handle_irq, | 695 | .handle_irq = omap2_intc_handle_irq, |
696 | .init_machine = n8x0_init_machine, | 696 | .init_machine = n8x0_init_machine, |
697 | .init_late = omap2420_init_late, | ||
697 | .timer = &omap2_timer, | 698 | .timer = &omap2_timer, |
698 | .restart = omap_prcm_restart, | 699 | .restart = omap_prcm_restart, |
699 | MACHINE_END | 700 | MACHINE_END |
@@ -706,6 +707,7 @@ MACHINE_START(NOKIA_N810, "Nokia N810") | |||
706 | .init_irq = omap2_init_irq, | 707 | .init_irq = omap2_init_irq, |
707 | .handle_irq = omap2_intc_handle_irq, | 708 | .handle_irq = omap2_intc_handle_irq, |
708 | .init_machine = n8x0_init_machine, | 709 | .init_machine = n8x0_init_machine, |
710 | .init_late = omap2420_init_late, | ||
709 | .timer = &omap2_timer, | 711 | .timer = &omap2_timer, |
710 | .restart = omap_prcm_restart, | 712 | .restart = omap_prcm_restart, |
711 | MACHINE_END | 713 | MACHINE_END |
@@ -718,6 +720,7 @@ MACHINE_START(NOKIA_N810_WIMAX, "Nokia N810 WiMAX") | |||
718 | .init_irq = omap2_init_irq, | 720 | .init_irq = omap2_init_irq, |
719 | .handle_irq = omap2_intc_handle_irq, | 721 | .handle_irq = omap2_intc_handle_irq, |
720 | .init_machine = n8x0_init_machine, | 722 | .init_machine = n8x0_init_machine, |
723 | .init_late = omap2420_init_late, | ||
721 | .timer = &omap2_timer, | 724 | .timer = &omap2_timer, |
722 | .restart = omap_prcm_restart, | 725 | .restart = omap_prcm_restart, |
723 | MACHINE_END | 726 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c index 2a7b9a9da1db..79c6909eeb78 100644 --- a/arch/arm/mach-omap2/board-omap3beagle.c +++ b/arch/arm/mach-omap2/board-omap3beagle.c | |||
@@ -543,6 +543,7 @@ MACHINE_START(OMAP3_BEAGLE, "OMAP3 Beagle Board") | |||
543 | .init_irq = omap3_init_irq, | 543 | .init_irq = omap3_init_irq, |
544 | .handle_irq = omap3_intc_handle_irq, | 544 | .handle_irq = omap3_intc_handle_irq, |
545 | .init_machine = omap3_beagle_init, | 545 | .init_machine = omap3_beagle_init, |
546 | .init_late = omap3_init_late, | ||
546 | .timer = &omap3_secure_timer, | 547 | .timer = &omap3_secure_timer, |
547 | .restart = omap_prcm_restart, | 548 | .restart = omap_prcm_restart, |
548 | MACHINE_END | 549 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c index ace3c675e9c2..639bd07ea38a 100644 --- a/arch/arm/mach-omap2/board-omap3evm.c +++ b/arch/arm/mach-omap2/board-omap3evm.c | |||
@@ -671,6 +671,7 @@ MACHINE_START(OMAP3EVM, "OMAP3 EVM") | |||
671 | .init_irq = omap3_init_irq, | 671 | .init_irq = omap3_init_irq, |
672 | .handle_irq = omap3_intc_handle_irq, | 672 | .handle_irq = omap3_intc_handle_irq, |
673 | .init_machine = omap3_evm_init, | 673 | .init_machine = omap3_evm_init, |
674 | .init_late = omap35xx_init_late, | ||
674 | .timer = &omap3_timer, | 675 | .timer = &omap3_timer, |
675 | .restart = omap_prcm_restart, | 676 | .restart = omap_prcm_restart, |
676 | MACHINE_END | 677 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-omap3logic.c b/arch/arm/mach-omap2/board-omap3logic.c index c008bf8e1c36..932e1778aff9 100644 --- a/arch/arm/mach-omap2/board-omap3logic.c +++ b/arch/arm/mach-omap2/board-omap3logic.c | |||
@@ -242,6 +242,7 @@ MACHINE_START(OMAP3_TORPEDO, "Logic OMAP3 Torpedo board") | |||
242 | .init_irq = omap3_init_irq, | 242 | .init_irq = omap3_init_irq, |
243 | .handle_irq = omap3_intc_handle_irq, | 243 | .handle_irq = omap3_intc_handle_irq, |
244 | .init_machine = omap3logic_init, | 244 | .init_machine = omap3logic_init, |
245 | .init_late = omap35xx_init_late, | ||
245 | .timer = &omap3_timer, | 246 | .timer = &omap3_timer, |
246 | .restart = omap_prcm_restart, | 247 | .restart = omap_prcm_restart, |
247 | MACHINE_END | 248 | MACHINE_END |
@@ -254,6 +255,7 @@ MACHINE_START(OMAP3530_LV_SOM, "OMAP Logic 3530 LV SOM board") | |||
254 | .init_irq = omap3_init_irq, | 255 | .init_irq = omap3_init_irq, |
255 | .handle_irq = omap3_intc_handle_irq, | 256 | .handle_irq = omap3_intc_handle_irq, |
256 | .init_machine = omap3logic_init, | 257 | .init_machine = omap3logic_init, |
258 | .init_late = omap35xx_init_late, | ||
257 | .timer = &omap3_timer, | 259 | .timer = &omap3_timer, |
258 | .restart = omap_prcm_restart, | 260 | .restart = omap_prcm_restart, |
259 | MACHINE_END | 261 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-omap3pandora.c b/arch/arm/mach-omap2/board-omap3pandora.c index 33d995d0f075..57aebee44fd0 100644 --- a/arch/arm/mach-omap2/board-omap3pandora.c +++ b/arch/arm/mach-omap2/board-omap3pandora.c | |||
@@ -622,6 +622,7 @@ MACHINE_START(OMAP3_PANDORA, "Pandora Handheld Console") | |||
622 | .init_irq = omap3_init_irq, | 622 | .init_irq = omap3_init_irq, |
623 | .handle_irq = omap3_intc_handle_irq, | 623 | .handle_irq = omap3_intc_handle_irq, |
624 | .init_machine = omap3pandora_init, | 624 | .init_machine = omap3pandora_init, |
625 | .init_late = omap35xx_init_late, | ||
625 | .timer = &omap3_timer, | 626 | .timer = &omap3_timer, |
626 | .restart = omap_prcm_restart, | 627 | .restart = omap_prcm_restart, |
627 | MACHINE_END | 628 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-omap3stalker.c b/arch/arm/mach-omap2/board-omap3stalker.c index 4396bae91677..b318f5602e36 100644 --- a/arch/arm/mach-omap2/board-omap3stalker.c +++ b/arch/arm/mach-omap2/board-omap3stalker.c | |||
@@ -436,6 +436,7 @@ MACHINE_START(SBC3530, "OMAP3 STALKER") | |||
436 | .init_irq = omap3_init_irq, | 436 | .init_irq = omap3_init_irq, |
437 | .handle_irq = omap3_intc_handle_irq, | 437 | .handle_irq = omap3_intc_handle_irq, |
438 | .init_machine = omap3_stalker_init, | 438 | .init_machine = omap3_stalker_init, |
439 | .init_late = omap35xx_init_late, | ||
439 | .timer = &omap3_secure_timer, | 440 | .timer = &omap3_secure_timer, |
440 | .restart = omap_prcm_restart, | 441 | .restart = omap_prcm_restart, |
441 | MACHINE_END | 442 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-omap3touchbook.c b/arch/arm/mach-omap2/board-omap3touchbook.c index ae2251fa4a69..485d14d6a8cd 100644 --- a/arch/arm/mach-omap2/board-omap3touchbook.c +++ b/arch/arm/mach-omap2/board-omap3touchbook.c | |||
@@ -387,6 +387,7 @@ MACHINE_START(TOUCHBOOK, "OMAP3 touchbook Board") | |||
387 | .init_irq = omap3_init_irq, | 387 | .init_irq = omap3_init_irq, |
388 | .handle_irq = omap3_intc_handle_irq, | 388 | .handle_irq = omap3_intc_handle_irq, |
389 | .init_machine = omap3_touchbook_init, | 389 | .init_machine = omap3_touchbook_init, |
390 | .init_late = omap3430_init_late, | ||
390 | .timer = &omap3_secure_timer, | 391 | .timer = &omap3_secure_timer, |
391 | .restart = omap_prcm_restart, | 392 | .restart = omap_prcm_restart, |
392 | MACHINE_END | 393 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c index 68b8fc9ff010..982fb2622ab8 100644 --- a/arch/arm/mach-omap2/board-omap4panda.c +++ b/arch/arm/mach-omap2/board-omap4panda.c | |||
@@ -521,6 +521,7 @@ MACHINE_START(OMAP4_PANDA, "OMAP4 Panda board") | |||
521 | .init_irq = gic_init_irq, | 521 | .init_irq = gic_init_irq, |
522 | .handle_irq = gic_handle_irq, | 522 | .handle_irq = gic_handle_irq, |
523 | .init_machine = omap4_panda_init, | 523 | .init_machine = omap4_panda_init, |
524 | .init_late = omap4430_init_late, | ||
524 | .timer = &omap4_timer, | 525 | .timer = &omap4_timer, |
525 | .restart = omap_prcm_restart, | 526 | .restart = omap_prcm_restart, |
526 | MACHINE_END | 527 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-overo.c b/arch/arm/mach-omap2/board-overo.c index 5527c1979a16..8fa2fc3a4c3c 100644 --- a/arch/arm/mach-omap2/board-overo.c +++ b/arch/arm/mach-omap2/board-overo.c | |||
@@ -554,6 +554,7 @@ MACHINE_START(OVERO, "Gumstix Overo") | |||
554 | .init_irq = omap3_init_irq, | 554 | .init_irq = omap3_init_irq, |
555 | .handle_irq = omap3_intc_handle_irq, | 555 | .handle_irq = omap3_intc_handle_irq, |
556 | .init_machine = overo_init, | 556 | .init_machine = overo_init, |
557 | .init_late = omap35xx_init_late, | ||
557 | .timer = &omap3_timer, | 558 | .timer = &omap3_timer, |
558 | .restart = omap_prcm_restart, | 559 | .restart = omap_prcm_restart, |
559 | MACHINE_END | 560 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-rm680.c b/arch/arm/mach-omap2/board-rm680.c index ae53d71f0ce0..0ad1bb3bdb98 100644 --- a/arch/arm/mach-omap2/board-rm680.c +++ b/arch/arm/mach-omap2/board-rm680.c | |||
@@ -151,6 +151,7 @@ MACHINE_START(NOKIA_RM680, "Nokia RM-680 board") | |||
151 | .init_irq = omap3_init_irq, | 151 | .init_irq = omap3_init_irq, |
152 | .handle_irq = omap3_intc_handle_irq, | 152 | .handle_irq = omap3_intc_handle_irq, |
153 | .init_machine = rm680_init, | 153 | .init_machine = rm680_init, |
154 | .init_late = omap3630_init_late, | ||
154 | .timer = &omap3_timer, | 155 | .timer = &omap3_timer, |
155 | .restart = omap_prcm_restart, | 156 | .restart = omap_prcm_restart, |
156 | MACHINE_END | 157 | MACHINE_END |
@@ -163,6 +164,7 @@ MACHINE_START(NOKIA_RM696, "Nokia RM-696 board") | |||
163 | .init_irq = omap3_init_irq, | 164 | .init_irq = omap3_init_irq, |
164 | .handle_irq = omap3_intc_handle_irq, | 165 | .handle_irq = omap3_intc_handle_irq, |
165 | .init_machine = rm680_init, | 166 | .init_machine = rm680_init, |
167 | .init_late = omap3630_init_late, | ||
166 | .timer = &omap3_timer, | 168 | .timer = &omap3_timer, |
167 | .restart = omap_prcm_restart, | 169 | .restart = omap_prcm_restart, |
168 | MACHINE_END | 170 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-rx51.c b/arch/arm/mach-omap2/board-rx51.c index 2da92a6ba40a..345dd931f76f 100644 --- a/arch/arm/mach-omap2/board-rx51.c +++ b/arch/arm/mach-omap2/board-rx51.c | |||
@@ -127,6 +127,7 @@ MACHINE_START(NOKIA_RX51, "Nokia RX-51 board") | |||
127 | .init_irq = omap3_init_irq, | 127 | .init_irq = omap3_init_irq, |
128 | .handle_irq = omap3_intc_handle_irq, | 128 | .handle_irq = omap3_intc_handle_irq, |
129 | .init_machine = rx51_init, | 129 | .init_machine = rx51_init, |
130 | .init_late = omap3430_init_late, | ||
130 | .timer = &omap3_timer, | 131 | .timer = &omap3_timer, |
131 | .restart = omap_prcm_restart, | 132 | .restart = omap_prcm_restart, |
132 | MACHINE_END | 133 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-ti8168evm.c b/arch/arm/mach-omap2/board-ti8168evm.c index ab9a7a9e9d64..d4c8392cadb6 100644 --- a/arch/arm/mach-omap2/board-ti8168evm.c +++ b/arch/arm/mach-omap2/board-ti8168evm.c | |||
@@ -52,6 +52,7 @@ MACHINE_START(TI8168EVM, "ti8168evm") | |||
52 | .init_irq = ti81xx_init_irq, | 52 | .init_irq = ti81xx_init_irq, |
53 | .timer = &omap3_timer, | 53 | .timer = &omap3_timer, |
54 | .init_machine = ti81xx_evm_init, | 54 | .init_machine = ti81xx_evm_init, |
55 | .init_late = ti81xx_init_late, | ||
55 | .restart = omap_prcm_restart, | 56 | .restart = omap_prcm_restart, |
56 | MACHINE_END | 57 | MACHINE_END |
57 | 58 | ||
@@ -63,5 +64,6 @@ MACHINE_START(TI8148EVM, "ti8148evm") | |||
63 | .init_irq = ti81xx_init_irq, | 64 | .init_irq = ti81xx_init_irq, |
64 | .timer = &omap3_timer, | 65 | .timer = &omap3_timer, |
65 | .init_machine = ti81xx_evm_init, | 66 | .init_machine = ti81xx_evm_init, |
67 | .init_late = ti81xx_init_late, | ||
66 | .restart = omap_prcm_restart, | 68 | .restart = omap_prcm_restart, |
67 | MACHINE_END | 69 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-zoom.c b/arch/arm/mach-omap2/board-zoom.c index 5c20bcc57f2b..4e7e56142e6f 100644 --- a/arch/arm/mach-omap2/board-zoom.c +++ b/arch/arm/mach-omap2/board-zoom.c | |||
@@ -137,6 +137,7 @@ MACHINE_START(OMAP_ZOOM2, "OMAP Zoom2 board") | |||
137 | .init_irq = omap3_init_irq, | 137 | .init_irq = omap3_init_irq, |
138 | .handle_irq = omap3_intc_handle_irq, | 138 | .handle_irq = omap3_intc_handle_irq, |
139 | .init_machine = omap_zoom_init, | 139 | .init_machine = omap_zoom_init, |
140 | .init_late = omap3430_init_late, | ||
140 | .timer = &omap3_timer, | 141 | .timer = &omap3_timer, |
141 | .restart = omap_prcm_restart, | 142 | .restart = omap_prcm_restart, |
142 | MACHINE_END | 143 | MACHINE_END |
@@ -149,6 +150,7 @@ MACHINE_START(OMAP_ZOOM3, "OMAP Zoom3 board") | |||
149 | .init_irq = omap3_init_irq, | 150 | .init_irq = omap3_init_irq, |
150 | .handle_irq = omap3_intc_handle_irq, | 151 | .handle_irq = omap3_intc_handle_irq, |
151 | .init_machine = omap_zoom_init, | 152 | .init_machine = omap_zoom_init, |
153 | .init_late = omap3630_init_late, | ||
152 | .timer = &omap3_timer, | 154 | .timer = &omap3_timer, |
153 | .restart = omap_prcm_restart, | 155 | .restart = omap_prcm_restart, |
154 | MACHINE_END | 156 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/common.h b/arch/arm/mach-omap2/common.h index d6c9e6180318..be9dfd1abe60 100644 --- a/arch/arm/mach-omap2/common.h +++ b/arch/arm/mach-omap2/common.h | |||
@@ -55,7 +55,7 @@ static inline void omap34xx_map_common_io(void) | |||
55 | } | 55 | } |
56 | #endif | 56 | #endif |
57 | 57 | ||
58 | #ifdef CONFIG_SOC_OMAPTI81XX | 58 | #ifdef CONFIG_SOC_TI81XX |
59 | extern void omapti81xx_map_common_io(void); | 59 | extern void omapti81xx_map_common_io(void); |
60 | #else | 60 | #else |
61 | static inline void omapti81xx_map_common_io(void) | 61 | static inline void omapti81xx_map_common_io(void) |
@@ -63,7 +63,7 @@ static inline void omapti81xx_map_common_io(void) | |||
63 | } | 63 | } |
64 | #endif | 64 | #endif |
65 | 65 | ||
66 | #ifdef CONFIG_SOC_OMAPAM33XX | 66 | #ifdef CONFIG_SOC_AM33XX |
67 | extern void omapam33xx_map_common_io(void); | 67 | extern void omapam33xx_map_common_io(void); |
68 | #else | 68 | #else |
69 | static inline void omapam33xx_map_common_io(void) | 69 | static inline void omapam33xx_map_common_io(void) |
@@ -79,6 +79,42 @@ static inline void omap44xx_map_common_io(void) | |||
79 | } | 79 | } |
80 | #endif | 80 | #endif |
81 | 81 | ||
82 | #if defined(CONFIG_PM) && defined(CONFIG_ARCH_OMAP2) | ||
83 | int omap2_pm_init(void); | ||
84 | #else | ||
85 | static inline int omap2_pm_init(void) | ||
86 | { | ||
87 | return 0; | ||
88 | } | ||
89 | #endif | ||
90 | |||
91 | #if defined(CONFIG_PM) && defined(CONFIG_ARCH_OMAP3) | ||
92 | int omap3_pm_init(void); | ||
93 | #else | ||
94 | static inline int omap3_pm_init(void) | ||
95 | { | ||
96 | return 0; | ||
97 | } | ||
98 | #endif | ||
99 | |||
100 | #if defined(CONFIG_PM) && defined(CONFIG_ARCH_OMAP4) | ||
101 | int omap4_pm_init(void); | ||
102 | #else | ||
103 | static inline int omap4_pm_init(void) | ||
104 | { | ||
105 | return 0; | ||
106 | } | ||
107 | #endif | ||
108 | |||
109 | #ifdef CONFIG_OMAP_MUX | ||
110 | int omap_mux_late_init(void); | ||
111 | #else | ||
112 | static inline int omap_mux_late_init(void) | ||
113 | { | ||
114 | return 0; | ||
115 | } | ||
116 | #endif | ||
117 | |||
82 | extern void omap2_init_common_infrastructure(void); | 118 | extern void omap2_init_common_infrastructure(void); |
83 | 119 | ||
84 | extern struct sys_timer omap2_timer; | 120 | extern struct sys_timer omap2_timer; |
@@ -95,6 +131,17 @@ void omap3_init_early(void); /* Do not use this one */ | |||
95 | void am35xx_init_early(void); | 131 | void am35xx_init_early(void); |
96 | void ti81xx_init_early(void); | 132 | void ti81xx_init_early(void); |
97 | void omap4430_init_early(void); | 133 | void omap4430_init_early(void); |
134 | void omap3_init_late(void); /* Do not use this one */ | ||
135 | void omap4430_init_late(void); | ||
136 | void omap2420_init_late(void); | ||
137 | void omap2430_init_late(void); | ||
138 | void omap3430_init_late(void); | ||
139 | void omap35xx_init_late(void); | ||
140 | void omap3630_init_late(void); | ||
141 | void am35xx_init_late(void); | ||
142 | void ti81xx_init_late(void); | ||
143 | void omap4430_init_late(void); | ||
144 | int omap2_common_pm_late_init(void); | ||
98 | void omap_prcm_restart(char, const char *); | 145 | void omap_prcm_restart(char, const char *); |
99 | 146 | ||
100 | /* | 147 | /* |
diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c index ae62ece04ef9..7b4b9327e543 100644 --- a/arch/arm/mach-omap2/devices.c +++ b/arch/arm/mach-omap2/devices.c | |||
@@ -645,7 +645,11 @@ static inline void omap242x_mmc_mux(struct omap_mmc_platform_data | |||
645 | 645 | ||
646 | void __init omap242x_init_mmc(struct omap_mmc_platform_data **mmc_data) | 646 | void __init omap242x_init_mmc(struct omap_mmc_platform_data **mmc_data) |
647 | { | 647 | { |
648 | char *name = "mmci-omap"; | 648 | struct platform_device *pdev; |
649 | struct omap_hwmod *oh; | ||
650 | int id = 0; | ||
651 | char *oh_name = "msdi1"; | ||
652 | char *dev_name = "mmci-omap"; | ||
649 | 653 | ||
650 | if (!mmc_data[0]) { | 654 | if (!mmc_data[0]) { |
651 | pr_err("%s fails: Incomplete platform data\n", __func__); | 655 | pr_err("%s fails: Incomplete platform data\n", __func__); |
@@ -653,8 +657,17 @@ void __init omap242x_init_mmc(struct omap_mmc_platform_data **mmc_data) | |||
653 | } | 657 | } |
654 | 658 | ||
655 | omap242x_mmc_mux(mmc_data[0]); | 659 | omap242x_mmc_mux(mmc_data[0]); |
656 | omap_mmc_add(name, 0, OMAP2_MMC1_BASE, OMAP2420_MMC_SIZE, | 660 | |
657 | INT_24XX_MMC_IRQ, mmc_data[0]); | 661 | oh = omap_hwmod_lookup(oh_name); |
662 | if (!oh) { | ||
663 | pr_err("Could not look up %s\n", oh_name); | ||
664 | return; | ||
665 | } | ||
666 | pdev = omap_device_build(dev_name, id, oh, mmc_data[0], | ||
667 | sizeof(struct omap_mmc_platform_data), NULL, 0, 0); | ||
668 | if (IS_ERR(pdev)) | ||
669 | WARN(1, "Can'd build omap_device for %s:%s.\n", | ||
670 | dev_name, oh->name); | ||
658 | } | 671 | } |
659 | 672 | ||
660 | #endif | 673 | #endif |
diff --git a/arch/arm/mach-omap2/dma.c b/arch/arm/mach-omap2/dma.c index b19d8496c16e..ff75abe60af2 100644 --- a/arch/arm/mach-omap2/dma.c +++ b/arch/arm/mach-omap2/dma.c | |||
@@ -227,10 +227,6 @@ static int __init omap2_system_dma_init_dev(struct omap_hwmod *oh, void *unused) | |||
227 | 227 | ||
228 | dma_stride = OMAP2_DMA_STRIDE; | 228 | dma_stride = OMAP2_DMA_STRIDE; |
229 | dma_common_ch_start = CSDP; | 229 | dma_common_ch_start = CSDP; |
230 | if (cpu_is_omap3630() || cpu_is_omap44xx()) | ||
231 | dma_common_ch_end = CCDN; | ||
232 | else | ||
233 | dma_common_ch_end = CCFN; | ||
234 | 230 | ||
235 | p = kzalloc(sizeof(struct omap_system_dma_plat_info), GFP_KERNEL); | 231 | p = kzalloc(sizeof(struct omap_system_dma_plat_info), GFP_KERNEL); |
236 | if (!p) { | 232 | if (!p) { |
@@ -277,6 +273,13 @@ static int __init omap2_system_dma_init_dev(struct omap_hwmod *oh, void *unused) | |||
277 | dev_err(&pdev->dev, "%s: kzalloc fail\n", __func__); | 273 | dev_err(&pdev->dev, "%s: kzalloc fail\n", __func__); |
278 | return -ENOMEM; | 274 | return -ENOMEM; |
279 | } | 275 | } |
276 | |||
277 | /* Check the capabilities register for descriptor loading feature */ | ||
278 | if (dma_read(CAPS_0, 0) & DMA_HAS_DESCRIPTOR_CAPS) | ||
279 | dma_common_ch_end = CCDN; | ||
280 | else | ||
281 | dma_common_ch_end = CCFN; | ||
282 | |||
280 | return 0; | 283 | return 0; |
281 | } | 284 | } |
282 | 285 | ||
diff --git a/arch/arm/mach-omap2/dsp.c b/arch/arm/mach-omap2/dsp.c index 3376388b317a..845309f146fe 100644 --- a/arch/arm/mach-omap2/dsp.c +++ b/arch/arm/mach-omap2/dsp.c | |||
@@ -28,8 +28,6 @@ | |||
28 | 28 | ||
29 | #include <plat/dsp.h> | 29 | #include <plat/dsp.h> |
30 | 30 | ||
31 | extern phys_addr_t omap_dsp_get_mempool_base(void); | ||
32 | |||
33 | static struct platform_device *omap_dsp_pdev; | 31 | static struct platform_device *omap_dsp_pdev; |
34 | 32 | ||
35 | static struct omap_dsp_platform_data omap_dsp_pdata __initdata = { | 33 | static struct omap_dsp_platform_data omap_dsp_pdata __initdata = { |
@@ -47,6 +45,31 @@ static struct omap_dsp_platform_data omap_dsp_pdata __initdata = { | |||
47 | .dsp_cm_rmw_bits = omap2_cm_rmw_mod_reg_bits, | 45 | .dsp_cm_rmw_bits = omap2_cm_rmw_mod_reg_bits, |
48 | }; | 46 | }; |
49 | 47 | ||
48 | static phys_addr_t omap_dsp_phys_mempool_base; | ||
49 | |||
50 | void __init omap_dsp_reserve_sdram_memblock(void) | ||
51 | { | ||
52 | phys_addr_t size = CONFIG_TIDSPBRIDGE_MEMPOOL_SIZE; | ||
53 | phys_addr_t paddr; | ||
54 | |||
55 | if (!size) | ||
56 | return; | ||
57 | |||
58 | paddr = arm_memblock_steal(size, SZ_1M); | ||
59 | if (!paddr) { | ||
60 | pr_err("%s: failed to reserve %llx bytes\n", | ||
61 | __func__, (unsigned long long)size); | ||
62 | return; | ||
63 | } | ||
64 | |||
65 | omap_dsp_phys_mempool_base = paddr; | ||
66 | } | ||
67 | |||
68 | static phys_addr_t omap_dsp_get_mempool_base(void) | ||
69 | { | ||
70 | return omap_dsp_phys_mempool_base; | ||
71 | } | ||
72 | |||
50 | static int __init omap_dsp_init(void) | 73 | static int __init omap_dsp_init(void) |
51 | { | 74 | { |
52 | struct platform_device *pdev; | 75 | struct platform_device *pdev; |
diff --git a/arch/arm/mach-omap2/gpmc.c b/arch/arm/mach-omap2/gpmc.c index 580e684e8825..46b09dae770e 100644 --- a/arch/arm/mach-omap2/gpmc.c +++ b/arch/arm/mach-omap2/gpmc.c | |||
@@ -50,6 +50,19 @@ | |||
50 | #define GPMC_ECC_SIZE_CONFIG 0x1fc | 50 | #define GPMC_ECC_SIZE_CONFIG 0x1fc |
51 | #define GPMC_ECC1_RESULT 0x200 | 51 | #define GPMC_ECC1_RESULT 0x200 |
52 | 52 | ||
53 | /* GPMC ECC control settings */ | ||
54 | #define GPMC_ECC_CTRL_ECCCLEAR 0x100 | ||
55 | #define GPMC_ECC_CTRL_ECCDISABLE 0x000 | ||
56 | #define GPMC_ECC_CTRL_ECCREG1 0x001 | ||
57 | #define GPMC_ECC_CTRL_ECCREG2 0x002 | ||
58 | #define GPMC_ECC_CTRL_ECCREG3 0x003 | ||
59 | #define GPMC_ECC_CTRL_ECCREG4 0x004 | ||
60 | #define GPMC_ECC_CTRL_ECCREG5 0x005 | ||
61 | #define GPMC_ECC_CTRL_ECCREG6 0x006 | ||
62 | #define GPMC_ECC_CTRL_ECCREG7 0x007 | ||
63 | #define GPMC_ECC_CTRL_ECCREG8 0x008 | ||
64 | #define GPMC_ECC_CTRL_ECCREG9 0x009 | ||
65 | |||
53 | #define GPMC_CS0_OFFSET 0x60 | 66 | #define GPMC_CS0_OFFSET 0x60 |
54 | #define GPMC_CS_SIZE 0x30 | 67 | #define GPMC_CS_SIZE 0x30 |
55 | 68 | ||
@@ -860,8 +873,9 @@ int gpmc_enable_hwecc(int cs, int mode, int dev_width, int ecc_size) | |||
860 | gpmc_ecc_used = cs; | 873 | gpmc_ecc_used = cs; |
861 | 874 | ||
862 | /* clear ecc and enable bits */ | 875 | /* clear ecc and enable bits */ |
863 | val = ((0x00000001<<8) | 0x00000001); | 876 | gpmc_write_reg(GPMC_ECC_CONTROL, |
864 | gpmc_write_reg(GPMC_ECC_CONTROL, val); | 877 | GPMC_ECC_CTRL_ECCCLEAR | |
878 | GPMC_ECC_CTRL_ECCREG1); | ||
865 | 879 | ||
866 | /* program ecc and result sizes */ | 880 | /* program ecc and result sizes */ |
867 | val = ((((ecc_size >> 1) - 1) << 22) | (0x0000000F)); | 881 | val = ((((ecc_size >> 1) - 1) << 22) | (0x0000000F)); |
@@ -869,13 +883,15 @@ int gpmc_enable_hwecc(int cs, int mode, int dev_width, int ecc_size) | |||
869 | 883 | ||
870 | switch (mode) { | 884 | switch (mode) { |
871 | case GPMC_ECC_READ: | 885 | case GPMC_ECC_READ: |
872 | gpmc_write_reg(GPMC_ECC_CONTROL, 0x101); | 886 | case GPMC_ECC_WRITE: |
887 | gpmc_write_reg(GPMC_ECC_CONTROL, | ||
888 | GPMC_ECC_CTRL_ECCCLEAR | | ||
889 | GPMC_ECC_CTRL_ECCREG1); | ||
873 | break; | 890 | break; |
874 | case GPMC_ECC_READSYN: | 891 | case GPMC_ECC_READSYN: |
875 | gpmc_write_reg(GPMC_ECC_CONTROL, 0x100); | 892 | gpmc_write_reg(GPMC_ECC_CONTROL, |
876 | break; | 893 | GPMC_ECC_CTRL_ECCCLEAR | |
877 | case GPMC_ECC_WRITE: | 894 | GPMC_ECC_CTRL_ECCDISABLE); |
878 | gpmc_write_reg(GPMC_ECC_CONTROL, 0x101); | ||
879 | break; | 895 | break; |
880 | default: | 896 | default: |
881 | printk(KERN_INFO "Error: Unrecognized Mode[%d]!\n", mode); | 897 | printk(KERN_INFO "Error: Unrecognized Mode[%d]!\n", mode); |
diff --git a/arch/arm/mach-omap2/hsmmc.c b/arch/arm/mach-omap2/hsmmc.c index b0268eaffe13..be697d4e0843 100644 --- a/arch/arm/mach-omap2/hsmmc.c +++ b/arch/arm/mach-omap2/hsmmc.c | |||
@@ -355,7 +355,7 @@ static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c, | |||
355 | * | 355 | * |
356 | * temporary HACK: ocr_mask instead of fixed supply | 356 | * temporary HACK: ocr_mask instead of fixed supply |
357 | */ | 357 | */ |
358 | if (cpu_is_omap3505() || cpu_is_omap3517()) | 358 | if (soc_is_am35xx()) |
359 | mmc->slots[0].ocr_mask = MMC_VDD_165_195 | | 359 | mmc->slots[0].ocr_mask = MMC_VDD_165_195 | |
360 | MMC_VDD_26_27 | | 360 | MMC_VDD_26_27 | |
361 | MMC_VDD_27_28 | | 361 | MMC_VDD_27_28 | |
@@ -365,7 +365,7 @@ static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c, | |||
365 | else | 365 | else |
366 | mmc->slots[0].ocr_mask = c->ocr_mask; | 366 | mmc->slots[0].ocr_mask = c->ocr_mask; |
367 | 367 | ||
368 | if (!cpu_is_omap3517() && !cpu_is_omap3505()) | 368 | if (!soc_is_am35xx()) |
369 | mmc->slots[0].features |= HSMMC_HAS_PBIAS; | 369 | mmc->slots[0].features |= HSMMC_HAS_PBIAS; |
370 | 370 | ||
371 | if (cpu_is_omap44xx() && (omap_rev() > OMAP4430_REV_ES1_0)) | 371 | if (cpu_is_omap44xx() && (omap_rev() > OMAP4430_REV_ES1_0)) |
@@ -388,7 +388,7 @@ static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c, | |||
388 | } | 388 | } |
389 | } | 389 | } |
390 | 390 | ||
391 | if (cpu_is_omap3517() || cpu_is_omap3505()) | 391 | if (soc_is_am35xx()) |
392 | mmc->slots[0].set_power = nop_mmc_set_power; | 392 | mmc->slots[0].set_power = nop_mmc_set_power; |
393 | 393 | ||
394 | /* OMAP3630 HSMMC1 supports only 4-bit */ | 394 | /* OMAP3630 HSMMC1 supports only 4-bit */ |
@@ -400,7 +400,7 @@ static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c, | |||
400 | } | 400 | } |
401 | break; | 401 | break; |
402 | case 2: | 402 | case 2: |
403 | if (cpu_is_omap3517() || cpu_is_omap3505()) | 403 | if (soc_is_am35xx()) |
404 | mmc->slots[0].set_power = am35x_hsmmc2_set_power; | 404 | mmc->slots[0].set_power = am35x_hsmmc2_set_power; |
405 | 405 | ||
406 | if (c->ext_clock) | 406 | if (c->ext_clock) |
diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c index f1398171d8a2..0389b3264abe 100644 --- a/arch/arm/mach-omap2/id.c +++ b/arch/arm/mach-omap2/id.c | |||
@@ -185,8 +185,7 @@ static void __init omap3_cpuinfo(void) | |||
185 | */ | 185 | */ |
186 | if (cpu_is_omap3630()) { | 186 | if (cpu_is_omap3630()) { |
187 | cpu_name = "OMAP3630"; | 187 | cpu_name = "OMAP3630"; |
188 | } else if (cpu_is_omap3517()) { | 188 | } else if (soc_is_am35xx()) { |
189 | /* AM35xx devices */ | ||
190 | cpu_name = (omap3_has_sgx()) ? "AM3517" : "AM3505"; | 189 | cpu_name = (omap3_has_sgx()) ? "AM3517" : "AM3505"; |
191 | } else if (cpu_is_ti816x()) { | 190 | } else if (cpu_is_ti816x()) { |
192 | cpu_name = "TI816X"; | 191 | cpu_name = "TI816X"; |
@@ -352,13 +351,13 @@ void __init omap3xxx_check_revision(void) | |||
352 | */ | 351 | */ |
353 | switch (rev) { | 352 | switch (rev) { |
354 | case 0: | 353 | case 0: |
355 | omap_revision = OMAP3517_REV_ES1_0; | 354 | omap_revision = AM35XX_REV_ES1_0; |
356 | cpu_rev = "1.0"; | 355 | cpu_rev = "1.0"; |
357 | break; | 356 | break; |
358 | case 1: | 357 | case 1: |
359 | /* FALLTHROUGH */ | 358 | /* FALLTHROUGH */ |
360 | default: | 359 | default: |
361 | omap_revision = OMAP3517_REV_ES1_1; | 360 | omap_revision = AM35XX_REV_ES1_1; |
362 | cpu_rev = "1.1"; | 361 | cpu_rev = "1.1"; |
363 | } | 362 | } |
364 | break; | 363 | break; |
diff --git a/arch/arm/mach-omap2/include/mach/omap-wakeupgen.h b/arch/arm/mach-omap2/include/mach/omap-wakeupgen.h index d79321b0f2a2..548de90b58c2 100644 --- a/arch/arm/mach-omap2/include/mach/omap-wakeupgen.h +++ b/arch/arm/mach-omap2/include/mach/omap-wakeupgen.h | |||
@@ -16,18 +16,10 @@ | |||
16 | #define OMAP_WKG_ENB_B_0 0x14 | 16 | #define OMAP_WKG_ENB_B_0 0x14 |
17 | #define OMAP_WKG_ENB_C_0 0x18 | 17 | #define OMAP_WKG_ENB_C_0 0x18 |
18 | #define OMAP_WKG_ENB_D_0 0x1c | 18 | #define OMAP_WKG_ENB_D_0 0x1c |
19 | #define OMAP_WKG_ENB_SECURE_A_0 0x20 | ||
20 | #define OMAP_WKG_ENB_SECURE_B_0 0x24 | ||
21 | #define OMAP_WKG_ENB_SECURE_C_0 0x28 | ||
22 | #define OMAP_WKG_ENB_SECURE_D_0 0x2c | ||
23 | #define OMAP_WKG_ENB_A_1 0x410 | 19 | #define OMAP_WKG_ENB_A_1 0x410 |
24 | #define OMAP_WKG_ENB_B_1 0x414 | 20 | #define OMAP_WKG_ENB_B_1 0x414 |
25 | #define OMAP_WKG_ENB_C_1 0x418 | 21 | #define OMAP_WKG_ENB_C_1 0x418 |
26 | #define OMAP_WKG_ENB_D_1 0x41c | 22 | #define OMAP_WKG_ENB_D_1 0x41c |
27 | #define OMAP_WKG_ENB_SECURE_A_1 0x420 | ||
28 | #define OMAP_WKG_ENB_SECURE_B_1 0x424 | ||
29 | #define OMAP_WKG_ENB_SECURE_C_1 0x428 | ||
30 | #define OMAP_WKG_ENB_SECURE_D_1 0x42c | ||
31 | #define OMAP_AUX_CORE_BOOT_0 0x800 | 23 | #define OMAP_AUX_CORE_BOOT_0 0x800 |
32 | #define OMAP_AUX_CORE_BOOT_1 0x804 | 24 | #define OMAP_AUX_CORE_BOOT_1 0x804 |
33 | #define OMAP_PTMSYNCREQ_MASK 0xc00 | 25 | #define OMAP_PTMSYNCREQ_MASK 0xc00 |
diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c index 4b9491aa36fa..8d014ba04abc 100644 --- a/arch/arm/mach-omap2/io.c +++ b/arch/arm/mach-omap2/io.c | |||
@@ -173,7 +173,7 @@ static struct map_desc omap34xx_io_desc[] __initdata = { | |||
173 | }; | 173 | }; |
174 | #endif | 174 | #endif |
175 | 175 | ||
176 | #ifdef CONFIG_SOC_OMAPTI81XX | 176 | #ifdef CONFIG_SOC_TI81XX |
177 | static struct map_desc omapti81xx_io_desc[] __initdata = { | 177 | static struct map_desc omapti81xx_io_desc[] __initdata = { |
178 | { | 178 | { |
179 | .virtual = L4_34XX_VIRT, | 179 | .virtual = L4_34XX_VIRT, |
@@ -184,7 +184,7 @@ static struct map_desc omapti81xx_io_desc[] __initdata = { | |||
184 | }; | 184 | }; |
185 | #endif | 185 | #endif |
186 | 186 | ||
187 | #ifdef CONFIG_SOC_OMAPAM33XX | 187 | #ifdef CONFIG_SOC_AM33XX |
188 | static struct map_desc omapam33xx_io_desc[] __initdata = { | 188 | static struct map_desc omapam33xx_io_desc[] __initdata = { |
189 | { | 189 | { |
190 | .virtual = L4_34XX_VIRT, | 190 | .virtual = L4_34XX_VIRT, |
@@ -216,41 +216,11 @@ static struct map_desc omap44xx_io_desc[] __initdata = { | |||
216 | .type = MT_DEVICE, | 216 | .type = MT_DEVICE, |
217 | }, | 217 | }, |
218 | { | 218 | { |
219 | .virtual = OMAP44XX_GPMC_VIRT, | ||
220 | .pfn = __phys_to_pfn(OMAP44XX_GPMC_PHYS), | ||
221 | .length = OMAP44XX_GPMC_SIZE, | ||
222 | .type = MT_DEVICE, | ||
223 | }, | ||
224 | { | ||
225 | .virtual = OMAP44XX_EMIF1_VIRT, | ||
226 | .pfn = __phys_to_pfn(OMAP44XX_EMIF1_PHYS), | ||
227 | .length = OMAP44XX_EMIF1_SIZE, | ||
228 | .type = MT_DEVICE, | ||
229 | }, | ||
230 | { | ||
231 | .virtual = OMAP44XX_EMIF2_VIRT, | ||
232 | .pfn = __phys_to_pfn(OMAP44XX_EMIF2_PHYS), | ||
233 | .length = OMAP44XX_EMIF2_SIZE, | ||
234 | .type = MT_DEVICE, | ||
235 | }, | ||
236 | { | ||
237 | .virtual = OMAP44XX_DMM_VIRT, | ||
238 | .pfn = __phys_to_pfn(OMAP44XX_DMM_PHYS), | ||
239 | .length = OMAP44XX_DMM_SIZE, | ||
240 | .type = MT_DEVICE, | ||
241 | }, | ||
242 | { | ||
243 | .virtual = L4_PER_44XX_VIRT, | 219 | .virtual = L4_PER_44XX_VIRT, |
244 | .pfn = __phys_to_pfn(L4_PER_44XX_PHYS), | 220 | .pfn = __phys_to_pfn(L4_PER_44XX_PHYS), |
245 | .length = L4_PER_44XX_SIZE, | 221 | .length = L4_PER_44XX_SIZE, |
246 | .type = MT_DEVICE, | 222 | .type = MT_DEVICE, |
247 | }, | 223 | }, |
248 | { | ||
249 | .virtual = L4_EMU_44XX_VIRT, | ||
250 | .pfn = __phys_to_pfn(L4_EMU_44XX_PHYS), | ||
251 | .length = L4_EMU_44XX_SIZE, | ||
252 | .type = MT_DEVICE, | ||
253 | }, | ||
254 | #ifdef CONFIG_OMAP4_ERRATA_I688 | 224 | #ifdef CONFIG_OMAP4_ERRATA_I688 |
255 | { | 225 | { |
256 | .virtual = OMAP4_SRAM_VA, | 226 | .virtual = OMAP4_SRAM_VA, |
@@ -286,14 +256,14 @@ void __init omap34xx_map_common_io(void) | |||
286 | } | 256 | } |
287 | #endif | 257 | #endif |
288 | 258 | ||
289 | #ifdef CONFIG_SOC_OMAPTI81XX | 259 | #ifdef CONFIG_SOC_TI81XX |
290 | void __init omapti81xx_map_common_io(void) | 260 | void __init omapti81xx_map_common_io(void) |
291 | { | 261 | { |
292 | iotable_init(omapti81xx_io_desc, ARRAY_SIZE(omapti81xx_io_desc)); | 262 | iotable_init(omapti81xx_io_desc, ARRAY_SIZE(omapti81xx_io_desc)); |
293 | } | 263 | } |
294 | #endif | 264 | #endif |
295 | 265 | ||
296 | #ifdef CONFIG_SOC_OMAPAM33XX | 266 | #ifdef CONFIG_SOC_AM33XX |
297 | void __init omapam33xx_map_common_io(void) | 267 | void __init omapam33xx_map_common_io(void) |
298 | { | 268 | { |
299 | iotable_init(omapam33xx_io_desc, ARRAY_SIZE(omapam33xx_io_desc)); | 269 | iotable_init(omapam33xx_io_desc, ARRAY_SIZE(omapam33xx_io_desc)); |
@@ -380,6 +350,13 @@ void __init omap2420_init_early(void) | |||
380 | omap_hwmod_init_postsetup(); | 350 | omap_hwmod_init_postsetup(); |
381 | omap2420_clk_init(); | 351 | omap2420_clk_init(); |
382 | } | 352 | } |
353 | |||
354 | void __init omap2420_init_late(void) | ||
355 | { | ||
356 | omap_mux_late_init(); | ||
357 | omap2_common_pm_late_init(); | ||
358 | omap2_pm_init(); | ||
359 | } | ||
383 | #endif | 360 | #endif |
384 | 361 | ||
385 | #ifdef CONFIG_SOC_OMAP2430 | 362 | #ifdef CONFIG_SOC_OMAP2430 |
@@ -395,6 +372,13 @@ void __init omap2430_init_early(void) | |||
395 | omap_hwmod_init_postsetup(); | 372 | omap_hwmod_init_postsetup(); |
396 | omap2430_clk_init(); | 373 | omap2430_clk_init(); |
397 | } | 374 | } |
375 | |||
376 | void __init omap2430_init_late(void) | ||
377 | { | ||
378 | omap_mux_late_init(); | ||
379 | omap2_common_pm_late_init(); | ||
380 | omap2_pm_init(); | ||
381 | } | ||
398 | #endif | 382 | #endif |
399 | 383 | ||
400 | /* | 384 | /* |
@@ -449,6 +433,48 @@ void __init ti81xx_init_early(void) | |||
449 | omap_hwmod_init_postsetup(); | 433 | omap_hwmod_init_postsetup(); |
450 | omap3xxx_clk_init(); | 434 | omap3xxx_clk_init(); |
451 | } | 435 | } |
436 | |||
437 | void __init omap3_init_late(void) | ||
438 | { | ||
439 | omap_mux_late_init(); | ||
440 | omap2_common_pm_late_init(); | ||
441 | omap3_pm_init(); | ||
442 | } | ||
443 | |||
444 | void __init omap3430_init_late(void) | ||
445 | { | ||
446 | omap_mux_late_init(); | ||
447 | omap2_common_pm_late_init(); | ||
448 | omap3_pm_init(); | ||
449 | } | ||
450 | |||
451 | void __init omap35xx_init_late(void) | ||
452 | { | ||
453 | omap_mux_late_init(); | ||
454 | omap2_common_pm_late_init(); | ||
455 | omap3_pm_init(); | ||
456 | } | ||
457 | |||
458 | void __init omap3630_init_late(void) | ||
459 | { | ||
460 | omap_mux_late_init(); | ||
461 | omap2_common_pm_late_init(); | ||
462 | omap3_pm_init(); | ||
463 | } | ||
464 | |||
465 | void __init am35xx_init_late(void) | ||
466 | { | ||
467 | omap_mux_late_init(); | ||
468 | omap2_common_pm_late_init(); | ||
469 | omap3_pm_init(); | ||
470 | } | ||
471 | |||
472 | void __init ti81xx_init_late(void) | ||
473 | { | ||
474 | omap_mux_late_init(); | ||
475 | omap2_common_pm_late_init(); | ||
476 | omap3_pm_init(); | ||
477 | } | ||
452 | #endif | 478 | #endif |
453 | 479 | ||
454 | #ifdef CONFIG_ARCH_OMAP4 | 480 | #ifdef CONFIG_ARCH_OMAP4 |
@@ -465,6 +491,13 @@ void __init omap4430_init_early(void) | |||
465 | omap_hwmod_init_postsetup(); | 491 | omap_hwmod_init_postsetup(); |
466 | omap4xxx_clk_init(); | 492 | omap4xxx_clk_init(); |
467 | } | 493 | } |
494 | |||
495 | void __init omap4430_init_late(void) | ||
496 | { | ||
497 | omap_mux_late_init(); | ||
498 | omap2_common_pm_late_init(); | ||
499 | omap4_pm_init(); | ||
500 | } | ||
468 | #endif | 501 | #endif |
469 | 502 | ||
470 | void __init omap_sdrc_init(struct omap_sdrc_params *sdrc_cs0, | 503 | void __init omap_sdrc_init(struct omap_sdrc_params *sdrc_cs0, |
diff --git a/arch/arm/mach-omap2/iomap.h b/arch/arm/mach-omap2/iomap.h index 0812b154f5b5..80b88921faba 100644 --- a/arch/arm/mach-omap2/iomap.h +++ b/arch/arm/mach-omap2/iomap.h | |||
@@ -37,9 +37,6 @@ | |||
37 | #define OMAP4_L3_PER_IO_OFFSET 0xb1100000 | 37 | #define OMAP4_L3_PER_IO_OFFSET 0xb1100000 |
38 | #define OMAP4_L3_PER_IO_ADDRESS(pa) IOMEM((pa) + OMAP4_L3_PER_IO_OFFSET) | 38 | #define OMAP4_L3_PER_IO_ADDRESS(pa) IOMEM((pa) + OMAP4_L3_PER_IO_OFFSET) |
39 | 39 | ||
40 | #define OMAP4_GPMC_IO_OFFSET 0xa9000000 | ||
41 | #define OMAP4_GPMC_IO_ADDRESS(pa) IOMEM((pa) + OMAP4_GPMC_IO_OFFSET) | ||
42 | |||
43 | #define OMAP2_EMU_IO_OFFSET 0xaa800000 /* Emulation */ | 40 | #define OMAP2_EMU_IO_OFFSET 0xaa800000 /* Emulation */ |
44 | #define OMAP2_EMU_IO_ADDRESS(pa) IOMEM((pa) + OMAP2_EMU_IO_OFFSET) | 41 | #define OMAP2_EMU_IO_ADDRESS(pa) IOMEM((pa) + OMAP2_EMU_IO_OFFSET) |
45 | 42 | ||
@@ -170,28 +167,3 @@ | |||
170 | #define L4_ABE_44XX_VIRT (L4_ABE_44XX_PHYS + OMAP2_L4_IO_OFFSET) | 167 | #define L4_ABE_44XX_VIRT (L4_ABE_44XX_PHYS + OMAP2_L4_IO_OFFSET) |
171 | #define L4_ABE_44XX_SIZE SZ_1M | 168 | #define L4_ABE_44XX_SIZE SZ_1M |
172 | 169 | ||
173 | #define L4_EMU_44XX_PHYS L4_EMU_44XX_BASE | ||
174 | /* 0x54000000 --> 0xfe800000 */ | ||
175 | #define L4_EMU_44XX_VIRT (L4_EMU_44XX_PHYS + OMAP2_EMU_IO_OFFSET) | ||
176 | #define L4_EMU_44XX_SIZE SZ_8M | ||
177 | |||
178 | #define OMAP44XX_GPMC_PHYS OMAP44XX_GPMC_BASE | ||
179 | /* 0x50000000 --> 0xf9000000 */ | ||
180 | #define OMAP44XX_GPMC_VIRT (OMAP44XX_GPMC_PHYS + OMAP4_GPMC_IO_OFFSET) | ||
181 | #define OMAP44XX_GPMC_SIZE SZ_1M | ||
182 | |||
183 | |||
184 | #define OMAP44XX_EMIF1_PHYS OMAP44XX_EMIF1_BASE | ||
185 | /* 0x4c000000 --> 0xfd100000 */ | ||
186 | #define OMAP44XX_EMIF1_VIRT (OMAP44XX_EMIF1_PHYS + OMAP4_L3_PER_IO_OFFSET) | ||
187 | #define OMAP44XX_EMIF1_SIZE SZ_1M | ||
188 | |||
189 | #define OMAP44XX_EMIF2_PHYS OMAP44XX_EMIF2_BASE | ||
190 | /* 0x4d000000 --> 0xfd200000 */ | ||
191 | #define OMAP44XX_EMIF2_SIZE SZ_1M | ||
192 | #define OMAP44XX_EMIF2_VIRT (OMAP44XX_EMIF1_VIRT + OMAP44XX_EMIF1_SIZE) | ||
193 | |||
194 | #define OMAP44XX_DMM_PHYS OMAP44XX_DMM_BASE | ||
195 | /* 0x4e000000 --> 0xfd300000 */ | ||
196 | #define OMAP44XX_DMM_SIZE SZ_1M | ||
197 | #define OMAP44XX_DMM_VIRT (OMAP44XX_EMIF2_VIRT + OMAP44XX_EMIF2_SIZE) | ||
diff --git a/arch/arm/mach-omap2/irq.c b/arch/arm/mach-omap2/irq.c index 1ecf54565fe2..fdc4303be563 100644 --- a/arch/arm/mach-omap2/irq.c +++ b/arch/arm/mach-omap2/irq.c | |||
@@ -231,7 +231,7 @@ static inline void omap_intc_handle_irq(void __iomem *base_addr, struct pt_regs | |||
231 | goto out; | 231 | goto out; |
232 | 232 | ||
233 | irqnr = readl_relaxed(base_addr + 0xd8); | 233 | irqnr = readl_relaxed(base_addr + 0xd8); |
234 | #ifdef CONFIG_SOC_OMAPTI81XX | 234 | #ifdef CONFIG_SOC_TI81XX |
235 | if (irqnr) | 235 | if (irqnr) |
236 | goto out; | 236 | goto out; |
237 | irqnr = readl_relaxed(base_addr + 0xf8); | 237 | irqnr = readl_relaxed(base_addr + 0xf8); |
diff --git a/arch/arm/mach-omap2/mux.c b/arch/arm/mach-omap2/mux.c index 3268ee24eada..80e55c5c9998 100644 --- a/arch/arm/mach-omap2/mux.c +++ b/arch/arm/mach-omap2/mux.c | |||
@@ -788,7 +788,7 @@ static void __init omap_mux_free_names(struct omap_mux *m) | |||
788 | } | 788 | } |
789 | 789 | ||
790 | /* Free all data except for GPIO pins unless CONFIG_DEBUG_FS is set */ | 790 | /* Free all data except for GPIO pins unless CONFIG_DEBUG_FS is set */ |
791 | static int __init omap_mux_late_init(void) | 791 | int __init omap_mux_late_init(void) |
792 | { | 792 | { |
793 | struct omap_mux_partition *partition; | 793 | struct omap_mux_partition *partition; |
794 | int ret; | 794 | int ret; |
@@ -823,7 +823,6 @@ static int __init omap_mux_late_init(void) | |||
823 | 823 | ||
824 | return 0; | 824 | return 0; |
825 | } | 825 | } |
826 | late_initcall(omap_mux_late_init); | ||
827 | 826 | ||
828 | static void __init omap_mux_package_fixup(struct omap_mux *p, | 827 | static void __init omap_mux_package_fixup(struct omap_mux *p, |
829 | struct omap_mux *superset) | 828 | struct omap_mux *superset) |
diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c index fd48797fa95a..b26d3c9bca16 100644 --- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | |||
@@ -3306,7 +3306,7 @@ int __init omap3xxx_hwmod_init(void) | |||
3306 | rev == OMAP3430_REV_ES2_1 || rev == OMAP3430_REV_ES3_0 || | 3306 | rev == OMAP3430_REV_ES2_1 || rev == OMAP3430_REV_ES3_0 || |
3307 | rev == OMAP3430_REV_ES3_1 || rev == OMAP3430_REV_ES3_1_2) { | 3307 | rev == OMAP3430_REV_ES3_1 || rev == OMAP3430_REV_ES3_1_2) { |
3308 | h = omap34xx_hwmod_ocp_ifs; | 3308 | h = omap34xx_hwmod_ocp_ifs; |
3309 | } else if (rev == OMAP3517_REV_ES1_0 || rev == OMAP3517_REV_ES1_1) { | 3309 | } else if (rev == AM35XX_REV_ES1_0 || rev == AM35XX_REV_ES1_1) { |
3310 | h = am35xx_hwmod_ocp_ifs; | 3310 | h = am35xx_hwmod_ocp_ifs; |
3311 | } else if (rev == OMAP3630_REV_ES1_0 || rev == OMAP3630_REV_ES1_1 || | 3311 | } else if (rev == OMAP3630_REV_ES1_0 || rev == OMAP3630_REV_ES1_1 || |
3312 | rev == OMAP3630_REV_ES1_2) { | 3312 | rev == OMAP3630_REV_ES1_2) { |
diff --git a/arch/arm/mach-omap2/pm.c b/arch/arm/mach-omap2/pm.c index d0c1c9695996..9cb5cede0f50 100644 --- a/arch/arm/mach-omap2/pm.c +++ b/arch/arm/mach-omap2/pm.c | |||
@@ -295,7 +295,7 @@ static int __init omap2_common_pm_init(void) | |||
295 | } | 295 | } |
296 | postcore_initcall(omap2_common_pm_init); | 296 | postcore_initcall(omap2_common_pm_init); |
297 | 297 | ||
298 | static int __init omap2_common_pm_late_init(void) | 298 | int __init omap2_common_pm_late_init(void) |
299 | { | 299 | { |
300 | /* | 300 | /* |
301 | * In the case of DT, the PMIC and SR initialization will be done using | 301 | * In the case of DT, the PMIC and SR initialization will be done using |
@@ -322,4 +322,3 @@ static int __init omap2_common_pm_late_init(void) | |||
322 | 322 | ||
323 | return 0; | 323 | return 0; |
324 | } | 324 | } |
325 | late_initcall(omap2_common_pm_late_init); | ||
diff --git a/arch/arm/mach-omap2/pm24xx.c b/arch/arm/mach-omap2/pm24xx.c index facfffca9eac..2edeffc923a6 100644 --- a/arch/arm/mach-omap2/pm24xx.c +++ b/arch/arm/mach-omap2/pm24xx.c | |||
@@ -298,13 +298,10 @@ static void __init prcm_setup_regs(void) | |||
298 | WKUP_MOD, PM_WKEN); | 298 | WKUP_MOD, PM_WKEN); |
299 | } | 299 | } |
300 | 300 | ||
301 | static int __init omap2_pm_init(void) | 301 | int __init omap2_pm_init(void) |
302 | { | 302 | { |
303 | u32 l; | 303 | u32 l; |
304 | 304 | ||
305 | if (!cpu_is_omap24xx()) | ||
306 | return -ENODEV; | ||
307 | |||
308 | printk(KERN_INFO "Power Management for OMAP2 initializing\n"); | 305 | printk(KERN_INFO "Power Management for OMAP2 initializing\n"); |
309 | l = omap2_prm_read_mod_reg(OCP_MOD, OMAP2_PRCM_REVISION_OFFSET); | 306 | l = omap2_prm_read_mod_reg(OCP_MOD, OMAP2_PRCM_REVISION_OFFSET); |
310 | printk(KERN_INFO "PRCM revision %d.%d\n", (l >> 4) & 0x0f, l & 0x0f); | 307 | printk(KERN_INFO "PRCM revision %d.%d\n", (l >> 4) & 0x0f, l & 0x0f); |
@@ -370,17 +367,13 @@ static int __init omap2_pm_init(void) | |||
370 | * These routines need to be in SRAM as that's the only | 367 | * These routines need to be in SRAM as that's the only |
371 | * memory the MPU can see when it wakes up. | 368 | * memory the MPU can see when it wakes up. |
372 | */ | 369 | */ |
373 | if (cpu_is_omap24xx()) { | 370 | omap2_sram_idle = omap_sram_push(omap24xx_idle_loop_suspend, |
374 | omap2_sram_idle = omap_sram_push(omap24xx_idle_loop_suspend, | 371 | omap24xx_idle_loop_suspend_sz); |
375 | omap24xx_idle_loop_suspend_sz); | ||
376 | 372 | ||
377 | omap2_sram_suspend = omap_sram_push(omap24xx_cpu_suspend, | 373 | omap2_sram_suspend = omap_sram_push(omap24xx_cpu_suspend, |
378 | omap24xx_cpu_suspend_sz); | 374 | omap24xx_cpu_suspend_sz); |
379 | } | ||
380 | 375 | ||
381 | arm_pm_idle = omap2_pm_idle; | 376 | arm_pm_idle = omap2_pm_idle; |
382 | 377 | ||
383 | return 0; | 378 | return 0; |
384 | } | 379 | } |
385 | |||
386 | late_initcall(omap2_pm_init); | ||
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index 8b43aefba0ea..a34023d0ca7c 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c | |||
@@ -697,15 +697,12 @@ static void __init pm_errata_configure(void) | |||
697 | } | 697 | } |
698 | } | 698 | } |
699 | 699 | ||
700 | static int __init omap3_pm_init(void) | 700 | int __init omap3_pm_init(void) |
701 | { | 701 | { |
702 | struct power_state *pwrst, *tmp; | 702 | struct power_state *pwrst, *tmp; |
703 | struct clockdomain *neon_clkdm, *mpu_clkdm; | 703 | struct clockdomain *neon_clkdm, *mpu_clkdm; |
704 | int ret; | 704 | int ret; |
705 | 705 | ||
706 | if (!cpu_is_omap34xx()) | ||
707 | return -ENODEV; | ||
708 | |||
709 | if (!omap3_has_io_chain_ctrl()) | 706 | if (!omap3_has_io_chain_ctrl()) |
710 | pr_warning("PM: no software I/O chain control; some wakeups may be lost\n"); | 707 | pr_warning("PM: no software I/O chain control; some wakeups may be lost\n"); |
711 | 708 | ||
@@ -804,5 +801,3 @@ err2: | |||
804 | err1: | 801 | err1: |
805 | return ret; | 802 | return ret; |
806 | } | 803 | } |
807 | |||
808 | late_initcall(omap3_pm_init); | ||
diff --git a/arch/arm/mach-omap2/pm44xx.c b/arch/arm/mach-omap2/pm44xx.c index 885625352429..ea24174f5707 100644 --- a/arch/arm/mach-omap2/pm44xx.c +++ b/arch/arm/mach-omap2/pm44xx.c | |||
@@ -141,15 +141,12 @@ static void omap_default_idle(void) | |||
141 | * Initializes all powerdomain and clockdomain target states | 141 | * Initializes all powerdomain and clockdomain target states |
142 | * and all PRCM settings. | 142 | * and all PRCM settings. |
143 | */ | 143 | */ |
144 | static int __init omap4_pm_init(void) | 144 | int __init omap4_pm_init(void) |
145 | { | 145 | { |
146 | int ret; | 146 | int ret; |
147 | struct clockdomain *emif_clkdm, *mpuss_clkdm, *l3_1_clkdm, *l4wkup; | 147 | struct clockdomain *emif_clkdm, *mpuss_clkdm, *l3_1_clkdm, *l4wkup; |
148 | struct clockdomain *ducati_clkdm, *l3_2_clkdm, *l4_per_clkdm; | 148 | struct clockdomain *ducati_clkdm, *l3_2_clkdm, *l4_per_clkdm; |
149 | 149 | ||
150 | if (!cpu_is_omap44xx()) | ||
151 | return -ENODEV; | ||
152 | |||
153 | if (omap_rev() == OMAP4430_REV_ES1_0) { | 150 | if (omap_rev() == OMAP4430_REV_ES1_0) { |
154 | WARN(1, "Power Management not supported on OMAP4430 ES1.0\n"); | 151 | WARN(1, "Power Management not supported on OMAP4430 ES1.0\n"); |
155 | return -ENODEV; | 152 | return -ENODEV; |
@@ -217,4 +214,3 @@ static int __init omap4_pm_init(void) | |||
217 | err2: | 214 | err2: |
218 | return ret; | 215 | return ret; |
219 | } | 216 | } |
220 | late_initcall(omap4_pm_init); | ||
diff --git a/arch/arm/mach-omap2/powerdomains3xxx_data.c b/arch/arm/mach-omap2/powerdomains3xxx_data.c index b7ea468eea32..fb0a0a6869d1 100644 --- a/arch/arm/mach-omap2/powerdomains3xxx_data.c +++ b/arch/arm/mach-omap2/powerdomains3xxx_data.c | |||
@@ -311,7 +311,7 @@ void __init omap3xxx_powerdomains_init(void) | |||
311 | rev == OMAP3430_REV_ES3_0 || rev == OMAP3630_REV_ES1_0) | 311 | rev == OMAP3430_REV_ES3_0 || rev == OMAP3630_REV_ES1_0) |
312 | pwrdm_register_pwrdms(powerdomains_omap3430es2_es3_0); | 312 | pwrdm_register_pwrdms(powerdomains_omap3430es2_es3_0); |
313 | else if (rev == OMAP3430_REV_ES3_1 || rev == OMAP3430_REV_ES3_1_2 || | 313 | else if (rev == OMAP3430_REV_ES3_1 || rev == OMAP3430_REV_ES3_1_2 || |
314 | rev == OMAP3517_REV_ES1_0 || rev == OMAP3517_REV_ES1_1 || | 314 | rev == AM35XX_REV_ES1_0 || rev == AM35XX_REV_ES1_1 || |
315 | rev == OMAP3630_REV_ES1_1 || rev == OMAP3630_REV_ES1_2) | 315 | rev == OMAP3630_REV_ES1_1 || rev == OMAP3630_REV_ES1_2) |
316 | pwrdm_register_pwrdms(powerdomains_omap3430es3_1plus); | 316 | pwrdm_register_pwrdms(powerdomains_omap3430es3_1plus); |
317 | else | 317 | else |
diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c index 1b7835865c83..840929bd9dae 100644 --- a/arch/arm/mach-omap2/timer.c +++ b/arch/arm/mach-omap2/timer.c | |||
@@ -90,7 +90,7 @@ static irqreturn_t omap2_gp_timer_interrupt(int irq, void *dev_id) | |||
90 | } | 90 | } |
91 | 91 | ||
92 | static struct irqaction omap2_gp_timer_irq = { | 92 | static struct irqaction omap2_gp_timer_irq = { |
93 | .name = "gp timer", | 93 | .name = "gp_timer", |
94 | .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL, | 94 | .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL, |
95 | .handler = omap2_gp_timer_interrupt, | 95 | .handler = omap2_gp_timer_interrupt, |
96 | }; | 96 | }; |
@@ -132,7 +132,7 @@ static void omap2_gp_timer_set_mode(enum clock_event_mode mode, | |||
132 | } | 132 | } |
133 | 133 | ||
134 | static struct clock_event_device clockevent_gpt = { | 134 | static struct clock_event_device clockevent_gpt = { |
135 | .name = "gp timer", | 135 | .name = "gp_timer", |
136 | .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, | 136 | .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, |
137 | .shift = 32, | 137 | .shift = 32, |
138 | .set_next_event = omap2_gp_timer_set_next_event, | 138 | .set_next_event = omap2_gp_timer_set_next_event, |
@@ -236,22 +236,8 @@ static void __init omap2_gp_clockevent_init(int gptimer_id, | |||
236 | } | 236 | } |
237 | 237 | ||
238 | /* Clocksource code */ | 238 | /* Clocksource code */ |
239 | |||
240 | #ifdef CONFIG_OMAP_32K_TIMER | ||
241 | /* | ||
242 | * When 32k-timer is enabled, don't use GPTimer for clocksource | ||
243 | * instead, just leave default clocksource which uses the 32k | ||
244 | * sync counter. See clocksource setup in plat-omap/counter_32k.c | ||
245 | */ | ||
246 | |||
247 | static void __init omap2_gp_clocksource_init(int unused, const char *dummy) | ||
248 | { | ||
249 | omap_init_clocksource_32k(); | ||
250 | } | ||
251 | |||
252 | #else | ||
253 | |||
254 | static struct omap_dm_timer clksrc; | 239 | static struct omap_dm_timer clksrc; |
240 | static bool use_gptimer_clksrc; | ||
255 | 241 | ||
256 | /* | 242 | /* |
257 | * clocksource | 243 | * clocksource |
@@ -262,7 +248,7 @@ static cycle_t clocksource_read_cycles(struct clocksource *cs) | |||
262 | } | 248 | } |
263 | 249 | ||
264 | static struct clocksource clocksource_gpt = { | 250 | static struct clocksource clocksource_gpt = { |
265 | .name = "gp timer", | 251 | .name = "gp_timer", |
266 | .rating = 300, | 252 | .rating = 300, |
267 | .read = clocksource_read_cycles, | 253 | .read = clocksource_read_cycles, |
268 | .mask = CLOCKSOURCE_MASK(32), | 254 | .mask = CLOCKSOURCE_MASK(32), |
@@ -278,7 +264,46 @@ static u32 notrace dmtimer_read_sched_clock(void) | |||
278 | } | 264 | } |
279 | 265 | ||
280 | /* Setup free-running counter for clocksource */ | 266 | /* Setup free-running counter for clocksource */ |
281 | static void __init omap2_gp_clocksource_init(int gptimer_id, | 267 | static int __init omap2_sync32k_clocksource_init(void) |
268 | { | ||
269 | int ret; | ||
270 | struct omap_hwmod *oh; | ||
271 | void __iomem *vbase; | ||
272 | const char *oh_name = "counter_32k"; | ||
273 | |||
274 | /* | ||
275 | * First check hwmod data is available for sync32k counter | ||
276 | */ | ||
277 | oh = omap_hwmod_lookup(oh_name); | ||
278 | if (!oh || oh->slaves_cnt == 0) | ||
279 | return -ENODEV; | ||
280 | |||
281 | omap_hwmod_setup_one(oh_name); | ||
282 | |||
283 | vbase = omap_hwmod_get_mpu_rt_va(oh); | ||
284 | if (!vbase) { | ||
285 | pr_warn("%s: failed to get counter_32k resource\n", __func__); | ||
286 | return -ENXIO; | ||
287 | } | ||
288 | |||
289 | ret = omap_hwmod_enable(oh); | ||
290 | if (ret) { | ||
291 | pr_warn("%s: failed to enable counter_32k module (%d)\n", | ||
292 | __func__, ret); | ||
293 | return ret; | ||
294 | } | ||
295 | |||
296 | ret = omap_init_clocksource_32k(vbase); | ||
297 | if (ret) { | ||
298 | pr_warn("%s: failed to initialize counter_32k as a clocksource (%d)\n", | ||
299 | __func__, ret); | ||
300 | omap_hwmod_idle(oh); | ||
301 | } | ||
302 | |||
303 | return ret; | ||
304 | } | ||
305 | |||
306 | static void __init omap2_gptimer_clocksource_init(int gptimer_id, | ||
282 | const char *fck_source) | 307 | const char *fck_source) |
283 | { | 308 | { |
284 | int res; | 309 | int res; |
@@ -286,9 +311,6 @@ static void __init omap2_gp_clocksource_init(int gptimer_id, | |||
286 | res = omap_dm_timer_init_one(&clksrc, gptimer_id, fck_source); | 311 | res = omap_dm_timer_init_one(&clksrc, gptimer_id, fck_source); |
287 | BUG_ON(res); | 312 | BUG_ON(res); |
288 | 313 | ||
289 | pr_info("OMAP clocksource: GPTIMER%d at %lu Hz\n", | ||
290 | gptimer_id, clksrc.rate); | ||
291 | |||
292 | __omap_dm_timer_load_start(&clksrc, | 314 | __omap_dm_timer_load_start(&clksrc, |
293 | OMAP_TIMER_CTRL_ST | OMAP_TIMER_CTRL_AR, 0, 1); | 315 | OMAP_TIMER_CTRL_ST | OMAP_TIMER_CTRL_AR, 0, 1); |
294 | setup_sched_clock(dmtimer_read_sched_clock, 32, clksrc.rate); | 316 | setup_sched_clock(dmtimer_read_sched_clock, 32, clksrc.rate); |
@@ -296,15 +318,36 @@ static void __init omap2_gp_clocksource_init(int gptimer_id, | |||
296 | if (clocksource_register_hz(&clocksource_gpt, clksrc.rate)) | 318 | if (clocksource_register_hz(&clocksource_gpt, clksrc.rate)) |
297 | pr_err("Could not register clocksource %s\n", | 319 | pr_err("Could not register clocksource %s\n", |
298 | clocksource_gpt.name); | 320 | clocksource_gpt.name); |
321 | else | ||
322 | pr_info("OMAP clocksource: GPTIMER%d at %lu Hz\n", | ||
323 | gptimer_id, clksrc.rate); | ||
324 | } | ||
325 | |||
326 | static void __init omap2_clocksource_init(int gptimer_id, | ||
327 | const char *fck_source) | ||
328 | { | ||
329 | /* | ||
330 | * First give preference to kernel parameter configuration | ||
331 | * by user (clocksource="gp_timer"). | ||
332 | * | ||
333 | * In case of missing kernel parameter for clocksource, | ||
334 | * first check for availability for 32k-sync timer, in case | ||
335 | * of failure in finding 32k_counter module or registering | ||
336 | * it as clocksource, execution will fallback to gp-timer. | ||
337 | */ | ||
338 | if (use_gptimer_clksrc == true) | ||
339 | omap2_gptimer_clocksource_init(gptimer_id, fck_source); | ||
340 | else if (omap2_sync32k_clocksource_init()) | ||
341 | /* Fall back to gp-timer code */ | ||
342 | omap2_gptimer_clocksource_init(gptimer_id, fck_source); | ||
299 | } | 343 | } |
300 | #endif | ||
301 | 344 | ||
302 | #define OMAP_SYS_TIMER_INIT(name, clkev_nr, clkev_src, \ | 345 | #define OMAP_SYS_TIMER_INIT(name, clkev_nr, clkev_src, \ |
303 | clksrc_nr, clksrc_src) \ | 346 | clksrc_nr, clksrc_src) \ |
304 | static void __init omap##name##_timer_init(void) \ | 347 | static void __init omap##name##_timer_init(void) \ |
305 | { \ | 348 | { \ |
306 | omap2_gp_clockevent_init((clkev_nr), clkev_src); \ | 349 | omap2_gp_clockevent_init((clkev_nr), clkev_src); \ |
307 | omap2_gp_clocksource_init((clksrc_nr), clksrc_src); \ | 350 | omap2_clocksource_init((clksrc_nr), clksrc_src); \ |
308 | } | 351 | } |
309 | 352 | ||
310 | #define OMAP_SYS_TIMER(name) \ | 353 | #define OMAP_SYS_TIMER(name) \ |
@@ -335,7 +378,7 @@ static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, | |||
335 | static void __init omap4_timer_init(void) | 378 | static void __init omap4_timer_init(void) |
336 | { | 379 | { |
337 | omap2_gp_clockevent_init(1, OMAP4_CLKEV_SOURCE); | 380 | omap2_gp_clockevent_init(1, OMAP4_CLKEV_SOURCE); |
338 | omap2_gp_clocksource_init(2, OMAP4_MPU_SOURCE); | 381 | omap2_clocksource_init(2, OMAP4_MPU_SOURCE); |
339 | #ifdef CONFIG_LOCAL_TIMERS | 382 | #ifdef CONFIG_LOCAL_TIMERS |
340 | /* Local timers are not supprted on OMAP4430 ES1.0 */ | 383 | /* Local timers are not supprted on OMAP4430 ES1.0 */ |
341 | if (omap_rev() != OMAP4430_REV_ES1_0) { | 384 | if (omap_rev() != OMAP4430_REV_ES1_0) { |
@@ -503,3 +546,28 @@ static int __init omap2_dm_timer_init(void) | |||
503 | return 0; | 546 | return 0; |
504 | } | 547 | } |
505 | arch_initcall(omap2_dm_timer_init); | 548 | arch_initcall(omap2_dm_timer_init); |
549 | |||
550 | /** | ||
551 | * omap2_override_clocksource - clocksource override with user configuration | ||
552 | * | ||
553 | * Allows user to override default clocksource, using kernel parameter | ||
554 | * clocksource="gp_timer" (For all OMAP2PLUS architectures) | ||
555 | * | ||
556 | * Note that, here we are using same standard kernel parameter "clocksource=", | ||
557 | * and not introducing any OMAP specific interface. | ||
558 | */ | ||
559 | static int __init omap2_override_clocksource(char *str) | ||
560 | { | ||
561 | if (!str) | ||
562 | return 0; | ||
563 | /* | ||
564 | * For OMAP architecture, we only have two options | ||
565 | * - sync_32k (default) | ||
566 | * - gp_timer (sys_clk based) | ||
567 | */ | ||
568 | if (!strcmp(str, "gp_timer")) | ||
569 | use_gptimer_clksrc = true; | ||
570 | |||
571 | return 0; | ||
572 | } | ||
573 | early_param("clocksource", omap2_override_clocksource); | ||
diff --git a/arch/arm/mach-omap2/usb-musb.c b/arch/arm/mach-omap2/usb-musb.c index 8d5ed775dd56..b19d1b43c12e 100644 --- a/arch/arm/mach-omap2/usb-musb.c +++ b/arch/arm/mach-omap2/usb-musb.c | |||
@@ -90,7 +90,7 @@ void __init usb_musb_init(struct omap_musb_board_data *musb_board_data) | |||
90 | musb_plat.mode = board_data->mode; | 90 | musb_plat.mode = board_data->mode; |
91 | musb_plat.extvbus = board_data->extvbus; | 91 | musb_plat.extvbus = board_data->extvbus; |
92 | 92 | ||
93 | if (cpu_is_omap3517() || cpu_is_omap3505()) { | 93 | if (soc_is_am35xx()) { |
94 | oh_name = "am35x_otg_hs"; | 94 | oh_name = "am35x_otg_hs"; |
95 | name = "musb-am35x"; | 95 | name = "musb-am35x"; |
96 | } else if (cpu_is_ti81xx()) { | 96 | } else if (cpu_is_ti81xx()) { |
diff --git a/arch/arm/mach-omap2/voltagedomains3xxx_data.c b/arch/arm/mach-omap2/voltagedomains3xxx_data.c index 57db2038b23c..d0103c80d040 100644 --- a/arch/arm/mach-omap2/voltagedomains3xxx_data.c +++ b/arch/arm/mach-omap2/voltagedomains3xxx_data.c | |||
@@ -118,7 +118,7 @@ void __init omap3xxx_voltagedomains_init(void) | |||
118 | } | 118 | } |
119 | #endif | 119 | #endif |
120 | 120 | ||
121 | if (cpu_is_omap3517() || cpu_is_omap3505()) | 121 | if (soc_is_am35xx()) |
122 | voltdms = voltagedomains_am35xx; | 122 | voltdms = voltagedomains_am35xx; |
123 | else | 123 | else |
124 | voltdms = voltagedomains_omap3; | 124 | voltdms = voltagedomains_omap3; |
diff --git a/arch/arm/mach-orion5x/common.c b/arch/arm/mach-orion5x/common.c index e2e9db492d0c..9148b229d0de 100644 --- a/arch/arm/mach-orion5x/common.c +++ b/arch/arm/mach-orion5x/common.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/mv643xx_i2c.h> | 18 | #include <linux/mv643xx_i2c.h> |
19 | #include <linux/ata_platform.h> | 19 | #include <linux/ata_platform.h> |
20 | #include <linux/delay.h> | 20 | #include <linux/delay.h> |
21 | #include <linux/clk-provider.h> | ||
21 | #include <net/dsa.h> | 22 | #include <net/dsa.h> |
22 | #include <asm/page.h> | 23 | #include <asm/page.h> |
23 | #include <asm/setup.h> | 24 | #include <asm/setup.h> |
@@ -70,6 +71,19 @@ void __init orion5x_map_io(void) | |||
70 | 71 | ||
71 | 72 | ||
72 | /***************************************************************************** | 73 | /***************************************************************************** |
74 | * CLK tree | ||
75 | ****************************************************************************/ | ||
76 | static struct clk *tclk; | ||
77 | |||
78 | static void __init clk_init(void) | ||
79 | { | ||
80 | tclk = clk_register_fixed_rate(NULL, "tclk", NULL, CLK_IS_ROOT, | ||
81 | orion5x_tclk); | ||
82 | |||
83 | orion_clkdev_init(tclk); | ||
84 | } | ||
85 | |||
86 | /***************************************************************************** | ||
73 | * EHCI0 | 87 | * EHCI0 |
74 | ****************************************************************************/ | 88 | ****************************************************************************/ |
75 | void __init orion5x_ehci0_init(void) | 89 | void __init orion5x_ehci0_init(void) |
@@ -95,7 +109,7 @@ void __init orion5x_eth_init(struct mv643xx_eth_platform_data *eth_data) | |||
95 | { | 109 | { |
96 | orion_ge00_init(eth_data, | 110 | orion_ge00_init(eth_data, |
97 | ORION5X_ETH_PHYS_BASE, IRQ_ORION5X_ETH_SUM, | 111 | ORION5X_ETH_PHYS_BASE, IRQ_ORION5X_ETH_SUM, |
98 | IRQ_ORION5X_ETH_ERR, orion5x_tclk); | 112 | IRQ_ORION5X_ETH_ERR); |
99 | } | 113 | } |
100 | 114 | ||
101 | 115 | ||
@@ -132,7 +146,7 @@ void __init orion5x_sata_init(struct mv_sata_platform_data *sata_data) | |||
132 | ****************************************************************************/ | 146 | ****************************************************************************/ |
133 | void __init orion5x_spi_init() | 147 | void __init orion5x_spi_init() |
134 | { | 148 | { |
135 | orion_spi_init(SPI_PHYS_BASE, orion5x_tclk); | 149 | orion_spi_init(SPI_PHYS_BASE); |
136 | } | 150 | } |
137 | 151 | ||
138 | 152 | ||
@@ -142,7 +156,7 @@ void __init orion5x_spi_init() | |||
142 | void __init orion5x_uart0_init(void) | 156 | void __init orion5x_uart0_init(void) |
143 | { | 157 | { |
144 | orion_uart0_init(UART0_VIRT_BASE, UART0_PHYS_BASE, | 158 | orion_uart0_init(UART0_VIRT_BASE, UART0_PHYS_BASE, |
145 | IRQ_ORION5X_UART0, orion5x_tclk); | 159 | IRQ_ORION5X_UART0, tclk); |
146 | } | 160 | } |
147 | 161 | ||
148 | /***************************************************************************** | 162 | /***************************************************************************** |
@@ -151,7 +165,7 @@ void __init orion5x_uart0_init(void) | |||
151 | void __init orion5x_uart1_init(void) | 165 | void __init orion5x_uart1_init(void) |
152 | { | 166 | { |
153 | orion_uart1_init(UART1_VIRT_BASE, UART1_PHYS_BASE, | 167 | orion_uart1_init(UART1_VIRT_BASE, UART1_PHYS_BASE, |
154 | IRQ_ORION5X_UART1, orion5x_tclk); | 168 | IRQ_ORION5X_UART1, tclk); |
155 | } | 169 | } |
156 | 170 | ||
157 | /***************************************************************************** | 171 | /***************************************************************************** |
@@ -179,7 +193,7 @@ static void __init orion5x_crypto_init(void) | |||
179 | ****************************************************************************/ | 193 | ****************************************************************************/ |
180 | void __init orion5x_wdt_init(void) | 194 | void __init orion5x_wdt_init(void) |
181 | { | 195 | { |
182 | orion_wdt_init(orion5x_tclk); | 196 | orion_wdt_init(); |
183 | } | 197 | } |
184 | 198 | ||
185 | 199 | ||
@@ -276,6 +290,9 @@ void __init orion5x_init(void) | |||
276 | */ | 290 | */ |
277 | orion5x_setup_cpu_mbus_bridge(); | 291 | orion5x_setup_cpu_mbus_bridge(); |
278 | 292 | ||
293 | /* Setup root of clk tree */ | ||
294 | clk_init(); | ||
295 | |||
279 | /* | 296 | /* |
280 | * Don't issue "Wait for Interrupt" instruction if we are | 297 | * Don't issue "Wait for Interrupt" instruction if we are |
281 | * running on D0 5281 silicon. | 298 | * running on D0 5281 silicon. |
diff --git a/arch/arm/mach-orion5x/rd88f6183ap-ge-setup.c b/arch/arm/mach-orion5x/rd88f6183ap-ge-setup.c index e91bf0ba4e8e..92df49c1b62a 100644 --- a/arch/arm/mach-orion5x/rd88f6183ap-ge-setup.c +++ b/arch/arm/mach-orion5x/rd88f6183ap-ge-setup.c | |||
@@ -16,7 +16,6 @@ | |||
16 | #include <linux/mtd/physmap.h> | 16 | #include <linux/mtd/physmap.h> |
17 | #include <linux/mv643xx_eth.h> | 17 | #include <linux/mv643xx_eth.h> |
18 | #include <linux/spi/spi.h> | 18 | #include <linux/spi/spi.h> |
19 | #include <linux/spi/orion_spi.h> | ||
20 | #include <linux/spi/flash.h> | 19 | #include <linux/spi/flash.h> |
21 | #include <linux/ethtool.h> | 20 | #include <linux/ethtool.h> |
22 | #include <net/dsa.h> | 21 | #include <net/dsa.h> |
diff --git a/arch/arm/mach-pnx4008/core.c b/arch/arm/mach-pnx4008/core.c index be4c92858509..a00d2f1254ed 100644 --- a/arch/arm/mach-pnx4008/core.c +++ b/arch/arm/mach-pnx4008/core.c | |||
@@ -265,6 +265,17 @@ static void pnx4008_restart(char mode, const char *cmd) | |||
265 | soft_restart(0); | 265 | soft_restart(0); |
266 | } | 266 | } |
267 | 267 | ||
268 | #ifdef CONFIG_PM | ||
269 | extern int pnx4008_pm_init(void); | ||
270 | #else | ||
271 | static inline int pnx4008_pm_init(void) { return 0; } | ||
272 | #endif | ||
273 | |||
274 | void __init pnx4008_init_late(void) | ||
275 | { | ||
276 | pnx4008_pm_init(); | ||
277 | } | ||
278 | |||
268 | extern struct sys_timer pnx4008_timer; | 279 | extern struct sys_timer pnx4008_timer; |
269 | 280 | ||
270 | MACHINE_START(PNX4008, "Philips PNX4008") | 281 | MACHINE_START(PNX4008, "Philips PNX4008") |
@@ -273,6 +284,7 @@ MACHINE_START(PNX4008, "Philips PNX4008") | |||
273 | .map_io = pnx4008_map_io, | 284 | .map_io = pnx4008_map_io, |
274 | .init_irq = pnx4008_init_irq, | 285 | .init_irq = pnx4008_init_irq, |
275 | .init_machine = pnx4008_init, | 286 | .init_machine = pnx4008_init, |
287 | .init_late = pnx4008_init_late, | ||
276 | .timer = &pnx4008_timer, | 288 | .timer = &pnx4008_timer, |
277 | .restart = pnx4008_restart, | 289 | .restart = pnx4008_restart, |
278 | MACHINE_END | 290 | MACHINE_END |
diff --git a/arch/arm/mach-pnx4008/pm.c b/arch/arm/mach-pnx4008/pm.c index f3e60a049f98..26f8d06b142a 100644 --- a/arch/arm/mach-pnx4008/pm.c +++ b/arch/arm/mach-pnx4008/pm.c | |||
@@ -124,7 +124,7 @@ static const struct platform_suspend_ops pnx4008_pm_ops = { | |||
124 | .valid = pnx4008_pm_valid, | 124 | .valid = pnx4008_pm_valid, |
125 | }; | 125 | }; |
126 | 126 | ||
127 | static int __init pnx4008_pm_init(void) | 127 | int __init pnx4008_pm_init(void) |
128 | { | 128 | { |
129 | u32 sram_size_to_allocate; | 129 | u32 sram_size_to_allocate; |
130 | 130 | ||
@@ -151,5 +151,3 @@ static int __init pnx4008_pm_init(void) | |||
151 | suspend_set_ops(&pnx4008_pm_ops); | 151 | suspend_set_ops(&pnx4008_pm_ops); |
152 | return 0; | 152 | return 0; |
153 | } | 153 | } |
154 | |||
155 | late_initcall(pnx4008_pm_init); | ||
diff --git a/arch/arm/mach-prima2/common.h b/arch/arm/mach-prima2/common.h index b28a930d4f8a..60d826fc2185 100644 --- a/arch/arm/mach-prima2/common.h +++ b/arch/arm/mach-prima2/common.h | |||
@@ -24,4 +24,10 @@ static inline void sirfsoc_map_lluart(void) {} | |||
24 | extern void __init sirfsoc_map_lluart(void); | 24 | extern void __init sirfsoc_map_lluart(void); |
25 | #endif | 25 | #endif |
26 | 26 | ||
27 | #ifdef CONFIG_SUSPEND | ||
28 | extern int sirfsoc_pm_init(void); | ||
29 | #else | ||
30 | static inline int sirfsoc_pm_init(void) { return 0; } | ||
31 | #endif | ||
32 | |||
27 | #endif | 33 | #endif |
diff --git a/arch/arm/mach-prima2/pm.c b/arch/arm/mach-prima2/pm.c index 26ebb57719df..fb5a7910af35 100644 --- a/arch/arm/mach-prima2/pm.c +++ b/arch/arm/mach-prima2/pm.c | |||
@@ -85,12 +85,11 @@ static const struct platform_suspend_ops sirfsoc_pm_ops = { | |||
85 | .valid = suspend_valid_only_mem, | 85 | .valid = suspend_valid_only_mem, |
86 | }; | 86 | }; |
87 | 87 | ||
88 | static int __init sirfsoc_pm_init(void) | 88 | int __init sirfsoc_pm_init(void) |
89 | { | 89 | { |
90 | suspend_set_ops(&sirfsoc_pm_ops); | 90 | suspend_set_ops(&sirfsoc_pm_ops); |
91 | return 0; | 91 | return 0; |
92 | } | 92 | } |
93 | late_initcall(sirfsoc_pm_init); | ||
94 | 93 | ||
95 | static const struct of_device_id pwrc_ids[] = { | 94 | static const struct of_device_id pwrc_ids[] = { |
96 | { .compatible = "sirf,prima2-pwrc" }, | 95 | { .compatible = "sirf,prima2-pwrc" }, |
diff --git a/arch/arm/mach-prima2/prima2.c b/arch/arm/mach-prima2/prima2.c index 02b9c05ff990..8f0429d4b79f 100644 --- a/arch/arm/mach-prima2/prima2.c +++ b/arch/arm/mach-prima2/prima2.c | |||
@@ -25,6 +25,11 @@ void __init sirfsoc_mach_init(void) | |||
25 | of_platform_bus_probe(NULL, sirfsoc_of_bus_ids, NULL); | 25 | of_platform_bus_probe(NULL, sirfsoc_of_bus_ids, NULL); |
26 | } | 26 | } |
27 | 27 | ||
28 | void __init sirfsoc_init_late(void) | ||
29 | { | ||
30 | sirfsoc_pm_init(); | ||
31 | } | ||
32 | |||
28 | static const char *prima2cb_dt_match[] __initdata = { | 33 | static const char *prima2cb_dt_match[] __initdata = { |
29 | "sirf,prima2-cb", | 34 | "sirf,prima2-cb", |
30 | NULL | 35 | NULL |
@@ -39,6 +44,7 @@ MACHINE_START(PRIMA2_EVB, "prima2cb") | |||
39 | .timer = &sirfsoc_timer, | 44 | .timer = &sirfsoc_timer, |
40 | .dma_zone_size = SZ_256M, | 45 | .dma_zone_size = SZ_256M, |
41 | .init_machine = sirfsoc_mach_init, | 46 | .init_machine = sirfsoc_mach_init, |
47 | .init_late = sirfsoc_init_late, | ||
42 | .dt_compat = prima2cb_dt_match, | 48 | .dt_compat = prima2cb_dt_match, |
43 | .restart = sirfsoc_restart, | 49 | .restart = sirfsoc_restart, |
44 | MACHINE_END | 50 | MACHINE_END |
diff --git a/arch/arm/mach-s3c24xx/Kconfig b/arch/arm/mach-s3c24xx/Kconfig index b34287ab5afd..e24961109b70 100644 --- a/arch/arm/mach-s3c24xx/Kconfig +++ b/arch/arm/mach-s3c24xx/Kconfig | |||
@@ -518,6 +518,11 @@ config S3C2443_DMA | |||
518 | help | 518 | help |
519 | Internal config node for S3C2443 DMA support | 519 | Internal config node for S3C2443 DMA support |
520 | 520 | ||
521 | config S3C2443_SETUP_SPI | ||
522 | bool | ||
523 | help | ||
524 | Common setup code for SPI GPIO configurations | ||
525 | |||
521 | endif # CPU_S3C2443 || CPU_S3C2416 | 526 | endif # CPU_S3C2443 || CPU_S3C2416 |
522 | 527 | ||
523 | if CPU_S3C2443 | 528 | if CPU_S3C2443 |
diff --git a/arch/arm/mach-s3c24xx/Makefile b/arch/arm/mach-s3c24xx/Makefile index 3518fe812d5f..0ab6ab15da4c 100644 --- a/arch/arm/mach-s3c24xx/Makefile +++ b/arch/arm/mach-s3c24xx/Makefile | |||
@@ -14,6 +14,8 @@ obj- := | |||
14 | 14 | ||
15 | # core | 15 | # core |
16 | 16 | ||
17 | obj-y += common.o | ||
18 | |||
17 | obj-$(CONFIG_CPU_S3C2410) += s3c2410.o | 19 | obj-$(CONFIG_CPU_S3C2410) += s3c2410.o |
18 | obj-$(CONFIG_S3C2410_DMA) += dma-s3c2410.o | 20 | obj-$(CONFIG_S3C2410_DMA) += dma-s3c2410.o |
19 | obj-$(CONFIG_S3C2410_PM) += pm-s3c2410.o sleep-s3c2410.o | 21 | obj-$(CONFIG_S3C2410_PM) += pm-s3c2410.o sleep-s3c2410.o |
@@ -33,6 +35,10 @@ obj-$(CONFIG_S3C2440_DMA) += dma-s3c2440.o | |||
33 | 35 | ||
34 | obj-$(CONFIG_CPU_S3C2443) += s3c2443.o irq-s3c2443.o clock-s3c2443.o | 36 | obj-$(CONFIG_CPU_S3C2443) += s3c2443.o irq-s3c2443.o clock-s3c2443.o |
35 | 37 | ||
38 | # PM | ||
39 | |||
40 | obj-$(CONFIG_PM) += pm.o irq-pm.o sleep.o | ||
41 | |||
36 | # common code | 42 | # common code |
37 | 43 | ||
38 | obj-$(CONFIG_S3C2443_COMMON) += common-s3c2443.o | 44 | obj-$(CONFIG_S3C2443_COMMON) += common-s3c2443.o |
@@ -91,5 +97,6 @@ obj-$(CONFIG_MACH_OSIRIS_DVS) += mach-osiris-dvs.o | |||
91 | # device setup | 97 | # device setup |
92 | 98 | ||
93 | obj-$(CONFIG_S3C2416_SETUP_SDHCI_GPIO) += setup-sdhci-gpio.o | 99 | obj-$(CONFIG_S3C2416_SETUP_SDHCI_GPIO) += setup-sdhci-gpio.o |
100 | obj-$(CONFIG_S3C2443_SETUP_SPI) += setup-spi.o | ||
94 | obj-$(CONFIG_ARCH_S3C24XX) += setup-i2c.o | 101 | obj-$(CONFIG_ARCH_S3C24XX) += setup-i2c.o |
95 | obj-$(CONFIG_S3C24XX_SETUP_TS) += setup-ts.o | 102 | obj-$(CONFIG_S3C24XX_SETUP_TS) += setup-ts.o |
diff --git a/arch/arm/mach-s3c24xx/clock-s3c2416.c b/arch/arm/mach-s3c24xx/clock-s3c2416.c index dbc9ab4aaca2..8702ecfaab30 100644 --- a/arch/arm/mach-s3c24xx/clock-s3c2416.c +++ b/arch/arm/mach-s3c24xx/clock-s3c2416.c | |||
@@ -144,6 +144,7 @@ static struct clk_lookup s3c2416_clk_lookup[] = { | |||
144 | CLKDEV_INIT("s3c-sdhci.0", "mmc_busclk.0", &hsmmc0_clk), | 144 | CLKDEV_INIT("s3c-sdhci.0", "mmc_busclk.0", &hsmmc0_clk), |
145 | CLKDEV_INIT("s3c-sdhci.0", "mmc_busclk.2", &hsmmc_mux0.clk), | 145 | CLKDEV_INIT("s3c-sdhci.0", "mmc_busclk.2", &hsmmc_mux0.clk), |
146 | CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.2", &hsmmc_mux1.clk), | 146 | CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.2", &hsmmc_mux1.clk), |
147 | CLKDEV_INIT("s3c64xx-spi.0", "spi_busclk2", &hsspi_mux.clk), | ||
147 | }; | 148 | }; |
148 | 149 | ||
149 | void __init s3c2416_init_clocks(int xtal) | 150 | void __init s3c2416_init_clocks(int xtal) |
diff --git a/arch/arm/mach-s3c24xx/clock-s3c2443.c b/arch/arm/mach-s3c24xx/clock-s3c2443.c index efb3ac359566..a4c5a520d994 100644 --- a/arch/arm/mach-s3c24xx/clock-s3c2443.c +++ b/arch/arm/mach-s3c24xx/clock-s3c2443.c | |||
@@ -179,6 +179,11 @@ static struct clk *clks[] __initdata = { | |||
179 | &clk_hsmmc, | 179 | &clk_hsmmc, |
180 | }; | 180 | }; |
181 | 181 | ||
182 | static struct clk_lookup s3c2443_clk_lookup[] = { | ||
183 | CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.2", &clk_hsmmc), | ||
184 | CLKDEV_INIT("s3c64xx-spi.0", "spi_busclk2", &clk_hsspi.clk), | ||
185 | }; | ||
186 | |||
182 | void __init s3c2443_init_clocks(int xtal) | 187 | void __init s3c2443_init_clocks(int xtal) |
183 | { | 188 | { |
184 | unsigned long epllcon = __raw_readl(S3C2443_EPLLCON); | 189 | unsigned long epllcon = __raw_readl(S3C2443_EPLLCON); |
@@ -210,6 +215,7 @@ void __init s3c2443_init_clocks(int xtal) | |||
210 | 215 | ||
211 | s3c_register_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off)); | 216 | s3c_register_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off)); |
212 | s3c_disable_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off)); | 217 | s3c_disable_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off)); |
218 | clkdev_add_table(s3c2443_clk_lookup, ARRAY_SIZE(s3c2443_clk_lookup)); | ||
213 | 219 | ||
214 | s3c_pwmclk_init(); | 220 | s3c_pwmclk_init(); |
215 | } | 221 | } |
diff --git a/arch/arm/mach-s3c24xx/common-s3c2443.c b/arch/arm/mach-s3c24xx/common-s3c2443.c index 460431589f39..aeeb2be283fa 100644 --- a/arch/arm/mach-s3c24xx/common-s3c2443.c +++ b/arch/arm/mach-s3c24xx/common-s3c2443.c | |||
@@ -424,11 +424,6 @@ static struct clk init_clocks_off[] = { | |||
424 | .enable = s3c2443_clkcon_enable_p, | 424 | .enable = s3c2443_clkcon_enable_p, |
425 | .ctrlbit = S3C2443_PCLKCON_IIS, | 425 | .ctrlbit = S3C2443_PCLKCON_IIS, |
426 | }, { | 426 | }, { |
427 | .name = "hsspi", | ||
428 | .parent = &clk_p, | ||
429 | .enable = s3c2443_clkcon_enable_p, | ||
430 | .ctrlbit = S3C2443_PCLKCON_HSSPI, | ||
431 | }, { | ||
432 | .name = "adc", | 427 | .name = "adc", |
433 | .parent = &clk_p, | 428 | .parent = &clk_p, |
434 | .enable = s3c2443_clkcon_enable_p, | 429 | .enable = s3c2443_clkcon_enable_p, |
@@ -562,6 +557,14 @@ static struct clk hsmmc1_clk = { | |||
562 | .ctrlbit = S3C2443_HCLKCON_HSMMC, | 557 | .ctrlbit = S3C2443_HCLKCON_HSMMC, |
563 | }; | 558 | }; |
564 | 559 | ||
560 | static struct clk hsspi_clk = { | ||
561 | .name = "spi", | ||
562 | .devname = "s3c64xx-spi.0", | ||
563 | .parent = &clk_p, | ||
564 | .enable = s3c2443_clkcon_enable_p, | ||
565 | .ctrlbit = S3C2443_PCLKCON_HSSPI, | ||
566 | }; | ||
567 | |||
565 | /* EPLLCON compatible enough to get on/off information */ | 568 | /* EPLLCON compatible enough to get on/off information */ |
566 | 569 | ||
567 | void __init_or_cpufreq s3c2443_common_setup_clocks(pll_fn get_mpll) | 570 | void __init_or_cpufreq s3c2443_common_setup_clocks(pll_fn get_mpll) |
@@ -612,6 +615,7 @@ static struct clk *clks[] __initdata = { | |||
612 | &clk_usb_bus, | 615 | &clk_usb_bus, |
613 | &clk_armdiv, | 616 | &clk_armdiv, |
614 | &hsmmc1_clk, | 617 | &hsmmc1_clk, |
618 | &hsspi_clk, | ||
615 | }; | 619 | }; |
616 | 620 | ||
617 | static struct clksrc_clk *clksrcs[] __initdata = { | 621 | static struct clksrc_clk *clksrcs[] __initdata = { |
@@ -629,6 +633,7 @@ static struct clk_lookup s3c2443_clk_lookup[] = { | |||
629 | CLKDEV_INIT(NULL, "clk_uart_baud2", &clk_p), | 633 | CLKDEV_INIT(NULL, "clk_uart_baud2", &clk_p), |
630 | CLKDEV_INIT(NULL, "clk_uart_baud3", &clk_esys_uart.clk), | 634 | CLKDEV_INIT(NULL, "clk_uart_baud3", &clk_esys_uart.clk), |
631 | CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.0", &hsmmc1_clk), | 635 | CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.0", &hsmmc1_clk), |
636 | CLKDEV_INIT("s3c64xx-spi.0", "spi_busclk0", &hsspi_clk), | ||
632 | }; | 637 | }; |
633 | 638 | ||
634 | void __init s3c2443_common_init_clocks(int xtal, pll_fn get_mpll, | 639 | void __init s3c2443_common_init_clocks(int xtal, pll_fn get_mpll, |
diff --git a/arch/arm/plat-s3c24xx/cpu.c b/arch/arm/mach-s3c24xx/common.c index 290942d9adda..56cdd34cce41 100644 --- a/arch/arm/plat-s3c24xx/cpu.c +++ b/arch/arm/mach-s3c24xx/common.c | |||
@@ -4,7 +4,7 @@ | |||
4 | * http://www.simtec.co.uk/products/SWLINUX/ | 4 | * http://www.simtec.co.uk/products/SWLINUX/ |
5 | * Ben Dooks <ben@simtec.co.uk> | 5 | * Ben Dooks <ben@simtec.co.uk> |
6 | * | 6 | * |
7 | * S3C24XX CPU Support | 7 | * Common code for S3C24XX machines |
8 | * | 8 | * |
9 | * This program is free software; you can redistribute it and/or modify | 9 | * This program is free software; you can redistribute it and/or modify |
10 | * it under the terms of the GNU General Public License as published by | 10 | * it under the terms of the GNU General Public License as published by |
@@ -41,6 +41,7 @@ | |||
41 | #include <asm/mach/arch.h> | 41 | #include <asm/mach/arch.h> |
42 | #include <asm/mach/map.h> | 42 | #include <asm/mach/map.h> |
43 | 43 | ||
44 | #include <mach/regs-clock.h> | ||
44 | #include <mach/regs-gpio.h> | 45 | #include <mach/regs-gpio.h> |
45 | #include <plat/regs-serial.h> | 46 | #include <plat/regs-serial.h> |
46 | 47 | ||
@@ -52,6 +53,8 @@ | |||
52 | #include <plat/s3c2416.h> | 53 | #include <plat/s3c2416.h> |
53 | #include <plat/s3c244x.h> | 54 | #include <plat/s3c244x.h> |
54 | #include <plat/s3c2443.h> | 55 | #include <plat/s3c2443.h> |
56 | #include <plat/cpu-freq.h> | ||
57 | #include <plat/pll.h> | ||
55 | 58 | ||
56 | /* table of supported CPUs */ | 59 | /* table of supported CPUs */ |
57 | 60 | ||
@@ -234,3 +237,67 @@ void __init s3c24xx_init_io(struct map_desc *mach_desc, int size) | |||
234 | 237 | ||
235 | s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids)); | 238 | s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids)); |
236 | } | 239 | } |
240 | |||
241 | /* Serial port registrations */ | ||
242 | |||
243 | static struct resource s3c2410_uart0_resource[] = { | ||
244 | [0] = DEFINE_RES_MEM(S3C2410_PA_UART0, SZ_16K), | ||
245 | [1] = DEFINE_RES_NAMED(IRQ_S3CUART_RX0, \ | ||
246 | IRQ_S3CUART_ERR0 - IRQ_S3CUART_RX0 + 1, \ | ||
247 | NULL, IORESOURCE_IRQ) | ||
248 | }; | ||
249 | |||
250 | static struct resource s3c2410_uart1_resource[] = { | ||
251 | [0] = DEFINE_RES_MEM(S3C2410_PA_UART1, SZ_16K), | ||
252 | [1] = DEFINE_RES_NAMED(IRQ_S3CUART_RX1, \ | ||
253 | IRQ_S3CUART_ERR1 - IRQ_S3CUART_RX1 + 1, \ | ||
254 | NULL, IORESOURCE_IRQ) | ||
255 | }; | ||
256 | |||
257 | static struct resource s3c2410_uart2_resource[] = { | ||
258 | [0] = DEFINE_RES_MEM(S3C2410_PA_UART2, SZ_16K), | ||
259 | [1] = DEFINE_RES_NAMED(IRQ_S3CUART_RX2, \ | ||
260 | IRQ_S3CUART_ERR2 - IRQ_S3CUART_RX2 + 1, \ | ||
261 | NULL, IORESOURCE_IRQ) | ||
262 | }; | ||
263 | |||
264 | static struct resource s3c2410_uart3_resource[] = { | ||
265 | [0] = DEFINE_RES_MEM(S3C2443_PA_UART3, SZ_16K), | ||
266 | [1] = DEFINE_RES_NAMED(IRQ_S3CUART_RX3, \ | ||
267 | IRQ_S3CUART_ERR3 - IRQ_S3CUART_RX3 + 1, \ | ||
268 | NULL, IORESOURCE_IRQ) | ||
269 | }; | ||
270 | |||
271 | struct s3c24xx_uart_resources s3c2410_uart_resources[] __initdata = { | ||
272 | [0] = { | ||
273 | .resources = s3c2410_uart0_resource, | ||
274 | .nr_resources = ARRAY_SIZE(s3c2410_uart0_resource), | ||
275 | }, | ||
276 | [1] = { | ||
277 | .resources = s3c2410_uart1_resource, | ||
278 | .nr_resources = ARRAY_SIZE(s3c2410_uart1_resource), | ||
279 | }, | ||
280 | [2] = { | ||
281 | .resources = s3c2410_uart2_resource, | ||
282 | .nr_resources = ARRAY_SIZE(s3c2410_uart2_resource), | ||
283 | }, | ||
284 | [3] = { | ||
285 | .resources = s3c2410_uart3_resource, | ||
286 | .nr_resources = ARRAY_SIZE(s3c2410_uart3_resource), | ||
287 | }, | ||
288 | }; | ||
289 | |||
290 | /* initialise all the clocks */ | ||
291 | |||
292 | void __init_or_cpufreq s3c24xx_setup_clocks(unsigned long fclk, | ||
293 | unsigned long hclk, | ||
294 | unsigned long pclk) | ||
295 | { | ||
296 | clk_upll.rate = s3c24xx_get_pll(__raw_readl(S3C2410_UPLLCON), | ||
297 | clk_xtal.rate); | ||
298 | |||
299 | clk_mpll.rate = fclk; | ||
300 | clk_h.rate = hclk; | ||
301 | clk_p.rate = pclk; | ||
302 | clk_f.rate = fclk; | ||
303 | } | ||
diff --git a/arch/arm/mach-s3c24xx/dma-s3c2443.c b/arch/arm/mach-s3c24xx/dma-s3c2443.c index e227c472a40a..2d94228d2866 100644 --- a/arch/arm/mach-s3c24xx/dma-s3c2443.c +++ b/arch/arm/mach-s3c24xx/dma-s3c2443.c | |||
@@ -55,12 +55,20 @@ static struct s3c24xx_dma_map __initdata s3c2443_dma_mappings[] = { | |||
55 | .name = "sdi", | 55 | .name = "sdi", |
56 | .channels = MAP(S3C2443_DMAREQSEL_SDI), | 56 | .channels = MAP(S3C2443_DMAREQSEL_SDI), |
57 | }, | 57 | }, |
58 | [DMACH_SPI0] = { | 58 | [DMACH_SPI0_RX] = { |
59 | .name = "spi0", | 59 | .name = "spi0-rx", |
60 | .channels = MAP(S3C2443_DMAREQSEL_SPI0RX), | ||
61 | }, | ||
62 | [DMACH_SPI0_TX] = { | ||
63 | .name = "spi0-tx", | ||
60 | .channels = MAP(S3C2443_DMAREQSEL_SPI0TX), | 64 | .channels = MAP(S3C2443_DMAREQSEL_SPI0TX), |
61 | }, | 65 | }, |
62 | [DMACH_SPI1] = { /* only on S3C2443/S3C2450 */ | 66 | [DMACH_SPI1_RX] = { /* only on S3C2443/S3C2450 */ |
63 | .name = "spi1", | 67 | .name = "spi1-rx", |
68 | .channels = MAP(S3C2443_DMAREQSEL_SPI1RX), | ||
69 | }, | ||
70 | [DMACH_SPI1_TX] = { /* only on S3C2443/S3C2450 */ | ||
71 | .name = "spi1-tx", | ||
64 | .channels = MAP(S3C2443_DMAREQSEL_SPI1TX), | 72 | .channels = MAP(S3C2443_DMAREQSEL_SPI1TX), |
65 | }, | 73 | }, |
66 | [DMACH_UART0] = { | 74 | [DMACH_UART0] = { |
diff --git a/arch/arm/mach-s3c24xx/include/mach/dma.h b/arch/arm/mach-s3c24xx/include/mach/dma.h index acbdfecd4186..454831b66037 100644 --- a/arch/arm/mach-s3c24xx/include/mach/dma.h +++ b/arch/arm/mach-s3c24xx/include/mach/dma.h | |||
@@ -47,6 +47,10 @@ enum dma_ch { | |||
47 | DMACH_UART2_SRC2, | 47 | DMACH_UART2_SRC2, |
48 | DMACH_UART3, /* s3c2443 has extra uart */ | 48 | DMACH_UART3, /* s3c2443 has extra uart */ |
49 | DMACH_UART3_SRC2, | 49 | DMACH_UART3_SRC2, |
50 | DMACH_SPI0_TX, /* s3c2443/2416/2450 hsspi0 */ | ||
51 | DMACH_SPI0_RX, /* s3c2443/2416/2450 hsspi0 */ | ||
52 | DMACH_SPI1_TX, /* s3c2443/2450 hsspi1 */ | ||
53 | DMACH_SPI1_RX, /* s3c2443/2450 hsspi1 */ | ||
50 | DMACH_MAX, /* the end entry */ | 54 | DMACH_MAX, /* the end entry */ |
51 | }; | 55 | }; |
52 | 56 | ||
diff --git a/arch/arm/mach-s3c24xx/include/mach/map.h b/arch/arm/mach-s3c24xx/include/mach/map.h index 78ae807f1281..8ba381f2dbe1 100644 --- a/arch/arm/mach-s3c24xx/include/mach/map.h +++ b/arch/arm/mach-s3c24xx/include/mach/map.h | |||
@@ -98,6 +98,8 @@ | |||
98 | 98 | ||
99 | /* SPI */ | 99 | /* SPI */ |
100 | #define S3C2410_PA_SPI (0x59000000) | 100 | #define S3C2410_PA_SPI (0x59000000) |
101 | #define S3C2443_PA_SPI0 (0x52000000) | ||
102 | #define S3C2443_PA_SPI1 S3C2410_PA_SPI | ||
101 | 103 | ||
102 | /* SDI */ | 104 | /* SDI */ |
103 | #define S3C2410_PA_SDI (0x5A000000) | 105 | #define S3C2410_PA_SDI (0x5A000000) |
@@ -162,4 +164,7 @@ | |||
162 | #define S3C_PA_WDT S3C2410_PA_WATCHDOG | 164 | #define S3C_PA_WDT S3C2410_PA_WATCHDOG |
163 | #define S3C_PA_NAND S3C24XX_PA_NAND | 165 | #define S3C_PA_NAND S3C24XX_PA_NAND |
164 | 166 | ||
167 | #define S3C_PA_SPI0 S3C2443_PA_SPI0 | ||
168 | #define S3C_PA_SPI1 S3C2443_PA_SPI1 | ||
169 | |||
165 | #endif /* __ASM_ARCH_MAP_H */ | 170 | #endif /* __ASM_ARCH_MAP_H */ |
diff --git a/arch/arm/plat-s3c24xx/irq-pm.c b/arch/arm/mach-s3c24xx/irq-pm.c index 0efb2e2848c8..0efb2e2848c8 100644 --- a/arch/arm/plat-s3c24xx/irq-pm.c +++ b/arch/arm/mach-s3c24xx/irq-pm.c | |||
diff --git a/arch/arm/plat-s3c24xx/pm.c b/arch/arm/mach-s3c24xx/pm.c index 60627e63a254..60627e63a254 100644 --- a/arch/arm/plat-s3c24xx/pm.c +++ b/arch/arm/mach-s3c24xx/pm.c | |||
diff --git a/arch/arm/mach-s3c24xx/setup-spi.c b/arch/arm/mach-s3c24xx/setup-spi.c new file mode 100644 index 000000000000..5712c85f39b1 --- /dev/null +++ b/arch/arm/mach-s3c24xx/setup-spi.c | |||
@@ -0,0 +1,39 @@ | |||
1 | /* | ||
2 | * HS-SPI device setup for S3C2443/S3C2416 | ||
3 | * | ||
4 | * Copyright (C) 2011 Samsung Electronics Ltd. | ||
5 | * http://www.samsung.com/ | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | #include <linux/gpio.h> | ||
13 | #include <linux/platform_device.h> | ||
14 | |||
15 | #include <plat/gpio-cfg.h> | ||
16 | #include <plat/s3c64xx-spi.h> | ||
17 | |||
18 | #include <mach/hardware.h> | ||
19 | #include <mach/regs-gpio.h> | ||
20 | |||
21 | #ifdef CONFIG_S3C64XX_DEV_SPI0 | ||
22 | struct s3c64xx_spi_info s3c64xx_spi0_pdata __initdata = { | ||
23 | .fifo_lvl_mask = 0x7f, | ||
24 | .rx_lvl_offset = 13, | ||
25 | .tx_st_done = 21, | ||
26 | .high_speed = 1, | ||
27 | }; | ||
28 | |||
29 | int s3c64xx_spi0_cfg_gpio(struct platform_device *pdev) | ||
30 | { | ||
31 | /* enable hsspi bit in misccr */ | ||
32 | s3c2410_modify_misccr(S3C2416_MISCCR_HSSPI_EN2, 1); | ||
33 | |||
34 | s3c_gpio_cfgall_range(S3C2410_GPE(11), 3, | ||
35 | S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); | ||
36 | |||
37 | return 0; | ||
38 | } | ||
39 | #endif | ||
diff --git a/arch/arm/plat-s3c24xx/sleep.S b/arch/arm/mach-s3c24xx/sleep.S index c56612569b40..c56612569b40 100644 --- a/arch/arm/plat-s3c24xx/sleep.S +++ b/arch/arm/mach-s3c24xx/sleep.S | |||
diff --git a/arch/arm/mach-s3c64xx/common.c b/arch/arm/mach-s3c64xx/common.c index b313380342a5..be746e33e86c 100644 --- a/arch/arm/mach-s3c64xx/common.c +++ b/arch/arm/mach-s3c64xx/common.c | |||
@@ -384,3 +384,8 @@ void s3c64xx_restart(char mode, const char *cmd) | |||
384 | /* if all else fails, or mode was for soft, jump to 0 */ | 384 | /* if all else fails, or mode was for soft, jump to 0 */ |
385 | soft_restart(0); | 385 | soft_restart(0); |
386 | } | 386 | } |
387 | |||
388 | void __init s3c64xx_init_late(void) | ||
389 | { | ||
390 | s3c64xx_pm_late_initcall(); | ||
391 | } | ||
diff --git a/arch/arm/mach-s3c64xx/common.h b/arch/arm/mach-s3c64xx/common.h index 7a10be629aba..6cfc99bdfb37 100644 --- a/arch/arm/mach-s3c64xx/common.h +++ b/arch/arm/mach-s3c64xx/common.h | |||
@@ -24,6 +24,7 @@ void s3c64xx_register_clocks(unsigned long xtal, unsigned armclk_limit); | |||
24 | void s3c64xx_setup_clocks(void); | 24 | void s3c64xx_setup_clocks(void); |
25 | 25 | ||
26 | void s3c64xx_restart(char mode, const char *cmd); | 26 | void s3c64xx_restart(char mode, const char *cmd); |
27 | void s3c64xx_init_late(void); | ||
27 | 28 | ||
28 | #ifdef CONFIG_CPU_S3C6400 | 29 | #ifdef CONFIG_CPU_S3C6400 |
29 | 30 | ||
@@ -51,4 +52,10 @@ extern void s3c6410_init_clocks(int xtal); | |||
51 | #define s3c6410_init NULL | 52 | #define s3c6410_init NULL |
52 | #endif | 53 | #endif |
53 | 54 | ||
55 | #ifdef CONFIG_PM | ||
56 | int __init s3c64xx_pm_late_initcall(void); | ||
57 | #else | ||
58 | static inline int s3c64xx_pm_late_initcall(void) { return 0; } | ||
59 | #endif | ||
60 | |||
54 | #endif /* __ARCH_ARM_MACH_S3C64XX_COMMON_H */ | 61 | #endif /* __ARCH_ARM_MACH_S3C64XX_COMMON_H */ |
diff --git a/arch/arm/mach-s3c64xx/mach-anw6410.c b/arch/arm/mach-s3c64xx/mach-anw6410.c index f252691fb209..314df0518afd 100644 --- a/arch/arm/mach-s3c64xx/mach-anw6410.c +++ b/arch/arm/mach-s3c64xx/mach-anw6410.c | |||
@@ -230,6 +230,7 @@ MACHINE_START(ANW6410, "A&W6410") | |||
230 | .handle_irq = vic_handle_irq, | 230 | .handle_irq = vic_handle_irq, |
231 | .map_io = anw6410_map_io, | 231 | .map_io = anw6410_map_io, |
232 | .init_machine = anw6410_machine_init, | 232 | .init_machine = anw6410_machine_init, |
233 | .init_late = s3c64xx_init_late, | ||
233 | .timer = &s3c24xx_timer, | 234 | .timer = &s3c24xx_timer, |
234 | .restart = s3c64xx_restart, | 235 | .restart = s3c64xx_restart, |
235 | MACHINE_END | 236 | MACHINE_END |
diff --git a/arch/arm/mach-s3c64xx/mach-crag6410.c b/arch/arm/mach-s3c64xx/mach-crag6410.c index aa1137fb47e6..eda5e027b109 100644 --- a/arch/arm/mach-s3c64xx/mach-crag6410.c +++ b/arch/arm/mach-s3c64xx/mach-crag6410.c | |||
@@ -813,6 +813,7 @@ MACHINE_START(WLF_CRAGG_6410, "Wolfson Cragganmore 6410") | |||
813 | .handle_irq = vic_handle_irq, | 813 | .handle_irq = vic_handle_irq, |
814 | .map_io = crag6410_map_io, | 814 | .map_io = crag6410_map_io, |
815 | .init_machine = crag6410_machine_init, | 815 | .init_machine = crag6410_machine_init, |
816 | .init_late = s3c64xx_init_late, | ||
816 | .timer = &s3c24xx_timer, | 817 | .timer = &s3c24xx_timer, |
817 | .restart = s3c64xx_restart, | 818 | .restart = s3c64xx_restart, |
818 | MACHINE_END | 819 | MACHINE_END |
diff --git a/arch/arm/mach-s3c64xx/mach-hmt.c b/arch/arm/mach-s3c64xx/mach-hmt.c index 521e07b8501b..1bf6b9da20fc 100644 --- a/arch/arm/mach-s3c64xx/mach-hmt.c +++ b/arch/arm/mach-s3c64xx/mach-hmt.c | |||
@@ -272,6 +272,7 @@ MACHINE_START(HMT, "Airgoo-HMT") | |||
272 | .handle_irq = vic_handle_irq, | 272 | .handle_irq = vic_handle_irq, |
273 | .map_io = hmt_map_io, | 273 | .map_io = hmt_map_io, |
274 | .init_machine = hmt_machine_init, | 274 | .init_machine = hmt_machine_init, |
275 | .init_late = s3c64xx_init_late, | ||
275 | .timer = &s3c24xx_timer, | 276 | .timer = &s3c24xx_timer, |
276 | .restart = s3c64xx_restart, | 277 | .restart = s3c64xx_restart, |
277 | MACHINE_END | 278 | MACHINE_END |
diff --git a/arch/arm/mach-s3c64xx/mach-mini6410.c b/arch/arm/mach-s3c64xx/mach-mini6410.c index b2166d4a5538..f8ea61ea3b33 100644 --- a/arch/arm/mach-s3c64xx/mach-mini6410.c +++ b/arch/arm/mach-s3c64xx/mach-mini6410.c | |||
@@ -339,6 +339,7 @@ MACHINE_START(MINI6410, "MINI6410") | |||
339 | .handle_irq = vic_handle_irq, | 339 | .handle_irq = vic_handle_irq, |
340 | .map_io = mini6410_map_io, | 340 | .map_io = mini6410_map_io, |
341 | .init_machine = mini6410_machine_init, | 341 | .init_machine = mini6410_machine_init, |
342 | .init_late = s3c64xx_init_late, | ||
342 | .timer = &s3c24xx_timer, | 343 | .timer = &s3c24xx_timer, |
343 | .restart = s3c64xx_restart, | 344 | .restart = s3c64xx_restart, |
344 | MACHINE_END | 345 | MACHINE_END |
diff --git a/arch/arm/mach-s3c64xx/mach-ncp.c b/arch/arm/mach-s3c64xx/mach-ncp.c index 0efa2ba783b2..cad2e05eddf7 100644 --- a/arch/arm/mach-s3c64xx/mach-ncp.c +++ b/arch/arm/mach-s3c64xx/mach-ncp.c | |||
@@ -104,6 +104,7 @@ MACHINE_START(NCP, "NCP") | |||
104 | .handle_irq = vic_handle_irq, | 104 | .handle_irq = vic_handle_irq, |
105 | .map_io = ncp_map_io, | 105 | .map_io = ncp_map_io, |
106 | .init_machine = ncp_machine_init, | 106 | .init_machine = ncp_machine_init, |
107 | .init_late = s3c64xx_init_late, | ||
107 | .timer = &s3c24xx_timer, | 108 | .timer = &s3c24xx_timer, |
108 | .restart = s3c64xx_restart, | 109 | .restart = s3c64xx_restart, |
109 | MACHINE_END | 110 | MACHINE_END |
diff --git a/arch/arm/mach-s3c64xx/mach-real6410.c b/arch/arm/mach-s3c64xx/mach-real6410.c index 5c08266cea21..b92d8e17d502 100644 --- a/arch/arm/mach-s3c64xx/mach-real6410.c +++ b/arch/arm/mach-s3c64xx/mach-real6410.c | |||
@@ -320,6 +320,7 @@ MACHINE_START(REAL6410, "REAL6410") | |||
320 | .handle_irq = vic_handle_irq, | 320 | .handle_irq = vic_handle_irq, |
321 | .map_io = real6410_map_io, | 321 | .map_io = real6410_map_io, |
322 | .init_machine = real6410_machine_init, | 322 | .init_machine = real6410_machine_init, |
323 | .init_late = s3c64xx_init_late, | ||
323 | .timer = &s3c24xx_timer, | 324 | .timer = &s3c24xx_timer, |
324 | .restart = s3c64xx_restart, | 325 | .restart = s3c64xx_restart, |
325 | MACHINE_END | 326 | MACHINE_END |
diff --git a/arch/arm/mach-s3c64xx/mach-smartq5.c b/arch/arm/mach-s3c64xx/mach-smartq5.c index 3f42431d4dda..c5021d0335c6 100644 --- a/arch/arm/mach-s3c64xx/mach-smartq5.c +++ b/arch/arm/mach-s3c64xx/mach-smartq5.c | |||
@@ -152,6 +152,7 @@ MACHINE_START(SMARTQ5, "SmartQ 5") | |||
152 | .handle_irq = vic_handle_irq, | 152 | .handle_irq = vic_handle_irq, |
153 | .map_io = smartq_map_io, | 153 | .map_io = smartq_map_io, |
154 | .init_machine = smartq5_machine_init, | 154 | .init_machine = smartq5_machine_init, |
155 | .init_late = s3c64xx_init_late, | ||
155 | .timer = &s3c24xx_timer, | 156 | .timer = &s3c24xx_timer, |
156 | .restart = s3c64xx_restart, | 157 | .restart = s3c64xx_restart, |
157 | MACHINE_END | 158 | MACHINE_END |
diff --git a/arch/arm/mach-s3c64xx/mach-smartq7.c b/arch/arm/mach-s3c64xx/mach-smartq7.c index e5c09b6db967..aa9072a4cbef 100644 --- a/arch/arm/mach-s3c64xx/mach-smartq7.c +++ b/arch/arm/mach-s3c64xx/mach-smartq7.c | |||
@@ -168,6 +168,7 @@ MACHINE_START(SMARTQ7, "SmartQ 7") | |||
168 | .handle_irq = vic_handle_irq, | 168 | .handle_irq = vic_handle_irq, |
169 | .map_io = smartq_map_io, | 169 | .map_io = smartq_map_io, |
170 | .init_machine = smartq7_machine_init, | 170 | .init_machine = smartq7_machine_init, |
171 | .init_late = s3c64xx_init_late, | ||
171 | .timer = &s3c24xx_timer, | 172 | .timer = &s3c24xx_timer, |
172 | .restart = s3c64xx_restart, | 173 | .restart = s3c64xx_restart, |
173 | MACHINE_END | 174 | MACHINE_END |
diff --git a/arch/arm/mach-s3c64xx/mach-smdk6400.c b/arch/arm/mach-s3c64xx/mach-smdk6400.c index 5f096534f4c4..b0f4525c66bd 100644 --- a/arch/arm/mach-s3c64xx/mach-smdk6400.c +++ b/arch/arm/mach-s3c64xx/mach-smdk6400.c | |||
@@ -93,6 +93,7 @@ MACHINE_START(SMDK6400, "SMDK6400") | |||
93 | .handle_irq = vic_handle_irq, | 93 | .handle_irq = vic_handle_irq, |
94 | .map_io = smdk6400_map_io, | 94 | .map_io = smdk6400_map_io, |
95 | .init_machine = smdk6400_machine_init, | 95 | .init_machine = smdk6400_machine_init, |
96 | .init_late = s3c64xx_init_late, | ||
96 | .timer = &s3c24xx_timer, | 97 | .timer = &s3c24xx_timer, |
97 | .restart = s3c64xx_restart, | 98 | .restart = s3c64xx_restart, |
98 | MACHINE_END | 99 | MACHINE_END |
diff --git a/arch/arm/mach-s3c64xx/mach-smdk6410.c b/arch/arm/mach-s3c64xx/mach-smdk6410.c index 7da044f738ac..d44319b09412 100644 --- a/arch/arm/mach-s3c64xx/mach-smdk6410.c +++ b/arch/arm/mach-s3c64xx/mach-smdk6410.c | |||
@@ -702,6 +702,7 @@ MACHINE_START(SMDK6410, "SMDK6410") | |||
702 | .handle_irq = vic_handle_irq, | 702 | .handle_irq = vic_handle_irq, |
703 | .map_io = smdk6410_map_io, | 703 | .map_io = smdk6410_map_io, |
704 | .init_machine = smdk6410_machine_init, | 704 | .init_machine = smdk6410_machine_init, |
705 | .init_late = s3c64xx_init_late, | ||
705 | .timer = &s3c24xx_timer, | 706 | .timer = &s3c24xx_timer, |
706 | .restart = s3c64xx_restart, | 707 | .restart = s3c64xx_restart, |
707 | MACHINE_END | 708 | MACHINE_END |
diff --git a/arch/arm/mach-s3c64xx/pm.c b/arch/arm/mach-s3c64xx/pm.c index 7d3e81b9dd06..7feb426fc202 100644 --- a/arch/arm/mach-s3c64xx/pm.c +++ b/arch/arm/mach-s3c64xx/pm.c | |||
@@ -365,10 +365,9 @@ static __init int s3c64xx_pm_initcall(void) | |||
365 | } | 365 | } |
366 | arch_initcall(s3c64xx_pm_initcall); | 366 | arch_initcall(s3c64xx_pm_initcall); |
367 | 367 | ||
368 | static __init int s3c64xx_pm_late_initcall(void) | 368 | int __init s3c64xx_pm_late_initcall(void) |
369 | { | 369 | { |
370 | pm_genpd_poweroff_unused(); | 370 | pm_genpd_poweroff_unused(); |
371 | 371 | ||
372 | return 0; | 372 | return 0; |
373 | } | 373 | } |
374 | late_initcall(s3c64xx_pm_late_initcall); | ||
diff --git a/arch/arm/mach-sa1100/assabet.c b/arch/arm/mach-sa1100/assabet.c index 375d3f779a88..d1dc7f1a239c 100644 --- a/arch/arm/mach-sa1100/assabet.c +++ b/arch/arm/mach-sa1100/assabet.c | |||
@@ -538,6 +538,7 @@ MACHINE_START(ASSABET, "Intel-Assabet") | |||
538 | .init_irq = sa1100_init_irq, | 538 | .init_irq = sa1100_init_irq, |
539 | .timer = &sa1100_timer, | 539 | .timer = &sa1100_timer, |
540 | .init_machine = assabet_init, | 540 | .init_machine = assabet_init, |
541 | .init_late = sa11x0_init_late, | ||
541 | #ifdef CONFIG_SA1111 | 542 | #ifdef CONFIG_SA1111 |
542 | .dma_zone_size = SZ_1M, | 543 | .dma_zone_size = SZ_1M, |
543 | #endif | 544 | #endif |
diff --git a/arch/arm/mach-sa1100/badge4.c b/arch/arm/mach-sa1100/badge4.c index e0f0c030258c..b30fb99b587c 100644 --- a/arch/arm/mach-sa1100/badge4.c +++ b/arch/arm/mach-sa1100/badge4.c | |||
@@ -305,6 +305,7 @@ MACHINE_START(BADGE4, "Hewlett-Packard Laboratories BadgePAD 4") | |||
305 | .map_io = badge4_map_io, | 305 | .map_io = badge4_map_io, |
306 | .nr_irqs = SA1100_NR_IRQS, | 306 | .nr_irqs = SA1100_NR_IRQS, |
307 | .init_irq = sa1100_init_irq, | 307 | .init_irq = sa1100_init_irq, |
308 | .init_late = sa11x0_init_late, | ||
308 | .timer = &sa1100_timer, | 309 | .timer = &sa1100_timer, |
309 | #ifdef CONFIG_SA1111 | 310 | #ifdef CONFIG_SA1111 |
310 | .dma_zone_size = SZ_1M, | 311 | .dma_zone_size = SZ_1M, |
diff --git a/arch/arm/mach-sa1100/cerf.c b/arch/arm/mach-sa1100/cerf.c index 4a61f60e0502..09d7f4b4b354 100644 --- a/arch/arm/mach-sa1100/cerf.c +++ b/arch/arm/mach-sa1100/cerf.c | |||
@@ -134,5 +134,6 @@ MACHINE_START(CERF, "Intrinsyc CerfBoard/CerfCube") | |||
134 | .init_irq = cerf_init_irq, | 134 | .init_irq = cerf_init_irq, |
135 | .timer = &sa1100_timer, | 135 | .timer = &sa1100_timer, |
136 | .init_machine = cerf_init, | 136 | .init_machine = cerf_init, |
137 | .init_late = sa11x0_init_late, | ||
137 | .restart = sa11x0_restart, | 138 | .restart = sa11x0_restart, |
138 | MACHINE_END | 139 | MACHINE_END |
diff --git a/arch/arm/mach-sa1100/collie.c b/arch/arm/mach-sa1100/collie.c index c7f418b0cde9..ea5cff38745c 100644 --- a/arch/arm/mach-sa1100/collie.c +++ b/arch/arm/mach-sa1100/collie.c | |||
@@ -401,5 +401,6 @@ MACHINE_START(COLLIE, "Sharp-Collie") | |||
401 | .init_irq = sa1100_init_irq, | 401 | .init_irq = sa1100_init_irq, |
402 | .timer = &sa1100_timer, | 402 | .timer = &sa1100_timer, |
403 | .init_machine = collie_init, | 403 | .init_machine = collie_init, |
404 | .init_late = sa11x0_init_late, | ||
404 | .restart = sa11x0_restart, | 405 | .restart = sa11x0_restart, |
405 | MACHINE_END | 406 | MACHINE_END |
diff --git a/arch/arm/mach-sa1100/generic.c b/arch/arm/mach-sa1100/generic.c index 16be4c56abe3..9db3e98e8b85 100644 --- a/arch/arm/mach-sa1100/generic.c +++ b/arch/arm/mach-sa1100/generic.c | |||
@@ -359,6 +359,10 @@ static int __init sa1100_init(void) | |||
359 | 359 | ||
360 | arch_initcall(sa1100_init); | 360 | arch_initcall(sa1100_init); |
361 | 361 | ||
362 | void __init sa11x0_init_late(void) | ||
363 | { | ||
364 | sa11x0_pm_init(); | ||
365 | } | ||
362 | 366 | ||
363 | /* | 367 | /* |
364 | * Common I/O mapping: | 368 | * Common I/O mapping: |
diff --git a/arch/arm/mach-sa1100/generic.h b/arch/arm/mach-sa1100/generic.h index 9eb3b3cd5a63..a5b7c13da3e3 100644 --- a/arch/arm/mach-sa1100/generic.h +++ b/arch/arm/mach-sa1100/generic.h | |||
@@ -11,6 +11,7 @@ extern void __init sa1100_map_io(void); | |||
11 | extern void __init sa1100_init_irq(void); | 11 | extern void __init sa1100_init_irq(void); |
12 | extern void __init sa1100_init_gpio(void); | 12 | extern void __init sa1100_init_gpio(void); |
13 | extern void sa11x0_restart(char, const char *); | 13 | extern void sa11x0_restart(char, const char *); |
14 | extern void sa11x0_init_late(void); | ||
14 | 15 | ||
15 | #define SET_BANK(__nr,__start,__size) \ | 16 | #define SET_BANK(__nr,__start,__size) \ |
16 | mi->bank[__nr].start = (__start), \ | 17 | mi->bank[__nr].start = (__start), \ |
@@ -41,3 +42,9 @@ void sa11x0_register_mcp(struct mcp_plat_data *data); | |||
41 | 42 | ||
42 | struct sa1100fb_mach_info; | 43 | struct sa1100fb_mach_info; |
43 | void sa11x0_register_lcd(struct sa1100fb_mach_info *inf); | 44 | void sa11x0_register_lcd(struct sa1100fb_mach_info *inf); |
45 | |||
46 | #ifdef CONFIG_PM | ||
47 | int sa11x0_pm_init(void); | ||
48 | #else | ||
49 | static inline int sa11x0_pm_init(void) { return 0; } | ||
50 | #endif | ||
diff --git a/arch/arm/mach-sa1100/h3100.c b/arch/arm/mach-sa1100/h3100.c index b2e8d0f418e0..e1571eab08ae 100644 --- a/arch/arm/mach-sa1100/h3100.c +++ b/arch/arm/mach-sa1100/h3100.c | |||
@@ -110,6 +110,7 @@ MACHINE_START(H3100, "Compaq iPAQ H3100") | |||
110 | .init_irq = sa1100_init_irq, | 110 | .init_irq = sa1100_init_irq, |
111 | .timer = &sa1100_timer, | 111 | .timer = &sa1100_timer, |
112 | .init_machine = h3100_mach_init, | 112 | .init_machine = h3100_mach_init, |
113 | .init_late = sa11x0_init_late, | ||
113 | .restart = sa11x0_restart, | 114 | .restart = sa11x0_restart, |
114 | MACHINE_END | 115 | MACHINE_END |
115 | 116 | ||
diff --git a/arch/arm/mach-sa1100/h3600.c b/arch/arm/mach-sa1100/h3600.c index cb6659f294fe..ba7a2901ab88 100644 --- a/arch/arm/mach-sa1100/h3600.c +++ b/arch/arm/mach-sa1100/h3600.c | |||
@@ -160,6 +160,7 @@ MACHINE_START(H3600, "Compaq iPAQ H3600") | |||
160 | .init_irq = sa1100_init_irq, | 160 | .init_irq = sa1100_init_irq, |
161 | .timer = &sa1100_timer, | 161 | .timer = &sa1100_timer, |
162 | .init_machine = h3600_mach_init, | 162 | .init_machine = h3600_mach_init, |
163 | .init_late = sa11x0_init_late, | ||
163 | .restart = sa11x0_restart, | 164 | .restart = sa11x0_restart, |
164 | MACHINE_END | 165 | MACHINE_END |
165 | 166 | ||
diff --git a/arch/arm/mach-sa1100/hackkit.c b/arch/arm/mach-sa1100/hackkit.c index 5535475bf583..7f86bd911826 100644 --- a/arch/arm/mach-sa1100/hackkit.c +++ b/arch/arm/mach-sa1100/hackkit.c | |||
@@ -199,5 +199,6 @@ MACHINE_START(HACKKIT, "HackKit Cpu Board") | |||
199 | .init_irq = sa1100_init_irq, | 199 | .init_irq = sa1100_init_irq, |
200 | .timer = &sa1100_timer, | 200 | .timer = &sa1100_timer, |
201 | .init_machine = hackkit_init, | 201 | .init_machine = hackkit_init, |
202 | .init_late = sa11x0_init_late, | ||
202 | .restart = sa11x0_restart, | 203 | .restart = sa11x0_restart, |
203 | MACHINE_END | 204 | MACHINE_END |
diff --git a/arch/arm/mach-sa1100/jornada720.c b/arch/arm/mach-sa1100/jornada720.c index ca7a7e834720..e3084f47027d 100644 --- a/arch/arm/mach-sa1100/jornada720.c +++ b/arch/arm/mach-sa1100/jornada720.c | |||
@@ -348,6 +348,7 @@ MACHINE_START(JORNADA720, "HP Jornada 720") | |||
348 | .init_irq = sa1100_init_irq, | 348 | .init_irq = sa1100_init_irq, |
349 | .timer = &sa1100_timer, | 349 | .timer = &sa1100_timer, |
350 | .init_machine = jornada720_mach_init, | 350 | .init_machine = jornada720_mach_init, |
351 | .init_late = sa11x0_init_late, | ||
351 | #ifdef CONFIG_SA1111 | 352 | #ifdef CONFIG_SA1111 |
352 | .dma_zone_size = SZ_1M, | 353 | .dma_zone_size = SZ_1M, |
353 | #endif | 354 | #endif |
diff --git a/arch/arm/mach-sa1100/lart.c b/arch/arm/mach-sa1100/lart.c index eb6534e0b0d0..b775a0abec0a 100644 --- a/arch/arm/mach-sa1100/lart.c +++ b/arch/arm/mach-sa1100/lart.c | |||
@@ -147,6 +147,7 @@ MACHINE_START(LART, "LART") | |||
147 | .nr_irqs = SA1100_NR_IRQS, | 147 | .nr_irqs = SA1100_NR_IRQS, |
148 | .init_irq = sa1100_init_irq, | 148 | .init_irq = sa1100_init_irq, |
149 | .init_machine = lart_init, | 149 | .init_machine = lart_init, |
150 | .init_late = sa11x0_init_late, | ||
150 | .timer = &sa1100_timer, | 151 | .timer = &sa1100_timer, |
151 | .restart = sa11x0_restart, | 152 | .restart = sa11x0_restart, |
152 | MACHINE_END | 153 | MACHINE_END |
diff --git a/arch/arm/mach-sa1100/nanoengine.c b/arch/arm/mach-sa1100/nanoengine.c index 8f6446b9f025..41f69d97066f 100644 --- a/arch/arm/mach-sa1100/nanoengine.c +++ b/arch/arm/mach-sa1100/nanoengine.c | |||
@@ -112,5 +112,6 @@ MACHINE_START(NANOENGINE, "BSE nanoEngine") | |||
112 | .init_irq = sa1100_init_irq, | 112 | .init_irq = sa1100_init_irq, |
113 | .timer = &sa1100_timer, | 113 | .timer = &sa1100_timer, |
114 | .init_machine = nanoengine_init, | 114 | .init_machine = nanoengine_init, |
115 | .init_late = sa11x0_init_late, | ||
115 | .restart = sa11x0_restart, | 116 | .restart = sa11x0_restart, |
116 | MACHINE_END | 117 | MACHINE_END |
diff --git a/arch/arm/mach-sa1100/neponset.c b/arch/arm/mach-sa1100/neponset.c index 6c58f01b358a..266db873a4e4 100644 --- a/arch/arm/mach-sa1100/neponset.c +++ b/arch/arm/mach-sa1100/neponset.c | |||
@@ -89,6 +89,7 @@ void neponset_ncr_frob(unsigned int mask, unsigned int val) | |||
89 | WARN(1, "nep_base unset\n"); | 89 | WARN(1, "nep_base unset\n"); |
90 | } | 90 | } |
91 | } | 91 | } |
92 | EXPORT_SYMBOL(neponset_ncr_frob); | ||
92 | 93 | ||
93 | static void neponset_set_mctrl(struct uart_port *port, u_int mctrl) | 94 | static void neponset_set_mctrl(struct uart_port *port, u_int mctrl) |
94 | { | 95 | { |
diff --git a/arch/arm/mach-sa1100/pleb.c b/arch/arm/mach-sa1100/pleb.c index 1602575a0d5c..37fe0a0a5369 100644 --- a/arch/arm/mach-sa1100/pleb.c +++ b/arch/arm/mach-sa1100/pleb.c | |||
@@ -135,5 +135,6 @@ MACHINE_START(PLEB, "PLEB") | |||
135 | .init_irq = sa1100_init_irq, | 135 | .init_irq = sa1100_init_irq, |
136 | .timer = &sa1100_timer, | 136 | .timer = &sa1100_timer, |
137 | .init_machine = pleb_init, | 137 | .init_machine = pleb_init, |
138 | .init_late = sa11x0_init_late, | ||
138 | .restart = sa11x0_restart, | 139 | .restart = sa11x0_restart, |
139 | MACHINE_END | 140 | MACHINE_END |
diff --git a/arch/arm/mach-sa1100/pm.c b/arch/arm/mach-sa1100/pm.c index 2fa499ec6afe..690cf0ce5c0c 100644 --- a/arch/arm/mach-sa1100/pm.c +++ b/arch/arm/mach-sa1100/pm.c | |||
@@ -117,10 +117,8 @@ static const struct platform_suspend_ops sa11x0_pm_ops = { | |||
117 | .valid = suspend_valid_only_mem, | 117 | .valid = suspend_valid_only_mem, |
118 | }; | 118 | }; |
119 | 119 | ||
120 | static int __init sa11x0_pm_init(void) | 120 | int __init sa11x0_pm_init(void) |
121 | { | 121 | { |
122 | suspend_set_ops(&sa11x0_pm_ops); | 122 | suspend_set_ops(&sa11x0_pm_ops); |
123 | return 0; | 123 | return 0; |
124 | } | 124 | } |
125 | |||
126 | late_initcall(sa11x0_pm_init); | ||
diff --git a/arch/arm/mach-sa1100/shannon.c b/arch/arm/mach-sa1100/shannon.c index ca8bf59b9047..5d33fc3108ef 100644 --- a/arch/arm/mach-sa1100/shannon.c +++ b/arch/arm/mach-sa1100/shannon.c | |||
@@ -104,5 +104,6 @@ MACHINE_START(SHANNON, "Shannon (AKA: Tuxscreen)") | |||
104 | .init_irq = sa1100_init_irq, | 104 | .init_irq = sa1100_init_irq, |
105 | .timer = &sa1100_timer, | 105 | .timer = &sa1100_timer, |
106 | .init_machine = shannon_init, | 106 | .init_machine = shannon_init, |
107 | .init_late = sa11x0_init_late, | ||
107 | .restart = sa11x0_restart, | 108 | .restart = sa11x0_restart, |
108 | MACHINE_END | 109 | MACHINE_END |
diff --git a/arch/arm/mach-sa1100/simpad.c b/arch/arm/mach-sa1100/simpad.c index 3efae03cb3d7..fbd53593be54 100644 --- a/arch/arm/mach-sa1100/simpad.c +++ b/arch/arm/mach-sa1100/simpad.c | |||
@@ -395,6 +395,7 @@ MACHINE_START(SIMPAD, "Simpad") | |||
395 | .map_io = simpad_map_io, | 395 | .map_io = simpad_map_io, |
396 | .nr_irqs = SA1100_NR_IRQS, | 396 | .nr_irqs = SA1100_NR_IRQS, |
397 | .init_irq = sa1100_init_irq, | 397 | .init_irq = sa1100_init_irq, |
398 | .init_late = sa11x0_init_late, | ||
398 | .timer = &sa1100_timer, | 399 | .timer = &sa1100_timer, |
399 | .restart = sa11x0_restart, | 400 | .restart = sa11x0_restart, |
400 | MACHINE_END | 401 | MACHINE_END |
diff --git a/arch/arm/mach-shmobile/Makefile b/arch/arm/mach-shmobile/Makefile index e6b177bc9410..8aa1962c22a2 100644 --- a/arch/arm/mach-shmobile/Makefile +++ b/arch/arm/mach-shmobile/Makefile | |||
@@ -3,7 +3,7 @@ | |||
3 | # | 3 | # |
4 | 4 | ||
5 | # Common objects | 5 | # Common objects |
6 | obj-y := timer.o console.o clock.o | 6 | obj-y := timer.o console.o clock.o common.o |
7 | 7 | ||
8 | # CPU objects | 8 | # CPU objects |
9 | obj-$(CONFIG_ARCH_SH7367) += setup-sh7367.o clock-sh7367.o intc-sh7367.o | 9 | obj-$(CONFIG_ARCH_SH7367) += setup-sh7367.o clock-sh7367.o intc-sh7367.o |
diff --git a/arch/arm/mach-shmobile/board-ag5evm.c b/arch/arm/mach-shmobile/board-ag5evm.c index 0891ec6e27f5..5a6f22f05e99 100644 --- a/arch/arm/mach-shmobile/board-ag5evm.c +++ b/arch/arm/mach-shmobile/board-ag5evm.c | |||
@@ -580,5 +580,6 @@ MACHINE_START(AG5EVM, "ag5evm") | |||
580 | .init_irq = sh73a0_init_irq, | 580 | .init_irq = sh73a0_init_irq, |
581 | .handle_irq = gic_handle_irq, | 581 | .handle_irq = gic_handle_irq, |
582 | .init_machine = ag5evm_init, | 582 | .init_machine = ag5evm_init, |
583 | .init_late = shmobile_init_late, | ||
583 | .timer = &shmobile_timer, | 584 | .timer = &shmobile_timer, |
584 | MACHINE_END | 585 | MACHINE_END |
diff --git a/arch/arm/mach-shmobile/board-ap4evb.c b/arch/arm/mach-shmobile/board-ap4evb.c index b540b8eb20ca..ace60246a5df 100644 --- a/arch/arm/mach-shmobile/board-ap4evb.c +++ b/arch/arm/mach-shmobile/board-ap4evb.c | |||
@@ -1469,5 +1469,6 @@ MACHINE_START(AP4EVB, "ap4evb") | |||
1469 | .init_irq = sh7372_init_irq, | 1469 | .init_irq = sh7372_init_irq, |
1470 | .handle_irq = shmobile_handle_irq_intc, | 1470 | .handle_irq = shmobile_handle_irq_intc, |
1471 | .init_machine = ap4evb_init, | 1471 | .init_machine = ap4evb_init, |
1472 | .init_late = shmobile_init_late, | ||
1472 | .timer = &shmobile_timer, | 1473 | .timer = &shmobile_timer, |
1473 | MACHINE_END | 1474 | MACHINE_END |
diff --git a/arch/arm/mach-shmobile/board-bonito.c b/arch/arm/mach-shmobile/board-bonito.c index 63ab7062bee3..e9b32cfbf741 100644 --- a/arch/arm/mach-shmobile/board-bonito.c +++ b/arch/arm/mach-shmobile/board-bonito.c | |||
@@ -500,5 +500,6 @@ MACHINE_START(BONITO, "bonito") | |||
500 | .init_irq = r8a7740_init_irq, | 500 | .init_irq = r8a7740_init_irq, |
501 | .handle_irq = shmobile_handle_irq_intc, | 501 | .handle_irq = shmobile_handle_irq_intc, |
502 | .init_machine = bonito_init, | 502 | .init_machine = bonito_init, |
503 | .init_late = shmobile_init_late, | ||
503 | .timer = &shmobile_timer, | 504 | .timer = &shmobile_timer, |
504 | MACHINE_END | 505 | MACHINE_END |
diff --git a/arch/arm/mach-shmobile/board-g3evm.c b/arch/arm/mach-shmobile/board-g3evm.c index 39b6cf85ced6..796fa00ad3c4 100644 --- a/arch/arm/mach-shmobile/board-g3evm.c +++ b/arch/arm/mach-shmobile/board-g3evm.c | |||
@@ -338,5 +338,6 @@ MACHINE_START(G3EVM, "g3evm") | |||
338 | .init_irq = sh7367_init_irq, | 338 | .init_irq = sh7367_init_irq, |
339 | .handle_irq = shmobile_handle_irq_intc, | 339 | .handle_irq = shmobile_handle_irq_intc, |
340 | .init_machine = g3evm_init, | 340 | .init_machine = g3evm_init, |
341 | .init_late = shmobile_init_late, | ||
341 | .timer = &shmobile_timer, | 342 | .timer = &shmobile_timer, |
342 | MACHINE_END | 343 | MACHINE_END |
diff --git a/arch/arm/mach-shmobile/board-g4evm.c b/arch/arm/mach-shmobile/board-g4evm.c index 0e5a39c670bc..f1257321999a 100644 --- a/arch/arm/mach-shmobile/board-g4evm.c +++ b/arch/arm/mach-shmobile/board-g4evm.c | |||
@@ -381,5 +381,6 @@ MACHINE_START(G4EVM, "g4evm") | |||
381 | .init_irq = sh7377_init_irq, | 381 | .init_irq = sh7377_init_irq, |
382 | .handle_irq = shmobile_handle_irq_intc, | 382 | .handle_irq = shmobile_handle_irq_intc, |
383 | .init_machine = g4evm_init, | 383 | .init_machine = g4evm_init, |
384 | .init_late = shmobile_init_late, | ||
384 | .timer = &shmobile_timer, | 385 | .timer = &shmobile_timer, |
385 | MACHINE_END | 386 | MACHINE_END |
diff --git a/arch/arm/mach-shmobile/board-kota2.c b/arch/arm/mach-shmobile/board-kota2.c index 200dcd42a3a0..f60f1b281cc4 100644 --- a/arch/arm/mach-shmobile/board-kota2.c +++ b/arch/arm/mach-shmobile/board-kota2.c | |||
@@ -521,5 +521,6 @@ MACHINE_START(KOTA2, "kota2") | |||
521 | .init_irq = sh73a0_init_irq, | 521 | .init_irq = sh73a0_init_irq, |
522 | .handle_irq = gic_handle_irq, | 522 | .handle_irq = gic_handle_irq, |
523 | .init_machine = kota2_init, | 523 | .init_machine = kota2_init, |
524 | .init_late = shmobile_init_late, | ||
524 | .timer = &shmobile_timer, | 525 | .timer = &shmobile_timer, |
525 | MACHINE_END | 526 | MACHINE_END |
diff --git a/arch/arm/mach-shmobile/board-mackerel.c b/arch/arm/mach-shmobile/board-mackerel.c index 50c67b22d087..b577f7c44678 100644 --- a/arch/arm/mach-shmobile/board-mackerel.c +++ b/arch/arm/mach-shmobile/board-mackerel.c | |||
@@ -1638,5 +1638,6 @@ MACHINE_START(MACKEREL, "mackerel") | |||
1638 | .init_irq = sh7372_init_irq, | 1638 | .init_irq = sh7372_init_irq, |
1639 | .handle_irq = shmobile_handle_irq_intc, | 1639 | .handle_irq = shmobile_handle_irq_intc, |
1640 | .init_machine = mackerel_init, | 1640 | .init_machine = mackerel_init, |
1641 | .init_late = shmobile_init_late, | ||
1641 | .timer = &shmobile_timer, | 1642 | .timer = &shmobile_timer, |
1642 | MACHINE_END | 1643 | MACHINE_END |
diff --git a/arch/arm/mach-shmobile/board-marzen.c b/arch/arm/mach-shmobile/board-marzen.c index ef0e13bf0b3a..14de3787cafc 100644 --- a/arch/arm/mach-shmobile/board-marzen.c +++ b/arch/arm/mach-shmobile/board-marzen.c | |||
@@ -98,5 +98,6 @@ MACHINE_START(MARZEN, "marzen") | |||
98 | .init_irq = r8a7779_init_irq, | 98 | .init_irq = r8a7779_init_irq, |
99 | .handle_irq = gic_handle_irq, | 99 | .handle_irq = gic_handle_irq, |
100 | .init_machine = marzen_init, | 100 | .init_machine = marzen_init, |
101 | .init_late = shmobile_init_late, | ||
101 | .timer = &shmobile_timer, | 102 | .timer = &shmobile_timer, |
102 | MACHINE_END | 103 | MACHINE_END |
diff --git a/arch/arm/mach-shmobile/common.c b/arch/arm/mach-shmobile/common.c new file mode 100644 index 000000000000..608aba9d60d7 --- /dev/null +++ b/arch/arm/mach-shmobile/common.c | |||
@@ -0,0 +1,24 @@ | |||
1 | /* | ||
2 | * This program is free software; you can redistribute it and/or modify | ||
3 | * it under the terms of the GNU General Public License as published by | ||
4 | * the Free Software Foundation; version 2 of the License. | ||
5 | * | ||
6 | * This program is distributed in the hope that it will be useful, | ||
7 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
8 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
9 | * GNU General Public License for more details. | ||
10 | * | ||
11 | * You should have received a copy of the GNU General Public License | ||
12 | * along with this program; if not, write to the Free Software | ||
13 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
14 | * | ||
15 | */ | ||
16 | #include <linux/kernel.h> | ||
17 | #include <linux/init.h> | ||
18 | #include <mach/common.h> | ||
19 | |||
20 | void __init shmobile_init_late(void) | ||
21 | { | ||
22 | shmobile_suspend_init(); | ||
23 | shmobile_cpuidle_init(); | ||
24 | } | ||
diff --git a/arch/arm/mach-shmobile/cpuidle.c b/arch/arm/mach-shmobile/cpuidle.c index 7e6559105d40..7b541e911ab4 100644 --- a/arch/arm/mach-shmobile/cpuidle.c +++ b/arch/arm/mach-shmobile/cpuidle.c | |||
@@ -46,7 +46,7 @@ static struct cpuidle_driver shmobile_cpuidle_driver = { | |||
46 | 46 | ||
47 | void (*shmobile_cpuidle_setup)(struct cpuidle_driver *drv); | 47 | void (*shmobile_cpuidle_setup)(struct cpuidle_driver *drv); |
48 | 48 | ||
49 | static int shmobile_cpuidle_init(void) | 49 | int shmobile_cpuidle_init(void) |
50 | { | 50 | { |
51 | struct cpuidle_device *dev = &shmobile_cpuidle_dev; | 51 | struct cpuidle_device *dev = &shmobile_cpuidle_dev; |
52 | struct cpuidle_driver *drv = &shmobile_cpuidle_driver; | 52 | struct cpuidle_driver *drv = &shmobile_cpuidle_driver; |
@@ -65,4 +65,3 @@ static int shmobile_cpuidle_init(void) | |||
65 | 65 | ||
66 | return 0; | 66 | return 0; |
67 | } | 67 | } |
68 | late_initcall(shmobile_cpuidle_init); | ||
diff --git a/arch/arm/mach-shmobile/include/mach/common.h b/arch/arm/mach-shmobile/include/mach/common.h index ff5f12fd742f..01e2bc014f15 100644 --- a/arch/arm/mach-shmobile/include/mach/common.h +++ b/arch/arm/mach-shmobile/include/mach/common.h | |||
@@ -85,4 +85,18 @@ extern int r8a7779_boot_secondary(unsigned int cpu); | |||
85 | extern void r8a7779_smp_prepare_cpus(void); | 85 | extern void r8a7779_smp_prepare_cpus(void); |
86 | extern void r8a7779_register_twd(void); | 86 | extern void r8a7779_register_twd(void); |
87 | 87 | ||
88 | extern void shmobile_init_late(void); | ||
89 | |||
90 | #ifdef CONFIG_SUSPEND | ||
91 | int shmobile_suspend_init(void); | ||
92 | #else | ||
93 | static inline int shmobile_suspend_init(void) { return 0; } | ||
94 | #endif | ||
95 | |||
96 | #ifdef CONFIG_CPU_IDLE | ||
97 | int shmobile_cpuidle_init(void); | ||
98 | #else | ||
99 | static inline int shmobile_cpuidle_init(void) { return 0; } | ||
100 | #endif | ||
101 | |||
88 | #endif /* __ARCH_MACH_COMMON_H */ | 102 | #endif /* __ARCH_MACH_COMMON_H */ |
diff --git a/arch/arm/mach-shmobile/suspend.c b/arch/arm/mach-shmobile/suspend.c index 4d1b86a49923..47d83f7a70b6 100644 --- a/arch/arm/mach-shmobile/suspend.c +++ b/arch/arm/mach-shmobile/suspend.c | |||
@@ -39,9 +39,8 @@ struct platform_suspend_ops shmobile_suspend_ops = { | |||
39 | .valid = suspend_valid_only_mem, | 39 | .valid = suspend_valid_only_mem, |
40 | }; | 40 | }; |
41 | 41 | ||
42 | static int __init shmobile_suspend_init(void) | 42 | int __init shmobile_suspend_init(void) |
43 | { | 43 | { |
44 | suspend_set_ops(&shmobile_suspend_ops); | 44 | suspend_set_ops(&shmobile_suspend_ops); |
45 | return 0; | 45 | return 0; |
46 | } | 46 | } |
47 | late_initcall(shmobile_suspend_init); | ||
diff --git a/arch/arm/mach-spear13xx/Kconfig b/arch/arm/mach-spear13xx/Kconfig new file mode 100644 index 000000000000..eaadc66d96b3 --- /dev/null +++ b/arch/arm/mach-spear13xx/Kconfig | |||
@@ -0,0 +1,20 @@ | |||
1 | # | ||
2 | # SPEAr13XX Machine configuration file | ||
3 | # | ||
4 | |||
5 | if ARCH_SPEAR13XX | ||
6 | |||
7 | menu "SPEAr13xx Implementations" | ||
8 | config MACH_SPEAR1310 | ||
9 | bool "SPEAr1310 Machine support with Device Tree" | ||
10 | select PINCTRL_SPEAR1310 | ||
11 | help | ||
12 | Supports ST SPEAr1310 machine configured via the device-tree | ||
13 | |||
14 | config MACH_SPEAR1340 | ||
15 | bool "SPEAr1340 Machine support with Device Tree" | ||
16 | select PINCTRL_SPEAR1340 | ||
17 | help | ||
18 | Supports ST SPEAr1340 machine configured via the device-tree | ||
19 | endmenu | ||
20 | endif #ARCH_SPEAR13XX | ||
diff --git a/arch/arm/mach-spear13xx/Makefile b/arch/arm/mach-spear13xx/Makefile new file mode 100644 index 000000000000..3435ea78c15d --- /dev/null +++ b/arch/arm/mach-spear13xx/Makefile | |||
@@ -0,0 +1,10 @@ | |||
1 | # | ||
2 | # Makefile for SPEAr13XX machine series | ||
3 | # | ||
4 | |||
5 | obj-$(CONFIG_SMP) += headsmp.o platsmp.o | ||
6 | obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o | ||
7 | |||
8 | obj-$(CONFIG_ARCH_SPEAR13XX) += spear13xx.o | ||
9 | obj-$(CONFIG_MACH_SPEAR1310) += spear1310.o | ||
10 | obj-$(CONFIG_MACH_SPEAR1340) += spear1340.o | ||
diff --git a/arch/arm/mach-spear13xx/Makefile.boot b/arch/arm/mach-spear13xx/Makefile.boot new file mode 100644 index 000000000000..403efd7e6d27 --- /dev/null +++ b/arch/arm/mach-spear13xx/Makefile.boot | |||
@@ -0,0 +1,6 @@ | |||
1 | zreladdr-y += 0x00008000 | ||
2 | params_phys-y := 0x00000100 | ||
3 | initrd_phys-y := 0x00800000 | ||
4 | |||
5 | dtb-$(CONFIG_MACH_SPEAR1310) += spear1310-evb.dtb | ||
6 | dtb-$(CONFIG_MACH_SPEAR1340) += spear1340-evb.dtb | ||
diff --git a/arch/arm/mach-spear13xx/headsmp.S b/arch/arm/mach-spear13xx/headsmp.S new file mode 100644 index 000000000000..ed85473a047f --- /dev/null +++ b/arch/arm/mach-spear13xx/headsmp.S | |||
@@ -0,0 +1,47 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-spear13XX/headsmp.S | ||
3 | * | ||
4 | * Picked from realview | ||
5 | * Copyright (c) 2012 ST Microelectronics Limited | ||
6 | * Shiraz Hashim <shiraz.hashim@st.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 | |||
13 | #include <linux/linkage.h> | ||
14 | #include <linux/init.h> | ||
15 | |||
16 | __INIT | ||
17 | |||
18 | /* | ||
19 | * spear13xx specific entry point for secondary CPUs. This provides | ||
20 | * a "holding pen" into which all secondary cores are held until we're | ||
21 | * ready for them to initialise. | ||
22 | */ | ||
23 | ENTRY(spear13xx_secondary_startup) | ||
24 | mrc p15, 0, r0, c0, c0, 5 | ||
25 | and r0, r0, #15 | ||
26 | adr r4, 1f | ||
27 | ldmia r4, {r5, r6} | ||
28 | sub r4, r4, r5 | ||
29 | add r6, r6, r4 | ||
30 | pen: ldr r7, [r6] | ||
31 | cmp r7, r0 | ||
32 | bne pen | ||
33 | |||
34 | /* re-enable coherency */ | ||
35 | mrc p15, 0, r0, c1, c0, 1 | ||
36 | orr r0, r0, #(1 << 6) | (1 << 0) | ||
37 | mcr p15, 0, r0, c1, c0, 1 | ||
38 | /* | ||
39 | * we've been released from the holding pen: secondary_stack | ||
40 | * should now contain the SVC stack for this core | ||
41 | */ | ||
42 | b secondary_startup | ||
43 | |||
44 | .align | ||
45 | 1: .long . | ||
46 | .long pen_release | ||
47 | ENDPROC(spear13xx_secondary_startup) | ||
diff --git a/arch/arm/mach-spear13xx/hotplug.c b/arch/arm/mach-spear13xx/hotplug.c new file mode 100644 index 000000000000..5c6867b46d09 --- /dev/null +++ b/arch/arm/mach-spear13xx/hotplug.c | |||
@@ -0,0 +1,119 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mach-spear13xx/hotplug.c | ||
3 | * | ||
4 | * Copyright (C) 2012 ST Microelectronics Ltd. | ||
5 | * Deepak Sikri <deepak.sikri@st.com> | ||
6 | * | ||
7 | * based upon linux/arch/arm/mach-realview/hotplug.c | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License version 2 as | ||
11 | * published by the Free Software Foundation. | ||
12 | */ | ||
13 | #include <linux/kernel.h> | ||
14 | #include <linux/errno.h> | ||
15 | #include <linux/smp.h> | ||
16 | #include <asm/cacheflush.h> | ||
17 | #include <asm/cp15.h> | ||
18 | #include <asm/smp_plat.h> | ||
19 | |||
20 | extern volatile int pen_release; | ||
21 | |||
22 | static inline void cpu_enter_lowpower(void) | ||
23 | { | ||
24 | unsigned int v; | ||
25 | |||
26 | flush_cache_all(); | ||
27 | asm volatile( | ||
28 | " mcr p15, 0, %1, c7, c5, 0\n" | ||
29 | " dsb\n" | ||
30 | /* | ||
31 | * Turn off coherency | ||
32 | */ | ||
33 | " mrc p15, 0, %0, c1, c0, 1\n" | ||
34 | " bic %0, %0, #0x20\n" | ||
35 | " mcr p15, 0, %0, c1, c0, 1\n" | ||
36 | " mrc p15, 0, %0, c1, c0, 0\n" | ||
37 | " bic %0, %0, %2\n" | ||
38 | " mcr p15, 0, %0, c1, c0, 0\n" | ||
39 | : "=&r" (v) | ||
40 | : "r" (0), "Ir" (CR_C) | ||
41 | : "cc", "memory"); | ||
42 | } | ||
43 | |||
44 | static inline void cpu_leave_lowpower(void) | ||
45 | { | ||
46 | unsigned int v; | ||
47 | |||
48 | asm volatile("mrc p15, 0, %0, c1, c0, 0\n" | ||
49 | " orr %0, %0, %1\n" | ||
50 | " mcr p15, 0, %0, c1, c0, 0\n" | ||
51 | " mrc p15, 0, %0, c1, c0, 1\n" | ||
52 | " orr %0, %0, #0x20\n" | ||
53 | " mcr p15, 0, %0, c1, c0, 1\n" | ||
54 | : "=&r" (v) | ||
55 | : "Ir" (CR_C) | ||
56 | : "cc"); | ||
57 | } | ||
58 | |||
59 | static inline void platform_do_lowpower(unsigned int cpu, int *spurious) | ||
60 | { | ||
61 | for (;;) { | ||
62 | wfi(); | ||
63 | |||
64 | if (pen_release == cpu) { | ||
65 | /* | ||
66 | * OK, proper wakeup, we're done | ||
67 | */ | ||
68 | break; | ||
69 | } | ||
70 | |||
71 | /* | ||
72 | * Getting here, means that we have come out of WFI without | ||
73 | * having been woken up - this shouldn't happen | ||
74 | * | ||
75 | * Just note it happening - when we're woken, we can report | ||
76 | * its occurrence. | ||
77 | */ | ||
78 | (*spurious)++; | ||
79 | } | ||
80 | } | ||
81 | |||
82 | int platform_cpu_kill(unsigned int cpu) | ||
83 | { | ||
84 | return 1; | ||
85 | } | ||
86 | |||
87 | /* | ||
88 | * platform-specific code to shutdown a CPU | ||
89 | * | ||
90 | * Called with IRQs disabled | ||
91 | */ | ||
92 | void __cpuinit platform_cpu_die(unsigned int cpu) | ||
93 | { | ||
94 | int spurious = 0; | ||
95 | |||
96 | /* | ||
97 | * we're ready for shutdown now, so do it | ||
98 | */ | ||
99 | cpu_enter_lowpower(); | ||
100 | platform_do_lowpower(cpu, &spurious); | ||
101 | |||
102 | /* | ||
103 | * bring this CPU back into the world of cache | ||
104 | * coherency, and then restore interrupts | ||
105 | */ | ||
106 | cpu_leave_lowpower(); | ||
107 | |||
108 | if (spurious) | ||
109 | pr_warn("CPU%u: %u spurious wakeup calls\n", cpu, spurious); | ||
110 | } | ||
111 | |||
112 | int platform_cpu_disable(unsigned int cpu) | ||
113 | { | ||
114 | /* | ||
115 | * we don't allow CPU 0 to be shutdown (it is still too special | ||
116 | * e.g. clock tick interrupts) | ||
117 | */ | ||
118 | return cpu == 0 ? -EPERM : 0; | ||
119 | } | ||
diff --git a/arch/arm/mach-spear13xx/include/mach/debug-macro.S b/arch/arm/mach-spear13xx/include/mach/debug-macro.S new file mode 100644 index 000000000000..ea1564609bd4 --- /dev/null +++ b/arch/arm/mach-spear13xx/include/mach/debug-macro.S | |||
@@ -0,0 +1,14 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-spear13xx/include/mach/debug-macro.S | ||
3 | * | ||
4 | * Debugging macro include header spear13xx machine family | ||
5 | * | ||
6 | * Copyright (C) 2012 ST Microelectronics | ||
7 | * Viresh Kumar <viresh.kumar@st.com> | ||
8 | * | ||
9 | * This file is licensed under the terms of the GNU General Public | ||
10 | * License version 2. This program is licensed "as is" without any | ||
11 | * warranty of any kind, whether express or implied. | ||
12 | */ | ||
13 | |||
14 | #include <plat/debug-macro.S> | ||
diff --git a/arch/arm/mach-spear13xx/include/mach/dma.h b/arch/arm/mach-spear13xx/include/mach/dma.h new file mode 100644 index 000000000000..383ab04dc6c9 --- /dev/null +++ b/arch/arm/mach-spear13xx/include/mach/dma.h | |||
@@ -0,0 +1,128 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-spear13xx/include/mach/dma.h | ||
3 | * | ||
4 | * DMA information for SPEAr13xx machine family | ||
5 | * | ||
6 | * Copyright (C) 2012 ST Microelectronics | ||
7 | * Viresh Kumar <viresh.kumar@st.com> | ||
8 | * | ||
9 | * This file is licensed under the terms of the GNU General Public | ||
10 | * License version 2. This program is licensed "as is" without any | ||
11 | * warranty of any kind, whether express or implied. | ||
12 | */ | ||
13 | |||
14 | #ifndef __MACH_DMA_H | ||
15 | #define __MACH_DMA_H | ||
16 | |||
17 | /* request id of all the peripherals */ | ||
18 | enum dma_master_info { | ||
19 | /* Accessible from only one master */ | ||
20 | DMA_MASTER_MCIF = 0, | ||
21 | DMA_MASTER_FSMC = 1, | ||
22 | /* Accessible from both 0 & 1 */ | ||
23 | DMA_MASTER_MEMORY = 0, | ||
24 | DMA_MASTER_ADC = 0, | ||
25 | DMA_MASTER_UART0 = 0, | ||
26 | DMA_MASTER_SSP0 = 0, | ||
27 | DMA_MASTER_I2C0 = 0, | ||
28 | |||
29 | #ifdef CONFIG_MACH_SPEAR1310 | ||
30 | /* Accessible from only one master */ | ||
31 | SPEAR1310_DMA_MASTER_JPEG = 1, | ||
32 | |||
33 | /* Accessible from both 0 & 1 */ | ||
34 | SPEAR1310_DMA_MASTER_I2S = 0, | ||
35 | SPEAR1310_DMA_MASTER_UART1 = 0, | ||
36 | SPEAR1310_DMA_MASTER_UART2 = 0, | ||
37 | SPEAR1310_DMA_MASTER_UART3 = 0, | ||
38 | SPEAR1310_DMA_MASTER_UART4 = 0, | ||
39 | SPEAR1310_DMA_MASTER_UART5 = 0, | ||
40 | SPEAR1310_DMA_MASTER_I2C1 = 0, | ||
41 | SPEAR1310_DMA_MASTER_I2C2 = 0, | ||
42 | SPEAR1310_DMA_MASTER_I2C3 = 0, | ||
43 | SPEAR1310_DMA_MASTER_I2C4 = 0, | ||
44 | SPEAR1310_DMA_MASTER_I2C5 = 0, | ||
45 | SPEAR1310_DMA_MASTER_I2C6 = 0, | ||
46 | SPEAR1310_DMA_MASTER_I2C7 = 0, | ||
47 | SPEAR1310_DMA_MASTER_SSP1 = 0, | ||
48 | #endif | ||
49 | |||
50 | #ifdef CONFIG_MACH_SPEAR1340 | ||
51 | /* Accessible from only one master */ | ||
52 | SPEAR1340_DMA_MASTER_I2S_PLAY = 1, | ||
53 | SPEAR1340_DMA_MASTER_I2S_REC = 1, | ||
54 | SPEAR1340_DMA_MASTER_I2C1 = 1, | ||
55 | SPEAR1340_DMA_MASTER_UART1 = 1, | ||
56 | |||
57 | /* following are accessible from both master 0 & 1 */ | ||
58 | SPEAR1340_DMA_MASTER_SPDIF = 0, | ||
59 | SPEAR1340_DMA_MASTER_CAM = 1, | ||
60 | SPEAR1340_DMA_MASTER_VIDEO_IN = 0, | ||
61 | SPEAR1340_DMA_MASTER_MALI = 0, | ||
62 | #endif | ||
63 | }; | ||
64 | |||
65 | enum request_id { | ||
66 | DMA_REQ_ADC = 0, | ||
67 | DMA_REQ_SSP0_TX = 4, | ||
68 | DMA_REQ_SSP0_RX = 5, | ||
69 | DMA_REQ_UART0_TX = 6, | ||
70 | DMA_REQ_UART0_RX = 7, | ||
71 | DMA_REQ_I2C0_TX = 8, | ||
72 | DMA_REQ_I2C0_RX = 9, | ||
73 | |||
74 | #ifdef CONFIG_MACH_SPEAR1310 | ||
75 | SPEAR1310_DMA_REQ_FROM_JPEG = 2, | ||
76 | SPEAR1310_DMA_REQ_TO_JPEG = 3, | ||
77 | SPEAR1310_DMA_REQ_I2S_TX = 10, | ||
78 | SPEAR1310_DMA_REQ_I2S_RX = 11, | ||
79 | |||
80 | SPEAR1310_DMA_REQ_I2C1_RX = 0, | ||
81 | SPEAR1310_DMA_REQ_I2C1_TX = 1, | ||
82 | SPEAR1310_DMA_REQ_I2C2_RX = 2, | ||
83 | SPEAR1310_DMA_REQ_I2C2_TX = 3, | ||
84 | SPEAR1310_DMA_REQ_I2C3_RX = 4, | ||
85 | SPEAR1310_DMA_REQ_I2C3_TX = 5, | ||
86 | SPEAR1310_DMA_REQ_I2C4_RX = 6, | ||
87 | SPEAR1310_DMA_REQ_I2C4_TX = 7, | ||
88 | SPEAR1310_DMA_REQ_I2C5_RX = 8, | ||
89 | SPEAR1310_DMA_REQ_I2C5_TX = 9, | ||
90 | SPEAR1310_DMA_REQ_I2C6_RX = 10, | ||
91 | SPEAR1310_DMA_REQ_I2C6_TX = 11, | ||
92 | SPEAR1310_DMA_REQ_UART1_RX = 12, | ||
93 | SPEAR1310_DMA_REQ_UART1_TX = 13, | ||
94 | SPEAR1310_DMA_REQ_UART2_RX = 14, | ||
95 | SPEAR1310_DMA_REQ_UART2_TX = 15, | ||
96 | SPEAR1310_DMA_REQ_UART5_RX = 16, | ||
97 | SPEAR1310_DMA_REQ_UART5_TX = 17, | ||
98 | SPEAR1310_DMA_REQ_SSP1_RX = 18, | ||
99 | SPEAR1310_DMA_REQ_SSP1_TX = 19, | ||
100 | SPEAR1310_DMA_REQ_I2C7_RX = 20, | ||
101 | SPEAR1310_DMA_REQ_I2C7_TX = 21, | ||
102 | SPEAR1310_DMA_REQ_UART3_RX = 28, | ||
103 | SPEAR1310_DMA_REQ_UART3_TX = 29, | ||
104 | SPEAR1310_DMA_REQ_UART4_RX = 30, | ||
105 | SPEAR1310_DMA_REQ_UART4_TX = 31, | ||
106 | #endif | ||
107 | |||
108 | #ifdef CONFIG_MACH_SPEAR1340 | ||
109 | SPEAR1340_DMA_REQ_SPDIF_TX = 2, | ||
110 | SPEAR1340_DMA_REQ_SPDIF_RX = 3, | ||
111 | SPEAR1340_DMA_REQ_I2S_TX = 10, | ||
112 | SPEAR1340_DMA_REQ_I2S_RX = 11, | ||
113 | SPEAR1340_DMA_REQ_UART1_TX = 12, | ||
114 | SPEAR1340_DMA_REQ_UART1_RX = 13, | ||
115 | SPEAR1340_DMA_REQ_I2C1_TX = 14, | ||
116 | SPEAR1340_DMA_REQ_I2C1_RX = 15, | ||
117 | SPEAR1340_DMA_REQ_CAM0_EVEN = 0, | ||
118 | SPEAR1340_DMA_REQ_CAM0_ODD = 1, | ||
119 | SPEAR1340_DMA_REQ_CAM1_EVEN = 2, | ||
120 | SPEAR1340_DMA_REQ_CAM1_ODD = 3, | ||
121 | SPEAR1340_DMA_REQ_CAM2_EVEN = 4, | ||
122 | SPEAR1340_DMA_REQ_CAM2_ODD = 5, | ||
123 | SPEAR1340_DMA_REQ_CAM3_EVEN = 6, | ||
124 | SPEAR1340_DMA_REQ_CAM3_ODD = 7, | ||
125 | #endif | ||
126 | }; | ||
127 | |||
128 | #endif /* __MACH_DMA_H */ | ||
diff --git a/arch/arm/mach-spear13xx/include/mach/generic.h b/arch/arm/mach-spear13xx/include/mach/generic.h new file mode 100644 index 000000000000..6d8c45b9f298 --- /dev/null +++ b/arch/arm/mach-spear13xx/include/mach/generic.h | |||
@@ -0,0 +1,49 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-spear13xx/include/mach/generic.h | ||
3 | * | ||
4 | * spear13xx machine family generic header file | ||
5 | * | ||
6 | * Copyright (C) 2012 ST Microelectronics | ||
7 | * Viresh Kumar <viresh.kumar@st.com> | ||
8 | * | ||
9 | * This file is licensed under the terms of the GNU General Public | ||
10 | * License version 2. This program is licensed "as is" without any | ||
11 | * warranty of any kind, whether express or implied. | ||
12 | */ | ||
13 | |||
14 | #ifndef __MACH_GENERIC_H | ||
15 | #define __MACH_GENERIC_H | ||
16 | |||
17 | #include <linux/dmaengine.h> | ||
18 | #include <asm/mach/time.h> | ||
19 | |||
20 | /* Add spear13xx structure declarations here */ | ||
21 | extern struct sys_timer spear13xx_timer; | ||
22 | extern struct pl022_ssp_controller pl022_plat_data; | ||
23 | extern struct dw_dma_platform_data dmac_plat_data; | ||
24 | extern struct dw_dma_slave cf_dma_priv; | ||
25 | extern struct dw_dma_slave nand_read_dma_priv; | ||
26 | extern struct dw_dma_slave nand_write_dma_priv; | ||
27 | |||
28 | /* Add spear13xx family function declarations here */ | ||
29 | void __init spear_setup_of_timer(void); | ||
30 | void __init spear13xx_map_io(void); | ||
31 | void __init spear13xx_dt_init_irq(void); | ||
32 | void __init spear13xx_l2x0_init(void); | ||
33 | bool dw_dma_filter(struct dma_chan *chan, void *slave); | ||
34 | void spear_restart(char, const char *); | ||
35 | void spear13xx_secondary_startup(void); | ||
36 | |||
37 | #ifdef CONFIG_MACH_SPEAR1310 | ||
38 | void __init spear1310_clk_init(void); | ||
39 | #else | ||
40 | static inline void spear1310_clk_init(void) {} | ||
41 | #endif | ||
42 | |||
43 | #ifdef CONFIG_MACH_SPEAR1340 | ||
44 | void __init spear1340_clk_init(void); | ||
45 | #else | ||
46 | static inline void spear1340_clk_init(void) {} | ||
47 | #endif | ||
48 | |||
49 | #endif /* __MACH_GENERIC_H */ | ||
diff --git a/arch/arm/mach-spear13xx/include/mach/gpio.h b/arch/arm/mach-spear13xx/include/mach/gpio.h new file mode 100644 index 000000000000..cd6f4f86a56b --- /dev/null +++ b/arch/arm/mach-spear13xx/include/mach/gpio.h | |||
@@ -0,0 +1,19 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-spear13xx/include/mach/gpio.h | ||
3 | * | ||
4 | * GPIO macros for SPEAr13xx machine family | ||
5 | * | ||
6 | * Copyright (C) 2012 ST Microelectronics | ||
7 | * Viresh Kumar <viresh.kumar@st.com> | ||
8 | * | ||
9 | * This file is licensed under the terms of the GNU General Public | ||
10 | * License version 2. This program is licensed "as is" without any | ||
11 | * warranty of any kind, whether express or implied. | ||
12 | */ | ||
13 | |||
14 | #ifndef __MACH_GPIO_H | ||
15 | #define __MACH_GPIO_H | ||
16 | |||
17 | #include <plat/gpio.h> | ||
18 | |||
19 | #endif /* __MACH_GPIO_H */ | ||
diff --git a/arch/arm/mach-spear13xx/include/mach/hardware.h b/arch/arm/mach-spear13xx/include/mach/hardware.h new file mode 100644 index 000000000000..40a8c178f10d --- /dev/null +++ b/arch/arm/mach-spear13xx/include/mach/hardware.h | |||
@@ -0,0 +1 @@ | |||
/* empty */ | |||
diff --git a/arch/arm/mach-spear13xx/include/mach/irqs.h b/arch/arm/mach-spear13xx/include/mach/irqs.h new file mode 100644 index 000000000000..f542a24aa5f2 --- /dev/null +++ b/arch/arm/mach-spear13xx/include/mach/irqs.h | |||
@@ -0,0 +1,20 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-spear13xx/include/mach/irqs.h | ||
3 | * | ||
4 | * IRQ helper macros for spear13xx machine family | ||
5 | * | ||
6 | * Copyright (C) 2012 ST Microelectronics | ||
7 | * Viresh Kumar <viresh.kumar@st.com> | ||
8 | * | ||
9 | * This file is licensed under the terms of the GNU General Public | ||
10 | * License version 2. This program is licensed "as is" without any | ||
11 | * warranty of any kind, whether express or implied. | ||
12 | */ | ||
13 | |||
14 | #ifndef __MACH_IRQS_H | ||
15 | #define __MACH_IRQS_H | ||
16 | |||
17 | #define IRQ_GIC_END 160 | ||
18 | #define NR_IRQS IRQ_GIC_END | ||
19 | |||
20 | #endif /* __MACH_IRQS_H */ | ||
diff --git a/arch/arm/mach-spear13xx/include/mach/spear.h b/arch/arm/mach-spear13xx/include/mach/spear.h new file mode 100644 index 000000000000..30c57ef72686 --- /dev/null +++ b/arch/arm/mach-spear13xx/include/mach/spear.h | |||
@@ -0,0 +1,62 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-spear13xx/include/mach/spear.h | ||
3 | * | ||
4 | * spear13xx Machine family specific definition | ||
5 | * | ||
6 | * Copyright (C) 2012 ST Microelectronics | ||
7 | * Viresh Kumar <viresh.kumar@st.com> | ||
8 | * | ||
9 | * This file is licensed under the terms of the GNU General Public | ||
10 | * License version 2. This program is licensed "as is" without any | ||
11 | * warranty of any kind, whether express or implied. | ||
12 | */ | ||
13 | |||
14 | #ifndef __MACH_SPEAR13XX_H | ||
15 | #define __MACH_SPEAR13XX_H | ||
16 | |||
17 | #include <asm/memory.h> | ||
18 | |||
19 | #define PERIP_GRP2_BASE UL(0xB3000000) | ||
20 | #define VA_PERIP_GRP2_BASE UL(0xFE000000) | ||
21 | #define MCIF_SDHCI_BASE UL(0xB3000000) | ||
22 | #define SYSRAM0_BASE UL(0xB3800000) | ||
23 | #define VA_SYSRAM0_BASE UL(0xFE800000) | ||
24 | #define SYS_LOCATION (VA_SYSRAM0_BASE + 0x600) | ||
25 | |||
26 | #define PERIP_GRP1_BASE UL(0xE0000000) | ||
27 | #define VA_PERIP_GRP1_BASE UL(0xFD000000) | ||
28 | #define UART_BASE UL(0xE0000000) | ||
29 | #define VA_UART_BASE UL(0xFD000000) | ||
30 | #define SSP_BASE UL(0xE0100000) | ||
31 | #define MISC_BASE UL(0xE0700000) | ||
32 | #define VA_MISC_BASE IOMEM(UL(0xFD700000)) | ||
33 | |||
34 | #define A9SM_AND_MPMC_BASE UL(0xEC000000) | ||
35 | #define VA_A9SM_AND_MPMC_BASE UL(0xFC000000) | ||
36 | |||
37 | /* A9SM peripheral offsets */ | ||
38 | #define A9SM_PERIP_BASE UL(0xEC800000) | ||
39 | #define VA_A9SM_PERIP_BASE UL(0xFC800000) | ||
40 | #define VA_SCU_BASE (VA_A9SM_PERIP_BASE + 0x00) | ||
41 | |||
42 | #define L2CC_BASE UL(0xED000000) | ||
43 | #define VA_L2CC_BASE IOMEM(UL(0xFB000000)) | ||
44 | |||
45 | /* others */ | ||
46 | #define DMAC0_BASE UL(0xEA800000) | ||
47 | #define DMAC1_BASE UL(0xEB000000) | ||
48 | #define MCIF_CF_BASE UL(0xB2800000) | ||
49 | |||
50 | /* Devices present in SPEAr1310 */ | ||
51 | #ifdef CONFIG_MACH_SPEAR1310 | ||
52 | #define SPEAR1310_RAS_GRP1_BASE UL(0xD8000000) | ||
53 | #define VA_SPEAR1310_RAS_GRP1_BASE UL(0xFA000000) | ||
54 | #define SPEAR1310_RAS_BASE UL(0xD8400000) | ||
55 | #define VA_SPEAR1310_RAS_BASE IOMEM(UL(0xFA400000)) | ||
56 | #endif /* CONFIG_MACH_SPEAR1310 */ | ||
57 | |||
58 | /* Debug uart for linux, will be used for debug and uncompress messages */ | ||
59 | #define SPEAR_DBG_UART_BASE UART_BASE | ||
60 | #define VA_SPEAR_DBG_UART_BASE VA_UART_BASE | ||
61 | |||
62 | #endif /* __MACH_SPEAR13XX_H */ | ||
diff --git a/arch/arm/mach-spear13xx/include/mach/spear1310_misc_regs.h b/arch/arm/mach-spear13xx/include/mach/spear1310_misc_regs.h new file mode 100644 index 000000000000..e69de29bb2d1 --- /dev/null +++ b/arch/arm/mach-spear13xx/include/mach/spear1310_misc_regs.h | |||
diff --git a/arch/arm/mach-spear13xx/include/mach/spear1340_misc_regs.h b/arch/arm/mach-spear13xx/include/mach/spear1340_misc_regs.h new file mode 100644 index 000000000000..e69de29bb2d1 --- /dev/null +++ b/arch/arm/mach-spear13xx/include/mach/spear1340_misc_regs.h | |||
diff --git a/arch/arm/mach-spear13xx/include/mach/timex.h b/arch/arm/mach-spear13xx/include/mach/timex.h new file mode 100644 index 000000000000..31af3e8d976e --- /dev/null +++ b/arch/arm/mach-spear13xx/include/mach/timex.h | |||
@@ -0,0 +1,19 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-spear3xx/include/mach/timex.h | ||
3 | * | ||
4 | * SPEAr3XX machine family specific timex definitions | ||
5 | * | ||
6 | * Copyright (C) 2012 ST Microelectronics | ||
7 | * Viresh Kumar <viresh.kumar@st.com> | ||
8 | * | ||
9 | * This file is licensed under the terms of the GNU General Public | ||
10 | * License version 2. This program is licensed "as is" without any | ||
11 | * warranty of any kind, whether express or implied. | ||
12 | */ | ||
13 | |||
14 | #ifndef __MACH_TIMEX_H | ||
15 | #define __MACH_TIMEX_H | ||
16 | |||
17 | #include <plat/timex.h> | ||
18 | |||
19 | #endif /* __MACH_TIMEX_H */ | ||
diff --git a/arch/arm/mach-spear13xx/include/mach/uncompress.h b/arch/arm/mach-spear13xx/include/mach/uncompress.h new file mode 100644 index 000000000000..c7840896ae6e --- /dev/null +++ b/arch/arm/mach-spear13xx/include/mach/uncompress.h | |||
@@ -0,0 +1,19 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-spear13xx/include/mach/uncompress.h | ||
3 | * | ||
4 | * Serial port stubs for kernel decompress status messages | ||
5 | * | ||
6 | * Copyright (C) 2012 ST Microelectronics | ||
7 | * Viresh Kumar <viresh.kumar@st.com> | ||
8 | * | ||
9 | * This file is licensed under the terms of the GNU General Public | ||
10 | * License version 2. This program is licensed "as is" without any | ||
11 | * warranty of any kind, whether express or implied. | ||
12 | */ | ||
13 | |||
14 | #ifndef __MACH_UNCOMPRESS_H | ||
15 | #define __MACH_UNCOMPRESS_H | ||
16 | |||
17 | #include <plat/uncompress.h> | ||
18 | |||
19 | #endif /* __MACH_UNCOMPRESS_H */ | ||
diff --git a/arch/arm/mach-spear13xx/platsmp.c b/arch/arm/mach-spear13xx/platsmp.c new file mode 100644 index 000000000000..f5d07f2663d7 --- /dev/null +++ b/arch/arm/mach-spear13xx/platsmp.c | |||
@@ -0,0 +1,127 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-spear13xx/platsmp.c | ||
3 | * | ||
4 | * based upon linux/arch/arm/mach-realview/platsmp.c | ||
5 | * | ||
6 | * Copyright (C) 2012 ST Microelectronics Ltd. | ||
7 | * Shiraz Hashim <shiraz.hashim@st.com> | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License version 2 as | ||
11 | * published by the Free Software Foundation. | ||
12 | */ | ||
13 | |||
14 | #include <linux/delay.h> | ||
15 | #include <linux/jiffies.h> | ||
16 | #include <linux/io.h> | ||
17 | #include <linux/smp.h> | ||
18 | #include <asm/cacheflush.h> | ||
19 | #include <asm/hardware/gic.h> | ||
20 | #include <asm/smp_scu.h> | ||
21 | #include <mach/spear.h> | ||
22 | |||
23 | /* | ||
24 | * control for which core is the next to come out of the secondary | ||
25 | * boot "holding pen" | ||
26 | */ | ||
27 | volatile int __cpuinitdata pen_release = -1; | ||
28 | static DEFINE_SPINLOCK(boot_lock); | ||
29 | |||
30 | static void __iomem *scu_base = IOMEM(VA_SCU_BASE); | ||
31 | extern void spear13xx_secondary_startup(void); | ||
32 | |||
33 | void __cpuinit platform_secondary_init(unsigned int cpu) | ||
34 | { | ||
35 | /* | ||
36 | * if any interrupts are already enabled for the primary | ||
37 | * core (e.g. timer irq), then they will not have been enabled | ||
38 | * for us: do so | ||
39 | */ | ||
40 | gic_secondary_init(0); | ||
41 | |||
42 | /* | ||
43 | * let the primary processor know we're out of the | ||
44 | * pen, then head off into the C entry point | ||
45 | */ | ||
46 | pen_release = -1; | ||
47 | smp_wmb(); | ||
48 | |||
49 | /* | ||
50 | * Synchronise with the boot thread. | ||
51 | */ | ||
52 | spin_lock(&boot_lock); | ||
53 | spin_unlock(&boot_lock); | ||
54 | } | ||
55 | |||
56 | int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle) | ||
57 | { | ||
58 | unsigned long timeout; | ||
59 | |||
60 | /* | ||
61 | * set synchronisation state between this boot processor | ||
62 | * and the secondary one | ||
63 | */ | ||
64 | spin_lock(&boot_lock); | ||
65 | |||
66 | /* | ||
67 | * The secondary processor is waiting to be released from | ||
68 | * the holding pen - release it, then wait for it to flag | ||
69 | * that it has been released by resetting pen_release. | ||
70 | * | ||
71 | * Note that "pen_release" is the hardware CPU ID, whereas | ||
72 | * "cpu" is Linux's internal ID. | ||
73 | */ | ||
74 | pen_release = cpu; | ||
75 | flush_cache_all(); | ||
76 | outer_flush_all(); | ||
77 | |||
78 | timeout = jiffies + (1 * HZ); | ||
79 | while (time_before(jiffies, timeout)) { | ||
80 | smp_rmb(); | ||
81 | if (pen_release == -1) | ||
82 | break; | ||
83 | |||
84 | udelay(10); | ||
85 | } | ||
86 | |||
87 | /* | ||
88 | * now the secondary core is starting up let it run its | ||
89 | * calibrations, then wait for it to finish | ||
90 | */ | ||
91 | spin_unlock(&boot_lock); | ||
92 | |||
93 | return pen_release != -1 ? -ENOSYS : 0; | ||
94 | } | ||
95 | |||
96 | /* | ||
97 | * Initialise the CPU possible map early - this describes the CPUs | ||
98 | * which may be present or become present in the system. | ||
99 | */ | ||
100 | void __init smp_init_cpus(void) | ||
101 | { | ||
102 | unsigned int i, ncores = scu_get_core_count(scu_base); | ||
103 | |||
104 | if (ncores > nr_cpu_ids) { | ||
105 | pr_warn("SMP: %u cores greater than maximum (%u), clipping\n", | ||
106 | ncores, nr_cpu_ids); | ||
107 | ncores = nr_cpu_ids; | ||
108 | } | ||
109 | |||
110 | for (i = 0; i < ncores; i++) | ||
111 | set_cpu_possible(i, true); | ||
112 | |||
113 | set_smp_cross_call(gic_raise_softirq); | ||
114 | } | ||
115 | |||
116 | void __init platform_smp_prepare_cpus(unsigned int max_cpus) | ||
117 | { | ||
118 | |||
119 | scu_enable(scu_base); | ||
120 | |||
121 | /* | ||
122 | * Write the address of secondary startup into the system-wide location | ||
123 | * (presently it is in SRAM). The BootMonitor waits until it receives a | ||
124 | * soft interrupt, and then the secondary CPU branches to this address. | ||
125 | */ | ||
126 | __raw_writel(virt_to_phys(spear13xx_secondary_startup), SYS_LOCATION); | ||
127 | } | ||
diff --git a/arch/arm/mach-spear13xx/spear1310.c b/arch/arm/mach-spear13xx/spear1310.c new file mode 100644 index 000000000000..fefd15b2f380 --- /dev/null +++ b/arch/arm/mach-spear13xx/spear1310.c | |||
@@ -0,0 +1,88 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-spear13xx/spear1310.c | ||
3 | * | ||
4 | * SPEAr1310 machine source file | ||
5 | * | ||
6 | * Copyright (C) 2012 ST Microelectronics | ||
7 | * Viresh Kumar <viresh.kumar@st.com> | ||
8 | * | ||
9 | * This file is licensed under the terms of the GNU General Public | ||
10 | * License version 2. This program is licensed "as is" without any | ||
11 | * warranty of any kind, whether express or implied. | ||
12 | */ | ||
13 | |||
14 | #define pr_fmt(fmt) "SPEAr1310: " fmt | ||
15 | |||
16 | #include <linux/amba/pl022.h> | ||
17 | #include <linux/of_platform.h> | ||
18 | #include <asm/hardware/gic.h> | ||
19 | #include <asm/mach/arch.h> | ||
20 | #include <asm/mach/map.h> | ||
21 | #include <mach/generic.h> | ||
22 | #include <mach/spear.h> | ||
23 | |||
24 | /* Base addresses */ | ||
25 | #define SPEAR1310_SSP1_BASE UL(0x5D400000) | ||
26 | #define SPEAR1310_SATA0_BASE UL(0xB1000000) | ||
27 | #define SPEAR1310_SATA1_BASE UL(0xB1800000) | ||
28 | #define SPEAR1310_SATA2_BASE UL(0xB4000000) | ||
29 | |||
30 | /* ssp device registration */ | ||
31 | static struct pl022_ssp_controller ssp1_plat_data = { | ||
32 | .bus_id = 0, | ||
33 | .enable_dma = 0, | ||
34 | .num_chipselect = 3, | ||
35 | }; | ||
36 | |||
37 | /* Add SPEAr1310 auxdata to pass platform data */ | ||
38 | static struct of_dev_auxdata spear1310_auxdata_lookup[] __initdata = { | ||
39 | OF_DEV_AUXDATA("arasan,cf-spear1340", MCIF_CF_BASE, NULL, &cf_dma_priv), | ||
40 | OF_DEV_AUXDATA("snps,dma-spear1340", DMAC0_BASE, NULL, &dmac_plat_data), | ||
41 | OF_DEV_AUXDATA("snps,dma-spear1340", DMAC1_BASE, NULL, &dmac_plat_data), | ||
42 | OF_DEV_AUXDATA("arm,pl022", SSP_BASE, NULL, &pl022_plat_data), | ||
43 | |||
44 | OF_DEV_AUXDATA("arm,pl022", SPEAR1310_SSP1_BASE, NULL, &ssp1_plat_data), | ||
45 | {} | ||
46 | }; | ||
47 | |||
48 | static void __init spear1310_dt_init(void) | ||
49 | { | ||
50 | of_platform_populate(NULL, of_default_bus_match_table, | ||
51 | spear1310_auxdata_lookup, NULL); | ||
52 | } | ||
53 | |||
54 | static const char * const spear1310_dt_board_compat[] = { | ||
55 | "st,spear1310", | ||
56 | "st,spear1310-evb", | ||
57 | NULL, | ||
58 | }; | ||
59 | |||
60 | /* | ||
61 | * Following will create 16MB static virtual/physical mappings | ||
62 | * PHYSICAL VIRTUAL | ||
63 | * 0xD8000000 0xFA000000 | ||
64 | */ | ||
65 | struct map_desc spear1310_io_desc[] __initdata = { | ||
66 | { | ||
67 | .virtual = VA_SPEAR1310_RAS_GRP1_BASE, | ||
68 | .pfn = __phys_to_pfn(SPEAR1310_RAS_GRP1_BASE), | ||
69 | .length = SZ_16M, | ||
70 | .type = MT_DEVICE | ||
71 | }, | ||
72 | }; | ||
73 | |||
74 | static void __init spear1310_map_io(void) | ||
75 | { | ||
76 | iotable_init(spear1310_io_desc, ARRAY_SIZE(spear1310_io_desc)); | ||
77 | spear13xx_map_io(); | ||
78 | } | ||
79 | |||
80 | DT_MACHINE_START(SPEAR1310_DT, "ST SPEAr1310 SoC with Flattened Device Tree") | ||
81 | .map_io = spear1310_map_io, | ||
82 | .init_irq = spear13xx_dt_init_irq, | ||
83 | .handle_irq = gic_handle_irq, | ||
84 | .timer = &spear13xx_timer, | ||
85 | .init_machine = spear1310_dt_init, | ||
86 | .restart = spear_restart, | ||
87 | .dt_compat = spear1310_dt_board_compat, | ||
88 | MACHINE_END | ||
diff --git a/arch/arm/mach-spear13xx/spear1340.c b/arch/arm/mach-spear13xx/spear1340.c new file mode 100644 index 000000000000..ee38cbc56869 --- /dev/null +++ b/arch/arm/mach-spear13xx/spear1340.c | |||
@@ -0,0 +1,192 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-spear13xx/spear1340.c | ||
3 | * | ||
4 | * SPEAr1340 machine source file | ||
5 | * | ||
6 | * Copyright (C) 2012 ST Microelectronics | ||
7 | * Viresh Kumar <viresh.kumar@st.com> | ||
8 | * | ||
9 | * This file is licensed under the terms of the GNU General Public | ||
10 | * License version 2. This program is licensed "as is" without any | ||
11 | * warranty of any kind, whether express or implied. | ||
12 | */ | ||
13 | |||
14 | #define pr_fmt(fmt) "SPEAr1340: " fmt | ||
15 | |||
16 | #include <linux/ahci_platform.h> | ||
17 | #include <linux/amba/serial.h> | ||
18 | #include <linux/delay.h> | ||
19 | #include <linux/dw_dmac.h> | ||
20 | #include <linux/of_platform.h> | ||
21 | #include <asm/hardware/gic.h> | ||
22 | #include <asm/mach/arch.h> | ||
23 | #include <mach/dma.h> | ||
24 | #include <mach/generic.h> | ||
25 | #include <mach/spear.h> | ||
26 | |||
27 | /* Base addresses */ | ||
28 | #define SPEAR1340_SATA_BASE UL(0xB1000000) | ||
29 | #define SPEAR1340_UART1_BASE UL(0xB4100000) | ||
30 | |||
31 | /* Power Management Registers */ | ||
32 | #define SPEAR1340_PCM_CFG (VA_MISC_BASE + 0x100) | ||
33 | #define SPEAR1340_PCM_WKUP_CFG (VA_MISC_BASE + 0x104) | ||
34 | #define SPEAR1340_SWITCH_CTR (VA_MISC_BASE + 0x108) | ||
35 | |||
36 | #define SPEAR1340_PERIP1_SW_RST (VA_MISC_BASE + 0x318) | ||
37 | #define SPEAR1340_PERIP2_SW_RST (VA_MISC_BASE + 0x31C) | ||
38 | #define SPEAR1340_PERIP3_SW_RST (VA_MISC_BASE + 0x320) | ||
39 | |||
40 | /* PCIE - SATA configuration registers */ | ||
41 | #define SPEAR1340_PCIE_SATA_CFG (VA_MISC_BASE + 0x424) | ||
42 | /* PCIE CFG MASks */ | ||
43 | #define SPEAR1340_PCIE_CFG_DEVICE_PRESENT (1 << 11) | ||
44 | #define SPEAR1340_PCIE_CFG_POWERUP_RESET (1 << 10) | ||
45 | #define SPEAR1340_PCIE_CFG_CORE_CLK_EN (1 << 9) | ||
46 | #define SPEAR1340_PCIE_CFG_AUX_CLK_EN (1 << 8) | ||
47 | #define SPEAR1340_SATA_CFG_TX_CLK_EN (1 << 4) | ||
48 | #define SPEAR1340_SATA_CFG_RX_CLK_EN (1 << 3) | ||
49 | #define SPEAR1340_SATA_CFG_POWERUP_RESET (1 << 2) | ||
50 | #define SPEAR1340_SATA_CFG_PM_CLK_EN (1 << 1) | ||
51 | #define SPEAR1340_PCIE_SATA_SEL_PCIE (0) | ||
52 | #define SPEAR1340_PCIE_SATA_SEL_SATA (1) | ||
53 | #define SPEAR1340_SATA_PCIE_CFG_MASK 0xF1F | ||
54 | #define SPEAR1340_PCIE_CFG_VAL (SPEAR1340_PCIE_SATA_SEL_PCIE | \ | ||
55 | SPEAR1340_PCIE_CFG_AUX_CLK_EN | \ | ||
56 | SPEAR1340_PCIE_CFG_CORE_CLK_EN | \ | ||
57 | SPEAR1340_PCIE_CFG_POWERUP_RESET | \ | ||
58 | SPEAR1340_PCIE_CFG_DEVICE_PRESENT) | ||
59 | #define SPEAR1340_SATA_CFG_VAL (SPEAR1340_PCIE_SATA_SEL_SATA | \ | ||
60 | SPEAR1340_SATA_CFG_PM_CLK_EN | \ | ||
61 | SPEAR1340_SATA_CFG_POWERUP_RESET | \ | ||
62 | SPEAR1340_SATA_CFG_RX_CLK_EN | \ | ||
63 | SPEAR1340_SATA_CFG_TX_CLK_EN) | ||
64 | |||
65 | #define SPEAR1340_PCIE_MIPHY_CFG (VA_MISC_BASE + 0x428) | ||
66 | #define SPEAR1340_MIPHY_OSC_BYPASS_EXT (1 << 31) | ||
67 | #define SPEAR1340_MIPHY_CLK_REF_DIV2 (1 << 27) | ||
68 | #define SPEAR1340_MIPHY_CLK_REF_DIV4 (2 << 27) | ||
69 | #define SPEAR1340_MIPHY_CLK_REF_DIV8 (3 << 27) | ||
70 | #define SPEAR1340_MIPHY_PLL_RATIO_TOP(x) (x << 0) | ||
71 | #define SPEAR1340_PCIE_SATA_MIPHY_CFG_SATA \ | ||
72 | (SPEAR1340_MIPHY_OSC_BYPASS_EXT | \ | ||
73 | SPEAR1340_MIPHY_CLK_REF_DIV2 | \ | ||
74 | SPEAR1340_MIPHY_PLL_RATIO_TOP(60)) | ||
75 | #define SPEAR1340_PCIE_SATA_MIPHY_CFG_SATA_25M_CRYSTAL_CLK \ | ||
76 | (SPEAR1340_MIPHY_PLL_RATIO_TOP(120)) | ||
77 | #define SPEAR1340_PCIE_SATA_MIPHY_CFG_PCIE \ | ||
78 | (SPEAR1340_MIPHY_OSC_BYPASS_EXT | \ | ||
79 | SPEAR1340_MIPHY_PLL_RATIO_TOP(25)) | ||
80 | |||
81 | static struct dw_dma_slave uart1_dma_param[] = { | ||
82 | { | ||
83 | /* Tx */ | ||
84 | .cfg_hi = DWC_CFGH_DST_PER(SPEAR1340_DMA_REQ_UART1_TX), | ||
85 | .cfg_lo = 0, | ||
86 | .src_master = DMA_MASTER_MEMORY, | ||
87 | .dst_master = SPEAR1340_DMA_MASTER_UART1, | ||
88 | }, { | ||
89 | /* Rx */ | ||
90 | .cfg_hi = DWC_CFGH_SRC_PER(SPEAR1340_DMA_REQ_UART1_RX), | ||
91 | .cfg_lo = 0, | ||
92 | .src_master = SPEAR1340_DMA_MASTER_UART1, | ||
93 | .dst_master = DMA_MASTER_MEMORY, | ||
94 | } | ||
95 | }; | ||
96 | |||
97 | static struct amba_pl011_data uart1_data = { | ||
98 | .dma_filter = dw_dma_filter, | ||
99 | .dma_tx_param = &uart1_dma_param[0], | ||
100 | .dma_rx_param = &uart1_dma_param[1], | ||
101 | }; | ||
102 | |||
103 | /* SATA device registration */ | ||
104 | static int sata_miphy_init(struct device *dev, void __iomem *addr) | ||
105 | { | ||
106 | writel(SPEAR1340_SATA_CFG_VAL, SPEAR1340_PCIE_SATA_CFG); | ||
107 | writel(SPEAR1340_PCIE_SATA_MIPHY_CFG_SATA_25M_CRYSTAL_CLK, | ||
108 | SPEAR1340_PCIE_MIPHY_CFG); | ||
109 | /* Switch on sata power domain */ | ||
110 | writel((readl(SPEAR1340_PCM_CFG) | (0x800)), SPEAR1340_PCM_CFG); | ||
111 | msleep(20); | ||
112 | /* Disable PCIE SATA Controller reset */ | ||
113 | writel((readl(SPEAR1340_PERIP1_SW_RST) & (~0x1000)), | ||
114 | SPEAR1340_PERIP1_SW_RST); | ||
115 | msleep(20); | ||
116 | |||
117 | return 0; | ||
118 | } | ||
119 | |||
120 | void sata_miphy_exit(struct device *dev) | ||
121 | { | ||
122 | writel(0, SPEAR1340_PCIE_SATA_CFG); | ||
123 | writel(0, SPEAR1340_PCIE_MIPHY_CFG); | ||
124 | |||
125 | /* Enable PCIE SATA Controller reset */ | ||
126 | writel((readl(SPEAR1340_PERIP1_SW_RST) | (0x1000)), | ||
127 | SPEAR1340_PERIP1_SW_RST); | ||
128 | msleep(20); | ||
129 | /* Switch off sata power domain */ | ||
130 | writel((readl(SPEAR1340_PCM_CFG) & (~0x800)), SPEAR1340_PCM_CFG); | ||
131 | msleep(20); | ||
132 | } | ||
133 | |||
134 | int sata_suspend(struct device *dev) | ||
135 | { | ||
136 | if (dev->power.power_state.event == PM_EVENT_FREEZE) | ||
137 | return 0; | ||
138 | |||
139 | sata_miphy_exit(dev); | ||
140 | |||
141 | return 0; | ||
142 | } | ||
143 | |||
144 | int sata_resume(struct device *dev) | ||
145 | { | ||
146 | if (dev->power.power_state.event == PM_EVENT_THAW) | ||
147 | return 0; | ||
148 | |||
149 | return sata_miphy_init(dev, NULL); | ||
150 | } | ||
151 | |||
152 | static struct ahci_platform_data sata_pdata = { | ||
153 | .init = sata_miphy_init, | ||
154 | .exit = sata_miphy_exit, | ||
155 | .suspend = sata_suspend, | ||
156 | .resume = sata_resume, | ||
157 | }; | ||
158 | |||
159 | /* Add SPEAr1340 auxdata to pass platform data */ | ||
160 | static struct of_dev_auxdata spear1340_auxdata_lookup[] __initdata = { | ||
161 | OF_DEV_AUXDATA("arasan,cf-spear1340", MCIF_CF_BASE, NULL, &cf_dma_priv), | ||
162 | OF_DEV_AUXDATA("snps,dma-spear1340", DMAC0_BASE, NULL, &dmac_plat_data), | ||
163 | OF_DEV_AUXDATA("snps,dma-spear1340", DMAC1_BASE, NULL, &dmac_plat_data), | ||
164 | OF_DEV_AUXDATA("arm,pl022", SSP_BASE, NULL, &pl022_plat_data), | ||
165 | |||
166 | OF_DEV_AUXDATA("snps,spear-ahci", SPEAR1340_SATA_BASE, NULL, | ||
167 | &sata_pdata), | ||
168 | OF_DEV_AUXDATA("arm,pl011", SPEAR1340_UART1_BASE, NULL, &uart1_data), | ||
169 | {} | ||
170 | }; | ||
171 | |||
172 | static void __init spear1340_dt_init(void) | ||
173 | { | ||
174 | of_platform_populate(NULL, of_default_bus_match_table, | ||
175 | spear1340_auxdata_lookup, NULL); | ||
176 | } | ||
177 | |||
178 | static const char * const spear1340_dt_board_compat[] = { | ||
179 | "st,spear1340", | ||
180 | "st,spear1340-evb", | ||
181 | NULL, | ||
182 | }; | ||
183 | |||
184 | DT_MACHINE_START(SPEAR1340_DT, "ST SPEAr1340 SoC with Flattened Device Tree") | ||
185 | .map_io = spear13xx_map_io, | ||
186 | .init_irq = spear13xx_dt_init_irq, | ||
187 | .handle_irq = gic_handle_irq, | ||
188 | .timer = &spear13xx_timer, | ||
189 | .init_machine = spear1340_dt_init, | ||
190 | .restart = spear_restart, | ||
191 | .dt_compat = spear1340_dt_board_compat, | ||
192 | MACHINE_END | ||
diff --git a/arch/arm/mach-spear13xx/spear13xx.c b/arch/arm/mach-spear13xx/spear13xx.c new file mode 100644 index 000000000000..50b349ae863d --- /dev/null +++ b/arch/arm/mach-spear13xx/spear13xx.c | |||
@@ -0,0 +1,197 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-spear13xx/spear13xx.c | ||
3 | * | ||
4 | * SPEAr13XX machines common source file | ||
5 | * | ||
6 | * Copyright (C) 2012 ST Microelectronics | ||
7 | * Viresh Kumar <viresh.kumar@st.com> | ||
8 | * | ||
9 | * This file is licensed under the terms of the GNU General Public | ||
10 | * License version 2. This program is licensed "as is" without any | ||
11 | * warranty of any kind, whether express or implied. | ||
12 | */ | ||
13 | |||
14 | #define pr_fmt(fmt) "SPEAr13xx: " fmt | ||
15 | |||
16 | #include <linux/amba/pl022.h> | ||
17 | #include <linux/clk.h> | ||
18 | #include <linux/dw_dmac.h> | ||
19 | #include <linux/err.h> | ||
20 | #include <linux/of_irq.h> | ||
21 | #include <asm/hardware/cache-l2x0.h> | ||
22 | #include <asm/hardware/gic.h> | ||
23 | #include <asm/mach/map.h> | ||
24 | #include <asm/smp_twd.h> | ||
25 | #include <mach/dma.h> | ||
26 | #include <mach/generic.h> | ||
27 | #include <mach/spear.h> | ||
28 | |||
29 | /* common dw_dma filter routine to be used by peripherals */ | ||
30 | bool dw_dma_filter(struct dma_chan *chan, void *slave) | ||
31 | { | ||
32 | struct dw_dma_slave *dws = (struct dw_dma_slave *)slave; | ||
33 | |||
34 | if (chan->device->dev == dws->dma_dev) { | ||
35 | chan->private = slave; | ||
36 | return true; | ||
37 | } else { | ||
38 | return false; | ||
39 | } | ||
40 | } | ||
41 | |||
42 | /* ssp device registration */ | ||
43 | static struct dw_dma_slave ssp_dma_param[] = { | ||
44 | { | ||
45 | /* Tx */ | ||
46 | .cfg_hi = DWC_CFGH_DST_PER(DMA_REQ_SSP0_TX), | ||
47 | .cfg_lo = 0, | ||
48 | .src_master = DMA_MASTER_MEMORY, | ||
49 | .dst_master = DMA_MASTER_SSP0, | ||
50 | }, { | ||
51 | /* Rx */ | ||
52 | .cfg_hi = DWC_CFGH_SRC_PER(DMA_REQ_SSP0_RX), | ||
53 | .cfg_lo = 0, | ||
54 | .src_master = DMA_MASTER_SSP0, | ||
55 | .dst_master = DMA_MASTER_MEMORY, | ||
56 | } | ||
57 | }; | ||
58 | |||
59 | struct pl022_ssp_controller pl022_plat_data = { | ||
60 | .bus_id = 0, | ||
61 | .enable_dma = 1, | ||
62 | .dma_filter = dw_dma_filter, | ||
63 | .dma_rx_param = &ssp_dma_param[1], | ||
64 | .dma_tx_param = &ssp_dma_param[0], | ||
65 | .num_chipselect = 3, | ||
66 | }; | ||
67 | |||
68 | /* CF device registration */ | ||
69 | struct dw_dma_slave cf_dma_priv = { | ||
70 | .cfg_hi = 0, | ||
71 | .cfg_lo = 0, | ||
72 | .src_master = 0, | ||
73 | .dst_master = 0, | ||
74 | }; | ||
75 | |||
76 | /* dmac device registeration */ | ||
77 | struct dw_dma_platform_data dmac_plat_data = { | ||
78 | .nr_channels = 8, | ||
79 | .chan_allocation_order = CHAN_ALLOCATION_DESCENDING, | ||
80 | .chan_priority = CHAN_PRIORITY_DESCENDING, | ||
81 | }; | ||
82 | |||
83 | void __init spear13xx_l2x0_init(void) | ||
84 | { | ||
85 | /* | ||
86 | * 512KB (64KB/way), 8-way associativity, parity supported | ||
87 | * | ||
88 | * FIXME: 9th bit, of Auxillary Controller register must be set | ||
89 | * for some spear13xx devices for stable L2 operation. | ||
90 | * | ||
91 | * Enable Early BRESP, L2 prefetch for Instruction and Data, | ||
92 | * write alloc and 'Full line of zero' options | ||
93 | * | ||
94 | */ | ||
95 | |||
96 | writel_relaxed(0x06, VA_L2CC_BASE + L2X0_PREFETCH_CTRL); | ||
97 | |||
98 | /* | ||
99 | * Program following latencies in order to make | ||
100 | * SPEAr1340 work at 600 MHz | ||
101 | */ | ||
102 | writel_relaxed(0x221, VA_L2CC_BASE + L2X0_TAG_LATENCY_CTRL); | ||
103 | writel_relaxed(0x441, VA_L2CC_BASE + L2X0_DATA_LATENCY_CTRL); | ||
104 | l2x0_init(VA_L2CC_BASE, 0x70A60001, 0xfe00ffff); | ||
105 | } | ||
106 | |||
107 | /* | ||
108 | * Following will create 16MB static virtual/physical mappings | ||
109 | * PHYSICAL VIRTUAL | ||
110 | * 0xB3000000 0xFE000000 | ||
111 | * 0xE0000000 0xFD000000 | ||
112 | * 0xEC000000 0xFC000000 | ||
113 | * 0xED000000 0xFB000000 | ||
114 | */ | ||
115 | struct map_desc spear13xx_io_desc[] __initdata = { | ||
116 | { | ||
117 | .virtual = VA_PERIP_GRP2_BASE, | ||
118 | .pfn = __phys_to_pfn(PERIP_GRP2_BASE), | ||
119 | .length = SZ_16M, | ||
120 | .type = MT_DEVICE | ||
121 | }, { | ||
122 | .virtual = VA_PERIP_GRP1_BASE, | ||
123 | .pfn = __phys_to_pfn(PERIP_GRP1_BASE), | ||
124 | .length = SZ_16M, | ||
125 | .type = MT_DEVICE | ||
126 | }, { | ||
127 | .virtual = VA_A9SM_AND_MPMC_BASE, | ||
128 | .pfn = __phys_to_pfn(A9SM_AND_MPMC_BASE), | ||
129 | .length = SZ_16M, | ||
130 | .type = MT_DEVICE | ||
131 | }, { | ||
132 | .virtual = (unsigned long)VA_L2CC_BASE, | ||
133 | .pfn = __phys_to_pfn(L2CC_BASE), | ||
134 | .length = SZ_4K, | ||
135 | .type = MT_DEVICE | ||
136 | }, | ||
137 | }; | ||
138 | |||
139 | /* This will create static memory mapping for selected devices */ | ||
140 | void __init spear13xx_map_io(void) | ||
141 | { | ||
142 | iotable_init(spear13xx_io_desc, ARRAY_SIZE(spear13xx_io_desc)); | ||
143 | } | ||
144 | |||
145 | static void __init spear13xx_clk_init(void) | ||
146 | { | ||
147 | if (of_machine_is_compatible("st,spear1310")) | ||
148 | spear1310_clk_init(); | ||
149 | else if (of_machine_is_compatible("st,spear1340")) | ||
150 | spear1340_clk_init(); | ||
151 | else | ||
152 | pr_err("%s: Unknown machine\n", __func__); | ||
153 | } | ||
154 | |||
155 | static void __init spear13xx_timer_init(void) | ||
156 | { | ||
157 | char pclk_name[] = "osc_24m_clk"; | ||
158 | struct clk *gpt_clk, *pclk; | ||
159 | |||
160 | spear13xx_clk_init(); | ||
161 | |||
162 | /* get the system timer clock */ | ||
163 | gpt_clk = clk_get_sys("gpt0", NULL); | ||
164 | if (IS_ERR(gpt_clk)) { | ||
165 | pr_err("%s:couldn't get clk for gpt\n", __func__); | ||
166 | BUG(); | ||
167 | } | ||
168 | |||
169 | /* get the suitable parent clock for timer*/ | ||
170 | pclk = clk_get(NULL, pclk_name); | ||
171 | if (IS_ERR(pclk)) { | ||
172 | pr_err("%s:couldn't get %s as parent for gpt\n", __func__, | ||
173 | pclk_name); | ||
174 | BUG(); | ||
175 | } | ||
176 | |||
177 | clk_set_parent(gpt_clk, pclk); | ||
178 | clk_put(gpt_clk); | ||
179 | clk_put(pclk); | ||
180 | |||
181 | spear_setup_of_timer(); | ||
182 | twd_local_timer_of_register(); | ||
183 | } | ||
184 | |||
185 | struct sys_timer spear13xx_timer = { | ||
186 | .init = spear13xx_timer_init, | ||
187 | }; | ||
188 | |||
189 | static const struct of_device_id gic_of_match[] __initconst = { | ||
190 | { .compatible = "arm,cortex-a9-gic", .data = gic_of_init }, | ||
191 | { /* Sentinel */ } | ||
192 | }; | ||
193 | |||
194 | void __init spear13xx_dt_init_irq(void) | ||
195 | { | ||
196 | of_irq_init(gic_of_match); | ||
197 | } | ||
diff --git a/arch/arm/mach-spear3xx/Makefile b/arch/arm/mach-spear3xx/Makefile index 17b5d83cf2d5..8d12faa178fd 100644 --- a/arch/arm/mach-spear3xx/Makefile +++ b/arch/arm/mach-spear3xx/Makefile | |||
@@ -3,7 +3,7 @@ | |||
3 | # | 3 | # |
4 | 4 | ||
5 | # common files | 5 | # common files |
6 | obj-$(CONFIG_ARCH_SPEAR3XX) += spear3xx.o clock.o | 6 | obj-$(CONFIG_ARCH_SPEAR3XX) += spear3xx.o |
7 | 7 | ||
8 | # spear300 specific files | 8 | # spear300 specific files |
9 | obj-$(CONFIG_MACH_SPEAR300) += spear300.o | 9 | obj-$(CONFIG_MACH_SPEAR300) += spear300.o |
diff --git a/arch/arm/mach-spear3xx/clock.c b/arch/arm/mach-spear3xx/clock.c deleted file mode 100644 index cd6c11099083..000000000000 --- a/arch/arm/mach-spear3xx/clock.c +++ /dev/null | |||
@@ -1,892 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-spear3xx/clock.c | ||
3 | * | ||
4 | * SPEAr3xx machines clock framework source file | ||
5 | * | ||
6 | * Copyright (C) 2009 ST Microelectronics | ||
7 | * Viresh Kumar<viresh.kumar@st.com> | ||
8 | * | ||
9 | * This file is licensed under the terms of the GNU General Public | ||
10 | * License version 2. This program is licensed "as is" without any | ||
11 | * warranty of any kind, whether express or implied. | ||
12 | */ | ||
13 | |||
14 | #include <linux/clkdev.h> | ||
15 | #include <linux/init.h> | ||
16 | #include <linux/io.h> | ||
17 | #include <linux/kernel.h> | ||
18 | #include <linux/of_platform.h> | ||
19 | #include <asm/mach-types.h> | ||
20 | #include <plat/clock.h> | ||
21 | #include <mach/misc_regs.h> | ||
22 | #include <mach/spear.h> | ||
23 | |||
24 | #define PLL1_CTR (MISC_BASE + 0x008) | ||
25 | #define PLL1_FRQ (MISC_BASE + 0x00C) | ||
26 | #define PLL1_MOD (MISC_BASE + 0x010) | ||
27 | #define PLL2_CTR (MISC_BASE + 0x014) | ||
28 | /* PLL_CTR register masks */ | ||
29 | #define PLL_ENABLE 2 | ||
30 | #define PLL_MODE_SHIFT 4 | ||
31 | #define PLL_MODE_MASK 0x3 | ||
32 | #define PLL_MODE_NORMAL 0 | ||
33 | #define PLL_MODE_FRACTION 1 | ||
34 | #define PLL_MODE_DITH_DSB 2 | ||
35 | #define PLL_MODE_DITH_SSB 3 | ||
36 | |||
37 | #define PLL2_FRQ (MISC_BASE + 0x018) | ||
38 | /* PLL FRQ register masks */ | ||
39 | #define PLL_DIV_N_SHIFT 0 | ||
40 | #define PLL_DIV_N_MASK 0xFF | ||
41 | #define PLL_DIV_P_SHIFT 8 | ||
42 | #define PLL_DIV_P_MASK 0x7 | ||
43 | #define PLL_NORM_FDBK_M_SHIFT 24 | ||
44 | #define PLL_NORM_FDBK_M_MASK 0xFF | ||
45 | #define PLL_DITH_FDBK_M_SHIFT 16 | ||
46 | #define PLL_DITH_FDBK_M_MASK 0xFFFF | ||
47 | |||
48 | #define PLL2_MOD (MISC_BASE + 0x01C) | ||
49 | #define PLL_CLK_CFG (MISC_BASE + 0x020) | ||
50 | #define CORE_CLK_CFG (MISC_BASE + 0x024) | ||
51 | /* CORE CLK CFG register masks */ | ||
52 | #define PLL_HCLK_RATIO_SHIFT 10 | ||
53 | #define PLL_HCLK_RATIO_MASK 0x3 | ||
54 | #define HCLK_PCLK_RATIO_SHIFT 8 | ||
55 | #define HCLK_PCLK_RATIO_MASK 0x3 | ||
56 | |||
57 | #define PERIP_CLK_CFG (MISC_BASE + 0x028) | ||
58 | /* PERIP_CLK_CFG register masks */ | ||
59 | #define UART_CLK_SHIFT 4 | ||
60 | #define UART_CLK_MASK 0x1 | ||
61 | #define FIRDA_CLK_SHIFT 5 | ||
62 | #define FIRDA_CLK_MASK 0x3 | ||
63 | #define GPT0_CLK_SHIFT 8 | ||
64 | #define GPT1_CLK_SHIFT 11 | ||
65 | #define GPT2_CLK_SHIFT 12 | ||
66 | #define GPT_CLK_MASK 0x1 | ||
67 | #define AUX_CLK_PLL3_VAL 0 | ||
68 | #define AUX_CLK_PLL1_VAL 1 | ||
69 | |||
70 | #define PERIP1_CLK_ENB (MISC_BASE + 0x02C) | ||
71 | /* PERIP1_CLK_ENB register masks */ | ||
72 | #define UART_CLK_ENB 3 | ||
73 | #define SSP_CLK_ENB 5 | ||
74 | #define I2C_CLK_ENB 7 | ||
75 | #define JPEG_CLK_ENB 8 | ||
76 | #define FIRDA_CLK_ENB 10 | ||
77 | #define GPT1_CLK_ENB 11 | ||
78 | #define GPT2_CLK_ENB 12 | ||
79 | #define ADC_CLK_ENB 15 | ||
80 | #define RTC_CLK_ENB 17 | ||
81 | #define GPIO_CLK_ENB 18 | ||
82 | #define DMA_CLK_ENB 19 | ||
83 | #define SMI_CLK_ENB 21 | ||
84 | #define GMAC_CLK_ENB 23 | ||
85 | #define USBD_CLK_ENB 24 | ||
86 | #define USBH_CLK_ENB 25 | ||
87 | #define C3_CLK_ENB 31 | ||
88 | |||
89 | #define RAS_CLK_ENB (MISC_BASE + 0x034) | ||
90 | |||
91 | #define PRSC1_CLK_CFG (MISC_BASE + 0x044) | ||
92 | #define PRSC2_CLK_CFG (MISC_BASE + 0x048) | ||
93 | #define PRSC3_CLK_CFG (MISC_BASE + 0x04C) | ||
94 | /* gpt synthesizer register masks */ | ||
95 | #define GPT_MSCALE_SHIFT 0 | ||
96 | #define GPT_MSCALE_MASK 0xFFF | ||
97 | #define GPT_NSCALE_SHIFT 12 | ||
98 | #define GPT_NSCALE_MASK 0xF | ||
99 | |||
100 | #define AMEM_CLK_CFG (MISC_BASE + 0x050) | ||
101 | #define EXPI_CLK_CFG (MISC_BASE + 0x054) | ||
102 | #define CLCD_CLK_SYNT (MISC_BASE + 0x05C) | ||
103 | #define FIRDA_CLK_SYNT (MISC_BASE + 0x060) | ||
104 | #define UART_CLK_SYNT (MISC_BASE + 0x064) | ||
105 | #define GMAC_CLK_SYNT (MISC_BASE + 0x068) | ||
106 | #define RAS1_CLK_SYNT (MISC_BASE + 0x06C) | ||
107 | #define RAS2_CLK_SYNT (MISC_BASE + 0x070) | ||
108 | #define RAS3_CLK_SYNT (MISC_BASE + 0x074) | ||
109 | #define RAS4_CLK_SYNT (MISC_BASE + 0x078) | ||
110 | /* aux clk synthesiser register masks for irda to ras4 */ | ||
111 | #define AUX_SYNT_ENB 31 | ||
112 | #define AUX_EQ_SEL_SHIFT 30 | ||
113 | #define AUX_EQ_SEL_MASK 1 | ||
114 | #define AUX_EQ1_SEL 0 | ||
115 | #define AUX_EQ2_SEL 1 | ||
116 | #define AUX_XSCALE_SHIFT 16 | ||
117 | #define AUX_XSCALE_MASK 0xFFF | ||
118 | #define AUX_YSCALE_SHIFT 0 | ||
119 | #define AUX_YSCALE_MASK 0xFFF | ||
120 | |||
121 | /* root clks */ | ||
122 | /* 32 KHz oscillator clock */ | ||
123 | static struct clk osc_32k_clk = { | ||
124 | .flags = ALWAYS_ENABLED, | ||
125 | .rate = 32000, | ||
126 | }; | ||
127 | |||
128 | /* 24 MHz oscillator clock */ | ||
129 | static struct clk osc_24m_clk = { | ||
130 | .flags = ALWAYS_ENABLED, | ||
131 | .rate = 24000000, | ||
132 | }; | ||
133 | |||
134 | /* clock derived from 32 KHz osc clk */ | ||
135 | /* rtc clock */ | ||
136 | static struct clk rtc_clk = { | ||
137 | .pclk = &osc_32k_clk, | ||
138 | .en_reg = PERIP1_CLK_ENB, | ||
139 | .en_reg_bit = RTC_CLK_ENB, | ||
140 | .recalc = &follow_parent, | ||
141 | }; | ||
142 | |||
143 | /* clock derived from 24 MHz osc clk */ | ||
144 | /* pll masks structure */ | ||
145 | static struct pll_clk_masks pll1_masks = { | ||
146 | .mode_mask = PLL_MODE_MASK, | ||
147 | .mode_shift = PLL_MODE_SHIFT, | ||
148 | .norm_fdbk_m_mask = PLL_NORM_FDBK_M_MASK, | ||
149 | .norm_fdbk_m_shift = PLL_NORM_FDBK_M_SHIFT, | ||
150 | .dith_fdbk_m_mask = PLL_DITH_FDBK_M_MASK, | ||
151 | .dith_fdbk_m_shift = PLL_DITH_FDBK_M_SHIFT, | ||
152 | .div_p_mask = PLL_DIV_P_MASK, | ||
153 | .div_p_shift = PLL_DIV_P_SHIFT, | ||
154 | .div_n_mask = PLL_DIV_N_MASK, | ||
155 | .div_n_shift = PLL_DIV_N_SHIFT, | ||
156 | }; | ||
157 | |||
158 | /* pll1 configuration structure */ | ||
159 | static struct pll_clk_config pll1_config = { | ||
160 | .mode_reg = PLL1_CTR, | ||
161 | .cfg_reg = PLL1_FRQ, | ||
162 | .masks = &pll1_masks, | ||
163 | }; | ||
164 | |||
165 | /* pll rate configuration table, in ascending order of rates */ | ||
166 | struct pll_rate_tbl pll_rtbl[] = { | ||
167 | {.mode = 0, .m = 0x85, .n = 0x0C, .p = 0x1}, /* 266 MHz */ | ||
168 | {.mode = 0, .m = 0xA6, .n = 0x0C, .p = 0x1}, /* 332 MHz */ | ||
169 | }; | ||
170 | |||
171 | /* PLL1 clock */ | ||
172 | static struct clk pll1_clk = { | ||
173 | .flags = ENABLED_ON_INIT, | ||
174 | .pclk = &osc_24m_clk, | ||
175 | .en_reg = PLL1_CTR, | ||
176 | .en_reg_bit = PLL_ENABLE, | ||
177 | .calc_rate = &pll_calc_rate, | ||
178 | .recalc = &pll_clk_recalc, | ||
179 | .set_rate = &pll_clk_set_rate, | ||
180 | .rate_config = {pll_rtbl, ARRAY_SIZE(pll_rtbl), 1}, | ||
181 | .private_data = &pll1_config, | ||
182 | }; | ||
183 | |||
184 | /* PLL3 48 MHz clock */ | ||
185 | static struct clk pll3_48m_clk = { | ||
186 | .flags = ALWAYS_ENABLED, | ||
187 | .pclk = &osc_24m_clk, | ||
188 | .rate = 48000000, | ||
189 | }; | ||
190 | |||
191 | /* watch dog timer clock */ | ||
192 | static struct clk wdt_clk = { | ||
193 | .flags = ALWAYS_ENABLED, | ||
194 | .pclk = &osc_24m_clk, | ||
195 | .recalc = &follow_parent, | ||
196 | }; | ||
197 | |||
198 | /* clock derived from pll1 clk */ | ||
199 | /* cpu clock */ | ||
200 | static struct clk cpu_clk = { | ||
201 | .flags = ALWAYS_ENABLED, | ||
202 | .pclk = &pll1_clk, | ||
203 | .recalc = &follow_parent, | ||
204 | }; | ||
205 | |||
206 | /* ahb masks structure */ | ||
207 | static struct bus_clk_masks ahb_masks = { | ||
208 | .mask = PLL_HCLK_RATIO_MASK, | ||
209 | .shift = PLL_HCLK_RATIO_SHIFT, | ||
210 | }; | ||
211 | |||
212 | /* ahb configuration structure */ | ||
213 | static struct bus_clk_config ahb_config = { | ||
214 | .reg = CORE_CLK_CFG, | ||
215 | .masks = &ahb_masks, | ||
216 | }; | ||
217 | |||
218 | /* ahb rate configuration table, in ascending order of rates */ | ||
219 | struct bus_rate_tbl bus_rtbl[] = { | ||
220 | {.div = 3}, /* == parent divided by 4 */ | ||
221 | {.div = 2}, /* == parent divided by 3 */ | ||
222 | {.div = 1}, /* == parent divided by 2 */ | ||
223 | {.div = 0}, /* == parent divided by 1 */ | ||
224 | }; | ||
225 | |||
226 | /* ahb clock */ | ||
227 | static struct clk ahb_clk = { | ||
228 | .flags = ALWAYS_ENABLED, | ||
229 | .pclk = &pll1_clk, | ||
230 | .calc_rate = &bus_calc_rate, | ||
231 | .recalc = &bus_clk_recalc, | ||
232 | .set_rate = &bus_clk_set_rate, | ||
233 | .rate_config = {bus_rtbl, ARRAY_SIZE(bus_rtbl), 2}, | ||
234 | .private_data = &ahb_config, | ||
235 | }; | ||
236 | |||
237 | /* auxiliary synthesizers masks */ | ||
238 | static struct aux_clk_masks aux_masks = { | ||
239 | .eq_sel_mask = AUX_EQ_SEL_MASK, | ||
240 | .eq_sel_shift = AUX_EQ_SEL_SHIFT, | ||
241 | .eq1_mask = AUX_EQ1_SEL, | ||
242 | .eq2_mask = AUX_EQ2_SEL, | ||
243 | .xscale_sel_mask = AUX_XSCALE_MASK, | ||
244 | .xscale_sel_shift = AUX_XSCALE_SHIFT, | ||
245 | .yscale_sel_mask = AUX_YSCALE_MASK, | ||
246 | .yscale_sel_shift = AUX_YSCALE_SHIFT, | ||
247 | }; | ||
248 | |||
249 | /* uart synth configurations */ | ||
250 | static struct aux_clk_config uart_synth_config = { | ||
251 | .synth_reg = UART_CLK_SYNT, | ||
252 | .masks = &aux_masks, | ||
253 | }; | ||
254 | |||
255 | /* aux rate configuration table, in ascending order of rates */ | ||
256 | struct aux_rate_tbl aux_rtbl[] = { | ||
257 | /* For PLL1 = 332 MHz */ | ||
258 | {.xscale = 1, .yscale = 8, .eq = 1}, /* 41.5 MHz */ | ||
259 | {.xscale = 1, .yscale = 4, .eq = 1}, /* 83 MHz */ | ||
260 | {.xscale = 1, .yscale = 2, .eq = 1}, /* 166 MHz */ | ||
261 | }; | ||
262 | |||
263 | /* uart synth clock */ | ||
264 | static struct clk uart_synth_clk = { | ||
265 | .en_reg = UART_CLK_SYNT, | ||
266 | .en_reg_bit = AUX_SYNT_ENB, | ||
267 | .pclk = &pll1_clk, | ||
268 | .calc_rate = &aux_calc_rate, | ||
269 | .recalc = &aux_clk_recalc, | ||
270 | .set_rate = &aux_clk_set_rate, | ||
271 | .rate_config = {aux_rtbl, ARRAY_SIZE(aux_rtbl), 1}, | ||
272 | .private_data = &uart_synth_config, | ||
273 | }; | ||
274 | |||
275 | /* uart parents */ | ||
276 | static struct pclk_info uart_pclk_info[] = { | ||
277 | { | ||
278 | .pclk = &uart_synth_clk, | ||
279 | .pclk_val = AUX_CLK_PLL1_VAL, | ||
280 | }, { | ||
281 | .pclk = &pll3_48m_clk, | ||
282 | .pclk_val = AUX_CLK_PLL3_VAL, | ||
283 | }, | ||
284 | }; | ||
285 | |||
286 | /* uart parent select structure */ | ||
287 | static struct pclk_sel uart_pclk_sel = { | ||
288 | .pclk_info = uart_pclk_info, | ||
289 | .pclk_count = ARRAY_SIZE(uart_pclk_info), | ||
290 | .pclk_sel_reg = PERIP_CLK_CFG, | ||
291 | .pclk_sel_mask = UART_CLK_MASK, | ||
292 | }; | ||
293 | |||
294 | /* uart clock */ | ||
295 | static struct clk uart_clk = { | ||
296 | .en_reg = PERIP1_CLK_ENB, | ||
297 | .en_reg_bit = UART_CLK_ENB, | ||
298 | .pclk_sel = &uart_pclk_sel, | ||
299 | .pclk_sel_shift = UART_CLK_SHIFT, | ||
300 | .recalc = &follow_parent, | ||
301 | }; | ||
302 | |||
303 | /* firda configurations */ | ||
304 | static struct aux_clk_config firda_synth_config = { | ||
305 | .synth_reg = FIRDA_CLK_SYNT, | ||
306 | .masks = &aux_masks, | ||
307 | }; | ||
308 | |||
309 | /* firda synth clock */ | ||
310 | static struct clk firda_synth_clk = { | ||
311 | .en_reg = FIRDA_CLK_SYNT, | ||
312 | .en_reg_bit = AUX_SYNT_ENB, | ||
313 | .pclk = &pll1_clk, | ||
314 | .calc_rate = &aux_calc_rate, | ||
315 | .recalc = &aux_clk_recalc, | ||
316 | .set_rate = &aux_clk_set_rate, | ||
317 | .rate_config = {aux_rtbl, ARRAY_SIZE(aux_rtbl), 1}, | ||
318 | .private_data = &firda_synth_config, | ||
319 | }; | ||
320 | |||
321 | /* firda parents */ | ||
322 | static struct pclk_info firda_pclk_info[] = { | ||
323 | { | ||
324 | .pclk = &firda_synth_clk, | ||
325 | .pclk_val = AUX_CLK_PLL1_VAL, | ||
326 | }, { | ||
327 | .pclk = &pll3_48m_clk, | ||
328 | .pclk_val = AUX_CLK_PLL3_VAL, | ||
329 | }, | ||
330 | }; | ||
331 | |||
332 | /* firda parent select structure */ | ||
333 | static struct pclk_sel firda_pclk_sel = { | ||
334 | .pclk_info = firda_pclk_info, | ||
335 | .pclk_count = ARRAY_SIZE(firda_pclk_info), | ||
336 | .pclk_sel_reg = PERIP_CLK_CFG, | ||
337 | .pclk_sel_mask = FIRDA_CLK_MASK, | ||
338 | }; | ||
339 | |||
340 | /* firda clock */ | ||
341 | static struct clk firda_clk = { | ||
342 | .en_reg = PERIP1_CLK_ENB, | ||
343 | .en_reg_bit = FIRDA_CLK_ENB, | ||
344 | .pclk_sel = &firda_pclk_sel, | ||
345 | .pclk_sel_shift = FIRDA_CLK_SHIFT, | ||
346 | .recalc = &follow_parent, | ||
347 | }; | ||
348 | |||
349 | /* gpt synthesizer masks */ | ||
350 | static struct gpt_clk_masks gpt_masks = { | ||
351 | .mscale_sel_mask = GPT_MSCALE_MASK, | ||
352 | .mscale_sel_shift = GPT_MSCALE_SHIFT, | ||
353 | .nscale_sel_mask = GPT_NSCALE_MASK, | ||
354 | .nscale_sel_shift = GPT_NSCALE_SHIFT, | ||
355 | }; | ||
356 | |||
357 | /* gpt rate configuration table, in ascending order of rates */ | ||
358 | struct gpt_rate_tbl gpt_rtbl[] = { | ||
359 | /* For pll1 = 332 MHz */ | ||
360 | {.mscale = 4, .nscale = 0}, /* 41.5 MHz */ | ||
361 | {.mscale = 2, .nscale = 0}, /* 55.3 MHz */ | ||
362 | {.mscale = 1, .nscale = 0}, /* 83 MHz */ | ||
363 | }; | ||
364 | |||
365 | /* gpt0 synth clk config*/ | ||
366 | static struct gpt_clk_config gpt0_synth_config = { | ||
367 | .synth_reg = PRSC1_CLK_CFG, | ||
368 | .masks = &gpt_masks, | ||
369 | }; | ||
370 | |||
371 | /* gpt synth clock */ | ||
372 | static struct clk gpt0_synth_clk = { | ||
373 | .flags = ALWAYS_ENABLED, | ||
374 | .pclk = &pll1_clk, | ||
375 | .calc_rate = &gpt_calc_rate, | ||
376 | .recalc = &gpt_clk_recalc, | ||
377 | .set_rate = &gpt_clk_set_rate, | ||
378 | .rate_config = {gpt_rtbl, ARRAY_SIZE(gpt_rtbl), 2}, | ||
379 | .private_data = &gpt0_synth_config, | ||
380 | }; | ||
381 | |||
382 | /* gpt parents */ | ||
383 | static struct pclk_info gpt0_pclk_info[] = { | ||
384 | { | ||
385 | .pclk = &gpt0_synth_clk, | ||
386 | .pclk_val = AUX_CLK_PLL1_VAL, | ||
387 | }, { | ||
388 | .pclk = &pll3_48m_clk, | ||
389 | .pclk_val = AUX_CLK_PLL3_VAL, | ||
390 | }, | ||
391 | }; | ||
392 | |||
393 | /* gpt parent select structure */ | ||
394 | static struct pclk_sel gpt0_pclk_sel = { | ||
395 | .pclk_info = gpt0_pclk_info, | ||
396 | .pclk_count = ARRAY_SIZE(gpt0_pclk_info), | ||
397 | .pclk_sel_reg = PERIP_CLK_CFG, | ||
398 | .pclk_sel_mask = GPT_CLK_MASK, | ||
399 | }; | ||
400 | |||
401 | /* gpt0 timer clock */ | ||
402 | static struct clk gpt0_clk = { | ||
403 | .flags = ALWAYS_ENABLED, | ||
404 | .pclk_sel = &gpt0_pclk_sel, | ||
405 | .pclk_sel_shift = GPT0_CLK_SHIFT, | ||
406 | .recalc = &follow_parent, | ||
407 | }; | ||
408 | |||
409 | /* gpt1 synth clk configurations */ | ||
410 | static struct gpt_clk_config gpt1_synth_config = { | ||
411 | .synth_reg = PRSC2_CLK_CFG, | ||
412 | .masks = &gpt_masks, | ||
413 | }; | ||
414 | |||
415 | /* gpt1 synth clock */ | ||
416 | static struct clk gpt1_synth_clk = { | ||
417 | .flags = ALWAYS_ENABLED, | ||
418 | .pclk = &pll1_clk, | ||
419 | .calc_rate = &gpt_calc_rate, | ||
420 | .recalc = &gpt_clk_recalc, | ||
421 | .set_rate = &gpt_clk_set_rate, | ||
422 | .rate_config = {gpt_rtbl, ARRAY_SIZE(gpt_rtbl), 2}, | ||
423 | .private_data = &gpt1_synth_config, | ||
424 | }; | ||
425 | |||
426 | static struct pclk_info gpt1_pclk_info[] = { | ||
427 | { | ||
428 | .pclk = &gpt1_synth_clk, | ||
429 | .pclk_val = AUX_CLK_PLL1_VAL, | ||
430 | }, { | ||
431 | .pclk = &pll3_48m_clk, | ||
432 | .pclk_val = AUX_CLK_PLL3_VAL, | ||
433 | }, | ||
434 | }; | ||
435 | |||
436 | /* gpt parent select structure */ | ||
437 | static struct pclk_sel gpt1_pclk_sel = { | ||
438 | .pclk_info = gpt1_pclk_info, | ||
439 | .pclk_count = ARRAY_SIZE(gpt1_pclk_info), | ||
440 | .pclk_sel_reg = PERIP_CLK_CFG, | ||
441 | .pclk_sel_mask = GPT_CLK_MASK, | ||
442 | }; | ||
443 | |||
444 | /* gpt1 timer clock */ | ||
445 | static struct clk gpt1_clk = { | ||
446 | .en_reg = PERIP1_CLK_ENB, | ||
447 | .en_reg_bit = GPT1_CLK_ENB, | ||
448 | .pclk_sel = &gpt1_pclk_sel, | ||
449 | .pclk_sel_shift = GPT1_CLK_SHIFT, | ||
450 | .recalc = &follow_parent, | ||
451 | }; | ||
452 | |||
453 | /* gpt2 synth clk configurations */ | ||
454 | static struct gpt_clk_config gpt2_synth_config = { | ||
455 | .synth_reg = PRSC3_CLK_CFG, | ||
456 | .masks = &gpt_masks, | ||
457 | }; | ||
458 | |||
459 | /* gpt1 synth clock */ | ||
460 | static struct clk gpt2_synth_clk = { | ||
461 | .flags = ALWAYS_ENABLED, | ||
462 | .pclk = &pll1_clk, | ||
463 | .calc_rate = &gpt_calc_rate, | ||
464 | .recalc = &gpt_clk_recalc, | ||
465 | .set_rate = &gpt_clk_set_rate, | ||
466 | .rate_config = {gpt_rtbl, ARRAY_SIZE(gpt_rtbl), 2}, | ||
467 | .private_data = &gpt2_synth_config, | ||
468 | }; | ||
469 | |||
470 | static struct pclk_info gpt2_pclk_info[] = { | ||
471 | { | ||
472 | .pclk = &gpt2_synth_clk, | ||
473 | .pclk_val = AUX_CLK_PLL1_VAL, | ||
474 | }, { | ||
475 | .pclk = &pll3_48m_clk, | ||
476 | .pclk_val = AUX_CLK_PLL3_VAL, | ||
477 | }, | ||
478 | }; | ||
479 | |||
480 | /* gpt parent select structure */ | ||
481 | static struct pclk_sel gpt2_pclk_sel = { | ||
482 | .pclk_info = gpt2_pclk_info, | ||
483 | .pclk_count = ARRAY_SIZE(gpt2_pclk_info), | ||
484 | .pclk_sel_reg = PERIP_CLK_CFG, | ||
485 | .pclk_sel_mask = GPT_CLK_MASK, | ||
486 | }; | ||
487 | |||
488 | /* gpt2 timer clock */ | ||
489 | static struct clk gpt2_clk = { | ||
490 | .en_reg = PERIP1_CLK_ENB, | ||
491 | .en_reg_bit = GPT2_CLK_ENB, | ||
492 | .pclk_sel = &gpt2_pclk_sel, | ||
493 | .pclk_sel_shift = GPT2_CLK_SHIFT, | ||
494 | .recalc = &follow_parent, | ||
495 | }; | ||
496 | |||
497 | /* clock derived from pll3 clk */ | ||
498 | /* usbh clock */ | ||
499 | static struct clk usbh_clk = { | ||
500 | .pclk = &pll3_48m_clk, | ||
501 | .en_reg = PERIP1_CLK_ENB, | ||
502 | .en_reg_bit = USBH_CLK_ENB, | ||
503 | .recalc = &follow_parent, | ||
504 | }; | ||
505 | |||
506 | /* usbd clock */ | ||
507 | static struct clk usbd_clk = { | ||
508 | .pclk = &pll3_48m_clk, | ||
509 | .en_reg = PERIP1_CLK_ENB, | ||
510 | .en_reg_bit = USBD_CLK_ENB, | ||
511 | .recalc = &follow_parent, | ||
512 | }; | ||
513 | |||
514 | /* clock derived from usbh clk */ | ||
515 | /* usbh0 clock */ | ||
516 | static struct clk usbh0_clk = { | ||
517 | .flags = ALWAYS_ENABLED, | ||
518 | .pclk = &usbh_clk, | ||
519 | .recalc = &follow_parent, | ||
520 | }; | ||
521 | |||
522 | /* usbh1 clock */ | ||
523 | static struct clk usbh1_clk = { | ||
524 | .flags = ALWAYS_ENABLED, | ||
525 | .pclk = &usbh_clk, | ||
526 | .recalc = &follow_parent, | ||
527 | }; | ||
528 | |||
529 | /* clock derived from ahb clk */ | ||
530 | /* apb masks structure */ | ||
531 | static struct bus_clk_masks apb_masks = { | ||
532 | .mask = HCLK_PCLK_RATIO_MASK, | ||
533 | .shift = HCLK_PCLK_RATIO_SHIFT, | ||
534 | }; | ||
535 | |||
536 | /* apb configuration structure */ | ||
537 | static struct bus_clk_config apb_config = { | ||
538 | .reg = CORE_CLK_CFG, | ||
539 | .masks = &apb_masks, | ||
540 | }; | ||
541 | |||
542 | /* apb clock */ | ||
543 | static struct clk apb_clk = { | ||
544 | .flags = ALWAYS_ENABLED, | ||
545 | .pclk = &ahb_clk, | ||
546 | .calc_rate = &bus_calc_rate, | ||
547 | .recalc = &bus_clk_recalc, | ||
548 | .set_rate = &bus_clk_set_rate, | ||
549 | .rate_config = {bus_rtbl, ARRAY_SIZE(bus_rtbl), 2}, | ||
550 | .private_data = &apb_config, | ||
551 | }; | ||
552 | |||
553 | /* i2c clock */ | ||
554 | static struct clk i2c_clk = { | ||
555 | .pclk = &ahb_clk, | ||
556 | .en_reg = PERIP1_CLK_ENB, | ||
557 | .en_reg_bit = I2C_CLK_ENB, | ||
558 | .recalc = &follow_parent, | ||
559 | }; | ||
560 | |||
561 | /* dma clock */ | ||
562 | static struct clk dma_clk = { | ||
563 | .pclk = &ahb_clk, | ||
564 | .en_reg = PERIP1_CLK_ENB, | ||
565 | .en_reg_bit = DMA_CLK_ENB, | ||
566 | .recalc = &follow_parent, | ||
567 | }; | ||
568 | |||
569 | /* jpeg clock */ | ||
570 | static struct clk jpeg_clk = { | ||
571 | .pclk = &ahb_clk, | ||
572 | .en_reg = PERIP1_CLK_ENB, | ||
573 | .en_reg_bit = JPEG_CLK_ENB, | ||
574 | .recalc = &follow_parent, | ||
575 | }; | ||
576 | |||
577 | /* gmac clock */ | ||
578 | static struct clk gmac_clk = { | ||
579 | .pclk = &ahb_clk, | ||
580 | .en_reg = PERIP1_CLK_ENB, | ||
581 | .en_reg_bit = GMAC_CLK_ENB, | ||
582 | .recalc = &follow_parent, | ||
583 | }; | ||
584 | |||
585 | /* smi clock */ | ||
586 | static struct clk smi_clk = { | ||
587 | .pclk = &ahb_clk, | ||
588 | .en_reg = PERIP1_CLK_ENB, | ||
589 | .en_reg_bit = SMI_CLK_ENB, | ||
590 | .recalc = &follow_parent, | ||
591 | }; | ||
592 | |||
593 | /* c3 clock */ | ||
594 | static struct clk c3_clk = { | ||
595 | .pclk = &ahb_clk, | ||
596 | .en_reg = PERIP1_CLK_ENB, | ||
597 | .en_reg_bit = C3_CLK_ENB, | ||
598 | .recalc = &follow_parent, | ||
599 | }; | ||
600 | |||
601 | /* clock derived from apb clk */ | ||
602 | /* adc clock */ | ||
603 | static struct clk adc_clk = { | ||
604 | .pclk = &apb_clk, | ||
605 | .en_reg = PERIP1_CLK_ENB, | ||
606 | .en_reg_bit = ADC_CLK_ENB, | ||
607 | .recalc = &follow_parent, | ||
608 | }; | ||
609 | |||
610 | #if defined(CONFIG_MACH_SPEAR310) || defined(CONFIG_MACH_SPEAR320) | ||
611 | /* emi clock */ | ||
612 | static struct clk emi_clk = { | ||
613 | .flags = ALWAYS_ENABLED, | ||
614 | .pclk = &ahb_clk, | ||
615 | .recalc = &follow_parent, | ||
616 | }; | ||
617 | #endif | ||
618 | |||
619 | /* ssp clock */ | ||
620 | static struct clk ssp0_clk = { | ||
621 | .pclk = &apb_clk, | ||
622 | .en_reg = PERIP1_CLK_ENB, | ||
623 | .en_reg_bit = SSP_CLK_ENB, | ||
624 | .recalc = &follow_parent, | ||
625 | }; | ||
626 | |||
627 | /* gpio clock */ | ||
628 | static struct clk gpio_clk = { | ||
629 | .pclk = &apb_clk, | ||
630 | .en_reg = PERIP1_CLK_ENB, | ||
631 | .en_reg_bit = GPIO_CLK_ENB, | ||
632 | .recalc = &follow_parent, | ||
633 | }; | ||
634 | |||
635 | static struct clk dummy_apb_pclk; | ||
636 | |||
637 | #if defined(CONFIG_MACH_SPEAR300) || defined(CONFIG_MACH_SPEAR310) || \ | ||
638 | defined(CONFIG_MACH_SPEAR320) | ||
639 | /* fsmc clock */ | ||
640 | static struct clk fsmc_clk = { | ||
641 | .flags = ALWAYS_ENABLED, | ||
642 | .pclk = &ahb_clk, | ||
643 | .recalc = &follow_parent, | ||
644 | }; | ||
645 | #endif | ||
646 | |||
647 | /* common clocks to spear310 and spear320 */ | ||
648 | #if defined(CONFIG_MACH_SPEAR310) || defined(CONFIG_MACH_SPEAR320) | ||
649 | /* uart1 clock */ | ||
650 | static struct clk uart1_clk = { | ||
651 | .flags = ALWAYS_ENABLED, | ||
652 | .pclk = &apb_clk, | ||
653 | .recalc = &follow_parent, | ||
654 | }; | ||
655 | |||
656 | /* uart2 clock */ | ||
657 | static struct clk uart2_clk = { | ||
658 | .flags = ALWAYS_ENABLED, | ||
659 | .pclk = &apb_clk, | ||
660 | .recalc = &follow_parent, | ||
661 | }; | ||
662 | #endif /* CONFIG_MACH_SPEAR310 || CONFIG_MACH_SPEAR320 */ | ||
663 | |||
664 | /* common clocks to spear300 and spear320 */ | ||
665 | #if defined(CONFIG_MACH_SPEAR300) || defined(CONFIG_MACH_SPEAR320) | ||
666 | /* clcd clock */ | ||
667 | static struct clk clcd_clk = { | ||
668 | .flags = ALWAYS_ENABLED, | ||
669 | .pclk = &pll3_48m_clk, | ||
670 | .recalc = &follow_parent, | ||
671 | }; | ||
672 | |||
673 | /* sdhci clock */ | ||
674 | static struct clk sdhci_clk = { | ||
675 | .flags = ALWAYS_ENABLED, | ||
676 | .pclk = &ahb_clk, | ||
677 | .recalc = &follow_parent, | ||
678 | }; | ||
679 | #endif /* CONFIG_MACH_SPEAR300 || CONFIG_MACH_SPEAR320 */ | ||
680 | |||
681 | /* spear300 machine specific clock structures */ | ||
682 | #ifdef CONFIG_MACH_SPEAR300 | ||
683 | /* gpio1 clock */ | ||
684 | static struct clk gpio1_clk = { | ||
685 | .flags = ALWAYS_ENABLED, | ||
686 | .pclk = &apb_clk, | ||
687 | .recalc = &follow_parent, | ||
688 | }; | ||
689 | |||
690 | /* keyboard clock */ | ||
691 | static struct clk kbd_clk = { | ||
692 | .flags = ALWAYS_ENABLED, | ||
693 | .pclk = &apb_clk, | ||
694 | .recalc = &follow_parent, | ||
695 | }; | ||
696 | |||
697 | #endif | ||
698 | |||
699 | /* spear310 machine specific clock structures */ | ||
700 | #ifdef CONFIG_MACH_SPEAR310 | ||
701 | /* uart3 clock */ | ||
702 | static struct clk uart3_clk = { | ||
703 | .flags = ALWAYS_ENABLED, | ||
704 | .pclk = &apb_clk, | ||
705 | .recalc = &follow_parent, | ||
706 | }; | ||
707 | |||
708 | /* uart4 clock */ | ||
709 | static struct clk uart4_clk = { | ||
710 | .flags = ALWAYS_ENABLED, | ||
711 | .pclk = &apb_clk, | ||
712 | .recalc = &follow_parent, | ||
713 | }; | ||
714 | |||
715 | /* uart5 clock */ | ||
716 | static struct clk uart5_clk = { | ||
717 | .flags = ALWAYS_ENABLED, | ||
718 | .pclk = &apb_clk, | ||
719 | .recalc = &follow_parent, | ||
720 | }; | ||
721 | #endif | ||
722 | |||
723 | /* spear320 machine specific clock structures */ | ||
724 | #ifdef CONFIG_MACH_SPEAR320 | ||
725 | /* can0 clock */ | ||
726 | static struct clk can0_clk = { | ||
727 | .flags = ALWAYS_ENABLED, | ||
728 | .pclk = &apb_clk, | ||
729 | .recalc = &follow_parent, | ||
730 | }; | ||
731 | |||
732 | /* can1 clock */ | ||
733 | static struct clk can1_clk = { | ||
734 | .flags = ALWAYS_ENABLED, | ||
735 | .pclk = &apb_clk, | ||
736 | .recalc = &follow_parent, | ||
737 | }; | ||
738 | |||
739 | /* i2c1 clock */ | ||
740 | static struct clk i2c1_clk = { | ||
741 | .flags = ALWAYS_ENABLED, | ||
742 | .pclk = &ahb_clk, | ||
743 | .recalc = &follow_parent, | ||
744 | }; | ||
745 | |||
746 | /* ssp1 clock */ | ||
747 | static struct clk ssp1_clk = { | ||
748 | .flags = ALWAYS_ENABLED, | ||
749 | .pclk = &apb_clk, | ||
750 | .recalc = &follow_parent, | ||
751 | }; | ||
752 | |||
753 | /* ssp2 clock */ | ||
754 | static struct clk ssp2_clk = { | ||
755 | .flags = ALWAYS_ENABLED, | ||
756 | .pclk = &apb_clk, | ||
757 | .recalc = &follow_parent, | ||
758 | }; | ||
759 | |||
760 | /* pwm clock */ | ||
761 | static struct clk pwm_clk = { | ||
762 | .flags = ALWAYS_ENABLED, | ||
763 | .pclk = &apb_clk, | ||
764 | .recalc = &follow_parent, | ||
765 | }; | ||
766 | #endif | ||
767 | |||
768 | /* array of all spear 3xx clock lookups */ | ||
769 | static struct clk_lookup spear_clk_lookups[] = { | ||
770 | CLKDEV_INIT(NULL, "apb_pclk", &dummy_apb_pclk), | ||
771 | /* root clks */ | ||
772 | CLKDEV_INIT(NULL, "osc_32k_clk", &osc_32k_clk), | ||
773 | CLKDEV_INIT(NULL, "osc_24m_clk", &osc_24m_clk), | ||
774 | /* clock derived from 32 KHz osc clk */ | ||
775 | CLKDEV_INIT("fc900000.rtc", NULL, &rtc_clk), | ||
776 | /* clock derived from 24 MHz osc clk */ | ||
777 | CLKDEV_INIT(NULL, "pll1_clk", &pll1_clk), | ||
778 | CLKDEV_INIT(NULL, "pll3_48m_clk", &pll3_48m_clk), | ||
779 | CLKDEV_INIT("fc880000.wdt", NULL, &wdt_clk), | ||
780 | /* clock derived from pll1 clk */ | ||
781 | CLKDEV_INIT(NULL, "cpu_clk", &cpu_clk), | ||
782 | CLKDEV_INIT(NULL, "ahb_clk", &ahb_clk), | ||
783 | CLKDEV_INIT(NULL, "uart_synth_clk", &uart_synth_clk), | ||
784 | CLKDEV_INIT(NULL, "firda_synth_clk", &firda_synth_clk), | ||
785 | CLKDEV_INIT(NULL, "gpt0_synth_clk", &gpt0_synth_clk), | ||
786 | CLKDEV_INIT(NULL, "gpt1_synth_clk", &gpt1_synth_clk), | ||
787 | CLKDEV_INIT(NULL, "gpt2_synth_clk", &gpt2_synth_clk), | ||
788 | CLKDEV_INIT("d0000000.serial", NULL, &uart_clk), | ||
789 | CLKDEV_INIT("firda", NULL, &firda_clk), | ||
790 | CLKDEV_INIT("gpt0", NULL, &gpt0_clk), | ||
791 | CLKDEV_INIT("gpt1", NULL, &gpt1_clk), | ||
792 | CLKDEV_INIT("gpt2", NULL, &gpt2_clk), | ||
793 | /* clock derived from pll3 clk */ | ||
794 | CLKDEV_INIT("designware_udc", NULL, &usbd_clk), | ||
795 | CLKDEV_INIT(NULL, "usbh_clk", &usbh_clk), | ||
796 | /* clock derived from usbh clk */ | ||
797 | CLKDEV_INIT(NULL, "usbh.0_clk", &usbh0_clk), | ||
798 | CLKDEV_INIT(NULL, "usbh.1_clk", &usbh1_clk), | ||
799 | /* clock derived from ahb clk */ | ||
800 | CLKDEV_INIT(NULL, "apb_clk", &apb_clk), | ||
801 | CLKDEV_INIT("d0180000.i2c", NULL, &i2c_clk), | ||
802 | CLKDEV_INIT("fc400000.dma", NULL, &dma_clk), | ||
803 | CLKDEV_INIT("jpeg", NULL, &jpeg_clk), | ||
804 | CLKDEV_INIT("e0800000.eth", NULL, &gmac_clk), | ||
805 | CLKDEV_INIT("fc000000.flash", NULL, &smi_clk), | ||
806 | CLKDEV_INIT("c3", NULL, &c3_clk), | ||
807 | /* clock derived from apb clk */ | ||
808 | CLKDEV_INIT("adc", NULL, &adc_clk), | ||
809 | CLKDEV_INIT("d0100000.spi", NULL, &ssp0_clk), | ||
810 | CLKDEV_INIT("fc980000.gpio", NULL, &gpio_clk), | ||
811 | }; | ||
812 | |||
813 | /* array of all spear 300 clock lookups */ | ||
814 | #ifdef CONFIG_MACH_SPEAR300 | ||
815 | static struct clk_lookup spear300_clk_lookups[] = { | ||
816 | CLKDEV_INIT("60000000.clcd", NULL, &clcd_clk), | ||
817 | CLKDEV_INIT("94000000.flash", NULL, &fsmc_clk), | ||
818 | CLKDEV_INIT("a9000000.gpio", NULL, &gpio1_clk), | ||
819 | CLKDEV_INIT("a0000000.kbd", NULL, &kbd_clk), | ||
820 | CLKDEV_INIT("70000000.sdhci", NULL, &sdhci_clk), | ||
821 | }; | ||
822 | |||
823 | void __init spear300_clk_init(void) | ||
824 | { | ||
825 | int i; | ||
826 | |||
827 | for (i = 0; i < ARRAY_SIZE(spear_clk_lookups); i++) | ||
828 | clk_register(&spear_clk_lookups[i]); | ||
829 | |||
830 | for (i = 0; i < ARRAY_SIZE(spear300_clk_lookups); i++) | ||
831 | clk_register(&spear300_clk_lookups[i]); | ||
832 | |||
833 | clk_init(); | ||
834 | } | ||
835 | #endif | ||
836 | |||
837 | /* array of all spear 310 clock lookups */ | ||
838 | #ifdef CONFIG_MACH_SPEAR310 | ||
839 | static struct clk_lookup spear310_clk_lookups[] = { | ||
840 | CLKDEV_INIT("44000000.flash", NULL, &fsmc_clk), | ||
841 | CLKDEV_INIT(NULL, "emi", &emi_clk), | ||
842 | CLKDEV_INIT("b2000000.serial", NULL, &uart1_clk), | ||
843 | CLKDEV_INIT("b2080000.serial", NULL, &uart2_clk), | ||
844 | CLKDEV_INIT("b2100000.serial", NULL, &uart3_clk), | ||
845 | CLKDEV_INIT("b2180000.serial", NULL, &uart4_clk), | ||
846 | CLKDEV_INIT("b2200000.serial", NULL, &uart5_clk), | ||
847 | }; | ||
848 | |||
849 | void __init spear310_clk_init(void) | ||
850 | { | ||
851 | int i; | ||
852 | |||
853 | for (i = 0; i < ARRAY_SIZE(spear_clk_lookups); i++) | ||
854 | clk_register(&spear_clk_lookups[i]); | ||
855 | |||
856 | for (i = 0; i < ARRAY_SIZE(spear310_clk_lookups); i++) | ||
857 | clk_register(&spear310_clk_lookups[i]); | ||
858 | |||
859 | clk_init(); | ||
860 | } | ||
861 | #endif | ||
862 | |||
863 | /* array of all spear 320 clock lookups */ | ||
864 | #ifdef CONFIG_MACH_SPEAR320 | ||
865 | static struct clk_lookup spear320_clk_lookups[] = { | ||
866 | CLKDEV_INIT("90000000.clcd", NULL, &clcd_clk), | ||
867 | CLKDEV_INIT("4c000000.flash", NULL, &fsmc_clk), | ||
868 | CLKDEV_INIT("a7000000.i2c", NULL, &i2c1_clk), | ||
869 | CLKDEV_INIT(NULL, "emi", &emi_clk), | ||
870 | CLKDEV_INIT("pwm", NULL, &pwm_clk), | ||
871 | CLKDEV_INIT("70000000.sdhci", NULL, &sdhci_clk), | ||
872 | CLKDEV_INIT("c_can_platform.0", NULL, &can0_clk), | ||
873 | CLKDEV_INIT("c_can_platform.1", NULL, &can1_clk), | ||
874 | CLKDEV_INIT("a5000000.spi", NULL, &ssp1_clk), | ||
875 | CLKDEV_INIT("a6000000.spi", NULL, &ssp2_clk), | ||
876 | CLKDEV_INIT("a3000000.serial", NULL, &uart1_clk), | ||
877 | CLKDEV_INIT("a4000000.serial", NULL, &uart2_clk), | ||
878 | }; | ||
879 | |||
880 | void __init spear320_clk_init(void) | ||
881 | { | ||
882 | int i; | ||
883 | |||
884 | for (i = 0; i < ARRAY_SIZE(spear_clk_lookups); i++) | ||
885 | clk_register(&spear_clk_lookups[i]); | ||
886 | |||
887 | for (i = 0; i < ARRAY_SIZE(spear320_clk_lookups); i++) | ||
888 | clk_register(&spear320_clk_lookups[i]); | ||
889 | |||
890 | clk_init(); | ||
891 | } | ||
892 | #endif | ||
diff --git a/arch/arm/mach-spear3xx/include/mach/generic.h b/arch/arm/mach-spear3xx/include/mach/generic.h index bdb304551caf..4a95b9453c2a 100644 --- a/arch/arm/mach-spear3xx/include/mach/generic.h +++ b/arch/arm/mach-spear3xx/include/mach/generic.h | |||
@@ -27,28 +27,11 @@ extern struct pl022_ssp_controller pl022_plat_data; | |||
27 | extern struct pl08x_platform_data pl080_plat_data; | 27 | extern struct pl08x_platform_data pl080_plat_data; |
28 | 28 | ||
29 | /* Add spear3xx family function declarations here */ | 29 | /* Add spear3xx family function declarations here */ |
30 | void __init spear_setup_timer(resource_size_t base, int irq); | 30 | void __init spear_setup_of_timer(void); |
31 | void __init spear3xx_clk_init(void); | ||
31 | void __init spear3xx_map_io(void); | 32 | void __init spear3xx_map_io(void); |
32 | void __init spear3xx_dt_init_irq(void); | 33 | void __init spear3xx_dt_init_irq(void); |
33 | 34 | ||
34 | void spear_restart(char, const char *); | 35 | void spear_restart(char, const char *); |
35 | 36 | ||
36 | /* spear300 declarations */ | ||
37 | #ifdef CONFIG_MACH_SPEAR300 | ||
38 | void __init spear300_clk_init(void); | ||
39 | |||
40 | #endif /* CONFIG_MACH_SPEAR300 */ | ||
41 | |||
42 | /* spear310 declarations */ | ||
43 | #ifdef CONFIG_MACH_SPEAR310 | ||
44 | void __init spear310_clk_init(void); | ||
45 | |||
46 | #endif /* CONFIG_MACH_SPEAR310 */ | ||
47 | |||
48 | /* spear320 declarations */ | ||
49 | #ifdef CONFIG_MACH_SPEAR320 | ||
50 | void __init spear320_clk_init(void); | ||
51 | |||
52 | #endif /* CONFIG_MACH_SPEAR320 */ | ||
53 | |||
54 | #endif /* __MACH_GENERIC_H */ | 37 | #endif /* __MACH_GENERIC_H */ |
diff --git a/arch/arm/mach-spear3xx/include/mach/irqs.h b/arch/arm/mach-spear3xx/include/mach/irqs.h index 319620a1afb4..51bd62a0254c 100644 --- a/arch/arm/mach-spear3xx/include/mach/irqs.h +++ b/arch/arm/mach-spear3xx/include/mach/irqs.h | |||
@@ -16,7 +16,6 @@ | |||
16 | 16 | ||
17 | /* FIXME: probe all these from DT */ | 17 | /* FIXME: probe all these from DT */ |
18 | #define SPEAR3XX_IRQ_INTRCOMM_RAS_ARM 1 | 18 | #define SPEAR3XX_IRQ_INTRCOMM_RAS_ARM 1 |
19 | #define SPEAR3XX_IRQ_CPU_GPT1_1 2 | ||
20 | #define SPEAR3XX_IRQ_GEN_RAS_1 28 | 19 | #define SPEAR3XX_IRQ_GEN_RAS_1 28 |
21 | #define SPEAR3XX_IRQ_GEN_RAS_2 29 | 20 | #define SPEAR3XX_IRQ_GEN_RAS_2 29 |
22 | #define SPEAR3XX_IRQ_GEN_RAS_3 30 | 21 | #define SPEAR3XX_IRQ_GEN_RAS_3 30 |
diff --git a/arch/arm/mach-spear3xx/include/mach/misc_regs.h b/arch/arm/mach-spear3xx/include/mach/misc_regs.h index e0ab72e61507..18e2ac576f25 100644 --- a/arch/arm/mach-spear3xx/include/mach/misc_regs.h +++ b/arch/arm/mach-spear3xx/include/mach/misc_regs.h | |||
@@ -14,6 +14,8 @@ | |||
14 | #ifndef __MACH_MISC_REGS_H | 14 | #ifndef __MACH_MISC_REGS_H |
15 | #define __MACH_MISC_REGS_H | 15 | #define __MACH_MISC_REGS_H |
16 | 16 | ||
17 | #include <mach/spear.h> | ||
18 | |||
17 | #define MISC_BASE IOMEM(VA_SPEAR3XX_ICM3_MISC_REG_BASE) | 19 | #define MISC_BASE IOMEM(VA_SPEAR3XX_ICM3_MISC_REG_BASE) |
18 | #define DMA_CHN_CFG (MISC_BASE + 0x0A0) | 20 | #define DMA_CHN_CFG (MISC_BASE + 0x0A0) |
19 | 21 | ||
diff --git a/arch/arm/mach-spear3xx/include/mach/spear.h b/arch/arm/mach-spear3xx/include/mach/spear.h index 6d4dadc67633..51eb953148a9 100644 --- a/arch/arm/mach-spear3xx/include/mach/spear.h +++ b/arch/arm/mach-spear3xx/include/mach/spear.h | |||
@@ -26,7 +26,6 @@ | |||
26 | /* ML1 - Multi Layer CPU Subsystem */ | 26 | /* ML1 - Multi Layer CPU Subsystem */ |
27 | #define SPEAR3XX_ICM3_ML1_2_BASE UL(0xF0000000) | 27 | #define SPEAR3XX_ICM3_ML1_2_BASE UL(0xF0000000) |
28 | #define VA_SPEAR6XX_ML_CPU_BASE UL(0xF0000000) | 28 | #define VA_SPEAR6XX_ML_CPU_BASE UL(0xF0000000) |
29 | #define SPEAR3XX_CPU_TMR_BASE UL(0xF0000000) | ||
30 | 29 | ||
31 | /* ICM3 - Basic Subsystem */ | 30 | /* ICM3 - Basic Subsystem */ |
32 | #define SPEAR3XX_ICM3_SMI_CTRL_BASE UL(0xFC000000) | 31 | #define SPEAR3XX_ICM3_SMI_CTRL_BASE UL(0xFC000000) |
@@ -45,4 +44,17 @@ | |||
45 | #define SPEAR_SYS_CTRL_BASE SPEAR3XX_ICM3_SYS_CTRL_BASE | 44 | #define SPEAR_SYS_CTRL_BASE SPEAR3XX_ICM3_SYS_CTRL_BASE |
46 | #define VA_SPEAR_SYS_CTRL_BASE VA_SPEAR3XX_ICM3_SYS_CTRL_BASE | 45 | #define VA_SPEAR_SYS_CTRL_BASE VA_SPEAR3XX_ICM3_SYS_CTRL_BASE |
47 | 46 | ||
47 | /* SPEAr320 Macros */ | ||
48 | #define SPEAR320_SOC_CONFIG_BASE UL(0xB3000000) | ||
49 | #define VA_SPEAR320_SOC_CONFIG_BASE UL(0xFE000000) | ||
50 | #define SPEAR320_CONTROL_REG IOMEM(VA_SPEAR320_SOC_CONFIG_BASE) | ||
51 | #define SPEAR320_EXT_CTRL_REG IOMEM(VA_SPEAR320_SOC_CONFIG_BASE + 0x0018) | ||
52 | #define SPEAR320_UARTX_PCLK_MASK 0x1 | ||
53 | #define SPEAR320_UART2_PCLK_SHIFT 8 | ||
54 | #define SPEAR320_UART3_PCLK_SHIFT 9 | ||
55 | #define SPEAR320_UART4_PCLK_SHIFT 10 | ||
56 | #define SPEAR320_UART5_PCLK_SHIFT 11 | ||
57 | #define SPEAR320_UART6_PCLK_SHIFT 12 | ||
58 | #define SPEAR320_RS485_PCLK_SHIFT 13 | ||
59 | |||
48 | #endif /* __MACH_SPEAR3XX_H */ | 60 | #endif /* __MACH_SPEAR3XX_H */ |
diff --git a/arch/arm/mach-spear3xx/spear300.c b/arch/arm/mach-spear3xx/spear300.c index f75fe25a620c..f74a05bdb829 100644 --- a/arch/arm/mach-spear3xx/spear300.c +++ b/arch/arm/mach-spear3xx/spear300.c | |||
@@ -337,7 +337,6 @@ static const char * const spear300_dt_board_compat[] = { | |||
337 | static void __init spear300_map_io(void) | 337 | static void __init spear300_map_io(void) |
338 | { | 338 | { |
339 | spear3xx_map_io(); | 339 | spear3xx_map_io(); |
340 | spear300_clk_init(); | ||
341 | } | 340 | } |
342 | 341 | ||
343 | DT_MACHINE_START(SPEAR300_DT, "ST SPEAr300 SoC with Flattened Device Tree") | 342 | DT_MACHINE_START(SPEAR300_DT, "ST SPEAr300 SoC with Flattened Device Tree") |
diff --git a/arch/arm/mach-spear3xx/spear310.c b/arch/arm/mach-spear3xx/spear310.c index f0842a58dc02..84dfb0900747 100644 --- a/arch/arm/mach-spear3xx/spear310.c +++ b/arch/arm/mach-spear3xx/spear310.c | |||
@@ -478,7 +478,6 @@ static const char * const spear310_dt_board_compat[] = { | |||
478 | static void __init spear310_map_io(void) | 478 | static void __init spear310_map_io(void) |
479 | { | 479 | { |
480 | spear3xx_map_io(); | 480 | spear3xx_map_io(); |
481 | spear310_clk_init(); | ||
482 | } | 481 | } |
483 | 482 | ||
484 | DT_MACHINE_START(SPEAR310_DT, "ST SPEAr310 SoC with Flattened Device Tree") | 483 | DT_MACHINE_START(SPEAR310_DT, "ST SPEAr310 SoC with Flattened Device Tree") |
diff --git a/arch/arm/mach-spear3xx/spear320.c b/arch/arm/mach-spear3xx/spear320.c index e8caeef50a5c..a88fa841d29d 100644 --- a/arch/arm/mach-spear3xx/spear320.c +++ b/arch/arm/mach-spear3xx/spear320.c | |||
@@ -27,7 +27,6 @@ | |||
27 | #define SPEAR320_UART2_BASE UL(0xA4000000) | 27 | #define SPEAR320_UART2_BASE UL(0xA4000000) |
28 | #define SPEAR320_SSP0_BASE UL(0xA5000000) | 28 | #define SPEAR320_SSP0_BASE UL(0xA5000000) |
29 | #define SPEAR320_SSP1_BASE UL(0xA6000000) | 29 | #define SPEAR320_SSP1_BASE UL(0xA6000000) |
30 | #define SPEAR320_SOC_CONFIG_BASE UL(0xB3000000) | ||
31 | 30 | ||
32 | /* Interrupt registers offsets and masks */ | 31 | /* Interrupt registers offsets and masks */ |
33 | #define SPEAR320_INT_STS_MASK_REG 0x04 | 32 | #define SPEAR320_INT_STS_MASK_REG 0x04 |
@@ -481,10 +480,19 @@ static const char * const spear320_dt_board_compat[] = { | |||
481 | NULL, | 480 | NULL, |
482 | }; | 481 | }; |
483 | 482 | ||
483 | struct map_desc spear320_io_desc[] __initdata = { | ||
484 | { | ||
485 | .virtual = VA_SPEAR320_SOC_CONFIG_BASE, | ||
486 | .pfn = __phys_to_pfn(SPEAR320_SOC_CONFIG_BASE), | ||
487 | .length = SZ_16M, | ||
488 | .type = MT_DEVICE | ||
489 | }, | ||
490 | }; | ||
491 | |||
484 | static void __init spear320_map_io(void) | 492 | static void __init spear320_map_io(void) |
485 | { | 493 | { |
494 | iotable_init(spear320_io_desc, ARRAY_SIZE(spear320_io_desc)); | ||
486 | spear3xx_map_io(); | 495 | spear3xx_map_io(); |
487 | spear320_clk_init(); | ||
488 | } | 496 | } |
489 | 497 | ||
490 | DT_MACHINE_START(SPEAR320_DT, "ST SPEAr320 SoC with Flattened Device Tree") | 498 | DT_MACHINE_START(SPEAR320_DT, "ST SPEAr320 SoC with Flattened Device Tree") |
diff --git a/arch/arm/mach-spear3xx/spear3xx.c b/arch/arm/mach-spear3xx/spear3xx.c index 826ac20ef1e7..f22419ed74a8 100644 --- a/arch/arm/mach-spear3xx/spear3xx.c +++ b/arch/arm/mach-spear3xx/spear3xx.c | |||
@@ -90,6 +90,8 @@ static void __init spear3xx_timer_init(void) | |||
90 | char pclk_name[] = "pll3_48m_clk"; | 90 | char pclk_name[] = "pll3_48m_clk"; |
91 | struct clk *gpt_clk, *pclk; | 91 | struct clk *gpt_clk, *pclk; |
92 | 92 | ||
93 | spear3xx_clk_init(); | ||
94 | |||
93 | /* get the system timer clock */ | 95 | /* get the system timer clock */ |
94 | gpt_clk = clk_get_sys("gpt0", NULL); | 96 | gpt_clk = clk_get_sys("gpt0", NULL); |
95 | if (IS_ERR(gpt_clk)) { | 97 | if (IS_ERR(gpt_clk)) { |
@@ -109,7 +111,7 @@ static void __init spear3xx_timer_init(void) | |||
109 | clk_put(gpt_clk); | 111 | clk_put(gpt_clk); |
110 | clk_put(pclk); | 112 | clk_put(pclk); |
111 | 113 | ||
112 | spear_setup_timer(SPEAR3XX_CPU_TMR_BASE, SPEAR3XX_IRQ_CPU_GPT1_1); | 114 | spear_setup_of_timer(); |
113 | } | 115 | } |
114 | 116 | ||
115 | struct sys_timer spear3xx_timer = { | 117 | struct sys_timer spear3xx_timer = { |
diff --git a/arch/arm/mach-spear6xx/Makefile b/arch/arm/mach-spear6xx/Makefile index 76e5750552fc..898831d93f37 100644 --- a/arch/arm/mach-spear6xx/Makefile +++ b/arch/arm/mach-spear6xx/Makefile | |||
@@ -3,4 +3,4 @@ | |||
3 | # | 3 | # |
4 | 4 | ||
5 | # common files | 5 | # common files |
6 | obj-y += clock.o spear6xx.o | 6 | obj-y += spear6xx.o |
diff --git a/arch/arm/mach-spear6xx/clock.c b/arch/arm/mach-spear6xx/clock.c deleted file mode 100644 index bef77d43db87..000000000000 --- a/arch/arm/mach-spear6xx/clock.c +++ /dev/null | |||
@@ -1,789 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-spear6xx/clock.c | ||
3 | * | ||
4 | * SPEAr6xx machines clock framework source file | ||
5 | * | ||
6 | * Copyright (C) 2009 ST Microelectronics | ||
7 | * Viresh Kumar<viresh.kumar@st.com> | ||
8 | * | ||
9 | * This file is licensed under the terms of the GNU General Public | ||
10 | * License version 2. This program is licensed "as is" without any | ||
11 | * warranty of any kind, whether express or implied. | ||
12 | */ | ||
13 | |||
14 | #include <linux/init.h> | ||
15 | #include <linux/io.h> | ||
16 | #include <linux/kernel.h> | ||
17 | #include <plat/clock.h> | ||
18 | #include <mach/misc_regs.h> | ||
19 | #include <mach/spear.h> | ||
20 | |||
21 | #define PLL1_CTR (MISC_BASE + 0x008) | ||
22 | #define PLL1_FRQ (MISC_BASE + 0x00C) | ||
23 | #define PLL1_MOD (MISC_BASE + 0x010) | ||
24 | #define PLL2_CTR (MISC_BASE + 0x014) | ||
25 | /* PLL_CTR register masks */ | ||
26 | #define PLL_ENABLE 2 | ||
27 | #define PLL_MODE_SHIFT 4 | ||
28 | #define PLL_MODE_MASK 0x3 | ||
29 | #define PLL_MODE_NORMAL 0 | ||
30 | #define PLL_MODE_FRACTION 1 | ||
31 | #define PLL_MODE_DITH_DSB 2 | ||
32 | #define PLL_MODE_DITH_SSB 3 | ||
33 | |||
34 | #define PLL2_FRQ (MISC_BASE + 0x018) | ||
35 | /* PLL FRQ register masks */ | ||
36 | #define PLL_DIV_N_SHIFT 0 | ||
37 | #define PLL_DIV_N_MASK 0xFF | ||
38 | #define PLL_DIV_P_SHIFT 8 | ||
39 | #define PLL_DIV_P_MASK 0x7 | ||
40 | #define PLL_NORM_FDBK_M_SHIFT 24 | ||
41 | #define PLL_NORM_FDBK_M_MASK 0xFF | ||
42 | #define PLL_DITH_FDBK_M_SHIFT 16 | ||
43 | #define PLL_DITH_FDBK_M_MASK 0xFFFF | ||
44 | |||
45 | #define PLL2_MOD (MISC_BASE + 0x01C) | ||
46 | #define PLL_CLK_CFG (MISC_BASE + 0x020) | ||
47 | #define CORE_CLK_CFG (MISC_BASE + 0x024) | ||
48 | /* CORE CLK CFG register masks */ | ||
49 | #define PLL_HCLK_RATIO_SHIFT 10 | ||
50 | #define PLL_HCLK_RATIO_MASK 0x3 | ||
51 | #define HCLK_PCLK_RATIO_SHIFT 8 | ||
52 | #define HCLK_PCLK_RATIO_MASK 0x3 | ||
53 | |||
54 | #define PERIP_CLK_CFG (MISC_BASE + 0x028) | ||
55 | /* PERIP_CLK_CFG register masks */ | ||
56 | #define CLCD_CLK_SHIFT 2 | ||
57 | #define CLCD_CLK_MASK 0x3 | ||
58 | #define UART_CLK_SHIFT 4 | ||
59 | #define UART_CLK_MASK 0x1 | ||
60 | #define FIRDA_CLK_SHIFT 5 | ||
61 | #define FIRDA_CLK_MASK 0x3 | ||
62 | #define GPT0_CLK_SHIFT 8 | ||
63 | #define GPT1_CLK_SHIFT 10 | ||
64 | #define GPT2_CLK_SHIFT 11 | ||
65 | #define GPT3_CLK_SHIFT 12 | ||
66 | #define GPT_CLK_MASK 0x1 | ||
67 | #define AUX_CLK_PLL3_VAL 0 | ||
68 | #define AUX_CLK_PLL1_VAL 1 | ||
69 | |||
70 | #define PERIP1_CLK_ENB (MISC_BASE + 0x02C) | ||
71 | /* PERIP1_CLK_ENB register masks */ | ||
72 | #define UART0_CLK_ENB 3 | ||
73 | #define UART1_CLK_ENB 4 | ||
74 | #define SSP0_CLK_ENB 5 | ||
75 | #define SSP1_CLK_ENB 6 | ||
76 | #define I2C_CLK_ENB 7 | ||
77 | #define JPEG_CLK_ENB 8 | ||
78 | #define FSMC_CLK_ENB 9 | ||
79 | #define FIRDA_CLK_ENB 10 | ||
80 | #define GPT2_CLK_ENB 11 | ||
81 | #define GPT3_CLK_ENB 12 | ||
82 | #define GPIO2_CLK_ENB 13 | ||
83 | #define SSP2_CLK_ENB 14 | ||
84 | #define ADC_CLK_ENB 15 | ||
85 | #define GPT1_CLK_ENB 11 | ||
86 | #define RTC_CLK_ENB 17 | ||
87 | #define GPIO1_CLK_ENB 18 | ||
88 | #define DMA_CLK_ENB 19 | ||
89 | #define SMI_CLK_ENB 21 | ||
90 | #define CLCD_CLK_ENB 22 | ||
91 | #define GMAC_CLK_ENB 23 | ||
92 | #define USBD_CLK_ENB 24 | ||
93 | #define USBH0_CLK_ENB 25 | ||
94 | #define USBH1_CLK_ENB 26 | ||
95 | |||
96 | #define PRSC1_CLK_CFG (MISC_BASE + 0x044) | ||
97 | #define PRSC2_CLK_CFG (MISC_BASE + 0x048) | ||
98 | #define PRSC3_CLK_CFG (MISC_BASE + 0x04C) | ||
99 | /* gpt synthesizer register masks */ | ||
100 | #define GPT_MSCALE_SHIFT 0 | ||
101 | #define GPT_MSCALE_MASK 0xFFF | ||
102 | #define GPT_NSCALE_SHIFT 12 | ||
103 | #define GPT_NSCALE_MASK 0xF | ||
104 | |||
105 | #define AMEM_CLK_CFG (MISC_BASE + 0x050) | ||
106 | #define EXPI_CLK_CFG (MISC_BASE + 0x054) | ||
107 | #define CLCD_CLK_SYNT (MISC_BASE + 0x05C) | ||
108 | #define FIRDA_CLK_SYNT (MISC_BASE + 0x060) | ||
109 | #define UART_CLK_SYNT (MISC_BASE + 0x064) | ||
110 | #define GMAC_CLK_SYNT (MISC_BASE + 0x068) | ||
111 | #define RAS1_CLK_SYNT (MISC_BASE + 0x06C) | ||
112 | #define RAS2_CLK_SYNT (MISC_BASE + 0x070) | ||
113 | #define RAS3_CLK_SYNT (MISC_BASE + 0x074) | ||
114 | #define RAS4_CLK_SYNT (MISC_BASE + 0x078) | ||
115 | /* aux clk synthesiser register masks for irda to ras4 */ | ||
116 | #define AUX_SYNT_ENB 31 | ||
117 | #define AUX_EQ_SEL_SHIFT 30 | ||
118 | #define AUX_EQ_SEL_MASK 1 | ||
119 | #define AUX_EQ1_SEL 0 | ||
120 | #define AUX_EQ2_SEL 1 | ||
121 | #define AUX_XSCALE_SHIFT 16 | ||
122 | #define AUX_XSCALE_MASK 0xFFF | ||
123 | #define AUX_YSCALE_SHIFT 0 | ||
124 | #define AUX_YSCALE_MASK 0xFFF | ||
125 | |||
126 | /* root clks */ | ||
127 | /* 32 KHz oscillator clock */ | ||
128 | static struct clk osc_32k_clk = { | ||
129 | .flags = ALWAYS_ENABLED, | ||
130 | .rate = 32000, | ||
131 | }; | ||
132 | |||
133 | /* 30 MHz oscillator clock */ | ||
134 | static struct clk osc_30m_clk = { | ||
135 | .flags = ALWAYS_ENABLED, | ||
136 | .rate = 30000000, | ||
137 | }; | ||
138 | |||
139 | /* clock derived from 32 KHz osc clk */ | ||
140 | /* rtc clock */ | ||
141 | static struct clk rtc_clk = { | ||
142 | .pclk = &osc_32k_clk, | ||
143 | .en_reg = PERIP1_CLK_ENB, | ||
144 | .en_reg_bit = RTC_CLK_ENB, | ||
145 | .recalc = &follow_parent, | ||
146 | }; | ||
147 | |||
148 | /* clock derived from 30 MHz osc clk */ | ||
149 | /* pll masks structure */ | ||
150 | static struct pll_clk_masks pll1_masks = { | ||
151 | .mode_mask = PLL_MODE_MASK, | ||
152 | .mode_shift = PLL_MODE_SHIFT, | ||
153 | .norm_fdbk_m_mask = PLL_NORM_FDBK_M_MASK, | ||
154 | .norm_fdbk_m_shift = PLL_NORM_FDBK_M_SHIFT, | ||
155 | .dith_fdbk_m_mask = PLL_DITH_FDBK_M_MASK, | ||
156 | .dith_fdbk_m_shift = PLL_DITH_FDBK_M_SHIFT, | ||
157 | .div_p_mask = PLL_DIV_P_MASK, | ||
158 | .div_p_shift = PLL_DIV_P_SHIFT, | ||
159 | .div_n_mask = PLL_DIV_N_MASK, | ||
160 | .div_n_shift = PLL_DIV_N_SHIFT, | ||
161 | }; | ||
162 | |||
163 | /* pll1 configuration structure */ | ||
164 | static struct pll_clk_config pll1_config = { | ||
165 | .mode_reg = PLL1_CTR, | ||
166 | .cfg_reg = PLL1_FRQ, | ||
167 | .masks = &pll1_masks, | ||
168 | }; | ||
169 | |||
170 | /* pll rate configuration table, in ascending order of rates */ | ||
171 | struct pll_rate_tbl pll_rtbl[] = { | ||
172 | {.mode = 0, .m = 0x85, .n = 0x0C, .p = 0x1}, /* 266 MHz */ | ||
173 | {.mode = 0, .m = 0xA6, .n = 0x0C, .p = 0x1}, /* 332 MHz */ | ||
174 | }; | ||
175 | |||
176 | /* PLL1 clock */ | ||
177 | static struct clk pll1_clk = { | ||
178 | .flags = ENABLED_ON_INIT, | ||
179 | .pclk = &osc_30m_clk, | ||
180 | .en_reg = PLL1_CTR, | ||
181 | .en_reg_bit = PLL_ENABLE, | ||
182 | .calc_rate = &pll_calc_rate, | ||
183 | .recalc = &pll_clk_recalc, | ||
184 | .set_rate = &pll_clk_set_rate, | ||
185 | .rate_config = {pll_rtbl, ARRAY_SIZE(pll_rtbl), 1}, | ||
186 | .private_data = &pll1_config, | ||
187 | }; | ||
188 | |||
189 | /* PLL3 48 MHz clock */ | ||
190 | static struct clk pll3_48m_clk = { | ||
191 | .flags = ALWAYS_ENABLED, | ||
192 | .pclk = &osc_30m_clk, | ||
193 | .rate = 48000000, | ||
194 | }; | ||
195 | |||
196 | /* watch dog timer clock */ | ||
197 | static struct clk wdt_clk = { | ||
198 | .flags = ALWAYS_ENABLED, | ||
199 | .pclk = &osc_30m_clk, | ||
200 | .recalc = &follow_parent, | ||
201 | }; | ||
202 | |||
203 | /* clock derived from pll1 clk */ | ||
204 | /* cpu clock */ | ||
205 | static struct clk cpu_clk = { | ||
206 | .flags = ALWAYS_ENABLED, | ||
207 | .pclk = &pll1_clk, | ||
208 | .recalc = &follow_parent, | ||
209 | }; | ||
210 | |||
211 | /* ahb masks structure */ | ||
212 | static struct bus_clk_masks ahb_masks = { | ||
213 | .mask = PLL_HCLK_RATIO_MASK, | ||
214 | .shift = PLL_HCLK_RATIO_SHIFT, | ||
215 | }; | ||
216 | |||
217 | /* ahb configuration structure */ | ||
218 | static struct bus_clk_config ahb_config = { | ||
219 | .reg = CORE_CLK_CFG, | ||
220 | .masks = &ahb_masks, | ||
221 | }; | ||
222 | |||
223 | /* ahb rate configuration table, in ascending order of rates */ | ||
224 | struct bus_rate_tbl bus_rtbl[] = { | ||
225 | {.div = 3}, /* == parent divided by 4 */ | ||
226 | {.div = 2}, /* == parent divided by 3 */ | ||
227 | {.div = 1}, /* == parent divided by 2 */ | ||
228 | {.div = 0}, /* == parent divided by 1 */ | ||
229 | }; | ||
230 | |||
231 | /* ahb clock */ | ||
232 | static struct clk ahb_clk = { | ||
233 | .flags = ALWAYS_ENABLED, | ||
234 | .pclk = &pll1_clk, | ||
235 | .calc_rate = &bus_calc_rate, | ||
236 | .recalc = &bus_clk_recalc, | ||
237 | .set_rate = &bus_clk_set_rate, | ||
238 | .rate_config = {bus_rtbl, ARRAY_SIZE(bus_rtbl), 2}, | ||
239 | .private_data = &ahb_config, | ||
240 | }; | ||
241 | |||
242 | /* auxiliary synthesizers masks */ | ||
243 | static struct aux_clk_masks aux_masks = { | ||
244 | .eq_sel_mask = AUX_EQ_SEL_MASK, | ||
245 | .eq_sel_shift = AUX_EQ_SEL_SHIFT, | ||
246 | .eq1_mask = AUX_EQ1_SEL, | ||
247 | .eq2_mask = AUX_EQ2_SEL, | ||
248 | .xscale_sel_mask = AUX_XSCALE_MASK, | ||
249 | .xscale_sel_shift = AUX_XSCALE_SHIFT, | ||
250 | .yscale_sel_mask = AUX_YSCALE_MASK, | ||
251 | .yscale_sel_shift = AUX_YSCALE_SHIFT, | ||
252 | }; | ||
253 | |||
254 | /* uart configurations */ | ||
255 | static struct aux_clk_config uart_synth_config = { | ||
256 | .synth_reg = UART_CLK_SYNT, | ||
257 | .masks = &aux_masks, | ||
258 | }; | ||
259 | |||
260 | /* aux rate configuration table, in ascending order of rates */ | ||
261 | struct aux_rate_tbl aux_rtbl[] = { | ||
262 | /* For PLL1 = 332 MHz */ | ||
263 | {.xscale = 1, .yscale = 8, .eq = 1}, /* 41.5 MHz */ | ||
264 | {.xscale = 1, .yscale = 4, .eq = 1}, /* 83 MHz */ | ||
265 | {.xscale = 1, .yscale = 2, .eq = 1}, /* 166 MHz */ | ||
266 | }; | ||
267 | |||
268 | /* uart synth clock */ | ||
269 | static struct clk uart_synth_clk = { | ||
270 | .en_reg = UART_CLK_SYNT, | ||
271 | .en_reg_bit = AUX_SYNT_ENB, | ||
272 | .pclk = &pll1_clk, | ||
273 | .calc_rate = &aux_calc_rate, | ||
274 | .recalc = &aux_clk_recalc, | ||
275 | .set_rate = &aux_clk_set_rate, | ||
276 | .rate_config = {aux_rtbl, ARRAY_SIZE(aux_rtbl), 2}, | ||
277 | .private_data = &uart_synth_config, | ||
278 | }; | ||
279 | |||
280 | /* uart parents */ | ||
281 | static struct pclk_info uart_pclk_info[] = { | ||
282 | { | ||
283 | .pclk = &uart_synth_clk, | ||
284 | .pclk_val = AUX_CLK_PLL1_VAL, | ||
285 | }, { | ||
286 | .pclk = &pll3_48m_clk, | ||
287 | .pclk_val = AUX_CLK_PLL3_VAL, | ||
288 | }, | ||
289 | }; | ||
290 | |||
291 | /* uart parent select structure */ | ||
292 | static struct pclk_sel uart_pclk_sel = { | ||
293 | .pclk_info = uart_pclk_info, | ||
294 | .pclk_count = ARRAY_SIZE(uart_pclk_info), | ||
295 | .pclk_sel_reg = PERIP_CLK_CFG, | ||
296 | .pclk_sel_mask = UART_CLK_MASK, | ||
297 | }; | ||
298 | |||
299 | /* uart0 clock */ | ||
300 | static struct clk uart0_clk = { | ||
301 | .en_reg = PERIP1_CLK_ENB, | ||
302 | .en_reg_bit = UART0_CLK_ENB, | ||
303 | .pclk_sel = &uart_pclk_sel, | ||
304 | .pclk_sel_shift = UART_CLK_SHIFT, | ||
305 | .recalc = &follow_parent, | ||
306 | }; | ||
307 | |||
308 | /* uart1 clock */ | ||
309 | static struct clk uart1_clk = { | ||
310 | .en_reg = PERIP1_CLK_ENB, | ||
311 | .en_reg_bit = UART1_CLK_ENB, | ||
312 | .pclk_sel = &uart_pclk_sel, | ||
313 | .pclk_sel_shift = UART_CLK_SHIFT, | ||
314 | .recalc = &follow_parent, | ||
315 | }; | ||
316 | |||
317 | /* firda configurations */ | ||
318 | static struct aux_clk_config firda_synth_config = { | ||
319 | .synth_reg = FIRDA_CLK_SYNT, | ||
320 | .masks = &aux_masks, | ||
321 | }; | ||
322 | |||
323 | /* firda synth clock */ | ||
324 | static struct clk firda_synth_clk = { | ||
325 | .en_reg = FIRDA_CLK_SYNT, | ||
326 | .en_reg_bit = AUX_SYNT_ENB, | ||
327 | .pclk = &pll1_clk, | ||
328 | .calc_rate = &aux_calc_rate, | ||
329 | .recalc = &aux_clk_recalc, | ||
330 | .set_rate = &aux_clk_set_rate, | ||
331 | .rate_config = {aux_rtbl, ARRAY_SIZE(aux_rtbl), 2}, | ||
332 | .private_data = &firda_synth_config, | ||
333 | }; | ||
334 | |||
335 | /* firda parents */ | ||
336 | static struct pclk_info firda_pclk_info[] = { | ||
337 | { | ||
338 | .pclk = &firda_synth_clk, | ||
339 | .pclk_val = AUX_CLK_PLL1_VAL, | ||
340 | }, { | ||
341 | .pclk = &pll3_48m_clk, | ||
342 | .pclk_val = AUX_CLK_PLL3_VAL, | ||
343 | }, | ||
344 | }; | ||
345 | |||
346 | /* firda parent select structure */ | ||
347 | static struct pclk_sel firda_pclk_sel = { | ||
348 | .pclk_info = firda_pclk_info, | ||
349 | .pclk_count = ARRAY_SIZE(firda_pclk_info), | ||
350 | .pclk_sel_reg = PERIP_CLK_CFG, | ||
351 | .pclk_sel_mask = FIRDA_CLK_MASK, | ||
352 | }; | ||
353 | |||
354 | /* firda clock */ | ||
355 | static struct clk firda_clk = { | ||
356 | .en_reg = PERIP1_CLK_ENB, | ||
357 | .en_reg_bit = FIRDA_CLK_ENB, | ||
358 | .pclk_sel = &firda_pclk_sel, | ||
359 | .pclk_sel_shift = FIRDA_CLK_SHIFT, | ||
360 | .recalc = &follow_parent, | ||
361 | }; | ||
362 | |||
363 | /* clcd configurations */ | ||
364 | static struct aux_clk_config clcd_synth_config = { | ||
365 | .synth_reg = CLCD_CLK_SYNT, | ||
366 | .masks = &aux_masks, | ||
367 | }; | ||
368 | |||
369 | /* firda synth clock */ | ||
370 | static struct clk clcd_synth_clk = { | ||
371 | .en_reg = CLCD_CLK_SYNT, | ||
372 | .en_reg_bit = AUX_SYNT_ENB, | ||
373 | .pclk = &pll1_clk, | ||
374 | .calc_rate = &aux_calc_rate, | ||
375 | .recalc = &aux_clk_recalc, | ||
376 | .set_rate = &aux_clk_set_rate, | ||
377 | .rate_config = {aux_rtbl, ARRAY_SIZE(aux_rtbl), 2}, | ||
378 | .private_data = &clcd_synth_config, | ||
379 | }; | ||
380 | |||
381 | /* clcd parents */ | ||
382 | static struct pclk_info clcd_pclk_info[] = { | ||
383 | { | ||
384 | .pclk = &clcd_synth_clk, | ||
385 | .pclk_val = AUX_CLK_PLL1_VAL, | ||
386 | }, { | ||
387 | .pclk = &pll3_48m_clk, | ||
388 | .pclk_val = AUX_CLK_PLL3_VAL, | ||
389 | }, | ||
390 | }; | ||
391 | |||
392 | /* clcd parent select structure */ | ||
393 | static struct pclk_sel clcd_pclk_sel = { | ||
394 | .pclk_info = clcd_pclk_info, | ||
395 | .pclk_count = ARRAY_SIZE(clcd_pclk_info), | ||
396 | .pclk_sel_reg = PERIP_CLK_CFG, | ||
397 | .pclk_sel_mask = CLCD_CLK_MASK, | ||
398 | }; | ||
399 | |||
400 | /* clcd clock */ | ||
401 | static struct clk clcd_clk = { | ||
402 | .en_reg = PERIP1_CLK_ENB, | ||
403 | .en_reg_bit = CLCD_CLK_ENB, | ||
404 | .pclk_sel = &clcd_pclk_sel, | ||
405 | .pclk_sel_shift = CLCD_CLK_SHIFT, | ||
406 | .recalc = &follow_parent, | ||
407 | }; | ||
408 | |||
409 | /* gpt synthesizer masks */ | ||
410 | static struct gpt_clk_masks gpt_masks = { | ||
411 | .mscale_sel_mask = GPT_MSCALE_MASK, | ||
412 | .mscale_sel_shift = GPT_MSCALE_SHIFT, | ||
413 | .nscale_sel_mask = GPT_NSCALE_MASK, | ||
414 | .nscale_sel_shift = GPT_NSCALE_SHIFT, | ||
415 | }; | ||
416 | |||
417 | /* gpt rate configuration table, in ascending order of rates */ | ||
418 | struct gpt_rate_tbl gpt_rtbl[] = { | ||
419 | /* For pll1 = 332 MHz */ | ||
420 | {.mscale = 4, .nscale = 0}, /* 41.5 MHz */ | ||
421 | {.mscale = 2, .nscale = 0}, /* 55.3 MHz */ | ||
422 | {.mscale = 1, .nscale = 0}, /* 83 MHz */ | ||
423 | }; | ||
424 | |||
425 | /* gpt0 synth clk config*/ | ||
426 | static struct gpt_clk_config gpt0_synth_config = { | ||
427 | .synth_reg = PRSC1_CLK_CFG, | ||
428 | .masks = &gpt_masks, | ||
429 | }; | ||
430 | |||
431 | /* gpt synth clock */ | ||
432 | static struct clk gpt0_synth_clk = { | ||
433 | .flags = ALWAYS_ENABLED, | ||
434 | .pclk = &pll1_clk, | ||
435 | .calc_rate = &gpt_calc_rate, | ||
436 | .recalc = &gpt_clk_recalc, | ||
437 | .set_rate = &gpt_clk_set_rate, | ||
438 | .rate_config = {gpt_rtbl, ARRAY_SIZE(gpt_rtbl), 2}, | ||
439 | .private_data = &gpt0_synth_config, | ||
440 | }; | ||
441 | |||
442 | /* gpt parents */ | ||
443 | static struct pclk_info gpt0_pclk_info[] = { | ||
444 | { | ||
445 | .pclk = &gpt0_synth_clk, | ||
446 | .pclk_val = AUX_CLK_PLL1_VAL, | ||
447 | }, { | ||
448 | .pclk = &pll3_48m_clk, | ||
449 | .pclk_val = AUX_CLK_PLL3_VAL, | ||
450 | }, | ||
451 | }; | ||
452 | |||
453 | /* gpt parent select structure */ | ||
454 | static struct pclk_sel gpt0_pclk_sel = { | ||
455 | .pclk_info = gpt0_pclk_info, | ||
456 | .pclk_count = ARRAY_SIZE(gpt0_pclk_info), | ||
457 | .pclk_sel_reg = PERIP_CLK_CFG, | ||
458 | .pclk_sel_mask = GPT_CLK_MASK, | ||
459 | }; | ||
460 | |||
461 | /* gpt0 ARM1 subsystem timer clock */ | ||
462 | static struct clk gpt0_clk = { | ||
463 | .flags = ALWAYS_ENABLED, | ||
464 | .pclk_sel = &gpt0_pclk_sel, | ||
465 | .pclk_sel_shift = GPT0_CLK_SHIFT, | ||
466 | .recalc = &follow_parent, | ||
467 | }; | ||
468 | |||
469 | |||
470 | /* Note: gpt0 and gpt1 share same parent clocks */ | ||
471 | /* gpt parent select structure */ | ||
472 | static struct pclk_sel gpt1_pclk_sel = { | ||
473 | .pclk_info = gpt0_pclk_info, | ||
474 | .pclk_count = ARRAY_SIZE(gpt0_pclk_info), | ||
475 | .pclk_sel_reg = PERIP_CLK_CFG, | ||
476 | .pclk_sel_mask = GPT_CLK_MASK, | ||
477 | }; | ||
478 | |||
479 | /* gpt1 timer clock */ | ||
480 | static struct clk gpt1_clk = { | ||
481 | .flags = ALWAYS_ENABLED, | ||
482 | .pclk_sel = &gpt1_pclk_sel, | ||
483 | .pclk_sel_shift = GPT1_CLK_SHIFT, | ||
484 | .recalc = &follow_parent, | ||
485 | }; | ||
486 | |||
487 | /* gpt2 synth clk config*/ | ||
488 | static struct gpt_clk_config gpt2_synth_config = { | ||
489 | .synth_reg = PRSC2_CLK_CFG, | ||
490 | .masks = &gpt_masks, | ||
491 | }; | ||
492 | |||
493 | /* gpt synth clock */ | ||
494 | static struct clk gpt2_synth_clk = { | ||
495 | .flags = ALWAYS_ENABLED, | ||
496 | .pclk = &pll1_clk, | ||
497 | .calc_rate = &gpt_calc_rate, | ||
498 | .recalc = &gpt_clk_recalc, | ||
499 | .set_rate = &gpt_clk_set_rate, | ||
500 | .rate_config = {gpt_rtbl, ARRAY_SIZE(gpt_rtbl), 2}, | ||
501 | .private_data = &gpt2_synth_config, | ||
502 | }; | ||
503 | |||
504 | /* gpt parents */ | ||
505 | static struct pclk_info gpt2_pclk_info[] = { | ||
506 | { | ||
507 | .pclk = &gpt2_synth_clk, | ||
508 | .pclk_val = AUX_CLK_PLL1_VAL, | ||
509 | }, { | ||
510 | .pclk = &pll3_48m_clk, | ||
511 | .pclk_val = AUX_CLK_PLL3_VAL, | ||
512 | }, | ||
513 | }; | ||
514 | |||
515 | /* gpt parent select structure */ | ||
516 | static struct pclk_sel gpt2_pclk_sel = { | ||
517 | .pclk_info = gpt2_pclk_info, | ||
518 | .pclk_count = ARRAY_SIZE(gpt2_pclk_info), | ||
519 | .pclk_sel_reg = PERIP_CLK_CFG, | ||
520 | .pclk_sel_mask = GPT_CLK_MASK, | ||
521 | }; | ||
522 | |||
523 | /* gpt2 timer clock */ | ||
524 | static struct clk gpt2_clk = { | ||
525 | .flags = ALWAYS_ENABLED, | ||
526 | .pclk_sel = &gpt2_pclk_sel, | ||
527 | .pclk_sel_shift = GPT2_CLK_SHIFT, | ||
528 | .recalc = &follow_parent, | ||
529 | }; | ||
530 | |||
531 | /* gpt3 synth clk config*/ | ||
532 | static struct gpt_clk_config gpt3_synth_config = { | ||
533 | .synth_reg = PRSC3_CLK_CFG, | ||
534 | .masks = &gpt_masks, | ||
535 | }; | ||
536 | |||
537 | /* gpt synth clock */ | ||
538 | static struct clk gpt3_synth_clk = { | ||
539 | .flags = ALWAYS_ENABLED, | ||
540 | .pclk = &pll1_clk, | ||
541 | .calc_rate = &gpt_calc_rate, | ||
542 | .recalc = &gpt_clk_recalc, | ||
543 | .set_rate = &gpt_clk_set_rate, | ||
544 | .rate_config = {gpt_rtbl, ARRAY_SIZE(gpt_rtbl), 2}, | ||
545 | .private_data = &gpt3_synth_config, | ||
546 | }; | ||
547 | |||
548 | /* gpt parents */ | ||
549 | static struct pclk_info gpt3_pclk_info[] = { | ||
550 | { | ||
551 | .pclk = &gpt3_synth_clk, | ||
552 | .pclk_val = AUX_CLK_PLL1_VAL, | ||
553 | }, { | ||
554 | .pclk = &pll3_48m_clk, | ||
555 | .pclk_val = AUX_CLK_PLL3_VAL, | ||
556 | }, | ||
557 | }; | ||
558 | |||
559 | /* gpt parent select structure */ | ||
560 | static struct pclk_sel gpt3_pclk_sel = { | ||
561 | .pclk_info = gpt3_pclk_info, | ||
562 | .pclk_count = ARRAY_SIZE(gpt3_pclk_info), | ||
563 | .pclk_sel_reg = PERIP_CLK_CFG, | ||
564 | .pclk_sel_mask = GPT_CLK_MASK, | ||
565 | }; | ||
566 | |||
567 | /* gpt3 timer clock */ | ||
568 | static struct clk gpt3_clk = { | ||
569 | .flags = ALWAYS_ENABLED, | ||
570 | .pclk_sel = &gpt3_pclk_sel, | ||
571 | .pclk_sel_shift = GPT3_CLK_SHIFT, | ||
572 | .recalc = &follow_parent, | ||
573 | }; | ||
574 | |||
575 | /* clock derived from pll3 clk */ | ||
576 | /* usbh0 clock */ | ||
577 | static struct clk usbh0_clk = { | ||
578 | .pclk = &pll3_48m_clk, | ||
579 | .en_reg = PERIP1_CLK_ENB, | ||
580 | .en_reg_bit = USBH0_CLK_ENB, | ||
581 | .recalc = &follow_parent, | ||
582 | }; | ||
583 | |||
584 | /* usbh1 clock */ | ||
585 | static struct clk usbh1_clk = { | ||
586 | .pclk = &pll3_48m_clk, | ||
587 | .en_reg = PERIP1_CLK_ENB, | ||
588 | .en_reg_bit = USBH1_CLK_ENB, | ||
589 | .recalc = &follow_parent, | ||
590 | }; | ||
591 | |||
592 | /* usbd clock */ | ||
593 | static struct clk usbd_clk = { | ||
594 | .pclk = &pll3_48m_clk, | ||
595 | .en_reg = PERIP1_CLK_ENB, | ||
596 | .en_reg_bit = USBD_CLK_ENB, | ||
597 | .recalc = &follow_parent, | ||
598 | }; | ||
599 | |||
600 | /* clock derived from ahb clk */ | ||
601 | /* apb masks structure */ | ||
602 | static struct bus_clk_masks apb_masks = { | ||
603 | .mask = HCLK_PCLK_RATIO_MASK, | ||
604 | .shift = HCLK_PCLK_RATIO_SHIFT, | ||
605 | }; | ||
606 | |||
607 | /* apb configuration structure */ | ||
608 | static struct bus_clk_config apb_config = { | ||
609 | .reg = CORE_CLK_CFG, | ||
610 | .masks = &apb_masks, | ||
611 | }; | ||
612 | |||
613 | /* apb clock */ | ||
614 | static struct clk apb_clk = { | ||
615 | .flags = ALWAYS_ENABLED, | ||
616 | .pclk = &ahb_clk, | ||
617 | .calc_rate = &bus_calc_rate, | ||
618 | .recalc = &bus_clk_recalc, | ||
619 | .set_rate = &bus_clk_set_rate, | ||
620 | .rate_config = {bus_rtbl, ARRAY_SIZE(bus_rtbl), 2}, | ||
621 | .private_data = &apb_config, | ||
622 | }; | ||
623 | |||
624 | /* i2c clock */ | ||
625 | static struct clk i2c_clk = { | ||
626 | .pclk = &ahb_clk, | ||
627 | .en_reg = PERIP1_CLK_ENB, | ||
628 | .en_reg_bit = I2C_CLK_ENB, | ||
629 | .recalc = &follow_parent, | ||
630 | }; | ||
631 | |||
632 | /* dma clock */ | ||
633 | static struct clk dma_clk = { | ||
634 | .pclk = &ahb_clk, | ||
635 | .en_reg = PERIP1_CLK_ENB, | ||
636 | .en_reg_bit = DMA_CLK_ENB, | ||
637 | .recalc = &follow_parent, | ||
638 | }; | ||
639 | |||
640 | /* jpeg clock */ | ||
641 | static struct clk jpeg_clk = { | ||
642 | .pclk = &ahb_clk, | ||
643 | .en_reg = PERIP1_CLK_ENB, | ||
644 | .en_reg_bit = JPEG_CLK_ENB, | ||
645 | .recalc = &follow_parent, | ||
646 | }; | ||
647 | |||
648 | /* gmac clock */ | ||
649 | static struct clk gmac_clk = { | ||
650 | .pclk = &ahb_clk, | ||
651 | .en_reg = PERIP1_CLK_ENB, | ||
652 | .en_reg_bit = GMAC_CLK_ENB, | ||
653 | .recalc = &follow_parent, | ||
654 | }; | ||
655 | |||
656 | /* smi clock */ | ||
657 | static struct clk smi_clk = { | ||
658 | .pclk = &ahb_clk, | ||
659 | .en_reg = PERIP1_CLK_ENB, | ||
660 | .en_reg_bit = SMI_CLK_ENB, | ||
661 | .recalc = &follow_parent, | ||
662 | }; | ||
663 | |||
664 | /* fsmc clock */ | ||
665 | static struct clk fsmc_clk = { | ||
666 | .pclk = &ahb_clk, | ||
667 | .en_reg = PERIP1_CLK_ENB, | ||
668 | .en_reg_bit = FSMC_CLK_ENB, | ||
669 | .recalc = &follow_parent, | ||
670 | }; | ||
671 | |||
672 | /* clock derived from apb clk */ | ||
673 | /* adc clock */ | ||
674 | static struct clk adc_clk = { | ||
675 | .pclk = &apb_clk, | ||
676 | .en_reg = PERIP1_CLK_ENB, | ||
677 | .en_reg_bit = ADC_CLK_ENB, | ||
678 | .recalc = &follow_parent, | ||
679 | }; | ||
680 | |||
681 | /* ssp0 clock */ | ||
682 | static struct clk ssp0_clk = { | ||
683 | .pclk = &apb_clk, | ||
684 | .en_reg = PERIP1_CLK_ENB, | ||
685 | .en_reg_bit = SSP0_CLK_ENB, | ||
686 | .recalc = &follow_parent, | ||
687 | }; | ||
688 | |||
689 | /* ssp1 clock */ | ||
690 | static struct clk ssp1_clk = { | ||
691 | .pclk = &apb_clk, | ||
692 | .en_reg = PERIP1_CLK_ENB, | ||
693 | .en_reg_bit = SSP1_CLK_ENB, | ||
694 | .recalc = &follow_parent, | ||
695 | }; | ||
696 | |||
697 | /* ssp2 clock */ | ||
698 | static struct clk ssp2_clk = { | ||
699 | .pclk = &apb_clk, | ||
700 | .en_reg = PERIP1_CLK_ENB, | ||
701 | .en_reg_bit = SSP2_CLK_ENB, | ||
702 | .recalc = &follow_parent, | ||
703 | }; | ||
704 | |||
705 | /* gpio0 ARM subsystem clock */ | ||
706 | static struct clk gpio0_clk = { | ||
707 | .flags = ALWAYS_ENABLED, | ||
708 | .pclk = &apb_clk, | ||
709 | .recalc = &follow_parent, | ||
710 | }; | ||
711 | |||
712 | /* gpio1 clock */ | ||
713 | static struct clk gpio1_clk = { | ||
714 | .pclk = &apb_clk, | ||
715 | .en_reg = PERIP1_CLK_ENB, | ||
716 | .en_reg_bit = GPIO1_CLK_ENB, | ||
717 | .recalc = &follow_parent, | ||
718 | }; | ||
719 | |||
720 | /* gpio2 clock */ | ||
721 | static struct clk gpio2_clk = { | ||
722 | .pclk = &apb_clk, | ||
723 | .en_reg = PERIP1_CLK_ENB, | ||
724 | .en_reg_bit = GPIO2_CLK_ENB, | ||
725 | .recalc = &follow_parent, | ||
726 | }; | ||
727 | |||
728 | static struct clk dummy_apb_pclk; | ||
729 | |||
730 | /* array of all spear 6xx clock lookups */ | ||
731 | static struct clk_lookup spear_clk_lookups[] = { | ||
732 | CLKDEV_INIT(NULL, "apb_pclk", &dummy_apb_pclk), | ||
733 | /* root clks */ | ||
734 | CLKDEV_INIT(NULL, "osc_32k_clk", &osc_32k_clk), | ||
735 | CLKDEV_INIT(NULL, "osc_30m_clk", &osc_30m_clk), | ||
736 | /* clock derived from 32 KHz os clk */ | ||
737 | CLKDEV_INIT("rtc-spear", NULL, &rtc_clk), | ||
738 | /* clock derived from 30 MHz os clk */ | ||
739 | CLKDEV_INIT(NULL, "pll1_clk", &pll1_clk), | ||
740 | CLKDEV_INIT(NULL, "pll3_48m_clk", &pll3_48m_clk), | ||
741 | CLKDEV_INIT("wdt", NULL, &wdt_clk), | ||
742 | /* clock derived from pll1 clk */ | ||
743 | CLKDEV_INIT(NULL, "cpu_clk", &cpu_clk), | ||
744 | CLKDEV_INIT(NULL, "ahb_clk", &ahb_clk), | ||
745 | CLKDEV_INIT(NULL, "uart_synth_clk", &uart_synth_clk), | ||
746 | CLKDEV_INIT(NULL, "firda_synth_clk", &firda_synth_clk), | ||
747 | CLKDEV_INIT(NULL, "clcd_synth_clk", &clcd_synth_clk), | ||
748 | CLKDEV_INIT(NULL, "gpt0_synth_clk", &gpt0_synth_clk), | ||
749 | CLKDEV_INIT(NULL, "gpt2_synth_clk", &gpt2_synth_clk), | ||
750 | CLKDEV_INIT(NULL, "gpt3_synth_clk", &gpt3_synth_clk), | ||
751 | CLKDEV_INIT("d0000000.serial", NULL, &uart0_clk), | ||
752 | CLKDEV_INIT("d0080000.serial", NULL, &uart1_clk), | ||
753 | CLKDEV_INIT("firda", NULL, &firda_clk), | ||
754 | CLKDEV_INIT("clcd", NULL, &clcd_clk), | ||
755 | CLKDEV_INIT("gpt0", NULL, &gpt0_clk), | ||
756 | CLKDEV_INIT("gpt1", NULL, &gpt1_clk), | ||
757 | CLKDEV_INIT("gpt2", NULL, &gpt2_clk), | ||
758 | CLKDEV_INIT("gpt3", NULL, &gpt3_clk), | ||
759 | /* clock derived from pll3 clk */ | ||
760 | CLKDEV_INIT("designware_udc", NULL, &usbd_clk), | ||
761 | CLKDEV_INIT(NULL, "usbh.0_clk", &usbh0_clk), | ||
762 | CLKDEV_INIT(NULL, "usbh.1_clk", &usbh1_clk), | ||
763 | /* clock derived from ahb clk */ | ||
764 | CLKDEV_INIT(NULL, "apb_clk", &apb_clk), | ||
765 | CLKDEV_INIT("d0200000.i2c", NULL, &i2c_clk), | ||
766 | CLKDEV_INIT("fc400000.dma", NULL, &dma_clk), | ||
767 | CLKDEV_INIT("jpeg", NULL, &jpeg_clk), | ||
768 | CLKDEV_INIT("gmac", NULL, &gmac_clk), | ||
769 | CLKDEV_INIT("fc000000.flash", NULL, &smi_clk), | ||
770 | CLKDEV_INIT("d1800000.flash", NULL, &fsmc_clk), | ||
771 | /* clock derived from apb clk */ | ||
772 | CLKDEV_INIT("adc", NULL, &adc_clk), | ||
773 | CLKDEV_INIT("ssp-pl022.0", NULL, &ssp0_clk), | ||
774 | CLKDEV_INIT("ssp-pl022.1", NULL, &ssp1_clk), | ||
775 | CLKDEV_INIT("ssp-pl022.2", NULL, &ssp2_clk), | ||
776 | CLKDEV_INIT("f0100000.gpio", NULL, &gpio0_clk), | ||
777 | CLKDEV_INIT("fc980000.gpio", NULL, &gpio1_clk), | ||
778 | CLKDEV_INIT("d8100000.gpio", NULL, &gpio2_clk), | ||
779 | }; | ||
780 | |||
781 | void __init spear6xx_clk_init(void) | ||
782 | { | ||
783 | int i; | ||
784 | |||
785 | for (i = 0; i < ARRAY_SIZE(spear_clk_lookups); i++) | ||
786 | clk_register(&spear_clk_lookups[i]); | ||
787 | |||
788 | clk_init(); | ||
789 | } | ||
diff --git a/arch/arm/mach-spear6xx/include/mach/generic.h b/arch/arm/mach-spear6xx/include/mach/generic.h index 7167fd331d86..65514b159370 100644 --- a/arch/arm/mach-spear6xx/include/mach/generic.h +++ b/arch/arm/mach-spear6xx/include/mach/generic.h | |||
@@ -16,7 +16,7 @@ | |||
16 | 16 | ||
17 | #include <linux/init.h> | 17 | #include <linux/init.h> |
18 | 18 | ||
19 | void __init spear_setup_timer(resource_size_t base, int irq); | 19 | void __init spear_setup_of_timer(void); |
20 | void spear_restart(char, const char *); | 20 | void spear_restart(char, const char *); |
21 | void __init spear6xx_clk_init(void); | 21 | void __init spear6xx_clk_init(void); |
22 | 22 | ||
diff --git a/arch/arm/mach-spear6xx/include/mach/irqs.h b/arch/arm/mach-spear6xx/include/mach/irqs.h index 2b735389e74b..37a5c411a866 100644 --- a/arch/arm/mach-spear6xx/include/mach/irqs.h +++ b/arch/arm/mach-spear6xx/include/mach/irqs.h | |||
@@ -16,9 +16,6 @@ | |||
16 | 16 | ||
17 | /* IRQ definitions */ | 17 | /* IRQ definitions */ |
18 | /* VIC 1 */ | 18 | /* VIC 1 */ |
19 | /* FIXME: probe this from DT */ | ||
20 | #define IRQ_CPU_GPT1_1 16 | ||
21 | |||
22 | #define IRQ_VIC_END 64 | 19 | #define IRQ_VIC_END 64 |
23 | 20 | ||
24 | /* GPIO pins virtual irqs */ | 21 | /* GPIO pins virtual irqs */ |
diff --git a/arch/arm/mach-spear6xx/include/mach/misc_regs.h b/arch/arm/mach-spear6xx/include/mach/misc_regs.h index 2b9aaa6cdd11..179e45774b3a 100644 --- a/arch/arm/mach-spear6xx/include/mach/misc_regs.h +++ b/arch/arm/mach-spear6xx/include/mach/misc_regs.h | |||
@@ -14,6 +14,8 @@ | |||
14 | #ifndef __MACH_MISC_REGS_H | 14 | #ifndef __MACH_MISC_REGS_H |
15 | #define __MACH_MISC_REGS_H | 15 | #define __MACH_MISC_REGS_H |
16 | 16 | ||
17 | #include <mach/spear.h> | ||
18 | |||
17 | #define MISC_BASE IOMEM(VA_SPEAR6XX_ICM3_MISC_REG_BASE) | 19 | #define MISC_BASE IOMEM(VA_SPEAR6XX_ICM3_MISC_REG_BASE) |
18 | #define DMA_CHN_CFG (MISC_BASE + 0x0A0) | 20 | #define DMA_CHN_CFG (MISC_BASE + 0x0A0) |
19 | 21 | ||
diff --git a/arch/arm/mach-spear6xx/include/mach/spear.h b/arch/arm/mach-spear6xx/include/mach/spear.h index d278ed047a53..cb8ed2f4dc85 100644 --- a/arch/arm/mach-spear6xx/include/mach/spear.h +++ b/arch/arm/mach-spear6xx/include/mach/spear.h | |||
@@ -25,7 +25,6 @@ | |||
25 | /* ML-1, 2 - Multi Layer CPU Subsystem */ | 25 | /* ML-1, 2 - Multi Layer CPU Subsystem */ |
26 | #define SPEAR6XX_ML_CPU_BASE UL(0xF0000000) | 26 | #define SPEAR6XX_ML_CPU_BASE UL(0xF0000000) |
27 | #define VA_SPEAR6XX_ML_CPU_BASE UL(0xF0000000) | 27 | #define VA_SPEAR6XX_ML_CPU_BASE UL(0xF0000000) |
28 | #define SPEAR6XX_CPU_TMR_BASE UL(0xF0000000) | ||
29 | 28 | ||
30 | /* ICM3 - Basic Subsystem */ | 29 | /* ICM3 - Basic Subsystem */ |
31 | #define SPEAR6XX_ICM3_SMI_CTRL_BASE UL(0xFC000000) | 30 | #define SPEAR6XX_ICM3_SMI_CTRL_BASE UL(0xFC000000) |
diff --git a/arch/arm/mach-spear6xx/spear6xx.c b/arch/arm/mach-spear6xx/spear6xx.c index de194dbb8371..2e2e3596583e 100644 --- a/arch/arm/mach-spear6xx/spear6xx.c +++ b/arch/arm/mach-spear6xx/spear6xx.c | |||
@@ -419,9 +419,6 @@ struct map_desc spear6xx_io_desc[] __initdata = { | |||
419 | void __init spear6xx_map_io(void) | 419 | void __init spear6xx_map_io(void) |
420 | { | 420 | { |
421 | iotable_init(spear6xx_io_desc, ARRAY_SIZE(spear6xx_io_desc)); | 421 | iotable_init(spear6xx_io_desc, ARRAY_SIZE(spear6xx_io_desc)); |
422 | |||
423 | /* This will initialize clock framework */ | ||
424 | spear6xx_clk_init(); | ||
425 | } | 422 | } |
426 | 423 | ||
427 | static void __init spear6xx_timer_init(void) | 424 | static void __init spear6xx_timer_init(void) |
@@ -429,6 +426,8 @@ static void __init spear6xx_timer_init(void) | |||
429 | char pclk_name[] = "pll3_48m_clk"; | 426 | char pclk_name[] = "pll3_48m_clk"; |
430 | struct clk *gpt_clk, *pclk; | 427 | struct clk *gpt_clk, *pclk; |
431 | 428 | ||
429 | spear6xx_clk_init(); | ||
430 | |||
432 | /* get the system timer clock */ | 431 | /* get the system timer clock */ |
433 | gpt_clk = clk_get_sys("gpt0", NULL); | 432 | gpt_clk = clk_get_sys("gpt0", NULL); |
434 | if (IS_ERR(gpt_clk)) { | 433 | if (IS_ERR(gpt_clk)) { |
@@ -448,7 +447,7 @@ static void __init spear6xx_timer_init(void) | |||
448 | clk_put(gpt_clk); | 447 | clk_put(gpt_clk); |
449 | clk_put(pclk); | 448 | clk_put(pclk); |
450 | 449 | ||
451 | spear_setup_timer(SPEAR6XX_CPU_TMR_BASE, IRQ_CPU_GPT1_1); | 450 | spear_setup_of_timer(); |
452 | } | 451 | } |
453 | 452 | ||
454 | struct sys_timer spear6xx_timer = { | 453 | struct sys_timer spear6xx_timer = { |
diff --git a/arch/arm/mach-tegra/Kconfig b/arch/arm/mach-tegra/Kconfig index d0f2546706ca..6a113a9bb87a 100644 --- a/arch/arm/mach-tegra/Kconfig +++ b/arch/arm/mach-tegra/Kconfig | |||
@@ -50,6 +50,14 @@ config TEGRA_PCI | |||
50 | depends on ARCH_TEGRA_2x_SOC | 50 | depends on ARCH_TEGRA_2x_SOC |
51 | select PCI | 51 | select PCI |
52 | 52 | ||
53 | config TEGRA_AHB | ||
54 | bool "Enable AHB driver for NVIDIA Tegra SoCs" | ||
55 | default y | ||
56 | help | ||
57 | Adds AHB configuration functionality for NVIDIA Tegra SoCs, | ||
58 | which controls AHB bus master arbitration and some | ||
59 | perfomance parameters(priority, prefech size). | ||
60 | |||
53 | comment "Tegra board type" | 61 | comment "Tegra board type" |
54 | 62 | ||
55 | config MACH_HARMONY | 63 | config MACH_HARMONY |
@@ -111,7 +119,7 @@ config MACH_VENTANA | |||
111 | Support for the nVidia Ventana development platform | 119 | Support for the nVidia Ventana development platform |
112 | 120 | ||
113 | choice | 121 | choice |
114 | prompt "Low-level debug console UART" | 122 | prompt "Default low-level debug console UART" |
115 | default TEGRA_DEBUG_UART_NONE | 123 | default TEGRA_DEBUG_UART_NONE |
116 | 124 | ||
117 | config TEGRA_DEBUG_UART_NONE | 125 | config TEGRA_DEBUG_UART_NONE |
@@ -134,6 +142,33 @@ config TEGRA_DEBUG_UARTE | |||
134 | 142 | ||
135 | endchoice | 143 | endchoice |
136 | 144 | ||
145 | choice | ||
146 | prompt "Automatic low-level debug console UART" | ||
147 | default TEGRA_DEBUG_UART_AUTO_NONE | ||
148 | |||
149 | config TEGRA_DEBUG_UART_AUTO_NONE | ||
150 | bool "None" | ||
151 | |||
152 | config TEGRA_DEBUG_UART_AUTO_ODMDATA | ||
153 | bool "Via ODMDATA" | ||
154 | help | ||
155 | Automatically determines which UART to use for low-level debug based | ||
156 | on the ODMDATA value. This value is part of the BCT, and is written | ||
157 | to the boot memory device using nvflash, or other flashing tool. | ||
158 | When bits 19:18 are 3, then bits 17:15 indicate which UART to use; | ||
159 | 0/1/2/3/4 are UART A/B/C/D/E. | ||
160 | |||
161 | config TEGRA_DEBUG_UART_AUTO_SCRATCH | ||
162 | bool "Via UART scratch register" | ||
163 | help | ||
164 | Automatically determines which UART to use for low-level debug based | ||
165 | on the UART scratch register value. Some bootloaders put ASCII 'D' | ||
166 | in this register when they initialize their own console UART output. | ||
167 | Using this option allows the kernel to automatically pick the same | ||
168 | UART. | ||
169 | |||
170 | endchoice | ||
171 | |||
137 | config TEGRA_SYSTEM_DMA | 172 | config TEGRA_SYSTEM_DMA |
138 | bool "Enable system DMA driver for NVIDIA Tegra SoCs" | 173 | bool "Enable system DMA driver for NVIDIA Tegra SoCs" |
139 | default y | 174 | default y |
diff --git a/arch/arm/mach-tegra/board-dt-tegra20.c b/arch/arm/mach-tegra/board-dt-tegra20.c index fac3eb1af17e..eb7249db50a5 100644 --- a/arch/arm/mach-tegra/board-dt-tegra20.c +++ b/arch/arm/mach-tegra/board-dt-tegra20.c | |||
@@ -110,6 +110,7 @@ DT_MACHINE_START(TEGRA_DT, "nVidia Tegra20 (Flattened Device Tree)") | |||
110 | .handle_irq = gic_handle_irq, | 110 | .handle_irq = gic_handle_irq, |
111 | .timer = &tegra_timer, | 111 | .timer = &tegra_timer, |
112 | .init_machine = tegra_dt_init, | 112 | .init_machine = tegra_dt_init, |
113 | .init_late = tegra_init_late, | ||
113 | .restart = tegra_assert_system_reset, | 114 | .restart = tegra_assert_system_reset, |
114 | .dt_compat = tegra20_dt_board_compat, | 115 | .dt_compat = tegra20_dt_board_compat, |
115 | MACHINE_END | 116 | MACHINE_END |
diff --git a/arch/arm/mach-tegra/board-dt-tegra30.c b/arch/arm/mach-tegra/board-dt-tegra30.c index 5f7c03e972f3..4f76fa7a5da3 100644 --- a/arch/arm/mach-tegra/board-dt-tegra30.c +++ b/arch/arm/mach-tegra/board-dt-tegra30.c | |||
@@ -51,12 +51,22 @@ struct of_dev_auxdata tegra30_auxdata_lookup[] __initdata = { | |||
51 | OF_DEV_AUXDATA("nvidia,tegra20-i2c", 0x7000C500, "tegra-i2c.2", NULL), | 51 | OF_DEV_AUXDATA("nvidia,tegra20-i2c", 0x7000C500, "tegra-i2c.2", NULL), |
52 | OF_DEV_AUXDATA("nvidia,tegra20-i2c", 0x7000C700, "tegra-i2c.3", NULL), | 52 | OF_DEV_AUXDATA("nvidia,tegra20-i2c", 0x7000C700, "tegra-i2c.3", NULL), |
53 | OF_DEV_AUXDATA("nvidia,tegra20-i2c", 0x7000D000, "tegra-i2c.4", NULL), | 53 | OF_DEV_AUXDATA("nvidia,tegra20-i2c", 0x7000D000, "tegra-i2c.4", NULL), |
54 | OF_DEV_AUXDATA("nvidia,tegra30-ahub", 0x70080000, "tegra30-ahub", NULL), | ||
54 | {} | 55 | {} |
55 | }; | 56 | }; |
56 | 57 | ||
57 | static __initdata struct tegra_clk_init_table tegra_dt_clk_init_table[] = { | 58 | static __initdata struct tegra_clk_init_table tegra_dt_clk_init_table[] = { |
58 | /* name parent rate enabled */ | 59 | /* name parent rate enabled */ |
59 | { "uarta", "pll_p", 408000000, true }, | 60 | { "uarta", "pll_p", 408000000, true }, |
61 | { "pll_a", "pll_p_out1", 564480000, true }, | ||
62 | { "pll_a_out0", "pll_a", 11289600, true }, | ||
63 | { "extern1", "pll_a_out0", 0, true }, | ||
64 | { "clk_out_1", "extern1", 0, true }, | ||
65 | { "i2s0", "pll_a_out0", 11289600, false}, | ||
66 | { "i2s1", "pll_a_out0", 11289600, false}, | ||
67 | { "i2s2", "pll_a_out0", 11289600, false}, | ||
68 | { "i2s3", "pll_a_out0", 11289600, false}, | ||
69 | { "i2s4", "pll_a_out0", 11289600, false}, | ||
60 | { NULL, NULL, 0, 0}, | 70 | { NULL, NULL, 0, 0}, |
61 | }; | 71 | }; |
62 | 72 | ||
@@ -80,6 +90,7 @@ DT_MACHINE_START(TEGRA30_DT, "NVIDIA Tegra30 (Flattened Device Tree)") | |||
80 | .handle_irq = gic_handle_irq, | 90 | .handle_irq = gic_handle_irq, |
81 | .timer = &tegra_timer, | 91 | .timer = &tegra_timer, |
82 | .init_machine = tegra30_dt_init, | 92 | .init_machine = tegra30_dt_init, |
93 | .init_late = tegra_init_late, | ||
83 | .restart = tegra_assert_system_reset, | 94 | .restart = tegra_assert_system_reset, |
84 | .dt_compat = tegra30_dt_board_compat, | 95 | .dt_compat = tegra30_dt_board_compat, |
85 | MACHINE_END | 96 | MACHINE_END |
diff --git a/arch/arm/mach-tegra/board-harmony.c b/arch/arm/mach-tegra/board-harmony.c index b906b3b6077b..e65e837f4013 100644 --- a/arch/arm/mach-tegra/board-harmony.c +++ b/arch/arm/mach-tegra/board-harmony.c | |||
@@ -192,5 +192,6 @@ MACHINE_START(HARMONY, "harmony") | |||
192 | .handle_irq = gic_handle_irq, | 192 | .handle_irq = gic_handle_irq, |
193 | .timer = &tegra_timer, | 193 | .timer = &tegra_timer, |
194 | .init_machine = tegra_harmony_init, | 194 | .init_machine = tegra_harmony_init, |
195 | .init_late = tegra_init_late, | ||
195 | .restart = tegra_assert_system_reset, | 196 | .restart = tegra_assert_system_reset, |
196 | MACHINE_END | 197 | MACHINE_END |
diff --git a/arch/arm/mach-tegra/board-paz00.c b/arch/arm/mach-tegra/board-paz00.c index d0735c70d688..bbc1907e98a6 100644 --- a/arch/arm/mach-tegra/board-paz00.c +++ b/arch/arm/mach-tegra/board-paz00.c | |||
@@ -162,6 +162,8 @@ static void paz00_i2c_init(void) | |||
162 | 162 | ||
163 | static void paz00_usb_init(void) | 163 | static void paz00_usb_init(void) |
164 | { | 164 | { |
165 | tegra_ehci2_ulpi_phy_config.reset_gpio = TEGRA_ULPI_RST; | ||
166 | |||
165 | platform_device_register(&tegra_ehci2_device); | 167 | platform_device_register(&tegra_ehci2_device); |
166 | platform_device_register(&tegra_ehci3_device); | 168 | platform_device_register(&tegra_ehci3_device); |
167 | } | 169 | } |
@@ -179,7 +181,6 @@ static __initdata struct tegra_clk_init_table paz00_clk_init_table[] = { | |||
179 | { "uarta", "pll_p", 216000000, true }, | 181 | { "uarta", "pll_p", 216000000, true }, |
180 | { "uartc", "pll_p", 216000000, true }, | 182 | { "uartc", "pll_p", 216000000, true }, |
181 | 183 | ||
182 | { "pll_p_out4", "pll_p", 24000000, true }, | ||
183 | { "usbd", "clk_m", 12000000, false }, | 184 | { "usbd", "clk_m", 12000000, false }, |
184 | { "usb2", "clk_m", 12000000, false }, | 185 | { "usb2", "clk_m", 12000000, false }, |
185 | { "usb3", "clk_m", 12000000, false }, | 186 | { "usb3", "clk_m", 12000000, false }, |
@@ -224,5 +225,6 @@ MACHINE_START(PAZ00, "Toshiba AC100 / Dynabook AZ") | |||
224 | .handle_irq = gic_handle_irq, | 225 | .handle_irq = gic_handle_irq, |
225 | .timer = &tegra_timer, | 226 | .timer = &tegra_timer, |
226 | .init_machine = tegra_paz00_init, | 227 | .init_machine = tegra_paz00_init, |
228 | .init_late = tegra_init_late, | ||
227 | .restart = tegra_assert_system_reset, | 229 | .restart = tegra_assert_system_reset, |
228 | MACHINE_END | 230 | MACHINE_END |
diff --git a/arch/arm/mach-tegra/board-seaboard.c b/arch/arm/mach-tegra/board-seaboard.c index 79064c7a7907..71e9f3fc7fba 100644 --- a/arch/arm/mach-tegra/board-seaboard.c +++ b/arch/arm/mach-tegra/board-seaboard.c | |||
@@ -277,6 +277,7 @@ MACHINE_START(SEABOARD, "seaboard") | |||
277 | .handle_irq = gic_handle_irq, | 277 | .handle_irq = gic_handle_irq, |
278 | .timer = &tegra_timer, | 278 | .timer = &tegra_timer, |
279 | .init_machine = tegra_seaboard_init, | 279 | .init_machine = tegra_seaboard_init, |
280 | .init_late = tegra_init_late, | ||
280 | .restart = tegra_assert_system_reset, | 281 | .restart = tegra_assert_system_reset, |
281 | MACHINE_END | 282 | MACHINE_END |
282 | 283 | ||
@@ -288,6 +289,7 @@ MACHINE_START(KAEN, "kaen") | |||
288 | .handle_irq = gic_handle_irq, | 289 | .handle_irq = gic_handle_irq, |
289 | .timer = &tegra_timer, | 290 | .timer = &tegra_timer, |
290 | .init_machine = tegra_kaen_init, | 291 | .init_machine = tegra_kaen_init, |
292 | .init_late = tegra_init_late, | ||
291 | .restart = tegra_assert_system_reset, | 293 | .restart = tegra_assert_system_reset, |
292 | MACHINE_END | 294 | MACHINE_END |
293 | 295 | ||
@@ -299,5 +301,6 @@ MACHINE_START(WARIO, "wario") | |||
299 | .handle_irq = gic_handle_irq, | 301 | .handle_irq = gic_handle_irq, |
300 | .timer = &tegra_timer, | 302 | .timer = &tegra_timer, |
301 | .init_machine = tegra_wario_init, | 303 | .init_machine = tegra_wario_init, |
304 | .init_late = tegra_init_late, | ||
302 | .restart = tegra_assert_system_reset, | 305 | .restart = tegra_assert_system_reset, |
303 | MACHINE_END | 306 | MACHINE_END |
diff --git a/arch/arm/mach-tegra/board-trimslice.c b/arch/arm/mach-tegra/board-trimslice.c index bc59b379c6fe..776aa9564d5d 100644 --- a/arch/arm/mach-tegra/board-trimslice.c +++ b/arch/arm/mach-tegra/board-trimslice.c | |||
@@ -118,6 +118,8 @@ static void trimslice_usb_init(void) | |||
118 | pdata = tegra_ehci1_device.dev.platform_data; | 118 | pdata = tegra_ehci1_device.dev.platform_data; |
119 | pdata->vbus_gpio = TRIMSLICE_GPIO_USB1_MODE; | 119 | pdata->vbus_gpio = TRIMSLICE_GPIO_USB1_MODE; |
120 | 120 | ||
121 | tegra_ehci2_ulpi_phy_config.reset_gpio = TEGRA_GPIO_PV0; | ||
122 | |||
121 | platform_device_register(&tegra_ehci3_device); | 123 | platform_device_register(&tegra_ehci3_device); |
122 | platform_device_register(&tegra_ehci2_device); | 124 | platform_device_register(&tegra_ehci2_device); |
123 | platform_device_register(&tegra_ehci1_device); | 125 | platform_device_register(&tegra_ehci1_device); |
@@ -176,5 +178,6 @@ MACHINE_START(TRIMSLICE, "trimslice") | |||
176 | .handle_irq = gic_handle_irq, | 178 | .handle_irq = gic_handle_irq, |
177 | .timer = &tegra_timer, | 179 | .timer = &tegra_timer, |
178 | .init_machine = tegra_trimslice_init, | 180 | .init_machine = tegra_trimslice_init, |
181 | .init_late = tegra_init_late, | ||
179 | .restart = tegra_assert_system_reset, | 182 | .restart = tegra_assert_system_reset, |
180 | MACHINE_END | 183 | MACHINE_END |
diff --git a/arch/arm/mach-tegra/board.h b/arch/arm/mach-tegra/board.h index 75d1543d77c0..65014968fc6c 100644 --- a/arch/arm/mach-tegra/board.h +++ b/arch/arm/mach-tegra/board.h | |||
@@ -32,5 +32,19 @@ void __init tegra_init_irq(void); | |||
32 | void __init tegra_dt_init_irq(void); | 32 | void __init tegra_dt_init_irq(void); |
33 | int __init tegra_pcie_init(bool init_port0, bool init_port1); | 33 | int __init tegra_pcie_init(bool init_port0, bool init_port1); |
34 | 34 | ||
35 | void tegra_init_late(void); | ||
36 | |||
37 | #ifdef CONFIG_DEBUG_FS | ||
38 | int tegra_clk_debugfs_init(void); | ||
39 | #else | ||
40 | static inline int tegra_clk_debugfs_init(void) { return 0; } | ||
41 | #endif | ||
42 | |||
43 | #if defined(CONFIG_ARCH_TEGRA_2x_SOC) && defined(CONFIG_DEBUG_FS) | ||
44 | int __init tegra_powergate_debugfs_init(void); | ||
45 | #else | ||
46 | static inline int tegra_powergate_debugfs_init(void) { return 0; } | ||
47 | #endif | ||
48 | |||
35 | extern struct sys_timer tegra_timer; | 49 | extern struct sys_timer tegra_timer; |
36 | #endif | 50 | #endif |
diff --git a/arch/arm/mach-tegra/clock.c b/arch/arm/mach-tegra/clock.c index 8dad8d18cb49..58f981c0819c 100644 --- a/arch/arm/mach-tegra/clock.c +++ b/arch/arm/mach-tegra/clock.c | |||
@@ -642,7 +642,7 @@ static int clk_debugfs_register(struct clk *c) | |||
642 | return 0; | 642 | return 0; |
643 | } | 643 | } |
644 | 644 | ||
645 | static int __init clk_debugfs_init(void) | 645 | int __init tegra_clk_debugfs_init(void) |
646 | { | 646 | { |
647 | struct clk *c; | 647 | struct clk *c; |
648 | struct dentry *d; | 648 | struct dentry *d; |
@@ -669,5 +669,4 @@ err_out: | |||
669 | return err; | 669 | return err; |
670 | } | 670 | } |
671 | 671 | ||
672 | late_initcall(clk_debugfs_init); | ||
673 | #endif | 672 | #endif |
diff --git a/arch/arm/mach-tegra/common.c b/arch/arm/mach-tegra/common.c index 22df10fb9972..204a5c8b0b57 100644 --- a/arch/arm/mach-tegra/common.c +++ b/arch/arm/mach-tegra/common.c | |||
@@ -82,10 +82,12 @@ static __initdata struct tegra_clk_init_table tegra20_clk_init_table[] = { | |||
82 | { "pll_p_out1", "pll_p", 28800000, true }, | 82 | { "pll_p_out1", "pll_p", 28800000, true }, |
83 | { "pll_p_out2", "pll_p", 48000000, true }, | 83 | { "pll_p_out2", "pll_p", 48000000, true }, |
84 | { "pll_p_out3", "pll_p", 72000000, true }, | 84 | { "pll_p_out3", "pll_p", 72000000, true }, |
85 | { "pll_p_out4", "pll_p", 108000000, true }, | 85 | { "pll_p_out4", "pll_p", 24000000, true }, |
86 | { "sclk", "pll_p_out4", 108000000, true }, | 86 | { "pll_c", "clk_m", 600000000, true }, |
87 | { "hclk", "sclk", 108000000, true }, | 87 | { "pll_c_out1", "pll_c", 120000000, true }, |
88 | { "pclk", "hclk", 54000000, true }, | 88 | { "sclk", "pll_c_out1", 120000000, true }, |
89 | { "hclk", "sclk", 120000000, true }, | ||
90 | { "pclk", "hclk", 60000000, true }, | ||
89 | { "csite", NULL, 0, true }, | 91 | { "csite", NULL, 0, true }, |
90 | { "emc", NULL, 0, true }, | 92 | { "emc", NULL, 0, true }, |
91 | { "cpu", NULL, 0, true }, | 93 | { "cpu", NULL, 0, true }, |
@@ -93,6 +95,17 @@ static __initdata struct tegra_clk_init_table tegra20_clk_init_table[] = { | |||
93 | }; | 95 | }; |
94 | #endif | 96 | #endif |
95 | 97 | ||
98 | #ifdef CONFIG_ARCH_TEGRA_3x_SOC | ||
99 | static __initdata struct tegra_clk_init_table tegra30_clk_init_table[] = { | ||
100 | /* name parent rate enabled */ | ||
101 | { "clk_m", NULL, 0, true }, | ||
102 | { "pll_p", "clk_m", 408000000, true }, | ||
103 | { "pll_p_out1", "pll_p", 9600000, true }, | ||
104 | { NULL, NULL, 0, 0}, | ||
105 | }; | ||
106 | #endif | ||
107 | |||
108 | |||
96 | static void __init tegra_init_cache(u32 tag_latency, u32 data_latency) | 109 | static void __init tegra_init_cache(u32 tag_latency, u32 data_latency) |
97 | { | 110 | { |
98 | #ifdef CONFIG_CACHE_L2X0 | 111 | #ifdef CONFIG_CACHE_L2X0 |
@@ -127,8 +140,15 @@ void __init tegra30_init_early(void) | |||
127 | { | 140 | { |
128 | tegra_init_fuse(); | 141 | tegra_init_fuse(); |
129 | tegra30_init_clocks(); | 142 | tegra30_init_clocks(); |
143 | tegra_clk_init_from_table(tegra30_clk_init_table); | ||
130 | tegra_init_cache(0x441, 0x551); | 144 | tegra_init_cache(0x441, 0x551); |
131 | tegra_pmc_init(); | 145 | tegra_pmc_init(); |
132 | tegra_powergate_init(); | 146 | tegra_powergate_init(); |
133 | } | 147 | } |
134 | #endif | 148 | #endif |
149 | |||
150 | void __init tegra_init_late(void) | ||
151 | { | ||
152 | tegra_clk_debugfs_init(); | ||
153 | tegra_powergate_debugfs_init(); | ||
154 | } | ||
diff --git a/arch/arm/mach-tegra/devices.c b/arch/arm/mach-tegra/devices.c index 2d8dfa2faf8f..c70e65ffa36b 100644 --- a/arch/arm/mach-tegra/devices.c +++ b/arch/arm/mach-tegra/devices.c | |||
@@ -439,9 +439,8 @@ static struct resource tegra_usb3_resources[] = { | |||
439 | }, | 439 | }, |
440 | }; | 440 | }; |
441 | 441 | ||
442 | static struct tegra_ulpi_config tegra_ehci2_ulpi_phy_config = { | 442 | struct tegra_ulpi_config tegra_ehci2_ulpi_phy_config = { |
443 | /* All existing boards use GPIO PV0 for phy reset */ | 443 | .reset_gpio = -1, |
444 | .reset_gpio = TEGRA_GPIO_PV0, | ||
445 | .clk = "cdev2", | 444 | .clk = "cdev2", |
446 | }; | 445 | }; |
447 | 446 | ||
diff --git a/arch/arm/mach-tegra/devices.h b/arch/arm/mach-tegra/devices.h index 138c642e59f4..4f5052726495 100644 --- a/arch/arm/mach-tegra/devices.h +++ b/arch/arm/mach-tegra/devices.h | |||
@@ -22,6 +22,10 @@ | |||
22 | #include <linux/platform_device.h> | 22 | #include <linux/platform_device.h> |
23 | #include <linux/platform_data/tegra_usb.h> | 23 | #include <linux/platform_data/tegra_usb.h> |
24 | 24 | ||
25 | #include <mach/usb_phy.h> | ||
26 | |||
27 | extern struct tegra_ulpi_config tegra_ehci2_ulpi_phy_config; | ||
28 | |||
25 | extern struct tegra_ehci_platform_data tegra_ehci1_pdata; | 29 | extern struct tegra_ehci_platform_data tegra_ehci1_pdata; |
26 | extern struct tegra_ehci_platform_data tegra_ehci2_pdata; | 30 | extern struct tegra_ehci_platform_data tegra_ehci2_pdata; |
27 | extern struct tegra_ehci_platform_data tegra_ehci3_pdata; | 31 | extern struct tegra_ehci_platform_data tegra_ehci3_pdata; |
diff --git a/arch/arm/mach-tegra/include/mach/tegra-ahb.h b/arch/arm/mach-tegra/include/mach/tegra-ahb.h new file mode 100644 index 000000000000..e0f8c84b1d8c --- /dev/null +++ b/arch/arm/mach-tegra/include/mach/tegra-ahb.h | |||
@@ -0,0 +1,19 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify it | ||
5 | * under the terms and conditions of the GNU General Public License, | ||
6 | * version 2, as published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
9 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
10 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
11 | * more details. | ||
12 | */ | ||
13 | |||
14 | #ifndef __MACH_TEGRA_AHB_H__ | ||
15 | #define __MACH_TEGRA_AHB_H__ | ||
16 | |||
17 | extern int tegra_ahb_enable_smmu(struct device_node *ahb); | ||
18 | |||
19 | #endif /* __MACH_TEGRA_AHB_H__ */ | ||
diff --git a/arch/arm/mach-tegra/include/mach/uncompress.h b/arch/arm/mach-tegra/include/mach/uncompress.h index 5a440f315e57..937c4c50219e 100644 --- a/arch/arm/mach-tegra/include/mach/uncompress.h +++ b/arch/arm/mach-tegra/include/mach/uncompress.h | |||
@@ -63,52 +63,86 @@ static inline void save_uart_address(void) | |||
63 | buf[0] = 0; | 63 | buf[0] = 0; |
64 | } | 64 | } |
65 | 65 | ||
66 | /* | 66 | static const struct { |
67 | * Setup before decompression. This is where we do UART selection for | 67 | u32 base; |
68 | * earlyprintk and init the uart_base register. | 68 | u32 reset_reg; |
69 | */ | 69 | u32 clock_reg; |
70 | static inline void arch_decomp_setup(void) | 70 | u32 bit; |
71 | } uarts[] = { | ||
72 | { | ||
73 | TEGRA_UARTA_BASE, | ||
74 | TEGRA_CLK_RESET_BASE + 0x04, | ||
75 | TEGRA_CLK_RESET_BASE + 0x10, | ||
76 | 6, | ||
77 | }, | ||
78 | { | ||
79 | TEGRA_UARTB_BASE, | ||
80 | TEGRA_CLK_RESET_BASE + 0x04, | ||
81 | TEGRA_CLK_RESET_BASE + 0x10, | ||
82 | 7, | ||
83 | }, | ||
84 | { | ||
85 | TEGRA_UARTC_BASE, | ||
86 | TEGRA_CLK_RESET_BASE + 0x08, | ||
87 | TEGRA_CLK_RESET_BASE + 0x14, | ||
88 | 23, | ||
89 | }, | ||
90 | { | ||
91 | TEGRA_UARTD_BASE, | ||
92 | TEGRA_CLK_RESET_BASE + 0x0c, | ||
93 | TEGRA_CLK_RESET_BASE + 0x18, | ||
94 | 1, | ||
95 | }, | ||
96 | { | ||
97 | TEGRA_UARTE_BASE, | ||
98 | TEGRA_CLK_RESET_BASE + 0x0c, | ||
99 | TEGRA_CLK_RESET_BASE + 0x18, | ||
100 | 2, | ||
101 | }, | ||
102 | }; | ||
103 | |||
104 | static inline bool uart_clocked(int i) | ||
105 | { | ||
106 | if (*(u8 *)uarts[i].reset_reg & BIT(uarts[i].bit)) | ||
107 | return false; | ||
108 | |||
109 | if (!(*(u8 *)uarts[i].clock_reg & BIT(uarts[i].bit))) | ||
110 | return false; | ||
111 | |||
112 | return true; | ||
113 | } | ||
114 | |||
115 | #ifdef CONFIG_TEGRA_DEBUG_UART_AUTO_ODMDATA | ||
116 | int auto_odmdata(void) | ||
117 | { | ||
118 | volatile u32 *pmc = (volatile u32 *)TEGRA_PMC_BASE; | ||
119 | u32 odmdata = pmc[0xa0 / 4]; | ||
120 | |||
121 | /* | ||
122 | * Bits 19:18 are the console type: 0=default, 1=none, 2==DCC, 3==UART | ||
123 | * Some boards apparently swap the last two values, but we don't have | ||
124 | * any way of catering for that here, so we just accept either. If this | ||
125 | * doesn't make sense for your board, just don't enable this feature. | ||
126 | * | ||
127 | * Bits 17:15 indicate the UART to use, 0/1/2/3/4 are UART A/B/C/D/E. | ||
128 | */ | ||
129 | |||
130 | switch ((odmdata >> 18) & 3) { | ||
131 | case 2: | ||
132 | case 3: | ||
133 | break; | ||
134 | default: | ||
135 | return -1; | ||
136 | } | ||
137 | |||
138 | return (odmdata >> 15) & 7; | ||
139 | } | ||
140 | #endif | ||
141 | |||
142 | #ifdef CONFIG_TEGRA_DEBUG_UART_AUTO_SCRATCH | ||
143 | int auto_scratch(void) | ||
71 | { | 144 | { |
72 | static const struct { | ||
73 | u32 base; | ||
74 | u32 reset_reg; | ||
75 | u32 clock_reg; | ||
76 | u32 bit; | ||
77 | } uarts[] = { | ||
78 | { | ||
79 | TEGRA_UARTA_BASE, | ||
80 | TEGRA_CLK_RESET_BASE + 0x04, | ||
81 | TEGRA_CLK_RESET_BASE + 0x10, | ||
82 | 6, | ||
83 | }, | ||
84 | { | ||
85 | TEGRA_UARTB_BASE, | ||
86 | TEGRA_CLK_RESET_BASE + 0x04, | ||
87 | TEGRA_CLK_RESET_BASE + 0x10, | ||
88 | 7, | ||
89 | }, | ||
90 | { | ||
91 | TEGRA_UARTC_BASE, | ||
92 | TEGRA_CLK_RESET_BASE + 0x08, | ||
93 | TEGRA_CLK_RESET_BASE + 0x14, | ||
94 | 23, | ||
95 | }, | ||
96 | { | ||
97 | TEGRA_UARTD_BASE, | ||
98 | TEGRA_CLK_RESET_BASE + 0x0c, | ||
99 | TEGRA_CLK_RESET_BASE + 0x18, | ||
100 | 1, | ||
101 | }, | ||
102 | { | ||
103 | TEGRA_UARTE_BASE, | ||
104 | TEGRA_CLK_RESET_BASE + 0x0c, | ||
105 | TEGRA_CLK_RESET_BASE + 0x18, | ||
106 | 2, | ||
107 | }, | ||
108 | }; | ||
109 | int i; | 145 | int i; |
110 | volatile u32 *apb_misc = (volatile u32 *)TEGRA_APB_MISC_BASE; | ||
111 | u32 chip, div; | ||
112 | 146 | ||
113 | /* | 147 | /* |
114 | * Look for the first UART that: | 148 | * Look for the first UART that: |
@@ -125,20 +159,60 @@ static inline void arch_decomp_setup(void) | |||
125 | * back to what's specified in TEGRA_DEBUG_UART_BASE. | 159 | * back to what's specified in TEGRA_DEBUG_UART_BASE. |
126 | */ | 160 | */ |
127 | for (i = 0; i < ARRAY_SIZE(uarts); i++) { | 161 | for (i = 0; i < ARRAY_SIZE(uarts); i++) { |
128 | if (*(u8 *)uarts[i].reset_reg & BIT(uarts[i].bit)) | 162 | if (!uart_clocked(i)) |
129 | continue; | ||
130 | |||
131 | if (!(*(u8 *)uarts[i].clock_reg & BIT(uarts[i].bit))) | ||
132 | continue; | 163 | continue; |
133 | 164 | ||
134 | uart = (volatile u8 *)uarts[i].base; | 165 | uart = (volatile u8 *)uarts[i].base; |
135 | if (uart[UART_SCR << DEBUG_UART_SHIFT] != 'D') | 166 | if (uart[UART_SCR << DEBUG_UART_SHIFT] != 'D') |
136 | continue; | 167 | continue; |
137 | 168 | ||
138 | break; | 169 | return i; |
139 | } | 170 | } |
140 | if (i == ARRAY_SIZE(uarts)) | 171 | |
141 | uart = (volatile u8 *)TEGRA_DEBUG_UART_BASE; | 172 | return -1; |
173 | } | ||
174 | #endif | ||
175 | |||
176 | /* | ||
177 | * Setup before decompression. This is where we do UART selection for | ||
178 | * earlyprintk and init the uart_base register. | ||
179 | */ | ||
180 | static inline void arch_decomp_setup(void) | ||
181 | { | ||
182 | int uart_id, auto_uart_id; | ||
183 | volatile u32 *apb_misc = (volatile u32 *)TEGRA_APB_MISC_BASE; | ||
184 | u32 chip, div; | ||
185 | |||
186 | #if defined(CONFIG_TEGRA_DEBUG_UARTA) | ||
187 | uart_id = 0; | ||
188 | #elif defined(CONFIG_TEGRA_DEBUG_UARTB) | ||
189 | uart_id = 1; | ||
190 | #elif defined(CONFIG_TEGRA_DEBUG_UARTC) | ||
191 | uart_id = 2; | ||
192 | #elif defined(CONFIG_TEGRA_DEBUG_UARTD) | ||
193 | uart_id = 3; | ||
194 | #elif defined(CONFIG_TEGRA_DEBUG_UARTE) | ||
195 | uart_id = 4; | ||
196 | #else | ||
197 | uart_id = -1; | ||
198 | #endif | ||
199 | |||
200 | #if defined(CONFIG_TEGRA_DEBUG_UART_AUTO_ODMDATA) | ||
201 | auto_uart_id = auto_odmdata(); | ||
202 | #elif defined(CONFIG_TEGRA_DEBUG_UART_AUTO_SCRATCH) | ||
203 | auto_uart_id = auto_scratch(); | ||
204 | #else | ||
205 | auto_uart_id = -1; | ||
206 | #endif | ||
207 | if (auto_uart_id != -1) | ||
208 | uart_id = auto_uart_id; | ||
209 | |||
210 | if (uart_id < 0 || uart_id >= ARRAY_SIZE(uarts) || | ||
211 | !uart_clocked(uart_id)) | ||
212 | uart = NULL; | ||
213 | else | ||
214 | uart = (volatile u8 *)uarts[uart_id].base; | ||
215 | |||
142 | save_uart_address(); | 216 | save_uart_address(); |
143 | if (uart == NULL) | 217 | if (uart == NULL) |
144 | return; | 218 | return; |
diff --git a/arch/arm/mach-tegra/include/mach/usb_phy.h b/arch/arm/mach-tegra/include/mach/usb_phy.h index de1a0f602b28..935ce9f65590 100644 --- a/arch/arm/mach-tegra/include/mach/usb_phy.h +++ b/arch/arm/mach-tegra/include/mach/usb_phy.h | |||
@@ -61,8 +61,8 @@ struct tegra_usb_phy { | |||
61 | struct usb_phy *ulpi; | 61 | struct usb_phy *ulpi; |
62 | }; | 62 | }; |
63 | 63 | ||
64 | struct tegra_usb_phy *tegra_usb_phy_open(int instance, void __iomem *regs, | 64 | struct tegra_usb_phy *tegra_usb_phy_open(struct device *dev, int instance, |
65 | void *config, enum tegra_usb_phy_mode phy_mode); | 65 | void __iomem *regs, void *config, enum tegra_usb_phy_mode phy_mode); |
66 | 66 | ||
67 | int tegra_usb_phy_power_on(struct tegra_usb_phy *phy); | 67 | int tegra_usb_phy_power_on(struct tegra_usb_phy *phy); |
68 | 68 | ||
diff --git a/arch/arm/mach-tegra/powergate.c b/arch/arm/mach-tegra/powergate.c index c238699ae86f..f5b12fb4ff12 100644 --- a/arch/arm/mach-tegra/powergate.c +++ b/arch/arm/mach-tegra/powergate.c | |||
@@ -234,7 +234,7 @@ static const struct file_operations powergate_fops = { | |||
234 | .release = single_release, | 234 | .release = single_release, |
235 | }; | 235 | }; |
236 | 236 | ||
237 | static int __init powergate_debugfs_init(void) | 237 | int __init tegra_powergate_debugfs_init(void) |
238 | { | 238 | { |
239 | struct dentry *d; | 239 | struct dentry *d; |
240 | int err = -ENOMEM; | 240 | int err = -ENOMEM; |
@@ -247,6 +247,4 @@ static int __init powergate_debugfs_init(void) | |||
247 | return err; | 247 | return err; |
248 | } | 248 | } |
249 | 249 | ||
250 | late_initcall(powergate_debugfs_init); | ||
251 | |||
252 | #endif | 250 | #endif |
diff --git a/arch/arm/mach-tegra/tegra2_clocks.c b/arch/arm/mach-tegra/tegra2_clocks.c index bae09b859891..b59315ce3691 100644 --- a/arch/arm/mach-tegra/tegra2_clocks.c +++ b/arch/arm/mach-tegra/tegra2_clocks.c | |||
@@ -1486,6 +1486,10 @@ static struct clk tegra_clk_m = { | |||
1486 | }; | 1486 | }; |
1487 | 1487 | ||
1488 | static struct clk_pll_freq_table tegra_pll_c_freq_table[] = { | 1488 | static struct clk_pll_freq_table tegra_pll_c_freq_table[] = { |
1489 | { 12000000, 600000000, 600, 12, 1, 8 }, | ||
1490 | { 13000000, 600000000, 600, 13, 1, 8 }, | ||
1491 | { 19200000, 600000000, 500, 16, 1, 6 }, | ||
1492 | { 26000000, 600000000, 600, 26, 1, 8 }, | ||
1489 | { 0, 0, 0, 0, 0, 0 }, | 1493 | { 0, 0, 0, 0, 0, 0 }, |
1490 | }; | 1494 | }; |
1491 | 1495 | ||
diff --git a/arch/arm/mach-tegra/tegra30_clocks.c b/arch/arm/mach-tegra/tegra30_clocks.c index 6d08b53f92d2..e33fe4b14a2a 100644 --- a/arch/arm/mach-tegra/tegra30_clocks.c +++ b/arch/arm/mach-tegra/tegra30_clocks.c | |||
@@ -3015,6 +3015,15 @@ struct clk_duplicate tegra_clk_duplicates[] = { | |||
3015 | CLK_DUPLICATE("sbc6", "spi_slave_tegra.5", NULL), | 3015 | CLK_DUPLICATE("sbc6", "spi_slave_tegra.5", NULL), |
3016 | CLK_DUPLICATE("twd", "smp_twd", NULL), | 3016 | CLK_DUPLICATE("twd", "smp_twd", NULL), |
3017 | CLK_DUPLICATE("vcp", "nvavp", "vcp"), | 3017 | CLK_DUPLICATE("vcp", "nvavp", "vcp"), |
3018 | CLK_DUPLICATE("i2s0", NULL, "i2s0"), | ||
3019 | CLK_DUPLICATE("i2s1", NULL, "i2s1"), | ||
3020 | CLK_DUPLICATE("i2s2", NULL, "i2s2"), | ||
3021 | CLK_DUPLICATE("i2s3", NULL, "i2s3"), | ||
3022 | CLK_DUPLICATE("i2s4", NULL, "i2s4"), | ||
3023 | CLK_DUPLICATE("dam0", NULL, "dam0"), | ||
3024 | CLK_DUPLICATE("dam1", NULL, "dam1"), | ||
3025 | CLK_DUPLICATE("dam2", NULL, "dam2"), | ||
3026 | CLK_DUPLICATE("spdif_in", NULL, "spdif_in"), | ||
3018 | }; | 3027 | }; |
3019 | 3028 | ||
3020 | struct clk *tegra_ptr_clks[] = { | 3029 | struct clk *tegra_ptr_clks[] = { |
diff --git a/arch/arm/mach-tegra/usb_phy.c b/arch/arm/mach-tegra/usb_phy.c index d71d2fed6721..54e353c8e304 100644 --- a/arch/arm/mach-tegra/usb_phy.c +++ b/arch/arm/mach-tegra/usb_phy.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/platform_device.h> | 26 | #include <linux/platform_device.h> |
27 | #include <linux/io.h> | 27 | #include <linux/io.h> |
28 | #include <linux/gpio.h> | 28 | #include <linux/gpio.h> |
29 | #include <linux/of_gpio.h> | ||
29 | #include <linux/usb/otg.h> | 30 | #include <linux/usb/otg.h> |
30 | #include <linux/usb/ulpi.h> | 31 | #include <linux/usb/ulpi.h> |
31 | #include <asm/mach-types.h> | 32 | #include <asm/mach-types.h> |
@@ -654,8 +655,8 @@ static void ulpi_phy_power_off(struct tegra_usb_phy *phy) | |||
654 | clk_disable(phy->clk); | 655 | clk_disable(phy->clk); |
655 | } | 656 | } |
656 | 657 | ||
657 | struct tegra_usb_phy *tegra_usb_phy_open(int instance, void __iomem *regs, | 658 | struct tegra_usb_phy *tegra_usb_phy_open(struct device *dev, int instance, |
658 | void *config, enum tegra_usb_phy_mode phy_mode) | 659 | void __iomem *regs, void *config, enum tegra_usb_phy_mode phy_mode) |
659 | { | 660 | { |
660 | struct tegra_usb_phy *phy; | 661 | struct tegra_usb_phy *phy; |
661 | struct tegra_ulpi_config *ulpi_config; | 662 | struct tegra_ulpi_config *ulpi_config; |
@@ -711,6 +712,16 @@ struct tegra_usb_phy *tegra_usb_phy_open(int instance, void __iomem *regs, | |||
711 | err = -ENXIO; | 712 | err = -ENXIO; |
712 | goto err1; | 713 | goto err1; |
713 | } | 714 | } |
715 | if (!gpio_is_valid(ulpi_config->reset_gpio)) | ||
716 | ulpi_config->reset_gpio = | ||
717 | of_get_named_gpio(dev->of_node, | ||
718 | "nvidia,phy-reset-gpio", 0); | ||
719 | if (!gpio_is_valid(ulpi_config->reset_gpio)) { | ||
720 | pr_err("%s: invalid reset gpio: %d\n", __func__, | ||
721 | ulpi_config->reset_gpio); | ||
722 | err = -EINVAL; | ||
723 | goto err1; | ||
724 | } | ||
714 | gpio_request(ulpi_config->reset_gpio, "ulpi_phy_reset_b"); | 725 | gpio_request(ulpi_config->reset_gpio, "ulpi_phy_reset_b"); |
715 | gpio_direction_output(ulpi_config->reset_gpio, 0); | 726 | gpio_direction_output(ulpi_config->reset_gpio, 0); |
716 | phy->ulpi = otg_ulpi_create(&ulpi_viewport_access_ops, 0); | 727 | phy->ulpi = otg_ulpi_create(&ulpi_viewport_access_ops, 0); |
diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c index f943687acaf0..fba8adea421e 100644 --- a/arch/arm/mach-ux500/board-mop500.c +++ b/arch/arm/mach-ux500/board-mop500.c | |||
@@ -206,7 +206,7 @@ static struct resource ab8500_resources[] = { | |||
206 | }; | 206 | }; |
207 | 207 | ||
208 | struct platform_device ab8500_device = { | 208 | struct platform_device ab8500_device = { |
209 | .name = "ab8500-i2c", | 209 | .name = "ab8500-core", |
210 | .id = 0, | 210 | .id = 0, |
211 | .dev = { | 211 | .dev = { |
212 | .platform_data = &ab8500_platdata, | 212 | .platform_data = &ab8500_platdata, |
@@ -785,6 +785,7 @@ MACHINE_START(U8500, "ST-Ericsson MOP500 platform") | |||
785 | .timer = &ux500_timer, | 785 | .timer = &ux500_timer, |
786 | .handle_irq = gic_handle_irq, | 786 | .handle_irq = gic_handle_irq, |
787 | .init_machine = mop500_init_machine, | 787 | .init_machine = mop500_init_machine, |
788 | .init_late = ux500_init_late, | ||
788 | MACHINE_END | 789 | MACHINE_END |
789 | 790 | ||
790 | MACHINE_START(HREFV60, "ST-Ericsson U8500 Platform HREFv60+") | 791 | MACHINE_START(HREFV60, "ST-Ericsson U8500 Platform HREFv60+") |
@@ -794,6 +795,7 @@ MACHINE_START(HREFV60, "ST-Ericsson U8500 Platform HREFv60+") | |||
794 | .timer = &ux500_timer, | 795 | .timer = &ux500_timer, |
795 | .handle_irq = gic_handle_irq, | 796 | .handle_irq = gic_handle_irq, |
796 | .init_machine = hrefv60_init_machine, | 797 | .init_machine = hrefv60_init_machine, |
798 | .init_late = ux500_init_late, | ||
797 | MACHINE_END | 799 | MACHINE_END |
798 | 800 | ||
799 | MACHINE_START(SNOWBALL, "Calao Systems Snowball platform") | 801 | MACHINE_START(SNOWBALL, "Calao Systems Snowball platform") |
@@ -804,6 +806,7 @@ MACHINE_START(SNOWBALL, "Calao Systems Snowball platform") | |||
804 | .timer = &ux500_timer, | 806 | .timer = &ux500_timer, |
805 | .handle_irq = gic_handle_irq, | 807 | .handle_irq = gic_handle_irq, |
806 | .init_machine = snowball_init_machine, | 808 | .init_machine = snowball_init_machine, |
809 | .init_late = ux500_init_late, | ||
807 | MACHINE_END | 810 | MACHINE_END |
808 | 811 | ||
809 | #ifdef CONFIG_MACH_UX500_DT | 812 | #ifdef CONFIG_MACH_UX500_DT |
@@ -918,6 +921,7 @@ DT_MACHINE_START(U8500_DT, "ST-Ericsson U8500 platform (Device Tree Support)") | |||
918 | .timer = &ux500_timer, | 921 | .timer = &ux500_timer, |
919 | .handle_irq = gic_handle_irq, | 922 | .handle_irq = gic_handle_irq, |
920 | .init_machine = u8500_init_machine, | 923 | .init_machine = u8500_init_machine, |
924 | .init_late = ux500_init_late, | ||
921 | .dt_compat = u8500_dt_board_compat, | 925 | .dt_compat = u8500_dt_board_compat, |
922 | MACHINE_END | 926 | MACHINE_END |
923 | #endif | 927 | #endif |
diff --git a/arch/arm/mach-ux500/clock.c b/arch/arm/mach-ux500/clock.c index 1762c4728f1e..8d73b066a18d 100644 --- a/arch/arm/mach-ux500/clock.c +++ b/arch/arm/mach-ux500/clock.c | |||
@@ -635,7 +635,7 @@ static int clk_debugfs_register(struct clk *c) | |||
635 | return 0; | 635 | return 0; |
636 | } | 636 | } |
637 | 637 | ||
638 | static int __init clk_debugfs_init(void) | 638 | int __init clk_debugfs_init(void) |
639 | { | 639 | { |
640 | struct clk *c; | 640 | struct clk *c; |
641 | struct dentry *d; | 641 | struct dentry *d; |
@@ -657,7 +657,6 @@ err_out: | |||
657 | return err; | 657 | return err; |
658 | } | 658 | } |
659 | 659 | ||
660 | late_initcall(clk_debugfs_init); | ||
661 | #endif /* defined(CONFIG_DEBUG_FS) */ | 660 | #endif /* defined(CONFIG_DEBUG_FS) */ |
662 | 661 | ||
663 | unsigned long clk_smp_twd_rate = 500000000; | 662 | unsigned long clk_smp_twd_rate = 500000000; |
@@ -696,12 +695,11 @@ static struct notifier_block clk_twd_cpufreq_nb = { | |||
696 | .notifier_call = clk_twd_cpufreq_transition, | 695 | .notifier_call = clk_twd_cpufreq_transition, |
697 | }; | 696 | }; |
698 | 697 | ||
699 | static int clk_init_smp_twd_cpufreq(void) | 698 | int clk_init_smp_twd_cpufreq(void) |
700 | { | 699 | { |
701 | return cpufreq_register_notifier(&clk_twd_cpufreq_nb, | 700 | return cpufreq_register_notifier(&clk_twd_cpufreq_nb, |
702 | CPUFREQ_TRANSITION_NOTIFIER); | 701 | CPUFREQ_TRANSITION_NOTIFIER); |
703 | } | 702 | } |
704 | late_initcall(clk_init_smp_twd_cpufreq); | ||
705 | 703 | ||
706 | #endif | 704 | #endif |
707 | 705 | ||
diff --git a/arch/arm/mach-ux500/clock.h b/arch/arm/mach-ux500/clock.h index d776ada08dbf..65d27a13f46d 100644 --- a/arch/arm/mach-ux500/clock.h +++ b/arch/arm/mach-ux500/clock.h | |||
@@ -150,3 +150,15 @@ struct clk clk_##_name = { \ | |||
150 | 150 | ||
151 | int __init clk_db8500_ed_fixup(void); | 151 | int __init clk_db8500_ed_fixup(void); |
152 | int __init clk_init(void); | 152 | int __init clk_init(void); |
153 | |||
154 | #ifdef CONFIG_DEBUG_FS | ||
155 | int clk_debugfs_init(void); | ||
156 | #else | ||
157 | static inline int clk_debugfs_init(void) { return 0; } | ||
158 | #endif | ||
159 | |||
160 | #ifdef CONFIG_CPU_FREQ | ||
161 | int clk_init_smp_twd_cpufreq(void); | ||
162 | #else | ||
163 | static inline int clk_init_smp_twd_cpufreq(void) { return 0; } | ||
164 | #endif | ||
diff --git a/arch/arm/mach-ux500/cpu.c b/arch/arm/mach-ux500/cpu.c index a29a0e3adcf9..e2360e7c770d 100644 --- a/arch/arm/mach-ux500/cpu.c +++ b/arch/arm/mach-ux500/cpu.c | |||
@@ -73,6 +73,12 @@ void __init ux500_init_irq(void) | |||
73 | clk_init(); | 73 | clk_init(); |
74 | } | 74 | } |
75 | 75 | ||
76 | void __init ux500_init_late(void) | ||
77 | { | ||
78 | clk_debugfs_init(); | ||
79 | clk_init_smp_twd_cpufreq(); | ||
80 | } | ||
81 | |||
76 | static const char * __init ux500_get_machine(void) | 82 | static const char * __init ux500_get_machine(void) |
77 | { | 83 | { |
78 | return kasprintf(GFP_KERNEL, "DB%4x", dbx500_partnumber()); | 84 | return kasprintf(GFP_KERNEL, "DB%4x", dbx500_partnumber()); |
diff --git a/arch/arm/mach-ux500/include/mach/setup.h b/arch/arm/mach-ux500/include/mach/setup.h index 4e369f1645ec..8b7ed82a2866 100644 --- a/arch/arm/mach-ux500/include/mach/setup.h +++ b/arch/arm/mach-ux500/include/mach/setup.h | |||
@@ -20,6 +20,7 @@ extern void __init u8500_map_io(void); | |||
20 | extern struct device * __init u8500_init_devices(void); | 20 | extern struct device * __init u8500_init_devices(void); |
21 | 21 | ||
22 | extern void __init ux500_init_irq(void); | 22 | extern void __init ux500_init_irq(void); |
23 | extern void __init ux500_init_late(void); | ||
23 | 24 | ||
24 | extern struct device *ux500_soc_device_init(const char *soc_id); | 25 | extern struct device *ux500_soc_device_init(const char *soc_id); |
25 | 26 | ||
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index db23ae4aaaab..ea6b43154090 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c | |||
@@ -17,8 +17,12 @@ | |||
17 | #include <linux/init.h> | 17 | #include <linux/init.h> |
18 | #include <linux/device.h> | 18 | #include <linux/device.h> |
19 | #include <linux/dma-mapping.h> | 19 | #include <linux/dma-mapping.h> |
20 | #include <linux/dma-contiguous.h> | ||
20 | #include <linux/highmem.h> | 21 | #include <linux/highmem.h> |
22 | #include <linux/memblock.h> | ||
21 | #include <linux/slab.h> | 23 | #include <linux/slab.h> |
24 | #include <linux/iommu.h> | ||
25 | #include <linux/vmalloc.h> | ||
22 | 26 | ||
23 | #include <asm/memory.h> | 27 | #include <asm/memory.h> |
24 | #include <asm/highmem.h> | 28 | #include <asm/highmem.h> |
@@ -26,9 +30,112 @@ | |||
26 | #include <asm/tlbflush.h> | 30 | #include <asm/tlbflush.h> |
27 | #include <asm/sizes.h> | 31 | #include <asm/sizes.h> |
28 | #include <asm/mach/arch.h> | 32 | #include <asm/mach/arch.h> |
33 | #include <asm/dma-iommu.h> | ||
34 | #include <asm/mach/map.h> | ||
35 | #include <asm/system_info.h> | ||
36 | #include <asm/dma-contiguous.h> | ||
29 | 37 | ||
30 | #include "mm.h" | 38 | #include "mm.h" |
31 | 39 | ||
40 | /* | ||
41 | * The DMA API is built upon the notion of "buffer ownership". A buffer | ||
42 | * is either exclusively owned by the CPU (and therefore may be accessed | ||
43 | * by it) or exclusively owned by the DMA device. These helper functions | ||
44 | * represent the transitions between these two ownership states. | ||
45 | * | ||
46 | * Note, however, that on later ARMs, this notion does not work due to | ||
47 | * speculative prefetches. We model our approach on the assumption that | ||
48 | * the CPU does do speculative prefetches, which means we clean caches | ||
49 | * before transfers and delay cache invalidation until transfer completion. | ||
50 | * | ||
51 | */ | ||
52 | static void __dma_page_cpu_to_dev(struct page *, unsigned long, | ||
53 | size_t, enum dma_data_direction); | ||
54 | static void __dma_page_dev_to_cpu(struct page *, unsigned long, | ||
55 | size_t, enum dma_data_direction); | ||
56 | |||
57 | /** | ||
58 | * arm_dma_map_page - map a portion of a page for streaming DMA | ||
59 | * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices | ||
60 | * @page: page that buffer resides in | ||
61 | * @offset: offset into page for start of buffer | ||
62 | * @size: size of buffer to map | ||
63 | * @dir: DMA transfer direction | ||
64 | * | ||
65 | * Ensure that any data held in the cache is appropriately discarded | ||
66 | * or written back. | ||
67 | * | ||
68 | * The device owns this memory once this call has completed. The CPU | ||
69 | * can regain ownership by calling dma_unmap_page(). | ||
70 | */ | ||
71 | static dma_addr_t arm_dma_map_page(struct device *dev, struct page *page, | ||
72 | unsigned long offset, size_t size, enum dma_data_direction dir, | ||
73 | struct dma_attrs *attrs) | ||
74 | { | ||
75 | if (!arch_is_coherent()) | ||
76 | __dma_page_cpu_to_dev(page, offset, size, dir); | ||
77 | return pfn_to_dma(dev, page_to_pfn(page)) + offset; | ||
78 | } | ||
79 | |||
80 | /** | ||
81 | * arm_dma_unmap_page - unmap a buffer previously mapped through dma_map_page() | ||
82 | * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices | ||
83 | * @handle: DMA address of buffer | ||
84 | * @size: size of buffer (same as passed to dma_map_page) | ||
85 | * @dir: DMA transfer direction (same as passed to dma_map_page) | ||
86 | * | ||
87 | * Unmap a page streaming mode DMA translation. The handle and size | ||
88 | * must match what was provided in the previous dma_map_page() call. | ||
89 | * All other usages are undefined. | ||
90 | * | ||
91 | * After this call, reads by the CPU to the buffer are guaranteed to see | ||
92 | * whatever the device wrote there. | ||
93 | */ | ||
94 | static void arm_dma_unmap_page(struct device *dev, dma_addr_t handle, | ||
95 | size_t size, enum dma_data_direction dir, | ||
96 | struct dma_attrs *attrs) | ||
97 | { | ||
98 | if (!arch_is_coherent()) | ||
99 | __dma_page_dev_to_cpu(pfn_to_page(dma_to_pfn(dev, handle)), | ||
100 | handle & ~PAGE_MASK, size, dir); | ||
101 | } | ||
102 | |||
103 | static void arm_dma_sync_single_for_cpu(struct device *dev, | ||
104 | dma_addr_t handle, size_t size, enum dma_data_direction dir) | ||
105 | { | ||
106 | unsigned int offset = handle & (PAGE_SIZE - 1); | ||
107 | struct page *page = pfn_to_page(dma_to_pfn(dev, handle-offset)); | ||
108 | if (!arch_is_coherent()) | ||
109 | __dma_page_dev_to_cpu(page, offset, size, dir); | ||
110 | } | ||
111 | |||
112 | static void arm_dma_sync_single_for_device(struct device *dev, | ||
113 | dma_addr_t handle, size_t size, enum dma_data_direction dir) | ||
114 | { | ||
115 | unsigned int offset = handle & (PAGE_SIZE - 1); | ||
116 | struct page *page = pfn_to_page(dma_to_pfn(dev, handle-offset)); | ||
117 | if (!arch_is_coherent()) | ||
118 | __dma_page_cpu_to_dev(page, offset, size, dir); | ||
119 | } | ||
120 | |||
121 | static int arm_dma_set_mask(struct device *dev, u64 dma_mask); | ||
122 | |||
123 | struct dma_map_ops arm_dma_ops = { | ||
124 | .alloc = arm_dma_alloc, | ||
125 | .free = arm_dma_free, | ||
126 | .mmap = arm_dma_mmap, | ||
127 | .map_page = arm_dma_map_page, | ||
128 | .unmap_page = arm_dma_unmap_page, | ||
129 | .map_sg = arm_dma_map_sg, | ||
130 | .unmap_sg = arm_dma_unmap_sg, | ||
131 | .sync_single_for_cpu = arm_dma_sync_single_for_cpu, | ||
132 | .sync_single_for_device = arm_dma_sync_single_for_device, | ||
133 | .sync_sg_for_cpu = arm_dma_sync_sg_for_cpu, | ||
134 | .sync_sg_for_device = arm_dma_sync_sg_for_device, | ||
135 | .set_dma_mask = arm_dma_set_mask, | ||
136 | }; | ||
137 | EXPORT_SYMBOL(arm_dma_ops); | ||
138 | |||
32 | static u64 get_coherent_dma_mask(struct device *dev) | 139 | static u64 get_coherent_dma_mask(struct device *dev) |
33 | { | 140 | { |
34 | u64 mask = (u64)arm_dma_limit; | 141 | u64 mask = (u64)arm_dma_limit; |
@@ -56,6 +163,21 @@ static u64 get_coherent_dma_mask(struct device *dev) | |||
56 | return mask; | 163 | return mask; |
57 | } | 164 | } |
58 | 165 | ||
166 | static void __dma_clear_buffer(struct page *page, size_t size) | ||
167 | { | ||
168 | void *ptr; | ||
169 | /* | ||
170 | * Ensure that the allocated pages are zeroed, and that any data | ||
171 | * lurking in the kernel direct-mapped region is invalidated. | ||
172 | */ | ||
173 | ptr = page_address(page); | ||
174 | if (ptr) { | ||
175 | memset(ptr, 0, size); | ||
176 | dmac_flush_range(ptr, ptr + size); | ||
177 | outer_flush_range(__pa(ptr), __pa(ptr) + size); | ||
178 | } | ||
179 | } | ||
180 | |||
59 | /* | 181 | /* |
60 | * Allocate a DMA buffer for 'dev' of size 'size' using the | 182 | * Allocate a DMA buffer for 'dev' of size 'size' using the |
61 | * specified gfp mask. Note that 'size' must be page aligned. | 183 | * specified gfp mask. Note that 'size' must be page aligned. |
@@ -64,23 +186,6 @@ static struct page *__dma_alloc_buffer(struct device *dev, size_t size, gfp_t gf | |||
64 | { | 186 | { |
65 | unsigned long order = get_order(size); | 187 | unsigned long order = get_order(size); |
66 | struct page *page, *p, *e; | 188 | struct page *page, *p, *e; |
67 | void *ptr; | ||
68 | u64 mask = get_coherent_dma_mask(dev); | ||
69 | |||
70 | #ifdef CONFIG_DMA_API_DEBUG | ||
71 | u64 limit = (mask + 1) & ~mask; | ||
72 | if (limit && size >= limit) { | ||
73 | dev_warn(dev, "coherent allocation too big (requested %#x mask %#llx)\n", | ||
74 | size, mask); | ||
75 | return NULL; | ||
76 | } | ||
77 | #endif | ||
78 | |||
79 | if (!mask) | ||
80 | return NULL; | ||
81 | |||
82 | if (mask < 0xffffffffULL) | ||
83 | gfp |= GFP_DMA; | ||
84 | 189 | ||
85 | page = alloc_pages(gfp, order); | 190 | page = alloc_pages(gfp, order); |
86 | if (!page) | 191 | if (!page) |
@@ -93,14 +198,7 @@ static struct page *__dma_alloc_buffer(struct device *dev, size_t size, gfp_t gf | |||
93 | for (p = page + (size >> PAGE_SHIFT), e = page + (1 << order); p < e; p++) | 198 | for (p = page + (size >> PAGE_SHIFT), e = page + (1 << order); p < e; p++) |
94 | __free_page(p); | 199 | __free_page(p); |
95 | 200 | ||
96 | /* | 201 | __dma_clear_buffer(page, size); |
97 | * Ensure that the allocated pages are zeroed, and that any data | ||
98 | * lurking in the kernel direct-mapped region is invalidated. | ||
99 | */ | ||
100 | ptr = page_address(page); | ||
101 | memset(ptr, 0, size); | ||
102 | dmac_flush_range(ptr, ptr + size); | ||
103 | outer_flush_range(__pa(ptr), __pa(ptr) + size); | ||
104 | 202 | ||
105 | return page; | 203 | return page; |
106 | } | 204 | } |
@@ -170,6 +268,11 @@ static int __init consistent_init(void) | |||
170 | unsigned long base = consistent_base; | 268 | unsigned long base = consistent_base; |
171 | unsigned long num_ptes = (CONSISTENT_END - base) >> PMD_SHIFT; | 269 | unsigned long num_ptes = (CONSISTENT_END - base) >> PMD_SHIFT; |
172 | 270 | ||
271 | #ifndef CONFIG_ARM_DMA_USE_IOMMU | ||
272 | if (cpu_architecture() >= CPU_ARCH_ARMv6) | ||
273 | return 0; | ||
274 | #endif | ||
275 | |||
173 | consistent_pte = kmalloc(num_ptes * sizeof(pte_t), GFP_KERNEL); | 276 | consistent_pte = kmalloc(num_ptes * sizeof(pte_t), GFP_KERNEL); |
174 | if (!consistent_pte) { | 277 | if (!consistent_pte) { |
175 | pr_err("%s: no memory\n", __func__); | 278 | pr_err("%s: no memory\n", __func__); |
@@ -184,14 +287,14 @@ static int __init consistent_init(void) | |||
184 | 287 | ||
185 | pud = pud_alloc(&init_mm, pgd, base); | 288 | pud = pud_alloc(&init_mm, pgd, base); |
186 | if (!pud) { | 289 | if (!pud) { |
187 | printk(KERN_ERR "%s: no pud tables\n", __func__); | 290 | pr_err("%s: no pud tables\n", __func__); |
188 | ret = -ENOMEM; | 291 | ret = -ENOMEM; |
189 | break; | 292 | break; |
190 | } | 293 | } |
191 | 294 | ||
192 | pmd = pmd_alloc(&init_mm, pud, base); | 295 | pmd = pmd_alloc(&init_mm, pud, base); |
193 | if (!pmd) { | 296 | if (!pmd) { |
194 | printk(KERN_ERR "%s: no pmd tables\n", __func__); | 297 | pr_err("%s: no pmd tables\n", __func__); |
195 | ret = -ENOMEM; | 298 | ret = -ENOMEM; |
196 | break; | 299 | break; |
197 | } | 300 | } |
@@ -199,7 +302,7 @@ static int __init consistent_init(void) | |||
199 | 302 | ||
200 | pte = pte_alloc_kernel(pmd, base); | 303 | pte = pte_alloc_kernel(pmd, base); |
201 | if (!pte) { | 304 | if (!pte) { |
202 | printk(KERN_ERR "%s: no pte tables\n", __func__); | 305 | pr_err("%s: no pte tables\n", __func__); |
203 | ret = -ENOMEM; | 306 | ret = -ENOMEM; |
204 | break; | 307 | break; |
205 | } | 308 | } |
@@ -210,9 +313,101 @@ static int __init consistent_init(void) | |||
210 | 313 | ||
211 | return ret; | 314 | return ret; |
212 | } | 315 | } |
213 | |||
214 | core_initcall(consistent_init); | 316 | core_initcall(consistent_init); |
215 | 317 | ||
318 | static void *__alloc_from_contiguous(struct device *dev, size_t size, | ||
319 | pgprot_t prot, struct page **ret_page); | ||
320 | |||
321 | static struct arm_vmregion_head coherent_head = { | ||
322 | .vm_lock = __SPIN_LOCK_UNLOCKED(&coherent_head.vm_lock), | ||
323 | .vm_list = LIST_HEAD_INIT(coherent_head.vm_list), | ||
324 | }; | ||
325 | |||
326 | size_t coherent_pool_size = DEFAULT_CONSISTENT_DMA_SIZE / 8; | ||
327 | |||
328 | static int __init early_coherent_pool(char *p) | ||
329 | { | ||
330 | coherent_pool_size = memparse(p, &p); | ||
331 | return 0; | ||
332 | } | ||
333 | early_param("coherent_pool", early_coherent_pool); | ||
334 | |||
335 | /* | ||
336 | * Initialise the coherent pool for atomic allocations. | ||
337 | */ | ||
338 | static int __init coherent_init(void) | ||
339 | { | ||
340 | pgprot_t prot = pgprot_dmacoherent(pgprot_kernel); | ||
341 | size_t size = coherent_pool_size; | ||
342 | struct page *page; | ||
343 | void *ptr; | ||
344 | |||
345 | if (cpu_architecture() < CPU_ARCH_ARMv6) | ||
346 | return 0; | ||
347 | |||
348 | ptr = __alloc_from_contiguous(NULL, size, prot, &page); | ||
349 | if (ptr) { | ||
350 | coherent_head.vm_start = (unsigned long) ptr; | ||
351 | coherent_head.vm_end = (unsigned long) ptr + size; | ||
352 | printk(KERN_INFO "DMA: preallocated %u KiB pool for atomic coherent allocations\n", | ||
353 | (unsigned)size / 1024); | ||
354 | return 0; | ||
355 | } | ||
356 | printk(KERN_ERR "DMA: failed to allocate %u KiB pool for atomic coherent allocation\n", | ||
357 | (unsigned)size / 1024); | ||
358 | return -ENOMEM; | ||
359 | } | ||
360 | /* | ||
361 | * CMA is activated by core_initcall, so we must be called after it. | ||
362 | */ | ||
363 | postcore_initcall(coherent_init); | ||
364 | |||
365 | struct dma_contig_early_reserve { | ||
366 | phys_addr_t base; | ||
367 | unsigned long size; | ||
368 | }; | ||
369 | |||
370 | static struct dma_contig_early_reserve dma_mmu_remap[MAX_CMA_AREAS] __initdata; | ||
371 | |||
372 | static int dma_mmu_remap_num __initdata; | ||
373 | |||
374 | void __init dma_contiguous_early_fixup(phys_addr_t base, unsigned long size) | ||
375 | { | ||
376 | dma_mmu_remap[dma_mmu_remap_num].base = base; | ||
377 | dma_mmu_remap[dma_mmu_remap_num].size = size; | ||
378 | dma_mmu_remap_num++; | ||
379 | } | ||
380 | |||
381 | void __init dma_contiguous_remap(void) | ||
382 | { | ||
383 | int i; | ||
384 | for (i = 0; i < dma_mmu_remap_num; i++) { | ||
385 | phys_addr_t start = dma_mmu_remap[i].base; | ||
386 | phys_addr_t end = start + dma_mmu_remap[i].size; | ||
387 | struct map_desc map; | ||
388 | unsigned long addr; | ||
389 | |||
390 | if (end > arm_lowmem_limit) | ||
391 | end = arm_lowmem_limit; | ||
392 | if (start >= end) | ||
393 | return; | ||
394 | |||
395 | map.pfn = __phys_to_pfn(start); | ||
396 | map.virtual = __phys_to_virt(start); | ||
397 | map.length = end - start; | ||
398 | map.type = MT_MEMORY_DMA_READY; | ||
399 | |||
400 | /* | ||
401 | * Clear previous low-memory mapping | ||
402 | */ | ||
403 | for (addr = __phys_to_virt(start); addr < __phys_to_virt(end); | ||
404 | addr += PMD_SIZE) | ||
405 | pmd_clear(pmd_off_k(addr)); | ||
406 | |||
407 | iotable_init(&map, 1); | ||
408 | } | ||
409 | } | ||
410 | |||
216 | static void * | 411 | static void * |
217 | __dma_alloc_remap(struct page *page, size_t size, gfp_t gfp, pgprot_t prot, | 412 | __dma_alloc_remap(struct page *page, size_t size, gfp_t gfp, pgprot_t prot, |
218 | const void *caller) | 413 | const void *caller) |
@@ -222,7 +417,7 @@ __dma_alloc_remap(struct page *page, size_t size, gfp_t gfp, pgprot_t prot, | |||
222 | int bit; | 417 | int bit; |
223 | 418 | ||
224 | if (!consistent_pte) { | 419 | if (!consistent_pte) { |
225 | printk(KERN_ERR "%s: not initialised\n", __func__); | 420 | pr_err("%s: not initialised\n", __func__); |
226 | dump_stack(); | 421 | dump_stack(); |
227 | return NULL; | 422 | return NULL; |
228 | } | 423 | } |
@@ -249,7 +444,7 @@ __dma_alloc_remap(struct page *page, size_t size, gfp_t gfp, pgprot_t prot, | |||
249 | u32 off = CONSISTENT_OFFSET(c->vm_start) & (PTRS_PER_PTE-1); | 444 | u32 off = CONSISTENT_OFFSET(c->vm_start) & (PTRS_PER_PTE-1); |
250 | 445 | ||
251 | pte = consistent_pte[idx] + off; | 446 | pte = consistent_pte[idx] + off; |
252 | c->vm_pages = page; | 447 | c->priv = page; |
253 | 448 | ||
254 | do { | 449 | do { |
255 | BUG_ON(!pte_none(*pte)); | 450 | BUG_ON(!pte_none(*pte)); |
@@ -281,14 +476,14 @@ static void __dma_free_remap(void *cpu_addr, size_t size) | |||
281 | 476 | ||
282 | c = arm_vmregion_find_remove(&consistent_head, (unsigned long)cpu_addr); | 477 | c = arm_vmregion_find_remove(&consistent_head, (unsigned long)cpu_addr); |
283 | if (!c) { | 478 | if (!c) { |
284 | printk(KERN_ERR "%s: trying to free invalid coherent area: %p\n", | 479 | pr_err("%s: trying to free invalid coherent area: %p\n", |
285 | __func__, cpu_addr); | 480 | __func__, cpu_addr); |
286 | dump_stack(); | 481 | dump_stack(); |
287 | return; | 482 | return; |
288 | } | 483 | } |
289 | 484 | ||
290 | if ((c->vm_end - c->vm_start) != size) { | 485 | if ((c->vm_end - c->vm_start) != size) { |
291 | printk(KERN_ERR "%s: freeing wrong coherent size (%ld != %d)\n", | 486 | pr_err("%s: freeing wrong coherent size (%ld != %d)\n", |
292 | __func__, c->vm_end - c->vm_start, size); | 487 | __func__, c->vm_end - c->vm_start, size); |
293 | dump_stack(); | 488 | dump_stack(); |
294 | size = c->vm_end - c->vm_start; | 489 | size = c->vm_end - c->vm_start; |
@@ -310,8 +505,8 @@ static void __dma_free_remap(void *cpu_addr, size_t size) | |||
310 | } | 505 | } |
311 | 506 | ||
312 | if (pte_none(pte) || !pte_present(pte)) | 507 | if (pte_none(pte) || !pte_present(pte)) |
313 | printk(KERN_CRIT "%s: bad page in kernel page table\n", | 508 | pr_crit("%s: bad page in kernel page table\n", |
314 | __func__); | 509 | __func__); |
315 | } while (size -= PAGE_SIZE); | 510 | } while (size -= PAGE_SIZE); |
316 | 511 | ||
317 | flush_tlb_kernel_range(c->vm_start, c->vm_end); | 512 | flush_tlb_kernel_range(c->vm_start, c->vm_end); |
@@ -319,20 +514,182 @@ static void __dma_free_remap(void *cpu_addr, size_t size) | |||
319 | arm_vmregion_free(&consistent_head, c); | 514 | arm_vmregion_free(&consistent_head, c); |
320 | } | 515 | } |
321 | 516 | ||
517 | static int __dma_update_pte(pte_t *pte, pgtable_t token, unsigned long addr, | ||
518 | void *data) | ||
519 | { | ||
520 | struct page *page = virt_to_page(addr); | ||
521 | pgprot_t prot = *(pgprot_t *)data; | ||
522 | |||
523 | set_pte_ext(pte, mk_pte(page, prot), 0); | ||
524 | return 0; | ||
525 | } | ||
526 | |||
527 | static void __dma_remap(struct page *page, size_t size, pgprot_t prot) | ||
528 | { | ||
529 | unsigned long start = (unsigned long) page_address(page); | ||
530 | unsigned end = start + size; | ||
531 | |||
532 | apply_to_page_range(&init_mm, start, size, __dma_update_pte, &prot); | ||
533 | dsb(); | ||
534 | flush_tlb_kernel_range(start, end); | ||
535 | } | ||
536 | |||
537 | static void *__alloc_remap_buffer(struct device *dev, size_t size, gfp_t gfp, | ||
538 | pgprot_t prot, struct page **ret_page, | ||
539 | const void *caller) | ||
540 | { | ||
541 | struct page *page; | ||
542 | void *ptr; | ||
543 | page = __dma_alloc_buffer(dev, size, gfp); | ||
544 | if (!page) | ||
545 | return NULL; | ||
546 | |||
547 | ptr = __dma_alloc_remap(page, size, gfp, prot, caller); | ||
548 | if (!ptr) { | ||
549 | __dma_free_buffer(page, size); | ||
550 | return NULL; | ||
551 | } | ||
552 | |||
553 | *ret_page = page; | ||
554 | return ptr; | ||
555 | } | ||
556 | |||
557 | static void *__alloc_from_pool(struct device *dev, size_t size, | ||
558 | struct page **ret_page, const void *caller) | ||
559 | { | ||
560 | struct arm_vmregion *c; | ||
561 | size_t align; | ||
562 | |||
563 | if (!coherent_head.vm_start) { | ||
564 | printk(KERN_ERR "%s: coherent pool not initialised!\n", | ||
565 | __func__); | ||
566 | dump_stack(); | ||
567 | return NULL; | ||
568 | } | ||
569 | |||
570 | /* | ||
571 | * Align the region allocation - allocations from pool are rather | ||
572 | * small, so align them to their order in pages, minimum is a page | ||
573 | * size. This helps reduce fragmentation of the DMA space. | ||
574 | */ | ||
575 | align = PAGE_SIZE << get_order(size); | ||
576 | c = arm_vmregion_alloc(&coherent_head, align, size, 0, caller); | ||
577 | if (c) { | ||
578 | void *ptr = (void *)c->vm_start; | ||
579 | struct page *page = virt_to_page(ptr); | ||
580 | *ret_page = page; | ||
581 | return ptr; | ||
582 | } | ||
583 | return NULL; | ||
584 | } | ||
585 | |||
586 | static int __free_from_pool(void *cpu_addr, size_t size) | ||
587 | { | ||
588 | unsigned long start = (unsigned long)cpu_addr; | ||
589 | unsigned long end = start + size; | ||
590 | struct arm_vmregion *c; | ||
591 | |||
592 | if (start < coherent_head.vm_start || end > coherent_head.vm_end) | ||
593 | return 0; | ||
594 | |||
595 | c = arm_vmregion_find_remove(&coherent_head, (unsigned long)start); | ||
596 | |||
597 | if ((c->vm_end - c->vm_start) != size) { | ||
598 | printk(KERN_ERR "%s: freeing wrong coherent size (%ld != %d)\n", | ||
599 | __func__, c->vm_end - c->vm_start, size); | ||
600 | dump_stack(); | ||
601 | size = c->vm_end - c->vm_start; | ||
602 | } | ||
603 | |||
604 | arm_vmregion_free(&coherent_head, c); | ||
605 | return 1; | ||
606 | } | ||
607 | |||
608 | static void *__alloc_from_contiguous(struct device *dev, size_t size, | ||
609 | pgprot_t prot, struct page **ret_page) | ||
610 | { | ||
611 | unsigned long order = get_order(size); | ||
612 | size_t count = size >> PAGE_SHIFT; | ||
613 | struct page *page; | ||
614 | |||
615 | page = dma_alloc_from_contiguous(dev, count, order); | ||
616 | if (!page) | ||
617 | return NULL; | ||
618 | |||
619 | __dma_clear_buffer(page, size); | ||
620 | __dma_remap(page, size, prot); | ||
621 | |||
622 | *ret_page = page; | ||
623 | return page_address(page); | ||
624 | } | ||
625 | |||
626 | static void __free_from_contiguous(struct device *dev, struct page *page, | ||
627 | size_t size) | ||
628 | { | ||
629 | __dma_remap(page, size, pgprot_kernel); | ||
630 | dma_release_from_contiguous(dev, page, size >> PAGE_SHIFT); | ||
631 | } | ||
632 | |||
633 | static inline pgprot_t __get_dma_pgprot(struct dma_attrs *attrs, pgprot_t prot) | ||
634 | { | ||
635 | prot = dma_get_attr(DMA_ATTR_WRITE_COMBINE, attrs) ? | ||
636 | pgprot_writecombine(prot) : | ||
637 | pgprot_dmacoherent(prot); | ||
638 | return prot; | ||
639 | } | ||
640 | |||
641 | #define nommu() 0 | ||
642 | |||
322 | #else /* !CONFIG_MMU */ | 643 | #else /* !CONFIG_MMU */ |
323 | 644 | ||
324 | #define __dma_alloc_remap(page, size, gfp, prot, c) page_address(page) | 645 | #define nommu() 1 |
325 | #define __dma_free_remap(addr, size) do { } while (0) | 646 | |
647 | #define __get_dma_pgprot(attrs, prot) __pgprot(0) | ||
648 | #define __alloc_remap_buffer(dev, size, gfp, prot, ret, c) NULL | ||
649 | #define __alloc_from_pool(dev, size, ret_page, c) NULL | ||
650 | #define __alloc_from_contiguous(dev, size, prot, ret) NULL | ||
651 | #define __free_from_pool(cpu_addr, size) 0 | ||
652 | #define __free_from_contiguous(dev, page, size) do { } while (0) | ||
653 | #define __dma_free_remap(cpu_addr, size) do { } while (0) | ||
326 | 654 | ||
327 | #endif /* CONFIG_MMU */ | 655 | #endif /* CONFIG_MMU */ |
328 | 656 | ||
329 | static void * | 657 | static void *__alloc_simple_buffer(struct device *dev, size_t size, gfp_t gfp, |
330 | __dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp, | 658 | struct page **ret_page) |
331 | pgprot_t prot, const void *caller) | 659 | { |
660 | struct page *page; | ||
661 | page = __dma_alloc_buffer(dev, size, gfp); | ||
662 | if (!page) | ||
663 | return NULL; | ||
664 | |||
665 | *ret_page = page; | ||
666 | return page_address(page); | ||
667 | } | ||
668 | |||
669 | |||
670 | |||
671 | static void *__dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, | ||
672 | gfp_t gfp, pgprot_t prot, const void *caller) | ||
332 | { | 673 | { |
674 | u64 mask = get_coherent_dma_mask(dev); | ||
333 | struct page *page; | 675 | struct page *page; |
334 | void *addr; | 676 | void *addr; |
335 | 677 | ||
678 | #ifdef CONFIG_DMA_API_DEBUG | ||
679 | u64 limit = (mask + 1) & ~mask; | ||
680 | if (limit && size >= limit) { | ||
681 | dev_warn(dev, "coherent allocation too big (requested %#x mask %#llx)\n", | ||
682 | size, mask); | ||
683 | return NULL; | ||
684 | } | ||
685 | #endif | ||
686 | |||
687 | if (!mask) | ||
688 | return NULL; | ||
689 | |||
690 | if (mask < 0xffffffffULL) | ||
691 | gfp |= GFP_DMA; | ||
692 | |||
336 | /* | 693 | /* |
337 | * Following is a work-around (a.k.a. hack) to prevent pages | 694 | * Following is a work-around (a.k.a. hack) to prevent pages |
338 | * with __GFP_COMP being passed to split_page() which cannot | 695 | * with __GFP_COMP being passed to split_page() which cannot |
@@ -342,22 +699,20 @@ __dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp, | |||
342 | */ | 699 | */ |
343 | gfp &= ~(__GFP_COMP); | 700 | gfp &= ~(__GFP_COMP); |
344 | 701 | ||
345 | *handle = ~0; | 702 | *handle = DMA_ERROR_CODE; |
346 | size = PAGE_ALIGN(size); | 703 | size = PAGE_ALIGN(size); |
347 | 704 | ||
348 | page = __dma_alloc_buffer(dev, size, gfp); | 705 | if (arch_is_coherent() || nommu()) |
349 | if (!page) | 706 | addr = __alloc_simple_buffer(dev, size, gfp, &page); |
350 | return NULL; | 707 | else if (cpu_architecture() < CPU_ARCH_ARMv6) |
351 | 708 | addr = __alloc_remap_buffer(dev, size, gfp, prot, &page, caller); | |
352 | if (!arch_is_coherent()) | 709 | else if (gfp & GFP_ATOMIC) |
353 | addr = __dma_alloc_remap(page, size, gfp, prot, caller); | 710 | addr = __alloc_from_pool(dev, size, &page, caller); |
354 | else | 711 | else |
355 | addr = page_address(page); | 712 | addr = __alloc_from_contiguous(dev, size, prot, &page); |
356 | 713 | ||
357 | if (addr) | 714 | if (addr) |
358 | *handle = pfn_to_dma(dev, page_to_pfn(page)); | 715 | *handle = pfn_to_dma(dev, page_to_pfn(page)); |
359 | else | ||
360 | __dma_free_buffer(page, size); | ||
361 | 716 | ||
362 | return addr; | 717 | return addr; |
363 | } | 718 | } |
@@ -366,138 +721,71 @@ __dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp, | |||
366 | * Allocate DMA-coherent memory space and return both the kernel remapped | 721 | * Allocate DMA-coherent memory space and return both the kernel remapped |
367 | * virtual and bus address for that space. | 722 | * virtual and bus address for that space. |
368 | */ | 723 | */ |
369 | void * | 724 | void *arm_dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, |
370 | dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp) | 725 | gfp_t gfp, struct dma_attrs *attrs) |
371 | { | 726 | { |
727 | pgprot_t prot = __get_dma_pgprot(attrs, pgprot_kernel); | ||
372 | void *memory; | 728 | void *memory; |
373 | 729 | ||
374 | if (dma_alloc_from_coherent(dev, size, handle, &memory)) | 730 | if (dma_alloc_from_coherent(dev, size, handle, &memory)) |
375 | return memory; | 731 | return memory; |
376 | 732 | ||
377 | return __dma_alloc(dev, size, handle, gfp, | 733 | return __dma_alloc(dev, size, handle, gfp, prot, |
378 | pgprot_dmacoherent(pgprot_kernel), | ||
379 | __builtin_return_address(0)); | 734 | __builtin_return_address(0)); |
380 | } | 735 | } |
381 | EXPORT_SYMBOL(dma_alloc_coherent); | ||
382 | 736 | ||
383 | /* | 737 | /* |
384 | * Allocate a writecombining region, in much the same way as | 738 | * Create userspace mapping for the DMA-coherent memory. |
385 | * dma_alloc_coherent above. | ||
386 | */ | 739 | */ |
387 | void * | 740 | int arm_dma_mmap(struct device *dev, struct vm_area_struct *vma, |
388 | dma_alloc_writecombine(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp) | 741 | void *cpu_addr, dma_addr_t dma_addr, size_t size, |
389 | { | 742 | struct dma_attrs *attrs) |
390 | return __dma_alloc(dev, size, handle, gfp, | ||
391 | pgprot_writecombine(pgprot_kernel), | ||
392 | __builtin_return_address(0)); | ||
393 | } | ||
394 | EXPORT_SYMBOL(dma_alloc_writecombine); | ||
395 | |||
396 | static int dma_mmap(struct device *dev, struct vm_area_struct *vma, | ||
397 | void *cpu_addr, dma_addr_t dma_addr, size_t size) | ||
398 | { | 743 | { |
399 | int ret = -ENXIO; | 744 | int ret = -ENXIO; |
400 | #ifdef CONFIG_MMU | 745 | #ifdef CONFIG_MMU |
401 | unsigned long user_size, kern_size; | 746 | unsigned long pfn = dma_to_pfn(dev, dma_addr); |
402 | struct arm_vmregion *c; | 747 | vma->vm_page_prot = __get_dma_pgprot(attrs, vma->vm_page_prot); |
403 | 748 | ||
404 | user_size = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; | 749 | if (dma_mmap_from_coherent(dev, vma, cpu_addr, size, &ret)) |
750 | return ret; | ||
405 | 751 | ||
406 | c = arm_vmregion_find(&consistent_head, (unsigned long)cpu_addr); | 752 | ret = remap_pfn_range(vma, vma->vm_start, |
407 | if (c) { | 753 | pfn + vma->vm_pgoff, |
408 | unsigned long off = vma->vm_pgoff; | 754 | vma->vm_end - vma->vm_start, |
409 | 755 | vma->vm_page_prot); | |
410 | kern_size = (c->vm_end - c->vm_start) >> PAGE_SHIFT; | ||
411 | |||
412 | if (off < kern_size && | ||
413 | user_size <= (kern_size - off)) { | ||
414 | ret = remap_pfn_range(vma, vma->vm_start, | ||
415 | page_to_pfn(c->vm_pages) + off, | ||
416 | user_size << PAGE_SHIFT, | ||
417 | vma->vm_page_prot); | ||
418 | } | ||
419 | } | ||
420 | #endif /* CONFIG_MMU */ | 756 | #endif /* CONFIG_MMU */ |
421 | 757 | ||
422 | return ret; | 758 | return ret; |
423 | } | 759 | } |
424 | 760 | ||
425 | int dma_mmap_coherent(struct device *dev, struct vm_area_struct *vma, | ||
426 | void *cpu_addr, dma_addr_t dma_addr, size_t size) | ||
427 | { | ||
428 | vma->vm_page_prot = pgprot_dmacoherent(vma->vm_page_prot); | ||
429 | return dma_mmap(dev, vma, cpu_addr, dma_addr, size); | ||
430 | } | ||
431 | EXPORT_SYMBOL(dma_mmap_coherent); | ||
432 | |||
433 | int dma_mmap_writecombine(struct device *dev, struct vm_area_struct *vma, | ||
434 | void *cpu_addr, dma_addr_t dma_addr, size_t size) | ||
435 | { | ||
436 | vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); | ||
437 | return dma_mmap(dev, vma, cpu_addr, dma_addr, size); | ||
438 | } | ||
439 | EXPORT_SYMBOL(dma_mmap_writecombine); | ||
440 | |||
441 | /* | 761 | /* |
442 | * free a page as defined by the above mapping. | 762 | * Free a buffer as defined by the above mapping. |
443 | * Must not be called with IRQs disabled. | ||
444 | */ | 763 | */ |
445 | void dma_free_coherent(struct device *dev, size_t size, void *cpu_addr, dma_addr_t handle) | 764 | void arm_dma_free(struct device *dev, size_t size, void *cpu_addr, |
765 | dma_addr_t handle, struct dma_attrs *attrs) | ||
446 | { | 766 | { |
447 | WARN_ON(irqs_disabled()); | 767 | struct page *page = pfn_to_page(dma_to_pfn(dev, handle)); |
448 | 768 | ||
449 | if (dma_release_from_coherent(dev, get_order(size), cpu_addr)) | 769 | if (dma_release_from_coherent(dev, get_order(size), cpu_addr)) |
450 | return; | 770 | return; |
451 | 771 | ||
452 | size = PAGE_ALIGN(size); | 772 | size = PAGE_ALIGN(size); |
453 | 773 | ||
454 | if (!arch_is_coherent()) | 774 | if (arch_is_coherent() || nommu()) { |
775 | __dma_free_buffer(page, size); | ||
776 | } else if (cpu_architecture() < CPU_ARCH_ARMv6) { | ||
455 | __dma_free_remap(cpu_addr, size); | 777 | __dma_free_remap(cpu_addr, size); |
456 | 778 | __dma_free_buffer(page, size); | |
457 | __dma_free_buffer(pfn_to_page(dma_to_pfn(dev, handle)), size); | ||
458 | } | ||
459 | EXPORT_SYMBOL(dma_free_coherent); | ||
460 | |||
461 | /* | ||
462 | * Make an area consistent for devices. | ||
463 | * Note: Drivers should NOT use this function directly, as it will break | ||
464 | * platforms with CONFIG_DMABOUNCE. | ||
465 | * Use the driver DMA support - see dma-mapping.h (dma_sync_*) | ||
466 | */ | ||
467 | void ___dma_single_cpu_to_dev(const void *kaddr, size_t size, | ||
468 | enum dma_data_direction dir) | ||
469 | { | ||
470 | unsigned long paddr; | ||
471 | |||
472 | BUG_ON(!virt_addr_valid(kaddr) || !virt_addr_valid(kaddr + size - 1)); | ||
473 | |||
474 | dmac_map_area(kaddr, size, dir); | ||
475 | |||
476 | paddr = __pa(kaddr); | ||
477 | if (dir == DMA_FROM_DEVICE) { | ||
478 | outer_inv_range(paddr, paddr + size); | ||
479 | } else { | 779 | } else { |
480 | outer_clean_range(paddr, paddr + size); | 780 | if (__free_from_pool(cpu_addr, size)) |
481 | } | 781 | return; |
482 | /* FIXME: non-speculating: flush on bidirectional mappings? */ | 782 | /* |
483 | } | 783 | * Non-atomic allocations cannot be freed with IRQs disabled |
484 | EXPORT_SYMBOL(___dma_single_cpu_to_dev); | 784 | */ |
485 | 785 | WARN_ON(irqs_disabled()); | |
486 | void ___dma_single_dev_to_cpu(const void *kaddr, size_t size, | 786 | __free_from_contiguous(dev, page, size); |
487 | enum dma_data_direction dir) | ||
488 | { | ||
489 | BUG_ON(!virt_addr_valid(kaddr) || !virt_addr_valid(kaddr + size - 1)); | ||
490 | |||
491 | /* FIXME: non-speculating: not required */ | ||
492 | /* don't bother invalidating if DMA to device */ | ||
493 | if (dir != DMA_TO_DEVICE) { | ||
494 | unsigned long paddr = __pa(kaddr); | ||
495 | outer_inv_range(paddr, paddr + size); | ||
496 | } | 787 | } |
497 | |||
498 | dmac_unmap_area(kaddr, size, dir); | ||
499 | } | 788 | } |
500 | EXPORT_SYMBOL(___dma_single_dev_to_cpu); | ||
501 | 789 | ||
502 | static void dma_cache_maint_page(struct page *page, unsigned long offset, | 790 | static void dma_cache_maint_page(struct page *page, unsigned long offset, |
503 | size_t size, enum dma_data_direction dir, | 791 | size_t size, enum dma_data_direction dir, |
@@ -543,7 +831,13 @@ static void dma_cache_maint_page(struct page *page, unsigned long offset, | |||
543 | } while (left); | 831 | } while (left); |
544 | } | 832 | } |
545 | 833 | ||
546 | void ___dma_page_cpu_to_dev(struct page *page, unsigned long off, | 834 | /* |
835 | * Make an area consistent for devices. | ||
836 | * Note: Drivers should NOT use this function directly, as it will break | ||
837 | * platforms with CONFIG_DMABOUNCE. | ||
838 | * Use the driver DMA support - see dma-mapping.h (dma_sync_*) | ||
839 | */ | ||
840 | static void __dma_page_cpu_to_dev(struct page *page, unsigned long off, | ||
547 | size_t size, enum dma_data_direction dir) | 841 | size_t size, enum dma_data_direction dir) |
548 | { | 842 | { |
549 | unsigned long paddr; | 843 | unsigned long paddr; |
@@ -558,9 +852,8 @@ void ___dma_page_cpu_to_dev(struct page *page, unsigned long off, | |||
558 | } | 852 | } |
559 | /* FIXME: non-speculating: flush on bidirectional mappings? */ | 853 | /* FIXME: non-speculating: flush on bidirectional mappings? */ |
560 | } | 854 | } |
561 | EXPORT_SYMBOL(___dma_page_cpu_to_dev); | ||
562 | 855 | ||
563 | void ___dma_page_dev_to_cpu(struct page *page, unsigned long off, | 856 | static void __dma_page_dev_to_cpu(struct page *page, unsigned long off, |
564 | size_t size, enum dma_data_direction dir) | 857 | size_t size, enum dma_data_direction dir) |
565 | { | 858 | { |
566 | unsigned long paddr = page_to_phys(page) + off; | 859 | unsigned long paddr = page_to_phys(page) + off; |
@@ -578,10 +871,9 @@ void ___dma_page_dev_to_cpu(struct page *page, unsigned long off, | |||
578 | if (dir != DMA_TO_DEVICE && off == 0 && size >= PAGE_SIZE) | 871 | if (dir != DMA_TO_DEVICE && off == 0 && size >= PAGE_SIZE) |
579 | set_bit(PG_dcache_clean, &page->flags); | 872 | set_bit(PG_dcache_clean, &page->flags); |
580 | } | 873 | } |
581 | EXPORT_SYMBOL(___dma_page_dev_to_cpu); | ||
582 | 874 | ||
583 | /** | 875 | /** |
584 | * dma_map_sg - map a set of SG buffers for streaming mode DMA | 876 | * arm_dma_map_sg - map a set of SG buffers for streaming mode DMA |
585 | * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices | 877 | * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices |
586 | * @sg: list of buffers | 878 | * @sg: list of buffers |
587 | * @nents: number of buffers to map | 879 | * @nents: number of buffers to map |
@@ -596,32 +888,32 @@ EXPORT_SYMBOL(___dma_page_dev_to_cpu); | |||
596 | * Device ownership issues as mentioned for dma_map_single are the same | 888 | * Device ownership issues as mentioned for dma_map_single are the same |
597 | * here. | 889 | * here. |
598 | */ | 890 | */ |
599 | int dma_map_sg(struct device *dev, struct scatterlist *sg, int nents, | 891 | int arm_dma_map_sg(struct device *dev, struct scatterlist *sg, int nents, |
600 | enum dma_data_direction dir) | 892 | enum dma_data_direction dir, struct dma_attrs *attrs) |
601 | { | 893 | { |
894 | struct dma_map_ops *ops = get_dma_ops(dev); | ||
602 | struct scatterlist *s; | 895 | struct scatterlist *s; |
603 | int i, j; | 896 | int i, j; |
604 | 897 | ||
605 | BUG_ON(!valid_dma_direction(dir)); | ||
606 | |||
607 | for_each_sg(sg, s, nents, i) { | 898 | for_each_sg(sg, s, nents, i) { |
608 | s->dma_address = __dma_map_page(dev, sg_page(s), s->offset, | 899 | #ifdef CONFIG_NEED_SG_DMA_LENGTH |
609 | s->length, dir); | 900 | s->dma_length = s->length; |
901 | #endif | ||
902 | s->dma_address = ops->map_page(dev, sg_page(s), s->offset, | ||
903 | s->length, dir, attrs); | ||
610 | if (dma_mapping_error(dev, s->dma_address)) | 904 | if (dma_mapping_error(dev, s->dma_address)) |
611 | goto bad_mapping; | 905 | goto bad_mapping; |
612 | } | 906 | } |
613 | debug_dma_map_sg(dev, sg, nents, nents, dir); | ||
614 | return nents; | 907 | return nents; |
615 | 908 | ||
616 | bad_mapping: | 909 | bad_mapping: |
617 | for_each_sg(sg, s, i, j) | 910 | for_each_sg(sg, s, i, j) |
618 | __dma_unmap_page(dev, sg_dma_address(s), sg_dma_len(s), dir); | 911 | ops->unmap_page(dev, sg_dma_address(s), sg_dma_len(s), dir, attrs); |
619 | return 0; | 912 | return 0; |
620 | } | 913 | } |
621 | EXPORT_SYMBOL(dma_map_sg); | ||
622 | 914 | ||
623 | /** | 915 | /** |
624 | * dma_unmap_sg - unmap a set of SG buffers mapped by dma_map_sg | 916 | * arm_dma_unmap_sg - unmap a set of SG buffers mapped by dma_map_sg |
625 | * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices | 917 | * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices |
626 | * @sg: list of buffers | 918 | * @sg: list of buffers |
627 | * @nents: number of buffers to unmap (same as was passed to dma_map_sg) | 919 | * @nents: number of buffers to unmap (same as was passed to dma_map_sg) |
@@ -630,70 +922,55 @@ EXPORT_SYMBOL(dma_map_sg); | |||
630 | * Unmap a set of streaming mode DMA translations. Again, CPU access | 922 | * Unmap a set of streaming mode DMA translations. Again, CPU access |
631 | * rules concerning calls here are the same as for dma_unmap_single(). | 923 | * rules concerning calls here are the same as for dma_unmap_single(). |
632 | */ | 924 | */ |
633 | void dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nents, | 925 | void arm_dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nents, |
634 | enum dma_data_direction dir) | 926 | enum dma_data_direction dir, struct dma_attrs *attrs) |
635 | { | 927 | { |
928 | struct dma_map_ops *ops = get_dma_ops(dev); | ||
636 | struct scatterlist *s; | 929 | struct scatterlist *s; |
637 | int i; | ||
638 | 930 | ||
639 | debug_dma_unmap_sg(dev, sg, nents, dir); | 931 | int i; |
640 | 932 | ||
641 | for_each_sg(sg, s, nents, i) | 933 | for_each_sg(sg, s, nents, i) |
642 | __dma_unmap_page(dev, sg_dma_address(s), sg_dma_len(s), dir); | 934 | ops->unmap_page(dev, sg_dma_address(s), sg_dma_len(s), dir, attrs); |
643 | } | 935 | } |
644 | EXPORT_SYMBOL(dma_unmap_sg); | ||
645 | 936 | ||
646 | /** | 937 | /** |
647 | * dma_sync_sg_for_cpu | 938 | * arm_dma_sync_sg_for_cpu |
648 | * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices | 939 | * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices |
649 | * @sg: list of buffers | 940 | * @sg: list of buffers |
650 | * @nents: number of buffers to map (returned from dma_map_sg) | 941 | * @nents: number of buffers to map (returned from dma_map_sg) |
651 | * @dir: DMA transfer direction (same as was passed to dma_map_sg) | 942 | * @dir: DMA transfer direction (same as was passed to dma_map_sg) |
652 | */ | 943 | */ |
653 | void dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, | 944 | void arm_dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, |
654 | int nents, enum dma_data_direction dir) | 945 | int nents, enum dma_data_direction dir) |
655 | { | 946 | { |
947 | struct dma_map_ops *ops = get_dma_ops(dev); | ||
656 | struct scatterlist *s; | 948 | struct scatterlist *s; |
657 | int i; | 949 | int i; |
658 | 950 | ||
659 | for_each_sg(sg, s, nents, i) { | 951 | for_each_sg(sg, s, nents, i) |
660 | if (!dmabounce_sync_for_cpu(dev, sg_dma_address(s), 0, | 952 | ops->sync_single_for_cpu(dev, sg_dma_address(s), s->length, |
661 | sg_dma_len(s), dir)) | 953 | dir); |
662 | continue; | ||
663 | |||
664 | __dma_page_dev_to_cpu(sg_page(s), s->offset, | ||
665 | s->length, dir); | ||
666 | } | ||
667 | |||
668 | debug_dma_sync_sg_for_cpu(dev, sg, nents, dir); | ||
669 | } | 954 | } |
670 | EXPORT_SYMBOL(dma_sync_sg_for_cpu); | ||
671 | 955 | ||
672 | /** | 956 | /** |
673 | * dma_sync_sg_for_device | 957 | * arm_dma_sync_sg_for_device |
674 | * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices | 958 | * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices |
675 | * @sg: list of buffers | 959 | * @sg: list of buffers |
676 | * @nents: number of buffers to map (returned from dma_map_sg) | 960 | * @nents: number of buffers to map (returned from dma_map_sg) |
677 | * @dir: DMA transfer direction (same as was passed to dma_map_sg) | 961 | * @dir: DMA transfer direction (same as was passed to dma_map_sg) |
678 | */ | 962 | */ |
679 | void dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, | 963 | void arm_dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, |
680 | int nents, enum dma_data_direction dir) | 964 | int nents, enum dma_data_direction dir) |
681 | { | 965 | { |
966 | struct dma_map_ops *ops = get_dma_ops(dev); | ||
682 | struct scatterlist *s; | 967 | struct scatterlist *s; |
683 | int i; | 968 | int i; |
684 | 969 | ||
685 | for_each_sg(sg, s, nents, i) { | 970 | for_each_sg(sg, s, nents, i) |
686 | if (!dmabounce_sync_for_device(dev, sg_dma_address(s), 0, | 971 | ops->sync_single_for_device(dev, sg_dma_address(s), s->length, |
687 | sg_dma_len(s), dir)) | 972 | dir); |
688 | continue; | ||
689 | |||
690 | __dma_page_cpu_to_dev(sg_page(s), s->offset, | ||
691 | s->length, dir); | ||
692 | } | ||
693 | |||
694 | debug_dma_sync_sg_for_device(dev, sg, nents, dir); | ||
695 | } | 973 | } |
696 | EXPORT_SYMBOL(dma_sync_sg_for_device); | ||
697 | 974 | ||
698 | /* | 975 | /* |
699 | * Return whether the given device DMA address mask can be supported | 976 | * Return whether the given device DMA address mask can be supported |
@@ -709,18 +986,15 @@ int dma_supported(struct device *dev, u64 mask) | |||
709 | } | 986 | } |
710 | EXPORT_SYMBOL(dma_supported); | 987 | EXPORT_SYMBOL(dma_supported); |
711 | 988 | ||
712 | int dma_set_mask(struct device *dev, u64 dma_mask) | 989 | static int arm_dma_set_mask(struct device *dev, u64 dma_mask) |
713 | { | 990 | { |
714 | if (!dev->dma_mask || !dma_supported(dev, dma_mask)) | 991 | if (!dev->dma_mask || !dma_supported(dev, dma_mask)) |
715 | return -EIO; | 992 | return -EIO; |
716 | 993 | ||
717 | #ifndef CONFIG_DMABOUNCE | ||
718 | *dev->dma_mask = dma_mask; | 994 | *dev->dma_mask = dma_mask; |
719 | #endif | ||
720 | 995 | ||
721 | return 0; | 996 | return 0; |
722 | } | 997 | } |
723 | EXPORT_SYMBOL(dma_set_mask); | ||
724 | 998 | ||
725 | #define PREALLOC_DMA_DEBUG_ENTRIES 4096 | 999 | #define PREALLOC_DMA_DEBUG_ENTRIES 4096 |
726 | 1000 | ||
@@ -733,3 +1007,679 @@ static int __init dma_debug_do_init(void) | |||
733 | return 0; | 1007 | return 0; |
734 | } | 1008 | } |
735 | fs_initcall(dma_debug_do_init); | 1009 | fs_initcall(dma_debug_do_init); |
1010 | |||
1011 | #ifdef CONFIG_ARM_DMA_USE_IOMMU | ||
1012 | |||
1013 | /* IOMMU */ | ||
1014 | |||
1015 | static inline dma_addr_t __alloc_iova(struct dma_iommu_mapping *mapping, | ||
1016 | size_t size) | ||
1017 | { | ||
1018 | unsigned int order = get_order(size); | ||
1019 | unsigned int align = 0; | ||
1020 | unsigned int count, start; | ||
1021 | unsigned long flags; | ||
1022 | |||
1023 | count = ((PAGE_ALIGN(size) >> PAGE_SHIFT) + | ||
1024 | (1 << mapping->order) - 1) >> mapping->order; | ||
1025 | |||
1026 | if (order > mapping->order) | ||
1027 | align = (1 << (order - mapping->order)) - 1; | ||
1028 | |||
1029 | spin_lock_irqsave(&mapping->lock, flags); | ||
1030 | start = bitmap_find_next_zero_area(mapping->bitmap, mapping->bits, 0, | ||
1031 | count, align); | ||
1032 | if (start > mapping->bits) { | ||
1033 | spin_unlock_irqrestore(&mapping->lock, flags); | ||
1034 | return DMA_ERROR_CODE; | ||
1035 | } | ||
1036 | |||
1037 | bitmap_set(mapping->bitmap, start, count); | ||
1038 | spin_unlock_irqrestore(&mapping->lock, flags); | ||
1039 | |||
1040 | return mapping->base + (start << (mapping->order + PAGE_SHIFT)); | ||
1041 | } | ||
1042 | |||
1043 | static inline void __free_iova(struct dma_iommu_mapping *mapping, | ||
1044 | dma_addr_t addr, size_t size) | ||
1045 | { | ||
1046 | unsigned int start = (addr - mapping->base) >> | ||
1047 | (mapping->order + PAGE_SHIFT); | ||
1048 | unsigned int count = ((size >> PAGE_SHIFT) + | ||
1049 | (1 << mapping->order) - 1) >> mapping->order; | ||
1050 | unsigned long flags; | ||
1051 | |||
1052 | spin_lock_irqsave(&mapping->lock, flags); | ||
1053 | bitmap_clear(mapping->bitmap, start, count); | ||
1054 | spin_unlock_irqrestore(&mapping->lock, flags); | ||
1055 | } | ||
1056 | |||
1057 | static struct page **__iommu_alloc_buffer(struct device *dev, size_t size, gfp_t gfp) | ||
1058 | { | ||
1059 | struct page **pages; | ||
1060 | int count = size >> PAGE_SHIFT; | ||
1061 | int array_size = count * sizeof(struct page *); | ||
1062 | int i = 0; | ||
1063 | |||
1064 | if (array_size <= PAGE_SIZE) | ||
1065 | pages = kzalloc(array_size, gfp); | ||
1066 | else | ||
1067 | pages = vzalloc(array_size); | ||
1068 | if (!pages) | ||
1069 | return NULL; | ||
1070 | |||
1071 | while (count) { | ||
1072 | int j, order = __ffs(count); | ||
1073 | |||
1074 | pages[i] = alloc_pages(gfp | __GFP_NOWARN, order); | ||
1075 | while (!pages[i] && order) | ||
1076 | pages[i] = alloc_pages(gfp | __GFP_NOWARN, --order); | ||
1077 | if (!pages[i]) | ||
1078 | goto error; | ||
1079 | |||
1080 | if (order) | ||
1081 | split_page(pages[i], order); | ||
1082 | j = 1 << order; | ||
1083 | while (--j) | ||
1084 | pages[i + j] = pages[i] + j; | ||
1085 | |||
1086 | __dma_clear_buffer(pages[i], PAGE_SIZE << order); | ||
1087 | i += 1 << order; | ||
1088 | count -= 1 << order; | ||
1089 | } | ||
1090 | |||
1091 | return pages; | ||
1092 | error: | ||
1093 | while (--i) | ||
1094 | if (pages[i]) | ||
1095 | __free_pages(pages[i], 0); | ||
1096 | if (array_size < PAGE_SIZE) | ||
1097 | kfree(pages); | ||
1098 | else | ||
1099 | vfree(pages); | ||
1100 | return NULL; | ||
1101 | } | ||
1102 | |||
1103 | static int __iommu_free_buffer(struct device *dev, struct page **pages, size_t size) | ||
1104 | { | ||
1105 | int count = size >> PAGE_SHIFT; | ||
1106 | int array_size = count * sizeof(struct page *); | ||
1107 | int i; | ||
1108 | for (i = 0; i < count; i++) | ||
1109 | if (pages[i]) | ||
1110 | __free_pages(pages[i], 0); | ||
1111 | if (array_size < PAGE_SIZE) | ||
1112 | kfree(pages); | ||
1113 | else | ||
1114 | vfree(pages); | ||
1115 | return 0; | ||
1116 | } | ||
1117 | |||
1118 | /* | ||
1119 | * Create a CPU mapping for a specified pages | ||
1120 | */ | ||
1121 | static void * | ||
1122 | __iommu_alloc_remap(struct page **pages, size_t size, gfp_t gfp, pgprot_t prot) | ||
1123 | { | ||
1124 | struct arm_vmregion *c; | ||
1125 | size_t align; | ||
1126 | size_t count = size >> PAGE_SHIFT; | ||
1127 | int bit; | ||
1128 | |||
1129 | if (!consistent_pte[0]) { | ||
1130 | pr_err("%s: not initialised\n", __func__); | ||
1131 | dump_stack(); | ||
1132 | return NULL; | ||
1133 | } | ||
1134 | |||
1135 | /* | ||
1136 | * Align the virtual region allocation - maximum alignment is | ||
1137 | * a section size, minimum is a page size. This helps reduce | ||
1138 | * fragmentation of the DMA space, and also prevents allocations | ||
1139 | * smaller than a section from crossing a section boundary. | ||
1140 | */ | ||
1141 | bit = fls(size - 1); | ||
1142 | if (bit > SECTION_SHIFT) | ||
1143 | bit = SECTION_SHIFT; | ||
1144 | align = 1 << bit; | ||
1145 | |||
1146 | /* | ||
1147 | * Allocate a virtual address in the consistent mapping region. | ||
1148 | */ | ||
1149 | c = arm_vmregion_alloc(&consistent_head, align, size, | ||
1150 | gfp & ~(__GFP_DMA | __GFP_HIGHMEM), NULL); | ||
1151 | if (c) { | ||
1152 | pte_t *pte; | ||
1153 | int idx = CONSISTENT_PTE_INDEX(c->vm_start); | ||
1154 | int i = 0; | ||
1155 | u32 off = CONSISTENT_OFFSET(c->vm_start) & (PTRS_PER_PTE-1); | ||
1156 | |||
1157 | pte = consistent_pte[idx] + off; | ||
1158 | c->priv = pages; | ||
1159 | |||
1160 | do { | ||
1161 | BUG_ON(!pte_none(*pte)); | ||
1162 | |||
1163 | set_pte_ext(pte, mk_pte(pages[i], prot), 0); | ||
1164 | pte++; | ||
1165 | off++; | ||
1166 | i++; | ||
1167 | if (off >= PTRS_PER_PTE) { | ||
1168 | off = 0; | ||
1169 | pte = consistent_pte[++idx]; | ||
1170 | } | ||
1171 | } while (i < count); | ||
1172 | |||
1173 | dsb(); | ||
1174 | |||
1175 | return (void *)c->vm_start; | ||
1176 | } | ||
1177 | return NULL; | ||
1178 | } | ||
1179 | |||
1180 | /* | ||
1181 | * Create a mapping in device IO address space for specified pages | ||
1182 | */ | ||
1183 | static dma_addr_t | ||
1184 | __iommu_create_mapping(struct device *dev, struct page **pages, size_t size) | ||
1185 | { | ||
1186 | struct dma_iommu_mapping *mapping = dev->archdata.mapping; | ||
1187 | unsigned int count = PAGE_ALIGN(size) >> PAGE_SHIFT; | ||
1188 | dma_addr_t dma_addr, iova; | ||
1189 | int i, ret = DMA_ERROR_CODE; | ||
1190 | |||
1191 | dma_addr = __alloc_iova(mapping, size); | ||
1192 | if (dma_addr == DMA_ERROR_CODE) | ||
1193 | return dma_addr; | ||
1194 | |||
1195 | iova = dma_addr; | ||
1196 | for (i = 0; i < count; ) { | ||
1197 | unsigned int next_pfn = page_to_pfn(pages[i]) + 1; | ||
1198 | phys_addr_t phys = page_to_phys(pages[i]); | ||
1199 | unsigned int len, j; | ||
1200 | |||
1201 | for (j = i + 1; j < count; j++, next_pfn++) | ||
1202 | if (page_to_pfn(pages[j]) != next_pfn) | ||
1203 | break; | ||
1204 | |||
1205 | len = (j - i) << PAGE_SHIFT; | ||
1206 | ret = iommu_map(mapping->domain, iova, phys, len, 0); | ||
1207 | if (ret < 0) | ||
1208 | goto fail; | ||
1209 | iova += len; | ||
1210 | i = j; | ||
1211 | } | ||
1212 | return dma_addr; | ||
1213 | fail: | ||
1214 | iommu_unmap(mapping->domain, dma_addr, iova-dma_addr); | ||
1215 | __free_iova(mapping, dma_addr, size); | ||
1216 | return DMA_ERROR_CODE; | ||
1217 | } | ||
1218 | |||
1219 | static int __iommu_remove_mapping(struct device *dev, dma_addr_t iova, size_t size) | ||
1220 | { | ||
1221 | struct dma_iommu_mapping *mapping = dev->archdata.mapping; | ||
1222 | |||
1223 | /* | ||
1224 | * add optional in-page offset from iova to size and align | ||
1225 | * result to page size | ||
1226 | */ | ||
1227 | size = PAGE_ALIGN((iova & ~PAGE_MASK) + size); | ||
1228 | iova &= PAGE_MASK; | ||
1229 | |||
1230 | iommu_unmap(mapping->domain, iova, size); | ||
1231 | __free_iova(mapping, iova, size); | ||
1232 | return 0; | ||
1233 | } | ||
1234 | |||
1235 | static void *arm_iommu_alloc_attrs(struct device *dev, size_t size, | ||
1236 | dma_addr_t *handle, gfp_t gfp, struct dma_attrs *attrs) | ||
1237 | { | ||
1238 | pgprot_t prot = __get_dma_pgprot(attrs, pgprot_kernel); | ||
1239 | struct page **pages; | ||
1240 | void *addr = NULL; | ||
1241 | |||
1242 | *handle = DMA_ERROR_CODE; | ||
1243 | size = PAGE_ALIGN(size); | ||
1244 | |||
1245 | pages = __iommu_alloc_buffer(dev, size, gfp); | ||
1246 | if (!pages) | ||
1247 | return NULL; | ||
1248 | |||
1249 | *handle = __iommu_create_mapping(dev, pages, size); | ||
1250 | if (*handle == DMA_ERROR_CODE) | ||
1251 | goto err_buffer; | ||
1252 | |||
1253 | addr = __iommu_alloc_remap(pages, size, gfp, prot); | ||
1254 | if (!addr) | ||
1255 | goto err_mapping; | ||
1256 | |||
1257 | return addr; | ||
1258 | |||
1259 | err_mapping: | ||
1260 | __iommu_remove_mapping(dev, *handle, size); | ||
1261 | err_buffer: | ||
1262 | __iommu_free_buffer(dev, pages, size); | ||
1263 | return NULL; | ||
1264 | } | ||
1265 | |||
1266 | static int arm_iommu_mmap_attrs(struct device *dev, struct vm_area_struct *vma, | ||
1267 | void *cpu_addr, dma_addr_t dma_addr, size_t size, | ||
1268 | struct dma_attrs *attrs) | ||
1269 | { | ||
1270 | struct arm_vmregion *c; | ||
1271 | |||
1272 | vma->vm_page_prot = __get_dma_pgprot(attrs, vma->vm_page_prot); | ||
1273 | c = arm_vmregion_find(&consistent_head, (unsigned long)cpu_addr); | ||
1274 | |||
1275 | if (c) { | ||
1276 | struct page **pages = c->priv; | ||
1277 | |||
1278 | unsigned long uaddr = vma->vm_start; | ||
1279 | unsigned long usize = vma->vm_end - vma->vm_start; | ||
1280 | int i = 0; | ||
1281 | |||
1282 | do { | ||
1283 | int ret; | ||
1284 | |||
1285 | ret = vm_insert_page(vma, uaddr, pages[i++]); | ||
1286 | if (ret) { | ||
1287 | pr_err("Remapping memory, error: %d\n", ret); | ||
1288 | return ret; | ||
1289 | } | ||
1290 | |||
1291 | uaddr += PAGE_SIZE; | ||
1292 | usize -= PAGE_SIZE; | ||
1293 | } while (usize > 0); | ||
1294 | } | ||
1295 | return 0; | ||
1296 | } | ||
1297 | |||
1298 | /* | ||
1299 | * free a page as defined by the above mapping. | ||
1300 | * Must not be called with IRQs disabled. | ||
1301 | */ | ||
1302 | void arm_iommu_free_attrs(struct device *dev, size_t size, void *cpu_addr, | ||
1303 | dma_addr_t handle, struct dma_attrs *attrs) | ||
1304 | { | ||
1305 | struct arm_vmregion *c; | ||
1306 | size = PAGE_ALIGN(size); | ||
1307 | |||
1308 | c = arm_vmregion_find(&consistent_head, (unsigned long)cpu_addr); | ||
1309 | if (c) { | ||
1310 | struct page **pages = c->priv; | ||
1311 | __dma_free_remap(cpu_addr, size); | ||
1312 | __iommu_remove_mapping(dev, handle, size); | ||
1313 | __iommu_free_buffer(dev, pages, size); | ||
1314 | } | ||
1315 | } | ||
1316 | |||
1317 | /* | ||
1318 | * Map a part of the scatter-gather list into contiguous io address space | ||
1319 | */ | ||
1320 | static int __map_sg_chunk(struct device *dev, struct scatterlist *sg, | ||
1321 | size_t size, dma_addr_t *handle, | ||
1322 | enum dma_data_direction dir) | ||
1323 | { | ||
1324 | struct dma_iommu_mapping *mapping = dev->archdata.mapping; | ||
1325 | dma_addr_t iova, iova_base; | ||
1326 | int ret = 0; | ||
1327 | unsigned int count; | ||
1328 | struct scatterlist *s; | ||
1329 | |||
1330 | size = PAGE_ALIGN(size); | ||
1331 | *handle = DMA_ERROR_CODE; | ||
1332 | |||
1333 | iova_base = iova = __alloc_iova(mapping, size); | ||
1334 | if (iova == DMA_ERROR_CODE) | ||
1335 | return -ENOMEM; | ||
1336 | |||
1337 | for (count = 0, s = sg; count < (size >> PAGE_SHIFT); s = sg_next(s)) { | ||
1338 | phys_addr_t phys = page_to_phys(sg_page(s)); | ||
1339 | unsigned int len = PAGE_ALIGN(s->offset + s->length); | ||
1340 | |||
1341 | if (!arch_is_coherent()) | ||
1342 | __dma_page_cpu_to_dev(sg_page(s), s->offset, s->length, dir); | ||
1343 | |||
1344 | ret = iommu_map(mapping->domain, iova, phys, len, 0); | ||
1345 | if (ret < 0) | ||
1346 | goto fail; | ||
1347 | count += len >> PAGE_SHIFT; | ||
1348 | iova += len; | ||
1349 | } | ||
1350 | *handle = iova_base; | ||
1351 | |||
1352 | return 0; | ||
1353 | fail: | ||
1354 | iommu_unmap(mapping->domain, iova_base, count * PAGE_SIZE); | ||
1355 | __free_iova(mapping, iova_base, size); | ||
1356 | return ret; | ||
1357 | } | ||
1358 | |||
1359 | /** | ||
1360 | * arm_iommu_map_sg - map a set of SG buffers for streaming mode DMA | ||
1361 | * @dev: valid struct device pointer | ||
1362 | * @sg: list of buffers | ||
1363 | * @nents: number of buffers to map | ||
1364 | * @dir: DMA transfer direction | ||
1365 | * | ||
1366 | * Map a set of buffers described by scatterlist in streaming mode for DMA. | ||
1367 | * The scatter gather list elements are merged together (if possible) and | ||
1368 | * tagged with the appropriate dma address and length. They are obtained via | ||
1369 | * sg_dma_{address,length}. | ||
1370 | */ | ||
1371 | int arm_iommu_map_sg(struct device *dev, struct scatterlist *sg, int nents, | ||
1372 | enum dma_data_direction dir, struct dma_attrs *attrs) | ||
1373 | { | ||
1374 | struct scatterlist *s = sg, *dma = sg, *start = sg; | ||
1375 | int i, count = 0; | ||
1376 | unsigned int offset = s->offset; | ||
1377 | unsigned int size = s->offset + s->length; | ||
1378 | unsigned int max = dma_get_max_seg_size(dev); | ||
1379 | |||
1380 | for (i = 1; i < nents; i++) { | ||
1381 | s = sg_next(s); | ||
1382 | |||
1383 | s->dma_address = DMA_ERROR_CODE; | ||
1384 | s->dma_length = 0; | ||
1385 | |||
1386 | if (s->offset || (size & ~PAGE_MASK) || size + s->length > max) { | ||
1387 | if (__map_sg_chunk(dev, start, size, &dma->dma_address, | ||
1388 | dir) < 0) | ||
1389 | goto bad_mapping; | ||
1390 | |||
1391 | dma->dma_address += offset; | ||
1392 | dma->dma_length = size - offset; | ||
1393 | |||
1394 | size = offset = s->offset; | ||
1395 | start = s; | ||
1396 | dma = sg_next(dma); | ||
1397 | count += 1; | ||
1398 | } | ||
1399 | size += s->length; | ||
1400 | } | ||
1401 | if (__map_sg_chunk(dev, start, size, &dma->dma_address, dir) < 0) | ||
1402 | goto bad_mapping; | ||
1403 | |||
1404 | dma->dma_address += offset; | ||
1405 | dma->dma_length = size - offset; | ||
1406 | |||
1407 | return count+1; | ||
1408 | |||
1409 | bad_mapping: | ||
1410 | for_each_sg(sg, s, count, i) | ||
1411 | __iommu_remove_mapping(dev, sg_dma_address(s), sg_dma_len(s)); | ||
1412 | return 0; | ||
1413 | } | ||
1414 | |||
1415 | /** | ||
1416 | * arm_iommu_unmap_sg - unmap a set of SG buffers mapped by dma_map_sg | ||
1417 | * @dev: valid struct device pointer | ||
1418 | * @sg: list of buffers | ||
1419 | * @nents: number of buffers to unmap (same as was passed to dma_map_sg) | ||
1420 | * @dir: DMA transfer direction (same as was passed to dma_map_sg) | ||
1421 | * | ||
1422 | * Unmap a set of streaming mode DMA translations. Again, CPU access | ||
1423 | * rules concerning calls here are the same as for dma_unmap_single(). | ||
1424 | */ | ||
1425 | void arm_iommu_unmap_sg(struct device *dev, struct scatterlist *sg, int nents, | ||
1426 | enum dma_data_direction dir, struct dma_attrs *attrs) | ||
1427 | { | ||
1428 | struct scatterlist *s; | ||
1429 | int i; | ||
1430 | |||
1431 | for_each_sg(sg, s, nents, i) { | ||
1432 | if (sg_dma_len(s)) | ||
1433 | __iommu_remove_mapping(dev, sg_dma_address(s), | ||
1434 | sg_dma_len(s)); | ||
1435 | if (!arch_is_coherent()) | ||
1436 | __dma_page_dev_to_cpu(sg_page(s), s->offset, | ||
1437 | s->length, dir); | ||
1438 | } | ||
1439 | } | ||
1440 | |||
1441 | /** | ||
1442 | * arm_iommu_sync_sg_for_cpu | ||
1443 | * @dev: valid struct device pointer | ||
1444 | * @sg: list of buffers | ||
1445 | * @nents: number of buffers to map (returned from dma_map_sg) | ||
1446 | * @dir: DMA transfer direction (same as was passed to dma_map_sg) | ||
1447 | */ | ||
1448 | void arm_iommu_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, | ||
1449 | int nents, enum dma_data_direction dir) | ||
1450 | { | ||
1451 | struct scatterlist *s; | ||
1452 | int i; | ||
1453 | |||
1454 | for_each_sg(sg, s, nents, i) | ||
1455 | if (!arch_is_coherent()) | ||
1456 | __dma_page_dev_to_cpu(sg_page(s), s->offset, s->length, dir); | ||
1457 | |||
1458 | } | ||
1459 | |||
1460 | /** | ||
1461 | * arm_iommu_sync_sg_for_device | ||
1462 | * @dev: valid struct device pointer | ||
1463 | * @sg: list of buffers | ||
1464 | * @nents: number of buffers to map (returned from dma_map_sg) | ||
1465 | * @dir: DMA transfer direction (same as was passed to dma_map_sg) | ||
1466 | */ | ||
1467 | void arm_iommu_sync_sg_for_device(struct device *dev, struct scatterlist *sg, | ||
1468 | int nents, enum dma_data_direction dir) | ||
1469 | { | ||
1470 | struct scatterlist *s; | ||
1471 | int i; | ||
1472 | |||
1473 | for_each_sg(sg, s, nents, i) | ||
1474 | if (!arch_is_coherent()) | ||
1475 | __dma_page_cpu_to_dev(sg_page(s), s->offset, s->length, dir); | ||
1476 | } | ||
1477 | |||
1478 | |||
1479 | /** | ||
1480 | * arm_iommu_map_page | ||
1481 | * @dev: valid struct device pointer | ||
1482 | * @page: page that buffer resides in | ||
1483 | * @offset: offset into page for start of buffer | ||
1484 | * @size: size of buffer to map | ||
1485 | * @dir: DMA transfer direction | ||
1486 | * | ||
1487 | * IOMMU aware version of arm_dma_map_page() | ||
1488 | */ | ||
1489 | static dma_addr_t arm_iommu_map_page(struct device *dev, struct page *page, | ||
1490 | unsigned long offset, size_t size, enum dma_data_direction dir, | ||
1491 | struct dma_attrs *attrs) | ||
1492 | { | ||
1493 | struct dma_iommu_mapping *mapping = dev->archdata.mapping; | ||
1494 | dma_addr_t dma_addr; | ||
1495 | int ret, len = PAGE_ALIGN(size + offset); | ||
1496 | |||
1497 | if (!arch_is_coherent()) | ||
1498 | __dma_page_cpu_to_dev(page, offset, size, dir); | ||
1499 | |||
1500 | dma_addr = __alloc_iova(mapping, len); | ||
1501 | if (dma_addr == DMA_ERROR_CODE) | ||
1502 | return dma_addr; | ||
1503 | |||
1504 | ret = iommu_map(mapping->domain, dma_addr, page_to_phys(page), len, 0); | ||
1505 | if (ret < 0) | ||
1506 | goto fail; | ||
1507 | |||
1508 | return dma_addr + offset; | ||
1509 | fail: | ||
1510 | __free_iova(mapping, dma_addr, len); | ||
1511 | return DMA_ERROR_CODE; | ||
1512 | } | ||
1513 | |||
1514 | /** | ||
1515 | * arm_iommu_unmap_page | ||
1516 | * @dev: valid struct device pointer | ||
1517 | * @handle: DMA address of buffer | ||
1518 | * @size: size of buffer (same as passed to dma_map_page) | ||
1519 | * @dir: DMA transfer direction (same as passed to dma_map_page) | ||
1520 | * | ||
1521 | * IOMMU aware version of arm_dma_unmap_page() | ||
1522 | */ | ||
1523 | static void arm_iommu_unmap_page(struct device *dev, dma_addr_t handle, | ||
1524 | size_t size, enum dma_data_direction dir, | ||
1525 | struct dma_attrs *attrs) | ||
1526 | { | ||
1527 | struct dma_iommu_mapping *mapping = dev->archdata.mapping; | ||
1528 | dma_addr_t iova = handle & PAGE_MASK; | ||
1529 | struct page *page = phys_to_page(iommu_iova_to_phys(mapping->domain, iova)); | ||
1530 | int offset = handle & ~PAGE_MASK; | ||
1531 | int len = PAGE_ALIGN(size + offset); | ||
1532 | |||
1533 | if (!iova) | ||
1534 | return; | ||
1535 | |||
1536 | if (!arch_is_coherent()) | ||
1537 | __dma_page_dev_to_cpu(page, offset, size, dir); | ||
1538 | |||
1539 | iommu_unmap(mapping->domain, iova, len); | ||
1540 | __free_iova(mapping, iova, len); | ||
1541 | } | ||
1542 | |||
1543 | static void arm_iommu_sync_single_for_cpu(struct device *dev, | ||
1544 | dma_addr_t handle, size_t size, enum dma_data_direction dir) | ||
1545 | { | ||
1546 | struct dma_iommu_mapping *mapping = dev->archdata.mapping; | ||
1547 | dma_addr_t iova = handle & PAGE_MASK; | ||
1548 | struct page *page = phys_to_page(iommu_iova_to_phys(mapping->domain, iova)); | ||
1549 | unsigned int offset = handle & ~PAGE_MASK; | ||
1550 | |||
1551 | if (!iova) | ||
1552 | return; | ||
1553 | |||
1554 | if (!arch_is_coherent()) | ||
1555 | __dma_page_dev_to_cpu(page, offset, size, dir); | ||
1556 | } | ||
1557 | |||
1558 | static void arm_iommu_sync_single_for_device(struct device *dev, | ||
1559 | dma_addr_t handle, size_t size, enum dma_data_direction dir) | ||
1560 | { | ||
1561 | struct dma_iommu_mapping *mapping = dev->archdata.mapping; | ||
1562 | dma_addr_t iova = handle & PAGE_MASK; | ||
1563 | struct page *page = phys_to_page(iommu_iova_to_phys(mapping->domain, iova)); | ||
1564 | unsigned int offset = handle & ~PAGE_MASK; | ||
1565 | |||
1566 | if (!iova) | ||
1567 | return; | ||
1568 | |||
1569 | __dma_page_cpu_to_dev(page, offset, size, dir); | ||
1570 | } | ||
1571 | |||
1572 | struct dma_map_ops iommu_ops = { | ||
1573 | .alloc = arm_iommu_alloc_attrs, | ||
1574 | .free = arm_iommu_free_attrs, | ||
1575 | .mmap = arm_iommu_mmap_attrs, | ||
1576 | |||
1577 | .map_page = arm_iommu_map_page, | ||
1578 | .unmap_page = arm_iommu_unmap_page, | ||
1579 | .sync_single_for_cpu = arm_iommu_sync_single_for_cpu, | ||
1580 | .sync_single_for_device = arm_iommu_sync_single_for_device, | ||
1581 | |||
1582 | .map_sg = arm_iommu_map_sg, | ||
1583 | .unmap_sg = arm_iommu_unmap_sg, | ||
1584 | .sync_sg_for_cpu = arm_iommu_sync_sg_for_cpu, | ||
1585 | .sync_sg_for_device = arm_iommu_sync_sg_for_device, | ||
1586 | }; | ||
1587 | |||
1588 | /** | ||
1589 | * arm_iommu_create_mapping | ||
1590 | * @bus: pointer to the bus holding the client device (for IOMMU calls) | ||
1591 | * @base: start address of the valid IO address space | ||
1592 | * @size: size of the valid IO address space | ||
1593 | * @order: accuracy of the IO addresses allocations | ||
1594 | * | ||
1595 | * Creates a mapping structure which holds information about used/unused | ||
1596 | * IO address ranges, which is required to perform memory allocation and | ||
1597 | * mapping with IOMMU aware functions. | ||
1598 | * | ||
1599 | * The client device need to be attached to the mapping with | ||
1600 | * arm_iommu_attach_device function. | ||
1601 | */ | ||
1602 | struct dma_iommu_mapping * | ||
1603 | arm_iommu_create_mapping(struct bus_type *bus, dma_addr_t base, size_t size, | ||
1604 | int order) | ||
1605 | { | ||
1606 | unsigned int count = size >> (PAGE_SHIFT + order); | ||
1607 | unsigned int bitmap_size = BITS_TO_LONGS(count) * sizeof(long); | ||
1608 | struct dma_iommu_mapping *mapping; | ||
1609 | int err = -ENOMEM; | ||
1610 | |||
1611 | if (!count) | ||
1612 | return ERR_PTR(-EINVAL); | ||
1613 | |||
1614 | mapping = kzalloc(sizeof(struct dma_iommu_mapping), GFP_KERNEL); | ||
1615 | if (!mapping) | ||
1616 | goto err; | ||
1617 | |||
1618 | mapping->bitmap = kzalloc(bitmap_size, GFP_KERNEL); | ||
1619 | if (!mapping->bitmap) | ||
1620 | goto err2; | ||
1621 | |||
1622 | mapping->base = base; | ||
1623 | mapping->bits = BITS_PER_BYTE * bitmap_size; | ||
1624 | mapping->order = order; | ||
1625 | spin_lock_init(&mapping->lock); | ||
1626 | |||
1627 | mapping->domain = iommu_domain_alloc(bus); | ||
1628 | if (!mapping->domain) | ||
1629 | goto err3; | ||
1630 | |||
1631 | kref_init(&mapping->kref); | ||
1632 | return mapping; | ||
1633 | err3: | ||
1634 | kfree(mapping->bitmap); | ||
1635 | err2: | ||
1636 | kfree(mapping); | ||
1637 | err: | ||
1638 | return ERR_PTR(err); | ||
1639 | } | ||
1640 | |||
1641 | static void release_iommu_mapping(struct kref *kref) | ||
1642 | { | ||
1643 | struct dma_iommu_mapping *mapping = | ||
1644 | container_of(kref, struct dma_iommu_mapping, kref); | ||
1645 | |||
1646 | iommu_domain_free(mapping->domain); | ||
1647 | kfree(mapping->bitmap); | ||
1648 | kfree(mapping); | ||
1649 | } | ||
1650 | |||
1651 | void arm_iommu_release_mapping(struct dma_iommu_mapping *mapping) | ||
1652 | { | ||
1653 | if (mapping) | ||
1654 | kref_put(&mapping->kref, release_iommu_mapping); | ||
1655 | } | ||
1656 | |||
1657 | /** | ||
1658 | * arm_iommu_attach_device | ||
1659 | * @dev: valid struct device pointer | ||
1660 | * @mapping: io address space mapping structure (returned from | ||
1661 | * arm_iommu_create_mapping) | ||
1662 | * | ||
1663 | * Attaches specified io address space mapping to the provided device, | ||
1664 | * this replaces the dma operations (dma_map_ops pointer) with the | ||
1665 | * IOMMU aware version. More than one client might be attached to | ||
1666 | * the same io address space mapping. | ||
1667 | */ | ||
1668 | int arm_iommu_attach_device(struct device *dev, | ||
1669 | struct dma_iommu_mapping *mapping) | ||
1670 | { | ||
1671 | int err; | ||
1672 | |||
1673 | err = iommu_attach_device(mapping->domain, dev); | ||
1674 | if (err) | ||
1675 | return err; | ||
1676 | |||
1677 | kref_get(&mapping->kref); | ||
1678 | dev->archdata.mapping = mapping; | ||
1679 | set_dma_ops(dev, &iommu_ops); | ||
1680 | |||
1681 | pr_info("Attached IOMMU controller to %s device.\n", dev_name(dev)); | ||
1682 | return 0; | ||
1683 | } | ||
1684 | |||
1685 | #endif | ||
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index 8f5813bbffb5..c21d06c7dd7e 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/highmem.h> | 20 | #include <linux/highmem.h> |
21 | #include <linux/gfp.h> | 21 | #include <linux/gfp.h> |
22 | #include <linux/memblock.h> | 22 | #include <linux/memblock.h> |
23 | #include <linux/dma-contiguous.h> | ||
23 | 24 | ||
24 | #include <asm/mach-types.h> | 25 | #include <asm/mach-types.h> |
25 | #include <asm/memblock.h> | 26 | #include <asm/memblock.h> |
@@ -226,6 +227,17 @@ static void __init arm_adjust_dma_zone(unsigned long *size, unsigned long *hole, | |||
226 | } | 227 | } |
227 | #endif | 228 | #endif |
228 | 229 | ||
230 | void __init setup_dma_zone(struct machine_desc *mdesc) | ||
231 | { | ||
232 | #ifdef CONFIG_ZONE_DMA | ||
233 | if (mdesc->dma_zone_size) { | ||
234 | arm_dma_zone_size = mdesc->dma_zone_size; | ||
235 | arm_dma_limit = PHYS_OFFSET + arm_dma_zone_size - 1; | ||
236 | } else | ||
237 | arm_dma_limit = 0xffffffff; | ||
238 | #endif | ||
239 | } | ||
240 | |||
229 | static void __init arm_bootmem_free(unsigned long min, unsigned long max_low, | 241 | static void __init arm_bootmem_free(unsigned long min, unsigned long max_low, |
230 | unsigned long max_high) | 242 | unsigned long max_high) |
231 | { | 243 | { |
@@ -273,12 +285,9 @@ static void __init arm_bootmem_free(unsigned long min, unsigned long max_low, | |||
273 | * Adjust the sizes according to any special requirements for | 285 | * Adjust the sizes according to any special requirements for |
274 | * this machine type. | 286 | * this machine type. |
275 | */ | 287 | */ |
276 | if (arm_dma_zone_size) { | 288 | if (arm_dma_zone_size) |
277 | arm_adjust_dma_zone(zone_size, zhole_size, | 289 | arm_adjust_dma_zone(zone_size, zhole_size, |
278 | arm_dma_zone_size >> PAGE_SHIFT); | 290 | arm_dma_zone_size >> PAGE_SHIFT); |
279 | arm_dma_limit = PHYS_OFFSET + arm_dma_zone_size - 1; | ||
280 | } else | ||
281 | arm_dma_limit = 0xffffffff; | ||
282 | #endif | 291 | #endif |
283 | 292 | ||
284 | free_area_init_node(0, zone_size, min, zhole_size); | 293 | free_area_init_node(0, zone_size, min, zhole_size); |
@@ -364,6 +373,12 @@ void __init arm_memblock_init(struct meminfo *mi, struct machine_desc *mdesc) | |||
364 | if (mdesc->reserve) | 373 | if (mdesc->reserve) |
365 | mdesc->reserve(); | 374 | mdesc->reserve(); |
366 | 375 | ||
376 | /* | ||
377 | * reserve memory for DMA contigouos allocations, | ||
378 | * must come from DMA area inside low memory | ||
379 | */ | ||
380 | dma_contiguous_reserve(min(arm_dma_limit, arm_lowmem_limit)); | ||
381 | |||
367 | arm_memblock_steal_permitted = false; | 382 | arm_memblock_steal_permitted = false; |
368 | memblock_allow_resize(); | 383 | memblock_allow_resize(); |
369 | memblock_dump_all(); | 384 | memblock_dump_all(); |
diff --git a/arch/arm/mm/mm.h b/arch/arm/mm/mm.h index 27f4a619b35d..93dc0c17cdcb 100644 --- a/arch/arm/mm/mm.h +++ b/arch/arm/mm/mm.h | |||
@@ -67,5 +67,8 @@ extern u32 arm_dma_limit; | |||
67 | #define arm_dma_limit ((u32)~0) | 67 | #define arm_dma_limit ((u32)~0) |
68 | #endif | 68 | #endif |
69 | 69 | ||
70 | extern phys_addr_t arm_lowmem_limit; | ||
71 | |||
70 | void __init bootmem_init(void); | 72 | void __init bootmem_init(void); |
71 | void arm_mm_memblock_reserve(void); | 73 | void arm_mm_memblock_reserve(void); |
74 | void dma_contiguous_remap(void); | ||
diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index aa78de8bfdd3..e5dad60b558b 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c | |||
@@ -288,6 +288,11 @@ static struct mem_type mem_types[] = { | |||
288 | PMD_SECT_UNCACHED | PMD_SECT_XN, | 288 | PMD_SECT_UNCACHED | PMD_SECT_XN, |
289 | .domain = DOMAIN_KERNEL, | 289 | .domain = DOMAIN_KERNEL, |
290 | }, | 290 | }, |
291 | [MT_MEMORY_DMA_READY] = { | ||
292 | .prot_pte = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY, | ||
293 | .prot_l1 = PMD_TYPE_TABLE, | ||
294 | .domain = DOMAIN_KERNEL, | ||
295 | }, | ||
291 | }; | 296 | }; |
292 | 297 | ||
293 | const struct mem_type *get_mem_type(unsigned int type) | 298 | const struct mem_type *get_mem_type(unsigned int type) |
@@ -429,6 +434,7 @@ static void __init build_mem_type_table(void) | |||
429 | if (arch_is_coherent() && cpu_is_xsc3()) { | 434 | if (arch_is_coherent() && cpu_is_xsc3()) { |
430 | mem_types[MT_MEMORY].prot_sect |= PMD_SECT_S; | 435 | mem_types[MT_MEMORY].prot_sect |= PMD_SECT_S; |
431 | mem_types[MT_MEMORY].prot_pte |= L_PTE_SHARED; | 436 | mem_types[MT_MEMORY].prot_pte |= L_PTE_SHARED; |
437 | mem_types[MT_MEMORY_DMA_READY].prot_pte |= L_PTE_SHARED; | ||
432 | mem_types[MT_MEMORY_NONCACHED].prot_sect |= PMD_SECT_S; | 438 | mem_types[MT_MEMORY_NONCACHED].prot_sect |= PMD_SECT_S; |
433 | mem_types[MT_MEMORY_NONCACHED].prot_pte |= L_PTE_SHARED; | 439 | mem_types[MT_MEMORY_NONCACHED].prot_pte |= L_PTE_SHARED; |
434 | } | 440 | } |
@@ -460,6 +466,7 @@ static void __init build_mem_type_table(void) | |||
460 | mem_types[MT_DEVICE_CACHED].prot_pte |= L_PTE_SHARED; | 466 | mem_types[MT_DEVICE_CACHED].prot_pte |= L_PTE_SHARED; |
461 | mem_types[MT_MEMORY].prot_sect |= PMD_SECT_S; | 467 | mem_types[MT_MEMORY].prot_sect |= PMD_SECT_S; |
462 | mem_types[MT_MEMORY].prot_pte |= L_PTE_SHARED; | 468 | mem_types[MT_MEMORY].prot_pte |= L_PTE_SHARED; |
469 | mem_types[MT_MEMORY_DMA_READY].prot_pte |= L_PTE_SHARED; | ||
463 | mem_types[MT_MEMORY_NONCACHED].prot_sect |= PMD_SECT_S; | 470 | mem_types[MT_MEMORY_NONCACHED].prot_sect |= PMD_SECT_S; |
464 | mem_types[MT_MEMORY_NONCACHED].prot_pte |= L_PTE_SHARED; | 471 | mem_types[MT_MEMORY_NONCACHED].prot_pte |= L_PTE_SHARED; |
465 | } | 472 | } |
@@ -512,6 +519,7 @@ static void __init build_mem_type_table(void) | |||
512 | mem_types[MT_HIGH_VECTORS].prot_l1 |= ecc_mask; | 519 | mem_types[MT_HIGH_VECTORS].prot_l1 |= ecc_mask; |
513 | mem_types[MT_MEMORY].prot_sect |= ecc_mask | cp->pmd; | 520 | mem_types[MT_MEMORY].prot_sect |= ecc_mask | cp->pmd; |
514 | mem_types[MT_MEMORY].prot_pte |= kern_pgprot; | 521 | mem_types[MT_MEMORY].prot_pte |= kern_pgprot; |
522 | mem_types[MT_MEMORY_DMA_READY].prot_pte |= kern_pgprot; | ||
515 | mem_types[MT_MEMORY_NONCACHED].prot_sect |= ecc_mask; | 523 | mem_types[MT_MEMORY_NONCACHED].prot_sect |= ecc_mask; |
516 | mem_types[MT_ROM].prot_sect |= cp->pmd; | 524 | mem_types[MT_ROM].prot_sect |= cp->pmd; |
517 | 525 | ||
@@ -596,7 +604,7 @@ static void __init alloc_init_section(pud_t *pud, unsigned long addr, | |||
596 | * L1 entries, whereas PGDs refer to a group of L1 entries making | 604 | * L1 entries, whereas PGDs refer to a group of L1 entries making |
597 | * up one logical pointer to an L2 table. | 605 | * up one logical pointer to an L2 table. |
598 | */ | 606 | */ |
599 | if (((addr | end | phys) & ~SECTION_MASK) == 0) { | 607 | if (type->prot_sect && ((addr | end | phys) & ~SECTION_MASK) == 0) { |
600 | pmd_t *p = pmd; | 608 | pmd_t *p = pmd; |
601 | 609 | ||
602 | #ifndef CONFIG_ARM_LPAE | 610 | #ifndef CONFIG_ARM_LPAE |
@@ -814,7 +822,7 @@ static int __init early_vmalloc(char *arg) | |||
814 | } | 822 | } |
815 | early_param("vmalloc", early_vmalloc); | 823 | early_param("vmalloc", early_vmalloc); |
816 | 824 | ||
817 | static phys_addr_t lowmem_limit __initdata = 0; | 825 | phys_addr_t arm_lowmem_limit __initdata = 0; |
818 | 826 | ||
819 | void __init sanity_check_meminfo(void) | 827 | void __init sanity_check_meminfo(void) |
820 | { | 828 | { |
@@ -897,8 +905,8 @@ void __init sanity_check_meminfo(void) | |||
897 | bank->size = newsize; | 905 | bank->size = newsize; |
898 | } | 906 | } |
899 | #endif | 907 | #endif |
900 | if (!bank->highmem && bank->start + bank->size > lowmem_limit) | 908 | if (!bank->highmem && bank->start + bank->size > arm_lowmem_limit) |
901 | lowmem_limit = bank->start + bank->size; | 909 | arm_lowmem_limit = bank->start + bank->size; |
902 | 910 | ||
903 | j++; | 911 | j++; |
904 | } | 912 | } |
@@ -923,8 +931,8 @@ void __init sanity_check_meminfo(void) | |||
923 | } | 931 | } |
924 | #endif | 932 | #endif |
925 | meminfo.nr_banks = j; | 933 | meminfo.nr_banks = j; |
926 | high_memory = __va(lowmem_limit - 1) + 1; | 934 | high_memory = __va(arm_lowmem_limit - 1) + 1; |
927 | memblock_set_current_limit(lowmem_limit); | 935 | memblock_set_current_limit(arm_lowmem_limit); |
928 | } | 936 | } |
929 | 937 | ||
930 | static inline void prepare_page_table(void) | 938 | static inline void prepare_page_table(void) |
@@ -949,8 +957,8 @@ static inline void prepare_page_table(void) | |||
949 | * Find the end of the first block of lowmem. | 957 | * Find the end of the first block of lowmem. |
950 | */ | 958 | */ |
951 | end = memblock.memory.regions[0].base + memblock.memory.regions[0].size; | 959 | end = memblock.memory.regions[0].base + memblock.memory.regions[0].size; |
952 | if (end >= lowmem_limit) | 960 | if (end >= arm_lowmem_limit) |
953 | end = lowmem_limit; | 961 | end = arm_lowmem_limit; |
954 | 962 | ||
955 | /* | 963 | /* |
956 | * Clear out all the kernel space mappings, except for the first | 964 | * Clear out all the kernel space mappings, except for the first |
@@ -1093,8 +1101,8 @@ static void __init map_lowmem(void) | |||
1093 | phys_addr_t end = start + reg->size; | 1101 | phys_addr_t end = start + reg->size; |
1094 | struct map_desc map; | 1102 | struct map_desc map; |
1095 | 1103 | ||
1096 | if (end > lowmem_limit) | 1104 | if (end > arm_lowmem_limit) |
1097 | end = lowmem_limit; | 1105 | end = arm_lowmem_limit; |
1098 | if (start >= end) | 1106 | if (start >= end) |
1099 | break; | 1107 | break; |
1100 | 1108 | ||
@@ -1115,11 +1123,12 @@ void __init paging_init(struct machine_desc *mdesc) | |||
1115 | { | 1123 | { |
1116 | void *zero_page; | 1124 | void *zero_page; |
1117 | 1125 | ||
1118 | memblock_set_current_limit(lowmem_limit); | 1126 | memblock_set_current_limit(arm_lowmem_limit); |
1119 | 1127 | ||
1120 | build_mem_type_table(); | 1128 | build_mem_type_table(); |
1121 | prepare_page_table(); | 1129 | prepare_page_table(); |
1122 | map_lowmem(); | 1130 | map_lowmem(); |
1131 | dma_contiguous_remap(); | ||
1123 | devicemaps_init(mdesc); | 1132 | devicemaps_init(mdesc); |
1124 | kmap_init(); | 1133 | kmap_init(); |
1125 | 1134 | ||
diff --git a/arch/arm/mm/vmregion.h b/arch/arm/mm/vmregion.h index 162be662c088..bf312c354a21 100644 --- a/arch/arm/mm/vmregion.h +++ b/arch/arm/mm/vmregion.h | |||
@@ -17,7 +17,7 @@ struct arm_vmregion { | |||
17 | struct list_head vm_list; | 17 | struct list_head vm_list; |
18 | unsigned long vm_start; | 18 | unsigned long vm_start; |
19 | unsigned long vm_end; | 19 | unsigned long vm_end; |
20 | struct page *vm_pages; | 20 | void *priv; |
21 | int vm_active; | 21 | int vm_active; |
22 | const void *caller; | 22 | const void *caller; |
23 | }; | 23 | }; |
diff --git a/arch/arm/plat-mxc/clock.c b/arch/arm/plat-mxc/clock.c index 2ed3ab173add..5079787273d2 100644 --- a/arch/arm/plat-mxc/clock.c +++ b/arch/arm/plat-mxc/clock.c | |||
@@ -41,6 +41,7 @@ | |||
41 | #include <mach/clock.h> | 41 | #include <mach/clock.h> |
42 | #include <mach/hardware.h> | 42 | #include <mach/hardware.h> |
43 | 43 | ||
44 | #ifndef CONFIG_COMMON_CLK | ||
44 | static LIST_HEAD(clocks); | 45 | static LIST_HEAD(clocks); |
45 | static DEFINE_MUTEX(clocks_mutex); | 46 | static DEFINE_MUTEX(clocks_mutex); |
46 | 47 | ||
@@ -200,6 +201,16 @@ struct clk *clk_get_parent(struct clk *clk) | |||
200 | } | 201 | } |
201 | EXPORT_SYMBOL(clk_get_parent); | 202 | EXPORT_SYMBOL(clk_get_parent); |
202 | 203 | ||
204 | #else | ||
205 | |||
206 | /* | ||
207 | * Lock to protect the clock module (ccm) registers. Used | ||
208 | * on all i.MXs | ||
209 | */ | ||
210 | DEFINE_SPINLOCK(imx_ccm_lock); | ||
211 | |||
212 | #endif /* CONFIG_COMMON_CLK */ | ||
213 | |||
203 | /* | 214 | /* |
204 | * Get the resulting clock rate from a PLL register value and the input | 215 | * Get the resulting clock rate from a PLL register value and the input |
205 | * frequency. PLLs with this register layout can at least be found on | 216 | * frequency. PLLs with this register layout can at least be found on |
diff --git a/arch/arm/plat-mxc/include/mach/clock.h b/arch/arm/plat-mxc/include/mach/clock.h index 753a5988d85c..bd940c795cbb 100644 --- a/arch/arm/plat-mxc/include/mach/clock.h +++ b/arch/arm/plat-mxc/include/mach/clock.h | |||
@@ -23,6 +23,7 @@ | |||
23 | #ifndef __ASSEMBLY__ | 23 | #ifndef __ASSEMBLY__ |
24 | #include <linux/list.h> | 24 | #include <linux/list.h> |
25 | 25 | ||
26 | #ifndef CONFIG_COMMON_CLK | ||
26 | struct module; | 27 | struct module; |
27 | 28 | ||
28 | struct clk { | 29 | struct clk { |
@@ -59,6 +60,9 @@ struct clk { | |||
59 | 60 | ||
60 | int clk_register(struct clk *clk); | 61 | int clk_register(struct clk *clk); |
61 | void clk_unregister(struct clk *clk); | 62 | void clk_unregister(struct clk *clk); |
63 | #endif /* CONFIG_COMMON_CLK */ | ||
64 | |||
65 | extern spinlock_t imx_ccm_lock; | ||
62 | 66 | ||
63 | unsigned long mxc_decode_pll(unsigned int pll, u32 f_ref); | 67 | unsigned long mxc_decode_pll(unsigned int pll, u32 f_ref); |
64 | 68 | ||
diff --git a/arch/arm/plat-mxc/include/mach/common.h b/arch/arm/plat-mxc/include/mach/common.h index 0319c4a0cafa..cf663d84e7c1 100644 --- a/arch/arm/plat-mxc/include/mach/common.h +++ b/arch/arm/plat-mxc/include/mach/common.h | |||
@@ -53,6 +53,7 @@ extern void imx35_soc_init(void); | |||
53 | extern void imx50_soc_init(void); | 53 | extern void imx50_soc_init(void); |
54 | extern void imx51_soc_init(void); | 54 | extern void imx51_soc_init(void); |
55 | extern void imx53_soc_init(void); | 55 | extern void imx53_soc_init(void); |
56 | extern void imx51_init_late(void); | ||
56 | extern void epit_timer_init(struct clk *timer_clk, void __iomem *base, int irq); | 57 | extern void epit_timer_init(struct clk *timer_clk, void __iomem *base, int irq); |
57 | extern void mxc_timer_init(struct clk *timer_clk, void __iomem *, int); | 58 | extern void mxc_timer_init(struct clk *timer_clk, void __iomem *, int); |
58 | extern int mx1_clocks_init(unsigned long fref); | 59 | extern int mx1_clocks_init(unsigned long fref); |
@@ -149,4 +150,10 @@ extern void imx6q_pm_init(void); | |||
149 | static inline void imx6q_pm_init(void) {} | 150 | static inline void imx6q_pm_init(void) {} |
150 | #endif | 151 | #endif |
151 | 152 | ||
153 | #ifdef CONFIG_NEON | ||
154 | extern int mx51_neon_fixup(void); | ||
155 | #else | ||
156 | static inline int mx51_neon_fixup(void) { return 0; } | ||
157 | #endif | ||
158 | |||
152 | #endif | 159 | #endif |
diff --git a/arch/arm/plat-mxc/include/mach/debug-macro.S b/arch/arm/plat-mxc/include/mach/debug-macro.S index 8ddda365f1a0..761e45f9456f 100644 --- a/arch/arm/plat-mxc/include/mach/debug-macro.S +++ b/arch/arm/plat-mxc/include/mach/debug-macro.S | |||
@@ -24,6 +24,8 @@ | |||
24 | #define UART_PADDR MX51_UART1_BASE_ADDR | 24 | #define UART_PADDR MX51_UART1_BASE_ADDR |
25 | #elif defined (CONFIG_DEBUG_IMX50_IMX53_UART) | 25 | #elif defined (CONFIG_DEBUG_IMX50_IMX53_UART) |
26 | #define UART_PADDR MX53_UART1_BASE_ADDR | 26 | #define UART_PADDR MX53_UART1_BASE_ADDR |
27 | #elif defined (CONFIG_DEBUG_IMX6Q_UART2) | ||
28 | #define UART_PADDR MX6Q_UART2_BASE_ADDR | ||
27 | #elif defined (CONFIG_DEBUG_IMX6Q_UART4) | 29 | #elif defined (CONFIG_DEBUG_IMX6Q_UART4) |
28 | #define UART_PADDR MX6Q_UART4_BASE_ADDR | 30 | #define UART_PADDR MX6Q_UART4_BASE_ADDR |
29 | #endif | 31 | #endif |
diff --git a/arch/arm/plat-mxc/include/mach/mx6q.h b/arch/arm/plat-mxc/include/mach/mx6q.h index 254a561a2799..f7e7dbac8f4b 100644 --- a/arch/arm/plat-mxc/include/mach/mx6q.h +++ b/arch/arm/plat-mxc/include/mach/mx6q.h | |||
@@ -27,6 +27,8 @@ | |||
27 | #define MX6Q_CCM_SIZE 0x4000 | 27 | #define MX6Q_CCM_SIZE 0x4000 |
28 | #define MX6Q_ANATOP_BASE_ADDR 0x020c8000 | 28 | #define MX6Q_ANATOP_BASE_ADDR 0x020c8000 |
29 | #define MX6Q_ANATOP_SIZE 0x1000 | 29 | #define MX6Q_ANATOP_SIZE 0x1000 |
30 | #define MX6Q_UART2_BASE_ADDR 0x021e8000 | ||
31 | #define MX6Q_UART2_SIZE 0x4000 | ||
30 | #define MX6Q_UART4_BASE_ADDR 0x021f0000 | 32 | #define MX6Q_UART4_BASE_ADDR 0x021f0000 |
31 | #define MX6Q_UART4_SIZE 0x4000 | 33 | #define MX6Q_UART4_SIZE 0x4000 |
32 | 34 | ||
diff --git a/arch/arm/plat-mxc/time.c b/arch/arm/plat-mxc/time.c index 7daf7c9a413b..99f958ca6cb8 100644 --- a/arch/arm/plat-mxc/time.c +++ b/arch/arm/plat-mxc/time.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/irq.h> | 25 | #include <linux/irq.h> |
26 | #include <linux/clockchips.h> | 26 | #include <linux/clockchips.h> |
27 | #include <linux/clk.h> | 27 | #include <linux/clk.h> |
28 | #include <linux/err.h> | ||
28 | 29 | ||
29 | #include <mach/hardware.h> | 30 | #include <mach/hardware.h> |
30 | #include <asm/sched_clock.h> | 31 | #include <asm/sched_clock.h> |
@@ -282,6 +283,19 @@ static int __init mxc_clockevent_init(struct clk *timer_clk) | |||
282 | void __init mxc_timer_init(struct clk *timer_clk, void __iomem *base, int irq) | 283 | void __init mxc_timer_init(struct clk *timer_clk, void __iomem *base, int irq) |
283 | { | 284 | { |
284 | uint32_t tctl_val; | 285 | uint32_t tctl_val; |
286 | struct clk *timer_ipg_clk; | ||
287 | |||
288 | if (!timer_clk) { | ||
289 | timer_clk = clk_get_sys("imx-gpt.0", "per"); | ||
290 | if (IS_ERR(timer_clk)) { | ||
291 | pr_err("i.MX timer: unable to get clk\n"); | ||
292 | return; | ||
293 | } | ||
294 | |||
295 | timer_ipg_clk = clk_get_sys("imx-gpt.0", "ipg"); | ||
296 | if (!IS_ERR(timer_ipg_clk)) | ||
297 | clk_prepare_enable(timer_ipg_clk); | ||
298 | } | ||
285 | 299 | ||
286 | clk_prepare_enable(timer_clk); | 300 | clk_prepare_enable(timer_clk); |
287 | 301 | ||
diff --git a/arch/arm/plat-omap/counter_32k.c b/arch/arm/plat-omap/counter_32k.c index 44ae077dbc28..2132c4f389e1 100644 --- a/arch/arm/plat-omap/counter_32k.c +++ b/arch/arm/plat-omap/counter_32k.c | |||
@@ -28,19 +28,20 @@ | |||
28 | 28 | ||
29 | #include <plat/clock.h> | 29 | #include <plat/clock.h> |
30 | 30 | ||
31 | /* OMAP2_32KSYNCNT_CR_OFF: offset of 32ksync counter register */ | ||
32 | #define OMAP2_32KSYNCNT_CR_OFF 0x10 | ||
33 | |||
31 | /* | 34 | /* |
32 | * 32KHz clocksource ... always available, on pretty most chips except | 35 | * 32KHz clocksource ... always available, on pretty most chips except |
33 | * OMAP 730 and 1510. Other timers could be used as clocksources, with | 36 | * OMAP 730 and 1510. Other timers could be used as clocksources, with |
34 | * higher resolution in free-running counter modes (e.g. 12 MHz xtal), | 37 | * higher resolution in free-running counter modes (e.g. 12 MHz xtal), |
35 | * but systems won't necessarily want to spend resources that way. | 38 | * but systems won't necessarily want to spend resources that way. |
36 | */ | 39 | */ |
37 | static void __iomem *timer_32k_base; | 40 | static void __iomem *sync32k_cnt_reg; |
38 | |||
39 | #define OMAP16XX_TIMER_32K_SYNCHRONIZED 0xfffbc410 | ||
40 | 41 | ||
41 | static u32 notrace omap_32k_read_sched_clock(void) | 42 | static u32 notrace omap_32k_read_sched_clock(void) |
42 | { | 43 | { |
43 | return timer_32k_base ? __raw_readl(timer_32k_base) : 0; | 44 | return sync32k_cnt_reg ? __raw_readl(sync32k_cnt_reg) : 0; |
44 | } | 45 | } |
45 | 46 | ||
46 | /** | 47 | /** |
@@ -60,7 +61,7 @@ static void omap_read_persistent_clock(struct timespec *ts) | |||
60 | struct timespec *tsp = &persistent_ts; | 61 | struct timespec *tsp = &persistent_ts; |
61 | 62 | ||
62 | last_cycles = cycles; | 63 | last_cycles = cycles; |
63 | cycles = timer_32k_base ? __raw_readl(timer_32k_base) : 0; | 64 | cycles = sync32k_cnt_reg ? __raw_readl(sync32k_cnt_reg) : 0; |
64 | delta = cycles - last_cycles; | 65 | delta = cycles - last_cycles; |
65 | 66 | ||
66 | nsecs = clocksource_cyc2ns(delta, persistent_mult, persistent_shift); | 67 | nsecs = clocksource_cyc2ns(delta, persistent_mult, persistent_shift); |
@@ -69,55 +70,41 @@ static void omap_read_persistent_clock(struct timespec *ts) | |||
69 | *ts = *tsp; | 70 | *ts = *tsp; |
70 | } | 71 | } |
71 | 72 | ||
72 | int __init omap_init_clocksource_32k(void) | 73 | /** |
74 | * omap_init_clocksource_32k - setup and register counter 32k as a | ||
75 | * kernel clocksource | ||
76 | * @pbase: base addr of counter_32k module | ||
77 | * @size: size of counter_32k to map | ||
78 | * | ||
79 | * Returns 0 upon success or negative error code upon failure. | ||
80 | * | ||
81 | */ | ||
82 | int __init omap_init_clocksource_32k(void __iomem *vbase) | ||
73 | { | 83 | { |
74 | static char err[] __initdata = KERN_ERR | 84 | int ret; |
75 | "%s: can't register clocksource!\n"; | 85 | |
76 | 86 | /* | |
77 | if (cpu_is_omap16xx() || cpu_class_is_omap2()) { | 87 | * 32k sync Counter register offset is at 0x10 |
78 | u32 pbase; | 88 | */ |
79 | unsigned long size = SZ_4K; | 89 | sync32k_cnt_reg = vbase + OMAP2_32KSYNCNT_CR_OFF; |
80 | void __iomem *base; | 90 | |
81 | struct clk *sync_32k_ick; | 91 | /* |
82 | 92 | * 120000 rough estimate from the calculations in | |
83 | if (cpu_is_omap16xx()) { | 93 | * __clocksource_updatefreq_scale. |
84 | pbase = OMAP16XX_TIMER_32K_SYNCHRONIZED; | 94 | */ |
85 | size = SZ_1K; | 95 | clocks_calc_mult_shift(&persistent_mult, &persistent_shift, |
86 | } else if (cpu_is_omap2420()) | 96 | 32768, NSEC_PER_SEC, 120000); |
87 | pbase = OMAP2420_32KSYNCT_BASE + 0x10; | 97 | |
88 | else if (cpu_is_omap2430()) | 98 | ret = clocksource_mmio_init(sync32k_cnt_reg, "32k_counter", 32768, |
89 | pbase = OMAP2430_32KSYNCT_BASE + 0x10; | 99 | 250, 32, clocksource_mmio_readl_up); |
90 | else if (cpu_is_omap34xx()) | 100 | if (ret) { |
91 | pbase = OMAP3430_32KSYNCT_BASE + 0x10; | 101 | pr_err("32k_counter: can't register clocksource\n"); |
92 | else if (cpu_is_omap44xx()) | 102 | return ret; |
93 | pbase = OMAP4430_32KSYNCT_BASE + 0x10; | ||
94 | else | ||
95 | return -ENODEV; | ||
96 | |||
97 | /* For this to work we must have a static mapping in io.c for this area */ | ||
98 | base = ioremap(pbase, size); | ||
99 | if (!base) | ||
100 | return -ENODEV; | ||
101 | |||
102 | sync_32k_ick = clk_get(NULL, "omap_32ksync_ick"); | ||
103 | if (!IS_ERR(sync_32k_ick)) | ||
104 | clk_enable(sync_32k_ick); | ||
105 | |||
106 | timer_32k_base = base; | ||
107 | |||
108 | /* | ||
109 | * 120000 rough estimate from the calculations in | ||
110 | * __clocksource_updatefreq_scale. | ||
111 | */ | ||
112 | clocks_calc_mult_shift(&persistent_mult, &persistent_shift, | ||
113 | 32768, NSEC_PER_SEC, 120000); | ||
114 | |||
115 | if (clocksource_mmio_init(base, "32k_counter", 32768, 250, 32, | ||
116 | clocksource_mmio_readl_up)) | ||
117 | printk(err, "32k_counter"); | ||
118 | |||
119 | setup_sched_clock(omap_32k_read_sched_clock, 32, 32768); | ||
120 | register_persistent_clock(NULL, omap_read_persistent_clock); | ||
121 | } | 103 | } |
104 | |||
105 | setup_sched_clock(omap_32k_read_sched_clock, 32, 32768); | ||
106 | register_persistent_clock(NULL, omap_read_persistent_clock); | ||
107 | pr_info("OMAP clocksource: 32k_counter at 32768 Hz\n"); | ||
108 | |||
122 | return 0; | 109 | return 0; |
123 | } | 110 | } |
diff --git a/arch/arm/plat-omap/devices.c b/arch/arm/plat-omap/devices.c index 09b07d252892..1cba9273d2cb 100644 --- a/arch/arm/plat-omap/devices.c +++ b/arch/arm/plat-omap/devices.c | |||
@@ -28,54 +28,6 @@ | |||
28 | #include <plat/menelaus.h> | 28 | #include <plat/menelaus.h> |
29 | #include <plat/omap44xx.h> | 29 | #include <plat/omap44xx.h> |
30 | 30 | ||
31 | #if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) || \ | ||
32 | defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE) | ||
33 | |||
34 | #define OMAP_MMC_NR_RES 2 | ||
35 | |||
36 | /* | ||
37 | * Register MMC devices. Called from mach-omap1 and mach-omap2 device init. | ||
38 | */ | ||
39 | int __init omap_mmc_add(const char *name, int id, unsigned long base, | ||
40 | unsigned long size, unsigned int irq, | ||
41 | struct omap_mmc_platform_data *data) | ||
42 | { | ||
43 | struct platform_device *pdev; | ||
44 | struct resource res[OMAP_MMC_NR_RES]; | ||
45 | int ret; | ||
46 | |||
47 | pdev = platform_device_alloc(name, id); | ||
48 | if (!pdev) | ||
49 | return -ENOMEM; | ||
50 | |||
51 | memset(res, 0, OMAP_MMC_NR_RES * sizeof(struct resource)); | ||
52 | res[0].start = base; | ||
53 | res[0].end = base + size - 1; | ||
54 | res[0].flags = IORESOURCE_MEM; | ||
55 | res[1].start = res[1].end = irq; | ||
56 | res[1].flags = IORESOURCE_IRQ; | ||
57 | |||
58 | ret = platform_device_add_resources(pdev, res, ARRAY_SIZE(res)); | ||
59 | if (ret == 0) | ||
60 | ret = platform_device_add_data(pdev, data, sizeof(*data)); | ||
61 | if (ret) | ||
62 | goto fail; | ||
63 | |||
64 | ret = platform_device_add(pdev); | ||
65 | if (ret) | ||
66 | goto fail; | ||
67 | |||
68 | /* return device handle to board setup code */ | ||
69 | data->dev = &pdev->dev; | ||
70 | return 0; | ||
71 | |||
72 | fail: | ||
73 | platform_device_put(pdev); | ||
74 | return ret; | ||
75 | } | ||
76 | |||
77 | #endif | ||
78 | |||
79 | /*-------------------------------------------------------------------------*/ | 31 | /*-------------------------------------------------------------------------*/ |
80 | 32 | ||
81 | #if defined(CONFIG_HW_RANDOM_OMAP) || defined(CONFIG_HW_RANDOM_OMAP_MODULE) | 33 | #if defined(CONFIG_HW_RANDOM_OMAP) || defined(CONFIG_HW_RANDOM_OMAP_MODULE) |
@@ -109,79 +61,6 @@ static void omap_init_rng(void) | |||
109 | static inline void omap_init_rng(void) {} | 61 | static inline void omap_init_rng(void) {} |
110 | #endif | 62 | #endif |
111 | 63 | ||
112 | /*-------------------------------------------------------------------------*/ | ||
113 | |||
114 | /* Numbering for the SPI-capable controllers when used for SPI: | ||
115 | * spi = 1 | ||
116 | * uwire = 2 | ||
117 | * mmc1..2 = 3..4 | ||
118 | * mcbsp1..3 = 5..7 | ||
119 | */ | ||
120 | |||
121 | #if defined(CONFIG_SPI_OMAP_UWIRE) || defined(CONFIG_SPI_OMAP_UWIRE_MODULE) | ||
122 | |||
123 | #define OMAP_UWIRE_BASE 0xfffb3000 | ||
124 | |||
125 | static struct resource uwire_resources[] = { | ||
126 | { | ||
127 | .start = OMAP_UWIRE_BASE, | ||
128 | .end = OMAP_UWIRE_BASE + 0x20, | ||
129 | .flags = IORESOURCE_MEM, | ||
130 | }, | ||
131 | }; | ||
132 | |||
133 | static struct platform_device omap_uwire_device = { | ||
134 | .name = "omap_uwire", | ||
135 | .id = -1, | ||
136 | .num_resources = ARRAY_SIZE(uwire_resources), | ||
137 | .resource = uwire_resources, | ||
138 | }; | ||
139 | |||
140 | static void omap_init_uwire(void) | ||
141 | { | ||
142 | /* FIXME define and use a boot tag; not all boards will be hooking | ||
143 | * up devices to the microwire controller, and multi-board configs | ||
144 | * mean that CONFIG_SPI_OMAP_UWIRE may be configured anyway... | ||
145 | */ | ||
146 | |||
147 | /* board-specific code must configure chipselects (only a few | ||
148 | * are normally used) and SCLK/SDI/SDO (each has two choices). | ||
149 | */ | ||
150 | (void) platform_device_register(&omap_uwire_device); | ||
151 | } | ||
152 | #else | ||
153 | static inline void omap_init_uwire(void) {} | ||
154 | #endif | ||
155 | |||
156 | #if defined(CONFIG_TIDSPBRIDGE) || defined(CONFIG_TIDSPBRIDGE_MODULE) | ||
157 | |||
158 | static phys_addr_t omap_dsp_phys_mempool_base; | ||
159 | |||
160 | void __init omap_dsp_reserve_sdram_memblock(void) | ||
161 | { | ||
162 | phys_addr_t size = CONFIG_TIDSPBRIDGE_MEMPOOL_SIZE; | ||
163 | phys_addr_t paddr; | ||
164 | |||
165 | if (!size) | ||
166 | return; | ||
167 | |||
168 | paddr = arm_memblock_steal(size, SZ_1M); | ||
169 | if (!paddr) { | ||
170 | pr_err("%s: failed to reserve %llx bytes\n", | ||
171 | __func__, (unsigned long long)size); | ||
172 | return; | ||
173 | } | ||
174 | |||
175 | omap_dsp_phys_mempool_base = paddr; | ||
176 | } | ||
177 | |||
178 | phys_addr_t omap_dsp_get_mempool_base(void) | ||
179 | { | ||
180 | return omap_dsp_phys_mempool_base; | ||
181 | } | ||
182 | EXPORT_SYMBOL(omap_dsp_get_mempool_base); | ||
183 | #endif | ||
184 | |||
185 | /* | 64 | /* |
186 | * This gets called after board-specific INIT_MACHINE, and initializes most | 65 | * This gets called after board-specific INIT_MACHINE, and initializes most |
187 | * on-chip peripherals accessible on this board (except for few like USB): | 66 | * on-chip peripherals accessible on this board (except for few like USB): |
@@ -208,7 +87,6 @@ static int __init omap_init_devices(void) | |||
208 | * in alphabetical order so they're easier to sort through. | 87 | * in alphabetical order so they're easier to sort through. |
209 | */ | 88 | */ |
210 | omap_init_rng(); | 89 | omap_init_rng(); |
211 | omap_init_uwire(); | ||
212 | return 0; | 90 | return 0; |
213 | } | 91 | } |
214 | arch_initcall(omap_init_devices); | 92 | arch_initcall(omap_init_devices); |
diff --git a/arch/arm/plat-omap/dma.c b/arch/arm/plat-omap/dma.c index 987e6101267d..cb16ade437cb 100644 --- a/arch/arm/plat-omap/dma.c +++ b/arch/arm/plat-omap/dma.c | |||
@@ -852,7 +852,7 @@ omap_dma_set_prio_lch(int lch, unsigned char read_prio, | |||
852 | } | 852 | } |
853 | l = p->dma_read(CCR, lch); | 853 | l = p->dma_read(CCR, lch); |
854 | l &= ~((1 << 6) | (1 << 26)); | 854 | l &= ~((1 << 6) | (1 << 26)); |
855 | if (cpu_is_omap2430() || cpu_is_omap34xx() || cpu_is_omap44xx()) | 855 | if (cpu_class_is_omap2() && !cpu_is_omap242x()) |
856 | l |= ((read_prio & 0x1) << 6) | ((write_prio & 0x1) << 26); | 856 | l |= ((read_prio & 0x1) << 6) | ((write_prio & 0x1) << 26); |
857 | else | 857 | else |
858 | l |= ((read_prio & 0x1) << 6); | 858 | l |= ((read_prio & 0x1) << 6); |
@@ -2080,7 +2080,7 @@ static int __devinit omap_system_dma_probe(struct platform_device *pdev) | |||
2080 | } | 2080 | } |
2081 | } | 2081 | } |
2082 | 2082 | ||
2083 | if (cpu_is_omap2430() || cpu_is_omap34xx() || cpu_is_omap44xx()) | 2083 | if (cpu_class_is_omap2() && !cpu_is_omap242x()) |
2084 | omap_dma_set_global_params(DMA_DEFAULT_ARB_RATE, | 2084 | omap_dma_set_global_params(DMA_DEFAULT_ARB_RATE, |
2085 | DMA_DEFAULT_FIFO_DEPTH, 0); | 2085 | DMA_DEFAULT_FIFO_DEPTH, 0); |
2086 | 2086 | ||
diff --git a/arch/arm/plat-omap/dmtimer.c b/arch/arm/plat-omap/dmtimer.c index c4ed35e89fbd..3b0cfeb33d05 100644 --- a/arch/arm/plat-omap/dmtimer.c +++ b/arch/arm/plat-omap/dmtimer.c | |||
@@ -82,8 +82,6 @@ static void omap_dm_timer_write_reg(struct omap_dm_timer *timer, u32 reg, | |||
82 | 82 | ||
83 | static void omap_timer_restore_context(struct omap_dm_timer *timer) | 83 | static void omap_timer_restore_context(struct omap_dm_timer *timer) |
84 | { | 84 | { |
85 | __raw_writel(timer->context.tiocp_cfg, | ||
86 | timer->io_base + OMAP_TIMER_OCP_CFG_OFFSET); | ||
87 | if (timer->revision == 1) | 85 | if (timer->revision == 1) |
88 | __raw_writel(timer->context.tistat, timer->sys_stat); | 86 | __raw_writel(timer->context.tistat, timer->sys_stat); |
89 | 87 | ||
diff --git a/arch/arm/plat-omap/include/plat/common.h b/arch/arm/plat-omap/include/plat/common.h index a557b8484e6c..d1cb6f527b7e 100644 --- a/arch/arm/plat-omap/include/plat/common.h +++ b/arch/arm/plat-omap/include/plat/common.h | |||
@@ -30,7 +30,7 @@ | |||
30 | #include <plat/i2c.h> | 30 | #include <plat/i2c.h> |
31 | #include <plat/omap_hwmod.h> | 31 | #include <plat/omap_hwmod.h> |
32 | 32 | ||
33 | extern int __init omap_init_clocksource_32k(void); | 33 | extern int __init omap_init_clocksource_32k(void __iomem *vbase); |
34 | 34 | ||
35 | extern void __init omap_check_revision(void); | 35 | extern void __init omap_check_revision(void); |
36 | 36 | ||
diff --git a/arch/arm/plat-omap/include/plat/cpu.h b/arch/arm/plat-omap/include/plat/cpu.h index 4bdf14ec6747..297245dba66e 100644 --- a/arch/arm/plat-omap/include/plat/cpu.h +++ b/arch/arm/plat-omap/include/plat/cpu.h | |||
@@ -121,6 +121,7 @@ IS_OMAP_CLASS(16xx, 0x16) | |||
121 | IS_OMAP_CLASS(24xx, 0x24) | 121 | IS_OMAP_CLASS(24xx, 0x24) |
122 | IS_OMAP_CLASS(34xx, 0x34) | 122 | IS_OMAP_CLASS(34xx, 0x34) |
123 | IS_OMAP_CLASS(44xx, 0x44) | 123 | IS_OMAP_CLASS(44xx, 0x44) |
124 | IS_AM_CLASS(35xx, 0x35) | ||
124 | IS_AM_CLASS(33xx, 0x33) | 125 | IS_AM_CLASS(33xx, 0x33) |
125 | 126 | ||
126 | IS_TI_CLASS(81xx, 0x81) | 127 | IS_TI_CLASS(81xx, 0x81) |
@@ -148,6 +149,7 @@ IS_AM_SUBCLASS(335x, 0x335) | |||
148 | #define cpu_is_ti81xx() 0 | 149 | #define cpu_is_ti81xx() 0 |
149 | #define cpu_is_ti816x() 0 | 150 | #define cpu_is_ti816x() 0 |
150 | #define cpu_is_ti814x() 0 | 151 | #define cpu_is_ti814x() 0 |
152 | #define soc_is_am35xx() 0 | ||
151 | #define cpu_is_am33xx() 0 | 153 | #define cpu_is_am33xx() 0 |
152 | #define cpu_is_am335x() 0 | 154 | #define cpu_is_am335x() 0 |
153 | #define cpu_is_omap44xx() 0 | 155 | #define cpu_is_omap44xx() 0 |
@@ -357,6 +359,7 @@ IS_OMAP_TYPE(3517, 0x3517) | |||
357 | # undef cpu_is_ti81xx | 359 | # undef cpu_is_ti81xx |
358 | # undef cpu_is_ti816x | 360 | # undef cpu_is_ti816x |
359 | # undef cpu_is_ti814x | 361 | # undef cpu_is_ti814x |
362 | # undef soc_is_am35xx | ||
360 | # undef cpu_is_am33xx | 363 | # undef cpu_is_am33xx |
361 | # undef cpu_is_am335x | 364 | # undef cpu_is_am335x |
362 | # define cpu_is_omap3430() is_omap3430() | 365 | # define cpu_is_omap3430() is_omap3430() |
@@ -378,6 +381,7 @@ IS_OMAP_TYPE(3517, 0x3517) | |||
378 | # define cpu_is_ti81xx() is_ti81xx() | 381 | # define cpu_is_ti81xx() is_ti81xx() |
379 | # define cpu_is_ti816x() is_ti816x() | 382 | # define cpu_is_ti816x() is_ti816x() |
380 | # define cpu_is_ti814x() is_ti814x() | 383 | # define cpu_is_ti814x() is_ti814x() |
384 | # define soc_is_am35xx() is_am35xx() | ||
381 | # define cpu_is_am33xx() is_am33xx() | 385 | # define cpu_is_am33xx() is_am33xx() |
382 | # define cpu_is_am335x() is_am335x() | 386 | # define cpu_is_am335x() is_am335x() |
383 | #endif | 387 | #endif |
@@ -433,6 +437,10 @@ IS_OMAP_TYPE(3517, 0x3517) | |||
433 | #define TI8148_REV_ES2_0 (TI814X_CLASS | (0x1 << 8)) | 437 | #define TI8148_REV_ES2_0 (TI814X_CLASS | (0x1 << 8)) |
434 | #define TI8148_REV_ES2_1 (TI814X_CLASS | (0x2 << 8)) | 438 | #define TI8148_REV_ES2_1 (TI814X_CLASS | (0x2 << 8)) |
435 | 439 | ||
440 | #define AM35XX_CLASS 0x35170034 | ||
441 | #define AM35XX_REV_ES1_0 AM35XX_CLASS | ||
442 | #define AM35XX_REV_ES1_1 (AM35XX_CLASS | (0x1 << 8)) | ||
443 | |||
436 | #define AM335X_CLASS 0x33500034 | 444 | #define AM335X_CLASS 0x33500034 |
437 | #define AM335X_REV_ES1_0 AM335X_CLASS | 445 | #define AM335X_REV_ES1_0 AM335X_CLASS |
438 | 446 | ||
diff --git a/arch/arm/plat-omap/include/plat/dma.h b/arch/arm/plat-omap/include/plat/dma.h index 42afb4c45517..c5811d4409b0 100644 --- a/arch/arm/plat-omap/include/plat/dma.h +++ b/arch/arm/plat-omap/include/plat/dma.h | |||
@@ -312,6 +312,11 @@ | |||
312 | #define CLEAR_CSR_ON_READ BIT(0xC) | 312 | #define CLEAR_CSR_ON_READ BIT(0xC) |
313 | #define IS_WORD_16 BIT(0xD) | 313 | #define IS_WORD_16 BIT(0xD) |
314 | 314 | ||
315 | /* Defines for DMA Capabilities */ | ||
316 | #define DMA_HAS_TRANSPARENT_CAPS (0x1 << 18) | ||
317 | #define DMA_HAS_CONSTANT_FILL_CAPS (0x1 << 19) | ||
318 | #define DMA_HAS_DESCRIPTOR_CAPS (0x3 << 20) | ||
319 | |||
315 | enum omap_reg_offsets { | 320 | enum omap_reg_offsets { |
316 | 321 | ||
317 | GCR, GSCR, GRST1, HW_ID, | 322 | GCR, GSCR, GRST1, HW_ID, |
diff --git a/arch/arm/plat-omap/include/plat/dmtimer.h b/arch/arm/plat-omap/include/plat/dmtimer.h index bdf871a84d62..5da73562e486 100644 --- a/arch/arm/plat-omap/include/plat/dmtimer.h +++ b/arch/arm/plat-omap/include/plat/dmtimer.h | |||
@@ -75,7 +75,6 @@ struct clk; | |||
75 | 75 | ||
76 | struct timer_regs { | 76 | struct timer_regs { |
77 | u32 tidr; | 77 | u32 tidr; |
78 | u32 tiocp_cfg; | ||
79 | u32 tistat; | 78 | u32 tistat; |
80 | u32 tisr; | 79 | u32 tisr; |
81 | u32 tier; | 80 | u32 tier; |
diff --git a/arch/arm/plat-omap/include/plat/mmc.h b/arch/arm/plat-omap/include/plat/mmc.h index 3e7ae0f0215f..a7754a886d42 100644 --- a/arch/arm/plat-omap/include/plat/mmc.h +++ b/arch/arm/plat-omap/include/plat/mmc.h | |||
@@ -177,9 +177,6 @@ extern void omap_mmc_notify_cover_event(struct device *dev, int slot, | |||
177 | void omap1_init_mmc(struct omap_mmc_platform_data **mmc_data, | 177 | void omap1_init_mmc(struct omap_mmc_platform_data **mmc_data, |
178 | int nr_controllers); | 178 | int nr_controllers); |
179 | void omap242x_init_mmc(struct omap_mmc_platform_data **mmc_data); | 179 | void omap242x_init_mmc(struct omap_mmc_platform_data **mmc_data); |
180 | int omap_mmc_add(const char *name, int id, unsigned long base, | ||
181 | unsigned long size, unsigned int irq, | ||
182 | struct omap_mmc_platform_data *data); | ||
183 | #else | 180 | #else |
184 | static inline void omap1_init_mmc(struct omap_mmc_platform_data **mmc_data, | 181 | static inline void omap1_init_mmc(struct omap_mmc_platform_data **mmc_data, |
185 | int nr_controllers) | 182 | int nr_controllers) |
@@ -188,12 +185,6 @@ static inline void omap1_init_mmc(struct omap_mmc_platform_data **mmc_data, | |||
188 | static inline void omap242x_init_mmc(struct omap_mmc_platform_data **mmc_data) | 185 | static inline void omap242x_init_mmc(struct omap_mmc_platform_data **mmc_data) |
189 | { | 186 | { |
190 | } | 187 | } |
191 | static inline int omap_mmc_add(const char *name, int id, unsigned long base, | ||
192 | unsigned long size, unsigned int irq, | ||
193 | struct omap_mmc_platform_data *data) | ||
194 | { | ||
195 | return 0; | ||
196 | } | ||
197 | 188 | ||
198 | #endif | 189 | #endif |
199 | 190 | ||
diff --git a/arch/arm/plat-orion/common.c b/arch/arm/plat-orion/common.c index 74daf5ed1432..61fd837624a8 100644 --- a/arch/arm/plat-orion/common.c +++ b/arch/arm/plat-orion/common.c | |||
@@ -14,15 +14,41 @@ | |||
14 | #include <linux/dma-mapping.h> | 14 | #include <linux/dma-mapping.h> |
15 | #include <linux/serial_8250.h> | 15 | #include <linux/serial_8250.h> |
16 | #include <linux/ata_platform.h> | 16 | #include <linux/ata_platform.h> |
17 | #include <linux/clk.h> | ||
18 | #include <linux/clkdev.h> | ||
17 | #include <linux/mv643xx_eth.h> | 19 | #include <linux/mv643xx_eth.h> |
18 | #include <linux/mv643xx_i2c.h> | 20 | #include <linux/mv643xx_i2c.h> |
19 | #include <net/dsa.h> | 21 | #include <net/dsa.h> |
20 | #include <linux/spi/orion_spi.h> | ||
21 | #include <plat/orion_wdt.h> | ||
22 | #include <plat/mv_xor.h> | 22 | #include <plat/mv_xor.h> |
23 | #include <plat/ehci-orion.h> | 23 | #include <plat/ehci-orion.h> |
24 | #include <mach/bridge-regs.h> | 24 | #include <mach/bridge-regs.h> |
25 | 25 | ||
26 | /* Create a clkdev entry for a given device/clk */ | ||
27 | void __init orion_clkdev_add(const char *con_id, const char *dev_id, | ||
28 | struct clk *clk) | ||
29 | { | ||
30 | struct clk_lookup *cl; | ||
31 | |||
32 | cl = clkdev_alloc(clk, con_id, dev_id); | ||
33 | if (cl) | ||
34 | clkdev_add(cl); | ||
35 | } | ||
36 | |||
37 | /* Create clkdev entries for all orion platforms except kirkwood. | ||
38 | Kirkwood has gated clocks for some of its peripherals, so creates | ||
39 | its own clkdev entries. For all the other orion devices, create | ||
40 | clkdev entries to the tclk. */ | ||
41 | void __init orion_clkdev_init(struct clk *tclk) | ||
42 | { | ||
43 | orion_clkdev_add(NULL, "orion_spi.0", tclk); | ||
44 | orion_clkdev_add(NULL, "orion_spi.1", tclk); | ||
45 | orion_clkdev_add(NULL, MV643XX_ETH_NAME ".0", tclk); | ||
46 | orion_clkdev_add(NULL, MV643XX_ETH_NAME ".1", tclk); | ||
47 | orion_clkdev_add(NULL, MV643XX_ETH_NAME ".2", tclk); | ||
48 | orion_clkdev_add(NULL, MV643XX_ETH_NAME ".3", tclk); | ||
49 | orion_clkdev_add(NULL, "orion_wdt", tclk); | ||
50 | } | ||
51 | |||
26 | /* Fill in the resources structure and link it into the platform | 52 | /* Fill in the resources structure and link it into the platform |
27 | device structure. There is always a memory region, and nearly | 53 | device structure. There is always a memory region, and nearly |
28 | always an interrupt.*/ | 54 | always an interrupt.*/ |
@@ -49,6 +75,12 @@ static void fill_resources(struct platform_device *device, | |||
49 | /***************************************************************************** | 75 | /***************************************************************************** |
50 | * UART | 76 | * UART |
51 | ****************************************************************************/ | 77 | ****************************************************************************/ |
78 | static unsigned long __init uart_get_clk_rate(struct clk *clk) | ||
79 | { | ||
80 | clk_prepare_enable(clk); | ||
81 | return clk_get_rate(clk); | ||
82 | } | ||
83 | |||
52 | static void __init uart_complete( | 84 | static void __init uart_complete( |
53 | struct platform_device *orion_uart, | 85 | struct platform_device *orion_uart, |
54 | struct plat_serial8250_port *data, | 86 | struct plat_serial8250_port *data, |
@@ -56,12 +88,12 @@ static void __init uart_complete( | |||
56 | unsigned int membase, | 88 | unsigned int membase, |
57 | resource_size_t mapbase, | 89 | resource_size_t mapbase, |
58 | unsigned int irq, | 90 | unsigned int irq, |
59 | unsigned int uartclk) | 91 | struct clk *clk) |
60 | { | 92 | { |
61 | data->mapbase = mapbase; | 93 | data->mapbase = mapbase; |
62 | data->membase = (void __iomem *)membase; | 94 | data->membase = (void __iomem *)membase; |
63 | data->irq = irq; | 95 | data->irq = irq; |
64 | data->uartclk = uartclk; | 96 | data->uartclk = uart_get_clk_rate(clk); |
65 | orion_uart->dev.platform_data = data; | 97 | orion_uart->dev.platform_data = data; |
66 | 98 | ||
67 | fill_resources(orion_uart, resources, mapbase, 0xff, irq); | 99 | fill_resources(orion_uart, resources, mapbase, 0xff, irq); |
@@ -90,10 +122,10 @@ static struct platform_device orion_uart0 = { | |||
90 | void __init orion_uart0_init(unsigned int membase, | 122 | void __init orion_uart0_init(unsigned int membase, |
91 | resource_size_t mapbase, | 123 | resource_size_t mapbase, |
92 | unsigned int irq, | 124 | unsigned int irq, |
93 | unsigned int uartclk) | 125 | struct clk *clk) |
94 | { | 126 | { |
95 | uart_complete(&orion_uart0, orion_uart0_data, orion_uart0_resources, | 127 | uart_complete(&orion_uart0, orion_uart0_data, orion_uart0_resources, |
96 | membase, mapbase, irq, uartclk); | 128 | membase, mapbase, irq, clk); |
97 | } | 129 | } |
98 | 130 | ||
99 | /***************************************************************************** | 131 | /***************************************************************************** |
@@ -118,10 +150,10 @@ static struct platform_device orion_uart1 = { | |||
118 | void __init orion_uart1_init(unsigned int membase, | 150 | void __init orion_uart1_init(unsigned int membase, |
119 | resource_size_t mapbase, | 151 | resource_size_t mapbase, |
120 | unsigned int irq, | 152 | unsigned int irq, |
121 | unsigned int uartclk) | 153 | struct clk *clk) |
122 | { | 154 | { |
123 | uart_complete(&orion_uart1, orion_uart1_data, orion_uart1_resources, | 155 | uart_complete(&orion_uart1, orion_uart1_data, orion_uart1_resources, |
124 | membase, mapbase, irq, uartclk); | 156 | membase, mapbase, irq, clk); |
125 | } | 157 | } |
126 | 158 | ||
127 | /***************************************************************************** | 159 | /***************************************************************************** |
@@ -146,10 +178,10 @@ static struct platform_device orion_uart2 = { | |||
146 | void __init orion_uart2_init(unsigned int membase, | 178 | void __init orion_uart2_init(unsigned int membase, |
147 | resource_size_t mapbase, | 179 | resource_size_t mapbase, |
148 | unsigned int irq, | 180 | unsigned int irq, |
149 | unsigned int uartclk) | 181 | struct clk *clk) |
150 | { | 182 | { |
151 | uart_complete(&orion_uart2, orion_uart2_data, orion_uart2_resources, | 183 | uart_complete(&orion_uart2, orion_uart2_data, orion_uart2_resources, |
152 | membase, mapbase, irq, uartclk); | 184 | membase, mapbase, irq, clk); |
153 | } | 185 | } |
154 | 186 | ||
155 | /***************************************************************************** | 187 | /***************************************************************************** |
@@ -174,10 +206,10 @@ static struct platform_device orion_uart3 = { | |||
174 | void __init orion_uart3_init(unsigned int membase, | 206 | void __init orion_uart3_init(unsigned int membase, |
175 | resource_size_t mapbase, | 207 | resource_size_t mapbase, |
176 | unsigned int irq, | 208 | unsigned int irq, |
177 | unsigned int uartclk) | 209 | struct clk *clk) |
178 | { | 210 | { |
179 | uart_complete(&orion_uart3, orion_uart3_data, orion_uart3_resources, | 211 | uart_complete(&orion_uart3, orion_uart3_data, orion_uart3_resources, |
180 | membase, mapbase, irq, uartclk); | 212 | membase, mapbase, irq, clk); |
181 | } | 213 | } |
182 | 214 | ||
183 | /***************************************************************************** | 215 | /***************************************************************************** |
@@ -203,13 +235,11 @@ void __init orion_rtc_init(unsigned long mapbase, | |||
203 | ****************************************************************************/ | 235 | ****************************************************************************/ |
204 | static __init void ge_complete( | 236 | static __init void ge_complete( |
205 | struct mv643xx_eth_shared_platform_data *orion_ge_shared_data, | 237 | struct mv643xx_eth_shared_platform_data *orion_ge_shared_data, |
206 | int tclk, | ||
207 | struct resource *orion_ge_resource, unsigned long irq, | 238 | struct resource *orion_ge_resource, unsigned long irq, |
208 | struct platform_device *orion_ge_shared, | 239 | struct platform_device *orion_ge_shared, |
209 | struct mv643xx_eth_platform_data *eth_data, | 240 | struct mv643xx_eth_platform_data *eth_data, |
210 | struct platform_device *orion_ge) | 241 | struct platform_device *orion_ge) |
211 | { | 242 | { |
212 | orion_ge_shared_data->t_clk = tclk; | ||
213 | orion_ge_resource->start = irq; | 243 | orion_ge_resource->start = irq; |
214 | orion_ge_resource->end = irq; | 244 | orion_ge_resource->end = irq; |
215 | eth_data->shared = orion_ge_shared; | 245 | eth_data->shared = orion_ge_shared; |
@@ -260,12 +290,11 @@ static struct platform_device orion_ge00 = { | |||
260 | void __init orion_ge00_init(struct mv643xx_eth_platform_data *eth_data, | 290 | void __init orion_ge00_init(struct mv643xx_eth_platform_data *eth_data, |
261 | unsigned long mapbase, | 291 | unsigned long mapbase, |
262 | unsigned long irq, | 292 | unsigned long irq, |
263 | unsigned long irq_err, | 293 | unsigned long irq_err) |
264 | int tclk) | ||
265 | { | 294 | { |
266 | fill_resources(&orion_ge00_shared, orion_ge00_shared_resources, | 295 | fill_resources(&orion_ge00_shared, orion_ge00_shared_resources, |
267 | mapbase + 0x2000, SZ_16K - 1, irq_err); | 296 | mapbase + 0x2000, SZ_16K - 1, irq_err); |
268 | ge_complete(&orion_ge00_shared_data, tclk, | 297 | ge_complete(&orion_ge00_shared_data, |
269 | orion_ge00_resources, irq, &orion_ge00_shared, | 298 | orion_ge00_resources, irq, &orion_ge00_shared, |
270 | eth_data, &orion_ge00); | 299 | eth_data, &orion_ge00); |
271 | } | 300 | } |
@@ -313,12 +342,11 @@ static struct platform_device orion_ge01 = { | |||
313 | void __init orion_ge01_init(struct mv643xx_eth_platform_data *eth_data, | 342 | void __init orion_ge01_init(struct mv643xx_eth_platform_data *eth_data, |
314 | unsigned long mapbase, | 343 | unsigned long mapbase, |
315 | unsigned long irq, | 344 | unsigned long irq, |
316 | unsigned long irq_err, | 345 | unsigned long irq_err) |
317 | int tclk) | ||
318 | { | 346 | { |
319 | fill_resources(&orion_ge01_shared, orion_ge01_shared_resources, | 347 | fill_resources(&orion_ge01_shared, orion_ge01_shared_resources, |
320 | mapbase + 0x2000, SZ_16K - 1, irq_err); | 348 | mapbase + 0x2000, SZ_16K - 1, irq_err); |
321 | ge_complete(&orion_ge01_shared_data, tclk, | 349 | ge_complete(&orion_ge01_shared_data, |
322 | orion_ge01_resources, irq, &orion_ge01_shared, | 350 | orion_ge01_resources, irq, &orion_ge01_shared, |
323 | eth_data, &orion_ge01); | 351 | eth_data, &orion_ge01); |
324 | } | 352 | } |
@@ -366,12 +394,11 @@ static struct platform_device orion_ge10 = { | |||
366 | void __init orion_ge10_init(struct mv643xx_eth_platform_data *eth_data, | 394 | void __init orion_ge10_init(struct mv643xx_eth_platform_data *eth_data, |
367 | unsigned long mapbase, | 395 | unsigned long mapbase, |
368 | unsigned long irq, | 396 | unsigned long irq, |
369 | unsigned long irq_err, | 397 | unsigned long irq_err) |
370 | int tclk) | ||
371 | { | 398 | { |
372 | fill_resources(&orion_ge10_shared, orion_ge10_shared_resources, | 399 | fill_resources(&orion_ge10_shared, orion_ge10_shared_resources, |
373 | mapbase + 0x2000, SZ_16K - 1, irq_err); | 400 | mapbase + 0x2000, SZ_16K - 1, irq_err); |
374 | ge_complete(&orion_ge10_shared_data, tclk, | 401 | ge_complete(&orion_ge10_shared_data, |
375 | orion_ge10_resources, irq, &orion_ge10_shared, | 402 | orion_ge10_resources, irq, &orion_ge10_shared, |
376 | eth_data, &orion_ge10); | 403 | eth_data, &orion_ge10); |
377 | } | 404 | } |
@@ -419,12 +446,11 @@ static struct platform_device orion_ge11 = { | |||
419 | void __init orion_ge11_init(struct mv643xx_eth_platform_data *eth_data, | 446 | void __init orion_ge11_init(struct mv643xx_eth_platform_data *eth_data, |
420 | unsigned long mapbase, | 447 | unsigned long mapbase, |
421 | unsigned long irq, | 448 | unsigned long irq, |
422 | unsigned long irq_err, | 449 | unsigned long irq_err) |
423 | int tclk) | ||
424 | { | 450 | { |
425 | fill_resources(&orion_ge11_shared, orion_ge11_shared_resources, | 451 | fill_resources(&orion_ge11_shared, orion_ge11_shared_resources, |
426 | mapbase + 0x2000, SZ_16K - 1, irq_err); | 452 | mapbase + 0x2000, SZ_16K - 1, irq_err); |
427 | ge_complete(&orion_ge11_shared_data, tclk, | 453 | ge_complete(&orion_ge11_shared_data, |
428 | orion_ge11_resources, irq, &orion_ge11_shared, | 454 | orion_ge11_resources, irq, &orion_ge11_shared, |
429 | eth_data, &orion_ge11); | 455 | eth_data, &orion_ge11); |
430 | } | 456 | } |
@@ -521,44 +547,32 @@ void __init orion_i2c_1_init(unsigned long mapbase, | |||
521 | /***************************************************************************** | 547 | /***************************************************************************** |
522 | * SPI | 548 | * SPI |
523 | ****************************************************************************/ | 549 | ****************************************************************************/ |
524 | static struct orion_spi_info orion_spi_plat_data; | ||
525 | static struct resource orion_spi_resources; | 550 | static struct resource orion_spi_resources; |
526 | 551 | ||
527 | static struct platform_device orion_spi = { | 552 | static struct platform_device orion_spi = { |
528 | .name = "orion_spi", | 553 | .name = "orion_spi", |
529 | .id = 0, | 554 | .id = 0, |
530 | .dev = { | ||
531 | .platform_data = &orion_spi_plat_data, | ||
532 | }, | ||
533 | }; | 555 | }; |
534 | 556 | ||
535 | static struct orion_spi_info orion_spi_1_plat_data; | ||
536 | static struct resource orion_spi_1_resources; | 557 | static struct resource orion_spi_1_resources; |
537 | 558 | ||
538 | static struct platform_device orion_spi_1 = { | 559 | static struct platform_device orion_spi_1 = { |
539 | .name = "orion_spi", | 560 | .name = "orion_spi", |
540 | .id = 1, | 561 | .id = 1, |
541 | .dev = { | ||
542 | .platform_data = &orion_spi_1_plat_data, | ||
543 | }, | ||
544 | }; | 562 | }; |
545 | 563 | ||
546 | /* Note: The SPI silicon core does have interrupts. However the | 564 | /* Note: The SPI silicon core does have interrupts. However the |
547 | * current Linux software driver does not use interrupts. */ | 565 | * current Linux software driver does not use interrupts. */ |
548 | 566 | ||
549 | void __init orion_spi_init(unsigned long mapbase, | 567 | void __init orion_spi_init(unsigned long mapbase) |
550 | unsigned long tclk) | ||
551 | { | 568 | { |
552 | orion_spi_plat_data.tclk = tclk; | ||
553 | fill_resources(&orion_spi, &orion_spi_resources, | 569 | fill_resources(&orion_spi, &orion_spi_resources, |
554 | mapbase, SZ_512 - 1, NO_IRQ); | 570 | mapbase, SZ_512 - 1, NO_IRQ); |
555 | platform_device_register(&orion_spi); | 571 | platform_device_register(&orion_spi); |
556 | } | 572 | } |
557 | 573 | ||
558 | void __init orion_spi_1_init(unsigned long mapbase, | 574 | void __init orion_spi_1_init(unsigned long mapbase) |
559 | unsigned long tclk) | ||
560 | { | 575 | { |
561 | orion_spi_1_plat_data.tclk = tclk; | ||
562 | fill_resources(&orion_spi_1, &orion_spi_1_resources, | 576 | fill_resources(&orion_spi_1, &orion_spi_1_resources, |
563 | mapbase, SZ_512 - 1, NO_IRQ); | 577 | mapbase, SZ_512 - 1, NO_IRQ); |
564 | platform_device_register(&orion_spi_1); | 578 | platform_device_register(&orion_spi_1); |
@@ -567,24 +581,18 @@ void __init orion_spi_1_init(unsigned long mapbase, | |||
567 | /***************************************************************************** | 581 | /***************************************************************************** |
568 | * Watchdog | 582 | * Watchdog |
569 | ****************************************************************************/ | 583 | ****************************************************************************/ |
570 | static struct orion_wdt_platform_data orion_wdt_data; | ||
571 | |||
572 | static struct resource orion_wdt_resource = | 584 | static struct resource orion_wdt_resource = |
573 | DEFINE_RES_MEM(TIMER_VIRT_BASE, 0x28); | 585 | DEFINE_RES_MEM(TIMER_VIRT_BASE, 0x28); |
574 | 586 | ||
575 | static struct platform_device orion_wdt_device = { | 587 | static struct platform_device orion_wdt_device = { |
576 | .name = "orion_wdt", | 588 | .name = "orion_wdt", |
577 | .id = -1, | 589 | .id = -1, |
578 | .dev = { | ||
579 | .platform_data = &orion_wdt_data, | ||
580 | }, | ||
581 | .resource = &orion_wdt_resource, | ||
582 | .num_resources = 1, | 590 | .num_resources = 1, |
591 | .resource = &orion_wdt_resource, | ||
583 | }; | 592 | }; |
584 | 593 | ||
585 | void __init orion_wdt_init(unsigned long tclk) | 594 | void __init orion_wdt_init(void) |
586 | { | 595 | { |
587 | orion_wdt_data.tclk = tclk; | ||
588 | platform_device_register(&orion_wdt_device); | 596 | platform_device_register(&orion_wdt_device); |
589 | } | 597 | } |
590 | 598 | ||
diff --git a/arch/arm/plat-orion/include/plat/common.h b/arch/arm/plat-orion/include/plat/common.h index a7fa005a5a0e..e00fdb213609 100644 --- a/arch/arm/plat-orion/include/plat/common.h +++ b/arch/arm/plat-orion/include/plat/common.h | |||
@@ -16,22 +16,22 @@ struct dsa_platform_data; | |||
16 | void __init orion_uart0_init(unsigned int membase, | 16 | void __init orion_uart0_init(unsigned int membase, |
17 | resource_size_t mapbase, | 17 | resource_size_t mapbase, |
18 | unsigned int irq, | 18 | unsigned int irq, |
19 | unsigned int uartclk); | 19 | struct clk *clk); |
20 | 20 | ||
21 | void __init orion_uart1_init(unsigned int membase, | 21 | void __init orion_uart1_init(unsigned int membase, |
22 | resource_size_t mapbase, | 22 | resource_size_t mapbase, |
23 | unsigned int irq, | 23 | unsigned int irq, |
24 | unsigned int uartclk); | 24 | struct clk *clk); |
25 | 25 | ||
26 | void __init orion_uart2_init(unsigned int membase, | 26 | void __init orion_uart2_init(unsigned int membase, |
27 | resource_size_t mapbase, | 27 | resource_size_t mapbase, |
28 | unsigned int irq, | 28 | unsigned int irq, |
29 | unsigned int uartclk); | 29 | struct clk *clk); |
30 | 30 | ||
31 | void __init orion_uart3_init(unsigned int membase, | 31 | void __init orion_uart3_init(unsigned int membase, |
32 | resource_size_t mapbase, | 32 | resource_size_t mapbase, |
33 | unsigned int irq, | 33 | unsigned int irq, |
34 | unsigned int uartclk); | 34 | struct clk *clk); |
35 | 35 | ||
36 | void __init orion_rtc_init(unsigned long mapbase, | 36 | void __init orion_rtc_init(unsigned long mapbase, |
37 | unsigned long irq); | 37 | unsigned long irq); |
@@ -39,29 +39,26 @@ void __init orion_rtc_init(unsigned long mapbase, | |||
39 | void __init orion_ge00_init(struct mv643xx_eth_platform_data *eth_data, | 39 | void __init orion_ge00_init(struct mv643xx_eth_platform_data *eth_data, |
40 | unsigned long mapbase, | 40 | unsigned long mapbase, |
41 | unsigned long irq, | 41 | unsigned long irq, |
42 | unsigned long irq_err, | 42 | unsigned long irq_err); |
43 | int tclk); | ||
44 | 43 | ||
45 | void __init orion_ge01_init(struct mv643xx_eth_platform_data *eth_data, | 44 | void __init orion_ge01_init(struct mv643xx_eth_platform_data *eth_data, |
46 | unsigned long mapbase, | 45 | unsigned long mapbase, |
47 | unsigned long irq, | 46 | unsigned long irq, |
48 | unsigned long irq_err, | 47 | unsigned long irq_err); |
49 | int tclk); | ||
50 | 48 | ||
51 | void __init orion_ge10_init(struct mv643xx_eth_platform_data *eth_data, | 49 | void __init orion_ge10_init(struct mv643xx_eth_platform_data *eth_data, |
52 | unsigned long mapbase, | 50 | unsigned long mapbase, |
53 | unsigned long irq, | 51 | unsigned long irq, |
54 | unsigned long irq_err, | 52 | unsigned long irq_err); |
55 | int tclk); | ||
56 | 53 | ||
57 | void __init orion_ge11_init(struct mv643xx_eth_platform_data *eth_data, | 54 | void __init orion_ge11_init(struct mv643xx_eth_platform_data *eth_data, |
58 | unsigned long mapbase, | 55 | unsigned long mapbase, |
59 | unsigned long irq, | 56 | unsigned long irq, |
60 | unsigned long irq_err, | 57 | unsigned long irq_err); |
61 | int tclk); | ||
62 | 58 | ||
63 | void __init orion_ge00_switch_init(struct dsa_platform_data *d, | 59 | void __init orion_ge00_switch_init(struct dsa_platform_data *d, |
64 | int irq); | 60 | int irq); |
61 | |||
65 | void __init orion_i2c_init(unsigned long mapbase, | 62 | void __init orion_i2c_init(unsigned long mapbase, |
66 | unsigned long irq, | 63 | unsigned long irq, |
67 | unsigned long freq_m); | 64 | unsigned long freq_m); |
@@ -70,13 +67,11 @@ void __init orion_i2c_1_init(unsigned long mapbase, | |||
70 | unsigned long irq, | 67 | unsigned long irq, |
71 | unsigned long freq_m); | 68 | unsigned long freq_m); |
72 | 69 | ||
73 | void __init orion_spi_init(unsigned long mapbase, | 70 | void __init orion_spi_init(unsigned long mapbase); |
74 | unsigned long tclk); | ||
75 | 71 | ||
76 | void __init orion_spi_1_init(unsigned long mapbase, | 72 | void __init orion_spi_1_init(unsigned long mapbase); |
77 | unsigned long tclk); | ||
78 | 73 | ||
79 | void __init orion_wdt_init(unsigned long tclk); | 74 | void __init orion_wdt_init(void); |
80 | 75 | ||
81 | void __init orion_xor0_init(unsigned long mapbase_low, | 76 | void __init orion_xor0_init(unsigned long mapbase_low, |
82 | unsigned long mapbase_high, | 77 | unsigned long mapbase_high, |
@@ -106,4 +101,9 @@ void __init orion_crypto_init(unsigned long mapbase, | |||
106 | unsigned long srambase, | 101 | unsigned long srambase, |
107 | unsigned long sram_size, | 102 | unsigned long sram_size, |
108 | unsigned long irq); | 103 | unsigned long irq); |
104 | |||
105 | void __init orion_clkdev_add(const char *con_id, const char *dev_id, | ||
106 | struct clk *clk); | ||
107 | |||
108 | void __init orion_clkdev_init(struct clk *tclk); | ||
109 | #endif | 109 | #endif |
diff --git a/arch/arm/plat-orion/include/plat/orion_wdt.h b/arch/arm/plat-orion/include/plat/orion_wdt.h deleted file mode 100644 index 665c362a2fba..000000000000 --- a/arch/arm/plat-orion/include/plat/orion_wdt.h +++ /dev/null | |||
@@ -1,18 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/plat-orion/include/plat/orion_wdt.h | ||
3 | * | ||
4 | * This file is licensed under the terms of the GNU General Public | ||
5 | * License version 2. This program is licensed "as is" without any | ||
6 | * warranty of any kind, whether express or implied. | ||
7 | */ | ||
8 | |||
9 | #ifndef __PLAT_ORION_WDT_H | ||
10 | #define __PLAT_ORION_WDT_H | ||
11 | |||
12 | struct orion_wdt_platform_data { | ||
13 | u32 tclk; /* no <linux/clk.h> support yet */ | ||
14 | }; | ||
15 | |||
16 | |||
17 | #endif | ||
18 | |||
diff --git a/arch/arm/plat-orion/pcie.c b/arch/arm/plat-orion/pcie.c index 86dbb5bdb172..f20a321088a2 100644 --- a/arch/arm/plat-orion/pcie.c +++ b/arch/arm/plat-orion/pcie.c | |||
@@ -52,12 +52,12 @@ | |||
52 | #define PCIE_DEBUG_SOFT_RESET (1<<20) | 52 | #define PCIE_DEBUG_SOFT_RESET (1<<20) |
53 | 53 | ||
54 | 54 | ||
55 | u32 __init orion_pcie_dev_id(void __iomem *base) | 55 | u32 orion_pcie_dev_id(void __iomem *base) |
56 | { | 56 | { |
57 | return readl(base + PCIE_DEV_ID_OFF) >> 16; | 57 | return readl(base + PCIE_DEV_ID_OFF) >> 16; |
58 | } | 58 | } |
59 | 59 | ||
60 | u32 __init orion_pcie_rev(void __iomem *base) | 60 | u32 orion_pcie_rev(void __iomem *base) |
61 | { | 61 | { |
62 | return readl(base + PCIE_DEV_REV_OFF) & 0xff; | 62 | return readl(base + PCIE_DEV_REV_OFF) & 0xff; |
63 | } | 63 | } |
diff --git a/arch/arm/plat-pxa/include/plat/pxa27x_keypad.h b/arch/arm/plat-pxa/include/plat/pxa27x_keypad.h index abcc36eb1242..5ce8d5e6ea51 100644 --- a/arch/arm/plat-pxa/include/plat/pxa27x_keypad.h +++ b/arch/arm/plat-pxa/include/plat/pxa27x_keypad.h | |||
@@ -44,6 +44,10 @@ struct pxa27x_keypad_platform_data { | |||
44 | /* direct keys */ | 44 | /* direct keys */ |
45 | int direct_key_num; | 45 | int direct_key_num; |
46 | unsigned int direct_key_map[MAX_DIRECT_KEY_NUM]; | 46 | unsigned int direct_key_map[MAX_DIRECT_KEY_NUM]; |
47 | /* the key output may be low active */ | ||
48 | int direct_key_low_active; | ||
49 | /* give board a chance to choose the start direct key */ | ||
50 | unsigned int direct_key_mask; | ||
47 | 51 | ||
48 | /* rotary encoders 0 */ | 52 | /* rotary encoders 0 */ |
49 | int enable_rotary0; | 53 | int enable_rotary0; |
diff --git a/arch/arm/plat-s3c24xx/Makefile b/arch/arm/plat-s3c24xx/Makefile index 2467b800cc76..9f60549c8da1 100644 --- a/arch/arm/plat-s3c24xx/Makefile +++ b/arch/arm/plat-s3c24xx/Makefile | |||
@@ -12,10 +12,7 @@ obj- := | |||
12 | 12 | ||
13 | # Core files | 13 | # Core files |
14 | 14 | ||
15 | obj-y += cpu.o | ||
16 | obj-y += irq.o | 15 | obj-y += irq.o |
17 | obj-y += dev-uart.o | ||
18 | obj-y += clock.o | ||
19 | obj-$(CONFIG_S3C24XX_DCLK) += clock-dclk.o | 16 | obj-$(CONFIG_S3C24XX_DCLK) += clock-dclk.o |
20 | 17 | ||
21 | obj-$(CONFIG_CPU_FREQ_S3C24XX) += cpu-freq.o | 18 | obj-$(CONFIG_CPU_FREQ_S3C24XX) += cpu-freq.o |
@@ -23,9 +20,6 @@ obj-$(CONFIG_CPU_FREQ_S3C24XX_DEBUGFS) += cpu-freq-debugfs.o | |||
23 | 20 | ||
24 | # Architecture dependent builds | 21 | # Architecture dependent builds |
25 | 22 | ||
26 | obj-$(CONFIG_PM) += pm.o | ||
27 | obj-$(CONFIG_PM) += irq-pm.o | ||
28 | obj-$(CONFIG_PM) += sleep.o | ||
29 | obj-$(CONFIG_S3C2410_CLOCK) += s3c2410-clock.o | 23 | obj-$(CONFIG_S3C2410_CLOCK) += s3c2410-clock.o |
30 | obj-$(CONFIG_S3C24XX_DMA) += dma.o | 24 | obj-$(CONFIG_S3C24XX_DMA) += dma.o |
31 | obj-$(CONFIG_S3C2410_IOTIMING) += s3c2410-iotiming.o | 25 | obj-$(CONFIG_S3C2410_IOTIMING) += s3c2410-iotiming.o |
diff --git a/arch/arm/plat-s3c24xx/clock.c b/arch/arm/plat-s3c24xx/clock.c deleted file mode 100644 index 931d26d1a54b..000000000000 --- a/arch/arm/plat-s3c24xx/clock.c +++ /dev/null | |||
@@ -1,59 +0,0 @@ | |||
1 | /* linux/arch/arm/plat-s3c24xx/clock.c | ||
2 | * | ||
3 | * Copyright (c) 2004-2005 Simtec Electronics | ||
4 | * Ben Dooks <ben@simtec.co.uk> | ||
5 | * | ||
6 | * S3C24XX Core clock control support | ||
7 | * | ||
8 | * Based on, and code from linux/arch/arm/mach-versatile/clock.c | ||
9 | ** | ||
10 | ** Copyright (C) 2004 ARM Limited. | ||
11 | ** Written by Deep Blue Solutions Limited. | ||
12 | * | ||
13 | * | ||
14 | * This program is free software; you can redistribute it and/or modify | ||
15 | * it under the terms of the GNU General Public License as published by | ||
16 | * the Free Software Foundation; either version 2 of the License, or | ||
17 | * (at your option) any later version. | ||
18 | * | ||
19 | * This program is distributed in the hope that it will be useful, | ||
20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
22 | * GNU General Public License for more details. | ||
23 | * | ||
24 | * You should have received a copy of the GNU General Public License | ||
25 | * along with this program; if not, write to the Free Software | ||
26 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
27 | */ | ||
28 | |||
29 | #include <linux/init.h> | ||
30 | #include <linux/kernel.h> | ||
31 | #include <linux/clk.h> | ||
32 | #include <linux/io.h> | ||
33 | |||
34 | #include <mach/hardware.h> | ||
35 | #include <asm/irq.h> | ||
36 | |||
37 | #include <mach/regs-clock.h> | ||
38 | #include <mach/regs-gpio.h> | ||
39 | |||
40 | #include <plat/cpu-freq.h> | ||
41 | |||
42 | #include <plat/clock.h> | ||
43 | #include <plat/cpu.h> | ||
44 | #include <plat/pll.h> | ||
45 | |||
46 | /* initialise all the clocks */ | ||
47 | |||
48 | void __init_or_cpufreq s3c24xx_setup_clocks(unsigned long fclk, | ||
49 | unsigned long hclk, | ||
50 | unsigned long pclk) | ||
51 | { | ||
52 | clk_upll.rate = s3c24xx_get_pll(__raw_readl(S3C2410_UPLLCON), | ||
53 | clk_xtal.rate); | ||
54 | |||
55 | clk_mpll.rate = fclk; | ||
56 | clk_h.rate = hclk; | ||
57 | clk_p.rate = pclk; | ||
58 | clk_f.rate = fclk; | ||
59 | } | ||
diff --git a/arch/arm/plat-s3c24xx/dev-uart.c b/arch/arm/plat-s3c24xx/dev-uart.c deleted file mode 100644 index 9ab22e662fff..000000000000 --- a/arch/arm/plat-s3c24xx/dev-uart.c +++ /dev/null | |||
@@ -1,100 +0,0 @@ | |||
1 | /* linux/arch/arm/plat-s3c24xx/dev-uart.c | ||
2 | * | ||
3 | * Copyright (c) 2004 Simtec Electronics | ||
4 | * Ben Dooks <ben@simtec.co.uk> | ||
5 | * | ||
6 | * Base S3C24XX UART resource and platform device definitions | ||
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 | |||
13 | #include <linux/kernel.h> | ||
14 | #include <linux/types.h> | ||
15 | #include <linux/interrupt.h> | ||
16 | #include <linux/list.h> | ||
17 | #include <linux/serial_core.h> | ||
18 | #include <linux/platform_device.h> | ||
19 | |||
20 | #include <asm/mach/arch.h> | ||
21 | #include <asm/mach/map.h> | ||
22 | #include <asm/mach/irq.h> | ||
23 | #include <mach/hardware.h> | ||
24 | #include <mach/map.h> | ||
25 | |||
26 | #include <plat/devs.h> | ||
27 | #include <plat/regs-serial.h> | ||
28 | |||
29 | /* Serial port registrations */ | ||
30 | |||
31 | static struct resource s3c2410_uart0_resource[] = { | ||
32 | [0] = { | ||
33 | .start = S3C2410_PA_UART0, | ||
34 | .end = S3C2410_PA_UART0 + 0x3fff, | ||
35 | .flags = IORESOURCE_MEM, | ||
36 | }, | ||
37 | [1] = { | ||
38 | .start = IRQ_S3CUART_RX0, | ||
39 | .end = IRQ_S3CUART_ERR0, | ||
40 | .flags = IORESOURCE_IRQ, | ||
41 | } | ||
42 | }; | ||
43 | |||
44 | static struct resource s3c2410_uart1_resource[] = { | ||
45 | [0] = { | ||
46 | .start = S3C2410_PA_UART1, | ||
47 | .end = S3C2410_PA_UART1 + 0x3fff, | ||
48 | .flags = IORESOURCE_MEM, | ||
49 | }, | ||
50 | [1] = { | ||
51 | .start = IRQ_S3CUART_RX1, | ||
52 | .end = IRQ_S3CUART_ERR1, | ||
53 | .flags = IORESOURCE_IRQ, | ||
54 | } | ||
55 | }; | ||
56 | |||
57 | static struct resource s3c2410_uart2_resource[] = { | ||
58 | [0] = { | ||
59 | .start = S3C2410_PA_UART2, | ||
60 | .end = S3C2410_PA_UART2 + 0x3fff, | ||
61 | .flags = IORESOURCE_MEM, | ||
62 | }, | ||
63 | [1] = { | ||
64 | .start = IRQ_S3CUART_RX2, | ||
65 | .end = IRQ_S3CUART_ERR2, | ||
66 | .flags = IORESOURCE_IRQ, | ||
67 | } | ||
68 | }; | ||
69 | |||
70 | static struct resource s3c2410_uart3_resource[] = { | ||
71 | [0] = { | ||
72 | .start = S3C2443_PA_UART3, | ||
73 | .end = S3C2443_PA_UART3 + 0x3fff, | ||
74 | .flags = IORESOURCE_MEM, | ||
75 | }, | ||
76 | [1] = { | ||
77 | .start = IRQ_S3CUART_RX3, | ||
78 | .end = IRQ_S3CUART_ERR3, | ||
79 | .flags = IORESOURCE_IRQ, | ||
80 | }, | ||
81 | }; | ||
82 | |||
83 | struct s3c24xx_uart_resources s3c2410_uart_resources[] __initdata = { | ||
84 | [0] = { | ||
85 | .resources = s3c2410_uart0_resource, | ||
86 | .nr_resources = ARRAY_SIZE(s3c2410_uart0_resource), | ||
87 | }, | ||
88 | [1] = { | ||
89 | .resources = s3c2410_uart1_resource, | ||
90 | .nr_resources = ARRAY_SIZE(s3c2410_uart1_resource), | ||
91 | }, | ||
92 | [2] = { | ||
93 | .resources = s3c2410_uart2_resource, | ||
94 | .nr_resources = ARRAY_SIZE(s3c2410_uart2_resource), | ||
95 | }, | ||
96 | [3] = { | ||
97 | .resources = s3c2410_uart3_resource, | ||
98 | .nr_resources = ARRAY_SIZE(s3c2410_uart3_resource), | ||
99 | }, | ||
100 | }; | ||
diff --git a/arch/arm/plat-s5p/Kconfig b/arch/arm/plat-s5p/Kconfig deleted file mode 100644 index 96bea3202304..000000000000 --- a/arch/arm/plat-s5p/Kconfig +++ /dev/null | |||
@@ -1,140 +0,0 @@ | |||
1 | # arch/arm/plat-s5p/Kconfig | ||
2 | # | ||
3 | # Copyright (c) 2009 Samsung Electronics Co., Ltd. | ||
4 | # http://www.samsung.com/ | ||
5 | # | ||
6 | # Licensed under GPLv2 | ||
7 | |||
8 | config PLAT_S5P | ||
9 | bool | ||
10 | depends on (ARCH_S5P64X0 || ARCH_S5PC100 || ARCH_S5PV210 || ARCH_EXYNOS) | ||
11 | default y | ||
12 | select ARM_VIC if !ARCH_EXYNOS | ||
13 | select ARM_GIC if ARCH_EXYNOS | ||
14 | select GIC_NON_BANKED if ARCH_EXYNOS4 | ||
15 | select NO_IOPORT | ||
16 | select ARCH_REQUIRE_GPIOLIB | ||
17 | select S3C_GPIO_TRACK | ||
18 | select S5P_GPIO_DRVSTR | ||
19 | select SAMSUNG_GPIOLIB_4BIT | ||
20 | select PLAT_SAMSUNG | ||
21 | select SAMSUNG_CLKSRC | ||
22 | select SAMSUNG_IRQ_VIC_TIMER | ||
23 | help | ||
24 | Base platform code for Samsung's S5P series SoC. | ||
25 | |||
26 | config S5P_EXT_INT | ||
27 | bool | ||
28 | help | ||
29 | Use the external interrupts (other than GPIO interrupts.) | ||
30 | Note: Do not choose this for S5P6440 and S5P6450. | ||
31 | |||
32 | config S5P_GPIO_INT | ||
33 | bool | ||
34 | help | ||
35 | Common code for the GPIO interrupts (other than external interrupts.) | ||
36 | |||
37 | config S5P_HRT | ||
38 | bool | ||
39 | select SAMSUNG_DEV_PWM | ||
40 | help | ||
41 | Use the High Resolution timer support | ||
42 | |||
43 | config S5P_DEV_UART | ||
44 | def_bool y | ||
45 | depends on (ARCH_S5P64X0 || ARCH_S5PC100 || ARCH_S5PV210) | ||
46 | |||
47 | config S5P_PM | ||
48 | bool | ||
49 | help | ||
50 | Common code for power management support on S5P and newer SoCs | ||
51 | Note: Do not select this for S5P6440 and S5P6450. | ||
52 | |||
53 | comment "System MMU" | ||
54 | |||
55 | config S5P_SYSTEM_MMU | ||
56 | bool "S5P SYSTEM MMU" | ||
57 | depends on ARCH_EXYNOS4 | ||
58 | help | ||
59 | Say Y here if you want to enable System MMU | ||
60 | |||
61 | config S5P_SLEEP | ||
62 | bool | ||
63 | help | ||
64 | Internal config node to apply common S5P sleep management code. | ||
65 | Can be selected by S5P and newer SoCs with similar sleep procedure. | ||
66 | |||
67 | config S5P_DEV_FIMC0 | ||
68 | bool | ||
69 | help | ||
70 | Compile in platform device definitions for FIMC controller 0 | ||
71 | |||
72 | config S5P_DEV_FIMC1 | ||
73 | bool | ||
74 | help | ||
75 | Compile in platform device definitions for FIMC controller 1 | ||
76 | |||
77 | config S5P_DEV_FIMC2 | ||
78 | bool | ||
79 | help | ||
80 | Compile in platform device definitions for FIMC controller 2 | ||
81 | |||
82 | config S5P_DEV_FIMC3 | ||
83 | bool | ||
84 | help | ||
85 | Compile in platform device definitions for FIMC controller 3 | ||
86 | |||
87 | config S5P_DEV_JPEG | ||
88 | bool | ||
89 | help | ||
90 | Compile in platform device definitions for JPEG codec | ||
91 | |||
92 | config S5P_DEV_G2D | ||
93 | bool | ||
94 | help | ||
95 | Compile in platform device definitions for G2D device | ||
96 | |||
97 | config S5P_DEV_FIMD0 | ||
98 | bool | ||
99 | help | ||
100 | Compile in platform device definitions for FIMD controller 0 | ||
101 | |||
102 | config S5P_DEV_I2C_HDMIPHY | ||
103 | bool | ||
104 | help | ||
105 | Compile in platform device definitions for I2C HDMIPHY controller | ||
106 | |||
107 | config S5P_DEV_MFC | ||
108 | bool | ||
109 | help | ||
110 | Compile in platform device definitions for MFC | ||
111 | |||
112 | config S5P_DEV_ONENAND | ||
113 | bool | ||
114 | help | ||
115 | Compile in platform device definition for OneNAND controller | ||
116 | |||
117 | config S5P_DEV_CSIS0 | ||
118 | bool | ||
119 | help | ||
120 | Compile in platform device definitions for MIPI-CSIS channel 0 | ||
121 | |||
122 | config S5P_DEV_CSIS1 | ||
123 | bool | ||
124 | help | ||
125 | Compile in platform device definitions for MIPI-CSIS channel 1 | ||
126 | |||
127 | config S5P_DEV_TV | ||
128 | bool | ||
129 | help | ||
130 | Compile in platform device definition for TV interface | ||
131 | |||
132 | config S5P_DEV_USB_EHCI | ||
133 | bool | ||
134 | help | ||
135 | Compile in platform device definition for USB EHCI | ||
136 | |||
137 | config S5P_SETUP_MIPIPHY | ||
138 | bool | ||
139 | help | ||
140 | Compile in common setup code for MIPI-CSIS and MIPI-DSIM devices | ||
diff --git a/arch/arm/plat-s5p/Makefile b/arch/arm/plat-s5p/Makefile deleted file mode 100644 index 4bd824136659..000000000000 --- a/arch/arm/plat-s5p/Makefile +++ /dev/null | |||
@@ -1,28 +0,0 @@ | |||
1 | # arch/arm/plat-s5p/Makefile | ||
2 | # | ||
3 | # Copyright (c) 2009 Samsung Electronics Co., Ltd. | ||
4 | # http://www.samsung.com/ | ||
5 | # | ||
6 | # Licensed under GPLv2 | ||
7 | |||
8 | obj-y := | ||
9 | obj-m := | ||
10 | obj-n := dummy.o | ||
11 | obj- := | ||
12 | |||
13 | # Core files | ||
14 | |||
15 | obj-y += clock.o | ||
16 | obj-y += irq.o | ||
17 | obj-$(CONFIG_S5P_EXT_INT) += irq-eint.o | ||
18 | obj-$(CONFIG_S5P_GPIO_INT) += irq-gpioint.o | ||
19 | obj-$(CONFIG_S5P_SYSTEM_MMU) += sysmmu.o | ||
20 | obj-$(CONFIG_S5P_PM) += pm.o irq-pm.o | ||
21 | obj-$(CONFIG_S5P_SLEEP) += sleep.o | ||
22 | obj-$(CONFIG_S5P_HRT) += s5p-time.o | ||
23 | |||
24 | # devices | ||
25 | |||
26 | obj-$(CONFIG_S5P_DEV_UART) += dev-uart.o | ||
27 | obj-$(CONFIG_S5P_DEV_MFC) += dev-mfc.o | ||
28 | obj-$(CONFIG_S5P_SETUP_MIPIPHY) += setup-mipiphy.o | ||
diff --git a/arch/arm/plat-s5p/sysmmu.c b/arch/arm/plat-s5p/sysmmu.c deleted file mode 100644 index c8bec9c7655d..000000000000 --- a/arch/arm/plat-s5p/sysmmu.c +++ /dev/null | |||
@@ -1,313 +0,0 @@ | |||
1 | /* linux/arch/arm/plat-s5p/sysmmu.c | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #include <linux/io.h> | ||
12 | #include <linux/interrupt.h> | ||
13 | #include <linux/platform_device.h> | ||
14 | #include <linux/export.h> | ||
15 | |||
16 | #include <asm/pgtable.h> | ||
17 | |||
18 | #include <mach/map.h> | ||
19 | #include <mach/regs-sysmmu.h> | ||
20 | #include <plat/sysmmu.h> | ||
21 | |||
22 | #define CTRL_ENABLE 0x5 | ||
23 | #define CTRL_BLOCK 0x7 | ||
24 | #define CTRL_DISABLE 0x0 | ||
25 | |||
26 | static struct device *dev; | ||
27 | |||
28 | static unsigned short fault_reg_offset[SYSMMU_FAULTS_NUM] = { | ||
29 | S5P_PAGE_FAULT_ADDR, | ||
30 | S5P_AR_FAULT_ADDR, | ||
31 | S5P_AW_FAULT_ADDR, | ||
32 | S5P_DEFAULT_SLAVE_ADDR, | ||
33 | S5P_AR_FAULT_ADDR, | ||
34 | S5P_AR_FAULT_ADDR, | ||
35 | S5P_AW_FAULT_ADDR, | ||
36 | S5P_AW_FAULT_ADDR | ||
37 | }; | ||
38 | |||
39 | static char *sysmmu_fault_name[SYSMMU_FAULTS_NUM] = { | ||
40 | "PAGE FAULT", | ||
41 | "AR MULTI-HIT FAULT", | ||
42 | "AW MULTI-HIT FAULT", | ||
43 | "BUS ERROR", | ||
44 | "AR SECURITY PROTECTION FAULT", | ||
45 | "AR ACCESS PROTECTION FAULT", | ||
46 | "AW SECURITY PROTECTION FAULT", | ||
47 | "AW ACCESS PROTECTION FAULT" | ||
48 | }; | ||
49 | |||
50 | static int (*fault_handlers[S5P_SYSMMU_TOTAL_IPNUM])( | ||
51 | enum S5P_SYSMMU_INTERRUPT_TYPE itype, | ||
52 | unsigned long pgtable_base, | ||
53 | unsigned long fault_addr); | ||
54 | |||
55 | /* | ||
56 | * If adjacent 2 bits are true, the system MMU is enabled. | ||
57 | * The system MMU is disabled, otherwise. | ||
58 | */ | ||
59 | static unsigned long sysmmu_states; | ||
60 | |||
61 | static inline void set_sysmmu_active(sysmmu_ips ips) | ||
62 | { | ||
63 | sysmmu_states |= 3 << (ips * 2); | ||
64 | } | ||
65 | |||
66 | static inline void set_sysmmu_inactive(sysmmu_ips ips) | ||
67 | { | ||
68 | sysmmu_states &= ~(3 << (ips * 2)); | ||
69 | } | ||
70 | |||
71 | static inline int is_sysmmu_active(sysmmu_ips ips) | ||
72 | { | ||
73 | return sysmmu_states & (3 << (ips * 2)); | ||
74 | } | ||
75 | |||
76 | static void __iomem *sysmmusfrs[S5P_SYSMMU_TOTAL_IPNUM]; | ||
77 | |||
78 | static inline void sysmmu_block(sysmmu_ips ips) | ||
79 | { | ||
80 | __raw_writel(CTRL_BLOCK, sysmmusfrs[ips] + S5P_MMU_CTRL); | ||
81 | dev_dbg(dev, "%s is blocked.\n", sysmmu_ips_name[ips]); | ||
82 | } | ||
83 | |||
84 | static inline void sysmmu_unblock(sysmmu_ips ips) | ||
85 | { | ||
86 | __raw_writel(CTRL_ENABLE, sysmmusfrs[ips] + S5P_MMU_CTRL); | ||
87 | dev_dbg(dev, "%s is unblocked.\n", sysmmu_ips_name[ips]); | ||
88 | } | ||
89 | |||
90 | static inline void __sysmmu_tlb_invalidate(sysmmu_ips ips) | ||
91 | { | ||
92 | __raw_writel(0x1, sysmmusfrs[ips] + S5P_MMU_FLUSH); | ||
93 | dev_dbg(dev, "TLB of %s is invalidated.\n", sysmmu_ips_name[ips]); | ||
94 | } | ||
95 | |||
96 | static inline void __sysmmu_set_ptbase(sysmmu_ips ips, unsigned long pgd) | ||
97 | { | ||
98 | if (unlikely(pgd == 0)) { | ||
99 | pgd = (unsigned long)ZERO_PAGE(0); | ||
100 | __raw_writel(0x20, sysmmusfrs[ips] + S5P_MMU_CFG); /* 4KB LV1 */ | ||
101 | } else { | ||
102 | __raw_writel(0x0, sysmmusfrs[ips] + S5P_MMU_CFG); /* 16KB LV1 */ | ||
103 | } | ||
104 | |||
105 | __raw_writel(pgd, sysmmusfrs[ips] + S5P_PT_BASE_ADDR); | ||
106 | |||
107 | dev_dbg(dev, "Page table base of %s is initialized with 0x%08lX.\n", | ||
108 | sysmmu_ips_name[ips], pgd); | ||
109 | __sysmmu_tlb_invalidate(ips); | ||
110 | } | ||
111 | |||
112 | void sysmmu_set_fault_handler(sysmmu_ips ips, | ||
113 | int (*handler)(enum S5P_SYSMMU_INTERRUPT_TYPE itype, | ||
114 | unsigned long pgtable_base, | ||
115 | unsigned long fault_addr)) | ||
116 | { | ||
117 | BUG_ON(!((ips >= SYSMMU_MDMA) && (ips < S5P_SYSMMU_TOTAL_IPNUM))); | ||
118 | fault_handlers[ips] = handler; | ||
119 | } | ||
120 | |||
121 | static irqreturn_t s5p_sysmmu_irq(int irq, void *dev_id) | ||
122 | { | ||
123 | /* SYSMMU is in blocked when interrupt occurred. */ | ||
124 | unsigned long base = 0; | ||
125 | sysmmu_ips ips = (sysmmu_ips)dev_id; | ||
126 | enum S5P_SYSMMU_INTERRUPT_TYPE itype; | ||
127 | |||
128 | itype = (enum S5P_SYSMMU_INTERRUPT_TYPE) | ||
129 | __ffs(__raw_readl(sysmmusfrs[ips] + S5P_INT_STATUS)); | ||
130 | |||
131 | BUG_ON(!((itype >= 0) && (itype < 8))); | ||
132 | |||
133 | dev_alert(dev, "%s occurred by %s.\n", sysmmu_fault_name[itype], | ||
134 | sysmmu_ips_name[ips]); | ||
135 | |||
136 | if (fault_handlers[ips]) { | ||
137 | unsigned long addr; | ||
138 | |||
139 | base = __raw_readl(sysmmusfrs[ips] + S5P_PT_BASE_ADDR); | ||
140 | addr = __raw_readl(sysmmusfrs[ips] + fault_reg_offset[itype]); | ||
141 | |||
142 | if (fault_handlers[ips](itype, base, addr)) { | ||
143 | __raw_writel(1 << itype, | ||
144 | sysmmusfrs[ips] + S5P_INT_CLEAR); | ||
145 | dev_notice(dev, "%s from %s is resolved." | ||
146 | " Retrying translation.\n", | ||
147 | sysmmu_fault_name[itype], sysmmu_ips_name[ips]); | ||
148 | } else { | ||
149 | base = 0; | ||
150 | } | ||
151 | } | ||
152 | |||
153 | sysmmu_unblock(ips); | ||
154 | |||
155 | if (!base) | ||
156 | dev_notice(dev, "%s from %s is not handled.\n", | ||
157 | sysmmu_fault_name[itype], sysmmu_ips_name[ips]); | ||
158 | |||
159 | return IRQ_HANDLED; | ||
160 | } | ||
161 | |||
162 | void s5p_sysmmu_set_tablebase_pgd(sysmmu_ips ips, unsigned long pgd) | ||
163 | { | ||
164 | if (is_sysmmu_active(ips)) { | ||
165 | sysmmu_block(ips); | ||
166 | __sysmmu_set_ptbase(ips, pgd); | ||
167 | sysmmu_unblock(ips); | ||
168 | } else { | ||
169 | dev_dbg(dev, "%s is disabled. " | ||
170 | "Skipping initializing page table base.\n", | ||
171 | sysmmu_ips_name[ips]); | ||
172 | } | ||
173 | } | ||
174 | |||
175 | void s5p_sysmmu_enable(sysmmu_ips ips, unsigned long pgd) | ||
176 | { | ||
177 | if (!is_sysmmu_active(ips)) { | ||
178 | sysmmu_clk_enable(ips); | ||
179 | |||
180 | __sysmmu_set_ptbase(ips, pgd); | ||
181 | |||
182 | __raw_writel(CTRL_ENABLE, sysmmusfrs[ips] + S5P_MMU_CTRL); | ||
183 | |||
184 | set_sysmmu_active(ips); | ||
185 | dev_dbg(dev, "%s is enabled.\n", sysmmu_ips_name[ips]); | ||
186 | } else { | ||
187 | dev_dbg(dev, "%s is already enabled.\n", sysmmu_ips_name[ips]); | ||
188 | } | ||
189 | } | ||
190 | |||
191 | void s5p_sysmmu_disable(sysmmu_ips ips) | ||
192 | { | ||
193 | if (is_sysmmu_active(ips)) { | ||
194 | __raw_writel(CTRL_DISABLE, sysmmusfrs[ips] + S5P_MMU_CTRL); | ||
195 | set_sysmmu_inactive(ips); | ||
196 | sysmmu_clk_disable(ips); | ||
197 | dev_dbg(dev, "%s is disabled.\n", sysmmu_ips_name[ips]); | ||
198 | } else { | ||
199 | dev_dbg(dev, "%s is already disabled.\n", sysmmu_ips_name[ips]); | ||
200 | } | ||
201 | } | ||
202 | |||
203 | void s5p_sysmmu_tlb_invalidate(sysmmu_ips ips) | ||
204 | { | ||
205 | if (is_sysmmu_active(ips)) { | ||
206 | sysmmu_block(ips); | ||
207 | __sysmmu_tlb_invalidate(ips); | ||
208 | sysmmu_unblock(ips); | ||
209 | } else { | ||
210 | dev_dbg(dev, "%s is disabled. " | ||
211 | "Skipping invalidating TLB.\n", sysmmu_ips_name[ips]); | ||
212 | } | ||
213 | } | ||
214 | |||
215 | static int s5p_sysmmu_probe(struct platform_device *pdev) | ||
216 | { | ||
217 | int i, ret; | ||
218 | struct resource *res, *mem; | ||
219 | |||
220 | dev = &pdev->dev; | ||
221 | |||
222 | for (i = 0; i < S5P_SYSMMU_TOTAL_IPNUM; i++) { | ||
223 | int irq; | ||
224 | |||
225 | sysmmu_clk_init(dev, i); | ||
226 | sysmmu_clk_disable(i); | ||
227 | |||
228 | res = platform_get_resource(pdev, IORESOURCE_MEM, i); | ||
229 | if (!res) { | ||
230 | dev_err(dev, "Failed to get the resource of %s.\n", | ||
231 | sysmmu_ips_name[i]); | ||
232 | ret = -ENODEV; | ||
233 | goto err_res; | ||
234 | } | ||
235 | |||
236 | mem = request_mem_region(res->start, resource_size(res), | ||
237 | pdev->name); | ||
238 | if (!mem) { | ||
239 | dev_err(dev, "Failed to request the memory region of %s.\n", | ||
240 | sysmmu_ips_name[i]); | ||
241 | ret = -EBUSY; | ||
242 | goto err_res; | ||
243 | } | ||
244 | |||
245 | sysmmusfrs[i] = ioremap(res->start, resource_size(res)); | ||
246 | if (!sysmmusfrs[i]) { | ||
247 | dev_err(dev, "Failed to ioremap() for %s.\n", | ||
248 | sysmmu_ips_name[i]); | ||
249 | ret = -ENXIO; | ||
250 | goto err_reg; | ||
251 | } | ||
252 | |||
253 | irq = platform_get_irq(pdev, i); | ||
254 | if (irq <= 0) { | ||
255 | dev_err(dev, "Failed to get the IRQ resource of %s.\n", | ||
256 | sysmmu_ips_name[i]); | ||
257 | ret = -ENOENT; | ||
258 | goto err_map; | ||
259 | } | ||
260 | |||
261 | if (request_irq(irq, s5p_sysmmu_irq, IRQF_DISABLED, | ||
262 | pdev->name, (void *)i)) { | ||
263 | dev_err(dev, "Failed to request IRQ for %s.\n", | ||
264 | sysmmu_ips_name[i]); | ||
265 | ret = -ENOENT; | ||
266 | goto err_map; | ||
267 | } | ||
268 | } | ||
269 | |||
270 | return 0; | ||
271 | |||
272 | err_map: | ||
273 | iounmap(sysmmusfrs[i]); | ||
274 | err_reg: | ||
275 | release_mem_region(mem->start, resource_size(mem)); | ||
276 | err_res: | ||
277 | return ret; | ||
278 | } | ||
279 | |||
280 | static int s5p_sysmmu_remove(struct platform_device *pdev) | ||
281 | { | ||
282 | return 0; | ||
283 | } | ||
284 | int s5p_sysmmu_runtime_suspend(struct device *dev) | ||
285 | { | ||
286 | return 0; | ||
287 | } | ||
288 | |||
289 | int s5p_sysmmu_runtime_resume(struct device *dev) | ||
290 | { | ||
291 | return 0; | ||
292 | } | ||
293 | |||
294 | const struct dev_pm_ops s5p_sysmmu_pm_ops = { | ||
295 | .runtime_suspend = s5p_sysmmu_runtime_suspend, | ||
296 | .runtime_resume = s5p_sysmmu_runtime_resume, | ||
297 | }; | ||
298 | |||
299 | static struct platform_driver s5p_sysmmu_driver = { | ||
300 | .probe = s5p_sysmmu_probe, | ||
301 | .remove = s5p_sysmmu_remove, | ||
302 | .driver = { | ||
303 | .owner = THIS_MODULE, | ||
304 | .name = "s5p-sysmmu", | ||
305 | .pm = &s5p_sysmmu_pm_ops, | ||
306 | } | ||
307 | }; | ||
308 | |||
309 | static int __init s5p_sysmmu_init(void) | ||
310 | { | ||
311 | return platform_driver_register(&s5p_sysmmu_driver); | ||
312 | } | ||
313 | arch_initcall(s5p_sysmmu_init); | ||
diff --git a/arch/arm/plat-samsung/Kconfig b/arch/arm/plat-samsung/Kconfig index a0ffc77da809..a2fae4ea0936 100644 --- a/arch/arm/plat-samsung/Kconfig +++ b/arch/arm/plat-samsung/Kconfig | |||
@@ -13,6 +13,24 @@ config PLAT_SAMSUNG | |||
13 | help | 13 | help |
14 | Base platform code for all Samsung SoC based systems | 14 | Base platform code for all Samsung SoC based systems |
15 | 15 | ||
16 | config PLAT_S5P | ||
17 | bool | ||
18 | depends on (ARCH_S5P64X0 || ARCH_S5PC100 || ARCH_S5PV210 || ARCH_EXYNOS) | ||
19 | default y | ||
20 | select ARM_VIC if !ARCH_EXYNOS | ||
21 | select ARM_GIC if ARCH_EXYNOS | ||
22 | select GIC_NON_BANKED if ARCH_EXYNOS4 | ||
23 | select NO_IOPORT | ||
24 | select ARCH_REQUIRE_GPIOLIB | ||
25 | select S3C_GPIO_TRACK | ||
26 | select S5P_GPIO_DRVSTR | ||
27 | select SAMSUNG_GPIOLIB_4BIT | ||
28 | select PLAT_SAMSUNG | ||
29 | select SAMSUNG_CLKSRC | ||
30 | select SAMSUNG_IRQ_VIC_TIMER | ||
31 | help | ||
32 | Base platform code for Samsung's S5P series SoC. | ||
33 | |||
16 | if PLAT_SAMSUNG | 34 | if PLAT_SAMSUNG |
17 | 35 | ||
18 | # boot configurations | 36 | # boot configurations |
@@ -50,6 +68,14 @@ config S3C_LOWLEVEL_UART_PORT | |||
50 | this configuration should be between zero and two. The port | 68 | this configuration should be between zero and two. The port |
51 | must have been initialised by the boot-loader before use. | 69 | must have been initialised by the boot-loader before use. |
52 | 70 | ||
71 | # timer options | ||
72 | |||
73 | config S5P_HRT | ||
74 | bool | ||
75 | select SAMSUNG_DEV_PWM | ||
76 | help | ||
77 | Use the High Resolution timer support | ||
78 | |||
53 | # clock options | 79 | # clock options |
54 | 80 | ||
55 | config SAMSUNG_CLKSRC | 81 | config SAMSUNG_CLKSRC |
@@ -58,6 +84,11 @@ config SAMSUNG_CLKSRC | |||
58 | Select the clock code for the clksrc implementation | 84 | Select the clock code for the clksrc implementation |
59 | used by newer systems such as the S3C64XX. | 85 | used by newer systems such as the S3C64XX. |
60 | 86 | ||
87 | config S5P_CLOCK | ||
88 | def_bool (ARCH_S5P64X0 || ARCH_S5PC100 || ARCH_S5PV210 || ARCH_EXYNOS) | ||
89 | help | ||
90 | Support common clock part for ARCH_S5P and ARCH_EXYNOS SoCs | ||
91 | |||
61 | # options for IRQ support | 92 | # options for IRQ support |
62 | 93 | ||
63 | config SAMSUNG_IRQ_VIC_TIMER | 94 | config SAMSUNG_IRQ_VIC_TIMER |
@@ -65,6 +96,22 @@ config SAMSUNG_IRQ_VIC_TIMER | |||
65 | help | 96 | help |
66 | Internal configuration to build the VIC timer interrupt code. | 97 | Internal configuration to build the VIC timer interrupt code. |
67 | 98 | ||
99 | config S5P_IRQ | ||
100 | def_bool (ARCH_S5P64X0 || ARCH_S5PC100 || ARCH_S5PV210 || ARCH_EXYNOS) | ||
101 | help | ||
102 | Support common interrup part for ARCH_S5P and ARCH_EXYNOS SoCs | ||
103 | |||
104 | config S5P_EXT_INT | ||
105 | bool | ||
106 | help | ||
107 | Use the external interrupts (other than GPIO interrupts.) | ||
108 | Note: Do not choose this for S5P6440 and S5P6450. | ||
109 | |||
110 | config S5P_GPIO_INT | ||
111 | bool | ||
112 | help | ||
113 | Common code for the GPIO interrupts (other than external interrupts.) | ||
114 | |||
68 | # options for gpio configuration support | 115 | # options for gpio configuration support |
69 | 116 | ||
70 | config SAMSUNG_GPIOLIB_4BIT | 117 | config SAMSUNG_GPIOLIB_4BIT |
@@ -117,6 +164,12 @@ config S3C_GPIO_TRACK | |||
117 | Internal configuration option to enable the s3c specific gpio | 164 | Internal configuration option to enable the s3c specific gpio |
118 | chip tracking if the platform requires it. | 165 | chip tracking if the platform requires it. |
119 | 166 | ||
167 | # uart options | ||
168 | |||
169 | config S5P_DEV_UART | ||
170 | def_bool y | ||
171 | depends on (ARCH_S5P64X0 || ARCH_S5PC100 || ARCH_S5PV210) | ||
172 | |||
120 | # ADC driver | 173 | # ADC driver |
121 | 174 | ||
122 | config S3C_ADC | 175 | config S3C_ADC |
@@ -274,6 +327,76 @@ config SAMSUNG_DEV_BACKLIGHT | |||
274 | help | 327 | help |
275 | Compile in platform device definition LCD backlight with PWM Timer | 328 | Compile in platform device definition LCD backlight with PWM Timer |
276 | 329 | ||
330 | config S5P_DEV_CSIS0 | ||
331 | bool | ||
332 | help | ||
333 | Compile in platform device definitions for MIPI-CSIS channel 0 | ||
334 | |||
335 | config S5P_DEV_CSIS1 | ||
336 | bool | ||
337 | help | ||
338 | Compile in platform device definitions for MIPI-CSIS channel 1 | ||
339 | |||
340 | config S5P_DEV_FIMC0 | ||
341 | bool | ||
342 | help | ||
343 | Compile in platform device definitions for FIMC controller 0 | ||
344 | |||
345 | config S5P_DEV_FIMC1 | ||
346 | bool | ||
347 | help | ||
348 | Compile in platform device definitions for FIMC controller 1 | ||
349 | |||
350 | config S5P_DEV_FIMC2 | ||
351 | bool | ||
352 | help | ||
353 | Compile in platform device definitions for FIMC controller 2 | ||
354 | |||
355 | config S5P_DEV_FIMC3 | ||
356 | bool | ||
357 | help | ||
358 | Compile in platform device definitions for FIMC controller 3 | ||
359 | |||
360 | config S5P_DEV_FIMD0 | ||
361 | bool | ||
362 | help | ||
363 | Compile in platform device definitions for FIMD controller 0 | ||
364 | |||
365 | config S5P_DEV_G2D | ||
366 | bool | ||
367 | help | ||
368 | Compile in platform device definitions for G2D device | ||
369 | |||
370 | config S5P_DEV_I2C_HDMIPHY | ||
371 | bool | ||
372 | help | ||
373 | Compile in platform device definitions for I2C HDMIPHY controller | ||
374 | |||
375 | config S5P_DEV_JPEG | ||
376 | bool | ||
377 | help | ||
378 | Compile in platform device definitions for JPEG codec | ||
379 | |||
380 | config S5P_DEV_MFC | ||
381 | bool | ||
382 | help | ||
383 | Compile in setup memory (init) code for MFC | ||
384 | |||
385 | config S5P_DEV_ONENAND | ||
386 | bool | ||
387 | help | ||
388 | Compile in platform device definition for OneNAND controller | ||
389 | |||
390 | config S5P_DEV_TV | ||
391 | bool | ||
392 | help | ||
393 | Compile in platform device definition for TV interface | ||
394 | |||
395 | config S5P_DEV_USB_EHCI | ||
396 | bool | ||
397 | help | ||
398 | Compile in platform device definition for USB EHCI | ||
399 | |||
277 | config S3C24XX_PWM | 400 | config S3C24XX_PWM |
278 | bool "PWM device support" | 401 | bool "PWM device support" |
279 | select HAVE_PWM | 402 | select HAVE_PWM |
@@ -281,6 +404,11 @@ config S3C24XX_PWM | |||
281 | Support for exporting the PWM timer blocks via the pwm device | 404 | Support for exporting the PWM timer blocks via the pwm device |
282 | system | 405 | system |
283 | 406 | ||
407 | config S5P_SETUP_MIPIPHY | ||
408 | bool | ||
409 | help | ||
410 | Compile in common setup code for MIPI-CSIS and MIPI-DSIM devices | ||
411 | |||
284 | # DMA | 412 | # DMA |
285 | 413 | ||
286 | config S3C_DMA | 414 | config S3C_DMA |
@@ -291,7 +419,7 @@ config S3C_DMA | |||
291 | config SAMSUNG_DMADEV | 419 | config SAMSUNG_DMADEV |
292 | bool | 420 | bool |
293 | select DMADEVICES | 421 | select DMADEVICES |
294 | select PL330_DMA if (CPU_EXYNOS4210 || CPU_S5PV210 || CPU_S5PC100 || \ | 422 | select PL330_DMA if (ARCH_EXYNOS5 || ARCH_EXYNOS4 || CPU_S5PV210 || CPU_S5PC100 || \ |
295 | CPU_S5P6450 || CPU_S5P6440) | 423 | CPU_S5P6450 || CPU_S5P6440) |
296 | select ARM_AMBA | 424 | select ARM_AMBA |
297 | help | 425 | help |
@@ -351,6 +479,18 @@ config SAMSUNG_WAKEMASK | |||
351 | and above. This code allows a set of interrupt to wakeup-mask | 479 | and above. This code allows a set of interrupt to wakeup-mask |
352 | mappings. See <plat/wakeup-mask.h> | 480 | mappings. See <plat/wakeup-mask.h> |
353 | 481 | ||
482 | config S5P_PM | ||
483 | bool | ||
484 | help | ||
485 | Common code for power management support on S5P and newer SoCs | ||
486 | Note: Do not select this for S5P6440 and S5P6450. | ||
487 | |||
488 | config S5P_SLEEP | ||
489 | bool | ||
490 | help | ||
491 | Internal config node to apply common S5P sleep management code. | ||
492 | Can be selected by S5P and newer SoCs with similar sleep procedure. | ||
493 | |||
354 | comment "Power Domain" | 494 | comment "Power Domain" |
355 | 495 | ||
356 | config SAMSUNG_PD | 496 | config SAMSUNG_PD |
diff --git a/arch/arm/plat-samsung/Makefile b/arch/arm/plat-samsung/Makefile index 6012366f33cb..860b2db4db15 100644 --- a/arch/arm/plat-samsung/Makefile +++ b/arch/arm/plat-samsung/Makefile | |||
@@ -13,12 +13,18 @@ obj- := | |||
13 | 13 | ||
14 | obj-y += init.o cpu.o | 14 | obj-y += init.o cpu.o |
15 | obj-$(CONFIG_ARCH_USES_GETTIMEOFFSET) += time.o | 15 | obj-$(CONFIG_ARCH_USES_GETTIMEOFFSET) += time.o |
16 | obj-$(CONFIG_S5P_HRT) += s5p-time.o | ||
17 | |||
16 | obj-y += clock.o | 18 | obj-y += clock.o |
17 | obj-y += pwm-clock.o | 19 | obj-y += pwm-clock.o |
18 | 20 | ||
19 | obj-$(CONFIG_SAMSUNG_CLKSRC) += clock-clksrc.o | 21 | obj-$(CONFIG_SAMSUNG_CLKSRC) += clock-clksrc.o |
22 | obj-$(CONFIG_S5P_CLOCK) += s5p-clock.o | ||
20 | 23 | ||
21 | obj-$(CONFIG_SAMSUNG_IRQ_VIC_TIMER) += irq-vic-timer.o | 24 | obj-$(CONFIG_SAMSUNG_IRQ_VIC_TIMER) += irq-vic-timer.o |
25 | obj-$(CONFIG_S5P_IRQ) += s5p-irq.o | ||
26 | obj-$(CONFIG_S5P_EXT_INT) += s5p-irq-eint.o | ||
27 | obj-$(CONFIG_S5P_GPIO_INT) += s5p-irq-gpioint.o | ||
22 | 28 | ||
23 | # ADC | 29 | # ADC |
24 | 30 | ||
@@ -30,9 +36,13 @@ obj-y += platformdata.o | |||
30 | 36 | ||
31 | obj-y += devs.o | 37 | obj-y += devs.o |
32 | obj-y += dev-uart.o | 38 | obj-y += dev-uart.o |
39 | obj-$(CONFIG_S5P_DEV_MFC) += s5p-dev-mfc.o | ||
40 | obj-$(CONFIG_S5P_DEV_UART) += s5p-dev-uart.o | ||
33 | 41 | ||
34 | obj-$(CONFIG_SAMSUNG_DEV_BACKLIGHT) += dev-backlight.o | 42 | obj-$(CONFIG_SAMSUNG_DEV_BACKLIGHT) += dev-backlight.o |
35 | 43 | ||
44 | obj-$(CONFIG_S5P_SETUP_MIPIPHY) += setup-mipiphy.o | ||
45 | |||
36 | # DMA support | 46 | # DMA support |
37 | 47 | ||
38 | obj-$(CONFIG_S3C_DMA) += dma.o s3c-dma-ops.o | 48 | obj-$(CONFIG_S3C_DMA) += dma.o s3c-dma-ops.o |
@@ -47,6 +57,9 @@ obj-$(CONFIG_SAMSUNG_PM_CHECK) += pm-check.o | |||
47 | 57 | ||
48 | obj-$(CONFIG_SAMSUNG_WAKEMASK) += wakeup-mask.o | 58 | obj-$(CONFIG_SAMSUNG_WAKEMASK) += wakeup-mask.o |
49 | 59 | ||
60 | obj-$(CONFIG_S5P_PM) += s5p-pm.o s5p-irq-pm.o | ||
61 | obj-$(CONFIG_S5P_SLEEP) += s5p-sleep.o | ||
62 | |||
50 | # PD support | 63 | # PD support |
51 | 64 | ||
52 | obj-$(CONFIG_SAMSUNG_PD) += pd.o | 65 | obj-$(CONFIG_SAMSUNG_PD) += pd.o |
diff --git a/arch/arm/plat-samsung/include/plat/cpu.h b/arch/arm/plat-samsung/include/plat/cpu.h index 787ceaca0be8..0721293fad63 100644 --- a/arch/arm/plat-samsung/include/plat/cpu.h +++ b/arch/arm/plat-samsung/include/plat/cpu.h | |||
@@ -202,7 +202,7 @@ extern struct bus_type s3c2443_subsys; | |||
202 | extern struct bus_type s3c6410_subsys; | 202 | extern struct bus_type s3c6410_subsys; |
203 | extern struct bus_type s5p64x0_subsys; | 203 | extern struct bus_type s5p64x0_subsys; |
204 | extern struct bus_type s5pv210_subsys; | 204 | extern struct bus_type s5pv210_subsys; |
205 | extern struct bus_type exynos4_subsys; | 205 | extern struct bus_type exynos_subsys; |
206 | 206 | ||
207 | extern void (*s5pc1xx_idle)(void); | 207 | extern void (*s5pc1xx_idle)(void); |
208 | 208 | ||
diff --git a/arch/arm/plat-samsung/include/plat/devs.h b/arch/arm/plat-samsung/include/plat/devs.h index 2155d4af62a3..61ca2f356c52 100644 --- a/arch/arm/plat-samsung/include/plat/devs.h +++ b/arch/arm/plat-samsung/include/plat/devs.h | |||
@@ -133,7 +133,8 @@ extern struct platform_device exynos4_device_pcm1; | |||
133 | extern struct platform_device exynos4_device_pcm2; | 133 | extern struct platform_device exynos4_device_pcm2; |
134 | extern struct platform_device exynos4_device_pd[]; | 134 | extern struct platform_device exynos4_device_pd[]; |
135 | extern struct platform_device exynos4_device_spdif; | 135 | extern struct platform_device exynos4_device_spdif; |
136 | extern struct platform_device exynos4_device_sysmmu; | 136 | |
137 | extern struct platform_device exynos_device_drm; | ||
137 | 138 | ||
138 | extern struct platform_device samsung_asoc_dma; | 139 | extern struct platform_device samsung_asoc_dma; |
139 | extern struct platform_device samsung_asoc_idma; | 140 | extern struct platform_device samsung_asoc_idma; |
diff --git a/arch/arm/plat-samsung/include/plat/dma-pl330.h b/arch/arm/plat-samsung/include/plat/dma-pl330.h index 0670f37aaaed..d384a8016b47 100644 --- a/arch/arm/plat-samsung/include/plat/dma-pl330.h +++ b/arch/arm/plat-samsung/include/plat/dma-pl330.h | |||
@@ -90,6 +90,7 @@ enum dma_ch { | |||
90 | DMACH_MIPI_HSI5, | 90 | DMACH_MIPI_HSI5, |
91 | DMACH_MIPI_HSI6, | 91 | DMACH_MIPI_HSI6, |
92 | DMACH_MIPI_HSI7, | 92 | DMACH_MIPI_HSI7, |
93 | DMACH_DISP1, | ||
93 | DMACH_MTOM_0, | 94 | DMACH_MTOM_0, |
94 | DMACH_MTOM_1, | 95 | DMACH_MTOM_1, |
95 | DMACH_MTOM_2, | 96 | DMACH_MTOM_2, |
diff --git a/arch/arm/plat-samsung/include/plat/s5p-clock.h b/arch/arm/plat-samsung/include/plat/s5p-clock.h index 1de4b32f98e9..8364b4bea8b8 100644 --- a/arch/arm/plat-samsung/include/plat/s5p-clock.h +++ b/arch/arm/plat-samsung/include/plat/s5p-clock.h | |||
@@ -32,8 +32,10 @@ extern struct clk clk_48m; | |||
32 | extern struct clk s5p_clk_27m; | 32 | extern struct clk s5p_clk_27m; |
33 | extern struct clk clk_fout_apll; | 33 | extern struct clk clk_fout_apll; |
34 | extern struct clk clk_fout_bpll; | 34 | extern struct clk clk_fout_bpll; |
35 | extern struct clk clk_fout_bpll_div2; | ||
35 | extern struct clk clk_fout_cpll; | 36 | extern struct clk clk_fout_cpll; |
36 | extern struct clk clk_fout_mpll; | 37 | extern struct clk clk_fout_mpll; |
38 | extern struct clk clk_fout_mpll_div2; | ||
37 | extern struct clk clk_fout_epll; | 39 | extern struct clk clk_fout_epll; |
38 | extern struct clk clk_fout_dpll; | 40 | extern struct clk clk_fout_dpll; |
39 | extern struct clk clk_fout_vpll; | 41 | extern struct clk clk_fout_vpll; |
@@ -42,8 +44,10 @@ extern struct clk clk_vpll; | |||
42 | 44 | ||
43 | extern struct clksrc_sources clk_src_apll; | 45 | extern struct clksrc_sources clk_src_apll; |
44 | extern struct clksrc_sources clk_src_bpll; | 46 | extern struct clksrc_sources clk_src_bpll; |
47 | extern struct clksrc_sources clk_src_bpll_fout; | ||
45 | extern struct clksrc_sources clk_src_cpll; | 48 | extern struct clksrc_sources clk_src_cpll; |
46 | extern struct clksrc_sources clk_src_mpll; | 49 | extern struct clksrc_sources clk_src_mpll; |
50 | extern struct clksrc_sources clk_src_mpll_fout; | ||
47 | extern struct clksrc_sources clk_src_epll; | 51 | extern struct clksrc_sources clk_src_epll; |
48 | extern struct clksrc_sources clk_src_dpll; | 52 | extern struct clksrc_sources clk_src_dpll; |
49 | 53 | ||
diff --git a/arch/arm/plat-samsung/include/plat/sysmmu.h b/arch/arm/plat-samsung/include/plat/sysmmu.h deleted file mode 100644 index 5fe8ee01a5ba..000000000000 --- a/arch/arm/plat-samsung/include/plat/sysmmu.h +++ /dev/null | |||
@@ -1,95 +0,0 @@ | |||
1 | /* linux/arch/arm/plat-samsung/include/plat/sysmmu.h | ||
2 | * | ||
3 | * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com | ||
5 | * | ||
6 | * Samsung System MMU driver for S5P platform | ||
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 | |||
13 | #ifndef __PLAT_SAMSUNG_SYSMMU_H | ||
14 | #define __PLAT_SAMSUNG_SYSMMU_H __FILE__ | ||
15 | |||
16 | enum S5P_SYSMMU_INTERRUPT_TYPE { | ||
17 | SYSMMU_PAGEFAULT, | ||
18 | SYSMMU_AR_MULTIHIT, | ||
19 | SYSMMU_AW_MULTIHIT, | ||
20 | SYSMMU_BUSERROR, | ||
21 | SYSMMU_AR_SECURITY, | ||
22 | SYSMMU_AR_ACCESS, | ||
23 | SYSMMU_AW_SECURITY, | ||
24 | SYSMMU_AW_PROTECTION, /* 7 */ | ||
25 | SYSMMU_FAULTS_NUM | ||
26 | }; | ||
27 | |||
28 | #ifdef CONFIG_S5P_SYSTEM_MMU | ||
29 | |||
30 | #include <mach/sysmmu.h> | ||
31 | |||
32 | /** | ||
33 | * s5p_sysmmu_enable() - enable system mmu of ip | ||
34 | * @ips: The ip connected system mmu. | ||
35 | * #pgd: Base physical address of the 1st level page table | ||
36 | * | ||
37 | * This function enable system mmu to transfer address | ||
38 | * from virtual address to physical address | ||
39 | */ | ||
40 | void s5p_sysmmu_enable(sysmmu_ips ips, unsigned long pgd); | ||
41 | |||
42 | /** | ||
43 | * s5p_sysmmu_disable() - disable sysmmu mmu of ip | ||
44 | * @ips: The ip connected system mmu. | ||
45 | * | ||
46 | * This function disable system mmu to transfer address | ||
47 | * from virtual address to physical address | ||
48 | */ | ||
49 | void s5p_sysmmu_disable(sysmmu_ips ips); | ||
50 | |||
51 | /** | ||
52 | * s5p_sysmmu_set_tablebase_pgd() - set page table base address to refer page table | ||
53 | * @ips: The ip connected system mmu. | ||
54 | * @pgd: The page table base address. | ||
55 | * | ||
56 | * This function set page table base address | ||
57 | * When system mmu transfer address from virtaul address to physical address, | ||
58 | * system mmu refer address information from page table | ||
59 | */ | ||
60 | void s5p_sysmmu_set_tablebase_pgd(sysmmu_ips ips, unsigned long pgd); | ||
61 | |||
62 | /** | ||
63 | * s5p_sysmmu_tlb_invalidate() - flush all TLB entry in system mmu | ||
64 | * @ips: The ip connected system mmu. | ||
65 | * | ||
66 | * This function flush all TLB entry in system mmu | ||
67 | */ | ||
68 | void s5p_sysmmu_tlb_invalidate(sysmmu_ips ips); | ||
69 | |||
70 | /** s5p_sysmmu_set_fault_handler() - Fault handler for System MMUs | ||
71 | * @itype: type of fault. | ||
72 | * @pgtable_base: the physical address of page table base. This is 0 if @ips is | ||
73 | * SYSMMU_BUSERROR. | ||
74 | * @fault_addr: the device (virtual) address that the System MMU tried to | ||
75 | * translated. This is 0 if @ips is SYSMMU_BUSERROR. | ||
76 | * Called when interrupt occurred by the System MMUs | ||
77 | * The device drivers of peripheral devices that has a System MMU can implement | ||
78 | * a fault handler to resolve address translation fault by System MMU. | ||
79 | * The meanings of return value and parameters are described below. | ||
80 | |||
81 | * return value: non-zero if the fault is correctly resolved. | ||
82 | * zero if the fault is not handled. | ||
83 | */ | ||
84 | void s5p_sysmmu_set_fault_handler(sysmmu_ips ips, | ||
85 | int (*handler)(enum S5P_SYSMMU_INTERRUPT_TYPE itype, | ||
86 | unsigned long pgtable_base, | ||
87 | unsigned long fault_addr)); | ||
88 | #else | ||
89 | #define s5p_sysmmu_enable(ips, pgd) do { } while (0) | ||
90 | #define s5p_sysmmu_disable(ips) do { } while (0) | ||
91 | #define s5p_sysmmu_set_tablebase_pgd(ips, pgd) do { } while (0) | ||
92 | #define s5p_sysmmu_tlb_invalidate(ips) do { } while (0) | ||
93 | #define s5p_sysmmu_set_fault_handler(ips, handler) do { } while (0) | ||
94 | #endif | ||
95 | #endif /* __ASM_PLAT_SYSMMU_H */ | ||
diff --git a/arch/arm/plat-s5p/clock.c b/arch/arm/plat-samsung/s5p-clock.c index f68a9bb11948..031a61899bef 100644 --- a/arch/arm/plat-s5p/clock.c +++ b/arch/arm/plat-samsung/s5p-clock.c | |||
@@ -1,5 +1,4 @@ | |||
1 | /* linux/arch/arm/plat-s5p/clock.c | 1 | /* |
2 | * | ||
3 | * Copyright 2009 Samsung Electronics Co., Ltd. | 2 | * Copyright 2009 Samsung Electronics Co., Ltd. |
4 | * http://www.samsung.com/ | 3 | * http://www.samsung.com/ |
5 | * | 4 | * |
@@ -68,6 +67,11 @@ struct clk clk_fout_bpll = { | |||
68 | .id = -1, | 67 | .id = -1, |
69 | }; | 68 | }; |
70 | 69 | ||
70 | struct clk clk_fout_bpll_div2 = { | ||
71 | .name = "fout_bpll_div2", | ||
72 | .id = -1, | ||
73 | }; | ||
74 | |||
71 | /* CPLL clock output */ | 75 | /* CPLL clock output */ |
72 | 76 | ||
73 | struct clk clk_fout_cpll = { | 77 | struct clk clk_fout_cpll = { |
@@ -83,6 +87,11 @@ struct clk clk_fout_mpll = { | |||
83 | .id = -1, | 87 | .id = -1, |
84 | }; | 88 | }; |
85 | 89 | ||
90 | struct clk clk_fout_mpll_div2 = { | ||
91 | .name = "fout_mpll_div2", | ||
92 | .id = -1, | ||
93 | }; | ||
94 | |||
86 | /* EPLL clock output */ | 95 | /* EPLL clock output */ |
87 | struct clk clk_fout_epll = { | 96 | struct clk clk_fout_epll = { |
88 | .name = "fout_epll", | 97 | .name = "fout_epll", |
@@ -126,6 +135,16 @@ struct clksrc_sources clk_src_bpll = { | |||
126 | .nr_sources = ARRAY_SIZE(clk_src_bpll_list), | 135 | .nr_sources = ARRAY_SIZE(clk_src_bpll_list), |
127 | }; | 136 | }; |
128 | 137 | ||
138 | static struct clk *clk_src_bpll_fout_list[] = { | ||
139 | [0] = &clk_fout_bpll_div2, | ||
140 | [1] = &clk_fout_bpll, | ||
141 | }; | ||
142 | |||
143 | struct clksrc_sources clk_src_bpll_fout = { | ||
144 | .sources = clk_src_bpll_fout_list, | ||
145 | .nr_sources = ARRAY_SIZE(clk_src_bpll_fout_list), | ||
146 | }; | ||
147 | |||
129 | /* Possible clock sources for CPLL Mux */ | 148 | /* Possible clock sources for CPLL Mux */ |
130 | static struct clk *clk_src_cpll_list[] = { | 149 | static struct clk *clk_src_cpll_list[] = { |
131 | [0] = &clk_fin_cpll, | 150 | [0] = &clk_fin_cpll, |
@@ -148,6 +167,16 @@ struct clksrc_sources clk_src_mpll = { | |||
148 | .nr_sources = ARRAY_SIZE(clk_src_mpll_list), | 167 | .nr_sources = ARRAY_SIZE(clk_src_mpll_list), |
149 | }; | 168 | }; |
150 | 169 | ||
170 | static struct clk *clk_src_mpll_fout_list[] = { | ||
171 | [0] = &clk_fout_mpll_div2, | ||
172 | [1] = &clk_fout_mpll, | ||
173 | }; | ||
174 | |||
175 | struct clksrc_sources clk_src_mpll_fout = { | ||
176 | .sources = clk_src_mpll_fout_list, | ||
177 | .nr_sources = ARRAY_SIZE(clk_src_mpll_fout_list), | ||
178 | }; | ||
179 | |||
151 | /* Possible clock sources for EPLL Mux */ | 180 | /* Possible clock sources for EPLL Mux */ |
152 | static struct clk *clk_src_epll_list[] = { | 181 | static struct clk *clk_src_epll_list[] = { |
153 | [0] = &clk_fin_epll, | 182 | [0] = &clk_fin_epll, |
diff --git a/arch/arm/plat-s5p/dev-mfc.c b/arch/arm/plat-samsung/s5p-dev-mfc.c index a30d36b7f61b..ad6089465e2a 100644 --- a/arch/arm/plat-s5p/dev-mfc.c +++ b/arch/arm/plat-samsung/s5p-dev-mfc.c | |||
@@ -1,5 +1,4 @@ | |||
1 | /* linux/arch/arm/plat-s5p/dev-mfc.c | 1 | /* |
2 | * | ||
3 | * Copyright (C) 2010-2011 Samsung Electronics Co.Ltd | 2 | * Copyright (C) 2010-2011 Samsung Electronics Co.Ltd |
4 | * | 3 | * |
5 | * Base S5P MFC resource and device definitions | 4 | * Base S5P MFC resource and device definitions |
@@ -9,7 +8,6 @@ | |||
9 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
10 | */ | 9 | */ |
11 | 10 | ||
12 | |||
13 | #include <linux/kernel.h> | 11 | #include <linux/kernel.h> |
14 | #include <linux/interrupt.h> | 12 | #include <linux/interrupt.h> |
15 | #include <linux/platform_device.h> | 13 | #include <linux/platform_device.h> |
diff --git a/arch/arm/plat-s5p/dev-uart.c b/arch/arm/plat-samsung/s5p-dev-uart.c index c9308db36183..cafa3deddcc1 100644 --- a/arch/arm/plat-s5p/dev-uart.c +++ b/arch/arm/plat-samsung/s5p-dev-uart.c | |||
@@ -1,6 +1,5 @@ | |||
1 | /* linux/arch/arm/plat-s5p/dev-uart.c | 1 | /* |
2 | * | 2 | * Copyright (c) 2009,2012 Samsung Electronics Co., Ltd. |
3 | * Copyright (c) 2009 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com/ | 3 | * http://www.samsung.com/ |
5 | * | 4 | * |
6 | * Base S5P UART resource and device definitions | 5 | * Base S5P UART resource and device definitions |
@@ -14,6 +13,7 @@ | |||
14 | #include <linux/types.h> | 13 | #include <linux/types.h> |
15 | #include <linux/interrupt.h> | 14 | #include <linux/interrupt.h> |
16 | #include <linux/list.h> | 15 | #include <linux/list.h> |
16 | #include <linux/ioport.h> | ||
17 | #include <linux/platform_device.h> | 17 | #include <linux/platform_device.h> |
18 | 18 | ||
19 | #include <asm/mach/arch.h> | 19 | #include <asm/mach/arch.h> |
@@ -26,86 +26,38 @@ | |||
26 | /* Serial port registrations */ | 26 | /* Serial port registrations */ |
27 | 27 | ||
28 | static struct resource s5p_uart0_resource[] = { | 28 | static struct resource s5p_uart0_resource[] = { |
29 | [0] = { | 29 | [0] = DEFINE_RES_MEM(S5P_PA_UART0, S5P_SZ_UART), |
30 | .start = S5P_PA_UART0, | 30 | [1] = DEFINE_RES_IRQ(IRQ_UART0), |
31 | .end = S5P_PA_UART0 + S5P_SZ_UART - 1, | ||
32 | .flags = IORESOURCE_MEM, | ||
33 | }, | ||
34 | [1] = { | ||
35 | .start = IRQ_UART0, | ||
36 | .end = IRQ_UART0, | ||
37 | .flags = IORESOURCE_IRQ, | ||
38 | }, | ||
39 | }; | 31 | }; |
40 | 32 | ||
41 | static struct resource s5p_uart1_resource[] = { | 33 | static struct resource s5p_uart1_resource[] = { |
42 | [0] = { | 34 | [0] = DEFINE_RES_MEM(S5P_PA_UART1, S5P_SZ_UART), |
43 | .start = S5P_PA_UART1, | 35 | [1] = DEFINE_RES_IRQ(IRQ_UART1), |
44 | .end = S5P_PA_UART1 + S5P_SZ_UART - 1, | ||
45 | .flags = IORESOURCE_MEM, | ||
46 | }, | ||
47 | [1] = { | ||
48 | .start = IRQ_UART1, | ||
49 | .end = IRQ_UART1, | ||
50 | .flags = IORESOURCE_IRQ, | ||
51 | }, | ||
52 | }; | 36 | }; |
53 | 37 | ||
54 | static struct resource s5p_uart2_resource[] = { | 38 | static struct resource s5p_uart2_resource[] = { |
55 | [0] = { | 39 | [0] = DEFINE_RES_MEM(S5P_PA_UART2, S5P_SZ_UART), |
56 | .start = S5P_PA_UART2, | 40 | [1] = DEFINE_RES_IRQ(IRQ_UART2), |
57 | .end = S5P_PA_UART2 + S5P_SZ_UART - 1, | ||
58 | .flags = IORESOURCE_MEM, | ||
59 | }, | ||
60 | [1] = { | ||
61 | .start = IRQ_UART2, | ||
62 | .end = IRQ_UART2, | ||
63 | .flags = IORESOURCE_IRQ, | ||
64 | }, | ||
65 | }; | 41 | }; |
66 | 42 | ||
67 | static struct resource s5p_uart3_resource[] = { | 43 | static struct resource s5p_uart3_resource[] = { |
68 | #if CONFIG_SERIAL_SAMSUNG_UARTS > 3 | 44 | #if CONFIG_SERIAL_SAMSUNG_UARTS > 3 |
69 | [0] = { | 45 | [0] = DEFINE_RES_MEM(S5P_PA_UART3, S5P_SZ_UART), |
70 | .start = S5P_PA_UART3, | 46 | [1] = DEFINE_RES_IRQ(IRQ_UART3), |
71 | .end = S5P_PA_UART3 + S5P_SZ_UART - 1, | ||
72 | .flags = IORESOURCE_MEM, | ||
73 | }, | ||
74 | [1] = { | ||
75 | .start = IRQ_UART3, | ||
76 | .end = IRQ_UART3, | ||
77 | .flags = IORESOURCE_IRQ, | ||
78 | }, | ||
79 | #endif | 47 | #endif |
80 | }; | 48 | }; |
81 | 49 | ||
82 | static struct resource s5p_uart4_resource[] = { | 50 | static struct resource s5p_uart4_resource[] = { |
83 | #if CONFIG_SERIAL_SAMSUNG_UARTS > 4 | 51 | #if CONFIG_SERIAL_SAMSUNG_UARTS > 4 |
84 | [0] = { | 52 | [0] = DEFINE_RES_MEM(S5P_PA_UART4, S5P_SZ_UART), |
85 | .start = S5P_PA_UART4, | 53 | [1] = DEFINE_RES_IRQ(IRQ_UART4), |
86 | .end = S5P_PA_UART4 + S5P_SZ_UART - 1, | ||
87 | .flags = IORESOURCE_MEM, | ||
88 | }, | ||
89 | [1] = { | ||
90 | .start = IRQ_UART4, | ||
91 | .end = IRQ_UART4, | ||
92 | .flags = IORESOURCE_IRQ, | ||
93 | }, | ||
94 | #endif | 54 | #endif |
95 | }; | 55 | }; |
96 | 56 | ||
97 | static struct resource s5p_uart5_resource[] = { | 57 | static struct resource s5p_uart5_resource[] = { |
98 | #if CONFIG_SERIAL_SAMSUNG_UARTS > 5 | 58 | #if CONFIG_SERIAL_SAMSUNG_UARTS > 5 |
99 | [0] = { | 59 | [0] = DEFINE_RES_MEM(S5P_PA_UART5, S5P_SZ_UART), |
100 | .start = S5P_PA_UART5, | 60 | [1] = DEFINE_RES_IRQ(IRQ_UART5), |
101 | .end = S5P_PA_UART5 + S5P_SZ_UART - 1, | ||
102 | .flags = IORESOURCE_MEM, | ||
103 | }, | ||
104 | [1] = { | ||
105 | .start = IRQ_UART5, | ||
106 | .end = IRQ_UART5, | ||
107 | .flags = IORESOURCE_IRQ, | ||
108 | }, | ||
109 | #endif | 61 | #endif |
110 | }; | 62 | }; |
111 | 63 | ||
diff --git a/arch/arm/plat-s5p/irq-eint.c b/arch/arm/plat-samsung/s5p-irq-eint.c index 139c050918c5..33bd3f3d20f5 100644 --- a/arch/arm/plat-s5p/irq-eint.c +++ b/arch/arm/plat-samsung/s5p-irq-eint.c | |||
@@ -1,5 +1,4 @@ | |||
1 | /* linux/arch/arm/plat-s5p/irq-eint.c | 1 | /* |
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | 2 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. |
4 | * http://www.samsung.com | 3 | * http://www.samsung.com |
5 | * | 4 | * |
diff --git a/arch/arm/plat-s5p/irq-gpioint.c b/arch/arm/plat-samsung/s5p-irq-gpioint.c index 82c7311017a2..f9431fe5b06e 100644 --- a/arch/arm/plat-s5p/irq-gpioint.c +++ b/arch/arm/plat-samsung/s5p-irq-gpioint.c | |||
@@ -1,5 +1,4 @@ | |||
1 | /* linux/arch/arm/plat-s5p/irq-gpioint.c | 1 | /* |
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | 2 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. |
4 | * Author: Kyungmin Park <kyungmin.park@samsung.com> | 3 | * Author: Kyungmin Park <kyungmin.park@samsung.com> |
5 | * Author: Joonyoung Shim <jy0922.shim@samsung.com> | 4 | * Author: Joonyoung Shim <jy0922.shim@samsung.com> |
diff --git a/arch/arm/plat-s5p/irq-pm.c b/arch/arm/plat-samsung/s5p-irq-pm.c index d1bfecae6c9f..7c1e3b7072fc 100644 --- a/arch/arm/plat-s5p/irq-pm.c +++ b/arch/arm/plat-samsung/s5p-irq-pm.c | |||
@@ -1,5 +1,4 @@ | |||
1 | /* linux/arch/arm/plat-s5p/irq-pm.c | 1 | /* |
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | 2 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. |
4 | * http://www.samsung.com | 3 | * http://www.samsung.com |
5 | * | 4 | * |
diff --git a/arch/arm/plat-s5p/irq.c b/arch/arm/plat-samsung/s5p-irq.c index afdaa1082b9f..dfb47d638f03 100644 --- a/arch/arm/plat-s5p/irq.c +++ b/arch/arm/plat-samsung/s5p-irq.c | |||
@@ -1,5 +1,4 @@ | |||
1 | /* arch/arm/plat-s5p/irq.c | 1 | /* |
2 | * | ||
3 | * Copyright (c) 2009 Samsung Electronics Co., Ltd. | 2 | * Copyright (c) 2009 Samsung Electronics Co., Ltd. |
4 | * http://www.samsung.com/ | 3 | * http://www.samsung.com/ |
5 | * | 4 | * |
diff --git a/arch/arm/plat-s5p/pm.c b/arch/arm/plat-samsung/s5p-pm.c index d15dc47b0e3d..0747468f0936 100644 --- a/arch/arm/plat-s5p/pm.c +++ b/arch/arm/plat-samsung/s5p-pm.c | |||
@@ -1,5 +1,4 @@ | |||
1 | /* linux/arch/arm/plat-s5p/pm.c | 1 | /* |
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | 2 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. |
4 | * http://www.samsung.com | 3 | * http://www.samsung.com |
5 | * | 4 | * |
diff --git a/arch/arm/plat-s5p/sleep.S b/arch/arm/plat-samsung/s5p-sleep.S index 006bd01eda02..bdf6dadf8790 100644 --- a/arch/arm/plat-s5p/sleep.S +++ b/arch/arm/plat-samsung/s5p-sleep.S | |||
@@ -1,5 +1,4 @@ | |||
1 | /* linux/arch/arm/plat-s5p/sleep.S | 1 | /* |
2 | * | ||
3 | * Copyright (c) 2011 Samsung Electronics Co., Ltd. | 2 | * Copyright (c) 2011 Samsung Electronics Co., Ltd. |
4 | * http://www.samsung.com | 3 | * http://www.samsung.com |
5 | * | 4 | * |
diff --git a/arch/arm/plat-s5p/s5p-time.c b/arch/arm/plat-samsung/s5p-time.c index 17c0a2c58dfd..028b6e877eb9 100644 --- a/arch/arm/plat-s5p/s5p-time.c +++ b/arch/arm/plat-samsung/s5p-time.c | |||
@@ -1,5 +1,4 @@ | |||
1 | /* linux/arch/arm/plat-s5p/s5p-time.c | 1 | /* |
2 | * | ||
3 | * Copyright (c) 2011 Samsung Electronics Co., Ltd. | 2 | * Copyright (c) 2011 Samsung Electronics Co., Ltd. |
4 | * http://www.samsung.com/ | 3 | * http://www.samsung.com/ |
5 | * | 4 | * |
diff --git a/arch/arm/plat-s5p/setup-mipiphy.c b/arch/arm/plat-samsung/setup-mipiphy.c index 683c466c0e6a..683c466c0e6a 100644 --- a/arch/arm/plat-s5p/setup-mipiphy.c +++ b/arch/arm/plat-samsung/setup-mipiphy.c | |||
diff --git a/arch/arm/plat-spear/Kconfig b/arch/arm/plat-spear/Kconfig index 387655b5ce05..4404f82d5979 100644 --- a/arch/arm/plat-spear/Kconfig +++ b/arch/arm/plat-spear/Kconfig | |||
@@ -8,6 +8,17 @@ choice | |||
8 | prompt "ST SPEAr Family" | 8 | prompt "ST SPEAr Family" |
9 | default ARCH_SPEAR3XX | 9 | default ARCH_SPEAR3XX |
10 | 10 | ||
11 | config ARCH_SPEAR13XX | ||
12 | bool "ST SPEAr13xx with Device Tree" | ||
13 | select ARM_GIC | ||
14 | select CPU_V7 | ||
15 | select USE_OF | ||
16 | select HAVE_SMP | ||
17 | select MIGHT_HAVE_CACHE_L2X0 | ||
18 | select PINCTRL | ||
19 | help | ||
20 | Supports for ARM's SPEAR13XX family | ||
21 | |||
11 | config ARCH_SPEAR3XX | 22 | config ARCH_SPEAR3XX |
12 | bool "ST SPEAr3xx with Device Tree" | 23 | bool "ST SPEAr3xx with Device Tree" |
13 | select ARM_VIC | 24 | select ARM_VIC |
@@ -27,6 +38,7 @@ config ARCH_SPEAR6XX | |||
27 | endchoice | 38 | endchoice |
28 | 39 | ||
29 | # Adding SPEAr machine specific configuration files | 40 | # Adding SPEAr machine specific configuration files |
41 | source "arch/arm/mach-spear13xx/Kconfig" | ||
30 | source "arch/arm/mach-spear3xx/Kconfig" | 42 | source "arch/arm/mach-spear3xx/Kconfig" |
31 | source "arch/arm/mach-spear6xx/Kconfig" | 43 | source "arch/arm/mach-spear6xx/Kconfig" |
32 | 44 | ||
diff --git a/arch/arm/plat-spear/Makefile b/arch/arm/plat-spear/Makefile index 7744802c83e7..2607bd05c525 100644 --- a/arch/arm/plat-spear/Makefile +++ b/arch/arm/plat-spear/Makefile | |||
@@ -3,6 +3,7 @@ | |||
3 | # | 3 | # |
4 | 4 | ||
5 | # Common support | 5 | # Common support |
6 | obj-y := clock.o restart.o time.o pl080.o | 6 | obj-y := restart.o time.o |
7 | 7 | ||
8 | obj-$(CONFIG_ARCH_SPEAR3XX) += shirq.o | 8 | obj-$(CONFIG_ARCH_SPEAR3XX) += pl080.o shirq.o |
9 | obj-$(CONFIG_ARCH_SPEAR6XX) += pl080.o | ||
diff --git a/arch/arm/plat-spear/clock.c b/arch/arm/plat-spear/clock.c deleted file mode 100644 index 67dd00381ea6..000000000000 --- a/arch/arm/plat-spear/clock.c +++ /dev/null | |||
@@ -1,1005 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/plat-spear/clock.c | ||
3 | * | ||
4 | * Clock framework for SPEAr platform | ||
5 | * | ||
6 | * Copyright (C) 2009 ST Microelectronics | ||
7 | * Viresh Kumar<viresh.kumar@st.com> | ||
8 | * | ||
9 | * This file is licensed under the terms of the GNU General Public | ||
10 | * License version 2. This program is licensed "as is" without any | ||
11 | * warranty of any kind, whether express or implied. | ||
12 | */ | ||
13 | |||
14 | #include <linux/bug.h> | ||
15 | #include <linux/clk.h> | ||
16 | #include <linux/debugfs.h> | ||
17 | #include <linux/err.h> | ||
18 | #include <linux/io.h> | ||
19 | #include <linux/list.h> | ||
20 | #include <linux/module.h> | ||
21 | #include <linux/spinlock.h> | ||
22 | #include <plat/clock.h> | ||
23 | |||
24 | static DEFINE_SPINLOCK(clocks_lock); | ||
25 | static LIST_HEAD(root_clks); | ||
26 | #ifdef CONFIG_DEBUG_FS | ||
27 | static LIST_HEAD(clocks); | ||
28 | #endif | ||
29 | |||
30 | static void propagate_rate(struct clk *, int on_init); | ||
31 | #ifdef CONFIG_DEBUG_FS | ||
32 | static int clk_debugfs_reparent(struct clk *); | ||
33 | #endif | ||
34 | |||
35 | static int generic_clk_enable(struct clk *clk) | ||
36 | { | ||
37 | unsigned int val; | ||
38 | |||
39 | if (!clk->en_reg) | ||
40 | return -EFAULT; | ||
41 | |||
42 | val = readl(clk->en_reg); | ||
43 | if (unlikely(clk->flags & RESET_TO_ENABLE)) | ||
44 | val &= ~(1 << clk->en_reg_bit); | ||
45 | else | ||
46 | val |= 1 << clk->en_reg_bit; | ||
47 | |||
48 | writel(val, clk->en_reg); | ||
49 | |||
50 | return 0; | ||
51 | } | ||
52 | |||
53 | static void generic_clk_disable(struct clk *clk) | ||
54 | { | ||
55 | unsigned int val; | ||
56 | |||
57 | if (!clk->en_reg) | ||
58 | return; | ||
59 | |||
60 | val = readl(clk->en_reg); | ||
61 | if (unlikely(clk->flags & RESET_TO_ENABLE)) | ||
62 | val |= 1 << clk->en_reg_bit; | ||
63 | else | ||
64 | val &= ~(1 << clk->en_reg_bit); | ||
65 | |||
66 | writel(val, clk->en_reg); | ||
67 | } | ||
68 | |||
69 | /* generic clk ops */ | ||
70 | static struct clkops generic_clkops = { | ||
71 | .enable = generic_clk_enable, | ||
72 | .disable = generic_clk_disable, | ||
73 | }; | ||
74 | |||
75 | /* returns current programmed clocks clock info structure */ | ||
76 | static struct pclk_info *pclk_info_get(struct clk *clk) | ||
77 | { | ||
78 | unsigned int val, i; | ||
79 | struct pclk_info *info = NULL; | ||
80 | |||
81 | val = (readl(clk->pclk_sel->pclk_sel_reg) >> clk->pclk_sel_shift) | ||
82 | & clk->pclk_sel->pclk_sel_mask; | ||
83 | |||
84 | for (i = 0; i < clk->pclk_sel->pclk_count; i++) { | ||
85 | if (clk->pclk_sel->pclk_info[i].pclk_val == val) | ||
86 | info = &clk->pclk_sel->pclk_info[i]; | ||
87 | } | ||
88 | |||
89 | return info; | ||
90 | } | ||
91 | |||
92 | /* | ||
93 | * Set Update pclk, and pclk_info of clk and add clock sibling node to current | ||
94 | * parents children list | ||
95 | */ | ||
96 | static void clk_reparent(struct clk *clk, struct pclk_info *pclk_info) | ||
97 | { | ||
98 | unsigned long flags; | ||
99 | |||
100 | spin_lock_irqsave(&clocks_lock, flags); | ||
101 | list_del(&clk->sibling); | ||
102 | list_add(&clk->sibling, &pclk_info->pclk->children); | ||
103 | |||
104 | clk->pclk = pclk_info->pclk; | ||
105 | spin_unlock_irqrestore(&clocks_lock, flags); | ||
106 | |||
107 | #ifdef CONFIG_DEBUG_FS | ||
108 | clk_debugfs_reparent(clk); | ||
109 | #endif | ||
110 | } | ||
111 | |||
112 | static void do_clk_disable(struct clk *clk) | ||
113 | { | ||
114 | if (!clk) | ||
115 | return; | ||
116 | |||
117 | if (!clk->usage_count) { | ||
118 | WARN_ON(1); | ||
119 | return; | ||
120 | } | ||
121 | |||
122 | clk->usage_count--; | ||
123 | |||
124 | if (clk->usage_count == 0) { | ||
125 | /* | ||
126 | * Surely, there are no active childrens or direct users | ||
127 | * of this clock | ||
128 | */ | ||
129 | if (clk->pclk) | ||
130 | do_clk_disable(clk->pclk); | ||
131 | |||
132 | if (clk->ops && clk->ops->disable) | ||
133 | clk->ops->disable(clk); | ||
134 | } | ||
135 | } | ||
136 | |||
137 | static int do_clk_enable(struct clk *clk) | ||
138 | { | ||
139 | int ret = 0; | ||
140 | |||
141 | if (!clk) | ||
142 | return -EFAULT; | ||
143 | |||
144 | if (clk->usage_count == 0) { | ||
145 | if (clk->pclk) { | ||
146 | ret = do_clk_enable(clk->pclk); | ||
147 | if (ret) | ||
148 | goto err; | ||
149 | } | ||
150 | if (clk->ops && clk->ops->enable) { | ||
151 | ret = clk->ops->enable(clk); | ||
152 | if (ret) { | ||
153 | if (clk->pclk) | ||
154 | do_clk_disable(clk->pclk); | ||
155 | goto err; | ||
156 | } | ||
157 | } | ||
158 | /* | ||
159 | * Since the clock is going to be used for the first | ||
160 | * time please reclac | ||
161 | */ | ||
162 | if (clk->recalc) { | ||
163 | ret = clk->recalc(clk); | ||
164 | if (ret) | ||
165 | goto err; | ||
166 | } | ||
167 | } | ||
168 | clk->usage_count++; | ||
169 | err: | ||
170 | return ret; | ||
171 | } | ||
172 | |||
173 | /* | ||
174 | * clk_enable - inform the system when the clock source should be running. | ||
175 | * @clk: clock source | ||
176 | * | ||
177 | * If the clock can not be enabled/disabled, this should return success. | ||
178 | * | ||
179 | * Returns success (0) or negative errno. | ||
180 | */ | ||
181 | int clk_enable(struct clk *clk) | ||
182 | { | ||
183 | unsigned long flags; | ||
184 | int ret = 0; | ||
185 | |||
186 | spin_lock_irqsave(&clocks_lock, flags); | ||
187 | ret = do_clk_enable(clk); | ||
188 | spin_unlock_irqrestore(&clocks_lock, flags); | ||
189 | return ret; | ||
190 | } | ||
191 | EXPORT_SYMBOL(clk_enable); | ||
192 | |||
193 | /* | ||
194 | * clk_disable - inform the system when the clock source is no longer required. | ||
195 | * @clk: clock source | ||
196 | * | ||
197 | * Inform the system that a clock source is no longer required by | ||
198 | * a driver and may be shut down. | ||
199 | * | ||
200 | * Implementation detail: if the clock source is shared between | ||
201 | * multiple drivers, clk_enable() calls must be balanced by the | ||
202 | * same number of clk_disable() calls for the clock source to be | ||
203 | * disabled. | ||
204 | */ | ||
205 | void clk_disable(struct clk *clk) | ||
206 | { | ||
207 | unsigned long flags; | ||
208 | |||
209 | spin_lock_irqsave(&clocks_lock, flags); | ||
210 | do_clk_disable(clk); | ||
211 | spin_unlock_irqrestore(&clocks_lock, flags); | ||
212 | } | ||
213 | EXPORT_SYMBOL(clk_disable); | ||
214 | |||
215 | /** | ||
216 | * clk_get_rate - obtain the current clock rate (in Hz) for a clock source. | ||
217 | * This is only valid once the clock source has been enabled. | ||
218 | * @clk: clock source | ||
219 | */ | ||
220 | unsigned long clk_get_rate(struct clk *clk) | ||
221 | { | ||
222 | unsigned long flags, rate; | ||
223 | |||
224 | spin_lock_irqsave(&clocks_lock, flags); | ||
225 | rate = clk->rate; | ||
226 | spin_unlock_irqrestore(&clocks_lock, flags); | ||
227 | |||
228 | return rate; | ||
229 | } | ||
230 | EXPORT_SYMBOL(clk_get_rate); | ||
231 | |||
232 | /** | ||
233 | * clk_set_parent - set the parent clock source for this clock | ||
234 | * @clk: clock source | ||
235 | * @parent: parent clock source | ||
236 | * | ||
237 | * Returns success (0) or negative errno. | ||
238 | */ | ||
239 | int clk_set_parent(struct clk *clk, struct clk *parent) | ||
240 | { | ||
241 | int i, found = 0, val = 0; | ||
242 | unsigned long flags; | ||
243 | |||
244 | if (!clk || !parent) | ||
245 | return -EFAULT; | ||
246 | if (clk->pclk == parent) | ||
247 | return 0; | ||
248 | if (!clk->pclk_sel) | ||
249 | return -EPERM; | ||
250 | |||
251 | /* check if requested parent is in clk parent list */ | ||
252 | for (i = 0; i < clk->pclk_sel->pclk_count; i++) { | ||
253 | if (clk->pclk_sel->pclk_info[i].pclk == parent) { | ||
254 | found = 1; | ||
255 | break; | ||
256 | } | ||
257 | } | ||
258 | |||
259 | if (!found) | ||
260 | return -EINVAL; | ||
261 | |||
262 | spin_lock_irqsave(&clocks_lock, flags); | ||
263 | /* reflect parent change in hardware */ | ||
264 | val = readl(clk->pclk_sel->pclk_sel_reg); | ||
265 | val &= ~(clk->pclk_sel->pclk_sel_mask << clk->pclk_sel_shift); | ||
266 | val |= clk->pclk_sel->pclk_info[i].pclk_val << clk->pclk_sel_shift; | ||
267 | writel(val, clk->pclk_sel->pclk_sel_reg); | ||
268 | spin_unlock_irqrestore(&clocks_lock, flags); | ||
269 | |||
270 | /* reflect parent change in software */ | ||
271 | clk_reparent(clk, &clk->pclk_sel->pclk_info[i]); | ||
272 | |||
273 | propagate_rate(clk, 0); | ||
274 | return 0; | ||
275 | } | ||
276 | EXPORT_SYMBOL(clk_set_parent); | ||
277 | |||
278 | /** | ||
279 | * clk_set_rate - set the clock rate for a clock source | ||
280 | * @clk: clock source | ||
281 | * @rate: desired clock rate in Hz | ||
282 | * | ||
283 | * Returns success (0) or negative errno. | ||
284 | */ | ||
285 | int clk_set_rate(struct clk *clk, unsigned long rate) | ||
286 | { | ||
287 | unsigned long flags; | ||
288 | int ret = -EINVAL; | ||
289 | |||
290 | if (!clk || !rate) | ||
291 | return -EFAULT; | ||
292 | |||
293 | if (clk->set_rate) { | ||
294 | spin_lock_irqsave(&clocks_lock, flags); | ||
295 | ret = clk->set_rate(clk, rate); | ||
296 | if (!ret) | ||
297 | /* if successful -> propagate */ | ||
298 | propagate_rate(clk, 0); | ||
299 | spin_unlock_irqrestore(&clocks_lock, flags); | ||
300 | } else if (clk->pclk) { | ||
301 | u32 mult = clk->div_factor ? clk->div_factor : 1; | ||
302 | ret = clk_set_rate(clk->pclk, mult * rate); | ||
303 | } | ||
304 | |||
305 | return ret; | ||
306 | } | ||
307 | EXPORT_SYMBOL(clk_set_rate); | ||
308 | |||
309 | /* registers clock in platform clock framework */ | ||
310 | void clk_register(struct clk_lookup *cl) | ||
311 | { | ||
312 | struct clk *clk; | ||
313 | unsigned long flags; | ||
314 | |||
315 | if (!cl || !cl->clk) | ||
316 | return; | ||
317 | clk = cl->clk; | ||
318 | |||
319 | spin_lock_irqsave(&clocks_lock, flags); | ||
320 | |||
321 | INIT_LIST_HEAD(&clk->children); | ||
322 | if (clk->flags & ALWAYS_ENABLED) | ||
323 | clk->ops = NULL; | ||
324 | else if (!clk->ops) | ||
325 | clk->ops = &generic_clkops; | ||
326 | |||
327 | /* root clock don't have any parents */ | ||
328 | if (!clk->pclk && !clk->pclk_sel) { | ||
329 | list_add(&clk->sibling, &root_clks); | ||
330 | } else if (clk->pclk && !clk->pclk_sel) { | ||
331 | /* add clocks with only one parent to parent's children list */ | ||
332 | list_add(&clk->sibling, &clk->pclk->children); | ||
333 | } else { | ||
334 | /* clocks with more than one parent */ | ||
335 | struct pclk_info *pclk_info; | ||
336 | |||
337 | pclk_info = pclk_info_get(clk); | ||
338 | if (!pclk_info) { | ||
339 | pr_err("CLKDEV: invalid pclk info of clk with" | ||
340 | " %s dev_id and %s con_id\n", | ||
341 | cl->dev_id, cl->con_id); | ||
342 | } else { | ||
343 | clk->pclk = pclk_info->pclk; | ||
344 | list_add(&clk->sibling, &pclk_info->pclk->children); | ||
345 | } | ||
346 | } | ||
347 | |||
348 | spin_unlock_irqrestore(&clocks_lock, flags); | ||
349 | |||
350 | /* debugfs specific */ | ||
351 | #ifdef CONFIG_DEBUG_FS | ||
352 | list_add(&clk->node, &clocks); | ||
353 | clk->cl = cl; | ||
354 | #endif | ||
355 | |||
356 | /* add clock to arm clockdev framework */ | ||
357 | clkdev_add(cl); | ||
358 | } | ||
359 | |||
360 | /** | ||
361 | * propagate_rate - recalculate and propagate all clocks to children | ||
362 | * @pclk: parent clock required to be propogated | ||
363 | * @on_init: flag for enabling clocks which are ENABLED_ON_INIT. | ||
364 | * | ||
365 | * Recalculates all children clocks | ||
366 | */ | ||
367 | void propagate_rate(struct clk *pclk, int on_init) | ||
368 | { | ||
369 | struct clk *clk, *_temp; | ||
370 | int ret = 0; | ||
371 | |||
372 | list_for_each_entry_safe(clk, _temp, &pclk->children, sibling) { | ||
373 | if (clk->recalc) { | ||
374 | ret = clk->recalc(clk); | ||
375 | /* | ||
376 | * recalc will return error if clk out is not programmed | ||
377 | * In this case configure default rate. | ||
378 | */ | ||
379 | if (ret && clk->set_rate) | ||
380 | clk->set_rate(clk, 0); | ||
381 | } | ||
382 | propagate_rate(clk, on_init); | ||
383 | |||
384 | if (!on_init) | ||
385 | continue; | ||
386 | |||
387 | /* Enable clks enabled on init, in software view */ | ||
388 | if (clk->flags & ENABLED_ON_INIT) | ||
389 | do_clk_enable(clk); | ||
390 | } | ||
391 | } | ||
392 | |||
393 | /** | ||
394 | * round_rate_index - return closest programmable rate index in rate_config tbl | ||
395 | * @clk: ptr to clock structure | ||
396 | * @drate: desired rate | ||
397 | * @rate: final rate will be returned in this variable only. | ||
398 | * | ||
399 | * Finds index in rate_config for highest clk rate which is less than | ||
400 | * requested rate. If there is no clk rate lesser than requested rate then | ||
401 | * -EINVAL is returned. This routine assumes that rate_config is written | ||
402 | * in incrementing order of clk rates. | ||
403 | * If drate passed is zero then default rate is programmed. | ||
404 | */ | ||
405 | static int | ||
406 | round_rate_index(struct clk *clk, unsigned long drate, unsigned long *rate) | ||
407 | { | ||
408 | unsigned long tmp = 0, prev_rate = 0; | ||
409 | int index; | ||
410 | |||
411 | if (!clk->calc_rate) | ||
412 | return -EFAULT; | ||
413 | |||
414 | if (!drate) | ||
415 | return -EINVAL; | ||
416 | |||
417 | /* | ||
418 | * This loops ends on two conditions: | ||
419 | * - as soon as clk is found with rate greater than requested rate. | ||
420 | * - if all clks in rate_config are smaller than requested rate. | ||
421 | */ | ||
422 | for (index = 0; index < clk->rate_config.count; index++) { | ||
423 | prev_rate = tmp; | ||
424 | tmp = clk->calc_rate(clk, index); | ||
425 | if (drate < tmp) { | ||
426 | index--; | ||
427 | break; | ||
428 | } | ||
429 | } | ||
430 | /* return if can't find suitable clock */ | ||
431 | if (index < 0) { | ||
432 | index = -EINVAL; | ||
433 | *rate = 0; | ||
434 | } else if (index == clk->rate_config.count) { | ||
435 | /* program with highest clk rate possible */ | ||
436 | index = clk->rate_config.count - 1; | ||
437 | *rate = tmp; | ||
438 | } else | ||
439 | *rate = prev_rate; | ||
440 | |||
441 | return index; | ||
442 | } | ||
443 | |||
444 | /** | ||
445 | * clk_round_rate - adjust a rate to the exact rate a clock can provide | ||
446 | * @clk: clock source | ||
447 | * @rate: desired clock rate in Hz | ||
448 | * | ||
449 | * Returns rounded clock rate in Hz, or negative errno. | ||
450 | */ | ||
451 | long clk_round_rate(struct clk *clk, unsigned long drate) | ||
452 | { | ||
453 | long rate = 0; | ||
454 | int index; | ||
455 | |||
456 | /* | ||
457 | * propagate call to parent who supports calc_rate. Similar approach is | ||
458 | * used in clk_set_rate. | ||
459 | */ | ||
460 | if (!clk->calc_rate) { | ||
461 | u32 mult; | ||
462 | if (!clk->pclk) | ||
463 | return clk->rate; | ||
464 | |||
465 | mult = clk->div_factor ? clk->div_factor : 1; | ||
466 | return clk_round_rate(clk->pclk, mult * drate) / mult; | ||
467 | } | ||
468 | |||
469 | index = round_rate_index(clk, drate, &rate); | ||
470 | if (index >= 0) | ||
471 | return rate; | ||
472 | else | ||
473 | return index; | ||
474 | } | ||
475 | EXPORT_SYMBOL(clk_round_rate); | ||
476 | |||
477 | /*All below functions are called with lock held */ | ||
478 | |||
479 | /* | ||
480 | * Calculates pll clk rate for specific value of mode, m, n and p | ||
481 | * | ||
482 | * In normal mode | ||
483 | * rate = (2 * M[15:8] * Fin)/(N * 2^P) | ||
484 | * | ||
485 | * In Dithered mode | ||
486 | * rate = (2 * M[15:0] * Fin)/(256 * N * 2^P) | ||
487 | */ | ||
488 | unsigned long pll_calc_rate(struct clk *clk, int index) | ||
489 | { | ||
490 | unsigned long rate = clk->pclk->rate; | ||
491 | struct pll_rate_tbl *tbls = clk->rate_config.tbls; | ||
492 | unsigned int mode; | ||
493 | |||
494 | mode = tbls[index].mode ? 256 : 1; | ||
495 | return (((2 * rate / 10000) * tbls[index].m) / | ||
496 | (mode * tbls[index].n * (1 << tbls[index].p))) * 10000; | ||
497 | } | ||
498 | |||
499 | /* | ||
500 | * calculates current programmed rate of pll1 | ||
501 | * | ||
502 | * In normal mode | ||
503 | * rate = (2 * M[15:8] * Fin)/(N * 2^P) | ||
504 | * | ||
505 | * In Dithered mode | ||
506 | * rate = (2 * M[15:0] * Fin)/(256 * N * 2^P) | ||
507 | */ | ||
508 | int pll_clk_recalc(struct clk *clk) | ||
509 | { | ||
510 | struct pll_clk_config *config = clk->private_data; | ||
511 | unsigned int num = 2, den = 0, val, mode = 0; | ||
512 | |||
513 | mode = (readl(config->mode_reg) >> config->masks->mode_shift) & | ||
514 | config->masks->mode_mask; | ||
515 | |||
516 | val = readl(config->cfg_reg); | ||
517 | /* calculate denominator */ | ||
518 | den = (val >> config->masks->div_p_shift) & config->masks->div_p_mask; | ||
519 | den = 1 << den; | ||
520 | den *= (val >> config->masks->div_n_shift) & config->masks->div_n_mask; | ||
521 | |||
522 | /* calculate numerator & denominator */ | ||
523 | if (!mode) { | ||
524 | /* Normal mode */ | ||
525 | num *= (val >> config->masks->norm_fdbk_m_shift) & | ||
526 | config->masks->norm_fdbk_m_mask; | ||
527 | } else { | ||
528 | /* Dithered mode */ | ||
529 | num *= (val >> config->masks->dith_fdbk_m_shift) & | ||
530 | config->masks->dith_fdbk_m_mask; | ||
531 | den *= 256; | ||
532 | } | ||
533 | |||
534 | if (!den) | ||
535 | return -EINVAL; | ||
536 | |||
537 | clk->rate = (((clk->pclk->rate/10000) * num) / den) * 10000; | ||
538 | return 0; | ||
539 | } | ||
540 | |||
541 | /* | ||
542 | * Configures new clock rate of pll | ||
543 | */ | ||
544 | int pll_clk_set_rate(struct clk *clk, unsigned long desired_rate) | ||
545 | { | ||
546 | struct pll_rate_tbl *tbls = clk->rate_config.tbls; | ||
547 | struct pll_clk_config *config = clk->private_data; | ||
548 | unsigned long val, rate; | ||
549 | int i; | ||
550 | |||
551 | i = round_rate_index(clk, desired_rate, &rate); | ||
552 | if (i < 0) | ||
553 | return i; | ||
554 | |||
555 | val = readl(config->mode_reg) & | ||
556 | ~(config->masks->mode_mask << config->masks->mode_shift); | ||
557 | val |= (tbls[i].mode & config->masks->mode_mask) << | ||
558 | config->masks->mode_shift; | ||
559 | writel(val, config->mode_reg); | ||
560 | |||
561 | val = readl(config->cfg_reg) & | ||
562 | ~(config->masks->div_p_mask << config->masks->div_p_shift); | ||
563 | val |= (tbls[i].p & config->masks->div_p_mask) << | ||
564 | config->masks->div_p_shift; | ||
565 | val &= ~(config->masks->div_n_mask << config->masks->div_n_shift); | ||
566 | val |= (tbls[i].n & config->masks->div_n_mask) << | ||
567 | config->masks->div_n_shift; | ||
568 | val &= ~(config->masks->dith_fdbk_m_mask << | ||
569 | config->masks->dith_fdbk_m_shift); | ||
570 | if (tbls[i].mode) | ||
571 | val |= (tbls[i].m & config->masks->dith_fdbk_m_mask) << | ||
572 | config->masks->dith_fdbk_m_shift; | ||
573 | else | ||
574 | val |= (tbls[i].m & config->masks->norm_fdbk_m_mask) << | ||
575 | config->masks->norm_fdbk_m_shift; | ||
576 | |||
577 | writel(val, config->cfg_reg); | ||
578 | |||
579 | clk->rate = rate; | ||
580 | |||
581 | return 0; | ||
582 | } | ||
583 | |||
584 | /* | ||
585 | * Calculates ahb, apb clk rate for specific value of div | ||
586 | */ | ||
587 | unsigned long bus_calc_rate(struct clk *clk, int index) | ||
588 | { | ||
589 | unsigned long rate = clk->pclk->rate; | ||
590 | struct bus_rate_tbl *tbls = clk->rate_config.tbls; | ||
591 | |||
592 | return rate / (tbls[index].div + 1); | ||
593 | } | ||
594 | |||
595 | /* calculates current programmed rate of ahb or apb bus */ | ||
596 | int bus_clk_recalc(struct clk *clk) | ||
597 | { | ||
598 | struct bus_clk_config *config = clk->private_data; | ||
599 | unsigned int div; | ||
600 | |||
601 | div = ((readl(config->reg) >> config->masks->shift) & | ||
602 | config->masks->mask) + 1; | ||
603 | |||
604 | if (!div) | ||
605 | return -EINVAL; | ||
606 | |||
607 | clk->rate = (unsigned long)clk->pclk->rate / div; | ||
608 | return 0; | ||
609 | } | ||
610 | |||
611 | /* Configures new clock rate of AHB OR APB bus */ | ||
612 | int bus_clk_set_rate(struct clk *clk, unsigned long desired_rate) | ||
613 | { | ||
614 | struct bus_rate_tbl *tbls = clk->rate_config.tbls; | ||
615 | struct bus_clk_config *config = clk->private_data; | ||
616 | unsigned long val, rate; | ||
617 | int i; | ||
618 | |||
619 | i = round_rate_index(clk, desired_rate, &rate); | ||
620 | if (i < 0) | ||
621 | return i; | ||
622 | |||
623 | val = readl(config->reg) & | ||
624 | ~(config->masks->mask << config->masks->shift); | ||
625 | val |= (tbls[i].div & config->masks->mask) << config->masks->shift; | ||
626 | writel(val, config->reg); | ||
627 | |||
628 | clk->rate = rate; | ||
629 | |||
630 | return 0; | ||
631 | } | ||
632 | |||
633 | /* | ||
634 | * gives rate for different values of eq, x and y | ||
635 | * | ||
636 | * Fout from synthesizer can be given from two equations: | ||
637 | * Fout1 = (Fin * X/Y)/2 EQ1 | ||
638 | * Fout2 = Fin * X/Y EQ2 | ||
639 | */ | ||
640 | unsigned long aux_calc_rate(struct clk *clk, int index) | ||
641 | { | ||
642 | unsigned long rate = clk->pclk->rate; | ||
643 | struct aux_rate_tbl *tbls = clk->rate_config.tbls; | ||
644 | u8 eq = tbls[index].eq ? 1 : 2; | ||
645 | |||
646 | return (((rate/10000) * tbls[index].xscale) / | ||
647 | (tbls[index].yscale * eq)) * 10000; | ||
648 | } | ||
649 | |||
650 | /* | ||
651 | * calculates current programmed rate of auxiliary synthesizers | ||
652 | * used by: UART, FIRDA | ||
653 | * | ||
654 | * Fout from synthesizer can be given from two equations: | ||
655 | * Fout1 = (Fin * X/Y)/2 | ||
656 | * Fout2 = Fin * X/Y | ||
657 | * | ||
658 | * Selection of eqn 1 or 2 is programmed in register | ||
659 | */ | ||
660 | int aux_clk_recalc(struct clk *clk) | ||
661 | { | ||
662 | struct aux_clk_config *config = clk->private_data; | ||
663 | unsigned int num = 1, den = 1, val, eqn; | ||
664 | |||
665 | val = readl(config->synth_reg); | ||
666 | |||
667 | eqn = (val >> config->masks->eq_sel_shift) & | ||
668 | config->masks->eq_sel_mask; | ||
669 | if (eqn == config->masks->eq1_mask) | ||
670 | den *= 2; | ||
671 | |||
672 | /* calculate numerator */ | ||
673 | num = (val >> config->masks->xscale_sel_shift) & | ||
674 | config->masks->xscale_sel_mask; | ||
675 | |||
676 | /* calculate denominator */ | ||
677 | den *= (val >> config->masks->yscale_sel_shift) & | ||
678 | config->masks->yscale_sel_mask; | ||
679 | |||
680 | if (!den) | ||
681 | return -EINVAL; | ||
682 | |||
683 | clk->rate = (((clk->pclk->rate/10000) * num) / den) * 10000; | ||
684 | return 0; | ||
685 | } | ||
686 | |||
687 | /* Configures new clock rate of auxiliary synthesizers used by: UART, FIRDA*/ | ||
688 | int aux_clk_set_rate(struct clk *clk, unsigned long desired_rate) | ||
689 | { | ||
690 | struct aux_rate_tbl *tbls = clk->rate_config.tbls; | ||
691 | struct aux_clk_config *config = clk->private_data; | ||
692 | unsigned long val, rate; | ||
693 | int i; | ||
694 | |||
695 | i = round_rate_index(clk, desired_rate, &rate); | ||
696 | if (i < 0) | ||
697 | return i; | ||
698 | |||
699 | val = readl(config->synth_reg) & | ||
700 | ~(config->masks->eq_sel_mask << config->masks->eq_sel_shift); | ||
701 | val |= (tbls[i].eq & config->masks->eq_sel_mask) << | ||
702 | config->masks->eq_sel_shift; | ||
703 | val &= ~(config->masks->xscale_sel_mask << | ||
704 | config->masks->xscale_sel_shift); | ||
705 | val |= (tbls[i].xscale & config->masks->xscale_sel_mask) << | ||
706 | config->masks->xscale_sel_shift; | ||
707 | val &= ~(config->masks->yscale_sel_mask << | ||
708 | config->masks->yscale_sel_shift); | ||
709 | val |= (tbls[i].yscale & config->masks->yscale_sel_mask) << | ||
710 | config->masks->yscale_sel_shift; | ||
711 | writel(val, config->synth_reg); | ||
712 | |||
713 | clk->rate = rate; | ||
714 | |||
715 | return 0; | ||
716 | } | ||
717 | |||
718 | /* | ||
719 | * Calculates gpt clk rate for different values of mscale and nscale | ||
720 | * | ||
721 | * Fout= Fin/((2 ^ (N+1)) * (M+1)) | ||
722 | */ | ||
723 | unsigned long gpt_calc_rate(struct clk *clk, int index) | ||
724 | { | ||
725 | unsigned long rate = clk->pclk->rate; | ||
726 | struct gpt_rate_tbl *tbls = clk->rate_config.tbls; | ||
727 | |||
728 | return rate / ((1 << (tbls[index].nscale + 1)) * | ||
729 | (tbls[index].mscale + 1)); | ||
730 | } | ||
731 | |||
732 | /* | ||
733 | * calculates current programmed rate of gpt synthesizers | ||
734 | * Fout from synthesizer can be given from below equations: | ||
735 | * Fout= Fin/((2 ^ (N+1)) * (M+1)) | ||
736 | */ | ||
737 | int gpt_clk_recalc(struct clk *clk) | ||
738 | { | ||
739 | struct gpt_clk_config *config = clk->private_data; | ||
740 | unsigned int div = 1, val; | ||
741 | |||
742 | val = readl(config->synth_reg); | ||
743 | div += (val >> config->masks->mscale_sel_shift) & | ||
744 | config->masks->mscale_sel_mask; | ||
745 | div *= 1 << (((val >> config->masks->nscale_sel_shift) & | ||
746 | config->masks->nscale_sel_mask) + 1); | ||
747 | |||
748 | if (!div) | ||
749 | return -EINVAL; | ||
750 | |||
751 | clk->rate = (unsigned long)clk->pclk->rate / div; | ||
752 | return 0; | ||
753 | } | ||
754 | |||
755 | /* Configures new clock rate of gptiliary synthesizers used by: UART, FIRDA*/ | ||
756 | int gpt_clk_set_rate(struct clk *clk, unsigned long desired_rate) | ||
757 | { | ||
758 | struct gpt_rate_tbl *tbls = clk->rate_config.tbls; | ||
759 | struct gpt_clk_config *config = clk->private_data; | ||
760 | unsigned long val, rate; | ||
761 | int i; | ||
762 | |||
763 | i = round_rate_index(clk, desired_rate, &rate); | ||
764 | if (i < 0) | ||
765 | return i; | ||
766 | |||
767 | val = readl(config->synth_reg) & ~(config->masks->mscale_sel_mask << | ||
768 | config->masks->mscale_sel_shift); | ||
769 | val |= (tbls[i].mscale & config->masks->mscale_sel_mask) << | ||
770 | config->masks->mscale_sel_shift; | ||
771 | val &= ~(config->masks->nscale_sel_mask << | ||
772 | config->masks->nscale_sel_shift); | ||
773 | val |= (tbls[i].nscale & config->masks->nscale_sel_mask) << | ||
774 | config->masks->nscale_sel_shift; | ||
775 | writel(val, config->synth_reg); | ||
776 | |||
777 | clk->rate = rate; | ||
778 | |||
779 | return 0; | ||
780 | } | ||
781 | |||
782 | /* | ||
783 | * Calculates clcd clk rate for different values of div | ||
784 | * | ||
785 | * Fout from synthesizer can be given from below equation: | ||
786 | * Fout= Fin/2*div (division factor) | ||
787 | * div is 17 bits:- | ||
788 | * 0-13 (fractional part) | ||
789 | * 14-16 (integer part) | ||
790 | * To calculate Fout we left shift val by 14 bits and divide Fin by | ||
791 | * complete div (including fractional part) and then right shift the | ||
792 | * result by 14 places. | ||
793 | */ | ||
794 | unsigned long clcd_calc_rate(struct clk *clk, int index) | ||
795 | { | ||
796 | unsigned long rate = clk->pclk->rate; | ||
797 | struct clcd_rate_tbl *tbls = clk->rate_config.tbls; | ||
798 | |||
799 | rate /= 1000; | ||
800 | rate <<= 12; | ||
801 | rate /= (2 * tbls[index].div); | ||
802 | rate >>= 12; | ||
803 | rate *= 1000; | ||
804 | |||
805 | return rate; | ||
806 | } | ||
807 | |||
808 | /* | ||
809 | * calculates current programmed rate of clcd synthesizer | ||
810 | * Fout from synthesizer can be given from below equation: | ||
811 | * Fout= Fin/2*div (division factor) | ||
812 | * div is 17 bits:- | ||
813 | * 0-13 (fractional part) | ||
814 | * 14-16 (integer part) | ||
815 | * To calculate Fout we left shift val by 14 bits and divide Fin by | ||
816 | * complete div (including fractional part) and then right shift the | ||
817 | * result by 14 places. | ||
818 | */ | ||
819 | int clcd_clk_recalc(struct clk *clk) | ||
820 | { | ||
821 | struct clcd_clk_config *config = clk->private_data; | ||
822 | unsigned int div = 1; | ||
823 | unsigned long prate; | ||
824 | unsigned int val; | ||
825 | |||
826 | val = readl(config->synth_reg); | ||
827 | div = (val >> config->masks->div_factor_shift) & | ||
828 | config->masks->div_factor_mask; | ||
829 | |||
830 | if (!div) | ||
831 | return -EINVAL; | ||
832 | |||
833 | prate = clk->pclk->rate / 1000; /* first level division, make it KHz */ | ||
834 | |||
835 | clk->rate = (((unsigned long)prate << 12) / (2 * div)) >> 12; | ||
836 | clk->rate *= 1000; | ||
837 | return 0; | ||
838 | } | ||
839 | |||
840 | /* Configures new clock rate of auxiliary synthesizers used by: UART, FIRDA*/ | ||
841 | int clcd_clk_set_rate(struct clk *clk, unsigned long desired_rate) | ||
842 | { | ||
843 | struct clcd_rate_tbl *tbls = clk->rate_config.tbls; | ||
844 | struct clcd_clk_config *config = clk->private_data; | ||
845 | unsigned long val, rate; | ||
846 | int i; | ||
847 | |||
848 | i = round_rate_index(clk, desired_rate, &rate); | ||
849 | if (i < 0) | ||
850 | return i; | ||
851 | |||
852 | val = readl(config->synth_reg) & ~(config->masks->div_factor_mask << | ||
853 | config->masks->div_factor_shift); | ||
854 | val |= (tbls[i].div & config->masks->div_factor_mask) << | ||
855 | config->masks->div_factor_shift; | ||
856 | writel(val, config->synth_reg); | ||
857 | |||
858 | clk->rate = rate; | ||
859 | |||
860 | return 0; | ||
861 | } | ||
862 | |||
863 | /* | ||
864 | * Used for clocks that always have value as the parent clock divided by a | ||
865 | * fixed divisor | ||
866 | */ | ||
867 | int follow_parent(struct clk *clk) | ||
868 | { | ||
869 | unsigned int div_factor = (clk->div_factor < 1) ? 1 : clk->div_factor; | ||
870 | |||
871 | clk->rate = clk->pclk->rate/div_factor; | ||
872 | return 0; | ||
873 | } | ||
874 | |||
875 | /** | ||
876 | * recalc_root_clocks - recalculate and propagate all root clocks | ||
877 | * | ||
878 | * Recalculates all root clocks (clocks with no parent), which if the | ||
879 | * clock's .recalc is set correctly, should also propagate their rates. | ||
880 | */ | ||
881 | void recalc_root_clocks(void) | ||
882 | { | ||
883 | struct clk *pclk; | ||
884 | unsigned long flags; | ||
885 | int ret = 0; | ||
886 | |||
887 | spin_lock_irqsave(&clocks_lock, flags); | ||
888 | list_for_each_entry(pclk, &root_clks, sibling) { | ||
889 | if (pclk->recalc) { | ||
890 | ret = pclk->recalc(pclk); | ||
891 | /* | ||
892 | * recalc will return error if clk out is not programmed | ||
893 | * In this case configure default clock. | ||
894 | */ | ||
895 | if (ret && pclk->set_rate) | ||
896 | pclk->set_rate(pclk, 0); | ||
897 | } | ||
898 | propagate_rate(pclk, 1); | ||
899 | /* Enable clks enabled on init, in software view */ | ||
900 | if (pclk->flags & ENABLED_ON_INIT) | ||
901 | do_clk_enable(pclk); | ||
902 | } | ||
903 | spin_unlock_irqrestore(&clocks_lock, flags); | ||
904 | } | ||
905 | |||
906 | void __init clk_init(void) | ||
907 | { | ||
908 | recalc_root_clocks(); | ||
909 | } | ||
910 | |||
911 | #ifdef CONFIG_DEBUG_FS | ||
912 | /* | ||
913 | * debugfs support to trace clock tree hierarchy and attributes | ||
914 | */ | ||
915 | static struct dentry *clk_debugfs_root; | ||
916 | static int clk_debugfs_register_one(struct clk *c) | ||
917 | { | ||
918 | int err; | ||
919 | struct dentry *d; | ||
920 | struct clk *pa = c->pclk; | ||
921 | char s[255]; | ||
922 | char *p = s; | ||
923 | |||
924 | if (c) { | ||
925 | if (c->cl->con_id) | ||
926 | p += sprintf(p, "%s", c->cl->con_id); | ||
927 | if (c->cl->dev_id) | ||
928 | p += sprintf(p, "%s", c->cl->dev_id); | ||
929 | } | ||
930 | d = debugfs_create_dir(s, pa ? pa->dent : clk_debugfs_root); | ||
931 | if (!d) | ||
932 | return -ENOMEM; | ||
933 | c->dent = d; | ||
934 | |||
935 | d = debugfs_create_u32("usage_count", S_IRUGO, c->dent, | ||
936 | (u32 *)&c->usage_count); | ||
937 | if (!d) { | ||
938 | err = -ENOMEM; | ||
939 | goto err_out; | ||
940 | } | ||
941 | d = debugfs_create_u32("rate", S_IRUGO, c->dent, (u32 *)&c->rate); | ||
942 | if (!d) { | ||
943 | err = -ENOMEM; | ||
944 | goto err_out; | ||
945 | } | ||
946 | d = debugfs_create_x32("flags", S_IRUGO, c->dent, (u32 *)&c->flags); | ||
947 | if (!d) { | ||
948 | err = -ENOMEM; | ||
949 | goto err_out; | ||
950 | } | ||
951 | return 0; | ||
952 | |||
953 | err_out: | ||
954 | debugfs_remove_recursive(c->dent); | ||
955 | return err; | ||
956 | } | ||
957 | |||
958 | static int clk_debugfs_register(struct clk *c) | ||
959 | { | ||
960 | int err; | ||
961 | struct clk *pa = c->pclk; | ||
962 | |||
963 | if (pa && !pa->dent) { | ||
964 | err = clk_debugfs_register(pa); | ||
965 | if (err) | ||
966 | return err; | ||
967 | } | ||
968 | |||
969 | if (!c->dent) { | ||
970 | err = clk_debugfs_register_one(c); | ||
971 | if (err) | ||
972 | return err; | ||
973 | } | ||
974 | return 0; | ||
975 | } | ||
976 | |||
977 | static int __init clk_debugfs_init(void) | ||
978 | { | ||
979 | struct clk *c; | ||
980 | struct dentry *d; | ||
981 | int err; | ||
982 | |||
983 | d = debugfs_create_dir("clock", NULL); | ||
984 | if (!d) | ||
985 | return -ENOMEM; | ||
986 | clk_debugfs_root = d; | ||
987 | |||
988 | list_for_each_entry(c, &clocks, node) { | ||
989 | err = clk_debugfs_register(c); | ||
990 | if (err) | ||
991 | goto err_out; | ||
992 | } | ||
993 | return 0; | ||
994 | err_out: | ||
995 | debugfs_remove_recursive(clk_debugfs_root); | ||
996 | return err; | ||
997 | } | ||
998 | late_initcall(clk_debugfs_init); | ||
999 | |||
1000 | static int clk_debugfs_reparent(struct clk *c) | ||
1001 | { | ||
1002 | debugfs_remove(c->dent); | ||
1003 | return clk_debugfs_register_one(c); | ||
1004 | } | ||
1005 | #endif /* CONFIG_DEBUG_FS */ | ||
diff --git a/arch/arm/plat-spear/include/plat/clock.h b/arch/arm/plat-spear/include/plat/clock.h deleted file mode 100644 index 0062bafef12d..000000000000 --- a/arch/arm/plat-spear/include/plat/clock.h +++ /dev/null | |||
@@ -1,249 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/plat-spear/include/plat/clock.h | ||
3 | * | ||
4 | * Clock framework definitions for SPEAr platform | ||
5 | * | ||
6 | * Copyright (C) 2009 ST Microelectronics | ||
7 | * Viresh Kumar<viresh.kumar@st.com> | ||
8 | * | ||
9 | * This file is licensed under the terms of the GNU General Public | ||
10 | * License version 2. This program is licensed "as is" without any | ||
11 | * warranty of any kind, whether express or implied. | ||
12 | */ | ||
13 | |||
14 | #ifndef __PLAT_CLOCK_H | ||
15 | #define __PLAT_CLOCK_H | ||
16 | |||
17 | #include <linux/list.h> | ||
18 | #include <linux/clkdev.h> | ||
19 | #include <linux/types.h> | ||
20 | |||
21 | /* clk structure flags */ | ||
22 | #define ALWAYS_ENABLED (1 << 0) /* clock always enabled */ | ||
23 | #define RESET_TO_ENABLE (1 << 1) /* reset register bit to enable clk */ | ||
24 | #define ENABLED_ON_INIT (1 << 2) /* clocks enabled at init */ | ||
25 | |||
26 | /** | ||
27 | * struct clkops - clock operations | ||
28 | * @enable: pointer to clock enable function | ||
29 | * @disable: pointer to clock disable function | ||
30 | */ | ||
31 | struct clkops { | ||
32 | int (*enable) (struct clk *); | ||
33 | void (*disable) (struct clk *); | ||
34 | }; | ||
35 | |||
36 | /** | ||
37 | * struct pclk_info - parents info | ||
38 | * @pclk: pointer to parent clk | ||
39 | * @pclk_val: value to be written for selecting this parent | ||
40 | */ | ||
41 | struct pclk_info { | ||
42 | struct clk *pclk; | ||
43 | u8 pclk_val; | ||
44 | }; | ||
45 | |||
46 | /** | ||
47 | * struct pclk_sel - parents selection configuration | ||
48 | * @pclk_info: pointer to array of parent clock info | ||
49 | * @pclk_count: number of parents | ||
50 | * @pclk_sel_reg: register for selecting a parent | ||
51 | * @pclk_sel_mask: mask for selecting parent (can be used to clear bits also) | ||
52 | */ | ||
53 | struct pclk_sel { | ||
54 | struct pclk_info *pclk_info; | ||
55 | u8 pclk_count; | ||
56 | void __iomem *pclk_sel_reg; | ||
57 | unsigned int pclk_sel_mask; | ||
58 | }; | ||
59 | |||
60 | /** | ||
61 | * struct rate_config - clk rate configurations | ||
62 | * @tbls: array of device specific clk rate tables, in ascending order of rates | ||
63 | * @count: size of tbls array | ||
64 | * @default_index: default setting when originally disabled | ||
65 | */ | ||
66 | struct rate_config { | ||
67 | void *tbls; | ||
68 | u8 count; | ||
69 | u8 default_index; | ||
70 | }; | ||
71 | |||
72 | /** | ||
73 | * struct clk - clock structure | ||
74 | * @usage_count: num of users who enabled this clock | ||
75 | * @flags: flags for clock properties | ||
76 | * @rate: programmed clock rate in Hz | ||
77 | * @en_reg: clk enable/disable reg | ||
78 | * @en_reg_bit: clk enable/disable bit | ||
79 | * @ops: clk enable/disable ops - generic_clkops selected if NULL | ||
80 | * @recalc: pointer to clock rate recalculate function | ||
81 | * @set_rate: pointer to clock set rate function | ||
82 | * @calc_rate: pointer to clock get rate function for index | ||
83 | * @rate_config: rate configuration information, used by set_rate | ||
84 | * @div_factor: division factor to parent clock. | ||
85 | * @pclk: current parent clk | ||
86 | * @pclk_sel: pointer to parent selection structure | ||
87 | * @pclk_sel_shift: register shift for selecting parent of this clock | ||
88 | * @children: list for childrens or this clock | ||
89 | * @sibling: node for list of clocks having same parents | ||
90 | * @private_data: clock specific private data | ||
91 | * @node: list to maintain clocks linearly | ||
92 | * @cl: clocklook up associated with this clock | ||
93 | * @dent: object for debugfs | ||
94 | */ | ||
95 | struct clk { | ||
96 | unsigned int usage_count; | ||
97 | unsigned int flags; | ||
98 | unsigned long rate; | ||
99 | void __iomem *en_reg; | ||
100 | u8 en_reg_bit; | ||
101 | const struct clkops *ops; | ||
102 | int (*recalc) (struct clk *); | ||
103 | int (*set_rate) (struct clk *, unsigned long rate); | ||
104 | unsigned long (*calc_rate)(struct clk *, int index); | ||
105 | struct rate_config rate_config; | ||
106 | unsigned int div_factor; | ||
107 | |||
108 | struct clk *pclk; | ||
109 | struct pclk_sel *pclk_sel; | ||
110 | unsigned int pclk_sel_shift; | ||
111 | |||
112 | struct list_head children; | ||
113 | struct list_head sibling; | ||
114 | void *private_data; | ||
115 | #ifdef CONFIG_DEBUG_FS | ||
116 | struct list_head node; | ||
117 | struct clk_lookup *cl; | ||
118 | struct dentry *dent; | ||
119 | #endif | ||
120 | }; | ||
121 | |||
122 | /* pll configuration structure */ | ||
123 | struct pll_clk_masks { | ||
124 | u32 mode_mask; | ||
125 | u32 mode_shift; | ||
126 | |||
127 | u32 norm_fdbk_m_mask; | ||
128 | u32 norm_fdbk_m_shift; | ||
129 | u32 dith_fdbk_m_mask; | ||
130 | u32 dith_fdbk_m_shift; | ||
131 | u32 div_p_mask; | ||
132 | u32 div_p_shift; | ||
133 | u32 div_n_mask; | ||
134 | u32 div_n_shift; | ||
135 | }; | ||
136 | |||
137 | struct pll_clk_config { | ||
138 | void __iomem *mode_reg; | ||
139 | void __iomem *cfg_reg; | ||
140 | struct pll_clk_masks *masks; | ||
141 | }; | ||
142 | |||
143 | /* pll clk rate config structure */ | ||
144 | struct pll_rate_tbl { | ||
145 | u8 mode; | ||
146 | u16 m; | ||
147 | u8 n; | ||
148 | u8 p; | ||
149 | }; | ||
150 | |||
151 | /* ahb and apb bus configuration structure */ | ||
152 | struct bus_clk_masks { | ||
153 | u32 mask; | ||
154 | u32 shift; | ||
155 | }; | ||
156 | |||
157 | struct bus_clk_config { | ||
158 | void __iomem *reg; | ||
159 | struct bus_clk_masks *masks; | ||
160 | }; | ||
161 | |||
162 | /* ahb and apb clk bus rate config structure */ | ||
163 | struct bus_rate_tbl { | ||
164 | u8 div; | ||
165 | }; | ||
166 | |||
167 | /* Aux clk configuration structure: applicable to UART and FIRDA */ | ||
168 | struct aux_clk_masks { | ||
169 | u32 eq_sel_mask; | ||
170 | u32 eq_sel_shift; | ||
171 | u32 eq1_mask; | ||
172 | u32 eq2_mask; | ||
173 | u32 xscale_sel_mask; | ||
174 | u32 xscale_sel_shift; | ||
175 | u32 yscale_sel_mask; | ||
176 | u32 yscale_sel_shift; | ||
177 | }; | ||
178 | |||
179 | struct aux_clk_config { | ||
180 | void __iomem *synth_reg; | ||
181 | struct aux_clk_masks *masks; | ||
182 | }; | ||
183 | |||
184 | /* aux clk rate config structure */ | ||
185 | struct aux_rate_tbl { | ||
186 | u16 xscale; | ||
187 | u16 yscale; | ||
188 | u8 eq; | ||
189 | }; | ||
190 | |||
191 | /* GPT clk configuration structure */ | ||
192 | struct gpt_clk_masks { | ||
193 | u32 mscale_sel_mask; | ||
194 | u32 mscale_sel_shift; | ||
195 | u32 nscale_sel_mask; | ||
196 | u32 nscale_sel_shift; | ||
197 | }; | ||
198 | |||
199 | struct gpt_clk_config { | ||
200 | void __iomem *synth_reg; | ||
201 | struct gpt_clk_masks *masks; | ||
202 | }; | ||
203 | |||
204 | /* gpt clk rate config structure */ | ||
205 | struct gpt_rate_tbl { | ||
206 | u16 mscale; | ||
207 | u16 nscale; | ||
208 | }; | ||
209 | |||
210 | /* clcd clk configuration structure */ | ||
211 | struct clcd_synth_masks { | ||
212 | u32 div_factor_mask; | ||
213 | u32 div_factor_shift; | ||
214 | }; | ||
215 | |||
216 | struct clcd_clk_config { | ||
217 | void __iomem *synth_reg; | ||
218 | struct clcd_synth_masks *masks; | ||
219 | }; | ||
220 | |||
221 | /* clcd clk rate config structure */ | ||
222 | struct clcd_rate_tbl { | ||
223 | u16 div; | ||
224 | }; | ||
225 | |||
226 | /* platform specific clock functions */ | ||
227 | void __init clk_init(void); | ||
228 | void clk_register(struct clk_lookup *cl); | ||
229 | void recalc_root_clocks(void); | ||
230 | |||
231 | /* clock recalc & set rate functions */ | ||
232 | int follow_parent(struct clk *clk); | ||
233 | unsigned long pll_calc_rate(struct clk *clk, int index); | ||
234 | int pll_clk_recalc(struct clk *clk); | ||
235 | int pll_clk_set_rate(struct clk *clk, unsigned long desired_rate); | ||
236 | unsigned long bus_calc_rate(struct clk *clk, int index); | ||
237 | int bus_clk_recalc(struct clk *clk); | ||
238 | int bus_clk_set_rate(struct clk *clk, unsigned long desired_rate); | ||
239 | unsigned long gpt_calc_rate(struct clk *clk, int index); | ||
240 | int gpt_clk_recalc(struct clk *clk); | ||
241 | int gpt_clk_set_rate(struct clk *clk, unsigned long desired_rate); | ||
242 | unsigned long aux_calc_rate(struct clk *clk, int index); | ||
243 | int aux_clk_recalc(struct clk *clk); | ||
244 | int aux_clk_set_rate(struct clk *clk, unsigned long desired_rate); | ||
245 | unsigned long clcd_calc_rate(struct clk *clk, int index); | ||
246 | int clcd_clk_recalc(struct clk *clk); | ||
247 | int clcd_clk_set_rate(struct clk *clk, unsigned long desired_rate); | ||
248 | |||
249 | #endif /* __PLAT_CLOCK_H */ | ||
diff --git a/arch/arm/plat-spear/restart.c b/arch/arm/plat-spear/restart.c index 4471a232713a..ea0a61302b7e 100644 --- a/arch/arm/plat-spear/restart.c +++ b/arch/arm/plat-spear/restart.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <mach/spear.h> | 16 | #include <mach/spear.h> |
17 | #include <mach/generic.h> | 17 | #include <mach/generic.h> |
18 | 18 | ||
19 | #define SPEAR13XX_SYS_SW_RES (VA_MISC_BASE + 0x204) | ||
19 | void spear_restart(char mode, const char *cmd) | 20 | void spear_restart(char mode, const char *cmd) |
20 | { | 21 | { |
21 | if (mode == 's') { | 22 | if (mode == 's') { |
@@ -23,6 +24,10 @@ void spear_restart(char mode, const char *cmd) | |||
23 | soft_restart(0); | 24 | soft_restart(0); |
24 | } else { | 25 | } else { |
25 | /* hardware reset, Use on-chip reset capability */ | 26 | /* hardware reset, Use on-chip reset capability */ |
27 | #ifdef CONFIG_ARCH_SPEAR13XX | ||
28 | writel_relaxed(0x01, SPEAR13XX_SYS_SW_RES); | ||
29 | #else | ||
26 | sysctl_soft_reset((void __iomem *)VA_SPEAR_SYS_CTRL_BASE); | 30 | sysctl_soft_reset((void __iomem *)VA_SPEAR_SYS_CTRL_BASE); |
31 | #endif | ||
27 | } | 32 | } |
28 | } | 33 | } |
diff --git a/arch/arm/plat-spear/time.c b/arch/arm/plat-spear/time.c index a3164d1647fd..03321af5de9f 100644 --- a/arch/arm/plat-spear/time.c +++ b/arch/arm/plat-spear/time.c | |||
@@ -18,6 +18,8 @@ | |||
18 | #include <linux/ioport.h> | 18 | #include <linux/ioport.h> |
19 | #include <linux/io.h> | 19 | #include <linux/io.h> |
20 | #include <linux/kernel.h> | 20 | #include <linux/kernel.h> |
21 | #include <linux/of_irq.h> | ||
22 | #include <linux/of_address.h> | ||
21 | #include <linux/time.h> | 23 | #include <linux/time.h> |
22 | #include <linux/irq.h> | 24 | #include <linux/irq.h> |
23 | #include <asm/mach/time.h> | 25 | #include <asm/mach/time.h> |
@@ -197,19 +199,32 @@ static void __init spear_clockevent_init(int irq) | |||
197 | setup_irq(irq, &spear_timer_irq); | 199 | setup_irq(irq, &spear_timer_irq); |
198 | } | 200 | } |
199 | 201 | ||
200 | void __init spear_setup_timer(resource_size_t base, int irq) | 202 | const static struct of_device_id timer_of_match[] __initconst = { |
203 | { .compatible = "st,spear-timer", }, | ||
204 | { }, | ||
205 | }; | ||
206 | |||
207 | void __init spear_setup_of_timer(void) | ||
201 | { | 208 | { |
202 | int ret; | 209 | struct device_node *np; |
210 | int irq, ret; | ||
211 | |||
212 | np = of_find_matching_node(NULL, timer_of_match); | ||
213 | if (!np) { | ||
214 | pr_err("%s: No timer passed via DT\n", __func__); | ||
215 | return; | ||
216 | } | ||
203 | 217 | ||
204 | if (!request_mem_region(base, SZ_1K, "gpt0")) { | 218 | irq = irq_of_parse_and_map(np, 0); |
205 | pr_err("%s:cannot get IO addr\n", __func__); | 219 | if (!irq) { |
220 | pr_err("%s: No irq passed for timer via DT\n", __func__); | ||
206 | return; | 221 | return; |
207 | } | 222 | } |
208 | 223 | ||
209 | gpt_base = ioremap(base, SZ_1K); | 224 | gpt_base = of_iomap(np, 0); |
210 | if (!gpt_base) { | 225 | if (!gpt_base) { |
211 | pr_err("%s:ioremap failed for gpt\n", __func__); | 226 | pr_err("%s: of iomap failed\n", __func__); |
212 | goto err_mem; | 227 | return; |
213 | } | 228 | } |
214 | 229 | ||
215 | gpt_clk = clk_get_sys("gpt0", NULL); | 230 | gpt_clk = clk_get_sys("gpt0", NULL); |
@@ -218,10 +233,10 @@ void __init spear_setup_timer(resource_size_t base, int irq) | |||
218 | goto err_iomap; | 233 | goto err_iomap; |
219 | } | 234 | } |
220 | 235 | ||
221 | ret = clk_enable(gpt_clk); | 236 | ret = clk_prepare_enable(gpt_clk); |
222 | if (ret < 0) { | 237 | if (ret < 0) { |
223 | pr_err("%s:couldn't enable gpt clock\n", __func__); | 238 | pr_err("%s:couldn't prepare-enable gpt clock\n", __func__); |
224 | goto err_clk; | 239 | goto err_prepare_enable_clk; |
225 | } | 240 | } |
226 | 241 | ||
227 | spear_clockevent_init(irq); | 242 | spear_clockevent_init(irq); |
@@ -229,10 +244,8 @@ void __init spear_setup_timer(resource_size_t base, int irq) | |||
229 | 244 | ||
230 | return; | 245 | return; |
231 | 246 | ||
232 | err_clk: | 247 | err_prepare_enable_clk: |
233 | clk_put(gpt_clk); | 248 | clk_put(gpt_clk); |
234 | err_iomap: | 249 | err_iomap: |
235 | iounmap(gpt_base); | 250 | iounmap(gpt_base); |
236 | err_mem: | ||
237 | release_mem_region(base, SZ_1K); | ||
238 | } | 251 | } |