Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/arm/mach-exynos4/clock.c
10817 views
1
/* linux/arch/arm/mach-exynos4/clock.c
2
*
3
* Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
4
* http://www.samsung.com
5
*
6
* EXYNOS4 - Clock support
7
*
8
* This program is free software; you can redistribute it and/or modify
9
* it under the terms of the GNU General Public License version 2 as
10
* published by the Free Software Foundation.
11
*/
12
13
#include <linux/kernel.h>
14
#include <linux/err.h>
15
#include <linux/io.h>
16
17
#include <plat/cpu-freq.h>
18
#include <plat/clock.h>
19
#include <plat/cpu.h>
20
#include <plat/pll.h>
21
#include <plat/s5p-clock.h>
22
#include <plat/clock-clksrc.h>
23
24
#include <mach/map.h>
25
#include <mach/regs-clock.h>
26
#include <mach/sysmmu.h>
27
28
static struct clk clk_sclk_hdmi27m = {
29
.name = "sclk_hdmi27m",
30
.id = -1,
31
.rate = 27000000,
32
};
33
34
static struct clk clk_sclk_hdmiphy = {
35
.name = "sclk_hdmiphy",
36
.id = -1,
37
};
38
39
static struct clk clk_sclk_usbphy0 = {
40
.name = "sclk_usbphy0",
41
.id = -1,
42
.rate = 27000000,
43
};
44
45
static struct clk clk_sclk_usbphy1 = {
46
.name = "sclk_usbphy1",
47
.id = -1,
48
};
49
50
static int exynos4_clksrc_mask_top_ctrl(struct clk *clk, int enable)
51
{
52
return s5p_gatectrl(S5P_CLKSRC_MASK_TOP, clk, enable);
53
}
54
55
static int exynos4_clksrc_mask_cam_ctrl(struct clk *clk, int enable)
56
{
57
return s5p_gatectrl(S5P_CLKSRC_MASK_CAM, clk, enable);
58
}
59
60
static int exynos4_clksrc_mask_lcd0_ctrl(struct clk *clk, int enable)
61
{
62
return s5p_gatectrl(S5P_CLKSRC_MASK_LCD0, clk, enable);
63
}
64
65
static int exynos4_clksrc_mask_lcd1_ctrl(struct clk *clk, int enable)
66
{
67
return s5p_gatectrl(S5P_CLKSRC_MASK_LCD1, clk, enable);
68
}
69
70
static int exynos4_clksrc_mask_fsys_ctrl(struct clk *clk, int enable)
71
{
72
return s5p_gatectrl(S5P_CLKSRC_MASK_FSYS, clk, enable);
73
}
74
75
static int exynos4_clksrc_mask_peril0_ctrl(struct clk *clk, int enable)
76
{
77
return s5p_gatectrl(S5P_CLKSRC_MASK_PERIL0, clk, enable);
78
}
79
80
static int exynos4_clksrc_mask_peril1_ctrl(struct clk *clk, int enable)
81
{
82
return s5p_gatectrl(S5P_CLKSRC_MASK_PERIL1, clk, enable);
83
}
84
85
static int exynos4_clk_ip_mfc_ctrl(struct clk *clk, int enable)
86
{
87
return s5p_gatectrl(S5P_CLKGATE_IP_MFC, clk, enable);
88
}
89
90
static int exynos4_clk_ip_cam_ctrl(struct clk *clk, int enable)
91
{
92
return s5p_gatectrl(S5P_CLKGATE_IP_CAM, clk, enable);
93
}
94
95
static int exynos4_clk_ip_tv_ctrl(struct clk *clk, int enable)
96
{
97
return s5p_gatectrl(S5P_CLKGATE_IP_TV, clk, enable);
98
}
99
100
static int exynos4_clk_ip_image_ctrl(struct clk *clk, int enable)
101
{
102
return s5p_gatectrl(S5P_CLKGATE_IP_IMAGE, clk, enable);
103
}
104
105
static int exynos4_clk_ip_lcd0_ctrl(struct clk *clk, int enable)
106
{
107
return s5p_gatectrl(S5P_CLKGATE_IP_LCD0, clk, enable);
108
}
109
110
static int exynos4_clk_ip_lcd1_ctrl(struct clk *clk, int enable)
111
{
112
return s5p_gatectrl(S5P_CLKGATE_IP_LCD1, clk, enable);
113
}
114
115
static int exynos4_clk_ip_fsys_ctrl(struct clk *clk, int enable)
116
{
117
return s5p_gatectrl(S5P_CLKGATE_IP_FSYS, clk, enable);
118
}
119
120
static int exynos4_clk_ip_peril_ctrl(struct clk *clk, int enable)
121
{
122
return s5p_gatectrl(S5P_CLKGATE_IP_PERIL, clk, enable);
123
}
124
125
static int exynos4_clk_ip_perir_ctrl(struct clk *clk, int enable)
126
{
127
return s5p_gatectrl(S5P_CLKGATE_IP_PERIR, clk, enable);
128
}
129
130
/* Core list of CMU_CPU side */
131
132
static struct clksrc_clk clk_mout_apll = {
133
.clk = {
134
.name = "mout_apll",
135
.id = -1,
136
},
137
.sources = &clk_src_apll,
138
.reg_src = { .reg = S5P_CLKSRC_CPU, .shift = 0, .size = 1 },
139
};
140
141
static struct clksrc_clk clk_sclk_apll = {
142
.clk = {
143
.name = "sclk_apll",
144
.id = -1,
145
.parent = &clk_mout_apll.clk,
146
},
147
.reg_div = { .reg = S5P_CLKDIV_CPU, .shift = 24, .size = 3 },
148
};
149
150
static struct clksrc_clk clk_mout_epll = {
151
.clk = {
152
.name = "mout_epll",
153
.id = -1,
154
},
155
.sources = &clk_src_epll,
156
.reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 4, .size = 1 },
157
};
158
159
static struct clksrc_clk clk_mout_mpll = {
160
.clk = {
161
.name = "mout_mpll",
162
.id = -1,
163
},
164
.sources = &clk_src_mpll,
165
.reg_src = { .reg = S5P_CLKSRC_CPU, .shift = 8, .size = 1 },
166
};
167
168
static struct clk *clkset_moutcore_list[] = {
169
[0] = &clk_mout_apll.clk,
170
[1] = &clk_mout_mpll.clk,
171
};
172
173
static struct clksrc_sources clkset_moutcore = {
174
.sources = clkset_moutcore_list,
175
.nr_sources = ARRAY_SIZE(clkset_moutcore_list),
176
};
177
178
static struct clksrc_clk clk_moutcore = {
179
.clk = {
180
.name = "moutcore",
181
.id = -1,
182
},
183
.sources = &clkset_moutcore,
184
.reg_src = { .reg = S5P_CLKSRC_CPU, .shift = 16, .size = 1 },
185
};
186
187
static struct clksrc_clk clk_coreclk = {
188
.clk = {
189
.name = "core_clk",
190
.id = -1,
191
.parent = &clk_moutcore.clk,
192
},
193
.reg_div = { .reg = S5P_CLKDIV_CPU, .shift = 0, .size = 3 },
194
};
195
196
static struct clksrc_clk clk_armclk = {
197
.clk = {
198
.name = "armclk",
199
.id = -1,
200
.parent = &clk_coreclk.clk,
201
},
202
};
203
204
static struct clksrc_clk clk_aclk_corem0 = {
205
.clk = {
206
.name = "aclk_corem0",
207
.id = -1,
208
.parent = &clk_coreclk.clk,
209
},
210
.reg_div = { .reg = S5P_CLKDIV_CPU, .shift = 4, .size = 3 },
211
};
212
213
static struct clksrc_clk clk_aclk_cores = {
214
.clk = {
215
.name = "aclk_cores",
216
.id = -1,
217
.parent = &clk_coreclk.clk,
218
},
219
.reg_div = { .reg = S5P_CLKDIV_CPU, .shift = 4, .size = 3 },
220
};
221
222
static struct clksrc_clk clk_aclk_corem1 = {
223
.clk = {
224
.name = "aclk_corem1",
225
.id = -1,
226
.parent = &clk_coreclk.clk,
227
},
228
.reg_div = { .reg = S5P_CLKDIV_CPU, .shift = 8, .size = 3 },
229
};
230
231
static struct clksrc_clk clk_periphclk = {
232
.clk = {
233
.name = "periphclk",
234
.id = -1,
235
.parent = &clk_coreclk.clk,
236
},
237
.reg_div = { .reg = S5P_CLKDIV_CPU, .shift = 12, .size = 3 },
238
};
239
240
/* Core list of CMU_CORE side */
241
242
static struct clk *clkset_corebus_list[] = {
243
[0] = &clk_mout_mpll.clk,
244
[1] = &clk_sclk_apll.clk,
245
};
246
247
static struct clksrc_sources clkset_mout_corebus = {
248
.sources = clkset_corebus_list,
249
.nr_sources = ARRAY_SIZE(clkset_corebus_list),
250
};
251
252
static struct clksrc_clk clk_mout_corebus = {
253
.clk = {
254
.name = "mout_corebus",
255
.id = -1,
256
},
257
.sources = &clkset_mout_corebus,
258
.reg_src = { .reg = S5P_CLKSRC_DMC, .shift = 4, .size = 1 },
259
};
260
261
static struct clksrc_clk clk_sclk_dmc = {
262
.clk = {
263
.name = "sclk_dmc",
264
.id = -1,
265
.parent = &clk_mout_corebus.clk,
266
},
267
.reg_div = { .reg = S5P_CLKDIV_DMC0, .shift = 12, .size = 3 },
268
};
269
270
static struct clksrc_clk clk_aclk_cored = {
271
.clk = {
272
.name = "aclk_cored",
273
.id = -1,
274
.parent = &clk_sclk_dmc.clk,
275
},
276
.reg_div = { .reg = S5P_CLKDIV_DMC0, .shift = 16, .size = 3 },
277
};
278
279
static struct clksrc_clk clk_aclk_corep = {
280
.clk = {
281
.name = "aclk_corep",
282
.id = -1,
283
.parent = &clk_aclk_cored.clk,
284
},
285
.reg_div = { .reg = S5P_CLKDIV_DMC0, .shift = 20, .size = 3 },
286
};
287
288
static struct clksrc_clk clk_aclk_acp = {
289
.clk = {
290
.name = "aclk_acp",
291
.id = -1,
292
.parent = &clk_mout_corebus.clk,
293
},
294
.reg_div = { .reg = S5P_CLKDIV_DMC0, .shift = 0, .size = 3 },
295
};
296
297
static struct clksrc_clk clk_pclk_acp = {
298
.clk = {
299
.name = "pclk_acp",
300
.id = -1,
301
.parent = &clk_aclk_acp.clk,
302
},
303
.reg_div = { .reg = S5P_CLKDIV_DMC0, .shift = 4, .size = 3 },
304
};
305
306
/* Core list of CMU_TOP side */
307
308
static struct clk *clkset_aclk_top_list[] = {
309
[0] = &clk_mout_mpll.clk,
310
[1] = &clk_sclk_apll.clk,
311
};
312
313
static struct clksrc_sources clkset_aclk = {
314
.sources = clkset_aclk_top_list,
315
.nr_sources = ARRAY_SIZE(clkset_aclk_top_list),
316
};
317
318
static struct clksrc_clk clk_aclk_200 = {
319
.clk = {
320
.name = "aclk_200",
321
.id = -1,
322
},
323
.sources = &clkset_aclk,
324
.reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 12, .size = 1 },
325
.reg_div = { .reg = S5P_CLKDIV_TOP, .shift = 0, .size = 3 },
326
};
327
328
static struct clksrc_clk clk_aclk_100 = {
329
.clk = {
330
.name = "aclk_100",
331
.id = -1,
332
},
333
.sources = &clkset_aclk,
334
.reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 16, .size = 1 },
335
.reg_div = { .reg = S5P_CLKDIV_TOP, .shift = 4, .size = 4 },
336
};
337
338
static struct clksrc_clk clk_aclk_160 = {
339
.clk = {
340
.name = "aclk_160",
341
.id = -1,
342
},
343
.sources = &clkset_aclk,
344
.reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 20, .size = 1 },
345
.reg_div = { .reg = S5P_CLKDIV_TOP, .shift = 8, .size = 3 },
346
};
347
348
static struct clksrc_clk clk_aclk_133 = {
349
.clk = {
350
.name = "aclk_133",
351
.id = -1,
352
},
353
.sources = &clkset_aclk,
354
.reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 24, .size = 1 },
355
.reg_div = { .reg = S5P_CLKDIV_TOP, .shift = 12, .size = 3 },
356
};
357
358
static struct clk *clkset_vpllsrc_list[] = {
359
[0] = &clk_fin_vpll,
360
[1] = &clk_sclk_hdmi27m,
361
};
362
363
static struct clksrc_sources clkset_vpllsrc = {
364
.sources = clkset_vpllsrc_list,
365
.nr_sources = ARRAY_SIZE(clkset_vpllsrc_list),
366
};
367
368
static struct clksrc_clk clk_vpllsrc = {
369
.clk = {
370
.name = "vpll_src",
371
.id = -1,
372
.enable = exynos4_clksrc_mask_top_ctrl,
373
.ctrlbit = (1 << 0),
374
},
375
.sources = &clkset_vpllsrc,
376
.reg_src = { .reg = S5P_CLKSRC_TOP1, .shift = 0, .size = 1 },
377
};
378
379
static struct clk *clkset_sclk_vpll_list[] = {
380
[0] = &clk_vpllsrc.clk,
381
[1] = &clk_fout_vpll,
382
};
383
384
static struct clksrc_sources clkset_sclk_vpll = {
385
.sources = clkset_sclk_vpll_list,
386
.nr_sources = ARRAY_SIZE(clkset_sclk_vpll_list),
387
};
388
389
static struct clksrc_clk clk_sclk_vpll = {
390
.clk = {
391
.name = "sclk_vpll",
392
.id = -1,
393
},
394
.sources = &clkset_sclk_vpll,
395
.reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 8, .size = 1 },
396
};
397
398
static struct clk init_clocks_off[] = {
399
{
400
.name = "timers",
401
.id = -1,
402
.parent = &clk_aclk_100.clk,
403
.enable = exynos4_clk_ip_peril_ctrl,
404
.ctrlbit = (1<<24),
405
}, {
406
.name = "csis",
407
.id = 0,
408
.enable = exynos4_clk_ip_cam_ctrl,
409
.ctrlbit = (1 << 4),
410
}, {
411
.name = "csis",
412
.id = 1,
413
.enable = exynos4_clk_ip_cam_ctrl,
414
.ctrlbit = (1 << 5),
415
}, {
416
.name = "fimc",
417
.id = 0,
418
.enable = exynos4_clk_ip_cam_ctrl,
419
.ctrlbit = (1 << 0),
420
}, {
421
.name = "fimc",
422
.id = 1,
423
.enable = exynos4_clk_ip_cam_ctrl,
424
.ctrlbit = (1 << 1),
425
}, {
426
.name = "fimc",
427
.id = 2,
428
.enable = exynos4_clk_ip_cam_ctrl,
429
.ctrlbit = (1 << 2),
430
}, {
431
.name = "fimc",
432
.id = 3,
433
.enable = exynos4_clk_ip_cam_ctrl,
434
.ctrlbit = (1 << 3),
435
}, {
436
.name = "fimd",
437
.id = 0,
438
.enable = exynos4_clk_ip_lcd0_ctrl,
439
.ctrlbit = (1 << 0),
440
}, {
441
.name = "fimd",
442
.id = 1,
443
.enable = exynos4_clk_ip_lcd1_ctrl,
444
.ctrlbit = (1 << 0),
445
}, {
446
.name = "sataphy",
447
.id = -1,
448
.parent = &clk_aclk_133.clk,
449
.enable = exynos4_clk_ip_fsys_ctrl,
450
.ctrlbit = (1 << 3),
451
}, {
452
.name = "hsmmc",
453
.id = 0,
454
.parent = &clk_aclk_133.clk,
455
.enable = exynos4_clk_ip_fsys_ctrl,
456
.ctrlbit = (1 << 5),
457
}, {
458
.name = "hsmmc",
459
.id = 1,
460
.parent = &clk_aclk_133.clk,
461
.enable = exynos4_clk_ip_fsys_ctrl,
462
.ctrlbit = (1 << 6),
463
}, {
464
.name = "hsmmc",
465
.id = 2,
466
.parent = &clk_aclk_133.clk,
467
.enable = exynos4_clk_ip_fsys_ctrl,
468
.ctrlbit = (1 << 7),
469
}, {
470
.name = "hsmmc",
471
.id = 3,
472
.parent = &clk_aclk_133.clk,
473
.enable = exynos4_clk_ip_fsys_ctrl,
474
.ctrlbit = (1 << 8),
475
}, {
476
.name = "hsmmc",
477
.id = 4,
478
.parent = &clk_aclk_133.clk,
479
.enable = exynos4_clk_ip_fsys_ctrl,
480
.ctrlbit = (1 << 9),
481
}, {
482
.name = "sata",
483
.id = -1,
484
.parent = &clk_aclk_133.clk,
485
.enable = exynos4_clk_ip_fsys_ctrl,
486
.ctrlbit = (1 << 10),
487
}, {
488
.name = "pdma",
489
.id = 0,
490
.enable = exynos4_clk_ip_fsys_ctrl,
491
.ctrlbit = (1 << 0),
492
}, {
493
.name = "pdma",
494
.id = 1,
495
.enable = exynos4_clk_ip_fsys_ctrl,
496
.ctrlbit = (1 << 1),
497
}, {
498
.name = "adc",
499
.id = -1,
500
.enable = exynos4_clk_ip_peril_ctrl,
501
.ctrlbit = (1 << 15),
502
}, {
503
.name = "keypad",
504
.id = -1,
505
.enable = exynos4_clk_ip_perir_ctrl,
506
.ctrlbit = (1 << 16),
507
}, {
508
.name = "rtc",
509
.id = -1,
510
.enable = exynos4_clk_ip_perir_ctrl,
511
.ctrlbit = (1 << 15),
512
}, {
513
.name = "watchdog",
514
.id = -1,
515
.parent = &clk_aclk_100.clk,
516
.enable = exynos4_clk_ip_perir_ctrl,
517
.ctrlbit = (1 << 14),
518
}, {
519
.name = "usbhost",
520
.id = -1,
521
.enable = exynos4_clk_ip_fsys_ctrl ,
522
.ctrlbit = (1 << 12),
523
}, {
524
.name = "otg",
525
.id = -1,
526
.enable = exynos4_clk_ip_fsys_ctrl,
527
.ctrlbit = (1 << 13),
528
}, {
529
.name = "spi",
530
.id = 0,
531
.enable = exynos4_clk_ip_peril_ctrl,
532
.ctrlbit = (1 << 16),
533
}, {
534
.name = "spi",
535
.id = 1,
536
.enable = exynos4_clk_ip_peril_ctrl,
537
.ctrlbit = (1 << 17),
538
}, {
539
.name = "spi",
540
.id = 2,
541
.enable = exynos4_clk_ip_peril_ctrl,
542
.ctrlbit = (1 << 18),
543
}, {
544
.name = "iis",
545
.id = 0,
546
.enable = exynos4_clk_ip_peril_ctrl,
547
.ctrlbit = (1 << 19),
548
}, {
549
.name = "iis",
550
.id = 1,
551
.enable = exynos4_clk_ip_peril_ctrl,
552
.ctrlbit = (1 << 20),
553
}, {
554
.name = "iis",
555
.id = 2,
556
.enable = exynos4_clk_ip_peril_ctrl,
557
.ctrlbit = (1 << 21),
558
}, {
559
.name = "ac97",
560
.id = -1,
561
.enable = exynos4_clk_ip_peril_ctrl,
562
.ctrlbit = (1 << 27),
563
}, {
564
.name = "fimg2d",
565
.id = -1,
566
.enable = exynos4_clk_ip_image_ctrl,
567
.ctrlbit = (1 << 0),
568
}, {
569
.name = "i2c",
570
.id = 0,
571
.parent = &clk_aclk_100.clk,
572
.enable = exynos4_clk_ip_peril_ctrl,
573
.ctrlbit = (1 << 6),
574
}, {
575
.name = "i2c",
576
.id = 1,
577
.parent = &clk_aclk_100.clk,
578
.enable = exynos4_clk_ip_peril_ctrl,
579
.ctrlbit = (1 << 7),
580
}, {
581
.name = "i2c",
582
.id = 2,
583
.parent = &clk_aclk_100.clk,
584
.enable = exynos4_clk_ip_peril_ctrl,
585
.ctrlbit = (1 << 8),
586
}, {
587
.name = "i2c",
588
.id = 3,
589
.parent = &clk_aclk_100.clk,
590
.enable = exynos4_clk_ip_peril_ctrl,
591
.ctrlbit = (1 << 9),
592
}, {
593
.name = "i2c",
594
.id = 4,
595
.parent = &clk_aclk_100.clk,
596
.enable = exynos4_clk_ip_peril_ctrl,
597
.ctrlbit = (1 << 10),
598
}, {
599
.name = "i2c",
600
.id = 5,
601
.parent = &clk_aclk_100.clk,
602
.enable = exynos4_clk_ip_peril_ctrl,
603
.ctrlbit = (1 << 11),
604
}, {
605
.name = "i2c",
606
.id = 6,
607
.parent = &clk_aclk_100.clk,
608
.enable = exynos4_clk_ip_peril_ctrl,
609
.ctrlbit = (1 << 12),
610
}, {
611
.name = "i2c",
612
.id = 7,
613
.parent = &clk_aclk_100.clk,
614
.enable = exynos4_clk_ip_peril_ctrl,
615
.ctrlbit = (1 << 13),
616
}, {
617
.name = "SYSMMU_MDMA",
618
.id = -1,
619
.enable = exynos4_clk_ip_image_ctrl,
620
.ctrlbit = (1 << 5),
621
}, {
622
.name = "SYSMMU_FIMC0",
623
.id = -1,
624
.enable = exynos4_clk_ip_cam_ctrl,
625
.ctrlbit = (1 << 7),
626
}, {
627
.name = "SYSMMU_FIMC1",
628
.id = -1,
629
.enable = exynos4_clk_ip_cam_ctrl,
630
.ctrlbit = (1 << 8),
631
}, {
632
.name = "SYSMMU_FIMC2",
633
.id = -1,
634
.enable = exynos4_clk_ip_cam_ctrl,
635
.ctrlbit = (1 << 9),
636
}, {
637
.name = "SYSMMU_FIMC3",
638
.id = -1,
639
.enable = exynos4_clk_ip_cam_ctrl,
640
.ctrlbit = (1 << 10),
641
}, {
642
.name = "SYSMMU_JPEG",
643
.id = -1,
644
.enable = exynos4_clk_ip_cam_ctrl,
645
.ctrlbit = (1 << 11),
646
}, {
647
.name = "SYSMMU_FIMD0",
648
.id = -1,
649
.enable = exynos4_clk_ip_lcd0_ctrl,
650
.ctrlbit = (1 << 4),
651
}, {
652
.name = "SYSMMU_FIMD1",
653
.id = -1,
654
.enable = exynos4_clk_ip_lcd1_ctrl,
655
.ctrlbit = (1 << 4),
656
}, {
657
.name = "SYSMMU_PCIe",
658
.id = -1,
659
.enable = exynos4_clk_ip_fsys_ctrl,
660
.ctrlbit = (1 << 18),
661
}, {
662
.name = "SYSMMU_G2D",
663
.id = -1,
664
.enable = exynos4_clk_ip_image_ctrl,
665
.ctrlbit = (1 << 3),
666
}, {
667
.name = "SYSMMU_ROTATOR",
668
.id = -1,
669
.enable = exynos4_clk_ip_image_ctrl,
670
.ctrlbit = (1 << 4),
671
}, {
672
.name = "SYSMMU_TV",
673
.id = -1,
674
.enable = exynos4_clk_ip_tv_ctrl,
675
.ctrlbit = (1 << 4),
676
}, {
677
.name = "SYSMMU_MFC_L",
678
.id = -1,
679
.enable = exynos4_clk_ip_mfc_ctrl,
680
.ctrlbit = (1 << 1),
681
}, {
682
.name = "SYSMMU_MFC_R",
683
.id = -1,
684
.enable = exynos4_clk_ip_mfc_ctrl,
685
.ctrlbit = (1 << 2),
686
}
687
};
688
689
static struct clk init_clocks[] = {
690
{
691
.name = "uart",
692
.id = 0,
693
.enable = exynos4_clk_ip_peril_ctrl,
694
.ctrlbit = (1 << 0),
695
}, {
696
.name = "uart",
697
.id = 1,
698
.enable = exynos4_clk_ip_peril_ctrl,
699
.ctrlbit = (1 << 1),
700
}, {
701
.name = "uart",
702
.id = 2,
703
.enable = exynos4_clk_ip_peril_ctrl,
704
.ctrlbit = (1 << 2),
705
}, {
706
.name = "uart",
707
.id = 3,
708
.enable = exynos4_clk_ip_peril_ctrl,
709
.ctrlbit = (1 << 3),
710
}, {
711
.name = "uart",
712
.id = 4,
713
.enable = exynos4_clk_ip_peril_ctrl,
714
.ctrlbit = (1 << 4),
715
}, {
716
.name = "uart",
717
.id = 5,
718
.enable = exynos4_clk_ip_peril_ctrl,
719
.ctrlbit = (1 << 5),
720
}
721
};
722
723
static struct clk *clkset_group_list[] = {
724
[0] = &clk_ext_xtal_mux,
725
[1] = &clk_xusbxti,
726
[2] = &clk_sclk_hdmi27m,
727
[3] = &clk_sclk_usbphy0,
728
[4] = &clk_sclk_usbphy1,
729
[5] = &clk_sclk_hdmiphy,
730
[6] = &clk_mout_mpll.clk,
731
[7] = &clk_mout_epll.clk,
732
[8] = &clk_sclk_vpll.clk,
733
};
734
735
static struct clksrc_sources clkset_group = {
736
.sources = clkset_group_list,
737
.nr_sources = ARRAY_SIZE(clkset_group_list),
738
};
739
740
static struct clk *clkset_mout_g2d0_list[] = {
741
[0] = &clk_mout_mpll.clk,
742
[1] = &clk_sclk_apll.clk,
743
};
744
745
static struct clksrc_sources clkset_mout_g2d0 = {
746
.sources = clkset_mout_g2d0_list,
747
.nr_sources = ARRAY_SIZE(clkset_mout_g2d0_list),
748
};
749
750
static struct clksrc_clk clk_mout_g2d0 = {
751
.clk = {
752
.name = "mout_g2d0",
753
.id = -1,
754
},
755
.sources = &clkset_mout_g2d0,
756
.reg_src = { .reg = S5P_CLKSRC_IMAGE, .shift = 0, .size = 1 },
757
};
758
759
static struct clk *clkset_mout_g2d1_list[] = {
760
[0] = &clk_mout_epll.clk,
761
[1] = &clk_sclk_vpll.clk,
762
};
763
764
static struct clksrc_sources clkset_mout_g2d1 = {
765
.sources = clkset_mout_g2d1_list,
766
.nr_sources = ARRAY_SIZE(clkset_mout_g2d1_list),
767
};
768
769
static struct clksrc_clk clk_mout_g2d1 = {
770
.clk = {
771
.name = "mout_g2d1",
772
.id = -1,
773
},
774
.sources = &clkset_mout_g2d1,
775
.reg_src = { .reg = S5P_CLKSRC_IMAGE, .shift = 4, .size = 1 },
776
};
777
778
static struct clk *clkset_mout_g2d_list[] = {
779
[0] = &clk_mout_g2d0.clk,
780
[1] = &clk_mout_g2d1.clk,
781
};
782
783
static struct clksrc_sources clkset_mout_g2d = {
784
.sources = clkset_mout_g2d_list,
785
.nr_sources = ARRAY_SIZE(clkset_mout_g2d_list),
786
};
787
788
static struct clksrc_clk clk_dout_mmc0 = {
789
.clk = {
790
.name = "dout_mmc0",
791
.id = -1,
792
},
793
.sources = &clkset_group,
794
.reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 0, .size = 4 },
795
.reg_div = { .reg = S5P_CLKDIV_FSYS1, .shift = 0, .size = 4 },
796
};
797
798
static struct clksrc_clk clk_dout_mmc1 = {
799
.clk = {
800
.name = "dout_mmc1",
801
.id = -1,
802
},
803
.sources = &clkset_group,
804
.reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 4, .size = 4 },
805
.reg_div = { .reg = S5P_CLKDIV_FSYS1, .shift = 16, .size = 4 },
806
};
807
808
static struct clksrc_clk clk_dout_mmc2 = {
809
.clk = {
810
.name = "dout_mmc2",
811
.id = -1,
812
},
813
.sources = &clkset_group,
814
.reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 8, .size = 4 },
815
.reg_div = { .reg = S5P_CLKDIV_FSYS2, .shift = 0, .size = 4 },
816
};
817
818
static struct clksrc_clk clk_dout_mmc3 = {
819
.clk = {
820
.name = "dout_mmc3",
821
.id = -1,
822
},
823
.sources = &clkset_group,
824
.reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 12, .size = 4 },
825
.reg_div = { .reg = S5P_CLKDIV_FSYS2, .shift = 16, .size = 4 },
826
};
827
828
static struct clksrc_clk clk_dout_mmc4 = {
829
.clk = {
830
.name = "dout_mmc4",
831
.id = -1,
832
},
833
.sources = &clkset_group,
834
.reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 16, .size = 4 },
835
.reg_div = { .reg = S5P_CLKDIV_FSYS3, .shift = 0, .size = 4 },
836
};
837
838
static struct clksrc_clk clksrcs[] = {
839
{
840
.clk = {
841
.name = "uclk1",
842
.id = 0,
843
.enable = exynos4_clksrc_mask_peril0_ctrl,
844
.ctrlbit = (1 << 0),
845
},
846
.sources = &clkset_group,
847
.reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 0, .size = 4 },
848
.reg_div = { .reg = S5P_CLKDIV_PERIL0, .shift = 0, .size = 4 },
849
}, {
850
.clk = {
851
.name = "uclk1",
852
.id = 1,
853
.enable = exynos4_clksrc_mask_peril0_ctrl,
854
.ctrlbit = (1 << 4),
855
},
856
.sources = &clkset_group,
857
.reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 4, .size = 4 },
858
.reg_div = { .reg = S5P_CLKDIV_PERIL0, .shift = 4, .size = 4 },
859
}, {
860
.clk = {
861
.name = "uclk1",
862
.id = 2,
863
.enable = exynos4_clksrc_mask_peril0_ctrl,
864
.ctrlbit = (1 << 8),
865
},
866
.sources = &clkset_group,
867
.reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 8, .size = 4 },
868
.reg_div = { .reg = S5P_CLKDIV_PERIL0, .shift = 8, .size = 4 },
869
}, {
870
.clk = {
871
.name = "uclk1",
872
.id = 3,
873
.enable = exynos4_clksrc_mask_peril0_ctrl,
874
.ctrlbit = (1 << 12),
875
},
876
.sources = &clkset_group,
877
.reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 12, .size = 4 },
878
.reg_div = { .reg = S5P_CLKDIV_PERIL0, .shift = 12, .size = 4 },
879
}, {
880
.clk = {
881
.name = "sclk_pwm",
882
.id = -1,
883
.enable = exynos4_clksrc_mask_peril0_ctrl,
884
.ctrlbit = (1 << 24),
885
},
886
.sources = &clkset_group,
887
.reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 24, .size = 4 },
888
.reg_div = { .reg = S5P_CLKDIV_PERIL3, .shift = 0, .size = 4 },
889
}, {
890
.clk = {
891
.name = "sclk_csis",
892
.id = 0,
893
.enable = exynos4_clksrc_mask_cam_ctrl,
894
.ctrlbit = (1 << 24),
895
},
896
.sources = &clkset_group,
897
.reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 24, .size = 4 },
898
.reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 24, .size = 4 },
899
}, {
900
.clk = {
901
.name = "sclk_csis",
902
.id = 1,
903
.enable = exynos4_clksrc_mask_cam_ctrl,
904
.ctrlbit = (1 << 28),
905
},
906
.sources = &clkset_group,
907
.reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 28, .size = 4 },
908
.reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 28, .size = 4 },
909
}, {
910
.clk = {
911
.name = "sclk_cam",
912
.id = 0,
913
.enable = exynos4_clksrc_mask_cam_ctrl,
914
.ctrlbit = (1 << 16),
915
},
916
.sources = &clkset_group,
917
.reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 16, .size = 4 },
918
.reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 16, .size = 4 },
919
}, {
920
.clk = {
921
.name = "sclk_cam",
922
.id = 1,
923
.enable = exynos4_clksrc_mask_cam_ctrl,
924
.ctrlbit = (1 << 20),
925
},
926
.sources = &clkset_group,
927
.reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 20, .size = 4 },
928
.reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 20, .size = 4 },
929
}, {
930
.clk = {
931
.name = "sclk_fimc",
932
.id = 0,
933
.enable = exynos4_clksrc_mask_cam_ctrl,
934
.ctrlbit = (1 << 0),
935
},
936
.sources = &clkset_group,
937
.reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 0, .size = 4 },
938
.reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 0, .size = 4 },
939
}, {
940
.clk = {
941
.name = "sclk_fimc",
942
.id = 1,
943
.enable = exynos4_clksrc_mask_cam_ctrl,
944
.ctrlbit = (1 << 4),
945
},
946
.sources = &clkset_group,
947
.reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 4, .size = 4 },
948
.reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 4, .size = 4 },
949
}, {
950
.clk = {
951
.name = "sclk_fimc",
952
.id = 2,
953
.enable = exynos4_clksrc_mask_cam_ctrl,
954
.ctrlbit = (1 << 8),
955
},
956
.sources = &clkset_group,
957
.reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 8, .size = 4 },
958
.reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 8, .size = 4 },
959
}, {
960
.clk = {
961
.name = "sclk_fimc",
962
.id = 3,
963
.enable = exynos4_clksrc_mask_cam_ctrl,
964
.ctrlbit = (1 << 12),
965
},
966
.sources = &clkset_group,
967
.reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 12, .size = 4 },
968
.reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 12, .size = 4 },
969
}, {
970
.clk = {
971
.name = "sclk_fimd",
972
.id = 0,
973
.enable = exynos4_clksrc_mask_lcd0_ctrl,
974
.ctrlbit = (1 << 0),
975
},
976
.sources = &clkset_group,
977
.reg_src = { .reg = S5P_CLKSRC_LCD0, .shift = 0, .size = 4 },
978
.reg_div = { .reg = S5P_CLKDIV_LCD0, .shift = 0, .size = 4 },
979
}, {
980
.clk = {
981
.name = "sclk_fimd",
982
.id = 1,
983
.enable = exynos4_clksrc_mask_lcd1_ctrl,
984
.ctrlbit = (1 << 0),
985
},
986
.sources = &clkset_group,
987
.reg_src = { .reg = S5P_CLKSRC_LCD1, .shift = 0, .size = 4 },
988
.reg_div = { .reg = S5P_CLKDIV_LCD1, .shift = 0, .size = 4 },
989
}, {
990
.clk = {
991
.name = "sclk_sata",
992
.id = -1,
993
.enable = exynos4_clksrc_mask_fsys_ctrl,
994
.ctrlbit = (1 << 24),
995
},
996
.sources = &clkset_mout_corebus,
997
.reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 24, .size = 1 },
998
.reg_div = { .reg = S5P_CLKDIV_FSYS0, .shift = 20, .size = 4 },
999
}, {
1000
.clk = {
1001
.name = "sclk_spi",
1002
.id = 0,
1003
.enable = exynos4_clksrc_mask_peril1_ctrl,
1004
.ctrlbit = (1 << 16),
1005
},
1006
.sources = &clkset_group,
1007
.reg_src = { .reg = S5P_CLKSRC_PERIL1, .shift = 16, .size = 4 },
1008
.reg_div = { .reg = S5P_CLKDIV_PERIL1, .shift = 0, .size = 4 },
1009
}, {
1010
.clk = {
1011
.name = "sclk_spi",
1012
.id = 1,
1013
.enable = exynos4_clksrc_mask_peril1_ctrl,
1014
.ctrlbit = (1 << 20),
1015
},
1016
.sources = &clkset_group,
1017
.reg_src = { .reg = S5P_CLKSRC_PERIL1, .shift = 20, .size = 4 },
1018
.reg_div = { .reg = S5P_CLKDIV_PERIL1, .shift = 16, .size = 4 },
1019
}, {
1020
.clk = {
1021
.name = "sclk_spi",
1022
.id = 2,
1023
.enable = exynos4_clksrc_mask_peril1_ctrl,
1024
.ctrlbit = (1 << 24),
1025
},
1026
.sources = &clkset_group,
1027
.reg_src = { .reg = S5P_CLKSRC_PERIL1, .shift = 24, .size = 4 },
1028
.reg_div = { .reg = S5P_CLKDIV_PERIL2, .shift = 0, .size = 4 },
1029
}, {
1030
.clk = {
1031
.name = "sclk_fimg2d",
1032
.id = -1,
1033
},
1034
.sources = &clkset_mout_g2d,
1035
.reg_src = { .reg = S5P_CLKSRC_IMAGE, .shift = 8, .size = 1 },
1036
.reg_div = { .reg = S5P_CLKDIV_IMAGE, .shift = 0, .size = 4 },
1037
}, {
1038
.clk = {
1039
.name = "sclk_mmc",
1040
.id = 0,
1041
.parent = &clk_dout_mmc0.clk,
1042
.enable = exynos4_clksrc_mask_fsys_ctrl,
1043
.ctrlbit = (1 << 0),
1044
},
1045
.reg_div = { .reg = S5P_CLKDIV_FSYS1, .shift = 8, .size = 8 },
1046
}, {
1047
.clk = {
1048
.name = "sclk_mmc",
1049
.id = 1,
1050
.parent = &clk_dout_mmc1.clk,
1051
.enable = exynos4_clksrc_mask_fsys_ctrl,
1052
.ctrlbit = (1 << 4),
1053
},
1054
.reg_div = { .reg = S5P_CLKDIV_FSYS1, .shift = 24, .size = 8 },
1055
}, {
1056
.clk = {
1057
.name = "sclk_mmc",
1058
.id = 2,
1059
.parent = &clk_dout_mmc2.clk,
1060
.enable = exynos4_clksrc_mask_fsys_ctrl,
1061
.ctrlbit = (1 << 8),
1062
},
1063
.reg_div = { .reg = S5P_CLKDIV_FSYS2, .shift = 8, .size = 8 },
1064
}, {
1065
.clk = {
1066
.name = "sclk_mmc",
1067
.id = 3,
1068
.parent = &clk_dout_mmc3.clk,
1069
.enable = exynos4_clksrc_mask_fsys_ctrl,
1070
.ctrlbit = (1 << 12),
1071
},
1072
.reg_div = { .reg = S5P_CLKDIV_FSYS2, .shift = 24, .size = 8 },
1073
}, {
1074
.clk = {
1075
.name = "sclk_mmc",
1076
.id = 4,
1077
.parent = &clk_dout_mmc4.clk,
1078
.enable = exynos4_clksrc_mask_fsys_ctrl,
1079
.ctrlbit = (1 << 16),
1080
},
1081
.reg_div = { .reg = S5P_CLKDIV_FSYS3, .shift = 8, .size = 8 },
1082
}
1083
};
1084
1085
/* Clock initialization code */
1086
static struct clksrc_clk *sysclks[] = {
1087
&clk_mout_apll,
1088
&clk_sclk_apll,
1089
&clk_mout_epll,
1090
&clk_mout_mpll,
1091
&clk_moutcore,
1092
&clk_coreclk,
1093
&clk_armclk,
1094
&clk_aclk_corem0,
1095
&clk_aclk_cores,
1096
&clk_aclk_corem1,
1097
&clk_periphclk,
1098
&clk_mout_corebus,
1099
&clk_sclk_dmc,
1100
&clk_aclk_cored,
1101
&clk_aclk_corep,
1102
&clk_aclk_acp,
1103
&clk_pclk_acp,
1104
&clk_vpllsrc,
1105
&clk_sclk_vpll,
1106
&clk_aclk_200,
1107
&clk_aclk_100,
1108
&clk_aclk_160,
1109
&clk_aclk_133,
1110
&clk_dout_mmc0,
1111
&clk_dout_mmc1,
1112
&clk_dout_mmc2,
1113
&clk_dout_mmc3,
1114
&clk_dout_mmc4,
1115
};
1116
1117
static int xtal_rate;
1118
1119
static unsigned long exynos4_fout_apll_get_rate(struct clk *clk)
1120
{
1121
return s5p_get_pll45xx(xtal_rate, __raw_readl(S5P_APLL_CON0), pll_4508);
1122
}
1123
1124
static struct clk_ops exynos4_fout_apll_ops = {
1125
.get_rate = exynos4_fout_apll_get_rate,
1126
};
1127
1128
void __init_or_cpufreq exynos4_setup_clocks(void)
1129
{
1130
struct clk *xtal_clk;
1131
unsigned long apll;
1132
unsigned long mpll;
1133
unsigned long epll;
1134
unsigned long vpll;
1135
unsigned long vpllsrc;
1136
unsigned long xtal;
1137
unsigned long armclk;
1138
unsigned long sclk_dmc;
1139
unsigned long aclk_200;
1140
unsigned long aclk_100;
1141
unsigned long aclk_160;
1142
unsigned long aclk_133;
1143
unsigned int ptr;
1144
1145
printk(KERN_DEBUG "%s: registering clocks\n", __func__);
1146
1147
xtal_clk = clk_get(NULL, "xtal");
1148
BUG_ON(IS_ERR(xtal_clk));
1149
1150
xtal = clk_get_rate(xtal_clk);
1151
1152
xtal_rate = xtal;
1153
1154
clk_put(xtal_clk);
1155
1156
printk(KERN_DEBUG "%s: xtal is %ld\n", __func__, xtal);
1157
1158
apll = s5p_get_pll45xx(xtal, __raw_readl(S5P_APLL_CON0), pll_4508);
1159
mpll = s5p_get_pll45xx(xtal, __raw_readl(S5P_MPLL_CON0), pll_4508);
1160
epll = s5p_get_pll46xx(xtal, __raw_readl(S5P_EPLL_CON0),
1161
__raw_readl(S5P_EPLL_CON1), pll_4600);
1162
1163
vpllsrc = clk_get_rate(&clk_vpllsrc.clk);
1164
vpll = s5p_get_pll46xx(vpllsrc, __raw_readl(S5P_VPLL_CON0),
1165
__raw_readl(S5P_VPLL_CON1), pll_4650);
1166
1167
clk_fout_apll.ops = &exynos4_fout_apll_ops;
1168
clk_fout_mpll.rate = mpll;
1169
clk_fout_epll.rate = epll;
1170
clk_fout_vpll.rate = vpll;
1171
1172
printk(KERN_INFO "EXYNOS4: PLL settings, A=%ld, M=%ld, E=%ld V=%ld",
1173
apll, mpll, epll, vpll);
1174
1175
armclk = clk_get_rate(&clk_armclk.clk);
1176
sclk_dmc = clk_get_rate(&clk_sclk_dmc.clk);
1177
1178
aclk_200 = clk_get_rate(&clk_aclk_200.clk);
1179
aclk_100 = clk_get_rate(&clk_aclk_100.clk);
1180
aclk_160 = clk_get_rate(&clk_aclk_160.clk);
1181
aclk_133 = clk_get_rate(&clk_aclk_133.clk);
1182
1183
printk(KERN_INFO "EXYNOS4: ARMCLK=%ld, DMC=%ld, ACLK200=%ld\n"
1184
"ACLK100=%ld, ACLK160=%ld, ACLK133=%ld\n",
1185
armclk, sclk_dmc, aclk_200,
1186
aclk_100, aclk_160, aclk_133);
1187
1188
clk_f.rate = armclk;
1189
clk_h.rate = sclk_dmc;
1190
clk_p.rate = aclk_100;
1191
1192
for (ptr = 0; ptr < ARRAY_SIZE(clksrcs); ptr++)
1193
s3c_set_clksrc(&clksrcs[ptr], true);
1194
}
1195
1196
static struct clk *clks[] __initdata = {
1197
/* Nothing here yet */
1198
};
1199
1200
void __init exynos4_register_clocks(void)
1201
{
1202
int ptr;
1203
1204
s3c24xx_register_clocks(clks, ARRAY_SIZE(clks));
1205
1206
for (ptr = 0; ptr < ARRAY_SIZE(sysclks); ptr++)
1207
s3c_register_clksrc(sysclks[ptr], 1);
1208
1209
s3c_register_clksrc(clksrcs, ARRAY_SIZE(clksrcs));
1210
s3c_register_clocks(init_clocks, ARRAY_SIZE(init_clocks));
1211
1212
s3c_register_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off));
1213
s3c_disable_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off));
1214
1215
s3c_pwmclk_init();
1216
}
1217
1218