Commit 3126c7bc4106c572ef47e2c220df5a00e7973379
1 parent
2f7989efd4
Exists in
master
and in
7 other branches
ARM: AMBA: Add pclk definition for platforms using primecells
Add a dummy clk definition for the APB pclk signal on all platforms using the AMBA bus infrastructure. This ensures that these platforms continue to work when the core amba bus code controls the APB pclk. Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Showing 12 changed files with 66 additions and 12 deletions Inline Diff
- arch/arm/mach-bcmring/core.c
- arch/arm/mach-ep93xx/clock.c
- arch/arm/mach-integrator/core.c
- arch/arm/mach-nomadik/clock.c
- arch/arm/mach-omap2/clock3xxx_data.c
- arch/arm/mach-realview/core.c
- arch/arm/mach-spear3xx/clock.c
- arch/arm/mach-spear6xx/clock.c
- arch/arm/mach-u300/clock.c
- arch/arm/mach-ux500/clock.c
- arch/arm/mach-versatile/core.c
- arch/arm/mach-vexpress/v2m.c
arch/arm/mach-bcmring/core.c
1 | /* | 1 | /* |
2 | * derived from linux/arch/arm/mach-versatile/core.c | 2 | * derived from linux/arch/arm/mach-versatile/core.c |
3 | * linux/arch/arm/mach-bcmring/core.c | 3 | * linux/arch/arm/mach-bcmring/core.c |
4 | * | 4 | * |
5 | * Copyright (C) 1999 - 2003 ARM Limited | 5 | * Copyright (C) 1999 - 2003 ARM Limited |
6 | * Copyright (C) 2000 Deep Blue Solutions Ltd | 6 | * Copyright (C) 2000 Deep Blue Solutions Ltd |
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 as published by | 9 | * it under the terms of the GNU General Public License as published by |
10 | * the Free Software Foundation; either version 2 of the License, or | 10 | * the Free Software Foundation; either version 2 of the License, or |
11 | * (at your option) any later version. | 11 | * (at your option) any later version. |
12 | * | 12 | * |
13 | * This program is distributed in the hope that it will be useful, | 13 | * This program is distributed in the hope that it will be useful, |
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16 | * GNU General Public License for more details. | 16 | * GNU General Public License for more details. |
17 | * | 17 | * |
18 | * You should have received a copy of the GNU General Public License | 18 | * You should have received a copy of the GNU General Public License |
19 | * along with this program; if not, write to the Free Software | 19 | * along with this program; if not, write to the Free Software |
20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
21 | */ | 21 | */ |
22 | /* Portions copyright Broadcom 2008 */ | 22 | /* Portions copyright Broadcom 2008 */ |
23 | 23 | ||
24 | #include <linux/init.h> | 24 | #include <linux/init.h> |
25 | #include <linux/device.h> | 25 | #include <linux/device.h> |
26 | #include <linux/dma-mapping.h> | 26 | #include <linux/dma-mapping.h> |
27 | #include <linux/platform_device.h> | 27 | #include <linux/platform_device.h> |
28 | #include <linux/sysdev.h> | 28 | #include <linux/sysdev.h> |
29 | #include <linux/interrupt.h> | 29 | #include <linux/interrupt.h> |
30 | #include <linux/amba/bus.h> | 30 | #include <linux/amba/bus.h> |
31 | #include <linux/clocksource.h> | 31 | #include <linux/clocksource.h> |
32 | #include <linux/clockchips.h> | 32 | #include <linux/clockchips.h> |
33 | 33 | ||
34 | #include <mach/csp/mm_addr.h> | 34 | #include <mach/csp/mm_addr.h> |
35 | #include <mach/hardware.h> | 35 | #include <mach/hardware.h> |
36 | #include <asm/clkdev.h> | 36 | #include <asm/clkdev.h> |
37 | #include <linux/io.h> | 37 | #include <linux/io.h> |
38 | #include <asm/irq.h> | 38 | #include <asm/irq.h> |
39 | #include <asm/hardware/arm_timer.h> | 39 | #include <asm/hardware/arm_timer.h> |
40 | #include <asm/mach-types.h> | 40 | #include <asm/mach-types.h> |
41 | 41 | ||
42 | #include <asm/mach/arch.h> | 42 | #include <asm/mach/arch.h> |
43 | #include <asm/mach/flash.h> | 43 | #include <asm/mach/flash.h> |
44 | #include <asm/mach/irq.h> | 44 | #include <asm/mach/irq.h> |
45 | #include <asm/mach/time.h> | 45 | #include <asm/mach/time.h> |
46 | #include <asm/mach/map.h> | 46 | #include <asm/mach/map.h> |
47 | 47 | ||
48 | #include <cfg_global.h> | 48 | #include <cfg_global.h> |
49 | 49 | ||
50 | #include "clock.h" | 50 | #include "clock.h" |
51 | 51 | ||
52 | #include <csp/secHw.h> | 52 | #include <csp/secHw.h> |
53 | #include <mach/csp/secHw_def.h> | 53 | #include <mach/csp/secHw_def.h> |
54 | #include <mach/csp/chipcHw_inline.h> | 54 | #include <mach/csp/chipcHw_inline.h> |
55 | #include <mach/csp/tmrHw_reg.h> | 55 | #include <mach/csp/tmrHw_reg.h> |
56 | 56 | ||
57 | #define AMBA_DEVICE(name, initname, base, plat, size) \ | 57 | #define AMBA_DEVICE(name, initname, base, plat, size) \ |
58 | static struct amba_device name##_device = { \ | 58 | static struct amba_device name##_device = { \ |
59 | .dev = { \ | 59 | .dev = { \ |
60 | .coherent_dma_mask = ~0, \ | 60 | .coherent_dma_mask = ~0, \ |
61 | .init_name = initname, \ | 61 | .init_name = initname, \ |
62 | .platform_data = plat \ | 62 | .platform_data = plat \ |
63 | }, \ | 63 | }, \ |
64 | .res = { \ | 64 | .res = { \ |
65 | .start = MM_ADDR_IO_##base, \ | 65 | .start = MM_ADDR_IO_##base, \ |
66 | .end = MM_ADDR_IO_##base + (size) - 1, \ | 66 | .end = MM_ADDR_IO_##base + (size) - 1, \ |
67 | .flags = IORESOURCE_MEM \ | 67 | .flags = IORESOURCE_MEM \ |
68 | }, \ | 68 | }, \ |
69 | .dma_mask = ~0, \ | 69 | .dma_mask = ~0, \ |
70 | .irq = { \ | 70 | .irq = { \ |
71 | IRQ_##base \ | 71 | IRQ_##base \ |
72 | } \ | 72 | } \ |
73 | } | 73 | } |
74 | 74 | ||
75 | 75 | ||
76 | AMBA_DEVICE(uartA, "uarta", UARTA, NULL, SZ_4K); | 76 | AMBA_DEVICE(uartA, "uarta", UARTA, NULL, SZ_4K); |
77 | AMBA_DEVICE(uartB, "uartb", UARTB, NULL, SZ_4K); | 77 | AMBA_DEVICE(uartB, "uartb", UARTB, NULL, SZ_4K); |
78 | 78 | ||
79 | static struct clk pll1_clk = { | 79 | static struct clk pll1_clk = { |
80 | .name = "PLL1", | 80 | .name = "PLL1", |
81 | .type = CLK_TYPE_PRIMARY | CLK_TYPE_PLL1, | 81 | .type = CLK_TYPE_PRIMARY | CLK_TYPE_PLL1, |
82 | .rate_hz = 2000000000, | 82 | .rate_hz = 2000000000, |
83 | .use_cnt = 7, | 83 | .use_cnt = 7, |
84 | }; | 84 | }; |
85 | 85 | ||
86 | static struct clk uart_clk = { | 86 | static struct clk uart_clk = { |
87 | .name = "UART", | 87 | .name = "UART", |
88 | .type = CLK_TYPE_PROGRAMMABLE, | 88 | .type = CLK_TYPE_PROGRAMMABLE, |
89 | .csp_id = chipcHw_CLOCK_UART, | 89 | .csp_id = chipcHw_CLOCK_UART, |
90 | .rate_hz = HW_CFG_UART_CLK_HZ, | 90 | .rate_hz = HW_CFG_UART_CLK_HZ, |
91 | .parent = &pll1_clk, | 91 | .parent = &pll1_clk, |
92 | }; | 92 | }; |
93 | 93 | ||
94 | static struct clk dummy_apb_pclk = { | ||
95 | .name = "BUSCLK", | ||
96 | .type = CLK_TYPE_PRIMARY, | ||
97 | .mode = CLK_MODE_XTAL, | ||
98 | }; | ||
99 | |||
94 | static struct clk_lookup lookups[] = { | 100 | static struct clk_lookup lookups[] = { |
95 | { /* UART0 */ | 101 | { /* Bus clock */ |
96 | .dev_id = "uarta", | 102 | .con_id = "apb_pclk", |
97 | .clk = &uart_clk, | 103 | .clk = &dummy_apb_pclk, |
98 | }, { /* UART1 */ | 104 | }, { /* UART0 */ |
99 | .dev_id = "uartb", | 105 | .dev_id = "uarta", |
100 | .clk = &uart_clk, | 106 | .clk = &uart_clk, |
101 | } | 107 | }, { /* UART1 */ |
108 | .dev_id = "uartb", | ||
109 | .clk = &uart_clk, | ||
110 | } | ||
102 | }; | 111 | }; |
103 | 112 | ||
104 | static struct amba_device *amba_devs[] __initdata = { | 113 | static struct amba_device *amba_devs[] __initdata = { |
105 | &uartA_device, | 114 | &uartA_device, |
106 | &uartB_device, | 115 | &uartB_device, |
107 | }; | 116 | }; |
108 | 117 | ||
109 | void __init bcmring_amba_init(void) | 118 | void __init bcmring_amba_init(void) |
110 | { | 119 | { |
111 | int i; | 120 | int i; |
112 | u32 bus_clock; | 121 | u32 bus_clock; |
113 | 122 | ||
114 | /* Linux is run initially in non-secure mode. Secure peripherals */ | 123 | /* Linux is run initially in non-secure mode. Secure peripherals */ |
115 | /* generate FIQ, and must be handled in secure mode. Until we have */ | 124 | /* generate FIQ, and must be handled in secure mode. Until we have */ |
116 | /* a linux security monitor implementation, keep everything in */ | 125 | /* a linux security monitor implementation, keep everything in */ |
117 | /* non-secure mode. */ | 126 | /* non-secure mode. */ |
118 | chipcHw_busInterfaceClockEnable(chipcHw_REG_BUS_CLOCK_SPU); | 127 | chipcHw_busInterfaceClockEnable(chipcHw_REG_BUS_CLOCK_SPU); |
119 | secHw_setUnsecure(secHw_BLK_MASK_CHIP_CONTROL | | 128 | secHw_setUnsecure(secHw_BLK_MASK_CHIP_CONTROL | |
120 | secHw_BLK_MASK_KEY_SCAN | | 129 | secHw_BLK_MASK_KEY_SCAN | |
121 | secHw_BLK_MASK_TOUCH_SCREEN | | 130 | secHw_BLK_MASK_TOUCH_SCREEN | |
122 | secHw_BLK_MASK_UART0 | | 131 | secHw_BLK_MASK_UART0 | |
123 | secHw_BLK_MASK_UART1 | | 132 | secHw_BLK_MASK_UART1 | |
124 | secHw_BLK_MASK_WATCHDOG | | 133 | secHw_BLK_MASK_WATCHDOG | |
125 | secHw_BLK_MASK_SPUM | | 134 | secHw_BLK_MASK_SPUM | |
126 | secHw_BLK_MASK_DDR2 | | 135 | secHw_BLK_MASK_DDR2 | |
127 | secHw_BLK_MASK_SPU | | 136 | secHw_BLK_MASK_SPU | |
128 | secHw_BLK_MASK_PKA | | 137 | secHw_BLK_MASK_PKA | |
129 | secHw_BLK_MASK_RNG | | 138 | secHw_BLK_MASK_RNG | |
130 | secHw_BLK_MASK_RTC | | 139 | secHw_BLK_MASK_RTC | |
131 | secHw_BLK_MASK_OTP | | 140 | secHw_BLK_MASK_OTP | |
132 | secHw_BLK_MASK_BOOT | | 141 | secHw_BLK_MASK_BOOT | |
133 | secHw_BLK_MASK_MPU | | 142 | secHw_BLK_MASK_MPU | |
134 | secHw_BLK_MASK_TZCTRL | secHw_BLK_MASK_INTR); | 143 | secHw_BLK_MASK_TZCTRL | secHw_BLK_MASK_INTR); |
135 | 144 | ||
136 | /* Only the devices attached to the AMBA bus are enabled just before the bus is */ | 145 | /* Only the devices attached to the AMBA bus are enabled just before the bus is */ |
137 | /* scanned and the drivers are loaded. The clocks need to be on for the AMBA bus */ | 146 | /* scanned and the drivers are loaded. The clocks need to be on for the AMBA bus */ |
138 | /* driver to access these blocks. The bus is probed, and the drivers are loaded. */ | 147 | /* driver to access these blocks. The bus is probed, and the drivers are loaded. */ |
139 | /* FIXME Need to remove enable of PIF once CLCD clock enable used properly in FPGA. */ | 148 | /* FIXME Need to remove enable of PIF once CLCD clock enable used properly in FPGA. */ |
140 | bus_clock = chipcHw_REG_BUS_CLOCK_GE | 149 | bus_clock = chipcHw_REG_BUS_CLOCK_GE |
141 | | chipcHw_REG_BUS_CLOCK_SDIO0 | chipcHw_REG_BUS_CLOCK_SDIO1; | 150 | | chipcHw_REG_BUS_CLOCK_SDIO0 | chipcHw_REG_BUS_CLOCK_SDIO1; |
142 | 151 | ||
143 | chipcHw_busInterfaceClockEnable(bus_clock); | 152 | chipcHw_busInterfaceClockEnable(bus_clock); |
144 | 153 | ||
145 | clkdev_add_table(lookups, ARRAY_SIZE(lookups)); | 154 | clkdev_add_table(lookups, ARRAY_SIZE(lookups)); |
146 | 155 | ||
147 | for (i = 0; i < ARRAY_SIZE(amba_devs); i++) { | 156 | for (i = 0; i < ARRAY_SIZE(amba_devs); i++) { |
148 | struct amba_device *d = amba_devs[i]; | 157 | struct amba_device *d = amba_devs[i]; |
149 | amba_device_register(d, &iomem_resource); | 158 | amba_device_register(d, &iomem_resource); |
150 | } | 159 | } |
151 | } | 160 | } |
152 | 161 | ||
153 | /* | 162 | /* |
154 | * Where is the timer (VA)? | 163 | * Where is the timer (VA)? |
155 | */ | 164 | */ |
156 | #define TIMER0_VA_BASE MM_IO_BASE_TMR | 165 | #define TIMER0_VA_BASE MM_IO_BASE_TMR |
157 | #define TIMER1_VA_BASE (MM_IO_BASE_TMR + 0x20) | 166 | #define TIMER1_VA_BASE (MM_IO_BASE_TMR + 0x20) |
158 | #define TIMER2_VA_BASE (MM_IO_BASE_TMR + 0x40) | 167 | #define TIMER2_VA_BASE (MM_IO_BASE_TMR + 0x40) |
159 | #define TIMER3_VA_BASE (MM_IO_BASE_TMR + 0x60) | 168 | #define TIMER3_VA_BASE (MM_IO_BASE_TMR + 0x60) |
160 | 169 | ||
161 | /* Timer 0 - 25 MHz, Timer3 at bus clock rate, typically 150-166 MHz */ | 170 | /* Timer 0 - 25 MHz, Timer3 at bus clock rate, typically 150-166 MHz */ |
162 | #if defined(CONFIG_ARCH_FPGA11107) | 171 | #if defined(CONFIG_ARCH_FPGA11107) |
163 | /* fpga cpu/bus are currently 30 times slower so scale frequency as well to */ | 172 | /* fpga cpu/bus are currently 30 times slower so scale frequency as well to */ |
164 | /* slow down Linux's sense of time */ | 173 | /* slow down Linux's sense of time */ |
165 | #define TIMER0_FREQUENCY_MHZ (tmrHw_LOW_FREQUENCY_MHZ * 30) | 174 | #define TIMER0_FREQUENCY_MHZ (tmrHw_LOW_FREQUENCY_MHZ * 30) |
166 | #define TIMER1_FREQUENCY_MHZ (tmrHw_LOW_FREQUENCY_MHZ * 30) | 175 | #define TIMER1_FREQUENCY_MHZ (tmrHw_LOW_FREQUENCY_MHZ * 30) |
167 | #define TIMER3_FREQUENCY_MHZ (tmrHw_HIGH_FREQUENCY_MHZ * 30) | 176 | #define TIMER3_FREQUENCY_MHZ (tmrHw_HIGH_FREQUENCY_MHZ * 30) |
168 | #define TIMER3_FREQUENCY_KHZ (tmrHw_HIGH_FREQUENCY_HZ / 1000 * 30) | 177 | #define TIMER3_FREQUENCY_KHZ (tmrHw_HIGH_FREQUENCY_HZ / 1000 * 30) |
169 | #else | 178 | #else |
170 | #define TIMER0_FREQUENCY_MHZ tmrHw_LOW_FREQUENCY_MHZ | 179 | #define TIMER0_FREQUENCY_MHZ tmrHw_LOW_FREQUENCY_MHZ |
171 | #define TIMER1_FREQUENCY_MHZ tmrHw_LOW_FREQUENCY_MHZ | 180 | #define TIMER1_FREQUENCY_MHZ tmrHw_LOW_FREQUENCY_MHZ |
172 | #define TIMER3_FREQUENCY_MHZ tmrHw_HIGH_FREQUENCY_MHZ | 181 | #define TIMER3_FREQUENCY_MHZ tmrHw_HIGH_FREQUENCY_MHZ |
173 | #define TIMER3_FREQUENCY_KHZ (tmrHw_HIGH_FREQUENCY_HZ / 1000) | 182 | #define TIMER3_FREQUENCY_KHZ (tmrHw_HIGH_FREQUENCY_HZ / 1000) |
174 | #endif | 183 | #endif |
175 | 184 | ||
176 | #define TICKS_PER_uSEC TIMER0_FREQUENCY_MHZ | 185 | #define TICKS_PER_uSEC TIMER0_FREQUENCY_MHZ |
177 | 186 | ||
178 | /* | 187 | /* |
179 | * These are useconds NOT ticks. | 188 | * These are useconds NOT ticks. |
180 | * | 189 | * |
181 | */ | 190 | */ |
182 | #define mSEC_1 1000 | 191 | #define mSEC_1 1000 |
183 | #define mSEC_5 (mSEC_1 * 5) | 192 | #define mSEC_5 (mSEC_1 * 5) |
184 | #define mSEC_10 (mSEC_1 * 10) | 193 | #define mSEC_10 (mSEC_1 * 10) |
185 | #define mSEC_25 (mSEC_1 * 25) | 194 | #define mSEC_25 (mSEC_1 * 25) |
186 | #define SEC_1 (mSEC_1 * 1000) | 195 | #define SEC_1 (mSEC_1 * 1000) |
187 | 196 | ||
188 | /* | 197 | /* |
189 | * How long is the timer interval? | 198 | * How long is the timer interval? |
190 | */ | 199 | */ |
191 | #define TIMER_INTERVAL (TICKS_PER_uSEC * mSEC_10) | 200 | #define TIMER_INTERVAL (TICKS_PER_uSEC * mSEC_10) |
192 | #if TIMER_INTERVAL >= 0x100000 | 201 | #if TIMER_INTERVAL >= 0x100000 |
193 | #define TIMER_RELOAD (TIMER_INTERVAL >> 8) | 202 | #define TIMER_RELOAD (TIMER_INTERVAL >> 8) |
194 | #define TIMER_DIVISOR (TIMER_CTRL_DIV256) | 203 | #define TIMER_DIVISOR (TIMER_CTRL_DIV256) |
195 | #define TICKS2USECS(x) (256 * (x) / TICKS_PER_uSEC) | 204 | #define TICKS2USECS(x) (256 * (x) / TICKS_PER_uSEC) |
196 | #elif TIMER_INTERVAL >= 0x10000 | 205 | #elif TIMER_INTERVAL >= 0x10000 |
197 | #define TIMER_RELOAD (TIMER_INTERVAL >> 4) /* Divide by 16 */ | 206 | #define TIMER_RELOAD (TIMER_INTERVAL >> 4) /* Divide by 16 */ |
198 | #define TIMER_DIVISOR (TIMER_CTRL_DIV16) | 207 | #define TIMER_DIVISOR (TIMER_CTRL_DIV16) |
199 | #define TICKS2USECS(x) (16 * (x) / TICKS_PER_uSEC) | 208 | #define TICKS2USECS(x) (16 * (x) / TICKS_PER_uSEC) |
200 | #else | 209 | #else |
201 | #define TIMER_RELOAD (TIMER_INTERVAL) | 210 | #define TIMER_RELOAD (TIMER_INTERVAL) |
202 | #define TIMER_DIVISOR (TIMER_CTRL_DIV1) | 211 | #define TIMER_DIVISOR (TIMER_CTRL_DIV1) |
203 | #define TICKS2USECS(x) ((x) / TICKS_PER_uSEC) | 212 | #define TICKS2USECS(x) ((x) / TICKS_PER_uSEC) |
204 | #endif | 213 | #endif |
205 | 214 | ||
206 | static void timer_set_mode(enum clock_event_mode mode, | 215 | static void timer_set_mode(enum clock_event_mode mode, |
207 | struct clock_event_device *clk) | 216 | struct clock_event_device *clk) |
208 | { | 217 | { |
209 | unsigned long ctrl; | 218 | unsigned long ctrl; |
210 | 219 | ||
211 | switch (mode) { | 220 | switch (mode) { |
212 | case CLOCK_EVT_MODE_PERIODIC: | 221 | case CLOCK_EVT_MODE_PERIODIC: |
213 | writel(TIMER_RELOAD, TIMER0_VA_BASE + TIMER_LOAD); | 222 | writel(TIMER_RELOAD, TIMER0_VA_BASE + TIMER_LOAD); |
214 | 223 | ||
215 | ctrl = TIMER_CTRL_PERIODIC; | 224 | ctrl = TIMER_CTRL_PERIODIC; |
216 | ctrl |= | 225 | ctrl |= |
217 | TIMER_DIVISOR | TIMER_CTRL_32BIT | TIMER_CTRL_IE | | 226 | TIMER_DIVISOR | TIMER_CTRL_32BIT | TIMER_CTRL_IE | |
218 | TIMER_CTRL_ENABLE; | 227 | TIMER_CTRL_ENABLE; |
219 | break; | 228 | break; |
220 | case CLOCK_EVT_MODE_ONESHOT: | 229 | case CLOCK_EVT_MODE_ONESHOT: |
221 | /* period set, and timer enabled in 'next_event' hook */ | 230 | /* period set, and timer enabled in 'next_event' hook */ |
222 | ctrl = TIMER_CTRL_ONESHOT; | 231 | ctrl = TIMER_CTRL_ONESHOT; |
223 | ctrl |= TIMER_DIVISOR | TIMER_CTRL_32BIT | TIMER_CTRL_IE; | 232 | ctrl |= TIMER_DIVISOR | TIMER_CTRL_32BIT | TIMER_CTRL_IE; |
224 | break; | 233 | break; |
225 | case CLOCK_EVT_MODE_UNUSED: | 234 | case CLOCK_EVT_MODE_UNUSED: |
226 | case CLOCK_EVT_MODE_SHUTDOWN: | 235 | case CLOCK_EVT_MODE_SHUTDOWN: |
227 | default: | 236 | default: |
228 | ctrl = 0; | 237 | ctrl = 0; |
229 | } | 238 | } |
230 | 239 | ||
231 | writel(ctrl, TIMER0_VA_BASE + TIMER_CTRL); | 240 | writel(ctrl, TIMER0_VA_BASE + TIMER_CTRL); |
232 | } | 241 | } |
233 | 242 | ||
234 | static int timer_set_next_event(unsigned long evt, | 243 | static int timer_set_next_event(unsigned long evt, |
235 | struct clock_event_device *unused) | 244 | struct clock_event_device *unused) |
236 | { | 245 | { |
237 | unsigned long ctrl = readl(TIMER0_VA_BASE + TIMER_CTRL); | 246 | unsigned long ctrl = readl(TIMER0_VA_BASE + TIMER_CTRL); |
238 | 247 | ||
239 | writel(evt, TIMER0_VA_BASE + TIMER_LOAD); | 248 | writel(evt, TIMER0_VA_BASE + TIMER_LOAD); |
240 | writel(ctrl | TIMER_CTRL_ENABLE, TIMER0_VA_BASE + TIMER_CTRL); | 249 | writel(ctrl | TIMER_CTRL_ENABLE, TIMER0_VA_BASE + TIMER_CTRL); |
241 | 250 | ||
242 | return 0; | 251 | return 0; |
243 | } | 252 | } |
244 | 253 | ||
245 | static struct clock_event_device timer0_clockevent = { | 254 | static struct clock_event_device timer0_clockevent = { |
246 | .name = "timer0", | 255 | .name = "timer0", |
247 | .shift = 32, | 256 | .shift = 32, |
248 | .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, | 257 | .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, |
249 | .set_mode = timer_set_mode, | 258 | .set_mode = timer_set_mode, |
250 | .set_next_event = timer_set_next_event, | 259 | .set_next_event = timer_set_next_event, |
251 | }; | 260 | }; |
252 | 261 | ||
253 | /* | 262 | /* |
254 | * IRQ handler for the timer | 263 | * IRQ handler for the timer |
255 | */ | 264 | */ |
256 | static irqreturn_t bcmring_timer_interrupt(int irq, void *dev_id) | 265 | static irqreturn_t bcmring_timer_interrupt(int irq, void *dev_id) |
257 | { | 266 | { |
258 | struct clock_event_device *evt = &timer0_clockevent; | 267 | struct clock_event_device *evt = &timer0_clockevent; |
259 | 268 | ||
260 | writel(1, TIMER0_VA_BASE + TIMER_INTCLR); | 269 | writel(1, TIMER0_VA_BASE + TIMER_INTCLR); |
261 | 270 | ||
262 | evt->event_handler(evt); | 271 | evt->event_handler(evt); |
263 | 272 | ||
264 | return IRQ_HANDLED; | 273 | return IRQ_HANDLED; |
265 | } | 274 | } |
266 | 275 | ||
267 | static struct irqaction bcmring_timer_irq = { | 276 | static struct irqaction bcmring_timer_irq = { |
268 | .name = "bcmring Timer Tick", | 277 | .name = "bcmring Timer Tick", |
269 | .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL, | 278 | .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL, |
270 | .handler = bcmring_timer_interrupt, | 279 | .handler = bcmring_timer_interrupt, |
271 | }; | 280 | }; |
272 | 281 | ||
273 | static cycle_t bcmring_get_cycles_timer1(struct clocksource *cs) | 282 | static cycle_t bcmring_get_cycles_timer1(struct clocksource *cs) |
274 | { | 283 | { |
275 | return ~readl(TIMER1_VA_BASE + TIMER_VALUE); | 284 | return ~readl(TIMER1_VA_BASE + TIMER_VALUE); |
276 | } | 285 | } |
277 | 286 | ||
278 | static cycle_t bcmring_get_cycles_timer3(struct clocksource *cs) | 287 | static cycle_t bcmring_get_cycles_timer3(struct clocksource *cs) |
279 | { | 288 | { |
280 | return ~readl(TIMER3_VA_BASE + TIMER_VALUE); | 289 | return ~readl(TIMER3_VA_BASE + TIMER_VALUE); |
281 | } | 290 | } |
282 | 291 | ||
283 | static struct clocksource clocksource_bcmring_timer1 = { | 292 | static struct clocksource clocksource_bcmring_timer1 = { |
284 | .name = "timer1", | 293 | .name = "timer1", |
285 | .rating = 200, | 294 | .rating = 200, |
286 | .read = bcmring_get_cycles_timer1, | 295 | .read = bcmring_get_cycles_timer1, |
287 | .mask = CLOCKSOURCE_MASK(32), | 296 | .mask = CLOCKSOURCE_MASK(32), |
288 | .shift = 20, | 297 | .shift = 20, |
289 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, | 298 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, |
290 | }; | 299 | }; |
291 | 300 | ||
292 | static struct clocksource clocksource_bcmring_timer3 = { | 301 | static struct clocksource clocksource_bcmring_timer3 = { |
293 | .name = "timer3", | 302 | .name = "timer3", |
294 | .rating = 100, | 303 | .rating = 100, |
295 | .read = bcmring_get_cycles_timer3, | 304 | .read = bcmring_get_cycles_timer3, |
296 | .mask = CLOCKSOURCE_MASK(32), | 305 | .mask = CLOCKSOURCE_MASK(32), |
297 | .shift = 20, | 306 | .shift = 20, |
298 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, | 307 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, |
299 | }; | 308 | }; |
300 | 309 | ||
301 | static int __init bcmring_clocksource_init(void) | 310 | static int __init bcmring_clocksource_init(void) |
302 | { | 311 | { |
303 | /* setup timer1 as free-running clocksource */ | 312 | /* setup timer1 as free-running clocksource */ |
304 | writel(0, TIMER1_VA_BASE + TIMER_CTRL); | 313 | writel(0, TIMER1_VA_BASE + TIMER_CTRL); |
305 | writel(0xffffffff, TIMER1_VA_BASE + TIMER_LOAD); | 314 | writel(0xffffffff, TIMER1_VA_BASE + TIMER_LOAD); |
306 | writel(0xffffffff, TIMER1_VA_BASE + TIMER_VALUE); | 315 | writel(0xffffffff, TIMER1_VA_BASE + TIMER_VALUE); |
307 | writel(TIMER_CTRL_32BIT | TIMER_CTRL_ENABLE | TIMER_CTRL_PERIODIC, | 316 | writel(TIMER_CTRL_32BIT | TIMER_CTRL_ENABLE | TIMER_CTRL_PERIODIC, |
308 | TIMER1_VA_BASE + TIMER_CTRL); | 317 | TIMER1_VA_BASE + TIMER_CTRL); |
309 | 318 | ||
310 | clocksource_bcmring_timer1.mult = | 319 | clocksource_bcmring_timer1.mult = |
311 | clocksource_khz2mult(TIMER1_FREQUENCY_MHZ * 1000, | 320 | clocksource_khz2mult(TIMER1_FREQUENCY_MHZ * 1000, |
312 | clocksource_bcmring_timer1.shift); | 321 | clocksource_bcmring_timer1.shift); |
313 | clocksource_register(&clocksource_bcmring_timer1); | 322 | clocksource_register(&clocksource_bcmring_timer1); |
314 | 323 | ||
315 | /* setup timer3 as free-running clocksource */ | 324 | /* setup timer3 as free-running clocksource */ |
316 | writel(0, TIMER3_VA_BASE + TIMER_CTRL); | 325 | writel(0, TIMER3_VA_BASE + TIMER_CTRL); |
317 | writel(0xffffffff, TIMER3_VA_BASE + TIMER_LOAD); | 326 | writel(0xffffffff, TIMER3_VA_BASE + TIMER_LOAD); |
318 | writel(0xffffffff, TIMER3_VA_BASE + TIMER_VALUE); | 327 | writel(0xffffffff, TIMER3_VA_BASE + TIMER_VALUE); |
319 | writel(TIMER_CTRL_32BIT | TIMER_CTRL_ENABLE | TIMER_CTRL_PERIODIC, | 328 | writel(TIMER_CTRL_32BIT | TIMER_CTRL_ENABLE | TIMER_CTRL_PERIODIC, |
320 | TIMER3_VA_BASE + TIMER_CTRL); | 329 | TIMER3_VA_BASE + TIMER_CTRL); |
321 | 330 | ||
322 | clocksource_bcmring_timer3.mult = | 331 | clocksource_bcmring_timer3.mult = |
323 | clocksource_khz2mult(TIMER3_FREQUENCY_KHZ, | 332 | clocksource_khz2mult(TIMER3_FREQUENCY_KHZ, |
324 | clocksource_bcmring_timer3.shift); | 333 | clocksource_bcmring_timer3.shift); |
325 | clocksource_register(&clocksource_bcmring_timer3); | 334 | clocksource_register(&clocksource_bcmring_timer3); |
326 | 335 | ||
327 | return 0; | 336 | return 0; |
328 | } | 337 | } |
329 | 338 | ||
330 | /* | 339 | /* |
331 | * Set up timer interrupt, and return the current time in seconds. | 340 | * Set up timer interrupt, and return the current time in seconds. |
332 | */ | 341 | */ |
333 | void __init bcmring_init_timer(void) | 342 | void __init bcmring_init_timer(void) |
334 | { | 343 | { |
335 | printk(KERN_INFO "bcmring_init_timer\n"); | 344 | printk(KERN_INFO "bcmring_init_timer\n"); |
336 | /* | 345 | /* |
337 | * Initialise to a known state (all timers off) | 346 | * Initialise to a known state (all timers off) |
338 | */ | 347 | */ |
339 | writel(0, TIMER0_VA_BASE + TIMER_CTRL); | 348 | writel(0, TIMER0_VA_BASE + TIMER_CTRL); |
340 | writel(0, TIMER1_VA_BASE + TIMER_CTRL); | 349 | writel(0, TIMER1_VA_BASE + TIMER_CTRL); |
341 | writel(0, TIMER2_VA_BASE + TIMER_CTRL); | 350 | writel(0, TIMER2_VA_BASE + TIMER_CTRL); |
342 | writel(0, TIMER3_VA_BASE + TIMER_CTRL); | 351 | writel(0, TIMER3_VA_BASE + TIMER_CTRL); |
343 | 352 | ||
344 | /* | 353 | /* |
345 | * Make irqs happen for the system timer | 354 | * Make irqs happen for the system timer |
346 | */ | 355 | */ |
347 | setup_irq(IRQ_TIMER0, &bcmring_timer_irq); | 356 | setup_irq(IRQ_TIMER0, &bcmring_timer_irq); |
348 | 357 | ||
349 | bcmring_clocksource_init(); | 358 | bcmring_clocksource_init(); |
350 | 359 | ||
351 | timer0_clockevent.mult = | 360 | timer0_clockevent.mult = |
352 | div_sc(1000000, NSEC_PER_SEC, timer0_clockevent.shift); | 361 | div_sc(1000000, NSEC_PER_SEC, timer0_clockevent.shift); |
353 | timer0_clockevent.max_delta_ns = | 362 | timer0_clockevent.max_delta_ns = |
354 | clockevent_delta2ns(0xffffffff, &timer0_clockevent); | 363 | clockevent_delta2ns(0xffffffff, &timer0_clockevent); |
355 | timer0_clockevent.min_delta_ns = | 364 | timer0_clockevent.min_delta_ns = |
356 | clockevent_delta2ns(0xf, &timer0_clockevent); | 365 | clockevent_delta2ns(0xf, &timer0_clockevent); |
357 | 366 | ||
358 | timer0_clockevent.cpumask = cpumask_of(0); | 367 | timer0_clockevent.cpumask = cpumask_of(0); |
359 | clockevents_register_device(&timer0_clockevent); | 368 | clockevents_register_device(&timer0_clockevent); |
360 | } | 369 | } |
361 | 370 | ||
362 | struct sys_timer bcmring_timer = { | 371 | struct sys_timer bcmring_timer = { |
363 | .init = bcmring_init_timer, | 372 | .init = bcmring_init_timer, |
364 | }; | 373 | }; |
365 | 374 |
arch/arm/mach-ep93xx/clock.c
1 | /* | 1 | /* |
2 | * arch/arm/mach-ep93xx/clock.c | 2 | * arch/arm/mach-ep93xx/clock.c |
3 | * Clock control for Cirrus EP93xx chips. | 3 | * Clock control for Cirrus EP93xx chips. |
4 | * | 4 | * |
5 | * Copyright (C) 2006 Lennert Buytenhek <buytenh@wantstofly.org> | 5 | * Copyright (C) 2006 Lennert Buytenhek <buytenh@wantstofly.org> |
6 | * | 6 | * |
7 | * 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 |
8 | * it under the terms of the GNU General Public License as published by | 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 (at | 9 | * the Free Software Foundation; either version 2 of the License, or (at |
10 | * your option) any later version. | 10 | * your option) any later version. |
11 | */ | 11 | */ |
12 | 12 | ||
13 | #define pr_fmt(fmt) "ep93xx " KBUILD_MODNAME ": " fmt | 13 | #define pr_fmt(fmt) "ep93xx " KBUILD_MODNAME ": " fmt |
14 | 14 | ||
15 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
16 | #include <linux/clk.h> | 16 | #include <linux/clk.h> |
17 | #include <linux/err.h> | 17 | #include <linux/err.h> |
18 | #include <linux/module.h> | 18 | #include <linux/module.h> |
19 | #include <linux/string.h> | 19 | #include <linux/string.h> |
20 | #include <linux/io.h> | 20 | #include <linux/io.h> |
21 | #include <linux/spinlock.h> | 21 | #include <linux/spinlock.h> |
22 | 22 | ||
23 | #include <mach/hardware.h> | 23 | #include <mach/hardware.h> |
24 | 24 | ||
25 | #include <asm/clkdev.h> | 25 | #include <asm/clkdev.h> |
26 | #include <asm/div64.h> | 26 | #include <asm/div64.h> |
27 | 27 | ||
28 | 28 | ||
29 | struct clk { | 29 | struct clk { |
30 | struct clk *parent; | 30 | struct clk *parent; |
31 | unsigned long rate; | 31 | unsigned long rate; |
32 | int users; | 32 | int users; |
33 | int sw_locked; | 33 | int sw_locked; |
34 | void __iomem *enable_reg; | 34 | void __iomem *enable_reg; |
35 | u32 enable_mask; | 35 | u32 enable_mask; |
36 | 36 | ||
37 | unsigned long (*get_rate)(struct clk *clk); | 37 | unsigned long (*get_rate)(struct clk *clk); |
38 | int (*set_rate)(struct clk *clk, unsigned long rate); | 38 | int (*set_rate)(struct clk *clk, unsigned long rate); |
39 | }; | 39 | }; |
40 | 40 | ||
41 | 41 | ||
42 | static unsigned long get_uart_rate(struct clk *clk); | 42 | static unsigned long get_uart_rate(struct clk *clk); |
43 | 43 | ||
44 | static int set_keytchclk_rate(struct clk *clk, unsigned long rate); | 44 | static int set_keytchclk_rate(struct clk *clk, unsigned long rate); |
45 | static int set_div_rate(struct clk *clk, unsigned long rate); | 45 | static int set_div_rate(struct clk *clk, unsigned long rate); |
46 | 46 | ||
47 | 47 | ||
48 | static struct clk clk_xtali = { | 48 | static struct clk clk_xtali = { |
49 | .rate = EP93XX_EXT_CLK_RATE, | 49 | .rate = EP93XX_EXT_CLK_RATE, |
50 | }; | 50 | }; |
51 | static struct clk clk_uart1 = { | 51 | static struct clk clk_uart1 = { |
52 | .parent = &clk_xtali, | 52 | .parent = &clk_xtali, |
53 | .sw_locked = 1, | 53 | .sw_locked = 1, |
54 | .enable_reg = EP93XX_SYSCON_DEVCFG, | 54 | .enable_reg = EP93XX_SYSCON_DEVCFG, |
55 | .enable_mask = EP93XX_SYSCON_DEVCFG_U1EN, | 55 | .enable_mask = EP93XX_SYSCON_DEVCFG_U1EN, |
56 | .get_rate = get_uart_rate, | 56 | .get_rate = get_uart_rate, |
57 | }; | 57 | }; |
58 | static struct clk clk_uart2 = { | 58 | static struct clk clk_uart2 = { |
59 | .parent = &clk_xtali, | 59 | .parent = &clk_xtali, |
60 | .sw_locked = 1, | 60 | .sw_locked = 1, |
61 | .enable_reg = EP93XX_SYSCON_DEVCFG, | 61 | .enable_reg = EP93XX_SYSCON_DEVCFG, |
62 | .enable_mask = EP93XX_SYSCON_DEVCFG_U2EN, | 62 | .enable_mask = EP93XX_SYSCON_DEVCFG_U2EN, |
63 | .get_rate = get_uart_rate, | 63 | .get_rate = get_uart_rate, |
64 | }; | 64 | }; |
65 | static struct clk clk_uart3 = { | 65 | static struct clk clk_uart3 = { |
66 | .parent = &clk_xtali, | 66 | .parent = &clk_xtali, |
67 | .sw_locked = 1, | 67 | .sw_locked = 1, |
68 | .enable_reg = EP93XX_SYSCON_DEVCFG, | 68 | .enable_reg = EP93XX_SYSCON_DEVCFG, |
69 | .enable_mask = EP93XX_SYSCON_DEVCFG_U3EN, | 69 | .enable_mask = EP93XX_SYSCON_DEVCFG_U3EN, |
70 | .get_rate = get_uart_rate, | 70 | .get_rate = get_uart_rate, |
71 | }; | 71 | }; |
72 | static struct clk clk_pll1 = { | 72 | static struct clk clk_pll1 = { |
73 | .parent = &clk_xtali, | 73 | .parent = &clk_xtali, |
74 | }; | 74 | }; |
75 | static struct clk clk_f = { | 75 | static struct clk clk_f = { |
76 | .parent = &clk_pll1, | 76 | .parent = &clk_pll1, |
77 | }; | 77 | }; |
78 | static struct clk clk_h = { | 78 | static struct clk clk_h = { |
79 | .parent = &clk_pll1, | 79 | .parent = &clk_pll1, |
80 | }; | 80 | }; |
81 | static struct clk clk_p = { | 81 | static struct clk clk_p = { |
82 | .parent = &clk_pll1, | 82 | .parent = &clk_pll1, |
83 | }; | 83 | }; |
84 | static struct clk clk_pll2 = { | 84 | static struct clk clk_pll2 = { |
85 | .parent = &clk_xtali, | 85 | .parent = &clk_xtali, |
86 | }; | 86 | }; |
87 | static struct clk clk_usb_host = { | 87 | static struct clk clk_usb_host = { |
88 | .parent = &clk_pll2, | 88 | .parent = &clk_pll2, |
89 | .enable_reg = EP93XX_SYSCON_PWRCNT, | 89 | .enable_reg = EP93XX_SYSCON_PWRCNT, |
90 | .enable_mask = EP93XX_SYSCON_PWRCNT_USH_EN, | 90 | .enable_mask = EP93XX_SYSCON_PWRCNT_USH_EN, |
91 | }; | 91 | }; |
92 | static struct clk clk_keypad = { | 92 | static struct clk clk_keypad = { |
93 | .parent = &clk_xtali, | 93 | .parent = &clk_xtali, |
94 | .sw_locked = 1, | 94 | .sw_locked = 1, |
95 | .enable_reg = EP93XX_SYSCON_KEYTCHCLKDIV, | 95 | .enable_reg = EP93XX_SYSCON_KEYTCHCLKDIV, |
96 | .enable_mask = EP93XX_SYSCON_KEYTCHCLKDIV_KEN, | 96 | .enable_mask = EP93XX_SYSCON_KEYTCHCLKDIV_KEN, |
97 | .set_rate = set_keytchclk_rate, | 97 | .set_rate = set_keytchclk_rate, |
98 | }; | 98 | }; |
99 | static struct clk clk_spi = { | 99 | static struct clk clk_spi = { |
100 | .parent = &clk_xtali, | 100 | .parent = &clk_xtali, |
101 | .rate = EP93XX_EXT_CLK_RATE, | 101 | .rate = EP93XX_EXT_CLK_RATE, |
102 | }; | 102 | }; |
103 | static struct clk clk_pwm = { | 103 | static struct clk clk_pwm = { |
104 | .parent = &clk_xtali, | 104 | .parent = &clk_xtali, |
105 | .rate = EP93XX_EXT_CLK_RATE, | 105 | .rate = EP93XX_EXT_CLK_RATE, |
106 | }; | 106 | }; |
107 | 107 | ||
108 | static struct clk clk_video = { | 108 | static struct clk clk_video = { |
109 | .sw_locked = 1, | 109 | .sw_locked = 1, |
110 | .enable_reg = EP93XX_SYSCON_VIDCLKDIV, | 110 | .enable_reg = EP93XX_SYSCON_VIDCLKDIV, |
111 | .enable_mask = EP93XX_SYSCON_CLKDIV_ENABLE, | 111 | .enable_mask = EP93XX_SYSCON_CLKDIV_ENABLE, |
112 | .set_rate = set_div_rate, | 112 | .set_rate = set_div_rate, |
113 | }; | 113 | }; |
114 | 114 | ||
115 | /* DMA Clocks */ | 115 | /* DMA Clocks */ |
116 | static struct clk clk_m2p0 = { | 116 | static struct clk clk_m2p0 = { |
117 | .parent = &clk_h, | 117 | .parent = &clk_h, |
118 | .enable_reg = EP93XX_SYSCON_PWRCNT, | 118 | .enable_reg = EP93XX_SYSCON_PWRCNT, |
119 | .enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2P0, | 119 | .enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2P0, |
120 | }; | 120 | }; |
121 | static struct clk clk_m2p1 = { | 121 | static struct clk clk_m2p1 = { |
122 | .parent = &clk_h, | 122 | .parent = &clk_h, |
123 | .enable_reg = EP93XX_SYSCON_PWRCNT, | 123 | .enable_reg = EP93XX_SYSCON_PWRCNT, |
124 | .enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2P1, | 124 | .enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2P1, |
125 | }; | 125 | }; |
126 | static struct clk clk_m2p2 = { | 126 | static struct clk clk_m2p2 = { |
127 | .parent = &clk_h, | 127 | .parent = &clk_h, |
128 | .enable_reg = EP93XX_SYSCON_PWRCNT, | 128 | .enable_reg = EP93XX_SYSCON_PWRCNT, |
129 | .enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2P2, | 129 | .enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2P2, |
130 | }; | 130 | }; |
131 | static struct clk clk_m2p3 = { | 131 | static struct clk clk_m2p3 = { |
132 | .parent = &clk_h, | 132 | .parent = &clk_h, |
133 | .enable_reg = EP93XX_SYSCON_PWRCNT, | 133 | .enable_reg = EP93XX_SYSCON_PWRCNT, |
134 | .enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2P3, | 134 | .enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2P3, |
135 | }; | 135 | }; |
136 | static struct clk clk_m2p4 = { | 136 | static struct clk clk_m2p4 = { |
137 | .parent = &clk_h, | 137 | .parent = &clk_h, |
138 | .enable_reg = EP93XX_SYSCON_PWRCNT, | 138 | .enable_reg = EP93XX_SYSCON_PWRCNT, |
139 | .enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2P4, | 139 | .enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2P4, |
140 | }; | 140 | }; |
141 | static struct clk clk_m2p5 = { | 141 | static struct clk clk_m2p5 = { |
142 | .parent = &clk_h, | 142 | .parent = &clk_h, |
143 | .enable_reg = EP93XX_SYSCON_PWRCNT, | 143 | .enable_reg = EP93XX_SYSCON_PWRCNT, |
144 | .enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2P5, | 144 | .enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2P5, |
145 | }; | 145 | }; |
146 | static struct clk clk_m2p6 = { | 146 | static struct clk clk_m2p6 = { |
147 | .parent = &clk_h, | 147 | .parent = &clk_h, |
148 | .enable_reg = EP93XX_SYSCON_PWRCNT, | 148 | .enable_reg = EP93XX_SYSCON_PWRCNT, |
149 | .enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2P6, | 149 | .enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2P6, |
150 | }; | 150 | }; |
151 | static struct clk clk_m2p7 = { | 151 | static struct clk clk_m2p7 = { |
152 | .parent = &clk_h, | 152 | .parent = &clk_h, |
153 | .enable_reg = EP93XX_SYSCON_PWRCNT, | 153 | .enable_reg = EP93XX_SYSCON_PWRCNT, |
154 | .enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2P7, | 154 | .enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2P7, |
155 | }; | 155 | }; |
156 | static struct clk clk_m2p8 = { | 156 | static struct clk clk_m2p8 = { |
157 | .parent = &clk_h, | 157 | .parent = &clk_h, |
158 | .enable_reg = EP93XX_SYSCON_PWRCNT, | 158 | .enable_reg = EP93XX_SYSCON_PWRCNT, |
159 | .enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2P8, | 159 | .enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2P8, |
160 | }; | 160 | }; |
161 | static struct clk clk_m2p9 = { | 161 | static struct clk clk_m2p9 = { |
162 | .parent = &clk_h, | 162 | .parent = &clk_h, |
163 | .enable_reg = EP93XX_SYSCON_PWRCNT, | 163 | .enable_reg = EP93XX_SYSCON_PWRCNT, |
164 | .enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2P9, | 164 | .enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2P9, |
165 | }; | 165 | }; |
166 | static struct clk clk_m2m0 = { | 166 | static struct clk clk_m2m0 = { |
167 | .parent = &clk_h, | 167 | .parent = &clk_h, |
168 | .enable_reg = EP93XX_SYSCON_PWRCNT, | 168 | .enable_reg = EP93XX_SYSCON_PWRCNT, |
169 | .enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2M0, | 169 | .enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2M0, |
170 | }; | 170 | }; |
171 | static struct clk clk_m2m1 = { | 171 | static struct clk clk_m2m1 = { |
172 | .parent = &clk_h, | 172 | .parent = &clk_h, |
173 | .enable_reg = EP93XX_SYSCON_PWRCNT, | 173 | .enable_reg = EP93XX_SYSCON_PWRCNT, |
174 | .enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2M1, | 174 | .enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2M1, |
175 | }; | 175 | }; |
176 | 176 | ||
177 | #define INIT_CK(dev,con,ck) \ | 177 | #define INIT_CK(dev,con,ck) \ |
178 | { .dev_id = dev, .con_id = con, .clk = ck } | 178 | { .dev_id = dev, .con_id = con, .clk = ck } |
179 | 179 | ||
180 | static struct clk_lookup clocks[] = { | 180 | static struct clk_lookup clocks[] = { |
181 | INIT_CK(NULL, "xtali", &clk_xtali), | 181 | INIT_CK(NULL, "xtali", &clk_xtali), |
182 | INIT_CK("apb:uart1", NULL, &clk_uart1), | 182 | INIT_CK("apb:uart1", NULL, &clk_uart1), |
183 | INIT_CK("apb:uart2", NULL, &clk_uart2), | 183 | INIT_CK("apb:uart2", NULL, &clk_uart2), |
184 | INIT_CK("apb:uart3", NULL, &clk_uart3), | 184 | INIT_CK("apb:uart3", NULL, &clk_uart3), |
185 | INIT_CK(NULL, "pll1", &clk_pll1), | 185 | INIT_CK(NULL, "pll1", &clk_pll1), |
186 | INIT_CK(NULL, "fclk", &clk_f), | 186 | INIT_CK(NULL, "fclk", &clk_f), |
187 | INIT_CK(NULL, "hclk", &clk_h), | 187 | INIT_CK(NULL, "hclk", &clk_h), |
188 | INIT_CK(NULL, "pclk", &clk_p), | 188 | INIT_CK(NULL, "apb_pclk", &clk_p), |
189 | INIT_CK(NULL, "pll2", &clk_pll2), | 189 | INIT_CK(NULL, "pll2", &clk_pll2), |
190 | INIT_CK("ep93xx-ohci", NULL, &clk_usb_host), | 190 | INIT_CK("ep93xx-ohci", NULL, &clk_usb_host), |
191 | INIT_CK("ep93xx-keypad", NULL, &clk_keypad), | 191 | INIT_CK("ep93xx-keypad", NULL, &clk_keypad), |
192 | INIT_CK("ep93xx-fb", NULL, &clk_video), | 192 | INIT_CK("ep93xx-fb", NULL, &clk_video), |
193 | INIT_CK("ep93xx-spi.0", NULL, &clk_spi), | 193 | INIT_CK("ep93xx-spi.0", NULL, &clk_spi), |
194 | INIT_CK(NULL, "pwm_clk", &clk_pwm), | 194 | INIT_CK(NULL, "pwm_clk", &clk_pwm), |
195 | INIT_CK(NULL, "m2p0", &clk_m2p0), | 195 | INIT_CK(NULL, "m2p0", &clk_m2p0), |
196 | INIT_CK(NULL, "m2p1", &clk_m2p1), | 196 | INIT_CK(NULL, "m2p1", &clk_m2p1), |
197 | INIT_CK(NULL, "m2p2", &clk_m2p2), | 197 | INIT_CK(NULL, "m2p2", &clk_m2p2), |
198 | INIT_CK(NULL, "m2p3", &clk_m2p3), | 198 | INIT_CK(NULL, "m2p3", &clk_m2p3), |
199 | INIT_CK(NULL, "m2p4", &clk_m2p4), | 199 | INIT_CK(NULL, "m2p4", &clk_m2p4), |
200 | INIT_CK(NULL, "m2p5", &clk_m2p5), | 200 | INIT_CK(NULL, "m2p5", &clk_m2p5), |
201 | INIT_CK(NULL, "m2p6", &clk_m2p6), | 201 | INIT_CK(NULL, "m2p6", &clk_m2p6), |
202 | INIT_CK(NULL, "m2p7", &clk_m2p7), | 202 | INIT_CK(NULL, "m2p7", &clk_m2p7), |
203 | INIT_CK(NULL, "m2p8", &clk_m2p8), | 203 | INIT_CK(NULL, "m2p8", &clk_m2p8), |
204 | INIT_CK(NULL, "m2p9", &clk_m2p9), | 204 | INIT_CK(NULL, "m2p9", &clk_m2p9), |
205 | INIT_CK(NULL, "m2m0", &clk_m2m0), | 205 | INIT_CK(NULL, "m2m0", &clk_m2m0), |
206 | INIT_CK(NULL, "m2m1", &clk_m2m1), | 206 | INIT_CK(NULL, "m2m1", &clk_m2m1), |
207 | }; | 207 | }; |
208 | 208 | ||
209 | static DEFINE_SPINLOCK(clk_lock); | 209 | static DEFINE_SPINLOCK(clk_lock); |
210 | 210 | ||
211 | static void __clk_enable(struct clk *clk) | 211 | static void __clk_enable(struct clk *clk) |
212 | { | 212 | { |
213 | if (!clk->users++) { | 213 | if (!clk->users++) { |
214 | if (clk->parent) | 214 | if (clk->parent) |
215 | __clk_enable(clk->parent); | 215 | __clk_enable(clk->parent); |
216 | 216 | ||
217 | if (clk->enable_reg) { | 217 | if (clk->enable_reg) { |
218 | u32 v; | 218 | u32 v; |
219 | 219 | ||
220 | v = __raw_readl(clk->enable_reg); | 220 | v = __raw_readl(clk->enable_reg); |
221 | v |= clk->enable_mask; | 221 | v |= clk->enable_mask; |
222 | if (clk->sw_locked) | 222 | if (clk->sw_locked) |
223 | ep93xx_syscon_swlocked_write(v, clk->enable_reg); | 223 | ep93xx_syscon_swlocked_write(v, clk->enable_reg); |
224 | else | 224 | else |
225 | __raw_writel(v, clk->enable_reg); | 225 | __raw_writel(v, clk->enable_reg); |
226 | } | 226 | } |
227 | } | 227 | } |
228 | } | 228 | } |
229 | 229 | ||
230 | int clk_enable(struct clk *clk) | 230 | int clk_enable(struct clk *clk) |
231 | { | 231 | { |
232 | unsigned long flags; | 232 | unsigned long flags; |
233 | 233 | ||
234 | if (!clk) | 234 | if (!clk) |
235 | return -EINVAL; | 235 | return -EINVAL; |
236 | 236 | ||
237 | spin_lock_irqsave(&clk_lock, flags); | 237 | spin_lock_irqsave(&clk_lock, flags); |
238 | __clk_enable(clk); | 238 | __clk_enable(clk); |
239 | spin_unlock_irqrestore(&clk_lock, flags); | 239 | spin_unlock_irqrestore(&clk_lock, flags); |
240 | 240 | ||
241 | return 0; | 241 | return 0; |
242 | } | 242 | } |
243 | EXPORT_SYMBOL(clk_enable); | 243 | EXPORT_SYMBOL(clk_enable); |
244 | 244 | ||
245 | static void __clk_disable(struct clk *clk) | 245 | static void __clk_disable(struct clk *clk) |
246 | { | 246 | { |
247 | if (!--clk->users) { | 247 | if (!--clk->users) { |
248 | if (clk->enable_reg) { | 248 | if (clk->enable_reg) { |
249 | u32 v; | 249 | u32 v; |
250 | 250 | ||
251 | v = __raw_readl(clk->enable_reg); | 251 | v = __raw_readl(clk->enable_reg); |
252 | v &= ~clk->enable_mask; | 252 | v &= ~clk->enable_mask; |
253 | if (clk->sw_locked) | 253 | if (clk->sw_locked) |
254 | ep93xx_syscon_swlocked_write(v, clk->enable_reg); | 254 | ep93xx_syscon_swlocked_write(v, clk->enable_reg); |
255 | else | 255 | else |
256 | __raw_writel(v, clk->enable_reg); | 256 | __raw_writel(v, clk->enable_reg); |
257 | } | 257 | } |
258 | 258 | ||
259 | if (clk->parent) | 259 | if (clk->parent) |
260 | __clk_disable(clk->parent); | 260 | __clk_disable(clk->parent); |
261 | } | 261 | } |
262 | } | 262 | } |
263 | 263 | ||
264 | void clk_disable(struct clk *clk) | 264 | void clk_disable(struct clk *clk) |
265 | { | 265 | { |
266 | unsigned long flags; | 266 | unsigned long flags; |
267 | 267 | ||
268 | if (!clk) | 268 | if (!clk) |
269 | return; | 269 | return; |
270 | 270 | ||
271 | spin_lock_irqsave(&clk_lock, flags); | 271 | spin_lock_irqsave(&clk_lock, flags); |
272 | __clk_disable(clk); | 272 | __clk_disable(clk); |
273 | spin_unlock_irqrestore(&clk_lock, flags); | 273 | spin_unlock_irqrestore(&clk_lock, flags); |
274 | } | 274 | } |
275 | EXPORT_SYMBOL(clk_disable); | 275 | EXPORT_SYMBOL(clk_disable); |
276 | 276 | ||
277 | static unsigned long get_uart_rate(struct clk *clk) | 277 | static unsigned long get_uart_rate(struct clk *clk) |
278 | { | 278 | { |
279 | unsigned long rate = clk_get_rate(clk->parent); | 279 | unsigned long rate = clk_get_rate(clk->parent); |
280 | u32 value; | 280 | u32 value; |
281 | 281 | ||
282 | value = __raw_readl(EP93XX_SYSCON_PWRCNT); | 282 | value = __raw_readl(EP93XX_SYSCON_PWRCNT); |
283 | if (value & EP93XX_SYSCON_PWRCNT_UARTBAUD) | 283 | if (value & EP93XX_SYSCON_PWRCNT_UARTBAUD) |
284 | return rate; | 284 | return rate; |
285 | else | 285 | else |
286 | return rate / 2; | 286 | return rate / 2; |
287 | } | 287 | } |
288 | 288 | ||
289 | unsigned long clk_get_rate(struct clk *clk) | 289 | unsigned long clk_get_rate(struct clk *clk) |
290 | { | 290 | { |
291 | if (clk->get_rate) | 291 | if (clk->get_rate) |
292 | return clk->get_rate(clk); | 292 | return clk->get_rate(clk); |
293 | 293 | ||
294 | return clk->rate; | 294 | return clk->rate; |
295 | } | 295 | } |
296 | EXPORT_SYMBOL(clk_get_rate); | 296 | EXPORT_SYMBOL(clk_get_rate); |
297 | 297 | ||
298 | static int set_keytchclk_rate(struct clk *clk, unsigned long rate) | 298 | static int set_keytchclk_rate(struct clk *clk, unsigned long rate) |
299 | { | 299 | { |
300 | u32 val; | 300 | u32 val; |
301 | u32 div_bit; | 301 | u32 div_bit; |
302 | 302 | ||
303 | val = __raw_readl(clk->enable_reg); | 303 | val = __raw_readl(clk->enable_reg); |
304 | 304 | ||
305 | /* | 305 | /* |
306 | * The Key Matrix and ADC clocks are configured using the same | 306 | * The Key Matrix and ADC clocks are configured using the same |
307 | * System Controller register. The clock used will be either | 307 | * System Controller register. The clock used will be either |
308 | * 1/4 or 1/16 the external clock rate depending on the | 308 | * 1/4 or 1/16 the external clock rate depending on the |
309 | * EP93XX_SYSCON_KEYTCHCLKDIV_KDIV/EP93XX_SYSCON_KEYTCHCLKDIV_ADIV | 309 | * EP93XX_SYSCON_KEYTCHCLKDIV_KDIV/EP93XX_SYSCON_KEYTCHCLKDIV_ADIV |
310 | * bit being set or cleared. | 310 | * bit being set or cleared. |
311 | */ | 311 | */ |
312 | div_bit = clk->enable_mask >> 15; | 312 | div_bit = clk->enable_mask >> 15; |
313 | 313 | ||
314 | if (rate == EP93XX_KEYTCHCLK_DIV4) | 314 | if (rate == EP93XX_KEYTCHCLK_DIV4) |
315 | val |= div_bit; | 315 | val |= div_bit; |
316 | else if (rate == EP93XX_KEYTCHCLK_DIV16) | 316 | else if (rate == EP93XX_KEYTCHCLK_DIV16) |
317 | val &= ~div_bit; | 317 | val &= ~div_bit; |
318 | else | 318 | else |
319 | return -EINVAL; | 319 | return -EINVAL; |
320 | 320 | ||
321 | ep93xx_syscon_swlocked_write(val, clk->enable_reg); | 321 | ep93xx_syscon_swlocked_write(val, clk->enable_reg); |
322 | clk->rate = rate; | 322 | clk->rate = rate; |
323 | return 0; | 323 | return 0; |
324 | } | 324 | } |
325 | 325 | ||
326 | static int calc_clk_div(struct clk *clk, unsigned long rate, | 326 | static int calc_clk_div(struct clk *clk, unsigned long rate, |
327 | int *psel, int *esel, int *pdiv, int *div) | 327 | int *psel, int *esel, int *pdiv, int *div) |
328 | { | 328 | { |
329 | struct clk *mclk; | 329 | struct clk *mclk; |
330 | unsigned long max_rate, actual_rate, mclk_rate, rate_err = -1; | 330 | unsigned long max_rate, actual_rate, mclk_rate, rate_err = -1; |
331 | int i, found = 0, __div = 0, __pdiv = 0; | 331 | int i, found = 0, __div = 0, __pdiv = 0; |
332 | 332 | ||
333 | /* Don't exceed the maximum rate */ | 333 | /* Don't exceed the maximum rate */ |
334 | max_rate = max(max(clk_pll1.rate / 4, clk_pll2.rate / 4), | 334 | max_rate = max(max(clk_pll1.rate / 4, clk_pll2.rate / 4), |
335 | clk_xtali.rate / 4); | 335 | clk_xtali.rate / 4); |
336 | rate = min(rate, max_rate); | 336 | rate = min(rate, max_rate); |
337 | 337 | ||
338 | /* | 338 | /* |
339 | * Try the two pll's and the external clock | 339 | * Try the two pll's and the external clock |
340 | * Because the valid predividers are 2, 2.5 and 3, we multiply | 340 | * Because the valid predividers are 2, 2.5 and 3, we multiply |
341 | * all the clocks by 2 to avoid floating point math. | 341 | * all the clocks by 2 to avoid floating point math. |
342 | * | 342 | * |
343 | * This is based on the algorithm in the ep93xx raster guide: | 343 | * This is based on the algorithm in the ep93xx raster guide: |
344 | * http://be-a-maverick.com/en/pubs/appNote/AN269REV1.pdf | 344 | * http://be-a-maverick.com/en/pubs/appNote/AN269REV1.pdf |
345 | * | 345 | * |
346 | */ | 346 | */ |
347 | for (i = 0; i < 3; i++) { | 347 | for (i = 0; i < 3; i++) { |
348 | if (i == 0) | 348 | if (i == 0) |
349 | mclk = &clk_xtali; | 349 | mclk = &clk_xtali; |
350 | else if (i == 1) | 350 | else if (i == 1) |
351 | mclk = &clk_pll1; | 351 | mclk = &clk_pll1; |
352 | else | 352 | else |
353 | mclk = &clk_pll2; | 353 | mclk = &clk_pll2; |
354 | mclk_rate = mclk->rate * 2; | 354 | mclk_rate = mclk->rate * 2; |
355 | 355 | ||
356 | /* Try each predivider value */ | 356 | /* Try each predivider value */ |
357 | for (__pdiv = 4; __pdiv <= 6; __pdiv++) { | 357 | for (__pdiv = 4; __pdiv <= 6; __pdiv++) { |
358 | __div = mclk_rate / (rate * __pdiv); | 358 | __div = mclk_rate / (rate * __pdiv); |
359 | if (__div < 2 || __div > 127) | 359 | if (__div < 2 || __div > 127) |
360 | continue; | 360 | continue; |
361 | 361 | ||
362 | actual_rate = mclk_rate / (__pdiv * __div); | 362 | actual_rate = mclk_rate / (__pdiv * __div); |
363 | 363 | ||
364 | if (!found || abs(actual_rate - rate) < rate_err) { | 364 | if (!found || abs(actual_rate - rate) < rate_err) { |
365 | *pdiv = __pdiv - 3; | 365 | *pdiv = __pdiv - 3; |
366 | *div = __div; | 366 | *div = __div; |
367 | *psel = (i == 2); | 367 | *psel = (i == 2); |
368 | *esel = (i != 0); | 368 | *esel = (i != 0); |
369 | clk->parent = mclk; | 369 | clk->parent = mclk; |
370 | clk->rate = actual_rate; | 370 | clk->rate = actual_rate; |
371 | rate_err = abs(actual_rate - rate); | 371 | rate_err = abs(actual_rate - rate); |
372 | found = 1; | 372 | found = 1; |
373 | } | 373 | } |
374 | } | 374 | } |
375 | } | 375 | } |
376 | 376 | ||
377 | if (!found) | 377 | if (!found) |
378 | return -EINVAL; | 378 | return -EINVAL; |
379 | 379 | ||
380 | return 0; | 380 | return 0; |
381 | } | 381 | } |
382 | 382 | ||
383 | static int set_div_rate(struct clk *clk, unsigned long rate) | 383 | static int set_div_rate(struct clk *clk, unsigned long rate) |
384 | { | 384 | { |
385 | int err, psel = 0, esel = 0, pdiv = 0, div = 0; | 385 | int err, psel = 0, esel = 0, pdiv = 0, div = 0; |
386 | u32 val; | 386 | u32 val; |
387 | 387 | ||
388 | err = calc_clk_div(clk, rate, &psel, &esel, &pdiv, &div); | 388 | err = calc_clk_div(clk, rate, &psel, &esel, &pdiv, &div); |
389 | if (err) | 389 | if (err) |
390 | return err; | 390 | return err; |
391 | 391 | ||
392 | /* Clear the esel, psel, pdiv and div bits */ | 392 | /* Clear the esel, psel, pdiv and div bits */ |
393 | val = __raw_readl(clk->enable_reg); | 393 | val = __raw_readl(clk->enable_reg); |
394 | val &= ~0x7fff; | 394 | val &= ~0x7fff; |
395 | 395 | ||
396 | /* Set the new esel, psel, pdiv and div bits for the new clock rate */ | 396 | /* Set the new esel, psel, pdiv and div bits for the new clock rate */ |
397 | val |= (esel ? EP93XX_SYSCON_CLKDIV_ESEL : 0) | | 397 | val |= (esel ? EP93XX_SYSCON_CLKDIV_ESEL : 0) | |
398 | (psel ? EP93XX_SYSCON_CLKDIV_PSEL : 0) | | 398 | (psel ? EP93XX_SYSCON_CLKDIV_PSEL : 0) | |
399 | (pdiv << EP93XX_SYSCON_CLKDIV_PDIV_SHIFT) | div; | 399 | (pdiv << EP93XX_SYSCON_CLKDIV_PDIV_SHIFT) | div; |
400 | ep93xx_syscon_swlocked_write(val, clk->enable_reg); | 400 | ep93xx_syscon_swlocked_write(val, clk->enable_reg); |
401 | return 0; | 401 | return 0; |
402 | } | 402 | } |
403 | 403 | ||
404 | int clk_set_rate(struct clk *clk, unsigned long rate) | 404 | int clk_set_rate(struct clk *clk, unsigned long rate) |
405 | { | 405 | { |
406 | if (clk->set_rate) | 406 | if (clk->set_rate) |
407 | return clk->set_rate(clk, rate); | 407 | return clk->set_rate(clk, rate); |
408 | 408 | ||
409 | return -EINVAL; | 409 | return -EINVAL; |
410 | } | 410 | } |
411 | EXPORT_SYMBOL(clk_set_rate); | 411 | EXPORT_SYMBOL(clk_set_rate); |
412 | 412 | ||
413 | 413 | ||
414 | static char fclk_divisors[] = { 1, 2, 4, 8, 16, 1, 1, 1 }; | 414 | static char fclk_divisors[] = { 1, 2, 4, 8, 16, 1, 1, 1 }; |
415 | static char hclk_divisors[] = { 1, 2, 4, 5, 6, 8, 16, 32 }; | 415 | static char hclk_divisors[] = { 1, 2, 4, 5, 6, 8, 16, 32 }; |
416 | static char pclk_divisors[] = { 1, 2, 4, 8 }; | 416 | static char pclk_divisors[] = { 1, 2, 4, 8 }; |
417 | 417 | ||
418 | /* | 418 | /* |
419 | * PLL rate = 14.7456 MHz * (X1FBD + 1) * (X2FBD + 1) / (X2IPD + 1) / 2^PS | 419 | * PLL rate = 14.7456 MHz * (X1FBD + 1) * (X2FBD + 1) / (X2IPD + 1) / 2^PS |
420 | */ | 420 | */ |
421 | static unsigned long calc_pll_rate(u32 config_word) | 421 | static unsigned long calc_pll_rate(u32 config_word) |
422 | { | 422 | { |
423 | unsigned long long rate; | 423 | unsigned long long rate; |
424 | int i; | 424 | int i; |
425 | 425 | ||
426 | rate = clk_xtali.rate; | 426 | rate = clk_xtali.rate; |
427 | rate *= ((config_word >> 11) & 0x1f) + 1; /* X1FBD */ | 427 | rate *= ((config_word >> 11) & 0x1f) + 1; /* X1FBD */ |
428 | rate *= ((config_word >> 5) & 0x3f) + 1; /* X2FBD */ | 428 | rate *= ((config_word >> 5) & 0x3f) + 1; /* X2FBD */ |
429 | do_div(rate, (config_word & 0x1f) + 1); /* X2IPD */ | 429 | do_div(rate, (config_word & 0x1f) + 1); /* X2IPD */ |
430 | for (i = 0; i < ((config_word >> 16) & 3); i++) /* PS */ | 430 | for (i = 0; i < ((config_word >> 16) & 3); i++) /* PS */ |
431 | rate >>= 1; | 431 | rate >>= 1; |
432 | 432 | ||
433 | return (unsigned long)rate; | 433 | return (unsigned long)rate; |
434 | } | 434 | } |
435 | 435 | ||
436 | static void __init ep93xx_dma_clock_init(void) | 436 | static void __init ep93xx_dma_clock_init(void) |
437 | { | 437 | { |
438 | clk_m2p0.rate = clk_h.rate; | 438 | clk_m2p0.rate = clk_h.rate; |
439 | clk_m2p1.rate = clk_h.rate; | 439 | clk_m2p1.rate = clk_h.rate; |
440 | clk_m2p2.rate = clk_h.rate; | 440 | clk_m2p2.rate = clk_h.rate; |
441 | clk_m2p3.rate = clk_h.rate; | 441 | clk_m2p3.rate = clk_h.rate; |
442 | clk_m2p4.rate = clk_h.rate; | 442 | clk_m2p4.rate = clk_h.rate; |
443 | clk_m2p5.rate = clk_h.rate; | 443 | clk_m2p5.rate = clk_h.rate; |
444 | clk_m2p6.rate = clk_h.rate; | 444 | clk_m2p6.rate = clk_h.rate; |
445 | clk_m2p7.rate = clk_h.rate; | 445 | clk_m2p7.rate = clk_h.rate; |
446 | clk_m2p8.rate = clk_h.rate; | 446 | clk_m2p8.rate = clk_h.rate; |
447 | clk_m2p9.rate = clk_h.rate; | 447 | clk_m2p9.rate = clk_h.rate; |
448 | clk_m2m0.rate = clk_h.rate; | 448 | clk_m2m0.rate = clk_h.rate; |
449 | clk_m2m1.rate = clk_h.rate; | 449 | clk_m2m1.rate = clk_h.rate; |
450 | } | 450 | } |
451 | 451 | ||
452 | static int __init ep93xx_clock_init(void) | 452 | static int __init ep93xx_clock_init(void) |
453 | { | 453 | { |
454 | u32 value; | 454 | u32 value; |
455 | 455 | ||
456 | /* Determine the bootloader configured pll1 rate */ | 456 | /* Determine the bootloader configured pll1 rate */ |
457 | value = __raw_readl(EP93XX_SYSCON_CLKSET1); | 457 | value = __raw_readl(EP93XX_SYSCON_CLKSET1); |
458 | if (!(value & EP93XX_SYSCON_CLKSET1_NBYP1)) | 458 | if (!(value & EP93XX_SYSCON_CLKSET1_NBYP1)) |
459 | clk_pll1.rate = clk_xtali.rate; | 459 | clk_pll1.rate = clk_xtali.rate; |
460 | else | 460 | else |
461 | clk_pll1.rate = calc_pll_rate(value); | 461 | clk_pll1.rate = calc_pll_rate(value); |
462 | 462 | ||
463 | /* Initialize the pll1 derived clocks */ | 463 | /* Initialize the pll1 derived clocks */ |
464 | clk_f.rate = clk_pll1.rate / fclk_divisors[(value >> 25) & 0x7]; | 464 | clk_f.rate = clk_pll1.rate / fclk_divisors[(value >> 25) & 0x7]; |
465 | clk_h.rate = clk_pll1.rate / hclk_divisors[(value >> 20) & 0x7]; | 465 | clk_h.rate = clk_pll1.rate / hclk_divisors[(value >> 20) & 0x7]; |
466 | clk_p.rate = clk_h.rate / pclk_divisors[(value >> 18) & 0x3]; | 466 | clk_p.rate = clk_h.rate / pclk_divisors[(value >> 18) & 0x3]; |
467 | ep93xx_dma_clock_init(); | 467 | ep93xx_dma_clock_init(); |
468 | 468 | ||
469 | /* Determine the bootloader configured pll2 rate */ | 469 | /* Determine the bootloader configured pll2 rate */ |
470 | value = __raw_readl(EP93XX_SYSCON_CLKSET2); | 470 | value = __raw_readl(EP93XX_SYSCON_CLKSET2); |
471 | if (!(value & EP93XX_SYSCON_CLKSET2_NBYP2)) | 471 | if (!(value & EP93XX_SYSCON_CLKSET2_NBYP2)) |
472 | clk_pll2.rate = clk_xtali.rate; | 472 | clk_pll2.rate = clk_xtali.rate; |
473 | else if (value & EP93XX_SYSCON_CLKSET2_PLL2_EN) | 473 | else if (value & EP93XX_SYSCON_CLKSET2_PLL2_EN) |
474 | clk_pll2.rate = calc_pll_rate(value); | 474 | clk_pll2.rate = calc_pll_rate(value); |
475 | else | 475 | else |
476 | clk_pll2.rate = 0; | 476 | clk_pll2.rate = 0; |
477 | 477 | ||
478 | /* Initialize the pll2 derived clocks */ | 478 | /* Initialize the pll2 derived clocks */ |
479 | clk_usb_host.rate = clk_pll2.rate / (((value >> 28) & 0xf) + 1); | 479 | clk_usb_host.rate = clk_pll2.rate / (((value >> 28) & 0xf) + 1); |
480 | 480 | ||
481 | /* | 481 | /* |
482 | * EP93xx SSP clock rate was doubled in version E2. For more information | 482 | * EP93xx SSP clock rate was doubled in version E2. For more information |
483 | * see: | 483 | * see: |
484 | * http://www.cirrus.com/en/pubs/appNote/AN273REV4.pdf | 484 | * http://www.cirrus.com/en/pubs/appNote/AN273REV4.pdf |
485 | */ | 485 | */ |
486 | if (ep93xx_chip_revision() < EP93XX_CHIP_REV_E2) | 486 | if (ep93xx_chip_revision() < EP93XX_CHIP_REV_E2) |
487 | clk_spi.rate /= 2; | 487 | clk_spi.rate /= 2; |
488 | 488 | ||
489 | pr_info("PLL1 running at %ld MHz, PLL2 at %ld MHz\n", | 489 | pr_info("PLL1 running at %ld MHz, PLL2 at %ld MHz\n", |
490 | clk_pll1.rate / 1000000, clk_pll2.rate / 1000000); | 490 | clk_pll1.rate / 1000000, clk_pll2.rate / 1000000); |
491 | pr_info("FCLK %ld MHz, HCLK %ld MHz, PCLK %ld MHz\n", | 491 | pr_info("FCLK %ld MHz, HCLK %ld MHz, PCLK %ld MHz\n", |
492 | clk_f.rate / 1000000, clk_h.rate / 1000000, | 492 | clk_f.rate / 1000000, clk_h.rate / 1000000, |
493 | clk_p.rate / 1000000); | 493 | clk_p.rate / 1000000); |
494 | 494 | ||
495 | clkdev_add_table(clocks, ARRAY_SIZE(clocks)); | 495 | clkdev_add_table(clocks, ARRAY_SIZE(clocks)); |
496 | return 0; | 496 | return 0; |
497 | } | 497 | } |
498 | arch_initcall(ep93xx_clock_init); | 498 | arch_initcall(ep93xx_clock_init); |
499 | 499 |
arch/arm/mach-integrator/core.c
1 | /* | 1 | /* |
2 | * linux/arch/arm/mach-integrator/core.c | 2 | * linux/arch/arm/mach-integrator/core.c |
3 | * | 3 | * |
4 | * Copyright (C) 2000-2003 Deep Blue Solutions Ltd | 4 | * Copyright (C) 2000-2003 Deep Blue Solutions Ltd |
5 | * | 5 | * |
6 | * This program is free software; you can redistribute it and/or modify | 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 | 7 | * it under the terms of the GNU General Public License version 2, as |
8 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
9 | */ | 9 | */ |
10 | #include <linux/types.h> | 10 | #include <linux/types.h> |
11 | #include <linux/kernel.h> | 11 | #include <linux/kernel.h> |
12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
13 | #include <linux/device.h> | 13 | #include <linux/device.h> |
14 | #include <linux/spinlock.h> | 14 | #include <linux/spinlock.h> |
15 | #include <linux/interrupt.h> | 15 | #include <linux/interrupt.h> |
16 | #include <linux/irq.h> | 16 | #include <linux/irq.h> |
17 | #include <linux/sched.h> | 17 | #include <linux/sched.h> |
18 | #include <linux/smp.h> | 18 | #include <linux/smp.h> |
19 | #include <linux/termios.h> | 19 | #include <linux/termios.h> |
20 | #include <linux/amba/bus.h> | 20 | #include <linux/amba/bus.h> |
21 | #include <linux/amba/serial.h> | 21 | #include <linux/amba/serial.h> |
22 | #include <linux/io.h> | 22 | #include <linux/io.h> |
23 | 23 | ||
24 | #include <asm/clkdev.h> | 24 | #include <asm/clkdev.h> |
25 | #include <mach/clkdev.h> | 25 | #include <mach/clkdev.h> |
26 | #include <mach/hardware.h> | 26 | #include <mach/hardware.h> |
27 | #include <mach/platform.h> | 27 | #include <mach/platform.h> |
28 | #include <asm/irq.h> | 28 | #include <asm/irq.h> |
29 | #include <mach/cm.h> | 29 | #include <mach/cm.h> |
30 | #include <asm/system.h> | 30 | #include <asm/system.h> |
31 | #include <asm/leds.h> | 31 | #include <asm/leds.h> |
32 | #include <asm/mach/time.h> | 32 | #include <asm/mach/time.h> |
33 | 33 | ||
34 | static struct amba_pl010_data integrator_uart_data; | 34 | static struct amba_pl010_data integrator_uart_data; |
35 | 35 | ||
36 | static struct amba_device rtc_device = { | 36 | static struct amba_device rtc_device = { |
37 | .dev = { | 37 | .dev = { |
38 | .init_name = "mb:15", | 38 | .init_name = "mb:15", |
39 | }, | 39 | }, |
40 | .res = { | 40 | .res = { |
41 | .start = INTEGRATOR_RTC_BASE, | 41 | .start = INTEGRATOR_RTC_BASE, |
42 | .end = INTEGRATOR_RTC_BASE + SZ_4K - 1, | 42 | .end = INTEGRATOR_RTC_BASE + SZ_4K - 1, |
43 | .flags = IORESOURCE_MEM, | 43 | .flags = IORESOURCE_MEM, |
44 | }, | 44 | }, |
45 | .irq = { IRQ_RTCINT, NO_IRQ }, | 45 | .irq = { IRQ_RTCINT, NO_IRQ }, |
46 | .periphid = 0x00041030, | 46 | .periphid = 0x00041030, |
47 | }; | 47 | }; |
48 | 48 | ||
49 | static struct amba_device uart0_device = { | 49 | static struct amba_device uart0_device = { |
50 | .dev = { | 50 | .dev = { |
51 | .init_name = "mb:16", | 51 | .init_name = "mb:16", |
52 | .platform_data = &integrator_uart_data, | 52 | .platform_data = &integrator_uart_data, |
53 | }, | 53 | }, |
54 | .res = { | 54 | .res = { |
55 | .start = INTEGRATOR_UART0_BASE, | 55 | .start = INTEGRATOR_UART0_BASE, |
56 | .end = INTEGRATOR_UART0_BASE + SZ_4K - 1, | 56 | .end = INTEGRATOR_UART0_BASE + SZ_4K - 1, |
57 | .flags = IORESOURCE_MEM, | 57 | .flags = IORESOURCE_MEM, |
58 | }, | 58 | }, |
59 | .irq = { IRQ_UARTINT0, NO_IRQ }, | 59 | .irq = { IRQ_UARTINT0, NO_IRQ }, |
60 | .periphid = 0x0041010, | 60 | .periphid = 0x0041010, |
61 | }; | 61 | }; |
62 | 62 | ||
63 | static struct amba_device uart1_device = { | 63 | static struct amba_device uart1_device = { |
64 | .dev = { | 64 | .dev = { |
65 | .init_name = "mb:17", | 65 | .init_name = "mb:17", |
66 | .platform_data = &integrator_uart_data, | 66 | .platform_data = &integrator_uart_data, |
67 | }, | 67 | }, |
68 | .res = { | 68 | .res = { |
69 | .start = INTEGRATOR_UART1_BASE, | 69 | .start = INTEGRATOR_UART1_BASE, |
70 | .end = INTEGRATOR_UART1_BASE + SZ_4K - 1, | 70 | .end = INTEGRATOR_UART1_BASE + SZ_4K - 1, |
71 | .flags = IORESOURCE_MEM, | 71 | .flags = IORESOURCE_MEM, |
72 | }, | 72 | }, |
73 | .irq = { IRQ_UARTINT1, NO_IRQ }, | 73 | .irq = { IRQ_UARTINT1, NO_IRQ }, |
74 | .periphid = 0x0041010, | 74 | .periphid = 0x0041010, |
75 | }; | 75 | }; |
76 | 76 | ||
77 | static struct amba_device kmi0_device = { | 77 | static struct amba_device kmi0_device = { |
78 | .dev = { | 78 | .dev = { |
79 | .init_name = "mb:18", | 79 | .init_name = "mb:18", |
80 | }, | 80 | }, |
81 | .res = { | 81 | .res = { |
82 | .start = KMI0_BASE, | 82 | .start = KMI0_BASE, |
83 | .end = KMI0_BASE + SZ_4K - 1, | 83 | .end = KMI0_BASE + SZ_4K - 1, |
84 | .flags = IORESOURCE_MEM, | 84 | .flags = IORESOURCE_MEM, |
85 | }, | 85 | }, |
86 | .irq = { IRQ_KMIINT0, NO_IRQ }, | 86 | .irq = { IRQ_KMIINT0, NO_IRQ }, |
87 | .periphid = 0x00041050, | 87 | .periphid = 0x00041050, |
88 | }; | 88 | }; |
89 | 89 | ||
90 | static struct amba_device kmi1_device = { | 90 | static struct amba_device kmi1_device = { |
91 | .dev = { | 91 | .dev = { |
92 | .init_name = "mb:19", | 92 | .init_name = "mb:19", |
93 | }, | 93 | }, |
94 | .res = { | 94 | .res = { |
95 | .start = KMI1_BASE, | 95 | .start = KMI1_BASE, |
96 | .end = KMI1_BASE + SZ_4K - 1, | 96 | .end = KMI1_BASE + SZ_4K - 1, |
97 | .flags = IORESOURCE_MEM, | 97 | .flags = IORESOURCE_MEM, |
98 | }, | 98 | }, |
99 | .irq = { IRQ_KMIINT1, NO_IRQ }, | 99 | .irq = { IRQ_KMIINT1, NO_IRQ }, |
100 | .periphid = 0x00041050, | 100 | .periphid = 0x00041050, |
101 | }; | 101 | }; |
102 | 102 | ||
103 | static struct amba_device *amba_devs[] __initdata = { | 103 | static struct amba_device *amba_devs[] __initdata = { |
104 | &rtc_device, | 104 | &rtc_device, |
105 | &uart0_device, | 105 | &uart0_device, |
106 | &uart1_device, | 106 | &uart1_device, |
107 | &kmi0_device, | 107 | &kmi0_device, |
108 | &kmi1_device, | 108 | &kmi1_device, |
109 | }; | 109 | }; |
110 | 110 | ||
111 | /* | 111 | /* |
112 | * These are fixed clocks. | 112 | * These are fixed clocks. |
113 | */ | 113 | */ |
114 | static struct clk clk24mhz = { | 114 | static struct clk clk24mhz = { |
115 | .rate = 24000000, | 115 | .rate = 24000000, |
116 | }; | 116 | }; |
117 | 117 | ||
118 | static struct clk uartclk = { | 118 | static struct clk uartclk = { |
119 | .rate = 14745600, | 119 | .rate = 14745600, |
120 | }; | 120 | }; |
121 | 121 | ||
122 | static struct clk dummy_apb_pclk; | ||
123 | |||
122 | static struct clk_lookup lookups[] = { | 124 | static struct clk_lookup lookups[] = { |
123 | { /* UART0 */ | 125 | { /* Bus clock */ |
126 | .con_id = "apb_pclk", | ||
127 | .clk = &dummy_apb_pclk, | ||
128 | }, { /* UART0 */ | ||
124 | .dev_id = "mb:16", | 129 | .dev_id = "mb:16", |
125 | .clk = &uartclk, | 130 | .clk = &uartclk, |
126 | }, { /* UART1 */ | 131 | }, { /* UART1 */ |
127 | .dev_id = "mb:17", | 132 | .dev_id = "mb:17", |
128 | .clk = &uartclk, | 133 | .clk = &uartclk, |
129 | }, { /* KMI0 */ | 134 | }, { /* KMI0 */ |
130 | .dev_id = "mb:18", | 135 | .dev_id = "mb:18", |
131 | .clk = &clk24mhz, | 136 | .clk = &clk24mhz, |
132 | }, { /* KMI1 */ | 137 | }, { /* KMI1 */ |
133 | .dev_id = "mb:19", | 138 | .dev_id = "mb:19", |
134 | .clk = &clk24mhz, | 139 | .clk = &clk24mhz, |
135 | }, { /* MMCI - IntegratorCP */ | 140 | }, { /* MMCI - IntegratorCP */ |
136 | .dev_id = "mb:1c", | 141 | .dev_id = "mb:1c", |
137 | .clk = &uartclk, | 142 | .clk = &uartclk, |
138 | } | 143 | } |
139 | }; | 144 | }; |
140 | 145 | ||
141 | static int __init integrator_init(void) | 146 | static int __init integrator_init(void) |
142 | { | 147 | { |
143 | int i; | 148 | int i; |
144 | 149 | ||
145 | clkdev_add_table(lookups, ARRAY_SIZE(lookups)); | 150 | clkdev_add_table(lookups, ARRAY_SIZE(lookups)); |
146 | 151 | ||
147 | for (i = 0; i < ARRAY_SIZE(amba_devs); i++) { | 152 | for (i = 0; i < ARRAY_SIZE(amba_devs); i++) { |
148 | struct amba_device *d = amba_devs[i]; | 153 | struct amba_device *d = amba_devs[i]; |
149 | amba_device_register(d, &iomem_resource); | 154 | amba_device_register(d, &iomem_resource); |
150 | } | 155 | } |
151 | 156 | ||
152 | return 0; | 157 | return 0; |
153 | } | 158 | } |
154 | 159 | ||
155 | arch_initcall(integrator_init); | 160 | arch_initcall(integrator_init); |
156 | 161 | ||
157 | /* | 162 | /* |
158 | * On the Integrator platform, the port RTS and DTR are provided by | 163 | * On the Integrator platform, the port RTS and DTR are provided by |
159 | * bits in the following SC_CTRLS register bits: | 164 | * bits in the following SC_CTRLS register bits: |
160 | * RTS DTR | 165 | * RTS DTR |
161 | * UART0 7 6 | 166 | * UART0 7 6 |
162 | * UART1 5 4 | 167 | * UART1 5 4 |
163 | */ | 168 | */ |
164 | #define SC_CTRLC IO_ADDRESS(INTEGRATOR_SC_CTRLC) | 169 | #define SC_CTRLC IO_ADDRESS(INTEGRATOR_SC_CTRLC) |
165 | #define SC_CTRLS IO_ADDRESS(INTEGRATOR_SC_CTRLS) | 170 | #define SC_CTRLS IO_ADDRESS(INTEGRATOR_SC_CTRLS) |
166 | 171 | ||
167 | static void integrator_uart_set_mctrl(struct amba_device *dev, void __iomem *base, unsigned int mctrl) | 172 | static void integrator_uart_set_mctrl(struct amba_device *dev, void __iomem *base, unsigned int mctrl) |
168 | { | 173 | { |
169 | unsigned int ctrls = 0, ctrlc = 0, rts_mask, dtr_mask; | 174 | unsigned int ctrls = 0, ctrlc = 0, rts_mask, dtr_mask; |
170 | 175 | ||
171 | if (dev == &uart0_device) { | 176 | if (dev == &uart0_device) { |
172 | rts_mask = 1 << 4; | 177 | rts_mask = 1 << 4; |
173 | dtr_mask = 1 << 5; | 178 | dtr_mask = 1 << 5; |
174 | } else { | 179 | } else { |
175 | rts_mask = 1 << 6; | 180 | rts_mask = 1 << 6; |
176 | dtr_mask = 1 << 7; | 181 | dtr_mask = 1 << 7; |
177 | } | 182 | } |
178 | 183 | ||
179 | if (mctrl & TIOCM_RTS) | 184 | if (mctrl & TIOCM_RTS) |
180 | ctrlc |= rts_mask; | 185 | ctrlc |= rts_mask; |
181 | else | 186 | else |
182 | ctrls |= rts_mask; | 187 | ctrls |= rts_mask; |
183 | 188 | ||
184 | if (mctrl & TIOCM_DTR) | 189 | if (mctrl & TIOCM_DTR) |
185 | ctrlc |= dtr_mask; | 190 | ctrlc |= dtr_mask; |
186 | else | 191 | else |
187 | ctrls |= dtr_mask; | 192 | ctrls |= dtr_mask; |
188 | 193 | ||
189 | __raw_writel(ctrls, SC_CTRLS); | 194 | __raw_writel(ctrls, SC_CTRLS); |
190 | __raw_writel(ctrlc, SC_CTRLC); | 195 | __raw_writel(ctrlc, SC_CTRLC); |
191 | } | 196 | } |
192 | 197 | ||
193 | static struct amba_pl010_data integrator_uart_data = { | 198 | static struct amba_pl010_data integrator_uart_data = { |
194 | .set_mctrl = integrator_uart_set_mctrl, | 199 | .set_mctrl = integrator_uart_set_mctrl, |
195 | }; | 200 | }; |
196 | 201 | ||
197 | #define CM_CTRL IO_ADDRESS(INTEGRATOR_HDR_CTRL) | 202 | #define CM_CTRL IO_ADDRESS(INTEGRATOR_HDR_CTRL) |
198 | 203 | ||
199 | static DEFINE_SPINLOCK(cm_lock); | 204 | static DEFINE_SPINLOCK(cm_lock); |
200 | 205 | ||
201 | /** | 206 | /** |
202 | * cm_control - update the CM_CTRL register. | 207 | * cm_control - update the CM_CTRL register. |
203 | * @mask: bits to change | 208 | * @mask: bits to change |
204 | * @set: bits to set | 209 | * @set: bits to set |
205 | */ | 210 | */ |
206 | void cm_control(u32 mask, u32 set) | 211 | void cm_control(u32 mask, u32 set) |
207 | { | 212 | { |
208 | unsigned long flags; | 213 | unsigned long flags; |
209 | u32 val; | 214 | u32 val; |
210 | 215 | ||
211 | spin_lock_irqsave(&cm_lock, flags); | 216 | spin_lock_irqsave(&cm_lock, flags); |
212 | val = readl(CM_CTRL) & ~mask; | 217 | val = readl(CM_CTRL) & ~mask; |
213 | writel(val | set, CM_CTRL); | 218 | writel(val | set, CM_CTRL); |
214 | spin_unlock_irqrestore(&cm_lock, flags); | 219 | spin_unlock_irqrestore(&cm_lock, flags); |
215 | } | 220 | } |
216 | 221 | ||
217 | EXPORT_SYMBOL(cm_control); | 222 | EXPORT_SYMBOL(cm_control); |
218 | 223 |
arch/arm/mach-nomadik/clock.c
1 | /* | 1 | /* |
2 | * linux/arch/arm/mach-nomadik/clock.c | 2 | * linux/arch/arm/mach-nomadik/clock.c |
3 | * | 3 | * |
4 | * Copyright (C) 2009 Alessandro Rubini | 4 | * Copyright (C) 2009 Alessandro Rubini |
5 | */ | 5 | */ |
6 | #include <linux/kernel.h> | 6 | #include <linux/kernel.h> |
7 | #include <linux/module.h> | 7 | #include <linux/module.h> |
8 | #include <linux/errno.h> | 8 | #include <linux/errno.h> |
9 | #include <linux/clk.h> | 9 | #include <linux/clk.h> |
10 | #include <asm/clkdev.h> | 10 | #include <asm/clkdev.h> |
11 | #include "clock.h" | 11 | #include "clock.h" |
12 | 12 | ||
13 | /* | 13 | /* |
14 | * The nomadik board uses generic clocks, but the serial pl011 file | 14 | * The nomadik board uses generic clocks, but the serial pl011 file |
15 | * calls clk_enable(), clk_disable(), clk_get_rate(), so we provide them | 15 | * calls clk_enable(), clk_disable(), clk_get_rate(), so we provide them |
16 | */ | 16 | */ |
17 | unsigned long clk_get_rate(struct clk *clk) | 17 | unsigned long clk_get_rate(struct clk *clk) |
18 | { | 18 | { |
19 | return clk->rate; | 19 | return clk->rate; |
20 | } | 20 | } |
21 | EXPORT_SYMBOL(clk_get_rate); | 21 | EXPORT_SYMBOL(clk_get_rate); |
22 | 22 | ||
23 | /* enable and disable do nothing */ | 23 | /* enable and disable do nothing */ |
24 | int clk_enable(struct clk *clk) | 24 | int clk_enable(struct clk *clk) |
25 | { | 25 | { |
26 | return 0; | 26 | return 0; |
27 | } | 27 | } |
28 | EXPORT_SYMBOL(clk_enable); | 28 | EXPORT_SYMBOL(clk_enable); |
29 | 29 | ||
30 | void clk_disable(struct clk *clk) | 30 | void clk_disable(struct clk *clk) |
31 | { | 31 | { |
32 | } | 32 | } |
33 | EXPORT_SYMBOL(clk_disable); | 33 | EXPORT_SYMBOL(clk_disable); |
34 | 34 | ||
35 | static struct clk clk_24 = { | 35 | static struct clk clk_24 = { |
36 | .rate = 2400000, | 36 | .rate = 2400000, |
37 | }; | 37 | }; |
38 | 38 | ||
39 | static struct clk clk_48 = { | 39 | static struct clk clk_48 = { |
40 | .rate = 48 * 1000 * 1000, | 40 | .rate = 48 * 1000 * 1000, |
41 | }; | 41 | }; |
42 | 42 | ||
43 | /* | 43 | /* |
44 | * Catch-all default clock to satisfy drivers using the clk API. We don't | 44 | * Catch-all default clock to satisfy drivers using the clk API. We don't |
45 | * model the actual hardware clocks yet. | 45 | * model the actual hardware clocks yet. |
46 | */ | 46 | */ |
47 | static struct clk clk_default; | 47 | static struct clk clk_default; |
48 | 48 | ||
49 | #define CLK(_clk, dev) \ | 49 | #define CLK(_clk, dev) \ |
50 | { \ | 50 | { \ |
51 | .clk = _clk, \ | 51 | .clk = _clk, \ |
52 | .dev_id = dev, \ | 52 | .dev_id = dev, \ |
53 | } | 53 | } |
54 | 54 | ||
55 | static struct clk_lookup lookups[] = { | 55 | static struct clk_lookup lookups[] = { |
56 | { | ||
57 | .con_id = "apb_pclk", | ||
58 | .clk = &clk_default, | ||
59 | }, | ||
56 | CLK(&clk_24, "mtu0"), | 60 | CLK(&clk_24, "mtu0"), |
57 | CLK(&clk_24, "mtu1"), | 61 | CLK(&clk_24, "mtu1"), |
58 | CLK(&clk_48, "uart0"), | 62 | CLK(&clk_48, "uart0"), |
59 | CLK(&clk_48, "uart1"), | 63 | CLK(&clk_48, "uart1"), |
60 | CLK(&clk_default, "gpio.0"), | 64 | CLK(&clk_default, "gpio.0"), |
61 | CLK(&clk_default, "gpio.1"), | 65 | CLK(&clk_default, "gpio.1"), |
62 | CLK(&clk_default, "gpio.2"), | 66 | CLK(&clk_default, "gpio.2"), |
63 | CLK(&clk_default, "gpio.3"), | 67 | CLK(&clk_default, "gpio.3"), |
64 | CLK(&clk_default, "rng"), | 68 | CLK(&clk_default, "rng"), |
65 | }; | 69 | }; |
66 | 70 | ||
67 | int __init clk_init(void) | 71 | int __init clk_init(void) |
68 | { | 72 | { |
69 | clkdev_add_table(lookups, ARRAY_SIZE(lookups)); | 73 | clkdev_add_table(lookups, ARRAY_SIZE(lookups)); |
70 | return 0; | 74 | return 0; |
71 | } | 75 | } |
72 | 76 |
arch/arm/mach-omap2/clock3xxx_data.c
1 | /* | 1 | /* |
2 | * OMAP3 clock data | 2 | * OMAP3 clock data |
3 | * | 3 | * |
4 | * Copyright (C) 2007-2010 Texas Instruments, Inc. | 4 | * Copyright (C) 2007-2010 Texas Instruments, Inc. |
5 | * Copyright (C) 2007-2010 Nokia Corporation | 5 | * Copyright (C) 2007-2010 Nokia Corporation |
6 | * | 6 | * |
7 | * Written by Paul Walmsley | 7 | * Written by Paul Walmsley |
8 | * With many device clock fixes by Kevin Hilman and Jouni Hรถgander | 8 | * With many device clock fixes by Kevin Hilman and Jouni Hรถgander |
9 | * DPLL bypass clock support added by Roman Tereshonkov | 9 | * DPLL bypass clock support added by Roman Tereshonkov |
10 | * | 10 | * |
11 | */ | 11 | */ |
12 | 12 | ||
13 | /* | 13 | /* |
14 | * Virtual clocks are introduced as convenient tools. | 14 | * Virtual clocks are introduced as convenient tools. |
15 | * They are sources for other clocks and not supposed | 15 | * They are sources for other clocks and not supposed |
16 | * to be requested from drivers directly. | 16 | * to be requested from drivers directly. |
17 | */ | 17 | */ |
18 | 18 | ||
19 | #include <linux/kernel.h> | 19 | #include <linux/kernel.h> |
20 | #include <linux/clk.h> | 20 | #include <linux/clk.h> |
21 | #include <linux/list.h> | 21 | #include <linux/list.h> |
22 | 22 | ||
23 | #include <plat/control.h> | 23 | #include <plat/control.h> |
24 | #include <plat/clkdev_omap.h> | 24 | #include <plat/clkdev_omap.h> |
25 | 25 | ||
26 | #include "clock.h" | 26 | #include "clock.h" |
27 | #include "clock3xxx.h" | 27 | #include "clock3xxx.h" |
28 | #include "clock34xx.h" | 28 | #include "clock34xx.h" |
29 | #include "clock36xx.h" | 29 | #include "clock36xx.h" |
30 | #include "clock3517.h" | 30 | #include "clock3517.h" |
31 | 31 | ||
32 | #include "cm.h" | 32 | #include "cm.h" |
33 | #include "cm-regbits-34xx.h" | 33 | #include "cm-regbits-34xx.h" |
34 | #include "prm.h" | 34 | #include "prm.h" |
35 | #include "prm-regbits-34xx.h" | 35 | #include "prm-regbits-34xx.h" |
36 | 36 | ||
37 | /* | 37 | /* |
38 | * clocks | 38 | * clocks |
39 | */ | 39 | */ |
40 | 40 | ||
41 | #define OMAP_CM_REGADDR OMAP34XX_CM_REGADDR | 41 | #define OMAP_CM_REGADDR OMAP34XX_CM_REGADDR |
42 | 42 | ||
43 | /* Maximum DPLL multiplier, divider values for OMAP3 */ | 43 | /* Maximum DPLL multiplier, divider values for OMAP3 */ |
44 | #define OMAP3_MAX_DPLL_MULT 2047 | 44 | #define OMAP3_MAX_DPLL_MULT 2047 |
45 | #define OMAP3630_MAX_JTYPE_DPLL_MULT 4095 | 45 | #define OMAP3630_MAX_JTYPE_DPLL_MULT 4095 |
46 | #define OMAP3_MAX_DPLL_DIV 128 | 46 | #define OMAP3_MAX_DPLL_DIV 128 |
47 | 47 | ||
48 | /* | 48 | /* |
49 | * DPLL1 supplies clock to the MPU. | 49 | * DPLL1 supplies clock to the MPU. |
50 | * DPLL2 supplies clock to the IVA2. | 50 | * DPLL2 supplies clock to the IVA2. |
51 | * DPLL3 supplies CORE domain clocks. | 51 | * DPLL3 supplies CORE domain clocks. |
52 | * DPLL4 supplies peripheral clocks. | 52 | * DPLL4 supplies peripheral clocks. |
53 | * DPLL5 supplies other peripheral clocks (USBHOST, USIM). | 53 | * DPLL5 supplies other peripheral clocks (USBHOST, USIM). |
54 | */ | 54 | */ |
55 | 55 | ||
56 | /* Forward declarations for DPLL bypass clocks */ | 56 | /* Forward declarations for DPLL bypass clocks */ |
57 | static struct clk dpll1_fck; | 57 | static struct clk dpll1_fck; |
58 | static struct clk dpll2_fck; | 58 | static struct clk dpll2_fck; |
59 | 59 | ||
60 | /* PRM CLOCKS */ | 60 | /* PRM CLOCKS */ |
61 | 61 | ||
62 | /* According to timer32k.c, this is a 32768Hz clock, not a 32000Hz clock. */ | 62 | /* According to timer32k.c, this is a 32768Hz clock, not a 32000Hz clock. */ |
63 | static struct clk omap_32k_fck = { | 63 | static struct clk omap_32k_fck = { |
64 | .name = "omap_32k_fck", | 64 | .name = "omap_32k_fck", |
65 | .ops = &clkops_null, | 65 | .ops = &clkops_null, |
66 | .rate = 32768, | 66 | .rate = 32768, |
67 | }; | 67 | }; |
68 | 68 | ||
69 | static struct clk secure_32k_fck = { | 69 | static struct clk secure_32k_fck = { |
70 | .name = "secure_32k_fck", | 70 | .name = "secure_32k_fck", |
71 | .ops = &clkops_null, | 71 | .ops = &clkops_null, |
72 | .rate = 32768, | 72 | .rate = 32768, |
73 | }; | 73 | }; |
74 | 74 | ||
75 | /* Virtual source clocks for osc_sys_ck */ | 75 | /* Virtual source clocks for osc_sys_ck */ |
76 | static struct clk virt_12m_ck = { | 76 | static struct clk virt_12m_ck = { |
77 | .name = "virt_12m_ck", | 77 | .name = "virt_12m_ck", |
78 | .ops = &clkops_null, | 78 | .ops = &clkops_null, |
79 | .rate = 12000000, | 79 | .rate = 12000000, |
80 | }; | 80 | }; |
81 | 81 | ||
82 | static struct clk virt_13m_ck = { | 82 | static struct clk virt_13m_ck = { |
83 | .name = "virt_13m_ck", | 83 | .name = "virt_13m_ck", |
84 | .ops = &clkops_null, | 84 | .ops = &clkops_null, |
85 | .rate = 13000000, | 85 | .rate = 13000000, |
86 | }; | 86 | }; |
87 | 87 | ||
88 | static struct clk virt_16_8m_ck = { | 88 | static struct clk virt_16_8m_ck = { |
89 | .name = "virt_16_8m_ck", | 89 | .name = "virt_16_8m_ck", |
90 | .ops = &clkops_null, | 90 | .ops = &clkops_null, |
91 | .rate = 16800000, | 91 | .rate = 16800000, |
92 | }; | 92 | }; |
93 | 93 | ||
94 | static struct clk virt_19_2m_ck = { | 94 | static struct clk virt_19_2m_ck = { |
95 | .name = "virt_19_2m_ck", | 95 | .name = "virt_19_2m_ck", |
96 | .ops = &clkops_null, | 96 | .ops = &clkops_null, |
97 | .rate = 19200000, | 97 | .rate = 19200000, |
98 | }; | 98 | }; |
99 | 99 | ||
100 | static struct clk virt_26m_ck = { | 100 | static struct clk virt_26m_ck = { |
101 | .name = "virt_26m_ck", | 101 | .name = "virt_26m_ck", |
102 | .ops = &clkops_null, | 102 | .ops = &clkops_null, |
103 | .rate = 26000000, | 103 | .rate = 26000000, |
104 | }; | 104 | }; |
105 | 105 | ||
106 | static struct clk virt_38_4m_ck = { | 106 | static struct clk virt_38_4m_ck = { |
107 | .name = "virt_38_4m_ck", | 107 | .name = "virt_38_4m_ck", |
108 | .ops = &clkops_null, | 108 | .ops = &clkops_null, |
109 | .rate = 38400000, | 109 | .rate = 38400000, |
110 | }; | 110 | }; |
111 | 111 | ||
112 | static const struct clksel_rate osc_sys_12m_rates[] = { | 112 | static const struct clksel_rate osc_sys_12m_rates[] = { |
113 | { .div = 1, .val = 0, .flags = RATE_IN_3XXX }, | 113 | { .div = 1, .val = 0, .flags = RATE_IN_3XXX }, |
114 | { .div = 0 } | 114 | { .div = 0 } |
115 | }; | 115 | }; |
116 | 116 | ||
117 | static const struct clksel_rate osc_sys_13m_rates[] = { | 117 | static const struct clksel_rate osc_sys_13m_rates[] = { |
118 | { .div = 1, .val = 1, .flags = RATE_IN_3XXX }, | 118 | { .div = 1, .val = 1, .flags = RATE_IN_3XXX }, |
119 | { .div = 0 } | 119 | { .div = 0 } |
120 | }; | 120 | }; |
121 | 121 | ||
122 | static const struct clksel_rate osc_sys_16_8m_rates[] = { | 122 | static const struct clksel_rate osc_sys_16_8m_rates[] = { |
123 | { .div = 1, .val = 5, .flags = RATE_IN_3430ES2PLUS }, | 123 | { .div = 1, .val = 5, .flags = RATE_IN_3430ES2PLUS }, |
124 | { .div = 0 } | 124 | { .div = 0 } |
125 | }; | 125 | }; |
126 | 126 | ||
127 | static const struct clksel_rate osc_sys_19_2m_rates[] = { | 127 | static const struct clksel_rate osc_sys_19_2m_rates[] = { |
128 | { .div = 1, .val = 2, .flags = RATE_IN_3XXX }, | 128 | { .div = 1, .val = 2, .flags = RATE_IN_3XXX }, |
129 | { .div = 0 } | 129 | { .div = 0 } |
130 | }; | 130 | }; |
131 | 131 | ||
132 | static const struct clksel_rate osc_sys_26m_rates[] = { | 132 | static const struct clksel_rate osc_sys_26m_rates[] = { |
133 | { .div = 1, .val = 3, .flags = RATE_IN_3XXX }, | 133 | { .div = 1, .val = 3, .flags = RATE_IN_3XXX }, |
134 | { .div = 0 } | 134 | { .div = 0 } |
135 | }; | 135 | }; |
136 | 136 | ||
137 | static const struct clksel_rate osc_sys_38_4m_rates[] = { | 137 | static const struct clksel_rate osc_sys_38_4m_rates[] = { |
138 | { .div = 1, .val = 4, .flags = RATE_IN_3XXX }, | 138 | { .div = 1, .val = 4, .flags = RATE_IN_3XXX }, |
139 | { .div = 0 } | 139 | { .div = 0 } |
140 | }; | 140 | }; |
141 | 141 | ||
142 | static const struct clksel osc_sys_clksel[] = { | 142 | static const struct clksel osc_sys_clksel[] = { |
143 | { .parent = &virt_12m_ck, .rates = osc_sys_12m_rates }, | 143 | { .parent = &virt_12m_ck, .rates = osc_sys_12m_rates }, |
144 | { .parent = &virt_13m_ck, .rates = osc_sys_13m_rates }, | 144 | { .parent = &virt_13m_ck, .rates = osc_sys_13m_rates }, |
145 | { .parent = &virt_16_8m_ck, .rates = osc_sys_16_8m_rates }, | 145 | { .parent = &virt_16_8m_ck, .rates = osc_sys_16_8m_rates }, |
146 | { .parent = &virt_19_2m_ck, .rates = osc_sys_19_2m_rates }, | 146 | { .parent = &virt_19_2m_ck, .rates = osc_sys_19_2m_rates }, |
147 | { .parent = &virt_26m_ck, .rates = osc_sys_26m_rates }, | 147 | { .parent = &virt_26m_ck, .rates = osc_sys_26m_rates }, |
148 | { .parent = &virt_38_4m_ck, .rates = osc_sys_38_4m_rates }, | 148 | { .parent = &virt_38_4m_ck, .rates = osc_sys_38_4m_rates }, |
149 | { .parent = NULL }, | 149 | { .parent = NULL }, |
150 | }; | 150 | }; |
151 | 151 | ||
152 | /* Oscillator clock */ | 152 | /* Oscillator clock */ |
153 | /* 12, 13, 16.8, 19.2, 26, or 38.4 MHz */ | 153 | /* 12, 13, 16.8, 19.2, 26, or 38.4 MHz */ |
154 | static struct clk osc_sys_ck = { | 154 | static struct clk osc_sys_ck = { |
155 | .name = "osc_sys_ck", | 155 | .name = "osc_sys_ck", |
156 | .ops = &clkops_null, | 156 | .ops = &clkops_null, |
157 | .init = &omap2_init_clksel_parent, | 157 | .init = &omap2_init_clksel_parent, |
158 | .clksel_reg = OMAP3430_PRM_CLKSEL, | 158 | .clksel_reg = OMAP3430_PRM_CLKSEL, |
159 | .clksel_mask = OMAP3430_SYS_CLKIN_SEL_MASK, | 159 | .clksel_mask = OMAP3430_SYS_CLKIN_SEL_MASK, |
160 | .clksel = osc_sys_clksel, | 160 | .clksel = osc_sys_clksel, |
161 | /* REVISIT: deal with autoextclkmode? */ | 161 | /* REVISIT: deal with autoextclkmode? */ |
162 | .recalc = &omap2_clksel_recalc, | 162 | .recalc = &omap2_clksel_recalc, |
163 | }; | 163 | }; |
164 | 164 | ||
165 | static const struct clksel_rate div2_rates[] = { | 165 | static const struct clksel_rate div2_rates[] = { |
166 | { .div = 1, .val = 1, .flags = RATE_IN_3XXX }, | 166 | { .div = 1, .val = 1, .flags = RATE_IN_3XXX }, |
167 | { .div = 2, .val = 2, .flags = RATE_IN_3XXX }, | 167 | { .div = 2, .val = 2, .flags = RATE_IN_3XXX }, |
168 | { .div = 0 } | 168 | { .div = 0 } |
169 | }; | 169 | }; |
170 | 170 | ||
171 | static const struct clksel sys_clksel[] = { | 171 | static const struct clksel sys_clksel[] = { |
172 | { .parent = &osc_sys_ck, .rates = div2_rates }, | 172 | { .parent = &osc_sys_ck, .rates = div2_rates }, |
173 | { .parent = NULL } | 173 | { .parent = NULL } |
174 | }; | 174 | }; |
175 | 175 | ||
176 | /* Latency: this clock is only enabled after PRM_CLKSETUP.SETUP_TIME */ | 176 | /* Latency: this clock is only enabled after PRM_CLKSETUP.SETUP_TIME */ |
177 | /* Feeds DPLLs - divided first by PRM_CLKSRC_CTRL.SYSCLKDIV? */ | 177 | /* Feeds DPLLs - divided first by PRM_CLKSRC_CTRL.SYSCLKDIV? */ |
178 | static struct clk sys_ck = { | 178 | static struct clk sys_ck = { |
179 | .name = "sys_ck", | 179 | .name = "sys_ck", |
180 | .ops = &clkops_null, | 180 | .ops = &clkops_null, |
181 | .parent = &osc_sys_ck, | 181 | .parent = &osc_sys_ck, |
182 | .init = &omap2_init_clksel_parent, | 182 | .init = &omap2_init_clksel_parent, |
183 | .clksel_reg = OMAP3430_PRM_CLKSRC_CTRL, | 183 | .clksel_reg = OMAP3430_PRM_CLKSRC_CTRL, |
184 | .clksel_mask = OMAP_SYSCLKDIV_MASK, | 184 | .clksel_mask = OMAP_SYSCLKDIV_MASK, |
185 | .clksel = sys_clksel, | 185 | .clksel = sys_clksel, |
186 | .recalc = &omap2_clksel_recalc, | 186 | .recalc = &omap2_clksel_recalc, |
187 | }; | 187 | }; |
188 | 188 | ||
189 | static struct clk sys_altclk = { | 189 | static struct clk sys_altclk = { |
190 | .name = "sys_altclk", | 190 | .name = "sys_altclk", |
191 | .ops = &clkops_null, | 191 | .ops = &clkops_null, |
192 | }; | 192 | }; |
193 | 193 | ||
194 | /* Optional external clock input for some McBSPs */ | 194 | /* Optional external clock input for some McBSPs */ |
195 | static struct clk mcbsp_clks = { | 195 | static struct clk mcbsp_clks = { |
196 | .name = "mcbsp_clks", | 196 | .name = "mcbsp_clks", |
197 | .ops = &clkops_null, | 197 | .ops = &clkops_null, |
198 | }; | 198 | }; |
199 | 199 | ||
200 | /* PRM EXTERNAL CLOCK OUTPUT */ | 200 | /* PRM EXTERNAL CLOCK OUTPUT */ |
201 | 201 | ||
202 | static struct clk sys_clkout1 = { | 202 | static struct clk sys_clkout1 = { |
203 | .name = "sys_clkout1", | 203 | .name = "sys_clkout1", |
204 | .ops = &clkops_omap2_dflt, | 204 | .ops = &clkops_omap2_dflt, |
205 | .parent = &osc_sys_ck, | 205 | .parent = &osc_sys_ck, |
206 | .enable_reg = OMAP3430_PRM_CLKOUT_CTRL, | 206 | .enable_reg = OMAP3430_PRM_CLKOUT_CTRL, |
207 | .enable_bit = OMAP3430_CLKOUT_EN_SHIFT, | 207 | .enable_bit = OMAP3430_CLKOUT_EN_SHIFT, |
208 | .recalc = &followparent_recalc, | 208 | .recalc = &followparent_recalc, |
209 | }; | 209 | }; |
210 | 210 | ||
211 | /* DPLLS */ | 211 | /* DPLLS */ |
212 | 212 | ||
213 | /* CM CLOCKS */ | 213 | /* CM CLOCKS */ |
214 | 214 | ||
215 | static const struct clksel_rate div16_dpll_rates[] = { | 215 | static const struct clksel_rate div16_dpll_rates[] = { |
216 | { .div = 1, .val = 1, .flags = RATE_IN_3XXX }, | 216 | { .div = 1, .val = 1, .flags = RATE_IN_3XXX }, |
217 | { .div = 2, .val = 2, .flags = RATE_IN_3XXX }, | 217 | { .div = 2, .val = 2, .flags = RATE_IN_3XXX }, |
218 | { .div = 3, .val = 3, .flags = RATE_IN_3XXX }, | 218 | { .div = 3, .val = 3, .flags = RATE_IN_3XXX }, |
219 | { .div = 4, .val = 4, .flags = RATE_IN_3XXX }, | 219 | { .div = 4, .val = 4, .flags = RATE_IN_3XXX }, |
220 | { .div = 5, .val = 5, .flags = RATE_IN_3XXX }, | 220 | { .div = 5, .val = 5, .flags = RATE_IN_3XXX }, |
221 | { .div = 6, .val = 6, .flags = RATE_IN_3XXX }, | 221 | { .div = 6, .val = 6, .flags = RATE_IN_3XXX }, |
222 | { .div = 7, .val = 7, .flags = RATE_IN_3XXX }, | 222 | { .div = 7, .val = 7, .flags = RATE_IN_3XXX }, |
223 | { .div = 8, .val = 8, .flags = RATE_IN_3XXX }, | 223 | { .div = 8, .val = 8, .flags = RATE_IN_3XXX }, |
224 | { .div = 9, .val = 9, .flags = RATE_IN_3XXX }, | 224 | { .div = 9, .val = 9, .flags = RATE_IN_3XXX }, |
225 | { .div = 10, .val = 10, .flags = RATE_IN_3XXX }, | 225 | { .div = 10, .val = 10, .flags = RATE_IN_3XXX }, |
226 | { .div = 11, .val = 11, .flags = RATE_IN_3XXX }, | 226 | { .div = 11, .val = 11, .flags = RATE_IN_3XXX }, |
227 | { .div = 12, .val = 12, .flags = RATE_IN_3XXX }, | 227 | { .div = 12, .val = 12, .flags = RATE_IN_3XXX }, |
228 | { .div = 13, .val = 13, .flags = RATE_IN_3XXX }, | 228 | { .div = 13, .val = 13, .flags = RATE_IN_3XXX }, |
229 | { .div = 14, .val = 14, .flags = RATE_IN_3XXX }, | 229 | { .div = 14, .val = 14, .flags = RATE_IN_3XXX }, |
230 | { .div = 15, .val = 15, .flags = RATE_IN_3XXX }, | 230 | { .div = 15, .val = 15, .flags = RATE_IN_3XXX }, |
231 | { .div = 16, .val = 16, .flags = RATE_IN_3XXX }, | 231 | { .div = 16, .val = 16, .flags = RATE_IN_3XXX }, |
232 | { .div = 0 } | 232 | { .div = 0 } |
233 | }; | 233 | }; |
234 | 234 | ||
235 | static const struct clksel_rate dpll4_rates[] = { | 235 | static const struct clksel_rate dpll4_rates[] = { |
236 | { .div = 1, .val = 1, .flags = RATE_IN_3XXX }, | 236 | { .div = 1, .val = 1, .flags = RATE_IN_3XXX }, |
237 | { .div = 2, .val = 2, .flags = RATE_IN_3XXX }, | 237 | { .div = 2, .val = 2, .flags = RATE_IN_3XXX }, |
238 | { .div = 3, .val = 3, .flags = RATE_IN_3XXX }, | 238 | { .div = 3, .val = 3, .flags = RATE_IN_3XXX }, |
239 | { .div = 4, .val = 4, .flags = RATE_IN_3XXX }, | 239 | { .div = 4, .val = 4, .flags = RATE_IN_3XXX }, |
240 | { .div = 5, .val = 5, .flags = RATE_IN_3XXX }, | 240 | { .div = 5, .val = 5, .flags = RATE_IN_3XXX }, |
241 | { .div = 6, .val = 6, .flags = RATE_IN_3XXX }, | 241 | { .div = 6, .val = 6, .flags = RATE_IN_3XXX }, |
242 | { .div = 7, .val = 7, .flags = RATE_IN_3XXX }, | 242 | { .div = 7, .val = 7, .flags = RATE_IN_3XXX }, |
243 | { .div = 8, .val = 8, .flags = RATE_IN_3XXX }, | 243 | { .div = 8, .val = 8, .flags = RATE_IN_3XXX }, |
244 | { .div = 9, .val = 9, .flags = RATE_IN_3XXX }, | 244 | { .div = 9, .val = 9, .flags = RATE_IN_3XXX }, |
245 | { .div = 10, .val = 10, .flags = RATE_IN_3XXX }, | 245 | { .div = 10, .val = 10, .flags = RATE_IN_3XXX }, |
246 | { .div = 11, .val = 11, .flags = RATE_IN_3XXX }, | 246 | { .div = 11, .val = 11, .flags = RATE_IN_3XXX }, |
247 | { .div = 12, .val = 12, .flags = RATE_IN_3XXX }, | 247 | { .div = 12, .val = 12, .flags = RATE_IN_3XXX }, |
248 | { .div = 13, .val = 13, .flags = RATE_IN_3XXX }, | 248 | { .div = 13, .val = 13, .flags = RATE_IN_3XXX }, |
249 | { .div = 14, .val = 14, .flags = RATE_IN_3XXX }, | 249 | { .div = 14, .val = 14, .flags = RATE_IN_3XXX }, |
250 | { .div = 15, .val = 15, .flags = RATE_IN_3XXX }, | 250 | { .div = 15, .val = 15, .flags = RATE_IN_3XXX }, |
251 | { .div = 16, .val = 16, .flags = RATE_IN_3XXX }, | 251 | { .div = 16, .val = 16, .flags = RATE_IN_3XXX }, |
252 | { .div = 17, .val = 17, .flags = RATE_IN_36XX }, | 252 | { .div = 17, .val = 17, .flags = RATE_IN_36XX }, |
253 | { .div = 18, .val = 18, .flags = RATE_IN_36XX }, | 253 | { .div = 18, .val = 18, .flags = RATE_IN_36XX }, |
254 | { .div = 19, .val = 19, .flags = RATE_IN_36XX }, | 254 | { .div = 19, .val = 19, .flags = RATE_IN_36XX }, |
255 | { .div = 20, .val = 20, .flags = RATE_IN_36XX }, | 255 | { .div = 20, .val = 20, .flags = RATE_IN_36XX }, |
256 | { .div = 21, .val = 21, .flags = RATE_IN_36XX }, | 256 | { .div = 21, .val = 21, .flags = RATE_IN_36XX }, |
257 | { .div = 22, .val = 22, .flags = RATE_IN_36XX }, | 257 | { .div = 22, .val = 22, .flags = RATE_IN_36XX }, |
258 | { .div = 23, .val = 23, .flags = RATE_IN_36XX }, | 258 | { .div = 23, .val = 23, .flags = RATE_IN_36XX }, |
259 | { .div = 24, .val = 24, .flags = RATE_IN_36XX }, | 259 | { .div = 24, .val = 24, .flags = RATE_IN_36XX }, |
260 | { .div = 25, .val = 25, .flags = RATE_IN_36XX }, | 260 | { .div = 25, .val = 25, .flags = RATE_IN_36XX }, |
261 | { .div = 26, .val = 26, .flags = RATE_IN_36XX }, | 261 | { .div = 26, .val = 26, .flags = RATE_IN_36XX }, |
262 | { .div = 27, .val = 27, .flags = RATE_IN_36XX }, | 262 | { .div = 27, .val = 27, .flags = RATE_IN_36XX }, |
263 | { .div = 28, .val = 28, .flags = RATE_IN_36XX }, | 263 | { .div = 28, .val = 28, .flags = RATE_IN_36XX }, |
264 | { .div = 29, .val = 29, .flags = RATE_IN_36XX }, | 264 | { .div = 29, .val = 29, .flags = RATE_IN_36XX }, |
265 | { .div = 30, .val = 30, .flags = RATE_IN_36XX }, | 265 | { .div = 30, .val = 30, .flags = RATE_IN_36XX }, |
266 | { .div = 31, .val = 31, .flags = RATE_IN_36XX }, | 266 | { .div = 31, .val = 31, .flags = RATE_IN_36XX }, |
267 | { .div = 32, .val = 32, .flags = RATE_IN_36XX }, | 267 | { .div = 32, .val = 32, .flags = RATE_IN_36XX }, |
268 | { .div = 0 } | 268 | { .div = 0 } |
269 | }; | 269 | }; |
270 | 270 | ||
271 | /* DPLL1 */ | 271 | /* DPLL1 */ |
272 | /* MPU clock source */ | 272 | /* MPU clock source */ |
273 | /* Type: DPLL */ | 273 | /* Type: DPLL */ |
274 | static struct dpll_data dpll1_dd = { | 274 | static struct dpll_data dpll1_dd = { |
275 | .mult_div1_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_CLKSEL1_PLL), | 275 | .mult_div1_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_CLKSEL1_PLL), |
276 | .mult_mask = OMAP3430_MPU_DPLL_MULT_MASK, | 276 | .mult_mask = OMAP3430_MPU_DPLL_MULT_MASK, |
277 | .div1_mask = OMAP3430_MPU_DPLL_DIV_MASK, | 277 | .div1_mask = OMAP3430_MPU_DPLL_DIV_MASK, |
278 | .clk_bypass = &dpll1_fck, | 278 | .clk_bypass = &dpll1_fck, |
279 | .clk_ref = &sys_ck, | 279 | .clk_ref = &sys_ck, |
280 | .freqsel_mask = OMAP3430_MPU_DPLL_FREQSEL_MASK, | 280 | .freqsel_mask = OMAP3430_MPU_DPLL_FREQSEL_MASK, |
281 | .control_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_CLKEN_PLL), | 281 | .control_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_CLKEN_PLL), |
282 | .enable_mask = OMAP3430_EN_MPU_DPLL_MASK, | 282 | .enable_mask = OMAP3430_EN_MPU_DPLL_MASK, |
283 | .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED), | 283 | .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED), |
284 | .auto_recal_bit = OMAP3430_EN_MPU_DPLL_DRIFTGUARD_SHIFT, | 284 | .auto_recal_bit = OMAP3430_EN_MPU_DPLL_DRIFTGUARD_SHIFT, |
285 | .recal_en_bit = OMAP3430_MPU_DPLL_RECAL_EN_SHIFT, | 285 | .recal_en_bit = OMAP3430_MPU_DPLL_RECAL_EN_SHIFT, |
286 | .recal_st_bit = OMAP3430_MPU_DPLL_ST_SHIFT, | 286 | .recal_st_bit = OMAP3430_MPU_DPLL_ST_SHIFT, |
287 | .autoidle_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_AUTOIDLE_PLL), | 287 | .autoidle_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_AUTOIDLE_PLL), |
288 | .autoidle_mask = OMAP3430_AUTO_MPU_DPLL_MASK, | 288 | .autoidle_mask = OMAP3430_AUTO_MPU_DPLL_MASK, |
289 | .idlest_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_IDLEST_PLL), | 289 | .idlest_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_IDLEST_PLL), |
290 | .idlest_mask = OMAP3430_ST_MPU_CLK_MASK, | 290 | .idlest_mask = OMAP3430_ST_MPU_CLK_MASK, |
291 | .max_multiplier = OMAP3_MAX_DPLL_MULT, | 291 | .max_multiplier = OMAP3_MAX_DPLL_MULT, |
292 | .min_divider = 1, | 292 | .min_divider = 1, |
293 | .max_divider = OMAP3_MAX_DPLL_DIV, | 293 | .max_divider = OMAP3_MAX_DPLL_DIV, |
294 | .rate_tolerance = DEFAULT_DPLL_RATE_TOLERANCE | 294 | .rate_tolerance = DEFAULT_DPLL_RATE_TOLERANCE |
295 | }; | 295 | }; |
296 | 296 | ||
297 | static struct clk dpll1_ck = { | 297 | static struct clk dpll1_ck = { |
298 | .name = "dpll1_ck", | 298 | .name = "dpll1_ck", |
299 | .ops = &clkops_null, | 299 | .ops = &clkops_null, |
300 | .parent = &sys_ck, | 300 | .parent = &sys_ck, |
301 | .dpll_data = &dpll1_dd, | 301 | .dpll_data = &dpll1_dd, |
302 | .round_rate = &omap2_dpll_round_rate, | 302 | .round_rate = &omap2_dpll_round_rate, |
303 | .set_rate = &omap3_noncore_dpll_set_rate, | 303 | .set_rate = &omap3_noncore_dpll_set_rate, |
304 | .clkdm_name = "dpll1_clkdm", | 304 | .clkdm_name = "dpll1_clkdm", |
305 | .recalc = &omap3_dpll_recalc, | 305 | .recalc = &omap3_dpll_recalc, |
306 | }; | 306 | }; |
307 | 307 | ||
308 | /* | 308 | /* |
309 | * This virtual clock provides the CLKOUTX2 output from the DPLL if the | 309 | * This virtual clock provides the CLKOUTX2 output from the DPLL if the |
310 | * DPLL isn't bypassed. | 310 | * DPLL isn't bypassed. |
311 | */ | 311 | */ |
312 | static struct clk dpll1_x2_ck = { | 312 | static struct clk dpll1_x2_ck = { |
313 | .name = "dpll1_x2_ck", | 313 | .name = "dpll1_x2_ck", |
314 | .ops = &clkops_null, | 314 | .ops = &clkops_null, |
315 | .parent = &dpll1_ck, | 315 | .parent = &dpll1_ck, |
316 | .clkdm_name = "dpll1_clkdm", | 316 | .clkdm_name = "dpll1_clkdm", |
317 | .recalc = &omap3_clkoutx2_recalc, | 317 | .recalc = &omap3_clkoutx2_recalc, |
318 | }; | 318 | }; |
319 | 319 | ||
320 | /* On DPLL1, unlike other DPLLs, the divider is downstream from CLKOUTX2 */ | 320 | /* On DPLL1, unlike other DPLLs, the divider is downstream from CLKOUTX2 */ |
321 | static const struct clksel div16_dpll1_x2m2_clksel[] = { | 321 | static const struct clksel div16_dpll1_x2m2_clksel[] = { |
322 | { .parent = &dpll1_x2_ck, .rates = div16_dpll_rates }, | 322 | { .parent = &dpll1_x2_ck, .rates = div16_dpll_rates }, |
323 | { .parent = NULL } | 323 | { .parent = NULL } |
324 | }; | 324 | }; |
325 | 325 | ||
326 | /* | 326 | /* |
327 | * Does not exist in the TRM - needed to separate the M2 divider from | 327 | * Does not exist in the TRM - needed to separate the M2 divider from |
328 | * bypass selection in mpu_ck | 328 | * bypass selection in mpu_ck |
329 | */ | 329 | */ |
330 | static struct clk dpll1_x2m2_ck = { | 330 | static struct clk dpll1_x2m2_ck = { |
331 | .name = "dpll1_x2m2_ck", | 331 | .name = "dpll1_x2m2_ck", |
332 | .ops = &clkops_null, | 332 | .ops = &clkops_null, |
333 | .parent = &dpll1_x2_ck, | 333 | .parent = &dpll1_x2_ck, |
334 | .init = &omap2_init_clksel_parent, | 334 | .init = &omap2_init_clksel_parent, |
335 | .clksel_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_CLKSEL2_PLL), | 335 | .clksel_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_CLKSEL2_PLL), |
336 | .clksel_mask = OMAP3430_MPU_DPLL_CLKOUT_DIV_MASK, | 336 | .clksel_mask = OMAP3430_MPU_DPLL_CLKOUT_DIV_MASK, |
337 | .clksel = div16_dpll1_x2m2_clksel, | 337 | .clksel = div16_dpll1_x2m2_clksel, |
338 | .clkdm_name = "dpll1_clkdm", | 338 | .clkdm_name = "dpll1_clkdm", |
339 | .recalc = &omap2_clksel_recalc, | 339 | .recalc = &omap2_clksel_recalc, |
340 | }; | 340 | }; |
341 | 341 | ||
342 | /* DPLL2 */ | 342 | /* DPLL2 */ |
343 | /* IVA2 clock source */ | 343 | /* IVA2 clock source */ |
344 | /* Type: DPLL */ | 344 | /* Type: DPLL */ |
345 | 345 | ||
346 | static struct dpll_data dpll2_dd = { | 346 | static struct dpll_data dpll2_dd = { |
347 | .mult_div1_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, OMAP3430_CM_CLKSEL1_PLL), | 347 | .mult_div1_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, OMAP3430_CM_CLKSEL1_PLL), |
348 | .mult_mask = OMAP3430_IVA2_DPLL_MULT_MASK, | 348 | .mult_mask = OMAP3430_IVA2_DPLL_MULT_MASK, |
349 | .div1_mask = OMAP3430_IVA2_DPLL_DIV_MASK, | 349 | .div1_mask = OMAP3430_IVA2_DPLL_DIV_MASK, |
350 | .clk_bypass = &dpll2_fck, | 350 | .clk_bypass = &dpll2_fck, |
351 | .clk_ref = &sys_ck, | 351 | .clk_ref = &sys_ck, |
352 | .freqsel_mask = OMAP3430_IVA2_DPLL_FREQSEL_MASK, | 352 | .freqsel_mask = OMAP3430_IVA2_DPLL_FREQSEL_MASK, |
353 | .control_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, OMAP3430_CM_CLKEN_PLL), | 353 | .control_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, OMAP3430_CM_CLKEN_PLL), |
354 | .enable_mask = OMAP3430_EN_IVA2_DPLL_MASK, | 354 | .enable_mask = OMAP3430_EN_IVA2_DPLL_MASK, |
355 | .modes = (1 << DPLL_LOW_POWER_STOP) | (1 << DPLL_LOCKED) | | 355 | .modes = (1 << DPLL_LOW_POWER_STOP) | (1 << DPLL_LOCKED) | |
356 | (1 << DPLL_LOW_POWER_BYPASS), | 356 | (1 << DPLL_LOW_POWER_BYPASS), |
357 | .auto_recal_bit = OMAP3430_EN_IVA2_DPLL_DRIFTGUARD_SHIFT, | 357 | .auto_recal_bit = OMAP3430_EN_IVA2_DPLL_DRIFTGUARD_SHIFT, |
358 | .recal_en_bit = OMAP3430_PRM_IRQENABLE_MPU_IVA2_DPLL_RECAL_EN_SHIFT, | 358 | .recal_en_bit = OMAP3430_PRM_IRQENABLE_MPU_IVA2_DPLL_RECAL_EN_SHIFT, |
359 | .recal_st_bit = OMAP3430_PRM_IRQSTATUS_MPU_IVA2_DPLL_ST_SHIFT, | 359 | .recal_st_bit = OMAP3430_PRM_IRQSTATUS_MPU_IVA2_DPLL_ST_SHIFT, |
360 | .autoidle_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, OMAP3430_CM_AUTOIDLE_PLL), | 360 | .autoidle_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, OMAP3430_CM_AUTOIDLE_PLL), |
361 | .autoidle_mask = OMAP3430_AUTO_IVA2_DPLL_MASK, | 361 | .autoidle_mask = OMAP3430_AUTO_IVA2_DPLL_MASK, |
362 | .idlest_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, OMAP3430_CM_IDLEST_PLL), | 362 | .idlest_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, OMAP3430_CM_IDLEST_PLL), |
363 | .idlest_mask = OMAP3430_ST_IVA2_CLK_MASK, | 363 | .idlest_mask = OMAP3430_ST_IVA2_CLK_MASK, |
364 | .max_multiplier = OMAP3_MAX_DPLL_MULT, | 364 | .max_multiplier = OMAP3_MAX_DPLL_MULT, |
365 | .min_divider = 1, | 365 | .min_divider = 1, |
366 | .max_divider = OMAP3_MAX_DPLL_DIV, | 366 | .max_divider = OMAP3_MAX_DPLL_DIV, |
367 | .rate_tolerance = DEFAULT_DPLL_RATE_TOLERANCE | 367 | .rate_tolerance = DEFAULT_DPLL_RATE_TOLERANCE |
368 | }; | 368 | }; |
369 | 369 | ||
370 | static struct clk dpll2_ck = { | 370 | static struct clk dpll2_ck = { |
371 | .name = "dpll2_ck", | 371 | .name = "dpll2_ck", |
372 | .ops = &clkops_omap3_noncore_dpll_ops, | 372 | .ops = &clkops_omap3_noncore_dpll_ops, |
373 | .parent = &sys_ck, | 373 | .parent = &sys_ck, |
374 | .dpll_data = &dpll2_dd, | 374 | .dpll_data = &dpll2_dd, |
375 | .round_rate = &omap2_dpll_round_rate, | 375 | .round_rate = &omap2_dpll_round_rate, |
376 | .set_rate = &omap3_noncore_dpll_set_rate, | 376 | .set_rate = &omap3_noncore_dpll_set_rate, |
377 | .clkdm_name = "dpll2_clkdm", | 377 | .clkdm_name = "dpll2_clkdm", |
378 | .recalc = &omap3_dpll_recalc, | 378 | .recalc = &omap3_dpll_recalc, |
379 | }; | 379 | }; |
380 | 380 | ||
381 | static const struct clksel div16_dpll2_m2x2_clksel[] = { | 381 | static const struct clksel div16_dpll2_m2x2_clksel[] = { |
382 | { .parent = &dpll2_ck, .rates = div16_dpll_rates }, | 382 | { .parent = &dpll2_ck, .rates = div16_dpll_rates }, |
383 | { .parent = NULL } | 383 | { .parent = NULL } |
384 | }; | 384 | }; |
385 | 385 | ||
386 | /* | 386 | /* |
387 | * The TRM is conflicted on whether IVA2 clock comes from DPLL2 CLKOUT | 387 | * The TRM is conflicted on whether IVA2 clock comes from DPLL2 CLKOUT |
388 | * or CLKOUTX2. CLKOUT seems most plausible. | 388 | * or CLKOUTX2. CLKOUT seems most plausible. |
389 | */ | 389 | */ |
390 | static struct clk dpll2_m2_ck = { | 390 | static struct clk dpll2_m2_ck = { |
391 | .name = "dpll2_m2_ck", | 391 | .name = "dpll2_m2_ck", |
392 | .ops = &clkops_null, | 392 | .ops = &clkops_null, |
393 | .parent = &dpll2_ck, | 393 | .parent = &dpll2_ck, |
394 | .init = &omap2_init_clksel_parent, | 394 | .init = &omap2_init_clksel_parent, |
395 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, | 395 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, |
396 | OMAP3430_CM_CLKSEL2_PLL), | 396 | OMAP3430_CM_CLKSEL2_PLL), |
397 | .clksel_mask = OMAP3430_IVA2_DPLL_CLKOUT_DIV_MASK, | 397 | .clksel_mask = OMAP3430_IVA2_DPLL_CLKOUT_DIV_MASK, |
398 | .clksel = div16_dpll2_m2x2_clksel, | 398 | .clksel = div16_dpll2_m2x2_clksel, |
399 | .clkdm_name = "dpll2_clkdm", | 399 | .clkdm_name = "dpll2_clkdm", |
400 | .recalc = &omap2_clksel_recalc, | 400 | .recalc = &omap2_clksel_recalc, |
401 | }; | 401 | }; |
402 | 402 | ||
403 | /* | 403 | /* |
404 | * DPLL3 | 404 | * DPLL3 |
405 | * Source clock for all interfaces and for some device fclks | 405 | * Source clock for all interfaces and for some device fclks |
406 | * REVISIT: Also supports fast relock bypass - not included below | 406 | * REVISIT: Also supports fast relock bypass - not included below |
407 | */ | 407 | */ |
408 | static struct dpll_data dpll3_dd = { | 408 | static struct dpll_data dpll3_dd = { |
409 | .mult_div1_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1), | 409 | .mult_div1_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1), |
410 | .mult_mask = OMAP3430_CORE_DPLL_MULT_MASK, | 410 | .mult_mask = OMAP3430_CORE_DPLL_MULT_MASK, |
411 | .div1_mask = OMAP3430_CORE_DPLL_DIV_MASK, | 411 | .div1_mask = OMAP3430_CORE_DPLL_DIV_MASK, |
412 | .clk_bypass = &sys_ck, | 412 | .clk_bypass = &sys_ck, |
413 | .clk_ref = &sys_ck, | 413 | .clk_ref = &sys_ck, |
414 | .freqsel_mask = OMAP3430_CORE_DPLL_FREQSEL_MASK, | 414 | .freqsel_mask = OMAP3430_CORE_DPLL_FREQSEL_MASK, |
415 | .control_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), | 415 | .control_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), |
416 | .enable_mask = OMAP3430_EN_CORE_DPLL_MASK, | 416 | .enable_mask = OMAP3430_EN_CORE_DPLL_MASK, |
417 | .auto_recal_bit = OMAP3430_EN_CORE_DPLL_DRIFTGUARD_SHIFT, | 417 | .auto_recal_bit = OMAP3430_EN_CORE_DPLL_DRIFTGUARD_SHIFT, |
418 | .recal_en_bit = OMAP3430_CORE_DPLL_RECAL_EN_SHIFT, | 418 | .recal_en_bit = OMAP3430_CORE_DPLL_RECAL_EN_SHIFT, |
419 | .recal_st_bit = OMAP3430_CORE_DPLL_ST_SHIFT, | 419 | .recal_st_bit = OMAP3430_CORE_DPLL_ST_SHIFT, |
420 | .autoidle_reg = OMAP_CM_REGADDR(PLL_MOD, CM_AUTOIDLE), | 420 | .autoidle_reg = OMAP_CM_REGADDR(PLL_MOD, CM_AUTOIDLE), |
421 | .autoidle_mask = OMAP3430_AUTO_CORE_DPLL_MASK, | 421 | .autoidle_mask = OMAP3430_AUTO_CORE_DPLL_MASK, |
422 | .idlest_reg = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST), | 422 | .idlest_reg = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST), |
423 | .idlest_mask = OMAP3430_ST_CORE_CLK_MASK, | 423 | .idlest_mask = OMAP3430_ST_CORE_CLK_MASK, |
424 | .max_multiplier = OMAP3_MAX_DPLL_MULT, | 424 | .max_multiplier = OMAP3_MAX_DPLL_MULT, |
425 | .min_divider = 1, | 425 | .min_divider = 1, |
426 | .max_divider = OMAP3_MAX_DPLL_DIV, | 426 | .max_divider = OMAP3_MAX_DPLL_DIV, |
427 | .rate_tolerance = DEFAULT_DPLL_RATE_TOLERANCE | 427 | .rate_tolerance = DEFAULT_DPLL_RATE_TOLERANCE |
428 | }; | 428 | }; |
429 | 429 | ||
430 | static struct clk dpll3_ck = { | 430 | static struct clk dpll3_ck = { |
431 | .name = "dpll3_ck", | 431 | .name = "dpll3_ck", |
432 | .ops = &clkops_null, | 432 | .ops = &clkops_null, |
433 | .parent = &sys_ck, | 433 | .parent = &sys_ck, |
434 | .dpll_data = &dpll3_dd, | 434 | .dpll_data = &dpll3_dd, |
435 | .round_rate = &omap2_dpll_round_rate, | 435 | .round_rate = &omap2_dpll_round_rate, |
436 | .clkdm_name = "dpll3_clkdm", | 436 | .clkdm_name = "dpll3_clkdm", |
437 | .recalc = &omap3_dpll_recalc, | 437 | .recalc = &omap3_dpll_recalc, |
438 | }; | 438 | }; |
439 | 439 | ||
440 | /* | 440 | /* |
441 | * This virtual clock provides the CLKOUTX2 output from the DPLL if the | 441 | * This virtual clock provides the CLKOUTX2 output from the DPLL if the |
442 | * DPLL isn't bypassed | 442 | * DPLL isn't bypassed |
443 | */ | 443 | */ |
444 | static struct clk dpll3_x2_ck = { | 444 | static struct clk dpll3_x2_ck = { |
445 | .name = "dpll3_x2_ck", | 445 | .name = "dpll3_x2_ck", |
446 | .ops = &clkops_null, | 446 | .ops = &clkops_null, |
447 | .parent = &dpll3_ck, | 447 | .parent = &dpll3_ck, |
448 | .clkdm_name = "dpll3_clkdm", | 448 | .clkdm_name = "dpll3_clkdm", |
449 | .recalc = &omap3_clkoutx2_recalc, | 449 | .recalc = &omap3_clkoutx2_recalc, |
450 | }; | 450 | }; |
451 | 451 | ||
452 | static const struct clksel_rate div31_dpll3_rates[] = { | 452 | static const struct clksel_rate div31_dpll3_rates[] = { |
453 | { .div = 1, .val = 1, .flags = RATE_IN_3XXX }, | 453 | { .div = 1, .val = 1, .flags = RATE_IN_3XXX }, |
454 | { .div = 2, .val = 2, .flags = RATE_IN_3XXX }, | 454 | { .div = 2, .val = 2, .flags = RATE_IN_3XXX }, |
455 | { .div = 3, .val = 3, .flags = RATE_IN_3430ES2PLUS }, | 455 | { .div = 3, .val = 3, .flags = RATE_IN_3430ES2PLUS }, |
456 | { .div = 4, .val = 4, .flags = RATE_IN_3430ES2PLUS }, | 456 | { .div = 4, .val = 4, .flags = RATE_IN_3430ES2PLUS }, |
457 | { .div = 5, .val = 5, .flags = RATE_IN_3430ES2PLUS }, | 457 | { .div = 5, .val = 5, .flags = RATE_IN_3430ES2PLUS }, |
458 | { .div = 6, .val = 6, .flags = RATE_IN_3430ES2PLUS }, | 458 | { .div = 6, .val = 6, .flags = RATE_IN_3430ES2PLUS }, |
459 | { .div = 7, .val = 7, .flags = RATE_IN_3430ES2PLUS }, | 459 | { .div = 7, .val = 7, .flags = RATE_IN_3430ES2PLUS }, |
460 | { .div = 8, .val = 8, .flags = RATE_IN_3430ES2PLUS }, | 460 | { .div = 8, .val = 8, .flags = RATE_IN_3430ES2PLUS }, |
461 | { .div = 9, .val = 9, .flags = RATE_IN_3430ES2PLUS }, | 461 | { .div = 9, .val = 9, .flags = RATE_IN_3430ES2PLUS }, |
462 | { .div = 10, .val = 10, .flags = RATE_IN_3430ES2PLUS }, | 462 | { .div = 10, .val = 10, .flags = RATE_IN_3430ES2PLUS }, |
463 | { .div = 11, .val = 11, .flags = RATE_IN_3430ES2PLUS }, | 463 | { .div = 11, .val = 11, .flags = RATE_IN_3430ES2PLUS }, |
464 | { .div = 12, .val = 12, .flags = RATE_IN_3430ES2PLUS }, | 464 | { .div = 12, .val = 12, .flags = RATE_IN_3430ES2PLUS }, |
465 | { .div = 13, .val = 13, .flags = RATE_IN_3430ES2PLUS }, | 465 | { .div = 13, .val = 13, .flags = RATE_IN_3430ES2PLUS }, |
466 | { .div = 14, .val = 14, .flags = RATE_IN_3430ES2PLUS }, | 466 | { .div = 14, .val = 14, .flags = RATE_IN_3430ES2PLUS }, |
467 | { .div = 15, .val = 15, .flags = RATE_IN_3430ES2PLUS }, | 467 | { .div = 15, .val = 15, .flags = RATE_IN_3430ES2PLUS }, |
468 | { .div = 16, .val = 16, .flags = RATE_IN_3430ES2PLUS }, | 468 | { .div = 16, .val = 16, .flags = RATE_IN_3430ES2PLUS }, |
469 | { .div = 17, .val = 17, .flags = RATE_IN_3430ES2PLUS }, | 469 | { .div = 17, .val = 17, .flags = RATE_IN_3430ES2PLUS }, |
470 | { .div = 18, .val = 18, .flags = RATE_IN_3430ES2PLUS }, | 470 | { .div = 18, .val = 18, .flags = RATE_IN_3430ES2PLUS }, |
471 | { .div = 19, .val = 19, .flags = RATE_IN_3430ES2PLUS }, | 471 | { .div = 19, .val = 19, .flags = RATE_IN_3430ES2PLUS }, |
472 | { .div = 20, .val = 20, .flags = RATE_IN_3430ES2PLUS }, | 472 | { .div = 20, .val = 20, .flags = RATE_IN_3430ES2PLUS }, |
473 | { .div = 21, .val = 21, .flags = RATE_IN_3430ES2PLUS }, | 473 | { .div = 21, .val = 21, .flags = RATE_IN_3430ES2PLUS }, |
474 | { .div = 22, .val = 22, .flags = RATE_IN_3430ES2PLUS }, | 474 | { .div = 22, .val = 22, .flags = RATE_IN_3430ES2PLUS }, |
475 | { .div = 23, .val = 23, .flags = RATE_IN_3430ES2PLUS }, | 475 | { .div = 23, .val = 23, .flags = RATE_IN_3430ES2PLUS }, |
476 | { .div = 24, .val = 24, .flags = RATE_IN_3430ES2PLUS }, | 476 | { .div = 24, .val = 24, .flags = RATE_IN_3430ES2PLUS }, |
477 | { .div = 25, .val = 25, .flags = RATE_IN_3430ES2PLUS }, | 477 | { .div = 25, .val = 25, .flags = RATE_IN_3430ES2PLUS }, |
478 | { .div = 26, .val = 26, .flags = RATE_IN_3430ES2PLUS }, | 478 | { .div = 26, .val = 26, .flags = RATE_IN_3430ES2PLUS }, |
479 | { .div = 27, .val = 27, .flags = RATE_IN_3430ES2PLUS }, | 479 | { .div = 27, .val = 27, .flags = RATE_IN_3430ES2PLUS }, |
480 | { .div = 28, .val = 28, .flags = RATE_IN_3430ES2PLUS }, | 480 | { .div = 28, .val = 28, .flags = RATE_IN_3430ES2PLUS }, |
481 | { .div = 29, .val = 29, .flags = RATE_IN_3430ES2PLUS }, | 481 | { .div = 29, .val = 29, .flags = RATE_IN_3430ES2PLUS }, |
482 | { .div = 30, .val = 30, .flags = RATE_IN_3430ES2PLUS }, | 482 | { .div = 30, .val = 30, .flags = RATE_IN_3430ES2PLUS }, |
483 | { .div = 31, .val = 31, .flags = RATE_IN_3430ES2PLUS }, | 483 | { .div = 31, .val = 31, .flags = RATE_IN_3430ES2PLUS }, |
484 | { .div = 0 }, | 484 | { .div = 0 }, |
485 | }; | 485 | }; |
486 | 486 | ||
487 | static const struct clksel div31_dpll3m2_clksel[] = { | 487 | static const struct clksel div31_dpll3m2_clksel[] = { |
488 | { .parent = &dpll3_ck, .rates = div31_dpll3_rates }, | 488 | { .parent = &dpll3_ck, .rates = div31_dpll3_rates }, |
489 | { .parent = NULL } | 489 | { .parent = NULL } |
490 | }; | 490 | }; |
491 | 491 | ||
492 | /* DPLL3 output M2 - primary control point for CORE speed */ | 492 | /* DPLL3 output M2 - primary control point for CORE speed */ |
493 | static struct clk dpll3_m2_ck = { | 493 | static struct clk dpll3_m2_ck = { |
494 | .name = "dpll3_m2_ck", | 494 | .name = "dpll3_m2_ck", |
495 | .ops = &clkops_null, | 495 | .ops = &clkops_null, |
496 | .parent = &dpll3_ck, | 496 | .parent = &dpll3_ck, |
497 | .init = &omap2_init_clksel_parent, | 497 | .init = &omap2_init_clksel_parent, |
498 | .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1), | 498 | .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1), |
499 | .clksel_mask = OMAP3430_CORE_DPLL_CLKOUT_DIV_MASK, | 499 | .clksel_mask = OMAP3430_CORE_DPLL_CLKOUT_DIV_MASK, |
500 | .clksel = div31_dpll3m2_clksel, | 500 | .clksel = div31_dpll3m2_clksel, |
501 | .clkdm_name = "dpll3_clkdm", | 501 | .clkdm_name = "dpll3_clkdm", |
502 | .round_rate = &omap2_clksel_round_rate, | 502 | .round_rate = &omap2_clksel_round_rate, |
503 | .set_rate = &omap3_core_dpll_m2_set_rate, | 503 | .set_rate = &omap3_core_dpll_m2_set_rate, |
504 | .recalc = &omap2_clksel_recalc, | 504 | .recalc = &omap2_clksel_recalc, |
505 | }; | 505 | }; |
506 | 506 | ||
507 | static struct clk core_ck = { | 507 | static struct clk core_ck = { |
508 | .name = "core_ck", | 508 | .name = "core_ck", |
509 | .ops = &clkops_null, | 509 | .ops = &clkops_null, |
510 | .parent = &dpll3_m2_ck, | 510 | .parent = &dpll3_m2_ck, |
511 | .recalc = &followparent_recalc, | 511 | .recalc = &followparent_recalc, |
512 | }; | 512 | }; |
513 | 513 | ||
514 | static struct clk dpll3_m2x2_ck = { | 514 | static struct clk dpll3_m2x2_ck = { |
515 | .name = "dpll3_m2x2_ck", | 515 | .name = "dpll3_m2x2_ck", |
516 | .ops = &clkops_null, | 516 | .ops = &clkops_null, |
517 | .parent = &dpll3_m2_ck, | 517 | .parent = &dpll3_m2_ck, |
518 | .clkdm_name = "dpll3_clkdm", | 518 | .clkdm_name = "dpll3_clkdm", |
519 | .recalc = &omap3_clkoutx2_recalc, | 519 | .recalc = &omap3_clkoutx2_recalc, |
520 | }; | 520 | }; |
521 | 521 | ||
522 | /* The PWRDN bit is apparently only available on 3430ES2 and above */ | 522 | /* The PWRDN bit is apparently only available on 3430ES2 and above */ |
523 | static const struct clksel div16_dpll3_clksel[] = { | 523 | static const struct clksel div16_dpll3_clksel[] = { |
524 | { .parent = &dpll3_ck, .rates = div16_dpll_rates }, | 524 | { .parent = &dpll3_ck, .rates = div16_dpll_rates }, |
525 | { .parent = NULL } | 525 | { .parent = NULL } |
526 | }; | 526 | }; |
527 | 527 | ||
528 | /* This virtual clock is the source for dpll3_m3x2_ck */ | 528 | /* This virtual clock is the source for dpll3_m3x2_ck */ |
529 | static struct clk dpll3_m3_ck = { | 529 | static struct clk dpll3_m3_ck = { |
530 | .name = "dpll3_m3_ck", | 530 | .name = "dpll3_m3_ck", |
531 | .ops = &clkops_null, | 531 | .ops = &clkops_null, |
532 | .parent = &dpll3_ck, | 532 | .parent = &dpll3_ck, |
533 | .init = &omap2_init_clksel_parent, | 533 | .init = &omap2_init_clksel_parent, |
534 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1), | 534 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1), |
535 | .clksel_mask = OMAP3430_DIV_DPLL3_MASK, | 535 | .clksel_mask = OMAP3430_DIV_DPLL3_MASK, |
536 | .clksel = div16_dpll3_clksel, | 536 | .clksel = div16_dpll3_clksel, |
537 | .clkdm_name = "dpll3_clkdm", | 537 | .clkdm_name = "dpll3_clkdm", |
538 | .recalc = &omap2_clksel_recalc, | 538 | .recalc = &omap2_clksel_recalc, |
539 | }; | 539 | }; |
540 | 540 | ||
541 | /* The PWRDN bit is apparently only available on 3430ES2 and above */ | 541 | /* The PWRDN bit is apparently only available on 3430ES2 and above */ |
542 | static struct clk dpll3_m3x2_ck = { | 542 | static struct clk dpll3_m3x2_ck = { |
543 | .name = "dpll3_m3x2_ck", | 543 | .name = "dpll3_m3x2_ck", |
544 | .ops = &clkops_omap2_dflt_wait, | 544 | .ops = &clkops_omap2_dflt_wait, |
545 | .parent = &dpll3_m3_ck, | 545 | .parent = &dpll3_m3_ck, |
546 | .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), | 546 | .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), |
547 | .enable_bit = OMAP3430_PWRDN_EMU_CORE_SHIFT, | 547 | .enable_bit = OMAP3430_PWRDN_EMU_CORE_SHIFT, |
548 | .flags = INVERT_ENABLE, | 548 | .flags = INVERT_ENABLE, |
549 | .clkdm_name = "dpll3_clkdm", | 549 | .clkdm_name = "dpll3_clkdm", |
550 | .recalc = &omap3_clkoutx2_recalc, | 550 | .recalc = &omap3_clkoutx2_recalc, |
551 | }; | 551 | }; |
552 | 552 | ||
553 | static struct clk emu_core_alwon_ck = { | 553 | static struct clk emu_core_alwon_ck = { |
554 | .name = "emu_core_alwon_ck", | 554 | .name = "emu_core_alwon_ck", |
555 | .ops = &clkops_null, | 555 | .ops = &clkops_null, |
556 | .parent = &dpll3_m3x2_ck, | 556 | .parent = &dpll3_m3x2_ck, |
557 | .clkdm_name = "dpll3_clkdm", | 557 | .clkdm_name = "dpll3_clkdm", |
558 | .recalc = &followparent_recalc, | 558 | .recalc = &followparent_recalc, |
559 | }; | 559 | }; |
560 | 560 | ||
561 | /* DPLL4 */ | 561 | /* DPLL4 */ |
562 | /* Supplies 96MHz, 54Mhz TV DAC, DSS fclk, CAM sensor clock, emul trace clk */ | 562 | /* Supplies 96MHz, 54Mhz TV DAC, DSS fclk, CAM sensor clock, emul trace clk */ |
563 | /* Type: DPLL */ | 563 | /* Type: DPLL */ |
564 | static struct dpll_data dpll4_dd; | 564 | static struct dpll_data dpll4_dd; |
565 | 565 | ||
566 | static struct dpll_data dpll4_dd_34xx __initdata = { | 566 | static struct dpll_data dpll4_dd_34xx __initdata = { |
567 | .mult_div1_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL2), | 567 | .mult_div1_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL2), |
568 | .mult_mask = OMAP3430_PERIPH_DPLL_MULT_MASK, | 568 | .mult_mask = OMAP3430_PERIPH_DPLL_MULT_MASK, |
569 | .div1_mask = OMAP3430_PERIPH_DPLL_DIV_MASK, | 569 | .div1_mask = OMAP3430_PERIPH_DPLL_DIV_MASK, |
570 | .clk_bypass = &sys_ck, | 570 | .clk_bypass = &sys_ck, |
571 | .clk_ref = &sys_ck, | 571 | .clk_ref = &sys_ck, |
572 | .freqsel_mask = OMAP3430_PERIPH_DPLL_FREQSEL_MASK, | 572 | .freqsel_mask = OMAP3430_PERIPH_DPLL_FREQSEL_MASK, |
573 | .control_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), | 573 | .control_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), |
574 | .enable_mask = OMAP3430_EN_PERIPH_DPLL_MASK, | 574 | .enable_mask = OMAP3430_EN_PERIPH_DPLL_MASK, |
575 | .modes = (1 << DPLL_LOW_POWER_STOP) | (1 << DPLL_LOCKED), | 575 | .modes = (1 << DPLL_LOW_POWER_STOP) | (1 << DPLL_LOCKED), |
576 | .auto_recal_bit = OMAP3430_EN_PERIPH_DPLL_DRIFTGUARD_SHIFT, | 576 | .auto_recal_bit = OMAP3430_EN_PERIPH_DPLL_DRIFTGUARD_SHIFT, |
577 | .recal_en_bit = OMAP3430_PERIPH_DPLL_RECAL_EN_SHIFT, | 577 | .recal_en_bit = OMAP3430_PERIPH_DPLL_RECAL_EN_SHIFT, |
578 | .recal_st_bit = OMAP3430_PERIPH_DPLL_ST_SHIFT, | 578 | .recal_st_bit = OMAP3430_PERIPH_DPLL_ST_SHIFT, |
579 | .autoidle_reg = OMAP_CM_REGADDR(PLL_MOD, CM_AUTOIDLE), | 579 | .autoidle_reg = OMAP_CM_REGADDR(PLL_MOD, CM_AUTOIDLE), |
580 | .autoidle_mask = OMAP3430_AUTO_PERIPH_DPLL_MASK, | 580 | .autoidle_mask = OMAP3430_AUTO_PERIPH_DPLL_MASK, |
581 | .idlest_reg = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST), | 581 | .idlest_reg = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST), |
582 | .idlest_mask = OMAP3430_ST_PERIPH_CLK_MASK, | 582 | .idlest_mask = OMAP3430_ST_PERIPH_CLK_MASK, |
583 | .max_multiplier = OMAP3_MAX_DPLL_MULT, | 583 | .max_multiplier = OMAP3_MAX_DPLL_MULT, |
584 | .min_divider = 1, | 584 | .min_divider = 1, |
585 | .max_divider = OMAP3_MAX_DPLL_DIV, | 585 | .max_divider = OMAP3_MAX_DPLL_DIV, |
586 | .rate_tolerance = DEFAULT_DPLL_RATE_TOLERANCE | 586 | .rate_tolerance = DEFAULT_DPLL_RATE_TOLERANCE |
587 | }; | 587 | }; |
588 | 588 | ||
589 | static struct dpll_data dpll4_dd_3630 __initdata = { | 589 | static struct dpll_data dpll4_dd_3630 __initdata = { |
590 | .mult_div1_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL2), | 590 | .mult_div1_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL2), |
591 | .mult_mask = OMAP3630_PERIPH_DPLL_MULT_MASK, | 591 | .mult_mask = OMAP3630_PERIPH_DPLL_MULT_MASK, |
592 | .div1_mask = OMAP3430_PERIPH_DPLL_DIV_MASK, | 592 | .div1_mask = OMAP3430_PERIPH_DPLL_DIV_MASK, |
593 | .clk_bypass = &sys_ck, | 593 | .clk_bypass = &sys_ck, |
594 | .clk_ref = &sys_ck, | 594 | .clk_ref = &sys_ck, |
595 | .control_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), | 595 | .control_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), |
596 | .enable_mask = OMAP3430_EN_PERIPH_DPLL_MASK, | 596 | .enable_mask = OMAP3430_EN_PERIPH_DPLL_MASK, |
597 | .modes = (1 << DPLL_LOW_POWER_STOP) | (1 << DPLL_LOCKED), | 597 | .modes = (1 << DPLL_LOW_POWER_STOP) | (1 << DPLL_LOCKED), |
598 | .auto_recal_bit = OMAP3430_EN_PERIPH_DPLL_DRIFTGUARD_SHIFT, | 598 | .auto_recal_bit = OMAP3430_EN_PERIPH_DPLL_DRIFTGUARD_SHIFT, |
599 | .recal_en_bit = OMAP3430_PERIPH_DPLL_RECAL_EN_SHIFT, | 599 | .recal_en_bit = OMAP3430_PERIPH_DPLL_RECAL_EN_SHIFT, |
600 | .recal_st_bit = OMAP3430_PERIPH_DPLL_ST_SHIFT, | 600 | .recal_st_bit = OMAP3430_PERIPH_DPLL_ST_SHIFT, |
601 | .autoidle_reg = OMAP_CM_REGADDR(PLL_MOD, CM_AUTOIDLE), | 601 | .autoidle_reg = OMAP_CM_REGADDR(PLL_MOD, CM_AUTOIDLE), |
602 | .autoidle_mask = OMAP3430_AUTO_PERIPH_DPLL_MASK, | 602 | .autoidle_mask = OMAP3430_AUTO_PERIPH_DPLL_MASK, |
603 | .idlest_reg = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST), | 603 | .idlest_reg = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST), |
604 | .idlest_mask = OMAP3430_ST_PERIPH_CLK_MASK, | 604 | .idlest_mask = OMAP3430_ST_PERIPH_CLK_MASK, |
605 | .max_multiplier = OMAP3630_MAX_JTYPE_DPLL_MULT, | 605 | .max_multiplier = OMAP3630_MAX_JTYPE_DPLL_MULT, |
606 | .min_divider = 1, | 606 | .min_divider = 1, |
607 | .max_divider = OMAP3_MAX_DPLL_DIV, | 607 | .max_divider = OMAP3_MAX_DPLL_DIV, |
608 | .rate_tolerance = DEFAULT_DPLL_RATE_TOLERANCE, | 608 | .rate_tolerance = DEFAULT_DPLL_RATE_TOLERANCE, |
609 | .flags = DPLL_J_TYPE | 609 | .flags = DPLL_J_TYPE |
610 | }; | 610 | }; |
611 | 611 | ||
612 | static struct clk dpll4_ck = { | 612 | static struct clk dpll4_ck = { |
613 | .name = "dpll4_ck", | 613 | .name = "dpll4_ck", |
614 | .ops = &clkops_omap3_noncore_dpll_ops, | 614 | .ops = &clkops_omap3_noncore_dpll_ops, |
615 | .parent = &sys_ck, | 615 | .parent = &sys_ck, |
616 | .dpll_data = &dpll4_dd, | 616 | .dpll_data = &dpll4_dd, |
617 | .round_rate = &omap2_dpll_round_rate, | 617 | .round_rate = &omap2_dpll_round_rate, |
618 | .set_rate = &omap3_dpll4_set_rate, | 618 | .set_rate = &omap3_dpll4_set_rate, |
619 | .clkdm_name = "dpll4_clkdm", | 619 | .clkdm_name = "dpll4_clkdm", |
620 | .recalc = &omap3_dpll_recalc, | 620 | .recalc = &omap3_dpll_recalc, |
621 | }; | 621 | }; |
622 | 622 | ||
623 | /* | 623 | /* |
624 | * This virtual clock provides the CLKOUTX2 output from the DPLL if the | 624 | * This virtual clock provides the CLKOUTX2 output from the DPLL if the |
625 | * DPLL isn't bypassed -- | 625 | * DPLL isn't bypassed -- |
626 | * XXX does this serve any downstream clocks? | 626 | * XXX does this serve any downstream clocks? |
627 | */ | 627 | */ |
628 | static struct clk dpll4_x2_ck = { | 628 | static struct clk dpll4_x2_ck = { |
629 | .name = "dpll4_x2_ck", | 629 | .name = "dpll4_x2_ck", |
630 | .ops = &clkops_null, | 630 | .ops = &clkops_null, |
631 | .parent = &dpll4_ck, | 631 | .parent = &dpll4_ck, |
632 | .clkdm_name = "dpll4_clkdm", | 632 | .clkdm_name = "dpll4_clkdm", |
633 | .recalc = &omap3_clkoutx2_recalc, | 633 | .recalc = &omap3_clkoutx2_recalc, |
634 | }; | 634 | }; |
635 | 635 | ||
636 | static const struct clksel dpll4_clksel[] = { | 636 | static const struct clksel dpll4_clksel[] = { |
637 | { .parent = &dpll4_ck, .rates = dpll4_rates }, | 637 | { .parent = &dpll4_ck, .rates = dpll4_rates }, |
638 | { .parent = NULL } | 638 | { .parent = NULL } |
639 | }; | 639 | }; |
640 | 640 | ||
641 | /* This virtual clock is the source for dpll4_m2x2_ck */ | 641 | /* This virtual clock is the source for dpll4_m2x2_ck */ |
642 | static struct clk dpll4_m2_ck = { | 642 | static struct clk dpll4_m2_ck = { |
643 | .name = "dpll4_m2_ck", | 643 | .name = "dpll4_m2_ck", |
644 | .ops = &clkops_null, | 644 | .ops = &clkops_null, |
645 | .parent = &dpll4_ck, | 645 | .parent = &dpll4_ck, |
646 | .init = &omap2_init_clksel_parent, | 646 | .init = &omap2_init_clksel_parent, |
647 | .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, OMAP3430_CM_CLKSEL3), | 647 | .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, OMAP3430_CM_CLKSEL3), |
648 | .clksel_mask = OMAP3630_DIV_96M_MASK, | 648 | .clksel_mask = OMAP3630_DIV_96M_MASK, |
649 | .clksel = dpll4_clksel, | 649 | .clksel = dpll4_clksel, |
650 | .clkdm_name = "dpll4_clkdm", | 650 | .clkdm_name = "dpll4_clkdm", |
651 | .recalc = &omap2_clksel_recalc, | 651 | .recalc = &omap2_clksel_recalc, |
652 | }; | 652 | }; |
653 | 653 | ||
654 | /* The PWRDN bit is apparently only available on 3430ES2 and above */ | 654 | /* The PWRDN bit is apparently only available on 3430ES2 and above */ |
655 | static struct clk dpll4_m2x2_ck = { | 655 | static struct clk dpll4_m2x2_ck = { |
656 | .name = "dpll4_m2x2_ck", | 656 | .name = "dpll4_m2x2_ck", |
657 | .ops = &clkops_omap2_dflt_wait, | 657 | .ops = &clkops_omap2_dflt_wait, |
658 | .parent = &dpll4_m2_ck, | 658 | .parent = &dpll4_m2_ck, |
659 | .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), | 659 | .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), |
660 | .enable_bit = OMAP3430_PWRDN_96M_SHIFT, | 660 | .enable_bit = OMAP3430_PWRDN_96M_SHIFT, |
661 | .flags = INVERT_ENABLE, | 661 | .flags = INVERT_ENABLE, |
662 | .clkdm_name = "dpll4_clkdm", | 662 | .clkdm_name = "dpll4_clkdm", |
663 | .recalc = &omap3_clkoutx2_recalc, | 663 | .recalc = &omap3_clkoutx2_recalc, |
664 | }; | 664 | }; |
665 | 665 | ||
666 | /* | 666 | /* |
667 | * DPLL4 generates DPLL4_M2X2_CLK which is then routed into the PRM as | 667 | * DPLL4 generates DPLL4_M2X2_CLK which is then routed into the PRM as |
668 | * PRM_96M_ALWON_(F)CLK. Two clocks then emerge from the PRM: | 668 | * PRM_96M_ALWON_(F)CLK. Two clocks then emerge from the PRM: |
669 | * 96M_ALWON_FCLK (called "omap_96m_alwon_fck" below) and | 669 | * 96M_ALWON_FCLK (called "omap_96m_alwon_fck" below) and |
670 | * CM_96K_(F)CLK. | 670 | * CM_96K_(F)CLK. |
671 | */ | 671 | */ |
672 | 672 | ||
673 | /* Adding 192MHz Clock node needed by SGX */ | 673 | /* Adding 192MHz Clock node needed by SGX */ |
674 | static struct clk omap_192m_alwon_fck = { | 674 | static struct clk omap_192m_alwon_fck = { |
675 | .name = "omap_192m_alwon_fck", | 675 | .name = "omap_192m_alwon_fck", |
676 | .ops = &clkops_null, | 676 | .ops = &clkops_null, |
677 | .parent = &dpll4_m2x2_ck, | 677 | .parent = &dpll4_m2x2_ck, |
678 | .recalc = &followparent_recalc, | 678 | .recalc = &followparent_recalc, |
679 | }; | 679 | }; |
680 | 680 | ||
681 | static const struct clksel_rate omap_96m_alwon_fck_rates[] = { | 681 | static const struct clksel_rate omap_96m_alwon_fck_rates[] = { |
682 | { .div = 1, .val = 1, .flags = RATE_IN_36XX }, | 682 | { .div = 1, .val = 1, .flags = RATE_IN_36XX }, |
683 | { .div = 2, .val = 2, .flags = RATE_IN_36XX }, | 683 | { .div = 2, .val = 2, .flags = RATE_IN_36XX }, |
684 | { .div = 0 } | 684 | { .div = 0 } |
685 | }; | 685 | }; |
686 | 686 | ||
687 | static const struct clksel omap_96m_alwon_fck_clksel[] = { | 687 | static const struct clksel omap_96m_alwon_fck_clksel[] = { |
688 | { .parent = &omap_192m_alwon_fck, .rates = omap_96m_alwon_fck_rates }, | 688 | { .parent = &omap_192m_alwon_fck, .rates = omap_96m_alwon_fck_rates }, |
689 | { .parent = NULL } | 689 | { .parent = NULL } |
690 | }; | 690 | }; |
691 | 691 | ||
692 | static const struct clksel_rate omap_96m_dpll_rates[] = { | 692 | static const struct clksel_rate omap_96m_dpll_rates[] = { |
693 | { .div = 1, .val = 0, .flags = RATE_IN_3XXX }, | 693 | { .div = 1, .val = 0, .flags = RATE_IN_3XXX }, |
694 | { .div = 0 } | 694 | { .div = 0 } |
695 | }; | 695 | }; |
696 | 696 | ||
697 | static const struct clksel_rate omap_96m_sys_rates[] = { | 697 | static const struct clksel_rate omap_96m_sys_rates[] = { |
698 | { .div = 1, .val = 1, .flags = RATE_IN_3XXX }, | 698 | { .div = 1, .val = 1, .flags = RATE_IN_3XXX }, |
699 | { .div = 0 } | 699 | { .div = 0 } |
700 | }; | 700 | }; |
701 | 701 | ||
702 | static struct clk omap_96m_alwon_fck = { | 702 | static struct clk omap_96m_alwon_fck = { |
703 | .name = "omap_96m_alwon_fck", | 703 | .name = "omap_96m_alwon_fck", |
704 | .ops = &clkops_null, | 704 | .ops = &clkops_null, |
705 | .parent = &dpll4_m2x2_ck, | 705 | .parent = &dpll4_m2x2_ck, |
706 | .recalc = &followparent_recalc, | 706 | .recalc = &followparent_recalc, |
707 | }; | 707 | }; |
708 | 708 | ||
709 | static struct clk omap_96m_alwon_fck_3630 = { | 709 | static struct clk omap_96m_alwon_fck_3630 = { |
710 | .name = "omap_96m_alwon_fck", | 710 | .name = "omap_96m_alwon_fck", |
711 | .parent = &omap_192m_alwon_fck, | 711 | .parent = &omap_192m_alwon_fck, |
712 | .init = &omap2_init_clksel_parent, | 712 | .init = &omap2_init_clksel_parent, |
713 | .ops = &clkops_null, | 713 | .ops = &clkops_null, |
714 | .recalc = &omap2_clksel_recalc, | 714 | .recalc = &omap2_clksel_recalc, |
715 | .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL), | 715 | .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL), |
716 | .clksel_mask = OMAP3630_CLKSEL_96M_MASK, | 716 | .clksel_mask = OMAP3630_CLKSEL_96M_MASK, |
717 | .clksel = omap_96m_alwon_fck_clksel | 717 | .clksel = omap_96m_alwon_fck_clksel |
718 | }; | 718 | }; |
719 | 719 | ||
720 | static struct clk cm_96m_fck = { | 720 | static struct clk cm_96m_fck = { |
721 | .name = "cm_96m_fck", | 721 | .name = "cm_96m_fck", |
722 | .ops = &clkops_null, | 722 | .ops = &clkops_null, |
723 | .parent = &omap_96m_alwon_fck, | 723 | .parent = &omap_96m_alwon_fck, |
724 | .recalc = &followparent_recalc, | 724 | .recalc = &followparent_recalc, |
725 | }; | 725 | }; |
726 | 726 | ||
727 | static const struct clksel omap_96m_fck_clksel[] = { | 727 | static const struct clksel omap_96m_fck_clksel[] = { |
728 | { .parent = &cm_96m_fck, .rates = omap_96m_dpll_rates }, | 728 | { .parent = &cm_96m_fck, .rates = omap_96m_dpll_rates }, |
729 | { .parent = &sys_ck, .rates = omap_96m_sys_rates }, | 729 | { .parent = &sys_ck, .rates = omap_96m_sys_rates }, |
730 | { .parent = NULL } | 730 | { .parent = NULL } |
731 | }; | 731 | }; |
732 | 732 | ||
733 | static struct clk omap_96m_fck = { | 733 | static struct clk omap_96m_fck = { |
734 | .name = "omap_96m_fck", | 734 | .name = "omap_96m_fck", |
735 | .ops = &clkops_null, | 735 | .ops = &clkops_null, |
736 | .parent = &sys_ck, | 736 | .parent = &sys_ck, |
737 | .init = &omap2_init_clksel_parent, | 737 | .init = &omap2_init_clksel_parent, |
738 | .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1), | 738 | .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1), |
739 | .clksel_mask = OMAP3430_SOURCE_96M_MASK, | 739 | .clksel_mask = OMAP3430_SOURCE_96M_MASK, |
740 | .clksel = omap_96m_fck_clksel, | 740 | .clksel = omap_96m_fck_clksel, |
741 | .recalc = &omap2_clksel_recalc, | 741 | .recalc = &omap2_clksel_recalc, |
742 | }; | 742 | }; |
743 | 743 | ||
744 | /* This virtual clock is the source for dpll4_m3x2_ck */ | 744 | /* This virtual clock is the source for dpll4_m3x2_ck */ |
745 | static struct clk dpll4_m3_ck = { | 745 | static struct clk dpll4_m3_ck = { |
746 | .name = "dpll4_m3_ck", | 746 | .name = "dpll4_m3_ck", |
747 | .ops = &clkops_null, | 747 | .ops = &clkops_null, |
748 | .parent = &dpll4_ck, | 748 | .parent = &dpll4_ck, |
749 | .init = &omap2_init_clksel_parent, | 749 | .init = &omap2_init_clksel_parent, |
750 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_CLKSEL), | 750 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_CLKSEL), |
751 | .clksel_mask = OMAP3430_CLKSEL_TV_MASK, | 751 | .clksel_mask = OMAP3430_CLKSEL_TV_MASK, |
752 | .clksel = dpll4_clksel, | 752 | .clksel = dpll4_clksel, |
753 | .clkdm_name = "dpll4_clkdm", | 753 | .clkdm_name = "dpll4_clkdm", |
754 | .recalc = &omap2_clksel_recalc, | 754 | .recalc = &omap2_clksel_recalc, |
755 | }; | 755 | }; |
756 | 756 | ||
757 | /* The PWRDN bit is apparently only available on 3430ES2 and above */ | 757 | /* The PWRDN bit is apparently only available on 3430ES2 and above */ |
758 | static struct clk dpll4_m3x2_ck = { | 758 | static struct clk dpll4_m3x2_ck = { |
759 | .name = "dpll4_m3x2_ck", | 759 | .name = "dpll4_m3x2_ck", |
760 | .ops = &clkops_omap2_dflt_wait, | 760 | .ops = &clkops_omap2_dflt_wait, |
761 | .parent = &dpll4_m3_ck, | 761 | .parent = &dpll4_m3_ck, |
762 | .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), | 762 | .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), |
763 | .enable_bit = OMAP3430_PWRDN_TV_SHIFT, | 763 | .enable_bit = OMAP3430_PWRDN_TV_SHIFT, |
764 | .flags = INVERT_ENABLE, | 764 | .flags = INVERT_ENABLE, |
765 | .clkdm_name = "dpll4_clkdm", | 765 | .clkdm_name = "dpll4_clkdm", |
766 | .recalc = &omap3_clkoutx2_recalc, | 766 | .recalc = &omap3_clkoutx2_recalc, |
767 | }; | 767 | }; |
768 | 768 | ||
769 | static const struct clksel_rate omap_54m_d4m3x2_rates[] = { | 769 | static const struct clksel_rate omap_54m_d4m3x2_rates[] = { |
770 | { .div = 1, .val = 0, .flags = RATE_IN_3XXX }, | 770 | { .div = 1, .val = 0, .flags = RATE_IN_3XXX }, |
771 | { .div = 0 } | 771 | { .div = 0 } |
772 | }; | 772 | }; |
773 | 773 | ||
774 | static const struct clksel_rate omap_54m_alt_rates[] = { | 774 | static const struct clksel_rate omap_54m_alt_rates[] = { |
775 | { .div = 1, .val = 1, .flags = RATE_IN_3XXX }, | 775 | { .div = 1, .val = 1, .flags = RATE_IN_3XXX }, |
776 | { .div = 0 } | 776 | { .div = 0 } |
777 | }; | 777 | }; |
778 | 778 | ||
779 | static const struct clksel omap_54m_clksel[] = { | 779 | static const struct clksel omap_54m_clksel[] = { |
780 | { .parent = &dpll4_m3x2_ck, .rates = omap_54m_d4m3x2_rates }, | 780 | { .parent = &dpll4_m3x2_ck, .rates = omap_54m_d4m3x2_rates }, |
781 | { .parent = &sys_altclk, .rates = omap_54m_alt_rates }, | 781 | { .parent = &sys_altclk, .rates = omap_54m_alt_rates }, |
782 | { .parent = NULL } | 782 | { .parent = NULL } |
783 | }; | 783 | }; |
784 | 784 | ||
785 | static struct clk omap_54m_fck = { | 785 | static struct clk omap_54m_fck = { |
786 | .name = "omap_54m_fck", | 786 | .name = "omap_54m_fck", |
787 | .ops = &clkops_null, | 787 | .ops = &clkops_null, |
788 | .init = &omap2_init_clksel_parent, | 788 | .init = &omap2_init_clksel_parent, |
789 | .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1), | 789 | .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1), |
790 | .clksel_mask = OMAP3430_SOURCE_54M_MASK, | 790 | .clksel_mask = OMAP3430_SOURCE_54M_MASK, |
791 | .clksel = omap_54m_clksel, | 791 | .clksel = omap_54m_clksel, |
792 | .recalc = &omap2_clksel_recalc, | 792 | .recalc = &omap2_clksel_recalc, |
793 | }; | 793 | }; |
794 | 794 | ||
795 | static const struct clksel_rate omap_48m_cm96m_rates[] = { | 795 | static const struct clksel_rate omap_48m_cm96m_rates[] = { |
796 | { .div = 2, .val = 0, .flags = RATE_IN_3XXX }, | 796 | { .div = 2, .val = 0, .flags = RATE_IN_3XXX }, |
797 | { .div = 0 } | 797 | { .div = 0 } |
798 | }; | 798 | }; |
799 | 799 | ||
800 | static const struct clksel_rate omap_48m_alt_rates[] = { | 800 | static const struct clksel_rate omap_48m_alt_rates[] = { |
801 | { .div = 1, .val = 1, .flags = RATE_IN_3XXX }, | 801 | { .div = 1, .val = 1, .flags = RATE_IN_3XXX }, |
802 | { .div = 0 } | 802 | { .div = 0 } |
803 | }; | 803 | }; |
804 | 804 | ||
805 | static const struct clksel omap_48m_clksel[] = { | 805 | static const struct clksel omap_48m_clksel[] = { |
806 | { .parent = &cm_96m_fck, .rates = omap_48m_cm96m_rates }, | 806 | { .parent = &cm_96m_fck, .rates = omap_48m_cm96m_rates }, |
807 | { .parent = &sys_altclk, .rates = omap_48m_alt_rates }, | 807 | { .parent = &sys_altclk, .rates = omap_48m_alt_rates }, |
808 | { .parent = NULL } | 808 | { .parent = NULL } |
809 | }; | 809 | }; |
810 | 810 | ||
811 | static struct clk omap_48m_fck = { | 811 | static struct clk omap_48m_fck = { |
812 | .name = "omap_48m_fck", | 812 | .name = "omap_48m_fck", |
813 | .ops = &clkops_null, | 813 | .ops = &clkops_null, |
814 | .init = &omap2_init_clksel_parent, | 814 | .init = &omap2_init_clksel_parent, |
815 | .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1), | 815 | .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1), |
816 | .clksel_mask = OMAP3430_SOURCE_48M_MASK, | 816 | .clksel_mask = OMAP3430_SOURCE_48M_MASK, |
817 | .clksel = omap_48m_clksel, | 817 | .clksel = omap_48m_clksel, |
818 | .recalc = &omap2_clksel_recalc, | 818 | .recalc = &omap2_clksel_recalc, |
819 | }; | 819 | }; |
820 | 820 | ||
821 | static struct clk omap_12m_fck = { | 821 | static struct clk omap_12m_fck = { |
822 | .name = "omap_12m_fck", | 822 | .name = "omap_12m_fck", |
823 | .ops = &clkops_null, | 823 | .ops = &clkops_null, |
824 | .parent = &omap_48m_fck, | 824 | .parent = &omap_48m_fck, |
825 | .fixed_div = 4, | 825 | .fixed_div = 4, |
826 | .recalc = &omap_fixed_divisor_recalc, | 826 | .recalc = &omap_fixed_divisor_recalc, |
827 | }; | 827 | }; |
828 | 828 | ||
829 | /* This virtual clock is the source for dpll4_m4x2_ck */ | 829 | /* This virtual clock is the source for dpll4_m4x2_ck */ |
830 | static struct clk dpll4_m4_ck = { | 830 | static struct clk dpll4_m4_ck = { |
831 | .name = "dpll4_m4_ck", | 831 | .name = "dpll4_m4_ck", |
832 | .ops = &clkops_null, | 832 | .ops = &clkops_null, |
833 | .parent = &dpll4_ck, | 833 | .parent = &dpll4_ck, |
834 | .init = &omap2_init_clksel_parent, | 834 | .init = &omap2_init_clksel_parent, |
835 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_CLKSEL), | 835 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_CLKSEL), |
836 | .clksel_mask = OMAP3430_CLKSEL_DSS1_MASK, | 836 | .clksel_mask = OMAP3430_CLKSEL_DSS1_MASK, |
837 | .clksel = dpll4_clksel, | 837 | .clksel = dpll4_clksel, |
838 | .clkdm_name = "dpll4_clkdm", | 838 | .clkdm_name = "dpll4_clkdm", |
839 | .recalc = &omap2_clksel_recalc, | 839 | .recalc = &omap2_clksel_recalc, |
840 | .set_rate = &omap2_clksel_set_rate, | 840 | .set_rate = &omap2_clksel_set_rate, |
841 | .round_rate = &omap2_clksel_round_rate, | 841 | .round_rate = &omap2_clksel_round_rate, |
842 | }; | 842 | }; |
843 | 843 | ||
844 | /* The PWRDN bit is apparently only available on 3430ES2 and above */ | 844 | /* The PWRDN bit is apparently only available on 3430ES2 and above */ |
845 | static struct clk dpll4_m4x2_ck = { | 845 | static struct clk dpll4_m4x2_ck = { |
846 | .name = "dpll4_m4x2_ck", | 846 | .name = "dpll4_m4x2_ck", |
847 | .ops = &clkops_omap2_dflt_wait, | 847 | .ops = &clkops_omap2_dflt_wait, |
848 | .parent = &dpll4_m4_ck, | 848 | .parent = &dpll4_m4_ck, |
849 | .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), | 849 | .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), |
850 | .enable_bit = OMAP3430_PWRDN_DSS1_SHIFT, | 850 | .enable_bit = OMAP3430_PWRDN_DSS1_SHIFT, |
851 | .flags = INVERT_ENABLE, | 851 | .flags = INVERT_ENABLE, |
852 | .clkdm_name = "dpll4_clkdm", | 852 | .clkdm_name = "dpll4_clkdm", |
853 | .recalc = &omap3_clkoutx2_recalc, | 853 | .recalc = &omap3_clkoutx2_recalc, |
854 | }; | 854 | }; |
855 | 855 | ||
856 | /* This virtual clock is the source for dpll4_m5x2_ck */ | 856 | /* This virtual clock is the source for dpll4_m5x2_ck */ |
857 | static struct clk dpll4_m5_ck = { | 857 | static struct clk dpll4_m5_ck = { |
858 | .name = "dpll4_m5_ck", | 858 | .name = "dpll4_m5_ck", |
859 | .ops = &clkops_null, | 859 | .ops = &clkops_null, |
860 | .parent = &dpll4_ck, | 860 | .parent = &dpll4_ck, |
861 | .init = &omap2_init_clksel_parent, | 861 | .init = &omap2_init_clksel_parent, |
862 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_CLKSEL), | 862 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_CLKSEL), |
863 | .clksel_mask = OMAP3430_CLKSEL_CAM_MASK, | 863 | .clksel_mask = OMAP3430_CLKSEL_CAM_MASK, |
864 | .clksel = dpll4_clksel, | 864 | .clksel = dpll4_clksel, |
865 | .clkdm_name = "dpll4_clkdm", | 865 | .clkdm_name = "dpll4_clkdm", |
866 | .set_rate = &omap2_clksel_set_rate, | 866 | .set_rate = &omap2_clksel_set_rate, |
867 | .round_rate = &omap2_clksel_round_rate, | 867 | .round_rate = &omap2_clksel_round_rate, |
868 | .recalc = &omap2_clksel_recalc, | 868 | .recalc = &omap2_clksel_recalc, |
869 | }; | 869 | }; |
870 | 870 | ||
871 | /* The PWRDN bit is apparently only available on 3430ES2 and above */ | 871 | /* The PWRDN bit is apparently only available on 3430ES2 and above */ |
872 | static struct clk dpll4_m5x2_ck = { | 872 | static struct clk dpll4_m5x2_ck = { |
873 | .name = "dpll4_m5x2_ck", | 873 | .name = "dpll4_m5x2_ck", |
874 | .ops = &clkops_omap2_dflt_wait, | 874 | .ops = &clkops_omap2_dflt_wait, |
875 | .parent = &dpll4_m5_ck, | 875 | .parent = &dpll4_m5_ck, |
876 | .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), | 876 | .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), |
877 | .enable_bit = OMAP3430_PWRDN_CAM_SHIFT, | 877 | .enable_bit = OMAP3430_PWRDN_CAM_SHIFT, |
878 | .flags = INVERT_ENABLE, | 878 | .flags = INVERT_ENABLE, |
879 | .clkdm_name = "dpll4_clkdm", | 879 | .clkdm_name = "dpll4_clkdm", |
880 | .recalc = &omap3_clkoutx2_recalc, | 880 | .recalc = &omap3_clkoutx2_recalc, |
881 | }; | 881 | }; |
882 | 882 | ||
883 | /* This virtual clock is the source for dpll4_m6x2_ck */ | 883 | /* This virtual clock is the source for dpll4_m6x2_ck */ |
884 | static struct clk dpll4_m6_ck = { | 884 | static struct clk dpll4_m6_ck = { |
885 | .name = "dpll4_m6_ck", | 885 | .name = "dpll4_m6_ck", |
886 | .ops = &clkops_null, | 886 | .ops = &clkops_null, |
887 | .parent = &dpll4_ck, | 887 | .parent = &dpll4_ck, |
888 | .init = &omap2_init_clksel_parent, | 888 | .init = &omap2_init_clksel_parent, |
889 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1), | 889 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1), |
890 | .clksel_mask = OMAP3430_DIV_DPLL4_MASK, | 890 | .clksel_mask = OMAP3430_DIV_DPLL4_MASK, |
891 | .clksel = dpll4_clksel, | 891 | .clksel = dpll4_clksel, |
892 | .clkdm_name = "dpll4_clkdm", | 892 | .clkdm_name = "dpll4_clkdm", |
893 | .recalc = &omap2_clksel_recalc, | 893 | .recalc = &omap2_clksel_recalc, |
894 | }; | 894 | }; |
895 | 895 | ||
896 | /* The PWRDN bit is apparently only available on 3430ES2 and above */ | 896 | /* The PWRDN bit is apparently only available on 3430ES2 and above */ |
897 | static struct clk dpll4_m6x2_ck = { | 897 | static struct clk dpll4_m6x2_ck = { |
898 | .name = "dpll4_m6x2_ck", | 898 | .name = "dpll4_m6x2_ck", |
899 | .ops = &clkops_omap2_dflt_wait, | 899 | .ops = &clkops_omap2_dflt_wait, |
900 | .parent = &dpll4_m6_ck, | 900 | .parent = &dpll4_m6_ck, |
901 | .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), | 901 | .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), |
902 | .enable_bit = OMAP3430_PWRDN_EMU_PERIPH_SHIFT, | 902 | .enable_bit = OMAP3430_PWRDN_EMU_PERIPH_SHIFT, |
903 | .flags = INVERT_ENABLE, | 903 | .flags = INVERT_ENABLE, |
904 | .clkdm_name = "dpll4_clkdm", | 904 | .clkdm_name = "dpll4_clkdm", |
905 | .recalc = &omap3_clkoutx2_recalc, | 905 | .recalc = &omap3_clkoutx2_recalc, |
906 | }; | 906 | }; |
907 | 907 | ||
908 | static struct clk emu_per_alwon_ck = { | 908 | static struct clk emu_per_alwon_ck = { |
909 | .name = "emu_per_alwon_ck", | 909 | .name = "emu_per_alwon_ck", |
910 | .ops = &clkops_null, | 910 | .ops = &clkops_null, |
911 | .parent = &dpll4_m6x2_ck, | 911 | .parent = &dpll4_m6x2_ck, |
912 | .clkdm_name = "dpll4_clkdm", | 912 | .clkdm_name = "dpll4_clkdm", |
913 | .recalc = &followparent_recalc, | 913 | .recalc = &followparent_recalc, |
914 | }; | 914 | }; |
915 | 915 | ||
916 | /* DPLL5 */ | 916 | /* DPLL5 */ |
917 | /* Supplies 120MHz clock, USIM source clock */ | 917 | /* Supplies 120MHz clock, USIM source clock */ |
918 | /* Type: DPLL */ | 918 | /* Type: DPLL */ |
919 | /* 3430ES2 only */ | 919 | /* 3430ES2 only */ |
920 | static struct dpll_data dpll5_dd = { | 920 | static struct dpll_data dpll5_dd = { |
921 | .mult_div1_reg = OMAP_CM_REGADDR(PLL_MOD, OMAP3430ES2_CM_CLKSEL4), | 921 | .mult_div1_reg = OMAP_CM_REGADDR(PLL_MOD, OMAP3430ES2_CM_CLKSEL4), |
922 | .mult_mask = OMAP3430ES2_PERIPH2_DPLL_MULT_MASK, | 922 | .mult_mask = OMAP3430ES2_PERIPH2_DPLL_MULT_MASK, |
923 | .div1_mask = OMAP3430ES2_PERIPH2_DPLL_DIV_MASK, | 923 | .div1_mask = OMAP3430ES2_PERIPH2_DPLL_DIV_MASK, |
924 | .clk_bypass = &sys_ck, | 924 | .clk_bypass = &sys_ck, |
925 | .clk_ref = &sys_ck, | 925 | .clk_ref = &sys_ck, |
926 | .freqsel_mask = OMAP3430ES2_PERIPH2_DPLL_FREQSEL_MASK, | 926 | .freqsel_mask = OMAP3430ES2_PERIPH2_DPLL_FREQSEL_MASK, |
927 | .control_reg = OMAP_CM_REGADDR(PLL_MOD, OMAP3430ES2_CM_CLKEN2), | 927 | .control_reg = OMAP_CM_REGADDR(PLL_MOD, OMAP3430ES2_CM_CLKEN2), |
928 | .enable_mask = OMAP3430ES2_EN_PERIPH2_DPLL_MASK, | 928 | .enable_mask = OMAP3430ES2_EN_PERIPH2_DPLL_MASK, |
929 | .modes = (1 << DPLL_LOW_POWER_STOP) | (1 << DPLL_LOCKED), | 929 | .modes = (1 << DPLL_LOW_POWER_STOP) | (1 << DPLL_LOCKED), |
930 | .auto_recal_bit = OMAP3430ES2_EN_PERIPH2_DPLL_DRIFTGUARD_SHIFT, | 930 | .auto_recal_bit = OMAP3430ES2_EN_PERIPH2_DPLL_DRIFTGUARD_SHIFT, |
931 | .recal_en_bit = OMAP3430ES2_SND_PERIPH_DPLL_RECAL_EN_SHIFT, | 931 | .recal_en_bit = OMAP3430ES2_SND_PERIPH_DPLL_RECAL_EN_SHIFT, |
932 | .recal_st_bit = OMAP3430ES2_SND_PERIPH_DPLL_ST_SHIFT, | 932 | .recal_st_bit = OMAP3430ES2_SND_PERIPH_DPLL_ST_SHIFT, |
933 | .autoidle_reg = OMAP_CM_REGADDR(PLL_MOD, OMAP3430ES2_CM_AUTOIDLE2_PLL), | 933 | .autoidle_reg = OMAP_CM_REGADDR(PLL_MOD, OMAP3430ES2_CM_AUTOIDLE2_PLL), |
934 | .autoidle_mask = OMAP3430ES2_AUTO_PERIPH2_DPLL_MASK, | 934 | .autoidle_mask = OMAP3430ES2_AUTO_PERIPH2_DPLL_MASK, |
935 | .idlest_reg = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST2), | 935 | .idlest_reg = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST2), |
936 | .idlest_mask = OMAP3430ES2_ST_PERIPH2_CLK_MASK, | 936 | .idlest_mask = OMAP3430ES2_ST_PERIPH2_CLK_MASK, |
937 | .max_multiplier = OMAP3_MAX_DPLL_MULT, | 937 | .max_multiplier = OMAP3_MAX_DPLL_MULT, |
938 | .min_divider = 1, | 938 | .min_divider = 1, |
939 | .max_divider = OMAP3_MAX_DPLL_DIV, | 939 | .max_divider = OMAP3_MAX_DPLL_DIV, |
940 | .rate_tolerance = DEFAULT_DPLL_RATE_TOLERANCE | 940 | .rate_tolerance = DEFAULT_DPLL_RATE_TOLERANCE |
941 | }; | 941 | }; |
942 | 942 | ||
943 | static struct clk dpll5_ck = { | 943 | static struct clk dpll5_ck = { |
944 | .name = "dpll5_ck", | 944 | .name = "dpll5_ck", |
945 | .ops = &clkops_omap3_noncore_dpll_ops, | 945 | .ops = &clkops_omap3_noncore_dpll_ops, |
946 | .parent = &sys_ck, | 946 | .parent = &sys_ck, |
947 | .dpll_data = &dpll5_dd, | 947 | .dpll_data = &dpll5_dd, |
948 | .round_rate = &omap2_dpll_round_rate, | 948 | .round_rate = &omap2_dpll_round_rate, |
949 | .set_rate = &omap3_noncore_dpll_set_rate, | 949 | .set_rate = &omap3_noncore_dpll_set_rate, |
950 | .clkdm_name = "dpll5_clkdm", | 950 | .clkdm_name = "dpll5_clkdm", |
951 | .recalc = &omap3_dpll_recalc, | 951 | .recalc = &omap3_dpll_recalc, |
952 | }; | 952 | }; |
953 | 953 | ||
954 | static const struct clksel div16_dpll5_clksel[] = { | 954 | static const struct clksel div16_dpll5_clksel[] = { |
955 | { .parent = &dpll5_ck, .rates = div16_dpll_rates }, | 955 | { .parent = &dpll5_ck, .rates = div16_dpll_rates }, |
956 | { .parent = NULL } | 956 | { .parent = NULL } |
957 | }; | 957 | }; |
958 | 958 | ||
959 | static struct clk dpll5_m2_ck = { | 959 | static struct clk dpll5_m2_ck = { |
960 | .name = "dpll5_m2_ck", | 960 | .name = "dpll5_m2_ck", |
961 | .ops = &clkops_null, | 961 | .ops = &clkops_null, |
962 | .parent = &dpll5_ck, | 962 | .parent = &dpll5_ck, |
963 | .init = &omap2_init_clksel_parent, | 963 | .init = &omap2_init_clksel_parent, |
964 | .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, OMAP3430ES2_CM_CLKSEL5), | 964 | .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, OMAP3430ES2_CM_CLKSEL5), |
965 | .clksel_mask = OMAP3430ES2_DIV_120M_MASK, | 965 | .clksel_mask = OMAP3430ES2_DIV_120M_MASK, |
966 | .clksel = div16_dpll5_clksel, | 966 | .clksel = div16_dpll5_clksel, |
967 | .clkdm_name = "dpll5_clkdm", | 967 | .clkdm_name = "dpll5_clkdm", |
968 | .recalc = &omap2_clksel_recalc, | 968 | .recalc = &omap2_clksel_recalc, |
969 | }; | 969 | }; |
970 | 970 | ||
971 | /* CM EXTERNAL CLOCK OUTPUTS */ | 971 | /* CM EXTERNAL CLOCK OUTPUTS */ |
972 | 972 | ||
973 | static const struct clksel_rate clkout2_src_core_rates[] = { | 973 | static const struct clksel_rate clkout2_src_core_rates[] = { |
974 | { .div = 1, .val = 0, .flags = RATE_IN_3XXX }, | 974 | { .div = 1, .val = 0, .flags = RATE_IN_3XXX }, |
975 | { .div = 0 } | 975 | { .div = 0 } |
976 | }; | 976 | }; |
977 | 977 | ||
978 | static const struct clksel_rate clkout2_src_sys_rates[] = { | 978 | static const struct clksel_rate clkout2_src_sys_rates[] = { |
979 | { .div = 1, .val = 1, .flags = RATE_IN_3XXX }, | 979 | { .div = 1, .val = 1, .flags = RATE_IN_3XXX }, |
980 | { .div = 0 } | 980 | { .div = 0 } |
981 | }; | 981 | }; |
982 | 982 | ||
983 | static const struct clksel_rate clkout2_src_96m_rates[] = { | 983 | static const struct clksel_rate clkout2_src_96m_rates[] = { |
984 | { .div = 1, .val = 2, .flags = RATE_IN_3XXX }, | 984 | { .div = 1, .val = 2, .flags = RATE_IN_3XXX }, |
985 | { .div = 0 } | 985 | { .div = 0 } |
986 | }; | 986 | }; |
987 | 987 | ||
988 | static const struct clksel_rate clkout2_src_54m_rates[] = { | 988 | static const struct clksel_rate clkout2_src_54m_rates[] = { |
989 | { .div = 1, .val = 3, .flags = RATE_IN_3XXX }, | 989 | { .div = 1, .val = 3, .flags = RATE_IN_3XXX }, |
990 | { .div = 0 } | 990 | { .div = 0 } |
991 | }; | 991 | }; |
992 | 992 | ||
993 | static const struct clksel clkout2_src_clksel[] = { | 993 | static const struct clksel clkout2_src_clksel[] = { |
994 | { .parent = &core_ck, .rates = clkout2_src_core_rates }, | 994 | { .parent = &core_ck, .rates = clkout2_src_core_rates }, |
995 | { .parent = &sys_ck, .rates = clkout2_src_sys_rates }, | 995 | { .parent = &sys_ck, .rates = clkout2_src_sys_rates }, |
996 | { .parent = &cm_96m_fck, .rates = clkout2_src_96m_rates }, | 996 | { .parent = &cm_96m_fck, .rates = clkout2_src_96m_rates }, |
997 | { .parent = &omap_54m_fck, .rates = clkout2_src_54m_rates }, | 997 | { .parent = &omap_54m_fck, .rates = clkout2_src_54m_rates }, |
998 | { .parent = NULL } | 998 | { .parent = NULL } |
999 | }; | 999 | }; |
1000 | 1000 | ||
1001 | static struct clk clkout2_src_ck = { | 1001 | static struct clk clkout2_src_ck = { |
1002 | .name = "clkout2_src_ck", | 1002 | .name = "clkout2_src_ck", |
1003 | .ops = &clkops_omap2_dflt, | 1003 | .ops = &clkops_omap2_dflt, |
1004 | .init = &omap2_init_clksel_parent, | 1004 | .init = &omap2_init_clksel_parent, |
1005 | .enable_reg = OMAP3430_CM_CLKOUT_CTRL, | 1005 | .enable_reg = OMAP3430_CM_CLKOUT_CTRL, |
1006 | .enable_bit = OMAP3430_CLKOUT2_EN_SHIFT, | 1006 | .enable_bit = OMAP3430_CLKOUT2_EN_SHIFT, |
1007 | .clksel_reg = OMAP3430_CM_CLKOUT_CTRL, | 1007 | .clksel_reg = OMAP3430_CM_CLKOUT_CTRL, |
1008 | .clksel_mask = OMAP3430_CLKOUT2SOURCE_MASK, | 1008 | .clksel_mask = OMAP3430_CLKOUT2SOURCE_MASK, |
1009 | .clksel = clkout2_src_clksel, | 1009 | .clksel = clkout2_src_clksel, |
1010 | .clkdm_name = "core_clkdm", | 1010 | .clkdm_name = "core_clkdm", |
1011 | .recalc = &omap2_clksel_recalc, | 1011 | .recalc = &omap2_clksel_recalc, |
1012 | }; | 1012 | }; |
1013 | 1013 | ||
1014 | static const struct clksel_rate sys_clkout2_rates[] = { | 1014 | static const struct clksel_rate sys_clkout2_rates[] = { |
1015 | { .div = 1, .val = 0, .flags = RATE_IN_3XXX }, | 1015 | { .div = 1, .val = 0, .flags = RATE_IN_3XXX }, |
1016 | { .div = 2, .val = 1, .flags = RATE_IN_3XXX }, | 1016 | { .div = 2, .val = 1, .flags = RATE_IN_3XXX }, |
1017 | { .div = 4, .val = 2, .flags = RATE_IN_3XXX }, | 1017 | { .div = 4, .val = 2, .flags = RATE_IN_3XXX }, |
1018 | { .div = 8, .val = 3, .flags = RATE_IN_3XXX }, | 1018 | { .div = 8, .val = 3, .flags = RATE_IN_3XXX }, |
1019 | { .div = 16, .val = 4, .flags = RATE_IN_3XXX }, | 1019 | { .div = 16, .val = 4, .flags = RATE_IN_3XXX }, |
1020 | { .div = 0 }, | 1020 | { .div = 0 }, |
1021 | }; | 1021 | }; |
1022 | 1022 | ||
1023 | static const struct clksel sys_clkout2_clksel[] = { | 1023 | static const struct clksel sys_clkout2_clksel[] = { |
1024 | { .parent = &clkout2_src_ck, .rates = sys_clkout2_rates }, | 1024 | { .parent = &clkout2_src_ck, .rates = sys_clkout2_rates }, |
1025 | { .parent = NULL }, | 1025 | { .parent = NULL }, |
1026 | }; | 1026 | }; |
1027 | 1027 | ||
1028 | static struct clk sys_clkout2 = { | 1028 | static struct clk sys_clkout2 = { |
1029 | .name = "sys_clkout2", | 1029 | .name = "sys_clkout2", |
1030 | .ops = &clkops_null, | 1030 | .ops = &clkops_null, |
1031 | .init = &omap2_init_clksel_parent, | 1031 | .init = &omap2_init_clksel_parent, |
1032 | .clksel_reg = OMAP3430_CM_CLKOUT_CTRL, | 1032 | .clksel_reg = OMAP3430_CM_CLKOUT_CTRL, |
1033 | .clksel_mask = OMAP3430_CLKOUT2_DIV_MASK, | 1033 | .clksel_mask = OMAP3430_CLKOUT2_DIV_MASK, |
1034 | .clksel = sys_clkout2_clksel, | 1034 | .clksel = sys_clkout2_clksel, |
1035 | .recalc = &omap2_clksel_recalc, | 1035 | .recalc = &omap2_clksel_recalc, |
1036 | .round_rate = &omap2_clksel_round_rate, | 1036 | .round_rate = &omap2_clksel_round_rate, |
1037 | .set_rate = &omap2_clksel_set_rate | 1037 | .set_rate = &omap2_clksel_set_rate |
1038 | }; | 1038 | }; |
1039 | 1039 | ||
1040 | /* CM OUTPUT CLOCKS */ | 1040 | /* CM OUTPUT CLOCKS */ |
1041 | 1041 | ||
1042 | static struct clk corex2_fck = { | 1042 | static struct clk corex2_fck = { |
1043 | .name = "corex2_fck", | 1043 | .name = "corex2_fck", |
1044 | .ops = &clkops_null, | 1044 | .ops = &clkops_null, |
1045 | .parent = &dpll3_m2x2_ck, | 1045 | .parent = &dpll3_m2x2_ck, |
1046 | .recalc = &followparent_recalc, | 1046 | .recalc = &followparent_recalc, |
1047 | }; | 1047 | }; |
1048 | 1048 | ||
1049 | /* DPLL power domain clock controls */ | 1049 | /* DPLL power domain clock controls */ |
1050 | 1050 | ||
1051 | static const struct clksel_rate div4_rates[] = { | 1051 | static const struct clksel_rate div4_rates[] = { |
1052 | { .div = 1, .val = 1, .flags = RATE_IN_3XXX }, | 1052 | { .div = 1, .val = 1, .flags = RATE_IN_3XXX }, |
1053 | { .div = 2, .val = 2, .flags = RATE_IN_3XXX }, | 1053 | { .div = 2, .val = 2, .flags = RATE_IN_3XXX }, |
1054 | { .div = 4, .val = 4, .flags = RATE_IN_3XXX }, | 1054 | { .div = 4, .val = 4, .flags = RATE_IN_3XXX }, |
1055 | { .div = 0 } | 1055 | { .div = 0 } |
1056 | }; | 1056 | }; |
1057 | 1057 | ||
1058 | static const struct clksel div4_core_clksel[] = { | 1058 | static const struct clksel div4_core_clksel[] = { |
1059 | { .parent = &core_ck, .rates = div4_rates }, | 1059 | { .parent = &core_ck, .rates = div4_rates }, |
1060 | { .parent = NULL } | 1060 | { .parent = NULL } |
1061 | }; | 1061 | }; |
1062 | 1062 | ||
1063 | /* | 1063 | /* |
1064 | * REVISIT: Are these in DPLL power domain or CM power domain? docs | 1064 | * REVISIT: Are these in DPLL power domain or CM power domain? docs |
1065 | * may be inconsistent here? | 1065 | * may be inconsistent here? |
1066 | */ | 1066 | */ |
1067 | static struct clk dpll1_fck = { | 1067 | static struct clk dpll1_fck = { |
1068 | .name = "dpll1_fck", | 1068 | .name = "dpll1_fck", |
1069 | .ops = &clkops_null, | 1069 | .ops = &clkops_null, |
1070 | .parent = &core_ck, | 1070 | .parent = &core_ck, |
1071 | .init = &omap2_init_clksel_parent, | 1071 | .init = &omap2_init_clksel_parent, |
1072 | .clksel_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_CLKSEL1_PLL), | 1072 | .clksel_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_CLKSEL1_PLL), |
1073 | .clksel_mask = OMAP3430_MPU_CLK_SRC_MASK, | 1073 | .clksel_mask = OMAP3430_MPU_CLK_SRC_MASK, |
1074 | .clksel = div4_core_clksel, | 1074 | .clksel = div4_core_clksel, |
1075 | .recalc = &omap2_clksel_recalc, | 1075 | .recalc = &omap2_clksel_recalc, |
1076 | }; | 1076 | }; |
1077 | 1077 | ||
1078 | static struct clk mpu_ck = { | 1078 | static struct clk mpu_ck = { |
1079 | .name = "mpu_ck", | 1079 | .name = "mpu_ck", |
1080 | .ops = &clkops_null, | 1080 | .ops = &clkops_null, |
1081 | .parent = &dpll1_x2m2_ck, | 1081 | .parent = &dpll1_x2m2_ck, |
1082 | .clkdm_name = "mpu_clkdm", | 1082 | .clkdm_name = "mpu_clkdm", |
1083 | .recalc = &followparent_recalc, | 1083 | .recalc = &followparent_recalc, |
1084 | }; | 1084 | }; |
1085 | 1085 | ||
1086 | /* arm_fck is divided by two when DPLL1 locked; otherwise, passthrough mpu_ck */ | 1086 | /* arm_fck is divided by two when DPLL1 locked; otherwise, passthrough mpu_ck */ |
1087 | static const struct clksel_rate arm_fck_rates[] = { | 1087 | static const struct clksel_rate arm_fck_rates[] = { |
1088 | { .div = 1, .val = 0, .flags = RATE_IN_3XXX }, | 1088 | { .div = 1, .val = 0, .flags = RATE_IN_3XXX }, |
1089 | { .div = 2, .val = 1, .flags = RATE_IN_3XXX }, | 1089 | { .div = 2, .val = 1, .flags = RATE_IN_3XXX }, |
1090 | { .div = 0 }, | 1090 | { .div = 0 }, |
1091 | }; | 1091 | }; |
1092 | 1092 | ||
1093 | static const struct clksel arm_fck_clksel[] = { | 1093 | static const struct clksel arm_fck_clksel[] = { |
1094 | { .parent = &mpu_ck, .rates = arm_fck_rates }, | 1094 | { .parent = &mpu_ck, .rates = arm_fck_rates }, |
1095 | { .parent = NULL } | 1095 | { .parent = NULL } |
1096 | }; | 1096 | }; |
1097 | 1097 | ||
1098 | static struct clk arm_fck = { | 1098 | static struct clk arm_fck = { |
1099 | .name = "arm_fck", | 1099 | .name = "arm_fck", |
1100 | .ops = &clkops_null, | 1100 | .ops = &clkops_null, |
1101 | .parent = &mpu_ck, | 1101 | .parent = &mpu_ck, |
1102 | .init = &omap2_init_clksel_parent, | 1102 | .init = &omap2_init_clksel_parent, |
1103 | .clksel_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_IDLEST_PLL), | 1103 | .clksel_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_IDLEST_PLL), |
1104 | .clksel_mask = OMAP3430_ST_MPU_CLK_MASK, | 1104 | .clksel_mask = OMAP3430_ST_MPU_CLK_MASK, |
1105 | .clksel = arm_fck_clksel, | 1105 | .clksel = arm_fck_clksel, |
1106 | .clkdm_name = "mpu_clkdm", | 1106 | .clkdm_name = "mpu_clkdm", |
1107 | .recalc = &omap2_clksel_recalc, | 1107 | .recalc = &omap2_clksel_recalc, |
1108 | }; | 1108 | }; |
1109 | 1109 | ||
1110 | /* XXX What about neon_clkdm ? */ | 1110 | /* XXX What about neon_clkdm ? */ |
1111 | 1111 | ||
1112 | /* | 1112 | /* |
1113 | * REVISIT: This clock is never specifically defined in the 3430 TRM, | 1113 | * REVISIT: This clock is never specifically defined in the 3430 TRM, |
1114 | * although it is referenced - so this is a guess | 1114 | * although it is referenced - so this is a guess |
1115 | */ | 1115 | */ |
1116 | static struct clk emu_mpu_alwon_ck = { | 1116 | static struct clk emu_mpu_alwon_ck = { |
1117 | .name = "emu_mpu_alwon_ck", | 1117 | .name = "emu_mpu_alwon_ck", |
1118 | .ops = &clkops_null, | 1118 | .ops = &clkops_null, |
1119 | .parent = &mpu_ck, | 1119 | .parent = &mpu_ck, |
1120 | .recalc = &followparent_recalc, | 1120 | .recalc = &followparent_recalc, |
1121 | }; | 1121 | }; |
1122 | 1122 | ||
1123 | static struct clk dpll2_fck = { | 1123 | static struct clk dpll2_fck = { |
1124 | .name = "dpll2_fck", | 1124 | .name = "dpll2_fck", |
1125 | .ops = &clkops_null, | 1125 | .ops = &clkops_null, |
1126 | .parent = &core_ck, | 1126 | .parent = &core_ck, |
1127 | .init = &omap2_init_clksel_parent, | 1127 | .init = &omap2_init_clksel_parent, |
1128 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, OMAP3430_CM_CLKSEL1_PLL), | 1128 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, OMAP3430_CM_CLKSEL1_PLL), |
1129 | .clksel_mask = OMAP3430_IVA2_CLK_SRC_MASK, | 1129 | .clksel_mask = OMAP3430_IVA2_CLK_SRC_MASK, |
1130 | .clksel = div4_core_clksel, | 1130 | .clksel = div4_core_clksel, |
1131 | .recalc = &omap2_clksel_recalc, | 1131 | .recalc = &omap2_clksel_recalc, |
1132 | }; | 1132 | }; |
1133 | 1133 | ||
1134 | static struct clk iva2_ck = { | 1134 | static struct clk iva2_ck = { |
1135 | .name = "iva2_ck", | 1135 | .name = "iva2_ck", |
1136 | .ops = &clkops_omap2_dflt_wait, | 1136 | .ops = &clkops_omap2_dflt_wait, |
1137 | .parent = &dpll2_m2_ck, | 1137 | .parent = &dpll2_m2_ck, |
1138 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, CM_FCLKEN), | 1138 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, CM_FCLKEN), |
1139 | .enable_bit = OMAP3430_CM_FCLKEN_IVA2_EN_IVA2_SHIFT, | 1139 | .enable_bit = OMAP3430_CM_FCLKEN_IVA2_EN_IVA2_SHIFT, |
1140 | .clkdm_name = "iva2_clkdm", | 1140 | .clkdm_name = "iva2_clkdm", |
1141 | .recalc = &followparent_recalc, | 1141 | .recalc = &followparent_recalc, |
1142 | }; | 1142 | }; |
1143 | 1143 | ||
1144 | /* Common interface clocks */ | 1144 | /* Common interface clocks */ |
1145 | 1145 | ||
1146 | static const struct clksel div2_core_clksel[] = { | 1146 | static const struct clksel div2_core_clksel[] = { |
1147 | { .parent = &core_ck, .rates = div2_rates }, | 1147 | { .parent = &core_ck, .rates = div2_rates }, |
1148 | { .parent = NULL } | 1148 | { .parent = NULL } |
1149 | }; | 1149 | }; |
1150 | 1150 | ||
1151 | static struct clk l3_ick = { | 1151 | static struct clk l3_ick = { |
1152 | .name = "l3_ick", | 1152 | .name = "l3_ick", |
1153 | .ops = &clkops_null, | 1153 | .ops = &clkops_null, |
1154 | .parent = &core_ck, | 1154 | .parent = &core_ck, |
1155 | .init = &omap2_init_clksel_parent, | 1155 | .init = &omap2_init_clksel_parent, |
1156 | .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL), | 1156 | .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL), |
1157 | .clksel_mask = OMAP3430_CLKSEL_L3_MASK, | 1157 | .clksel_mask = OMAP3430_CLKSEL_L3_MASK, |
1158 | .clksel = div2_core_clksel, | 1158 | .clksel = div2_core_clksel, |
1159 | .clkdm_name = "core_l3_clkdm", | 1159 | .clkdm_name = "core_l3_clkdm", |
1160 | .recalc = &omap2_clksel_recalc, | 1160 | .recalc = &omap2_clksel_recalc, |
1161 | }; | 1161 | }; |
1162 | 1162 | ||
1163 | static const struct clksel div2_l3_clksel[] = { | 1163 | static const struct clksel div2_l3_clksel[] = { |
1164 | { .parent = &l3_ick, .rates = div2_rates }, | 1164 | { .parent = &l3_ick, .rates = div2_rates }, |
1165 | { .parent = NULL } | 1165 | { .parent = NULL } |
1166 | }; | 1166 | }; |
1167 | 1167 | ||
1168 | static struct clk l4_ick = { | 1168 | static struct clk l4_ick = { |
1169 | .name = "l4_ick", | 1169 | .name = "l4_ick", |
1170 | .ops = &clkops_null, | 1170 | .ops = &clkops_null, |
1171 | .parent = &l3_ick, | 1171 | .parent = &l3_ick, |
1172 | .init = &omap2_init_clksel_parent, | 1172 | .init = &omap2_init_clksel_parent, |
1173 | .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL), | 1173 | .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL), |
1174 | .clksel_mask = OMAP3430_CLKSEL_L4_MASK, | 1174 | .clksel_mask = OMAP3430_CLKSEL_L4_MASK, |
1175 | .clksel = div2_l3_clksel, | 1175 | .clksel = div2_l3_clksel, |
1176 | .clkdm_name = "core_l4_clkdm", | 1176 | .clkdm_name = "core_l4_clkdm", |
1177 | .recalc = &omap2_clksel_recalc, | 1177 | .recalc = &omap2_clksel_recalc, |
1178 | 1178 | ||
1179 | }; | 1179 | }; |
1180 | 1180 | ||
1181 | static const struct clksel div2_l4_clksel[] = { | 1181 | static const struct clksel div2_l4_clksel[] = { |
1182 | { .parent = &l4_ick, .rates = div2_rates }, | 1182 | { .parent = &l4_ick, .rates = div2_rates }, |
1183 | { .parent = NULL } | 1183 | { .parent = NULL } |
1184 | }; | 1184 | }; |
1185 | 1185 | ||
1186 | static struct clk rm_ick = { | 1186 | static struct clk rm_ick = { |
1187 | .name = "rm_ick", | 1187 | .name = "rm_ick", |
1188 | .ops = &clkops_null, | 1188 | .ops = &clkops_null, |
1189 | .parent = &l4_ick, | 1189 | .parent = &l4_ick, |
1190 | .init = &omap2_init_clksel_parent, | 1190 | .init = &omap2_init_clksel_parent, |
1191 | .clksel_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_CLKSEL), | 1191 | .clksel_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_CLKSEL), |
1192 | .clksel_mask = OMAP3430_CLKSEL_RM_MASK, | 1192 | .clksel_mask = OMAP3430_CLKSEL_RM_MASK, |
1193 | .clksel = div2_l4_clksel, | 1193 | .clksel = div2_l4_clksel, |
1194 | .recalc = &omap2_clksel_recalc, | 1194 | .recalc = &omap2_clksel_recalc, |
1195 | }; | 1195 | }; |
1196 | 1196 | ||
1197 | /* GFX power domain */ | 1197 | /* GFX power domain */ |
1198 | 1198 | ||
1199 | /* GFX clocks are in 3430ES1 only. 3430ES2 and later uses the SGX instead */ | 1199 | /* GFX clocks are in 3430ES1 only. 3430ES2 and later uses the SGX instead */ |
1200 | 1200 | ||
1201 | static const struct clksel gfx_l3_clksel[] = { | 1201 | static const struct clksel gfx_l3_clksel[] = { |
1202 | { .parent = &l3_ick, .rates = gfx_l3_rates }, | 1202 | { .parent = &l3_ick, .rates = gfx_l3_rates }, |
1203 | { .parent = NULL } | 1203 | { .parent = NULL } |
1204 | }; | 1204 | }; |
1205 | 1205 | ||
1206 | /* Virtual parent clock for gfx_l3_ick and gfx_l3_fck */ | 1206 | /* Virtual parent clock for gfx_l3_ick and gfx_l3_fck */ |
1207 | static struct clk gfx_l3_ck = { | 1207 | static struct clk gfx_l3_ck = { |
1208 | .name = "gfx_l3_ck", | 1208 | .name = "gfx_l3_ck", |
1209 | .ops = &clkops_omap2_dflt_wait, | 1209 | .ops = &clkops_omap2_dflt_wait, |
1210 | .parent = &l3_ick, | 1210 | .parent = &l3_ick, |
1211 | .enable_reg = OMAP_CM_REGADDR(GFX_MOD, CM_ICLKEN), | 1211 | .enable_reg = OMAP_CM_REGADDR(GFX_MOD, CM_ICLKEN), |
1212 | .enable_bit = OMAP_EN_GFX_SHIFT, | 1212 | .enable_bit = OMAP_EN_GFX_SHIFT, |
1213 | .recalc = &followparent_recalc, | 1213 | .recalc = &followparent_recalc, |
1214 | }; | 1214 | }; |
1215 | 1215 | ||
1216 | static struct clk gfx_l3_fck = { | 1216 | static struct clk gfx_l3_fck = { |
1217 | .name = "gfx_l3_fck", | 1217 | .name = "gfx_l3_fck", |
1218 | .ops = &clkops_null, | 1218 | .ops = &clkops_null, |
1219 | .parent = &gfx_l3_ck, | 1219 | .parent = &gfx_l3_ck, |
1220 | .init = &omap2_init_clksel_parent, | 1220 | .init = &omap2_init_clksel_parent, |
1221 | .clksel_reg = OMAP_CM_REGADDR(GFX_MOD, CM_CLKSEL), | 1221 | .clksel_reg = OMAP_CM_REGADDR(GFX_MOD, CM_CLKSEL), |
1222 | .clksel_mask = OMAP_CLKSEL_GFX_MASK, | 1222 | .clksel_mask = OMAP_CLKSEL_GFX_MASK, |
1223 | .clksel = gfx_l3_clksel, | 1223 | .clksel = gfx_l3_clksel, |
1224 | .clkdm_name = "gfx_3430es1_clkdm", | 1224 | .clkdm_name = "gfx_3430es1_clkdm", |
1225 | .recalc = &omap2_clksel_recalc, | 1225 | .recalc = &omap2_clksel_recalc, |
1226 | }; | 1226 | }; |
1227 | 1227 | ||
1228 | static struct clk gfx_l3_ick = { | 1228 | static struct clk gfx_l3_ick = { |
1229 | .name = "gfx_l3_ick", | 1229 | .name = "gfx_l3_ick", |
1230 | .ops = &clkops_null, | 1230 | .ops = &clkops_null, |
1231 | .parent = &gfx_l3_ck, | 1231 | .parent = &gfx_l3_ck, |
1232 | .clkdm_name = "gfx_3430es1_clkdm", | 1232 | .clkdm_name = "gfx_3430es1_clkdm", |
1233 | .recalc = &followparent_recalc, | 1233 | .recalc = &followparent_recalc, |
1234 | }; | 1234 | }; |
1235 | 1235 | ||
1236 | static struct clk gfx_cg1_ck = { | 1236 | static struct clk gfx_cg1_ck = { |
1237 | .name = "gfx_cg1_ck", | 1237 | .name = "gfx_cg1_ck", |
1238 | .ops = &clkops_omap2_dflt_wait, | 1238 | .ops = &clkops_omap2_dflt_wait, |
1239 | .parent = &gfx_l3_fck, /* REVISIT: correct? */ | 1239 | .parent = &gfx_l3_fck, /* REVISIT: correct? */ |
1240 | .enable_reg = OMAP_CM_REGADDR(GFX_MOD, CM_FCLKEN), | 1240 | .enable_reg = OMAP_CM_REGADDR(GFX_MOD, CM_FCLKEN), |
1241 | .enable_bit = OMAP3430ES1_EN_2D_SHIFT, | 1241 | .enable_bit = OMAP3430ES1_EN_2D_SHIFT, |
1242 | .clkdm_name = "gfx_3430es1_clkdm", | 1242 | .clkdm_name = "gfx_3430es1_clkdm", |
1243 | .recalc = &followparent_recalc, | 1243 | .recalc = &followparent_recalc, |
1244 | }; | 1244 | }; |
1245 | 1245 | ||
1246 | static struct clk gfx_cg2_ck = { | 1246 | static struct clk gfx_cg2_ck = { |
1247 | .name = "gfx_cg2_ck", | 1247 | .name = "gfx_cg2_ck", |
1248 | .ops = &clkops_omap2_dflt_wait, | 1248 | .ops = &clkops_omap2_dflt_wait, |
1249 | .parent = &gfx_l3_fck, /* REVISIT: correct? */ | 1249 | .parent = &gfx_l3_fck, /* REVISIT: correct? */ |
1250 | .enable_reg = OMAP_CM_REGADDR(GFX_MOD, CM_FCLKEN), | 1250 | .enable_reg = OMAP_CM_REGADDR(GFX_MOD, CM_FCLKEN), |
1251 | .enable_bit = OMAP3430ES1_EN_3D_SHIFT, | 1251 | .enable_bit = OMAP3430ES1_EN_3D_SHIFT, |
1252 | .clkdm_name = "gfx_3430es1_clkdm", | 1252 | .clkdm_name = "gfx_3430es1_clkdm", |
1253 | .recalc = &followparent_recalc, | 1253 | .recalc = &followparent_recalc, |
1254 | }; | 1254 | }; |
1255 | 1255 | ||
1256 | /* SGX power domain - 3430ES2 only */ | 1256 | /* SGX power domain - 3430ES2 only */ |
1257 | 1257 | ||
1258 | static const struct clksel_rate sgx_core_rates[] = { | 1258 | static const struct clksel_rate sgx_core_rates[] = { |
1259 | { .div = 2, .val = 5, .flags = RATE_IN_36XX }, | 1259 | { .div = 2, .val = 5, .flags = RATE_IN_36XX }, |
1260 | { .div = 3, .val = 0, .flags = RATE_IN_3XXX }, | 1260 | { .div = 3, .val = 0, .flags = RATE_IN_3XXX }, |
1261 | { .div = 4, .val = 1, .flags = RATE_IN_3XXX }, | 1261 | { .div = 4, .val = 1, .flags = RATE_IN_3XXX }, |
1262 | { .div = 6, .val = 2, .flags = RATE_IN_3XXX }, | 1262 | { .div = 6, .val = 2, .flags = RATE_IN_3XXX }, |
1263 | { .div = 0 }, | 1263 | { .div = 0 }, |
1264 | }; | 1264 | }; |
1265 | 1265 | ||
1266 | static const struct clksel_rate sgx_192m_rates[] = { | 1266 | static const struct clksel_rate sgx_192m_rates[] = { |
1267 | { .div = 1, .val = 4, .flags = RATE_IN_36XX }, | 1267 | { .div = 1, .val = 4, .flags = RATE_IN_36XX }, |
1268 | { .div = 0 }, | 1268 | { .div = 0 }, |
1269 | }; | 1269 | }; |
1270 | 1270 | ||
1271 | static const struct clksel_rate sgx_corex2_rates[] = { | 1271 | static const struct clksel_rate sgx_corex2_rates[] = { |
1272 | { .div = 3, .val = 6, .flags = RATE_IN_36XX }, | 1272 | { .div = 3, .val = 6, .flags = RATE_IN_36XX }, |
1273 | { .div = 5, .val = 7, .flags = RATE_IN_36XX }, | 1273 | { .div = 5, .val = 7, .flags = RATE_IN_36XX }, |
1274 | { .div = 0 }, | 1274 | { .div = 0 }, |
1275 | }; | 1275 | }; |
1276 | 1276 | ||
1277 | static const struct clksel_rate sgx_96m_rates[] = { | 1277 | static const struct clksel_rate sgx_96m_rates[] = { |
1278 | { .div = 1, .val = 3, .flags = RATE_IN_3XXX }, | 1278 | { .div = 1, .val = 3, .flags = RATE_IN_3XXX }, |
1279 | { .div = 0 }, | 1279 | { .div = 0 }, |
1280 | }; | 1280 | }; |
1281 | 1281 | ||
1282 | static const struct clksel sgx_clksel[] = { | 1282 | static const struct clksel sgx_clksel[] = { |
1283 | { .parent = &core_ck, .rates = sgx_core_rates }, | 1283 | { .parent = &core_ck, .rates = sgx_core_rates }, |
1284 | { .parent = &cm_96m_fck, .rates = sgx_96m_rates }, | 1284 | { .parent = &cm_96m_fck, .rates = sgx_96m_rates }, |
1285 | { .parent = &omap_192m_alwon_fck, .rates = sgx_192m_rates }, | 1285 | { .parent = &omap_192m_alwon_fck, .rates = sgx_192m_rates }, |
1286 | { .parent = &corex2_fck, .rates = sgx_corex2_rates }, | 1286 | { .parent = &corex2_fck, .rates = sgx_corex2_rates }, |
1287 | { .parent = NULL } | 1287 | { .parent = NULL } |
1288 | }; | 1288 | }; |
1289 | 1289 | ||
1290 | static struct clk sgx_fck = { | 1290 | static struct clk sgx_fck = { |
1291 | .name = "sgx_fck", | 1291 | .name = "sgx_fck", |
1292 | .ops = &clkops_omap2_dflt_wait, | 1292 | .ops = &clkops_omap2_dflt_wait, |
1293 | .init = &omap2_init_clksel_parent, | 1293 | .init = &omap2_init_clksel_parent, |
1294 | .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_SGX_MOD, CM_FCLKEN), | 1294 | .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_SGX_MOD, CM_FCLKEN), |
1295 | .enable_bit = OMAP3430ES2_CM_FCLKEN_SGX_EN_SGX_SHIFT, | 1295 | .enable_bit = OMAP3430ES2_CM_FCLKEN_SGX_EN_SGX_SHIFT, |
1296 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430ES2_SGX_MOD, CM_CLKSEL), | 1296 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430ES2_SGX_MOD, CM_CLKSEL), |
1297 | .clksel_mask = OMAP3430ES2_CLKSEL_SGX_MASK, | 1297 | .clksel_mask = OMAP3430ES2_CLKSEL_SGX_MASK, |
1298 | .clksel = sgx_clksel, | 1298 | .clksel = sgx_clksel, |
1299 | .clkdm_name = "sgx_clkdm", | 1299 | .clkdm_name = "sgx_clkdm", |
1300 | .recalc = &omap2_clksel_recalc, | 1300 | .recalc = &omap2_clksel_recalc, |
1301 | .set_rate = &omap2_clksel_set_rate, | 1301 | .set_rate = &omap2_clksel_set_rate, |
1302 | .round_rate = &omap2_clksel_round_rate | 1302 | .round_rate = &omap2_clksel_round_rate |
1303 | }; | 1303 | }; |
1304 | 1304 | ||
1305 | static struct clk sgx_ick = { | 1305 | static struct clk sgx_ick = { |
1306 | .name = "sgx_ick", | 1306 | .name = "sgx_ick", |
1307 | .ops = &clkops_omap2_dflt_wait, | 1307 | .ops = &clkops_omap2_dflt_wait, |
1308 | .parent = &l3_ick, | 1308 | .parent = &l3_ick, |
1309 | .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_SGX_MOD, CM_ICLKEN), | 1309 | .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_SGX_MOD, CM_ICLKEN), |
1310 | .enable_bit = OMAP3430ES2_CM_ICLKEN_SGX_EN_SGX_SHIFT, | 1310 | .enable_bit = OMAP3430ES2_CM_ICLKEN_SGX_EN_SGX_SHIFT, |
1311 | .clkdm_name = "sgx_clkdm", | 1311 | .clkdm_name = "sgx_clkdm", |
1312 | .recalc = &followparent_recalc, | 1312 | .recalc = &followparent_recalc, |
1313 | }; | 1313 | }; |
1314 | 1314 | ||
1315 | /* CORE power domain */ | 1315 | /* CORE power domain */ |
1316 | 1316 | ||
1317 | static struct clk d2d_26m_fck = { | 1317 | static struct clk d2d_26m_fck = { |
1318 | .name = "d2d_26m_fck", | 1318 | .name = "d2d_26m_fck", |
1319 | .ops = &clkops_omap2_dflt_wait, | 1319 | .ops = &clkops_omap2_dflt_wait, |
1320 | .parent = &sys_ck, | 1320 | .parent = &sys_ck, |
1321 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), | 1321 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), |
1322 | .enable_bit = OMAP3430ES1_EN_D2D_SHIFT, | 1322 | .enable_bit = OMAP3430ES1_EN_D2D_SHIFT, |
1323 | .clkdm_name = "d2d_clkdm", | 1323 | .clkdm_name = "d2d_clkdm", |
1324 | .recalc = &followparent_recalc, | 1324 | .recalc = &followparent_recalc, |
1325 | }; | 1325 | }; |
1326 | 1326 | ||
1327 | static struct clk modem_fck = { | 1327 | static struct clk modem_fck = { |
1328 | .name = "modem_fck", | 1328 | .name = "modem_fck", |
1329 | .ops = &clkops_omap2_dflt_wait, | 1329 | .ops = &clkops_omap2_dflt_wait, |
1330 | .parent = &sys_ck, | 1330 | .parent = &sys_ck, |
1331 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), | 1331 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), |
1332 | .enable_bit = OMAP3430_EN_MODEM_SHIFT, | 1332 | .enable_bit = OMAP3430_EN_MODEM_SHIFT, |
1333 | .clkdm_name = "d2d_clkdm", | 1333 | .clkdm_name = "d2d_clkdm", |
1334 | .recalc = &followparent_recalc, | 1334 | .recalc = &followparent_recalc, |
1335 | }; | 1335 | }; |
1336 | 1336 | ||
1337 | static struct clk sad2d_ick = { | 1337 | static struct clk sad2d_ick = { |
1338 | .name = "sad2d_ick", | 1338 | .name = "sad2d_ick", |
1339 | .ops = &clkops_omap2_dflt_wait, | 1339 | .ops = &clkops_omap2_dflt_wait, |
1340 | .parent = &l3_ick, | 1340 | .parent = &l3_ick, |
1341 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1341 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
1342 | .enable_bit = OMAP3430_EN_SAD2D_SHIFT, | 1342 | .enable_bit = OMAP3430_EN_SAD2D_SHIFT, |
1343 | .clkdm_name = "d2d_clkdm", | 1343 | .clkdm_name = "d2d_clkdm", |
1344 | .recalc = &followparent_recalc, | 1344 | .recalc = &followparent_recalc, |
1345 | }; | 1345 | }; |
1346 | 1346 | ||
1347 | static struct clk mad2d_ick = { | 1347 | static struct clk mad2d_ick = { |
1348 | .name = "mad2d_ick", | 1348 | .name = "mad2d_ick", |
1349 | .ops = &clkops_omap2_dflt_wait, | 1349 | .ops = &clkops_omap2_dflt_wait, |
1350 | .parent = &l3_ick, | 1350 | .parent = &l3_ick, |
1351 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3), | 1351 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3), |
1352 | .enable_bit = OMAP3430_EN_MAD2D_SHIFT, | 1352 | .enable_bit = OMAP3430_EN_MAD2D_SHIFT, |
1353 | .clkdm_name = "d2d_clkdm", | 1353 | .clkdm_name = "d2d_clkdm", |
1354 | .recalc = &followparent_recalc, | 1354 | .recalc = &followparent_recalc, |
1355 | }; | 1355 | }; |
1356 | 1356 | ||
1357 | static const struct clksel omap343x_gpt_clksel[] = { | 1357 | static const struct clksel omap343x_gpt_clksel[] = { |
1358 | { .parent = &omap_32k_fck, .rates = gpt_32k_rates }, | 1358 | { .parent = &omap_32k_fck, .rates = gpt_32k_rates }, |
1359 | { .parent = &sys_ck, .rates = gpt_sys_rates }, | 1359 | { .parent = &sys_ck, .rates = gpt_sys_rates }, |
1360 | { .parent = NULL} | 1360 | { .parent = NULL} |
1361 | }; | 1361 | }; |
1362 | 1362 | ||
1363 | static struct clk gpt10_fck = { | 1363 | static struct clk gpt10_fck = { |
1364 | .name = "gpt10_fck", | 1364 | .name = "gpt10_fck", |
1365 | .ops = &clkops_omap2_dflt_wait, | 1365 | .ops = &clkops_omap2_dflt_wait, |
1366 | .parent = &sys_ck, | 1366 | .parent = &sys_ck, |
1367 | .init = &omap2_init_clksel_parent, | 1367 | .init = &omap2_init_clksel_parent, |
1368 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), | 1368 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), |
1369 | .enable_bit = OMAP3430_EN_GPT10_SHIFT, | 1369 | .enable_bit = OMAP3430_EN_GPT10_SHIFT, |
1370 | .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL), | 1370 | .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL), |
1371 | .clksel_mask = OMAP3430_CLKSEL_GPT10_MASK, | 1371 | .clksel_mask = OMAP3430_CLKSEL_GPT10_MASK, |
1372 | .clksel = omap343x_gpt_clksel, | 1372 | .clksel = omap343x_gpt_clksel, |
1373 | .clkdm_name = "core_l4_clkdm", | 1373 | .clkdm_name = "core_l4_clkdm", |
1374 | .recalc = &omap2_clksel_recalc, | 1374 | .recalc = &omap2_clksel_recalc, |
1375 | }; | 1375 | }; |
1376 | 1376 | ||
1377 | static struct clk gpt11_fck = { | 1377 | static struct clk gpt11_fck = { |
1378 | .name = "gpt11_fck", | 1378 | .name = "gpt11_fck", |
1379 | .ops = &clkops_omap2_dflt_wait, | 1379 | .ops = &clkops_omap2_dflt_wait, |
1380 | .parent = &sys_ck, | 1380 | .parent = &sys_ck, |
1381 | .init = &omap2_init_clksel_parent, | 1381 | .init = &omap2_init_clksel_parent, |
1382 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), | 1382 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), |
1383 | .enable_bit = OMAP3430_EN_GPT11_SHIFT, | 1383 | .enable_bit = OMAP3430_EN_GPT11_SHIFT, |
1384 | .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL), | 1384 | .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL), |
1385 | .clksel_mask = OMAP3430_CLKSEL_GPT11_MASK, | 1385 | .clksel_mask = OMAP3430_CLKSEL_GPT11_MASK, |
1386 | .clksel = omap343x_gpt_clksel, | 1386 | .clksel = omap343x_gpt_clksel, |
1387 | .clkdm_name = "core_l4_clkdm", | 1387 | .clkdm_name = "core_l4_clkdm", |
1388 | .recalc = &omap2_clksel_recalc, | 1388 | .recalc = &omap2_clksel_recalc, |
1389 | }; | 1389 | }; |
1390 | 1390 | ||
1391 | static struct clk cpefuse_fck = { | 1391 | static struct clk cpefuse_fck = { |
1392 | .name = "cpefuse_fck", | 1392 | .name = "cpefuse_fck", |
1393 | .ops = &clkops_omap2_dflt, | 1393 | .ops = &clkops_omap2_dflt, |
1394 | .parent = &sys_ck, | 1394 | .parent = &sys_ck, |
1395 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP3430ES2_CM_FCLKEN3), | 1395 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP3430ES2_CM_FCLKEN3), |
1396 | .enable_bit = OMAP3430ES2_EN_CPEFUSE_SHIFT, | 1396 | .enable_bit = OMAP3430ES2_EN_CPEFUSE_SHIFT, |
1397 | .recalc = &followparent_recalc, | 1397 | .recalc = &followparent_recalc, |
1398 | }; | 1398 | }; |
1399 | 1399 | ||
1400 | static struct clk ts_fck = { | 1400 | static struct clk ts_fck = { |
1401 | .name = "ts_fck", | 1401 | .name = "ts_fck", |
1402 | .ops = &clkops_omap2_dflt, | 1402 | .ops = &clkops_omap2_dflt, |
1403 | .parent = &omap_32k_fck, | 1403 | .parent = &omap_32k_fck, |
1404 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP3430ES2_CM_FCLKEN3), | 1404 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP3430ES2_CM_FCLKEN3), |
1405 | .enable_bit = OMAP3430ES2_EN_TS_SHIFT, | 1405 | .enable_bit = OMAP3430ES2_EN_TS_SHIFT, |
1406 | .recalc = &followparent_recalc, | 1406 | .recalc = &followparent_recalc, |
1407 | }; | 1407 | }; |
1408 | 1408 | ||
1409 | static struct clk usbtll_fck = { | 1409 | static struct clk usbtll_fck = { |
1410 | .name = "usbtll_fck", | 1410 | .name = "usbtll_fck", |
1411 | .ops = &clkops_omap2_dflt, | 1411 | .ops = &clkops_omap2_dflt, |
1412 | .parent = &dpll5_m2_ck, | 1412 | .parent = &dpll5_m2_ck, |
1413 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP3430ES2_CM_FCLKEN3), | 1413 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP3430ES2_CM_FCLKEN3), |
1414 | .enable_bit = OMAP3430ES2_EN_USBTLL_SHIFT, | 1414 | .enable_bit = OMAP3430ES2_EN_USBTLL_SHIFT, |
1415 | .recalc = &followparent_recalc, | 1415 | .recalc = &followparent_recalc, |
1416 | }; | 1416 | }; |
1417 | 1417 | ||
1418 | /* CORE 96M FCLK-derived clocks */ | 1418 | /* CORE 96M FCLK-derived clocks */ |
1419 | 1419 | ||
1420 | static struct clk core_96m_fck = { | 1420 | static struct clk core_96m_fck = { |
1421 | .name = "core_96m_fck", | 1421 | .name = "core_96m_fck", |
1422 | .ops = &clkops_null, | 1422 | .ops = &clkops_null, |
1423 | .parent = &omap_96m_fck, | 1423 | .parent = &omap_96m_fck, |
1424 | .clkdm_name = "core_l4_clkdm", | 1424 | .clkdm_name = "core_l4_clkdm", |
1425 | .recalc = &followparent_recalc, | 1425 | .recalc = &followparent_recalc, |
1426 | }; | 1426 | }; |
1427 | 1427 | ||
1428 | static struct clk mmchs3_fck = { | 1428 | static struct clk mmchs3_fck = { |
1429 | .name = "mmchs3_fck", | 1429 | .name = "mmchs3_fck", |
1430 | .ops = &clkops_omap2_dflt_wait, | 1430 | .ops = &clkops_omap2_dflt_wait, |
1431 | .parent = &core_96m_fck, | 1431 | .parent = &core_96m_fck, |
1432 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), | 1432 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), |
1433 | .enable_bit = OMAP3430ES2_EN_MMC3_SHIFT, | 1433 | .enable_bit = OMAP3430ES2_EN_MMC3_SHIFT, |
1434 | .clkdm_name = "core_l4_clkdm", | 1434 | .clkdm_name = "core_l4_clkdm", |
1435 | .recalc = &followparent_recalc, | 1435 | .recalc = &followparent_recalc, |
1436 | }; | 1436 | }; |
1437 | 1437 | ||
1438 | static struct clk mmchs2_fck = { | 1438 | static struct clk mmchs2_fck = { |
1439 | .name = "mmchs2_fck", | 1439 | .name = "mmchs2_fck", |
1440 | .ops = &clkops_omap2_dflt_wait, | 1440 | .ops = &clkops_omap2_dflt_wait, |
1441 | .parent = &core_96m_fck, | 1441 | .parent = &core_96m_fck, |
1442 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), | 1442 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), |
1443 | .enable_bit = OMAP3430_EN_MMC2_SHIFT, | 1443 | .enable_bit = OMAP3430_EN_MMC2_SHIFT, |
1444 | .clkdm_name = "core_l4_clkdm", | 1444 | .clkdm_name = "core_l4_clkdm", |
1445 | .recalc = &followparent_recalc, | 1445 | .recalc = &followparent_recalc, |
1446 | }; | 1446 | }; |
1447 | 1447 | ||
1448 | static struct clk mspro_fck = { | 1448 | static struct clk mspro_fck = { |
1449 | .name = "mspro_fck", | 1449 | .name = "mspro_fck", |
1450 | .ops = &clkops_omap2_dflt_wait, | 1450 | .ops = &clkops_omap2_dflt_wait, |
1451 | .parent = &core_96m_fck, | 1451 | .parent = &core_96m_fck, |
1452 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), | 1452 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), |
1453 | .enable_bit = OMAP3430_EN_MSPRO_SHIFT, | 1453 | .enable_bit = OMAP3430_EN_MSPRO_SHIFT, |
1454 | .clkdm_name = "core_l4_clkdm", | 1454 | .clkdm_name = "core_l4_clkdm", |
1455 | .recalc = &followparent_recalc, | 1455 | .recalc = &followparent_recalc, |
1456 | }; | 1456 | }; |
1457 | 1457 | ||
1458 | static struct clk mmchs1_fck = { | 1458 | static struct clk mmchs1_fck = { |
1459 | .name = "mmchs1_fck", | 1459 | .name = "mmchs1_fck", |
1460 | .ops = &clkops_omap2_dflt_wait, | 1460 | .ops = &clkops_omap2_dflt_wait, |
1461 | .parent = &core_96m_fck, | 1461 | .parent = &core_96m_fck, |
1462 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), | 1462 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), |
1463 | .enable_bit = OMAP3430_EN_MMC1_SHIFT, | 1463 | .enable_bit = OMAP3430_EN_MMC1_SHIFT, |
1464 | .clkdm_name = "core_l4_clkdm", | 1464 | .clkdm_name = "core_l4_clkdm", |
1465 | .recalc = &followparent_recalc, | 1465 | .recalc = &followparent_recalc, |
1466 | }; | 1466 | }; |
1467 | 1467 | ||
1468 | static struct clk i2c3_fck = { | 1468 | static struct clk i2c3_fck = { |
1469 | .name = "i2c3_fck", | 1469 | .name = "i2c3_fck", |
1470 | .ops = &clkops_omap2_dflt_wait, | 1470 | .ops = &clkops_omap2_dflt_wait, |
1471 | .parent = &core_96m_fck, | 1471 | .parent = &core_96m_fck, |
1472 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), | 1472 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), |
1473 | .enable_bit = OMAP3430_EN_I2C3_SHIFT, | 1473 | .enable_bit = OMAP3430_EN_I2C3_SHIFT, |
1474 | .clkdm_name = "core_l4_clkdm", | 1474 | .clkdm_name = "core_l4_clkdm", |
1475 | .recalc = &followparent_recalc, | 1475 | .recalc = &followparent_recalc, |
1476 | }; | 1476 | }; |
1477 | 1477 | ||
1478 | static struct clk i2c2_fck = { | 1478 | static struct clk i2c2_fck = { |
1479 | .name = "i2c2_fck", | 1479 | .name = "i2c2_fck", |
1480 | .ops = &clkops_omap2_dflt_wait, | 1480 | .ops = &clkops_omap2_dflt_wait, |
1481 | .parent = &core_96m_fck, | 1481 | .parent = &core_96m_fck, |
1482 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), | 1482 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), |
1483 | .enable_bit = OMAP3430_EN_I2C2_SHIFT, | 1483 | .enable_bit = OMAP3430_EN_I2C2_SHIFT, |
1484 | .clkdm_name = "core_l4_clkdm", | 1484 | .clkdm_name = "core_l4_clkdm", |
1485 | .recalc = &followparent_recalc, | 1485 | .recalc = &followparent_recalc, |
1486 | }; | 1486 | }; |
1487 | 1487 | ||
1488 | static struct clk i2c1_fck = { | 1488 | static struct clk i2c1_fck = { |
1489 | .name = "i2c1_fck", | 1489 | .name = "i2c1_fck", |
1490 | .ops = &clkops_omap2_dflt_wait, | 1490 | .ops = &clkops_omap2_dflt_wait, |
1491 | .parent = &core_96m_fck, | 1491 | .parent = &core_96m_fck, |
1492 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), | 1492 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), |
1493 | .enable_bit = OMAP3430_EN_I2C1_SHIFT, | 1493 | .enable_bit = OMAP3430_EN_I2C1_SHIFT, |
1494 | .clkdm_name = "core_l4_clkdm", | 1494 | .clkdm_name = "core_l4_clkdm", |
1495 | .recalc = &followparent_recalc, | 1495 | .recalc = &followparent_recalc, |
1496 | }; | 1496 | }; |
1497 | 1497 | ||
1498 | /* | 1498 | /* |
1499 | * MCBSP 1 & 5 get their 96MHz clock from core_96m_fck; | 1499 | * MCBSP 1 & 5 get their 96MHz clock from core_96m_fck; |
1500 | * MCBSP 2, 3, 4 get their 96MHz clock from per_96m_fck. | 1500 | * MCBSP 2, 3, 4 get their 96MHz clock from per_96m_fck. |
1501 | */ | 1501 | */ |
1502 | static const struct clksel_rate common_mcbsp_96m_rates[] = { | 1502 | static const struct clksel_rate common_mcbsp_96m_rates[] = { |
1503 | { .div = 1, .val = 0, .flags = RATE_IN_3XXX }, | 1503 | { .div = 1, .val = 0, .flags = RATE_IN_3XXX }, |
1504 | { .div = 0 } | 1504 | { .div = 0 } |
1505 | }; | 1505 | }; |
1506 | 1506 | ||
1507 | static const struct clksel_rate common_mcbsp_mcbsp_rates[] = { | 1507 | static const struct clksel_rate common_mcbsp_mcbsp_rates[] = { |
1508 | { .div = 1, .val = 1, .flags = RATE_IN_3XXX }, | 1508 | { .div = 1, .val = 1, .flags = RATE_IN_3XXX }, |
1509 | { .div = 0 } | 1509 | { .div = 0 } |
1510 | }; | 1510 | }; |
1511 | 1511 | ||
1512 | static const struct clksel mcbsp_15_clksel[] = { | 1512 | static const struct clksel mcbsp_15_clksel[] = { |
1513 | { .parent = &core_96m_fck, .rates = common_mcbsp_96m_rates }, | 1513 | { .parent = &core_96m_fck, .rates = common_mcbsp_96m_rates }, |
1514 | { .parent = &mcbsp_clks, .rates = common_mcbsp_mcbsp_rates }, | 1514 | { .parent = &mcbsp_clks, .rates = common_mcbsp_mcbsp_rates }, |
1515 | { .parent = NULL } | 1515 | { .parent = NULL } |
1516 | }; | 1516 | }; |
1517 | 1517 | ||
1518 | static struct clk mcbsp5_fck = { | 1518 | static struct clk mcbsp5_fck = { |
1519 | .name = "mcbsp5_fck", | 1519 | .name = "mcbsp5_fck", |
1520 | .ops = &clkops_omap2_dflt_wait, | 1520 | .ops = &clkops_omap2_dflt_wait, |
1521 | .init = &omap2_init_clksel_parent, | 1521 | .init = &omap2_init_clksel_parent, |
1522 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), | 1522 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), |
1523 | .enable_bit = OMAP3430_EN_MCBSP5_SHIFT, | 1523 | .enable_bit = OMAP3430_EN_MCBSP5_SHIFT, |
1524 | .clksel_reg = OMAP343X_CTRL_REGADDR(OMAP343X_CONTROL_DEVCONF1), | 1524 | .clksel_reg = OMAP343X_CTRL_REGADDR(OMAP343X_CONTROL_DEVCONF1), |
1525 | .clksel_mask = OMAP2_MCBSP5_CLKS_MASK, | 1525 | .clksel_mask = OMAP2_MCBSP5_CLKS_MASK, |
1526 | .clksel = mcbsp_15_clksel, | 1526 | .clksel = mcbsp_15_clksel, |
1527 | .clkdm_name = "core_l4_clkdm", | 1527 | .clkdm_name = "core_l4_clkdm", |
1528 | .recalc = &omap2_clksel_recalc, | 1528 | .recalc = &omap2_clksel_recalc, |
1529 | }; | 1529 | }; |
1530 | 1530 | ||
1531 | static struct clk mcbsp1_fck = { | 1531 | static struct clk mcbsp1_fck = { |
1532 | .name = "mcbsp1_fck", | 1532 | .name = "mcbsp1_fck", |
1533 | .ops = &clkops_omap2_dflt_wait, | 1533 | .ops = &clkops_omap2_dflt_wait, |
1534 | .init = &omap2_init_clksel_parent, | 1534 | .init = &omap2_init_clksel_parent, |
1535 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), | 1535 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), |
1536 | .enable_bit = OMAP3430_EN_MCBSP1_SHIFT, | 1536 | .enable_bit = OMAP3430_EN_MCBSP1_SHIFT, |
1537 | .clksel_reg = OMAP343X_CTRL_REGADDR(OMAP2_CONTROL_DEVCONF0), | 1537 | .clksel_reg = OMAP343X_CTRL_REGADDR(OMAP2_CONTROL_DEVCONF0), |
1538 | .clksel_mask = OMAP2_MCBSP1_CLKS_MASK, | 1538 | .clksel_mask = OMAP2_MCBSP1_CLKS_MASK, |
1539 | .clksel = mcbsp_15_clksel, | 1539 | .clksel = mcbsp_15_clksel, |
1540 | .clkdm_name = "core_l4_clkdm", | 1540 | .clkdm_name = "core_l4_clkdm", |
1541 | .recalc = &omap2_clksel_recalc, | 1541 | .recalc = &omap2_clksel_recalc, |
1542 | }; | 1542 | }; |
1543 | 1543 | ||
1544 | /* CORE_48M_FCK-derived clocks */ | 1544 | /* CORE_48M_FCK-derived clocks */ |
1545 | 1545 | ||
1546 | static struct clk core_48m_fck = { | 1546 | static struct clk core_48m_fck = { |
1547 | .name = "core_48m_fck", | 1547 | .name = "core_48m_fck", |
1548 | .ops = &clkops_null, | 1548 | .ops = &clkops_null, |
1549 | .parent = &omap_48m_fck, | 1549 | .parent = &omap_48m_fck, |
1550 | .clkdm_name = "core_l4_clkdm", | 1550 | .clkdm_name = "core_l4_clkdm", |
1551 | .recalc = &followparent_recalc, | 1551 | .recalc = &followparent_recalc, |
1552 | }; | 1552 | }; |
1553 | 1553 | ||
1554 | static struct clk mcspi4_fck = { | 1554 | static struct clk mcspi4_fck = { |
1555 | .name = "mcspi4_fck", | 1555 | .name = "mcspi4_fck", |
1556 | .ops = &clkops_omap2_dflt_wait, | 1556 | .ops = &clkops_omap2_dflt_wait, |
1557 | .parent = &core_48m_fck, | 1557 | .parent = &core_48m_fck, |
1558 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), | 1558 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), |
1559 | .enable_bit = OMAP3430_EN_MCSPI4_SHIFT, | 1559 | .enable_bit = OMAP3430_EN_MCSPI4_SHIFT, |
1560 | .recalc = &followparent_recalc, | 1560 | .recalc = &followparent_recalc, |
1561 | }; | 1561 | }; |
1562 | 1562 | ||
1563 | static struct clk mcspi3_fck = { | 1563 | static struct clk mcspi3_fck = { |
1564 | .name = "mcspi3_fck", | 1564 | .name = "mcspi3_fck", |
1565 | .ops = &clkops_omap2_dflt_wait, | 1565 | .ops = &clkops_omap2_dflt_wait, |
1566 | .parent = &core_48m_fck, | 1566 | .parent = &core_48m_fck, |
1567 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), | 1567 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), |
1568 | .enable_bit = OMAP3430_EN_MCSPI3_SHIFT, | 1568 | .enable_bit = OMAP3430_EN_MCSPI3_SHIFT, |
1569 | .recalc = &followparent_recalc, | 1569 | .recalc = &followparent_recalc, |
1570 | }; | 1570 | }; |
1571 | 1571 | ||
1572 | static struct clk mcspi2_fck = { | 1572 | static struct clk mcspi2_fck = { |
1573 | .name = "mcspi2_fck", | 1573 | .name = "mcspi2_fck", |
1574 | .ops = &clkops_omap2_dflt_wait, | 1574 | .ops = &clkops_omap2_dflt_wait, |
1575 | .parent = &core_48m_fck, | 1575 | .parent = &core_48m_fck, |
1576 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), | 1576 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), |
1577 | .enable_bit = OMAP3430_EN_MCSPI2_SHIFT, | 1577 | .enable_bit = OMAP3430_EN_MCSPI2_SHIFT, |
1578 | .recalc = &followparent_recalc, | 1578 | .recalc = &followparent_recalc, |
1579 | }; | 1579 | }; |
1580 | 1580 | ||
1581 | static struct clk mcspi1_fck = { | 1581 | static struct clk mcspi1_fck = { |
1582 | .name = "mcspi1_fck", | 1582 | .name = "mcspi1_fck", |
1583 | .ops = &clkops_omap2_dflt_wait, | 1583 | .ops = &clkops_omap2_dflt_wait, |
1584 | .parent = &core_48m_fck, | 1584 | .parent = &core_48m_fck, |
1585 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), | 1585 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), |
1586 | .enable_bit = OMAP3430_EN_MCSPI1_SHIFT, | 1586 | .enable_bit = OMAP3430_EN_MCSPI1_SHIFT, |
1587 | .recalc = &followparent_recalc, | 1587 | .recalc = &followparent_recalc, |
1588 | }; | 1588 | }; |
1589 | 1589 | ||
1590 | static struct clk uart2_fck = { | 1590 | static struct clk uart2_fck = { |
1591 | .name = "uart2_fck", | 1591 | .name = "uart2_fck", |
1592 | .ops = &clkops_omap2_dflt_wait, | 1592 | .ops = &clkops_omap2_dflt_wait, |
1593 | .parent = &core_48m_fck, | 1593 | .parent = &core_48m_fck, |
1594 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), | 1594 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), |
1595 | .enable_bit = OMAP3430_EN_UART2_SHIFT, | 1595 | .enable_bit = OMAP3430_EN_UART2_SHIFT, |
1596 | .clkdm_name = "core_l4_clkdm", | 1596 | .clkdm_name = "core_l4_clkdm", |
1597 | .recalc = &followparent_recalc, | 1597 | .recalc = &followparent_recalc, |
1598 | }; | 1598 | }; |
1599 | 1599 | ||
1600 | static struct clk uart1_fck = { | 1600 | static struct clk uart1_fck = { |
1601 | .name = "uart1_fck", | 1601 | .name = "uart1_fck", |
1602 | .ops = &clkops_omap2_dflt_wait, | 1602 | .ops = &clkops_omap2_dflt_wait, |
1603 | .parent = &core_48m_fck, | 1603 | .parent = &core_48m_fck, |
1604 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), | 1604 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), |
1605 | .enable_bit = OMAP3430_EN_UART1_SHIFT, | 1605 | .enable_bit = OMAP3430_EN_UART1_SHIFT, |
1606 | .clkdm_name = "core_l4_clkdm", | 1606 | .clkdm_name = "core_l4_clkdm", |
1607 | .recalc = &followparent_recalc, | 1607 | .recalc = &followparent_recalc, |
1608 | }; | 1608 | }; |
1609 | 1609 | ||
1610 | static struct clk fshostusb_fck = { | 1610 | static struct clk fshostusb_fck = { |
1611 | .name = "fshostusb_fck", | 1611 | .name = "fshostusb_fck", |
1612 | .ops = &clkops_omap2_dflt_wait, | 1612 | .ops = &clkops_omap2_dflt_wait, |
1613 | .parent = &core_48m_fck, | 1613 | .parent = &core_48m_fck, |
1614 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), | 1614 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), |
1615 | .enable_bit = OMAP3430ES1_EN_FSHOSTUSB_SHIFT, | 1615 | .enable_bit = OMAP3430ES1_EN_FSHOSTUSB_SHIFT, |
1616 | .recalc = &followparent_recalc, | 1616 | .recalc = &followparent_recalc, |
1617 | }; | 1617 | }; |
1618 | 1618 | ||
1619 | /* CORE_12M_FCK based clocks */ | 1619 | /* CORE_12M_FCK based clocks */ |
1620 | 1620 | ||
1621 | static struct clk core_12m_fck = { | 1621 | static struct clk core_12m_fck = { |
1622 | .name = "core_12m_fck", | 1622 | .name = "core_12m_fck", |
1623 | .ops = &clkops_null, | 1623 | .ops = &clkops_null, |
1624 | .parent = &omap_12m_fck, | 1624 | .parent = &omap_12m_fck, |
1625 | .clkdm_name = "core_l4_clkdm", | 1625 | .clkdm_name = "core_l4_clkdm", |
1626 | .recalc = &followparent_recalc, | 1626 | .recalc = &followparent_recalc, |
1627 | }; | 1627 | }; |
1628 | 1628 | ||
1629 | static struct clk hdq_fck = { | 1629 | static struct clk hdq_fck = { |
1630 | .name = "hdq_fck", | 1630 | .name = "hdq_fck", |
1631 | .ops = &clkops_omap2_dflt_wait, | 1631 | .ops = &clkops_omap2_dflt_wait, |
1632 | .parent = &core_12m_fck, | 1632 | .parent = &core_12m_fck, |
1633 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), | 1633 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), |
1634 | .enable_bit = OMAP3430_EN_HDQ_SHIFT, | 1634 | .enable_bit = OMAP3430_EN_HDQ_SHIFT, |
1635 | .recalc = &followparent_recalc, | 1635 | .recalc = &followparent_recalc, |
1636 | }; | 1636 | }; |
1637 | 1637 | ||
1638 | /* DPLL3-derived clock */ | 1638 | /* DPLL3-derived clock */ |
1639 | 1639 | ||
1640 | static const struct clksel_rate ssi_ssr_corex2_rates[] = { | 1640 | static const struct clksel_rate ssi_ssr_corex2_rates[] = { |
1641 | { .div = 1, .val = 1, .flags = RATE_IN_3XXX }, | 1641 | { .div = 1, .val = 1, .flags = RATE_IN_3XXX }, |
1642 | { .div = 2, .val = 2, .flags = RATE_IN_3XXX }, | 1642 | { .div = 2, .val = 2, .flags = RATE_IN_3XXX }, |
1643 | { .div = 3, .val = 3, .flags = RATE_IN_3XXX }, | 1643 | { .div = 3, .val = 3, .flags = RATE_IN_3XXX }, |
1644 | { .div = 4, .val = 4, .flags = RATE_IN_3XXX }, | 1644 | { .div = 4, .val = 4, .flags = RATE_IN_3XXX }, |
1645 | { .div = 6, .val = 6, .flags = RATE_IN_3XXX }, | 1645 | { .div = 6, .val = 6, .flags = RATE_IN_3XXX }, |
1646 | { .div = 8, .val = 8, .flags = RATE_IN_3XXX }, | 1646 | { .div = 8, .val = 8, .flags = RATE_IN_3XXX }, |
1647 | { .div = 0 } | 1647 | { .div = 0 } |
1648 | }; | 1648 | }; |
1649 | 1649 | ||
1650 | static const struct clksel ssi_ssr_clksel[] = { | 1650 | static const struct clksel ssi_ssr_clksel[] = { |
1651 | { .parent = &corex2_fck, .rates = ssi_ssr_corex2_rates }, | 1651 | { .parent = &corex2_fck, .rates = ssi_ssr_corex2_rates }, |
1652 | { .parent = NULL } | 1652 | { .parent = NULL } |
1653 | }; | 1653 | }; |
1654 | 1654 | ||
1655 | static struct clk ssi_ssr_fck_3430es1 = { | 1655 | static struct clk ssi_ssr_fck_3430es1 = { |
1656 | .name = "ssi_ssr_fck", | 1656 | .name = "ssi_ssr_fck", |
1657 | .ops = &clkops_omap2_dflt, | 1657 | .ops = &clkops_omap2_dflt, |
1658 | .init = &omap2_init_clksel_parent, | 1658 | .init = &omap2_init_clksel_parent, |
1659 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), | 1659 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), |
1660 | .enable_bit = OMAP3430_EN_SSI_SHIFT, | 1660 | .enable_bit = OMAP3430_EN_SSI_SHIFT, |
1661 | .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL), | 1661 | .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL), |
1662 | .clksel_mask = OMAP3430_CLKSEL_SSI_MASK, | 1662 | .clksel_mask = OMAP3430_CLKSEL_SSI_MASK, |
1663 | .clksel = ssi_ssr_clksel, | 1663 | .clksel = ssi_ssr_clksel, |
1664 | .clkdm_name = "core_l4_clkdm", | 1664 | .clkdm_name = "core_l4_clkdm", |
1665 | .recalc = &omap2_clksel_recalc, | 1665 | .recalc = &omap2_clksel_recalc, |
1666 | }; | 1666 | }; |
1667 | 1667 | ||
1668 | static struct clk ssi_ssr_fck_3430es2 = { | 1668 | static struct clk ssi_ssr_fck_3430es2 = { |
1669 | .name = "ssi_ssr_fck", | 1669 | .name = "ssi_ssr_fck", |
1670 | .ops = &clkops_omap3430es2_ssi_wait, | 1670 | .ops = &clkops_omap3430es2_ssi_wait, |
1671 | .init = &omap2_init_clksel_parent, | 1671 | .init = &omap2_init_clksel_parent, |
1672 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), | 1672 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), |
1673 | .enable_bit = OMAP3430_EN_SSI_SHIFT, | 1673 | .enable_bit = OMAP3430_EN_SSI_SHIFT, |
1674 | .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL), | 1674 | .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL), |
1675 | .clksel_mask = OMAP3430_CLKSEL_SSI_MASK, | 1675 | .clksel_mask = OMAP3430_CLKSEL_SSI_MASK, |
1676 | .clksel = ssi_ssr_clksel, | 1676 | .clksel = ssi_ssr_clksel, |
1677 | .clkdm_name = "core_l4_clkdm", | 1677 | .clkdm_name = "core_l4_clkdm", |
1678 | .recalc = &omap2_clksel_recalc, | 1678 | .recalc = &omap2_clksel_recalc, |
1679 | }; | 1679 | }; |
1680 | 1680 | ||
1681 | static struct clk ssi_sst_fck_3430es1 = { | 1681 | static struct clk ssi_sst_fck_3430es1 = { |
1682 | .name = "ssi_sst_fck", | 1682 | .name = "ssi_sst_fck", |
1683 | .ops = &clkops_null, | 1683 | .ops = &clkops_null, |
1684 | .parent = &ssi_ssr_fck_3430es1, | 1684 | .parent = &ssi_ssr_fck_3430es1, |
1685 | .fixed_div = 2, | 1685 | .fixed_div = 2, |
1686 | .recalc = &omap_fixed_divisor_recalc, | 1686 | .recalc = &omap_fixed_divisor_recalc, |
1687 | }; | 1687 | }; |
1688 | 1688 | ||
1689 | static struct clk ssi_sst_fck_3430es2 = { | 1689 | static struct clk ssi_sst_fck_3430es2 = { |
1690 | .name = "ssi_sst_fck", | 1690 | .name = "ssi_sst_fck", |
1691 | .ops = &clkops_null, | 1691 | .ops = &clkops_null, |
1692 | .parent = &ssi_ssr_fck_3430es2, | 1692 | .parent = &ssi_ssr_fck_3430es2, |
1693 | .fixed_div = 2, | 1693 | .fixed_div = 2, |
1694 | .recalc = &omap_fixed_divisor_recalc, | 1694 | .recalc = &omap_fixed_divisor_recalc, |
1695 | }; | 1695 | }; |
1696 | 1696 | ||
1697 | 1697 | ||
1698 | 1698 | ||
1699 | /* CORE_L3_ICK based clocks */ | 1699 | /* CORE_L3_ICK based clocks */ |
1700 | 1700 | ||
1701 | /* | 1701 | /* |
1702 | * XXX must add clk_enable/clk_disable for these if standard code won't | 1702 | * XXX must add clk_enable/clk_disable for these if standard code won't |
1703 | * handle it | 1703 | * handle it |
1704 | */ | 1704 | */ |
1705 | static struct clk core_l3_ick = { | 1705 | static struct clk core_l3_ick = { |
1706 | .name = "core_l3_ick", | 1706 | .name = "core_l3_ick", |
1707 | .ops = &clkops_null, | 1707 | .ops = &clkops_null, |
1708 | .parent = &l3_ick, | 1708 | .parent = &l3_ick, |
1709 | .clkdm_name = "core_l3_clkdm", | 1709 | .clkdm_name = "core_l3_clkdm", |
1710 | .recalc = &followparent_recalc, | 1710 | .recalc = &followparent_recalc, |
1711 | }; | 1711 | }; |
1712 | 1712 | ||
1713 | static struct clk hsotgusb_ick_3430es1 = { | 1713 | static struct clk hsotgusb_ick_3430es1 = { |
1714 | .name = "hsotgusb_ick", | 1714 | .name = "hsotgusb_ick", |
1715 | .ops = &clkops_omap2_dflt, | 1715 | .ops = &clkops_omap2_dflt, |
1716 | .parent = &core_l3_ick, | 1716 | .parent = &core_l3_ick, |
1717 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1717 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
1718 | .enable_bit = OMAP3430_EN_HSOTGUSB_SHIFT, | 1718 | .enable_bit = OMAP3430_EN_HSOTGUSB_SHIFT, |
1719 | .clkdm_name = "core_l3_clkdm", | 1719 | .clkdm_name = "core_l3_clkdm", |
1720 | .recalc = &followparent_recalc, | 1720 | .recalc = &followparent_recalc, |
1721 | }; | 1721 | }; |
1722 | 1722 | ||
1723 | static struct clk hsotgusb_ick_3430es2 = { | 1723 | static struct clk hsotgusb_ick_3430es2 = { |
1724 | .name = "hsotgusb_ick", | 1724 | .name = "hsotgusb_ick", |
1725 | .ops = &clkops_omap3430es2_hsotgusb_wait, | 1725 | .ops = &clkops_omap3430es2_hsotgusb_wait, |
1726 | .parent = &core_l3_ick, | 1726 | .parent = &core_l3_ick, |
1727 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1727 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
1728 | .enable_bit = OMAP3430_EN_HSOTGUSB_SHIFT, | 1728 | .enable_bit = OMAP3430_EN_HSOTGUSB_SHIFT, |
1729 | .clkdm_name = "core_l3_clkdm", | 1729 | .clkdm_name = "core_l3_clkdm", |
1730 | .recalc = &followparent_recalc, | 1730 | .recalc = &followparent_recalc, |
1731 | }; | 1731 | }; |
1732 | 1732 | ||
1733 | static struct clk sdrc_ick = { | 1733 | static struct clk sdrc_ick = { |
1734 | .name = "sdrc_ick", | 1734 | .name = "sdrc_ick", |
1735 | .ops = &clkops_omap2_dflt_wait, | 1735 | .ops = &clkops_omap2_dflt_wait, |
1736 | .parent = &core_l3_ick, | 1736 | .parent = &core_l3_ick, |
1737 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1737 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
1738 | .enable_bit = OMAP3430_EN_SDRC_SHIFT, | 1738 | .enable_bit = OMAP3430_EN_SDRC_SHIFT, |
1739 | .flags = ENABLE_ON_INIT, | 1739 | .flags = ENABLE_ON_INIT, |
1740 | .clkdm_name = "core_l3_clkdm", | 1740 | .clkdm_name = "core_l3_clkdm", |
1741 | .recalc = &followparent_recalc, | 1741 | .recalc = &followparent_recalc, |
1742 | }; | 1742 | }; |
1743 | 1743 | ||
1744 | static struct clk gpmc_fck = { | 1744 | static struct clk gpmc_fck = { |
1745 | .name = "gpmc_fck", | 1745 | .name = "gpmc_fck", |
1746 | .ops = &clkops_null, | 1746 | .ops = &clkops_null, |
1747 | .parent = &core_l3_ick, | 1747 | .parent = &core_l3_ick, |
1748 | .flags = ENABLE_ON_INIT, /* huh? */ | 1748 | .flags = ENABLE_ON_INIT, /* huh? */ |
1749 | .clkdm_name = "core_l3_clkdm", | 1749 | .clkdm_name = "core_l3_clkdm", |
1750 | .recalc = &followparent_recalc, | 1750 | .recalc = &followparent_recalc, |
1751 | }; | 1751 | }; |
1752 | 1752 | ||
1753 | /* SECURITY_L3_ICK based clocks */ | 1753 | /* SECURITY_L3_ICK based clocks */ |
1754 | 1754 | ||
1755 | static struct clk security_l3_ick = { | 1755 | static struct clk security_l3_ick = { |
1756 | .name = "security_l3_ick", | 1756 | .name = "security_l3_ick", |
1757 | .ops = &clkops_null, | 1757 | .ops = &clkops_null, |
1758 | .parent = &l3_ick, | 1758 | .parent = &l3_ick, |
1759 | .recalc = &followparent_recalc, | 1759 | .recalc = &followparent_recalc, |
1760 | }; | 1760 | }; |
1761 | 1761 | ||
1762 | static struct clk pka_ick = { | 1762 | static struct clk pka_ick = { |
1763 | .name = "pka_ick", | 1763 | .name = "pka_ick", |
1764 | .ops = &clkops_omap2_dflt_wait, | 1764 | .ops = &clkops_omap2_dflt_wait, |
1765 | .parent = &security_l3_ick, | 1765 | .parent = &security_l3_ick, |
1766 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), | 1766 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), |
1767 | .enable_bit = OMAP3430_EN_PKA_SHIFT, | 1767 | .enable_bit = OMAP3430_EN_PKA_SHIFT, |
1768 | .recalc = &followparent_recalc, | 1768 | .recalc = &followparent_recalc, |
1769 | }; | 1769 | }; |
1770 | 1770 | ||
1771 | /* CORE_L4_ICK based clocks */ | 1771 | /* CORE_L4_ICK based clocks */ |
1772 | 1772 | ||
1773 | static struct clk core_l4_ick = { | 1773 | static struct clk core_l4_ick = { |
1774 | .name = "core_l4_ick", | 1774 | .name = "core_l4_ick", |
1775 | .ops = &clkops_null, | 1775 | .ops = &clkops_null, |
1776 | .parent = &l4_ick, | 1776 | .parent = &l4_ick, |
1777 | .clkdm_name = "core_l4_clkdm", | 1777 | .clkdm_name = "core_l4_clkdm", |
1778 | .recalc = &followparent_recalc, | 1778 | .recalc = &followparent_recalc, |
1779 | }; | 1779 | }; |
1780 | 1780 | ||
1781 | static struct clk usbtll_ick = { | 1781 | static struct clk usbtll_ick = { |
1782 | .name = "usbtll_ick", | 1782 | .name = "usbtll_ick", |
1783 | .ops = &clkops_omap2_dflt_wait, | 1783 | .ops = &clkops_omap2_dflt_wait, |
1784 | .parent = &core_l4_ick, | 1784 | .parent = &core_l4_ick, |
1785 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3), | 1785 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3), |
1786 | .enable_bit = OMAP3430ES2_EN_USBTLL_SHIFT, | 1786 | .enable_bit = OMAP3430ES2_EN_USBTLL_SHIFT, |
1787 | .clkdm_name = "core_l4_clkdm", | 1787 | .clkdm_name = "core_l4_clkdm", |
1788 | .recalc = &followparent_recalc, | 1788 | .recalc = &followparent_recalc, |
1789 | }; | 1789 | }; |
1790 | 1790 | ||
1791 | static struct clk mmchs3_ick = { | 1791 | static struct clk mmchs3_ick = { |
1792 | .name = "mmchs3_ick", | 1792 | .name = "mmchs3_ick", |
1793 | .ops = &clkops_omap2_dflt_wait, | 1793 | .ops = &clkops_omap2_dflt_wait, |
1794 | .parent = &core_l4_ick, | 1794 | .parent = &core_l4_ick, |
1795 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1795 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
1796 | .enable_bit = OMAP3430ES2_EN_MMC3_SHIFT, | 1796 | .enable_bit = OMAP3430ES2_EN_MMC3_SHIFT, |
1797 | .clkdm_name = "core_l4_clkdm", | 1797 | .clkdm_name = "core_l4_clkdm", |
1798 | .recalc = &followparent_recalc, | 1798 | .recalc = &followparent_recalc, |
1799 | }; | 1799 | }; |
1800 | 1800 | ||
1801 | /* Intersystem Communication Registers - chassis mode only */ | 1801 | /* Intersystem Communication Registers - chassis mode only */ |
1802 | static struct clk icr_ick = { | 1802 | static struct clk icr_ick = { |
1803 | .name = "icr_ick", | 1803 | .name = "icr_ick", |
1804 | .ops = &clkops_omap2_dflt_wait, | 1804 | .ops = &clkops_omap2_dflt_wait, |
1805 | .parent = &core_l4_ick, | 1805 | .parent = &core_l4_ick, |
1806 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1806 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
1807 | .enable_bit = OMAP3430_EN_ICR_SHIFT, | 1807 | .enable_bit = OMAP3430_EN_ICR_SHIFT, |
1808 | .clkdm_name = "core_l4_clkdm", | 1808 | .clkdm_name = "core_l4_clkdm", |
1809 | .recalc = &followparent_recalc, | 1809 | .recalc = &followparent_recalc, |
1810 | }; | 1810 | }; |
1811 | 1811 | ||
1812 | static struct clk aes2_ick = { | 1812 | static struct clk aes2_ick = { |
1813 | .name = "aes2_ick", | 1813 | .name = "aes2_ick", |
1814 | .ops = &clkops_omap2_dflt_wait, | 1814 | .ops = &clkops_omap2_dflt_wait, |
1815 | .parent = &core_l4_ick, | 1815 | .parent = &core_l4_ick, |
1816 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1816 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
1817 | .enable_bit = OMAP3430_EN_AES2_SHIFT, | 1817 | .enable_bit = OMAP3430_EN_AES2_SHIFT, |
1818 | .clkdm_name = "core_l4_clkdm", | 1818 | .clkdm_name = "core_l4_clkdm", |
1819 | .recalc = &followparent_recalc, | 1819 | .recalc = &followparent_recalc, |
1820 | }; | 1820 | }; |
1821 | 1821 | ||
1822 | static struct clk sha12_ick = { | 1822 | static struct clk sha12_ick = { |
1823 | .name = "sha12_ick", | 1823 | .name = "sha12_ick", |
1824 | .ops = &clkops_omap2_dflt_wait, | 1824 | .ops = &clkops_omap2_dflt_wait, |
1825 | .parent = &core_l4_ick, | 1825 | .parent = &core_l4_ick, |
1826 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1826 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
1827 | .enable_bit = OMAP3430_EN_SHA12_SHIFT, | 1827 | .enable_bit = OMAP3430_EN_SHA12_SHIFT, |
1828 | .clkdm_name = "core_l4_clkdm", | 1828 | .clkdm_name = "core_l4_clkdm", |
1829 | .recalc = &followparent_recalc, | 1829 | .recalc = &followparent_recalc, |
1830 | }; | 1830 | }; |
1831 | 1831 | ||
1832 | static struct clk des2_ick = { | 1832 | static struct clk des2_ick = { |
1833 | .name = "des2_ick", | 1833 | .name = "des2_ick", |
1834 | .ops = &clkops_omap2_dflt_wait, | 1834 | .ops = &clkops_omap2_dflt_wait, |
1835 | .parent = &core_l4_ick, | 1835 | .parent = &core_l4_ick, |
1836 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1836 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
1837 | .enable_bit = OMAP3430_EN_DES2_SHIFT, | 1837 | .enable_bit = OMAP3430_EN_DES2_SHIFT, |
1838 | .clkdm_name = "core_l4_clkdm", | 1838 | .clkdm_name = "core_l4_clkdm", |
1839 | .recalc = &followparent_recalc, | 1839 | .recalc = &followparent_recalc, |
1840 | }; | 1840 | }; |
1841 | 1841 | ||
1842 | static struct clk mmchs2_ick = { | 1842 | static struct clk mmchs2_ick = { |
1843 | .name = "mmchs2_ick", | 1843 | .name = "mmchs2_ick", |
1844 | .ops = &clkops_omap2_dflt_wait, | 1844 | .ops = &clkops_omap2_dflt_wait, |
1845 | .parent = &core_l4_ick, | 1845 | .parent = &core_l4_ick, |
1846 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1846 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
1847 | .enable_bit = OMAP3430_EN_MMC2_SHIFT, | 1847 | .enable_bit = OMAP3430_EN_MMC2_SHIFT, |
1848 | .clkdm_name = "core_l4_clkdm", | 1848 | .clkdm_name = "core_l4_clkdm", |
1849 | .recalc = &followparent_recalc, | 1849 | .recalc = &followparent_recalc, |
1850 | }; | 1850 | }; |
1851 | 1851 | ||
1852 | static struct clk mmchs1_ick = { | 1852 | static struct clk mmchs1_ick = { |
1853 | .name = "mmchs1_ick", | 1853 | .name = "mmchs1_ick", |
1854 | .ops = &clkops_omap2_dflt_wait, | 1854 | .ops = &clkops_omap2_dflt_wait, |
1855 | .parent = &core_l4_ick, | 1855 | .parent = &core_l4_ick, |
1856 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1856 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
1857 | .enable_bit = OMAP3430_EN_MMC1_SHIFT, | 1857 | .enable_bit = OMAP3430_EN_MMC1_SHIFT, |
1858 | .clkdm_name = "core_l4_clkdm", | 1858 | .clkdm_name = "core_l4_clkdm", |
1859 | .recalc = &followparent_recalc, | 1859 | .recalc = &followparent_recalc, |
1860 | }; | 1860 | }; |
1861 | 1861 | ||
1862 | static struct clk mspro_ick = { | 1862 | static struct clk mspro_ick = { |
1863 | .name = "mspro_ick", | 1863 | .name = "mspro_ick", |
1864 | .ops = &clkops_omap2_dflt_wait, | 1864 | .ops = &clkops_omap2_dflt_wait, |
1865 | .parent = &core_l4_ick, | 1865 | .parent = &core_l4_ick, |
1866 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1866 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
1867 | .enable_bit = OMAP3430_EN_MSPRO_SHIFT, | 1867 | .enable_bit = OMAP3430_EN_MSPRO_SHIFT, |
1868 | .clkdm_name = "core_l4_clkdm", | 1868 | .clkdm_name = "core_l4_clkdm", |
1869 | .recalc = &followparent_recalc, | 1869 | .recalc = &followparent_recalc, |
1870 | }; | 1870 | }; |
1871 | 1871 | ||
1872 | static struct clk hdq_ick = { | 1872 | static struct clk hdq_ick = { |
1873 | .name = "hdq_ick", | 1873 | .name = "hdq_ick", |
1874 | .ops = &clkops_omap2_dflt_wait, | 1874 | .ops = &clkops_omap2_dflt_wait, |
1875 | .parent = &core_l4_ick, | 1875 | .parent = &core_l4_ick, |
1876 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1876 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
1877 | .enable_bit = OMAP3430_EN_HDQ_SHIFT, | 1877 | .enable_bit = OMAP3430_EN_HDQ_SHIFT, |
1878 | .clkdm_name = "core_l4_clkdm", | 1878 | .clkdm_name = "core_l4_clkdm", |
1879 | .recalc = &followparent_recalc, | 1879 | .recalc = &followparent_recalc, |
1880 | }; | 1880 | }; |
1881 | 1881 | ||
1882 | static struct clk mcspi4_ick = { | 1882 | static struct clk mcspi4_ick = { |
1883 | .name = "mcspi4_ick", | 1883 | .name = "mcspi4_ick", |
1884 | .ops = &clkops_omap2_dflt_wait, | 1884 | .ops = &clkops_omap2_dflt_wait, |
1885 | .parent = &core_l4_ick, | 1885 | .parent = &core_l4_ick, |
1886 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1886 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
1887 | .enable_bit = OMAP3430_EN_MCSPI4_SHIFT, | 1887 | .enable_bit = OMAP3430_EN_MCSPI4_SHIFT, |
1888 | .clkdm_name = "core_l4_clkdm", | 1888 | .clkdm_name = "core_l4_clkdm", |
1889 | .recalc = &followparent_recalc, | 1889 | .recalc = &followparent_recalc, |
1890 | }; | 1890 | }; |
1891 | 1891 | ||
1892 | static struct clk mcspi3_ick = { | 1892 | static struct clk mcspi3_ick = { |
1893 | .name = "mcspi3_ick", | 1893 | .name = "mcspi3_ick", |
1894 | .ops = &clkops_omap2_dflt_wait, | 1894 | .ops = &clkops_omap2_dflt_wait, |
1895 | .parent = &core_l4_ick, | 1895 | .parent = &core_l4_ick, |
1896 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1896 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
1897 | .enable_bit = OMAP3430_EN_MCSPI3_SHIFT, | 1897 | .enable_bit = OMAP3430_EN_MCSPI3_SHIFT, |
1898 | .clkdm_name = "core_l4_clkdm", | 1898 | .clkdm_name = "core_l4_clkdm", |
1899 | .recalc = &followparent_recalc, | 1899 | .recalc = &followparent_recalc, |
1900 | }; | 1900 | }; |
1901 | 1901 | ||
1902 | static struct clk mcspi2_ick = { | 1902 | static struct clk mcspi2_ick = { |
1903 | .name = "mcspi2_ick", | 1903 | .name = "mcspi2_ick", |
1904 | .ops = &clkops_omap2_dflt_wait, | 1904 | .ops = &clkops_omap2_dflt_wait, |
1905 | .parent = &core_l4_ick, | 1905 | .parent = &core_l4_ick, |
1906 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1906 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
1907 | .enable_bit = OMAP3430_EN_MCSPI2_SHIFT, | 1907 | .enable_bit = OMAP3430_EN_MCSPI2_SHIFT, |
1908 | .clkdm_name = "core_l4_clkdm", | 1908 | .clkdm_name = "core_l4_clkdm", |
1909 | .recalc = &followparent_recalc, | 1909 | .recalc = &followparent_recalc, |
1910 | }; | 1910 | }; |
1911 | 1911 | ||
1912 | static struct clk mcspi1_ick = { | 1912 | static struct clk mcspi1_ick = { |
1913 | .name = "mcspi1_ick", | 1913 | .name = "mcspi1_ick", |
1914 | .ops = &clkops_omap2_dflt_wait, | 1914 | .ops = &clkops_omap2_dflt_wait, |
1915 | .parent = &core_l4_ick, | 1915 | .parent = &core_l4_ick, |
1916 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1916 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
1917 | .enable_bit = OMAP3430_EN_MCSPI1_SHIFT, | 1917 | .enable_bit = OMAP3430_EN_MCSPI1_SHIFT, |
1918 | .clkdm_name = "core_l4_clkdm", | 1918 | .clkdm_name = "core_l4_clkdm", |
1919 | .recalc = &followparent_recalc, | 1919 | .recalc = &followparent_recalc, |
1920 | }; | 1920 | }; |
1921 | 1921 | ||
1922 | static struct clk i2c3_ick = { | 1922 | static struct clk i2c3_ick = { |
1923 | .name = "i2c3_ick", | 1923 | .name = "i2c3_ick", |
1924 | .ops = &clkops_omap2_dflt_wait, | 1924 | .ops = &clkops_omap2_dflt_wait, |
1925 | .parent = &core_l4_ick, | 1925 | .parent = &core_l4_ick, |
1926 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1926 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
1927 | .enable_bit = OMAP3430_EN_I2C3_SHIFT, | 1927 | .enable_bit = OMAP3430_EN_I2C3_SHIFT, |
1928 | .clkdm_name = "core_l4_clkdm", | 1928 | .clkdm_name = "core_l4_clkdm", |
1929 | .recalc = &followparent_recalc, | 1929 | .recalc = &followparent_recalc, |
1930 | }; | 1930 | }; |
1931 | 1931 | ||
1932 | static struct clk i2c2_ick = { | 1932 | static struct clk i2c2_ick = { |
1933 | .name = "i2c2_ick", | 1933 | .name = "i2c2_ick", |
1934 | .ops = &clkops_omap2_dflt_wait, | 1934 | .ops = &clkops_omap2_dflt_wait, |
1935 | .parent = &core_l4_ick, | 1935 | .parent = &core_l4_ick, |
1936 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1936 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
1937 | .enable_bit = OMAP3430_EN_I2C2_SHIFT, | 1937 | .enable_bit = OMAP3430_EN_I2C2_SHIFT, |
1938 | .clkdm_name = "core_l4_clkdm", | 1938 | .clkdm_name = "core_l4_clkdm", |
1939 | .recalc = &followparent_recalc, | 1939 | .recalc = &followparent_recalc, |
1940 | }; | 1940 | }; |
1941 | 1941 | ||
1942 | static struct clk i2c1_ick = { | 1942 | static struct clk i2c1_ick = { |
1943 | .name = "i2c1_ick", | 1943 | .name = "i2c1_ick", |
1944 | .ops = &clkops_omap2_dflt_wait, | 1944 | .ops = &clkops_omap2_dflt_wait, |
1945 | .parent = &core_l4_ick, | 1945 | .parent = &core_l4_ick, |
1946 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1946 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
1947 | .enable_bit = OMAP3430_EN_I2C1_SHIFT, | 1947 | .enable_bit = OMAP3430_EN_I2C1_SHIFT, |
1948 | .clkdm_name = "core_l4_clkdm", | 1948 | .clkdm_name = "core_l4_clkdm", |
1949 | .recalc = &followparent_recalc, | 1949 | .recalc = &followparent_recalc, |
1950 | }; | 1950 | }; |
1951 | 1951 | ||
1952 | static struct clk uart2_ick = { | 1952 | static struct clk uart2_ick = { |
1953 | .name = "uart2_ick", | 1953 | .name = "uart2_ick", |
1954 | .ops = &clkops_omap2_dflt_wait, | 1954 | .ops = &clkops_omap2_dflt_wait, |
1955 | .parent = &core_l4_ick, | 1955 | .parent = &core_l4_ick, |
1956 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1956 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
1957 | .enable_bit = OMAP3430_EN_UART2_SHIFT, | 1957 | .enable_bit = OMAP3430_EN_UART2_SHIFT, |
1958 | .clkdm_name = "core_l4_clkdm", | 1958 | .clkdm_name = "core_l4_clkdm", |
1959 | .recalc = &followparent_recalc, | 1959 | .recalc = &followparent_recalc, |
1960 | }; | 1960 | }; |
1961 | 1961 | ||
1962 | static struct clk uart1_ick = { | 1962 | static struct clk uart1_ick = { |
1963 | .name = "uart1_ick", | 1963 | .name = "uart1_ick", |
1964 | .ops = &clkops_omap2_dflt_wait, | 1964 | .ops = &clkops_omap2_dflt_wait, |
1965 | .parent = &core_l4_ick, | 1965 | .parent = &core_l4_ick, |
1966 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1966 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
1967 | .enable_bit = OMAP3430_EN_UART1_SHIFT, | 1967 | .enable_bit = OMAP3430_EN_UART1_SHIFT, |
1968 | .clkdm_name = "core_l4_clkdm", | 1968 | .clkdm_name = "core_l4_clkdm", |
1969 | .recalc = &followparent_recalc, | 1969 | .recalc = &followparent_recalc, |
1970 | }; | 1970 | }; |
1971 | 1971 | ||
1972 | static struct clk gpt11_ick = { | 1972 | static struct clk gpt11_ick = { |
1973 | .name = "gpt11_ick", | 1973 | .name = "gpt11_ick", |
1974 | .ops = &clkops_omap2_dflt_wait, | 1974 | .ops = &clkops_omap2_dflt_wait, |
1975 | .parent = &core_l4_ick, | 1975 | .parent = &core_l4_ick, |
1976 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1976 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
1977 | .enable_bit = OMAP3430_EN_GPT11_SHIFT, | 1977 | .enable_bit = OMAP3430_EN_GPT11_SHIFT, |
1978 | .clkdm_name = "core_l4_clkdm", | 1978 | .clkdm_name = "core_l4_clkdm", |
1979 | .recalc = &followparent_recalc, | 1979 | .recalc = &followparent_recalc, |
1980 | }; | 1980 | }; |
1981 | 1981 | ||
1982 | static struct clk gpt10_ick = { | 1982 | static struct clk gpt10_ick = { |
1983 | .name = "gpt10_ick", | 1983 | .name = "gpt10_ick", |
1984 | .ops = &clkops_omap2_dflt_wait, | 1984 | .ops = &clkops_omap2_dflt_wait, |
1985 | .parent = &core_l4_ick, | 1985 | .parent = &core_l4_ick, |
1986 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1986 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
1987 | .enable_bit = OMAP3430_EN_GPT10_SHIFT, | 1987 | .enable_bit = OMAP3430_EN_GPT10_SHIFT, |
1988 | .clkdm_name = "core_l4_clkdm", | 1988 | .clkdm_name = "core_l4_clkdm", |
1989 | .recalc = &followparent_recalc, | 1989 | .recalc = &followparent_recalc, |
1990 | }; | 1990 | }; |
1991 | 1991 | ||
1992 | static struct clk mcbsp5_ick = { | 1992 | static struct clk mcbsp5_ick = { |
1993 | .name = "mcbsp5_ick", | 1993 | .name = "mcbsp5_ick", |
1994 | .ops = &clkops_omap2_dflt_wait, | 1994 | .ops = &clkops_omap2_dflt_wait, |
1995 | .parent = &core_l4_ick, | 1995 | .parent = &core_l4_ick, |
1996 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1996 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
1997 | .enable_bit = OMAP3430_EN_MCBSP5_SHIFT, | 1997 | .enable_bit = OMAP3430_EN_MCBSP5_SHIFT, |
1998 | .clkdm_name = "core_l4_clkdm", | 1998 | .clkdm_name = "core_l4_clkdm", |
1999 | .recalc = &followparent_recalc, | 1999 | .recalc = &followparent_recalc, |
2000 | }; | 2000 | }; |
2001 | 2001 | ||
2002 | static struct clk mcbsp1_ick = { | 2002 | static struct clk mcbsp1_ick = { |
2003 | .name = "mcbsp1_ick", | 2003 | .name = "mcbsp1_ick", |
2004 | .ops = &clkops_omap2_dflt_wait, | 2004 | .ops = &clkops_omap2_dflt_wait, |
2005 | .parent = &core_l4_ick, | 2005 | .parent = &core_l4_ick, |
2006 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 2006 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
2007 | .enable_bit = OMAP3430_EN_MCBSP1_SHIFT, | 2007 | .enable_bit = OMAP3430_EN_MCBSP1_SHIFT, |
2008 | .clkdm_name = "core_l4_clkdm", | 2008 | .clkdm_name = "core_l4_clkdm", |
2009 | .recalc = &followparent_recalc, | 2009 | .recalc = &followparent_recalc, |
2010 | }; | 2010 | }; |
2011 | 2011 | ||
2012 | static struct clk fac_ick = { | 2012 | static struct clk fac_ick = { |
2013 | .name = "fac_ick", | 2013 | .name = "fac_ick", |
2014 | .ops = &clkops_omap2_dflt_wait, | 2014 | .ops = &clkops_omap2_dflt_wait, |
2015 | .parent = &core_l4_ick, | 2015 | .parent = &core_l4_ick, |
2016 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 2016 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
2017 | .enable_bit = OMAP3430ES1_EN_FAC_SHIFT, | 2017 | .enable_bit = OMAP3430ES1_EN_FAC_SHIFT, |
2018 | .clkdm_name = "core_l4_clkdm", | 2018 | .clkdm_name = "core_l4_clkdm", |
2019 | .recalc = &followparent_recalc, | 2019 | .recalc = &followparent_recalc, |
2020 | }; | 2020 | }; |
2021 | 2021 | ||
2022 | static struct clk mailboxes_ick = { | 2022 | static struct clk mailboxes_ick = { |
2023 | .name = "mailboxes_ick", | 2023 | .name = "mailboxes_ick", |
2024 | .ops = &clkops_omap2_dflt_wait, | 2024 | .ops = &clkops_omap2_dflt_wait, |
2025 | .parent = &core_l4_ick, | 2025 | .parent = &core_l4_ick, |
2026 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 2026 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
2027 | .enable_bit = OMAP3430_EN_MAILBOXES_SHIFT, | 2027 | .enable_bit = OMAP3430_EN_MAILBOXES_SHIFT, |
2028 | .clkdm_name = "core_l4_clkdm", | 2028 | .clkdm_name = "core_l4_clkdm", |
2029 | .recalc = &followparent_recalc, | 2029 | .recalc = &followparent_recalc, |
2030 | }; | 2030 | }; |
2031 | 2031 | ||
2032 | static struct clk omapctrl_ick = { | 2032 | static struct clk omapctrl_ick = { |
2033 | .name = "omapctrl_ick", | 2033 | .name = "omapctrl_ick", |
2034 | .ops = &clkops_omap2_dflt_wait, | 2034 | .ops = &clkops_omap2_dflt_wait, |
2035 | .parent = &core_l4_ick, | 2035 | .parent = &core_l4_ick, |
2036 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 2036 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
2037 | .enable_bit = OMAP3430_EN_OMAPCTRL_SHIFT, | 2037 | .enable_bit = OMAP3430_EN_OMAPCTRL_SHIFT, |
2038 | .flags = ENABLE_ON_INIT, | 2038 | .flags = ENABLE_ON_INIT, |
2039 | .recalc = &followparent_recalc, | 2039 | .recalc = &followparent_recalc, |
2040 | }; | 2040 | }; |
2041 | 2041 | ||
2042 | /* SSI_L4_ICK based clocks */ | 2042 | /* SSI_L4_ICK based clocks */ |
2043 | 2043 | ||
2044 | static struct clk ssi_l4_ick = { | 2044 | static struct clk ssi_l4_ick = { |
2045 | .name = "ssi_l4_ick", | 2045 | .name = "ssi_l4_ick", |
2046 | .ops = &clkops_null, | 2046 | .ops = &clkops_null, |
2047 | .parent = &l4_ick, | 2047 | .parent = &l4_ick, |
2048 | .clkdm_name = "core_l4_clkdm", | 2048 | .clkdm_name = "core_l4_clkdm", |
2049 | .recalc = &followparent_recalc, | 2049 | .recalc = &followparent_recalc, |
2050 | }; | 2050 | }; |
2051 | 2051 | ||
2052 | static struct clk ssi_ick_3430es1 = { | 2052 | static struct clk ssi_ick_3430es1 = { |
2053 | .name = "ssi_ick", | 2053 | .name = "ssi_ick", |
2054 | .ops = &clkops_omap2_dflt, | 2054 | .ops = &clkops_omap2_dflt, |
2055 | .parent = &ssi_l4_ick, | 2055 | .parent = &ssi_l4_ick, |
2056 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 2056 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
2057 | .enable_bit = OMAP3430_EN_SSI_SHIFT, | 2057 | .enable_bit = OMAP3430_EN_SSI_SHIFT, |
2058 | .clkdm_name = "core_l4_clkdm", | 2058 | .clkdm_name = "core_l4_clkdm", |
2059 | .recalc = &followparent_recalc, | 2059 | .recalc = &followparent_recalc, |
2060 | }; | 2060 | }; |
2061 | 2061 | ||
2062 | static struct clk ssi_ick_3430es2 = { | 2062 | static struct clk ssi_ick_3430es2 = { |
2063 | .name = "ssi_ick", | 2063 | .name = "ssi_ick", |
2064 | .ops = &clkops_omap3430es2_ssi_wait, | 2064 | .ops = &clkops_omap3430es2_ssi_wait, |
2065 | .parent = &ssi_l4_ick, | 2065 | .parent = &ssi_l4_ick, |
2066 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 2066 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
2067 | .enable_bit = OMAP3430_EN_SSI_SHIFT, | 2067 | .enable_bit = OMAP3430_EN_SSI_SHIFT, |
2068 | .clkdm_name = "core_l4_clkdm", | 2068 | .clkdm_name = "core_l4_clkdm", |
2069 | .recalc = &followparent_recalc, | 2069 | .recalc = &followparent_recalc, |
2070 | }; | 2070 | }; |
2071 | 2071 | ||
2072 | /* REVISIT: Technically the TRM claims that this is CORE_CLK based, | 2072 | /* REVISIT: Technically the TRM claims that this is CORE_CLK based, |
2073 | * but l4_ick makes more sense to me */ | 2073 | * but l4_ick makes more sense to me */ |
2074 | 2074 | ||
2075 | static const struct clksel usb_l4_clksel[] = { | 2075 | static const struct clksel usb_l4_clksel[] = { |
2076 | { .parent = &l4_ick, .rates = div2_rates }, | 2076 | { .parent = &l4_ick, .rates = div2_rates }, |
2077 | { .parent = NULL }, | 2077 | { .parent = NULL }, |
2078 | }; | 2078 | }; |
2079 | 2079 | ||
2080 | static struct clk usb_l4_ick = { | 2080 | static struct clk usb_l4_ick = { |
2081 | .name = "usb_l4_ick", | 2081 | .name = "usb_l4_ick", |
2082 | .ops = &clkops_omap2_dflt_wait, | 2082 | .ops = &clkops_omap2_dflt_wait, |
2083 | .parent = &l4_ick, | 2083 | .parent = &l4_ick, |
2084 | .init = &omap2_init_clksel_parent, | 2084 | .init = &omap2_init_clksel_parent, |
2085 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 2085 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
2086 | .enable_bit = OMAP3430ES1_EN_FSHOSTUSB_SHIFT, | 2086 | .enable_bit = OMAP3430ES1_EN_FSHOSTUSB_SHIFT, |
2087 | .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL), | 2087 | .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL), |
2088 | .clksel_mask = OMAP3430ES1_CLKSEL_FSHOSTUSB_MASK, | 2088 | .clksel_mask = OMAP3430ES1_CLKSEL_FSHOSTUSB_MASK, |
2089 | .clksel = usb_l4_clksel, | 2089 | .clksel = usb_l4_clksel, |
2090 | .recalc = &omap2_clksel_recalc, | 2090 | .recalc = &omap2_clksel_recalc, |
2091 | }; | 2091 | }; |
2092 | 2092 | ||
2093 | /* SECURITY_L4_ICK2 based clocks */ | 2093 | /* SECURITY_L4_ICK2 based clocks */ |
2094 | 2094 | ||
2095 | static struct clk security_l4_ick2 = { | 2095 | static struct clk security_l4_ick2 = { |
2096 | .name = "security_l4_ick2", | 2096 | .name = "security_l4_ick2", |
2097 | .ops = &clkops_null, | 2097 | .ops = &clkops_null, |
2098 | .parent = &l4_ick, | 2098 | .parent = &l4_ick, |
2099 | .recalc = &followparent_recalc, | 2099 | .recalc = &followparent_recalc, |
2100 | }; | 2100 | }; |
2101 | 2101 | ||
2102 | static struct clk aes1_ick = { | 2102 | static struct clk aes1_ick = { |
2103 | .name = "aes1_ick", | 2103 | .name = "aes1_ick", |
2104 | .ops = &clkops_omap2_dflt_wait, | 2104 | .ops = &clkops_omap2_dflt_wait, |
2105 | .parent = &security_l4_ick2, | 2105 | .parent = &security_l4_ick2, |
2106 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), | 2106 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), |
2107 | .enable_bit = OMAP3430_EN_AES1_SHIFT, | 2107 | .enable_bit = OMAP3430_EN_AES1_SHIFT, |
2108 | .recalc = &followparent_recalc, | 2108 | .recalc = &followparent_recalc, |
2109 | }; | 2109 | }; |
2110 | 2110 | ||
2111 | static struct clk rng_ick = { | 2111 | static struct clk rng_ick = { |
2112 | .name = "rng_ick", | 2112 | .name = "rng_ick", |
2113 | .ops = &clkops_omap2_dflt_wait, | 2113 | .ops = &clkops_omap2_dflt_wait, |
2114 | .parent = &security_l4_ick2, | 2114 | .parent = &security_l4_ick2, |
2115 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), | 2115 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), |
2116 | .enable_bit = OMAP3430_EN_RNG_SHIFT, | 2116 | .enable_bit = OMAP3430_EN_RNG_SHIFT, |
2117 | .recalc = &followparent_recalc, | 2117 | .recalc = &followparent_recalc, |
2118 | }; | 2118 | }; |
2119 | 2119 | ||
2120 | static struct clk sha11_ick = { | 2120 | static struct clk sha11_ick = { |
2121 | .name = "sha11_ick", | 2121 | .name = "sha11_ick", |
2122 | .ops = &clkops_omap2_dflt_wait, | 2122 | .ops = &clkops_omap2_dflt_wait, |
2123 | .parent = &security_l4_ick2, | 2123 | .parent = &security_l4_ick2, |
2124 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), | 2124 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), |
2125 | .enable_bit = OMAP3430_EN_SHA11_SHIFT, | 2125 | .enable_bit = OMAP3430_EN_SHA11_SHIFT, |
2126 | .recalc = &followparent_recalc, | 2126 | .recalc = &followparent_recalc, |
2127 | }; | 2127 | }; |
2128 | 2128 | ||
2129 | static struct clk des1_ick = { | 2129 | static struct clk des1_ick = { |
2130 | .name = "des1_ick", | 2130 | .name = "des1_ick", |
2131 | .ops = &clkops_omap2_dflt_wait, | 2131 | .ops = &clkops_omap2_dflt_wait, |
2132 | .parent = &security_l4_ick2, | 2132 | .parent = &security_l4_ick2, |
2133 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), | 2133 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), |
2134 | .enable_bit = OMAP3430_EN_DES1_SHIFT, | 2134 | .enable_bit = OMAP3430_EN_DES1_SHIFT, |
2135 | .recalc = &followparent_recalc, | 2135 | .recalc = &followparent_recalc, |
2136 | }; | 2136 | }; |
2137 | 2137 | ||
2138 | /* DSS */ | 2138 | /* DSS */ |
2139 | static struct clk dss1_alwon_fck_3430es1 = { | 2139 | static struct clk dss1_alwon_fck_3430es1 = { |
2140 | .name = "dss1_alwon_fck", | 2140 | .name = "dss1_alwon_fck", |
2141 | .ops = &clkops_omap2_dflt, | 2141 | .ops = &clkops_omap2_dflt, |
2142 | .parent = &dpll4_m4x2_ck, | 2142 | .parent = &dpll4_m4x2_ck, |
2143 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_FCLKEN), | 2143 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_FCLKEN), |
2144 | .enable_bit = OMAP3430_EN_DSS1_SHIFT, | 2144 | .enable_bit = OMAP3430_EN_DSS1_SHIFT, |
2145 | .clkdm_name = "dss_clkdm", | 2145 | .clkdm_name = "dss_clkdm", |
2146 | .recalc = &followparent_recalc, | 2146 | .recalc = &followparent_recalc, |
2147 | }; | 2147 | }; |
2148 | 2148 | ||
2149 | static struct clk dss1_alwon_fck_3430es2 = { | 2149 | static struct clk dss1_alwon_fck_3430es2 = { |
2150 | .name = "dss1_alwon_fck", | 2150 | .name = "dss1_alwon_fck", |
2151 | .ops = &clkops_omap3430es2_dss_usbhost_wait, | 2151 | .ops = &clkops_omap3430es2_dss_usbhost_wait, |
2152 | .parent = &dpll4_m4x2_ck, | 2152 | .parent = &dpll4_m4x2_ck, |
2153 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_FCLKEN), | 2153 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_FCLKEN), |
2154 | .enable_bit = OMAP3430_EN_DSS1_SHIFT, | 2154 | .enable_bit = OMAP3430_EN_DSS1_SHIFT, |
2155 | .clkdm_name = "dss_clkdm", | 2155 | .clkdm_name = "dss_clkdm", |
2156 | .recalc = &followparent_recalc, | 2156 | .recalc = &followparent_recalc, |
2157 | }; | 2157 | }; |
2158 | 2158 | ||
2159 | static struct clk dss_tv_fck = { | 2159 | static struct clk dss_tv_fck = { |
2160 | .name = "dss_tv_fck", | 2160 | .name = "dss_tv_fck", |
2161 | .ops = &clkops_omap2_dflt, | 2161 | .ops = &clkops_omap2_dflt, |
2162 | .parent = &omap_54m_fck, | 2162 | .parent = &omap_54m_fck, |
2163 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_FCLKEN), | 2163 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_FCLKEN), |
2164 | .enable_bit = OMAP3430_EN_TV_SHIFT, | 2164 | .enable_bit = OMAP3430_EN_TV_SHIFT, |
2165 | .clkdm_name = "dss_clkdm", | 2165 | .clkdm_name = "dss_clkdm", |
2166 | .recalc = &followparent_recalc, | 2166 | .recalc = &followparent_recalc, |
2167 | }; | 2167 | }; |
2168 | 2168 | ||
2169 | static struct clk dss_96m_fck = { | 2169 | static struct clk dss_96m_fck = { |
2170 | .name = "dss_96m_fck", | 2170 | .name = "dss_96m_fck", |
2171 | .ops = &clkops_omap2_dflt, | 2171 | .ops = &clkops_omap2_dflt, |
2172 | .parent = &omap_96m_fck, | 2172 | .parent = &omap_96m_fck, |
2173 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_FCLKEN), | 2173 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_FCLKEN), |
2174 | .enable_bit = OMAP3430_EN_TV_SHIFT, | 2174 | .enable_bit = OMAP3430_EN_TV_SHIFT, |
2175 | .clkdm_name = "dss_clkdm", | 2175 | .clkdm_name = "dss_clkdm", |
2176 | .recalc = &followparent_recalc, | 2176 | .recalc = &followparent_recalc, |
2177 | }; | 2177 | }; |
2178 | 2178 | ||
2179 | static struct clk dss2_alwon_fck = { | 2179 | static struct clk dss2_alwon_fck = { |
2180 | .name = "dss2_alwon_fck", | 2180 | .name = "dss2_alwon_fck", |
2181 | .ops = &clkops_omap2_dflt, | 2181 | .ops = &clkops_omap2_dflt, |
2182 | .parent = &sys_ck, | 2182 | .parent = &sys_ck, |
2183 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_FCLKEN), | 2183 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_FCLKEN), |
2184 | .enable_bit = OMAP3430_EN_DSS2_SHIFT, | 2184 | .enable_bit = OMAP3430_EN_DSS2_SHIFT, |
2185 | .clkdm_name = "dss_clkdm", | 2185 | .clkdm_name = "dss_clkdm", |
2186 | .recalc = &followparent_recalc, | 2186 | .recalc = &followparent_recalc, |
2187 | }; | 2187 | }; |
2188 | 2188 | ||
2189 | static struct clk dss_ick_3430es1 = { | 2189 | static struct clk dss_ick_3430es1 = { |
2190 | /* Handles both L3 and L4 clocks */ | 2190 | /* Handles both L3 and L4 clocks */ |
2191 | .name = "dss_ick", | 2191 | .name = "dss_ick", |
2192 | .ops = &clkops_omap2_dflt, | 2192 | .ops = &clkops_omap2_dflt, |
2193 | .parent = &l4_ick, | 2193 | .parent = &l4_ick, |
2194 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_ICLKEN), | 2194 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_ICLKEN), |
2195 | .enable_bit = OMAP3430_CM_ICLKEN_DSS_EN_DSS_SHIFT, | 2195 | .enable_bit = OMAP3430_CM_ICLKEN_DSS_EN_DSS_SHIFT, |
2196 | .clkdm_name = "dss_clkdm", | 2196 | .clkdm_name = "dss_clkdm", |
2197 | .recalc = &followparent_recalc, | 2197 | .recalc = &followparent_recalc, |
2198 | }; | 2198 | }; |
2199 | 2199 | ||
2200 | static struct clk dss_ick_3430es2 = { | 2200 | static struct clk dss_ick_3430es2 = { |
2201 | /* Handles both L3 and L4 clocks */ | 2201 | /* Handles both L3 and L4 clocks */ |
2202 | .name = "dss_ick", | 2202 | .name = "dss_ick", |
2203 | .ops = &clkops_omap3430es2_dss_usbhost_wait, | 2203 | .ops = &clkops_omap3430es2_dss_usbhost_wait, |
2204 | .parent = &l4_ick, | 2204 | .parent = &l4_ick, |
2205 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_ICLKEN), | 2205 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_ICLKEN), |
2206 | .enable_bit = OMAP3430_CM_ICLKEN_DSS_EN_DSS_SHIFT, | 2206 | .enable_bit = OMAP3430_CM_ICLKEN_DSS_EN_DSS_SHIFT, |
2207 | .clkdm_name = "dss_clkdm", | 2207 | .clkdm_name = "dss_clkdm", |
2208 | .recalc = &followparent_recalc, | 2208 | .recalc = &followparent_recalc, |
2209 | }; | 2209 | }; |
2210 | 2210 | ||
2211 | /* CAM */ | 2211 | /* CAM */ |
2212 | 2212 | ||
2213 | static struct clk cam_mclk = { | 2213 | static struct clk cam_mclk = { |
2214 | .name = "cam_mclk", | 2214 | .name = "cam_mclk", |
2215 | .ops = &clkops_omap2_dflt, | 2215 | .ops = &clkops_omap2_dflt, |
2216 | .parent = &dpll4_m5x2_ck, | 2216 | .parent = &dpll4_m5x2_ck, |
2217 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_FCLKEN), | 2217 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_FCLKEN), |
2218 | .enable_bit = OMAP3430_EN_CAM_SHIFT, | 2218 | .enable_bit = OMAP3430_EN_CAM_SHIFT, |
2219 | .clkdm_name = "cam_clkdm", | 2219 | .clkdm_name = "cam_clkdm", |
2220 | .recalc = &followparent_recalc, | 2220 | .recalc = &followparent_recalc, |
2221 | }; | 2221 | }; |
2222 | 2222 | ||
2223 | static struct clk cam_ick = { | 2223 | static struct clk cam_ick = { |
2224 | /* Handles both L3 and L4 clocks */ | 2224 | /* Handles both L3 and L4 clocks */ |
2225 | .name = "cam_ick", | 2225 | .name = "cam_ick", |
2226 | .ops = &clkops_omap2_dflt, | 2226 | .ops = &clkops_omap2_dflt, |
2227 | .parent = &l4_ick, | 2227 | .parent = &l4_ick, |
2228 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_ICLKEN), | 2228 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_ICLKEN), |
2229 | .enable_bit = OMAP3430_EN_CAM_SHIFT, | 2229 | .enable_bit = OMAP3430_EN_CAM_SHIFT, |
2230 | .clkdm_name = "cam_clkdm", | 2230 | .clkdm_name = "cam_clkdm", |
2231 | .recalc = &followparent_recalc, | 2231 | .recalc = &followparent_recalc, |
2232 | }; | 2232 | }; |
2233 | 2233 | ||
2234 | static struct clk csi2_96m_fck = { | 2234 | static struct clk csi2_96m_fck = { |
2235 | .name = "csi2_96m_fck", | 2235 | .name = "csi2_96m_fck", |
2236 | .ops = &clkops_omap2_dflt, | 2236 | .ops = &clkops_omap2_dflt, |
2237 | .parent = &core_96m_fck, | 2237 | .parent = &core_96m_fck, |
2238 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_FCLKEN), | 2238 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_FCLKEN), |
2239 | .enable_bit = OMAP3430_EN_CSI2_SHIFT, | 2239 | .enable_bit = OMAP3430_EN_CSI2_SHIFT, |
2240 | .clkdm_name = "cam_clkdm", | 2240 | .clkdm_name = "cam_clkdm", |
2241 | .recalc = &followparent_recalc, | 2241 | .recalc = &followparent_recalc, |
2242 | }; | 2242 | }; |
2243 | 2243 | ||
2244 | /* USBHOST - 3430ES2 only */ | 2244 | /* USBHOST - 3430ES2 only */ |
2245 | 2245 | ||
2246 | static struct clk usbhost_120m_fck = { | 2246 | static struct clk usbhost_120m_fck = { |
2247 | .name = "usbhost_120m_fck", | 2247 | .name = "usbhost_120m_fck", |
2248 | .ops = &clkops_omap2_dflt, | 2248 | .ops = &clkops_omap2_dflt, |
2249 | .parent = &dpll5_m2_ck, | 2249 | .parent = &dpll5_m2_ck, |
2250 | .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_USBHOST_MOD, CM_FCLKEN), | 2250 | .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_USBHOST_MOD, CM_FCLKEN), |
2251 | .enable_bit = OMAP3430ES2_EN_USBHOST2_SHIFT, | 2251 | .enable_bit = OMAP3430ES2_EN_USBHOST2_SHIFT, |
2252 | .clkdm_name = "usbhost_clkdm", | 2252 | .clkdm_name = "usbhost_clkdm", |
2253 | .recalc = &followparent_recalc, | 2253 | .recalc = &followparent_recalc, |
2254 | }; | 2254 | }; |
2255 | 2255 | ||
2256 | static struct clk usbhost_48m_fck = { | 2256 | static struct clk usbhost_48m_fck = { |
2257 | .name = "usbhost_48m_fck", | 2257 | .name = "usbhost_48m_fck", |
2258 | .ops = &clkops_omap3430es2_dss_usbhost_wait, | 2258 | .ops = &clkops_omap3430es2_dss_usbhost_wait, |
2259 | .parent = &omap_48m_fck, | 2259 | .parent = &omap_48m_fck, |
2260 | .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_USBHOST_MOD, CM_FCLKEN), | 2260 | .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_USBHOST_MOD, CM_FCLKEN), |
2261 | .enable_bit = OMAP3430ES2_EN_USBHOST1_SHIFT, | 2261 | .enable_bit = OMAP3430ES2_EN_USBHOST1_SHIFT, |
2262 | .clkdm_name = "usbhost_clkdm", | 2262 | .clkdm_name = "usbhost_clkdm", |
2263 | .recalc = &followparent_recalc, | 2263 | .recalc = &followparent_recalc, |
2264 | }; | 2264 | }; |
2265 | 2265 | ||
2266 | static struct clk usbhost_ick = { | 2266 | static struct clk usbhost_ick = { |
2267 | /* Handles both L3 and L4 clocks */ | 2267 | /* Handles both L3 and L4 clocks */ |
2268 | .name = "usbhost_ick", | 2268 | .name = "usbhost_ick", |
2269 | .ops = &clkops_omap3430es2_dss_usbhost_wait, | 2269 | .ops = &clkops_omap3430es2_dss_usbhost_wait, |
2270 | .parent = &l4_ick, | 2270 | .parent = &l4_ick, |
2271 | .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_USBHOST_MOD, CM_ICLKEN), | 2271 | .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_USBHOST_MOD, CM_ICLKEN), |
2272 | .enable_bit = OMAP3430ES2_EN_USBHOST_SHIFT, | 2272 | .enable_bit = OMAP3430ES2_EN_USBHOST_SHIFT, |
2273 | .clkdm_name = "usbhost_clkdm", | 2273 | .clkdm_name = "usbhost_clkdm", |
2274 | .recalc = &followparent_recalc, | 2274 | .recalc = &followparent_recalc, |
2275 | }; | 2275 | }; |
2276 | 2276 | ||
2277 | /* WKUP */ | 2277 | /* WKUP */ |
2278 | 2278 | ||
2279 | static const struct clksel_rate usim_96m_rates[] = { | 2279 | static const struct clksel_rate usim_96m_rates[] = { |
2280 | { .div = 2, .val = 3, .flags = RATE_IN_3XXX }, | 2280 | { .div = 2, .val = 3, .flags = RATE_IN_3XXX }, |
2281 | { .div = 4, .val = 4, .flags = RATE_IN_3XXX }, | 2281 | { .div = 4, .val = 4, .flags = RATE_IN_3XXX }, |
2282 | { .div = 8, .val = 5, .flags = RATE_IN_3XXX }, | 2282 | { .div = 8, .val = 5, .flags = RATE_IN_3XXX }, |
2283 | { .div = 10, .val = 6, .flags = RATE_IN_3XXX }, | 2283 | { .div = 10, .val = 6, .flags = RATE_IN_3XXX }, |
2284 | { .div = 0 }, | 2284 | { .div = 0 }, |
2285 | }; | 2285 | }; |
2286 | 2286 | ||
2287 | static const struct clksel_rate usim_120m_rates[] = { | 2287 | static const struct clksel_rate usim_120m_rates[] = { |
2288 | { .div = 4, .val = 7, .flags = RATE_IN_3XXX }, | 2288 | { .div = 4, .val = 7, .flags = RATE_IN_3XXX }, |
2289 | { .div = 8, .val = 8, .flags = RATE_IN_3XXX }, | 2289 | { .div = 8, .val = 8, .flags = RATE_IN_3XXX }, |
2290 | { .div = 16, .val = 9, .flags = RATE_IN_3XXX }, | 2290 | { .div = 16, .val = 9, .flags = RATE_IN_3XXX }, |
2291 | { .div = 20, .val = 10, .flags = RATE_IN_3XXX }, | 2291 | { .div = 20, .val = 10, .flags = RATE_IN_3XXX }, |
2292 | { .div = 0 }, | 2292 | { .div = 0 }, |
2293 | }; | 2293 | }; |
2294 | 2294 | ||
2295 | static const struct clksel usim_clksel[] = { | 2295 | static const struct clksel usim_clksel[] = { |
2296 | { .parent = &omap_96m_fck, .rates = usim_96m_rates }, | 2296 | { .parent = &omap_96m_fck, .rates = usim_96m_rates }, |
2297 | { .parent = &dpll5_m2_ck, .rates = usim_120m_rates }, | 2297 | { .parent = &dpll5_m2_ck, .rates = usim_120m_rates }, |
2298 | { .parent = &sys_ck, .rates = div2_rates }, | 2298 | { .parent = &sys_ck, .rates = div2_rates }, |
2299 | { .parent = NULL }, | 2299 | { .parent = NULL }, |
2300 | }; | 2300 | }; |
2301 | 2301 | ||
2302 | /* 3430ES2 only */ | 2302 | /* 3430ES2 only */ |
2303 | static struct clk usim_fck = { | 2303 | static struct clk usim_fck = { |
2304 | .name = "usim_fck", | 2304 | .name = "usim_fck", |
2305 | .ops = &clkops_omap2_dflt_wait, | 2305 | .ops = &clkops_omap2_dflt_wait, |
2306 | .init = &omap2_init_clksel_parent, | 2306 | .init = &omap2_init_clksel_parent, |
2307 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN), | 2307 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN), |
2308 | .enable_bit = OMAP3430ES2_EN_USIMOCP_SHIFT, | 2308 | .enable_bit = OMAP3430ES2_EN_USIMOCP_SHIFT, |
2309 | .clksel_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_CLKSEL), | 2309 | .clksel_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_CLKSEL), |
2310 | .clksel_mask = OMAP3430ES2_CLKSEL_USIMOCP_MASK, | 2310 | .clksel_mask = OMAP3430ES2_CLKSEL_USIMOCP_MASK, |
2311 | .clksel = usim_clksel, | 2311 | .clksel = usim_clksel, |
2312 | .recalc = &omap2_clksel_recalc, | 2312 | .recalc = &omap2_clksel_recalc, |
2313 | }; | 2313 | }; |
2314 | 2314 | ||
2315 | /* XXX should gpt1's clksel have wkup_32k_fck as the 32k opt? */ | 2315 | /* XXX should gpt1's clksel have wkup_32k_fck as the 32k opt? */ |
2316 | static struct clk gpt1_fck = { | 2316 | static struct clk gpt1_fck = { |
2317 | .name = "gpt1_fck", | 2317 | .name = "gpt1_fck", |
2318 | .ops = &clkops_omap2_dflt_wait, | 2318 | .ops = &clkops_omap2_dflt_wait, |
2319 | .init = &omap2_init_clksel_parent, | 2319 | .init = &omap2_init_clksel_parent, |
2320 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN), | 2320 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN), |
2321 | .enable_bit = OMAP3430_EN_GPT1_SHIFT, | 2321 | .enable_bit = OMAP3430_EN_GPT1_SHIFT, |
2322 | .clksel_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_CLKSEL), | 2322 | .clksel_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_CLKSEL), |
2323 | .clksel_mask = OMAP3430_CLKSEL_GPT1_MASK, | 2323 | .clksel_mask = OMAP3430_CLKSEL_GPT1_MASK, |
2324 | .clksel = omap343x_gpt_clksel, | 2324 | .clksel = omap343x_gpt_clksel, |
2325 | .clkdm_name = "wkup_clkdm", | 2325 | .clkdm_name = "wkup_clkdm", |
2326 | .recalc = &omap2_clksel_recalc, | 2326 | .recalc = &omap2_clksel_recalc, |
2327 | }; | 2327 | }; |
2328 | 2328 | ||
2329 | static struct clk wkup_32k_fck = { | 2329 | static struct clk wkup_32k_fck = { |
2330 | .name = "wkup_32k_fck", | 2330 | .name = "wkup_32k_fck", |
2331 | .ops = &clkops_null, | 2331 | .ops = &clkops_null, |
2332 | .parent = &omap_32k_fck, | 2332 | .parent = &omap_32k_fck, |
2333 | .clkdm_name = "wkup_clkdm", | 2333 | .clkdm_name = "wkup_clkdm", |
2334 | .recalc = &followparent_recalc, | 2334 | .recalc = &followparent_recalc, |
2335 | }; | 2335 | }; |
2336 | 2336 | ||
2337 | static struct clk gpio1_dbck = { | 2337 | static struct clk gpio1_dbck = { |
2338 | .name = "gpio1_dbck", | 2338 | .name = "gpio1_dbck", |
2339 | .ops = &clkops_omap2_dflt, | 2339 | .ops = &clkops_omap2_dflt, |
2340 | .parent = &wkup_32k_fck, | 2340 | .parent = &wkup_32k_fck, |
2341 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN), | 2341 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN), |
2342 | .enable_bit = OMAP3430_EN_GPIO1_SHIFT, | 2342 | .enable_bit = OMAP3430_EN_GPIO1_SHIFT, |
2343 | .clkdm_name = "wkup_clkdm", | 2343 | .clkdm_name = "wkup_clkdm", |
2344 | .recalc = &followparent_recalc, | 2344 | .recalc = &followparent_recalc, |
2345 | }; | 2345 | }; |
2346 | 2346 | ||
2347 | static struct clk wdt2_fck = { | 2347 | static struct clk wdt2_fck = { |
2348 | .name = "wdt2_fck", | 2348 | .name = "wdt2_fck", |
2349 | .ops = &clkops_omap2_dflt_wait, | 2349 | .ops = &clkops_omap2_dflt_wait, |
2350 | .parent = &wkup_32k_fck, | 2350 | .parent = &wkup_32k_fck, |
2351 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN), | 2351 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN), |
2352 | .enable_bit = OMAP3430_EN_WDT2_SHIFT, | 2352 | .enable_bit = OMAP3430_EN_WDT2_SHIFT, |
2353 | .clkdm_name = "wkup_clkdm", | 2353 | .clkdm_name = "wkup_clkdm", |
2354 | .recalc = &followparent_recalc, | 2354 | .recalc = &followparent_recalc, |
2355 | }; | 2355 | }; |
2356 | 2356 | ||
2357 | static struct clk wkup_l4_ick = { | 2357 | static struct clk wkup_l4_ick = { |
2358 | .name = "wkup_l4_ick", | 2358 | .name = "wkup_l4_ick", |
2359 | .ops = &clkops_null, | 2359 | .ops = &clkops_null, |
2360 | .parent = &sys_ck, | 2360 | .parent = &sys_ck, |
2361 | .clkdm_name = "wkup_clkdm", | 2361 | .clkdm_name = "wkup_clkdm", |
2362 | .recalc = &followparent_recalc, | 2362 | .recalc = &followparent_recalc, |
2363 | }; | 2363 | }; |
2364 | 2364 | ||
2365 | /* 3430ES2 only */ | 2365 | /* 3430ES2 only */ |
2366 | /* Never specifically named in the TRM, so we have to infer a likely name */ | 2366 | /* Never specifically named in the TRM, so we have to infer a likely name */ |
2367 | static struct clk usim_ick = { | 2367 | static struct clk usim_ick = { |
2368 | .name = "usim_ick", | 2368 | .name = "usim_ick", |
2369 | .ops = &clkops_omap2_dflt_wait, | 2369 | .ops = &clkops_omap2_dflt_wait, |
2370 | .parent = &wkup_l4_ick, | 2370 | .parent = &wkup_l4_ick, |
2371 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), | 2371 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), |
2372 | .enable_bit = OMAP3430ES2_EN_USIMOCP_SHIFT, | 2372 | .enable_bit = OMAP3430ES2_EN_USIMOCP_SHIFT, |
2373 | .clkdm_name = "wkup_clkdm", | 2373 | .clkdm_name = "wkup_clkdm", |
2374 | .recalc = &followparent_recalc, | 2374 | .recalc = &followparent_recalc, |
2375 | }; | 2375 | }; |
2376 | 2376 | ||
2377 | static struct clk wdt2_ick = { | 2377 | static struct clk wdt2_ick = { |
2378 | .name = "wdt2_ick", | 2378 | .name = "wdt2_ick", |
2379 | .ops = &clkops_omap2_dflt_wait, | 2379 | .ops = &clkops_omap2_dflt_wait, |
2380 | .parent = &wkup_l4_ick, | 2380 | .parent = &wkup_l4_ick, |
2381 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), | 2381 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), |
2382 | .enable_bit = OMAP3430_EN_WDT2_SHIFT, | 2382 | .enable_bit = OMAP3430_EN_WDT2_SHIFT, |
2383 | .clkdm_name = "wkup_clkdm", | 2383 | .clkdm_name = "wkup_clkdm", |
2384 | .recalc = &followparent_recalc, | 2384 | .recalc = &followparent_recalc, |
2385 | }; | 2385 | }; |
2386 | 2386 | ||
2387 | static struct clk wdt1_ick = { | 2387 | static struct clk wdt1_ick = { |
2388 | .name = "wdt1_ick", | 2388 | .name = "wdt1_ick", |
2389 | .ops = &clkops_omap2_dflt_wait, | 2389 | .ops = &clkops_omap2_dflt_wait, |
2390 | .parent = &wkup_l4_ick, | 2390 | .parent = &wkup_l4_ick, |
2391 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), | 2391 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), |
2392 | .enable_bit = OMAP3430_EN_WDT1_SHIFT, | 2392 | .enable_bit = OMAP3430_EN_WDT1_SHIFT, |
2393 | .clkdm_name = "wkup_clkdm", | 2393 | .clkdm_name = "wkup_clkdm", |
2394 | .recalc = &followparent_recalc, | 2394 | .recalc = &followparent_recalc, |
2395 | }; | 2395 | }; |
2396 | 2396 | ||
2397 | static struct clk gpio1_ick = { | 2397 | static struct clk gpio1_ick = { |
2398 | .name = "gpio1_ick", | 2398 | .name = "gpio1_ick", |
2399 | .ops = &clkops_omap2_dflt_wait, | 2399 | .ops = &clkops_omap2_dflt_wait, |
2400 | .parent = &wkup_l4_ick, | 2400 | .parent = &wkup_l4_ick, |
2401 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), | 2401 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), |
2402 | .enable_bit = OMAP3430_EN_GPIO1_SHIFT, | 2402 | .enable_bit = OMAP3430_EN_GPIO1_SHIFT, |
2403 | .clkdm_name = "wkup_clkdm", | 2403 | .clkdm_name = "wkup_clkdm", |
2404 | .recalc = &followparent_recalc, | 2404 | .recalc = &followparent_recalc, |
2405 | }; | 2405 | }; |
2406 | 2406 | ||
2407 | static struct clk omap_32ksync_ick = { | 2407 | static struct clk omap_32ksync_ick = { |
2408 | .name = "omap_32ksync_ick", | 2408 | .name = "omap_32ksync_ick", |
2409 | .ops = &clkops_omap2_dflt_wait, | 2409 | .ops = &clkops_omap2_dflt_wait, |
2410 | .parent = &wkup_l4_ick, | 2410 | .parent = &wkup_l4_ick, |
2411 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), | 2411 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), |
2412 | .enable_bit = OMAP3430_EN_32KSYNC_SHIFT, | 2412 | .enable_bit = OMAP3430_EN_32KSYNC_SHIFT, |
2413 | .clkdm_name = "wkup_clkdm", | 2413 | .clkdm_name = "wkup_clkdm", |
2414 | .recalc = &followparent_recalc, | 2414 | .recalc = &followparent_recalc, |
2415 | }; | 2415 | }; |
2416 | 2416 | ||
2417 | /* XXX This clock no longer exists in 3430 TRM rev F */ | 2417 | /* XXX This clock no longer exists in 3430 TRM rev F */ |
2418 | static struct clk gpt12_ick = { | 2418 | static struct clk gpt12_ick = { |
2419 | .name = "gpt12_ick", | 2419 | .name = "gpt12_ick", |
2420 | .ops = &clkops_omap2_dflt_wait, | 2420 | .ops = &clkops_omap2_dflt_wait, |
2421 | .parent = &wkup_l4_ick, | 2421 | .parent = &wkup_l4_ick, |
2422 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), | 2422 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), |
2423 | .enable_bit = OMAP3430_EN_GPT12_SHIFT, | 2423 | .enable_bit = OMAP3430_EN_GPT12_SHIFT, |
2424 | .clkdm_name = "wkup_clkdm", | 2424 | .clkdm_name = "wkup_clkdm", |
2425 | .recalc = &followparent_recalc, | 2425 | .recalc = &followparent_recalc, |
2426 | }; | 2426 | }; |
2427 | 2427 | ||
2428 | static struct clk gpt1_ick = { | 2428 | static struct clk gpt1_ick = { |
2429 | .name = "gpt1_ick", | 2429 | .name = "gpt1_ick", |
2430 | .ops = &clkops_omap2_dflt_wait, | 2430 | .ops = &clkops_omap2_dflt_wait, |
2431 | .parent = &wkup_l4_ick, | 2431 | .parent = &wkup_l4_ick, |
2432 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), | 2432 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN), |
2433 | .enable_bit = OMAP3430_EN_GPT1_SHIFT, | 2433 | .enable_bit = OMAP3430_EN_GPT1_SHIFT, |
2434 | .clkdm_name = "wkup_clkdm", | 2434 | .clkdm_name = "wkup_clkdm", |
2435 | .recalc = &followparent_recalc, | 2435 | .recalc = &followparent_recalc, |
2436 | }; | 2436 | }; |
2437 | 2437 | ||
2438 | 2438 | ||
2439 | 2439 | ||
2440 | /* PER clock domain */ | 2440 | /* PER clock domain */ |
2441 | 2441 | ||
2442 | static struct clk per_96m_fck = { | 2442 | static struct clk per_96m_fck = { |
2443 | .name = "per_96m_fck", | 2443 | .name = "per_96m_fck", |
2444 | .ops = &clkops_null, | 2444 | .ops = &clkops_null, |
2445 | .parent = &omap_96m_alwon_fck, | 2445 | .parent = &omap_96m_alwon_fck, |
2446 | .clkdm_name = "per_clkdm", | 2446 | .clkdm_name = "per_clkdm", |
2447 | .recalc = &followparent_recalc, | 2447 | .recalc = &followparent_recalc, |
2448 | }; | 2448 | }; |
2449 | 2449 | ||
2450 | static struct clk per_48m_fck = { | 2450 | static struct clk per_48m_fck = { |
2451 | .name = "per_48m_fck", | 2451 | .name = "per_48m_fck", |
2452 | .ops = &clkops_null, | 2452 | .ops = &clkops_null, |
2453 | .parent = &omap_48m_fck, | 2453 | .parent = &omap_48m_fck, |
2454 | .clkdm_name = "per_clkdm", | 2454 | .clkdm_name = "per_clkdm", |
2455 | .recalc = &followparent_recalc, | 2455 | .recalc = &followparent_recalc, |
2456 | }; | 2456 | }; |
2457 | 2457 | ||
2458 | static struct clk uart3_fck = { | 2458 | static struct clk uart3_fck = { |
2459 | .name = "uart3_fck", | 2459 | .name = "uart3_fck", |
2460 | .ops = &clkops_omap2_dflt_wait, | 2460 | .ops = &clkops_omap2_dflt_wait, |
2461 | .parent = &per_48m_fck, | 2461 | .parent = &per_48m_fck, |
2462 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN), | 2462 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN), |
2463 | .enable_bit = OMAP3430_EN_UART3_SHIFT, | 2463 | .enable_bit = OMAP3430_EN_UART3_SHIFT, |
2464 | .clkdm_name = "per_clkdm", | 2464 | .clkdm_name = "per_clkdm", |
2465 | .recalc = &followparent_recalc, | 2465 | .recalc = &followparent_recalc, |
2466 | }; | 2466 | }; |
2467 | 2467 | ||
2468 | static struct clk gpt2_fck = { | 2468 | static struct clk gpt2_fck = { |
2469 | .name = "gpt2_fck", | 2469 | .name = "gpt2_fck", |
2470 | .ops = &clkops_omap2_dflt_wait, | 2470 | .ops = &clkops_omap2_dflt_wait, |
2471 | .init = &omap2_init_clksel_parent, | 2471 | .init = &omap2_init_clksel_parent, |
2472 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN), | 2472 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN), |
2473 | .enable_bit = OMAP3430_EN_GPT2_SHIFT, | 2473 | .enable_bit = OMAP3430_EN_GPT2_SHIFT, |
2474 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL), | 2474 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL), |
2475 | .clksel_mask = OMAP3430_CLKSEL_GPT2_MASK, | 2475 | .clksel_mask = OMAP3430_CLKSEL_GPT2_MASK, |
2476 | .clksel = omap343x_gpt_clksel, | 2476 | .clksel = omap343x_gpt_clksel, |
2477 | .clkdm_name = "per_clkdm", | 2477 | .clkdm_name = "per_clkdm", |
2478 | .recalc = &omap2_clksel_recalc, | 2478 | .recalc = &omap2_clksel_recalc, |
2479 | }; | 2479 | }; |
2480 | 2480 | ||
2481 | static struct clk gpt3_fck = { | 2481 | static struct clk gpt3_fck = { |
2482 | .name = "gpt3_fck", | 2482 | .name = "gpt3_fck", |
2483 | .ops = &clkops_omap2_dflt_wait, | 2483 | .ops = &clkops_omap2_dflt_wait, |
2484 | .init = &omap2_init_clksel_parent, | 2484 | .init = &omap2_init_clksel_parent, |
2485 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN), | 2485 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN), |
2486 | .enable_bit = OMAP3430_EN_GPT3_SHIFT, | 2486 | .enable_bit = OMAP3430_EN_GPT3_SHIFT, |
2487 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL), | 2487 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL), |
2488 | .clksel_mask = OMAP3430_CLKSEL_GPT3_MASK, | 2488 | .clksel_mask = OMAP3430_CLKSEL_GPT3_MASK, |
2489 | .clksel = omap343x_gpt_clksel, | 2489 | .clksel = omap343x_gpt_clksel, |
2490 | .clkdm_name = "per_clkdm", | 2490 | .clkdm_name = "per_clkdm", |
2491 | .recalc = &omap2_clksel_recalc, | 2491 | .recalc = &omap2_clksel_recalc, |
2492 | }; | 2492 | }; |
2493 | 2493 | ||
2494 | static struct clk gpt4_fck = { | 2494 | static struct clk gpt4_fck = { |
2495 | .name = "gpt4_fck", | 2495 | .name = "gpt4_fck", |
2496 | .ops = &clkops_omap2_dflt_wait, | 2496 | .ops = &clkops_omap2_dflt_wait, |
2497 | .init = &omap2_init_clksel_parent, | 2497 | .init = &omap2_init_clksel_parent, |
2498 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN), | 2498 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN), |
2499 | .enable_bit = OMAP3430_EN_GPT4_SHIFT, | 2499 | .enable_bit = OMAP3430_EN_GPT4_SHIFT, |
2500 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL), | 2500 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL), |
2501 | .clksel_mask = OMAP3430_CLKSEL_GPT4_MASK, | 2501 | .clksel_mask = OMAP3430_CLKSEL_GPT4_MASK, |
2502 | .clksel = omap343x_gpt_clksel, | 2502 | .clksel = omap343x_gpt_clksel, |
2503 | .clkdm_name = "per_clkdm", | 2503 | .clkdm_name = "per_clkdm", |
2504 | .recalc = &omap2_clksel_recalc, | 2504 | .recalc = &omap2_clksel_recalc, |
2505 | }; | 2505 | }; |
2506 | 2506 | ||
2507 | static struct clk gpt5_fck = { | 2507 | static struct clk gpt5_fck = { |
2508 | .name = "gpt5_fck", | 2508 | .name = "gpt5_fck", |
2509 | .ops = &clkops_omap2_dflt_wait, | 2509 | .ops = &clkops_omap2_dflt_wait, |
2510 | .init = &omap2_init_clksel_parent, | 2510 | .init = &omap2_init_clksel_parent, |
2511 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN), | 2511 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN), |
2512 | .enable_bit = OMAP3430_EN_GPT5_SHIFT, | 2512 | .enable_bit = OMAP3430_EN_GPT5_SHIFT, |
2513 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL), | 2513 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL), |
2514 | .clksel_mask = OMAP3430_CLKSEL_GPT5_MASK, | 2514 | .clksel_mask = OMAP3430_CLKSEL_GPT5_MASK, |
2515 | .clksel = omap343x_gpt_clksel, | 2515 | .clksel = omap343x_gpt_clksel, |
2516 | .clkdm_name = "per_clkdm", | 2516 | .clkdm_name = "per_clkdm", |
2517 | .recalc = &omap2_clksel_recalc, | 2517 | .recalc = &omap2_clksel_recalc, |
2518 | }; | 2518 | }; |
2519 | 2519 | ||
2520 | static struct clk gpt6_fck = { | 2520 | static struct clk gpt6_fck = { |
2521 | .name = "gpt6_fck", | 2521 | .name = "gpt6_fck", |
2522 | .ops = &clkops_omap2_dflt_wait, | 2522 | .ops = &clkops_omap2_dflt_wait, |
2523 | .init = &omap2_init_clksel_parent, | 2523 | .init = &omap2_init_clksel_parent, |
2524 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN), | 2524 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN), |
2525 | .enable_bit = OMAP3430_EN_GPT6_SHIFT, | 2525 | .enable_bit = OMAP3430_EN_GPT6_SHIFT, |
2526 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL), | 2526 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL), |
2527 | .clksel_mask = OMAP3430_CLKSEL_GPT6_MASK, | 2527 | .clksel_mask = OMAP3430_CLKSEL_GPT6_MASK, |
2528 | .clksel = omap343x_gpt_clksel, | 2528 | .clksel = omap343x_gpt_clksel, |
2529 | .clkdm_name = "per_clkdm", | 2529 | .clkdm_name = "per_clkdm", |
2530 | .recalc = &omap2_clksel_recalc, | 2530 | .recalc = &omap2_clksel_recalc, |
2531 | }; | 2531 | }; |
2532 | 2532 | ||
2533 | static struct clk gpt7_fck = { | 2533 | static struct clk gpt7_fck = { |
2534 | .name = "gpt7_fck", | 2534 | .name = "gpt7_fck", |
2535 | .ops = &clkops_omap2_dflt_wait, | 2535 | .ops = &clkops_omap2_dflt_wait, |
2536 | .init = &omap2_init_clksel_parent, | 2536 | .init = &omap2_init_clksel_parent, |
2537 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN), | 2537 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN), |
2538 | .enable_bit = OMAP3430_EN_GPT7_SHIFT, | 2538 | .enable_bit = OMAP3430_EN_GPT7_SHIFT, |
2539 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL), | 2539 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL), |
2540 | .clksel_mask = OMAP3430_CLKSEL_GPT7_MASK, | 2540 | .clksel_mask = OMAP3430_CLKSEL_GPT7_MASK, |
2541 | .clksel = omap343x_gpt_clksel, | 2541 | .clksel = omap343x_gpt_clksel, |
2542 | .clkdm_name = "per_clkdm", | 2542 | .clkdm_name = "per_clkdm", |
2543 | .recalc = &omap2_clksel_recalc, | 2543 | .recalc = &omap2_clksel_recalc, |
2544 | }; | 2544 | }; |
2545 | 2545 | ||
2546 | static struct clk gpt8_fck = { | 2546 | static struct clk gpt8_fck = { |
2547 | .name = "gpt8_fck", | 2547 | .name = "gpt8_fck", |
2548 | .ops = &clkops_omap2_dflt_wait, | 2548 | .ops = &clkops_omap2_dflt_wait, |
2549 | .init = &omap2_init_clksel_parent, | 2549 | .init = &omap2_init_clksel_parent, |
2550 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN), | 2550 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN), |
2551 | .enable_bit = OMAP3430_EN_GPT8_SHIFT, | 2551 | .enable_bit = OMAP3430_EN_GPT8_SHIFT, |
2552 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL), | 2552 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL), |
2553 | .clksel_mask = OMAP3430_CLKSEL_GPT8_MASK, | 2553 | .clksel_mask = OMAP3430_CLKSEL_GPT8_MASK, |
2554 | .clksel = omap343x_gpt_clksel, | 2554 | .clksel = omap343x_gpt_clksel, |
2555 | .clkdm_name = "per_clkdm", | 2555 | .clkdm_name = "per_clkdm", |
2556 | .recalc = &omap2_clksel_recalc, | 2556 | .recalc = &omap2_clksel_recalc, |
2557 | }; | 2557 | }; |
2558 | 2558 | ||
2559 | static struct clk gpt9_fck = { | 2559 | static struct clk gpt9_fck = { |
2560 | .name = "gpt9_fck", | 2560 | .name = "gpt9_fck", |
2561 | .ops = &clkops_omap2_dflt_wait, | 2561 | .ops = &clkops_omap2_dflt_wait, |
2562 | .init = &omap2_init_clksel_parent, | 2562 | .init = &omap2_init_clksel_parent, |
2563 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN), | 2563 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN), |
2564 | .enable_bit = OMAP3430_EN_GPT9_SHIFT, | 2564 | .enable_bit = OMAP3430_EN_GPT9_SHIFT, |
2565 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL), | 2565 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL), |
2566 | .clksel_mask = OMAP3430_CLKSEL_GPT9_MASK, | 2566 | .clksel_mask = OMAP3430_CLKSEL_GPT9_MASK, |
2567 | .clksel = omap343x_gpt_clksel, | 2567 | .clksel = omap343x_gpt_clksel, |
2568 | .clkdm_name = "per_clkdm", | 2568 | .clkdm_name = "per_clkdm", |
2569 | .recalc = &omap2_clksel_recalc, | 2569 | .recalc = &omap2_clksel_recalc, |
2570 | }; | 2570 | }; |
2571 | 2571 | ||
2572 | static struct clk per_32k_alwon_fck = { | 2572 | static struct clk per_32k_alwon_fck = { |
2573 | .name = "per_32k_alwon_fck", | 2573 | .name = "per_32k_alwon_fck", |
2574 | .ops = &clkops_null, | 2574 | .ops = &clkops_null, |
2575 | .parent = &omap_32k_fck, | 2575 | .parent = &omap_32k_fck, |
2576 | .clkdm_name = "per_clkdm", | 2576 | .clkdm_name = "per_clkdm", |
2577 | .recalc = &followparent_recalc, | 2577 | .recalc = &followparent_recalc, |
2578 | }; | 2578 | }; |
2579 | 2579 | ||
2580 | static struct clk gpio6_dbck = { | 2580 | static struct clk gpio6_dbck = { |
2581 | .name = "gpio6_dbck", | 2581 | .name = "gpio6_dbck", |
2582 | .ops = &clkops_omap2_dflt, | 2582 | .ops = &clkops_omap2_dflt, |
2583 | .parent = &per_32k_alwon_fck, | 2583 | .parent = &per_32k_alwon_fck, |
2584 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN), | 2584 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN), |
2585 | .enable_bit = OMAP3430_EN_GPIO6_SHIFT, | 2585 | .enable_bit = OMAP3430_EN_GPIO6_SHIFT, |
2586 | .clkdm_name = "per_clkdm", | 2586 | .clkdm_name = "per_clkdm", |
2587 | .recalc = &followparent_recalc, | 2587 | .recalc = &followparent_recalc, |
2588 | }; | 2588 | }; |
2589 | 2589 | ||
2590 | static struct clk gpio5_dbck = { | 2590 | static struct clk gpio5_dbck = { |
2591 | .name = "gpio5_dbck", | 2591 | .name = "gpio5_dbck", |
2592 | .ops = &clkops_omap2_dflt, | 2592 | .ops = &clkops_omap2_dflt, |
2593 | .parent = &per_32k_alwon_fck, | 2593 | .parent = &per_32k_alwon_fck, |
2594 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN), | 2594 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN), |
2595 | .enable_bit = OMAP3430_EN_GPIO5_SHIFT, | 2595 | .enable_bit = OMAP3430_EN_GPIO5_SHIFT, |
2596 | .clkdm_name = "per_clkdm", | 2596 | .clkdm_name = "per_clkdm", |
2597 | .recalc = &followparent_recalc, | 2597 | .recalc = &followparent_recalc, |
2598 | }; | 2598 | }; |
2599 | 2599 | ||
2600 | static struct clk gpio4_dbck = { | 2600 | static struct clk gpio4_dbck = { |
2601 | .name = "gpio4_dbck", | 2601 | .name = "gpio4_dbck", |
2602 | .ops = &clkops_omap2_dflt, | 2602 | .ops = &clkops_omap2_dflt, |
2603 | .parent = &per_32k_alwon_fck, | 2603 | .parent = &per_32k_alwon_fck, |
2604 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN), | 2604 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN), |
2605 | .enable_bit = OMAP3430_EN_GPIO4_SHIFT, | 2605 | .enable_bit = OMAP3430_EN_GPIO4_SHIFT, |
2606 | .clkdm_name = "per_clkdm", | 2606 | .clkdm_name = "per_clkdm", |
2607 | .recalc = &followparent_recalc, | 2607 | .recalc = &followparent_recalc, |
2608 | }; | 2608 | }; |
2609 | 2609 | ||
2610 | static struct clk gpio3_dbck = { | 2610 | static struct clk gpio3_dbck = { |
2611 | .name = "gpio3_dbck", | 2611 | .name = "gpio3_dbck", |
2612 | .ops = &clkops_omap2_dflt, | 2612 | .ops = &clkops_omap2_dflt, |
2613 | .parent = &per_32k_alwon_fck, | 2613 | .parent = &per_32k_alwon_fck, |
2614 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN), | 2614 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN), |
2615 | .enable_bit = OMAP3430_EN_GPIO3_SHIFT, | 2615 | .enable_bit = OMAP3430_EN_GPIO3_SHIFT, |
2616 | .clkdm_name = "per_clkdm", | 2616 | .clkdm_name = "per_clkdm", |
2617 | .recalc = &followparent_recalc, | 2617 | .recalc = &followparent_recalc, |
2618 | }; | 2618 | }; |
2619 | 2619 | ||
2620 | static struct clk gpio2_dbck = { | 2620 | static struct clk gpio2_dbck = { |
2621 | .name = "gpio2_dbck", | 2621 | .name = "gpio2_dbck", |
2622 | .ops = &clkops_omap2_dflt, | 2622 | .ops = &clkops_omap2_dflt, |
2623 | .parent = &per_32k_alwon_fck, | 2623 | .parent = &per_32k_alwon_fck, |
2624 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN), | 2624 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN), |
2625 | .enable_bit = OMAP3430_EN_GPIO2_SHIFT, | 2625 | .enable_bit = OMAP3430_EN_GPIO2_SHIFT, |
2626 | .clkdm_name = "per_clkdm", | 2626 | .clkdm_name = "per_clkdm", |
2627 | .recalc = &followparent_recalc, | 2627 | .recalc = &followparent_recalc, |
2628 | }; | 2628 | }; |
2629 | 2629 | ||
2630 | static struct clk wdt3_fck = { | 2630 | static struct clk wdt3_fck = { |
2631 | .name = "wdt3_fck", | 2631 | .name = "wdt3_fck", |
2632 | .ops = &clkops_omap2_dflt_wait, | 2632 | .ops = &clkops_omap2_dflt_wait, |
2633 | .parent = &per_32k_alwon_fck, | 2633 | .parent = &per_32k_alwon_fck, |
2634 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN), | 2634 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN), |
2635 | .enable_bit = OMAP3430_EN_WDT3_SHIFT, | 2635 | .enable_bit = OMAP3430_EN_WDT3_SHIFT, |
2636 | .clkdm_name = "per_clkdm", | 2636 | .clkdm_name = "per_clkdm", |
2637 | .recalc = &followparent_recalc, | 2637 | .recalc = &followparent_recalc, |
2638 | }; | 2638 | }; |
2639 | 2639 | ||
2640 | static struct clk per_l4_ick = { | 2640 | static struct clk per_l4_ick = { |
2641 | .name = "per_l4_ick", | 2641 | .name = "per_l4_ick", |
2642 | .ops = &clkops_null, | 2642 | .ops = &clkops_null, |
2643 | .parent = &l4_ick, | 2643 | .parent = &l4_ick, |
2644 | .clkdm_name = "per_clkdm", | 2644 | .clkdm_name = "per_clkdm", |
2645 | .recalc = &followparent_recalc, | 2645 | .recalc = &followparent_recalc, |
2646 | }; | 2646 | }; |
2647 | 2647 | ||
2648 | static struct clk gpio6_ick = { | 2648 | static struct clk gpio6_ick = { |
2649 | .name = "gpio6_ick", | 2649 | .name = "gpio6_ick", |
2650 | .ops = &clkops_omap2_dflt_wait, | 2650 | .ops = &clkops_omap2_dflt_wait, |
2651 | .parent = &per_l4_ick, | 2651 | .parent = &per_l4_ick, |
2652 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), | 2652 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), |
2653 | .enable_bit = OMAP3430_EN_GPIO6_SHIFT, | 2653 | .enable_bit = OMAP3430_EN_GPIO6_SHIFT, |
2654 | .clkdm_name = "per_clkdm", | 2654 | .clkdm_name = "per_clkdm", |
2655 | .recalc = &followparent_recalc, | 2655 | .recalc = &followparent_recalc, |
2656 | }; | 2656 | }; |
2657 | 2657 | ||
2658 | static struct clk gpio5_ick = { | 2658 | static struct clk gpio5_ick = { |
2659 | .name = "gpio5_ick", | 2659 | .name = "gpio5_ick", |
2660 | .ops = &clkops_omap2_dflt_wait, | 2660 | .ops = &clkops_omap2_dflt_wait, |
2661 | .parent = &per_l4_ick, | 2661 | .parent = &per_l4_ick, |
2662 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), | 2662 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), |
2663 | .enable_bit = OMAP3430_EN_GPIO5_SHIFT, | 2663 | .enable_bit = OMAP3430_EN_GPIO5_SHIFT, |
2664 | .clkdm_name = "per_clkdm", | 2664 | .clkdm_name = "per_clkdm", |
2665 | .recalc = &followparent_recalc, | 2665 | .recalc = &followparent_recalc, |
2666 | }; | 2666 | }; |
2667 | 2667 | ||
2668 | static struct clk gpio4_ick = { | 2668 | static struct clk gpio4_ick = { |
2669 | .name = "gpio4_ick", | 2669 | .name = "gpio4_ick", |
2670 | .ops = &clkops_omap2_dflt_wait, | 2670 | .ops = &clkops_omap2_dflt_wait, |
2671 | .parent = &per_l4_ick, | 2671 | .parent = &per_l4_ick, |
2672 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), | 2672 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), |
2673 | .enable_bit = OMAP3430_EN_GPIO4_SHIFT, | 2673 | .enable_bit = OMAP3430_EN_GPIO4_SHIFT, |
2674 | .clkdm_name = "per_clkdm", | 2674 | .clkdm_name = "per_clkdm", |
2675 | .recalc = &followparent_recalc, | 2675 | .recalc = &followparent_recalc, |
2676 | }; | 2676 | }; |
2677 | 2677 | ||
2678 | static struct clk gpio3_ick = { | 2678 | static struct clk gpio3_ick = { |
2679 | .name = "gpio3_ick", | 2679 | .name = "gpio3_ick", |
2680 | .ops = &clkops_omap2_dflt_wait, | 2680 | .ops = &clkops_omap2_dflt_wait, |
2681 | .parent = &per_l4_ick, | 2681 | .parent = &per_l4_ick, |
2682 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), | 2682 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), |
2683 | .enable_bit = OMAP3430_EN_GPIO3_SHIFT, | 2683 | .enable_bit = OMAP3430_EN_GPIO3_SHIFT, |
2684 | .clkdm_name = "per_clkdm", | 2684 | .clkdm_name = "per_clkdm", |
2685 | .recalc = &followparent_recalc, | 2685 | .recalc = &followparent_recalc, |
2686 | }; | 2686 | }; |
2687 | 2687 | ||
2688 | static struct clk gpio2_ick = { | 2688 | static struct clk gpio2_ick = { |
2689 | .name = "gpio2_ick", | 2689 | .name = "gpio2_ick", |
2690 | .ops = &clkops_omap2_dflt_wait, | 2690 | .ops = &clkops_omap2_dflt_wait, |
2691 | .parent = &per_l4_ick, | 2691 | .parent = &per_l4_ick, |
2692 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), | 2692 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), |
2693 | .enable_bit = OMAP3430_EN_GPIO2_SHIFT, | 2693 | .enable_bit = OMAP3430_EN_GPIO2_SHIFT, |
2694 | .clkdm_name = "per_clkdm", | 2694 | .clkdm_name = "per_clkdm", |
2695 | .recalc = &followparent_recalc, | 2695 | .recalc = &followparent_recalc, |
2696 | }; | 2696 | }; |
2697 | 2697 | ||
2698 | static struct clk wdt3_ick = { | 2698 | static struct clk wdt3_ick = { |
2699 | .name = "wdt3_ick", | 2699 | .name = "wdt3_ick", |
2700 | .ops = &clkops_omap2_dflt_wait, | 2700 | .ops = &clkops_omap2_dflt_wait, |
2701 | .parent = &per_l4_ick, | 2701 | .parent = &per_l4_ick, |
2702 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), | 2702 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), |
2703 | .enable_bit = OMAP3430_EN_WDT3_SHIFT, | 2703 | .enable_bit = OMAP3430_EN_WDT3_SHIFT, |
2704 | .clkdm_name = "per_clkdm", | 2704 | .clkdm_name = "per_clkdm", |
2705 | .recalc = &followparent_recalc, | 2705 | .recalc = &followparent_recalc, |
2706 | }; | 2706 | }; |
2707 | 2707 | ||
2708 | static struct clk uart3_ick = { | 2708 | static struct clk uart3_ick = { |
2709 | .name = "uart3_ick", | 2709 | .name = "uart3_ick", |
2710 | .ops = &clkops_omap2_dflt_wait, | 2710 | .ops = &clkops_omap2_dflt_wait, |
2711 | .parent = &per_l4_ick, | 2711 | .parent = &per_l4_ick, |
2712 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), | 2712 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), |
2713 | .enable_bit = OMAP3430_EN_UART3_SHIFT, | 2713 | .enable_bit = OMAP3430_EN_UART3_SHIFT, |
2714 | .clkdm_name = "per_clkdm", | 2714 | .clkdm_name = "per_clkdm", |
2715 | .recalc = &followparent_recalc, | 2715 | .recalc = &followparent_recalc, |
2716 | }; | 2716 | }; |
2717 | 2717 | ||
2718 | static struct clk gpt9_ick = { | 2718 | static struct clk gpt9_ick = { |
2719 | .name = "gpt9_ick", | 2719 | .name = "gpt9_ick", |
2720 | .ops = &clkops_omap2_dflt_wait, | 2720 | .ops = &clkops_omap2_dflt_wait, |
2721 | .parent = &per_l4_ick, | 2721 | .parent = &per_l4_ick, |
2722 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), | 2722 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), |
2723 | .enable_bit = OMAP3430_EN_GPT9_SHIFT, | 2723 | .enable_bit = OMAP3430_EN_GPT9_SHIFT, |
2724 | .clkdm_name = "per_clkdm", | 2724 | .clkdm_name = "per_clkdm", |
2725 | .recalc = &followparent_recalc, | 2725 | .recalc = &followparent_recalc, |
2726 | }; | 2726 | }; |
2727 | 2727 | ||
2728 | static struct clk gpt8_ick = { | 2728 | static struct clk gpt8_ick = { |
2729 | .name = "gpt8_ick", | 2729 | .name = "gpt8_ick", |
2730 | .ops = &clkops_omap2_dflt_wait, | 2730 | .ops = &clkops_omap2_dflt_wait, |
2731 | .parent = &per_l4_ick, | 2731 | .parent = &per_l4_ick, |
2732 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), | 2732 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), |
2733 | .enable_bit = OMAP3430_EN_GPT8_SHIFT, | 2733 | .enable_bit = OMAP3430_EN_GPT8_SHIFT, |
2734 | .clkdm_name = "per_clkdm", | 2734 | .clkdm_name = "per_clkdm", |
2735 | .recalc = &followparent_recalc, | 2735 | .recalc = &followparent_recalc, |
2736 | }; | 2736 | }; |
2737 | 2737 | ||
2738 | static struct clk gpt7_ick = { | 2738 | static struct clk gpt7_ick = { |
2739 | .name = "gpt7_ick", | 2739 | .name = "gpt7_ick", |
2740 | .ops = &clkops_omap2_dflt_wait, | 2740 | .ops = &clkops_omap2_dflt_wait, |
2741 | .parent = &per_l4_ick, | 2741 | .parent = &per_l4_ick, |
2742 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), | 2742 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), |
2743 | .enable_bit = OMAP3430_EN_GPT7_SHIFT, | 2743 | .enable_bit = OMAP3430_EN_GPT7_SHIFT, |
2744 | .clkdm_name = "per_clkdm", | 2744 | .clkdm_name = "per_clkdm", |
2745 | .recalc = &followparent_recalc, | 2745 | .recalc = &followparent_recalc, |
2746 | }; | 2746 | }; |
2747 | 2747 | ||
2748 | static struct clk gpt6_ick = { | 2748 | static struct clk gpt6_ick = { |
2749 | .name = "gpt6_ick", | 2749 | .name = "gpt6_ick", |
2750 | .ops = &clkops_omap2_dflt_wait, | 2750 | .ops = &clkops_omap2_dflt_wait, |
2751 | .parent = &per_l4_ick, | 2751 | .parent = &per_l4_ick, |
2752 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), | 2752 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), |
2753 | .enable_bit = OMAP3430_EN_GPT6_SHIFT, | 2753 | .enable_bit = OMAP3430_EN_GPT6_SHIFT, |
2754 | .clkdm_name = "per_clkdm", | 2754 | .clkdm_name = "per_clkdm", |
2755 | .recalc = &followparent_recalc, | 2755 | .recalc = &followparent_recalc, |
2756 | }; | 2756 | }; |
2757 | 2757 | ||
2758 | static struct clk gpt5_ick = { | 2758 | static struct clk gpt5_ick = { |
2759 | .name = "gpt5_ick", | 2759 | .name = "gpt5_ick", |
2760 | .ops = &clkops_omap2_dflt_wait, | 2760 | .ops = &clkops_omap2_dflt_wait, |
2761 | .parent = &per_l4_ick, | 2761 | .parent = &per_l4_ick, |
2762 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), | 2762 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), |
2763 | .enable_bit = OMAP3430_EN_GPT5_SHIFT, | 2763 | .enable_bit = OMAP3430_EN_GPT5_SHIFT, |
2764 | .clkdm_name = "per_clkdm", | 2764 | .clkdm_name = "per_clkdm", |
2765 | .recalc = &followparent_recalc, | 2765 | .recalc = &followparent_recalc, |
2766 | }; | 2766 | }; |
2767 | 2767 | ||
2768 | static struct clk gpt4_ick = { | 2768 | static struct clk gpt4_ick = { |
2769 | .name = "gpt4_ick", | 2769 | .name = "gpt4_ick", |
2770 | .ops = &clkops_omap2_dflt_wait, | 2770 | .ops = &clkops_omap2_dflt_wait, |
2771 | .parent = &per_l4_ick, | 2771 | .parent = &per_l4_ick, |
2772 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), | 2772 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), |
2773 | .enable_bit = OMAP3430_EN_GPT4_SHIFT, | 2773 | .enable_bit = OMAP3430_EN_GPT4_SHIFT, |
2774 | .clkdm_name = "per_clkdm", | 2774 | .clkdm_name = "per_clkdm", |
2775 | .recalc = &followparent_recalc, | 2775 | .recalc = &followparent_recalc, |
2776 | }; | 2776 | }; |
2777 | 2777 | ||
2778 | static struct clk gpt3_ick = { | 2778 | static struct clk gpt3_ick = { |
2779 | .name = "gpt3_ick", | 2779 | .name = "gpt3_ick", |
2780 | .ops = &clkops_omap2_dflt_wait, | 2780 | .ops = &clkops_omap2_dflt_wait, |
2781 | .parent = &per_l4_ick, | 2781 | .parent = &per_l4_ick, |
2782 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), | 2782 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), |
2783 | .enable_bit = OMAP3430_EN_GPT3_SHIFT, | 2783 | .enable_bit = OMAP3430_EN_GPT3_SHIFT, |
2784 | .clkdm_name = "per_clkdm", | 2784 | .clkdm_name = "per_clkdm", |
2785 | .recalc = &followparent_recalc, | 2785 | .recalc = &followparent_recalc, |
2786 | }; | 2786 | }; |
2787 | 2787 | ||
2788 | static struct clk gpt2_ick = { | 2788 | static struct clk gpt2_ick = { |
2789 | .name = "gpt2_ick", | 2789 | .name = "gpt2_ick", |
2790 | .ops = &clkops_omap2_dflt_wait, | 2790 | .ops = &clkops_omap2_dflt_wait, |
2791 | .parent = &per_l4_ick, | 2791 | .parent = &per_l4_ick, |
2792 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), | 2792 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), |
2793 | .enable_bit = OMAP3430_EN_GPT2_SHIFT, | 2793 | .enable_bit = OMAP3430_EN_GPT2_SHIFT, |
2794 | .clkdm_name = "per_clkdm", | 2794 | .clkdm_name = "per_clkdm", |
2795 | .recalc = &followparent_recalc, | 2795 | .recalc = &followparent_recalc, |
2796 | }; | 2796 | }; |
2797 | 2797 | ||
2798 | static struct clk mcbsp2_ick = { | 2798 | static struct clk mcbsp2_ick = { |
2799 | .name = "mcbsp2_ick", | 2799 | .name = "mcbsp2_ick", |
2800 | .ops = &clkops_omap2_dflt_wait, | 2800 | .ops = &clkops_omap2_dflt_wait, |
2801 | .parent = &per_l4_ick, | 2801 | .parent = &per_l4_ick, |
2802 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), | 2802 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), |
2803 | .enable_bit = OMAP3430_EN_MCBSP2_SHIFT, | 2803 | .enable_bit = OMAP3430_EN_MCBSP2_SHIFT, |
2804 | .clkdm_name = "per_clkdm", | 2804 | .clkdm_name = "per_clkdm", |
2805 | .recalc = &followparent_recalc, | 2805 | .recalc = &followparent_recalc, |
2806 | }; | 2806 | }; |
2807 | 2807 | ||
2808 | static struct clk mcbsp3_ick = { | 2808 | static struct clk mcbsp3_ick = { |
2809 | .name = "mcbsp3_ick", | 2809 | .name = "mcbsp3_ick", |
2810 | .ops = &clkops_omap2_dflt_wait, | 2810 | .ops = &clkops_omap2_dflt_wait, |
2811 | .parent = &per_l4_ick, | 2811 | .parent = &per_l4_ick, |
2812 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), | 2812 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), |
2813 | .enable_bit = OMAP3430_EN_MCBSP3_SHIFT, | 2813 | .enable_bit = OMAP3430_EN_MCBSP3_SHIFT, |
2814 | .clkdm_name = "per_clkdm", | 2814 | .clkdm_name = "per_clkdm", |
2815 | .recalc = &followparent_recalc, | 2815 | .recalc = &followparent_recalc, |
2816 | }; | 2816 | }; |
2817 | 2817 | ||
2818 | static struct clk mcbsp4_ick = { | 2818 | static struct clk mcbsp4_ick = { |
2819 | .name = "mcbsp4_ick", | 2819 | .name = "mcbsp4_ick", |
2820 | .ops = &clkops_omap2_dflt_wait, | 2820 | .ops = &clkops_omap2_dflt_wait, |
2821 | .parent = &per_l4_ick, | 2821 | .parent = &per_l4_ick, |
2822 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), | 2822 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN), |
2823 | .enable_bit = OMAP3430_EN_MCBSP4_SHIFT, | 2823 | .enable_bit = OMAP3430_EN_MCBSP4_SHIFT, |
2824 | .clkdm_name = "per_clkdm", | 2824 | .clkdm_name = "per_clkdm", |
2825 | .recalc = &followparent_recalc, | 2825 | .recalc = &followparent_recalc, |
2826 | }; | 2826 | }; |
2827 | 2827 | ||
2828 | static const struct clksel mcbsp_234_clksel[] = { | 2828 | static const struct clksel mcbsp_234_clksel[] = { |
2829 | { .parent = &per_96m_fck, .rates = common_mcbsp_96m_rates }, | 2829 | { .parent = &per_96m_fck, .rates = common_mcbsp_96m_rates }, |
2830 | { .parent = &mcbsp_clks, .rates = common_mcbsp_mcbsp_rates }, | 2830 | { .parent = &mcbsp_clks, .rates = common_mcbsp_mcbsp_rates }, |
2831 | { .parent = NULL } | 2831 | { .parent = NULL } |
2832 | }; | 2832 | }; |
2833 | 2833 | ||
2834 | static struct clk mcbsp2_fck = { | 2834 | static struct clk mcbsp2_fck = { |
2835 | .name = "mcbsp2_fck", | 2835 | .name = "mcbsp2_fck", |
2836 | .ops = &clkops_omap2_dflt_wait, | 2836 | .ops = &clkops_omap2_dflt_wait, |
2837 | .init = &omap2_init_clksel_parent, | 2837 | .init = &omap2_init_clksel_parent, |
2838 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN), | 2838 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN), |
2839 | .enable_bit = OMAP3430_EN_MCBSP2_SHIFT, | 2839 | .enable_bit = OMAP3430_EN_MCBSP2_SHIFT, |
2840 | .clksel_reg = OMAP343X_CTRL_REGADDR(OMAP2_CONTROL_DEVCONF0), | 2840 | .clksel_reg = OMAP343X_CTRL_REGADDR(OMAP2_CONTROL_DEVCONF0), |
2841 | .clksel_mask = OMAP2_MCBSP2_CLKS_MASK, | 2841 | .clksel_mask = OMAP2_MCBSP2_CLKS_MASK, |
2842 | .clksel = mcbsp_234_clksel, | 2842 | .clksel = mcbsp_234_clksel, |
2843 | .clkdm_name = "per_clkdm", | 2843 | .clkdm_name = "per_clkdm", |
2844 | .recalc = &omap2_clksel_recalc, | 2844 | .recalc = &omap2_clksel_recalc, |
2845 | }; | 2845 | }; |
2846 | 2846 | ||
2847 | static struct clk mcbsp3_fck = { | 2847 | static struct clk mcbsp3_fck = { |
2848 | .name = "mcbsp3_fck", | 2848 | .name = "mcbsp3_fck", |
2849 | .ops = &clkops_omap2_dflt_wait, | 2849 | .ops = &clkops_omap2_dflt_wait, |
2850 | .init = &omap2_init_clksel_parent, | 2850 | .init = &omap2_init_clksel_parent, |
2851 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN), | 2851 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN), |
2852 | .enable_bit = OMAP3430_EN_MCBSP3_SHIFT, | 2852 | .enable_bit = OMAP3430_EN_MCBSP3_SHIFT, |
2853 | .clksel_reg = OMAP343X_CTRL_REGADDR(OMAP343X_CONTROL_DEVCONF1), | 2853 | .clksel_reg = OMAP343X_CTRL_REGADDR(OMAP343X_CONTROL_DEVCONF1), |
2854 | .clksel_mask = OMAP2_MCBSP3_CLKS_MASK, | 2854 | .clksel_mask = OMAP2_MCBSP3_CLKS_MASK, |
2855 | .clksel = mcbsp_234_clksel, | 2855 | .clksel = mcbsp_234_clksel, |
2856 | .clkdm_name = "per_clkdm", | 2856 | .clkdm_name = "per_clkdm", |
2857 | .recalc = &omap2_clksel_recalc, | 2857 | .recalc = &omap2_clksel_recalc, |
2858 | }; | 2858 | }; |
2859 | 2859 | ||
2860 | static struct clk mcbsp4_fck = { | 2860 | static struct clk mcbsp4_fck = { |
2861 | .name = "mcbsp4_fck", | 2861 | .name = "mcbsp4_fck", |
2862 | .ops = &clkops_omap2_dflt_wait, | 2862 | .ops = &clkops_omap2_dflt_wait, |
2863 | .init = &omap2_init_clksel_parent, | 2863 | .init = &omap2_init_clksel_parent, |
2864 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN), | 2864 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN), |
2865 | .enable_bit = OMAP3430_EN_MCBSP4_SHIFT, | 2865 | .enable_bit = OMAP3430_EN_MCBSP4_SHIFT, |
2866 | .clksel_reg = OMAP343X_CTRL_REGADDR(OMAP343X_CONTROL_DEVCONF1), | 2866 | .clksel_reg = OMAP343X_CTRL_REGADDR(OMAP343X_CONTROL_DEVCONF1), |
2867 | .clksel_mask = OMAP2_MCBSP4_CLKS_MASK, | 2867 | .clksel_mask = OMAP2_MCBSP4_CLKS_MASK, |
2868 | .clksel = mcbsp_234_clksel, | 2868 | .clksel = mcbsp_234_clksel, |
2869 | .clkdm_name = "per_clkdm", | 2869 | .clkdm_name = "per_clkdm", |
2870 | .recalc = &omap2_clksel_recalc, | 2870 | .recalc = &omap2_clksel_recalc, |
2871 | }; | 2871 | }; |
2872 | 2872 | ||
2873 | /* EMU clocks */ | 2873 | /* EMU clocks */ |
2874 | 2874 | ||
2875 | /* More information: ARM Cortex-A8 Technical Reference Manual, sect 10.1 */ | 2875 | /* More information: ARM Cortex-A8 Technical Reference Manual, sect 10.1 */ |
2876 | 2876 | ||
2877 | static const struct clksel_rate emu_src_sys_rates[] = { | 2877 | static const struct clksel_rate emu_src_sys_rates[] = { |
2878 | { .div = 1, .val = 0, .flags = RATE_IN_3XXX }, | 2878 | { .div = 1, .val = 0, .flags = RATE_IN_3XXX }, |
2879 | { .div = 0 }, | 2879 | { .div = 0 }, |
2880 | }; | 2880 | }; |
2881 | 2881 | ||
2882 | static const struct clksel_rate emu_src_core_rates[] = { | 2882 | static const struct clksel_rate emu_src_core_rates[] = { |
2883 | { .div = 1, .val = 1, .flags = RATE_IN_3XXX }, | 2883 | { .div = 1, .val = 1, .flags = RATE_IN_3XXX }, |
2884 | { .div = 0 }, | 2884 | { .div = 0 }, |
2885 | }; | 2885 | }; |
2886 | 2886 | ||
2887 | static const struct clksel_rate emu_src_per_rates[] = { | 2887 | static const struct clksel_rate emu_src_per_rates[] = { |
2888 | { .div = 1, .val = 2, .flags = RATE_IN_3XXX }, | 2888 | { .div = 1, .val = 2, .flags = RATE_IN_3XXX }, |
2889 | { .div = 0 }, | 2889 | { .div = 0 }, |
2890 | }; | 2890 | }; |
2891 | 2891 | ||
2892 | static const struct clksel_rate emu_src_mpu_rates[] = { | 2892 | static const struct clksel_rate emu_src_mpu_rates[] = { |
2893 | { .div = 1, .val = 3, .flags = RATE_IN_3XXX }, | 2893 | { .div = 1, .val = 3, .flags = RATE_IN_3XXX }, |
2894 | { .div = 0 }, | 2894 | { .div = 0 }, |
2895 | }; | 2895 | }; |
2896 | 2896 | ||
2897 | static const struct clksel emu_src_clksel[] = { | 2897 | static const struct clksel emu_src_clksel[] = { |
2898 | { .parent = &sys_ck, .rates = emu_src_sys_rates }, | 2898 | { .parent = &sys_ck, .rates = emu_src_sys_rates }, |
2899 | { .parent = &emu_core_alwon_ck, .rates = emu_src_core_rates }, | 2899 | { .parent = &emu_core_alwon_ck, .rates = emu_src_core_rates }, |
2900 | { .parent = &emu_per_alwon_ck, .rates = emu_src_per_rates }, | 2900 | { .parent = &emu_per_alwon_ck, .rates = emu_src_per_rates }, |
2901 | { .parent = &emu_mpu_alwon_ck, .rates = emu_src_mpu_rates }, | 2901 | { .parent = &emu_mpu_alwon_ck, .rates = emu_src_mpu_rates }, |
2902 | { .parent = NULL }, | 2902 | { .parent = NULL }, |
2903 | }; | 2903 | }; |
2904 | 2904 | ||
2905 | /* | 2905 | /* |
2906 | * Like the clkout_src clocks, emu_src_clk is a virtual clock, existing only | 2906 | * Like the clkout_src clocks, emu_src_clk is a virtual clock, existing only |
2907 | * to switch the source of some of the EMU clocks. | 2907 | * to switch the source of some of the EMU clocks. |
2908 | * XXX Are there CLKEN bits for these EMU clks? | 2908 | * XXX Are there CLKEN bits for these EMU clks? |
2909 | */ | 2909 | */ |
2910 | static struct clk emu_src_ck = { | 2910 | static struct clk emu_src_ck = { |
2911 | .name = "emu_src_ck", | 2911 | .name = "emu_src_ck", |
2912 | .ops = &clkops_null, | 2912 | .ops = &clkops_null, |
2913 | .init = &omap2_init_clksel_parent, | 2913 | .init = &omap2_init_clksel_parent, |
2914 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1), | 2914 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1), |
2915 | .clksel_mask = OMAP3430_MUX_CTRL_MASK, | 2915 | .clksel_mask = OMAP3430_MUX_CTRL_MASK, |
2916 | .clksel = emu_src_clksel, | 2916 | .clksel = emu_src_clksel, |
2917 | .clkdm_name = "emu_clkdm", | 2917 | .clkdm_name = "emu_clkdm", |
2918 | .recalc = &omap2_clksel_recalc, | 2918 | .recalc = &omap2_clksel_recalc, |
2919 | }; | 2919 | }; |
2920 | 2920 | ||
2921 | static const struct clksel_rate pclk_emu_rates[] = { | 2921 | static const struct clksel_rate pclk_emu_rates[] = { |
2922 | { .div = 2, .val = 2, .flags = RATE_IN_3XXX }, | 2922 | { .div = 2, .val = 2, .flags = RATE_IN_3XXX }, |
2923 | { .div = 3, .val = 3, .flags = RATE_IN_3XXX }, | 2923 | { .div = 3, .val = 3, .flags = RATE_IN_3XXX }, |
2924 | { .div = 4, .val = 4, .flags = RATE_IN_3XXX }, | 2924 | { .div = 4, .val = 4, .flags = RATE_IN_3XXX }, |
2925 | { .div = 6, .val = 6, .flags = RATE_IN_3XXX }, | 2925 | { .div = 6, .val = 6, .flags = RATE_IN_3XXX }, |
2926 | { .div = 0 }, | 2926 | { .div = 0 }, |
2927 | }; | 2927 | }; |
2928 | 2928 | ||
2929 | static const struct clksel pclk_emu_clksel[] = { | 2929 | static const struct clksel pclk_emu_clksel[] = { |
2930 | { .parent = &emu_src_ck, .rates = pclk_emu_rates }, | 2930 | { .parent = &emu_src_ck, .rates = pclk_emu_rates }, |
2931 | { .parent = NULL }, | 2931 | { .parent = NULL }, |
2932 | }; | 2932 | }; |
2933 | 2933 | ||
2934 | static struct clk pclk_fck = { | 2934 | static struct clk pclk_fck = { |
2935 | .name = "pclk_fck", | 2935 | .name = "pclk_fck", |
2936 | .ops = &clkops_null, | 2936 | .ops = &clkops_null, |
2937 | .init = &omap2_init_clksel_parent, | 2937 | .init = &omap2_init_clksel_parent, |
2938 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1), | 2938 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1), |
2939 | .clksel_mask = OMAP3430_CLKSEL_PCLK_MASK, | 2939 | .clksel_mask = OMAP3430_CLKSEL_PCLK_MASK, |
2940 | .clksel = pclk_emu_clksel, | 2940 | .clksel = pclk_emu_clksel, |
2941 | .clkdm_name = "emu_clkdm", | 2941 | .clkdm_name = "emu_clkdm", |
2942 | .recalc = &omap2_clksel_recalc, | 2942 | .recalc = &omap2_clksel_recalc, |
2943 | }; | 2943 | }; |
2944 | 2944 | ||
2945 | static const struct clksel_rate pclkx2_emu_rates[] = { | 2945 | static const struct clksel_rate pclkx2_emu_rates[] = { |
2946 | { .div = 1, .val = 1, .flags = RATE_IN_3XXX }, | 2946 | { .div = 1, .val = 1, .flags = RATE_IN_3XXX }, |
2947 | { .div = 2, .val = 2, .flags = RATE_IN_3XXX }, | 2947 | { .div = 2, .val = 2, .flags = RATE_IN_3XXX }, |
2948 | { .div = 3, .val = 3, .flags = RATE_IN_3XXX }, | 2948 | { .div = 3, .val = 3, .flags = RATE_IN_3XXX }, |
2949 | { .div = 0 }, | 2949 | { .div = 0 }, |
2950 | }; | 2950 | }; |
2951 | 2951 | ||
2952 | static const struct clksel pclkx2_emu_clksel[] = { | 2952 | static const struct clksel pclkx2_emu_clksel[] = { |
2953 | { .parent = &emu_src_ck, .rates = pclkx2_emu_rates }, | 2953 | { .parent = &emu_src_ck, .rates = pclkx2_emu_rates }, |
2954 | { .parent = NULL }, | 2954 | { .parent = NULL }, |
2955 | }; | 2955 | }; |
2956 | 2956 | ||
2957 | static struct clk pclkx2_fck = { | 2957 | static struct clk pclkx2_fck = { |
2958 | .name = "pclkx2_fck", | 2958 | .name = "pclkx2_fck", |
2959 | .ops = &clkops_null, | 2959 | .ops = &clkops_null, |
2960 | .init = &omap2_init_clksel_parent, | 2960 | .init = &omap2_init_clksel_parent, |
2961 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1), | 2961 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1), |
2962 | .clksel_mask = OMAP3430_CLKSEL_PCLKX2_MASK, | 2962 | .clksel_mask = OMAP3430_CLKSEL_PCLKX2_MASK, |
2963 | .clksel = pclkx2_emu_clksel, | 2963 | .clksel = pclkx2_emu_clksel, |
2964 | .clkdm_name = "emu_clkdm", | 2964 | .clkdm_name = "emu_clkdm", |
2965 | .recalc = &omap2_clksel_recalc, | 2965 | .recalc = &omap2_clksel_recalc, |
2966 | }; | 2966 | }; |
2967 | 2967 | ||
2968 | static const struct clksel atclk_emu_clksel[] = { | 2968 | static const struct clksel atclk_emu_clksel[] = { |
2969 | { .parent = &emu_src_ck, .rates = div2_rates }, | 2969 | { .parent = &emu_src_ck, .rates = div2_rates }, |
2970 | { .parent = NULL }, | 2970 | { .parent = NULL }, |
2971 | }; | 2971 | }; |
2972 | 2972 | ||
2973 | static struct clk atclk_fck = { | 2973 | static struct clk atclk_fck = { |
2974 | .name = "atclk_fck", | 2974 | .name = "atclk_fck", |
2975 | .ops = &clkops_null, | 2975 | .ops = &clkops_null, |
2976 | .init = &omap2_init_clksel_parent, | 2976 | .init = &omap2_init_clksel_parent, |
2977 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1), | 2977 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1), |
2978 | .clksel_mask = OMAP3430_CLKSEL_ATCLK_MASK, | 2978 | .clksel_mask = OMAP3430_CLKSEL_ATCLK_MASK, |
2979 | .clksel = atclk_emu_clksel, | 2979 | .clksel = atclk_emu_clksel, |
2980 | .clkdm_name = "emu_clkdm", | 2980 | .clkdm_name = "emu_clkdm", |
2981 | .recalc = &omap2_clksel_recalc, | 2981 | .recalc = &omap2_clksel_recalc, |
2982 | }; | 2982 | }; |
2983 | 2983 | ||
2984 | static struct clk traceclk_src_fck = { | 2984 | static struct clk traceclk_src_fck = { |
2985 | .name = "traceclk_src_fck", | 2985 | .name = "traceclk_src_fck", |
2986 | .ops = &clkops_null, | 2986 | .ops = &clkops_null, |
2987 | .init = &omap2_init_clksel_parent, | 2987 | .init = &omap2_init_clksel_parent, |
2988 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1), | 2988 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1), |
2989 | .clksel_mask = OMAP3430_TRACE_MUX_CTRL_MASK, | 2989 | .clksel_mask = OMAP3430_TRACE_MUX_CTRL_MASK, |
2990 | .clksel = emu_src_clksel, | 2990 | .clksel = emu_src_clksel, |
2991 | .clkdm_name = "emu_clkdm", | 2991 | .clkdm_name = "emu_clkdm", |
2992 | .recalc = &omap2_clksel_recalc, | 2992 | .recalc = &omap2_clksel_recalc, |
2993 | }; | 2993 | }; |
2994 | 2994 | ||
2995 | static const struct clksel_rate traceclk_rates[] = { | 2995 | static const struct clksel_rate traceclk_rates[] = { |
2996 | { .div = 1, .val = 1, .flags = RATE_IN_3XXX }, | 2996 | { .div = 1, .val = 1, .flags = RATE_IN_3XXX }, |
2997 | { .div = 2, .val = 2, .flags = RATE_IN_3XXX }, | 2997 | { .div = 2, .val = 2, .flags = RATE_IN_3XXX }, |
2998 | { .div = 4, .val = 4, .flags = RATE_IN_3XXX }, | 2998 | { .div = 4, .val = 4, .flags = RATE_IN_3XXX }, |
2999 | { .div = 0 }, | 2999 | { .div = 0 }, |
3000 | }; | 3000 | }; |
3001 | 3001 | ||
3002 | static const struct clksel traceclk_clksel[] = { | 3002 | static const struct clksel traceclk_clksel[] = { |
3003 | { .parent = &traceclk_src_fck, .rates = traceclk_rates }, | 3003 | { .parent = &traceclk_src_fck, .rates = traceclk_rates }, |
3004 | { .parent = NULL }, | 3004 | { .parent = NULL }, |
3005 | }; | 3005 | }; |
3006 | 3006 | ||
3007 | static struct clk traceclk_fck = { | 3007 | static struct clk traceclk_fck = { |
3008 | .name = "traceclk_fck", | 3008 | .name = "traceclk_fck", |
3009 | .ops = &clkops_null, | 3009 | .ops = &clkops_null, |
3010 | .init = &omap2_init_clksel_parent, | 3010 | .init = &omap2_init_clksel_parent, |
3011 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1), | 3011 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1), |
3012 | .clksel_mask = OMAP3430_CLKSEL_TRACECLK_MASK, | 3012 | .clksel_mask = OMAP3430_CLKSEL_TRACECLK_MASK, |
3013 | .clksel = traceclk_clksel, | 3013 | .clksel = traceclk_clksel, |
3014 | .clkdm_name = "emu_clkdm", | 3014 | .clkdm_name = "emu_clkdm", |
3015 | .recalc = &omap2_clksel_recalc, | 3015 | .recalc = &omap2_clksel_recalc, |
3016 | }; | 3016 | }; |
3017 | 3017 | ||
3018 | /* SR clocks */ | 3018 | /* SR clocks */ |
3019 | 3019 | ||
3020 | /* SmartReflex fclk (VDD1) */ | 3020 | /* SmartReflex fclk (VDD1) */ |
3021 | static struct clk sr1_fck = { | 3021 | static struct clk sr1_fck = { |
3022 | .name = "sr1_fck", | 3022 | .name = "sr1_fck", |
3023 | .ops = &clkops_omap2_dflt_wait, | 3023 | .ops = &clkops_omap2_dflt_wait, |
3024 | .parent = &sys_ck, | 3024 | .parent = &sys_ck, |
3025 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN), | 3025 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN), |
3026 | .enable_bit = OMAP3430_EN_SR1_SHIFT, | 3026 | .enable_bit = OMAP3430_EN_SR1_SHIFT, |
3027 | .recalc = &followparent_recalc, | 3027 | .recalc = &followparent_recalc, |
3028 | }; | 3028 | }; |
3029 | 3029 | ||
3030 | /* SmartReflex fclk (VDD2) */ | 3030 | /* SmartReflex fclk (VDD2) */ |
3031 | static struct clk sr2_fck = { | 3031 | static struct clk sr2_fck = { |
3032 | .name = "sr2_fck", | 3032 | .name = "sr2_fck", |
3033 | .ops = &clkops_omap2_dflt_wait, | 3033 | .ops = &clkops_omap2_dflt_wait, |
3034 | .parent = &sys_ck, | 3034 | .parent = &sys_ck, |
3035 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN), | 3035 | .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN), |
3036 | .enable_bit = OMAP3430_EN_SR2_SHIFT, | 3036 | .enable_bit = OMAP3430_EN_SR2_SHIFT, |
3037 | .recalc = &followparent_recalc, | 3037 | .recalc = &followparent_recalc, |
3038 | }; | 3038 | }; |
3039 | 3039 | ||
3040 | static struct clk sr_l4_ick = { | 3040 | static struct clk sr_l4_ick = { |
3041 | .name = "sr_l4_ick", | 3041 | .name = "sr_l4_ick", |
3042 | .ops = &clkops_null, /* RMK: missing? */ | 3042 | .ops = &clkops_null, /* RMK: missing? */ |
3043 | .parent = &l4_ick, | 3043 | .parent = &l4_ick, |
3044 | .clkdm_name = "core_l4_clkdm", | 3044 | .clkdm_name = "core_l4_clkdm", |
3045 | .recalc = &followparent_recalc, | 3045 | .recalc = &followparent_recalc, |
3046 | }; | 3046 | }; |
3047 | 3047 | ||
3048 | /* SECURE_32K_FCK clocks */ | 3048 | /* SECURE_32K_FCK clocks */ |
3049 | 3049 | ||
3050 | static struct clk gpt12_fck = { | 3050 | static struct clk gpt12_fck = { |
3051 | .name = "gpt12_fck", | 3051 | .name = "gpt12_fck", |
3052 | .ops = &clkops_null, | 3052 | .ops = &clkops_null, |
3053 | .parent = &secure_32k_fck, | 3053 | .parent = &secure_32k_fck, |
3054 | .recalc = &followparent_recalc, | 3054 | .recalc = &followparent_recalc, |
3055 | }; | 3055 | }; |
3056 | 3056 | ||
3057 | static struct clk wdt1_fck = { | 3057 | static struct clk wdt1_fck = { |
3058 | .name = "wdt1_fck", | 3058 | .name = "wdt1_fck", |
3059 | .ops = &clkops_null, | 3059 | .ops = &clkops_null, |
3060 | .parent = &secure_32k_fck, | 3060 | .parent = &secure_32k_fck, |
3061 | .recalc = &followparent_recalc, | 3061 | .recalc = &followparent_recalc, |
3062 | }; | 3062 | }; |
3063 | 3063 | ||
3064 | /* Clocks for AM35XX */ | 3064 | /* Clocks for AM35XX */ |
3065 | static struct clk ipss_ick = { | 3065 | static struct clk ipss_ick = { |
3066 | .name = "ipss_ick", | 3066 | .name = "ipss_ick", |
3067 | .ops = &clkops_am35xx_ipss_wait, | 3067 | .ops = &clkops_am35xx_ipss_wait, |
3068 | .parent = &core_l3_ick, | 3068 | .parent = &core_l3_ick, |
3069 | .clkdm_name = "core_l3_clkdm", | 3069 | .clkdm_name = "core_l3_clkdm", |
3070 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 3070 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
3071 | .enable_bit = AM35XX_EN_IPSS_SHIFT, | 3071 | .enable_bit = AM35XX_EN_IPSS_SHIFT, |
3072 | .recalc = &followparent_recalc, | 3072 | .recalc = &followparent_recalc, |
3073 | }; | 3073 | }; |
3074 | 3074 | ||
3075 | static struct clk emac_ick = { | 3075 | static struct clk emac_ick = { |
3076 | .name = "emac_ick", | 3076 | .name = "emac_ick", |
3077 | .ops = &clkops_am35xx_ipss_module_wait, | 3077 | .ops = &clkops_am35xx_ipss_module_wait, |
3078 | .parent = &ipss_ick, | 3078 | .parent = &ipss_ick, |
3079 | .clkdm_name = "core_l3_clkdm", | 3079 | .clkdm_name = "core_l3_clkdm", |
3080 | .enable_reg = OMAP343X_CTRL_REGADDR(AM35XX_CONTROL_IPSS_CLK_CTRL), | 3080 | .enable_reg = OMAP343X_CTRL_REGADDR(AM35XX_CONTROL_IPSS_CLK_CTRL), |
3081 | .enable_bit = AM35XX_CPGMAC_VBUSP_CLK_SHIFT, | 3081 | .enable_bit = AM35XX_CPGMAC_VBUSP_CLK_SHIFT, |
3082 | .recalc = &followparent_recalc, | 3082 | .recalc = &followparent_recalc, |
3083 | }; | 3083 | }; |
3084 | 3084 | ||
3085 | static struct clk rmii_ck = { | 3085 | static struct clk rmii_ck = { |
3086 | .name = "rmii_ck", | 3086 | .name = "rmii_ck", |
3087 | .ops = &clkops_null, | 3087 | .ops = &clkops_null, |
3088 | .rate = 50000000, | 3088 | .rate = 50000000, |
3089 | }; | 3089 | }; |
3090 | 3090 | ||
3091 | static struct clk emac_fck = { | 3091 | static struct clk emac_fck = { |
3092 | .name = "emac_fck", | 3092 | .name = "emac_fck", |
3093 | .ops = &clkops_omap2_dflt, | 3093 | .ops = &clkops_omap2_dflt, |
3094 | .parent = &rmii_ck, | 3094 | .parent = &rmii_ck, |
3095 | .enable_reg = OMAP343X_CTRL_REGADDR(AM35XX_CONTROL_IPSS_CLK_CTRL), | 3095 | .enable_reg = OMAP343X_CTRL_REGADDR(AM35XX_CONTROL_IPSS_CLK_CTRL), |
3096 | .enable_bit = AM35XX_CPGMAC_FCLK_SHIFT, | 3096 | .enable_bit = AM35XX_CPGMAC_FCLK_SHIFT, |
3097 | .recalc = &followparent_recalc, | 3097 | .recalc = &followparent_recalc, |
3098 | }; | 3098 | }; |
3099 | 3099 | ||
3100 | static struct clk hsotgusb_ick_am35xx = { | 3100 | static struct clk hsotgusb_ick_am35xx = { |
3101 | .name = "hsotgusb_ick", | 3101 | .name = "hsotgusb_ick", |
3102 | .ops = &clkops_am35xx_ipss_module_wait, | 3102 | .ops = &clkops_am35xx_ipss_module_wait, |
3103 | .parent = &ipss_ick, | 3103 | .parent = &ipss_ick, |
3104 | .clkdm_name = "core_l3_clkdm", | 3104 | .clkdm_name = "core_l3_clkdm", |
3105 | .enable_reg = OMAP343X_CTRL_REGADDR(AM35XX_CONTROL_IPSS_CLK_CTRL), | 3105 | .enable_reg = OMAP343X_CTRL_REGADDR(AM35XX_CONTROL_IPSS_CLK_CTRL), |
3106 | .enable_bit = AM35XX_USBOTG_VBUSP_CLK_SHIFT, | 3106 | .enable_bit = AM35XX_USBOTG_VBUSP_CLK_SHIFT, |
3107 | .recalc = &followparent_recalc, | 3107 | .recalc = &followparent_recalc, |
3108 | }; | 3108 | }; |
3109 | 3109 | ||
3110 | static struct clk hsotgusb_fck_am35xx = { | 3110 | static struct clk hsotgusb_fck_am35xx = { |
3111 | .name = "hsotgusb_fck", | 3111 | .name = "hsotgusb_fck", |
3112 | .ops = &clkops_omap2_dflt, | 3112 | .ops = &clkops_omap2_dflt, |
3113 | .parent = &sys_ck, | 3113 | .parent = &sys_ck, |
3114 | .clkdm_name = "core_l3_clkdm", | 3114 | .clkdm_name = "core_l3_clkdm", |
3115 | .enable_reg = OMAP343X_CTRL_REGADDR(AM35XX_CONTROL_IPSS_CLK_CTRL), | 3115 | .enable_reg = OMAP343X_CTRL_REGADDR(AM35XX_CONTROL_IPSS_CLK_CTRL), |
3116 | .enable_bit = AM35XX_USBOTG_FCLK_SHIFT, | 3116 | .enable_bit = AM35XX_USBOTG_FCLK_SHIFT, |
3117 | .recalc = &followparent_recalc, | 3117 | .recalc = &followparent_recalc, |
3118 | }; | 3118 | }; |
3119 | 3119 | ||
3120 | static struct clk hecc_ck = { | 3120 | static struct clk hecc_ck = { |
3121 | .name = "hecc_ck", | 3121 | .name = "hecc_ck", |
3122 | .ops = &clkops_am35xx_ipss_module_wait, | 3122 | .ops = &clkops_am35xx_ipss_module_wait, |
3123 | .parent = &sys_ck, | 3123 | .parent = &sys_ck, |
3124 | .clkdm_name = "core_l3_clkdm", | 3124 | .clkdm_name = "core_l3_clkdm", |
3125 | .enable_reg = OMAP343X_CTRL_REGADDR(AM35XX_CONTROL_IPSS_CLK_CTRL), | 3125 | .enable_reg = OMAP343X_CTRL_REGADDR(AM35XX_CONTROL_IPSS_CLK_CTRL), |
3126 | .enable_bit = AM35XX_HECC_VBUSP_CLK_SHIFT, | 3126 | .enable_bit = AM35XX_HECC_VBUSP_CLK_SHIFT, |
3127 | .recalc = &followparent_recalc, | 3127 | .recalc = &followparent_recalc, |
3128 | }; | 3128 | }; |
3129 | 3129 | ||
3130 | static struct clk vpfe_ick = { | 3130 | static struct clk vpfe_ick = { |
3131 | .name = "vpfe_ick", | 3131 | .name = "vpfe_ick", |
3132 | .ops = &clkops_am35xx_ipss_module_wait, | 3132 | .ops = &clkops_am35xx_ipss_module_wait, |
3133 | .parent = &ipss_ick, | 3133 | .parent = &ipss_ick, |
3134 | .clkdm_name = "core_l3_clkdm", | 3134 | .clkdm_name = "core_l3_clkdm", |
3135 | .enable_reg = OMAP343X_CTRL_REGADDR(AM35XX_CONTROL_IPSS_CLK_CTRL), | 3135 | .enable_reg = OMAP343X_CTRL_REGADDR(AM35XX_CONTROL_IPSS_CLK_CTRL), |
3136 | .enable_bit = AM35XX_VPFE_VBUSP_CLK_SHIFT, | 3136 | .enable_bit = AM35XX_VPFE_VBUSP_CLK_SHIFT, |
3137 | .recalc = &followparent_recalc, | 3137 | .recalc = &followparent_recalc, |
3138 | }; | 3138 | }; |
3139 | 3139 | ||
3140 | static struct clk pclk_ck = { | 3140 | static struct clk pclk_ck = { |
3141 | .name = "pclk_ck", | 3141 | .name = "pclk_ck", |
3142 | .ops = &clkops_null, | 3142 | .ops = &clkops_null, |
3143 | .rate = 27000000, | 3143 | .rate = 27000000, |
3144 | }; | 3144 | }; |
3145 | 3145 | ||
3146 | static struct clk vpfe_fck = { | 3146 | static struct clk vpfe_fck = { |
3147 | .name = "vpfe_fck", | 3147 | .name = "vpfe_fck", |
3148 | .ops = &clkops_omap2_dflt, | 3148 | .ops = &clkops_omap2_dflt, |
3149 | .parent = &pclk_ck, | 3149 | .parent = &pclk_ck, |
3150 | .enable_reg = OMAP343X_CTRL_REGADDR(AM35XX_CONTROL_IPSS_CLK_CTRL), | 3150 | .enable_reg = OMAP343X_CTRL_REGADDR(AM35XX_CONTROL_IPSS_CLK_CTRL), |
3151 | .enable_bit = AM35XX_VPFE_FCLK_SHIFT, | 3151 | .enable_bit = AM35XX_VPFE_FCLK_SHIFT, |
3152 | .recalc = &followparent_recalc, | 3152 | .recalc = &followparent_recalc, |
3153 | }; | 3153 | }; |
3154 | 3154 | ||
3155 | /* | 3155 | /* |
3156 | * The UART1/2 functional clock acts as the functional | 3156 | * The UART1/2 functional clock acts as the functional |
3157 | * clock for UART4. No separate fclk control available. | 3157 | * clock for UART4. No separate fclk control available. |
3158 | */ | 3158 | */ |
3159 | static struct clk uart4_ick_am35xx = { | 3159 | static struct clk uart4_ick_am35xx = { |
3160 | .name = "uart4_ick", | 3160 | .name = "uart4_ick", |
3161 | .ops = &clkops_omap2_dflt_wait, | 3161 | .ops = &clkops_omap2_dflt_wait, |
3162 | .parent = &core_l4_ick, | 3162 | .parent = &core_l4_ick, |
3163 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 3163 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
3164 | .enable_bit = AM35XX_EN_UART4_SHIFT, | 3164 | .enable_bit = AM35XX_EN_UART4_SHIFT, |
3165 | .clkdm_name = "core_l4_clkdm", | 3165 | .clkdm_name = "core_l4_clkdm", |
3166 | .recalc = &followparent_recalc, | 3166 | .recalc = &followparent_recalc, |
3167 | }; | 3167 | }; |
3168 | 3168 | ||
3169 | static struct clk dummy_apb_pclk = { | ||
3170 | .name = "apb_pclk", | ||
3171 | .ops = &clkops_null, | ||
3172 | }; | ||
3169 | 3173 | ||
3170 | /* | 3174 | /* |
3171 | * clkdev | 3175 | * clkdev |
3172 | */ | 3176 | */ |
3173 | 3177 | ||
3174 | /* XXX At some point we should rename this file to clock3xxx_data.c */ | 3178 | /* XXX At some point we should rename this file to clock3xxx_data.c */ |
3175 | static struct omap_clk omap3xxx_clks[] = { | 3179 | static struct omap_clk omap3xxx_clks[] = { |
3180 | CLK(NULL, "apb_pclk", &dummy_apb_pclk, CK_3XXX), | ||
3176 | CLK(NULL, "omap_32k_fck", &omap_32k_fck, CK_3XXX), | 3181 | CLK(NULL, "omap_32k_fck", &omap_32k_fck, CK_3XXX), |
3177 | CLK(NULL, "virt_12m_ck", &virt_12m_ck, CK_3XXX), | 3182 | CLK(NULL, "virt_12m_ck", &virt_12m_ck, CK_3XXX), |
3178 | CLK(NULL, "virt_13m_ck", &virt_13m_ck, CK_3XXX), | 3183 | CLK(NULL, "virt_13m_ck", &virt_13m_ck, CK_3XXX), |
3179 | CLK(NULL, "virt_16_8m_ck", &virt_16_8m_ck, CK_3430ES2 | CK_AM35XX), | 3184 | CLK(NULL, "virt_16_8m_ck", &virt_16_8m_ck, CK_3430ES2 | CK_AM35XX), |
3180 | CLK(NULL, "virt_19_2m_ck", &virt_19_2m_ck, CK_3XXX), | 3185 | CLK(NULL, "virt_19_2m_ck", &virt_19_2m_ck, CK_3XXX), |
3181 | CLK(NULL, "virt_26m_ck", &virt_26m_ck, CK_3XXX), | 3186 | CLK(NULL, "virt_26m_ck", &virt_26m_ck, CK_3XXX), |
3182 | CLK(NULL, "virt_38_4m_ck", &virt_38_4m_ck, CK_3XXX), | 3187 | CLK(NULL, "virt_38_4m_ck", &virt_38_4m_ck, CK_3XXX), |
3183 | CLK(NULL, "osc_sys_ck", &osc_sys_ck, CK_3XXX), | 3188 | CLK(NULL, "osc_sys_ck", &osc_sys_ck, CK_3XXX), |
3184 | CLK(NULL, "sys_ck", &sys_ck, CK_3XXX), | 3189 | CLK(NULL, "sys_ck", &sys_ck, CK_3XXX), |
3185 | CLK(NULL, "sys_altclk", &sys_altclk, CK_3XXX), | 3190 | CLK(NULL, "sys_altclk", &sys_altclk, CK_3XXX), |
3186 | CLK(NULL, "mcbsp_clks", &mcbsp_clks, CK_3XXX), | 3191 | CLK(NULL, "mcbsp_clks", &mcbsp_clks, CK_3XXX), |
3187 | CLK(NULL, "sys_clkout1", &sys_clkout1, CK_3XXX), | 3192 | CLK(NULL, "sys_clkout1", &sys_clkout1, CK_3XXX), |
3188 | CLK(NULL, "dpll1_ck", &dpll1_ck, CK_3XXX), | 3193 | CLK(NULL, "dpll1_ck", &dpll1_ck, CK_3XXX), |
3189 | CLK(NULL, "dpll1_x2_ck", &dpll1_x2_ck, CK_3XXX), | 3194 | CLK(NULL, "dpll1_x2_ck", &dpll1_x2_ck, CK_3XXX), |
3190 | CLK(NULL, "dpll1_x2m2_ck", &dpll1_x2m2_ck, CK_3XXX), | 3195 | CLK(NULL, "dpll1_x2m2_ck", &dpll1_x2m2_ck, CK_3XXX), |
3191 | CLK(NULL, "dpll2_ck", &dpll2_ck, CK_343X), | 3196 | CLK(NULL, "dpll2_ck", &dpll2_ck, CK_343X), |
3192 | CLK(NULL, "dpll2_m2_ck", &dpll2_m2_ck, CK_343X), | 3197 | CLK(NULL, "dpll2_m2_ck", &dpll2_m2_ck, CK_343X), |
3193 | CLK(NULL, "dpll3_ck", &dpll3_ck, CK_3XXX), | 3198 | CLK(NULL, "dpll3_ck", &dpll3_ck, CK_3XXX), |
3194 | CLK(NULL, "core_ck", &core_ck, CK_3XXX), | 3199 | CLK(NULL, "core_ck", &core_ck, CK_3XXX), |
3195 | CLK(NULL, "dpll3_x2_ck", &dpll3_x2_ck, CK_3XXX), | 3200 | CLK(NULL, "dpll3_x2_ck", &dpll3_x2_ck, CK_3XXX), |
3196 | CLK(NULL, "dpll3_m2_ck", &dpll3_m2_ck, CK_3XXX), | 3201 | CLK(NULL, "dpll3_m2_ck", &dpll3_m2_ck, CK_3XXX), |
3197 | CLK(NULL, "dpll3_m2x2_ck", &dpll3_m2x2_ck, CK_3XXX), | 3202 | CLK(NULL, "dpll3_m2x2_ck", &dpll3_m2x2_ck, CK_3XXX), |
3198 | CLK(NULL, "dpll3_m3_ck", &dpll3_m3_ck, CK_3XXX), | 3203 | CLK(NULL, "dpll3_m3_ck", &dpll3_m3_ck, CK_3XXX), |
3199 | CLK(NULL, "dpll3_m3x2_ck", &dpll3_m3x2_ck, CK_3XXX), | 3204 | CLK(NULL, "dpll3_m3x2_ck", &dpll3_m3x2_ck, CK_3XXX), |
3200 | CLK("etb", "emu_core_alwon_ck", &emu_core_alwon_ck, CK_3XXX), | 3205 | CLK("etb", "emu_core_alwon_ck", &emu_core_alwon_ck, CK_3XXX), |
3201 | CLK(NULL, "dpll4_ck", &dpll4_ck, CK_3XXX), | 3206 | CLK(NULL, "dpll4_ck", &dpll4_ck, CK_3XXX), |
3202 | CLK(NULL, "dpll4_x2_ck", &dpll4_x2_ck, CK_3XXX), | 3207 | CLK(NULL, "dpll4_x2_ck", &dpll4_x2_ck, CK_3XXX), |
3203 | CLK(NULL, "omap_192m_alwon_fck", &omap_192m_alwon_fck, CK_36XX), | 3208 | CLK(NULL, "omap_192m_alwon_fck", &omap_192m_alwon_fck, CK_36XX), |
3204 | CLK(NULL, "omap_96m_alwon_fck", &omap_96m_alwon_fck, CK_3XXX), | 3209 | CLK(NULL, "omap_96m_alwon_fck", &omap_96m_alwon_fck, CK_3XXX), |
3205 | CLK(NULL, "omap_96m_fck", &omap_96m_fck, CK_3XXX), | 3210 | CLK(NULL, "omap_96m_fck", &omap_96m_fck, CK_3XXX), |
3206 | CLK(NULL, "cm_96m_fck", &cm_96m_fck, CK_3XXX), | 3211 | CLK(NULL, "cm_96m_fck", &cm_96m_fck, CK_3XXX), |
3207 | CLK(NULL, "omap_54m_fck", &omap_54m_fck, CK_3XXX), | 3212 | CLK(NULL, "omap_54m_fck", &omap_54m_fck, CK_3XXX), |
3208 | CLK(NULL, "omap_48m_fck", &omap_48m_fck, CK_3XXX), | 3213 | CLK(NULL, "omap_48m_fck", &omap_48m_fck, CK_3XXX), |
3209 | CLK(NULL, "omap_12m_fck", &omap_12m_fck, CK_3XXX), | 3214 | CLK(NULL, "omap_12m_fck", &omap_12m_fck, CK_3XXX), |
3210 | CLK(NULL, "dpll4_m2_ck", &dpll4_m2_ck, CK_3XXX), | 3215 | CLK(NULL, "dpll4_m2_ck", &dpll4_m2_ck, CK_3XXX), |
3211 | CLK(NULL, "dpll4_m2x2_ck", &dpll4_m2x2_ck, CK_3XXX), | 3216 | CLK(NULL, "dpll4_m2x2_ck", &dpll4_m2x2_ck, CK_3XXX), |
3212 | CLK(NULL, "dpll4_m3_ck", &dpll4_m3_ck, CK_3XXX), | 3217 | CLK(NULL, "dpll4_m3_ck", &dpll4_m3_ck, CK_3XXX), |
3213 | CLK(NULL, "dpll4_m3x2_ck", &dpll4_m3x2_ck, CK_3XXX), | 3218 | CLK(NULL, "dpll4_m3x2_ck", &dpll4_m3x2_ck, CK_3XXX), |
3214 | CLK(NULL, "dpll4_m4_ck", &dpll4_m4_ck, CK_3XXX), | 3219 | CLK(NULL, "dpll4_m4_ck", &dpll4_m4_ck, CK_3XXX), |
3215 | CLK(NULL, "dpll4_m4x2_ck", &dpll4_m4x2_ck, CK_3XXX), | 3220 | CLK(NULL, "dpll4_m4x2_ck", &dpll4_m4x2_ck, CK_3XXX), |
3216 | CLK(NULL, "dpll4_m5_ck", &dpll4_m5_ck, CK_3XXX), | 3221 | CLK(NULL, "dpll4_m5_ck", &dpll4_m5_ck, CK_3XXX), |
3217 | CLK(NULL, "dpll4_m5x2_ck", &dpll4_m5x2_ck, CK_3XXX), | 3222 | CLK(NULL, "dpll4_m5x2_ck", &dpll4_m5x2_ck, CK_3XXX), |
3218 | CLK(NULL, "dpll4_m6_ck", &dpll4_m6_ck, CK_3XXX), | 3223 | CLK(NULL, "dpll4_m6_ck", &dpll4_m6_ck, CK_3XXX), |
3219 | CLK(NULL, "dpll4_m6x2_ck", &dpll4_m6x2_ck, CK_3XXX), | 3224 | CLK(NULL, "dpll4_m6x2_ck", &dpll4_m6x2_ck, CK_3XXX), |
3220 | CLK("etb", "emu_per_alwon_ck", &emu_per_alwon_ck, CK_3XXX), | 3225 | CLK("etb", "emu_per_alwon_ck", &emu_per_alwon_ck, CK_3XXX), |
3221 | CLK(NULL, "dpll5_ck", &dpll5_ck, CK_3430ES2 | CK_AM35XX), | 3226 | CLK(NULL, "dpll5_ck", &dpll5_ck, CK_3430ES2 | CK_AM35XX), |
3222 | CLK(NULL, "dpll5_m2_ck", &dpll5_m2_ck, CK_3430ES2 | CK_AM35XX), | 3227 | CLK(NULL, "dpll5_m2_ck", &dpll5_m2_ck, CK_3430ES2 | CK_AM35XX), |
3223 | CLK(NULL, "clkout2_src_ck", &clkout2_src_ck, CK_3XXX), | 3228 | CLK(NULL, "clkout2_src_ck", &clkout2_src_ck, CK_3XXX), |
3224 | CLK(NULL, "sys_clkout2", &sys_clkout2, CK_3XXX), | 3229 | CLK(NULL, "sys_clkout2", &sys_clkout2, CK_3XXX), |
3225 | CLK(NULL, "corex2_fck", &corex2_fck, CK_3XXX), | 3230 | CLK(NULL, "corex2_fck", &corex2_fck, CK_3XXX), |
3226 | CLK(NULL, "dpll1_fck", &dpll1_fck, CK_3XXX), | 3231 | CLK(NULL, "dpll1_fck", &dpll1_fck, CK_3XXX), |
3227 | CLK(NULL, "mpu_ck", &mpu_ck, CK_3XXX), | 3232 | CLK(NULL, "mpu_ck", &mpu_ck, CK_3XXX), |
3228 | CLK(NULL, "arm_fck", &arm_fck, CK_3XXX), | 3233 | CLK(NULL, "arm_fck", &arm_fck, CK_3XXX), |
3229 | CLK("etb", "emu_mpu_alwon_ck", &emu_mpu_alwon_ck, CK_3XXX), | 3234 | CLK("etb", "emu_mpu_alwon_ck", &emu_mpu_alwon_ck, CK_3XXX), |
3230 | CLK(NULL, "dpll2_fck", &dpll2_fck, CK_343X), | 3235 | CLK(NULL, "dpll2_fck", &dpll2_fck, CK_343X), |
3231 | CLK(NULL, "iva2_ck", &iva2_ck, CK_343X), | 3236 | CLK(NULL, "iva2_ck", &iva2_ck, CK_343X), |
3232 | CLK(NULL, "l3_ick", &l3_ick, CK_3XXX), | 3237 | CLK(NULL, "l3_ick", &l3_ick, CK_3XXX), |
3233 | CLK(NULL, "l4_ick", &l4_ick, CK_3XXX), | 3238 | CLK(NULL, "l4_ick", &l4_ick, CK_3XXX), |
3234 | CLK(NULL, "rm_ick", &rm_ick, CK_3XXX), | 3239 | CLK(NULL, "rm_ick", &rm_ick, CK_3XXX), |
3235 | CLK(NULL, "gfx_l3_ck", &gfx_l3_ck, CK_3430ES1), | 3240 | CLK(NULL, "gfx_l3_ck", &gfx_l3_ck, CK_3430ES1), |
3236 | CLK(NULL, "gfx_l3_fck", &gfx_l3_fck, CK_3430ES1), | 3241 | CLK(NULL, "gfx_l3_fck", &gfx_l3_fck, CK_3430ES1), |
3237 | CLK(NULL, "gfx_l3_ick", &gfx_l3_ick, CK_3430ES1), | 3242 | CLK(NULL, "gfx_l3_ick", &gfx_l3_ick, CK_3430ES1), |
3238 | CLK(NULL, "gfx_cg1_ck", &gfx_cg1_ck, CK_3430ES1), | 3243 | CLK(NULL, "gfx_cg1_ck", &gfx_cg1_ck, CK_3430ES1), |
3239 | CLK(NULL, "gfx_cg2_ck", &gfx_cg2_ck, CK_3430ES1), | 3244 | CLK(NULL, "gfx_cg2_ck", &gfx_cg2_ck, CK_3430ES1), |
3240 | CLK(NULL, "sgx_fck", &sgx_fck, CK_3430ES2 | CK_3517), | 3245 | CLK(NULL, "sgx_fck", &sgx_fck, CK_3430ES2 | CK_3517), |
3241 | CLK(NULL, "sgx_ick", &sgx_ick, CK_3430ES2 | CK_3517), | 3246 | CLK(NULL, "sgx_ick", &sgx_ick, CK_3430ES2 | CK_3517), |
3242 | CLK(NULL, "d2d_26m_fck", &d2d_26m_fck, CK_3430ES1), | 3247 | CLK(NULL, "d2d_26m_fck", &d2d_26m_fck, CK_3430ES1), |
3243 | CLK(NULL, "modem_fck", &modem_fck, CK_343X), | 3248 | CLK(NULL, "modem_fck", &modem_fck, CK_343X), |
3244 | CLK(NULL, "sad2d_ick", &sad2d_ick, CK_343X), | 3249 | CLK(NULL, "sad2d_ick", &sad2d_ick, CK_343X), |
3245 | CLK(NULL, "mad2d_ick", &mad2d_ick, CK_343X), | 3250 | CLK(NULL, "mad2d_ick", &mad2d_ick, CK_343X), |
3246 | CLK(NULL, "gpt10_fck", &gpt10_fck, CK_3XXX), | 3251 | CLK(NULL, "gpt10_fck", &gpt10_fck, CK_3XXX), |
3247 | CLK(NULL, "gpt11_fck", &gpt11_fck, CK_3XXX), | 3252 | CLK(NULL, "gpt11_fck", &gpt11_fck, CK_3XXX), |
3248 | CLK(NULL, "cpefuse_fck", &cpefuse_fck, CK_3430ES2 | CK_AM35XX), | 3253 | CLK(NULL, "cpefuse_fck", &cpefuse_fck, CK_3430ES2 | CK_AM35XX), |
3249 | CLK(NULL, "ts_fck", &ts_fck, CK_3430ES2 | CK_AM35XX), | 3254 | CLK(NULL, "ts_fck", &ts_fck, CK_3430ES2 | CK_AM35XX), |
3250 | CLK(NULL, "usbtll_fck", &usbtll_fck, CK_3430ES2 | CK_AM35XX), | 3255 | CLK(NULL, "usbtll_fck", &usbtll_fck, CK_3430ES2 | CK_AM35XX), |
3251 | CLK(NULL, "core_96m_fck", &core_96m_fck, CK_3XXX), | 3256 | CLK(NULL, "core_96m_fck", &core_96m_fck, CK_3XXX), |
3252 | CLK("mmci-omap-hs.2", "fck", &mmchs3_fck, CK_3430ES2 | CK_AM35XX), | 3257 | CLK("mmci-omap-hs.2", "fck", &mmchs3_fck, CK_3430ES2 | CK_AM35XX), |
3253 | CLK("mmci-omap-hs.1", "fck", &mmchs2_fck, CK_3XXX), | 3258 | CLK("mmci-omap-hs.1", "fck", &mmchs2_fck, CK_3XXX), |
3254 | CLK(NULL, "mspro_fck", &mspro_fck, CK_343X), | 3259 | CLK(NULL, "mspro_fck", &mspro_fck, CK_343X), |
3255 | CLK("mmci-omap-hs.0", "fck", &mmchs1_fck, CK_3XXX), | 3260 | CLK("mmci-omap-hs.0", "fck", &mmchs1_fck, CK_3XXX), |
3256 | CLK("i2c_omap.3", "fck", &i2c3_fck, CK_3XXX), | 3261 | CLK("i2c_omap.3", "fck", &i2c3_fck, CK_3XXX), |
3257 | CLK("i2c_omap.2", "fck", &i2c2_fck, CK_3XXX), | 3262 | CLK("i2c_omap.2", "fck", &i2c2_fck, CK_3XXX), |
3258 | CLK("i2c_omap.1", "fck", &i2c1_fck, CK_3XXX), | 3263 | CLK("i2c_omap.1", "fck", &i2c1_fck, CK_3XXX), |
3259 | CLK("omap-mcbsp.5", "fck", &mcbsp5_fck, CK_3XXX), | 3264 | CLK("omap-mcbsp.5", "fck", &mcbsp5_fck, CK_3XXX), |
3260 | CLK("omap-mcbsp.1", "fck", &mcbsp1_fck, CK_3XXX), | 3265 | CLK("omap-mcbsp.1", "fck", &mcbsp1_fck, CK_3XXX), |
3261 | CLK(NULL, "core_48m_fck", &core_48m_fck, CK_3XXX), | 3266 | CLK(NULL, "core_48m_fck", &core_48m_fck, CK_3XXX), |
3262 | CLK("omap2_mcspi.4", "fck", &mcspi4_fck, CK_3XXX), | 3267 | CLK("omap2_mcspi.4", "fck", &mcspi4_fck, CK_3XXX), |
3263 | CLK("omap2_mcspi.3", "fck", &mcspi3_fck, CK_3XXX), | 3268 | CLK("omap2_mcspi.3", "fck", &mcspi3_fck, CK_3XXX), |
3264 | CLK("omap2_mcspi.2", "fck", &mcspi2_fck, CK_3XXX), | 3269 | CLK("omap2_mcspi.2", "fck", &mcspi2_fck, CK_3XXX), |
3265 | CLK("omap2_mcspi.1", "fck", &mcspi1_fck, CK_3XXX), | 3270 | CLK("omap2_mcspi.1", "fck", &mcspi1_fck, CK_3XXX), |
3266 | CLK(NULL, "uart2_fck", &uart2_fck, CK_3XXX), | 3271 | CLK(NULL, "uart2_fck", &uart2_fck, CK_3XXX), |
3267 | CLK(NULL, "uart1_fck", &uart1_fck, CK_3XXX), | 3272 | CLK(NULL, "uart1_fck", &uart1_fck, CK_3XXX), |
3268 | CLK(NULL, "fshostusb_fck", &fshostusb_fck, CK_3430ES1), | 3273 | CLK(NULL, "fshostusb_fck", &fshostusb_fck, CK_3430ES1), |
3269 | CLK(NULL, "core_12m_fck", &core_12m_fck, CK_3XXX), | 3274 | CLK(NULL, "core_12m_fck", &core_12m_fck, CK_3XXX), |
3270 | CLK("omap_hdq.0", "fck", &hdq_fck, CK_3XXX), | 3275 | CLK("omap_hdq.0", "fck", &hdq_fck, CK_3XXX), |
3271 | CLK(NULL, "ssi_ssr_fck", &ssi_ssr_fck_3430es1, CK_3430ES1), | 3276 | CLK(NULL, "ssi_ssr_fck", &ssi_ssr_fck_3430es1, CK_3430ES1), |
3272 | CLK(NULL, "ssi_ssr_fck", &ssi_ssr_fck_3430es2, CK_3430ES2), | 3277 | CLK(NULL, "ssi_ssr_fck", &ssi_ssr_fck_3430es2, CK_3430ES2), |
3273 | CLK(NULL, "ssi_sst_fck", &ssi_sst_fck_3430es1, CK_3430ES1), | 3278 | CLK(NULL, "ssi_sst_fck", &ssi_sst_fck_3430es1, CK_3430ES1), |
3274 | CLK(NULL, "ssi_sst_fck", &ssi_sst_fck_3430es2, CK_3430ES2), | 3279 | CLK(NULL, "ssi_sst_fck", &ssi_sst_fck_3430es2, CK_3430ES2), |
3275 | CLK(NULL, "core_l3_ick", &core_l3_ick, CK_3XXX), | 3280 | CLK(NULL, "core_l3_ick", &core_l3_ick, CK_3XXX), |
3276 | CLK("musb_hdrc", "ick", &hsotgusb_ick_3430es1, CK_3430ES1), | 3281 | CLK("musb_hdrc", "ick", &hsotgusb_ick_3430es1, CK_3430ES1), |
3277 | CLK("musb_hdrc", "ick", &hsotgusb_ick_3430es2, CK_3430ES2), | 3282 | CLK("musb_hdrc", "ick", &hsotgusb_ick_3430es2, CK_3430ES2), |
3278 | CLK(NULL, "sdrc_ick", &sdrc_ick, CK_3XXX), | 3283 | CLK(NULL, "sdrc_ick", &sdrc_ick, CK_3XXX), |
3279 | CLK(NULL, "gpmc_fck", &gpmc_fck, CK_3XXX), | 3284 | CLK(NULL, "gpmc_fck", &gpmc_fck, CK_3XXX), |
3280 | CLK(NULL, "security_l3_ick", &security_l3_ick, CK_343X), | 3285 | CLK(NULL, "security_l3_ick", &security_l3_ick, CK_343X), |
3281 | CLK(NULL, "pka_ick", &pka_ick, CK_343X), | 3286 | CLK(NULL, "pka_ick", &pka_ick, CK_343X), |
3282 | CLK(NULL, "core_l4_ick", &core_l4_ick, CK_3XXX), | 3287 | CLK(NULL, "core_l4_ick", &core_l4_ick, CK_3XXX), |
3283 | CLK(NULL, "usbtll_ick", &usbtll_ick, CK_3430ES2 | CK_AM35XX), | 3288 | CLK(NULL, "usbtll_ick", &usbtll_ick, CK_3430ES2 | CK_AM35XX), |
3284 | CLK("mmci-omap-hs.2", "ick", &mmchs3_ick, CK_3430ES2 | CK_AM35XX), | 3289 | CLK("mmci-omap-hs.2", "ick", &mmchs3_ick, CK_3430ES2 | CK_AM35XX), |
3285 | CLK(NULL, "icr_ick", &icr_ick, CK_343X), | 3290 | CLK(NULL, "icr_ick", &icr_ick, CK_343X), |
3286 | CLK(NULL, "aes2_ick", &aes2_ick, CK_343X), | 3291 | CLK(NULL, "aes2_ick", &aes2_ick, CK_343X), |
3287 | CLK("omap-sham", "ick", &sha12_ick, CK_343X), | 3292 | CLK("omap-sham", "ick", &sha12_ick, CK_343X), |
3288 | CLK(NULL, "des2_ick", &des2_ick, CK_343X), | 3293 | CLK(NULL, "des2_ick", &des2_ick, CK_343X), |
3289 | CLK("mmci-omap-hs.1", "ick", &mmchs2_ick, CK_3XXX), | 3294 | CLK("mmci-omap-hs.1", "ick", &mmchs2_ick, CK_3XXX), |
3290 | CLK("mmci-omap-hs.0", "ick", &mmchs1_ick, CK_3XXX), | 3295 | CLK("mmci-omap-hs.0", "ick", &mmchs1_ick, CK_3XXX), |
3291 | CLK(NULL, "mspro_ick", &mspro_ick, CK_343X), | 3296 | CLK(NULL, "mspro_ick", &mspro_ick, CK_343X), |
3292 | CLK("omap_hdq.0", "ick", &hdq_ick, CK_3XXX), | 3297 | CLK("omap_hdq.0", "ick", &hdq_ick, CK_3XXX), |
3293 | CLK("omap2_mcspi.4", "ick", &mcspi4_ick, CK_3XXX), | 3298 | CLK("omap2_mcspi.4", "ick", &mcspi4_ick, CK_3XXX), |
3294 | CLK("omap2_mcspi.3", "ick", &mcspi3_ick, CK_3XXX), | 3299 | CLK("omap2_mcspi.3", "ick", &mcspi3_ick, CK_3XXX), |
3295 | CLK("omap2_mcspi.2", "ick", &mcspi2_ick, CK_3XXX), | 3300 | CLK("omap2_mcspi.2", "ick", &mcspi2_ick, CK_3XXX), |
3296 | CLK("omap2_mcspi.1", "ick", &mcspi1_ick, CK_3XXX), | 3301 | CLK("omap2_mcspi.1", "ick", &mcspi1_ick, CK_3XXX), |
3297 | CLK("i2c_omap.3", "ick", &i2c3_ick, CK_3XXX), | 3302 | CLK("i2c_omap.3", "ick", &i2c3_ick, CK_3XXX), |
3298 | CLK("i2c_omap.2", "ick", &i2c2_ick, CK_3XXX), | 3303 | CLK("i2c_omap.2", "ick", &i2c2_ick, CK_3XXX), |
3299 | CLK("i2c_omap.1", "ick", &i2c1_ick, CK_3XXX), | 3304 | CLK("i2c_omap.1", "ick", &i2c1_ick, CK_3XXX), |
3300 | CLK(NULL, "uart2_ick", &uart2_ick, CK_3XXX), | 3305 | CLK(NULL, "uart2_ick", &uart2_ick, CK_3XXX), |
3301 | CLK(NULL, "uart1_ick", &uart1_ick, CK_3XXX), | 3306 | CLK(NULL, "uart1_ick", &uart1_ick, CK_3XXX), |
3302 | CLK(NULL, "gpt11_ick", &gpt11_ick, CK_3XXX), | 3307 | CLK(NULL, "gpt11_ick", &gpt11_ick, CK_3XXX), |
3303 | CLK(NULL, "gpt10_ick", &gpt10_ick, CK_3XXX), | 3308 | CLK(NULL, "gpt10_ick", &gpt10_ick, CK_3XXX), |
3304 | CLK("omap-mcbsp.5", "ick", &mcbsp5_ick, CK_3XXX), | 3309 | CLK("omap-mcbsp.5", "ick", &mcbsp5_ick, CK_3XXX), |
3305 | CLK("omap-mcbsp.1", "ick", &mcbsp1_ick, CK_3XXX), | 3310 | CLK("omap-mcbsp.1", "ick", &mcbsp1_ick, CK_3XXX), |
3306 | CLK(NULL, "fac_ick", &fac_ick, CK_3430ES1), | 3311 | CLK(NULL, "fac_ick", &fac_ick, CK_3430ES1), |
3307 | CLK(NULL, "mailboxes_ick", &mailboxes_ick, CK_343X), | 3312 | CLK(NULL, "mailboxes_ick", &mailboxes_ick, CK_343X), |
3308 | CLK(NULL, "omapctrl_ick", &omapctrl_ick, CK_3XXX), | 3313 | CLK(NULL, "omapctrl_ick", &omapctrl_ick, CK_3XXX), |
3309 | CLK(NULL, "ssi_l4_ick", &ssi_l4_ick, CK_343X), | 3314 | CLK(NULL, "ssi_l4_ick", &ssi_l4_ick, CK_343X), |
3310 | CLK(NULL, "ssi_ick", &ssi_ick_3430es1, CK_3430ES1), | 3315 | CLK(NULL, "ssi_ick", &ssi_ick_3430es1, CK_3430ES1), |
3311 | CLK(NULL, "ssi_ick", &ssi_ick_3430es2, CK_3430ES2), | 3316 | CLK(NULL, "ssi_ick", &ssi_ick_3430es2, CK_3430ES2), |
3312 | CLK(NULL, "usb_l4_ick", &usb_l4_ick, CK_3430ES1), | 3317 | CLK(NULL, "usb_l4_ick", &usb_l4_ick, CK_3430ES1), |
3313 | CLK(NULL, "security_l4_ick2", &security_l4_ick2, CK_343X), | 3318 | CLK(NULL, "security_l4_ick2", &security_l4_ick2, CK_343X), |
3314 | CLK(NULL, "aes1_ick", &aes1_ick, CK_343X), | 3319 | CLK(NULL, "aes1_ick", &aes1_ick, CK_343X), |
3315 | CLK("omap_rng", "ick", &rng_ick, CK_343X), | 3320 | CLK("omap_rng", "ick", &rng_ick, CK_343X), |
3316 | CLK(NULL, "sha11_ick", &sha11_ick, CK_343X), | 3321 | CLK(NULL, "sha11_ick", &sha11_ick, CK_343X), |
3317 | CLK(NULL, "des1_ick", &des1_ick, CK_343X), | 3322 | CLK(NULL, "des1_ick", &des1_ick, CK_343X), |
3318 | CLK("omapdss", "dss1_fck", &dss1_alwon_fck_3430es1, CK_3430ES1), | 3323 | CLK("omapdss", "dss1_fck", &dss1_alwon_fck_3430es1, CK_3430ES1), |
3319 | CLK("omapdss", "dss1_fck", &dss1_alwon_fck_3430es2, CK_3430ES2 | CK_AM35XX), | 3324 | CLK("omapdss", "dss1_fck", &dss1_alwon_fck_3430es2, CK_3430ES2 | CK_AM35XX), |
3320 | CLK("omapdss", "tv_fck", &dss_tv_fck, CK_3XXX), | 3325 | CLK("omapdss", "tv_fck", &dss_tv_fck, CK_3XXX), |
3321 | CLK("omapdss", "video_fck", &dss_96m_fck, CK_3XXX), | 3326 | CLK("omapdss", "video_fck", &dss_96m_fck, CK_3XXX), |
3322 | CLK("omapdss", "dss2_fck", &dss2_alwon_fck, CK_3XXX), | 3327 | CLK("omapdss", "dss2_fck", &dss2_alwon_fck, CK_3XXX), |
3323 | CLK("omapdss", "ick", &dss_ick_3430es1, CK_3430ES1), | 3328 | CLK("omapdss", "ick", &dss_ick_3430es1, CK_3430ES1), |
3324 | CLK("omapdss", "ick", &dss_ick_3430es2, CK_3430ES2 | CK_AM35XX), | 3329 | CLK("omapdss", "ick", &dss_ick_3430es2, CK_3430ES2 | CK_AM35XX), |
3325 | CLK(NULL, "cam_mclk", &cam_mclk, CK_343X), | 3330 | CLK(NULL, "cam_mclk", &cam_mclk, CK_343X), |
3326 | CLK(NULL, "cam_ick", &cam_ick, CK_343X), | 3331 | CLK(NULL, "cam_ick", &cam_ick, CK_343X), |
3327 | CLK(NULL, "csi2_96m_fck", &csi2_96m_fck, CK_343X), | 3332 | CLK(NULL, "csi2_96m_fck", &csi2_96m_fck, CK_343X), |
3328 | CLK(NULL, "usbhost_120m_fck", &usbhost_120m_fck, CK_3430ES2 | CK_AM35XX), | 3333 | CLK(NULL, "usbhost_120m_fck", &usbhost_120m_fck, CK_3430ES2 | CK_AM35XX), |
3329 | CLK(NULL, "usbhost_48m_fck", &usbhost_48m_fck, CK_3430ES2 | CK_AM35XX), | 3334 | CLK(NULL, "usbhost_48m_fck", &usbhost_48m_fck, CK_3430ES2 | CK_AM35XX), |
3330 | CLK(NULL, "usbhost_ick", &usbhost_ick, CK_3430ES2 | CK_AM35XX), | 3335 | CLK(NULL, "usbhost_ick", &usbhost_ick, CK_3430ES2 | CK_AM35XX), |
3331 | CLK(NULL, "usim_fck", &usim_fck, CK_3430ES2), | 3336 | CLK(NULL, "usim_fck", &usim_fck, CK_3430ES2), |
3332 | CLK(NULL, "gpt1_fck", &gpt1_fck, CK_3XXX), | 3337 | CLK(NULL, "gpt1_fck", &gpt1_fck, CK_3XXX), |
3333 | CLK(NULL, "wkup_32k_fck", &wkup_32k_fck, CK_3XXX), | 3338 | CLK(NULL, "wkup_32k_fck", &wkup_32k_fck, CK_3XXX), |
3334 | CLK(NULL, "gpio1_dbck", &gpio1_dbck, CK_3XXX), | 3339 | CLK(NULL, "gpio1_dbck", &gpio1_dbck, CK_3XXX), |
3335 | CLK("omap_wdt", "fck", &wdt2_fck, CK_3XXX), | 3340 | CLK("omap_wdt", "fck", &wdt2_fck, CK_3XXX), |
3336 | CLK(NULL, "wkup_l4_ick", &wkup_l4_ick, CK_343X), | 3341 | CLK(NULL, "wkup_l4_ick", &wkup_l4_ick, CK_343X), |
3337 | CLK(NULL, "usim_ick", &usim_ick, CK_3430ES2), | 3342 | CLK(NULL, "usim_ick", &usim_ick, CK_3430ES2), |
3338 | CLK("omap_wdt", "ick", &wdt2_ick, CK_3XXX), | 3343 | CLK("omap_wdt", "ick", &wdt2_ick, CK_3XXX), |
3339 | CLK(NULL, "wdt1_ick", &wdt1_ick, CK_3XXX), | 3344 | CLK(NULL, "wdt1_ick", &wdt1_ick, CK_3XXX), |
3340 | CLK(NULL, "gpio1_ick", &gpio1_ick, CK_3XXX), | 3345 | CLK(NULL, "gpio1_ick", &gpio1_ick, CK_3XXX), |
3341 | CLK(NULL, "omap_32ksync_ick", &omap_32ksync_ick, CK_3XXX), | 3346 | CLK(NULL, "omap_32ksync_ick", &omap_32ksync_ick, CK_3XXX), |
3342 | CLK(NULL, "gpt12_ick", &gpt12_ick, CK_3XXX), | 3347 | CLK(NULL, "gpt12_ick", &gpt12_ick, CK_3XXX), |
3343 | CLK(NULL, "gpt1_ick", &gpt1_ick, CK_3XXX), | 3348 | CLK(NULL, "gpt1_ick", &gpt1_ick, CK_3XXX), |
3344 | CLK(NULL, "per_96m_fck", &per_96m_fck, CK_3XXX), | 3349 | CLK(NULL, "per_96m_fck", &per_96m_fck, CK_3XXX), |
3345 | CLK(NULL, "per_48m_fck", &per_48m_fck, CK_3XXX), | 3350 | CLK(NULL, "per_48m_fck", &per_48m_fck, CK_3XXX), |
3346 | CLK(NULL, "uart3_fck", &uart3_fck, CK_3XXX), | 3351 | CLK(NULL, "uart3_fck", &uart3_fck, CK_3XXX), |
3347 | CLK(NULL, "gpt2_fck", &gpt2_fck, CK_3XXX), | 3352 | CLK(NULL, "gpt2_fck", &gpt2_fck, CK_3XXX), |
3348 | CLK(NULL, "gpt3_fck", &gpt3_fck, CK_3XXX), | 3353 | CLK(NULL, "gpt3_fck", &gpt3_fck, CK_3XXX), |
3349 | CLK(NULL, "gpt4_fck", &gpt4_fck, CK_3XXX), | 3354 | CLK(NULL, "gpt4_fck", &gpt4_fck, CK_3XXX), |
3350 | CLK(NULL, "gpt5_fck", &gpt5_fck, CK_3XXX), | 3355 | CLK(NULL, "gpt5_fck", &gpt5_fck, CK_3XXX), |
3351 | CLK(NULL, "gpt6_fck", &gpt6_fck, CK_3XXX), | 3356 | CLK(NULL, "gpt6_fck", &gpt6_fck, CK_3XXX), |
3352 | CLK(NULL, "gpt7_fck", &gpt7_fck, CK_3XXX), | 3357 | CLK(NULL, "gpt7_fck", &gpt7_fck, CK_3XXX), |
3353 | CLK(NULL, "gpt8_fck", &gpt8_fck, CK_3XXX), | 3358 | CLK(NULL, "gpt8_fck", &gpt8_fck, CK_3XXX), |
3354 | CLK(NULL, "gpt9_fck", &gpt9_fck, CK_3XXX), | 3359 | CLK(NULL, "gpt9_fck", &gpt9_fck, CK_3XXX), |
3355 | CLK(NULL, "per_32k_alwon_fck", &per_32k_alwon_fck, CK_3XXX), | 3360 | CLK(NULL, "per_32k_alwon_fck", &per_32k_alwon_fck, CK_3XXX), |
3356 | CLK(NULL, "gpio6_dbck", &gpio6_dbck, CK_3XXX), | 3361 | CLK(NULL, "gpio6_dbck", &gpio6_dbck, CK_3XXX), |
3357 | CLK(NULL, "gpio5_dbck", &gpio5_dbck, CK_3XXX), | 3362 | CLK(NULL, "gpio5_dbck", &gpio5_dbck, CK_3XXX), |
3358 | CLK(NULL, "gpio4_dbck", &gpio4_dbck, CK_3XXX), | 3363 | CLK(NULL, "gpio4_dbck", &gpio4_dbck, CK_3XXX), |
3359 | CLK(NULL, "gpio3_dbck", &gpio3_dbck, CK_3XXX), | 3364 | CLK(NULL, "gpio3_dbck", &gpio3_dbck, CK_3XXX), |
3360 | CLK(NULL, "gpio2_dbck", &gpio2_dbck, CK_3XXX), | 3365 | CLK(NULL, "gpio2_dbck", &gpio2_dbck, CK_3XXX), |
3361 | CLK(NULL, "wdt3_fck", &wdt3_fck, CK_3XXX), | 3366 | CLK(NULL, "wdt3_fck", &wdt3_fck, CK_3XXX), |
3362 | CLK(NULL, "per_l4_ick", &per_l4_ick, CK_3XXX), | 3367 | CLK(NULL, "per_l4_ick", &per_l4_ick, CK_3XXX), |
3363 | CLK(NULL, "gpio6_ick", &gpio6_ick, CK_3XXX), | 3368 | CLK(NULL, "gpio6_ick", &gpio6_ick, CK_3XXX), |
3364 | CLK(NULL, "gpio5_ick", &gpio5_ick, CK_3XXX), | 3369 | CLK(NULL, "gpio5_ick", &gpio5_ick, CK_3XXX), |
3365 | CLK(NULL, "gpio4_ick", &gpio4_ick, CK_3XXX), | 3370 | CLK(NULL, "gpio4_ick", &gpio4_ick, CK_3XXX), |
3366 | CLK(NULL, "gpio3_ick", &gpio3_ick, CK_3XXX), | 3371 | CLK(NULL, "gpio3_ick", &gpio3_ick, CK_3XXX), |
3367 | CLK(NULL, "gpio2_ick", &gpio2_ick, CK_3XXX), | 3372 | CLK(NULL, "gpio2_ick", &gpio2_ick, CK_3XXX), |
3368 | CLK(NULL, "wdt3_ick", &wdt3_ick, CK_3XXX), | 3373 | CLK(NULL, "wdt3_ick", &wdt3_ick, CK_3XXX), |
3369 | CLK(NULL, "uart3_ick", &uart3_ick, CK_3XXX), | 3374 | CLK(NULL, "uart3_ick", &uart3_ick, CK_3XXX), |
3370 | CLK(NULL, "gpt9_ick", &gpt9_ick, CK_3XXX), | 3375 | CLK(NULL, "gpt9_ick", &gpt9_ick, CK_3XXX), |
3371 | CLK(NULL, "gpt8_ick", &gpt8_ick, CK_3XXX), | 3376 | CLK(NULL, "gpt8_ick", &gpt8_ick, CK_3XXX), |
3372 | CLK(NULL, "gpt7_ick", &gpt7_ick, CK_3XXX), | 3377 | CLK(NULL, "gpt7_ick", &gpt7_ick, CK_3XXX), |
3373 | CLK(NULL, "gpt6_ick", &gpt6_ick, CK_3XXX), | 3378 | CLK(NULL, "gpt6_ick", &gpt6_ick, CK_3XXX), |
3374 | CLK(NULL, "gpt5_ick", &gpt5_ick, CK_3XXX), | 3379 | CLK(NULL, "gpt5_ick", &gpt5_ick, CK_3XXX), |
3375 | CLK(NULL, "gpt4_ick", &gpt4_ick, CK_3XXX), | 3380 | CLK(NULL, "gpt4_ick", &gpt4_ick, CK_3XXX), |
3376 | CLK(NULL, "gpt3_ick", &gpt3_ick, CK_3XXX), | 3381 | CLK(NULL, "gpt3_ick", &gpt3_ick, CK_3XXX), |
3377 | CLK(NULL, "gpt2_ick", &gpt2_ick, CK_3XXX), | 3382 | CLK(NULL, "gpt2_ick", &gpt2_ick, CK_3XXX), |
3378 | CLK("omap-mcbsp.2", "ick", &mcbsp2_ick, CK_3XXX), | 3383 | CLK("omap-mcbsp.2", "ick", &mcbsp2_ick, CK_3XXX), |
3379 | CLK("omap-mcbsp.3", "ick", &mcbsp3_ick, CK_3XXX), | 3384 | CLK("omap-mcbsp.3", "ick", &mcbsp3_ick, CK_3XXX), |
3380 | CLK("omap-mcbsp.4", "ick", &mcbsp4_ick, CK_3XXX), | 3385 | CLK("omap-mcbsp.4", "ick", &mcbsp4_ick, CK_3XXX), |
3381 | CLK("omap-mcbsp.2", "fck", &mcbsp2_fck, CK_3XXX), | 3386 | CLK("omap-mcbsp.2", "fck", &mcbsp2_fck, CK_3XXX), |
3382 | CLK("omap-mcbsp.3", "fck", &mcbsp3_fck, CK_3XXX), | 3387 | CLK("omap-mcbsp.3", "fck", &mcbsp3_fck, CK_3XXX), |
3383 | CLK("omap-mcbsp.4", "fck", &mcbsp4_fck, CK_3XXX), | 3388 | CLK("omap-mcbsp.4", "fck", &mcbsp4_fck, CK_3XXX), |
3384 | CLK("etb", "emu_src_ck", &emu_src_ck, CK_3XXX), | 3389 | CLK("etb", "emu_src_ck", &emu_src_ck, CK_3XXX), |
3385 | CLK(NULL, "pclk_fck", &pclk_fck, CK_3XXX), | 3390 | CLK(NULL, "pclk_fck", &pclk_fck, CK_3XXX), |
3386 | CLK(NULL, "pclkx2_fck", &pclkx2_fck, CK_3XXX), | 3391 | CLK(NULL, "pclkx2_fck", &pclkx2_fck, CK_3XXX), |
3387 | CLK(NULL, "atclk_fck", &atclk_fck, CK_3XXX), | 3392 | CLK(NULL, "atclk_fck", &atclk_fck, CK_3XXX), |
3388 | CLK(NULL, "traceclk_src_fck", &traceclk_src_fck, CK_3XXX), | 3393 | CLK(NULL, "traceclk_src_fck", &traceclk_src_fck, CK_3XXX), |
3389 | CLK(NULL, "traceclk_fck", &traceclk_fck, CK_3XXX), | 3394 | CLK(NULL, "traceclk_fck", &traceclk_fck, CK_3XXX), |
3390 | CLK(NULL, "sr1_fck", &sr1_fck, CK_343X), | 3395 | CLK(NULL, "sr1_fck", &sr1_fck, CK_343X), |
3391 | CLK(NULL, "sr2_fck", &sr2_fck, CK_343X), | 3396 | CLK(NULL, "sr2_fck", &sr2_fck, CK_343X), |
3392 | CLK(NULL, "sr_l4_ick", &sr_l4_ick, CK_343X), | 3397 | CLK(NULL, "sr_l4_ick", &sr_l4_ick, CK_343X), |
3393 | CLK(NULL, "secure_32k_fck", &secure_32k_fck, CK_3XXX), | 3398 | CLK(NULL, "secure_32k_fck", &secure_32k_fck, CK_3XXX), |
3394 | CLK(NULL, "gpt12_fck", &gpt12_fck, CK_3XXX), | 3399 | CLK(NULL, "gpt12_fck", &gpt12_fck, CK_3XXX), |
3395 | CLK(NULL, "wdt1_fck", &wdt1_fck, CK_3XXX), | 3400 | CLK(NULL, "wdt1_fck", &wdt1_fck, CK_3XXX), |
3396 | CLK(NULL, "ipss_ick", &ipss_ick, CK_AM35XX), | 3401 | CLK(NULL, "ipss_ick", &ipss_ick, CK_AM35XX), |
3397 | CLK(NULL, "rmii_ck", &rmii_ck, CK_AM35XX), | 3402 | CLK(NULL, "rmii_ck", &rmii_ck, CK_AM35XX), |
3398 | CLK(NULL, "pclk_ck", &pclk_ck, CK_AM35XX), | 3403 | CLK(NULL, "pclk_ck", &pclk_ck, CK_AM35XX), |
3399 | CLK("davinci_emac", "emac_clk", &emac_ick, CK_AM35XX), | 3404 | CLK("davinci_emac", "emac_clk", &emac_ick, CK_AM35XX), |
3400 | CLK("davinci_emac", "phy_clk", &emac_fck, CK_AM35XX), | 3405 | CLK("davinci_emac", "phy_clk", &emac_fck, CK_AM35XX), |
3401 | CLK("vpfe-capture", "master", &vpfe_ick, CK_AM35XX), | 3406 | CLK("vpfe-capture", "master", &vpfe_ick, CK_AM35XX), |
3402 | CLK("vpfe-capture", "slave", &vpfe_fck, CK_AM35XX), | 3407 | CLK("vpfe-capture", "slave", &vpfe_fck, CK_AM35XX), |
3403 | CLK("musb_hdrc", "ick", &hsotgusb_ick_am35xx, CK_AM35XX), | 3408 | CLK("musb_hdrc", "ick", &hsotgusb_ick_am35xx, CK_AM35XX), |
3404 | CLK("musb_hdrc", "fck", &hsotgusb_fck_am35xx, CK_AM35XX), | 3409 | CLK("musb_hdrc", "fck", &hsotgusb_fck_am35xx, CK_AM35XX), |
3405 | CLK(NULL, "hecc_ck", &hecc_ck, CK_AM35XX), | 3410 | CLK(NULL, "hecc_ck", &hecc_ck, CK_AM35XX), |
3406 | CLK(NULL, "uart4_ick", &uart4_ick_am35xx, CK_AM35XX), | 3411 | CLK(NULL, "uart4_ick", &uart4_ick_am35xx, CK_AM35XX), |
3407 | }; | 3412 | }; |
3408 | 3413 | ||
3409 | 3414 | ||
3410 | int __init omap3xxx_clk_init(void) | 3415 | int __init omap3xxx_clk_init(void) |
3411 | { | 3416 | { |
3412 | struct omap_clk *c; | 3417 | struct omap_clk *c; |
3413 | u32 cpu_clkflg = CK_3XXX; | 3418 | u32 cpu_clkflg = CK_3XXX; |
3414 | 3419 | ||
3415 | if (cpu_is_omap34xx()) { | 3420 | if (cpu_is_omap34xx()) { |
3416 | cpu_mask = RATE_IN_3XXX; | 3421 | cpu_mask = RATE_IN_3XXX; |
3417 | cpu_clkflg |= CK_343X; | 3422 | cpu_clkflg |= CK_343X; |
3418 | 3423 | ||
3419 | /* | 3424 | /* |
3420 | * Update this if there are further clock changes between ES2 | 3425 | * Update this if there are further clock changes between ES2 |
3421 | * and production parts | 3426 | * and production parts |
3422 | */ | 3427 | */ |
3423 | if (omap_rev() == OMAP3430_REV_ES1_0) { | 3428 | if (omap_rev() == OMAP3430_REV_ES1_0) { |
3424 | /* No 3430ES1-only rates exist, so no RATE_IN_3430ES1 */ | 3429 | /* No 3430ES1-only rates exist, so no RATE_IN_3430ES1 */ |
3425 | cpu_clkflg |= CK_3430ES1; | 3430 | cpu_clkflg |= CK_3430ES1; |
3426 | } else { | 3431 | } else { |
3427 | cpu_mask |= RATE_IN_3430ES2PLUS; | 3432 | cpu_mask |= RATE_IN_3430ES2PLUS; |
3428 | cpu_clkflg |= CK_3430ES2; | 3433 | cpu_clkflg |= CK_3430ES2; |
3429 | } | 3434 | } |
3430 | } else if (cpu_is_omap3517()) { | 3435 | } else if (cpu_is_omap3517()) { |
3431 | cpu_mask = RATE_IN_3XXX | RATE_IN_3430ES2PLUS; | 3436 | cpu_mask = RATE_IN_3XXX | RATE_IN_3430ES2PLUS; |
3432 | cpu_clkflg |= CK_3517; | 3437 | cpu_clkflg |= CK_3517; |
3433 | } else if (cpu_is_omap3505()) { | 3438 | } else if (cpu_is_omap3505()) { |
3434 | cpu_mask = RATE_IN_3XXX | RATE_IN_3430ES2PLUS; | 3439 | cpu_mask = RATE_IN_3XXX | RATE_IN_3430ES2PLUS; |
3435 | cpu_clkflg |= CK_3505; | 3440 | cpu_clkflg |= CK_3505; |
3436 | } | 3441 | } |
3437 | 3442 | ||
3438 | if (omap3_has_192mhz_clk()) | 3443 | if (omap3_has_192mhz_clk()) |
3439 | omap_96m_alwon_fck = omap_96m_alwon_fck_3630; | 3444 | omap_96m_alwon_fck = omap_96m_alwon_fck_3630; |
3440 | 3445 | ||
3441 | if (cpu_is_omap3630()) { | 3446 | if (cpu_is_omap3630()) { |
3442 | cpu_mask |= RATE_IN_36XX; | 3447 | cpu_mask |= RATE_IN_36XX; |
3443 | cpu_clkflg |= CK_36XX; | 3448 | cpu_clkflg |= CK_36XX; |
3444 | 3449 | ||
3445 | /* | 3450 | /* |
3446 | * XXX This type of dynamic rewriting of the clock tree is | 3451 | * XXX This type of dynamic rewriting of the clock tree is |
3447 | * deprecated and should be revised soon. | 3452 | * deprecated and should be revised soon. |
3448 | * | 3453 | * |
3449 | * For 3630: override clkops_omap2_dflt_wait for the | 3454 | * For 3630: override clkops_omap2_dflt_wait for the |
3450 | * clocks affected from PWRDN reset Limitation | 3455 | * clocks affected from PWRDN reset Limitation |
3451 | */ | 3456 | */ |
3452 | dpll3_m3x2_ck.ops = | 3457 | dpll3_m3x2_ck.ops = |
3453 | &clkops_omap36xx_pwrdn_with_hsdiv_wait_restore; | 3458 | &clkops_omap36xx_pwrdn_with_hsdiv_wait_restore; |
3454 | dpll4_m2x2_ck.ops = | 3459 | dpll4_m2x2_ck.ops = |
3455 | &clkops_omap36xx_pwrdn_with_hsdiv_wait_restore; | 3460 | &clkops_omap36xx_pwrdn_with_hsdiv_wait_restore; |
3456 | dpll4_m3x2_ck.ops = | 3461 | dpll4_m3x2_ck.ops = |
3457 | &clkops_omap36xx_pwrdn_with_hsdiv_wait_restore; | 3462 | &clkops_omap36xx_pwrdn_with_hsdiv_wait_restore; |
3458 | dpll4_m4x2_ck.ops = | 3463 | dpll4_m4x2_ck.ops = |
3459 | &clkops_omap36xx_pwrdn_with_hsdiv_wait_restore; | 3464 | &clkops_omap36xx_pwrdn_with_hsdiv_wait_restore; |
3460 | dpll4_m5x2_ck.ops = | 3465 | dpll4_m5x2_ck.ops = |
3461 | &clkops_omap36xx_pwrdn_with_hsdiv_wait_restore; | 3466 | &clkops_omap36xx_pwrdn_with_hsdiv_wait_restore; |
3462 | dpll4_m6x2_ck.ops = | 3467 | dpll4_m6x2_ck.ops = |
3463 | &clkops_omap36xx_pwrdn_with_hsdiv_wait_restore; | 3468 | &clkops_omap36xx_pwrdn_with_hsdiv_wait_restore; |
3464 | } | 3469 | } |
3465 | 3470 | ||
3466 | /* | 3471 | /* |
3467 | * XXX This type of dynamic rewriting of the clock tree is | 3472 | * XXX This type of dynamic rewriting of the clock tree is |
3468 | * deprecated and should be revised soon. | 3473 | * deprecated and should be revised soon. |
3469 | */ | 3474 | */ |
3470 | if (cpu_is_omap3630()) | 3475 | if (cpu_is_omap3630()) |
3471 | dpll4_dd = dpll4_dd_3630; | 3476 | dpll4_dd = dpll4_dd_3630; |
3472 | else | 3477 | else |
3473 | dpll4_dd = dpll4_dd_34xx; | 3478 | dpll4_dd = dpll4_dd_34xx; |
3474 | 3479 | ||
3475 | clk_init(&omap2_clk_functions); | 3480 | clk_init(&omap2_clk_functions); |
3476 | 3481 | ||
3477 | for (c = omap3xxx_clks; c < omap3xxx_clks + ARRAY_SIZE(omap3xxx_clks); | 3482 | for (c = omap3xxx_clks; c < omap3xxx_clks + ARRAY_SIZE(omap3xxx_clks); |
3478 | c++) | 3483 | c++) |
3479 | clk_preinit(c->lk.clk); | 3484 | clk_preinit(c->lk.clk); |
3480 | 3485 | ||
3481 | for (c = omap3xxx_clks; c < omap3xxx_clks + ARRAY_SIZE(omap3xxx_clks); | 3486 | for (c = omap3xxx_clks; c < omap3xxx_clks + ARRAY_SIZE(omap3xxx_clks); |
3482 | c++) | 3487 | c++) |
3483 | if (c->cpu & cpu_clkflg) { | 3488 | if (c->cpu & cpu_clkflg) { |
3484 | clkdev_add(&c->lk); | 3489 | clkdev_add(&c->lk); |
3485 | clk_register(c->lk.clk); | 3490 | clk_register(c->lk.clk); |
3486 | omap2_init_clk_clkdm(c->lk.clk); | 3491 | omap2_init_clk_clkdm(c->lk.clk); |
3487 | } | 3492 | } |
3488 | 3493 | ||
3489 | recalculate_root_clocks(); | 3494 | recalculate_root_clocks(); |
3490 | 3495 | ||
3491 | printk(KERN_INFO "Clocking rate (Crystal/Core/MPU): " | 3496 | printk(KERN_INFO "Clocking rate (Crystal/Core/MPU): " |
3492 | "%ld.%01ld/%ld/%ld MHz\n", | 3497 | "%ld.%01ld/%ld/%ld MHz\n", |
3493 | (osc_sys_ck.rate / 1000000), (osc_sys_ck.rate / 100000) % 10, | 3498 | (osc_sys_ck.rate / 1000000), (osc_sys_ck.rate / 100000) % 10, |
3494 | (core_ck.rate / 1000000), (arm_fck.rate / 1000000)); | 3499 | (core_ck.rate / 1000000), (arm_fck.rate / 1000000)); |
3495 | 3500 | ||
3496 | /* | 3501 | /* |
3497 | * Only enable those clocks we will need, let the drivers | 3502 | * Only enable those clocks we will need, let the drivers |
3498 | * enable other clocks as necessary | 3503 | * enable other clocks as necessary |
3499 | */ | 3504 | */ |
3500 | clk_enable_init_clocks(); | 3505 | clk_enable_init_clocks(); |
3501 | 3506 | ||
3502 | /* | 3507 | /* |
3503 | * Lock DPLL5 and put it in autoidle. | 3508 | * Lock DPLL5 and put it in autoidle. |
3504 | */ | 3509 | */ |
3505 | if (omap_rev() >= OMAP3430_REV_ES2_0) | 3510 | if (omap_rev() >= OMAP3430_REV_ES2_0) |
3506 | omap3_clk_lock_dpll5(); | 3511 | omap3_clk_lock_dpll5(); |
3507 | 3512 | ||
3508 | /* Avoid sleeping during omap3_core_dpll_m2_set_rate() */ | 3513 | /* Avoid sleeping during omap3_core_dpll_m2_set_rate() */ |
3509 | sdrc_ick_p = clk_get(NULL, "sdrc_ick"); | 3514 | sdrc_ick_p = clk_get(NULL, "sdrc_ick"); |
3510 | arm_fck_p = clk_get(NULL, "arm_fck"); | 3515 | arm_fck_p = clk_get(NULL, "arm_fck"); |
3511 | 3516 | ||
3512 | return 0; | 3517 | return 0; |
3513 | } | 3518 | } |
3514 | 3519 |
arch/arm/mach-realview/core.c
1 | /* | 1 | /* |
2 | * linux/arch/arm/mach-realview/core.c | 2 | * linux/arch/arm/mach-realview/core.c |
3 | * | 3 | * |
4 | * Copyright (C) 1999 - 2003 ARM Limited | 4 | * Copyright (C) 1999 - 2003 ARM Limited |
5 | * Copyright (C) 2000 Deep Blue Solutions Ltd | 5 | * Copyright (C) 2000 Deep Blue Solutions Ltd |
6 | * | 6 | * |
7 | * 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 |
8 | * it under the terms of the GNU General Public License as published by | 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 | 9 | * the Free Software Foundation; either version 2 of the License, or |
10 | * (at your option) any later version. | 10 | * (at your option) any later version. |
11 | * | 11 | * |
12 | * This program is distributed in the hope that it will be useful, | 12 | * This program is distributed in the hope that it will be useful, |
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 | * GNU General Public License for more details. | 15 | * GNU General Public License for more details. |
16 | * | 16 | * |
17 | * You should have received a copy of the GNU General Public License | 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 | 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 | 19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
20 | */ | 20 | */ |
21 | #include <linux/init.h> | 21 | #include <linux/init.h> |
22 | #include <linux/platform_device.h> | 22 | #include <linux/platform_device.h> |
23 | #include <linux/dma-mapping.h> | 23 | #include <linux/dma-mapping.h> |
24 | #include <linux/sysdev.h> | 24 | #include <linux/sysdev.h> |
25 | #include <linux/interrupt.h> | 25 | #include <linux/interrupt.h> |
26 | #include <linux/amba/bus.h> | 26 | #include <linux/amba/bus.h> |
27 | #include <linux/amba/clcd.h> | 27 | #include <linux/amba/clcd.h> |
28 | #include <linux/io.h> | 28 | #include <linux/io.h> |
29 | #include <linux/smsc911x.h> | 29 | #include <linux/smsc911x.h> |
30 | #include <linux/ata_platform.h> | 30 | #include <linux/ata_platform.h> |
31 | #include <linux/amba/mmci.h> | 31 | #include <linux/amba/mmci.h> |
32 | #include <linux/gfp.h> | 32 | #include <linux/gfp.h> |
33 | 33 | ||
34 | #include <asm/clkdev.h> | 34 | #include <asm/clkdev.h> |
35 | #include <asm/system.h> | 35 | #include <asm/system.h> |
36 | #include <mach/hardware.h> | 36 | #include <mach/hardware.h> |
37 | #include <asm/irq.h> | 37 | #include <asm/irq.h> |
38 | #include <asm/leds.h> | 38 | #include <asm/leds.h> |
39 | #include <asm/mach-types.h> | 39 | #include <asm/mach-types.h> |
40 | #include <asm/hardware/arm_timer.h> | 40 | #include <asm/hardware/arm_timer.h> |
41 | #include <asm/hardware/icst.h> | 41 | #include <asm/hardware/icst.h> |
42 | 42 | ||
43 | #include <asm/mach/arch.h> | 43 | #include <asm/mach/arch.h> |
44 | #include <asm/mach/flash.h> | 44 | #include <asm/mach/flash.h> |
45 | #include <asm/mach/irq.h> | 45 | #include <asm/mach/irq.h> |
46 | #include <asm/mach/map.h> | 46 | #include <asm/mach/map.h> |
47 | 47 | ||
48 | #include <asm/hardware/gic.h> | 48 | #include <asm/hardware/gic.h> |
49 | 49 | ||
50 | #include <mach/clkdev.h> | 50 | #include <mach/clkdev.h> |
51 | #include <mach/platform.h> | 51 | #include <mach/platform.h> |
52 | #include <mach/irqs.h> | 52 | #include <mach/irqs.h> |
53 | #include <plat/timer-sp.h> | 53 | #include <plat/timer-sp.h> |
54 | 54 | ||
55 | #include "core.h" | 55 | #include "core.h" |
56 | 56 | ||
57 | /* used by entry-macro.S and platsmp.c */ | 57 | /* used by entry-macro.S and platsmp.c */ |
58 | void __iomem *gic_cpu_base_addr; | 58 | void __iomem *gic_cpu_base_addr; |
59 | 59 | ||
60 | #ifdef CONFIG_ZONE_DMA | 60 | #ifdef CONFIG_ZONE_DMA |
61 | /* | 61 | /* |
62 | * Adjust the zones if there are restrictions for DMA access. | 62 | * Adjust the zones if there are restrictions for DMA access. |
63 | */ | 63 | */ |
64 | void __init realview_adjust_zones(int node, unsigned long *size, | 64 | void __init realview_adjust_zones(int node, unsigned long *size, |
65 | unsigned long *hole) | 65 | unsigned long *hole) |
66 | { | 66 | { |
67 | unsigned long dma_size = SZ_256M >> PAGE_SHIFT; | 67 | unsigned long dma_size = SZ_256M >> PAGE_SHIFT; |
68 | 68 | ||
69 | if (!machine_is_realview_pbx() || node || (size[0] <= dma_size)) | 69 | if (!machine_is_realview_pbx() || node || (size[0] <= dma_size)) |
70 | return; | 70 | return; |
71 | 71 | ||
72 | size[ZONE_NORMAL] = size[0] - dma_size; | 72 | size[ZONE_NORMAL] = size[0] - dma_size; |
73 | size[ZONE_DMA] = dma_size; | 73 | size[ZONE_DMA] = dma_size; |
74 | hole[ZONE_NORMAL] = hole[0]; | 74 | hole[ZONE_NORMAL] = hole[0]; |
75 | hole[ZONE_DMA] = 0; | 75 | hole[ZONE_DMA] = 0; |
76 | } | 76 | } |
77 | #endif | 77 | #endif |
78 | 78 | ||
79 | 79 | ||
80 | #define REALVIEW_FLASHCTRL (__io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_FLASH_OFFSET) | 80 | #define REALVIEW_FLASHCTRL (__io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_FLASH_OFFSET) |
81 | 81 | ||
82 | static int realview_flash_init(void) | 82 | static int realview_flash_init(void) |
83 | { | 83 | { |
84 | u32 val; | 84 | u32 val; |
85 | 85 | ||
86 | val = __raw_readl(REALVIEW_FLASHCTRL); | 86 | val = __raw_readl(REALVIEW_FLASHCTRL); |
87 | val &= ~REALVIEW_FLASHPROG_FLVPPEN; | 87 | val &= ~REALVIEW_FLASHPROG_FLVPPEN; |
88 | __raw_writel(val, REALVIEW_FLASHCTRL); | 88 | __raw_writel(val, REALVIEW_FLASHCTRL); |
89 | 89 | ||
90 | return 0; | 90 | return 0; |
91 | } | 91 | } |
92 | 92 | ||
93 | static void realview_flash_exit(void) | 93 | static void realview_flash_exit(void) |
94 | { | 94 | { |
95 | u32 val; | 95 | u32 val; |
96 | 96 | ||
97 | val = __raw_readl(REALVIEW_FLASHCTRL); | 97 | val = __raw_readl(REALVIEW_FLASHCTRL); |
98 | val &= ~REALVIEW_FLASHPROG_FLVPPEN; | 98 | val &= ~REALVIEW_FLASHPROG_FLVPPEN; |
99 | __raw_writel(val, REALVIEW_FLASHCTRL); | 99 | __raw_writel(val, REALVIEW_FLASHCTRL); |
100 | } | 100 | } |
101 | 101 | ||
102 | static void realview_flash_set_vpp(int on) | 102 | static void realview_flash_set_vpp(int on) |
103 | { | 103 | { |
104 | u32 val; | 104 | u32 val; |
105 | 105 | ||
106 | val = __raw_readl(REALVIEW_FLASHCTRL); | 106 | val = __raw_readl(REALVIEW_FLASHCTRL); |
107 | if (on) | 107 | if (on) |
108 | val |= REALVIEW_FLASHPROG_FLVPPEN; | 108 | val |= REALVIEW_FLASHPROG_FLVPPEN; |
109 | else | 109 | else |
110 | val &= ~REALVIEW_FLASHPROG_FLVPPEN; | 110 | val &= ~REALVIEW_FLASHPROG_FLVPPEN; |
111 | __raw_writel(val, REALVIEW_FLASHCTRL); | 111 | __raw_writel(val, REALVIEW_FLASHCTRL); |
112 | } | 112 | } |
113 | 113 | ||
114 | static struct flash_platform_data realview_flash_data = { | 114 | static struct flash_platform_data realview_flash_data = { |
115 | .map_name = "cfi_probe", | 115 | .map_name = "cfi_probe", |
116 | .width = 4, | 116 | .width = 4, |
117 | .init = realview_flash_init, | 117 | .init = realview_flash_init, |
118 | .exit = realview_flash_exit, | 118 | .exit = realview_flash_exit, |
119 | .set_vpp = realview_flash_set_vpp, | 119 | .set_vpp = realview_flash_set_vpp, |
120 | }; | 120 | }; |
121 | 121 | ||
122 | struct platform_device realview_flash_device = { | 122 | struct platform_device realview_flash_device = { |
123 | .name = "armflash", | 123 | .name = "armflash", |
124 | .id = 0, | 124 | .id = 0, |
125 | .dev = { | 125 | .dev = { |
126 | .platform_data = &realview_flash_data, | 126 | .platform_data = &realview_flash_data, |
127 | }, | 127 | }, |
128 | }; | 128 | }; |
129 | 129 | ||
130 | int realview_flash_register(struct resource *res, u32 num) | 130 | int realview_flash_register(struct resource *res, u32 num) |
131 | { | 131 | { |
132 | realview_flash_device.resource = res; | 132 | realview_flash_device.resource = res; |
133 | realview_flash_device.num_resources = num; | 133 | realview_flash_device.num_resources = num; |
134 | return platform_device_register(&realview_flash_device); | 134 | return platform_device_register(&realview_flash_device); |
135 | } | 135 | } |
136 | 136 | ||
137 | static struct smsc911x_platform_config smsc911x_config = { | 137 | static struct smsc911x_platform_config smsc911x_config = { |
138 | .flags = SMSC911X_USE_32BIT, | 138 | .flags = SMSC911X_USE_32BIT, |
139 | .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_HIGH, | 139 | .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_HIGH, |
140 | .irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL, | 140 | .irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL, |
141 | .phy_interface = PHY_INTERFACE_MODE_MII, | 141 | .phy_interface = PHY_INTERFACE_MODE_MII, |
142 | }; | 142 | }; |
143 | 143 | ||
144 | static struct platform_device realview_eth_device = { | 144 | static struct platform_device realview_eth_device = { |
145 | .name = "smsc911x", | 145 | .name = "smsc911x", |
146 | .id = 0, | 146 | .id = 0, |
147 | .num_resources = 2, | 147 | .num_resources = 2, |
148 | }; | 148 | }; |
149 | 149 | ||
150 | int realview_eth_register(const char *name, struct resource *res) | 150 | int realview_eth_register(const char *name, struct resource *res) |
151 | { | 151 | { |
152 | if (name) | 152 | if (name) |
153 | realview_eth_device.name = name; | 153 | realview_eth_device.name = name; |
154 | realview_eth_device.resource = res; | 154 | realview_eth_device.resource = res; |
155 | if (strcmp(realview_eth_device.name, "smsc911x") == 0) | 155 | if (strcmp(realview_eth_device.name, "smsc911x") == 0) |
156 | realview_eth_device.dev.platform_data = &smsc911x_config; | 156 | realview_eth_device.dev.platform_data = &smsc911x_config; |
157 | 157 | ||
158 | return platform_device_register(&realview_eth_device); | 158 | return platform_device_register(&realview_eth_device); |
159 | } | 159 | } |
160 | 160 | ||
161 | struct platform_device realview_usb_device = { | 161 | struct platform_device realview_usb_device = { |
162 | .name = "isp1760", | 162 | .name = "isp1760", |
163 | .num_resources = 2, | 163 | .num_resources = 2, |
164 | }; | 164 | }; |
165 | 165 | ||
166 | int realview_usb_register(struct resource *res) | 166 | int realview_usb_register(struct resource *res) |
167 | { | 167 | { |
168 | realview_usb_device.resource = res; | 168 | realview_usb_device.resource = res; |
169 | return platform_device_register(&realview_usb_device); | 169 | return platform_device_register(&realview_usb_device); |
170 | } | 170 | } |
171 | 171 | ||
172 | static struct pata_platform_info pata_platform_data = { | 172 | static struct pata_platform_info pata_platform_data = { |
173 | .ioport_shift = 1, | 173 | .ioport_shift = 1, |
174 | }; | 174 | }; |
175 | 175 | ||
176 | static struct resource pata_resources[] = { | 176 | static struct resource pata_resources[] = { |
177 | [0] = { | 177 | [0] = { |
178 | .start = REALVIEW_CF_BASE, | 178 | .start = REALVIEW_CF_BASE, |
179 | .end = REALVIEW_CF_BASE + 0xff, | 179 | .end = REALVIEW_CF_BASE + 0xff, |
180 | .flags = IORESOURCE_MEM, | 180 | .flags = IORESOURCE_MEM, |
181 | }, | 181 | }, |
182 | [1] = { | 182 | [1] = { |
183 | .start = REALVIEW_CF_BASE + 0x100, | 183 | .start = REALVIEW_CF_BASE + 0x100, |
184 | .end = REALVIEW_CF_BASE + SZ_4K - 1, | 184 | .end = REALVIEW_CF_BASE + SZ_4K - 1, |
185 | .flags = IORESOURCE_MEM, | 185 | .flags = IORESOURCE_MEM, |
186 | }, | 186 | }, |
187 | }; | 187 | }; |
188 | 188 | ||
189 | struct platform_device realview_cf_device = { | 189 | struct platform_device realview_cf_device = { |
190 | .name = "pata_platform", | 190 | .name = "pata_platform", |
191 | .id = -1, | 191 | .id = -1, |
192 | .num_resources = ARRAY_SIZE(pata_resources), | 192 | .num_resources = ARRAY_SIZE(pata_resources), |
193 | .resource = pata_resources, | 193 | .resource = pata_resources, |
194 | .dev = { | 194 | .dev = { |
195 | .platform_data = &pata_platform_data, | 195 | .platform_data = &pata_platform_data, |
196 | }, | 196 | }, |
197 | }; | 197 | }; |
198 | 198 | ||
199 | static struct resource realview_i2c_resource = { | 199 | static struct resource realview_i2c_resource = { |
200 | .start = REALVIEW_I2C_BASE, | 200 | .start = REALVIEW_I2C_BASE, |
201 | .end = REALVIEW_I2C_BASE + SZ_4K - 1, | 201 | .end = REALVIEW_I2C_BASE + SZ_4K - 1, |
202 | .flags = IORESOURCE_MEM, | 202 | .flags = IORESOURCE_MEM, |
203 | }; | 203 | }; |
204 | 204 | ||
205 | struct platform_device realview_i2c_device = { | 205 | struct platform_device realview_i2c_device = { |
206 | .name = "versatile-i2c", | 206 | .name = "versatile-i2c", |
207 | .id = 0, | 207 | .id = 0, |
208 | .num_resources = 1, | 208 | .num_resources = 1, |
209 | .resource = &realview_i2c_resource, | 209 | .resource = &realview_i2c_resource, |
210 | }; | 210 | }; |
211 | 211 | ||
212 | static struct i2c_board_info realview_i2c_board_info[] = { | 212 | static struct i2c_board_info realview_i2c_board_info[] = { |
213 | { | 213 | { |
214 | I2C_BOARD_INFO("ds1338", 0xd0 >> 1), | 214 | I2C_BOARD_INFO("ds1338", 0xd0 >> 1), |
215 | }, | 215 | }, |
216 | }; | 216 | }; |
217 | 217 | ||
218 | static int __init realview_i2c_init(void) | 218 | static int __init realview_i2c_init(void) |
219 | { | 219 | { |
220 | return i2c_register_board_info(0, realview_i2c_board_info, | 220 | return i2c_register_board_info(0, realview_i2c_board_info, |
221 | ARRAY_SIZE(realview_i2c_board_info)); | 221 | ARRAY_SIZE(realview_i2c_board_info)); |
222 | } | 222 | } |
223 | arch_initcall(realview_i2c_init); | 223 | arch_initcall(realview_i2c_init); |
224 | 224 | ||
225 | #define REALVIEW_SYSMCI (__io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_MCI_OFFSET) | 225 | #define REALVIEW_SYSMCI (__io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_MCI_OFFSET) |
226 | 226 | ||
227 | /* | 227 | /* |
228 | * This is only used if GPIOLIB support is disabled | 228 | * This is only used if GPIOLIB support is disabled |
229 | */ | 229 | */ |
230 | static unsigned int realview_mmc_status(struct device *dev) | 230 | static unsigned int realview_mmc_status(struct device *dev) |
231 | { | 231 | { |
232 | struct amba_device *adev = container_of(dev, struct amba_device, dev); | 232 | struct amba_device *adev = container_of(dev, struct amba_device, dev); |
233 | u32 mask; | 233 | u32 mask; |
234 | 234 | ||
235 | if (adev->res.start == REALVIEW_MMCI0_BASE) | 235 | if (adev->res.start == REALVIEW_MMCI0_BASE) |
236 | mask = 1; | 236 | mask = 1; |
237 | else | 237 | else |
238 | mask = 2; | 238 | mask = 2; |
239 | 239 | ||
240 | return !(readl(REALVIEW_SYSMCI) & mask); | 240 | return !(readl(REALVIEW_SYSMCI) & mask); |
241 | } | 241 | } |
242 | 242 | ||
243 | struct mmci_platform_data realview_mmc0_plat_data = { | 243 | struct mmci_platform_data realview_mmc0_plat_data = { |
244 | .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, | 244 | .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, |
245 | .status = realview_mmc_status, | 245 | .status = realview_mmc_status, |
246 | .gpio_wp = 17, | 246 | .gpio_wp = 17, |
247 | .gpio_cd = 16, | 247 | .gpio_cd = 16, |
248 | }; | 248 | }; |
249 | 249 | ||
250 | struct mmci_platform_data realview_mmc1_plat_data = { | 250 | struct mmci_platform_data realview_mmc1_plat_data = { |
251 | .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, | 251 | .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, |
252 | .status = realview_mmc_status, | 252 | .status = realview_mmc_status, |
253 | .gpio_wp = 19, | 253 | .gpio_wp = 19, |
254 | .gpio_cd = 18, | 254 | .gpio_cd = 18, |
255 | }; | 255 | }; |
256 | 256 | ||
257 | /* | 257 | /* |
258 | * Clock handling | 258 | * Clock handling |
259 | */ | 259 | */ |
260 | static const struct icst_params realview_oscvco_params = { | 260 | static const struct icst_params realview_oscvco_params = { |
261 | .ref = 24000000, | 261 | .ref = 24000000, |
262 | .vco_max = ICST307_VCO_MAX, | 262 | .vco_max = ICST307_VCO_MAX, |
263 | .vco_min = ICST307_VCO_MIN, | 263 | .vco_min = ICST307_VCO_MIN, |
264 | .vd_min = 4 + 8, | 264 | .vd_min = 4 + 8, |
265 | .vd_max = 511 + 8, | 265 | .vd_max = 511 + 8, |
266 | .rd_min = 1 + 2, | 266 | .rd_min = 1 + 2, |
267 | .rd_max = 127 + 2, | 267 | .rd_max = 127 + 2, |
268 | .s2div = icst307_s2div, | 268 | .s2div = icst307_s2div, |
269 | .idx2s = icst307_idx2s, | 269 | .idx2s = icst307_idx2s, |
270 | }; | 270 | }; |
271 | 271 | ||
272 | static void realview_oscvco_set(struct clk *clk, struct icst_vco vco) | 272 | static void realview_oscvco_set(struct clk *clk, struct icst_vco vco) |
273 | { | 273 | { |
274 | void __iomem *sys_lock = __io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_LOCK_OFFSET; | 274 | void __iomem *sys_lock = __io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_LOCK_OFFSET; |
275 | u32 val; | 275 | u32 val; |
276 | 276 | ||
277 | val = readl(clk->vcoreg) & ~0x7ffff; | 277 | val = readl(clk->vcoreg) & ~0x7ffff; |
278 | val |= vco.v | (vco.r << 9) | (vco.s << 16); | 278 | val |= vco.v | (vco.r << 9) | (vco.s << 16); |
279 | 279 | ||
280 | writel(0xa05f, sys_lock); | 280 | writel(0xa05f, sys_lock); |
281 | writel(val, clk->vcoreg); | 281 | writel(val, clk->vcoreg); |
282 | writel(0, sys_lock); | 282 | writel(0, sys_lock); |
283 | } | 283 | } |
284 | 284 | ||
285 | static const struct clk_ops oscvco_clk_ops = { | 285 | static const struct clk_ops oscvco_clk_ops = { |
286 | .round = icst_clk_round, | 286 | .round = icst_clk_round, |
287 | .set = icst_clk_set, | 287 | .set = icst_clk_set, |
288 | .setvco = realview_oscvco_set, | 288 | .setvco = realview_oscvco_set, |
289 | }; | 289 | }; |
290 | 290 | ||
291 | static struct clk oscvco_clk = { | 291 | static struct clk oscvco_clk = { |
292 | .ops = &oscvco_clk_ops, | 292 | .ops = &oscvco_clk_ops, |
293 | .params = &realview_oscvco_params, | 293 | .params = &realview_oscvco_params, |
294 | }; | 294 | }; |
295 | 295 | ||
296 | /* | 296 | /* |
297 | * These are fixed clocks. | 297 | * These are fixed clocks. |
298 | */ | 298 | */ |
299 | static struct clk ref24_clk = { | 299 | static struct clk ref24_clk = { |
300 | .rate = 24000000, | 300 | .rate = 24000000, |
301 | }; | 301 | }; |
302 | 302 | ||
303 | static struct clk dummy_apb_pclk; | ||
304 | |||
303 | static struct clk_lookup lookups[] = { | 305 | static struct clk_lookup lookups[] = { |
304 | { /* UART0 */ | 306 | { /* Bus clock */ |
307 | .con_id = "apb_pclk", | ||
308 | .clk = &dummy_apb_pclk, | ||
309 | }, { /* UART0 */ | ||
305 | .dev_id = "dev:uart0", | 310 | .dev_id = "dev:uart0", |
306 | .clk = &ref24_clk, | 311 | .clk = &ref24_clk, |
307 | }, { /* UART1 */ | 312 | }, { /* UART1 */ |
308 | .dev_id = "dev:uart1", | 313 | .dev_id = "dev:uart1", |
309 | .clk = &ref24_clk, | 314 | .clk = &ref24_clk, |
310 | }, { /* UART2 */ | 315 | }, { /* UART2 */ |
311 | .dev_id = "dev:uart2", | 316 | .dev_id = "dev:uart2", |
312 | .clk = &ref24_clk, | 317 | .clk = &ref24_clk, |
313 | }, { /* UART3 */ | 318 | }, { /* UART3 */ |
314 | .dev_id = "fpga:uart3", | 319 | .dev_id = "fpga:uart3", |
315 | .clk = &ref24_clk, | 320 | .clk = &ref24_clk, |
316 | }, { /* KMI0 */ | 321 | }, { /* KMI0 */ |
317 | .dev_id = "fpga:kmi0", | 322 | .dev_id = "fpga:kmi0", |
318 | .clk = &ref24_clk, | 323 | .clk = &ref24_clk, |
319 | }, { /* KMI1 */ | 324 | }, { /* KMI1 */ |
320 | .dev_id = "fpga:kmi1", | 325 | .dev_id = "fpga:kmi1", |
321 | .clk = &ref24_clk, | 326 | .clk = &ref24_clk, |
322 | }, { /* MMC0 */ | 327 | }, { /* MMC0 */ |
323 | .dev_id = "fpga:mmc0", | 328 | .dev_id = "fpga:mmc0", |
324 | .clk = &ref24_clk, | 329 | .clk = &ref24_clk, |
325 | }, { /* EB:CLCD */ | 330 | }, { /* EB:CLCD */ |
326 | .dev_id = "dev:clcd", | 331 | .dev_id = "dev:clcd", |
327 | .clk = &oscvco_clk, | 332 | .clk = &oscvco_clk, |
328 | }, { /* PB:CLCD */ | 333 | }, { /* PB:CLCD */ |
329 | .dev_id = "issp:clcd", | 334 | .dev_id = "issp:clcd", |
330 | .clk = &oscvco_clk, | 335 | .clk = &oscvco_clk, |
331 | } | 336 | } |
332 | }; | 337 | }; |
333 | 338 | ||
334 | static int __init clk_init(void) | 339 | static int __init clk_init(void) |
335 | { | 340 | { |
336 | if (machine_is_realview_pb1176()) | 341 | if (machine_is_realview_pb1176()) |
337 | oscvco_clk.vcoreg = __io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_OSC0_OFFSET; | 342 | oscvco_clk.vcoreg = __io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_OSC0_OFFSET; |
338 | else | 343 | else |
339 | oscvco_clk.vcoreg = __io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_OSC4_OFFSET; | 344 | oscvco_clk.vcoreg = __io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_OSC4_OFFSET; |
340 | 345 | ||
341 | clkdev_add_table(lookups, ARRAY_SIZE(lookups)); | 346 | clkdev_add_table(lookups, ARRAY_SIZE(lookups)); |
342 | 347 | ||
343 | return 0; | 348 | return 0; |
344 | } | 349 | } |
345 | arch_initcall(clk_init); | 350 | arch_initcall(clk_init); |
346 | 351 | ||
347 | /* | 352 | /* |
348 | * CLCD support. | 353 | * CLCD support. |
349 | */ | 354 | */ |
350 | #define SYS_CLCD_NLCDIOON (1 << 2) | 355 | #define SYS_CLCD_NLCDIOON (1 << 2) |
351 | #define SYS_CLCD_VDDPOSSWITCH (1 << 3) | 356 | #define SYS_CLCD_VDDPOSSWITCH (1 << 3) |
352 | #define SYS_CLCD_PWR3V5SWITCH (1 << 4) | 357 | #define SYS_CLCD_PWR3V5SWITCH (1 << 4) |
353 | #define SYS_CLCD_ID_MASK (0x1f << 8) | 358 | #define SYS_CLCD_ID_MASK (0x1f << 8) |
354 | #define SYS_CLCD_ID_SANYO_3_8 (0x00 << 8) | 359 | #define SYS_CLCD_ID_SANYO_3_8 (0x00 << 8) |
355 | #define SYS_CLCD_ID_UNKNOWN_8_4 (0x01 << 8) | 360 | #define SYS_CLCD_ID_UNKNOWN_8_4 (0x01 << 8) |
356 | #define SYS_CLCD_ID_EPSON_2_2 (0x02 << 8) | 361 | #define SYS_CLCD_ID_EPSON_2_2 (0x02 << 8) |
357 | #define SYS_CLCD_ID_SANYO_2_5 (0x07 << 8) | 362 | #define SYS_CLCD_ID_SANYO_2_5 (0x07 << 8) |
358 | #define SYS_CLCD_ID_VGA (0x1f << 8) | 363 | #define SYS_CLCD_ID_VGA (0x1f << 8) |
359 | 364 | ||
360 | static struct clcd_panel vga = { | 365 | static struct clcd_panel vga = { |
361 | .mode = { | 366 | .mode = { |
362 | .name = "VGA", | 367 | .name = "VGA", |
363 | .refresh = 60, | 368 | .refresh = 60, |
364 | .xres = 640, | 369 | .xres = 640, |
365 | .yres = 480, | 370 | .yres = 480, |
366 | .pixclock = 39721, | 371 | .pixclock = 39721, |
367 | .left_margin = 40, | 372 | .left_margin = 40, |
368 | .right_margin = 24, | 373 | .right_margin = 24, |
369 | .upper_margin = 32, | 374 | .upper_margin = 32, |
370 | .lower_margin = 11, | 375 | .lower_margin = 11, |
371 | .hsync_len = 96, | 376 | .hsync_len = 96, |
372 | .vsync_len = 2, | 377 | .vsync_len = 2, |
373 | .sync = 0, | 378 | .sync = 0, |
374 | .vmode = FB_VMODE_NONINTERLACED, | 379 | .vmode = FB_VMODE_NONINTERLACED, |
375 | }, | 380 | }, |
376 | .width = -1, | 381 | .width = -1, |
377 | .height = -1, | 382 | .height = -1, |
378 | .tim2 = TIM2_BCD | TIM2_IPC, | 383 | .tim2 = TIM2_BCD | TIM2_IPC, |
379 | .cntl = CNTL_LCDTFT | CNTL_BGR | CNTL_LCDVCOMP(1), | 384 | .cntl = CNTL_LCDTFT | CNTL_BGR | CNTL_LCDVCOMP(1), |
380 | .bpp = 16, | 385 | .bpp = 16, |
381 | }; | 386 | }; |
382 | 387 | ||
383 | static struct clcd_panel xvga = { | 388 | static struct clcd_panel xvga = { |
384 | .mode = { | 389 | .mode = { |
385 | .name = "XVGA", | 390 | .name = "XVGA", |
386 | .refresh = 60, | 391 | .refresh = 60, |
387 | .xres = 1024, | 392 | .xres = 1024, |
388 | .yres = 768, | 393 | .yres = 768, |
389 | .pixclock = 15748, | 394 | .pixclock = 15748, |
390 | .left_margin = 152, | 395 | .left_margin = 152, |
391 | .right_margin = 48, | 396 | .right_margin = 48, |
392 | .upper_margin = 23, | 397 | .upper_margin = 23, |
393 | .lower_margin = 3, | 398 | .lower_margin = 3, |
394 | .hsync_len = 104, | 399 | .hsync_len = 104, |
395 | .vsync_len = 4, | 400 | .vsync_len = 4, |
396 | .sync = 0, | 401 | .sync = 0, |
397 | .vmode = FB_VMODE_NONINTERLACED, | 402 | .vmode = FB_VMODE_NONINTERLACED, |
398 | }, | 403 | }, |
399 | .width = -1, | 404 | .width = -1, |
400 | .height = -1, | 405 | .height = -1, |
401 | .tim2 = TIM2_BCD | TIM2_IPC, | 406 | .tim2 = TIM2_BCD | TIM2_IPC, |
402 | .cntl = CNTL_LCDTFT | CNTL_BGR | CNTL_LCDVCOMP(1), | 407 | .cntl = CNTL_LCDTFT | CNTL_BGR | CNTL_LCDVCOMP(1), |
403 | .bpp = 16, | 408 | .bpp = 16, |
404 | }; | 409 | }; |
405 | 410 | ||
406 | static struct clcd_panel sanyo_3_8_in = { | 411 | static struct clcd_panel sanyo_3_8_in = { |
407 | .mode = { | 412 | .mode = { |
408 | .name = "Sanyo QVGA", | 413 | .name = "Sanyo QVGA", |
409 | .refresh = 116, | 414 | .refresh = 116, |
410 | .xres = 320, | 415 | .xres = 320, |
411 | .yres = 240, | 416 | .yres = 240, |
412 | .pixclock = 100000, | 417 | .pixclock = 100000, |
413 | .left_margin = 6, | 418 | .left_margin = 6, |
414 | .right_margin = 6, | 419 | .right_margin = 6, |
415 | .upper_margin = 5, | 420 | .upper_margin = 5, |
416 | .lower_margin = 5, | 421 | .lower_margin = 5, |
417 | .hsync_len = 6, | 422 | .hsync_len = 6, |
418 | .vsync_len = 6, | 423 | .vsync_len = 6, |
419 | .sync = 0, | 424 | .sync = 0, |
420 | .vmode = FB_VMODE_NONINTERLACED, | 425 | .vmode = FB_VMODE_NONINTERLACED, |
421 | }, | 426 | }, |
422 | .width = -1, | 427 | .width = -1, |
423 | .height = -1, | 428 | .height = -1, |
424 | .tim2 = TIM2_BCD, | 429 | .tim2 = TIM2_BCD, |
425 | .cntl = CNTL_LCDTFT | CNTL_BGR | CNTL_LCDVCOMP(1), | 430 | .cntl = CNTL_LCDTFT | CNTL_BGR | CNTL_LCDVCOMP(1), |
426 | .bpp = 16, | 431 | .bpp = 16, |
427 | }; | 432 | }; |
428 | 433 | ||
429 | static struct clcd_panel sanyo_2_5_in = { | 434 | static struct clcd_panel sanyo_2_5_in = { |
430 | .mode = { | 435 | .mode = { |
431 | .name = "Sanyo QVGA Portrait", | 436 | .name = "Sanyo QVGA Portrait", |
432 | .refresh = 116, | 437 | .refresh = 116, |
433 | .xres = 240, | 438 | .xres = 240, |
434 | .yres = 320, | 439 | .yres = 320, |
435 | .pixclock = 100000, | 440 | .pixclock = 100000, |
436 | .left_margin = 20, | 441 | .left_margin = 20, |
437 | .right_margin = 10, | 442 | .right_margin = 10, |
438 | .upper_margin = 2, | 443 | .upper_margin = 2, |
439 | .lower_margin = 2, | 444 | .lower_margin = 2, |
440 | .hsync_len = 10, | 445 | .hsync_len = 10, |
441 | .vsync_len = 2, | 446 | .vsync_len = 2, |
442 | .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, | 447 | .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, |
443 | .vmode = FB_VMODE_NONINTERLACED, | 448 | .vmode = FB_VMODE_NONINTERLACED, |
444 | }, | 449 | }, |
445 | .width = -1, | 450 | .width = -1, |
446 | .height = -1, | 451 | .height = -1, |
447 | .tim2 = TIM2_IVS | TIM2_IHS | TIM2_IPC, | 452 | .tim2 = TIM2_IVS | TIM2_IHS | TIM2_IPC, |
448 | .cntl = CNTL_LCDTFT | CNTL_BGR | CNTL_LCDVCOMP(1), | 453 | .cntl = CNTL_LCDTFT | CNTL_BGR | CNTL_LCDVCOMP(1), |
449 | .bpp = 16, | 454 | .bpp = 16, |
450 | }; | 455 | }; |
451 | 456 | ||
452 | static struct clcd_panel epson_2_2_in = { | 457 | static struct clcd_panel epson_2_2_in = { |
453 | .mode = { | 458 | .mode = { |
454 | .name = "Epson QCIF", | 459 | .name = "Epson QCIF", |
455 | .refresh = 390, | 460 | .refresh = 390, |
456 | .xres = 176, | 461 | .xres = 176, |
457 | .yres = 220, | 462 | .yres = 220, |
458 | .pixclock = 62500, | 463 | .pixclock = 62500, |
459 | .left_margin = 3, | 464 | .left_margin = 3, |
460 | .right_margin = 2, | 465 | .right_margin = 2, |
461 | .upper_margin = 1, | 466 | .upper_margin = 1, |
462 | .lower_margin = 0, | 467 | .lower_margin = 0, |
463 | .hsync_len = 3, | 468 | .hsync_len = 3, |
464 | .vsync_len = 2, | 469 | .vsync_len = 2, |
465 | .sync = 0, | 470 | .sync = 0, |
466 | .vmode = FB_VMODE_NONINTERLACED, | 471 | .vmode = FB_VMODE_NONINTERLACED, |
467 | }, | 472 | }, |
468 | .width = -1, | 473 | .width = -1, |
469 | .height = -1, | 474 | .height = -1, |
470 | .tim2 = TIM2_BCD | TIM2_IPC, | 475 | .tim2 = TIM2_BCD | TIM2_IPC, |
471 | .cntl = CNTL_LCDTFT | CNTL_BGR | CNTL_LCDVCOMP(1), | 476 | .cntl = CNTL_LCDTFT | CNTL_BGR | CNTL_LCDVCOMP(1), |
472 | .bpp = 16, | 477 | .bpp = 16, |
473 | }; | 478 | }; |
474 | 479 | ||
475 | /* | 480 | /* |
476 | * Detect which LCD panel is connected, and return the appropriate | 481 | * Detect which LCD panel is connected, and return the appropriate |
477 | * clcd_panel structure. Note: we do not have any information on | 482 | * clcd_panel structure. Note: we do not have any information on |
478 | * the required timings for the 8.4in panel, so we presently assume | 483 | * the required timings for the 8.4in panel, so we presently assume |
479 | * VGA timings. | 484 | * VGA timings. |
480 | */ | 485 | */ |
481 | static struct clcd_panel *realview_clcd_panel(void) | 486 | static struct clcd_panel *realview_clcd_panel(void) |
482 | { | 487 | { |
483 | void __iomem *sys_clcd = __io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_CLCD_OFFSET; | 488 | void __iomem *sys_clcd = __io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_CLCD_OFFSET; |
484 | struct clcd_panel *vga_panel; | 489 | struct clcd_panel *vga_panel; |
485 | struct clcd_panel *panel; | 490 | struct clcd_panel *panel; |
486 | u32 val; | 491 | u32 val; |
487 | 492 | ||
488 | if (machine_is_realview_eb()) | 493 | if (machine_is_realview_eb()) |
489 | vga_panel = &vga; | 494 | vga_panel = &vga; |
490 | else | 495 | else |
491 | vga_panel = &xvga; | 496 | vga_panel = &xvga; |
492 | 497 | ||
493 | val = readl(sys_clcd) & SYS_CLCD_ID_MASK; | 498 | val = readl(sys_clcd) & SYS_CLCD_ID_MASK; |
494 | if (val == SYS_CLCD_ID_SANYO_3_8) | 499 | if (val == SYS_CLCD_ID_SANYO_3_8) |
495 | panel = &sanyo_3_8_in; | 500 | panel = &sanyo_3_8_in; |
496 | else if (val == SYS_CLCD_ID_SANYO_2_5) | 501 | else if (val == SYS_CLCD_ID_SANYO_2_5) |
497 | panel = &sanyo_2_5_in; | 502 | panel = &sanyo_2_5_in; |
498 | else if (val == SYS_CLCD_ID_EPSON_2_2) | 503 | else if (val == SYS_CLCD_ID_EPSON_2_2) |
499 | panel = &epson_2_2_in; | 504 | panel = &epson_2_2_in; |
500 | else if (val == SYS_CLCD_ID_VGA) | 505 | else if (val == SYS_CLCD_ID_VGA) |
501 | panel = vga_panel; | 506 | panel = vga_panel; |
502 | else { | 507 | else { |
503 | printk(KERN_ERR "CLCD: unknown LCD panel ID 0x%08x, using VGA\n", | 508 | printk(KERN_ERR "CLCD: unknown LCD panel ID 0x%08x, using VGA\n", |
504 | val); | 509 | val); |
505 | panel = vga_panel; | 510 | panel = vga_panel; |
506 | } | 511 | } |
507 | 512 | ||
508 | return panel; | 513 | return panel; |
509 | } | 514 | } |
510 | 515 | ||
511 | /* | 516 | /* |
512 | * Disable all display connectors on the interface module. | 517 | * Disable all display connectors on the interface module. |
513 | */ | 518 | */ |
514 | static void realview_clcd_disable(struct clcd_fb *fb) | 519 | static void realview_clcd_disable(struct clcd_fb *fb) |
515 | { | 520 | { |
516 | void __iomem *sys_clcd = __io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_CLCD_OFFSET; | 521 | void __iomem *sys_clcd = __io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_CLCD_OFFSET; |
517 | u32 val; | 522 | u32 val; |
518 | 523 | ||
519 | val = readl(sys_clcd); | 524 | val = readl(sys_clcd); |
520 | val &= ~SYS_CLCD_NLCDIOON | SYS_CLCD_PWR3V5SWITCH; | 525 | val &= ~SYS_CLCD_NLCDIOON | SYS_CLCD_PWR3V5SWITCH; |
521 | writel(val, sys_clcd); | 526 | writel(val, sys_clcd); |
522 | } | 527 | } |
523 | 528 | ||
524 | /* | 529 | /* |
525 | * Enable the relevant connector on the interface module. | 530 | * Enable the relevant connector on the interface module. |
526 | */ | 531 | */ |
527 | static void realview_clcd_enable(struct clcd_fb *fb) | 532 | static void realview_clcd_enable(struct clcd_fb *fb) |
528 | { | 533 | { |
529 | void __iomem *sys_clcd = __io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_CLCD_OFFSET; | 534 | void __iomem *sys_clcd = __io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_CLCD_OFFSET; |
530 | u32 val; | 535 | u32 val; |
531 | 536 | ||
532 | /* | 537 | /* |
533 | * Enable the PSUs | 538 | * Enable the PSUs |
534 | */ | 539 | */ |
535 | val = readl(sys_clcd); | 540 | val = readl(sys_clcd); |
536 | val |= SYS_CLCD_NLCDIOON | SYS_CLCD_PWR3V5SWITCH; | 541 | val |= SYS_CLCD_NLCDIOON | SYS_CLCD_PWR3V5SWITCH; |
537 | writel(val, sys_clcd); | 542 | writel(val, sys_clcd); |
538 | } | 543 | } |
539 | 544 | ||
540 | static int realview_clcd_setup(struct clcd_fb *fb) | 545 | static int realview_clcd_setup(struct clcd_fb *fb) |
541 | { | 546 | { |
542 | unsigned long framesize; | 547 | unsigned long framesize; |
543 | dma_addr_t dma; | 548 | dma_addr_t dma; |
544 | 549 | ||
545 | if (machine_is_realview_eb()) | 550 | if (machine_is_realview_eb()) |
546 | /* VGA, 16bpp */ | 551 | /* VGA, 16bpp */ |
547 | framesize = 640 * 480 * 2; | 552 | framesize = 640 * 480 * 2; |
548 | else | 553 | else |
549 | /* XVGA, 16bpp */ | 554 | /* XVGA, 16bpp */ |
550 | framesize = 1024 * 768 * 2; | 555 | framesize = 1024 * 768 * 2; |
551 | 556 | ||
552 | fb->panel = realview_clcd_panel(); | 557 | fb->panel = realview_clcd_panel(); |
553 | 558 | ||
554 | fb->fb.screen_base = dma_alloc_writecombine(&fb->dev->dev, framesize, | 559 | fb->fb.screen_base = dma_alloc_writecombine(&fb->dev->dev, framesize, |
555 | &dma, GFP_KERNEL | GFP_DMA); | 560 | &dma, GFP_KERNEL | GFP_DMA); |
556 | if (!fb->fb.screen_base) { | 561 | if (!fb->fb.screen_base) { |
557 | printk(KERN_ERR "CLCD: unable to map framebuffer\n"); | 562 | printk(KERN_ERR "CLCD: unable to map framebuffer\n"); |
558 | return -ENOMEM; | 563 | return -ENOMEM; |
559 | } | 564 | } |
560 | 565 | ||
561 | fb->fb.fix.smem_start = dma; | 566 | fb->fb.fix.smem_start = dma; |
562 | fb->fb.fix.smem_len = framesize; | 567 | fb->fb.fix.smem_len = framesize; |
563 | 568 | ||
564 | return 0; | 569 | return 0; |
565 | } | 570 | } |
566 | 571 | ||
567 | static int realview_clcd_mmap(struct clcd_fb *fb, struct vm_area_struct *vma) | 572 | static int realview_clcd_mmap(struct clcd_fb *fb, struct vm_area_struct *vma) |
568 | { | 573 | { |
569 | return dma_mmap_writecombine(&fb->dev->dev, vma, | 574 | return dma_mmap_writecombine(&fb->dev->dev, vma, |
570 | fb->fb.screen_base, | 575 | fb->fb.screen_base, |
571 | fb->fb.fix.smem_start, | 576 | fb->fb.fix.smem_start, |
572 | fb->fb.fix.smem_len); | 577 | fb->fb.fix.smem_len); |
573 | } | 578 | } |
574 | 579 | ||
575 | static void realview_clcd_remove(struct clcd_fb *fb) | 580 | static void realview_clcd_remove(struct clcd_fb *fb) |
576 | { | 581 | { |
577 | dma_free_writecombine(&fb->dev->dev, fb->fb.fix.smem_len, | 582 | dma_free_writecombine(&fb->dev->dev, fb->fb.fix.smem_len, |
578 | fb->fb.screen_base, fb->fb.fix.smem_start); | 583 | fb->fb.screen_base, fb->fb.fix.smem_start); |
579 | } | 584 | } |
580 | 585 | ||
581 | struct clcd_board clcd_plat_data = { | 586 | struct clcd_board clcd_plat_data = { |
582 | .name = "RealView", | 587 | .name = "RealView", |
583 | .check = clcdfb_check, | 588 | .check = clcdfb_check, |
584 | .decode = clcdfb_decode, | 589 | .decode = clcdfb_decode, |
585 | .disable = realview_clcd_disable, | 590 | .disable = realview_clcd_disable, |
586 | .enable = realview_clcd_enable, | 591 | .enable = realview_clcd_enable, |
587 | .setup = realview_clcd_setup, | 592 | .setup = realview_clcd_setup, |
588 | .mmap = realview_clcd_mmap, | 593 | .mmap = realview_clcd_mmap, |
589 | .remove = realview_clcd_remove, | 594 | .remove = realview_clcd_remove, |
590 | }; | 595 | }; |
591 | 596 | ||
592 | #ifdef CONFIG_LEDS | 597 | #ifdef CONFIG_LEDS |
593 | #define VA_LEDS_BASE (__io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_LED_OFFSET) | 598 | #define VA_LEDS_BASE (__io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_LED_OFFSET) |
594 | 599 | ||
595 | void realview_leds_event(led_event_t ledevt) | 600 | void realview_leds_event(led_event_t ledevt) |
596 | { | 601 | { |
597 | unsigned long flags; | 602 | unsigned long flags; |
598 | u32 val; | 603 | u32 val; |
599 | u32 led = 1 << smp_processor_id(); | 604 | u32 led = 1 << smp_processor_id(); |
600 | 605 | ||
601 | local_irq_save(flags); | 606 | local_irq_save(flags); |
602 | val = readl(VA_LEDS_BASE); | 607 | val = readl(VA_LEDS_BASE); |
603 | 608 | ||
604 | switch (ledevt) { | 609 | switch (ledevt) { |
605 | case led_idle_start: | 610 | case led_idle_start: |
606 | val = val & ~led; | 611 | val = val & ~led; |
607 | break; | 612 | break; |
608 | 613 | ||
609 | case led_idle_end: | 614 | case led_idle_end: |
610 | val = val | led; | 615 | val = val | led; |
611 | break; | 616 | break; |
612 | 617 | ||
613 | case led_timer: | 618 | case led_timer: |
614 | val = val ^ REALVIEW_SYS_LED7; | 619 | val = val ^ REALVIEW_SYS_LED7; |
615 | break; | 620 | break; |
616 | 621 | ||
617 | case led_halted: | 622 | case led_halted: |
618 | val = 0; | 623 | val = 0; |
619 | break; | 624 | break; |
620 | 625 | ||
621 | default: | 626 | default: |
622 | break; | 627 | break; |
623 | } | 628 | } |
624 | 629 | ||
625 | writel(val, VA_LEDS_BASE); | 630 | writel(val, VA_LEDS_BASE); |
626 | local_irq_restore(flags); | 631 | local_irq_restore(flags); |
627 | } | 632 | } |
628 | #endif /* CONFIG_LEDS */ | 633 | #endif /* CONFIG_LEDS */ |
629 | 634 | ||
630 | /* | 635 | /* |
631 | * Where is the timer (VA)? | 636 | * Where is the timer (VA)? |
632 | */ | 637 | */ |
633 | void __iomem *timer0_va_base; | 638 | void __iomem *timer0_va_base; |
634 | void __iomem *timer1_va_base; | 639 | void __iomem *timer1_va_base; |
635 | void __iomem *timer2_va_base; | 640 | void __iomem *timer2_va_base; |
636 | void __iomem *timer3_va_base; | 641 | void __iomem *timer3_va_base; |
637 | 642 | ||
638 | /* | 643 | /* |
639 | * Set up the clock source and clock events devices | 644 | * Set up the clock source and clock events devices |
640 | */ | 645 | */ |
641 | void __init realview_timer_init(unsigned int timer_irq) | 646 | void __init realview_timer_init(unsigned int timer_irq) |
642 | { | 647 | { |
643 | u32 val; | 648 | u32 val; |
644 | 649 | ||
645 | /* | 650 | /* |
646 | * set clock frequency: | 651 | * set clock frequency: |
647 | * REALVIEW_REFCLK is 32KHz | 652 | * REALVIEW_REFCLK is 32KHz |
648 | * REALVIEW_TIMCLK is 1MHz | 653 | * REALVIEW_TIMCLK is 1MHz |
649 | */ | 654 | */ |
650 | val = readl(__io_address(REALVIEW_SCTL_BASE)); | 655 | val = readl(__io_address(REALVIEW_SCTL_BASE)); |
651 | writel((REALVIEW_TIMCLK << REALVIEW_TIMER1_EnSel) | | 656 | writel((REALVIEW_TIMCLK << REALVIEW_TIMER1_EnSel) | |
652 | (REALVIEW_TIMCLK << REALVIEW_TIMER2_EnSel) | | 657 | (REALVIEW_TIMCLK << REALVIEW_TIMER2_EnSel) | |
653 | (REALVIEW_TIMCLK << REALVIEW_TIMER3_EnSel) | | 658 | (REALVIEW_TIMCLK << REALVIEW_TIMER3_EnSel) | |
654 | (REALVIEW_TIMCLK << REALVIEW_TIMER4_EnSel) | val, | 659 | (REALVIEW_TIMCLK << REALVIEW_TIMER4_EnSel) | val, |
655 | __io_address(REALVIEW_SCTL_BASE)); | 660 | __io_address(REALVIEW_SCTL_BASE)); |
656 | 661 | ||
657 | /* | 662 | /* |
658 | * Initialise to a known state (all timers off) | 663 | * Initialise to a known state (all timers off) |
659 | */ | 664 | */ |
660 | writel(0, timer0_va_base + TIMER_CTRL); | 665 | writel(0, timer0_va_base + TIMER_CTRL); |
661 | writel(0, timer1_va_base + TIMER_CTRL); | 666 | writel(0, timer1_va_base + TIMER_CTRL); |
662 | writel(0, timer2_va_base + TIMER_CTRL); | 667 | writel(0, timer2_va_base + TIMER_CTRL); |
663 | writel(0, timer3_va_base + TIMER_CTRL); | 668 | writel(0, timer3_va_base + TIMER_CTRL); |
664 | 669 | ||
665 | sp804_clocksource_init(timer3_va_base); | 670 | sp804_clocksource_init(timer3_va_base); |
666 | sp804_clockevents_init(timer0_va_base, timer_irq); | 671 | sp804_clockevents_init(timer0_va_base, timer_irq); |
667 | } | 672 | } |
668 | 673 | ||
669 | /* | 674 | /* |
670 | * Setup the memory banks. | 675 | * Setup the memory banks. |
671 | */ | 676 | */ |
672 | void realview_fixup(struct machine_desc *mdesc, struct tag *tags, char **from, | 677 | void realview_fixup(struct machine_desc *mdesc, struct tag *tags, char **from, |
673 | struct meminfo *meminfo) | 678 | struct meminfo *meminfo) |
674 | { | 679 | { |
675 | /* | 680 | /* |
676 | * Most RealView platforms have 512MB contiguous RAM at 0x70000000. | 681 | * Most RealView platforms have 512MB contiguous RAM at 0x70000000. |
677 | * Half of this is mirrored at 0. | 682 | * Half of this is mirrored at 0. |
678 | */ | 683 | */ |
679 | #ifdef CONFIG_REALVIEW_HIGH_PHYS_OFFSET | 684 | #ifdef CONFIG_REALVIEW_HIGH_PHYS_OFFSET |
680 | meminfo->bank[0].start = 0x70000000; | 685 | meminfo->bank[0].start = 0x70000000; |
681 | meminfo->bank[0].size = SZ_512M; | 686 | meminfo->bank[0].size = SZ_512M; |
682 | meminfo->nr_banks = 1; | 687 | meminfo->nr_banks = 1; |
683 | #else | 688 | #else |
684 | meminfo->bank[0].start = 0; | 689 | meminfo->bank[0].start = 0; |
685 | meminfo->bank[0].size = SZ_256M; | 690 | meminfo->bank[0].size = SZ_256M; |
686 | meminfo->nr_banks = 1; | 691 | meminfo->nr_banks = 1; |
687 | #endif | 692 | #endif |
688 | } | 693 | } |
689 | 694 |
arch/arm/mach-spear3xx/clock.c
1 | /* | 1 | /* |
2 | * arch/arm/mach-spear3xx/clock.c | 2 | * arch/arm/mach-spear3xx/clock.c |
3 | * | 3 | * |
4 | * SPEAr3xx machines clock framework source file | 4 | * SPEAr3xx machines clock framework source file |
5 | * | 5 | * |
6 | * Copyright (C) 2009 ST Microelectronics | 6 | * Copyright (C) 2009 ST Microelectronics |
7 | * Viresh Kumar<viresh.kumar@st.com> | 7 | * Viresh Kumar<viresh.kumar@st.com> |
8 | * | 8 | * |
9 | * This file is licensed under the terms of the GNU General Public | 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 | 10 | * License version 2. This program is licensed "as is" without any |
11 | * warranty of any kind, whether express or implied. | 11 | * warranty of any kind, whether express or implied. |
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
15 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
16 | #include <mach/misc_regs.h> | 16 | #include <mach/misc_regs.h> |
17 | #include <plat/clock.h> | 17 | #include <plat/clock.h> |
18 | 18 | ||
19 | /* root clks */ | 19 | /* root clks */ |
20 | /* 32 KHz oscillator clock */ | 20 | /* 32 KHz oscillator clock */ |
21 | static struct clk osc_32k_clk = { | 21 | static struct clk osc_32k_clk = { |
22 | .flags = ALWAYS_ENABLED, | 22 | .flags = ALWAYS_ENABLED, |
23 | .rate = 32000, | 23 | .rate = 32000, |
24 | }; | 24 | }; |
25 | 25 | ||
26 | /* 24 MHz oscillator clock */ | 26 | /* 24 MHz oscillator clock */ |
27 | static struct clk osc_24m_clk = { | 27 | static struct clk osc_24m_clk = { |
28 | .flags = ALWAYS_ENABLED, | 28 | .flags = ALWAYS_ENABLED, |
29 | .rate = 24000000, | 29 | .rate = 24000000, |
30 | }; | 30 | }; |
31 | 31 | ||
32 | /* clock derived from 32 KHz osc clk */ | 32 | /* clock derived from 32 KHz osc clk */ |
33 | /* rtc clock */ | 33 | /* rtc clock */ |
34 | static struct clk rtc_clk = { | 34 | static struct clk rtc_clk = { |
35 | .pclk = &osc_32k_clk, | 35 | .pclk = &osc_32k_clk, |
36 | .en_reg = PERIP1_CLK_ENB, | 36 | .en_reg = PERIP1_CLK_ENB, |
37 | .en_reg_bit = RTC_CLK_ENB, | 37 | .en_reg_bit = RTC_CLK_ENB, |
38 | .recalc = &follow_parent, | 38 | .recalc = &follow_parent, |
39 | }; | 39 | }; |
40 | 40 | ||
41 | /* clock derived from 24 MHz osc clk */ | 41 | /* clock derived from 24 MHz osc clk */ |
42 | /* pll1 configuration structure */ | 42 | /* pll1 configuration structure */ |
43 | static struct pll_clk_config pll1_config = { | 43 | static struct pll_clk_config pll1_config = { |
44 | .mode_reg = PLL1_CTR, | 44 | .mode_reg = PLL1_CTR, |
45 | .cfg_reg = PLL1_FRQ, | 45 | .cfg_reg = PLL1_FRQ, |
46 | }; | 46 | }; |
47 | 47 | ||
48 | /* PLL1 clock */ | 48 | /* PLL1 clock */ |
49 | static struct clk pll1_clk = { | 49 | static struct clk pll1_clk = { |
50 | .pclk = &osc_24m_clk, | 50 | .pclk = &osc_24m_clk, |
51 | .en_reg = PLL1_CTR, | 51 | .en_reg = PLL1_CTR, |
52 | .en_reg_bit = PLL_ENABLE, | 52 | .en_reg_bit = PLL_ENABLE, |
53 | .recalc = &pll1_clk_recalc, | 53 | .recalc = &pll1_clk_recalc, |
54 | .private_data = &pll1_config, | 54 | .private_data = &pll1_config, |
55 | }; | 55 | }; |
56 | 56 | ||
57 | /* PLL3 48 MHz clock */ | 57 | /* PLL3 48 MHz clock */ |
58 | static struct clk pll3_48m_clk = { | 58 | static struct clk pll3_48m_clk = { |
59 | .flags = ALWAYS_ENABLED, | 59 | .flags = ALWAYS_ENABLED, |
60 | .pclk = &osc_24m_clk, | 60 | .pclk = &osc_24m_clk, |
61 | .rate = 48000000, | 61 | .rate = 48000000, |
62 | }; | 62 | }; |
63 | 63 | ||
64 | /* watch dog timer clock */ | 64 | /* watch dog timer clock */ |
65 | static struct clk wdt_clk = { | 65 | static struct clk wdt_clk = { |
66 | .flags = ALWAYS_ENABLED, | 66 | .flags = ALWAYS_ENABLED, |
67 | .pclk = &osc_24m_clk, | 67 | .pclk = &osc_24m_clk, |
68 | .recalc = &follow_parent, | 68 | .recalc = &follow_parent, |
69 | }; | 69 | }; |
70 | 70 | ||
71 | /* clock derived from pll1 clk */ | 71 | /* clock derived from pll1 clk */ |
72 | /* cpu clock */ | 72 | /* cpu clock */ |
73 | static struct clk cpu_clk = { | 73 | static struct clk cpu_clk = { |
74 | .flags = ALWAYS_ENABLED, | 74 | .flags = ALWAYS_ENABLED, |
75 | .pclk = &pll1_clk, | 75 | .pclk = &pll1_clk, |
76 | .recalc = &follow_parent, | 76 | .recalc = &follow_parent, |
77 | }; | 77 | }; |
78 | 78 | ||
79 | /* ahb configuration structure */ | 79 | /* ahb configuration structure */ |
80 | static struct bus_clk_config ahb_config = { | 80 | static struct bus_clk_config ahb_config = { |
81 | .reg = CORE_CLK_CFG, | 81 | .reg = CORE_CLK_CFG, |
82 | .mask = PLL_HCLK_RATIO_MASK, | 82 | .mask = PLL_HCLK_RATIO_MASK, |
83 | .shift = PLL_HCLK_RATIO_SHIFT, | 83 | .shift = PLL_HCLK_RATIO_SHIFT, |
84 | }; | 84 | }; |
85 | 85 | ||
86 | /* ahb clock */ | 86 | /* ahb clock */ |
87 | static struct clk ahb_clk = { | 87 | static struct clk ahb_clk = { |
88 | .flags = ALWAYS_ENABLED, | 88 | .flags = ALWAYS_ENABLED, |
89 | .pclk = &pll1_clk, | 89 | .pclk = &pll1_clk, |
90 | .recalc = &bus_clk_recalc, | 90 | .recalc = &bus_clk_recalc, |
91 | .private_data = &ahb_config, | 91 | .private_data = &ahb_config, |
92 | }; | 92 | }; |
93 | 93 | ||
94 | /* uart configurations */ | 94 | /* uart configurations */ |
95 | static struct aux_clk_config uart_config = { | 95 | static struct aux_clk_config uart_config = { |
96 | .synth_reg = UART_CLK_SYNT, | 96 | .synth_reg = UART_CLK_SYNT, |
97 | }; | 97 | }; |
98 | 98 | ||
99 | /* uart parents */ | 99 | /* uart parents */ |
100 | static struct pclk_info uart_pclk_info[] = { | 100 | static struct pclk_info uart_pclk_info[] = { |
101 | { | 101 | { |
102 | .pclk = &pll1_clk, | 102 | .pclk = &pll1_clk, |
103 | .pclk_mask = AUX_CLK_PLL1_MASK, | 103 | .pclk_mask = AUX_CLK_PLL1_MASK, |
104 | .scalable = 1, | 104 | .scalable = 1, |
105 | }, { | 105 | }, { |
106 | .pclk = &pll3_48m_clk, | 106 | .pclk = &pll3_48m_clk, |
107 | .pclk_mask = AUX_CLK_PLL3_MASK, | 107 | .pclk_mask = AUX_CLK_PLL3_MASK, |
108 | .scalable = 0, | 108 | .scalable = 0, |
109 | }, | 109 | }, |
110 | }; | 110 | }; |
111 | 111 | ||
112 | /* uart parent select structure */ | 112 | /* uart parent select structure */ |
113 | static struct pclk_sel uart_pclk_sel = { | 113 | static struct pclk_sel uart_pclk_sel = { |
114 | .pclk_info = uart_pclk_info, | 114 | .pclk_info = uart_pclk_info, |
115 | .pclk_count = ARRAY_SIZE(uart_pclk_info), | 115 | .pclk_count = ARRAY_SIZE(uart_pclk_info), |
116 | .pclk_sel_reg = PERIP_CLK_CFG, | 116 | .pclk_sel_reg = PERIP_CLK_CFG, |
117 | .pclk_sel_mask = UART_CLK_MASK, | 117 | .pclk_sel_mask = UART_CLK_MASK, |
118 | }; | 118 | }; |
119 | 119 | ||
120 | /* uart clock */ | 120 | /* uart clock */ |
121 | static struct clk uart_clk = { | 121 | static struct clk uart_clk = { |
122 | .en_reg = PERIP1_CLK_ENB, | 122 | .en_reg = PERIP1_CLK_ENB, |
123 | .en_reg_bit = UART_CLK_ENB, | 123 | .en_reg_bit = UART_CLK_ENB, |
124 | .pclk_sel = &uart_pclk_sel, | 124 | .pclk_sel = &uart_pclk_sel, |
125 | .pclk_sel_shift = UART_CLK_SHIFT, | 125 | .pclk_sel_shift = UART_CLK_SHIFT, |
126 | .recalc = &aux_clk_recalc, | 126 | .recalc = &aux_clk_recalc, |
127 | .private_data = &uart_config, | 127 | .private_data = &uart_config, |
128 | }; | 128 | }; |
129 | 129 | ||
130 | /* firda configurations */ | 130 | /* firda configurations */ |
131 | static struct aux_clk_config firda_config = { | 131 | static struct aux_clk_config firda_config = { |
132 | .synth_reg = FIRDA_CLK_SYNT, | 132 | .synth_reg = FIRDA_CLK_SYNT, |
133 | }; | 133 | }; |
134 | 134 | ||
135 | /* firda parents */ | 135 | /* firda parents */ |
136 | static struct pclk_info firda_pclk_info[] = { | 136 | static struct pclk_info firda_pclk_info[] = { |
137 | { | 137 | { |
138 | .pclk = &pll1_clk, | 138 | .pclk = &pll1_clk, |
139 | .pclk_mask = AUX_CLK_PLL1_MASK, | 139 | .pclk_mask = AUX_CLK_PLL1_MASK, |
140 | .scalable = 1, | 140 | .scalable = 1, |
141 | }, { | 141 | }, { |
142 | .pclk = &pll3_48m_clk, | 142 | .pclk = &pll3_48m_clk, |
143 | .pclk_mask = AUX_CLK_PLL3_MASK, | 143 | .pclk_mask = AUX_CLK_PLL3_MASK, |
144 | .scalable = 0, | 144 | .scalable = 0, |
145 | }, | 145 | }, |
146 | }; | 146 | }; |
147 | 147 | ||
148 | /* firda parent select structure */ | 148 | /* firda parent select structure */ |
149 | static struct pclk_sel firda_pclk_sel = { | 149 | static struct pclk_sel firda_pclk_sel = { |
150 | .pclk_info = firda_pclk_info, | 150 | .pclk_info = firda_pclk_info, |
151 | .pclk_count = ARRAY_SIZE(firda_pclk_info), | 151 | .pclk_count = ARRAY_SIZE(firda_pclk_info), |
152 | .pclk_sel_reg = PERIP_CLK_CFG, | 152 | .pclk_sel_reg = PERIP_CLK_CFG, |
153 | .pclk_sel_mask = FIRDA_CLK_MASK, | 153 | .pclk_sel_mask = FIRDA_CLK_MASK, |
154 | }; | 154 | }; |
155 | 155 | ||
156 | /* firda clock */ | 156 | /* firda clock */ |
157 | static struct clk firda_clk = { | 157 | static struct clk firda_clk = { |
158 | .en_reg = PERIP1_CLK_ENB, | 158 | .en_reg = PERIP1_CLK_ENB, |
159 | .en_reg_bit = FIRDA_CLK_ENB, | 159 | .en_reg_bit = FIRDA_CLK_ENB, |
160 | .pclk_sel = &firda_pclk_sel, | 160 | .pclk_sel = &firda_pclk_sel, |
161 | .pclk_sel_shift = FIRDA_CLK_SHIFT, | 161 | .pclk_sel_shift = FIRDA_CLK_SHIFT, |
162 | .recalc = &aux_clk_recalc, | 162 | .recalc = &aux_clk_recalc, |
163 | .private_data = &firda_config, | 163 | .private_data = &firda_config, |
164 | }; | 164 | }; |
165 | 165 | ||
166 | /* gpt parents */ | 166 | /* gpt parents */ |
167 | static struct pclk_info gpt_pclk_info[] = { | 167 | static struct pclk_info gpt_pclk_info[] = { |
168 | { | 168 | { |
169 | .pclk = &pll1_clk, | 169 | .pclk = &pll1_clk, |
170 | .pclk_mask = AUX_CLK_PLL1_MASK, | 170 | .pclk_mask = AUX_CLK_PLL1_MASK, |
171 | .scalable = 1, | 171 | .scalable = 1, |
172 | }, { | 172 | }, { |
173 | .pclk = &pll3_48m_clk, | 173 | .pclk = &pll3_48m_clk, |
174 | .pclk_mask = AUX_CLK_PLL3_MASK, | 174 | .pclk_mask = AUX_CLK_PLL3_MASK, |
175 | .scalable = 0, | 175 | .scalable = 0, |
176 | }, | 176 | }, |
177 | }; | 177 | }; |
178 | 178 | ||
179 | /* gpt parent select structure */ | 179 | /* gpt parent select structure */ |
180 | static struct pclk_sel gpt_pclk_sel = { | 180 | static struct pclk_sel gpt_pclk_sel = { |
181 | .pclk_info = gpt_pclk_info, | 181 | .pclk_info = gpt_pclk_info, |
182 | .pclk_count = ARRAY_SIZE(gpt_pclk_info), | 182 | .pclk_count = ARRAY_SIZE(gpt_pclk_info), |
183 | .pclk_sel_reg = PERIP_CLK_CFG, | 183 | .pclk_sel_reg = PERIP_CLK_CFG, |
184 | .pclk_sel_mask = GPT_CLK_MASK, | 184 | .pclk_sel_mask = GPT_CLK_MASK, |
185 | }; | 185 | }; |
186 | 186 | ||
187 | /* gpt0 configurations */ | 187 | /* gpt0 configurations */ |
188 | static struct aux_clk_config gpt0_config = { | 188 | static struct aux_clk_config gpt0_config = { |
189 | .synth_reg = PRSC1_CLK_CFG, | 189 | .synth_reg = PRSC1_CLK_CFG, |
190 | }; | 190 | }; |
191 | 191 | ||
192 | /* gpt0 timer clock */ | 192 | /* gpt0 timer clock */ |
193 | static struct clk gpt0_clk = { | 193 | static struct clk gpt0_clk = { |
194 | .flags = ALWAYS_ENABLED, | 194 | .flags = ALWAYS_ENABLED, |
195 | .pclk_sel = &gpt_pclk_sel, | 195 | .pclk_sel = &gpt_pclk_sel, |
196 | .pclk_sel_shift = GPT0_CLK_SHIFT, | 196 | .pclk_sel_shift = GPT0_CLK_SHIFT, |
197 | .recalc = &gpt_clk_recalc, | 197 | .recalc = &gpt_clk_recalc, |
198 | .private_data = &gpt0_config, | 198 | .private_data = &gpt0_config, |
199 | }; | 199 | }; |
200 | 200 | ||
201 | /* gpt1 configurations */ | 201 | /* gpt1 configurations */ |
202 | static struct aux_clk_config gpt1_config = { | 202 | static struct aux_clk_config gpt1_config = { |
203 | .synth_reg = PRSC2_CLK_CFG, | 203 | .synth_reg = PRSC2_CLK_CFG, |
204 | }; | 204 | }; |
205 | 205 | ||
206 | /* gpt1 timer clock */ | 206 | /* gpt1 timer clock */ |
207 | static struct clk gpt1_clk = { | 207 | static struct clk gpt1_clk = { |
208 | .en_reg = PERIP1_CLK_ENB, | 208 | .en_reg = PERIP1_CLK_ENB, |
209 | .en_reg_bit = GPT1_CLK_ENB, | 209 | .en_reg_bit = GPT1_CLK_ENB, |
210 | .pclk_sel = &gpt_pclk_sel, | 210 | .pclk_sel = &gpt_pclk_sel, |
211 | .pclk_sel_shift = GPT1_CLK_SHIFT, | 211 | .pclk_sel_shift = GPT1_CLK_SHIFT, |
212 | .recalc = &gpt_clk_recalc, | 212 | .recalc = &gpt_clk_recalc, |
213 | .private_data = &gpt1_config, | 213 | .private_data = &gpt1_config, |
214 | }; | 214 | }; |
215 | 215 | ||
216 | /* gpt2 configurations */ | 216 | /* gpt2 configurations */ |
217 | static struct aux_clk_config gpt2_config = { | 217 | static struct aux_clk_config gpt2_config = { |
218 | .synth_reg = PRSC3_CLK_CFG, | 218 | .synth_reg = PRSC3_CLK_CFG, |
219 | }; | 219 | }; |
220 | 220 | ||
221 | /* gpt2 timer clock */ | 221 | /* gpt2 timer clock */ |
222 | static struct clk gpt2_clk = { | 222 | static struct clk gpt2_clk = { |
223 | .en_reg = PERIP1_CLK_ENB, | 223 | .en_reg = PERIP1_CLK_ENB, |
224 | .en_reg_bit = GPT2_CLK_ENB, | 224 | .en_reg_bit = GPT2_CLK_ENB, |
225 | .pclk_sel = &gpt_pclk_sel, | 225 | .pclk_sel = &gpt_pclk_sel, |
226 | .pclk_sel_shift = GPT2_CLK_SHIFT, | 226 | .pclk_sel_shift = GPT2_CLK_SHIFT, |
227 | .recalc = &gpt_clk_recalc, | 227 | .recalc = &gpt_clk_recalc, |
228 | .private_data = &gpt2_config, | 228 | .private_data = &gpt2_config, |
229 | }; | 229 | }; |
230 | 230 | ||
231 | /* clock derived from pll3 clk */ | 231 | /* clock derived from pll3 clk */ |
232 | /* usbh clock */ | 232 | /* usbh clock */ |
233 | static struct clk usbh_clk = { | 233 | static struct clk usbh_clk = { |
234 | .pclk = &pll3_48m_clk, | 234 | .pclk = &pll3_48m_clk, |
235 | .en_reg = PERIP1_CLK_ENB, | 235 | .en_reg = PERIP1_CLK_ENB, |
236 | .en_reg_bit = USBH_CLK_ENB, | 236 | .en_reg_bit = USBH_CLK_ENB, |
237 | .recalc = &follow_parent, | 237 | .recalc = &follow_parent, |
238 | }; | 238 | }; |
239 | 239 | ||
240 | /* usbd clock */ | 240 | /* usbd clock */ |
241 | static struct clk usbd_clk = { | 241 | static struct clk usbd_clk = { |
242 | .pclk = &pll3_48m_clk, | 242 | .pclk = &pll3_48m_clk, |
243 | .en_reg = PERIP1_CLK_ENB, | 243 | .en_reg = PERIP1_CLK_ENB, |
244 | .en_reg_bit = USBD_CLK_ENB, | 244 | .en_reg_bit = USBD_CLK_ENB, |
245 | .recalc = &follow_parent, | 245 | .recalc = &follow_parent, |
246 | }; | 246 | }; |
247 | 247 | ||
248 | /* clcd clock */ | 248 | /* clcd clock */ |
249 | static struct clk clcd_clk = { | 249 | static struct clk clcd_clk = { |
250 | .flags = ALWAYS_ENABLED, | 250 | .flags = ALWAYS_ENABLED, |
251 | .pclk = &pll3_48m_clk, | 251 | .pclk = &pll3_48m_clk, |
252 | .recalc = &follow_parent, | 252 | .recalc = &follow_parent, |
253 | }; | 253 | }; |
254 | 254 | ||
255 | /* clock derived from ahb clk */ | 255 | /* clock derived from ahb clk */ |
256 | /* apb configuration structure */ | 256 | /* apb configuration structure */ |
257 | static struct bus_clk_config apb_config = { | 257 | static struct bus_clk_config apb_config = { |
258 | .reg = CORE_CLK_CFG, | 258 | .reg = CORE_CLK_CFG, |
259 | .mask = HCLK_PCLK_RATIO_MASK, | 259 | .mask = HCLK_PCLK_RATIO_MASK, |
260 | .shift = HCLK_PCLK_RATIO_SHIFT, | 260 | .shift = HCLK_PCLK_RATIO_SHIFT, |
261 | }; | 261 | }; |
262 | 262 | ||
263 | /* apb clock */ | 263 | /* apb clock */ |
264 | static struct clk apb_clk = { | 264 | static struct clk apb_clk = { |
265 | .flags = ALWAYS_ENABLED, | 265 | .flags = ALWAYS_ENABLED, |
266 | .pclk = &ahb_clk, | 266 | .pclk = &ahb_clk, |
267 | .recalc = &bus_clk_recalc, | 267 | .recalc = &bus_clk_recalc, |
268 | .private_data = &apb_config, | 268 | .private_data = &apb_config, |
269 | }; | 269 | }; |
270 | 270 | ||
271 | /* i2c clock */ | 271 | /* i2c clock */ |
272 | static struct clk i2c_clk = { | 272 | static struct clk i2c_clk = { |
273 | .pclk = &ahb_clk, | 273 | .pclk = &ahb_clk, |
274 | .en_reg = PERIP1_CLK_ENB, | 274 | .en_reg = PERIP1_CLK_ENB, |
275 | .en_reg_bit = I2C_CLK_ENB, | 275 | .en_reg_bit = I2C_CLK_ENB, |
276 | .recalc = &follow_parent, | 276 | .recalc = &follow_parent, |
277 | }; | 277 | }; |
278 | 278 | ||
279 | /* dma clock */ | 279 | /* dma clock */ |
280 | static struct clk dma_clk = { | 280 | static struct clk dma_clk = { |
281 | .pclk = &ahb_clk, | 281 | .pclk = &ahb_clk, |
282 | .en_reg = PERIP1_CLK_ENB, | 282 | .en_reg = PERIP1_CLK_ENB, |
283 | .en_reg_bit = DMA_CLK_ENB, | 283 | .en_reg_bit = DMA_CLK_ENB, |
284 | .recalc = &follow_parent, | 284 | .recalc = &follow_parent, |
285 | }; | 285 | }; |
286 | 286 | ||
287 | /* jpeg clock */ | 287 | /* jpeg clock */ |
288 | static struct clk jpeg_clk = { | 288 | static struct clk jpeg_clk = { |
289 | .pclk = &ahb_clk, | 289 | .pclk = &ahb_clk, |
290 | .en_reg = PERIP1_CLK_ENB, | 290 | .en_reg = PERIP1_CLK_ENB, |
291 | .en_reg_bit = JPEG_CLK_ENB, | 291 | .en_reg_bit = JPEG_CLK_ENB, |
292 | .recalc = &follow_parent, | 292 | .recalc = &follow_parent, |
293 | }; | 293 | }; |
294 | 294 | ||
295 | /* gmac clock */ | 295 | /* gmac clock */ |
296 | static struct clk gmac_clk = { | 296 | static struct clk gmac_clk = { |
297 | .pclk = &ahb_clk, | 297 | .pclk = &ahb_clk, |
298 | .en_reg = PERIP1_CLK_ENB, | 298 | .en_reg = PERIP1_CLK_ENB, |
299 | .en_reg_bit = GMAC_CLK_ENB, | 299 | .en_reg_bit = GMAC_CLK_ENB, |
300 | .recalc = &follow_parent, | 300 | .recalc = &follow_parent, |
301 | }; | 301 | }; |
302 | 302 | ||
303 | /* smi clock */ | 303 | /* smi clock */ |
304 | static struct clk smi_clk = { | 304 | static struct clk smi_clk = { |
305 | .pclk = &ahb_clk, | 305 | .pclk = &ahb_clk, |
306 | .en_reg = PERIP1_CLK_ENB, | 306 | .en_reg = PERIP1_CLK_ENB, |
307 | .en_reg_bit = SMI_CLK_ENB, | 307 | .en_reg_bit = SMI_CLK_ENB, |
308 | .recalc = &follow_parent, | 308 | .recalc = &follow_parent, |
309 | }; | 309 | }; |
310 | 310 | ||
311 | /* c3 clock */ | 311 | /* c3 clock */ |
312 | static struct clk c3_clk = { | 312 | static struct clk c3_clk = { |
313 | .pclk = &ahb_clk, | 313 | .pclk = &ahb_clk, |
314 | .en_reg = PERIP1_CLK_ENB, | 314 | .en_reg = PERIP1_CLK_ENB, |
315 | .en_reg_bit = C3_CLK_ENB, | 315 | .en_reg_bit = C3_CLK_ENB, |
316 | .recalc = &follow_parent, | 316 | .recalc = &follow_parent, |
317 | }; | 317 | }; |
318 | 318 | ||
319 | /* clock derived from apb clk */ | 319 | /* clock derived from apb clk */ |
320 | /* adc clock */ | 320 | /* adc clock */ |
321 | static struct clk adc_clk = { | 321 | static struct clk adc_clk = { |
322 | .pclk = &apb_clk, | 322 | .pclk = &apb_clk, |
323 | .en_reg = PERIP1_CLK_ENB, | 323 | .en_reg = PERIP1_CLK_ENB, |
324 | .en_reg_bit = ADC_CLK_ENB, | 324 | .en_reg_bit = ADC_CLK_ENB, |
325 | .recalc = &follow_parent, | 325 | .recalc = &follow_parent, |
326 | }; | 326 | }; |
327 | 327 | ||
328 | /* ssp clock */ | 328 | /* ssp clock */ |
329 | static struct clk ssp_clk = { | 329 | static struct clk ssp_clk = { |
330 | .pclk = &apb_clk, | 330 | .pclk = &apb_clk, |
331 | .en_reg = PERIP1_CLK_ENB, | 331 | .en_reg = PERIP1_CLK_ENB, |
332 | .en_reg_bit = SSP_CLK_ENB, | 332 | .en_reg_bit = SSP_CLK_ENB, |
333 | .recalc = &follow_parent, | 333 | .recalc = &follow_parent, |
334 | }; | 334 | }; |
335 | 335 | ||
336 | /* gpio clock */ | 336 | /* gpio clock */ |
337 | static struct clk gpio_clk = { | 337 | static struct clk gpio_clk = { |
338 | .pclk = &apb_clk, | 338 | .pclk = &apb_clk, |
339 | .en_reg = PERIP1_CLK_ENB, | 339 | .en_reg = PERIP1_CLK_ENB, |
340 | .en_reg_bit = GPIO_CLK_ENB, | 340 | .en_reg_bit = GPIO_CLK_ENB, |
341 | .recalc = &follow_parent, | 341 | .recalc = &follow_parent, |
342 | }; | 342 | }; |
343 | 343 | ||
344 | static struct clk dummy_apb_pclk; | ||
345 | |||
344 | /* array of all spear 3xx clock lookups */ | 346 | /* array of all spear 3xx clock lookups */ |
345 | static struct clk_lookup spear_clk_lookups[] = { | 347 | static struct clk_lookup spear_clk_lookups[] = { |
348 | { .con_id = "apb_pclk", .clk = &dummy_apb_pclk}, | ||
346 | /* root clks */ | 349 | /* root clks */ |
347 | { .con_id = "osc_32k_clk", .clk = &osc_32k_clk}, | 350 | { .con_id = "osc_32k_clk", .clk = &osc_32k_clk}, |
348 | { .con_id = "osc_24m_clk", .clk = &osc_24m_clk}, | 351 | { .con_id = "osc_24m_clk", .clk = &osc_24m_clk}, |
349 | /* clock derived from 32 KHz osc clk */ | 352 | /* clock derived from 32 KHz osc clk */ |
350 | { .dev_id = "rtc", .clk = &rtc_clk}, | 353 | { .dev_id = "rtc", .clk = &rtc_clk}, |
351 | /* clock derived from 24 MHz osc clk */ | 354 | /* clock derived from 24 MHz osc clk */ |
352 | { .con_id = "pll1_clk", .clk = &pll1_clk}, | 355 | { .con_id = "pll1_clk", .clk = &pll1_clk}, |
353 | { .con_id = "pll3_48m_clk", .clk = &pll3_48m_clk}, | 356 | { .con_id = "pll3_48m_clk", .clk = &pll3_48m_clk}, |
354 | { .dev_id = "wdt", .clk = &wdt_clk}, | 357 | { .dev_id = "wdt", .clk = &wdt_clk}, |
355 | /* clock derived from pll1 clk */ | 358 | /* clock derived from pll1 clk */ |
356 | { .con_id = "cpu_clk", .clk = &cpu_clk}, | 359 | { .con_id = "cpu_clk", .clk = &cpu_clk}, |
357 | { .con_id = "ahb_clk", .clk = &ahb_clk}, | 360 | { .con_id = "ahb_clk", .clk = &ahb_clk}, |
358 | { .dev_id = "uart", .clk = &uart_clk}, | 361 | { .dev_id = "uart", .clk = &uart_clk}, |
359 | { .dev_id = "firda", .clk = &firda_clk}, | 362 | { .dev_id = "firda", .clk = &firda_clk}, |
360 | { .dev_id = "gpt0", .clk = &gpt0_clk}, | 363 | { .dev_id = "gpt0", .clk = &gpt0_clk}, |
361 | { .dev_id = "gpt1", .clk = &gpt1_clk}, | 364 | { .dev_id = "gpt1", .clk = &gpt1_clk}, |
362 | { .dev_id = "gpt2", .clk = &gpt2_clk}, | 365 | { .dev_id = "gpt2", .clk = &gpt2_clk}, |
363 | /* clock derived from pll3 clk */ | 366 | /* clock derived from pll3 clk */ |
364 | { .dev_id = "usbh", .clk = &usbh_clk}, | 367 | { .dev_id = "usbh", .clk = &usbh_clk}, |
365 | { .dev_id = "usbd", .clk = &usbd_clk}, | 368 | { .dev_id = "usbd", .clk = &usbd_clk}, |
366 | { .dev_id = "clcd", .clk = &clcd_clk}, | 369 | { .dev_id = "clcd", .clk = &clcd_clk}, |
367 | /* clock derived from ahb clk */ | 370 | /* clock derived from ahb clk */ |
368 | { .con_id = "apb_clk", .clk = &apb_clk}, | 371 | { .con_id = "apb_clk", .clk = &apb_clk}, |
369 | { .dev_id = "i2c", .clk = &i2c_clk}, | 372 | { .dev_id = "i2c", .clk = &i2c_clk}, |
370 | { .dev_id = "dma", .clk = &dma_clk}, | 373 | { .dev_id = "dma", .clk = &dma_clk}, |
371 | { .dev_id = "jpeg", .clk = &jpeg_clk}, | 374 | { .dev_id = "jpeg", .clk = &jpeg_clk}, |
372 | { .dev_id = "gmac", .clk = &gmac_clk}, | 375 | { .dev_id = "gmac", .clk = &gmac_clk}, |
373 | { .dev_id = "smi", .clk = &smi_clk}, | 376 | { .dev_id = "smi", .clk = &smi_clk}, |
374 | { .dev_id = "c3", .clk = &c3_clk}, | 377 | { .dev_id = "c3", .clk = &c3_clk}, |
375 | /* clock derived from apb clk */ | 378 | /* clock derived from apb clk */ |
376 | { .dev_id = "adc", .clk = &adc_clk}, | 379 | { .dev_id = "adc", .clk = &adc_clk}, |
377 | { .dev_id = "ssp", .clk = &ssp_clk}, | 380 | { .dev_id = "ssp", .clk = &ssp_clk}, |
378 | { .dev_id = "gpio", .clk = &gpio_clk}, | 381 | { .dev_id = "gpio", .clk = &gpio_clk}, |
379 | }; | 382 | }; |
380 | 383 | ||
381 | void __init clk_init(void) | 384 | void __init clk_init(void) |
382 | { | 385 | { |
383 | int i; | 386 | int i; |
384 | 387 | ||
385 | for (i = 0; i < ARRAY_SIZE(spear_clk_lookups); i++) | 388 | for (i = 0; i < ARRAY_SIZE(spear_clk_lookups); i++) |
386 | clk_register(&spear_clk_lookups[i]); | 389 | clk_register(&spear_clk_lookups[i]); |
387 | 390 | ||
388 | recalc_root_clocks(); | 391 | recalc_root_clocks(); |
389 | } | 392 | } |
390 | 393 |
arch/arm/mach-spear6xx/clock.c
1 | /* | 1 | /* |
2 | * arch/arm/mach-spear6xx/clock.c | 2 | * arch/arm/mach-spear6xx/clock.c |
3 | * | 3 | * |
4 | * SPEAr6xx machines clock framework source file | 4 | * SPEAr6xx machines clock framework source file |
5 | * | 5 | * |
6 | * Copyright (C) 2009 ST Microelectronics | 6 | * Copyright (C) 2009 ST Microelectronics |
7 | * Viresh Kumar<viresh.kumar@st.com> | 7 | * Viresh Kumar<viresh.kumar@st.com> |
8 | * | 8 | * |
9 | * This file is licensed under the terms of the GNU General Public | 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 | 10 | * License version 2. This program is licensed "as is" without any |
11 | * warranty of any kind, whether express or implied. | 11 | * warranty of any kind, whether express or implied. |
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
15 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
16 | #include <mach/misc_regs.h> | 16 | #include <mach/misc_regs.h> |
17 | #include <plat/clock.h> | 17 | #include <plat/clock.h> |
18 | 18 | ||
19 | /* root clks */ | 19 | /* root clks */ |
20 | /* 32 KHz oscillator clock */ | 20 | /* 32 KHz oscillator clock */ |
21 | static struct clk osc_32k_clk = { | 21 | static struct clk osc_32k_clk = { |
22 | .flags = ALWAYS_ENABLED, | 22 | .flags = ALWAYS_ENABLED, |
23 | .rate = 32000, | 23 | .rate = 32000, |
24 | }; | 24 | }; |
25 | 25 | ||
26 | /* 30 MHz oscillator clock */ | 26 | /* 30 MHz oscillator clock */ |
27 | static struct clk osc_30m_clk = { | 27 | static struct clk osc_30m_clk = { |
28 | .flags = ALWAYS_ENABLED, | 28 | .flags = ALWAYS_ENABLED, |
29 | .rate = 30000000, | 29 | .rate = 30000000, |
30 | }; | 30 | }; |
31 | 31 | ||
32 | /* clock derived from 32 KHz osc clk */ | 32 | /* clock derived from 32 KHz osc clk */ |
33 | /* rtc clock */ | 33 | /* rtc clock */ |
34 | static struct clk rtc_clk = { | 34 | static struct clk rtc_clk = { |
35 | .pclk = &osc_32k_clk, | 35 | .pclk = &osc_32k_clk, |
36 | .en_reg = PERIP1_CLK_ENB, | 36 | .en_reg = PERIP1_CLK_ENB, |
37 | .en_reg_bit = RTC_CLK_ENB, | 37 | .en_reg_bit = RTC_CLK_ENB, |
38 | .recalc = &follow_parent, | 38 | .recalc = &follow_parent, |
39 | }; | 39 | }; |
40 | 40 | ||
41 | /* clock derived from 30 MHz osc clk */ | 41 | /* clock derived from 30 MHz osc clk */ |
42 | /* pll1 configuration structure */ | 42 | /* pll1 configuration structure */ |
43 | static struct pll_clk_config pll1_config = { | 43 | static struct pll_clk_config pll1_config = { |
44 | .mode_reg = PLL1_CTR, | 44 | .mode_reg = PLL1_CTR, |
45 | .cfg_reg = PLL1_FRQ, | 45 | .cfg_reg = PLL1_FRQ, |
46 | }; | 46 | }; |
47 | 47 | ||
48 | /* PLL1 clock */ | 48 | /* PLL1 clock */ |
49 | static struct clk pll1_clk = { | 49 | static struct clk pll1_clk = { |
50 | .pclk = &osc_30m_clk, | 50 | .pclk = &osc_30m_clk, |
51 | .en_reg = PLL1_CTR, | 51 | .en_reg = PLL1_CTR, |
52 | .en_reg_bit = PLL_ENABLE, | 52 | .en_reg_bit = PLL_ENABLE, |
53 | .recalc = &pll1_clk_recalc, | 53 | .recalc = &pll1_clk_recalc, |
54 | .private_data = &pll1_config, | 54 | .private_data = &pll1_config, |
55 | }; | 55 | }; |
56 | 56 | ||
57 | /* PLL3 48 MHz clock */ | 57 | /* PLL3 48 MHz clock */ |
58 | static struct clk pll3_48m_clk = { | 58 | static struct clk pll3_48m_clk = { |
59 | .flags = ALWAYS_ENABLED, | 59 | .flags = ALWAYS_ENABLED, |
60 | .pclk = &osc_30m_clk, | 60 | .pclk = &osc_30m_clk, |
61 | .rate = 48000000, | 61 | .rate = 48000000, |
62 | }; | 62 | }; |
63 | 63 | ||
64 | /* watch dog timer clock */ | 64 | /* watch dog timer clock */ |
65 | static struct clk wdt_clk = { | 65 | static struct clk wdt_clk = { |
66 | .flags = ALWAYS_ENABLED, | 66 | .flags = ALWAYS_ENABLED, |
67 | .pclk = &osc_30m_clk, | 67 | .pclk = &osc_30m_clk, |
68 | .recalc = &follow_parent, | 68 | .recalc = &follow_parent, |
69 | }; | 69 | }; |
70 | 70 | ||
71 | /* clock derived from pll1 clk */ | 71 | /* clock derived from pll1 clk */ |
72 | /* cpu clock */ | 72 | /* cpu clock */ |
73 | static struct clk cpu_clk = { | 73 | static struct clk cpu_clk = { |
74 | .flags = ALWAYS_ENABLED, | 74 | .flags = ALWAYS_ENABLED, |
75 | .pclk = &pll1_clk, | 75 | .pclk = &pll1_clk, |
76 | .recalc = &follow_parent, | 76 | .recalc = &follow_parent, |
77 | }; | 77 | }; |
78 | 78 | ||
79 | /* ahb configuration structure */ | 79 | /* ahb configuration structure */ |
80 | static struct bus_clk_config ahb_config = { | 80 | static struct bus_clk_config ahb_config = { |
81 | .reg = CORE_CLK_CFG, | 81 | .reg = CORE_CLK_CFG, |
82 | .mask = PLL_HCLK_RATIO_MASK, | 82 | .mask = PLL_HCLK_RATIO_MASK, |
83 | .shift = PLL_HCLK_RATIO_SHIFT, | 83 | .shift = PLL_HCLK_RATIO_SHIFT, |
84 | }; | 84 | }; |
85 | 85 | ||
86 | /* ahb clock */ | 86 | /* ahb clock */ |
87 | static struct clk ahb_clk = { | 87 | static struct clk ahb_clk = { |
88 | .flags = ALWAYS_ENABLED, | 88 | .flags = ALWAYS_ENABLED, |
89 | .pclk = &pll1_clk, | 89 | .pclk = &pll1_clk, |
90 | .recalc = &bus_clk_recalc, | 90 | .recalc = &bus_clk_recalc, |
91 | .private_data = &ahb_config, | 91 | .private_data = &ahb_config, |
92 | }; | 92 | }; |
93 | 93 | ||
94 | /* uart parents */ | 94 | /* uart parents */ |
95 | static struct pclk_info uart_pclk_info[] = { | 95 | static struct pclk_info uart_pclk_info[] = { |
96 | { | 96 | { |
97 | .pclk = &pll1_clk, | 97 | .pclk = &pll1_clk, |
98 | .pclk_mask = AUX_CLK_PLL1_MASK, | 98 | .pclk_mask = AUX_CLK_PLL1_MASK, |
99 | .scalable = 1, | 99 | .scalable = 1, |
100 | }, { | 100 | }, { |
101 | .pclk = &pll3_48m_clk, | 101 | .pclk = &pll3_48m_clk, |
102 | .pclk_mask = AUX_CLK_PLL3_MASK, | 102 | .pclk_mask = AUX_CLK_PLL3_MASK, |
103 | .scalable = 0, | 103 | .scalable = 0, |
104 | }, | 104 | }, |
105 | }; | 105 | }; |
106 | 106 | ||
107 | /* uart parent select structure */ | 107 | /* uart parent select structure */ |
108 | static struct pclk_sel uart_pclk_sel = { | 108 | static struct pclk_sel uart_pclk_sel = { |
109 | .pclk_info = uart_pclk_info, | 109 | .pclk_info = uart_pclk_info, |
110 | .pclk_count = ARRAY_SIZE(uart_pclk_info), | 110 | .pclk_count = ARRAY_SIZE(uart_pclk_info), |
111 | .pclk_sel_reg = PERIP_CLK_CFG, | 111 | .pclk_sel_reg = PERIP_CLK_CFG, |
112 | .pclk_sel_mask = UART_CLK_MASK, | 112 | .pclk_sel_mask = UART_CLK_MASK, |
113 | }; | 113 | }; |
114 | 114 | ||
115 | /* uart configurations */ | 115 | /* uart configurations */ |
116 | static struct aux_clk_config uart_config = { | 116 | static struct aux_clk_config uart_config = { |
117 | .synth_reg = UART_CLK_SYNT, | 117 | .synth_reg = UART_CLK_SYNT, |
118 | }; | 118 | }; |
119 | 119 | ||
120 | /* uart0 clock */ | 120 | /* uart0 clock */ |
121 | static struct clk uart0_clk = { | 121 | static struct clk uart0_clk = { |
122 | .en_reg = PERIP1_CLK_ENB, | 122 | .en_reg = PERIP1_CLK_ENB, |
123 | .en_reg_bit = UART0_CLK_ENB, | 123 | .en_reg_bit = UART0_CLK_ENB, |
124 | .pclk_sel = &uart_pclk_sel, | 124 | .pclk_sel = &uart_pclk_sel, |
125 | .pclk_sel_shift = UART_CLK_SHIFT, | 125 | .pclk_sel_shift = UART_CLK_SHIFT, |
126 | .recalc = &aux_clk_recalc, | 126 | .recalc = &aux_clk_recalc, |
127 | .private_data = &uart_config, | 127 | .private_data = &uart_config, |
128 | }; | 128 | }; |
129 | 129 | ||
130 | /* uart1 clock */ | 130 | /* uart1 clock */ |
131 | static struct clk uart1_clk = { | 131 | static struct clk uart1_clk = { |
132 | .en_reg = PERIP1_CLK_ENB, | 132 | .en_reg = PERIP1_CLK_ENB, |
133 | .en_reg_bit = UART1_CLK_ENB, | 133 | .en_reg_bit = UART1_CLK_ENB, |
134 | .pclk_sel = &uart_pclk_sel, | 134 | .pclk_sel = &uart_pclk_sel, |
135 | .pclk_sel_shift = UART_CLK_SHIFT, | 135 | .pclk_sel_shift = UART_CLK_SHIFT, |
136 | .recalc = &aux_clk_recalc, | 136 | .recalc = &aux_clk_recalc, |
137 | .private_data = &uart_config, | 137 | .private_data = &uart_config, |
138 | }; | 138 | }; |
139 | 139 | ||
140 | /* firda configurations */ | 140 | /* firda configurations */ |
141 | static struct aux_clk_config firda_config = { | 141 | static struct aux_clk_config firda_config = { |
142 | .synth_reg = FIRDA_CLK_SYNT, | 142 | .synth_reg = FIRDA_CLK_SYNT, |
143 | }; | 143 | }; |
144 | 144 | ||
145 | /* firda parents */ | 145 | /* firda parents */ |
146 | static struct pclk_info firda_pclk_info[] = { | 146 | static struct pclk_info firda_pclk_info[] = { |
147 | { | 147 | { |
148 | .pclk = &pll1_clk, | 148 | .pclk = &pll1_clk, |
149 | .pclk_mask = AUX_CLK_PLL1_MASK, | 149 | .pclk_mask = AUX_CLK_PLL1_MASK, |
150 | .scalable = 1, | 150 | .scalable = 1, |
151 | }, { | 151 | }, { |
152 | .pclk = &pll3_48m_clk, | 152 | .pclk = &pll3_48m_clk, |
153 | .pclk_mask = AUX_CLK_PLL3_MASK, | 153 | .pclk_mask = AUX_CLK_PLL3_MASK, |
154 | .scalable = 0, | 154 | .scalable = 0, |
155 | }, | 155 | }, |
156 | }; | 156 | }; |
157 | 157 | ||
158 | /* firda parent select structure */ | 158 | /* firda parent select structure */ |
159 | static struct pclk_sel firda_pclk_sel = { | 159 | static struct pclk_sel firda_pclk_sel = { |
160 | .pclk_info = firda_pclk_info, | 160 | .pclk_info = firda_pclk_info, |
161 | .pclk_count = ARRAY_SIZE(firda_pclk_info), | 161 | .pclk_count = ARRAY_SIZE(firda_pclk_info), |
162 | .pclk_sel_reg = PERIP_CLK_CFG, | 162 | .pclk_sel_reg = PERIP_CLK_CFG, |
163 | .pclk_sel_mask = FIRDA_CLK_MASK, | 163 | .pclk_sel_mask = FIRDA_CLK_MASK, |
164 | }; | 164 | }; |
165 | 165 | ||
166 | /* firda clock */ | 166 | /* firda clock */ |
167 | static struct clk firda_clk = { | 167 | static struct clk firda_clk = { |
168 | .en_reg = PERIP1_CLK_ENB, | 168 | .en_reg = PERIP1_CLK_ENB, |
169 | .en_reg_bit = FIRDA_CLK_ENB, | 169 | .en_reg_bit = FIRDA_CLK_ENB, |
170 | .pclk_sel = &firda_pclk_sel, | 170 | .pclk_sel = &firda_pclk_sel, |
171 | .pclk_sel_shift = FIRDA_CLK_SHIFT, | 171 | .pclk_sel_shift = FIRDA_CLK_SHIFT, |
172 | .recalc = &aux_clk_recalc, | 172 | .recalc = &aux_clk_recalc, |
173 | .private_data = &firda_config, | 173 | .private_data = &firda_config, |
174 | }; | 174 | }; |
175 | 175 | ||
176 | /* clcd configurations */ | 176 | /* clcd configurations */ |
177 | static struct aux_clk_config clcd_config = { | 177 | static struct aux_clk_config clcd_config = { |
178 | .synth_reg = CLCD_CLK_SYNT, | 178 | .synth_reg = CLCD_CLK_SYNT, |
179 | }; | 179 | }; |
180 | 180 | ||
181 | /* clcd parents */ | 181 | /* clcd parents */ |
182 | static struct pclk_info clcd_pclk_info[] = { | 182 | static struct pclk_info clcd_pclk_info[] = { |
183 | { | 183 | { |
184 | .pclk = &pll1_clk, | 184 | .pclk = &pll1_clk, |
185 | .pclk_mask = AUX_CLK_PLL1_MASK, | 185 | .pclk_mask = AUX_CLK_PLL1_MASK, |
186 | .scalable = 1, | 186 | .scalable = 1, |
187 | }, { | 187 | }, { |
188 | .pclk = &pll3_48m_clk, | 188 | .pclk = &pll3_48m_clk, |
189 | .pclk_mask = AUX_CLK_PLL3_MASK, | 189 | .pclk_mask = AUX_CLK_PLL3_MASK, |
190 | .scalable = 0, | 190 | .scalable = 0, |
191 | }, | 191 | }, |
192 | }; | 192 | }; |
193 | 193 | ||
194 | /* clcd parent select structure */ | 194 | /* clcd parent select structure */ |
195 | static struct pclk_sel clcd_pclk_sel = { | 195 | static struct pclk_sel clcd_pclk_sel = { |
196 | .pclk_info = clcd_pclk_info, | 196 | .pclk_info = clcd_pclk_info, |
197 | .pclk_count = ARRAY_SIZE(clcd_pclk_info), | 197 | .pclk_count = ARRAY_SIZE(clcd_pclk_info), |
198 | .pclk_sel_reg = PERIP_CLK_CFG, | 198 | .pclk_sel_reg = PERIP_CLK_CFG, |
199 | .pclk_sel_mask = CLCD_CLK_MASK, | 199 | .pclk_sel_mask = CLCD_CLK_MASK, |
200 | }; | 200 | }; |
201 | 201 | ||
202 | /* clcd clock */ | 202 | /* clcd clock */ |
203 | static struct clk clcd_clk = { | 203 | static struct clk clcd_clk = { |
204 | .en_reg = PERIP1_CLK_ENB, | 204 | .en_reg = PERIP1_CLK_ENB, |
205 | .en_reg_bit = CLCD_CLK_ENB, | 205 | .en_reg_bit = CLCD_CLK_ENB, |
206 | .pclk_sel = &clcd_pclk_sel, | 206 | .pclk_sel = &clcd_pclk_sel, |
207 | .pclk_sel_shift = CLCD_CLK_SHIFT, | 207 | .pclk_sel_shift = CLCD_CLK_SHIFT, |
208 | .recalc = &aux_clk_recalc, | 208 | .recalc = &aux_clk_recalc, |
209 | .private_data = &clcd_config, | 209 | .private_data = &clcd_config, |
210 | }; | 210 | }; |
211 | 211 | ||
212 | /* gpt parents */ | 212 | /* gpt parents */ |
213 | static struct pclk_info gpt_pclk_info[] = { | 213 | static struct pclk_info gpt_pclk_info[] = { |
214 | { | 214 | { |
215 | .pclk = &pll1_clk, | 215 | .pclk = &pll1_clk, |
216 | .pclk_mask = AUX_CLK_PLL1_MASK, | 216 | .pclk_mask = AUX_CLK_PLL1_MASK, |
217 | .scalable = 1, | 217 | .scalable = 1, |
218 | }, { | 218 | }, { |
219 | .pclk = &pll3_48m_clk, | 219 | .pclk = &pll3_48m_clk, |
220 | .pclk_mask = AUX_CLK_PLL3_MASK, | 220 | .pclk_mask = AUX_CLK_PLL3_MASK, |
221 | .scalable = 0, | 221 | .scalable = 0, |
222 | }, | 222 | }, |
223 | }; | 223 | }; |
224 | 224 | ||
225 | /* gpt parent select structure */ | 225 | /* gpt parent select structure */ |
226 | static struct pclk_sel gpt_pclk_sel = { | 226 | static struct pclk_sel gpt_pclk_sel = { |
227 | .pclk_info = gpt_pclk_info, | 227 | .pclk_info = gpt_pclk_info, |
228 | .pclk_count = ARRAY_SIZE(gpt_pclk_info), | 228 | .pclk_count = ARRAY_SIZE(gpt_pclk_info), |
229 | .pclk_sel_reg = PERIP_CLK_CFG, | 229 | .pclk_sel_reg = PERIP_CLK_CFG, |
230 | .pclk_sel_mask = GPT_CLK_MASK, | 230 | .pclk_sel_mask = GPT_CLK_MASK, |
231 | }; | 231 | }; |
232 | 232 | ||
233 | /* gpt0_1 configurations */ | 233 | /* gpt0_1 configurations */ |
234 | static struct aux_clk_config gpt0_1_config = { | 234 | static struct aux_clk_config gpt0_1_config = { |
235 | .synth_reg = PRSC1_CLK_CFG, | 235 | .synth_reg = PRSC1_CLK_CFG, |
236 | }; | 236 | }; |
237 | 237 | ||
238 | /* gpt0 ARM1 subsystem timer clock */ | 238 | /* gpt0 ARM1 subsystem timer clock */ |
239 | static struct clk gpt0_clk = { | 239 | static struct clk gpt0_clk = { |
240 | .flags = ALWAYS_ENABLED, | 240 | .flags = ALWAYS_ENABLED, |
241 | .pclk_sel = &gpt_pclk_sel, | 241 | .pclk_sel = &gpt_pclk_sel, |
242 | .pclk_sel_shift = GPT0_CLK_SHIFT, | 242 | .pclk_sel_shift = GPT0_CLK_SHIFT, |
243 | .recalc = &gpt_clk_recalc, | 243 | .recalc = &gpt_clk_recalc, |
244 | .private_data = &gpt0_1_config, | 244 | .private_data = &gpt0_1_config, |
245 | }; | 245 | }; |
246 | 246 | ||
247 | /* gpt1 timer clock */ | 247 | /* gpt1 timer clock */ |
248 | static struct clk gpt1_clk = { | 248 | static struct clk gpt1_clk = { |
249 | .flags = ALWAYS_ENABLED, | 249 | .flags = ALWAYS_ENABLED, |
250 | .pclk_sel = &gpt_pclk_sel, | 250 | .pclk_sel = &gpt_pclk_sel, |
251 | .pclk_sel_shift = GPT1_CLK_SHIFT, | 251 | .pclk_sel_shift = GPT1_CLK_SHIFT, |
252 | .recalc = &gpt_clk_recalc, | 252 | .recalc = &gpt_clk_recalc, |
253 | .private_data = &gpt0_1_config, | 253 | .private_data = &gpt0_1_config, |
254 | }; | 254 | }; |
255 | 255 | ||
256 | /* gpt2 configurations */ | 256 | /* gpt2 configurations */ |
257 | static struct aux_clk_config gpt2_config = { | 257 | static struct aux_clk_config gpt2_config = { |
258 | .synth_reg = PRSC2_CLK_CFG, | 258 | .synth_reg = PRSC2_CLK_CFG, |
259 | }; | 259 | }; |
260 | 260 | ||
261 | /* gpt2 timer clock */ | 261 | /* gpt2 timer clock */ |
262 | static struct clk gpt2_clk = { | 262 | static struct clk gpt2_clk = { |
263 | .en_reg = PERIP1_CLK_ENB, | 263 | .en_reg = PERIP1_CLK_ENB, |
264 | .en_reg_bit = GPT2_CLK_ENB, | 264 | .en_reg_bit = GPT2_CLK_ENB, |
265 | .pclk_sel = &gpt_pclk_sel, | 265 | .pclk_sel = &gpt_pclk_sel, |
266 | .pclk_sel_shift = GPT2_CLK_SHIFT, | 266 | .pclk_sel_shift = GPT2_CLK_SHIFT, |
267 | .recalc = &gpt_clk_recalc, | 267 | .recalc = &gpt_clk_recalc, |
268 | .private_data = &gpt2_config, | 268 | .private_data = &gpt2_config, |
269 | }; | 269 | }; |
270 | 270 | ||
271 | /* gpt3 configurations */ | 271 | /* gpt3 configurations */ |
272 | static struct aux_clk_config gpt3_config = { | 272 | static struct aux_clk_config gpt3_config = { |
273 | .synth_reg = PRSC3_CLK_CFG, | 273 | .synth_reg = PRSC3_CLK_CFG, |
274 | }; | 274 | }; |
275 | 275 | ||
276 | /* gpt3 timer clock */ | 276 | /* gpt3 timer clock */ |
277 | static struct clk gpt3_clk = { | 277 | static struct clk gpt3_clk = { |
278 | .en_reg = PERIP1_CLK_ENB, | 278 | .en_reg = PERIP1_CLK_ENB, |
279 | .en_reg_bit = GPT3_CLK_ENB, | 279 | .en_reg_bit = GPT3_CLK_ENB, |
280 | .pclk_sel = &gpt_pclk_sel, | 280 | .pclk_sel = &gpt_pclk_sel, |
281 | .pclk_sel_shift = GPT3_CLK_SHIFT, | 281 | .pclk_sel_shift = GPT3_CLK_SHIFT, |
282 | .recalc = &gpt_clk_recalc, | 282 | .recalc = &gpt_clk_recalc, |
283 | .private_data = &gpt3_config, | 283 | .private_data = &gpt3_config, |
284 | }; | 284 | }; |
285 | 285 | ||
286 | /* clock derived from pll3 clk */ | 286 | /* clock derived from pll3 clk */ |
287 | /* usbh0 clock */ | 287 | /* usbh0 clock */ |
288 | static struct clk usbh0_clk = { | 288 | static struct clk usbh0_clk = { |
289 | .pclk = &pll3_48m_clk, | 289 | .pclk = &pll3_48m_clk, |
290 | .en_reg = PERIP1_CLK_ENB, | 290 | .en_reg = PERIP1_CLK_ENB, |
291 | .en_reg_bit = USBH0_CLK_ENB, | 291 | .en_reg_bit = USBH0_CLK_ENB, |
292 | .recalc = &follow_parent, | 292 | .recalc = &follow_parent, |
293 | }; | 293 | }; |
294 | 294 | ||
295 | /* usbh1 clock */ | 295 | /* usbh1 clock */ |
296 | static struct clk usbh1_clk = { | 296 | static struct clk usbh1_clk = { |
297 | .pclk = &pll3_48m_clk, | 297 | .pclk = &pll3_48m_clk, |
298 | .en_reg = PERIP1_CLK_ENB, | 298 | .en_reg = PERIP1_CLK_ENB, |
299 | .en_reg_bit = USBH1_CLK_ENB, | 299 | .en_reg_bit = USBH1_CLK_ENB, |
300 | .recalc = &follow_parent, | 300 | .recalc = &follow_parent, |
301 | }; | 301 | }; |
302 | 302 | ||
303 | /* usbd clock */ | 303 | /* usbd clock */ |
304 | static struct clk usbd_clk = { | 304 | static struct clk usbd_clk = { |
305 | .pclk = &pll3_48m_clk, | 305 | .pclk = &pll3_48m_clk, |
306 | .en_reg = PERIP1_CLK_ENB, | 306 | .en_reg = PERIP1_CLK_ENB, |
307 | .en_reg_bit = USBD_CLK_ENB, | 307 | .en_reg_bit = USBD_CLK_ENB, |
308 | .recalc = &follow_parent, | 308 | .recalc = &follow_parent, |
309 | }; | 309 | }; |
310 | 310 | ||
311 | /* clock derived from ahb clk */ | 311 | /* clock derived from ahb clk */ |
312 | /* apb configuration structure */ | 312 | /* apb configuration structure */ |
313 | static struct bus_clk_config apb_config = { | 313 | static struct bus_clk_config apb_config = { |
314 | .reg = CORE_CLK_CFG, | 314 | .reg = CORE_CLK_CFG, |
315 | .mask = HCLK_PCLK_RATIO_MASK, | 315 | .mask = HCLK_PCLK_RATIO_MASK, |
316 | .shift = HCLK_PCLK_RATIO_SHIFT, | 316 | .shift = HCLK_PCLK_RATIO_SHIFT, |
317 | }; | 317 | }; |
318 | 318 | ||
319 | /* apb clock */ | 319 | /* apb clock */ |
320 | static struct clk apb_clk = { | 320 | static struct clk apb_clk = { |
321 | .flags = ALWAYS_ENABLED, | 321 | .flags = ALWAYS_ENABLED, |
322 | .pclk = &ahb_clk, | 322 | .pclk = &ahb_clk, |
323 | .recalc = &bus_clk_recalc, | 323 | .recalc = &bus_clk_recalc, |
324 | .private_data = &apb_config, | 324 | .private_data = &apb_config, |
325 | }; | 325 | }; |
326 | 326 | ||
327 | /* i2c clock */ | 327 | /* i2c clock */ |
328 | static struct clk i2c_clk = { | 328 | static struct clk i2c_clk = { |
329 | .pclk = &ahb_clk, | 329 | .pclk = &ahb_clk, |
330 | .en_reg = PERIP1_CLK_ENB, | 330 | .en_reg = PERIP1_CLK_ENB, |
331 | .en_reg_bit = I2C_CLK_ENB, | 331 | .en_reg_bit = I2C_CLK_ENB, |
332 | .recalc = &follow_parent, | 332 | .recalc = &follow_parent, |
333 | }; | 333 | }; |
334 | 334 | ||
335 | /* dma clock */ | 335 | /* dma clock */ |
336 | static struct clk dma_clk = { | 336 | static struct clk dma_clk = { |
337 | .pclk = &ahb_clk, | 337 | .pclk = &ahb_clk, |
338 | .en_reg = PERIP1_CLK_ENB, | 338 | .en_reg = PERIP1_CLK_ENB, |
339 | .en_reg_bit = DMA_CLK_ENB, | 339 | .en_reg_bit = DMA_CLK_ENB, |
340 | .recalc = &follow_parent, | 340 | .recalc = &follow_parent, |
341 | }; | 341 | }; |
342 | 342 | ||
343 | /* jpeg clock */ | 343 | /* jpeg clock */ |
344 | static struct clk jpeg_clk = { | 344 | static struct clk jpeg_clk = { |
345 | .pclk = &ahb_clk, | 345 | .pclk = &ahb_clk, |
346 | .en_reg = PERIP1_CLK_ENB, | 346 | .en_reg = PERIP1_CLK_ENB, |
347 | .en_reg_bit = JPEG_CLK_ENB, | 347 | .en_reg_bit = JPEG_CLK_ENB, |
348 | .recalc = &follow_parent, | 348 | .recalc = &follow_parent, |
349 | }; | 349 | }; |
350 | 350 | ||
351 | /* gmac clock */ | 351 | /* gmac clock */ |
352 | static struct clk gmac_clk = { | 352 | static struct clk gmac_clk = { |
353 | .pclk = &ahb_clk, | 353 | .pclk = &ahb_clk, |
354 | .en_reg = PERIP1_CLK_ENB, | 354 | .en_reg = PERIP1_CLK_ENB, |
355 | .en_reg_bit = GMAC_CLK_ENB, | 355 | .en_reg_bit = GMAC_CLK_ENB, |
356 | .recalc = &follow_parent, | 356 | .recalc = &follow_parent, |
357 | }; | 357 | }; |
358 | 358 | ||
359 | /* smi clock */ | 359 | /* smi clock */ |
360 | static struct clk smi_clk = { | 360 | static struct clk smi_clk = { |
361 | .pclk = &ahb_clk, | 361 | .pclk = &ahb_clk, |
362 | .en_reg = PERIP1_CLK_ENB, | 362 | .en_reg = PERIP1_CLK_ENB, |
363 | .en_reg_bit = SMI_CLK_ENB, | 363 | .en_reg_bit = SMI_CLK_ENB, |
364 | .recalc = &follow_parent, | 364 | .recalc = &follow_parent, |
365 | }; | 365 | }; |
366 | 366 | ||
367 | /* fsmc clock */ | 367 | /* fsmc clock */ |
368 | static struct clk fsmc_clk = { | 368 | static struct clk fsmc_clk = { |
369 | .pclk = &ahb_clk, | 369 | .pclk = &ahb_clk, |
370 | .en_reg = PERIP1_CLK_ENB, | 370 | .en_reg = PERIP1_CLK_ENB, |
371 | .en_reg_bit = FSMC_CLK_ENB, | 371 | .en_reg_bit = FSMC_CLK_ENB, |
372 | .recalc = &follow_parent, | 372 | .recalc = &follow_parent, |
373 | }; | 373 | }; |
374 | 374 | ||
375 | /* clock derived from apb clk */ | 375 | /* clock derived from apb clk */ |
376 | /* adc clock */ | 376 | /* adc clock */ |
377 | static struct clk adc_clk = { | 377 | static struct clk adc_clk = { |
378 | .pclk = &apb_clk, | 378 | .pclk = &apb_clk, |
379 | .en_reg = PERIP1_CLK_ENB, | 379 | .en_reg = PERIP1_CLK_ENB, |
380 | .en_reg_bit = ADC_CLK_ENB, | 380 | .en_reg_bit = ADC_CLK_ENB, |
381 | .recalc = &follow_parent, | 381 | .recalc = &follow_parent, |
382 | }; | 382 | }; |
383 | 383 | ||
384 | /* ssp0 clock */ | 384 | /* ssp0 clock */ |
385 | static struct clk ssp0_clk = { | 385 | static struct clk ssp0_clk = { |
386 | .pclk = &apb_clk, | 386 | .pclk = &apb_clk, |
387 | .en_reg = PERIP1_CLK_ENB, | 387 | .en_reg = PERIP1_CLK_ENB, |
388 | .en_reg_bit = SSP0_CLK_ENB, | 388 | .en_reg_bit = SSP0_CLK_ENB, |
389 | .recalc = &follow_parent, | 389 | .recalc = &follow_parent, |
390 | }; | 390 | }; |
391 | 391 | ||
392 | /* ssp1 clock */ | 392 | /* ssp1 clock */ |
393 | static struct clk ssp1_clk = { | 393 | static struct clk ssp1_clk = { |
394 | .pclk = &apb_clk, | 394 | .pclk = &apb_clk, |
395 | .en_reg = PERIP1_CLK_ENB, | 395 | .en_reg = PERIP1_CLK_ENB, |
396 | .en_reg_bit = SSP1_CLK_ENB, | 396 | .en_reg_bit = SSP1_CLK_ENB, |
397 | .recalc = &follow_parent, | 397 | .recalc = &follow_parent, |
398 | }; | 398 | }; |
399 | 399 | ||
400 | /* ssp2 clock */ | 400 | /* ssp2 clock */ |
401 | static struct clk ssp2_clk = { | 401 | static struct clk ssp2_clk = { |
402 | .pclk = &apb_clk, | 402 | .pclk = &apb_clk, |
403 | .en_reg = PERIP1_CLK_ENB, | 403 | .en_reg = PERIP1_CLK_ENB, |
404 | .en_reg_bit = SSP2_CLK_ENB, | 404 | .en_reg_bit = SSP2_CLK_ENB, |
405 | .recalc = &follow_parent, | 405 | .recalc = &follow_parent, |
406 | }; | 406 | }; |
407 | 407 | ||
408 | /* gpio0 ARM subsystem clock */ | 408 | /* gpio0 ARM subsystem clock */ |
409 | static struct clk gpio0_clk = { | 409 | static struct clk gpio0_clk = { |
410 | .flags = ALWAYS_ENABLED, | 410 | .flags = ALWAYS_ENABLED, |
411 | .pclk = &apb_clk, | 411 | .pclk = &apb_clk, |
412 | .recalc = &follow_parent, | 412 | .recalc = &follow_parent, |
413 | }; | 413 | }; |
414 | 414 | ||
415 | /* gpio1 clock */ | 415 | /* gpio1 clock */ |
416 | static struct clk gpio1_clk = { | 416 | static struct clk gpio1_clk = { |
417 | .pclk = &apb_clk, | 417 | .pclk = &apb_clk, |
418 | .en_reg = PERIP1_CLK_ENB, | 418 | .en_reg = PERIP1_CLK_ENB, |
419 | .en_reg_bit = GPIO1_CLK_ENB, | 419 | .en_reg_bit = GPIO1_CLK_ENB, |
420 | .recalc = &follow_parent, | 420 | .recalc = &follow_parent, |
421 | }; | 421 | }; |
422 | 422 | ||
423 | /* gpio2 clock */ | 423 | /* gpio2 clock */ |
424 | static struct clk gpio2_clk = { | 424 | static struct clk gpio2_clk = { |
425 | .pclk = &apb_clk, | 425 | .pclk = &apb_clk, |
426 | .en_reg = PERIP1_CLK_ENB, | 426 | .en_reg = PERIP1_CLK_ENB, |
427 | .en_reg_bit = GPIO2_CLK_ENB, | 427 | .en_reg_bit = GPIO2_CLK_ENB, |
428 | .recalc = &follow_parent, | 428 | .recalc = &follow_parent, |
429 | }; | 429 | }; |
430 | 430 | ||
431 | static struct clk dummy_apb_pclk; | ||
432 | |||
431 | /* array of all spear 6xx clock lookups */ | 433 | /* array of all spear 6xx clock lookups */ |
432 | static struct clk_lookup spear_clk_lookups[] = { | 434 | static struct clk_lookup spear_clk_lookups[] = { |
435 | { .con_id = "apb_pclk", .clk = &dummy_apb_pclk}, | ||
433 | /* root clks */ | 436 | /* root clks */ |
434 | { .con_id = "osc_32k_clk", .clk = &osc_32k_clk}, | 437 | { .con_id = "osc_32k_clk", .clk = &osc_32k_clk}, |
435 | { .con_id = "osc_30m_clk", .clk = &osc_30m_clk}, | 438 | { .con_id = "osc_30m_clk", .clk = &osc_30m_clk}, |
436 | /* clock derived from 32 KHz os clk */ | 439 | /* clock derived from 32 KHz os clk */ |
437 | { .dev_id = "rtc", .clk = &rtc_clk}, | 440 | { .dev_id = "rtc", .clk = &rtc_clk}, |
438 | /* clock derived from 30 MHz os clk */ | 441 | /* clock derived from 30 MHz os clk */ |
439 | { .con_id = "pll1_clk", .clk = &pll1_clk}, | 442 | { .con_id = "pll1_clk", .clk = &pll1_clk}, |
440 | { .con_id = "pll3_48m_clk", .clk = &pll3_48m_clk}, | 443 | { .con_id = "pll3_48m_clk", .clk = &pll3_48m_clk}, |
441 | { .dev_id = "wdt", .clk = &wdt_clk}, | 444 | { .dev_id = "wdt", .clk = &wdt_clk}, |
442 | /* clock derived from pll1 clk */ | 445 | /* clock derived from pll1 clk */ |
443 | { .con_id = "cpu_clk", .clk = &cpu_clk}, | 446 | { .con_id = "cpu_clk", .clk = &cpu_clk}, |
444 | { .con_id = "ahb_clk", .clk = &ahb_clk}, | 447 | { .con_id = "ahb_clk", .clk = &ahb_clk}, |
445 | { .dev_id = "uart0", .clk = &uart0_clk}, | 448 | { .dev_id = "uart0", .clk = &uart0_clk}, |
446 | { .dev_id = "uart1", .clk = &uart1_clk}, | 449 | { .dev_id = "uart1", .clk = &uart1_clk}, |
447 | { .dev_id = "firda", .clk = &firda_clk}, | 450 | { .dev_id = "firda", .clk = &firda_clk}, |
448 | { .dev_id = "clcd", .clk = &clcd_clk}, | 451 | { .dev_id = "clcd", .clk = &clcd_clk}, |
449 | { .dev_id = "gpt0", .clk = &gpt0_clk}, | 452 | { .dev_id = "gpt0", .clk = &gpt0_clk}, |
450 | { .dev_id = "gpt1", .clk = &gpt1_clk}, | 453 | { .dev_id = "gpt1", .clk = &gpt1_clk}, |
451 | { .dev_id = "gpt2", .clk = &gpt2_clk}, | 454 | { .dev_id = "gpt2", .clk = &gpt2_clk}, |
452 | { .dev_id = "gpt3", .clk = &gpt3_clk}, | 455 | { .dev_id = "gpt3", .clk = &gpt3_clk}, |
453 | /* clock derived from pll3 clk */ | 456 | /* clock derived from pll3 clk */ |
454 | { .dev_id = "usbh0", .clk = &usbh0_clk}, | 457 | { .dev_id = "usbh0", .clk = &usbh0_clk}, |
455 | { .dev_id = "usbh1", .clk = &usbh1_clk}, | 458 | { .dev_id = "usbh1", .clk = &usbh1_clk}, |
456 | { .dev_id = "usbd", .clk = &usbd_clk}, | 459 | { .dev_id = "usbd", .clk = &usbd_clk}, |
457 | /* clock derived from ahb clk */ | 460 | /* clock derived from ahb clk */ |
458 | { .con_id = "apb_clk", .clk = &apb_clk}, | 461 | { .con_id = "apb_clk", .clk = &apb_clk}, |
459 | { .dev_id = "i2c", .clk = &i2c_clk}, | 462 | { .dev_id = "i2c", .clk = &i2c_clk}, |
460 | { .dev_id = "dma", .clk = &dma_clk}, | 463 | { .dev_id = "dma", .clk = &dma_clk}, |
461 | { .dev_id = "jpeg", .clk = &jpeg_clk}, | 464 | { .dev_id = "jpeg", .clk = &jpeg_clk}, |
462 | { .dev_id = "gmac", .clk = &gmac_clk}, | 465 | { .dev_id = "gmac", .clk = &gmac_clk}, |
463 | { .dev_id = "smi", .clk = &smi_clk}, | 466 | { .dev_id = "smi", .clk = &smi_clk}, |
464 | { .dev_id = "fsmc", .clk = &fsmc_clk}, | 467 | { .dev_id = "fsmc", .clk = &fsmc_clk}, |
465 | /* clock derived from apb clk */ | 468 | /* clock derived from apb clk */ |
466 | { .dev_id = "adc", .clk = &adc_clk}, | 469 | { .dev_id = "adc", .clk = &adc_clk}, |
467 | { .dev_id = "ssp0", .clk = &ssp0_clk}, | 470 | { .dev_id = "ssp0", .clk = &ssp0_clk}, |
468 | { .dev_id = "ssp1", .clk = &ssp1_clk}, | 471 | { .dev_id = "ssp1", .clk = &ssp1_clk}, |
469 | { .dev_id = "ssp2", .clk = &ssp2_clk}, | 472 | { .dev_id = "ssp2", .clk = &ssp2_clk}, |
470 | { .dev_id = "gpio0", .clk = &gpio0_clk}, | 473 | { .dev_id = "gpio0", .clk = &gpio0_clk}, |
471 | { .dev_id = "gpio1", .clk = &gpio1_clk}, | 474 | { .dev_id = "gpio1", .clk = &gpio1_clk}, |
472 | { .dev_id = "gpio2", .clk = &gpio2_clk}, | 475 | { .dev_id = "gpio2", .clk = &gpio2_clk}, |
473 | }; | 476 | }; |
474 | 477 | ||
475 | void __init clk_init(void) | 478 | void __init clk_init(void) |
476 | { | 479 | { |
477 | int i; | 480 | int i; |
478 | 481 | ||
479 | for (i = 0; i < ARRAY_SIZE(spear_clk_lookups); i++) | 482 | for (i = 0; i < ARRAY_SIZE(spear_clk_lookups); i++) |
480 | clk_register(&spear_clk_lookups[i]); | 483 | clk_register(&spear_clk_lookups[i]); |
481 | 484 | ||
482 | recalc_root_clocks(); | 485 | recalc_root_clocks(); |
483 | } | 486 | } |
484 | 487 |
arch/arm/mach-u300/clock.c
1 | /* | 1 | /* |
2 | * | 2 | * |
3 | * arch/arm/mach-u300/clock.c | 3 | * arch/arm/mach-u300/clock.c |
4 | * | 4 | * |
5 | * | 5 | * |
6 | * Copyright (C) 2007-2009 ST-Ericsson AB | 6 | * Copyright (C) 2007-2009 ST-Ericsson AB |
7 | * License terms: GNU General Public License (GPL) version 2 | 7 | * License terms: GNU General Public License (GPL) version 2 |
8 | * Define clocks in the app platform. | 8 | * Define clocks in the app platform. |
9 | * Author: Linus Walleij <linus.walleij@stericsson.com> | 9 | * Author: Linus Walleij <linus.walleij@stericsson.com> |
10 | * Author: Jonas Aaberg <jonas.aberg@stericsson.com> | 10 | * Author: Jonas Aaberg <jonas.aberg@stericsson.com> |
11 | * | 11 | * |
12 | */ | 12 | */ |
13 | #include <linux/module.h> | 13 | #include <linux/module.h> |
14 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> |
15 | #include <linux/list.h> | 15 | #include <linux/list.h> |
16 | #include <linux/errno.h> | 16 | #include <linux/errno.h> |
17 | #include <linux/err.h> | 17 | #include <linux/err.h> |
18 | #include <linux/string.h> | 18 | #include <linux/string.h> |
19 | #include <linux/clk.h> | 19 | #include <linux/clk.h> |
20 | #include <linux/mutex.h> | 20 | #include <linux/mutex.h> |
21 | #include <linux/spinlock.h> | 21 | #include <linux/spinlock.h> |
22 | #include <linux/debugfs.h> | 22 | #include <linux/debugfs.h> |
23 | #include <linux/device.h> | 23 | #include <linux/device.h> |
24 | #include <linux/init.h> | 24 | #include <linux/init.h> |
25 | #include <linux/timer.h> | 25 | #include <linux/timer.h> |
26 | #include <linux/io.h> | 26 | #include <linux/io.h> |
27 | #include <linux/seq_file.h> | 27 | #include <linux/seq_file.h> |
28 | 28 | ||
29 | #include <asm/clkdev.h> | 29 | #include <asm/clkdev.h> |
30 | #include <mach/hardware.h> | 30 | #include <mach/hardware.h> |
31 | #include <mach/syscon.h> | 31 | #include <mach/syscon.h> |
32 | 32 | ||
33 | #include "clock.h" | 33 | #include "clock.h" |
34 | 34 | ||
35 | /* | 35 | /* |
36 | * TODO: | 36 | * TODO: |
37 | * - move all handling of the CCR register into this file and create | 37 | * - move all handling of the CCR register into this file and create |
38 | * a spinlock for the CCR register | 38 | * a spinlock for the CCR register |
39 | * - switch to the clkdevice lookup mechanism that maps clocks to | 39 | * - switch to the clkdevice lookup mechanism that maps clocks to |
40 | * device ID:s instead when it becomes available in kernel 2.6.29. | 40 | * device ID:s instead when it becomes available in kernel 2.6.29. |
41 | * - implement rate get/set for all clocks that need it. | 41 | * - implement rate get/set for all clocks that need it. |
42 | */ | 42 | */ |
43 | 43 | ||
44 | /* | 44 | /* |
45 | * Syscon clock I/O registers lock so clock requests don't collide | 45 | * Syscon clock I/O registers lock so clock requests don't collide |
46 | * NOTE: this is a local lock only used to lock access to clock and | 46 | * NOTE: this is a local lock only used to lock access to clock and |
47 | * reset registers in syscon. | 47 | * reset registers in syscon. |
48 | */ | 48 | */ |
49 | static DEFINE_SPINLOCK(syscon_clkreg_lock); | 49 | static DEFINE_SPINLOCK(syscon_clkreg_lock); |
50 | static DEFINE_SPINLOCK(syscon_resetreg_lock); | 50 | static DEFINE_SPINLOCK(syscon_resetreg_lock); |
51 | 51 | ||
52 | /* | 52 | /* |
53 | * The clocking hierarchy currently looks like this. | 53 | * The clocking hierarchy currently looks like this. |
54 | * NOTE: the idea is NOT to show how the clocks are routed on the chip! | 54 | * NOTE: the idea is NOT to show how the clocks are routed on the chip! |
55 | * The ideas is to show dependencies, so a clock higher up in the | 55 | * The ideas is to show dependencies, so a clock higher up in the |
56 | * hierarchy has to be on in order for another clock to be on. Now, | 56 | * hierarchy has to be on in order for another clock to be on. Now, |
57 | * both CPU and DMA can actually be on top of the hierarchy, and that | 57 | * both CPU and DMA can actually be on top of the hierarchy, and that |
58 | * is not modeled currently. Instead we have the backbone AMBA bus on | 58 | * is not modeled currently. Instead we have the backbone AMBA bus on |
59 | * top. This bus cannot be programmed in any way but conceptually it | 59 | * top. This bus cannot be programmed in any way but conceptually it |
60 | * needs to be active for the bridges and devices to transport data. | 60 | * needs to be active for the bridges and devices to transport data. |
61 | * | 61 | * |
62 | * Please be aware that a few clocks are hw controlled, which mean that | 62 | * Please be aware that a few clocks are hw controlled, which mean that |
63 | * the hw itself can turn on/off or change the rate of the clock when | 63 | * the hw itself can turn on/off or change the rate of the clock when |
64 | * needed! | 64 | * needed! |
65 | * | 65 | * |
66 | * AMBA bus | 66 | * AMBA bus |
67 | * | | 67 | * | |
68 | * +- CPU | 68 | * +- CPU |
69 | * +- NANDIF NAND Flash interface | 69 | * +- NANDIF NAND Flash interface |
70 | * +- SEMI Shared Memory interface | 70 | * +- SEMI Shared Memory interface |
71 | * +- ISP Image Signal Processor (U335 only) | 71 | * +- ISP Image Signal Processor (U335 only) |
72 | * +- CDS (U335 only) | 72 | * +- CDS (U335 only) |
73 | * +- DMA Direct Memory Access Controller | 73 | * +- DMA Direct Memory Access Controller |
74 | * +- AAIF APP/ACC Inteface (Mobile Scalable Link, MSL) | 74 | * +- AAIF APP/ACC Inteface (Mobile Scalable Link, MSL) |
75 | * +- APEX | 75 | * +- APEX |
76 | * +- VIDEO_ENC AVE2/3 Video Encoder | 76 | * +- VIDEO_ENC AVE2/3 Video Encoder |
77 | * +- XGAM Graphics Accelerator Controller | 77 | * +- XGAM Graphics Accelerator Controller |
78 | * +- AHB | 78 | * +- AHB |
79 | * | | 79 | * | |
80 | * +- ahb:0 AHB Bridge | 80 | * +- ahb:0 AHB Bridge |
81 | * | | | 81 | * | | |
82 | * | +- ahb:1 INTCON Interrupt controller | 82 | * | +- ahb:1 INTCON Interrupt controller |
83 | * | +- ahb:3 MSPRO Memory Stick Pro controller | 83 | * | +- ahb:3 MSPRO Memory Stick Pro controller |
84 | * | +- ahb:4 EMIF External Memory interface | 84 | * | +- ahb:4 EMIF External Memory interface |
85 | * | | 85 | * | |
86 | * +- fast:0 FAST bridge | 86 | * +- fast:0 FAST bridge |
87 | * | | | 87 | * | | |
88 | * | +- fast:1 MMCSD MMC/SD card reader controller | 88 | * | +- fast:1 MMCSD MMC/SD card reader controller |
89 | * | +- fast:2 I2S0 PCM I2S channel 0 controller | 89 | * | +- fast:2 I2S0 PCM I2S channel 0 controller |
90 | * | +- fast:3 I2S1 PCM I2S channel 1 controller | 90 | * | +- fast:3 I2S1 PCM I2S channel 1 controller |
91 | * | +- fast:4 I2C0 I2C channel 0 controller | 91 | * | +- fast:4 I2C0 I2C channel 0 controller |
92 | * | +- fast:5 I2C1 I2C channel 1 controller | 92 | * | +- fast:5 I2C1 I2C channel 1 controller |
93 | * | +- fast:6 SPI SPI controller | 93 | * | +- fast:6 SPI SPI controller |
94 | * | +- fast:7 UART1 Secondary UART (U335 only) | 94 | * | +- fast:7 UART1 Secondary UART (U335 only) |
95 | * | | 95 | * | |
96 | * +- slow:0 SLOW bridge | 96 | * +- slow:0 SLOW bridge |
97 | * | | 97 | * | |
98 | * +- slow:1 SYSCON (not possible to control) | 98 | * +- slow:1 SYSCON (not possible to control) |
99 | * +- slow:2 WDOG Watchdog | 99 | * +- slow:2 WDOG Watchdog |
100 | * +- slow:3 UART0 primary UART | 100 | * +- slow:3 UART0 primary UART |
101 | * +- slow:4 TIMER_APP Application timer - used in Linux | 101 | * +- slow:4 TIMER_APP Application timer - used in Linux |
102 | * +- slow:5 KEYPAD controller | 102 | * +- slow:5 KEYPAD controller |
103 | * +- slow:6 GPIO controller | 103 | * +- slow:6 GPIO controller |
104 | * +- slow:7 RTC controller | 104 | * +- slow:7 RTC controller |
105 | * +- slow:8 BT Bus Tracer (not used currently) | 105 | * +- slow:8 BT Bus Tracer (not used currently) |
106 | * +- slow:9 EH Event Handler (not used currently) | 106 | * +- slow:9 EH Event Handler (not used currently) |
107 | * +- slow:a TIMER_ACC Access style timer (not used currently) | 107 | * +- slow:a TIMER_ACC Access style timer (not used currently) |
108 | * +- slow:b PPM (U335 only, what is that?) | 108 | * +- slow:b PPM (U335 only, what is that?) |
109 | */ | 109 | */ |
110 | 110 | ||
111 | /* | 111 | /* |
112 | * Reset control functions. We remember if a block has been | 112 | * Reset control functions. We remember if a block has been |
113 | * taken out of reset and don't remove the reset assertion again | 113 | * taken out of reset and don't remove the reset assertion again |
114 | * and vice versa. Currently we only remove resets so the | 114 | * and vice versa. Currently we only remove resets so the |
115 | * enablement function is defined out. | 115 | * enablement function is defined out. |
116 | */ | 116 | */ |
117 | static void syscon_block_reset_enable(struct clk *clk) | 117 | static void syscon_block_reset_enable(struct clk *clk) |
118 | { | 118 | { |
119 | u16 val; | 119 | u16 val; |
120 | unsigned long iflags; | 120 | unsigned long iflags; |
121 | 121 | ||
122 | /* Not all blocks support resetting */ | 122 | /* Not all blocks support resetting */ |
123 | if (!clk->res_reg || !clk->res_mask) | 123 | if (!clk->res_reg || !clk->res_mask) |
124 | return; | 124 | return; |
125 | spin_lock_irqsave(&syscon_resetreg_lock, iflags); | 125 | spin_lock_irqsave(&syscon_resetreg_lock, iflags); |
126 | val = readw(clk->res_reg); | 126 | val = readw(clk->res_reg); |
127 | val |= clk->res_mask; | 127 | val |= clk->res_mask; |
128 | writew(val, clk->res_reg); | 128 | writew(val, clk->res_reg); |
129 | spin_unlock_irqrestore(&syscon_resetreg_lock, iflags); | 129 | spin_unlock_irqrestore(&syscon_resetreg_lock, iflags); |
130 | clk->reset = true; | 130 | clk->reset = true; |
131 | } | 131 | } |
132 | 132 | ||
133 | static void syscon_block_reset_disable(struct clk *clk) | 133 | static void syscon_block_reset_disable(struct clk *clk) |
134 | { | 134 | { |
135 | u16 val; | 135 | u16 val; |
136 | unsigned long iflags; | 136 | unsigned long iflags; |
137 | 137 | ||
138 | /* Not all blocks support resetting */ | 138 | /* Not all blocks support resetting */ |
139 | if (!clk->res_reg || !clk->res_mask) | 139 | if (!clk->res_reg || !clk->res_mask) |
140 | return; | 140 | return; |
141 | spin_lock_irqsave(&syscon_resetreg_lock, iflags); | 141 | spin_lock_irqsave(&syscon_resetreg_lock, iflags); |
142 | val = readw(clk->res_reg); | 142 | val = readw(clk->res_reg); |
143 | val &= ~clk->res_mask; | 143 | val &= ~clk->res_mask; |
144 | writew(val, clk->res_reg); | 144 | writew(val, clk->res_reg); |
145 | spin_unlock_irqrestore(&syscon_resetreg_lock, iflags); | 145 | spin_unlock_irqrestore(&syscon_resetreg_lock, iflags); |
146 | clk->reset = false; | 146 | clk->reset = false; |
147 | } | 147 | } |
148 | 148 | ||
149 | int __clk_get(struct clk *clk) | 149 | int __clk_get(struct clk *clk) |
150 | { | 150 | { |
151 | u16 val; | 151 | u16 val; |
152 | 152 | ||
153 | /* The MMC and MSPRO clocks need some special set-up */ | 153 | /* The MMC and MSPRO clocks need some special set-up */ |
154 | if (!strcmp(clk->name, "MCLK")) { | 154 | if (!strcmp(clk->name, "MCLK")) { |
155 | /* Set default MMC clock divisor to 18.9 MHz */ | 155 | /* Set default MMC clock divisor to 18.9 MHz */ |
156 | writew(0x0054U, U300_SYSCON_VBASE + U300_SYSCON_MMF0R); | 156 | writew(0x0054U, U300_SYSCON_VBASE + U300_SYSCON_MMF0R); |
157 | val = readw(U300_SYSCON_VBASE + U300_SYSCON_MMCR); | 157 | val = readw(U300_SYSCON_VBASE + U300_SYSCON_MMCR); |
158 | /* Disable the MMC feedback clock */ | 158 | /* Disable the MMC feedback clock */ |
159 | val &= ~U300_SYSCON_MMCR_MMC_FB_CLK_SEL_ENABLE; | 159 | val &= ~U300_SYSCON_MMCR_MMC_FB_CLK_SEL_ENABLE; |
160 | /* Disable MSPRO frequency */ | 160 | /* Disable MSPRO frequency */ |
161 | val &= ~U300_SYSCON_MMCR_MSPRO_FREQSEL_ENABLE; | 161 | val &= ~U300_SYSCON_MMCR_MSPRO_FREQSEL_ENABLE; |
162 | writew(val, U300_SYSCON_VBASE + U300_SYSCON_MMCR); | 162 | writew(val, U300_SYSCON_VBASE + U300_SYSCON_MMCR); |
163 | } | 163 | } |
164 | if (!strcmp(clk->name, "MSPRO")) { | 164 | if (!strcmp(clk->name, "MSPRO")) { |
165 | val = readw(U300_SYSCON_VBASE + U300_SYSCON_MMCR); | 165 | val = readw(U300_SYSCON_VBASE + U300_SYSCON_MMCR); |
166 | /* Disable the MMC feedback clock */ | 166 | /* Disable the MMC feedback clock */ |
167 | val &= ~U300_SYSCON_MMCR_MMC_FB_CLK_SEL_ENABLE; | 167 | val &= ~U300_SYSCON_MMCR_MMC_FB_CLK_SEL_ENABLE; |
168 | /* Enable MSPRO frequency */ | 168 | /* Enable MSPRO frequency */ |
169 | val |= U300_SYSCON_MMCR_MSPRO_FREQSEL_ENABLE; | 169 | val |= U300_SYSCON_MMCR_MSPRO_FREQSEL_ENABLE; |
170 | writew(val, U300_SYSCON_VBASE + U300_SYSCON_MMCR); | 170 | writew(val, U300_SYSCON_VBASE + U300_SYSCON_MMCR); |
171 | } | 171 | } |
172 | return 1; | 172 | return 1; |
173 | } | 173 | } |
174 | EXPORT_SYMBOL(__clk_get); | 174 | EXPORT_SYMBOL(__clk_get); |
175 | 175 | ||
176 | void __clk_put(struct clk *clk) | 176 | void __clk_put(struct clk *clk) |
177 | { | 177 | { |
178 | } | 178 | } |
179 | EXPORT_SYMBOL(__clk_put); | 179 | EXPORT_SYMBOL(__clk_put); |
180 | 180 | ||
181 | static void syscon_clk_disable(struct clk *clk) | 181 | static void syscon_clk_disable(struct clk *clk) |
182 | { | 182 | { |
183 | unsigned long iflags; | 183 | unsigned long iflags; |
184 | 184 | ||
185 | /* Don't touch the hardware controlled clocks */ | 185 | /* Don't touch the hardware controlled clocks */ |
186 | if (clk->hw_ctrld) | 186 | if (clk->hw_ctrld) |
187 | return; | 187 | return; |
188 | 188 | ||
189 | spin_lock_irqsave(&syscon_clkreg_lock, iflags); | 189 | spin_lock_irqsave(&syscon_clkreg_lock, iflags); |
190 | writew(clk->clk_val, U300_SYSCON_VBASE + U300_SYSCON_SBCDR); | 190 | writew(clk->clk_val, U300_SYSCON_VBASE + U300_SYSCON_SBCDR); |
191 | spin_unlock_irqrestore(&syscon_clkreg_lock, iflags); | 191 | spin_unlock_irqrestore(&syscon_clkreg_lock, iflags); |
192 | } | 192 | } |
193 | 193 | ||
194 | static void syscon_clk_enable(struct clk *clk) | 194 | static void syscon_clk_enable(struct clk *clk) |
195 | { | 195 | { |
196 | unsigned long iflags; | 196 | unsigned long iflags; |
197 | 197 | ||
198 | /* Don't touch the hardware controlled clocks */ | 198 | /* Don't touch the hardware controlled clocks */ |
199 | if (clk->hw_ctrld) | 199 | if (clk->hw_ctrld) |
200 | return; | 200 | return; |
201 | 201 | ||
202 | spin_lock_irqsave(&syscon_clkreg_lock, iflags); | 202 | spin_lock_irqsave(&syscon_clkreg_lock, iflags); |
203 | writew(clk->clk_val, U300_SYSCON_VBASE + U300_SYSCON_SBCER); | 203 | writew(clk->clk_val, U300_SYSCON_VBASE + U300_SYSCON_SBCER); |
204 | spin_unlock_irqrestore(&syscon_clkreg_lock, iflags); | 204 | spin_unlock_irqrestore(&syscon_clkreg_lock, iflags); |
205 | } | 205 | } |
206 | 206 | ||
207 | static u16 syscon_clk_get_rate(void) | 207 | static u16 syscon_clk_get_rate(void) |
208 | { | 208 | { |
209 | u16 val; | 209 | u16 val; |
210 | unsigned long iflags; | 210 | unsigned long iflags; |
211 | 211 | ||
212 | spin_lock_irqsave(&syscon_clkreg_lock, iflags); | 212 | spin_lock_irqsave(&syscon_clkreg_lock, iflags); |
213 | val = readw(U300_SYSCON_VBASE + U300_SYSCON_CCR); | 213 | val = readw(U300_SYSCON_VBASE + U300_SYSCON_CCR); |
214 | val &= U300_SYSCON_CCR_CLKING_PERFORMANCE_MASK; | 214 | val &= U300_SYSCON_CCR_CLKING_PERFORMANCE_MASK; |
215 | spin_unlock_irqrestore(&syscon_clkreg_lock, iflags); | 215 | spin_unlock_irqrestore(&syscon_clkreg_lock, iflags); |
216 | return val; | 216 | return val; |
217 | } | 217 | } |
218 | 218 | ||
219 | #ifdef CONFIG_MACH_U300_USE_I2S_AS_MASTER | 219 | #ifdef CONFIG_MACH_U300_USE_I2S_AS_MASTER |
220 | static void enable_i2s0_vcxo(void) | 220 | static void enable_i2s0_vcxo(void) |
221 | { | 221 | { |
222 | u16 val; | 222 | u16 val; |
223 | unsigned long iflags; | 223 | unsigned long iflags; |
224 | 224 | ||
225 | spin_lock_irqsave(&syscon_clkreg_lock, iflags); | 225 | spin_lock_irqsave(&syscon_clkreg_lock, iflags); |
226 | /* Set I2S0 to use the VCXO 26 MHz clock */ | 226 | /* Set I2S0 to use the VCXO 26 MHz clock */ |
227 | val = readw(U300_SYSCON_VBASE + U300_SYSCON_CCR); | 227 | val = readw(U300_SYSCON_VBASE + U300_SYSCON_CCR); |
228 | val |= U300_SYSCON_CCR_TURN_VCXO_ON; | 228 | val |= U300_SYSCON_CCR_TURN_VCXO_ON; |
229 | writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR); | 229 | writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR); |
230 | val |= U300_SYSCON_CCR_I2S0_USE_VCXO; | 230 | val |= U300_SYSCON_CCR_I2S0_USE_VCXO; |
231 | writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR); | 231 | writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR); |
232 | val = readw(U300_SYSCON_VBASE + U300_SYSCON_CEFR); | 232 | val = readw(U300_SYSCON_VBASE + U300_SYSCON_CEFR); |
233 | val |= U300_SYSCON_CEFR_I2S0_CLK_EN; | 233 | val |= U300_SYSCON_CEFR_I2S0_CLK_EN; |
234 | writew(val, U300_SYSCON_VBASE + U300_SYSCON_CEFR); | 234 | writew(val, U300_SYSCON_VBASE + U300_SYSCON_CEFR); |
235 | spin_unlock_irqrestore(&syscon_clkreg_lock, iflags); | 235 | spin_unlock_irqrestore(&syscon_clkreg_lock, iflags); |
236 | } | 236 | } |
237 | 237 | ||
238 | static void enable_i2s1_vcxo(void) | 238 | static void enable_i2s1_vcxo(void) |
239 | { | 239 | { |
240 | u16 val; | 240 | u16 val; |
241 | unsigned long iflags; | 241 | unsigned long iflags; |
242 | 242 | ||
243 | spin_lock_irqsave(&syscon_clkreg_lock, iflags); | 243 | spin_lock_irqsave(&syscon_clkreg_lock, iflags); |
244 | /* Set I2S1 to use the VCXO 26 MHz clock */ | 244 | /* Set I2S1 to use the VCXO 26 MHz clock */ |
245 | val = readw(U300_SYSCON_VBASE + U300_SYSCON_CCR); | 245 | val = readw(U300_SYSCON_VBASE + U300_SYSCON_CCR); |
246 | val |= U300_SYSCON_CCR_TURN_VCXO_ON; | 246 | val |= U300_SYSCON_CCR_TURN_VCXO_ON; |
247 | writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR); | 247 | writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR); |
248 | val |= U300_SYSCON_CCR_I2S1_USE_VCXO; | 248 | val |= U300_SYSCON_CCR_I2S1_USE_VCXO; |
249 | writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR); | 249 | writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR); |
250 | val = readw(U300_SYSCON_VBASE + U300_SYSCON_CEFR); | 250 | val = readw(U300_SYSCON_VBASE + U300_SYSCON_CEFR); |
251 | val |= U300_SYSCON_CEFR_I2S1_CLK_EN; | 251 | val |= U300_SYSCON_CEFR_I2S1_CLK_EN; |
252 | writew(val, U300_SYSCON_VBASE + U300_SYSCON_CEFR); | 252 | writew(val, U300_SYSCON_VBASE + U300_SYSCON_CEFR); |
253 | spin_unlock_irqrestore(&syscon_clkreg_lock, iflags); | 253 | spin_unlock_irqrestore(&syscon_clkreg_lock, iflags); |
254 | } | 254 | } |
255 | 255 | ||
256 | static void disable_i2s0_vcxo(void) | 256 | static void disable_i2s0_vcxo(void) |
257 | { | 257 | { |
258 | u16 val; | 258 | u16 val; |
259 | unsigned long iflags; | 259 | unsigned long iflags; |
260 | 260 | ||
261 | spin_lock_irqsave(&syscon_clkreg_lock, iflags); | 261 | spin_lock_irqsave(&syscon_clkreg_lock, iflags); |
262 | /* Disable I2S0 use of the VCXO 26 MHz clock */ | 262 | /* Disable I2S0 use of the VCXO 26 MHz clock */ |
263 | val = readw(U300_SYSCON_VBASE + U300_SYSCON_CCR); | 263 | val = readw(U300_SYSCON_VBASE + U300_SYSCON_CCR); |
264 | val &= ~U300_SYSCON_CCR_I2S0_USE_VCXO; | 264 | val &= ~U300_SYSCON_CCR_I2S0_USE_VCXO; |
265 | writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR); | 265 | writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR); |
266 | /* Deactivate VCXO if noone else is using VCXO */ | 266 | /* Deactivate VCXO if noone else is using VCXO */ |
267 | if (!(val & U300_SYSCON_CCR_I2S1_USE_VCXO)) | 267 | if (!(val & U300_SYSCON_CCR_I2S1_USE_VCXO)) |
268 | val &= ~U300_SYSCON_CCR_TURN_VCXO_ON; | 268 | val &= ~U300_SYSCON_CCR_TURN_VCXO_ON; |
269 | writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR); | 269 | writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR); |
270 | val = readw(U300_SYSCON_VBASE + U300_SYSCON_CEFR); | 270 | val = readw(U300_SYSCON_VBASE + U300_SYSCON_CEFR); |
271 | val &= ~U300_SYSCON_CEFR_I2S0_CLK_EN; | 271 | val &= ~U300_SYSCON_CEFR_I2S0_CLK_EN; |
272 | writew(val, U300_SYSCON_VBASE + U300_SYSCON_CEFR); | 272 | writew(val, U300_SYSCON_VBASE + U300_SYSCON_CEFR); |
273 | spin_unlock_irqrestore(&syscon_clkreg_lock, iflags); | 273 | spin_unlock_irqrestore(&syscon_clkreg_lock, iflags); |
274 | } | 274 | } |
275 | 275 | ||
276 | static void disable_i2s1_vcxo(void) | 276 | static void disable_i2s1_vcxo(void) |
277 | { | 277 | { |
278 | u16 val; | 278 | u16 val; |
279 | unsigned long iflags; | 279 | unsigned long iflags; |
280 | 280 | ||
281 | spin_lock_irqsave(&syscon_clkreg_lock, iflags); | 281 | spin_lock_irqsave(&syscon_clkreg_lock, iflags); |
282 | /* Disable I2S1 use of the VCXO 26 MHz clock */ | 282 | /* Disable I2S1 use of the VCXO 26 MHz clock */ |
283 | val = readw(U300_SYSCON_VBASE + U300_SYSCON_CCR); | 283 | val = readw(U300_SYSCON_VBASE + U300_SYSCON_CCR); |
284 | val &= ~U300_SYSCON_CCR_I2S1_USE_VCXO; | 284 | val &= ~U300_SYSCON_CCR_I2S1_USE_VCXO; |
285 | writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR); | 285 | writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR); |
286 | /* Deactivate VCXO if noone else is using VCXO */ | 286 | /* Deactivate VCXO if noone else is using VCXO */ |
287 | if (!(val & U300_SYSCON_CCR_I2S0_USE_VCXO)) | 287 | if (!(val & U300_SYSCON_CCR_I2S0_USE_VCXO)) |
288 | val &= ~U300_SYSCON_CCR_TURN_VCXO_ON; | 288 | val &= ~U300_SYSCON_CCR_TURN_VCXO_ON; |
289 | writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR); | 289 | writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR); |
290 | val = readw(U300_SYSCON_VBASE + U300_SYSCON_CEFR); | 290 | val = readw(U300_SYSCON_VBASE + U300_SYSCON_CEFR); |
291 | val &= ~U300_SYSCON_CEFR_I2S0_CLK_EN; | 291 | val &= ~U300_SYSCON_CEFR_I2S0_CLK_EN; |
292 | writew(val, U300_SYSCON_VBASE + U300_SYSCON_CEFR); | 292 | writew(val, U300_SYSCON_VBASE + U300_SYSCON_CEFR); |
293 | spin_unlock_irqrestore(&syscon_clkreg_lock, iflags); | 293 | spin_unlock_irqrestore(&syscon_clkreg_lock, iflags); |
294 | } | 294 | } |
295 | #endif /* CONFIG_MACH_U300_USE_I2S_AS_MASTER */ | 295 | #endif /* CONFIG_MACH_U300_USE_I2S_AS_MASTER */ |
296 | 296 | ||
297 | 297 | ||
298 | static void syscon_clk_rate_set_mclk(unsigned long rate) | 298 | static void syscon_clk_rate_set_mclk(unsigned long rate) |
299 | { | 299 | { |
300 | u16 val; | 300 | u16 val; |
301 | u32 reg; | 301 | u32 reg; |
302 | unsigned long iflags; | 302 | unsigned long iflags; |
303 | 303 | ||
304 | switch (rate) { | 304 | switch (rate) { |
305 | case 18900000: | 305 | case 18900000: |
306 | val = 0x0054; | 306 | val = 0x0054; |
307 | break; | 307 | break; |
308 | case 20800000: | 308 | case 20800000: |
309 | val = 0x0044; | 309 | val = 0x0044; |
310 | break; | 310 | break; |
311 | case 23100000: | 311 | case 23100000: |
312 | val = 0x0043; | 312 | val = 0x0043; |
313 | break; | 313 | break; |
314 | case 26000000: | 314 | case 26000000: |
315 | val = 0x0033; | 315 | val = 0x0033; |
316 | break; | 316 | break; |
317 | case 29700000: | 317 | case 29700000: |
318 | val = 0x0032; | 318 | val = 0x0032; |
319 | break; | 319 | break; |
320 | case 34700000: | 320 | case 34700000: |
321 | val = 0x0022; | 321 | val = 0x0022; |
322 | break; | 322 | break; |
323 | case 41600000: | 323 | case 41600000: |
324 | val = 0x0021; | 324 | val = 0x0021; |
325 | break; | 325 | break; |
326 | case 52000000: | 326 | case 52000000: |
327 | val = 0x0011; | 327 | val = 0x0011; |
328 | break; | 328 | break; |
329 | case 104000000: | 329 | case 104000000: |
330 | val = 0x0000; | 330 | val = 0x0000; |
331 | break; | 331 | break; |
332 | default: | 332 | default: |
333 | printk(KERN_ERR "Trying to set MCLK to unknown speed! %ld\n", | 333 | printk(KERN_ERR "Trying to set MCLK to unknown speed! %ld\n", |
334 | rate); | 334 | rate); |
335 | return; | 335 | return; |
336 | } | 336 | } |
337 | 337 | ||
338 | spin_lock_irqsave(&syscon_clkreg_lock, iflags); | 338 | spin_lock_irqsave(&syscon_clkreg_lock, iflags); |
339 | reg = readw(U300_SYSCON_VBASE + U300_SYSCON_MMF0R) & | 339 | reg = readw(U300_SYSCON_VBASE + U300_SYSCON_MMF0R) & |
340 | ~U300_SYSCON_MMF0R_MASK; | 340 | ~U300_SYSCON_MMF0R_MASK; |
341 | writew(reg | val, U300_SYSCON_VBASE + U300_SYSCON_MMF0R); | 341 | writew(reg | val, U300_SYSCON_VBASE + U300_SYSCON_MMF0R); |
342 | spin_unlock_irqrestore(&syscon_clkreg_lock, iflags); | 342 | spin_unlock_irqrestore(&syscon_clkreg_lock, iflags); |
343 | } | 343 | } |
344 | 344 | ||
345 | void syscon_clk_rate_set_cpuclk(unsigned long rate) | 345 | void syscon_clk_rate_set_cpuclk(unsigned long rate) |
346 | { | 346 | { |
347 | u16 val; | 347 | u16 val; |
348 | unsigned long iflags; | 348 | unsigned long iflags; |
349 | 349 | ||
350 | switch (rate) { | 350 | switch (rate) { |
351 | case 13000000: | 351 | case 13000000: |
352 | val = U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER; | 352 | val = U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER; |
353 | break; | 353 | break; |
354 | case 52000000: | 354 | case 52000000: |
355 | val = U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE; | 355 | val = U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE; |
356 | break; | 356 | break; |
357 | case 104000000: | 357 | case 104000000: |
358 | val = U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH; | 358 | val = U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH; |
359 | break; | 359 | break; |
360 | case 208000000: | 360 | case 208000000: |
361 | val = U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST; | 361 | val = U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST; |
362 | break; | 362 | break; |
363 | default: | 363 | default: |
364 | return; | 364 | return; |
365 | } | 365 | } |
366 | spin_lock_irqsave(&syscon_clkreg_lock, iflags); | 366 | spin_lock_irqsave(&syscon_clkreg_lock, iflags); |
367 | val |= readw(U300_SYSCON_VBASE + U300_SYSCON_CCR) & | 367 | val |= readw(U300_SYSCON_VBASE + U300_SYSCON_CCR) & |
368 | ~U300_SYSCON_CCR_CLKING_PERFORMANCE_MASK ; | 368 | ~U300_SYSCON_CCR_CLKING_PERFORMANCE_MASK ; |
369 | writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR); | 369 | writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR); |
370 | spin_unlock_irqrestore(&syscon_clkreg_lock, iflags); | 370 | spin_unlock_irqrestore(&syscon_clkreg_lock, iflags); |
371 | } | 371 | } |
372 | EXPORT_SYMBOL(syscon_clk_rate_set_cpuclk); | 372 | EXPORT_SYMBOL(syscon_clk_rate_set_cpuclk); |
373 | 373 | ||
374 | void clk_disable(struct clk *clk) | 374 | void clk_disable(struct clk *clk) |
375 | { | 375 | { |
376 | unsigned long iflags; | 376 | unsigned long iflags; |
377 | 377 | ||
378 | spin_lock_irqsave(&clk->lock, iflags); | 378 | spin_lock_irqsave(&clk->lock, iflags); |
379 | if (clk->usecount > 0 && !(--clk->usecount)) { | 379 | if (clk->usecount > 0 && !(--clk->usecount)) { |
380 | /* some blocks lack clocking registers and cannot be disabled */ | 380 | /* some blocks lack clocking registers and cannot be disabled */ |
381 | if (clk->disable) | 381 | if (clk->disable) |
382 | clk->disable(clk); | 382 | clk->disable(clk); |
383 | if (likely((u32)clk->parent)) | 383 | if (likely((u32)clk->parent)) |
384 | clk_disable(clk->parent); | 384 | clk_disable(clk->parent); |
385 | } | 385 | } |
386 | #ifdef CONFIG_MACH_U300_USE_I2S_AS_MASTER | 386 | #ifdef CONFIG_MACH_U300_USE_I2S_AS_MASTER |
387 | if (unlikely(!strcmp(clk->name, "I2S0"))) | 387 | if (unlikely(!strcmp(clk->name, "I2S0"))) |
388 | disable_i2s0_vcxo(); | 388 | disable_i2s0_vcxo(); |
389 | if (unlikely(!strcmp(clk->name, "I2S1"))) | 389 | if (unlikely(!strcmp(clk->name, "I2S1"))) |
390 | disable_i2s1_vcxo(); | 390 | disable_i2s1_vcxo(); |
391 | #endif | 391 | #endif |
392 | spin_unlock_irqrestore(&clk->lock, iflags); | 392 | spin_unlock_irqrestore(&clk->lock, iflags); |
393 | } | 393 | } |
394 | EXPORT_SYMBOL(clk_disable); | 394 | EXPORT_SYMBOL(clk_disable); |
395 | 395 | ||
396 | int clk_enable(struct clk *clk) | 396 | int clk_enable(struct clk *clk) |
397 | { | 397 | { |
398 | int ret = 0; | 398 | int ret = 0; |
399 | unsigned long iflags; | 399 | unsigned long iflags; |
400 | 400 | ||
401 | spin_lock_irqsave(&clk->lock, iflags); | 401 | spin_lock_irqsave(&clk->lock, iflags); |
402 | if (clk->usecount++ == 0) { | 402 | if (clk->usecount++ == 0) { |
403 | if (likely((u32)clk->parent)) | 403 | if (likely((u32)clk->parent)) |
404 | ret = clk_enable(clk->parent); | 404 | ret = clk_enable(clk->parent); |
405 | 405 | ||
406 | if (unlikely(ret != 0)) | 406 | if (unlikely(ret != 0)) |
407 | clk->usecount--; | 407 | clk->usecount--; |
408 | else { | 408 | else { |
409 | /* remove reset line (we never enable reset again) */ | 409 | /* remove reset line (we never enable reset again) */ |
410 | syscon_block_reset_disable(clk); | 410 | syscon_block_reset_disable(clk); |
411 | /* clocks without enable function are always on */ | 411 | /* clocks without enable function are always on */ |
412 | if (clk->enable) | 412 | if (clk->enable) |
413 | clk->enable(clk); | 413 | clk->enable(clk); |
414 | #ifdef CONFIG_MACH_U300_USE_I2S_AS_MASTER | 414 | #ifdef CONFIG_MACH_U300_USE_I2S_AS_MASTER |
415 | if (unlikely(!strcmp(clk->name, "I2S0"))) | 415 | if (unlikely(!strcmp(clk->name, "I2S0"))) |
416 | enable_i2s0_vcxo(); | 416 | enable_i2s0_vcxo(); |
417 | if (unlikely(!strcmp(clk->name, "I2S1"))) | 417 | if (unlikely(!strcmp(clk->name, "I2S1"))) |
418 | enable_i2s1_vcxo(); | 418 | enable_i2s1_vcxo(); |
419 | #endif | 419 | #endif |
420 | } | 420 | } |
421 | } | 421 | } |
422 | spin_unlock_irqrestore(&clk->lock, iflags); | 422 | spin_unlock_irqrestore(&clk->lock, iflags); |
423 | return ret; | 423 | return ret; |
424 | 424 | ||
425 | } | 425 | } |
426 | EXPORT_SYMBOL(clk_enable); | 426 | EXPORT_SYMBOL(clk_enable); |
427 | 427 | ||
428 | /* Returns the clock rate in Hz */ | 428 | /* Returns the clock rate in Hz */ |
429 | static unsigned long clk_get_rate_cpuclk(struct clk *clk) | 429 | static unsigned long clk_get_rate_cpuclk(struct clk *clk) |
430 | { | 430 | { |
431 | u16 val; | 431 | u16 val; |
432 | 432 | ||
433 | val = syscon_clk_get_rate(); | 433 | val = syscon_clk_get_rate(); |
434 | 434 | ||
435 | switch (val) { | 435 | switch (val) { |
436 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER: | 436 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER: |
437 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW: | 437 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW: |
438 | return 13000000; | 438 | return 13000000; |
439 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE: | 439 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE: |
440 | return 52000000; | 440 | return 52000000; |
441 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH: | 441 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH: |
442 | return 104000000; | 442 | return 104000000; |
443 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST: | 443 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST: |
444 | return 208000000; | 444 | return 208000000; |
445 | default: | 445 | default: |
446 | break; | 446 | break; |
447 | } | 447 | } |
448 | return clk->rate; | 448 | return clk->rate; |
449 | } | 449 | } |
450 | 450 | ||
451 | static unsigned long clk_get_rate_ahb_clk(struct clk *clk) | 451 | static unsigned long clk_get_rate_ahb_clk(struct clk *clk) |
452 | { | 452 | { |
453 | u16 val; | 453 | u16 val; |
454 | 454 | ||
455 | val = syscon_clk_get_rate(); | 455 | val = syscon_clk_get_rate(); |
456 | 456 | ||
457 | switch (val) { | 457 | switch (val) { |
458 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER: | 458 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER: |
459 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW: | 459 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW: |
460 | return 6500000; | 460 | return 6500000; |
461 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE: | 461 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE: |
462 | return 26000000; | 462 | return 26000000; |
463 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH: | 463 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH: |
464 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST: | 464 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST: |
465 | return 52000000; | 465 | return 52000000; |
466 | default: | 466 | default: |
467 | break; | 467 | break; |
468 | } | 468 | } |
469 | return clk->rate; | 469 | return clk->rate; |
470 | 470 | ||
471 | } | 471 | } |
472 | 472 | ||
473 | static unsigned long clk_get_rate_emif_clk(struct clk *clk) | 473 | static unsigned long clk_get_rate_emif_clk(struct clk *clk) |
474 | { | 474 | { |
475 | u16 val; | 475 | u16 val; |
476 | 476 | ||
477 | val = syscon_clk_get_rate(); | 477 | val = syscon_clk_get_rate(); |
478 | 478 | ||
479 | switch (val) { | 479 | switch (val) { |
480 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER: | 480 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER: |
481 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW: | 481 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW: |
482 | return 13000000; | 482 | return 13000000; |
483 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE: | 483 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE: |
484 | return 52000000; | 484 | return 52000000; |
485 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH: | 485 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH: |
486 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST: | 486 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST: |
487 | return 104000000; | 487 | return 104000000; |
488 | default: | 488 | default: |
489 | break; | 489 | break; |
490 | } | 490 | } |
491 | return clk->rate; | 491 | return clk->rate; |
492 | 492 | ||
493 | } | 493 | } |
494 | 494 | ||
495 | static unsigned long clk_get_rate_xgamclk(struct clk *clk) | 495 | static unsigned long clk_get_rate_xgamclk(struct clk *clk) |
496 | { | 496 | { |
497 | u16 val; | 497 | u16 val; |
498 | 498 | ||
499 | val = syscon_clk_get_rate(); | 499 | val = syscon_clk_get_rate(); |
500 | 500 | ||
501 | switch (val) { | 501 | switch (val) { |
502 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER: | 502 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER: |
503 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW: | 503 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW: |
504 | return 6500000; | 504 | return 6500000; |
505 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE: | 505 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE: |
506 | return 26000000; | 506 | return 26000000; |
507 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH: | 507 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH: |
508 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST: | 508 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST: |
509 | return 52000000; | 509 | return 52000000; |
510 | default: | 510 | default: |
511 | break; | 511 | break; |
512 | } | 512 | } |
513 | 513 | ||
514 | return clk->rate; | 514 | return clk->rate; |
515 | } | 515 | } |
516 | 516 | ||
517 | static unsigned long clk_get_rate_mclk(struct clk *clk) | 517 | static unsigned long clk_get_rate_mclk(struct clk *clk) |
518 | { | 518 | { |
519 | u16 val; | 519 | u16 val; |
520 | 520 | ||
521 | val = syscon_clk_get_rate(); | 521 | val = syscon_clk_get_rate(); |
522 | 522 | ||
523 | switch (val) { | 523 | switch (val) { |
524 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER: | 524 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER: |
525 | /* | 525 | /* |
526 | * Here, the 208 MHz PLL gets shut down and the always | 526 | * Here, the 208 MHz PLL gets shut down and the always |
527 | * on 13 MHz PLL used for RTC etc kicks into use | 527 | * on 13 MHz PLL used for RTC etc kicks into use |
528 | * instead. | 528 | * instead. |
529 | */ | 529 | */ |
530 | return 13000000; | 530 | return 13000000; |
531 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW: | 531 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW: |
532 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE: | 532 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE: |
533 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH: | 533 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH: |
534 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST: | 534 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST: |
535 | { | 535 | { |
536 | /* | 536 | /* |
537 | * This clock is under program control. The register is | 537 | * This clock is under program control. The register is |
538 | * divided in two nybbles, bit 7-4 gives cycles-1 to count | 538 | * divided in two nybbles, bit 7-4 gives cycles-1 to count |
539 | * high, bit 3-0 gives cycles-1 to count low. Distribute | 539 | * high, bit 3-0 gives cycles-1 to count low. Distribute |
540 | * these with no more than 1 cycle difference between | 540 | * these with no more than 1 cycle difference between |
541 | * low and high and add low and high to get the actual | 541 | * low and high and add low and high to get the actual |
542 | * divisor. The base PLL is 208 MHz. Writing 0x00 will | 542 | * divisor. The base PLL is 208 MHz. Writing 0x00 will |
543 | * divide by 1 and 1 so the highest frequency possible | 543 | * divide by 1 and 1 so the highest frequency possible |
544 | * is 104 MHz. | 544 | * is 104 MHz. |
545 | * | 545 | * |
546 | * e.g. 0x54 => | 546 | * e.g. 0x54 => |
547 | * f = 208 / ((5+1) + (4+1)) = 208 / 11 = 18.9 MHz | 547 | * f = 208 / ((5+1) + (4+1)) = 208 / 11 = 18.9 MHz |
548 | */ | 548 | */ |
549 | u16 val = readw(U300_SYSCON_VBASE + U300_SYSCON_MMF0R) & | 549 | u16 val = readw(U300_SYSCON_VBASE + U300_SYSCON_MMF0R) & |
550 | U300_SYSCON_MMF0R_MASK; | 550 | U300_SYSCON_MMF0R_MASK; |
551 | switch (val) { | 551 | switch (val) { |
552 | case 0x0054: | 552 | case 0x0054: |
553 | return 18900000; | 553 | return 18900000; |
554 | case 0x0044: | 554 | case 0x0044: |
555 | return 20800000; | 555 | return 20800000; |
556 | case 0x0043: | 556 | case 0x0043: |
557 | return 23100000; | 557 | return 23100000; |
558 | case 0x0033: | 558 | case 0x0033: |
559 | return 26000000; | 559 | return 26000000; |
560 | case 0x0032: | 560 | case 0x0032: |
561 | return 29700000; | 561 | return 29700000; |
562 | case 0x0022: | 562 | case 0x0022: |
563 | return 34700000; | 563 | return 34700000; |
564 | case 0x0021: | 564 | case 0x0021: |
565 | return 41600000; | 565 | return 41600000; |
566 | case 0x0011: | 566 | case 0x0011: |
567 | return 52000000; | 567 | return 52000000; |
568 | case 0x0000: | 568 | case 0x0000: |
569 | return 104000000; | 569 | return 104000000; |
570 | default: | 570 | default: |
571 | break; | 571 | break; |
572 | } | 572 | } |
573 | } | 573 | } |
574 | default: | 574 | default: |
575 | break; | 575 | break; |
576 | } | 576 | } |
577 | 577 | ||
578 | return clk->rate; | 578 | return clk->rate; |
579 | } | 579 | } |
580 | 580 | ||
581 | static unsigned long clk_get_rate_i2s_i2c_spi(struct clk *clk) | 581 | static unsigned long clk_get_rate_i2s_i2c_spi(struct clk *clk) |
582 | { | 582 | { |
583 | u16 val; | 583 | u16 val; |
584 | 584 | ||
585 | val = syscon_clk_get_rate(); | 585 | val = syscon_clk_get_rate(); |
586 | 586 | ||
587 | switch (val) { | 587 | switch (val) { |
588 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER: | 588 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER: |
589 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW: | 589 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW: |
590 | return 13000000; | 590 | return 13000000; |
591 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE: | 591 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE: |
592 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH: | 592 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH: |
593 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST: | 593 | case U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST: |
594 | return 26000000; | 594 | return 26000000; |
595 | default: | 595 | default: |
596 | break; | 596 | break; |
597 | } | 597 | } |
598 | 598 | ||
599 | return clk->rate; | 599 | return clk->rate; |
600 | } | 600 | } |
601 | 601 | ||
602 | unsigned long clk_get_rate(struct clk *clk) | 602 | unsigned long clk_get_rate(struct clk *clk) |
603 | { | 603 | { |
604 | if (clk->get_rate) | 604 | if (clk->get_rate) |
605 | return clk->get_rate(clk); | 605 | return clk->get_rate(clk); |
606 | else | 606 | else |
607 | return clk->rate; | 607 | return clk->rate; |
608 | } | 608 | } |
609 | EXPORT_SYMBOL(clk_get_rate); | 609 | EXPORT_SYMBOL(clk_get_rate); |
610 | 610 | ||
611 | static unsigned long clk_round_rate_mclk(struct clk *clk, unsigned long rate) | 611 | static unsigned long clk_round_rate_mclk(struct clk *clk, unsigned long rate) |
612 | { | 612 | { |
613 | if (rate <= 18900000) | 613 | if (rate <= 18900000) |
614 | return 18900000; | 614 | return 18900000; |
615 | if (rate <= 20800000) | 615 | if (rate <= 20800000) |
616 | return 20800000; | 616 | return 20800000; |
617 | if (rate <= 23100000) | 617 | if (rate <= 23100000) |
618 | return 23100000; | 618 | return 23100000; |
619 | if (rate <= 26000000) | 619 | if (rate <= 26000000) |
620 | return 26000000; | 620 | return 26000000; |
621 | if (rate <= 29700000) | 621 | if (rate <= 29700000) |
622 | return 29700000; | 622 | return 29700000; |
623 | if (rate <= 34700000) | 623 | if (rate <= 34700000) |
624 | return 34700000; | 624 | return 34700000; |
625 | if (rate <= 41600000) | 625 | if (rate <= 41600000) |
626 | return 41600000; | 626 | return 41600000; |
627 | if (rate <= 52000000) | 627 | if (rate <= 52000000) |
628 | return 52000000; | 628 | return 52000000; |
629 | return -EINVAL; | 629 | return -EINVAL; |
630 | } | 630 | } |
631 | 631 | ||
632 | static unsigned long clk_round_rate_cpuclk(struct clk *clk, unsigned long rate) | 632 | static unsigned long clk_round_rate_cpuclk(struct clk *clk, unsigned long rate) |
633 | { | 633 | { |
634 | if (rate <= 13000000) | 634 | if (rate <= 13000000) |
635 | return 13000000; | 635 | return 13000000; |
636 | if (rate <= 52000000) | 636 | if (rate <= 52000000) |
637 | return 52000000; | 637 | return 52000000; |
638 | if (rate <= 104000000) | 638 | if (rate <= 104000000) |
639 | return 104000000; | 639 | return 104000000; |
640 | if (rate <= 208000000) | 640 | if (rate <= 208000000) |
641 | return 208000000; | 641 | return 208000000; |
642 | return -EINVAL; | 642 | return -EINVAL; |
643 | } | 643 | } |
644 | 644 | ||
645 | /* | 645 | /* |
646 | * This adjusts a requested rate to the closest exact rate | 646 | * This adjusts a requested rate to the closest exact rate |
647 | * a certain clock can provide. For a fixed clock it's | 647 | * a certain clock can provide. For a fixed clock it's |
648 | * mostly clk->rate. | 648 | * mostly clk->rate. |
649 | */ | 649 | */ |
650 | long clk_round_rate(struct clk *clk, unsigned long rate) | 650 | long clk_round_rate(struct clk *clk, unsigned long rate) |
651 | { | 651 | { |
652 | /* TODO: get apropriate switches for EMIFCLK, AHBCLK and MCLK */ | 652 | /* TODO: get apropriate switches for EMIFCLK, AHBCLK and MCLK */ |
653 | /* Else default to fixed value */ | 653 | /* Else default to fixed value */ |
654 | 654 | ||
655 | if (clk->round_rate) { | 655 | if (clk->round_rate) { |
656 | return (long) clk->round_rate(clk, rate); | 656 | return (long) clk->round_rate(clk, rate); |
657 | } else { | 657 | } else { |
658 | printk(KERN_ERR "clock: Failed to round rate of %s\n", | 658 | printk(KERN_ERR "clock: Failed to round rate of %s\n", |
659 | clk->name); | 659 | clk->name); |
660 | } | 660 | } |
661 | return (long) clk->rate; | 661 | return (long) clk->rate; |
662 | } | 662 | } |
663 | EXPORT_SYMBOL(clk_round_rate); | 663 | EXPORT_SYMBOL(clk_round_rate); |
664 | 664 | ||
665 | static int clk_set_rate_mclk(struct clk *clk, unsigned long rate) | 665 | static int clk_set_rate_mclk(struct clk *clk, unsigned long rate) |
666 | { | 666 | { |
667 | syscon_clk_rate_set_mclk(clk_round_rate(clk, rate)); | 667 | syscon_clk_rate_set_mclk(clk_round_rate(clk, rate)); |
668 | return 0; | 668 | return 0; |
669 | } | 669 | } |
670 | 670 | ||
671 | static int clk_set_rate_cpuclk(struct clk *clk, unsigned long rate) | 671 | static int clk_set_rate_cpuclk(struct clk *clk, unsigned long rate) |
672 | { | 672 | { |
673 | syscon_clk_rate_set_cpuclk(clk_round_rate(clk, rate)); | 673 | syscon_clk_rate_set_cpuclk(clk_round_rate(clk, rate)); |
674 | return 0; | 674 | return 0; |
675 | } | 675 | } |
676 | 676 | ||
677 | int clk_set_rate(struct clk *clk, unsigned long rate) | 677 | int clk_set_rate(struct clk *clk, unsigned long rate) |
678 | { | 678 | { |
679 | /* TODO: set for EMIFCLK and AHBCLK */ | 679 | /* TODO: set for EMIFCLK and AHBCLK */ |
680 | /* Else assume the clock is fixed and fail */ | 680 | /* Else assume the clock is fixed and fail */ |
681 | if (clk->set_rate) { | 681 | if (clk->set_rate) { |
682 | return clk->set_rate(clk, rate); | 682 | return clk->set_rate(clk, rate); |
683 | } else { | 683 | } else { |
684 | printk(KERN_ERR "clock: Failed to set %s to %ld hz\n", | 684 | printk(KERN_ERR "clock: Failed to set %s to %ld hz\n", |
685 | clk->name, rate); | 685 | clk->name, rate); |
686 | return -EINVAL; | 686 | return -EINVAL; |
687 | } | 687 | } |
688 | } | 688 | } |
689 | EXPORT_SYMBOL(clk_set_rate); | 689 | EXPORT_SYMBOL(clk_set_rate); |
690 | 690 | ||
691 | /* | 691 | /* |
692 | * Clock definitions. The clock parents are set to respective | 692 | * Clock definitions. The clock parents are set to respective |
693 | * bridge and the clock framework makes sure that the clocks have | 693 | * bridge and the clock framework makes sure that the clocks have |
694 | * parents activated and are brought out of reset when in use. | 694 | * parents activated and are brought out of reset when in use. |
695 | * | 695 | * |
696 | * Clocks that have hw_ctrld = true are hw controlled, and the hw | 696 | * Clocks that have hw_ctrld = true are hw controlled, and the hw |
697 | * can by itself turn these clocks on and off. | 697 | * can by itself turn these clocks on and off. |
698 | * So in other words, we don't really have to care about them. | 698 | * So in other words, we don't really have to care about them. |
699 | */ | 699 | */ |
700 | 700 | ||
701 | static struct clk amba_clk = { | 701 | static struct clk amba_clk = { |
702 | .name = "AMBA", | 702 | .name = "AMBA", |
703 | .rate = 52000000, /* this varies! */ | 703 | .rate = 52000000, /* this varies! */ |
704 | .hw_ctrld = true, | 704 | .hw_ctrld = true, |
705 | .reset = false, | 705 | .reset = false, |
706 | .lock = __SPIN_LOCK_UNLOCKED(amba_clk.lock), | 706 | .lock = __SPIN_LOCK_UNLOCKED(amba_clk.lock), |
707 | }; | 707 | }; |
708 | 708 | ||
709 | /* | 709 | /* |
710 | * These blocks are connected directly to the AMBA bus | 710 | * These blocks are connected directly to the AMBA bus |
711 | * with no bridge. | 711 | * with no bridge. |
712 | */ | 712 | */ |
713 | 713 | ||
714 | static struct clk cpu_clk = { | 714 | static struct clk cpu_clk = { |
715 | .name = "CPU", | 715 | .name = "CPU", |
716 | .parent = &amba_clk, | 716 | .parent = &amba_clk, |
717 | .rate = 208000000, /* this varies! */ | 717 | .rate = 208000000, /* this varies! */ |
718 | .hw_ctrld = true, | 718 | .hw_ctrld = true, |
719 | .reset = true, | 719 | .reset = true, |
720 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR, | 720 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR, |
721 | .res_mask = U300_SYSCON_RRR_CPU_RESET_EN, | 721 | .res_mask = U300_SYSCON_RRR_CPU_RESET_EN, |
722 | .set_rate = clk_set_rate_cpuclk, | 722 | .set_rate = clk_set_rate_cpuclk, |
723 | .get_rate = clk_get_rate_cpuclk, | 723 | .get_rate = clk_get_rate_cpuclk, |
724 | .round_rate = clk_round_rate_cpuclk, | 724 | .round_rate = clk_round_rate_cpuclk, |
725 | .lock = __SPIN_LOCK_UNLOCKED(cpu_clk.lock), | 725 | .lock = __SPIN_LOCK_UNLOCKED(cpu_clk.lock), |
726 | }; | 726 | }; |
727 | 727 | ||
728 | static struct clk nandif_clk = { | 728 | static struct clk nandif_clk = { |
729 | .name = "NANDIF", | 729 | .name = "NANDIF", |
730 | .parent = &amba_clk, | 730 | .parent = &amba_clk, |
731 | .hw_ctrld = false, | 731 | .hw_ctrld = false, |
732 | .reset = true, | 732 | .reset = true, |
733 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR, | 733 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR, |
734 | .res_mask = U300_SYSCON_RRR_NANDIF_RESET_EN, | 734 | .res_mask = U300_SYSCON_RRR_NANDIF_RESET_EN, |
735 | .clk_val = U300_SYSCON_SBCER_NANDIF_CLK_EN, | 735 | .clk_val = U300_SYSCON_SBCER_NANDIF_CLK_EN, |
736 | .enable = syscon_clk_enable, | 736 | .enable = syscon_clk_enable, |
737 | .disable = syscon_clk_disable, | 737 | .disable = syscon_clk_disable, |
738 | .lock = __SPIN_LOCK_UNLOCKED(nandif_clk.lock), | 738 | .lock = __SPIN_LOCK_UNLOCKED(nandif_clk.lock), |
739 | }; | 739 | }; |
740 | 740 | ||
741 | static struct clk semi_clk = { | 741 | static struct clk semi_clk = { |
742 | .name = "SEMI", | 742 | .name = "SEMI", |
743 | .parent = &amba_clk, | 743 | .parent = &amba_clk, |
744 | .rate = 0, /* FIXME */ | 744 | .rate = 0, /* FIXME */ |
745 | /* It is not possible to reset SEMI */ | 745 | /* It is not possible to reset SEMI */ |
746 | .hw_ctrld = false, | 746 | .hw_ctrld = false, |
747 | .reset = false, | 747 | .reset = false, |
748 | .clk_val = U300_SYSCON_SBCER_SEMI_CLK_EN, | 748 | .clk_val = U300_SYSCON_SBCER_SEMI_CLK_EN, |
749 | .enable = syscon_clk_enable, | 749 | .enable = syscon_clk_enable, |
750 | .disable = syscon_clk_disable, | 750 | .disable = syscon_clk_disable, |
751 | .lock = __SPIN_LOCK_UNLOCKED(semi_clk.lock), | 751 | .lock = __SPIN_LOCK_UNLOCKED(semi_clk.lock), |
752 | }; | 752 | }; |
753 | 753 | ||
754 | #ifdef CONFIG_MACH_U300_BS335 | 754 | #ifdef CONFIG_MACH_U300_BS335 |
755 | static struct clk isp_clk = { | 755 | static struct clk isp_clk = { |
756 | .name = "ISP", | 756 | .name = "ISP", |
757 | .parent = &amba_clk, | 757 | .parent = &amba_clk, |
758 | .rate = 0, /* FIXME */ | 758 | .rate = 0, /* FIXME */ |
759 | .hw_ctrld = false, | 759 | .hw_ctrld = false, |
760 | .reset = true, | 760 | .reset = true, |
761 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR, | 761 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR, |
762 | .res_mask = U300_SYSCON_RRR_ISP_RESET_EN, | 762 | .res_mask = U300_SYSCON_RRR_ISP_RESET_EN, |
763 | .clk_val = U300_SYSCON_SBCER_ISP_CLK_EN, | 763 | .clk_val = U300_SYSCON_SBCER_ISP_CLK_EN, |
764 | .enable = syscon_clk_enable, | 764 | .enable = syscon_clk_enable, |
765 | .disable = syscon_clk_disable, | 765 | .disable = syscon_clk_disable, |
766 | .lock = __SPIN_LOCK_UNLOCKED(isp_clk.lock), | 766 | .lock = __SPIN_LOCK_UNLOCKED(isp_clk.lock), |
767 | }; | 767 | }; |
768 | 768 | ||
769 | static struct clk cds_clk = { | 769 | static struct clk cds_clk = { |
770 | .name = "CDS", | 770 | .name = "CDS", |
771 | .parent = &amba_clk, | 771 | .parent = &amba_clk, |
772 | .rate = 0, /* FIXME */ | 772 | .rate = 0, /* FIXME */ |
773 | .hw_ctrld = false, | 773 | .hw_ctrld = false, |
774 | .reset = true, | 774 | .reset = true, |
775 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR, | 775 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR, |
776 | .res_mask = U300_SYSCON_RRR_CDS_RESET_EN, | 776 | .res_mask = U300_SYSCON_RRR_CDS_RESET_EN, |
777 | .clk_val = U300_SYSCON_SBCER_CDS_CLK_EN, | 777 | .clk_val = U300_SYSCON_SBCER_CDS_CLK_EN, |
778 | .enable = syscon_clk_enable, | 778 | .enable = syscon_clk_enable, |
779 | .disable = syscon_clk_disable, | 779 | .disable = syscon_clk_disable, |
780 | .lock = __SPIN_LOCK_UNLOCKED(cds_clk.lock), | 780 | .lock = __SPIN_LOCK_UNLOCKED(cds_clk.lock), |
781 | }; | 781 | }; |
782 | #endif | 782 | #endif |
783 | 783 | ||
784 | static struct clk dma_clk = { | 784 | static struct clk dma_clk = { |
785 | .name = "DMA", | 785 | .name = "DMA", |
786 | .parent = &amba_clk, | 786 | .parent = &amba_clk, |
787 | .rate = 52000000, /* this varies! */ | 787 | .rate = 52000000, /* this varies! */ |
788 | .hw_ctrld = true, | 788 | .hw_ctrld = true, |
789 | .reset = true, | 789 | .reset = true, |
790 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR, | 790 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR, |
791 | .res_mask = U300_SYSCON_RRR_DMAC_RESET_EN, | 791 | .res_mask = U300_SYSCON_RRR_DMAC_RESET_EN, |
792 | .clk_val = U300_SYSCON_SBCER_DMAC_CLK_EN, | 792 | .clk_val = U300_SYSCON_SBCER_DMAC_CLK_EN, |
793 | .enable = syscon_clk_enable, | 793 | .enable = syscon_clk_enable, |
794 | .disable = syscon_clk_disable, | 794 | .disable = syscon_clk_disable, |
795 | .lock = __SPIN_LOCK_UNLOCKED(dma_clk.lock), | 795 | .lock = __SPIN_LOCK_UNLOCKED(dma_clk.lock), |
796 | }; | 796 | }; |
797 | 797 | ||
798 | static struct clk aaif_clk = { | 798 | static struct clk aaif_clk = { |
799 | .name = "AAIF", | 799 | .name = "AAIF", |
800 | .parent = &amba_clk, | 800 | .parent = &amba_clk, |
801 | .rate = 52000000, /* this varies! */ | 801 | .rate = 52000000, /* this varies! */ |
802 | .hw_ctrld = true, | 802 | .hw_ctrld = true, |
803 | .reset = true, | 803 | .reset = true, |
804 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR, | 804 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR, |
805 | .res_mask = U300_SYSCON_RRR_AAIF_RESET_EN, | 805 | .res_mask = U300_SYSCON_RRR_AAIF_RESET_EN, |
806 | .clk_val = U300_SYSCON_SBCER_AAIF_CLK_EN, | 806 | .clk_val = U300_SYSCON_SBCER_AAIF_CLK_EN, |
807 | .enable = syscon_clk_enable, | 807 | .enable = syscon_clk_enable, |
808 | .disable = syscon_clk_disable, | 808 | .disable = syscon_clk_disable, |
809 | .lock = __SPIN_LOCK_UNLOCKED(aaif_clk.lock), | 809 | .lock = __SPIN_LOCK_UNLOCKED(aaif_clk.lock), |
810 | }; | 810 | }; |
811 | 811 | ||
812 | static struct clk apex_clk = { | 812 | static struct clk apex_clk = { |
813 | .name = "APEX", | 813 | .name = "APEX", |
814 | .parent = &amba_clk, | 814 | .parent = &amba_clk, |
815 | .rate = 0, /* FIXME */ | 815 | .rate = 0, /* FIXME */ |
816 | .hw_ctrld = true, | 816 | .hw_ctrld = true, |
817 | .reset = true, | 817 | .reset = true, |
818 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR, | 818 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR, |
819 | .res_mask = U300_SYSCON_RRR_APEX_RESET_EN, | 819 | .res_mask = U300_SYSCON_RRR_APEX_RESET_EN, |
820 | .clk_val = U300_SYSCON_SBCER_APEX_CLK_EN, | 820 | .clk_val = U300_SYSCON_SBCER_APEX_CLK_EN, |
821 | .enable = syscon_clk_enable, | 821 | .enable = syscon_clk_enable, |
822 | .disable = syscon_clk_disable, | 822 | .disable = syscon_clk_disable, |
823 | .lock = __SPIN_LOCK_UNLOCKED(apex_clk.lock), | 823 | .lock = __SPIN_LOCK_UNLOCKED(apex_clk.lock), |
824 | }; | 824 | }; |
825 | 825 | ||
826 | static struct clk video_enc_clk = { | 826 | static struct clk video_enc_clk = { |
827 | .name = "VIDEO_ENC", | 827 | .name = "VIDEO_ENC", |
828 | .parent = &amba_clk, | 828 | .parent = &amba_clk, |
829 | .rate = 208000000, /* this varies! */ | 829 | .rate = 208000000, /* this varies! */ |
830 | .hw_ctrld = false, | 830 | .hw_ctrld = false, |
831 | .reset = false, | 831 | .reset = false, |
832 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR, | 832 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR, |
833 | /* This has XGAM in the name but refers to the video encoder */ | 833 | /* This has XGAM in the name but refers to the video encoder */ |
834 | .res_mask = U300_SYSCON_RRR_XGAM_VC_SYNC_RESET_EN, | 834 | .res_mask = U300_SYSCON_RRR_XGAM_VC_SYNC_RESET_EN, |
835 | .clk_val = U300_SYSCON_SBCER_VIDEO_ENC_CLK_EN, | 835 | .clk_val = U300_SYSCON_SBCER_VIDEO_ENC_CLK_EN, |
836 | .enable = syscon_clk_enable, | 836 | .enable = syscon_clk_enable, |
837 | .disable = syscon_clk_disable, | 837 | .disable = syscon_clk_disable, |
838 | .lock = __SPIN_LOCK_UNLOCKED(video_enc_clk.lock), | 838 | .lock = __SPIN_LOCK_UNLOCKED(video_enc_clk.lock), |
839 | }; | 839 | }; |
840 | 840 | ||
841 | static struct clk xgam_clk = { | 841 | static struct clk xgam_clk = { |
842 | .name = "XGAMCLK", | 842 | .name = "XGAMCLK", |
843 | .parent = &amba_clk, | 843 | .parent = &amba_clk, |
844 | .rate = 52000000, /* this varies! */ | 844 | .rate = 52000000, /* this varies! */ |
845 | .hw_ctrld = false, | 845 | .hw_ctrld = false, |
846 | .reset = true, | 846 | .reset = true, |
847 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR, | 847 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR, |
848 | .res_mask = U300_SYSCON_RRR_XGAM_RESET_EN, | 848 | .res_mask = U300_SYSCON_RRR_XGAM_RESET_EN, |
849 | .clk_val = U300_SYSCON_SBCER_XGAM_CLK_EN, | 849 | .clk_val = U300_SYSCON_SBCER_XGAM_CLK_EN, |
850 | .get_rate = clk_get_rate_xgamclk, | 850 | .get_rate = clk_get_rate_xgamclk, |
851 | .enable = syscon_clk_enable, | 851 | .enable = syscon_clk_enable, |
852 | .disable = syscon_clk_disable, | 852 | .disable = syscon_clk_disable, |
853 | .lock = __SPIN_LOCK_UNLOCKED(xgam_clk.lock), | 853 | .lock = __SPIN_LOCK_UNLOCKED(xgam_clk.lock), |
854 | }; | 854 | }; |
855 | 855 | ||
856 | /* This clock is used to activate the video encoder */ | 856 | /* This clock is used to activate the video encoder */ |
857 | static struct clk ahb_clk = { | 857 | static struct clk ahb_clk = { |
858 | .name = "AHB", | 858 | .name = "AHB", |
859 | .parent = &amba_clk, | 859 | .parent = &amba_clk, |
860 | .rate = 52000000, /* this varies! */ | 860 | .rate = 52000000, /* this varies! */ |
861 | .hw_ctrld = false, /* This one is set to false due to HW bug */ | 861 | .hw_ctrld = false, /* This one is set to false due to HW bug */ |
862 | .reset = true, | 862 | .reset = true, |
863 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR, | 863 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR, |
864 | .res_mask = U300_SYSCON_RRR_AHB_RESET_EN, | 864 | .res_mask = U300_SYSCON_RRR_AHB_RESET_EN, |
865 | .clk_val = U300_SYSCON_SBCER_AHB_CLK_EN, | 865 | .clk_val = U300_SYSCON_SBCER_AHB_CLK_EN, |
866 | .enable = syscon_clk_enable, | 866 | .enable = syscon_clk_enable, |
867 | .disable = syscon_clk_disable, | 867 | .disable = syscon_clk_disable, |
868 | .get_rate = clk_get_rate_ahb_clk, | 868 | .get_rate = clk_get_rate_ahb_clk, |
869 | .lock = __SPIN_LOCK_UNLOCKED(ahb_clk.lock), | 869 | .lock = __SPIN_LOCK_UNLOCKED(ahb_clk.lock), |
870 | }; | 870 | }; |
871 | 871 | ||
872 | 872 | ||
873 | /* | 873 | /* |
874 | * Clocks on the AHB bridge | 874 | * Clocks on the AHB bridge |
875 | */ | 875 | */ |
876 | 876 | ||
877 | static struct clk ahb_subsys_clk = { | 877 | static struct clk ahb_subsys_clk = { |
878 | .name = "AHB_SUBSYS", | 878 | .name = "AHB_SUBSYS", |
879 | .parent = &amba_clk, | 879 | .parent = &amba_clk, |
880 | .rate = 52000000, /* this varies! */ | 880 | .rate = 52000000, /* this varies! */ |
881 | .hw_ctrld = true, | 881 | .hw_ctrld = true, |
882 | .reset = false, | 882 | .reset = false, |
883 | .clk_val = U300_SYSCON_SBCER_AHB_SUBSYS_BRIDGE_CLK_EN, | 883 | .clk_val = U300_SYSCON_SBCER_AHB_SUBSYS_BRIDGE_CLK_EN, |
884 | .enable = syscon_clk_enable, | 884 | .enable = syscon_clk_enable, |
885 | .disable = syscon_clk_disable, | 885 | .disable = syscon_clk_disable, |
886 | .get_rate = clk_get_rate_ahb_clk, | 886 | .get_rate = clk_get_rate_ahb_clk, |
887 | .lock = __SPIN_LOCK_UNLOCKED(ahb_subsys_clk.lock), | 887 | .lock = __SPIN_LOCK_UNLOCKED(ahb_subsys_clk.lock), |
888 | }; | 888 | }; |
889 | 889 | ||
890 | static struct clk intcon_clk = { | 890 | static struct clk intcon_clk = { |
891 | .name = "INTCON", | 891 | .name = "INTCON", |
892 | .parent = &ahb_subsys_clk, | 892 | .parent = &ahb_subsys_clk, |
893 | .rate = 52000000, /* this varies! */ | 893 | .rate = 52000000, /* this varies! */ |
894 | .hw_ctrld = false, | 894 | .hw_ctrld = false, |
895 | .reset = true, | 895 | .reset = true, |
896 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR, | 896 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR, |
897 | .res_mask = U300_SYSCON_RRR_INTCON_RESET_EN, | 897 | .res_mask = U300_SYSCON_RRR_INTCON_RESET_EN, |
898 | /* INTCON can be reset but not clock-gated */ | 898 | /* INTCON can be reset but not clock-gated */ |
899 | .lock = __SPIN_LOCK_UNLOCKED(intcon_clk.lock), | 899 | .lock = __SPIN_LOCK_UNLOCKED(intcon_clk.lock), |
900 | 900 | ||
901 | }; | 901 | }; |
902 | 902 | ||
903 | static struct clk mspro_clk = { | 903 | static struct clk mspro_clk = { |
904 | .name = "MSPRO", | 904 | .name = "MSPRO", |
905 | .parent = &ahb_subsys_clk, | 905 | .parent = &ahb_subsys_clk, |
906 | .rate = 0, /* FIXME */ | 906 | .rate = 0, /* FIXME */ |
907 | .hw_ctrld = false, | 907 | .hw_ctrld = false, |
908 | .reset = true, | 908 | .reset = true, |
909 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR, | 909 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR, |
910 | .res_mask = U300_SYSCON_RRR_MSPRO_RESET_EN, | 910 | .res_mask = U300_SYSCON_RRR_MSPRO_RESET_EN, |
911 | .clk_val = U300_SYSCON_SBCER_MSPRO_CLK_EN, | 911 | .clk_val = U300_SYSCON_SBCER_MSPRO_CLK_EN, |
912 | .enable = syscon_clk_enable, | 912 | .enable = syscon_clk_enable, |
913 | .disable = syscon_clk_disable, | 913 | .disable = syscon_clk_disable, |
914 | .lock = __SPIN_LOCK_UNLOCKED(mspro_clk.lock), | 914 | .lock = __SPIN_LOCK_UNLOCKED(mspro_clk.lock), |
915 | }; | 915 | }; |
916 | 916 | ||
917 | static struct clk emif_clk = { | 917 | static struct clk emif_clk = { |
918 | .name = "EMIF", | 918 | .name = "EMIF", |
919 | .parent = &ahb_subsys_clk, | 919 | .parent = &ahb_subsys_clk, |
920 | .rate = 104000000, /* this varies! */ | 920 | .rate = 104000000, /* this varies! */ |
921 | .hw_ctrld = false, | 921 | .hw_ctrld = false, |
922 | .reset = true, | 922 | .reset = true, |
923 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR, | 923 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR, |
924 | .res_mask = U300_SYSCON_RRR_EMIF_RESET_EN, | 924 | .res_mask = U300_SYSCON_RRR_EMIF_RESET_EN, |
925 | .clk_val = U300_SYSCON_SBCER_EMIF_CLK_EN, | 925 | .clk_val = U300_SYSCON_SBCER_EMIF_CLK_EN, |
926 | .enable = syscon_clk_enable, | 926 | .enable = syscon_clk_enable, |
927 | .disable = syscon_clk_disable, | 927 | .disable = syscon_clk_disable, |
928 | .get_rate = clk_get_rate_emif_clk, | 928 | .get_rate = clk_get_rate_emif_clk, |
929 | .lock = __SPIN_LOCK_UNLOCKED(emif_clk.lock), | 929 | .lock = __SPIN_LOCK_UNLOCKED(emif_clk.lock), |
930 | }; | 930 | }; |
931 | 931 | ||
932 | 932 | ||
933 | /* | 933 | /* |
934 | * Clocks on the FAST bridge | 934 | * Clocks on the FAST bridge |
935 | */ | 935 | */ |
936 | static struct clk fast_clk = { | 936 | static struct clk fast_clk = { |
937 | .name = "FAST_BRIDGE", | 937 | .name = "FAST_BRIDGE", |
938 | .parent = &amba_clk, | 938 | .parent = &amba_clk, |
939 | .rate = 13000000, /* this varies! */ | 939 | .rate = 13000000, /* this varies! */ |
940 | .hw_ctrld = true, | 940 | .hw_ctrld = true, |
941 | .reset = true, | 941 | .reset = true, |
942 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RFR, | 942 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RFR, |
943 | .res_mask = U300_SYSCON_RFR_FAST_BRIDGE_RESET_ENABLE, | 943 | .res_mask = U300_SYSCON_RFR_FAST_BRIDGE_RESET_ENABLE, |
944 | .clk_val = U300_SYSCON_SBCER_FAST_BRIDGE_CLK_EN, | 944 | .clk_val = U300_SYSCON_SBCER_FAST_BRIDGE_CLK_EN, |
945 | .enable = syscon_clk_enable, | 945 | .enable = syscon_clk_enable, |
946 | .disable = syscon_clk_disable, | 946 | .disable = syscon_clk_disable, |
947 | .lock = __SPIN_LOCK_UNLOCKED(fast_clk.lock), | 947 | .lock = __SPIN_LOCK_UNLOCKED(fast_clk.lock), |
948 | }; | 948 | }; |
949 | 949 | ||
950 | static struct clk mmcsd_clk = { | 950 | static struct clk mmcsd_clk = { |
951 | .name = "MCLK", | 951 | .name = "MCLK", |
952 | .parent = &fast_clk, | 952 | .parent = &fast_clk, |
953 | .rate = 18900000, /* this varies! */ | 953 | .rate = 18900000, /* this varies! */ |
954 | .hw_ctrld = false, | 954 | .hw_ctrld = false, |
955 | .reset = true, | 955 | .reset = true, |
956 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RFR, | 956 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RFR, |
957 | .res_mask = U300_SYSCON_RFR_MMC_RESET_ENABLE, | 957 | .res_mask = U300_SYSCON_RFR_MMC_RESET_ENABLE, |
958 | .clk_val = U300_SYSCON_SBCER_MMC_CLK_EN, | 958 | .clk_val = U300_SYSCON_SBCER_MMC_CLK_EN, |
959 | .get_rate = clk_get_rate_mclk, | 959 | .get_rate = clk_get_rate_mclk, |
960 | .set_rate = clk_set_rate_mclk, | 960 | .set_rate = clk_set_rate_mclk, |
961 | .round_rate = clk_round_rate_mclk, | 961 | .round_rate = clk_round_rate_mclk, |
962 | .disable = syscon_clk_disable, | 962 | .disable = syscon_clk_disable, |
963 | .enable = syscon_clk_enable, | 963 | .enable = syscon_clk_enable, |
964 | .lock = __SPIN_LOCK_UNLOCKED(mmcsd_clk.lock), | 964 | .lock = __SPIN_LOCK_UNLOCKED(mmcsd_clk.lock), |
965 | }; | 965 | }; |
966 | 966 | ||
967 | static struct clk i2s0_clk = { | 967 | static struct clk i2s0_clk = { |
968 | .name = "i2s0", | 968 | .name = "i2s0", |
969 | .parent = &fast_clk, | 969 | .parent = &fast_clk, |
970 | .rate = 26000000, /* this varies! */ | 970 | .rate = 26000000, /* this varies! */ |
971 | .hw_ctrld = true, | 971 | .hw_ctrld = true, |
972 | .reset = true, | 972 | .reset = true, |
973 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RFR, | 973 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RFR, |
974 | .res_mask = U300_SYSCON_RFR_PCM_I2S0_RESET_ENABLE, | 974 | .res_mask = U300_SYSCON_RFR_PCM_I2S0_RESET_ENABLE, |
975 | .clk_val = U300_SYSCON_SBCER_I2S0_CORE_CLK_EN, | 975 | .clk_val = U300_SYSCON_SBCER_I2S0_CORE_CLK_EN, |
976 | .enable = syscon_clk_enable, | 976 | .enable = syscon_clk_enable, |
977 | .disable = syscon_clk_disable, | 977 | .disable = syscon_clk_disable, |
978 | .get_rate = clk_get_rate_i2s_i2c_spi, | 978 | .get_rate = clk_get_rate_i2s_i2c_spi, |
979 | .lock = __SPIN_LOCK_UNLOCKED(i2s0_clk.lock), | 979 | .lock = __SPIN_LOCK_UNLOCKED(i2s0_clk.lock), |
980 | }; | 980 | }; |
981 | 981 | ||
982 | static struct clk i2s1_clk = { | 982 | static struct clk i2s1_clk = { |
983 | .name = "i2s1", | 983 | .name = "i2s1", |
984 | .parent = &fast_clk, | 984 | .parent = &fast_clk, |
985 | .rate = 26000000, /* this varies! */ | 985 | .rate = 26000000, /* this varies! */ |
986 | .hw_ctrld = true, | 986 | .hw_ctrld = true, |
987 | .reset = true, | 987 | .reset = true, |
988 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RFR, | 988 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RFR, |
989 | .res_mask = U300_SYSCON_RFR_PCM_I2S1_RESET_ENABLE, | 989 | .res_mask = U300_SYSCON_RFR_PCM_I2S1_RESET_ENABLE, |
990 | .clk_val = U300_SYSCON_SBCER_I2S1_CORE_CLK_EN, | 990 | .clk_val = U300_SYSCON_SBCER_I2S1_CORE_CLK_EN, |
991 | .enable = syscon_clk_enable, | 991 | .enable = syscon_clk_enable, |
992 | .disable = syscon_clk_disable, | 992 | .disable = syscon_clk_disable, |
993 | .get_rate = clk_get_rate_i2s_i2c_spi, | 993 | .get_rate = clk_get_rate_i2s_i2c_spi, |
994 | .lock = __SPIN_LOCK_UNLOCKED(i2s1_clk.lock), | 994 | .lock = __SPIN_LOCK_UNLOCKED(i2s1_clk.lock), |
995 | }; | 995 | }; |
996 | 996 | ||
997 | static struct clk i2c0_clk = { | 997 | static struct clk i2c0_clk = { |
998 | .name = "I2C0", | 998 | .name = "I2C0", |
999 | .parent = &fast_clk, | 999 | .parent = &fast_clk, |
1000 | .rate = 26000000, /* this varies! */ | 1000 | .rate = 26000000, /* this varies! */ |
1001 | .hw_ctrld = false, | 1001 | .hw_ctrld = false, |
1002 | .reset = true, | 1002 | .reset = true, |
1003 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RFR, | 1003 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RFR, |
1004 | .res_mask = U300_SYSCON_RFR_I2C0_RESET_ENABLE, | 1004 | .res_mask = U300_SYSCON_RFR_I2C0_RESET_ENABLE, |
1005 | .clk_val = U300_SYSCON_SBCER_I2C0_CLK_EN, | 1005 | .clk_val = U300_SYSCON_SBCER_I2C0_CLK_EN, |
1006 | .enable = syscon_clk_enable, | 1006 | .enable = syscon_clk_enable, |
1007 | .disable = syscon_clk_disable, | 1007 | .disable = syscon_clk_disable, |
1008 | .get_rate = clk_get_rate_i2s_i2c_spi, | 1008 | .get_rate = clk_get_rate_i2s_i2c_spi, |
1009 | .lock = __SPIN_LOCK_UNLOCKED(i2c0_clk.lock), | 1009 | .lock = __SPIN_LOCK_UNLOCKED(i2c0_clk.lock), |
1010 | }; | 1010 | }; |
1011 | 1011 | ||
1012 | static struct clk i2c1_clk = { | 1012 | static struct clk i2c1_clk = { |
1013 | .name = "I2C1", | 1013 | .name = "I2C1", |
1014 | .parent = &fast_clk, | 1014 | .parent = &fast_clk, |
1015 | .rate = 26000000, /* this varies! */ | 1015 | .rate = 26000000, /* this varies! */ |
1016 | .hw_ctrld = false, | 1016 | .hw_ctrld = false, |
1017 | .reset = true, | 1017 | .reset = true, |
1018 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RFR, | 1018 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RFR, |
1019 | .res_mask = U300_SYSCON_RFR_I2C1_RESET_ENABLE, | 1019 | .res_mask = U300_SYSCON_RFR_I2C1_RESET_ENABLE, |
1020 | .clk_val = U300_SYSCON_SBCER_I2C1_CLK_EN, | 1020 | .clk_val = U300_SYSCON_SBCER_I2C1_CLK_EN, |
1021 | .enable = syscon_clk_enable, | 1021 | .enable = syscon_clk_enable, |
1022 | .disable = syscon_clk_disable, | 1022 | .disable = syscon_clk_disable, |
1023 | .get_rate = clk_get_rate_i2s_i2c_spi, | 1023 | .get_rate = clk_get_rate_i2s_i2c_spi, |
1024 | .lock = __SPIN_LOCK_UNLOCKED(i2c1_clk.lock), | 1024 | .lock = __SPIN_LOCK_UNLOCKED(i2c1_clk.lock), |
1025 | }; | 1025 | }; |
1026 | 1026 | ||
1027 | static struct clk spi_clk = { | 1027 | static struct clk spi_clk = { |
1028 | .name = "SPI", | 1028 | .name = "SPI", |
1029 | .parent = &fast_clk, | 1029 | .parent = &fast_clk, |
1030 | .rate = 26000000, /* this varies! */ | 1030 | .rate = 26000000, /* this varies! */ |
1031 | .hw_ctrld = false, | 1031 | .hw_ctrld = false, |
1032 | .reset = true, | 1032 | .reset = true, |
1033 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RFR, | 1033 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RFR, |
1034 | .res_mask = U300_SYSCON_RFR_SPI_RESET_ENABLE, | 1034 | .res_mask = U300_SYSCON_RFR_SPI_RESET_ENABLE, |
1035 | .clk_val = U300_SYSCON_SBCER_SPI_CLK_EN, | 1035 | .clk_val = U300_SYSCON_SBCER_SPI_CLK_EN, |
1036 | .enable = syscon_clk_enable, | 1036 | .enable = syscon_clk_enable, |
1037 | .disable = syscon_clk_disable, | 1037 | .disable = syscon_clk_disable, |
1038 | .get_rate = clk_get_rate_i2s_i2c_spi, | 1038 | .get_rate = clk_get_rate_i2s_i2c_spi, |
1039 | .lock = __SPIN_LOCK_UNLOCKED(spi_clk.lock), | 1039 | .lock = __SPIN_LOCK_UNLOCKED(spi_clk.lock), |
1040 | }; | 1040 | }; |
1041 | 1041 | ||
1042 | #ifdef CONFIG_MACH_U300_BS335 | 1042 | #ifdef CONFIG_MACH_U300_BS335 |
1043 | static struct clk uart1_clk = { | 1043 | static struct clk uart1_clk = { |
1044 | .name = "UART1", | 1044 | .name = "UART1", |
1045 | .parent = &fast_clk, | 1045 | .parent = &fast_clk, |
1046 | .rate = 13000000, | 1046 | .rate = 13000000, |
1047 | .hw_ctrld = false, | 1047 | .hw_ctrld = false, |
1048 | .reset = true, | 1048 | .reset = true, |
1049 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RFR, | 1049 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RFR, |
1050 | .res_mask = U300_SYSCON_RFR_UART1_RESET_ENABLE, | 1050 | .res_mask = U300_SYSCON_RFR_UART1_RESET_ENABLE, |
1051 | .clk_val = U300_SYSCON_SBCER_UART1_CLK_EN, | 1051 | .clk_val = U300_SYSCON_SBCER_UART1_CLK_EN, |
1052 | .enable = syscon_clk_enable, | 1052 | .enable = syscon_clk_enable, |
1053 | .disable = syscon_clk_disable, | 1053 | .disable = syscon_clk_disable, |
1054 | .lock = __SPIN_LOCK_UNLOCKED(uart1_clk.lock), | 1054 | .lock = __SPIN_LOCK_UNLOCKED(uart1_clk.lock), |
1055 | }; | 1055 | }; |
1056 | #endif | 1056 | #endif |
1057 | 1057 | ||
1058 | 1058 | ||
1059 | /* | 1059 | /* |
1060 | * Clocks on the SLOW bridge | 1060 | * Clocks on the SLOW bridge |
1061 | */ | 1061 | */ |
1062 | static struct clk slow_clk = { | 1062 | static struct clk slow_clk = { |
1063 | .name = "SLOW_BRIDGE", | 1063 | .name = "SLOW_BRIDGE", |
1064 | .parent = &amba_clk, | 1064 | .parent = &amba_clk, |
1065 | .rate = 13000000, | 1065 | .rate = 13000000, |
1066 | .hw_ctrld = true, | 1066 | .hw_ctrld = true, |
1067 | .reset = true, | 1067 | .reset = true, |
1068 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RSR, | 1068 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RSR, |
1069 | .res_mask = U300_SYSCON_RSR_SLOW_BRIDGE_RESET_EN, | 1069 | .res_mask = U300_SYSCON_RSR_SLOW_BRIDGE_RESET_EN, |
1070 | .clk_val = U300_SYSCON_SBCER_SLOW_BRIDGE_CLK_EN, | 1070 | .clk_val = U300_SYSCON_SBCER_SLOW_BRIDGE_CLK_EN, |
1071 | .enable = syscon_clk_enable, | 1071 | .enable = syscon_clk_enable, |
1072 | .disable = syscon_clk_disable, | 1072 | .disable = syscon_clk_disable, |
1073 | .lock = __SPIN_LOCK_UNLOCKED(slow_clk.lock), | 1073 | .lock = __SPIN_LOCK_UNLOCKED(slow_clk.lock), |
1074 | }; | 1074 | }; |
1075 | 1075 | ||
1076 | /* TODO: implement SYSCON clock? */ | 1076 | /* TODO: implement SYSCON clock? */ |
1077 | 1077 | ||
1078 | static struct clk wdog_clk = { | 1078 | static struct clk wdog_clk = { |
1079 | .name = "WDOG", | 1079 | .name = "WDOG", |
1080 | .parent = &slow_clk, | 1080 | .parent = &slow_clk, |
1081 | .hw_ctrld = false, | 1081 | .hw_ctrld = false, |
1082 | .rate = 32768, | 1082 | .rate = 32768, |
1083 | .reset = false, | 1083 | .reset = false, |
1084 | /* This is always on, cannot be enabled/disabled or reset */ | 1084 | /* This is always on, cannot be enabled/disabled or reset */ |
1085 | .lock = __SPIN_LOCK_UNLOCKED(wdog_clk.lock), | 1085 | .lock = __SPIN_LOCK_UNLOCKED(wdog_clk.lock), |
1086 | }; | 1086 | }; |
1087 | 1087 | ||
1088 | /* This one is hardwired to PLL13 */ | 1088 | /* This one is hardwired to PLL13 */ |
1089 | static struct clk uart_clk = { | 1089 | static struct clk uart_clk = { |
1090 | .name = "UARTCLK", | 1090 | .name = "UARTCLK", |
1091 | .parent = &slow_clk, | 1091 | .parent = &slow_clk, |
1092 | .rate = 13000000, | 1092 | .rate = 13000000, |
1093 | .hw_ctrld = false, | 1093 | .hw_ctrld = false, |
1094 | .reset = true, | 1094 | .reset = true, |
1095 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RSR, | 1095 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RSR, |
1096 | .res_mask = U300_SYSCON_RSR_UART_RESET_EN, | 1096 | .res_mask = U300_SYSCON_RSR_UART_RESET_EN, |
1097 | .clk_val = U300_SYSCON_SBCER_UART_CLK_EN, | 1097 | .clk_val = U300_SYSCON_SBCER_UART_CLK_EN, |
1098 | .enable = syscon_clk_enable, | 1098 | .enable = syscon_clk_enable, |
1099 | .disable = syscon_clk_disable, | 1099 | .disable = syscon_clk_disable, |
1100 | .lock = __SPIN_LOCK_UNLOCKED(uart_clk.lock), | 1100 | .lock = __SPIN_LOCK_UNLOCKED(uart_clk.lock), |
1101 | }; | 1101 | }; |
1102 | 1102 | ||
1103 | static struct clk keypad_clk = { | 1103 | static struct clk keypad_clk = { |
1104 | .name = "KEYPAD", | 1104 | .name = "KEYPAD", |
1105 | .parent = &slow_clk, | 1105 | .parent = &slow_clk, |
1106 | .rate = 32768, | 1106 | .rate = 32768, |
1107 | .hw_ctrld = false, | 1107 | .hw_ctrld = false, |
1108 | .reset = true, | 1108 | .reset = true, |
1109 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RSR, | 1109 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RSR, |
1110 | .res_mask = U300_SYSCON_RSR_KEYPAD_RESET_EN, | 1110 | .res_mask = U300_SYSCON_RSR_KEYPAD_RESET_EN, |
1111 | .clk_val = U300_SYSCON_SBCER_KEYPAD_CLK_EN, | 1111 | .clk_val = U300_SYSCON_SBCER_KEYPAD_CLK_EN, |
1112 | .enable = syscon_clk_enable, | 1112 | .enable = syscon_clk_enable, |
1113 | .disable = syscon_clk_disable, | 1113 | .disable = syscon_clk_disable, |
1114 | .lock = __SPIN_LOCK_UNLOCKED(keypad_clk.lock), | 1114 | .lock = __SPIN_LOCK_UNLOCKED(keypad_clk.lock), |
1115 | }; | 1115 | }; |
1116 | 1116 | ||
1117 | static struct clk gpio_clk = { | 1117 | static struct clk gpio_clk = { |
1118 | .name = "GPIO", | 1118 | .name = "GPIO", |
1119 | .parent = &slow_clk, | 1119 | .parent = &slow_clk, |
1120 | .rate = 13000000, | 1120 | .rate = 13000000, |
1121 | .hw_ctrld = true, | 1121 | .hw_ctrld = true, |
1122 | .reset = true, | 1122 | .reset = true, |
1123 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RSR, | 1123 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RSR, |
1124 | .res_mask = U300_SYSCON_RSR_GPIO_RESET_EN, | 1124 | .res_mask = U300_SYSCON_RSR_GPIO_RESET_EN, |
1125 | .clk_val = U300_SYSCON_SBCER_GPIO_CLK_EN, | 1125 | .clk_val = U300_SYSCON_SBCER_GPIO_CLK_EN, |
1126 | .enable = syscon_clk_enable, | 1126 | .enable = syscon_clk_enable, |
1127 | .disable = syscon_clk_disable, | 1127 | .disable = syscon_clk_disable, |
1128 | .lock = __SPIN_LOCK_UNLOCKED(gpio_clk.lock), | 1128 | .lock = __SPIN_LOCK_UNLOCKED(gpio_clk.lock), |
1129 | }; | 1129 | }; |
1130 | 1130 | ||
1131 | static struct clk rtc_clk = { | 1131 | static struct clk rtc_clk = { |
1132 | .name = "RTC", | 1132 | .name = "RTC", |
1133 | .parent = &slow_clk, | 1133 | .parent = &slow_clk, |
1134 | .rate = 32768, | 1134 | .rate = 32768, |
1135 | .hw_ctrld = true, | 1135 | .hw_ctrld = true, |
1136 | .reset = true, | 1136 | .reset = true, |
1137 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RSR, | 1137 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RSR, |
1138 | .res_mask = U300_SYSCON_RSR_RTC_RESET_EN, | 1138 | .res_mask = U300_SYSCON_RSR_RTC_RESET_EN, |
1139 | /* This clock is always on, cannot be enabled/disabled */ | 1139 | /* This clock is always on, cannot be enabled/disabled */ |
1140 | .lock = __SPIN_LOCK_UNLOCKED(rtc_clk.lock), | 1140 | .lock = __SPIN_LOCK_UNLOCKED(rtc_clk.lock), |
1141 | }; | 1141 | }; |
1142 | 1142 | ||
1143 | static struct clk bustr_clk = { | 1143 | static struct clk bustr_clk = { |
1144 | .name = "BUSTR", | 1144 | .name = "BUSTR", |
1145 | .parent = &slow_clk, | 1145 | .parent = &slow_clk, |
1146 | .rate = 13000000, | 1146 | .rate = 13000000, |
1147 | .hw_ctrld = true, | 1147 | .hw_ctrld = true, |
1148 | .reset = true, | 1148 | .reset = true, |
1149 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RSR, | 1149 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RSR, |
1150 | .res_mask = U300_SYSCON_RSR_BTR_RESET_EN, | 1150 | .res_mask = U300_SYSCON_RSR_BTR_RESET_EN, |
1151 | .clk_val = U300_SYSCON_SBCER_BTR_CLK_EN, | 1151 | .clk_val = U300_SYSCON_SBCER_BTR_CLK_EN, |
1152 | .enable = syscon_clk_enable, | 1152 | .enable = syscon_clk_enable, |
1153 | .disable = syscon_clk_disable, | 1153 | .disable = syscon_clk_disable, |
1154 | .lock = __SPIN_LOCK_UNLOCKED(bustr_clk.lock), | 1154 | .lock = __SPIN_LOCK_UNLOCKED(bustr_clk.lock), |
1155 | }; | 1155 | }; |
1156 | 1156 | ||
1157 | static struct clk evhist_clk = { | 1157 | static struct clk evhist_clk = { |
1158 | .name = "EVHIST", | 1158 | .name = "EVHIST", |
1159 | .parent = &slow_clk, | 1159 | .parent = &slow_clk, |
1160 | .rate = 13000000, | 1160 | .rate = 13000000, |
1161 | .hw_ctrld = true, | 1161 | .hw_ctrld = true, |
1162 | .reset = true, | 1162 | .reset = true, |
1163 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RSR, | 1163 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RSR, |
1164 | .res_mask = U300_SYSCON_RSR_EH_RESET_EN, | 1164 | .res_mask = U300_SYSCON_RSR_EH_RESET_EN, |
1165 | .clk_val = U300_SYSCON_SBCER_EH_CLK_EN, | 1165 | .clk_val = U300_SYSCON_SBCER_EH_CLK_EN, |
1166 | .enable = syscon_clk_enable, | 1166 | .enable = syscon_clk_enable, |
1167 | .disable = syscon_clk_disable, | 1167 | .disable = syscon_clk_disable, |
1168 | .lock = __SPIN_LOCK_UNLOCKED(evhist_clk.lock), | 1168 | .lock = __SPIN_LOCK_UNLOCKED(evhist_clk.lock), |
1169 | }; | 1169 | }; |
1170 | 1170 | ||
1171 | static struct clk timer_clk = { | 1171 | static struct clk timer_clk = { |
1172 | .name = "TIMER", | 1172 | .name = "TIMER", |
1173 | .parent = &slow_clk, | 1173 | .parent = &slow_clk, |
1174 | .rate = 13000000, | 1174 | .rate = 13000000, |
1175 | .hw_ctrld = true, | 1175 | .hw_ctrld = true, |
1176 | .reset = true, | 1176 | .reset = true, |
1177 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RSR, | 1177 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RSR, |
1178 | .res_mask = U300_SYSCON_RSR_ACC_TMR_RESET_EN, | 1178 | .res_mask = U300_SYSCON_RSR_ACC_TMR_RESET_EN, |
1179 | .clk_val = U300_SYSCON_SBCER_ACC_TMR_CLK_EN, | 1179 | .clk_val = U300_SYSCON_SBCER_ACC_TMR_CLK_EN, |
1180 | .enable = syscon_clk_enable, | 1180 | .enable = syscon_clk_enable, |
1181 | .disable = syscon_clk_disable, | 1181 | .disable = syscon_clk_disable, |
1182 | .lock = __SPIN_LOCK_UNLOCKED(timer_clk.lock), | 1182 | .lock = __SPIN_LOCK_UNLOCKED(timer_clk.lock), |
1183 | }; | 1183 | }; |
1184 | 1184 | ||
1185 | static struct clk app_timer_clk = { | 1185 | static struct clk app_timer_clk = { |
1186 | .name = "TIMER_APP", | 1186 | .name = "TIMER_APP", |
1187 | .parent = &slow_clk, | 1187 | .parent = &slow_clk, |
1188 | .rate = 13000000, | 1188 | .rate = 13000000, |
1189 | .hw_ctrld = true, | 1189 | .hw_ctrld = true, |
1190 | .reset = true, | 1190 | .reset = true, |
1191 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RSR, | 1191 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RSR, |
1192 | .res_mask = U300_SYSCON_RSR_APP_TMR_RESET_EN, | 1192 | .res_mask = U300_SYSCON_RSR_APP_TMR_RESET_EN, |
1193 | .clk_val = U300_SYSCON_SBCER_APP_TMR_CLK_EN, | 1193 | .clk_val = U300_SYSCON_SBCER_APP_TMR_CLK_EN, |
1194 | .enable = syscon_clk_enable, | 1194 | .enable = syscon_clk_enable, |
1195 | .disable = syscon_clk_disable, | 1195 | .disable = syscon_clk_disable, |
1196 | .lock = __SPIN_LOCK_UNLOCKED(app_timer_clk.lock), | 1196 | .lock = __SPIN_LOCK_UNLOCKED(app_timer_clk.lock), |
1197 | }; | 1197 | }; |
1198 | 1198 | ||
1199 | #ifdef CONFIG_MACH_U300_BS335 | 1199 | #ifdef CONFIG_MACH_U300_BS335 |
1200 | static struct clk ppm_clk = { | 1200 | static struct clk ppm_clk = { |
1201 | .name = "PPM", | 1201 | .name = "PPM", |
1202 | .parent = &slow_clk, | 1202 | .parent = &slow_clk, |
1203 | .rate = 0, /* FIXME */ | 1203 | .rate = 0, /* FIXME */ |
1204 | .hw_ctrld = true, /* TODO: Look up if it is hw ctrld or not */ | 1204 | .hw_ctrld = true, /* TODO: Look up if it is hw ctrld or not */ |
1205 | .reset = true, | 1205 | .reset = true, |
1206 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RSR, | 1206 | .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RSR, |
1207 | .res_mask = U300_SYSCON_RSR_PPM_RESET_EN, | 1207 | .res_mask = U300_SYSCON_RSR_PPM_RESET_EN, |
1208 | .clk_val = U300_SYSCON_SBCER_PPM_CLK_EN, | 1208 | .clk_val = U300_SYSCON_SBCER_PPM_CLK_EN, |
1209 | .enable = syscon_clk_enable, | 1209 | .enable = syscon_clk_enable, |
1210 | .disable = syscon_clk_disable, | 1210 | .disable = syscon_clk_disable, |
1211 | .lock = __SPIN_LOCK_UNLOCKED(ppm_clk.lock), | 1211 | .lock = __SPIN_LOCK_UNLOCKED(ppm_clk.lock), |
1212 | }; | 1212 | }; |
1213 | #endif | 1213 | #endif |
1214 | 1214 | ||
1215 | static struct clk dummy_apb_pclk; | ||
1216 | |||
1215 | #define DEF_LOOKUP(devid, clkref) \ | 1217 | #define DEF_LOOKUP(devid, clkref) \ |
1216 | { \ | 1218 | { \ |
1217 | .dev_id = devid, \ | 1219 | .dev_id = devid, \ |
1218 | .clk = clkref, \ | 1220 | .clk = clkref, \ |
1219 | } | 1221 | } |
1220 | 1222 | ||
1221 | /* | 1223 | /* |
1222 | * Here we only define clocks that are meaningful to | 1224 | * Here we only define clocks that are meaningful to |
1223 | * look up through clockdevice. | 1225 | * look up through clockdevice. |
1224 | */ | 1226 | */ |
1225 | static struct clk_lookup lookups[] = { | 1227 | static struct clk_lookup lookups[] = { |
1228 | { | ||
1229 | .con_id = "apb_pclk", | ||
1230 | .clk = &dummy_apb_pclk, | ||
1231 | }, | ||
1226 | /* Connected directly to the AMBA bus */ | 1232 | /* Connected directly to the AMBA bus */ |
1227 | DEF_LOOKUP("amba", &amba_clk), | 1233 | DEF_LOOKUP("amba", &amba_clk), |
1228 | DEF_LOOKUP("cpu", &cpu_clk), | 1234 | DEF_LOOKUP("cpu", &cpu_clk), |
1229 | DEF_LOOKUP("fsmc", &nandif_clk), | 1235 | DEF_LOOKUP("fsmc", &nandif_clk), |
1230 | DEF_LOOKUP("semi", &semi_clk), | 1236 | DEF_LOOKUP("semi", &semi_clk), |
1231 | #ifdef CONFIG_MACH_U300_BS335 | 1237 | #ifdef CONFIG_MACH_U300_BS335 |
1232 | DEF_LOOKUP("isp", &isp_clk), | 1238 | DEF_LOOKUP("isp", &isp_clk), |
1233 | DEF_LOOKUP("cds", &cds_clk), | 1239 | DEF_LOOKUP("cds", &cds_clk), |
1234 | #endif | 1240 | #endif |
1235 | DEF_LOOKUP("dma", &dma_clk), | 1241 | DEF_LOOKUP("dma", &dma_clk), |
1236 | DEF_LOOKUP("msl", &aaif_clk), | 1242 | DEF_LOOKUP("msl", &aaif_clk), |
1237 | DEF_LOOKUP("apex", &apex_clk), | 1243 | DEF_LOOKUP("apex", &apex_clk), |
1238 | DEF_LOOKUP("video_enc", &video_enc_clk), | 1244 | DEF_LOOKUP("video_enc", &video_enc_clk), |
1239 | DEF_LOOKUP("xgam", &xgam_clk), | 1245 | DEF_LOOKUP("xgam", &xgam_clk), |
1240 | DEF_LOOKUP("ahb", &ahb_clk), | 1246 | DEF_LOOKUP("ahb", &ahb_clk), |
1241 | /* AHB bridge clocks */ | 1247 | /* AHB bridge clocks */ |
1242 | DEF_LOOKUP("ahb_subsys", &ahb_subsys_clk), | 1248 | DEF_LOOKUP("ahb_subsys", &ahb_subsys_clk), |
1243 | DEF_LOOKUP("intcon", &intcon_clk), | 1249 | DEF_LOOKUP("intcon", &intcon_clk), |
1244 | DEF_LOOKUP("mspro", &mspro_clk), | 1250 | DEF_LOOKUP("mspro", &mspro_clk), |
1245 | DEF_LOOKUP("pl172", &emif_clk), | 1251 | DEF_LOOKUP("pl172", &emif_clk), |
1246 | /* FAST bridge clocks */ | 1252 | /* FAST bridge clocks */ |
1247 | DEF_LOOKUP("fast", &fast_clk), | 1253 | DEF_LOOKUP("fast", &fast_clk), |
1248 | DEF_LOOKUP("mmci", &mmcsd_clk), | 1254 | DEF_LOOKUP("mmci", &mmcsd_clk), |
1249 | /* | 1255 | /* |
1250 | * The .0 and .1 identifiers on these comes from the platform device | 1256 | * The .0 and .1 identifiers on these comes from the platform device |
1251 | * .id field and are assigned when the platform devices are registered. | 1257 | * .id field and are assigned when the platform devices are registered. |
1252 | */ | 1258 | */ |
1253 | DEF_LOOKUP("i2s.0", &i2s0_clk), | 1259 | DEF_LOOKUP("i2s.0", &i2s0_clk), |
1254 | DEF_LOOKUP("i2s.1", &i2s1_clk), | 1260 | DEF_LOOKUP("i2s.1", &i2s1_clk), |
1255 | DEF_LOOKUP("stu300.0", &i2c0_clk), | 1261 | DEF_LOOKUP("stu300.0", &i2c0_clk), |
1256 | DEF_LOOKUP("stu300.1", &i2c1_clk), | 1262 | DEF_LOOKUP("stu300.1", &i2c1_clk), |
1257 | DEF_LOOKUP("pl022", &spi_clk), | 1263 | DEF_LOOKUP("pl022", &spi_clk), |
1258 | #ifdef CONFIG_MACH_U300_BS335 | 1264 | #ifdef CONFIG_MACH_U300_BS335 |
1259 | DEF_LOOKUP("uart1", &uart1_clk), | 1265 | DEF_LOOKUP("uart1", &uart1_clk), |
1260 | #endif | 1266 | #endif |
1261 | /* SLOW bridge clocks */ | 1267 | /* SLOW bridge clocks */ |
1262 | DEF_LOOKUP("slow", &slow_clk), | 1268 | DEF_LOOKUP("slow", &slow_clk), |
1263 | DEF_LOOKUP("coh901327_wdog", &wdog_clk), | 1269 | DEF_LOOKUP("coh901327_wdog", &wdog_clk), |
1264 | DEF_LOOKUP("uart0", &uart_clk), | 1270 | DEF_LOOKUP("uart0", &uart_clk), |
1265 | DEF_LOOKUP("apptimer", &app_timer_clk), | 1271 | DEF_LOOKUP("apptimer", &app_timer_clk), |
1266 | DEF_LOOKUP("coh901461-keypad", &keypad_clk), | 1272 | DEF_LOOKUP("coh901461-keypad", &keypad_clk), |
1267 | DEF_LOOKUP("u300-gpio", &gpio_clk), | 1273 | DEF_LOOKUP("u300-gpio", &gpio_clk), |
1268 | DEF_LOOKUP("rtc-coh901331", &rtc_clk), | 1274 | DEF_LOOKUP("rtc-coh901331", &rtc_clk), |
1269 | DEF_LOOKUP("bustr", &bustr_clk), | 1275 | DEF_LOOKUP("bustr", &bustr_clk), |
1270 | DEF_LOOKUP("evhist", &evhist_clk), | 1276 | DEF_LOOKUP("evhist", &evhist_clk), |
1271 | DEF_LOOKUP("timer", &timer_clk), | 1277 | DEF_LOOKUP("timer", &timer_clk), |
1272 | #ifdef CONFIG_MACH_U300_BS335 | 1278 | #ifdef CONFIG_MACH_U300_BS335 |
1273 | DEF_LOOKUP("ppm", &ppm_clk), | 1279 | DEF_LOOKUP("ppm", &ppm_clk), |
1274 | #endif | 1280 | #endif |
1275 | }; | 1281 | }; |
1276 | 1282 | ||
1277 | static void __init clk_register(void) | 1283 | static void __init clk_register(void) |
1278 | { | 1284 | { |
1279 | /* Register the lookups */ | 1285 | /* Register the lookups */ |
1280 | clkdev_add_table(lookups, ARRAY_SIZE(lookups)); | 1286 | clkdev_add_table(lookups, ARRAY_SIZE(lookups)); |
1281 | } | 1287 | } |
1282 | 1288 | ||
1283 | /* | 1289 | /* |
1284 | * These are the clocks for cells registered as primecell drivers | 1290 | * These are the clocks for cells registered as primecell drivers |
1285 | * on the AMBA bus. These must be on during AMBA device registration | 1291 | * on the AMBA bus. These must be on during AMBA device registration |
1286 | * since the bus probe will attempt to read magic configuration | 1292 | * since the bus probe will attempt to read magic configuration |
1287 | * registers for these devices. If they are deactivated these probes | 1293 | * registers for these devices. If they are deactivated these probes |
1288 | * will fail. | 1294 | * will fail. |
1289 | * | 1295 | * |
1290 | * | 1296 | * |
1291 | * Please note that on emif, both RAM and NAND is connected in dual | 1297 | * Please note that on emif, both RAM and NAND is connected in dual |
1292 | * RAM phones. On single RAM phones, ram is on semi and NAND on emif. | 1298 | * RAM phones. On single RAM phones, ram is on semi and NAND on emif. |
1293 | * | 1299 | * |
1294 | */ | 1300 | */ |
1295 | void u300_clock_primecells(void) | 1301 | void u300_clock_primecells(void) |
1296 | { | 1302 | { |
1297 | clk_enable(&intcon_clk); | 1303 | clk_enable(&intcon_clk); |
1298 | clk_enable(&uart_clk); | 1304 | clk_enable(&uart_clk); |
1299 | #ifdef CONFIG_MACH_U300_BS335 | 1305 | #ifdef CONFIG_MACH_U300_BS335 |
1300 | clk_enable(&uart1_clk); | 1306 | clk_enable(&uart1_clk); |
1301 | #endif | 1307 | #endif |
1302 | clk_enable(&spi_clk); | 1308 | clk_enable(&spi_clk); |
1303 | 1309 | ||
1304 | clk_enable(&mmcsd_clk); | 1310 | clk_enable(&mmcsd_clk); |
1305 | 1311 | ||
1306 | } | 1312 | } |
1307 | EXPORT_SYMBOL(u300_clock_primecells); | 1313 | EXPORT_SYMBOL(u300_clock_primecells); |
1308 | 1314 | ||
1309 | void u300_unclock_primecells(void) | 1315 | void u300_unclock_primecells(void) |
1310 | { | 1316 | { |
1311 | 1317 | ||
1312 | clk_disable(&intcon_clk); | 1318 | clk_disable(&intcon_clk); |
1313 | clk_disable(&uart_clk); | 1319 | clk_disable(&uart_clk); |
1314 | #ifdef CONFIG_MACH_U300_BS335 | 1320 | #ifdef CONFIG_MACH_U300_BS335 |
1315 | clk_disable(&uart1_clk); | 1321 | clk_disable(&uart1_clk); |
1316 | #endif | 1322 | #endif |
1317 | clk_disable(&spi_clk); | 1323 | clk_disable(&spi_clk); |
1318 | clk_disable(&mmcsd_clk); | 1324 | clk_disable(&mmcsd_clk); |
1319 | 1325 | ||
1320 | } | 1326 | } |
1321 | EXPORT_SYMBOL(u300_unclock_primecells); | 1327 | EXPORT_SYMBOL(u300_unclock_primecells); |
1322 | 1328 | ||
1323 | /* | 1329 | /* |
1324 | * The interrupt controller is enabled before the clock API is registered. | 1330 | * The interrupt controller is enabled before the clock API is registered. |
1325 | */ | 1331 | */ |
1326 | void u300_enable_intcon_clock(void) | 1332 | void u300_enable_intcon_clock(void) |
1327 | { | 1333 | { |
1328 | clk_enable(&intcon_clk); | 1334 | clk_enable(&intcon_clk); |
1329 | } | 1335 | } |
1330 | EXPORT_SYMBOL(u300_enable_intcon_clock); | 1336 | EXPORT_SYMBOL(u300_enable_intcon_clock); |
1331 | 1337 | ||
1332 | /* | 1338 | /* |
1333 | * The timer is enabled before the clock API is registered. | 1339 | * The timer is enabled before the clock API is registered. |
1334 | */ | 1340 | */ |
1335 | void u300_enable_timer_clock(void) | 1341 | void u300_enable_timer_clock(void) |
1336 | { | 1342 | { |
1337 | clk_enable(&app_timer_clk); | 1343 | clk_enable(&app_timer_clk); |
1338 | } | 1344 | } |
1339 | EXPORT_SYMBOL(u300_enable_timer_clock); | 1345 | EXPORT_SYMBOL(u300_enable_timer_clock); |
1340 | 1346 | ||
1341 | #if (defined(CONFIG_DEBUG_FS) && defined(CONFIG_U300_DEBUG)) | 1347 | #if (defined(CONFIG_DEBUG_FS) && defined(CONFIG_U300_DEBUG)) |
1342 | /* | 1348 | /* |
1343 | * The following makes it possible to view the status (especially | 1349 | * The following makes it possible to view the status (especially |
1344 | * reference count and reset status) for the clocks in the platform | 1350 | * reference count and reset status) for the clocks in the platform |
1345 | * by looking into the special file <debugfs>/u300_clocks | 1351 | * by looking into the special file <debugfs>/u300_clocks |
1346 | */ | 1352 | */ |
1347 | 1353 | ||
1348 | /* A list of all clocks in the platform */ | 1354 | /* A list of all clocks in the platform */ |
1349 | static struct clk *clks[] = { | 1355 | static struct clk *clks[] = { |
1350 | /* Top node clock for the AMBA bus */ | 1356 | /* Top node clock for the AMBA bus */ |
1351 | &amba_clk, | 1357 | &amba_clk, |
1352 | /* Connected directly to the AMBA bus */ | 1358 | /* Connected directly to the AMBA bus */ |
1353 | &cpu_clk, | 1359 | &cpu_clk, |
1354 | &nandif_clk, | 1360 | &nandif_clk, |
1355 | &semi_clk, | 1361 | &semi_clk, |
1356 | #ifdef CONFIG_MACH_U300_BS335 | 1362 | #ifdef CONFIG_MACH_U300_BS335 |
1357 | &isp_clk, | 1363 | &isp_clk, |
1358 | &cds_clk, | 1364 | &cds_clk, |
1359 | #endif | 1365 | #endif |
1360 | &dma_clk, | 1366 | &dma_clk, |
1361 | &aaif_clk, | 1367 | &aaif_clk, |
1362 | &apex_clk, | 1368 | &apex_clk, |
1363 | &video_enc_clk, | 1369 | &video_enc_clk, |
1364 | &xgam_clk, | 1370 | &xgam_clk, |
1365 | &ahb_clk, | 1371 | &ahb_clk, |
1366 | 1372 | ||
1367 | /* AHB bridge clocks */ | 1373 | /* AHB bridge clocks */ |
1368 | &ahb_subsys_clk, | 1374 | &ahb_subsys_clk, |
1369 | &intcon_clk, | 1375 | &intcon_clk, |
1370 | &mspro_clk, | 1376 | &mspro_clk, |
1371 | &emif_clk, | 1377 | &emif_clk, |
1372 | /* FAST bridge clocks */ | 1378 | /* FAST bridge clocks */ |
1373 | &fast_clk, | 1379 | &fast_clk, |
1374 | &mmcsd_clk, | 1380 | &mmcsd_clk, |
1375 | &i2s0_clk, | 1381 | &i2s0_clk, |
1376 | &i2s1_clk, | 1382 | &i2s1_clk, |
1377 | &i2c0_clk, | 1383 | &i2c0_clk, |
1378 | &i2c1_clk, | 1384 | &i2c1_clk, |
1379 | &spi_clk, | 1385 | &spi_clk, |
1380 | #ifdef CONFIG_MACH_U300_BS335 | 1386 | #ifdef CONFIG_MACH_U300_BS335 |
1381 | &uart1_clk, | 1387 | &uart1_clk, |
1382 | #endif | 1388 | #endif |
1383 | /* SLOW bridge clocks */ | 1389 | /* SLOW bridge clocks */ |
1384 | &slow_clk, | 1390 | &slow_clk, |
1385 | &wdog_clk, | 1391 | &wdog_clk, |
1386 | &uart_clk, | 1392 | &uart_clk, |
1387 | &app_timer_clk, | 1393 | &app_timer_clk, |
1388 | &keypad_clk, | 1394 | &keypad_clk, |
1389 | &gpio_clk, | 1395 | &gpio_clk, |
1390 | &rtc_clk, | 1396 | &rtc_clk, |
1391 | &bustr_clk, | 1397 | &bustr_clk, |
1392 | &evhist_clk, | 1398 | &evhist_clk, |
1393 | &timer_clk, | 1399 | &timer_clk, |
1394 | #ifdef CONFIG_MACH_U300_BS335 | 1400 | #ifdef CONFIG_MACH_U300_BS335 |
1395 | &ppm_clk, | 1401 | &ppm_clk, |
1396 | #endif | 1402 | #endif |
1397 | }; | 1403 | }; |
1398 | 1404 | ||
1399 | static int u300_clocks_show(struct seq_file *s, void *data) | 1405 | static int u300_clocks_show(struct seq_file *s, void *data) |
1400 | { | 1406 | { |
1401 | struct clk *clk; | 1407 | struct clk *clk; |
1402 | int i; | 1408 | int i; |
1403 | 1409 | ||
1404 | seq_printf(s, "CLOCK DEVICE RESET STATE\t" \ | 1410 | seq_printf(s, "CLOCK DEVICE RESET STATE\t" \ |
1405 | "ACTIVE\tUSERS\tHW CTRL FREQ\n"); | 1411 | "ACTIVE\tUSERS\tHW CTRL FREQ\n"); |
1406 | seq_printf(s, "---------------------------------------------" \ | 1412 | seq_printf(s, "---------------------------------------------" \ |
1407 | "-----------------------------------------\n"); | 1413 | "-----------------------------------------\n"); |
1408 | for (i = 0; i < ARRAY_SIZE(clks); i++) { | 1414 | for (i = 0; i < ARRAY_SIZE(clks); i++) { |
1409 | clk = clks[i]; | 1415 | clk = clks[i]; |
1410 | if (clk != ERR_PTR(-ENOENT)) { | 1416 | if (clk != ERR_PTR(-ENOENT)) { |
1411 | /* Format clock and device name nicely */ | 1417 | /* Format clock and device name nicely */ |
1412 | char cdp[33]; | 1418 | char cdp[33]; |
1413 | int chars; | 1419 | int chars; |
1414 | 1420 | ||
1415 | chars = snprintf(&cdp[0], 17, "%s", clk->name); | 1421 | chars = snprintf(&cdp[0], 17, "%s", clk->name); |
1416 | while (chars < 16) { | 1422 | while (chars < 16) { |
1417 | cdp[chars] = ' '; | 1423 | cdp[chars] = ' '; |
1418 | chars++; | 1424 | chars++; |
1419 | } | 1425 | } |
1420 | chars = snprintf(&cdp[16], 17, "%s", clk->dev ? | 1426 | chars = snprintf(&cdp[16], 17, "%s", clk->dev ? |
1421 | dev_name(clk->dev) : "N/A"); | 1427 | dev_name(clk->dev) : "N/A"); |
1422 | while (chars < 16) { | 1428 | while (chars < 16) { |
1423 | cdp[chars+16] = ' '; | 1429 | cdp[chars+16] = ' '; |
1424 | chars++; | 1430 | chars++; |
1425 | } | 1431 | } |
1426 | cdp[32] = '\0'; | 1432 | cdp[32] = '\0'; |
1427 | if (clk->get_rate) | 1433 | if (clk->get_rate) |
1428 | seq_printf(s, | 1434 | seq_printf(s, |
1429 | "%s%s\t%s\t%d\t%s\t%lu Hz\n", | 1435 | "%s%s\t%s\t%d\t%s\t%lu Hz\n", |
1430 | &cdp[0], | 1436 | &cdp[0], |
1431 | clk->reset ? | 1437 | clk->reset ? |
1432 | "ASSERTED" : "RELEASED", | 1438 | "ASSERTED" : "RELEASED", |
1433 | clk->usecount ? "ON" : "OFF", | 1439 | clk->usecount ? "ON" : "OFF", |
1434 | clk->usecount, | 1440 | clk->usecount, |
1435 | clk->hw_ctrld ? "YES" : "NO ", | 1441 | clk->hw_ctrld ? "YES" : "NO ", |
1436 | clk->get_rate(clk)); | 1442 | clk->get_rate(clk)); |
1437 | else | 1443 | else |
1438 | seq_printf(s, | 1444 | seq_printf(s, |
1439 | "%s%s\t%s\t%d\t%s\t" \ | 1445 | "%s%s\t%s\t%d\t%s\t" \ |
1440 | "(unknown rate)\n", | 1446 | "(unknown rate)\n", |
1441 | &cdp[0], | 1447 | &cdp[0], |
1442 | clk->reset ? | 1448 | clk->reset ? |
1443 | "ASSERTED" : "RELEASED", | 1449 | "ASSERTED" : "RELEASED", |
1444 | clk->usecount ? "ON" : "OFF", | 1450 | clk->usecount ? "ON" : "OFF", |
1445 | clk->usecount, | 1451 | clk->usecount, |
1446 | clk->hw_ctrld ? "YES" : "NO "); | 1452 | clk->hw_ctrld ? "YES" : "NO "); |
1447 | } | 1453 | } |
1448 | } | 1454 | } |
1449 | return 0; | 1455 | return 0; |
1450 | } | 1456 | } |
1451 | 1457 | ||
1452 | static int u300_clocks_open(struct inode *inode, struct file *file) | 1458 | static int u300_clocks_open(struct inode *inode, struct file *file) |
1453 | { | 1459 | { |
1454 | return single_open(file, u300_clocks_show, NULL); | 1460 | return single_open(file, u300_clocks_show, NULL); |
1455 | } | 1461 | } |
1456 | 1462 | ||
1457 | static const struct file_operations u300_clocks_operations = { | 1463 | static const struct file_operations u300_clocks_operations = { |
1458 | .open = u300_clocks_open, | 1464 | .open = u300_clocks_open, |
1459 | .read = seq_read, | 1465 | .read = seq_read, |
1460 | .llseek = seq_lseek, | 1466 | .llseek = seq_lseek, |
1461 | .release = single_release, | 1467 | .release = single_release, |
1462 | }; | 1468 | }; |
1463 | 1469 | ||
1464 | static int __init init_clk_read_debugfs(void) | 1470 | static int __init init_clk_read_debugfs(void) |
1465 | { | 1471 | { |
1466 | /* Expose a simple debugfs interface to view all clocks */ | 1472 | /* Expose a simple debugfs interface to view all clocks */ |
1467 | (void) debugfs_create_file("u300_clocks", S_IFREG | S_IRUGO, | 1473 | (void) debugfs_create_file("u300_clocks", S_IFREG | S_IRUGO, |
1468 | NULL, NULL, | 1474 | NULL, NULL, |
1469 | &u300_clocks_operations); | 1475 | &u300_clocks_operations); |
1470 | return 0; | 1476 | return 0; |
1471 | } | 1477 | } |
1472 | /* | 1478 | /* |
1473 | * This needs to come in after the core_initcall() for the | 1479 | * This needs to come in after the core_initcall() for the |
1474 | * overall clocks, because debugfs is not available until | 1480 | * overall clocks, because debugfs is not available until |
1475 | * the subsystems come up. | 1481 | * the subsystems come up. |
1476 | */ | 1482 | */ |
1477 | module_init(init_clk_read_debugfs); | 1483 | module_init(init_clk_read_debugfs); |
1478 | #endif | 1484 | #endif |
1479 | 1485 | ||
1480 | static int __init u300_clock_init(void) | 1486 | static int __init u300_clock_init(void) |
1481 | { | 1487 | { |
1482 | u16 val; | 1488 | u16 val; |
1483 | 1489 | ||
1484 | /* | 1490 | /* |
1485 | * FIXME: shall all this powermanagement stuff really live here??? | 1491 | * FIXME: shall all this powermanagement stuff really live here??? |
1486 | */ | 1492 | */ |
1487 | 1493 | ||
1488 | /* Set system to run at PLL208, max performance, a known state. */ | 1494 | /* Set system to run at PLL208, max performance, a known state. */ |
1489 | val = readw(U300_SYSCON_VBASE + U300_SYSCON_CCR); | 1495 | val = readw(U300_SYSCON_VBASE + U300_SYSCON_CCR); |
1490 | val &= ~U300_SYSCON_CCR_CLKING_PERFORMANCE_MASK; | 1496 | val &= ~U300_SYSCON_CCR_CLKING_PERFORMANCE_MASK; |
1491 | writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR); | 1497 | writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR); |
1492 | /* Wait for the PLL208 to lock if not locked in yet */ | 1498 | /* Wait for the PLL208 to lock if not locked in yet */ |
1493 | while (!(readw(U300_SYSCON_VBASE + U300_SYSCON_CSR) & | 1499 | while (!(readw(U300_SYSCON_VBASE + U300_SYSCON_CSR) & |
1494 | U300_SYSCON_CSR_PLL208_LOCK_IND)); | 1500 | U300_SYSCON_CSR_PLL208_LOCK_IND)); |
1495 | 1501 | ||
1496 | /* Power management enable */ | 1502 | /* Power management enable */ |
1497 | val = readw(U300_SYSCON_VBASE + U300_SYSCON_PMCR); | 1503 | val = readw(U300_SYSCON_VBASE + U300_SYSCON_PMCR); |
1498 | val |= U300_SYSCON_PMCR_PWR_MGNT_ENABLE; | 1504 | val |= U300_SYSCON_PMCR_PWR_MGNT_ENABLE; |
1499 | writew(val, U300_SYSCON_VBASE + U300_SYSCON_PMCR); | 1505 | writew(val, U300_SYSCON_VBASE + U300_SYSCON_PMCR); |
1500 | 1506 | ||
1501 | clk_register(); | 1507 | clk_register(); |
1502 | 1508 | ||
1503 | /* | 1509 | /* |
1504 | * Some of these may be on when we boot the system so make sure they | 1510 | * Some of these may be on when we boot the system so make sure they |
1505 | * are turned OFF. | 1511 | * are turned OFF. |
1506 | */ | 1512 | */ |
1507 | syscon_block_reset_enable(&timer_clk); | 1513 | syscon_block_reset_enable(&timer_clk); |
1508 | timer_clk.disable(&timer_clk); | 1514 | timer_clk.disable(&timer_clk); |
1509 | 1515 | ||
1510 | /* | 1516 | /* |
1511 | * These shall be turned on by default when we boot the system | 1517 | * These shall be turned on by default when we boot the system |
1512 | * so make sure they are ON. (Adding CPU here is a bit too much.) | 1518 | * so make sure they are ON. (Adding CPU here is a bit too much.) |
1513 | * These clocks will be claimed by drivers later. | 1519 | * These clocks will be claimed by drivers later. |
1514 | */ | 1520 | */ |
1515 | syscon_block_reset_disable(&semi_clk); | 1521 | syscon_block_reset_disable(&semi_clk); |
1516 | syscon_block_reset_disable(&emif_clk); | 1522 | syscon_block_reset_disable(&emif_clk); |
1517 | semi_clk.enable(&semi_clk); | 1523 | semi_clk.enable(&semi_clk); |
1518 | emif_clk.enable(&emif_clk); | 1524 | emif_clk.enable(&emif_clk); |
1519 | 1525 | ||
1520 | return 0; | 1526 | return 0; |
1521 | } | 1527 | } |
1522 | /* initialize clocking early to be available later in the boot */ | 1528 | /* initialize clocking early to be available later in the boot */ |
1523 | core_initcall(u300_clock_init); | 1529 | core_initcall(u300_clock_init); |
1524 | 1530 |
arch/arm/mach-ux500/clock.c
1 | /* | 1 | /* |
2 | * Copyright (C) 2009 ST-Ericsson | 2 | * Copyright (C) 2009 ST-Ericsson |
3 | * Copyright (C) 2009 STMicroelectronics | 3 | * Copyright (C) 2009 STMicroelectronics |
4 | * | 4 | * |
5 | * This program is free software; you can redistribute it and/or modify | 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 | 6 | * it under the terms of the GNU General Public License version 2 as |
7 | * published by the Free Software Foundation. | 7 | * published by the Free Software Foundation. |
8 | */ | 8 | */ |
9 | #include <linux/module.h> | 9 | #include <linux/module.h> |
10 | #include <linux/kernel.h> | 10 | #include <linux/kernel.h> |
11 | #include <linux/list.h> | 11 | #include <linux/list.h> |
12 | #include <linux/errno.h> | 12 | #include <linux/errno.h> |
13 | #include <linux/err.h> | 13 | #include <linux/err.h> |
14 | #include <linux/clk.h> | 14 | #include <linux/clk.h> |
15 | #include <linux/io.h> | 15 | #include <linux/io.h> |
16 | 16 | ||
17 | #include <asm/clkdev.h> | 17 | #include <asm/clkdev.h> |
18 | 18 | ||
19 | #include <plat/mtu.h> | 19 | #include <plat/mtu.h> |
20 | #include <mach/hardware.h> | 20 | #include <mach/hardware.h> |
21 | #include "clock.h" | 21 | #include "clock.h" |
22 | 22 | ||
23 | #define PRCC_PCKEN 0x00 | 23 | #define PRCC_PCKEN 0x00 |
24 | #define PRCC_PCKDIS 0x04 | 24 | #define PRCC_PCKDIS 0x04 |
25 | #define PRCC_KCKEN 0x08 | 25 | #define PRCC_KCKEN 0x08 |
26 | #define PRCC_KCKDIS 0x0C | 26 | #define PRCC_KCKDIS 0x0C |
27 | 27 | ||
28 | #define PRCM_YYCLKEN0_MGT_SET 0x510 | 28 | #define PRCM_YYCLKEN0_MGT_SET 0x510 |
29 | #define PRCM_YYCLKEN1_MGT_SET 0x514 | 29 | #define PRCM_YYCLKEN1_MGT_SET 0x514 |
30 | #define PRCM_YYCLKEN0_MGT_CLR 0x518 | 30 | #define PRCM_YYCLKEN0_MGT_CLR 0x518 |
31 | #define PRCM_YYCLKEN1_MGT_CLR 0x51C | 31 | #define PRCM_YYCLKEN1_MGT_CLR 0x51C |
32 | #define PRCM_YYCLKEN0_MGT_VAL 0x520 | 32 | #define PRCM_YYCLKEN0_MGT_VAL 0x520 |
33 | #define PRCM_YYCLKEN1_MGT_VAL 0x524 | 33 | #define PRCM_YYCLKEN1_MGT_VAL 0x524 |
34 | 34 | ||
35 | #define PRCM_SVAMMDSPCLK_MGT 0x008 | 35 | #define PRCM_SVAMMDSPCLK_MGT 0x008 |
36 | #define PRCM_SIAMMDSPCLK_MGT 0x00C | 36 | #define PRCM_SIAMMDSPCLK_MGT 0x00C |
37 | #define PRCM_SGACLK_MGT 0x014 | 37 | #define PRCM_SGACLK_MGT 0x014 |
38 | #define PRCM_UARTCLK_MGT 0x018 | 38 | #define PRCM_UARTCLK_MGT 0x018 |
39 | #define PRCM_MSP02CLK_MGT 0x01C | 39 | #define PRCM_MSP02CLK_MGT 0x01C |
40 | #define PRCM_MSP1CLK_MGT 0x288 | 40 | #define PRCM_MSP1CLK_MGT 0x288 |
41 | #define PRCM_I2CCLK_MGT 0x020 | 41 | #define PRCM_I2CCLK_MGT 0x020 |
42 | #define PRCM_SDMMCCLK_MGT 0x024 | 42 | #define PRCM_SDMMCCLK_MGT 0x024 |
43 | #define PRCM_SLIMCLK_MGT 0x028 | 43 | #define PRCM_SLIMCLK_MGT 0x028 |
44 | #define PRCM_PER1CLK_MGT 0x02C | 44 | #define PRCM_PER1CLK_MGT 0x02C |
45 | #define PRCM_PER2CLK_MGT 0x030 | 45 | #define PRCM_PER2CLK_MGT 0x030 |
46 | #define PRCM_PER3CLK_MGT 0x034 | 46 | #define PRCM_PER3CLK_MGT 0x034 |
47 | #define PRCM_PER5CLK_MGT 0x038 | 47 | #define PRCM_PER5CLK_MGT 0x038 |
48 | #define PRCM_PER6CLK_MGT 0x03C | 48 | #define PRCM_PER6CLK_MGT 0x03C |
49 | #define PRCM_PER7CLK_MGT 0x040 | 49 | #define PRCM_PER7CLK_MGT 0x040 |
50 | #define PRCM_LCDCLK_MGT 0x044 | 50 | #define PRCM_LCDCLK_MGT 0x044 |
51 | #define PRCM_BMLCLK_MGT 0x04C | 51 | #define PRCM_BMLCLK_MGT 0x04C |
52 | #define PRCM_HSITXCLK_MGT 0x050 | 52 | #define PRCM_HSITXCLK_MGT 0x050 |
53 | #define PRCM_HSIRXCLK_MGT 0x054 | 53 | #define PRCM_HSIRXCLK_MGT 0x054 |
54 | #define PRCM_HDMICLK_MGT 0x058 | 54 | #define PRCM_HDMICLK_MGT 0x058 |
55 | #define PRCM_APEATCLK_MGT 0x05C | 55 | #define PRCM_APEATCLK_MGT 0x05C |
56 | #define PRCM_APETRACECLK_MGT 0x060 | 56 | #define PRCM_APETRACECLK_MGT 0x060 |
57 | #define PRCM_MCDECLK_MGT 0x064 | 57 | #define PRCM_MCDECLK_MGT 0x064 |
58 | #define PRCM_IPI2CCLK_MGT 0x068 | 58 | #define PRCM_IPI2CCLK_MGT 0x068 |
59 | #define PRCM_DSIALTCLK_MGT 0x06C | 59 | #define PRCM_DSIALTCLK_MGT 0x06C |
60 | #define PRCM_DMACLK_MGT 0x074 | 60 | #define PRCM_DMACLK_MGT 0x074 |
61 | #define PRCM_B2R2CLK_MGT 0x078 | 61 | #define PRCM_B2R2CLK_MGT 0x078 |
62 | #define PRCM_TVCLK_MGT 0x07C | 62 | #define PRCM_TVCLK_MGT 0x07C |
63 | #define PRCM_TCR 0x1C8 | 63 | #define PRCM_TCR 0x1C8 |
64 | #define PRCM_TCR_STOPPED (1 << 16) | 64 | #define PRCM_TCR_STOPPED (1 << 16) |
65 | #define PRCM_TCR_DOZE_MODE (1 << 17) | 65 | #define PRCM_TCR_DOZE_MODE (1 << 17) |
66 | #define PRCM_UNIPROCLK_MGT 0x278 | 66 | #define PRCM_UNIPROCLK_MGT 0x278 |
67 | #define PRCM_SSPCLK_MGT 0x280 | 67 | #define PRCM_SSPCLK_MGT 0x280 |
68 | #define PRCM_RNGCLK_MGT 0x284 | 68 | #define PRCM_RNGCLK_MGT 0x284 |
69 | #define PRCM_UICCCLK_MGT 0x27C | 69 | #define PRCM_UICCCLK_MGT 0x27C |
70 | 70 | ||
71 | #define PRCM_MGT_ENABLE (1 << 8) | 71 | #define PRCM_MGT_ENABLE (1 << 8) |
72 | 72 | ||
73 | static DEFINE_SPINLOCK(clocks_lock); | 73 | static DEFINE_SPINLOCK(clocks_lock); |
74 | 74 | ||
75 | static void __clk_enable(struct clk *clk) | 75 | static void __clk_enable(struct clk *clk) |
76 | { | 76 | { |
77 | if (clk->enabled++ == 0) { | 77 | if (clk->enabled++ == 0) { |
78 | if (clk->parent_cluster) | 78 | if (clk->parent_cluster) |
79 | __clk_enable(clk->parent_cluster); | 79 | __clk_enable(clk->parent_cluster); |
80 | 80 | ||
81 | if (clk->parent_periph) | 81 | if (clk->parent_periph) |
82 | __clk_enable(clk->parent_periph); | 82 | __clk_enable(clk->parent_periph); |
83 | 83 | ||
84 | if (clk->ops && clk->ops->enable) | 84 | if (clk->ops && clk->ops->enable) |
85 | clk->ops->enable(clk); | 85 | clk->ops->enable(clk); |
86 | } | 86 | } |
87 | } | 87 | } |
88 | 88 | ||
89 | int clk_enable(struct clk *clk) | 89 | int clk_enable(struct clk *clk) |
90 | { | 90 | { |
91 | unsigned long flags; | 91 | unsigned long flags; |
92 | 92 | ||
93 | spin_lock_irqsave(&clocks_lock, flags); | 93 | spin_lock_irqsave(&clocks_lock, flags); |
94 | __clk_enable(clk); | 94 | __clk_enable(clk); |
95 | spin_unlock_irqrestore(&clocks_lock, flags); | 95 | spin_unlock_irqrestore(&clocks_lock, flags); |
96 | 96 | ||
97 | return 0; | 97 | return 0; |
98 | } | 98 | } |
99 | EXPORT_SYMBOL(clk_enable); | 99 | EXPORT_SYMBOL(clk_enable); |
100 | 100 | ||
101 | static void __clk_disable(struct clk *clk) | 101 | static void __clk_disable(struct clk *clk) |
102 | { | 102 | { |
103 | if (--clk->enabled == 0) { | 103 | if (--clk->enabled == 0) { |
104 | if (clk->ops && clk->ops->disable) | 104 | if (clk->ops && clk->ops->disable) |
105 | clk->ops->disable(clk); | 105 | clk->ops->disable(clk); |
106 | 106 | ||
107 | if (clk->parent_periph) | 107 | if (clk->parent_periph) |
108 | __clk_disable(clk->parent_periph); | 108 | __clk_disable(clk->parent_periph); |
109 | 109 | ||
110 | if (clk->parent_cluster) | 110 | if (clk->parent_cluster) |
111 | __clk_disable(clk->parent_cluster); | 111 | __clk_disable(clk->parent_cluster); |
112 | } | 112 | } |
113 | } | 113 | } |
114 | 114 | ||
115 | void clk_disable(struct clk *clk) | 115 | void clk_disable(struct clk *clk) |
116 | { | 116 | { |
117 | unsigned long flags; | 117 | unsigned long flags; |
118 | 118 | ||
119 | WARN_ON(!clk->enabled); | 119 | WARN_ON(!clk->enabled); |
120 | 120 | ||
121 | spin_lock_irqsave(&clocks_lock, flags); | 121 | spin_lock_irqsave(&clocks_lock, flags); |
122 | __clk_disable(clk); | 122 | __clk_disable(clk); |
123 | spin_unlock_irqrestore(&clocks_lock, flags); | 123 | spin_unlock_irqrestore(&clocks_lock, flags); |
124 | } | 124 | } |
125 | EXPORT_SYMBOL(clk_disable); | 125 | EXPORT_SYMBOL(clk_disable); |
126 | 126 | ||
127 | /* | 127 | /* |
128 | * The MTU has a separate, rather complex muxing setup | 128 | * The MTU has a separate, rather complex muxing setup |
129 | * with alternative parents (peripheral cluster or | 129 | * with alternative parents (peripheral cluster or |
130 | * ULP or fixed 32768 Hz) depending on settings | 130 | * ULP or fixed 32768 Hz) depending on settings |
131 | */ | 131 | */ |
132 | static unsigned long clk_mtu_get_rate(struct clk *clk) | 132 | static unsigned long clk_mtu_get_rate(struct clk *clk) |
133 | { | 133 | { |
134 | void __iomem *addr = __io_address(UX500_PRCMU_BASE) | 134 | void __iomem *addr = __io_address(UX500_PRCMU_BASE) |
135 | + PRCM_TCR; | 135 | + PRCM_TCR; |
136 | u32 tcr = readl(addr); | 136 | u32 tcr = readl(addr); |
137 | int mtu = (int) clk->data; | 137 | int mtu = (int) clk->data; |
138 | /* | 138 | /* |
139 | * One of these is selected eventually | 139 | * One of these is selected eventually |
140 | * TODO: Replace the constant with a reference | 140 | * TODO: Replace the constant with a reference |
141 | * to the ULP source once this is modeled. | 141 | * to the ULP source once this is modeled. |
142 | */ | 142 | */ |
143 | unsigned long clk32k = 32768; | 143 | unsigned long clk32k = 32768; |
144 | unsigned long mturate; | 144 | unsigned long mturate; |
145 | unsigned long retclk; | 145 | unsigned long retclk; |
146 | 146 | ||
147 | /* Get the rate from the parent as a default */ | 147 | /* Get the rate from the parent as a default */ |
148 | if (clk->parent_periph) | 148 | if (clk->parent_periph) |
149 | mturate = clk_get_rate(clk->parent_periph); | 149 | mturate = clk_get_rate(clk->parent_periph); |
150 | else if (clk->parent_cluster) | 150 | else if (clk->parent_cluster) |
151 | mturate = clk_get_rate(clk->parent_cluster); | 151 | mturate = clk_get_rate(clk->parent_cluster); |
152 | else | 152 | else |
153 | /* We need to be connected SOMEWHERE */ | 153 | /* We need to be connected SOMEWHERE */ |
154 | BUG(); | 154 | BUG(); |
155 | 155 | ||
156 | /* | 156 | /* |
157 | * Are we in doze mode? | 157 | * Are we in doze mode? |
158 | * In this mode the parent peripheral or the fixed 32768 Hz | 158 | * In this mode the parent peripheral or the fixed 32768 Hz |
159 | * clock is fed into the block. | 159 | * clock is fed into the block. |
160 | */ | 160 | */ |
161 | if (!(tcr & PRCM_TCR_DOZE_MODE)) { | 161 | if (!(tcr & PRCM_TCR_DOZE_MODE)) { |
162 | /* | 162 | /* |
163 | * Here we're using the clock input from the APE ULP | 163 | * Here we're using the clock input from the APE ULP |
164 | * clock domain. But first: are the timers stopped? | 164 | * clock domain. But first: are the timers stopped? |
165 | */ | 165 | */ |
166 | if (tcr & PRCM_TCR_STOPPED) { | 166 | if (tcr & PRCM_TCR_STOPPED) { |
167 | clk32k = 0; | 167 | clk32k = 0; |
168 | mturate = 0; | 168 | mturate = 0; |
169 | } else { | 169 | } else { |
170 | /* Else default mode: 0 and 2.4 MHz */ | 170 | /* Else default mode: 0 and 2.4 MHz */ |
171 | clk32k = 0; | 171 | clk32k = 0; |
172 | if (cpu_is_u5500()) | 172 | if (cpu_is_u5500()) |
173 | /* DB5500 divides by 8 */ | 173 | /* DB5500 divides by 8 */ |
174 | mturate /= 8; | 174 | mturate /= 8; |
175 | else if (cpu_is_u8500ed()) { | 175 | else if (cpu_is_u8500ed()) { |
176 | /* | 176 | /* |
177 | * This clocking setting must not be used | 177 | * This clocking setting must not be used |
178 | * in the ED chip, it is simply not | 178 | * in the ED chip, it is simply not |
179 | * connected anywhere! | 179 | * connected anywhere! |
180 | */ | 180 | */ |
181 | mturate = 0; | 181 | mturate = 0; |
182 | BUG(); | 182 | BUG(); |
183 | } else | 183 | } else |
184 | /* | 184 | /* |
185 | * In this mode the ulp38m4 clock is divided | 185 | * In this mode the ulp38m4 clock is divided |
186 | * by a factor 16, on the DB8500 typically | 186 | * by a factor 16, on the DB8500 typically |
187 | * 38400000 / 16 ~ 2.4 MHz. | 187 | * 38400000 / 16 ~ 2.4 MHz. |
188 | * TODO: Replace the constant with a reference | 188 | * TODO: Replace the constant with a reference |
189 | * to the ULP source once this is modeled. | 189 | * to the ULP source once this is modeled. |
190 | */ | 190 | */ |
191 | mturate = 38400000 / 16; | 191 | mturate = 38400000 / 16; |
192 | } | 192 | } |
193 | } | 193 | } |
194 | 194 | ||
195 | /* Return the clock selected for this MTU */ | 195 | /* Return the clock selected for this MTU */ |
196 | if (tcr & (1 << mtu)) | 196 | if (tcr & (1 << mtu)) |
197 | retclk = clk32k; | 197 | retclk = clk32k; |
198 | else | 198 | else |
199 | retclk = mturate; | 199 | retclk = mturate; |
200 | 200 | ||
201 | pr_info("MTU%d clock rate: %lu Hz\n", mtu, retclk); | 201 | pr_info("MTU%d clock rate: %lu Hz\n", mtu, retclk); |
202 | return retclk; | 202 | return retclk; |
203 | } | 203 | } |
204 | 204 | ||
205 | unsigned long clk_get_rate(struct clk *clk) | 205 | unsigned long clk_get_rate(struct clk *clk) |
206 | { | 206 | { |
207 | unsigned long rate; | 207 | unsigned long rate; |
208 | 208 | ||
209 | /* | 209 | /* |
210 | * If there is a custom getrate callback for this clock, | 210 | * If there is a custom getrate callback for this clock, |
211 | * it will take precedence. | 211 | * it will take precedence. |
212 | */ | 212 | */ |
213 | if (clk->get_rate) | 213 | if (clk->get_rate) |
214 | return clk->get_rate(clk); | 214 | return clk->get_rate(clk); |
215 | 215 | ||
216 | if (clk->ops && clk->ops->get_rate) | 216 | if (clk->ops && clk->ops->get_rate) |
217 | return clk->ops->get_rate(clk); | 217 | return clk->ops->get_rate(clk); |
218 | 218 | ||
219 | rate = clk->rate; | 219 | rate = clk->rate; |
220 | if (!rate) { | 220 | if (!rate) { |
221 | if (clk->parent_periph) | 221 | if (clk->parent_periph) |
222 | rate = clk_get_rate(clk->parent_periph); | 222 | rate = clk_get_rate(clk->parent_periph); |
223 | else if (clk->parent_cluster) | 223 | else if (clk->parent_cluster) |
224 | rate = clk_get_rate(clk->parent_cluster); | 224 | rate = clk_get_rate(clk->parent_cluster); |
225 | } | 225 | } |
226 | 226 | ||
227 | return rate; | 227 | return rate; |
228 | } | 228 | } |
229 | EXPORT_SYMBOL(clk_get_rate); | 229 | EXPORT_SYMBOL(clk_get_rate); |
230 | 230 | ||
231 | long clk_round_rate(struct clk *clk, unsigned long rate) | 231 | long clk_round_rate(struct clk *clk, unsigned long rate) |
232 | { | 232 | { |
233 | /*TODO*/ | 233 | /*TODO*/ |
234 | return rate; | 234 | return rate; |
235 | } | 235 | } |
236 | EXPORT_SYMBOL(clk_round_rate); | 236 | EXPORT_SYMBOL(clk_round_rate); |
237 | 237 | ||
238 | int clk_set_rate(struct clk *clk, unsigned long rate) | 238 | int clk_set_rate(struct clk *clk, unsigned long rate) |
239 | { | 239 | { |
240 | clk->rate = rate; | 240 | clk->rate = rate; |
241 | return 0; | 241 | return 0; |
242 | } | 242 | } |
243 | EXPORT_SYMBOL(clk_set_rate); | 243 | EXPORT_SYMBOL(clk_set_rate); |
244 | 244 | ||
245 | static void clk_prcmu_enable(struct clk *clk) | 245 | static void clk_prcmu_enable(struct clk *clk) |
246 | { | 246 | { |
247 | void __iomem *cg_set_reg = __io_address(U8500_PRCMU_BASE) | 247 | void __iomem *cg_set_reg = __io_address(U8500_PRCMU_BASE) |
248 | + PRCM_YYCLKEN0_MGT_SET + clk->prcmu_cg_off; | 248 | + PRCM_YYCLKEN0_MGT_SET + clk->prcmu_cg_off; |
249 | 249 | ||
250 | writel(1 << clk->prcmu_cg_bit, cg_set_reg); | 250 | writel(1 << clk->prcmu_cg_bit, cg_set_reg); |
251 | } | 251 | } |
252 | 252 | ||
253 | static void clk_prcmu_disable(struct clk *clk) | 253 | static void clk_prcmu_disable(struct clk *clk) |
254 | { | 254 | { |
255 | void __iomem *cg_clr_reg = __io_address(U8500_PRCMU_BASE) | 255 | void __iomem *cg_clr_reg = __io_address(U8500_PRCMU_BASE) |
256 | + PRCM_YYCLKEN0_MGT_CLR + clk->prcmu_cg_off; | 256 | + PRCM_YYCLKEN0_MGT_CLR + clk->prcmu_cg_off; |
257 | 257 | ||
258 | writel(1 << clk->prcmu_cg_bit, cg_clr_reg); | 258 | writel(1 << clk->prcmu_cg_bit, cg_clr_reg); |
259 | } | 259 | } |
260 | 260 | ||
261 | /* ED doesn't have the combined set/clr registers */ | 261 | /* ED doesn't have the combined set/clr registers */ |
262 | static void clk_prcmu_ed_enable(struct clk *clk) | 262 | static void clk_prcmu_ed_enable(struct clk *clk) |
263 | { | 263 | { |
264 | void __iomem *addr = __io_address(U8500_PRCMU_BASE) | 264 | void __iomem *addr = __io_address(U8500_PRCMU_BASE) |
265 | + clk->prcmu_cg_mgt; | 265 | + clk->prcmu_cg_mgt; |
266 | 266 | ||
267 | writel(readl(addr) | PRCM_MGT_ENABLE, addr); | 267 | writel(readl(addr) | PRCM_MGT_ENABLE, addr); |
268 | } | 268 | } |
269 | 269 | ||
270 | static void clk_prcmu_ed_disable(struct clk *clk) | 270 | static void clk_prcmu_ed_disable(struct clk *clk) |
271 | { | 271 | { |
272 | void __iomem *addr = __io_address(U8500_PRCMU_BASE) | 272 | void __iomem *addr = __io_address(U8500_PRCMU_BASE) |
273 | + clk->prcmu_cg_mgt; | 273 | + clk->prcmu_cg_mgt; |
274 | 274 | ||
275 | writel(readl(addr) & ~PRCM_MGT_ENABLE, addr); | 275 | writel(readl(addr) & ~PRCM_MGT_ENABLE, addr); |
276 | } | 276 | } |
277 | 277 | ||
278 | static struct clkops clk_prcmu_ops = { | 278 | static struct clkops clk_prcmu_ops = { |
279 | .enable = clk_prcmu_enable, | 279 | .enable = clk_prcmu_enable, |
280 | .disable = clk_prcmu_disable, | 280 | .disable = clk_prcmu_disable, |
281 | }; | 281 | }; |
282 | 282 | ||
283 | static unsigned int clkrst_base[] = { | 283 | static unsigned int clkrst_base[] = { |
284 | [1] = U8500_CLKRST1_BASE, | 284 | [1] = U8500_CLKRST1_BASE, |
285 | [2] = U8500_CLKRST2_BASE, | 285 | [2] = U8500_CLKRST2_BASE, |
286 | [3] = U8500_CLKRST3_BASE, | 286 | [3] = U8500_CLKRST3_BASE, |
287 | [5] = U8500_CLKRST5_BASE, | 287 | [5] = U8500_CLKRST5_BASE, |
288 | [6] = U8500_CLKRST6_BASE, | 288 | [6] = U8500_CLKRST6_BASE, |
289 | [7] = U8500_CLKRST7_BASE_ED, | 289 | [7] = U8500_CLKRST7_BASE_ED, |
290 | }; | 290 | }; |
291 | 291 | ||
292 | static void clk_prcc_enable(struct clk *clk) | 292 | static void clk_prcc_enable(struct clk *clk) |
293 | { | 293 | { |
294 | void __iomem *addr = __io_address(clkrst_base[clk->cluster]); | 294 | void __iomem *addr = __io_address(clkrst_base[clk->cluster]); |
295 | 295 | ||
296 | if (clk->prcc_kernel != -1) | 296 | if (clk->prcc_kernel != -1) |
297 | writel(1 << clk->prcc_kernel, addr + PRCC_KCKEN); | 297 | writel(1 << clk->prcc_kernel, addr + PRCC_KCKEN); |
298 | 298 | ||
299 | if (clk->prcc_bus != -1) | 299 | if (clk->prcc_bus != -1) |
300 | writel(1 << clk->prcc_bus, addr + PRCC_PCKEN); | 300 | writel(1 << clk->prcc_bus, addr + PRCC_PCKEN); |
301 | } | 301 | } |
302 | 302 | ||
303 | static void clk_prcc_disable(struct clk *clk) | 303 | static void clk_prcc_disable(struct clk *clk) |
304 | { | 304 | { |
305 | void __iomem *addr = __io_address(clkrst_base[clk->cluster]); | 305 | void __iomem *addr = __io_address(clkrst_base[clk->cluster]); |
306 | 306 | ||
307 | if (clk->prcc_bus != -1) | 307 | if (clk->prcc_bus != -1) |
308 | writel(1 << clk->prcc_bus, addr + PRCC_PCKDIS); | 308 | writel(1 << clk->prcc_bus, addr + PRCC_PCKDIS); |
309 | 309 | ||
310 | if (clk->prcc_kernel != -1) | 310 | if (clk->prcc_kernel != -1) |
311 | writel(1 << clk->prcc_kernel, addr + PRCC_KCKDIS); | 311 | writel(1 << clk->prcc_kernel, addr + PRCC_KCKDIS); |
312 | } | 312 | } |
313 | 313 | ||
314 | static struct clkops clk_prcc_ops = { | 314 | static struct clkops clk_prcc_ops = { |
315 | .enable = clk_prcc_enable, | 315 | .enable = clk_prcc_enable, |
316 | .disable = clk_prcc_disable, | 316 | .disable = clk_prcc_disable, |
317 | }; | 317 | }; |
318 | 318 | ||
319 | static struct clk clk_32khz = { | 319 | static struct clk clk_32khz = { |
320 | .rate = 32000, | 320 | .rate = 32000, |
321 | }; | 321 | }; |
322 | 322 | ||
323 | /* | 323 | /* |
324 | * PRCMU level clock gating | 324 | * PRCMU level clock gating |
325 | */ | 325 | */ |
326 | 326 | ||
327 | /* Bank 0 */ | 327 | /* Bank 0 */ |
328 | static DEFINE_PRCMU_CLK(svaclk, 0x0, 2, SVAMMDSPCLK); | 328 | static DEFINE_PRCMU_CLK(svaclk, 0x0, 2, SVAMMDSPCLK); |
329 | static DEFINE_PRCMU_CLK(siaclk, 0x0, 3, SIAMMDSPCLK); | 329 | static DEFINE_PRCMU_CLK(siaclk, 0x0, 3, SIAMMDSPCLK); |
330 | static DEFINE_PRCMU_CLK(sgaclk, 0x0, 4, SGACLK); | 330 | static DEFINE_PRCMU_CLK(sgaclk, 0x0, 4, SGACLK); |
331 | static DEFINE_PRCMU_CLK_RATE(uartclk, 0x0, 5, UARTCLK, 38400000); | 331 | static DEFINE_PRCMU_CLK_RATE(uartclk, 0x0, 5, UARTCLK, 38400000); |
332 | static DEFINE_PRCMU_CLK(msp02clk, 0x0, 6, MSP02CLK); | 332 | static DEFINE_PRCMU_CLK(msp02clk, 0x0, 6, MSP02CLK); |
333 | static DEFINE_PRCMU_CLK(msp1clk, 0x0, 7, MSP1CLK); /* v1 */ | 333 | static DEFINE_PRCMU_CLK(msp1clk, 0x0, 7, MSP1CLK); /* v1 */ |
334 | static DEFINE_PRCMU_CLK_RATE(i2cclk, 0x0, 8, I2CCLK, 48000000); | 334 | static DEFINE_PRCMU_CLK_RATE(i2cclk, 0x0, 8, I2CCLK, 48000000); |
335 | static DEFINE_PRCMU_CLK_RATE(sdmmcclk, 0x0, 9, SDMMCCLK, 50000000); | 335 | static DEFINE_PRCMU_CLK_RATE(sdmmcclk, 0x0, 9, SDMMCCLK, 50000000); |
336 | static DEFINE_PRCMU_CLK(slimclk, 0x0, 10, SLIMCLK); | 336 | static DEFINE_PRCMU_CLK(slimclk, 0x0, 10, SLIMCLK); |
337 | static DEFINE_PRCMU_CLK(per1clk, 0x0, 11, PER1CLK); | 337 | static DEFINE_PRCMU_CLK(per1clk, 0x0, 11, PER1CLK); |
338 | static DEFINE_PRCMU_CLK(per2clk, 0x0, 12, PER2CLK); | 338 | static DEFINE_PRCMU_CLK(per2clk, 0x0, 12, PER2CLK); |
339 | static DEFINE_PRCMU_CLK(per3clk, 0x0, 13, PER3CLK); | 339 | static DEFINE_PRCMU_CLK(per3clk, 0x0, 13, PER3CLK); |
340 | static DEFINE_PRCMU_CLK(per5clk, 0x0, 14, PER5CLK); | 340 | static DEFINE_PRCMU_CLK(per5clk, 0x0, 14, PER5CLK); |
341 | static DEFINE_PRCMU_CLK_RATE(per6clk, 0x0, 15, PER6CLK, 133330000); | 341 | static DEFINE_PRCMU_CLK_RATE(per6clk, 0x0, 15, PER6CLK, 133330000); |
342 | static DEFINE_PRCMU_CLK_RATE(per7clk, 0x0, 16, PER7CLK, 100000000); | 342 | static DEFINE_PRCMU_CLK_RATE(per7clk, 0x0, 16, PER7CLK, 100000000); |
343 | static DEFINE_PRCMU_CLK(lcdclk, 0x0, 17, LCDCLK); | 343 | static DEFINE_PRCMU_CLK(lcdclk, 0x0, 17, LCDCLK); |
344 | static DEFINE_PRCMU_CLK(bmlclk, 0x0, 18, BMLCLK); | 344 | static DEFINE_PRCMU_CLK(bmlclk, 0x0, 18, BMLCLK); |
345 | static DEFINE_PRCMU_CLK(hsitxclk, 0x0, 19, HSITXCLK); | 345 | static DEFINE_PRCMU_CLK(hsitxclk, 0x0, 19, HSITXCLK); |
346 | static DEFINE_PRCMU_CLK(hsirxclk, 0x0, 20, HSIRXCLK); | 346 | static DEFINE_PRCMU_CLK(hsirxclk, 0x0, 20, HSIRXCLK); |
347 | static DEFINE_PRCMU_CLK(hdmiclk, 0x0, 21, HDMICLK); | 347 | static DEFINE_PRCMU_CLK(hdmiclk, 0x0, 21, HDMICLK); |
348 | static DEFINE_PRCMU_CLK(apeatclk, 0x0, 22, APEATCLK); | 348 | static DEFINE_PRCMU_CLK(apeatclk, 0x0, 22, APEATCLK); |
349 | static DEFINE_PRCMU_CLK(apetraceclk, 0x0, 23, APETRACECLK); | 349 | static DEFINE_PRCMU_CLK(apetraceclk, 0x0, 23, APETRACECLK); |
350 | static DEFINE_PRCMU_CLK(mcdeclk, 0x0, 24, MCDECLK); | 350 | static DEFINE_PRCMU_CLK(mcdeclk, 0x0, 24, MCDECLK); |
351 | static DEFINE_PRCMU_CLK(ipi2clk, 0x0, 25, IPI2CCLK); | 351 | static DEFINE_PRCMU_CLK(ipi2clk, 0x0, 25, IPI2CCLK); |
352 | static DEFINE_PRCMU_CLK(dsialtclk, 0x0, 26, DSIALTCLK); /* v1 */ | 352 | static DEFINE_PRCMU_CLK(dsialtclk, 0x0, 26, DSIALTCLK); /* v1 */ |
353 | static DEFINE_PRCMU_CLK(dmaclk, 0x0, 27, DMACLK); | 353 | static DEFINE_PRCMU_CLK(dmaclk, 0x0, 27, DMACLK); |
354 | static DEFINE_PRCMU_CLK(b2r2clk, 0x0, 28, B2R2CLK); | 354 | static DEFINE_PRCMU_CLK(b2r2clk, 0x0, 28, B2R2CLK); |
355 | static DEFINE_PRCMU_CLK(tvclk, 0x0, 29, TVCLK); | 355 | static DEFINE_PRCMU_CLK(tvclk, 0x0, 29, TVCLK); |
356 | static DEFINE_PRCMU_CLK(uniproclk, 0x0, 30, UNIPROCLK); /* v1 */ | 356 | static DEFINE_PRCMU_CLK(uniproclk, 0x0, 30, UNIPROCLK); /* v1 */ |
357 | static DEFINE_PRCMU_CLK_RATE(sspclk, 0x0, 31, SSPCLK, 48000000); /* v1 */ | 357 | static DEFINE_PRCMU_CLK_RATE(sspclk, 0x0, 31, SSPCLK, 48000000); /* v1 */ |
358 | 358 | ||
359 | /* Bank 1 */ | 359 | /* Bank 1 */ |
360 | static DEFINE_PRCMU_CLK(rngclk, 0x4, 0, RNGCLK); /* v1 */ | 360 | static DEFINE_PRCMU_CLK(rngclk, 0x4, 0, RNGCLK); /* v1 */ |
361 | static DEFINE_PRCMU_CLK(uiccclk, 0x4, 1, UICCCLK); /* v1 */ | 361 | static DEFINE_PRCMU_CLK(uiccclk, 0x4, 1, UICCCLK); /* v1 */ |
362 | 362 | ||
363 | /* | 363 | /* |
364 | * PRCC level clock gating | 364 | * PRCC level clock gating |
365 | * Format: per#, clk, PCKEN bit, KCKEN bit, parent | 365 | * Format: per#, clk, PCKEN bit, KCKEN bit, parent |
366 | */ | 366 | */ |
367 | 367 | ||
368 | /* Peripheral Cluster #1 */ | 368 | /* Peripheral Cluster #1 */ |
369 | static DEFINE_PRCC_CLK(1, i2c4, 10, 9, &clk_i2cclk); | 369 | static DEFINE_PRCC_CLK(1, i2c4, 10, 9, &clk_i2cclk); |
370 | static DEFINE_PRCC_CLK(1, gpio0, 9, -1, NULL); | 370 | static DEFINE_PRCC_CLK(1, gpio0, 9, -1, NULL); |
371 | static DEFINE_PRCC_CLK(1, slimbus0, 8, 8, &clk_slimclk); | 371 | static DEFINE_PRCC_CLK(1, slimbus0, 8, 8, &clk_slimclk); |
372 | static DEFINE_PRCC_CLK(1, spi3_ed, 7, 7, NULL); | 372 | static DEFINE_PRCC_CLK(1, spi3_ed, 7, 7, NULL); |
373 | static DEFINE_PRCC_CLK(1, spi3_v1, 7, -1, NULL); | 373 | static DEFINE_PRCC_CLK(1, spi3_v1, 7, -1, NULL); |
374 | static DEFINE_PRCC_CLK(1, i2c2, 6, 6, &clk_i2cclk); | 374 | static DEFINE_PRCC_CLK(1, i2c2, 6, 6, &clk_i2cclk); |
375 | static DEFINE_PRCC_CLK(1, sdi0, 5, 5, &clk_sdmmcclk); | 375 | static DEFINE_PRCC_CLK(1, sdi0, 5, 5, &clk_sdmmcclk); |
376 | static DEFINE_PRCC_CLK(1, msp1_ed, 4, 4, &clk_msp02clk); | 376 | static DEFINE_PRCC_CLK(1, msp1_ed, 4, 4, &clk_msp02clk); |
377 | static DEFINE_PRCC_CLK(1, msp1_v1, 4, 4, &clk_msp1clk); | 377 | static DEFINE_PRCC_CLK(1, msp1_v1, 4, 4, &clk_msp1clk); |
378 | static DEFINE_PRCC_CLK(1, msp0, 3, 3, &clk_msp02clk); | 378 | static DEFINE_PRCC_CLK(1, msp0, 3, 3, &clk_msp02clk); |
379 | static DEFINE_PRCC_CLK(1, i2c1, 2, 2, &clk_i2cclk); | 379 | static DEFINE_PRCC_CLK(1, i2c1, 2, 2, &clk_i2cclk); |
380 | static DEFINE_PRCC_CLK(1, uart1, 1, 1, &clk_uartclk); | 380 | static DEFINE_PRCC_CLK(1, uart1, 1, 1, &clk_uartclk); |
381 | static DEFINE_PRCC_CLK(1, uart0, 0, 0, &clk_uartclk); | 381 | static DEFINE_PRCC_CLK(1, uart0, 0, 0, &clk_uartclk); |
382 | 382 | ||
383 | /* Peripheral Cluster #2 */ | 383 | /* Peripheral Cluster #2 */ |
384 | 384 | ||
385 | static DEFINE_PRCC_CLK(2, gpio1_ed, 12, -1, NULL); | 385 | static DEFINE_PRCC_CLK(2, gpio1_ed, 12, -1, NULL); |
386 | static DEFINE_PRCC_CLK(2, ssitx_ed, 11, -1, NULL); | 386 | static DEFINE_PRCC_CLK(2, ssitx_ed, 11, -1, NULL); |
387 | static DEFINE_PRCC_CLK(2, ssirx_ed, 10, -1, NULL); | 387 | static DEFINE_PRCC_CLK(2, ssirx_ed, 10, -1, NULL); |
388 | static DEFINE_PRCC_CLK(2, spi0_ed, 9, -1, NULL); | 388 | static DEFINE_PRCC_CLK(2, spi0_ed, 9, -1, NULL); |
389 | static DEFINE_PRCC_CLK(2, sdi3_ed, 8, 6, &clk_sdmmcclk); | 389 | static DEFINE_PRCC_CLK(2, sdi3_ed, 8, 6, &clk_sdmmcclk); |
390 | static DEFINE_PRCC_CLK(2, sdi1_ed, 7, 5, &clk_sdmmcclk); | 390 | static DEFINE_PRCC_CLK(2, sdi1_ed, 7, 5, &clk_sdmmcclk); |
391 | static DEFINE_PRCC_CLK(2, msp2_ed, 6, 4, &clk_msp02clk); | 391 | static DEFINE_PRCC_CLK(2, msp2_ed, 6, 4, &clk_msp02clk); |
392 | static DEFINE_PRCC_CLK(2, sdi4_ed, 4, 2, &clk_sdmmcclk); | 392 | static DEFINE_PRCC_CLK(2, sdi4_ed, 4, 2, &clk_sdmmcclk); |
393 | static DEFINE_PRCC_CLK(2, pwl_ed, 3, 1, NULL); | 393 | static DEFINE_PRCC_CLK(2, pwl_ed, 3, 1, NULL); |
394 | static DEFINE_PRCC_CLK(2, spi1_ed, 2, -1, NULL); | 394 | static DEFINE_PRCC_CLK(2, spi1_ed, 2, -1, NULL); |
395 | static DEFINE_PRCC_CLK(2, spi2_ed, 1, -1, NULL); | 395 | static DEFINE_PRCC_CLK(2, spi2_ed, 1, -1, NULL); |
396 | static DEFINE_PRCC_CLK(2, i2c3_ed, 0, 0, &clk_i2cclk); | 396 | static DEFINE_PRCC_CLK(2, i2c3_ed, 0, 0, &clk_i2cclk); |
397 | 397 | ||
398 | static DEFINE_PRCC_CLK(2, gpio1_v1, 11, -1, NULL); | 398 | static DEFINE_PRCC_CLK(2, gpio1_v1, 11, -1, NULL); |
399 | static DEFINE_PRCC_CLK(2, ssitx_v1, 10, 7, NULL); | 399 | static DEFINE_PRCC_CLK(2, ssitx_v1, 10, 7, NULL); |
400 | static DEFINE_PRCC_CLK(2, ssirx_v1, 9, 6, NULL); | 400 | static DEFINE_PRCC_CLK(2, ssirx_v1, 9, 6, NULL); |
401 | static DEFINE_PRCC_CLK(2, spi0_v1, 8, -1, NULL); | 401 | static DEFINE_PRCC_CLK(2, spi0_v1, 8, -1, NULL); |
402 | static DEFINE_PRCC_CLK(2, sdi3_v1, 7, 5, &clk_sdmmcclk); | 402 | static DEFINE_PRCC_CLK(2, sdi3_v1, 7, 5, &clk_sdmmcclk); |
403 | static DEFINE_PRCC_CLK(2, sdi1_v1, 6, 4, &clk_sdmmcclk); | 403 | static DEFINE_PRCC_CLK(2, sdi1_v1, 6, 4, &clk_sdmmcclk); |
404 | static DEFINE_PRCC_CLK(2, msp2_v1, 5, 3, &clk_msp02clk); | 404 | static DEFINE_PRCC_CLK(2, msp2_v1, 5, 3, &clk_msp02clk); |
405 | static DEFINE_PRCC_CLK(2, sdi4_v1, 4, 2, &clk_sdmmcclk); | 405 | static DEFINE_PRCC_CLK(2, sdi4_v1, 4, 2, &clk_sdmmcclk); |
406 | static DEFINE_PRCC_CLK(2, pwl_v1, 3, 1, NULL); | 406 | static DEFINE_PRCC_CLK(2, pwl_v1, 3, 1, NULL); |
407 | static DEFINE_PRCC_CLK(2, spi1_v1, 2, -1, NULL); | 407 | static DEFINE_PRCC_CLK(2, spi1_v1, 2, -1, NULL); |
408 | static DEFINE_PRCC_CLK(2, spi2_v1, 1, -1, NULL); | 408 | static DEFINE_PRCC_CLK(2, spi2_v1, 1, -1, NULL); |
409 | static DEFINE_PRCC_CLK(2, i2c3_v1, 0, 0, &clk_i2cclk); | 409 | static DEFINE_PRCC_CLK(2, i2c3_v1, 0, 0, &clk_i2cclk); |
410 | 410 | ||
411 | /* Peripheral Cluster #3 */ | 411 | /* Peripheral Cluster #3 */ |
412 | static DEFINE_PRCC_CLK(3, gpio2, 8, -1, NULL); | 412 | static DEFINE_PRCC_CLK(3, gpio2, 8, -1, NULL); |
413 | static DEFINE_PRCC_CLK(3, sdi5, 7, 7, &clk_sdmmcclk); | 413 | static DEFINE_PRCC_CLK(3, sdi5, 7, 7, &clk_sdmmcclk); |
414 | static DEFINE_PRCC_CLK(3, uart2, 6, 6, &clk_uartclk); | 414 | static DEFINE_PRCC_CLK(3, uart2, 6, 6, &clk_uartclk); |
415 | static DEFINE_PRCC_CLK(3, ske, 5, 5, &clk_32khz); | 415 | static DEFINE_PRCC_CLK(3, ske, 5, 5, &clk_32khz); |
416 | static DEFINE_PRCC_CLK(3, sdi2, 4, 4, &clk_sdmmcclk); | 416 | static DEFINE_PRCC_CLK(3, sdi2, 4, 4, &clk_sdmmcclk); |
417 | static DEFINE_PRCC_CLK(3, i2c0, 3, 3, &clk_i2cclk); | 417 | static DEFINE_PRCC_CLK(3, i2c0, 3, 3, &clk_i2cclk); |
418 | static DEFINE_PRCC_CLK(3, ssp1_ed, 2, 2, &clk_i2cclk); | 418 | static DEFINE_PRCC_CLK(3, ssp1_ed, 2, 2, &clk_i2cclk); |
419 | static DEFINE_PRCC_CLK(3, ssp0_ed, 1, 1, &clk_i2cclk); | 419 | static DEFINE_PRCC_CLK(3, ssp0_ed, 1, 1, &clk_i2cclk); |
420 | static DEFINE_PRCC_CLK(3, ssp1_v1, 2, 2, &clk_sspclk); | 420 | static DEFINE_PRCC_CLK(3, ssp1_v1, 2, 2, &clk_sspclk); |
421 | static DEFINE_PRCC_CLK(3, ssp0_v1, 1, 1, &clk_sspclk); | 421 | static DEFINE_PRCC_CLK(3, ssp0_v1, 1, 1, &clk_sspclk); |
422 | static DEFINE_PRCC_CLK(3, fsmc, 0, -1, NULL); | 422 | static DEFINE_PRCC_CLK(3, fsmc, 0, -1, NULL); |
423 | 423 | ||
424 | /* Peripheral Cluster #4 is in the always on domain */ | 424 | /* Peripheral Cluster #4 is in the always on domain */ |
425 | 425 | ||
426 | /* Peripheral Cluster #5 */ | 426 | /* Peripheral Cluster #5 */ |
427 | static DEFINE_PRCC_CLK(5, gpio3, 1, -1, NULL); | 427 | static DEFINE_PRCC_CLK(5, gpio3, 1, -1, NULL); |
428 | static DEFINE_PRCC_CLK(5, usb_ed, 0, 0, &clk_i2cclk); | 428 | static DEFINE_PRCC_CLK(5, usb_ed, 0, 0, &clk_i2cclk); |
429 | static DEFINE_PRCC_CLK(5, usb_v1, 0, 0, NULL); | 429 | static DEFINE_PRCC_CLK(5, usb_v1, 0, 0, NULL); |
430 | 430 | ||
431 | /* Peripheral Cluster #6 */ | 431 | /* Peripheral Cluster #6 */ |
432 | 432 | ||
433 | /* MTU ID in data */ | 433 | /* MTU ID in data */ |
434 | static DEFINE_PRCC_CLK_CUSTOM(6, mtu1_v1, 8, -1, NULL, clk_mtu_get_rate, 1); | 434 | static DEFINE_PRCC_CLK_CUSTOM(6, mtu1_v1, 8, -1, NULL, clk_mtu_get_rate, 1); |
435 | static DEFINE_PRCC_CLK_CUSTOM(6, mtu0_v1, 7, -1, NULL, clk_mtu_get_rate, 0); | 435 | static DEFINE_PRCC_CLK_CUSTOM(6, mtu0_v1, 7, -1, NULL, clk_mtu_get_rate, 0); |
436 | static DEFINE_PRCC_CLK(6, cfgreg_v1, 6, 6, NULL); | 436 | static DEFINE_PRCC_CLK(6, cfgreg_v1, 6, 6, NULL); |
437 | static DEFINE_PRCC_CLK(6, dmc_ed, 6, 6, NULL); | 437 | static DEFINE_PRCC_CLK(6, dmc_ed, 6, 6, NULL); |
438 | static DEFINE_PRCC_CLK(6, hash1, 5, -1, NULL); | 438 | static DEFINE_PRCC_CLK(6, hash1, 5, -1, NULL); |
439 | static DEFINE_PRCC_CLK(6, unipro_v1, 4, 1, &clk_uniproclk); | 439 | static DEFINE_PRCC_CLK(6, unipro_v1, 4, 1, &clk_uniproclk); |
440 | static DEFINE_PRCC_CLK(6, cryp1_ed, 4, -1, NULL); | 440 | static DEFINE_PRCC_CLK(6, cryp1_ed, 4, -1, NULL); |
441 | static DEFINE_PRCC_CLK(6, pka, 3, -1, NULL); | 441 | static DEFINE_PRCC_CLK(6, pka, 3, -1, NULL); |
442 | static DEFINE_PRCC_CLK(6, hash0, 2, -1, NULL); | 442 | static DEFINE_PRCC_CLK(6, hash0, 2, -1, NULL); |
443 | static DEFINE_PRCC_CLK(6, cryp0, 1, -1, NULL); | 443 | static DEFINE_PRCC_CLK(6, cryp0, 1, -1, NULL); |
444 | static DEFINE_PRCC_CLK(6, rng_ed, 0, 0, &clk_i2cclk); | 444 | static DEFINE_PRCC_CLK(6, rng_ed, 0, 0, &clk_i2cclk); |
445 | static DEFINE_PRCC_CLK(6, rng_v1, 0, 0, &clk_rngclk); | 445 | static DEFINE_PRCC_CLK(6, rng_v1, 0, 0, &clk_rngclk); |
446 | 446 | ||
447 | /* Peripheral Cluster #7 */ | 447 | /* Peripheral Cluster #7 */ |
448 | 448 | ||
449 | static DEFINE_PRCC_CLK(7, tzpc0_ed, 4, -1, NULL); | 449 | static DEFINE_PRCC_CLK(7, tzpc0_ed, 4, -1, NULL); |
450 | /* MTU ID in data */ | 450 | /* MTU ID in data */ |
451 | static DEFINE_PRCC_CLK_CUSTOM(7, mtu1_ed, 3, -1, NULL, clk_mtu_get_rate, 1); | 451 | static DEFINE_PRCC_CLK_CUSTOM(7, mtu1_ed, 3, -1, NULL, clk_mtu_get_rate, 1); |
452 | static DEFINE_PRCC_CLK_CUSTOM(7, mtu0_ed, 2, -1, NULL, clk_mtu_get_rate, 0); | 452 | static DEFINE_PRCC_CLK_CUSTOM(7, mtu0_ed, 2, -1, NULL, clk_mtu_get_rate, 0); |
453 | static DEFINE_PRCC_CLK(7, wdg_ed, 1, -1, NULL); | 453 | static DEFINE_PRCC_CLK(7, wdg_ed, 1, -1, NULL); |
454 | static DEFINE_PRCC_CLK(7, cfgreg_ed, 0, -1, NULL); | 454 | static DEFINE_PRCC_CLK(7, cfgreg_ed, 0, -1, NULL); |
455 | 455 | ||
456 | static struct clk clk_dummy_apb_pclk; | ||
457 | |||
456 | static struct clk_lookup u8500_common_clks[] = { | 458 | static struct clk_lookup u8500_common_clks[] = { |
459 | CLK(dummy_apb_pclk, NULL, "apb_pclk"), | ||
460 | |||
457 | /* Peripheral Cluster #1 */ | 461 | /* Peripheral Cluster #1 */ |
458 | CLK(gpio0, "gpio.0", NULL), | 462 | CLK(gpio0, "gpio.0", NULL), |
459 | CLK(gpio0, "gpio.1", NULL), | 463 | CLK(gpio0, "gpio.1", NULL), |
460 | CLK(slimbus0, "slimbus0", NULL), | 464 | CLK(slimbus0, "slimbus0", NULL), |
461 | CLK(i2c2, "nmk-i2c.2", NULL), | 465 | CLK(i2c2, "nmk-i2c.2", NULL), |
462 | CLK(sdi0, "sdi0", NULL), | 466 | CLK(sdi0, "sdi0", NULL), |
463 | CLK(msp0, "msp0", NULL), | 467 | CLK(msp0, "msp0", NULL), |
464 | CLK(i2c1, "nmk-i2c.1", NULL), | 468 | CLK(i2c1, "nmk-i2c.1", NULL), |
465 | CLK(uart1, "uart1", NULL), | 469 | CLK(uart1, "uart1", NULL), |
466 | CLK(uart0, "uart0", NULL), | 470 | CLK(uart0, "uart0", NULL), |
467 | 471 | ||
468 | /* Peripheral Cluster #3 */ | 472 | /* Peripheral Cluster #3 */ |
469 | CLK(gpio2, "gpio.2", NULL), | 473 | CLK(gpio2, "gpio.2", NULL), |
470 | CLK(gpio2, "gpio.3", NULL), | 474 | CLK(gpio2, "gpio.3", NULL), |
471 | CLK(gpio2, "gpio.4", NULL), | 475 | CLK(gpio2, "gpio.4", NULL), |
472 | CLK(gpio2, "gpio.5", NULL), | 476 | CLK(gpio2, "gpio.5", NULL), |
473 | CLK(sdi5, "sdi5", NULL), | 477 | CLK(sdi5, "sdi5", NULL), |
474 | CLK(uart2, "uart2", NULL), | 478 | CLK(uart2, "uart2", NULL), |
475 | CLK(ske, "ske", NULL), | 479 | CLK(ske, "ske", NULL), |
476 | CLK(sdi2, "sdi2", NULL), | 480 | CLK(sdi2, "sdi2", NULL), |
477 | CLK(i2c0, "nmk-i2c.0", NULL), | 481 | CLK(i2c0, "nmk-i2c.0", NULL), |
478 | CLK(fsmc, "fsmc", NULL), | 482 | CLK(fsmc, "fsmc", NULL), |
479 | 483 | ||
480 | /* Peripheral Cluster #5 */ | 484 | /* Peripheral Cluster #5 */ |
481 | CLK(gpio3, "gpio.8", NULL), | 485 | CLK(gpio3, "gpio.8", NULL), |
482 | 486 | ||
483 | /* Peripheral Cluster #6 */ | 487 | /* Peripheral Cluster #6 */ |
484 | CLK(hash1, "hash1", NULL), | 488 | CLK(hash1, "hash1", NULL), |
485 | CLK(pka, "pka", NULL), | 489 | CLK(pka, "pka", NULL), |
486 | CLK(hash0, "hash0", NULL), | 490 | CLK(hash0, "hash0", NULL), |
487 | CLK(cryp0, "cryp0", NULL), | 491 | CLK(cryp0, "cryp0", NULL), |
488 | 492 | ||
489 | /* PRCMU level clock gating */ | 493 | /* PRCMU level clock gating */ |
490 | 494 | ||
491 | /* Bank 0 */ | 495 | /* Bank 0 */ |
492 | CLK(svaclk, "sva", NULL), | 496 | CLK(svaclk, "sva", NULL), |
493 | CLK(siaclk, "sia", NULL), | 497 | CLK(siaclk, "sia", NULL), |
494 | CLK(sgaclk, "sga", NULL), | 498 | CLK(sgaclk, "sga", NULL), |
495 | CLK(slimclk, "slim", NULL), | 499 | CLK(slimclk, "slim", NULL), |
496 | CLK(lcdclk, "lcd", NULL), | 500 | CLK(lcdclk, "lcd", NULL), |
497 | CLK(bmlclk, "bml", NULL), | 501 | CLK(bmlclk, "bml", NULL), |
498 | CLK(hsitxclk, "stm-hsi.0", NULL), | 502 | CLK(hsitxclk, "stm-hsi.0", NULL), |
499 | CLK(hsirxclk, "stm-hsi.1", NULL), | 503 | CLK(hsirxclk, "stm-hsi.1", NULL), |
500 | CLK(hdmiclk, "hdmi", NULL), | 504 | CLK(hdmiclk, "hdmi", NULL), |
501 | CLK(apeatclk, "apeat", NULL), | 505 | CLK(apeatclk, "apeat", NULL), |
502 | CLK(apetraceclk, "apetrace", NULL), | 506 | CLK(apetraceclk, "apetrace", NULL), |
503 | CLK(mcdeclk, "mcde", NULL), | 507 | CLK(mcdeclk, "mcde", NULL), |
504 | CLK(ipi2clk, "ipi2", NULL), | 508 | CLK(ipi2clk, "ipi2", NULL), |
505 | CLK(dmaclk, "dma40.0", NULL), | 509 | CLK(dmaclk, "dma40.0", NULL), |
506 | CLK(b2r2clk, "b2r2", NULL), | 510 | CLK(b2r2clk, "b2r2", NULL), |
507 | CLK(tvclk, "tv", NULL), | 511 | CLK(tvclk, "tv", NULL), |
508 | }; | 512 | }; |
509 | 513 | ||
510 | static struct clk_lookup u8500_ed_clks[] = { | 514 | static struct clk_lookup u8500_ed_clks[] = { |
511 | /* Peripheral Cluster #1 */ | 515 | /* Peripheral Cluster #1 */ |
512 | CLK(spi3_ed, "spi3", NULL), | 516 | CLK(spi3_ed, "spi3", NULL), |
513 | CLK(msp1_ed, "msp1", NULL), | 517 | CLK(msp1_ed, "msp1", NULL), |
514 | 518 | ||
515 | /* Peripheral Cluster #2 */ | 519 | /* Peripheral Cluster #2 */ |
516 | CLK(gpio1_ed, "gpio.6", NULL), | 520 | CLK(gpio1_ed, "gpio.6", NULL), |
517 | CLK(gpio1_ed, "gpio.7", NULL), | 521 | CLK(gpio1_ed, "gpio.7", NULL), |
518 | CLK(ssitx_ed, "ssitx", NULL), | 522 | CLK(ssitx_ed, "ssitx", NULL), |
519 | CLK(ssirx_ed, "ssirx", NULL), | 523 | CLK(ssirx_ed, "ssirx", NULL), |
520 | CLK(spi0_ed, "spi0", NULL), | 524 | CLK(spi0_ed, "spi0", NULL), |
521 | CLK(sdi3_ed, "sdi3", NULL), | 525 | CLK(sdi3_ed, "sdi3", NULL), |
522 | CLK(sdi1_ed, "sdi1", NULL), | 526 | CLK(sdi1_ed, "sdi1", NULL), |
523 | CLK(msp2_ed, "msp2", NULL), | 527 | CLK(msp2_ed, "msp2", NULL), |
524 | CLK(sdi4_ed, "sdi4", NULL), | 528 | CLK(sdi4_ed, "sdi4", NULL), |
525 | CLK(pwl_ed, "pwl", NULL), | 529 | CLK(pwl_ed, "pwl", NULL), |
526 | CLK(spi1_ed, "spi1", NULL), | 530 | CLK(spi1_ed, "spi1", NULL), |
527 | CLK(spi2_ed, "spi2", NULL), | 531 | CLK(spi2_ed, "spi2", NULL), |
528 | CLK(i2c3_ed, "nmk-i2c.3", NULL), | 532 | CLK(i2c3_ed, "nmk-i2c.3", NULL), |
529 | 533 | ||
530 | /* Peripheral Cluster #3 */ | 534 | /* Peripheral Cluster #3 */ |
531 | CLK(ssp1_ed, "ssp1", NULL), | 535 | CLK(ssp1_ed, "ssp1", NULL), |
532 | CLK(ssp0_ed, "ssp0", NULL), | 536 | CLK(ssp0_ed, "ssp0", NULL), |
533 | 537 | ||
534 | /* Peripheral Cluster #5 */ | 538 | /* Peripheral Cluster #5 */ |
535 | CLK(usb_ed, "musb_hdrc.0", "usb"), | 539 | CLK(usb_ed, "musb_hdrc.0", "usb"), |
536 | 540 | ||
537 | /* Peripheral Cluster #6 */ | 541 | /* Peripheral Cluster #6 */ |
538 | CLK(dmc_ed, "dmc", NULL), | 542 | CLK(dmc_ed, "dmc", NULL), |
539 | CLK(cryp1_ed, "cryp1", NULL), | 543 | CLK(cryp1_ed, "cryp1", NULL), |
540 | CLK(rng_ed, "rng", NULL), | 544 | CLK(rng_ed, "rng", NULL), |
541 | 545 | ||
542 | /* Peripheral Cluster #7 */ | 546 | /* Peripheral Cluster #7 */ |
543 | CLK(tzpc0_ed, "tzpc0", NULL), | 547 | CLK(tzpc0_ed, "tzpc0", NULL), |
544 | CLK(mtu1_ed, "mtu1", NULL), | 548 | CLK(mtu1_ed, "mtu1", NULL), |
545 | CLK(mtu0_ed, "mtu0", NULL), | 549 | CLK(mtu0_ed, "mtu0", NULL), |
546 | CLK(wdg_ed, "wdg", NULL), | 550 | CLK(wdg_ed, "wdg", NULL), |
547 | CLK(cfgreg_ed, "cfgreg", NULL), | 551 | CLK(cfgreg_ed, "cfgreg", NULL), |
548 | }; | 552 | }; |
549 | 553 | ||
550 | static struct clk_lookup u8500_v1_clks[] = { | 554 | static struct clk_lookup u8500_v1_clks[] = { |
551 | /* Peripheral Cluster #1 */ | 555 | /* Peripheral Cluster #1 */ |
552 | CLK(i2c4, "nmk-i2c.4", NULL), | 556 | CLK(i2c4, "nmk-i2c.4", NULL), |
553 | CLK(spi3_v1, "spi3", NULL), | 557 | CLK(spi3_v1, "spi3", NULL), |
554 | CLK(msp1_v1, "msp1", NULL), | 558 | CLK(msp1_v1, "msp1", NULL), |
555 | 559 | ||
556 | /* Peripheral Cluster #2 */ | 560 | /* Peripheral Cluster #2 */ |
557 | CLK(gpio1_v1, "gpio.6", NULL), | 561 | CLK(gpio1_v1, "gpio.6", NULL), |
558 | CLK(gpio1_v1, "gpio.7", NULL), | 562 | CLK(gpio1_v1, "gpio.7", NULL), |
559 | CLK(ssitx_v1, "ssitx", NULL), | 563 | CLK(ssitx_v1, "ssitx", NULL), |
560 | CLK(ssirx_v1, "ssirx", NULL), | 564 | CLK(ssirx_v1, "ssirx", NULL), |
561 | CLK(spi0_v1, "spi0", NULL), | 565 | CLK(spi0_v1, "spi0", NULL), |
562 | CLK(sdi3_v1, "sdi3", NULL), | 566 | CLK(sdi3_v1, "sdi3", NULL), |
563 | CLK(sdi1_v1, "sdi1", NULL), | 567 | CLK(sdi1_v1, "sdi1", NULL), |
564 | CLK(msp2_v1, "msp2", NULL), | 568 | CLK(msp2_v1, "msp2", NULL), |
565 | CLK(sdi4_v1, "sdi4", NULL), | 569 | CLK(sdi4_v1, "sdi4", NULL), |
566 | CLK(pwl_v1, "pwl", NULL), | 570 | CLK(pwl_v1, "pwl", NULL), |
567 | CLK(spi1_v1, "spi1", NULL), | 571 | CLK(spi1_v1, "spi1", NULL), |
568 | CLK(spi2_v1, "spi2", NULL), | 572 | CLK(spi2_v1, "spi2", NULL), |
569 | CLK(i2c3_v1, "nmk-i2c.3", NULL), | 573 | CLK(i2c3_v1, "nmk-i2c.3", NULL), |
570 | 574 | ||
571 | /* Peripheral Cluster #3 */ | 575 | /* Peripheral Cluster #3 */ |
572 | CLK(ssp1_v1, "ssp1", NULL), | 576 | CLK(ssp1_v1, "ssp1", NULL), |
573 | CLK(ssp0_v1, "ssp0", NULL), | 577 | CLK(ssp0_v1, "ssp0", NULL), |
574 | 578 | ||
575 | /* Peripheral Cluster #5 */ | 579 | /* Peripheral Cluster #5 */ |
576 | CLK(usb_v1, "musb_hdrc.0", "usb"), | 580 | CLK(usb_v1, "musb_hdrc.0", "usb"), |
577 | 581 | ||
578 | /* Peripheral Cluster #6 */ | 582 | /* Peripheral Cluster #6 */ |
579 | CLK(mtu1_v1, "mtu1", NULL), | 583 | CLK(mtu1_v1, "mtu1", NULL), |
580 | CLK(mtu0_v1, "mtu0", NULL), | 584 | CLK(mtu0_v1, "mtu0", NULL), |
581 | CLK(cfgreg_v1, "cfgreg", NULL), | 585 | CLK(cfgreg_v1, "cfgreg", NULL), |
582 | CLK(hash1, "hash1", NULL), | 586 | CLK(hash1, "hash1", NULL), |
583 | CLK(unipro_v1, "unipro", NULL), | 587 | CLK(unipro_v1, "unipro", NULL), |
584 | CLK(rng_v1, "rng", NULL), | 588 | CLK(rng_v1, "rng", NULL), |
585 | 589 | ||
586 | /* PRCMU level clock gating */ | 590 | /* PRCMU level clock gating */ |
587 | 591 | ||
588 | /* Bank 0 */ | 592 | /* Bank 0 */ |
589 | CLK(uniproclk, "uniproclk", NULL), | 593 | CLK(uniproclk, "uniproclk", NULL), |
590 | CLK(dsialtclk, "dsialt", NULL), | 594 | CLK(dsialtclk, "dsialt", NULL), |
591 | 595 | ||
592 | /* Bank 1 */ | 596 | /* Bank 1 */ |
593 | CLK(rngclk, "rng", NULL), | 597 | CLK(rngclk, "rng", NULL), |
594 | CLK(uiccclk, "uicc", NULL), | 598 | CLK(uiccclk, "uicc", NULL), |
595 | }; | 599 | }; |
596 | 600 | ||
597 | int __init clk_init(void) | 601 | int __init clk_init(void) |
598 | { | 602 | { |
599 | if (cpu_is_u8500ed()) { | 603 | if (cpu_is_u8500ed()) { |
600 | clk_prcmu_ops.enable = clk_prcmu_ed_enable; | 604 | clk_prcmu_ops.enable = clk_prcmu_ed_enable; |
601 | clk_prcmu_ops.disable = clk_prcmu_ed_disable; | 605 | clk_prcmu_ops.disable = clk_prcmu_ed_disable; |
602 | clk_per6clk.rate = 100000000; | 606 | clk_per6clk.rate = 100000000; |
603 | } else if (cpu_is_u5500()) { | 607 | } else if (cpu_is_u5500()) { |
604 | /* Clock tree for U5500 not implemented yet */ | 608 | /* Clock tree for U5500 not implemented yet */ |
605 | clk_prcc_ops.enable = clk_prcc_ops.disable = NULL; | 609 | clk_prcc_ops.enable = clk_prcc_ops.disable = NULL; |
606 | clk_prcmu_ops.enable = clk_prcmu_ops.disable = NULL; | 610 | clk_prcmu_ops.enable = clk_prcmu_ops.disable = NULL; |
607 | clk_per6clk.rate = 26000000; | 611 | clk_per6clk.rate = 26000000; |
608 | } | 612 | } |
609 | 613 | ||
610 | clkdev_add_table(u8500_common_clks, ARRAY_SIZE(u8500_common_clks)); | 614 | clkdev_add_table(u8500_common_clks, ARRAY_SIZE(u8500_common_clks)); |
611 | if (cpu_is_u8500ed()) | 615 | if (cpu_is_u8500ed()) |
612 | clkdev_add_table(u8500_ed_clks, ARRAY_SIZE(u8500_ed_clks)); | 616 | clkdev_add_table(u8500_ed_clks, ARRAY_SIZE(u8500_ed_clks)); |
613 | else | 617 | else |
614 | clkdev_add_table(u8500_v1_clks, ARRAY_SIZE(u8500_v1_clks)); | 618 | clkdev_add_table(u8500_v1_clks, ARRAY_SIZE(u8500_v1_clks)); |
615 | 619 | ||
616 | return 0; | 620 | return 0; |
617 | } | 621 | } |
618 | 622 |
arch/arm/mach-versatile/core.c
1 | /* | 1 | /* |
2 | * linux/arch/arm/mach-versatile/core.c | 2 | * linux/arch/arm/mach-versatile/core.c |
3 | * | 3 | * |
4 | * Copyright (C) 1999 - 2003 ARM Limited | 4 | * Copyright (C) 1999 - 2003 ARM Limited |
5 | * Copyright (C) 2000 Deep Blue Solutions Ltd | 5 | * Copyright (C) 2000 Deep Blue Solutions Ltd |
6 | * | 6 | * |
7 | * 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 |
8 | * it under the terms of the GNU General Public License as published by | 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 | 9 | * the Free Software Foundation; either version 2 of the License, or |
10 | * (at your option) any later version. | 10 | * (at your option) any later version. |
11 | * | 11 | * |
12 | * This program is distributed in the hope that it will be useful, | 12 | * This program is distributed in the hope that it will be useful, |
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 | * GNU General Public License for more details. | 15 | * GNU General Public License for more details. |
16 | * | 16 | * |
17 | * You should have received a copy of the GNU General Public License | 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 | 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 | 19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
20 | */ | 20 | */ |
21 | #include <linux/init.h> | 21 | #include <linux/init.h> |
22 | #include <linux/device.h> | 22 | #include <linux/device.h> |
23 | #include <linux/dma-mapping.h> | 23 | #include <linux/dma-mapping.h> |
24 | #include <linux/platform_device.h> | 24 | #include <linux/platform_device.h> |
25 | #include <linux/sysdev.h> | 25 | #include <linux/sysdev.h> |
26 | #include <linux/interrupt.h> | 26 | #include <linux/interrupt.h> |
27 | #include <linux/amba/bus.h> | 27 | #include <linux/amba/bus.h> |
28 | #include <linux/amba/clcd.h> | 28 | #include <linux/amba/clcd.h> |
29 | #include <linux/amba/pl061.h> | 29 | #include <linux/amba/pl061.h> |
30 | #include <linux/amba/mmci.h> | 30 | #include <linux/amba/mmci.h> |
31 | #include <linux/io.h> | 31 | #include <linux/io.h> |
32 | #include <linux/gfp.h> | 32 | #include <linux/gfp.h> |
33 | 33 | ||
34 | #include <asm/clkdev.h> | 34 | #include <asm/clkdev.h> |
35 | #include <asm/system.h> | 35 | #include <asm/system.h> |
36 | #include <asm/irq.h> | 36 | #include <asm/irq.h> |
37 | #include <asm/leds.h> | 37 | #include <asm/leds.h> |
38 | #include <asm/hardware/arm_timer.h> | 38 | #include <asm/hardware/arm_timer.h> |
39 | #include <asm/hardware/icst.h> | 39 | #include <asm/hardware/icst.h> |
40 | #include <asm/hardware/vic.h> | 40 | #include <asm/hardware/vic.h> |
41 | #include <asm/mach-types.h> | 41 | #include <asm/mach-types.h> |
42 | 42 | ||
43 | #include <asm/mach/arch.h> | 43 | #include <asm/mach/arch.h> |
44 | #include <asm/mach/flash.h> | 44 | #include <asm/mach/flash.h> |
45 | #include <asm/mach/irq.h> | 45 | #include <asm/mach/irq.h> |
46 | #include <asm/mach/time.h> | 46 | #include <asm/mach/time.h> |
47 | #include <asm/mach/map.h> | 47 | #include <asm/mach/map.h> |
48 | #include <mach/clkdev.h> | 48 | #include <mach/clkdev.h> |
49 | #include <mach/hardware.h> | 49 | #include <mach/hardware.h> |
50 | #include <mach/platform.h> | 50 | #include <mach/platform.h> |
51 | #include <plat/timer-sp.h> | 51 | #include <plat/timer-sp.h> |
52 | 52 | ||
53 | #include "core.h" | 53 | #include "core.h" |
54 | 54 | ||
55 | /* | 55 | /* |
56 | * All IO addresses are mapped onto VA 0xFFFx.xxxx, where x.xxxx | 56 | * All IO addresses are mapped onto VA 0xFFFx.xxxx, where x.xxxx |
57 | * is the (PA >> 12). | 57 | * is the (PA >> 12). |
58 | * | 58 | * |
59 | * Setup a VA for the Versatile Vectored Interrupt Controller. | 59 | * Setup a VA for the Versatile Vectored Interrupt Controller. |
60 | */ | 60 | */ |
61 | #define VA_VIC_BASE __io_address(VERSATILE_VIC_BASE) | 61 | #define VA_VIC_BASE __io_address(VERSATILE_VIC_BASE) |
62 | #define VA_SIC_BASE __io_address(VERSATILE_SIC_BASE) | 62 | #define VA_SIC_BASE __io_address(VERSATILE_SIC_BASE) |
63 | 63 | ||
64 | static void sic_mask_irq(unsigned int irq) | 64 | static void sic_mask_irq(unsigned int irq) |
65 | { | 65 | { |
66 | irq -= IRQ_SIC_START; | 66 | irq -= IRQ_SIC_START; |
67 | writel(1 << irq, VA_SIC_BASE + SIC_IRQ_ENABLE_CLEAR); | 67 | writel(1 << irq, VA_SIC_BASE + SIC_IRQ_ENABLE_CLEAR); |
68 | } | 68 | } |
69 | 69 | ||
70 | static void sic_unmask_irq(unsigned int irq) | 70 | static void sic_unmask_irq(unsigned int irq) |
71 | { | 71 | { |
72 | irq -= IRQ_SIC_START; | 72 | irq -= IRQ_SIC_START; |
73 | writel(1 << irq, VA_SIC_BASE + SIC_IRQ_ENABLE_SET); | 73 | writel(1 << irq, VA_SIC_BASE + SIC_IRQ_ENABLE_SET); |
74 | } | 74 | } |
75 | 75 | ||
76 | static struct irq_chip sic_chip = { | 76 | static struct irq_chip sic_chip = { |
77 | .name = "SIC", | 77 | .name = "SIC", |
78 | .ack = sic_mask_irq, | 78 | .ack = sic_mask_irq, |
79 | .mask = sic_mask_irq, | 79 | .mask = sic_mask_irq, |
80 | .unmask = sic_unmask_irq, | 80 | .unmask = sic_unmask_irq, |
81 | }; | 81 | }; |
82 | 82 | ||
83 | static void | 83 | static void |
84 | sic_handle_irq(unsigned int irq, struct irq_desc *desc) | 84 | sic_handle_irq(unsigned int irq, struct irq_desc *desc) |
85 | { | 85 | { |
86 | unsigned long status = readl(VA_SIC_BASE + SIC_IRQ_STATUS); | 86 | unsigned long status = readl(VA_SIC_BASE + SIC_IRQ_STATUS); |
87 | 87 | ||
88 | if (status == 0) { | 88 | if (status == 0) { |
89 | do_bad_IRQ(irq, desc); | 89 | do_bad_IRQ(irq, desc); |
90 | return; | 90 | return; |
91 | } | 91 | } |
92 | 92 | ||
93 | do { | 93 | do { |
94 | irq = ffs(status) - 1; | 94 | irq = ffs(status) - 1; |
95 | status &= ~(1 << irq); | 95 | status &= ~(1 << irq); |
96 | 96 | ||
97 | irq += IRQ_SIC_START; | 97 | irq += IRQ_SIC_START; |
98 | 98 | ||
99 | generic_handle_irq(irq); | 99 | generic_handle_irq(irq); |
100 | } while (status); | 100 | } while (status); |
101 | } | 101 | } |
102 | 102 | ||
103 | #if 1 | 103 | #if 1 |
104 | #define IRQ_MMCI0A IRQ_VICSOURCE22 | 104 | #define IRQ_MMCI0A IRQ_VICSOURCE22 |
105 | #define IRQ_AACI IRQ_VICSOURCE24 | 105 | #define IRQ_AACI IRQ_VICSOURCE24 |
106 | #define IRQ_ETH IRQ_VICSOURCE25 | 106 | #define IRQ_ETH IRQ_VICSOURCE25 |
107 | #define PIC_MASK 0xFFD00000 | 107 | #define PIC_MASK 0xFFD00000 |
108 | #else | 108 | #else |
109 | #define IRQ_MMCI0A IRQ_SIC_MMCI0A | 109 | #define IRQ_MMCI0A IRQ_SIC_MMCI0A |
110 | #define IRQ_AACI IRQ_SIC_AACI | 110 | #define IRQ_AACI IRQ_SIC_AACI |
111 | #define IRQ_ETH IRQ_SIC_ETH | 111 | #define IRQ_ETH IRQ_SIC_ETH |
112 | #define PIC_MASK 0 | 112 | #define PIC_MASK 0 |
113 | #endif | 113 | #endif |
114 | 114 | ||
115 | void __init versatile_init_irq(void) | 115 | void __init versatile_init_irq(void) |
116 | { | 116 | { |
117 | unsigned int i; | 117 | unsigned int i; |
118 | 118 | ||
119 | vic_init(VA_VIC_BASE, IRQ_VIC_START, ~0, 0); | 119 | vic_init(VA_VIC_BASE, IRQ_VIC_START, ~0, 0); |
120 | 120 | ||
121 | set_irq_chained_handler(IRQ_VICSOURCE31, sic_handle_irq); | 121 | set_irq_chained_handler(IRQ_VICSOURCE31, sic_handle_irq); |
122 | 122 | ||
123 | /* Do second interrupt controller */ | 123 | /* Do second interrupt controller */ |
124 | writel(~0, VA_SIC_BASE + SIC_IRQ_ENABLE_CLEAR); | 124 | writel(~0, VA_SIC_BASE + SIC_IRQ_ENABLE_CLEAR); |
125 | 125 | ||
126 | for (i = IRQ_SIC_START; i <= IRQ_SIC_END; i++) { | 126 | for (i = IRQ_SIC_START; i <= IRQ_SIC_END; i++) { |
127 | if ((PIC_MASK & (1 << (i - IRQ_SIC_START))) == 0) { | 127 | if ((PIC_MASK & (1 << (i - IRQ_SIC_START))) == 0) { |
128 | set_irq_chip(i, &sic_chip); | 128 | set_irq_chip(i, &sic_chip); |
129 | set_irq_handler(i, handle_level_irq); | 129 | set_irq_handler(i, handle_level_irq); |
130 | set_irq_flags(i, IRQF_VALID | IRQF_PROBE); | 130 | set_irq_flags(i, IRQF_VALID | IRQF_PROBE); |
131 | } | 131 | } |
132 | } | 132 | } |
133 | 133 | ||
134 | /* | 134 | /* |
135 | * Interrupts on secondary controller from 0 to 8 are routed to | 135 | * Interrupts on secondary controller from 0 to 8 are routed to |
136 | * source 31 on PIC. | 136 | * source 31 on PIC. |
137 | * Interrupts from 21 to 31 are routed directly to the VIC on | 137 | * Interrupts from 21 to 31 are routed directly to the VIC on |
138 | * the corresponding number on primary controller. This is controlled | 138 | * the corresponding number on primary controller. This is controlled |
139 | * by setting PIC_ENABLEx. | 139 | * by setting PIC_ENABLEx. |
140 | */ | 140 | */ |
141 | writel(PIC_MASK, VA_SIC_BASE + SIC_INT_PIC_ENABLE); | 141 | writel(PIC_MASK, VA_SIC_BASE + SIC_INT_PIC_ENABLE); |
142 | } | 142 | } |
143 | 143 | ||
144 | static struct map_desc versatile_io_desc[] __initdata = { | 144 | static struct map_desc versatile_io_desc[] __initdata = { |
145 | { | 145 | { |
146 | .virtual = IO_ADDRESS(VERSATILE_SYS_BASE), | 146 | .virtual = IO_ADDRESS(VERSATILE_SYS_BASE), |
147 | .pfn = __phys_to_pfn(VERSATILE_SYS_BASE), | 147 | .pfn = __phys_to_pfn(VERSATILE_SYS_BASE), |
148 | .length = SZ_4K, | 148 | .length = SZ_4K, |
149 | .type = MT_DEVICE | 149 | .type = MT_DEVICE |
150 | }, { | 150 | }, { |
151 | .virtual = IO_ADDRESS(VERSATILE_SIC_BASE), | 151 | .virtual = IO_ADDRESS(VERSATILE_SIC_BASE), |
152 | .pfn = __phys_to_pfn(VERSATILE_SIC_BASE), | 152 | .pfn = __phys_to_pfn(VERSATILE_SIC_BASE), |
153 | .length = SZ_4K, | 153 | .length = SZ_4K, |
154 | .type = MT_DEVICE | 154 | .type = MT_DEVICE |
155 | }, { | 155 | }, { |
156 | .virtual = IO_ADDRESS(VERSATILE_VIC_BASE), | 156 | .virtual = IO_ADDRESS(VERSATILE_VIC_BASE), |
157 | .pfn = __phys_to_pfn(VERSATILE_VIC_BASE), | 157 | .pfn = __phys_to_pfn(VERSATILE_VIC_BASE), |
158 | .length = SZ_4K, | 158 | .length = SZ_4K, |
159 | .type = MT_DEVICE | 159 | .type = MT_DEVICE |
160 | }, { | 160 | }, { |
161 | .virtual = IO_ADDRESS(VERSATILE_SCTL_BASE), | 161 | .virtual = IO_ADDRESS(VERSATILE_SCTL_BASE), |
162 | .pfn = __phys_to_pfn(VERSATILE_SCTL_BASE), | 162 | .pfn = __phys_to_pfn(VERSATILE_SCTL_BASE), |
163 | .length = SZ_4K * 9, | 163 | .length = SZ_4K * 9, |
164 | .type = MT_DEVICE | 164 | .type = MT_DEVICE |
165 | }, | 165 | }, |
166 | #ifdef CONFIG_MACH_VERSATILE_AB | 166 | #ifdef CONFIG_MACH_VERSATILE_AB |
167 | { | 167 | { |
168 | .virtual = IO_ADDRESS(VERSATILE_GPIO0_BASE), | 168 | .virtual = IO_ADDRESS(VERSATILE_GPIO0_BASE), |
169 | .pfn = __phys_to_pfn(VERSATILE_GPIO0_BASE), | 169 | .pfn = __phys_to_pfn(VERSATILE_GPIO0_BASE), |
170 | .length = SZ_4K, | 170 | .length = SZ_4K, |
171 | .type = MT_DEVICE | 171 | .type = MT_DEVICE |
172 | }, { | 172 | }, { |
173 | .virtual = IO_ADDRESS(VERSATILE_IB2_BASE), | 173 | .virtual = IO_ADDRESS(VERSATILE_IB2_BASE), |
174 | .pfn = __phys_to_pfn(VERSATILE_IB2_BASE), | 174 | .pfn = __phys_to_pfn(VERSATILE_IB2_BASE), |
175 | .length = SZ_64M, | 175 | .length = SZ_64M, |
176 | .type = MT_DEVICE | 176 | .type = MT_DEVICE |
177 | }, | 177 | }, |
178 | #endif | 178 | #endif |
179 | #ifdef CONFIG_DEBUG_LL | 179 | #ifdef CONFIG_DEBUG_LL |
180 | { | 180 | { |
181 | .virtual = IO_ADDRESS(VERSATILE_UART0_BASE), | 181 | .virtual = IO_ADDRESS(VERSATILE_UART0_BASE), |
182 | .pfn = __phys_to_pfn(VERSATILE_UART0_BASE), | 182 | .pfn = __phys_to_pfn(VERSATILE_UART0_BASE), |
183 | .length = SZ_4K, | 183 | .length = SZ_4K, |
184 | .type = MT_DEVICE | 184 | .type = MT_DEVICE |
185 | }, | 185 | }, |
186 | #endif | 186 | #endif |
187 | #ifdef CONFIG_PCI | 187 | #ifdef CONFIG_PCI |
188 | { | 188 | { |
189 | .virtual = IO_ADDRESS(VERSATILE_PCI_CORE_BASE), | 189 | .virtual = IO_ADDRESS(VERSATILE_PCI_CORE_BASE), |
190 | .pfn = __phys_to_pfn(VERSATILE_PCI_CORE_BASE), | 190 | .pfn = __phys_to_pfn(VERSATILE_PCI_CORE_BASE), |
191 | .length = SZ_4K, | 191 | .length = SZ_4K, |
192 | .type = MT_DEVICE | 192 | .type = MT_DEVICE |
193 | }, { | 193 | }, { |
194 | .virtual = (unsigned long)VERSATILE_PCI_VIRT_BASE, | 194 | .virtual = (unsigned long)VERSATILE_PCI_VIRT_BASE, |
195 | .pfn = __phys_to_pfn(VERSATILE_PCI_BASE), | 195 | .pfn = __phys_to_pfn(VERSATILE_PCI_BASE), |
196 | .length = VERSATILE_PCI_BASE_SIZE, | 196 | .length = VERSATILE_PCI_BASE_SIZE, |
197 | .type = MT_DEVICE | 197 | .type = MT_DEVICE |
198 | }, { | 198 | }, { |
199 | .virtual = (unsigned long)VERSATILE_PCI_CFG_VIRT_BASE, | 199 | .virtual = (unsigned long)VERSATILE_PCI_CFG_VIRT_BASE, |
200 | .pfn = __phys_to_pfn(VERSATILE_PCI_CFG_BASE), | 200 | .pfn = __phys_to_pfn(VERSATILE_PCI_CFG_BASE), |
201 | .length = VERSATILE_PCI_CFG_BASE_SIZE, | 201 | .length = VERSATILE_PCI_CFG_BASE_SIZE, |
202 | .type = MT_DEVICE | 202 | .type = MT_DEVICE |
203 | }, | 203 | }, |
204 | #if 0 | 204 | #if 0 |
205 | { | 205 | { |
206 | .virtual = VERSATILE_PCI_VIRT_MEM_BASE0, | 206 | .virtual = VERSATILE_PCI_VIRT_MEM_BASE0, |
207 | .pfn = __phys_to_pfn(VERSATILE_PCI_MEM_BASE0), | 207 | .pfn = __phys_to_pfn(VERSATILE_PCI_MEM_BASE0), |
208 | .length = SZ_16M, | 208 | .length = SZ_16M, |
209 | .type = MT_DEVICE | 209 | .type = MT_DEVICE |
210 | }, { | 210 | }, { |
211 | .virtual = VERSATILE_PCI_VIRT_MEM_BASE1, | 211 | .virtual = VERSATILE_PCI_VIRT_MEM_BASE1, |
212 | .pfn = __phys_to_pfn(VERSATILE_PCI_MEM_BASE1), | 212 | .pfn = __phys_to_pfn(VERSATILE_PCI_MEM_BASE1), |
213 | .length = SZ_16M, | 213 | .length = SZ_16M, |
214 | .type = MT_DEVICE | 214 | .type = MT_DEVICE |
215 | }, { | 215 | }, { |
216 | .virtual = VERSATILE_PCI_VIRT_MEM_BASE2, | 216 | .virtual = VERSATILE_PCI_VIRT_MEM_BASE2, |
217 | .pfn = __phys_to_pfn(VERSATILE_PCI_MEM_BASE2), | 217 | .pfn = __phys_to_pfn(VERSATILE_PCI_MEM_BASE2), |
218 | .length = SZ_16M, | 218 | .length = SZ_16M, |
219 | .type = MT_DEVICE | 219 | .type = MT_DEVICE |
220 | }, | 220 | }, |
221 | #endif | 221 | #endif |
222 | #endif | 222 | #endif |
223 | }; | 223 | }; |
224 | 224 | ||
225 | void __init versatile_map_io(void) | 225 | void __init versatile_map_io(void) |
226 | { | 226 | { |
227 | iotable_init(versatile_io_desc, ARRAY_SIZE(versatile_io_desc)); | 227 | iotable_init(versatile_io_desc, ARRAY_SIZE(versatile_io_desc)); |
228 | } | 228 | } |
229 | 229 | ||
230 | 230 | ||
231 | #define VERSATILE_FLASHCTRL (__io_address(VERSATILE_SYS_BASE) + VERSATILE_SYS_FLASH_OFFSET) | 231 | #define VERSATILE_FLASHCTRL (__io_address(VERSATILE_SYS_BASE) + VERSATILE_SYS_FLASH_OFFSET) |
232 | 232 | ||
233 | static int versatile_flash_init(void) | 233 | static int versatile_flash_init(void) |
234 | { | 234 | { |
235 | u32 val; | 235 | u32 val; |
236 | 236 | ||
237 | val = __raw_readl(VERSATILE_FLASHCTRL); | 237 | val = __raw_readl(VERSATILE_FLASHCTRL); |
238 | val &= ~VERSATILE_FLASHPROG_FLVPPEN; | 238 | val &= ~VERSATILE_FLASHPROG_FLVPPEN; |
239 | __raw_writel(val, VERSATILE_FLASHCTRL); | 239 | __raw_writel(val, VERSATILE_FLASHCTRL); |
240 | 240 | ||
241 | return 0; | 241 | return 0; |
242 | } | 242 | } |
243 | 243 | ||
244 | static void versatile_flash_exit(void) | 244 | static void versatile_flash_exit(void) |
245 | { | 245 | { |
246 | u32 val; | 246 | u32 val; |
247 | 247 | ||
248 | val = __raw_readl(VERSATILE_FLASHCTRL); | 248 | val = __raw_readl(VERSATILE_FLASHCTRL); |
249 | val &= ~VERSATILE_FLASHPROG_FLVPPEN; | 249 | val &= ~VERSATILE_FLASHPROG_FLVPPEN; |
250 | __raw_writel(val, VERSATILE_FLASHCTRL); | 250 | __raw_writel(val, VERSATILE_FLASHCTRL); |
251 | } | 251 | } |
252 | 252 | ||
253 | static void versatile_flash_set_vpp(int on) | 253 | static void versatile_flash_set_vpp(int on) |
254 | { | 254 | { |
255 | u32 val; | 255 | u32 val; |
256 | 256 | ||
257 | val = __raw_readl(VERSATILE_FLASHCTRL); | 257 | val = __raw_readl(VERSATILE_FLASHCTRL); |
258 | if (on) | 258 | if (on) |
259 | val |= VERSATILE_FLASHPROG_FLVPPEN; | 259 | val |= VERSATILE_FLASHPROG_FLVPPEN; |
260 | else | 260 | else |
261 | val &= ~VERSATILE_FLASHPROG_FLVPPEN; | 261 | val &= ~VERSATILE_FLASHPROG_FLVPPEN; |
262 | __raw_writel(val, VERSATILE_FLASHCTRL); | 262 | __raw_writel(val, VERSATILE_FLASHCTRL); |
263 | } | 263 | } |
264 | 264 | ||
265 | static struct flash_platform_data versatile_flash_data = { | 265 | static struct flash_platform_data versatile_flash_data = { |
266 | .map_name = "cfi_probe", | 266 | .map_name = "cfi_probe", |
267 | .width = 4, | 267 | .width = 4, |
268 | .init = versatile_flash_init, | 268 | .init = versatile_flash_init, |
269 | .exit = versatile_flash_exit, | 269 | .exit = versatile_flash_exit, |
270 | .set_vpp = versatile_flash_set_vpp, | 270 | .set_vpp = versatile_flash_set_vpp, |
271 | }; | 271 | }; |
272 | 272 | ||
273 | static struct resource versatile_flash_resource = { | 273 | static struct resource versatile_flash_resource = { |
274 | .start = VERSATILE_FLASH_BASE, | 274 | .start = VERSATILE_FLASH_BASE, |
275 | .end = VERSATILE_FLASH_BASE + VERSATILE_FLASH_SIZE - 1, | 275 | .end = VERSATILE_FLASH_BASE + VERSATILE_FLASH_SIZE - 1, |
276 | .flags = IORESOURCE_MEM, | 276 | .flags = IORESOURCE_MEM, |
277 | }; | 277 | }; |
278 | 278 | ||
279 | static struct platform_device versatile_flash_device = { | 279 | static struct platform_device versatile_flash_device = { |
280 | .name = "armflash", | 280 | .name = "armflash", |
281 | .id = 0, | 281 | .id = 0, |
282 | .dev = { | 282 | .dev = { |
283 | .platform_data = &versatile_flash_data, | 283 | .platform_data = &versatile_flash_data, |
284 | }, | 284 | }, |
285 | .num_resources = 1, | 285 | .num_resources = 1, |
286 | .resource = &versatile_flash_resource, | 286 | .resource = &versatile_flash_resource, |
287 | }; | 287 | }; |
288 | 288 | ||
289 | static struct resource smc91x_resources[] = { | 289 | static struct resource smc91x_resources[] = { |
290 | [0] = { | 290 | [0] = { |
291 | .start = VERSATILE_ETH_BASE, | 291 | .start = VERSATILE_ETH_BASE, |
292 | .end = VERSATILE_ETH_BASE + SZ_64K - 1, | 292 | .end = VERSATILE_ETH_BASE + SZ_64K - 1, |
293 | .flags = IORESOURCE_MEM, | 293 | .flags = IORESOURCE_MEM, |
294 | }, | 294 | }, |
295 | [1] = { | 295 | [1] = { |
296 | .start = IRQ_ETH, | 296 | .start = IRQ_ETH, |
297 | .end = IRQ_ETH, | 297 | .end = IRQ_ETH, |
298 | .flags = IORESOURCE_IRQ, | 298 | .flags = IORESOURCE_IRQ, |
299 | }, | 299 | }, |
300 | }; | 300 | }; |
301 | 301 | ||
302 | static struct platform_device smc91x_device = { | 302 | static struct platform_device smc91x_device = { |
303 | .name = "smc91x", | 303 | .name = "smc91x", |
304 | .id = 0, | 304 | .id = 0, |
305 | .num_resources = ARRAY_SIZE(smc91x_resources), | 305 | .num_resources = ARRAY_SIZE(smc91x_resources), |
306 | .resource = smc91x_resources, | 306 | .resource = smc91x_resources, |
307 | }; | 307 | }; |
308 | 308 | ||
309 | static struct resource versatile_i2c_resource = { | 309 | static struct resource versatile_i2c_resource = { |
310 | .start = VERSATILE_I2C_BASE, | 310 | .start = VERSATILE_I2C_BASE, |
311 | .end = VERSATILE_I2C_BASE + SZ_4K - 1, | 311 | .end = VERSATILE_I2C_BASE + SZ_4K - 1, |
312 | .flags = IORESOURCE_MEM, | 312 | .flags = IORESOURCE_MEM, |
313 | }; | 313 | }; |
314 | 314 | ||
315 | static struct platform_device versatile_i2c_device = { | 315 | static struct platform_device versatile_i2c_device = { |
316 | .name = "versatile-i2c", | 316 | .name = "versatile-i2c", |
317 | .id = 0, | 317 | .id = 0, |
318 | .num_resources = 1, | 318 | .num_resources = 1, |
319 | .resource = &versatile_i2c_resource, | 319 | .resource = &versatile_i2c_resource, |
320 | }; | 320 | }; |
321 | 321 | ||
322 | static struct i2c_board_info versatile_i2c_board_info[] = { | 322 | static struct i2c_board_info versatile_i2c_board_info[] = { |
323 | { | 323 | { |
324 | I2C_BOARD_INFO("ds1338", 0xd0 >> 1), | 324 | I2C_BOARD_INFO("ds1338", 0xd0 >> 1), |
325 | }, | 325 | }, |
326 | }; | 326 | }; |
327 | 327 | ||
328 | static int __init versatile_i2c_init(void) | 328 | static int __init versatile_i2c_init(void) |
329 | { | 329 | { |
330 | return i2c_register_board_info(0, versatile_i2c_board_info, | 330 | return i2c_register_board_info(0, versatile_i2c_board_info, |
331 | ARRAY_SIZE(versatile_i2c_board_info)); | 331 | ARRAY_SIZE(versatile_i2c_board_info)); |
332 | } | 332 | } |
333 | arch_initcall(versatile_i2c_init); | 333 | arch_initcall(versatile_i2c_init); |
334 | 334 | ||
335 | #define VERSATILE_SYSMCI (__io_address(VERSATILE_SYS_BASE) + VERSATILE_SYS_MCI_OFFSET) | 335 | #define VERSATILE_SYSMCI (__io_address(VERSATILE_SYS_BASE) + VERSATILE_SYS_MCI_OFFSET) |
336 | 336 | ||
337 | unsigned int mmc_status(struct device *dev) | 337 | unsigned int mmc_status(struct device *dev) |
338 | { | 338 | { |
339 | struct amba_device *adev = container_of(dev, struct amba_device, dev); | 339 | struct amba_device *adev = container_of(dev, struct amba_device, dev); |
340 | u32 mask; | 340 | u32 mask; |
341 | 341 | ||
342 | if (adev->res.start == VERSATILE_MMCI0_BASE) | 342 | if (adev->res.start == VERSATILE_MMCI0_BASE) |
343 | mask = 1; | 343 | mask = 1; |
344 | else | 344 | else |
345 | mask = 2; | 345 | mask = 2; |
346 | 346 | ||
347 | return readl(VERSATILE_SYSMCI) & mask; | 347 | return readl(VERSATILE_SYSMCI) & mask; |
348 | } | 348 | } |
349 | 349 | ||
350 | static struct mmci_platform_data mmc0_plat_data = { | 350 | static struct mmci_platform_data mmc0_plat_data = { |
351 | .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, | 351 | .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, |
352 | .status = mmc_status, | 352 | .status = mmc_status, |
353 | .gpio_wp = -1, | 353 | .gpio_wp = -1, |
354 | .gpio_cd = -1, | 354 | .gpio_cd = -1, |
355 | }; | 355 | }; |
356 | 356 | ||
357 | /* | 357 | /* |
358 | * Clock handling | 358 | * Clock handling |
359 | */ | 359 | */ |
360 | static const struct icst_params versatile_oscvco_params = { | 360 | static const struct icst_params versatile_oscvco_params = { |
361 | .ref = 24000000, | 361 | .ref = 24000000, |
362 | .vco_max = ICST307_VCO_MAX, | 362 | .vco_max = ICST307_VCO_MAX, |
363 | .vco_min = ICST307_VCO_MIN, | 363 | .vco_min = ICST307_VCO_MIN, |
364 | .vd_min = 4 + 8, | 364 | .vd_min = 4 + 8, |
365 | .vd_max = 511 + 8, | 365 | .vd_max = 511 + 8, |
366 | .rd_min = 1 + 2, | 366 | .rd_min = 1 + 2, |
367 | .rd_max = 127 + 2, | 367 | .rd_max = 127 + 2, |
368 | .s2div = icst307_s2div, | 368 | .s2div = icst307_s2div, |
369 | .idx2s = icst307_idx2s, | 369 | .idx2s = icst307_idx2s, |
370 | }; | 370 | }; |
371 | 371 | ||
372 | static void versatile_oscvco_set(struct clk *clk, struct icst_vco vco) | 372 | static void versatile_oscvco_set(struct clk *clk, struct icst_vco vco) |
373 | { | 373 | { |
374 | void __iomem *sys_lock = __io_address(VERSATILE_SYS_BASE) + VERSATILE_SYS_LOCK_OFFSET; | 374 | void __iomem *sys_lock = __io_address(VERSATILE_SYS_BASE) + VERSATILE_SYS_LOCK_OFFSET; |
375 | u32 val; | 375 | u32 val; |
376 | 376 | ||
377 | val = readl(clk->vcoreg) & ~0x7ffff; | 377 | val = readl(clk->vcoreg) & ~0x7ffff; |
378 | val |= vco.v | (vco.r << 9) | (vco.s << 16); | 378 | val |= vco.v | (vco.r << 9) | (vco.s << 16); |
379 | 379 | ||
380 | writel(0xa05f, sys_lock); | 380 | writel(0xa05f, sys_lock); |
381 | writel(val, clk->vcoreg); | 381 | writel(val, clk->vcoreg); |
382 | writel(0, sys_lock); | 382 | writel(0, sys_lock); |
383 | } | 383 | } |
384 | 384 | ||
385 | static const struct clk_ops osc4_clk_ops = { | 385 | static const struct clk_ops osc4_clk_ops = { |
386 | .round = icst_clk_round, | 386 | .round = icst_clk_round, |
387 | .set = icst_clk_set, | 387 | .set = icst_clk_set, |
388 | .setvco = versatile_oscvco_set, | 388 | .setvco = versatile_oscvco_set, |
389 | }; | 389 | }; |
390 | 390 | ||
391 | static struct clk osc4_clk = { | 391 | static struct clk osc4_clk = { |
392 | .ops = &osc4_clk_ops, | 392 | .ops = &osc4_clk_ops, |
393 | .params = &versatile_oscvco_params, | 393 | .params = &versatile_oscvco_params, |
394 | }; | 394 | }; |
395 | 395 | ||
396 | /* | 396 | /* |
397 | * These are fixed clocks. | 397 | * These are fixed clocks. |
398 | */ | 398 | */ |
399 | static struct clk ref24_clk = { | 399 | static struct clk ref24_clk = { |
400 | .rate = 24000000, | 400 | .rate = 24000000, |
401 | }; | 401 | }; |
402 | 402 | ||
403 | static struct clk dummy_apb_pclk; | ||
404 | |||
403 | static struct clk_lookup lookups[] = { | 405 | static struct clk_lookup lookups[] = { |
404 | { /* UART0 */ | 406 | { /* AMBA bus clock */ |
407 | .con_id = "apb_pclk", | ||
408 | .clk = &dummy_apb_pclk, | ||
409 | }, { /* UART0 */ | ||
405 | .dev_id = "dev:f1", | 410 | .dev_id = "dev:f1", |
406 | .clk = &ref24_clk, | 411 | .clk = &ref24_clk, |
407 | }, { /* UART1 */ | 412 | }, { /* UART1 */ |
408 | .dev_id = "dev:f2", | 413 | .dev_id = "dev:f2", |
409 | .clk = &ref24_clk, | 414 | .clk = &ref24_clk, |
410 | }, { /* UART2 */ | 415 | }, { /* UART2 */ |
411 | .dev_id = "dev:f3", | 416 | .dev_id = "dev:f3", |
412 | .clk = &ref24_clk, | 417 | .clk = &ref24_clk, |
413 | }, { /* UART3 */ | 418 | }, { /* UART3 */ |
414 | .dev_id = "fpga:09", | 419 | .dev_id = "fpga:09", |
415 | .clk = &ref24_clk, | 420 | .clk = &ref24_clk, |
416 | }, { /* KMI0 */ | 421 | }, { /* KMI0 */ |
417 | .dev_id = "fpga:06", | 422 | .dev_id = "fpga:06", |
418 | .clk = &ref24_clk, | 423 | .clk = &ref24_clk, |
419 | }, { /* KMI1 */ | 424 | }, { /* KMI1 */ |
420 | .dev_id = "fpga:07", | 425 | .dev_id = "fpga:07", |
421 | .clk = &ref24_clk, | 426 | .clk = &ref24_clk, |
422 | }, { /* MMC0 */ | 427 | }, { /* MMC0 */ |
423 | .dev_id = "fpga:05", | 428 | .dev_id = "fpga:05", |
424 | .clk = &ref24_clk, | 429 | .clk = &ref24_clk, |
425 | }, { /* MMC1 */ | 430 | }, { /* MMC1 */ |
426 | .dev_id = "fpga:0b", | 431 | .dev_id = "fpga:0b", |
427 | .clk = &ref24_clk, | 432 | .clk = &ref24_clk, |
428 | }, { /* CLCD */ | 433 | }, { /* CLCD */ |
429 | .dev_id = "dev:20", | 434 | .dev_id = "dev:20", |
430 | .clk = &osc4_clk, | 435 | .clk = &osc4_clk, |
431 | } | 436 | } |
432 | }; | 437 | }; |
433 | 438 | ||
434 | /* | 439 | /* |
435 | * CLCD support. | 440 | * CLCD support. |
436 | */ | 441 | */ |
437 | #define SYS_CLCD_MODE_MASK (3 << 0) | 442 | #define SYS_CLCD_MODE_MASK (3 << 0) |
438 | #define SYS_CLCD_MODE_888 (0 << 0) | 443 | #define SYS_CLCD_MODE_888 (0 << 0) |
439 | #define SYS_CLCD_MODE_5551 (1 << 0) | 444 | #define SYS_CLCD_MODE_5551 (1 << 0) |
440 | #define SYS_CLCD_MODE_565_RLSB (2 << 0) | 445 | #define SYS_CLCD_MODE_565_RLSB (2 << 0) |
441 | #define SYS_CLCD_MODE_565_BLSB (3 << 0) | 446 | #define SYS_CLCD_MODE_565_BLSB (3 << 0) |
442 | #define SYS_CLCD_NLCDIOON (1 << 2) | 447 | #define SYS_CLCD_NLCDIOON (1 << 2) |
443 | #define SYS_CLCD_VDDPOSSWITCH (1 << 3) | 448 | #define SYS_CLCD_VDDPOSSWITCH (1 << 3) |
444 | #define SYS_CLCD_PWR3V5SWITCH (1 << 4) | 449 | #define SYS_CLCD_PWR3V5SWITCH (1 << 4) |
445 | #define SYS_CLCD_ID_MASK (0x1f << 8) | 450 | #define SYS_CLCD_ID_MASK (0x1f << 8) |
446 | #define SYS_CLCD_ID_SANYO_3_8 (0x00 << 8) | 451 | #define SYS_CLCD_ID_SANYO_3_8 (0x00 << 8) |
447 | #define SYS_CLCD_ID_UNKNOWN_8_4 (0x01 << 8) | 452 | #define SYS_CLCD_ID_UNKNOWN_8_4 (0x01 << 8) |
448 | #define SYS_CLCD_ID_EPSON_2_2 (0x02 << 8) | 453 | #define SYS_CLCD_ID_EPSON_2_2 (0x02 << 8) |
449 | #define SYS_CLCD_ID_SANYO_2_5 (0x07 << 8) | 454 | #define SYS_CLCD_ID_SANYO_2_5 (0x07 << 8) |
450 | #define SYS_CLCD_ID_VGA (0x1f << 8) | 455 | #define SYS_CLCD_ID_VGA (0x1f << 8) |
451 | 456 | ||
452 | static struct clcd_panel vga = { | 457 | static struct clcd_panel vga = { |
453 | .mode = { | 458 | .mode = { |
454 | .name = "VGA", | 459 | .name = "VGA", |
455 | .refresh = 60, | 460 | .refresh = 60, |
456 | .xres = 640, | 461 | .xres = 640, |
457 | .yres = 480, | 462 | .yres = 480, |
458 | .pixclock = 39721, | 463 | .pixclock = 39721, |
459 | .left_margin = 40, | 464 | .left_margin = 40, |
460 | .right_margin = 24, | 465 | .right_margin = 24, |
461 | .upper_margin = 32, | 466 | .upper_margin = 32, |
462 | .lower_margin = 11, | 467 | .lower_margin = 11, |
463 | .hsync_len = 96, | 468 | .hsync_len = 96, |
464 | .vsync_len = 2, | 469 | .vsync_len = 2, |
465 | .sync = 0, | 470 | .sync = 0, |
466 | .vmode = FB_VMODE_NONINTERLACED, | 471 | .vmode = FB_VMODE_NONINTERLACED, |
467 | }, | 472 | }, |
468 | .width = -1, | 473 | .width = -1, |
469 | .height = -1, | 474 | .height = -1, |
470 | .tim2 = TIM2_BCD | TIM2_IPC, | 475 | .tim2 = TIM2_BCD | TIM2_IPC, |
471 | .cntl = CNTL_LCDTFT | CNTL_LCDVCOMP(1), | 476 | .cntl = CNTL_LCDTFT | CNTL_LCDVCOMP(1), |
472 | .bpp = 16, | 477 | .bpp = 16, |
473 | }; | 478 | }; |
474 | 479 | ||
475 | static struct clcd_panel sanyo_3_8_in = { | 480 | static struct clcd_panel sanyo_3_8_in = { |
476 | .mode = { | 481 | .mode = { |
477 | .name = "Sanyo QVGA", | 482 | .name = "Sanyo QVGA", |
478 | .refresh = 116, | 483 | .refresh = 116, |
479 | .xres = 320, | 484 | .xres = 320, |
480 | .yres = 240, | 485 | .yres = 240, |
481 | .pixclock = 100000, | 486 | .pixclock = 100000, |
482 | .left_margin = 6, | 487 | .left_margin = 6, |
483 | .right_margin = 6, | 488 | .right_margin = 6, |
484 | .upper_margin = 5, | 489 | .upper_margin = 5, |
485 | .lower_margin = 5, | 490 | .lower_margin = 5, |
486 | .hsync_len = 6, | 491 | .hsync_len = 6, |
487 | .vsync_len = 6, | 492 | .vsync_len = 6, |
488 | .sync = 0, | 493 | .sync = 0, |
489 | .vmode = FB_VMODE_NONINTERLACED, | 494 | .vmode = FB_VMODE_NONINTERLACED, |
490 | }, | 495 | }, |
491 | .width = -1, | 496 | .width = -1, |
492 | .height = -1, | 497 | .height = -1, |
493 | .tim2 = TIM2_BCD, | 498 | .tim2 = TIM2_BCD, |
494 | .cntl = CNTL_LCDTFT | CNTL_LCDVCOMP(1), | 499 | .cntl = CNTL_LCDTFT | CNTL_LCDVCOMP(1), |
495 | .bpp = 16, | 500 | .bpp = 16, |
496 | }; | 501 | }; |
497 | 502 | ||
498 | static struct clcd_panel sanyo_2_5_in = { | 503 | static struct clcd_panel sanyo_2_5_in = { |
499 | .mode = { | 504 | .mode = { |
500 | .name = "Sanyo QVGA Portrait", | 505 | .name = "Sanyo QVGA Portrait", |
501 | .refresh = 116, | 506 | .refresh = 116, |
502 | .xres = 240, | 507 | .xres = 240, |
503 | .yres = 320, | 508 | .yres = 320, |
504 | .pixclock = 100000, | 509 | .pixclock = 100000, |
505 | .left_margin = 20, | 510 | .left_margin = 20, |
506 | .right_margin = 10, | 511 | .right_margin = 10, |
507 | .upper_margin = 2, | 512 | .upper_margin = 2, |
508 | .lower_margin = 2, | 513 | .lower_margin = 2, |
509 | .hsync_len = 10, | 514 | .hsync_len = 10, |
510 | .vsync_len = 2, | 515 | .vsync_len = 2, |
511 | .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, | 516 | .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, |
512 | .vmode = FB_VMODE_NONINTERLACED, | 517 | .vmode = FB_VMODE_NONINTERLACED, |
513 | }, | 518 | }, |
514 | .width = -1, | 519 | .width = -1, |
515 | .height = -1, | 520 | .height = -1, |
516 | .tim2 = TIM2_IVS | TIM2_IHS | TIM2_IPC, | 521 | .tim2 = TIM2_IVS | TIM2_IHS | TIM2_IPC, |
517 | .cntl = CNTL_LCDTFT | CNTL_LCDVCOMP(1), | 522 | .cntl = CNTL_LCDTFT | CNTL_LCDVCOMP(1), |
518 | .bpp = 16, | 523 | .bpp = 16, |
519 | }; | 524 | }; |
520 | 525 | ||
521 | static struct clcd_panel epson_2_2_in = { | 526 | static struct clcd_panel epson_2_2_in = { |
522 | .mode = { | 527 | .mode = { |
523 | .name = "Epson QCIF", | 528 | .name = "Epson QCIF", |
524 | .refresh = 390, | 529 | .refresh = 390, |
525 | .xres = 176, | 530 | .xres = 176, |
526 | .yres = 220, | 531 | .yres = 220, |
527 | .pixclock = 62500, | 532 | .pixclock = 62500, |
528 | .left_margin = 3, | 533 | .left_margin = 3, |
529 | .right_margin = 2, | 534 | .right_margin = 2, |
530 | .upper_margin = 1, | 535 | .upper_margin = 1, |
531 | .lower_margin = 0, | 536 | .lower_margin = 0, |
532 | .hsync_len = 3, | 537 | .hsync_len = 3, |
533 | .vsync_len = 2, | 538 | .vsync_len = 2, |
534 | .sync = 0, | 539 | .sync = 0, |
535 | .vmode = FB_VMODE_NONINTERLACED, | 540 | .vmode = FB_VMODE_NONINTERLACED, |
536 | }, | 541 | }, |
537 | .width = -1, | 542 | .width = -1, |
538 | .height = -1, | 543 | .height = -1, |
539 | .tim2 = TIM2_BCD | TIM2_IPC, | 544 | .tim2 = TIM2_BCD | TIM2_IPC, |
540 | .cntl = CNTL_LCDTFT | CNTL_LCDVCOMP(1), | 545 | .cntl = CNTL_LCDTFT | CNTL_LCDVCOMP(1), |
541 | .bpp = 16, | 546 | .bpp = 16, |
542 | }; | 547 | }; |
543 | 548 | ||
544 | /* | 549 | /* |
545 | * Detect which LCD panel is connected, and return the appropriate | 550 | * Detect which LCD panel is connected, and return the appropriate |
546 | * clcd_panel structure. Note: we do not have any information on | 551 | * clcd_panel structure. Note: we do not have any information on |
547 | * the required timings for the 8.4in panel, so we presently assume | 552 | * the required timings for the 8.4in panel, so we presently assume |
548 | * VGA timings. | 553 | * VGA timings. |
549 | */ | 554 | */ |
550 | static struct clcd_panel *versatile_clcd_panel(void) | 555 | static struct clcd_panel *versatile_clcd_panel(void) |
551 | { | 556 | { |
552 | void __iomem *sys_clcd = __io_address(VERSATILE_SYS_BASE) + VERSATILE_SYS_CLCD_OFFSET; | 557 | void __iomem *sys_clcd = __io_address(VERSATILE_SYS_BASE) + VERSATILE_SYS_CLCD_OFFSET; |
553 | struct clcd_panel *panel = &vga; | 558 | struct clcd_panel *panel = &vga; |
554 | u32 val; | 559 | u32 val; |
555 | 560 | ||
556 | val = readl(sys_clcd) & SYS_CLCD_ID_MASK; | 561 | val = readl(sys_clcd) & SYS_CLCD_ID_MASK; |
557 | if (val == SYS_CLCD_ID_SANYO_3_8) | 562 | if (val == SYS_CLCD_ID_SANYO_3_8) |
558 | panel = &sanyo_3_8_in; | 563 | panel = &sanyo_3_8_in; |
559 | else if (val == SYS_CLCD_ID_SANYO_2_5) | 564 | else if (val == SYS_CLCD_ID_SANYO_2_5) |
560 | panel = &sanyo_2_5_in; | 565 | panel = &sanyo_2_5_in; |
561 | else if (val == SYS_CLCD_ID_EPSON_2_2) | 566 | else if (val == SYS_CLCD_ID_EPSON_2_2) |
562 | panel = &epson_2_2_in; | 567 | panel = &epson_2_2_in; |
563 | else if (val == SYS_CLCD_ID_VGA) | 568 | else if (val == SYS_CLCD_ID_VGA) |
564 | panel = &vga; | 569 | panel = &vga; |
565 | else { | 570 | else { |
566 | printk(KERN_ERR "CLCD: unknown LCD panel ID 0x%08x, using VGA\n", | 571 | printk(KERN_ERR "CLCD: unknown LCD panel ID 0x%08x, using VGA\n", |
567 | val); | 572 | val); |
568 | panel = &vga; | 573 | panel = &vga; |
569 | } | 574 | } |
570 | 575 | ||
571 | return panel; | 576 | return panel; |
572 | } | 577 | } |
573 | 578 | ||
574 | /* | 579 | /* |
575 | * Disable all display connectors on the interface module. | 580 | * Disable all display connectors on the interface module. |
576 | */ | 581 | */ |
577 | static void versatile_clcd_disable(struct clcd_fb *fb) | 582 | static void versatile_clcd_disable(struct clcd_fb *fb) |
578 | { | 583 | { |
579 | void __iomem *sys_clcd = __io_address(VERSATILE_SYS_BASE) + VERSATILE_SYS_CLCD_OFFSET; | 584 | void __iomem *sys_clcd = __io_address(VERSATILE_SYS_BASE) + VERSATILE_SYS_CLCD_OFFSET; |
580 | u32 val; | 585 | u32 val; |
581 | 586 | ||
582 | val = readl(sys_clcd); | 587 | val = readl(sys_clcd); |
583 | val &= ~SYS_CLCD_NLCDIOON | SYS_CLCD_PWR3V5SWITCH; | 588 | val &= ~SYS_CLCD_NLCDIOON | SYS_CLCD_PWR3V5SWITCH; |
584 | writel(val, sys_clcd); | 589 | writel(val, sys_clcd); |
585 | 590 | ||
586 | #ifdef CONFIG_MACH_VERSATILE_AB | 591 | #ifdef CONFIG_MACH_VERSATILE_AB |
587 | /* | 592 | /* |
588 | * If the LCD is Sanyo 2x5 in on the IB2 board, turn the back-light off | 593 | * If the LCD is Sanyo 2x5 in on the IB2 board, turn the back-light off |
589 | */ | 594 | */ |
590 | if (machine_is_versatile_ab() && fb->panel == &sanyo_2_5_in) { | 595 | if (machine_is_versatile_ab() && fb->panel == &sanyo_2_5_in) { |
591 | void __iomem *versatile_ib2_ctrl = __io_address(VERSATILE_IB2_CTRL); | 596 | void __iomem *versatile_ib2_ctrl = __io_address(VERSATILE_IB2_CTRL); |
592 | unsigned long ctrl; | 597 | unsigned long ctrl; |
593 | 598 | ||
594 | ctrl = readl(versatile_ib2_ctrl); | 599 | ctrl = readl(versatile_ib2_ctrl); |
595 | ctrl &= ~0x01; | 600 | ctrl &= ~0x01; |
596 | writel(ctrl, versatile_ib2_ctrl); | 601 | writel(ctrl, versatile_ib2_ctrl); |
597 | } | 602 | } |
598 | #endif | 603 | #endif |
599 | } | 604 | } |
600 | 605 | ||
601 | /* | 606 | /* |
602 | * Enable the relevant connector on the interface module. | 607 | * Enable the relevant connector on the interface module. |
603 | */ | 608 | */ |
604 | static void versatile_clcd_enable(struct clcd_fb *fb) | 609 | static void versatile_clcd_enable(struct clcd_fb *fb) |
605 | { | 610 | { |
606 | void __iomem *sys_clcd = __io_address(VERSATILE_SYS_BASE) + VERSATILE_SYS_CLCD_OFFSET; | 611 | void __iomem *sys_clcd = __io_address(VERSATILE_SYS_BASE) + VERSATILE_SYS_CLCD_OFFSET; |
607 | u32 val; | 612 | u32 val; |
608 | 613 | ||
609 | val = readl(sys_clcd); | 614 | val = readl(sys_clcd); |
610 | val &= ~SYS_CLCD_MODE_MASK; | 615 | val &= ~SYS_CLCD_MODE_MASK; |
611 | 616 | ||
612 | switch (fb->fb.var.green.length) { | 617 | switch (fb->fb.var.green.length) { |
613 | case 5: | 618 | case 5: |
614 | val |= SYS_CLCD_MODE_5551; | 619 | val |= SYS_CLCD_MODE_5551; |
615 | break; | 620 | break; |
616 | case 6: | 621 | case 6: |
617 | val |= SYS_CLCD_MODE_565_RLSB; | 622 | val |= SYS_CLCD_MODE_565_RLSB; |
618 | break; | 623 | break; |
619 | case 8: | 624 | case 8: |
620 | val |= SYS_CLCD_MODE_888; | 625 | val |= SYS_CLCD_MODE_888; |
621 | break; | 626 | break; |
622 | } | 627 | } |
623 | 628 | ||
624 | /* | 629 | /* |
625 | * Set the MUX | 630 | * Set the MUX |
626 | */ | 631 | */ |
627 | writel(val, sys_clcd); | 632 | writel(val, sys_clcd); |
628 | 633 | ||
629 | /* | 634 | /* |
630 | * And now enable the PSUs | 635 | * And now enable the PSUs |
631 | */ | 636 | */ |
632 | val |= SYS_CLCD_NLCDIOON | SYS_CLCD_PWR3V5SWITCH; | 637 | val |= SYS_CLCD_NLCDIOON | SYS_CLCD_PWR3V5SWITCH; |
633 | writel(val, sys_clcd); | 638 | writel(val, sys_clcd); |
634 | 639 | ||
635 | #ifdef CONFIG_MACH_VERSATILE_AB | 640 | #ifdef CONFIG_MACH_VERSATILE_AB |
636 | /* | 641 | /* |
637 | * If the LCD is Sanyo 2x5 in on the IB2 board, turn the back-light on | 642 | * If the LCD is Sanyo 2x5 in on the IB2 board, turn the back-light on |
638 | */ | 643 | */ |
639 | if (machine_is_versatile_ab() && fb->panel == &sanyo_2_5_in) { | 644 | if (machine_is_versatile_ab() && fb->panel == &sanyo_2_5_in) { |
640 | void __iomem *versatile_ib2_ctrl = __io_address(VERSATILE_IB2_CTRL); | 645 | void __iomem *versatile_ib2_ctrl = __io_address(VERSATILE_IB2_CTRL); |
641 | unsigned long ctrl; | 646 | unsigned long ctrl; |
642 | 647 | ||
643 | ctrl = readl(versatile_ib2_ctrl); | 648 | ctrl = readl(versatile_ib2_ctrl); |
644 | ctrl |= 0x01; | 649 | ctrl |= 0x01; |
645 | writel(ctrl, versatile_ib2_ctrl); | 650 | writel(ctrl, versatile_ib2_ctrl); |
646 | } | 651 | } |
647 | #endif | 652 | #endif |
648 | } | 653 | } |
649 | 654 | ||
650 | static unsigned long framesize = SZ_1M; | 655 | static unsigned long framesize = SZ_1M; |
651 | 656 | ||
652 | static int versatile_clcd_setup(struct clcd_fb *fb) | 657 | static int versatile_clcd_setup(struct clcd_fb *fb) |
653 | { | 658 | { |
654 | dma_addr_t dma; | 659 | dma_addr_t dma; |
655 | 660 | ||
656 | fb->panel = versatile_clcd_panel(); | 661 | fb->panel = versatile_clcd_panel(); |
657 | 662 | ||
658 | fb->fb.screen_base = dma_alloc_writecombine(&fb->dev->dev, framesize, | 663 | fb->fb.screen_base = dma_alloc_writecombine(&fb->dev->dev, framesize, |
659 | &dma, GFP_KERNEL); | 664 | &dma, GFP_KERNEL); |
660 | if (!fb->fb.screen_base) { | 665 | if (!fb->fb.screen_base) { |
661 | printk(KERN_ERR "CLCD: unable to map framebuffer\n"); | 666 | printk(KERN_ERR "CLCD: unable to map framebuffer\n"); |
662 | return -ENOMEM; | 667 | return -ENOMEM; |
663 | } | 668 | } |
664 | 669 | ||
665 | fb->fb.fix.smem_start = dma; | 670 | fb->fb.fix.smem_start = dma; |
666 | fb->fb.fix.smem_len = framesize; | 671 | fb->fb.fix.smem_len = framesize; |
667 | 672 | ||
668 | return 0; | 673 | return 0; |
669 | } | 674 | } |
670 | 675 | ||
671 | static int versatile_clcd_mmap(struct clcd_fb *fb, struct vm_area_struct *vma) | 676 | static int versatile_clcd_mmap(struct clcd_fb *fb, struct vm_area_struct *vma) |
672 | { | 677 | { |
673 | return dma_mmap_writecombine(&fb->dev->dev, vma, | 678 | return dma_mmap_writecombine(&fb->dev->dev, vma, |
674 | fb->fb.screen_base, | 679 | fb->fb.screen_base, |
675 | fb->fb.fix.smem_start, | 680 | fb->fb.fix.smem_start, |
676 | fb->fb.fix.smem_len); | 681 | fb->fb.fix.smem_len); |
677 | } | 682 | } |
678 | 683 | ||
679 | static void versatile_clcd_remove(struct clcd_fb *fb) | 684 | static void versatile_clcd_remove(struct clcd_fb *fb) |
680 | { | 685 | { |
681 | dma_free_writecombine(&fb->dev->dev, fb->fb.fix.smem_len, | 686 | dma_free_writecombine(&fb->dev->dev, fb->fb.fix.smem_len, |
682 | fb->fb.screen_base, fb->fb.fix.smem_start); | 687 | fb->fb.screen_base, fb->fb.fix.smem_start); |
683 | } | 688 | } |
684 | 689 | ||
685 | static struct clcd_board clcd_plat_data = { | 690 | static struct clcd_board clcd_plat_data = { |
686 | .name = "Versatile", | 691 | .name = "Versatile", |
687 | .check = clcdfb_check, | 692 | .check = clcdfb_check, |
688 | .decode = clcdfb_decode, | 693 | .decode = clcdfb_decode, |
689 | .disable = versatile_clcd_disable, | 694 | .disable = versatile_clcd_disable, |
690 | .enable = versatile_clcd_enable, | 695 | .enable = versatile_clcd_enable, |
691 | .setup = versatile_clcd_setup, | 696 | .setup = versatile_clcd_setup, |
692 | .mmap = versatile_clcd_mmap, | 697 | .mmap = versatile_clcd_mmap, |
693 | .remove = versatile_clcd_remove, | 698 | .remove = versatile_clcd_remove, |
694 | }; | 699 | }; |
695 | 700 | ||
696 | static struct pl061_platform_data gpio0_plat_data = { | 701 | static struct pl061_platform_data gpio0_plat_data = { |
697 | .gpio_base = 0, | 702 | .gpio_base = 0, |
698 | .irq_base = IRQ_GPIO0_START, | 703 | .irq_base = IRQ_GPIO0_START, |
699 | }; | 704 | }; |
700 | 705 | ||
701 | static struct pl061_platform_data gpio1_plat_data = { | 706 | static struct pl061_platform_data gpio1_plat_data = { |
702 | .gpio_base = 8, | 707 | .gpio_base = 8, |
703 | .irq_base = IRQ_GPIO1_START, | 708 | .irq_base = IRQ_GPIO1_START, |
704 | }; | 709 | }; |
705 | 710 | ||
706 | #define AACI_IRQ { IRQ_AACI, NO_IRQ } | 711 | #define AACI_IRQ { IRQ_AACI, NO_IRQ } |
707 | #define AACI_DMA { 0x80, 0x81 } | 712 | #define AACI_DMA { 0x80, 0x81 } |
708 | #define MMCI0_IRQ { IRQ_MMCI0A,IRQ_SIC_MMCI0B } | 713 | #define MMCI0_IRQ { IRQ_MMCI0A,IRQ_SIC_MMCI0B } |
709 | #define MMCI0_DMA { 0x84, 0 } | 714 | #define MMCI0_DMA { 0x84, 0 } |
710 | #define KMI0_IRQ { IRQ_SIC_KMI0, NO_IRQ } | 715 | #define KMI0_IRQ { IRQ_SIC_KMI0, NO_IRQ } |
711 | #define KMI0_DMA { 0, 0 } | 716 | #define KMI0_DMA { 0, 0 } |
712 | #define KMI1_IRQ { IRQ_SIC_KMI1, NO_IRQ } | 717 | #define KMI1_IRQ { IRQ_SIC_KMI1, NO_IRQ } |
713 | #define KMI1_DMA { 0, 0 } | 718 | #define KMI1_DMA { 0, 0 } |
714 | 719 | ||
715 | /* | 720 | /* |
716 | * These devices are connected directly to the multi-layer AHB switch | 721 | * These devices are connected directly to the multi-layer AHB switch |
717 | */ | 722 | */ |
718 | #define SMC_IRQ { NO_IRQ, NO_IRQ } | 723 | #define SMC_IRQ { NO_IRQ, NO_IRQ } |
719 | #define SMC_DMA { 0, 0 } | 724 | #define SMC_DMA { 0, 0 } |
720 | #define MPMC_IRQ { NO_IRQ, NO_IRQ } | 725 | #define MPMC_IRQ { NO_IRQ, NO_IRQ } |
721 | #define MPMC_DMA { 0, 0 } | 726 | #define MPMC_DMA { 0, 0 } |
722 | #define CLCD_IRQ { IRQ_CLCDINT, NO_IRQ } | 727 | #define CLCD_IRQ { IRQ_CLCDINT, NO_IRQ } |
723 | #define CLCD_DMA { 0, 0 } | 728 | #define CLCD_DMA { 0, 0 } |
724 | #define DMAC_IRQ { IRQ_DMAINT, NO_IRQ } | 729 | #define DMAC_IRQ { IRQ_DMAINT, NO_IRQ } |
725 | #define DMAC_DMA { 0, 0 } | 730 | #define DMAC_DMA { 0, 0 } |
726 | 731 | ||
727 | /* | 732 | /* |
728 | * These devices are connected via the core APB bridge | 733 | * These devices are connected via the core APB bridge |
729 | */ | 734 | */ |
730 | #define SCTL_IRQ { NO_IRQ, NO_IRQ } | 735 | #define SCTL_IRQ { NO_IRQ, NO_IRQ } |
731 | #define SCTL_DMA { 0, 0 } | 736 | #define SCTL_DMA { 0, 0 } |
732 | #define WATCHDOG_IRQ { IRQ_WDOGINT, NO_IRQ } | 737 | #define WATCHDOG_IRQ { IRQ_WDOGINT, NO_IRQ } |
733 | #define WATCHDOG_DMA { 0, 0 } | 738 | #define WATCHDOG_DMA { 0, 0 } |
734 | #define GPIO0_IRQ { IRQ_GPIOINT0, NO_IRQ } | 739 | #define GPIO0_IRQ { IRQ_GPIOINT0, NO_IRQ } |
735 | #define GPIO0_DMA { 0, 0 } | 740 | #define GPIO0_DMA { 0, 0 } |
736 | #define GPIO1_IRQ { IRQ_GPIOINT1, NO_IRQ } | 741 | #define GPIO1_IRQ { IRQ_GPIOINT1, NO_IRQ } |
737 | #define GPIO1_DMA { 0, 0 } | 742 | #define GPIO1_DMA { 0, 0 } |
738 | #define RTC_IRQ { IRQ_RTCINT, NO_IRQ } | 743 | #define RTC_IRQ { IRQ_RTCINT, NO_IRQ } |
739 | #define RTC_DMA { 0, 0 } | 744 | #define RTC_DMA { 0, 0 } |
740 | 745 | ||
741 | /* | 746 | /* |
742 | * These devices are connected via the DMA APB bridge | 747 | * These devices are connected via the DMA APB bridge |
743 | */ | 748 | */ |
744 | #define SCI_IRQ { IRQ_SCIINT, NO_IRQ } | 749 | #define SCI_IRQ { IRQ_SCIINT, NO_IRQ } |
745 | #define SCI_DMA { 7, 6 } | 750 | #define SCI_DMA { 7, 6 } |
746 | #define UART0_IRQ { IRQ_UARTINT0, NO_IRQ } | 751 | #define UART0_IRQ { IRQ_UARTINT0, NO_IRQ } |
747 | #define UART0_DMA { 15, 14 } | 752 | #define UART0_DMA { 15, 14 } |
748 | #define UART1_IRQ { IRQ_UARTINT1, NO_IRQ } | 753 | #define UART1_IRQ { IRQ_UARTINT1, NO_IRQ } |
749 | #define UART1_DMA { 13, 12 } | 754 | #define UART1_DMA { 13, 12 } |
750 | #define UART2_IRQ { IRQ_UARTINT2, NO_IRQ } | 755 | #define UART2_IRQ { IRQ_UARTINT2, NO_IRQ } |
751 | #define UART2_DMA { 11, 10 } | 756 | #define UART2_DMA { 11, 10 } |
752 | #define SSP_IRQ { IRQ_SSPINT, NO_IRQ } | 757 | #define SSP_IRQ { IRQ_SSPINT, NO_IRQ } |
753 | #define SSP_DMA { 9, 8 } | 758 | #define SSP_DMA { 9, 8 } |
754 | 759 | ||
755 | /* FPGA Primecells */ | 760 | /* FPGA Primecells */ |
756 | AMBA_DEVICE(aaci, "fpga:04", AACI, NULL); | 761 | AMBA_DEVICE(aaci, "fpga:04", AACI, NULL); |
757 | AMBA_DEVICE(mmc0, "fpga:05", MMCI0, &mmc0_plat_data); | 762 | AMBA_DEVICE(mmc0, "fpga:05", MMCI0, &mmc0_plat_data); |
758 | AMBA_DEVICE(kmi0, "fpga:06", KMI0, NULL); | 763 | AMBA_DEVICE(kmi0, "fpga:06", KMI0, NULL); |
759 | AMBA_DEVICE(kmi1, "fpga:07", KMI1, NULL); | 764 | AMBA_DEVICE(kmi1, "fpga:07", KMI1, NULL); |
760 | 765 | ||
761 | /* DevChip Primecells */ | 766 | /* DevChip Primecells */ |
762 | AMBA_DEVICE(smc, "dev:00", SMC, NULL); | 767 | AMBA_DEVICE(smc, "dev:00", SMC, NULL); |
763 | AMBA_DEVICE(mpmc, "dev:10", MPMC, NULL); | 768 | AMBA_DEVICE(mpmc, "dev:10", MPMC, NULL); |
764 | AMBA_DEVICE(clcd, "dev:20", CLCD, &clcd_plat_data); | 769 | AMBA_DEVICE(clcd, "dev:20", CLCD, &clcd_plat_data); |
765 | AMBA_DEVICE(dmac, "dev:30", DMAC, NULL); | 770 | AMBA_DEVICE(dmac, "dev:30", DMAC, NULL); |
766 | AMBA_DEVICE(sctl, "dev:e0", SCTL, NULL); | 771 | AMBA_DEVICE(sctl, "dev:e0", SCTL, NULL); |
767 | AMBA_DEVICE(wdog, "dev:e1", WATCHDOG, NULL); | 772 | AMBA_DEVICE(wdog, "dev:e1", WATCHDOG, NULL); |
768 | AMBA_DEVICE(gpio0, "dev:e4", GPIO0, &gpio0_plat_data); | 773 | AMBA_DEVICE(gpio0, "dev:e4", GPIO0, &gpio0_plat_data); |
769 | AMBA_DEVICE(gpio1, "dev:e5", GPIO1, &gpio1_plat_data); | 774 | AMBA_DEVICE(gpio1, "dev:e5", GPIO1, &gpio1_plat_data); |
770 | AMBA_DEVICE(rtc, "dev:e8", RTC, NULL); | 775 | AMBA_DEVICE(rtc, "dev:e8", RTC, NULL); |
771 | AMBA_DEVICE(sci0, "dev:f0", SCI, NULL); | 776 | AMBA_DEVICE(sci0, "dev:f0", SCI, NULL); |
772 | AMBA_DEVICE(uart0, "dev:f1", UART0, NULL); | 777 | AMBA_DEVICE(uart0, "dev:f1", UART0, NULL); |
773 | AMBA_DEVICE(uart1, "dev:f2", UART1, NULL); | 778 | AMBA_DEVICE(uart1, "dev:f2", UART1, NULL); |
774 | AMBA_DEVICE(uart2, "dev:f3", UART2, NULL); | 779 | AMBA_DEVICE(uart2, "dev:f3", UART2, NULL); |
775 | AMBA_DEVICE(ssp0, "dev:f4", SSP, NULL); | 780 | AMBA_DEVICE(ssp0, "dev:f4", SSP, NULL); |
776 | 781 | ||
777 | static struct amba_device *amba_devs[] __initdata = { | 782 | static struct amba_device *amba_devs[] __initdata = { |
778 | &dmac_device, | 783 | &dmac_device, |
779 | &uart0_device, | 784 | &uart0_device, |
780 | &uart1_device, | 785 | &uart1_device, |
781 | &uart2_device, | 786 | &uart2_device, |
782 | &smc_device, | 787 | &smc_device, |
783 | &mpmc_device, | 788 | &mpmc_device, |
784 | &clcd_device, | 789 | &clcd_device, |
785 | &sctl_device, | 790 | &sctl_device, |
786 | &wdog_device, | 791 | &wdog_device, |
787 | &gpio0_device, | 792 | &gpio0_device, |
788 | &gpio1_device, | 793 | &gpio1_device, |
789 | &rtc_device, | 794 | &rtc_device, |
790 | &sci0_device, | 795 | &sci0_device, |
791 | &ssp0_device, | 796 | &ssp0_device, |
792 | &aaci_device, | 797 | &aaci_device, |
793 | &mmc0_device, | 798 | &mmc0_device, |
794 | &kmi0_device, | 799 | &kmi0_device, |
795 | &kmi1_device, | 800 | &kmi1_device, |
796 | }; | 801 | }; |
797 | 802 | ||
798 | #ifdef CONFIG_LEDS | 803 | #ifdef CONFIG_LEDS |
799 | #define VA_LEDS_BASE (__io_address(VERSATILE_SYS_BASE) + VERSATILE_SYS_LED_OFFSET) | 804 | #define VA_LEDS_BASE (__io_address(VERSATILE_SYS_BASE) + VERSATILE_SYS_LED_OFFSET) |
800 | 805 | ||
801 | static void versatile_leds_event(led_event_t ledevt) | 806 | static void versatile_leds_event(led_event_t ledevt) |
802 | { | 807 | { |
803 | unsigned long flags; | 808 | unsigned long flags; |
804 | u32 val; | 809 | u32 val; |
805 | 810 | ||
806 | local_irq_save(flags); | 811 | local_irq_save(flags); |
807 | val = readl(VA_LEDS_BASE); | 812 | val = readl(VA_LEDS_BASE); |
808 | 813 | ||
809 | switch (ledevt) { | 814 | switch (ledevt) { |
810 | case led_idle_start: | 815 | case led_idle_start: |
811 | val = val & ~VERSATILE_SYS_LED0; | 816 | val = val & ~VERSATILE_SYS_LED0; |
812 | break; | 817 | break; |
813 | 818 | ||
814 | case led_idle_end: | 819 | case led_idle_end: |
815 | val = val | VERSATILE_SYS_LED0; | 820 | val = val | VERSATILE_SYS_LED0; |
816 | break; | 821 | break; |
817 | 822 | ||
818 | case led_timer: | 823 | case led_timer: |
819 | val = val ^ VERSATILE_SYS_LED1; | 824 | val = val ^ VERSATILE_SYS_LED1; |
820 | break; | 825 | break; |
821 | 826 | ||
822 | case led_halted: | 827 | case led_halted: |
823 | val = 0; | 828 | val = 0; |
824 | break; | 829 | break; |
825 | 830 | ||
826 | default: | 831 | default: |
827 | break; | 832 | break; |
828 | } | 833 | } |
829 | 834 | ||
830 | writel(val, VA_LEDS_BASE); | 835 | writel(val, VA_LEDS_BASE); |
831 | local_irq_restore(flags); | 836 | local_irq_restore(flags); |
832 | } | 837 | } |
833 | #endif /* CONFIG_LEDS */ | 838 | #endif /* CONFIG_LEDS */ |
834 | 839 | ||
835 | void __init versatile_init(void) | 840 | void __init versatile_init(void) |
836 | { | 841 | { |
837 | int i; | 842 | int i; |
838 | 843 | ||
839 | osc4_clk.vcoreg = __io_address(VERSATILE_SYS_BASE) + VERSATILE_SYS_OSCCLCD_OFFSET; | 844 | osc4_clk.vcoreg = __io_address(VERSATILE_SYS_BASE) + VERSATILE_SYS_OSCCLCD_OFFSET; |
840 | 845 | ||
841 | clkdev_add_table(lookups, ARRAY_SIZE(lookups)); | 846 | clkdev_add_table(lookups, ARRAY_SIZE(lookups)); |
842 | 847 | ||
843 | platform_device_register(&versatile_flash_device); | 848 | platform_device_register(&versatile_flash_device); |
844 | platform_device_register(&versatile_i2c_device); | 849 | platform_device_register(&versatile_i2c_device); |
845 | platform_device_register(&smc91x_device); | 850 | platform_device_register(&smc91x_device); |
846 | 851 | ||
847 | for (i = 0; i < ARRAY_SIZE(amba_devs); i++) { | 852 | for (i = 0; i < ARRAY_SIZE(amba_devs); i++) { |
848 | struct amba_device *d = amba_devs[i]; | 853 | struct amba_device *d = amba_devs[i]; |
849 | amba_device_register(d, &iomem_resource); | 854 | amba_device_register(d, &iomem_resource); |
850 | } | 855 | } |
851 | 856 | ||
852 | #ifdef CONFIG_LEDS | 857 | #ifdef CONFIG_LEDS |
853 | leds_event = versatile_leds_event; | 858 | leds_event = versatile_leds_event; |
854 | #endif | 859 | #endif |
855 | } | 860 | } |
856 | 861 | ||
857 | /* | 862 | /* |
858 | * Where is the timer (VA)? | 863 | * Where is the timer (VA)? |
859 | */ | 864 | */ |
860 | #define TIMER0_VA_BASE __io_address(VERSATILE_TIMER0_1_BASE) | 865 | #define TIMER0_VA_BASE __io_address(VERSATILE_TIMER0_1_BASE) |
861 | #define TIMER1_VA_BASE (__io_address(VERSATILE_TIMER0_1_BASE) + 0x20) | 866 | #define TIMER1_VA_BASE (__io_address(VERSATILE_TIMER0_1_BASE) + 0x20) |
862 | #define TIMER2_VA_BASE __io_address(VERSATILE_TIMER2_3_BASE) | 867 | #define TIMER2_VA_BASE __io_address(VERSATILE_TIMER2_3_BASE) |
863 | #define TIMER3_VA_BASE (__io_address(VERSATILE_TIMER2_3_BASE) + 0x20) | 868 | #define TIMER3_VA_BASE (__io_address(VERSATILE_TIMER2_3_BASE) + 0x20) |
864 | 869 | ||
865 | /* | 870 | /* |
866 | * Set up timer interrupt, and return the current time in seconds. | 871 | * Set up timer interrupt, and return the current time in seconds. |
867 | */ | 872 | */ |
868 | static void __init versatile_timer_init(void) | 873 | static void __init versatile_timer_init(void) |
869 | { | 874 | { |
870 | u32 val; | 875 | u32 val; |
871 | 876 | ||
872 | /* | 877 | /* |
873 | * set clock frequency: | 878 | * set clock frequency: |
874 | * VERSATILE_REFCLK is 32KHz | 879 | * VERSATILE_REFCLK is 32KHz |
875 | * VERSATILE_TIMCLK is 1MHz | 880 | * VERSATILE_TIMCLK is 1MHz |
876 | */ | 881 | */ |
877 | val = readl(__io_address(VERSATILE_SCTL_BASE)); | 882 | val = readl(__io_address(VERSATILE_SCTL_BASE)); |
878 | writel((VERSATILE_TIMCLK << VERSATILE_TIMER1_EnSel) | | 883 | writel((VERSATILE_TIMCLK << VERSATILE_TIMER1_EnSel) | |
879 | (VERSATILE_TIMCLK << VERSATILE_TIMER2_EnSel) | | 884 | (VERSATILE_TIMCLK << VERSATILE_TIMER2_EnSel) | |
880 | (VERSATILE_TIMCLK << VERSATILE_TIMER3_EnSel) | | 885 | (VERSATILE_TIMCLK << VERSATILE_TIMER3_EnSel) | |
881 | (VERSATILE_TIMCLK << VERSATILE_TIMER4_EnSel) | val, | 886 | (VERSATILE_TIMCLK << VERSATILE_TIMER4_EnSel) | val, |
882 | __io_address(VERSATILE_SCTL_BASE)); | 887 | __io_address(VERSATILE_SCTL_BASE)); |
883 | 888 | ||
884 | /* | 889 | /* |
885 | * Initialise to a known state (all timers off) | 890 | * Initialise to a known state (all timers off) |
886 | */ | 891 | */ |
887 | writel(0, TIMER0_VA_BASE + TIMER_CTRL); | 892 | writel(0, TIMER0_VA_BASE + TIMER_CTRL); |
888 | writel(0, TIMER1_VA_BASE + TIMER_CTRL); | 893 | writel(0, TIMER1_VA_BASE + TIMER_CTRL); |
889 | writel(0, TIMER2_VA_BASE + TIMER_CTRL); | 894 | writel(0, TIMER2_VA_BASE + TIMER_CTRL); |
890 | writel(0, TIMER3_VA_BASE + TIMER_CTRL); | 895 | writel(0, TIMER3_VA_BASE + TIMER_CTRL); |
891 | 896 | ||
892 | sp804_clocksource_init(TIMER3_VA_BASE); | 897 | sp804_clocksource_init(TIMER3_VA_BASE); |
893 | sp804_clockevents_init(TIMER0_VA_BASE, IRQ_TIMERINT0_1); | 898 | sp804_clockevents_init(TIMER0_VA_BASE, IRQ_TIMERINT0_1); |
894 | } | 899 | } |
895 | 900 | ||
896 | struct sys_timer versatile_timer = { | 901 | struct sys_timer versatile_timer = { |
897 | .init = versatile_timer_init, | 902 | .init = versatile_timer_init, |
898 | }; | 903 | }; |
899 | 904 | ||
900 | 905 |
arch/arm/mach-vexpress/v2m.c
1 | /* | 1 | /* |
2 | * Versatile Express V2M Motherboard Support | 2 | * Versatile Express V2M Motherboard Support |
3 | */ | 3 | */ |
4 | #include <linux/device.h> | 4 | #include <linux/device.h> |
5 | #include <linux/amba/bus.h> | 5 | #include <linux/amba/bus.h> |
6 | #include <linux/amba/mmci.h> | 6 | #include <linux/amba/mmci.h> |
7 | #include <linux/io.h> | 7 | #include <linux/io.h> |
8 | #include <linux/init.h> | 8 | #include <linux/init.h> |
9 | #include <linux/platform_device.h> | 9 | #include <linux/platform_device.h> |
10 | #include <linux/smsc911x.h> | 10 | #include <linux/smsc911x.h> |
11 | #include <linux/spinlock.h> | 11 | #include <linux/spinlock.h> |
12 | #include <linux/sysdev.h> | 12 | #include <linux/sysdev.h> |
13 | #include <linux/usb/isp1760.h> | 13 | #include <linux/usb/isp1760.h> |
14 | 14 | ||
15 | #include <asm/clkdev.h> | 15 | #include <asm/clkdev.h> |
16 | #include <asm/sizes.h> | 16 | #include <asm/sizes.h> |
17 | #include <asm/mach/flash.h> | 17 | #include <asm/mach/flash.h> |
18 | #include <asm/mach/map.h> | 18 | #include <asm/mach/map.h> |
19 | #include <asm/mach/time.h> | 19 | #include <asm/mach/time.h> |
20 | #include <asm/hardware/arm_timer.h> | 20 | #include <asm/hardware/arm_timer.h> |
21 | 21 | ||
22 | #include <mach/clkdev.h> | 22 | #include <mach/clkdev.h> |
23 | #include <mach/motherboard.h> | 23 | #include <mach/motherboard.h> |
24 | 24 | ||
25 | #include <plat/timer-sp.h> | 25 | #include <plat/timer-sp.h> |
26 | 26 | ||
27 | #include "core.h" | 27 | #include "core.h" |
28 | 28 | ||
29 | #define V2M_PA_CS0 0x40000000 | 29 | #define V2M_PA_CS0 0x40000000 |
30 | #define V2M_PA_CS1 0x44000000 | 30 | #define V2M_PA_CS1 0x44000000 |
31 | #define V2M_PA_CS2 0x48000000 | 31 | #define V2M_PA_CS2 0x48000000 |
32 | #define V2M_PA_CS3 0x4c000000 | 32 | #define V2M_PA_CS3 0x4c000000 |
33 | #define V2M_PA_CS7 0x10000000 | 33 | #define V2M_PA_CS7 0x10000000 |
34 | 34 | ||
35 | static struct map_desc v2m_io_desc[] __initdata = { | 35 | static struct map_desc v2m_io_desc[] __initdata = { |
36 | { | 36 | { |
37 | .virtual = __MMIO_P2V(V2M_PA_CS7), | 37 | .virtual = __MMIO_P2V(V2M_PA_CS7), |
38 | .pfn = __phys_to_pfn(V2M_PA_CS7), | 38 | .pfn = __phys_to_pfn(V2M_PA_CS7), |
39 | .length = SZ_128K, | 39 | .length = SZ_128K, |
40 | .type = MT_DEVICE, | 40 | .type = MT_DEVICE, |
41 | }, | 41 | }, |
42 | }; | 42 | }; |
43 | 43 | ||
44 | void __init v2m_map_io(struct map_desc *tile, size_t num) | 44 | void __init v2m_map_io(struct map_desc *tile, size_t num) |
45 | { | 45 | { |
46 | iotable_init(v2m_io_desc, ARRAY_SIZE(v2m_io_desc)); | 46 | iotable_init(v2m_io_desc, ARRAY_SIZE(v2m_io_desc)); |
47 | iotable_init(tile, num); | 47 | iotable_init(tile, num); |
48 | } | 48 | } |
49 | 49 | ||
50 | 50 | ||
51 | static void v2m_timer_init(void) | 51 | static void v2m_timer_init(void) |
52 | { | 52 | { |
53 | writel(0, MMIO_P2V(V2M_TIMER0) + TIMER_CTRL); | 53 | writel(0, MMIO_P2V(V2M_TIMER0) + TIMER_CTRL); |
54 | writel(0, MMIO_P2V(V2M_TIMER1) + TIMER_CTRL); | 54 | writel(0, MMIO_P2V(V2M_TIMER1) + TIMER_CTRL); |
55 | 55 | ||
56 | sp804_clocksource_init(MMIO_P2V(V2M_TIMER1)); | 56 | sp804_clocksource_init(MMIO_P2V(V2M_TIMER1)); |
57 | sp804_clockevents_init(MMIO_P2V(V2M_TIMER0), IRQ_V2M_TIMER0); | 57 | sp804_clockevents_init(MMIO_P2V(V2M_TIMER0), IRQ_V2M_TIMER0); |
58 | } | 58 | } |
59 | 59 | ||
60 | struct sys_timer v2m_timer = { | 60 | struct sys_timer v2m_timer = { |
61 | .init = v2m_timer_init, | 61 | .init = v2m_timer_init, |
62 | }; | 62 | }; |
63 | 63 | ||
64 | 64 | ||
65 | static DEFINE_SPINLOCK(v2m_cfg_lock); | 65 | static DEFINE_SPINLOCK(v2m_cfg_lock); |
66 | 66 | ||
67 | int v2m_cfg_write(u32 devfn, u32 data) | 67 | int v2m_cfg_write(u32 devfn, u32 data) |
68 | { | 68 | { |
69 | /* Configuration interface broken? */ | 69 | /* Configuration interface broken? */ |
70 | u32 val; | 70 | u32 val; |
71 | 71 | ||
72 | printk("%s: writing %08x to %08x\n", __func__, data, devfn); | 72 | printk("%s: writing %08x to %08x\n", __func__, data, devfn); |
73 | 73 | ||
74 | devfn |= SYS_CFG_START | SYS_CFG_WRITE; | 74 | devfn |= SYS_CFG_START | SYS_CFG_WRITE; |
75 | 75 | ||
76 | spin_lock(&v2m_cfg_lock); | 76 | spin_lock(&v2m_cfg_lock); |
77 | val = readl(MMIO_P2V(V2M_SYS_CFGSTAT)); | 77 | val = readl(MMIO_P2V(V2M_SYS_CFGSTAT)); |
78 | writel(val & ~SYS_CFG_COMPLETE, MMIO_P2V(V2M_SYS_CFGSTAT)); | 78 | writel(val & ~SYS_CFG_COMPLETE, MMIO_P2V(V2M_SYS_CFGSTAT)); |
79 | 79 | ||
80 | writel(data, MMIO_P2V(V2M_SYS_CFGDATA)); | 80 | writel(data, MMIO_P2V(V2M_SYS_CFGDATA)); |
81 | writel(devfn, MMIO_P2V(V2M_SYS_CFGCTRL)); | 81 | writel(devfn, MMIO_P2V(V2M_SYS_CFGCTRL)); |
82 | 82 | ||
83 | do { | 83 | do { |
84 | val = readl(MMIO_P2V(V2M_SYS_CFGSTAT)); | 84 | val = readl(MMIO_P2V(V2M_SYS_CFGSTAT)); |
85 | } while (val == 0); | 85 | } while (val == 0); |
86 | spin_unlock(&v2m_cfg_lock); | 86 | spin_unlock(&v2m_cfg_lock); |
87 | 87 | ||
88 | return !!(val & SYS_CFG_ERR); | 88 | return !!(val & SYS_CFG_ERR); |
89 | } | 89 | } |
90 | 90 | ||
91 | int v2m_cfg_read(u32 devfn, u32 *data) | 91 | int v2m_cfg_read(u32 devfn, u32 *data) |
92 | { | 92 | { |
93 | u32 val; | 93 | u32 val; |
94 | 94 | ||
95 | devfn |= SYS_CFG_START; | 95 | devfn |= SYS_CFG_START; |
96 | 96 | ||
97 | spin_lock(&v2m_cfg_lock); | 97 | spin_lock(&v2m_cfg_lock); |
98 | writel(0, MMIO_P2V(V2M_SYS_CFGSTAT)); | 98 | writel(0, MMIO_P2V(V2M_SYS_CFGSTAT)); |
99 | writel(devfn, MMIO_P2V(V2M_SYS_CFGCTRL)); | 99 | writel(devfn, MMIO_P2V(V2M_SYS_CFGCTRL)); |
100 | 100 | ||
101 | mb(); | 101 | mb(); |
102 | 102 | ||
103 | do { | 103 | do { |
104 | cpu_relax(); | 104 | cpu_relax(); |
105 | val = readl(MMIO_P2V(V2M_SYS_CFGSTAT)); | 105 | val = readl(MMIO_P2V(V2M_SYS_CFGSTAT)); |
106 | } while (val == 0); | 106 | } while (val == 0); |
107 | 107 | ||
108 | *data = readl(MMIO_P2V(V2M_SYS_CFGDATA)); | 108 | *data = readl(MMIO_P2V(V2M_SYS_CFGDATA)); |
109 | spin_unlock(&v2m_cfg_lock); | 109 | spin_unlock(&v2m_cfg_lock); |
110 | 110 | ||
111 | return !!(val & SYS_CFG_ERR); | 111 | return !!(val & SYS_CFG_ERR); |
112 | } | 112 | } |
113 | 113 | ||
114 | 114 | ||
115 | static struct resource v2m_pcie_i2c_resource = { | 115 | static struct resource v2m_pcie_i2c_resource = { |
116 | .start = V2M_SERIAL_BUS_PCI, | 116 | .start = V2M_SERIAL_BUS_PCI, |
117 | .end = V2M_SERIAL_BUS_PCI + SZ_4K - 1, | 117 | .end = V2M_SERIAL_BUS_PCI + SZ_4K - 1, |
118 | .flags = IORESOURCE_MEM, | 118 | .flags = IORESOURCE_MEM, |
119 | }; | 119 | }; |
120 | 120 | ||
121 | static struct platform_device v2m_pcie_i2c_device = { | 121 | static struct platform_device v2m_pcie_i2c_device = { |
122 | .name = "versatile-i2c", | 122 | .name = "versatile-i2c", |
123 | .id = 0, | 123 | .id = 0, |
124 | .num_resources = 1, | 124 | .num_resources = 1, |
125 | .resource = &v2m_pcie_i2c_resource, | 125 | .resource = &v2m_pcie_i2c_resource, |
126 | }; | 126 | }; |
127 | 127 | ||
128 | static struct resource v2m_ddc_i2c_resource = { | 128 | static struct resource v2m_ddc_i2c_resource = { |
129 | .start = V2M_SERIAL_BUS_DVI, | 129 | .start = V2M_SERIAL_BUS_DVI, |
130 | .end = V2M_SERIAL_BUS_DVI + SZ_4K - 1, | 130 | .end = V2M_SERIAL_BUS_DVI + SZ_4K - 1, |
131 | .flags = IORESOURCE_MEM, | 131 | .flags = IORESOURCE_MEM, |
132 | }; | 132 | }; |
133 | 133 | ||
134 | static struct platform_device v2m_ddc_i2c_device = { | 134 | static struct platform_device v2m_ddc_i2c_device = { |
135 | .name = "versatile-i2c", | 135 | .name = "versatile-i2c", |
136 | .id = 1, | 136 | .id = 1, |
137 | .num_resources = 1, | 137 | .num_resources = 1, |
138 | .resource = &v2m_ddc_i2c_resource, | 138 | .resource = &v2m_ddc_i2c_resource, |
139 | }; | 139 | }; |
140 | 140 | ||
141 | static struct resource v2m_eth_resources[] = { | 141 | static struct resource v2m_eth_resources[] = { |
142 | { | 142 | { |
143 | .start = V2M_LAN9118, | 143 | .start = V2M_LAN9118, |
144 | .end = V2M_LAN9118 + SZ_64K - 1, | 144 | .end = V2M_LAN9118 + SZ_64K - 1, |
145 | .flags = IORESOURCE_MEM, | 145 | .flags = IORESOURCE_MEM, |
146 | }, { | 146 | }, { |
147 | .start = IRQ_V2M_LAN9118, | 147 | .start = IRQ_V2M_LAN9118, |
148 | .end = IRQ_V2M_LAN9118, | 148 | .end = IRQ_V2M_LAN9118, |
149 | .flags = IORESOURCE_IRQ, | 149 | .flags = IORESOURCE_IRQ, |
150 | }, | 150 | }, |
151 | }; | 151 | }; |
152 | 152 | ||
153 | static struct smsc911x_platform_config v2m_eth_config = { | 153 | static struct smsc911x_platform_config v2m_eth_config = { |
154 | .flags = SMSC911X_USE_32BIT, | 154 | .flags = SMSC911X_USE_32BIT, |
155 | .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_HIGH, | 155 | .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_HIGH, |
156 | .irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL, | 156 | .irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL, |
157 | .phy_interface = PHY_INTERFACE_MODE_MII, | 157 | .phy_interface = PHY_INTERFACE_MODE_MII, |
158 | }; | 158 | }; |
159 | 159 | ||
160 | static struct platform_device v2m_eth_device = { | 160 | static struct platform_device v2m_eth_device = { |
161 | .name = "smsc911x", | 161 | .name = "smsc911x", |
162 | .id = -1, | 162 | .id = -1, |
163 | .resource = v2m_eth_resources, | 163 | .resource = v2m_eth_resources, |
164 | .num_resources = ARRAY_SIZE(v2m_eth_resources), | 164 | .num_resources = ARRAY_SIZE(v2m_eth_resources), |
165 | .dev.platform_data = &v2m_eth_config, | 165 | .dev.platform_data = &v2m_eth_config, |
166 | }; | 166 | }; |
167 | 167 | ||
168 | static struct resource v2m_usb_resources[] = { | 168 | static struct resource v2m_usb_resources[] = { |
169 | { | 169 | { |
170 | .start = V2M_ISP1761, | 170 | .start = V2M_ISP1761, |
171 | .end = V2M_ISP1761 + SZ_128K - 1, | 171 | .end = V2M_ISP1761 + SZ_128K - 1, |
172 | .flags = IORESOURCE_MEM, | 172 | .flags = IORESOURCE_MEM, |
173 | }, { | 173 | }, { |
174 | .start = IRQ_V2M_ISP1761, | 174 | .start = IRQ_V2M_ISP1761, |
175 | .end = IRQ_V2M_ISP1761, | 175 | .end = IRQ_V2M_ISP1761, |
176 | .flags = IORESOURCE_IRQ, | 176 | .flags = IORESOURCE_IRQ, |
177 | }, | 177 | }, |
178 | }; | 178 | }; |
179 | 179 | ||
180 | static struct isp1760_platform_data v2m_usb_config = { | 180 | static struct isp1760_platform_data v2m_usb_config = { |
181 | .is_isp1761 = true, | 181 | .is_isp1761 = true, |
182 | .bus_width_16 = false, | 182 | .bus_width_16 = false, |
183 | .port1_otg = true, | 183 | .port1_otg = true, |
184 | .analog_oc = false, | 184 | .analog_oc = false, |
185 | .dack_polarity_high = false, | 185 | .dack_polarity_high = false, |
186 | .dreq_polarity_high = false, | 186 | .dreq_polarity_high = false, |
187 | }; | 187 | }; |
188 | 188 | ||
189 | static struct platform_device v2m_usb_device = { | 189 | static struct platform_device v2m_usb_device = { |
190 | .name = "isp1760", | 190 | .name = "isp1760", |
191 | .id = -1, | 191 | .id = -1, |
192 | .resource = v2m_usb_resources, | 192 | .resource = v2m_usb_resources, |
193 | .num_resources = ARRAY_SIZE(v2m_usb_resources), | 193 | .num_resources = ARRAY_SIZE(v2m_usb_resources), |
194 | .dev.platform_data = &v2m_usb_config, | 194 | .dev.platform_data = &v2m_usb_config, |
195 | }; | 195 | }; |
196 | 196 | ||
197 | static int v2m_flash_init(void) | 197 | static int v2m_flash_init(void) |
198 | { | 198 | { |
199 | writel(0, MMIO_P2V(V2M_SYS_FLASH)); | 199 | writel(0, MMIO_P2V(V2M_SYS_FLASH)); |
200 | return 0; | 200 | return 0; |
201 | } | 201 | } |
202 | 202 | ||
203 | static void v2m_flash_exit(void) | 203 | static void v2m_flash_exit(void) |
204 | { | 204 | { |
205 | writel(0, MMIO_P2V(V2M_SYS_FLASH)); | 205 | writel(0, MMIO_P2V(V2M_SYS_FLASH)); |
206 | } | 206 | } |
207 | 207 | ||
208 | static void v2m_flash_set_vpp(int on) | 208 | static void v2m_flash_set_vpp(int on) |
209 | { | 209 | { |
210 | writel(on != 0, MMIO_P2V(V2M_SYS_FLASH)); | 210 | writel(on != 0, MMIO_P2V(V2M_SYS_FLASH)); |
211 | } | 211 | } |
212 | 212 | ||
213 | static struct flash_platform_data v2m_flash_data = { | 213 | static struct flash_platform_data v2m_flash_data = { |
214 | .map_name = "cfi_probe", | 214 | .map_name = "cfi_probe", |
215 | .width = 4, | 215 | .width = 4, |
216 | .init = v2m_flash_init, | 216 | .init = v2m_flash_init, |
217 | .exit = v2m_flash_exit, | 217 | .exit = v2m_flash_exit, |
218 | .set_vpp = v2m_flash_set_vpp, | 218 | .set_vpp = v2m_flash_set_vpp, |
219 | }; | 219 | }; |
220 | 220 | ||
221 | static struct resource v2m_flash_resources[] = { | 221 | static struct resource v2m_flash_resources[] = { |
222 | { | 222 | { |
223 | .start = V2M_NOR0, | 223 | .start = V2M_NOR0, |
224 | .end = V2M_NOR0 + SZ_64M - 1, | 224 | .end = V2M_NOR0 + SZ_64M - 1, |
225 | .flags = IORESOURCE_MEM, | 225 | .flags = IORESOURCE_MEM, |
226 | }, { | 226 | }, { |
227 | .start = V2M_NOR1, | 227 | .start = V2M_NOR1, |
228 | .end = V2M_NOR1 + SZ_64M - 1, | 228 | .end = V2M_NOR1 + SZ_64M - 1, |
229 | .flags = IORESOURCE_MEM, | 229 | .flags = IORESOURCE_MEM, |
230 | }, | 230 | }, |
231 | }; | 231 | }; |
232 | 232 | ||
233 | static struct platform_device v2m_flash_device = { | 233 | static struct platform_device v2m_flash_device = { |
234 | .name = "armflash", | 234 | .name = "armflash", |
235 | .id = -1, | 235 | .id = -1, |
236 | .resource = v2m_flash_resources, | 236 | .resource = v2m_flash_resources, |
237 | .num_resources = ARRAY_SIZE(v2m_flash_resources), | 237 | .num_resources = ARRAY_SIZE(v2m_flash_resources), |
238 | .dev.platform_data = &v2m_flash_data, | 238 | .dev.platform_data = &v2m_flash_data, |
239 | }; | 239 | }; |
240 | 240 | ||
241 | 241 | ||
242 | static unsigned int v2m_mmci_status(struct device *dev) | 242 | static unsigned int v2m_mmci_status(struct device *dev) |
243 | { | 243 | { |
244 | return !(readl(MMIO_P2V(V2M_SYS_MCI)) & (1 << 0)); | 244 | return !(readl(MMIO_P2V(V2M_SYS_MCI)) & (1 << 0)); |
245 | } | 245 | } |
246 | 246 | ||
247 | static struct mmci_platform_data v2m_mmci_data = { | 247 | static struct mmci_platform_data v2m_mmci_data = { |
248 | .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, | 248 | .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, |
249 | .status = v2m_mmci_status, | 249 | .status = v2m_mmci_status, |
250 | }; | 250 | }; |
251 | 251 | ||
252 | static AMBA_DEVICE(aaci, "mb:aaci", V2M_AACI, NULL); | 252 | static AMBA_DEVICE(aaci, "mb:aaci", V2M_AACI, NULL); |
253 | static AMBA_DEVICE(mmci, "mb:mmci", V2M_MMCI, &v2m_mmci_data); | 253 | static AMBA_DEVICE(mmci, "mb:mmci", V2M_MMCI, &v2m_mmci_data); |
254 | static AMBA_DEVICE(kmi0, "mb:kmi0", V2M_KMI0, NULL); | 254 | static AMBA_DEVICE(kmi0, "mb:kmi0", V2M_KMI0, NULL); |
255 | static AMBA_DEVICE(kmi1, "mb:kmi1", V2M_KMI1, NULL); | 255 | static AMBA_DEVICE(kmi1, "mb:kmi1", V2M_KMI1, NULL); |
256 | static AMBA_DEVICE(uart0, "mb:uart0", V2M_UART0, NULL); | 256 | static AMBA_DEVICE(uart0, "mb:uart0", V2M_UART0, NULL); |
257 | static AMBA_DEVICE(uart1, "mb:uart1", V2M_UART1, NULL); | 257 | static AMBA_DEVICE(uart1, "mb:uart1", V2M_UART1, NULL); |
258 | static AMBA_DEVICE(uart2, "mb:uart2", V2M_UART2, NULL); | 258 | static AMBA_DEVICE(uart2, "mb:uart2", V2M_UART2, NULL); |
259 | static AMBA_DEVICE(uart3, "mb:uart3", V2M_UART3, NULL); | 259 | static AMBA_DEVICE(uart3, "mb:uart3", V2M_UART3, NULL); |
260 | static AMBA_DEVICE(wdt, "mb:wdt", V2M_WDT, NULL); | 260 | static AMBA_DEVICE(wdt, "mb:wdt", V2M_WDT, NULL); |
261 | static AMBA_DEVICE(rtc, "mb:rtc", V2M_RTC, NULL); | 261 | static AMBA_DEVICE(rtc, "mb:rtc", V2M_RTC, NULL); |
262 | 262 | ||
263 | static struct amba_device *v2m_amba_devs[] __initdata = { | 263 | static struct amba_device *v2m_amba_devs[] __initdata = { |
264 | &aaci_device, | 264 | &aaci_device, |
265 | &mmci_device, | 265 | &mmci_device, |
266 | &kmi0_device, | 266 | &kmi0_device, |
267 | &kmi1_device, | 267 | &kmi1_device, |
268 | &uart0_device, | 268 | &uart0_device, |
269 | &uart1_device, | 269 | &uart1_device, |
270 | &uart2_device, | 270 | &uart2_device, |
271 | &uart3_device, | 271 | &uart3_device, |
272 | &wdt_device, | 272 | &wdt_device, |
273 | &rtc_device, | 273 | &rtc_device, |
274 | }; | 274 | }; |
275 | 275 | ||
276 | 276 | ||
277 | static long v2m_osc_round(struct clk *clk, unsigned long rate) | 277 | static long v2m_osc_round(struct clk *clk, unsigned long rate) |
278 | { | 278 | { |
279 | return rate; | 279 | return rate; |
280 | } | 280 | } |
281 | 281 | ||
282 | static int v2m_osc1_set(struct clk *clk, unsigned long rate) | 282 | static int v2m_osc1_set(struct clk *clk, unsigned long rate) |
283 | { | 283 | { |
284 | return v2m_cfg_write(SYS_CFG_OSC | SYS_CFG_SITE_MB | 1, rate); | 284 | return v2m_cfg_write(SYS_CFG_OSC | SYS_CFG_SITE_MB | 1, rate); |
285 | } | 285 | } |
286 | 286 | ||
287 | static const struct clk_ops osc1_clk_ops = { | 287 | static const struct clk_ops osc1_clk_ops = { |
288 | .round = v2m_osc_round, | 288 | .round = v2m_osc_round, |
289 | .set = v2m_osc1_set, | 289 | .set = v2m_osc1_set, |
290 | }; | 290 | }; |
291 | 291 | ||
292 | static struct clk osc1_clk = { | 292 | static struct clk osc1_clk = { |
293 | .ops = &osc1_clk_ops, | 293 | .ops = &osc1_clk_ops, |
294 | .rate = 24000000, | 294 | .rate = 24000000, |
295 | }; | 295 | }; |
296 | 296 | ||
297 | static struct clk osc2_clk = { | 297 | static struct clk osc2_clk = { |
298 | .rate = 24000000, | 298 | .rate = 24000000, |
299 | }; | 299 | }; |
300 | 300 | ||
301 | static struct clk dummy_apb_pclk; | ||
302 | |||
301 | static struct clk_lookup v2m_lookups[] = { | 303 | static struct clk_lookup v2m_lookups[] = { |
302 | { /* UART0 */ | 304 | { /* AMBA bus clock */ |
305 | .con_id = "apb_pclk", | ||
306 | .clk = &dummy_apb_pclk, | ||
307 | }, { /* UART0 */ | ||
303 | .dev_id = "mb:uart0", | 308 | .dev_id = "mb:uart0", |
304 | .clk = &osc2_clk, | 309 | .clk = &osc2_clk, |
305 | }, { /* UART1 */ | 310 | }, { /* UART1 */ |
306 | .dev_id = "mb:uart1", | 311 | .dev_id = "mb:uart1", |
307 | .clk = &osc2_clk, | 312 | .clk = &osc2_clk, |
308 | }, { /* UART2 */ | 313 | }, { /* UART2 */ |
309 | .dev_id = "mb:uart2", | 314 | .dev_id = "mb:uart2", |
310 | .clk = &osc2_clk, | 315 | .clk = &osc2_clk, |
311 | }, { /* UART3 */ | 316 | }, { /* UART3 */ |
312 | .dev_id = "mb:uart3", | 317 | .dev_id = "mb:uart3", |
313 | .clk = &osc2_clk, | 318 | .clk = &osc2_clk, |
314 | }, { /* KMI0 */ | 319 | }, { /* KMI0 */ |
315 | .dev_id = "mb:kmi0", | 320 | .dev_id = "mb:kmi0", |
316 | .clk = &osc2_clk, | 321 | .clk = &osc2_clk, |
317 | }, { /* KMI1 */ | 322 | }, { /* KMI1 */ |
318 | .dev_id = "mb:kmi1", | 323 | .dev_id = "mb:kmi1", |
319 | .clk = &osc2_clk, | 324 | .clk = &osc2_clk, |
320 | }, { /* MMC0 */ | 325 | }, { /* MMC0 */ |
321 | .dev_id = "mb:mmci", | 326 | .dev_id = "mb:mmci", |
322 | .clk = &osc2_clk, | 327 | .clk = &osc2_clk, |
323 | }, { /* CLCD */ | 328 | }, { /* CLCD */ |
324 | .dev_id = "mb:clcd", | 329 | .dev_id = "mb:clcd", |
325 | .clk = &osc1_clk, | 330 | .clk = &osc1_clk, |
326 | }, | 331 | }, |
327 | }; | 332 | }; |
328 | 333 | ||
329 | static void v2m_power_off(void) | 334 | static void v2m_power_off(void) |
330 | { | 335 | { |
331 | if (v2m_cfg_write(SYS_CFG_SHUTDOWN | SYS_CFG_SITE_MB, 0)) | 336 | if (v2m_cfg_write(SYS_CFG_SHUTDOWN | SYS_CFG_SITE_MB, 0)) |
332 | printk(KERN_EMERG "Unable to shutdown\n"); | 337 | printk(KERN_EMERG "Unable to shutdown\n"); |
333 | } | 338 | } |
334 | 339 | ||
335 | static void v2m_restart(char str, const char *cmd) | 340 | static void v2m_restart(char str, const char *cmd) |
336 | { | 341 | { |
337 | if (v2m_cfg_write(SYS_CFG_REBOOT | SYS_CFG_SITE_MB, 0)) | 342 | if (v2m_cfg_write(SYS_CFG_REBOOT | SYS_CFG_SITE_MB, 0)) |
338 | printk(KERN_EMERG "Unable to reboot\n"); | 343 | printk(KERN_EMERG "Unable to reboot\n"); |
339 | } | 344 | } |
340 | 345 | ||
341 | static int __init v2m_init(void) | 346 | static int __init v2m_init(void) |
342 | { | 347 | { |
343 | int i; | 348 | int i; |
344 | 349 | ||
345 | clkdev_add_table(v2m_lookups, ARRAY_SIZE(v2m_lookups)); | 350 | clkdev_add_table(v2m_lookups, ARRAY_SIZE(v2m_lookups)); |
346 | 351 | ||
347 | platform_device_register(&v2m_pcie_i2c_device); | 352 | platform_device_register(&v2m_pcie_i2c_device); |
348 | platform_device_register(&v2m_ddc_i2c_device); | 353 | platform_device_register(&v2m_ddc_i2c_device); |
349 | platform_device_register(&v2m_flash_device); | 354 | platform_device_register(&v2m_flash_device); |
350 | platform_device_register(&v2m_eth_device); | 355 | platform_device_register(&v2m_eth_device); |
351 | platform_device_register(&v2m_usb_device); | 356 | platform_device_register(&v2m_usb_device); |
352 | 357 | ||
353 | for (i = 0; i < ARRAY_SIZE(v2m_amba_devs); i++) | 358 | for (i = 0; i < ARRAY_SIZE(v2m_amba_devs); i++) |
354 | amba_device_register(v2m_amba_devs[i], &iomem_resource); | 359 | amba_device_register(v2m_amba_devs[i], &iomem_resource); |
355 | 360 | ||
356 | pm_power_off = v2m_power_off; | 361 | pm_power_off = v2m_power_off; |
357 | arm_pm_restart = v2m_restart; | 362 | arm_pm_restart = v2m_restart; |
358 | 363 | ||
359 | return 0; | 364 | return 0; |
360 | } | 365 | } |
361 | arch_initcall(v2m_init); | 366 | arch_initcall(v2m_init); |
362 | 367 |