4 * Copyright (C) 2006-2008 Andrzej Zaborowski <balrog@zabor.org>
6 * Clocks data comes in part from arch/arm/mach-omap1/clock.h in Linux.
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of
11 * the License, or (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License along
19 * with this program; if not, write to the Free Software Foundation, Inc.,
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
31 #define ALWAYS_ENABLED (1 << 0)
32 #define CLOCK_IN_OMAP310 (1 << 10)
33 #define CLOCK_IN_OMAP730 (1 << 11)
34 #define CLOCK_IN_OMAP1510 (1 << 12)
35 #define CLOCK_IN_OMAP16XX (1 << 13)
36 #define CLOCK_IN_OMAP242X (1 << 14)
37 #define CLOCK_IN_OMAP243X (1 << 15)
38 #define CLOCK_IN_OMAP343X (1 << 16)
39 #define CLOCK_IN_OMAP3XXX (1 << 17)
43 int running; /* Is currently ticking */
44 int enabled; /* Is enabled, regardless of its input clk */
45 unsigned long rate; /* Current rate (if .running) */
46 unsigned int divisor; /* Rate relative to input (if .enabled) */
47 unsigned int multiplier; /* Rate relative to input (if .enabled) */
48 qemu_irq users[16]; /* Who to notify on change */
49 int usecount; /* Automatically idle when unused */
52 static struct clk xtal_osc12m = {
53 .name = "xtal_osc_12m",
55 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP310,
58 static struct clk xtal_osc32k = {
59 .name = "xtal_osc_32k",
61 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP310 |
62 CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
65 static struct clk ck_ref = {
68 .parent = &xtal_osc12m,
69 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP310 |
73 /* If a dpll is disabled it becomes a bypass, child clocks don't stop */
74 static struct clk dpll1 = {
77 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP310 |
81 static struct clk dpll2 = {
84 .flags = CLOCK_IN_OMAP310 | ALWAYS_ENABLED,
87 static struct clk dpll3 = {
90 .flags = CLOCK_IN_OMAP310 | ALWAYS_ENABLED,
93 static struct clk dpll4 = {
97 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP310,
100 static struct clk apll = {
105 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP310,
108 static struct clk ck_48m = {
110 .parent = &dpll4, /* either dpll4 or apll */
111 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP310,
114 static struct clk ck_dpll1out = {
115 .name = "ck_dpll1out",
117 .flags = CLOCK_IN_OMAP16XX,
120 static struct clk sossi_ck = {
122 .parent = &ck_dpll1out,
123 .flags = CLOCK_IN_OMAP16XX,
126 static struct clk clkm1 = {
130 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP310 |
134 static struct clk clkm2 = {
138 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP310 |
142 static struct clk clkm3 = {
145 .parent = &dpll1, /* either dpll1 or ck_ref */
146 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP310 |
150 static struct clk arm_ck = {
154 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP310 |
158 static struct clk armper_ck = {
160 .alias = "mpuper_ck",
162 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP310,
165 static struct clk arm_gpio_ck = {
166 .name = "arm_gpio_ck",
167 .alias = "mpu_gpio_ck",
170 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310,
173 static struct clk armxor_ck = {
175 .alias = "mpuxor_ck",
177 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP310,
180 static struct clk armtim_ck = {
182 .alias = "mputim_ck",
183 .parent = &ck_ref, /* either CLKIN or DPLL1 */
184 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP310,
187 static struct clk armwdt_ck = {
192 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP310 |
196 static struct clk arminth_ck16xx = {
197 .name = "arminth_ck",
199 .flags = CLOCK_IN_OMAP16XX | ALWAYS_ENABLED,
200 /* Note: On 16xx the frequency can be divided by 2 by programming
201 * ARM_CKCTL:ARM_INTHCK_SEL(14) to 1
203 * 1510 version is in TC clocks.
207 static struct clk dsp_ck = {
210 .flags = CLOCK_IN_OMAP310 | CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX,
213 static struct clk dspmmu_ck = {
216 .flags = CLOCK_IN_OMAP310 | CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
220 static struct clk dspper_ck = {
223 .flags = CLOCK_IN_OMAP310 | CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX,
226 static struct clk dspxor_ck = {
229 .flags = CLOCK_IN_OMAP310 | CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX,
232 static struct clk dsptim_ck = {
235 .flags = CLOCK_IN_OMAP310 | CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX,
238 static struct clk tc_ck = {
241 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
242 CLOCK_IN_OMAP730 | CLOCK_IN_OMAP310 |
246 static struct clk arminth_ck15xx = {
247 .name = "arminth_ck",
249 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 | ALWAYS_ENABLED,
250 /* Note: On 1510 the frequency follows TC_CK
252 * 16xx version is in MPU clocks.
256 static struct clk tipb_ck = {
257 /* No-idle controlled by "tc_ck" */
260 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 | ALWAYS_ENABLED,
263 static struct clk l3_ocpi_ck = {
264 /* No-idle controlled by "tc_ck" */
265 .name = "l3_ocpi_ck",
267 .flags = CLOCK_IN_OMAP16XX,
270 static struct clk tc1_ck = {
273 .flags = CLOCK_IN_OMAP16XX,
276 static struct clk tc2_ck = {
279 .flags = CLOCK_IN_OMAP16XX,
282 static struct clk dma_ck = {
283 /* No-idle controlled by "tc_ck" */
286 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP310 |
290 static struct clk dma_lcdfree_ck = {
291 .name = "dma_lcdfree_ck",
293 .flags = CLOCK_IN_OMAP16XX | ALWAYS_ENABLED,
296 static struct clk api_ck = {
300 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP310,
303 static struct clk lb_ck = {
306 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310,
309 static struct clk lbfree_ck = {
312 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310,
315 static struct clk hsab_ck = {
318 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310,
321 static struct clk rhea1_ck = {
324 .flags = CLOCK_IN_OMAP16XX | ALWAYS_ENABLED,
327 static struct clk rhea2_ck = {
330 .flags = CLOCK_IN_OMAP16XX | ALWAYS_ENABLED,
333 static struct clk lcd_ck_16xx = {
336 .flags = CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP730,
339 static struct clk lcd_ck_1510 = {
342 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310,
345 static struct clk uart1_1510 = {
347 /* Direct from ULPD, no real parent */
348 .parent = &armper_ck, /* either armper_ck or dpll4 */
350 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 | ALWAYS_ENABLED,
353 static struct clk uart1_16xx = {
355 /* Direct from ULPD, no real parent */
356 .parent = &armper_ck,
358 .flags = CLOCK_IN_OMAP16XX,
361 static struct clk uart2_ck = {
363 /* Direct from ULPD, no real parent */
364 .parent = &armper_ck, /* either armper_ck or dpll4 */
366 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP310 |
370 static struct clk uart3_1510 = {
372 /* Direct from ULPD, no real parent */
373 .parent = &armper_ck, /* either armper_ck or dpll4 */
375 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 | ALWAYS_ENABLED,
378 static struct clk uart3_16xx = {
380 /* Direct from ULPD, no real parent */
381 .parent = &armper_ck,
383 .flags = CLOCK_IN_OMAP16XX,
386 static struct clk usb_clk0 = { /* 6 MHz output on W4_USB_CLK0 */
389 /* Direct from ULPD, no parent */
391 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP310,
394 static struct clk usb_hhc_ck1510 = {
395 .name = "usb_hhc_ck",
396 /* Direct from ULPD, no parent */
397 .rate = 48000000, /* Actually 2 clocks, 12MHz and 48MHz */
398 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310,
401 static struct clk usb_hhc_ck16xx = {
402 .name = "usb_hhc_ck",
403 /* Direct from ULPD, no parent */
405 /* OTG_SYSCON_2.OTG_PADEN == 0 (not 1510-compatible) */
406 .flags = CLOCK_IN_OMAP16XX,
409 static struct clk usb_w2fc_mclk = {
410 .name = "usb_w2fc_mclk",
411 .alias = "usb_w2fc_ck",
414 .flags = CLOCK_IN_OMAP310 | CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX,
417 static struct clk mclk_1510 = {
419 /* Direct from ULPD, no parent. May be enabled by ext hardware. */
421 .flags = CLOCK_IN_OMAP1510,
424 static struct clk bclk_310 = {
425 .name = "bt_mclk_out", /* Alias midi_mclk_out? */
426 .parent = &armper_ck,
427 .flags = CLOCK_IN_OMAP310,
430 static struct clk mclk_310 = {
431 .name = "com_mclk_out",
432 .parent = &armper_ck,
433 .flags = CLOCK_IN_OMAP310,
436 static struct clk mclk_16xx = {
438 /* Direct from ULPD, no parent. May be enabled by ext hardware. */
439 .flags = CLOCK_IN_OMAP16XX,
442 static struct clk bclk_1510 = {
444 /* Direct from ULPD, no parent. May be enabled by ext hardware. */
446 .flags = CLOCK_IN_OMAP1510,
449 static struct clk bclk_16xx = {
451 /* Direct from ULPD, no parent. May be enabled by ext hardware. */
452 .flags = CLOCK_IN_OMAP16XX,
455 static struct clk mmc1_ck = {
458 /* Functional clock is direct from ULPD, interface clock is ARMPER */
459 .parent = &armper_ck, /* either armper_ck or dpll4 */
461 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP310,
464 static struct clk mmc2_ck = {
467 /* Functional clock is direct from ULPD, interface clock is ARMPER */
468 .parent = &armper_ck,
470 .flags = CLOCK_IN_OMAP16XX,
473 static struct clk cam_mclk = {
475 .flags = CLOCK_IN_OMAP310 | CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX,
479 static struct clk cam_exclk = {
481 .flags = CLOCK_IN_OMAP310 | CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX,
482 /* Either 12M from cam.mclk or 48M from dpll4 */
486 static struct clk cam_lclk = {
488 .flags = CLOCK_IN_OMAP310 | CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX,
491 static struct clk i2c_fck = {
494 .flags = CLOCK_IN_OMAP310 | CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
496 .parent = &armxor_ck,
499 static struct clk i2c_ick = {
502 .flags = CLOCK_IN_OMAP16XX | ALWAYS_ENABLED,
503 .parent = &armper_ck,
506 static struct clk clk32k = {
508 .flags = CLOCK_IN_OMAP310 | CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
509 CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X | ALWAYS_ENABLED,
510 .parent = &xtal_osc32k,
513 static struct clk ref_clk = {
515 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X | ALWAYS_ENABLED,
516 .rate = 12000000, /* 12 MHz or 13 MHz or 19.2 MHz */
517 /*.parent = sys.xtalin */
520 static struct clk apll_96m = {
522 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X | ALWAYS_ENABLED,
524 /*.parent = ref_clk */
527 static struct clk apll_54m = {
529 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X | ALWAYS_ENABLED,
531 /*.parent = ref_clk */
534 static struct clk sys_clk = {
536 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X | ALWAYS_ENABLED,
538 /*.parent = sys.xtalin */
541 static struct clk sleep_clk = {
543 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X | ALWAYS_ENABLED,
545 /*.parent = sys.xtalin */
548 static struct clk dpll_ck = {
550 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X | ALWAYS_ENABLED,
554 static struct clk dpll_x2_ck = {
556 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X | ALWAYS_ENABLED,
560 static struct clk wdt1_sys_clk = {
561 .name = "wdt1_sys_clk",
562 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X | ALWAYS_ENABLED,
564 /*.parent = sys.xtalin */
567 static struct clk func_96m_clk = {
568 .name = "func_96m_clk",
569 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
574 static struct clk func_48m_clk = {
575 .name = "func_48m_clk",
576 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
581 static struct clk func_12m_clk = {
582 .name = "func_12m_clk",
583 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
588 static struct clk func_54m_clk = {
589 .name = "func_54m_clk",
590 .flags = CLOCK_IN_OMAP242X,
595 static struct clk sys_clkout = {
597 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
601 static struct clk sys_clkout2 = {
603 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
607 static struct clk core_clk = {
609 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
610 .parent = &dpll_x2_ck, /* Switchable between dpll_ck and clk32k */
613 static struct clk l3_clk = {
615 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
619 static struct clk core_l4_iclk = {
620 .name = "core_l4_iclk",
621 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
625 static struct clk wu_l4_iclk = {
626 .name = "wu_l4_iclk",
627 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
631 static struct clk core_l3_iclk = {
632 .name = "core_l3_iclk",
633 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
637 static struct clk core_l4_usb_clk = {
638 .name = "core_l4_usb_clk",
639 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
643 static struct clk wu_gpt1_clk = {
644 .name = "wu_gpt1_clk",
645 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
649 static struct clk wu_32k_clk = {
650 .name = "wu_32k_clk",
651 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
655 static struct clk uart1_fclk = {
656 .name = "uart1_fclk",
657 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
658 .parent = &func_48m_clk,
661 static struct clk uart1_iclk = {
662 .name = "uart1_iclk",
663 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
664 .parent = &core_l4_iclk,
667 static struct clk uart2_fclk = {
668 .name = "uart2_fclk",
669 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
670 .parent = &func_48m_clk,
673 static struct clk uart2_iclk = {
674 .name = "uart2_iclk",
675 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
676 .parent = &core_l4_iclk,
679 static struct clk uart3_fclk = {
680 .name = "uart3_fclk",
681 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
682 .parent = &func_48m_clk,
685 static struct clk uart3_iclk = {
686 .name = "uart3_iclk",
687 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
688 .parent = &core_l4_iclk,
691 static struct clk mpu_fclk = {
693 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
697 static struct clk mpu_iclk = {
699 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
703 static struct clk int_m_fclk = {
704 .name = "int_m_fclk",
705 .alias = "mpu_intc_fclk",
706 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
710 static struct clk int_m_iclk = {
711 .name = "int_m_iclk",
712 .alias = "mpu_intc_iclk",
713 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
717 static struct clk core_gpt2_clk = {
718 .name = "core_gpt2_clk",
719 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
723 static struct clk core_gpt3_clk = {
724 .name = "core_gpt3_clk",
725 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
729 static struct clk core_gpt4_clk = {
730 .name = "core_gpt4_clk",
731 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
735 static struct clk core_gpt5_clk = {
736 .name = "core_gpt5_clk",
737 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
741 static struct clk core_gpt6_clk = {
742 .name = "core_gpt6_clk",
743 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
747 static struct clk core_gpt7_clk = {
748 .name = "core_gpt7_clk",
749 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
753 static struct clk core_gpt8_clk = {
754 .name = "core_gpt8_clk",
755 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
759 static struct clk core_gpt9_clk = {
760 .name = "core_gpt9_clk",
761 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
765 static struct clk core_gpt10_clk = {
766 .name = "core_gpt10_clk",
767 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
771 static struct clk core_gpt11_clk = {
772 .name = "core_gpt11_clk",
773 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
777 static struct clk core_gpt12_clk = {
778 .name = "core_gpt12_clk",
779 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
783 static struct clk mcbsp1_clk = {
785 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
787 .parent = &func_96m_clk,
790 static struct clk mcbsp2_clk = {
792 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
794 .parent = &func_96m_clk,
797 static struct clk emul_clk = {
799 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
800 .parent = &func_54m_clk,
803 static struct clk sdma_fclk = {
805 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
809 static struct clk sdma_iclk = {
811 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
812 .parent = &core_l3_iclk, /* core_l4_iclk for the configuration port */
815 static struct clk i2c1_fclk = {
817 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
818 .parent = &func_12m_clk,
822 static struct clk i2c1_iclk = {
824 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
825 .parent = &core_l4_iclk,
828 static struct clk i2c2_fclk = {
830 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
831 .parent = &func_12m_clk,
835 static struct clk i2c2_iclk = {
837 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
838 .parent = &core_l4_iclk,
841 static struct clk gpio_dbclk[4] = {
843 .name = "gpio1_dbclk",
844 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
845 .parent = &wu_32k_clk,
847 .name = "gpio2_dbclk",
848 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
849 .parent = &wu_32k_clk,
851 .name = "gpio3_dbclk",
852 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
853 .parent = &wu_32k_clk,
855 .name = "gpio4_dbclk",
856 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
857 .parent = &wu_32k_clk,
861 static struct clk gpio_iclk = {
863 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
864 .parent = &wu_l4_iclk,
867 static struct clk mmc_fck = {
869 .flags = CLOCK_IN_OMAP242X,
870 .parent = &func_96m_clk,
873 static struct clk mmc_ick = {
875 .flags = CLOCK_IN_OMAP242X,
876 .parent = &core_l4_iclk,
879 static struct clk spi_fclk[3] = {
882 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
883 .parent = &func_48m_clk,
886 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
887 .parent = &func_48m_clk,
890 .flags = CLOCK_IN_OMAP243X,
891 .parent = &func_48m_clk,
895 static struct clk dss_clk[2] = {
898 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
902 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
907 static struct clk dss_54m_clk = {
908 .name = "dss_54m_clk",
909 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
910 .parent = &func_54m_clk,
913 static struct clk dss_l3_iclk = {
914 .name = "dss_l3_iclk",
915 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
916 .parent = &core_l3_iclk,
919 static struct clk dss_l4_iclk = {
920 .name = "dss_l4_iclk",
921 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
922 .parent = &core_l4_iclk,
925 static struct clk spi_iclk[3] = {
928 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
929 .parent = &core_l4_iclk,
932 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
933 .parent = &core_l4_iclk,
936 .flags = CLOCK_IN_OMAP243X,
937 .parent = &core_l4_iclk,
941 static struct clk omapctrl_clk = {
942 .name = "omapctrl_iclk",
943 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
944 /* XXX Should be in WKUP domain */
945 .parent = &core_l4_iclk,
950 static struct clk omap3_sys_32k = {
951 .name = "omap3_sys_32k",
953 .flags = CLOCK_IN_OMAP3XXX | ALWAYS_ENABLED,
956 static struct clk omap3_osc_sys_clk12 = {
957 .name = "omap3_osc_sys_clk12",
959 .flags = CLOCK_IN_OMAP3XXX | ALWAYS_ENABLED,
962 static struct clk omap3_osc_sys_clk13 = {
963 .name = "omap3_osc_sys_clk13",
965 .flags = CLOCK_IN_OMAP3XXX | ALWAYS_ENABLED,
968 static struct clk omap3_osc_sys_clk168 = {
969 .name = "omap3_osc_sys_clk168",
971 .flags = CLOCK_IN_OMAP3XXX | ALWAYS_ENABLED,
974 static struct clk omap3_osc_sys_clk192 = {
975 .name = "omap3_osc_sys_clk192",
977 .flags = CLOCK_IN_OMAP3XXX | ALWAYS_ENABLED,
980 static struct clk omap3_osc_sys_clk26 = {
981 .name = "omap3_osc_sys_clk26",
983 .flags = CLOCK_IN_OMAP3XXX | ALWAYS_ENABLED,
986 static struct clk omap3_osc_sys_clk384 = {
987 .name = "omap3_osc_sys_clk384",
989 .flags = CLOCK_IN_OMAP3XXX | ALWAYS_ENABLED,
992 /*Is the altclk is enabled in beagle board?*/
993 static struct clk omap3_sys_altclk = {
994 .name = "omap3_sys_altclk",
996 .flags = CLOCK_IN_OMAP3XXX ,
1000 static struct clk omap3_sys_clk = {
1001 .name = "omap3_sys_clk",
1002 .flags = CLOCK_IN_OMAP3XXX | ALWAYS_ENABLED,
1003 .parent = &omap3_osc_sys_clk26,
1006 static struct clk omap3_32k_fclk = {
1007 .name = "omap3_32k_fclk",
1009 .flags = CLOCK_IN_OMAP3XXX | ALWAYS_ENABLED,
1010 .parent = &omap3_sys_32k,
1016 * DPLL3_M2_CLK (CORE_CLK)
1017 * DPLL3_M2*2_CLK (CORE*2_CLK)
1018 * EMULE_CORE_ALWON_CLK
1020 static struct clk omap3_core_clk = {
1021 .name = "omap3_core_clk",
1022 .flags = CLOCK_IN_OMAP3XXX | ALWAYS_ENABLED,
1023 .parent = &omap3_sys_clk,
1026 static struct clk omap3_core2_clk = {
1027 .name = "omap3_core2_clk",
1028 .flags = CLOCK_IN_OMAP3XXX ,
1029 .parent = &omap3_sys_clk,
1032 static struct clk omap3_emu_core_alwon_clk = {
1033 .name = "omap3_emu_core_alwon_clk",
1034 .flags = CLOCK_IN_OMAP3XXX ,
1035 .parent = &omap3_sys_clk,
1038 /*DPLL1 : it is for MPU
1040 * reference clock: SYS_CLK
1041 * bypass clock : CORE_CLK from dpll3
1043 * MPU_CLK (DPLL_CLK_M2)
1045 static struct clk omap3_mpu_clk = {
1046 .name = "omap3_mpu_clk",
1047 .flags = CLOCK_IN_OMAP3XXX ,
1048 .parent = &omap3_core_clk, /*between sys_clk and core_clk*/
1051 /*DPLL2: it is for iva2*/
1052 static struct clk omap3_iva2_clk = {
1053 .name = "omap3_iva2_clk",
1054 .flags = CLOCK_IN_OMAP3XXX ,
1055 .parent = &omap3_core_clk, /*between sys_clk and core_clk*/
1062 * M3: TO TV(54M_FCLK)
1063 * M4: DSS1_ALWON_CLK
1065 * M6: EMUL_PER_ALWON_CLK
1067 static struct clk omap3_96m_fclk = {
1068 .name = "omap3_96m_fclk",
1069 .flags = CLOCK_IN_OMAP3XXX ,
1070 .parent = &omap3_sys_clk,
1073 static struct clk omap3_54m_fclk = {
1074 .name = "omap3_54m_fclk",
1075 .flags = CLOCK_IN_OMAP3XXX,
1076 .parent = &omap3_sys_clk,
1079 static struct clk omap3_dss1_alwon_fclk = {
1080 .name = "omap3_dss1_alwon_fclk",
1081 .flags = CLOCK_IN_OMAP3XXX ,
1082 .parent = &omap3_sys_clk,
1085 static struct clk omap3_cam_mclk = {
1086 .name = "omap3_cam_mclk",
1087 .flags = CLOCK_IN_OMAP3XXX ,
1088 .parent = &omap3_sys_clk,
1090 static struct clk omap3_per_alwon_clk = {
1091 .name = "omap3_per_alwon_clk",
1092 .flags = CLOCK_IN_OMAP3XXX ,
1093 .parent = &omap3_sys_clk,
1101 static struct clk omap3_120m_fclk = {
1102 .name = "omap3_120m_fclk",
1103 .flags = CLOCK_IN_OMAP3XXX ,
1104 .parent = &omap3_sys_clk,
1108 static struct clk omap3_48m_fclk = {
1109 .name = "omap3_48m_fclk",
1110 .flags = CLOCK_IN_OMAP3XXX ,
1111 .parent = &omap3_96m_fclk, /* omap3_96m_fclk and omap3_sys_altclk */
1116 static struct clk omap3_12m_fclk = {
1117 .name = "omap3_12m_fclk",
1118 .flags = CLOCK_IN_OMAP3XXX ,
1119 .parent = &omap3_96m_fclk, /*omap3_96m_fclk and omap3_sys_altclk */
1124 /*Common interface clock*/
1132 static struct clk omap3_l3x2_iclk = {
1133 .name = "omap3_l3x2_iclk",
1134 .flags = CLOCK_IN_OMAP3XXX | ALWAYS_ENABLED,
1135 .parent = &omap3_core_clk,
1138 static struct clk omap3_l3_iclk = {
1139 .name = "omap3_l3_iclk",
1140 .flags = CLOCK_IN_OMAP3XXX | ALWAYS_ENABLED,
1141 .parent = &omap3_core_clk,
1144 static struct clk omap3_l4_iclk = {
1145 .name = "omap3_l4_iclk",
1146 .flags = CLOCK_IN_OMAP3XXX | ALWAYS_ENABLED,
1147 .parent = &omap3_l3_iclk,
1149 static struct clk omap3_rm_iclk = {
1150 .name = "omap3_rm_iclk",
1151 .flags = CLOCK_IN_OMAP3XXX | ALWAYS_ENABLED,
1152 .parent = &omap3_l4_iclk,
1155 /*Core power domain clock*/
1156 /* Input: cm_sys_clk
1179 static struct clk omap3_gp10_fclk = {
1180 .name = "omap3_gp10_fclk",
1181 .flags = CLOCK_IN_OMAP3XXX,
1182 .parent = &omap3_32k_fclk, /*omap3_32k_fclk and omap3_sys_clk*/
1185 static struct clk omap3_gp11_fclk = {
1186 .name = "omap3_gp11_fclk",
1187 .flags = CLOCK_IN_OMAP3XXX,
1188 .parent = &omap3_32k_fclk, /*omap3_32k_fclk and omap3_sys_clk*/
1191 static struct clk omap3_core_32k_fclk = {
1192 .name = "omap3_core_32k_fclk",
1193 .flags = CLOCK_IN_OMAP3XXX,
1194 .parent = &omap3_32k_fclk,
1197 static struct clk omap3_cpefuse_fclk = {
1198 .name = "omap3_cpefuse_fclk",
1199 .flags = CLOCK_IN_OMAP3XXX,
1200 .parent = &omap3_sys_clk,
1203 static struct clk omap3_core_120m_fclk = {
1204 .name = "omap3_core_120m_fclk",
1205 .flags = CLOCK_IN_OMAP3XXX,
1206 .parent = &omap3_120m_fclk,
1209 static struct clk omap3_core_96m_fclk = {
1210 .name = "omap3_core_96m_fclk",
1211 .flags = CLOCK_IN_OMAP3XXX,
1212 .parent = &omap3_96m_fclk,
1215 static struct clk omap3_core_48m_fclk = {
1216 .name = "omap3_core_48m_fclk",
1217 .flags = CLOCK_IN_OMAP3XXX,
1218 .parent = &omap3_48m_fclk,
1221 static struct clk omap3_core_12m_fclk = {
1222 .name = "omap3_core_12m_fclk",
1223 .flags = CLOCK_IN_OMAP3XXX,
1224 .parent = &omap3_12m_fclk,
1227 static struct clk omap3_core_l3_iclk = {
1228 .name = "omap3_core_l3_iclk",
1229 .flags = CLOCK_IN_OMAP3XXX | ALWAYS_ENABLED,
1230 .parent = &omap3_l3_iclk,
1233 static struct clk omap3_core_l4_iclk = {
1234 .name = "omap3_core_l4_iclk",
1235 .flags = CLOCK_IN_OMAP3XXX | ALWAYS_ENABLED,
1236 .parent = &omap3_l4_iclk,
1239 /* CORE_L3 interface clock based clocks */
1240 static struct clk omap3_sdrc_iclk = {
1241 .name = "omap3_sdrc_iclk",
1242 .flags = CLOCK_IN_OMAP3XXX ,
1243 .parent = &omap3_core_l3_iclk,
1247 /*WKUP Power Domain*/
1248 static struct clk omap3_wkup_32k_fclk = {
1249 .name = "omap3_wkup_32k_fclk",
1250 .flags = CLOCK_IN_OMAP3XXX ,
1251 .parent = &omap3_32k_fclk,
1254 static struct clk omap3_wkup_l4_iclk = {
1255 .name = "omap3_wkup_l4_iclk",
1256 .flags = CLOCK_IN_OMAP3XXX,
1258 .parent = &omap3_sys_clk,
1261 static struct clk omap3_gp1_fclk = {
1262 .name = "omap3_gp1_fclk",
1263 .flags = CLOCK_IN_OMAP3XXX ,
1264 .parent = &omap3_32k_fclk, /*omap3_32k_fclk and omap3_sys_clk*/
1267 static struct clk omap3_gp12_fclk = {
1268 .name = "omap3_gp12_fclk",
1269 .flags = CLOCK_IN_OMAP3XXX ,
1270 .parent = &omap3_32k_fclk, /*SECURE_32K_FCLK -> 32-kHz oscillator */
1273 /*PER Power Domain clock*/
1275 static struct clk omap3_gp2_fclk = {
1276 .name = "omap3_gp2_fclk",
1277 .flags = CLOCK_IN_OMAP3XXX ,
1278 .parent = &omap3_32k_fclk, /*omap3_32k_fclk and omap3_sys_clk*/
1281 static struct clk omap3_gp3_fclk = {
1282 .name = "omap3_gp3_fclk",
1283 .flags = CLOCK_IN_OMAP3XXX ,
1284 .parent = &omap3_32k_fclk, /*omap3_32k_fclk and omap3_sys_clk*/
1287 static struct clk omap3_gp4_fclk = {
1288 .name = "omap3_gp4_fclk",
1289 .flags = CLOCK_IN_OMAP3XXX ,
1290 .parent = &omap3_32k_fclk, /*omap3_32k_fclk and omap3_sys_clk*/
1293 static struct clk omap3_gp5_fclk = {
1294 .name = "omap3_gp5_fclk",
1295 .flags = CLOCK_IN_OMAP3XXX ,
1296 .parent = &omap3_32k_fclk, /*omap3_32k_fclk and omap3_sys_clk*/
1299 static struct clk omap3_gp6_fclk = {
1300 .name = "omap3_gp6_fclk",
1301 .flags = CLOCK_IN_OMAP3XXX ,
1302 .parent = &omap3_32k_fclk, /*omap3_32k_fclk and omap3_sys_clk*/
1305 static struct clk omap3_gp7_fclk = {
1306 .name = "omap3_gp7_fclk",
1307 .flags = CLOCK_IN_OMAP3XXX ,
1308 .parent = &omap3_32k_fclk, /*omap3_32k_fclk and omap3_sys_clk*/
1311 static struct clk omap3_gp8_fclk = {
1312 .name = "omap3_gp8_fclk",
1313 .flags = CLOCK_IN_OMAP3XXX ,
1314 .parent = &omap3_32k_fclk, /*omap3_32k_fclk and omap3_sys_clk*/
1317 static struct clk omap3_gp9_fclk = {
1318 .name = "omap3_gp9_fclk",
1319 .flags = CLOCK_IN_OMAP3XXX ,
1320 .parent = &omap3_32k_fclk, /*omap3_32k_fclk and omap3_sys_clk*/
1323 static struct clk omap3_per_96m_fclk = {
1324 .name = "omap3_per_96m_fclk",
1325 .flags = CLOCK_IN_OMAP3XXX ,
1326 .parent = &omap3_96m_fclk,
1329 static struct clk omap3_per_48m_fclk = {
1330 .name = "omap3_per_48m_fclk",
1331 .flags = CLOCK_IN_OMAP3XXX ,
1332 .parent = &omap3_48m_fclk,
1335 static struct clk omap3_per_l4_iclk = {
1336 .name = "omap3_per_l4_iclk",
1337 .flags = CLOCK_IN_OMAP3XXX,
1339 .parent = &omap3_l4_iclk,
1343 static struct clk omap3_uart1_fclk = {
1344 .name = "omap3_uart1_fclk",
1345 .flags = CLOCK_IN_OMAP3XXX ,
1346 .parent = &omap3_core_48m_fclk,
1349 static struct clk omap3_uart1_iclk = {
1350 .name = "omap3_uart1_iclk",
1351 .flags = CLOCK_IN_OMAP3XXX ,
1352 .parent = &omap3_core_l4_iclk,
1355 static struct clk omap3_uart2_fclk = {
1356 .name = "omap3_uart2_fclk",
1357 .flags = CLOCK_IN_OMAP3XXX ,
1358 .parent = &omap3_core_48m_fclk,
1361 static struct clk omap3_uart2_iclk = {
1362 .name = "omap3_uart2_iclk",
1363 .flags = CLOCK_IN_OMAP3XXX ,
1364 .parent = &omap3_core_l4_iclk,
1367 static struct clk omap3_uart3_fclk = {
1368 .name = "omap3_uart3_fclk",
1369 .flags = CLOCK_IN_OMAP3XXX ,
1370 .parent = &omap3_per_48m_fclk,
1373 static struct clk omap3_uart3_iclk = {
1374 .name = "omap3_uart3_iclk",
1375 .flags = CLOCK_IN_OMAP3XXX ,
1376 .parent = &omap3_core_l4_iclk,
1380 static struct clk omap3_mpu_intc_fclk = {
1381 .name = "omap3_mpu_intc_fclk",
1382 .flags = CLOCK_IN_OMAP3XXX ,
1384 .parent = &omap3_mpu_clk,
1387 static struct clk omap3_mpu_intc_iclk = {
1388 .name = "omap3_mpu_intc_iclk",
1389 .flags = CLOCK_IN_OMAP3XXX ,
1391 .parent = &omap3_mpu_clk,
1395 static struct clk omap3_sdma_fclk = {
1396 .name = "omap3_sdma_fclk",
1397 .flags = CLOCK_IN_OMAP3XXX ,
1398 .parent = &omap3_core_l3_iclk,
1401 static struct clk omap3_sdma_iclk = {
1402 .name = "omap3_sdma_iclk",
1403 .flags = CLOCK_IN_OMAP3XXX ,
1404 .parent = &omap3_core_l4_iclk,
1408 static struct clk omap3_sys_clkout1 = {
1409 .name = "omap3_sys_clkout1",
1410 .flags = CLOCK_IN_OMAP3XXX,
1411 .parent = &omap3_osc_sys_clk26, /* same parent as as SYS_CLK */
1414 static struct clk omap3_sys_clkout2 = {
1415 .name = "omap3_sys_clkout2",
1416 .flags = CLOCK_IN_OMAP3XXX ,
1417 .parent = &omap3_core_clk, /*CORE_CLK CM_SYS_CLK CM_96M_FCLK 54 MHz clock*/
1421 static struct clk omap3_mmc1_fclk = {
1422 .name = "omap3_mmc1_fclk",
1423 .flags = CLOCK_IN_OMAP3XXX ,
1424 .parent = &omap3_per_96m_fclk,
1427 static struct clk omap3_mmc1_iclk = {
1428 .name = "omap3_mmc1_iclk",
1429 .flags = CLOCK_IN_OMAP3XXX ,
1430 .parent = &omap3_per_l4_iclk,
1433 static struct clk omap3_mmc2_fclk = {
1434 .name = "omap3_mmc2_fclk",
1435 .flags = CLOCK_IN_OMAP3XXX ,
1436 .parent = &omap3_per_96m_fclk,
1439 static struct clk omap3_mmc2_iclk = {
1440 .name = "omap3_mmc2_iclk",
1441 .flags = CLOCK_IN_OMAP3XXX ,
1442 .parent = &omap3_per_l4_iclk,
1445 static struct clk omap3_mmc3_fclk = {
1446 .name = "omap3_mmc3_fclk",
1447 .flags = CLOCK_IN_OMAP3XXX ,
1448 .parent = &omap3_per_96m_fclk,
1451 static struct clk omap3_mmc3_iclk = {
1452 .name = "omap3_mmc3_iclk",
1453 .flags = CLOCK_IN_OMAP3XXX ,
1454 .parent = &omap3_per_l4_iclk,
1458 static struct clk omap3_i2c1_fclk = {
1459 .name = "omap3_i2c1_fclk",
1460 .flags = CLOCK_IN_OMAP3XXX ,
1461 .parent = &omap3_per_96m_fclk,
1464 static struct clk omap3_i2c1_iclk = {
1465 .name = "omap3_i2c1_iclk",
1466 .flags = CLOCK_IN_OMAP3XXX ,
1467 .parent = &omap3_core_l4_iclk,
1470 static struct clk omap3_i2c2_fclk = {
1471 .name = "omap3_i2c2_fclk",
1472 .flags = CLOCK_IN_OMAP3XXX ,
1473 .parent = &omap3_per_96m_fclk,
1476 static struct clk omap3_i2c2_iclk = {
1477 .name = "omap3_i2c2_iclk",
1478 .flags = CLOCK_IN_OMAP3XXX ,
1479 .parent = &omap3_core_l4_iclk,
1482 static struct clk omap3_i2c3_fclk = {
1483 .name = "omap3_i2c3_fclk",
1484 .flags = CLOCK_IN_OMAP3XXX ,
1485 .parent = &omap3_per_96m_fclk,
1488 static struct clk omap3_i2c3_iclk = {
1489 .name = "omap3_i2c3_iclk",
1490 .flags = CLOCK_IN_OMAP3XXX ,
1491 .parent = &omap3_core_l4_iclk,
1495 static struct clk omap3_spi1_fclk = {
1496 .name = "omap3_spi1_fclk",
1497 .flags = CLOCK_IN_OMAP3XXX,
1498 .parent = &omap3_core_48m_fclk,
1501 static struct clk omap3_spi1_iclk = {
1502 .name = "omap3_spi1_iclk",
1503 .flags = CLOCK_IN_OMAP3XXX,
1504 .parent = &omap3_core_l4_iclk,
1507 static struct clk omap3_spi2_fclk = {
1508 .name = "omap3_spi2_fclk",
1509 .flags = CLOCK_IN_OMAP3XXX,
1510 .parent = &omap3_core_48m_fclk,
1513 static struct clk omap3_spi2_iclk = {
1514 .name = "omap3_spi2_iclk",
1515 .flags = CLOCK_IN_OMAP3XXX,
1516 .parent = &omap3_core_l4_iclk,
1519 static struct clk omap3_spi3_fclk = {
1520 .name = "omap3_spi3_fclk",
1521 .flags = CLOCK_IN_OMAP3XXX,
1522 .parent = &omap3_core_48m_fclk,
1525 static struct clk omap3_spi3_iclk = {
1526 .name = "omap3_spi3_iclk",
1527 .flags = CLOCK_IN_OMAP3XXX,
1528 .parent = &omap3_core_l4_iclk,
1531 static struct clk omap3_spi4_fclk = {
1532 .name = "omap3_spi4_fclk",
1533 .flags = CLOCK_IN_OMAP3XXX,
1534 .parent = &omap3_core_48m_fclk,
1537 static struct clk omap3_spi4_iclk = {
1538 .name = "omap3_spi4_iclk",
1539 .flags = CLOCK_IN_OMAP3XXX,
1540 .parent = &omap3_core_l4_iclk,
1544 static struct clk *onchip_clks[] = {
1547 /* non-ULPD clocks */
1557 /* CK_GEN1 clocks */
1567 &arminth_ck15xx, &arminth_ck16xx,
1568 /* CK_GEN2 clocks */
1575 /* CK_GEN3 clocks */
1599 &usb_hhc_ck1510, &usb_hhc_ck16xx,
1600 &mclk_1510, &mclk_16xx, &mclk_310,
1601 &bclk_1510, &bclk_16xx, &bclk_310,
1609 /* Virtual clocks */
1690 &omap3_osc_sys_clk12,
1691 &omap3_osc_sys_clk13,
1692 &omap3_osc_sys_clk168,
1693 &omap3_osc_sys_clk192,
1694 &omap3_osc_sys_clk26,
1695 &omap3_osc_sys_clk384,
1701 &omap3_emu_core_alwon_clk,
1706 &omap3_dss1_alwon_fclk,
1708 &omap3_per_alwon_clk,
1718 &omap3_core_32k_fclk,
1719 &omap3_cpefuse_fclk,
1720 &omap3_core_120m_fclk,
1721 &omap3_core_96m_fclk,
1722 &omap3_core_48m_fclk,
1723 &omap3_core_12m_fclk,
1724 &omap3_core_l3_iclk,
1725 &omap3_core_l4_iclk,
1727 &omap3_wkup_32k_fclk,
1728 &omap3_wkup_l4_iclk,
1739 &omap3_per_96m_fclk,
1740 &omap3_per_48m_fclk,
1748 &omap3_mpu_intc_fclk,
1749 &omap3_mpu_intc_iclk,
1778 void omap_clk_adduser(struct clk *clk, qemu_irq user)
1782 for (i = clk->users; *i; i ++);
1786 struct clk *omap_findclk(struct omap_mpu_state_s *mpu, const char *name)
1790 for (i = mpu->clks; i->name; i ++)
1791 if (!strcmp(i->name, name) || (i->alias && !strcmp(i->alias, name)))
1793 hw_error("%s: %s not found\n", __FUNCTION__, name);
1796 void omap_clk_get(struct clk *clk)
1801 void omap_clk_put(struct clk *clk)
1803 if (!(clk->usecount --))
1804 hw_error("%s: %s is not in use\n", __FUNCTION__, clk->name);
1807 static void omap_clk_update(struct clk *clk)
1809 int parent, running;
1814 parent = clk->parent->running;
1818 running = parent && (clk->enabled ||
1819 ((clk->flags & ALWAYS_ENABLED) && clk->usecount));
1820 if (clk->running != running) {
1821 clk->running = running;
1822 for (user = clk->users; *user; user ++)
1823 qemu_set_irq(*user, running);
1824 for (i = clk->child1; i; i = i->sibling)
1829 static void omap_clk_rate_update_full(struct clk *clk, unsigned long int rate,
1830 unsigned long int div, unsigned long int mult)
1835 clk->rate = muldiv64(rate, mult, div);
1837 for (user = clk->users; *user; user ++)
1838 qemu_irq_raise(*user);
1839 for (i = clk->child1; i; i = i->sibling)
1840 omap_clk_rate_update_full(i, rate,
1841 div * i->divisor, mult * i->multiplier);
1844 static void omap_clk_rate_update(struct clk *clk)
1847 unsigned long int div, mult = div = 1;
1849 for (i = clk; i->parent; i = i->parent) {
1851 mult *= i->multiplier;
1854 omap_clk_rate_update_full(clk, i->rate, div, mult);
1857 void omap_clk_reparent(struct clk *clk, struct clk *parent)
1862 for (p = &clk->parent->child1; *p != clk; p = &(*p)->sibling);
1866 clk->parent = parent;
1868 clk->sibling = parent->child1;
1869 parent->child1 = clk;
1870 omap_clk_update(clk);
1871 omap_clk_rate_update(clk);
1876 void omap_clk_onoff(struct clk *clk, int on)
1879 omap_clk_update(clk);
1882 void omap_clk_canidle(struct clk *clk, int can)
1890 void omap_clk_setrate(struct clk *clk, int divide, int multiply)
1892 clk->divisor = divide;
1893 clk->multiplier = multiply;
1894 omap_clk_rate_update(clk);
1897 int64_t omap_clk_getrate(omap_clk clk)
1902 void omap_clk_init(struct omap_mpu_state_s *mpu)
1904 struct clk **i, *j, *k;
1908 if (cpu_is_omap310(mpu))
1909 flag = CLOCK_IN_OMAP310;
1910 else if (cpu_is_omap1510(mpu))
1911 flag = CLOCK_IN_OMAP1510;
1912 else if (cpu_is_omap2410(mpu) || cpu_is_omap2420(mpu))
1913 flag = CLOCK_IN_OMAP242X;
1914 else if (cpu_is_omap2430(mpu))
1915 flag = CLOCK_IN_OMAP243X;
1916 else if (cpu_is_omap3430(mpu))
1917 flag = CLOCK_IN_OMAP243X;
1918 else if (cpu_is_omap3530(mpu))
1919 flag = CLOCK_IN_OMAP3XXX;
1923 for (i = onchip_clks, count = 0; *i; i ++)
1924 if ((*i)->flags & flag)
1926 mpu->clks = (struct clk *) qemu_mallocz(sizeof(struct clk) * (count + 1));
1927 for (i = onchip_clks, j = mpu->clks; *i; i ++)
1928 if ((*i)->flags & flag) {
1929 memcpy(j, *i, sizeof(struct clk));
1930 for (k = mpu->clks; k < j; k ++)
1931 if (j->parent && !strcmp(j->parent->name, k->name)) {
1933 j->sibling = k->child1;
1935 } else if (k->parent && !strcmp(k->parent->name, j->name)) {
1937 k->sibling = j->child1;
1940 j->divisor = j->divisor ?: 1;
1941 j->multiplier = j->multiplier ?: 1;
1944 for (j = mpu->clks; count --; j ++) {
1946 omap_clk_rate_update(j);