1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22#include "qemu/osdep.h"
23#include "hw/hw.h"
24#include "hw/irq.h"
25#include "hw/arm/omap.h"
26
27struct clk {
28 const char *name;
29 const char *alias;
30 struct clk *parent;
31 struct clk *child1;
32 struct clk *sibling;
33#define ALWAYS_ENABLED (1 << 0)
34#define CLOCK_IN_OMAP310 (1 << 10)
35#define CLOCK_IN_OMAP730 (1 << 11)
36#define CLOCK_IN_OMAP1510 (1 << 12)
37#define CLOCK_IN_OMAP16XX (1 << 13)
38#define CLOCK_IN_OMAP242X (1 << 14)
39#define CLOCK_IN_OMAP243X (1 << 15)
40#define CLOCK_IN_OMAP343X (1 << 16)
41 uint32_t flags;
42 int id;
43
44 int running;
45 int enabled;
46 unsigned long rate;
47 unsigned int divisor;
48 unsigned int multiplier;
49 qemu_irq users[16];
50 int usecount;
51};
52
53static struct clk xtal_osc12m = {
54 .name = "xtal_osc_12m",
55 .rate = 12000000,
56 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP310,
57};
58
59static struct clk xtal_osc32k = {
60 .name = "xtal_osc_32k",
61 .rate = 32768,
62 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP310 |
63 CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
64};
65
66static struct clk ck_ref = {
67 .name = "ck_ref",
68 .alias = "clkin",
69 .parent = &xtal_osc12m,
70 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP310 |
71 ALWAYS_ENABLED,
72};
73
74
75static struct clk dpll1 = {
76 .name = "dpll1",
77 .parent = &ck_ref,
78 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP310 |
79 ALWAYS_ENABLED,
80};
81
82static struct clk dpll2 = {
83 .name = "dpll2",
84 .parent = &ck_ref,
85 .flags = CLOCK_IN_OMAP310 | ALWAYS_ENABLED,
86};
87
88static struct clk dpll3 = {
89 .name = "dpll3",
90 .parent = &ck_ref,
91 .flags = CLOCK_IN_OMAP310 | ALWAYS_ENABLED,
92};
93
94static struct clk dpll4 = {
95 .name = "dpll4",
96 .parent = &ck_ref,
97 .multiplier = 4,
98 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP310,
99};
100
101static struct clk apll = {
102 .name = "apll",
103 .parent = &ck_ref,
104 .multiplier = 48,
105 .divisor = 12,
106 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP310,
107};
108
109static struct clk ck_48m = {
110 .name = "ck_48m",
111 .parent = &dpll4,
112 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP310,
113};
114
115static struct clk ck_dpll1out = {
116 .name = "ck_dpll1out",
117 .parent = &dpll1,
118 .flags = CLOCK_IN_OMAP16XX,
119};
120
121static struct clk sossi_ck = {
122 .name = "ck_sossi",
123 .parent = &ck_dpll1out,
124 .flags = CLOCK_IN_OMAP16XX,
125};
126
127static struct clk clkm1 = {
128 .name = "clkm1",
129 .alias = "ck_gen1",
130 .parent = &dpll1,
131 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP310 |
132 ALWAYS_ENABLED,
133};
134
135static struct clk clkm2 = {
136 .name = "clkm2",
137 .alias = "ck_gen2",
138 .parent = &dpll1,
139 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP310 |
140 ALWAYS_ENABLED,
141};
142
143static struct clk clkm3 = {
144 .name = "clkm3",
145 .alias = "ck_gen3",
146 .parent = &dpll1,
147 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP310 |
148 ALWAYS_ENABLED,
149};
150
151static struct clk arm_ck = {
152 .name = "arm_ck",
153 .alias = "mpu_ck",
154 .parent = &clkm1,
155 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP310 |
156 ALWAYS_ENABLED,
157};
158
159static struct clk armper_ck = {
160 .name = "armper_ck",
161 .alias = "mpuper_ck",
162 .parent = &clkm1,
163 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP310,
164};
165
166static struct clk arm_gpio_ck = {
167 .name = "arm_gpio_ck",
168 .alias = "mpu_gpio_ck",
169 .parent = &clkm1,
170 .divisor = 1,
171 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310,
172};
173
174static struct clk armxor_ck = {
175 .name = "armxor_ck",
176 .alias = "mpuxor_ck",
177 .parent = &ck_ref,
178 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP310,
179};
180
181static struct clk armtim_ck = {
182 .name = "armtim_ck",
183 .alias = "mputim_ck",
184 .parent = &ck_ref,
185 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP310,
186};
187
188static struct clk armwdt_ck = {
189 .name = "armwdt_ck",
190 .alias = "mpuwd_ck",
191 .parent = &clkm1,
192 .divisor = 14,
193 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP310 |
194 ALWAYS_ENABLED,
195};
196
197static struct clk arminth_ck16xx = {
198 .name = "arminth_ck",
199 .parent = &arm_ck,
200 .flags = CLOCK_IN_OMAP16XX | ALWAYS_ENABLED,
201
202
203
204
205
206};
207
208static struct clk dsp_ck = {
209 .name = "dsp_ck",
210 .parent = &clkm2,
211 .flags = CLOCK_IN_OMAP310 | CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX,
212};
213
214static struct clk dspmmu_ck = {
215 .name = "dspmmu_ck",
216 .parent = &clkm2,
217 .flags = CLOCK_IN_OMAP310 | CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
218 ALWAYS_ENABLED,
219};
220
221static struct clk dspper_ck = {
222 .name = "dspper_ck",
223 .parent = &clkm2,
224 .flags = CLOCK_IN_OMAP310 | CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX,
225};
226
227static struct clk dspxor_ck = {
228 .name = "dspxor_ck",
229 .parent = &ck_ref,
230 .flags = CLOCK_IN_OMAP310 | CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX,
231};
232
233static struct clk dsptim_ck = {
234 .name = "dsptim_ck",
235 .parent = &ck_ref,
236 .flags = CLOCK_IN_OMAP310 | CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX,
237};
238
239static struct clk tc_ck = {
240 .name = "tc_ck",
241 .parent = &clkm3,
242 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
243 CLOCK_IN_OMAP730 | CLOCK_IN_OMAP310 |
244 ALWAYS_ENABLED,
245};
246
247static struct clk arminth_ck15xx = {
248 .name = "arminth_ck",
249 .parent = &tc_ck,
250 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 | ALWAYS_ENABLED,
251
252
253
254
255};
256
257static struct clk tipb_ck = {
258
259 .name = "tipb_ck",
260 .parent = &tc_ck,
261 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 | ALWAYS_ENABLED,
262};
263
264static struct clk l3_ocpi_ck = {
265
266 .name = "l3_ocpi_ck",
267 .parent = &tc_ck,
268 .flags = CLOCK_IN_OMAP16XX,
269};
270
271static struct clk tc1_ck = {
272 .name = "tc1_ck",
273 .parent = &tc_ck,
274 .flags = CLOCK_IN_OMAP16XX,
275};
276
277static struct clk tc2_ck = {
278 .name = "tc2_ck",
279 .parent = &tc_ck,
280 .flags = CLOCK_IN_OMAP16XX,
281};
282
283static struct clk dma_ck = {
284
285 .name = "dma_ck",
286 .parent = &tc_ck,
287 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP310 |
288 ALWAYS_ENABLED,
289};
290
291static struct clk dma_lcdfree_ck = {
292 .name = "dma_lcdfree_ck",
293 .parent = &tc_ck,
294 .flags = CLOCK_IN_OMAP16XX | ALWAYS_ENABLED,
295};
296
297static struct clk api_ck = {
298 .name = "api_ck",
299 .alias = "mpui_ck",
300 .parent = &tc_ck,
301 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP310,
302};
303
304static struct clk lb_ck = {
305 .name = "lb_ck",
306 .parent = &tc_ck,
307 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310,
308};
309
310static struct clk lbfree_ck = {
311 .name = "lbfree_ck",
312 .parent = &tc_ck,
313 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310,
314};
315
316static struct clk hsab_ck = {
317 .name = "hsab_ck",
318 .parent = &tc_ck,
319 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310,
320};
321
322static struct clk rhea1_ck = {
323 .name = "rhea1_ck",
324 .parent = &tc_ck,
325 .flags = CLOCK_IN_OMAP16XX | ALWAYS_ENABLED,
326};
327
328static struct clk rhea2_ck = {
329 .name = "rhea2_ck",
330 .parent = &tc_ck,
331 .flags = CLOCK_IN_OMAP16XX | ALWAYS_ENABLED,
332};
333
334static struct clk lcd_ck_16xx = {
335 .name = "lcd_ck",
336 .parent = &clkm3,
337 .flags = CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP730,
338};
339
340static struct clk lcd_ck_1510 = {
341 .name = "lcd_ck",
342 .parent = &clkm3,
343 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310,
344};
345
346static struct clk uart1_1510 = {
347 .name = "uart1_ck",
348
349 .parent = &armper_ck,
350 .rate = 12000000,
351 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 | ALWAYS_ENABLED,
352};
353
354static struct clk uart1_16xx = {
355 .name = "uart1_ck",
356
357 .parent = &armper_ck,
358 .rate = 48000000,
359 .flags = CLOCK_IN_OMAP16XX,
360};
361
362static struct clk uart2_ck = {
363 .name = "uart2_ck",
364
365 .parent = &armper_ck,
366 .rate = 12000000,
367 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP310 |
368 ALWAYS_ENABLED,
369};
370
371static struct clk uart3_1510 = {
372 .name = "uart3_ck",
373
374 .parent = &armper_ck,
375 .rate = 12000000,
376 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 | ALWAYS_ENABLED,
377};
378
379static struct clk uart3_16xx = {
380 .name = "uart3_ck",
381
382 .parent = &armper_ck,
383 .rate = 48000000,
384 .flags = CLOCK_IN_OMAP16XX,
385};
386
387static struct clk usb_clk0 = {
388 .name = "usb_clk0",
389 .alias = "usb.clko",
390
391 .rate = 6000000,
392 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP310,
393};
394
395static struct clk usb_hhc_ck1510 = {
396 .name = "usb_hhc_ck",
397
398 .rate = 48000000,
399 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310,
400};
401
402static struct clk usb_hhc_ck16xx = {
403 .name = "usb_hhc_ck",
404
405 .rate = 48000000,
406
407 .flags = CLOCK_IN_OMAP16XX,
408};
409
410static struct clk usb_w2fc_mclk = {
411 .name = "usb_w2fc_mclk",
412 .alias = "usb_w2fc_ck",
413 .parent = &ck_48m,
414 .rate = 48000000,
415 .flags = CLOCK_IN_OMAP310 | CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX,
416};
417
418static struct clk mclk_1510 = {
419 .name = "mclk",
420
421 .rate = 12000000,
422 .flags = CLOCK_IN_OMAP1510,
423};
424
425static struct clk bclk_310 = {
426 .name = "bt_mclk_out",
427 .parent = &armper_ck,
428 .flags = CLOCK_IN_OMAP310,
429};
430
431static struct clk mclk_310 = {
432 .name = "com_mclk_out",
433 .parent = &armper_ck,
434 .flags = CLOCK_IN_OMAP310,
435};
436
437static struct clk mclk_16xx = {
438 .name = "mclk",
439
440 .flags = CLOCK_IN_OMAP16XX,
441};
442
443static struct clk bclk_1510 = {
444 .name = "bclk",
445
446 .rate = 12000000,
447 .flags = CLOCK_IN_OMAP1510,
448};
449
450static struct clk bclk_16xx = {
451 .name = "bclk",
452
453 .flags = CLOCK_IN_OMAP16XX,
454};
455
456static struct clk mmc1_ck = {
457 .name = "mmc_ck",
458 .id = 1,
459
460 .parent = &armper_ck,
461 .rate = 48000000,
462 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP310,
463};
464
465static struct clk mmc2_ck = {
466 .name = "mmc_ck",
467 .id = 2,
468
469 .parent = &armper_ck,
470 .rate = 48000000,
471 .flags = CLOCK_IN_OMAP16XX,
472};
473
474static struct clk cam_mclk = {
475 .name = "cam.mclk",
476 .flags = CLOCK_IN_OMAP310 | CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX,
477 .rate = 12000000,
478};
479
480static struct clk cam_exclk = {
481 .name = "cam.exclk",
482 .flags = CLOCK_IN_OMAP310 | CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX,
483
484 .parent = &cam_mclk,
485};
486
487static struct clk cam_lclk = {
488 .name = "cam.lclk",
489 .flags = CLOCK_IN_OMAP310 | CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX,
490};
491
492static struct clk i2c_fck = {
493 .name = "i2c_fck",
494 .id = 1,
495 .flags = CLOCK_IN_OMAP310 | CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
496 ALWAYS_ENABLED,
497 .parent = &armxor_ck,
498};
499
500static struct clk i2c_ick = {
501 .name = "i2c_ick",
502 .id = 1,
503 .flags = CLOCK_IN_OMAP16XX | ALWAYS_ENABLED,
504 .parent = &armper_ck,
505};
506
507static struct clk clk32k = {
508 .name = "clk32-kHz",
509 .flags = CLOCK_IN_OMAP310 | CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
510 CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X | ALWAYS_ENABLED,
511 .parent = &xtal_osc32k,
512};
513
514static struct clk ref_clk = {
515 .name = "ref_clk",
516 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X | ALWAYS_ENABLED,
517 .rate = 12000000,
518
519};
520
521static struct clk apll_96m = {
522 .name = "apll_96m",
523 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X | ALWAYS_ENABLED,
524 .rate = 96000000,
525
526};
527
528static struct clk apll_54m = {
529 .name = "apll_54m",
530 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X | ALWAYS_ENABLED,
531 .rate = 54000000,
532
533};
534
535static struct clk sys_clk = {
536 .name = "sys_clk",
537 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X | ALWAYS_ENABLED,
538 .rate = 32768,
539
540};
541
542static struct clk sleep_clk = {
543 .name = "sleep_clk",
544 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X | ALWAYS_ENABLED,
545 .rate = 32768,
546
547};
548
549static struct clk dpll_ck = {
550 .name = "dpll",
551 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X | ALWAYS_ENABLED,
552 .parent = &ref_clk,
553};
554
555static struct clk dpll_x2_ck = {
556 .name = "dpll_x2",
557 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X | ALWAYS_ENABLED,
558 .parent = &ref_clk,
559};
560
561static struct clk wdt1_sys_clk = {
562 .name = "wdt1_sys_clk",
563 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X | ALWAYS_ENABLED,
564 .rate = 32768,
565
566};
567
568static struct clk func_96m_clk = {
569 .name = "func_96m_clk",
570 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
571 .divisor = 1,
572 .parent = &apll_96m,
573};
574
575static struct clk func_48m_clk = {
576 .name = "func_48m_clk",
577 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
578 .divisor = 2,
579 .parent = &apll_96m,
580};
581
582static struct clk func_12m_clk = {
583 .name = "func_12m_clk",
584 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
585 .divisor = 8,
586 .parent = &apll_96m,
587};
588
589static struct clk func_54m_clk = {
590 .name = "func_54m_clk",
591 .flags = CLOCK_IN_OMAP242X,
592 .divisor = 1,
593 .parent = &apll_54m,
594};
595
596static struct clk sys_clkout = {
597 .name = "clkout",
598 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
599 .parent = &sys_clk,
600};
601
602static struct clk sys_clkout2 = {
603 .name = "clkout2",
604 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
605 .parent = &sys_clk,
606};
607
608static struct clk core_clk = {
609 .name = "core_clk",
610 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
611 .parent = &dpll_x2_ck,
612};
613
614static struct clk l3_clk = {
615 .name = "l3_clk",
616 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
617 .parent = &core_clk,
618};
619
620static struct clk core_l4_iclk = {
621 .name = "core_l4_iclk",
622 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
623 .parent = &l3_clk,
624};
625
626static struct clk wu_l4_iclk = {
627 .name = "wu_l4_iclk",
628 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
629 .parent = &l3_clk,
630};
631
632static struct clk core_l3_iclk = {
633 .name = "core_l3_iclk",
634 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
635 .parent = &core_clk,
636};
637
638static struct clk core_l4_usb_clk = {
639 .name = "core_l4_usb_clk",
640 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
641 .parent = &l3_clk,
642};
643
644static struct clk wu_gpt1_clk = {
645 .name = "wu_gpt1_clk",
646 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
647 .parent = &sys_clk,
648};
649
650static struct clk wu_32k_clk = {
651 .name = "wu_32k_clk",
652 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
653 .parent = &sys_clk,
654};
655
656static struct clk uart1_fclk = {
657 .name = "uart1_fclk",
658 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
659 .parent = &func_48m_clk,
660};
661
662static struct clk uart1_iclk = {
663 .name = "uart1_iclk",
664 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
665 .parent = &core_l4_iclk,
666};
667
668static struct clk uart2_fclk = {
669 .name = "uart2_fclk",
670 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
671 .parent = &func_48m_clk,
672};
673
674static struct clk uart2_iclk = {
675 .name = "uart2_iclk",
676 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
677 .parent = &core_l4_iclk,
678};
679
680static struct clk uart3_fclk = {
681 .name = "uart3_fclk",
682 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
683 .parent = &func_48m_clk,
684};
685
686static struct clk uart3_iclk = {
687 .name = "uart3_iclk",
688 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
689 .parent = &core_l4_iclk,
690};
691
692static struct clk mpu_fclk = {
693 .name = "mpu_fclk",
694 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
695 .parent = &core_clk,
696};
697
698static struct clk mpu_iclk = {
699 .name = "mpu_iclk",
700 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
701 .parent = &core_clk,
702};
703
704static struct clk int_m_fclk = {
705 .name = "int_m_fclk",
706 .alias = "mpu_intc_fclk",
707 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
708 .parent = &core_clk,
709};
710
711static struct clk int_m_iclk = {
712 .name = "int_m_iclk",
713 .alias = "mpu_intc_iclk",
714 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
715 .parent = &core_clk,
716};
717
718static struct clk core_gpt2_clk = {
719 .name = "core_gpt2_clk",
720 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
721 .parent = &sys_clk,
722};
723
724static struct clk core_gpt3_clk = {
725 .name = "core_gpt3_clk",
726 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
727 .parent = &sys_clk,
728};
729
730static struct clk core_gpt4_clk = {
731 .name = "core_gpt4_clk",
732 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
733 .parent = &sys_clk,
734};
735
736static struct clk core_gpt5_clk = {
737 .name = "core_gpt5_clk",
738 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
739 .parent = &sys_clk,
740};
741
742static struct clk core_gpt6_clk = {
743 .name = "core_gpt6_clk",
744 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
745 .parent = &sys_clk,
746};
747
748static struct clk core_gpt7_clk = {
749 .name = "core_gpt7_clk",
750 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
751 .parent = &sys_clk,
752};
753
754static struct clk core_gpt8_clk = {
755 .name = "core_gpt8_clk",
756 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
757 .parent = &sys_clk,
758};
759
760static struct clk core_gpt9_clk = {
761 .name = "core_gpt9_clk",
762 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
763 .parent = &sys_clk,
764};
765
766static struct clk core_gpt10_clk = {
767 .name = "core_gpt10_clk",
768 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
769 .parent = &sys_clk,
770};
771
772static struct clk core_gpt11_clk = {
773 .name = "core_gpt11_clk",
774 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
775 .parent = &sys_clk,
776};
777
778static struct clk core_gpt12_clk = {
779 .name = "core_gpt12_clk",
780 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
781 .parent = &sys_clk,
782};
783
784static struct clk mcbsp1_clk = {
785 .name = "mcbsp1_cg",
786 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
787 .divisor = 2,
788 .parent = &func_96m_clk,
789};
790
791static struct clk mcbsp2_clk = {
792 .name = "mcbsp2_cg",
793 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
794 .divisor = 2,
795 .parent = &func_96m_clk,
796};
797
798static struct clk emul_clk = {
799 .name = "emul_ck",
800 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
801 .parent = &func_54m_clk,
802};
803
804static struct clk sdma_fclk = {
805 .name = "sdma_fclk",
806 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
807 .parent = &l3_clk,
808};
809
810static struct clk sdma_iclk = {
811 .name = "sdma_iclk",
812 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
813 .parent = &core_l3_iclk,
814};
815
816static struct clk i2c1_fclk = {
817 .name = "i2c1.fclk",
818 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
819 .parent = &func_12m_clk,
820 .divisor = 1,
821};
822
823static struct clk i2c1_iclk = {
824 .name = "i2c1.iclk",
825 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
826 .parent = &core_l4_iclk,
827};
828
829static struct clk i2c2_fclk = {
830 .name = "i2c2.fclk",
831 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
832 .parent = &func_12m_clk,
833 .divisor = 1,
834};
835
836static struct clk i2c2_iclk = {
837 .name = "i2c2.iclk",
838 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
839 .parent = &core_l4_iclk,
840};
841
842static struct clk gpio_dbclk[5] = {
843 {
844 .name = "gpio1_dbclk",
845 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
846 .parent = &wu_32k_clk,
847 }, {
848 .name = "gpio2_dbclk",
849 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
850 .parent = &wu_32k_clk,
851 }, {
852 .name = "gpio3_dbclk",
853 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
854 .parent = &wu_32k_clk,
855 }, {
856 .name = "gpio4_dbclk",
857 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
858 .parent = &wu_32k_clk,
859 }, {
860 .name = "gpio5_dbclk",
861 .flags = CLOCK_IN_OMAP243X,
862 .parent = &wu_32k_clk,
863 },
864};
865
866static struct clk gpio_iclk = {
867 .name = "gpio_iclk",
868 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
869 .parent = &wu_l4_iclk,
870};
871
872static struct clk mmc_fck = {
873 .name = "mmc_fclk",
874 .flags = CLOCK_IN_OMAP242X,
875 .parent = &func_96m_clk,
876};
877
878static struct clk mmc_ick = {
879 .name = "mmc_iclk",
880 .flags = CLOCK_IN_OMAP242X,
881 .parent = &core_l4_iclk,
882};
883
884static struct clk spi_fclk[3] = {
885 {
886 .name = "spi1_fclk",
887 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
888 .parent = &func_48m_clk,
889 }, {
890 .name = "spi2_fclk",
891 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
892 .parent = &func_48m_clk,
893 }, {
894 .name = "spi3_fclk",
895 .flags = CLOCK_IN_OMAP243X,
896 .parent = &func_48m_clk,
897 },
898};
899
900static struct clk dss_clk[2] = {
901 {
902 .name = "dss_clk1",
903 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
904 .parent = &core_clk,
905 }, {
906 .name = "dss_clk2",
907 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
908 .parent = &sys_clk,
909 },
910};
911
912static struct clk dss_54m_clk = {
913 .name = "dss_54m_clk",
914 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
915 .parent = &func_54m_clk,
916};
917
918static struct clk dss_l3_iclk = {
919 .name = "dss_l3_iclk",
920 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
921 .parent = &core_l3_iclk,
922};
923
924static struct clk dss_l4_iclk = {
925 .name = "dss_l4_iclk",
926 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
927 .parent = &core_l4_iclk,
928};
929
930static struct clk spi_iclk[3] = {
931 {
932 .name = "spi1_iclk",
933 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
934 .parent = &core_l4_iclk,
935 }, {
936 .name = "spi2_iclk",
937 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
938 .parent = &core_l4_iclk,
939 }, {
940 .name = "spi3_iclk",
941 .flags = CLOCK_IN_OMAP243X,
942 .parent = &core_l4_iclk,
943 },
944};
945
946static struct clk omapctrl_clk = {
947 .name = "omapctrl_iclk",
948 .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
949
950 .parent = &core_l4_iclk,
951};
952
953static struct clk *onchip_clks[] = {
954
955
956
957 &xtal_osc12m,
958 &xtal_osc32k,
959 &ck_ref,
960 &dpll1,
961 &dpll2,
962 &dpll3,
963 &dpll4,
964 &apll,
965 &ck_48m,
966
967 &clkm1,
968 &ck_dpll1out,
969 &sossi_ck,
970 &arm_ck,
971 &armper_ck,
972 &arm_gpio_ck,
973 &armxor_ck,
974 &armtim_ck,
975 &armwdt_ck,
976 &arminth_ck15xx, &arminth_ck16xx,
977
978 &clkm2,
979 &dsp_ck,
980 &dspmmu_ck,
981 &dspper_ck,
982 &dspxor_ck,
983 &dsptim_ck,
984
985 &clkm3,
986 &tc_ck,
987 &tipb_ck,
988 &l3_ocpi_ck,
989 &tc1_ck,
990 &tc2_ck,
991 &dma_ck,
992 &dma_lcdfree_ck,
993 &api_ck,
994 &lb_ck,
995 &lbfree_ck,
996 &hsab_ck,
997 &rhea1_ck,
998 &rhea2_ck,
999 &lcd_ck_16xx,
1000 &lcd_ck_1510,
1001
1002 &uart1_1510,
1003 &uart1_16xx,
1004 &uart2_ck,
1005 &uart3_1510,
1006 &uart3_16xx,
1007 &usb_clk0,
1008 &usb_hhc_ck1510, &usb_hhc_ck16xx,
1009 &mclk_1510, &mclk_16xx, &mclk_310,
1010 &bclk_1510, &bclk_16xx, &bclk_310,
1011 &mmc1_ck,
1012 &mmc2_ck,
1013 &cam_mclk,
1014 &cam_exclk,
1015 &cam_lclk,
1016 &clk32k,
1017 &usb_w2fc_mclk,
1018
1019 &i2c_fck,
1020 &i2c_ick,
1021
1022
1023
1024 &ref_clk,
1025 &apll_96m,
1026 &apll_54m,
1027 &sys_clk,
1028 &sleep_clk,
1029 &dpll_ck,
1030 &dpll_x2_ck,
1031 &wdt1_sys_clk,
1032 &func_96m_clk,
1033 &func_48m_clk,
1034 &func_12m_clk,
1035 &func_54m_clk,
1036 &sys_clkout,
1037 &sys_clkout2,
1038 &core_clk,
1039 &l3_clk,
1040 &core_l4_iclk,
1041 &wu_l4_iclk,
1042 &core_l3_iclk,
1043 &core_l4_usb_clk,
1044 &wu_gpt1_clk,
1045 &wu_32k_clk,
1046 &uart1_fclk,
1047 &uart1_iclk,
1048 &uart2_fclk,
1049 &uart2_iclk,
1050 &uart3_fclk,
1051 &uart3_iclk,
1052 &mpu_fclk,
1053 &mpu_iclk,
1054 &int_m_fclk,
1055 &int_m_iclk,
1056 &core_gpt2_clk,
1057 &core_gpt3_clk,
1058 &core_gpt4_clk,
1059 &core_gpt5_clk,
1060 &core_gpt6_clk,
1061 &core_gpt7_clk,
1062 &core_gpt8_clk,
1063 &core_gpt9_clk,
1064 &core_gpt10_clk,
1065 &core_gpt11_clk,
1066 &core_gpt12_clk,
1067 &mcbsp1_clk,
1068 &mcbsp2_clk,
1069 &emul_clk,
1070 &sdma_fclk,
1071 &sdma_iclk,
1072 &i2c1_fclk,
1073 &i2c1_iclk,
1074 &i2c2_fclk,
1075 &i2c2_iclk,
1076 &gpio_dbclk[0],
1077 &gpio_dbclk[1],
1078 &gpio_dbclk[2],
1079 &gpio_dbclk[3],
1080 &gpio_iclk,
1081 &mmc_fck,
1082 &mmc_ick,
1083 &spi_fclk[0],
1084 &spi_iclk[0],
1085 &spi_fclk[1],
1086 &spi_iclk[1],
1087 &spi_fclk[2],
1088 &spi_iclk[2],
1089 &dss_clk[0],
1090 &dss_clk[1],
1091 &dss_54m_clk,
1092 &dss_l3_iclk,
1093 &dss_l4_iclk,
1094 &omapctrl_clk,
1095
1096 NULL
1097};
1098
1099void omap_clk_adduser(struct clk *clk, qemu_irq user)
1100{
1101 qemu_irq *i;
1102
1103 for (i = clk->users; *i; i ++);
1104 *i = user;
1105}
1106
1107struct clk *omap_findclk(struct omap_mpu_state_s *mpu, const char *name)
1108{
1109 struct clk *i;
1110
1111 for (i = mpu->clks; i->name; i ++)
1112 if (!strcmp(i->name, name) || (i->alias && !strcmp(i->alias, name)))
1113 return i;
1114 hw_error("%s: %s not found\n", __func__, name);
1115}
1116
1117void omap_clk_get(struct clk *clk)
1118{
1119 clk->usecount ++;
1120}
1121
1122void omap_clk_put(struct clk *clk)
1123{
1124 if (!(clk->usecount --))
1125 hw_error("%s: %s is not in use\n", __func__, clk->name);
1126}
1127
1128static void omap_clk_update(struct clk *clk)
1129{
1130 int parent, running;
1131 qemu_irq *user;
1132 struct clk *i;
1133
1134 if (clk->parent)
1135 parent = clk->parent->running;
1136 else
1137 parent = 1;
1138
1139 running = parent && (clk->enabled ||
1140 ((clk->flags & ALWAYS_ENABLED) && clk->usecount));
1141 if (clk->running != running) {
1142 clk->running = running;
1143 for (user = clk->users; *user; user ++)
1144 qemu_set_irq(*user, running);
1145 for (i = clk->child1; i; i = i->sibling)
1146 omap_clk_update(i);
1147 }
1148}
1149
1150static void omap_clk_rate_update_full(struct clk *clk, unsigned long int rate,
1151 unsigned long int div, unsigned long int mult)
1152{
1153 struct clk *i;
1154 qemu_irq *user;
1155
1156 clk->rate = muldiv64(rate, mult, div);
1157 if (clk->running)
1158 for (user = clk->users; *user; user ++)
1159 qemu_irq_raise(*user);
1160 for (i = clk->child1; i; i = i->sibling)
1161 omap_clk_rate_update_full(i, rate,
1162 div * i->divisor, mult * i->multiplier);
1163}
1164
1165static void omap_clk_rate_update(struct clk *clk)
1166{
1167 struct clk *i;
1168 unsigned long int div, mult = div = 1;
1169
1170 for (i = clk; i->parent; i = i->parent) {
1171 div *= i->divisor;
1172 mult *= i->multiplier;
1173 }
1174
1175 omap_clk_rate_update_full(clk, i->rate, div, mult);
1176}
1177
1178void omap_clk_reparent(struct clk *clk, struct clk *parent)
1179{
1180 struct clk **p;
1181
1182 if (clk->parent) {
1183 for (p = &clk->parent->child1; *p != clk; p = &(*p)->sibling);
1184 *p = clk->sibling;
1185 }
1186
1187 clk->parent = parent;
1188 if (parent) {
1189 clk->sibling = parent->child1;
1190 parent->child1 = clk;
1191 omap_clk_update(clk);
1192 omap_clk_rate_update(clk);
1193 } else
1194 clk->sibling = NULL;
1195}
1196
1197void omap_clk_onoff(struct clk *clk, int on)
1198{
1199 clk->enabled = on;
1200 omap_clk_update(clk);
1201}
1202
1203void omap_clk_canidle(struct clk *clk, int can)
1204{
1205 if (can)
1206 omap_clk_put(clk);
1207 else
1208 omap_clk_get(clk);
1209}
1210
1211void omap_clk_setrate(struct clk *clk, int divide, int multiply)
1212{
1213 clk->divisor = divide;
1214 clk->multiplier = multiply;
1215 omap_clk_rate_update(clk);
1216}
1217
1218int64_t omap_clk_getrate(omap_clk clk)
1219{
1220 return clk->rate;
1221}
1222
1223void omap_clk_init(struct omap_mpu_state_s *mpu)
1224{
1225 struct clk **i, *j, *k;
1226 int count;
1227 int flag;
1228
1229 if (cpu_is_omap310(mpu))
1230 flag = CLOCK_IN_OMAP310;
1231 else if (cpu_is_omap1510(mpu))
1232 flag = CLOCK_IN_OMAP1510;
1233 else if (cpu_is_omap2410(mpu) || cpu_is_omap2420(mpu))
1234 flag = CLOCK_IN_OMAP242X;
1235 else if (cpu_is_omap2430(mpu))
1236 flag = CLOCK_IN_OMAP243X;
1237 else if (cpu_is_omap3430(mpu))
1238 flag = CLOCK_IN_OMAP243X;
1239 else
1240 return;
1241
1242 for (i = onchip_clks, count = 0; *i; i ++)
1243 if ((*i)->flags & flag)
1244 count ++;
1245 mpu->clks = g_new0(struct clk, count + 1);
1246 for (i = onchip_clks, j = mpu->clks; *i; i ++)
1247 if ((*i)->flags & flag) {
1248 memcpy(j, *i, sizeof(struct clk));
1249 for (k = mpu->clks; k < j; k ++)
1250 if (j->parent && !strcmp(j->parent->name, k->name)) {
1251 j->parent = k;
1252 j->sibling = k->child1;
1253 k->child1 = j;
1254 } else if (k->parent && !strcmp(k->parent->name, j->name)) {
1255 k->parent = j;
1256 k->sibling = j->child1;
1257 j->child1 = k;
1258 }
1259 j->divisor = j->divisor ?: 1;
1260 j->multiplier = j->multiplier ?: 1;
1261 j ++;
1262 }
1263 for (j = mpu->clks; count --; j ++) {
1264 omap_clk_update(j);
1265 omap_clk_rate_update(j);
1266 }
1267}
1268