Commit 3126c7bc4106c572ef47e2c220df5a00e7973379

Authored by Russell King
1 parent 2f7989efd4

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
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