2 * arch/arm/mach-spear6xx/clock.c
4 * SPEAr6xx machines clock framework source file
6 * Copyright (C) 2009 ST Microelectronics
7 * Viresh Kumar<viresh.kumar@st.com>
9 * This file is licensed under the terms of the GNU General Public
10 * License version 2. This program is licensed "as is" without any
11 * warranty of any kind, whether express or implied.
14 #include <linux/init.h>
16 #include <linux/kernel.h>
17 #include <plat/clock.h>
18 #include <mach/misc_regs.h>
19 #include <mach/spear.h>
21 #define PLL1_CTR (MISC_BASE + 0x008)
22 #define PLL1_FRQ (MISC_BASE + 0x00C)
23 #define PLL1_MOD (MISC_BASE + 0x010)
24 #define PLL2_CTR (MISC_BASE + 0x014)
25 /* PLL_CTR register masks */
27 #define PLL_MODE_SHIFT 4
28 #define PLL_MODE_MASK 0x3
29 #define PLL_MODE_NORMAL 0
30 #define PLL_MODE_FRACTION 1
31 #define PLL_MODE_DITH_DSB 2
32 #define PLL_MODE_DITH_SSB 3
34 #define PLL2_FRQ (MISC_BASE + 0x018)
35 /* PLL FRQ register masks */
36 #define PLL_DIV_N_SHIFT 0
37 #define PLL_DIV_N_MASK 0xFF
38 #define PLL_DIV_P_SHIFT 8
39 #define PLL_DIV_P_MASK 0x7
40 #define PLL_NORM_FDBK_M_SHIFT 24
41 #define PLL_NORM_FDBK_M_MASK 0xFF
42 #define PLL_DITH_FDBK_M_SHIFT 16
43 #define PLL_DITH_FDBK_M_MASK 0xFFFF
45 #define PLL2_MOD (MISC_BASE + 0x01C)
46 #define PLL_CLK_CFG (MISC_BASE + 0x020)
47 #define CORE_CLK_CFG (MISC_BASE + 0x024)
48 /* CORE CLK CFG register masks */
49 #define PLL_HCLK_RATIO_SHIFT 10
50 #define PLL_HCLK_RATIO_MASK 0x3
51 #define HCLK_PCLK_RATIO_SHIFT 8
52 #define HCLK_PCLK_RATIO_MASK 0x3
54 #define PERIP_CLK_CFG (MISC_BASE + 0x028)
55 /* PERIP_CLK_CFG register masks */
56 #define CLCD_CLK_SHIFT 2
57 #define CLCD_CLK_MASK 0x3
58 #define UART_CLK_SHIFT 4
59 #define UART_CLK_MASK 0x1
60 #define FIRDA_CLK_SHIFT 5
61 #define FIRDA_CLK_MASK 0x3
62 #define GPT0_CLK_SHIFT 8
63 #define GPT1_CLK_SHIFT 10
64 #define GPT2_CLK_SHIFT 11
65 #define GPT3_CLK_SHIFT 12
66 #define GPT_CLK_MASK 0x1
67 #define AUX_CLK_PLL3_VAL 0
68 #define AUX_CLK_PLL1_VAL 1
70 #define PERIP1_CLK_ENB (MISC_BASE + 0x02C)
71 /* PERIP1_CLK_ENB register masks */
72 #define UART0_CLK_ENB 3
73 #define UART1_CLK_ENB 4
74 #define SSP0_CLK_ENB 5
75 #define SSP1_CLK_ENB 6
77 #define JPEG_CLK_ENB 8
78 #define FSMC_CLK_ENB 9
79 #define FIRDA_CLK_ENB 10
80 #define GPT2_CLK_ENB 11
81 #define GPT3_CLK_ENB 12
82 #define GPIO2_CLK_ENB 13
83 #define SSP2_CLK_ENB 14
84 #define ADC_CLK_ENB 15
85 #define GPT1_CLK_ENB 11
86 #define RTC_CLK_ENB 17
87 #define GPIO1_CLK_ENB 18
88 #define DMA_CLK_ENB 19
89 #define SMI_CLK_ENB 21
90 #define CLCD_CLK_ENB 22
91 #define GMAC_CLK_ENB 23
92 #define USBD_CLK_ENB 24
93 #define USBH0_CLK_ENB 25
94 #define USBH1_CLK_ENB 26
96 #define PRSC1_CLK_CFG (MISC_BASE + 0x044)
97 #define PRSC2_CLK_CFG (MISC_BASE + 0x048)
98 #define PRSC3_CLK_CFG (MISC_BASE + 0x04C)
99 /* gpt synthesizer register masks */
100 #define GPT_MSCALE_SHIFT 0
101 #define GPT_MSCALE_MASK 0xFFF
102 #define GPT_NSCALE_SHIFT 12
103 #define GPT_NSCALE_MASK 0xF
105 #define AMEM_CLK_CFG (MISC_BASE + 0x050)
106 #define EXPI_CLK_CFG (MISC_BASE + 0x054)
107 #define CLCD_CLK_SYNT (MISC_BASE + 0x05C)
108 #define FIRDA_CLK_SYNT (MISC_BASE + 0x060)
109 #define UART_CLK_SYNT (MISC_BASE + 0x064)
110 #define GMAC_CLK_SYNT (MISC_BASE + 0x068)
111 #define RAS1_CLK_SYNT (MISC_BASE + 0x06C)
112 #define RAS2_CLK_SYNT (MISC_BASE + 0x070)
113 #define RAS3_CLK_SYNT (MISC_BASE + 0x074)
114 #define RAS4_CLK_SYNT (MISC_BASE + 0x078)
115 /* aux clk synthesiser register masks for irda to ras4 */
116 #define AUX_SYNT_ENB 31
117 #define AUX_EQ_SEL_SHIFT 30
118 #define AUX_EQ_SEL_MASK 1
119 #define AUX_EQ1_SEL 0
120 #define AUX_EQ2_SEL 1
121 #define AUX_XSCALE_SHIFT 16
122 #define AUX_XSCALE_MASK 0xFFF
123 #define AUX_YSCALE_SHIFT 0
124 #define AUX_YSCALE_MASK 0xFFF
127 /* 32 KHz oscillator clock */
128 static struct clk osc_32k_clk = {
129 .flags = ALWAYS_ENABLED,
133 /* 30 MHz oscillator clock */
134 static struct clk osc_30m_clk = {
135 .flags = ALWAYS_ENABLED,
139 /* clock derived from 32 KHz osc clk */
141 static struct clk rtc_clk = {
142 .pclk = &osc_32k_clk,
143 .en_reg = PERIP1_CLK_ENB,
144 .en_reg_bit = RTC_CLK_ENB,
145 .recalc = &follow_parent,
148 /* clock derived from 30 MHz osc clk */
149 /* pll masks structure */
150 static struct pll_clk_masks pll1_masks = {
151 .mode_mask = PLL_MODE_MASK,
152 .mode_shift = PLL_MODE_SHIFT,
153 .norm_fdbk_m_mask = PLL_NORM_FDBK_M_MASK,
154 .norm_fdbk_m_shift = PLL_NORM_FDBK_M_SHIFT,
155 .dith_fdbk_m_mask = PLL_DITH_FDBK_M_MASK,
156 .dith_fdbk_m_shift = PLL_DITH_FDBK_M_SHIFT,
157 .div_p_mask = PLL_DIV_P_MASK,
158 .div_p_shift = PLL_DIV_P_SHIFT,
159 .div_n_mask = PLL_DIV_N_MASK,
160 .div_n_shift = PLL_DIV_N_SHIFT,
163 /* pll1 configuration structure */
164 static struct pll_clk_config pll1_config = {
165 .mode_reg = PLL1_CTR,
167 .masks = &pll1_masks,
170 /* pll rate configuration table, in ascending order of rates */
171 struct pll_rate_tbl pll_rtbl[] = {
172 {.mode = 0, .m = 0x85, .n = 0x0C, .p = 0x1}, /* 266 MHz */
173 {.mode = 0, .m = 0xA6, .n = 0x0C, .p = 0x1}, /* 332 MHz */
177 static struct clk pll1_clk = {
178 .flags = ENABLED_ON_INIT,
179 .pclk = &osc_30m_clk,
181 .en_reg_bit = PLL_ENABLE,
182 .calc_rate = &pll_calc_rate,
183 .recalc = &pll_clk_recalc,
184 .set_rate = &pll_clk_set_rate,
185 .rate_config = {pll_rtbl, ARRAY_SIZE(pll_rtbl), 1},
186 .private_data = &pll1_config,
189 /* PLL3 48 MHz clock */
190 static struct clk pll3_48m_clk = {
191 .flags = ALWAYS_ENABLED,
192 .pclk = &osc_30m_clk,
196 /* watch dog timer clock */
197 static struct clk wdt_clk = {
198 .flags = ALWAYS_ENABLED,
199 .pclk = &osc_30m_clk,
200 .recalc = &follow_parent,
203 /* clock derived from pll1 clk */
205 static struct clk cpu_clk = {
206 .flags = ALWAYS_ENABLED,
208 .recalc = &follow_parent,
211 /* ahb masks structure */
212 static struct bus_clk_masks ahb_masks = {
213 .mask = PLL_HCLK_RATIO_MASK,
214 .shift = PLL_HCLK_RATIO_SHIFT,
217 /* ahb configuration structure */
218 static struct bus_clk_config ahb_config = {
223 /* ahb rate configuration table, in ascending order of rates */
224 struct bus_rate_tbl bus_rtbl[] = {
225 {.div = 3}, /* == parent divided by 4 */
226 {.div = 2}, /* == parent divided by 3 */
227 {.div = 1}, /* == parent divided by 2 */
228 {.div = 0}, /* == parent divided by 1 */
232 static struct clk ahb_clk = {
233 .flags = ALWAYS_ENABLED,
235 .calc_rate = &bus_calc_rate,
236 .recalc = &bus_clk_recalc,
237 .set_rate = &bus_clk_set_rate,
238 .rate_config = {bus_rtbl, ARRAY_SIZE(bus_rtbl), 2},
239 .private_data = &ahb_config,
242 /* auxiliary synthesizers masks */
243 static struct aux_clk_masks aux_masks = {
244 .eq_sel_mask = AUX_EQ_SEL_MASK,
245 .eq_sel_shift = AUX_EQ_SEL_SHIFT,
246 .eq1_mask = AUX_EQ1_SEL,
247 .eq2_mask = AUX_EQ2_SEL,
248 .xscale_sel_mask = AUX_XSCALE_MASK,
249 .xscale_sel_shift = AUX_XSCALE_SHIFT,
250 .yscale_sel_mask = AUX_YSCALE_MASK,
251 .yscale_sel_shift = AUX_YSCALE_SHIFT,
254 /* uart configurations */
255 static struct aux_clk_config uart_synth_config = {
256 .synth_reg = UART_CLK_SYNT,
260 /* aux rate configuration table, in ascending order of rates */
261 struct aux_rate_tbl aux_rtbl[] = {
262 /* For PLL1 = 332 MHz */
263 {.xscale = 1, .yscale = 8, .eq = 1}, /* 41.5 MHz */
264 {.xscale = 1, .yscale = 4, .eq = 1}, /* 83 MHz */
265 {.xscale = 1, .yscale = 2, .eq = 1}, /* 166 MHz */
268 /* uart synth clock */
269 static struct clk uart_synth_clk = {
270 .en_reg = UART_CLK_SYNT,
271 .en_reg_bit = AUX_SYNT_ENB,
273 .calc_rate = &aux_calc_rate,
274 .recalc = &aux_clk_recalc,
275 .set_rate = &aux_clk_set_rate,
276 .rate_config = {aux_rtbl, ARRAY_SIZE(aux_rtbl), 2},
277 .private_data = &uart_synth_config,
281 static struct pclk_info uart_pclk_info[] = {
283 .pclk = &uart_synth_clk,
284 .pclk_val = AUX_CLK_PLL1_VAL,
286 .pclk = &pll3_48m_clk,
287 .pclk_val = AUX_CLK_PLL3_VAL,
291 /* uart parent select structure */
292 static struct pclk_sel uart_pclk_sel = {
293 .pclk_info = uart_pclk_info,
294 .pclk_count = ARRAY_SIZE(uart_pclk_info),
295 .pclk_sel_reg = PERIP_CLK_CFG,
296 .pclk_sel_mask = UART_CLK_MASK,
300 static struct clk uart0_clk = {
301 .en_reg = PERIP1_CLK_ENB,
302 .en_reg_bit = UART0_CLK_ENB,
303 .pclk_sel = &uart_pclk_sel,
304 .pclk_sel_shift = UART_CLK_SHIFT,
305 .recalc = &follow_parent,
309 static struct clk uart1_clk = {
310 .en_reg = PERIP1_CLK_ENB,
311 .en_reg_bit = UART1_CLK_ENB,
312 .pclk_sel = &uart_pclk_sel,
313 .pclk_sel_shift = UART_CLK_SHIFT,
314 .recalc = &follow_parent,
317 /* firda configurations */
318 static struct aux_clk_config firda_synth_config = {
319 .synth_reg = FIRDA_CLK_SYNT,
323 /* firda synth clock */
324 static struct clk firda_synth_clk = {
325 .en_reg = FIRDA_CLK_SYNT,
326 .en_reg_bit = AUX_SYNT_ENB,
328 .calc_rate = &aux_calc_rate,
329 .recalc = &aux_clk_recalc,
330 .set_rate = &aux_clk_set_rate,
331 .rate_config = {aux_rtbl, ARRAY_SIZE(aux_rtbl), 2},
332 .private_data = &firda_synth_config,
336 static struct pclk_info firda_pclk_info[] = {
338 .pclk = &firda_synth_clk,
339 .pclk_val = AUX_CLK_PLL1_VAL,
341 .pclk = &pll3_48m_clk,
342 .pclk_val = AUX_CLK_PLL3_VAL,
346 /* firda parent select structure */
347 static struct pclk_sel firda_pclk_sel = {
348 .pclk_info = firda_pclk_info,
349 .pclk_count = ARRAY_SIZE(firda_pclk_info),
350 .pclk_sel_reg = PERIP_CLK_CFG,
351 .pclk_sel_mask = FIRDA_CLK_MASK,
355 static struct clk firda_clk = {
356 .en_reg = PERIP1_CLK_ENB,
357 .en_reg_bit = FIRDA_CLK_ENB,
358 .pclk_sel = &firda_pclk_sel,
359 .pclk_sel_shift = FIRDA_CLK_SHIFT,
360 .recalc = &follow_parent,
363 /* clcd configurations */
364 static struct aux_clk_config clcd_synth_config = {
365 .synth_reg = CLCD_CLK_SYNT,
369 /* firda synth clock */
370 static struct clk clcd_synth_clk = {
371 .en_reg = CLCD_CLK_SYNT,
372 .en_reg_bit = AUX_SYNT_ENB,
374 .calc_rate = &aux_calc_rate,
375 .recalc = &aux_clk_recalc,
376 .set_rate = &aux_clk_set_rate,
377 .rate_config = {aux_rtbl, ARRAY_SIZE(aux_rtbl), 2},
378 .private_data = &clcd_synth_config,
382 static struct pclk_info clcd_pclk_info[] = {
384 .pclk = &clcd_synth_clk,
385 .pclk_val = AUX_CLK_PLL1_VAL,
387 .pclk = &pll3_48m_clk,
388 .pclk_val = AUX_CLK_PLL3_VAL,
392 /* clcd parent select structure */
393 static struct pclk_sel clcd_pclk_sel = {
394 .pclk_info = clcd_pclk_info,
395 .pclk_count = ARRAY_SIZE(clcd_pclk_info),
396 .pclk_sel_reg = PERIP_CLK_CFG,
397 .pclk_sel_mask = CLCD_CLK_MASK,
401 static struct clk clcd_clk = {
402 .en_reg = PERIP1_CLK_ENB,
403 .en_reg_bit = CLCD_CLK_ENB,
404 .pclk_sel = &clcd_pclk_sel,
405 .pclk_sel_shift = CLCD_CLK_SHIFT,
406 .recalc = &follow_parent,
409 /* gpt synthesizer masks */
410 static struct gpt_clk_masks gpt_masks = {
411 .mscale_sel_mask = GPT_MSCALE_MASK,
412 .mscale_sel_shift = GPT_MSCALE_SHIFT,
413 .nscale_sel_mask = GPT_NSCALE_MASK,
414 .nscale_sel_shift = GPT_NSCALE_SHIFT,
417 /* gpt rate configuration table, in ascending order of rates */
418 struct gpt_rate_tbl gpt_rtbl[] = {
419 /* For pll1 = 332 MHz */
420 {.mscale = 4, .nscale = 0}, /* 41.5 MHz */
421 {.mscale = 2, .nscale = 0}, /* 55.3 MHz */
422 {.mscale = 1, .nscale = 0}, /* 83 MHz */
425 /* gpt0 synth clk config*/
426 static struct gpt_clk_config gpt0_synth_config = {
427 .synth_reg = PRSC1_CLK_CFG,
431 /* gpt synth clock */
432 static struct clk gpt0_synth_clk = {
433 .flags = ALWAYS_ENABLED,
435 .calc_rate = &gpt_calc_rate,
436 .recalc = &gpt_clk_recalc,
437 .set_rate = &gpt_clk_set_rate,
438 .rate_config = {gpt_rtbl, ARRAY_SIZE(gpt_rtbl), 2},
439 .private_data = &gpt0_synth_config,
443 static struct pclk_info gpt0_pclk_info[] = {
445 .pclk = &gpt0_synth_clk,
446 .pclk_val = AUX_CLK_PLL1_VAL,
448 .pclk = &pll3_48m_clk,
449 .pclk_val = AUX_CLK_PLL3_VAL,
453 /* gpt parent select structure */
454 static struct pclk_sel gpt0_pclk_sel = {
455 .pclk_info = gpt0_pclk_info,
456 .pclk_count = ARRAY_SIZE(gpt0_pclk_info),
457 .pclk_sel_reg = PERIP_CLK_CFG,
458 .pclk_sel_mask = GPT_CLK_MASK,
461 /* gpt0 ARM1 subsystem timer clock */
462 static struct clk gpt0_clk = {
463 .flags = ALWAYS_ENABLED,
464 .pclk_sel = &gpt0_pclk_sel,
465 .pclk_sel_shift = GPT0_CLK_SHIFT,
466 .recalc = &follow_parent,
470 /* Note: gpt0 and gpt1 share same parent clocks */
471 /* gpt parent select structure */
472 static struct pclk_sel gpt1_pclk_sel = {
473 .pclk_info = gpt0_pclk_info,
474 .pclk_count = ARRAY_SIZE(gpt0_pclk_info),
475 .pclk_sel_reg = PERIP_CLK_CFG,
476 .pclk_sel_mask = GPT_CLK_MASK,
479 /* gpt1 timer clock */
480 static struct clk gpt1_clk = {
481 .flags = ALWAYS_ENABLED,
482 .pclk_sel = &gpt1_pclk_sel,
483 .pclk_sel_shift = GPT1_CLK_SHIFT,
484 .recalc = &follow_parent,
487 /* gpt2 synth clk config*/
488 static struct gpt_clk_config gpt2_synth_config = {
489 .synth_reg = PRSC2_CLK_CFG,
493 /* gpt synth clock */
494 static struct clk gpt2_synth_clk = {
495 .flags = ALWAYS_ENABLED,
497 .calc_rate = &gpt_calc_rate,
498 .recalc = &gpt_clk_recalc,
499 .set_rate = &gpt_clk_set_rate,
500 .rate_config = {gpt_rtbl, ARRAY_SIZE(gpt_rtbl), 2},
501 .private_data = &gpt2_synth_config,
505 static struct pclk_info gpt2_pclk_info[] = {
507 .pclk = &gpt2_synth_clk,
508 .pclk_val = AUX_CLK_PLL1_VAL,
510 .pclk = &pll3_48m_clk,
511 .pclk_val = AUX_CLK_PLL3_VAL,
515 /* gpt parent select structure */
516 static struct pclk_sel gpt2_pclk_sel = {
517 .pclk_info = gpt2_pclk_info,
518 .pclk_count = ARRAY_SIZE(gpt2_pclk_info),
519 .pclk_sel_reg = PERIP_CLK_CFG,
520 .pclk_sel_mask = GPT_CLK_MASK,
523 /* gpt2 timer clock */
524 static struct clk gpt2_clk = {
525 .flags = ALWAYS_ENABLED,
526 .pclk_sel = &gpt2_pclk_sel,
527 .pclk_sel_shift = GPT2_CLK_SHIFT,
528 .recalc = &follow_parent,
531 /* gpt3 synth clk config*/
532 static struct gpt_clk_config gpt3_synth_config = {
533 .synth_reg = PRSC3_CLK_CFG,
537 /* gpt synth clock */
538 static struct clk gpt3_synth_clk = {
539 .flags = ALWAYS_ENABLED,
541 .calc_rate = &gpt_calc_rate,
542 .recalc = &gpt_clk_recalc,
543 .set_rate = &gpt_clk_set_rate,
544 .rate_config = {gpt_rtbl, ARRAY_SIZE(gpt_rtbl), 2},
545 .private_data = &gpt3_synth_config,
549 static struct pclk_info gpt3_pclk_info[] = {
551 .pclk = &gpt3_synth_clk,
552 .pclk_val = AUX_CLK_PLL1_VAL,
554 .pclk = &pll3_48m_clk,
555 .pclk_val = AUX_CLK_PLL3_VAL,
559 /* gpt parent select structure */
560 static struct pclk_sel gpt3_pclk_sel = {
561 .pclk_info = gpt3_pclk_info,
562 .pclk_count = ARRAY_SIZE(gpt3_pclk_info),
563 .pclk_sel_reg = PERIP_CLK_CFG,
564 .pclk_sel_mask = GPT_CLK_MASK,
567 /* gpt3 timer clock */
568 static struct clk gpt3_clk = {
569 .flags = ALWAYS_ENABLED,
570 .pclk_sel = &gpt3_pclk_sel,
571 .pclk_sel_shift = GPT3_CLK_SHIFT,
572 .recalc = &follow_parent,
575 /* clock derived from pll3 clk */
577 static struct clk usbh0_clk = {
578 .pclk = &pll3_48m_clk,
579 .en_reg = PERIP1_CLK_ENB,
580 .en_reg_bit = USBH0_CLK_ENB,
581 .recalc = &follow_parent,
585 static struct clk usbh1_clk = {
586 .pclk = &pll3_48m_clk,
587 .en_reg = PERIP1_CLK_ENB,
588 .en_reg_bit = USBH1_CLK_ENB,
589 .recalc = &follow_parent,
593 static struct clk usbd_clk = {
594 .pclk = &pll3_48m_clk,
595 .en_reg = PERIP1_CLK_ENB,
596 .en_reg_bit = USBD_CLK_ENB,
597 .recalc = &follow_parent,
600 /* clock derived from ahb clk */
601 /* apb masks structure */
602 static struct bus_clk_masks apb_masks = {
603 .mask = HCLK_PCLK_RATIO_MASK,
604 .shift = HCLK_PCLK_RATIO_SHIFT,
607 /* apb configuration structure */
608 static struct bus_clk_config apb_config = {
614 static struct clk apb_clk = {
615 .flags = ALWAYS_ENABLED,
617 .calc_rate = &bus_calc_rate,
618 .recalc = &bus_clk_recalc,
619 .set_rate = &bus_clk_set_rate,
620 .rate_config = {bus_rtbl, ARRAY_SIZE(bus_rtbl), 2},
621 .private_data = &apb_config,
625 static struct clk i2c_clk = {
627 .en_reg = PERIP1_CLK_ENB,
628 .en_reg_bit = I2C_CLK_ENB,
629 .recalc = &follow_parent,
633 static struct clk dma_clk = {
635 .en_reg = PERIP1_CLK_ENB,
636 .en_reg_bit = DMA_CLK_ENB,
637 .recalc = &follow_parent,
641 static struct clk jpeg_clk = {
643 .en_reg = PERIP1_CLK_ENB,
644 .en_reg_bit = JPEG_CLK_ENB,
645 .recalc = &follow_parent,
649 static struct clk gmac_clk = {
651 .en_reg = PERIP1_CLK_ENB,
652 .en_reg_bit = GMAC_CLK_ENB,
653 .recalc = &follow_parent,
657 static struct clk smi_clk = {
659 .en_reg = PERIP1_CLK_ENB,
660 .en_reg_bit = SMI_CLK_ENB,
661 .recalc = &follow_parent,
665 static struct clk fsmc_clk = {
667 .en_reg = PERIP1_CLK_ENB,
668 .en_reg_bit = FSMC_CLK_ENB,
669 .recalc = &follow_parent,
672 /* clock derived from apb clk */
674 static struct clk adc_clk = {
676 .en_reg = PERIP1_CLK_ENB,
677 .en_reg_bit = ADC_CLK_ENB,
678 .recalc = &follow_parent,
682 static struct clk ssp0_clk = {
684 .en_reg = PERIP1_CLK_ENB,
685 .en_reg_bit = SSP0_CLK_ENB,
686 .recalc = &follow_parent,
690 static struct clk ssp1_clk = {
692 .en_reg = PERIP1_CLK_ENB,
693 .en_reg_bit = SSP1_CLK_ENB,
694 .recalc = &follow_parent,
698 static struct clk ssp2_clk = {
700 .en_reg = PERIP1_CLK_ENB,
701 .en_reg_bit = SSP2_CLK_ENB,
702 .recalc = &follow_parent,
705 /* gpio0 ARM subsystem clock */
706 static struct clk gpio0_clk = {
707 .flags = ALWAYS_ENABLED,
709 .recalc = &follow_parent,
713 static struct clk gpio1_clk = {
715 .en_reg = PERIP1_CLK_ENB,
716 .en_reg_bit = GPIO1_CLK_ENB,
717 .recalc = &follow_parent,
721 static struct clk gpio2_clk = {
723 .en_reg = PERIP1_CLK_ENB,
724 .en_reg_bit = GPIO2_CLK_ENB,
725 .recalc = &follow_parent,
728 static struct clk dummy_apb_pclk;
730 /* array of all spear 6xx clock lookups */
731 static struct clk_lookup spear_clk_lookups[] = {
732 CLKDEV_INIT(NULL, "apb_pclk", &dummy_apb_pclk),
734 CLKDEV_INIT(NULL, "osc_32k_clk", &osc_32k_clk),
735 CLKDEV_INIT(NULL, "osc_30m_clk", &osc_30m_clk),
736 /* clock derived from 32 KHz os clk */
737 CLKDEV_INIT("rtc-spear", NULL, &rtc_clk),
738 /* clock derived from 30 MHz os clk */
739 CLKDEV_INIT(NULL, "pll1_clk", &pll1_clk),
740 CLKDEV_INIT(NULL, "pll3_48m_clk", &pll3_48m_clk),
741 CLKDEV_INIT("wdt", NULL, &wdt_clk),
742 /* clock derived from pll1 clk */
743 CLKDEV_INIT(NULL, "cpu_clk", &cpu_clk),
744 CLKDEV_INIT(NULL, "ahb_clk", &ahb_clk),
745 CLKDEV_INIT(NULL, "uart_synth_clk", &uart_synth_clk),
746 CLKDEV_INIT(NULL, "firda_synth_clk", &firda_synth_clk),
747 CLKDEV_INIT(NULL, "clcd_synth_clk", &clcd_synth_clk),
748 CLKDEV_INIT(NULL, "gpt0_synth_clk", &gpt0_synth_clk),
749 CLKDEV_INIT(NULL, "gpt2_synth_clk", &gpt2_synth_clk),
750 CLKDEV_INIT(NULL, "gpt3_synth_clk", &gpt3_synth_clk),
751 CLKDEV_INIT("d0000000.serial", NULL, &uart0_clk),
752 CLKDEV_INIT("d0080000.serial", NULL, &uart1_clk),
753 CLKDEV_INIT("firda", NULL, &firda_clk),
754 CLKDEV_INIT("clcd", NULL, &clcd_clk),
755 CLKDEV_INIT("gpt0", NULL, &gpt0_clk),
756 CLKDEV_INIT("gpt1", NULL, &gpt1_clk),
757 CLKDEV_INIT("gpt2", NULL, &gpt2_clk),
758 CLKDEV_INIT("gpt3", NULL, &gpt3_clk),
759 /* clock derived from pll3 clk */
760 CLKDEV_INIT("designware_udc", NULL, &usbd_clk),
761 CLKDEV_INIT(NULL, "usbh.0_clk", &usbh0_clk),
762 CLKDEV_INIT(NULL, "usbh.1_clk", &usbh1_clk),
763 /* clock derived from ahb clk */
764 CLKDEV_INIT(NULL, "apb_clk", &apb_clk),
765 CLKDEV_INIT("d0200000.i2c", NULL, &i2c_clk),
766 CLKDEV_INIT("fc400000.dma", NULL, &dma_clk),
767 CLKDEV_INIT("jpeg", NULL, &jpeg_clk),
768 CLKDEV_INIT("gmac", NULL, &gmac_clk),
769 CLKDEV_INIT("fc000000.flash", NULL, &smi_clk),
770 CLKDEV_INIT("d1800000.flash", NULL, &fsmc_clk),
771 /* clock derived from apb clk */
772 CLKDEV_INIT("adc", NULL, &adc_clk),
773 CLKDEV_INIT("ssp-pl022.0", NULL, &ssp0_clk),
774 CLKDEV_INIT("ssp-pl022.1", NULL, &ssp1_clk),
775 CLKDEV_INIT("ssp-pl022.2", NULL, &ssp2_clk),
776 CLKDEV_INIT("f0100000.gpio", NULL, &gpio0_clk),
777 CLKDEV_INIT("fc980000.gpio", NULL, &gpio1_clk),
778 CLKDEV_INIT("d8100000.gpio", NULL, &gpio2_clk),
781 void __init spear6xx_clk_init(void)
785 for (i = 0; i < ARRAY_SIZE(spear_clk_lookups); i++)
786 clk_register(&spear_clk_lookups[i]);