clock.c revision 0cfb26e1fb9d7afe9c79a40a257808eafb2aff34
1/* linux/arch/arm/mach-s5pc100/clock.c 2 * 3 * Copyright (c) 2010 Samsung Electronics Co., Ltd. 4 * http://www.samsung.com/ 5 * 6 * S5PC100 - 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/init.h> 14#include <linux/module.h> 15#include <linux/kernel.h> 16#include <linux/list.h> 17#include <linux/err.h> 18#include <linux/clk.h> 19#include <linux/io.h> 20 21#include <mach/map.h> 22 23#include <plat/cpu-freq.h> 24#include <mach/regs-clock.h> 25#include <plat/clock.h> 26#include <plat/cpu.h> 27#include <plat/pll.h> 28#include <plat/s5p-clock.h> 29#include <plat/clock-clksrc.h> 30#include <plat/s5pc100.h> 31 32static struct clk s5p_clk_otgphy = { 33 .name = "otg_phy", 34}; 35 36static struct clk dummy_apb_pclk = { 37 .name = "apb_pclk", 38 .id = -1, 39}; 40 41static struct clk *clk_src_mout_href_list[] = { 42 [0] = &s5p_clk_27m, 43 [1] = &clk_fin_hpll, 44}; 45 46static struct clksrc_sources clk_src_mout_href = { 47 .sources = clk_src_mout_href_list, 48 .nr_sources = ARRAY_SIZE(clk_src_mout_href_list), 49}; 50 51static struct clksrc_clk clk_mout_href = { 52 .clk = { 53 .name = "mout_href", 54 }, 55 .sources = &clk_src_mout_href, 56 .reg_src = { .reg = S5P_CLK_SRC0, .shift = 20, .size = 1 }, 57}; 58 59static struct clk *clk_src_mout_48m_list[] = { 60 [0] = &clk_xusbxti, 61 [1] = &s5p_clk_otgphy, 62}; 63 64static struct clksrc_sources clk_src_mout_48m = { 65 .sources = clk_src_mout_48m_list, 66 .nr_sources = ARRAY_SIZE(clk_src_mout_48m_list), 67}; 68 69static struct clksrc_clk clk_mout_48m = { 70 .clk = { 71 .name = "mout_48m", 72 }, 73 .sources = &clk_src_mout_48m, 74 .reg_src = { .reg = S5P_CLK_SRC1, .shift = 24, .size = 1 }, 75}; 76 77static struct clksrc_clk clk_mout_mpll = { 78 .clk = { 79 .name = "mout_mpll", 80 }, 81 .sources = &clk_src_mpll, 82 .reg_src = { .reg = S5P_CLK_SRC0, .shift = 4, .size = 1 }, 83}; 84 85 86static struct clksrc_clk clk_mout_apll = { 87 .clk = { 88 .name = "mout_apll", 89 }, 90 .sources = &clk_src_apll, 91 .reg_src = { .reg = S5P_CLK_SRC0, .shift = 0, .size = 1 }, 92}; 93 94static struct clksrc_clk clk_mout_epll = { 95 .clk = { 96 .name = "mout_epll", 97 }, 98 .sources = &clk_src_epll, 99 .reg_src = { .reg = S5P_CLK_SRC0, .shift = 8, .size = 1 }, 100}; 101 102static struct clk *clk_src_mout_hpll_list[] = { 103 [0] = &s5p_clk_27m, 104}; 105 106static struct clksrc_sources clk_src_mout_hpll = { 107 .sources = clk_src_mout_hpll_list, 108 .nr_sources = ARRAY_SIZE(clk_src_mout_hpll_list), 109}; 110 111static struct clksrc_clk clk_mout_hpll = { 112 .clk = { 113 .name = "mout_hpll", 114 }, 115 .sources = &clk_src_mout_hpll, 116 .reg_src = { .reg = S5P_CLK_SRC0, .shift = 12, .size = 1 }, 117}; 118 119static struct clksrc_clk clk_div_apll = { 120 .clk = { 121 .name = "div_apll", 122 .parent = &clk_mout_apll.clk, 123 }, 124 .reg_div = { .reg = S5P_CLK_DIV0, .shift = 0, .size = 1 }, 125}; 126 127static struct clksrc_clk clk_div_arm = { 128 .clk = { 129 .name = "div_arm", 130 .parent = &clk_div_apll.clk, 131 }, 132 .reg_div = { .reg = S5P_CLK_DIV0, .shift = 4, .size = 3 }, 133}; 134 135static struct clksrc_clk clk_div_d0_bus = { 136 .clk = { 137 .name = "div_d0_bus", 138 .parent = &clk_div_arm.clk, 139 }, 140 .reg_div = { .reg = S5P_CLK_DIV0, .shift = 8, .size = 3 }, 141}; 142 143static struct clksrc_clk clk_div_pclkd0 = { 144 .clk = { 145 .name = "div_pclkd0", 146 .parent = &clk_div_d0_bus.clk, 147 }, 148 .reg_div = { .reg = S5P_CLK_DIV0, .shift = 12, .size = 3 }, 149}; 150 151static struct clksrc_clk clk_div_secss = { 152 .clk = { 153 .name = "div_secss", 154 .parent = &clk_div_d0_bus.clk, 155 }, 156 .reg_div = { .reg = S5P_CLK_DIV0, .shift = 16, .size = 3 }, 157}; 158 159static struct clksrc_clk clk_div_apll2 = { 160 .clk = { 161 .name = "div_apll2", 162 .parent = &clk_mout_apll.clk, 163 }, 164 .reg_div = { .reg = S5P_CLK_DIV1, .shift = 0, .size = 3 }, 165}; 166 167static struct clk *clk_src_mout_am_list[] = { 168 [0] = &clk_mout_mpll.clk, 169 [1] = &clk_div_apll2.clk, 170}; 171 172struct clksrc_sources clk_src_mout_am = { 173 .sources = clk_src_mout_am_list, 174 .nr_sources = ARRAY_SIZE(clk_src_mout_am_list), 175}; 176 177static struct clksrc_clk clk_mout_am = { 178 .clk = { 179 .name = "mout_am", 180 }, 181 .sources = &clk_src_mout_am, 182 .reg_src = { .reg = S5P_CLK_SRC0, .shift = 16, .size = 1 }, 183}; 184 185static struct clksrc_clk clk_div_d1_bus = { 186 .clk = { 187 .name = "div_d1_bus", 188 .parent = &clk_mout_am.clk, 189 }, 190 .reg_div = { .reg = S5P_CLK_DIV1, .shift = 12, .size = 3 }, 191}; 192 193static struct clksrc_clk clk_div_mpll2 = { 194 .clk = { 195 .name = "div_mpll2", 196 .parent = &clk_mout_am.clk, 197 }, 198 .reg_div = { .reg = S5P_CLK_DIV1, .shift = 8, .size = 1 }, 199}; 200 201static struct clksrc_clk clk_div_mpll = { 202 .clk = { 203 .name = "div_mpll", 204 .parent = &clk_mout_am.clk, 205 }, 206 .reg_div = { .reg = S5P_CLK_DIV1, .shift = 4, .size = 2 }, 207}; 208 209static struct clk *clk_src_mout_onenand_list[] = { 210 [0] = &clk_div_d0_bus.clk, 211 [1] = &clk_div_d1_bus.clk, 212}; 213 214struct clksrc_sources clk_src_mout_onenand = { 215 .sources = clk_src_mout_onenand_list, 216 .nr_sources = ARRAY_SIZE(clk_src_mout_onenand_list), 217}; 218 219static struct clksrc_clk clk_mout_onenand = { 220 .clk = { 221 .name = "mout_onenand", 222 }, 223 .sources = &clk_src_mout_onenand, 224 .reg_src = { .reg = S5P_CLK_SRC0, .shift = 24, .size = 1 }, 225}; 226 227static struct clksrc_clk clk_div_onenand = { 228 .clk = { 229 .name = "div_onenand", 230 .parent = &clk_mout_onenand.clk, 231 }, 232 .reg_div = { .reg = S5P_CLK_DIV1, .shift = 20, .size = 2 }, 233}; 234 235static struct clksrc_clk clk_div_pclkd1 = { 236 .clk = { 237 .name = "div_pclkd1", 238 .parent = &clk_div_d1_bus.clk, 239 }, 240 .reg_div = { .reg = S5P_CLK_DIV1, .shift = 16, .size = 3 }, 241}; 242 243static struct clksrc_clk clk_div_cam = { 244 .clk = { 245 .name = "div_cam", 246 .parent = &clk_div_mpll2.clk, 247 }, 248 .reg_div = { .reg = S5P_CLK_DIV1, .shift = 24, .size = 5 }, 249}; 250 251static struct clksrc_clk clk_div_hdmi = { 252 .clk = { 253 .name = "div_hdmi", 254 .parent = &clk_mout_hpll.clk, 255 }, 256 .reg_div = { .reg = S5P_CLK_DIV3, .shift = 28, .size = 4 }, 257}; 258 259static u32 epll_div[][4] = { 260 { 32750000, 131, 3, 4 }, 261 { 32768000, 131, 3, 4 }, 262 { 36000000, 72, 3, 3 }, 263 { 45000000, 90, 3, 3 }, 264 { 45158000, 90, 3, 3 }, 265 { 45158400, 90, 3, 3 }, 266 { 48000000, 96, 3, 3 }, 267 { 49125000, 131, 4, 3 }, 268 { 49152000, 131, 4, 3 }, 269 { 60000000, 120, 3, 3 }, 270 { 67737600, 226, 5, 3 }, 271 { 67738000, 226, 5, 3 }, 272 { 73800000, 246, 5, 3 }, 273 { 73728000, 246, 5, 3 }, 274 { 72000000, 144, 3, 3 }, 275 { 84000000, 168, 3, 3 }, 276 { 96000000, 96, 3, 2 }, 277 { 144000000, 144, 3, 2 }, 278 { 192000000, 96, 3, 1 } 279}; 280 281static int s5pc100_epll_set_rate(struct clk *clk, unsigned long rate) 282{ 283 unsigned int epll_con; 284 unsigned int i; 285 286 if (clk->rate == rate) /* Return if nothing changed */ 287 return 0; 288 289 epll_con = __raw_readl(S5P_EPLL_CON); 290 291 epll_con &= ~(PLL65XX_MDIV_MASK | PLL65XX_PDIV_MASK | PLL65XX_SDIV_MASK); 292 293 for (i = 0; i < ARRAY_SIZE(epll_div); i++) { 294 if (epll_div[i][0] == rate) { 295 epll_con |= (epll_div[i][1] << PLL65XX_MDIV_SHIFT) | 296 (epll_div[i][2] << PLL65XX_PDIV_SHIFT) | 297 (epll_div[i][3] << PLL65XX_SDIV_SHIFT); 298 break; 299 } 300 } 301 302 if (i == ARRAY_SIZE(epll_div)) { 303 printk(KERN_ERR "%s: Invalid Clock EPLL Frequency\n", __func__); 304 return -EINVAL; 305 } 306 307 __raw_writel(epll_con, S5P_EPLL_CON); 308 309 printk(KERN_WARNING "EPLL Rate changes from %lu to %lu\n", 310 clk->rate, rate); 311 312 clk->rate = rate; 313 314 return 0; 315} 316 317static struct clk_ops s5pc100_epll_ops = { 318 .get_rate = s5p_epll_get_rate, 319 .set_rate = s5pc100_epll_set_rate, 320}; 321 322static int s5pc100_d0_0_ctrl(struct clk *clk, int enable) 323{ 324 return s5p_gatectrl(S5P_CLKGATE_D00, clk, enable); 325} 326 327static int s5pc100_d0_1_ctrl(struct clk *clk, int enable) 328{ 329 return s5p_gatectrl(S5P_CLKGATE_D01, clk, enable); 330} 331 332static int s5pc100_d0_2_ctrl(struct clk *clk, int enable) 333{ 334 return s5p_gatectrl(S5P_CLKGATE_D02, clk, enable); 335} 336 337static int s5pc100_d1_0_ctrl(struct clk *clk, int enable) 338{ 339 return s5p_gatectrl(S5P_CLKGATE_D10, clk, enable); 340} 341 342static int s5pc100_d1_1_ctrl(struct clk *clk, int enable) 343{ 344 return s5p_gatectrl(S5P_CLKGATE_D11, clk, enable); 345} 346 347static int s5pc100_d1_2_ctrl(struct clk *clk, int enable) 348{ 349 return s5p_gatectrl(S5P_CLKGATE_D12, clk, enable); 350} 351 352static int s5pc100_d1_3_ctrl(struct clk *clk, int enable) 353{ 354 return s5p_gatectrl(S5P_CLKGATE_D13, clk, enable); 355} 356 357static int s5pc100_d1_4_ctrl(struct clk *clk, int enable) 358{ 359 return s5p_gatectrl(S5P_CLKGATE_D14, clk, enable); 360} 361 362static int s5pc100_d1_5_ctrl(struct clk *clk, int enable) 363{ 364 return s5p_gatectrl(S5P_CLKGATE_D15, clk, enable); 365} 366 367static int s5pc100_sclk0_ctrl(struct clk *clk, int enable) 368{ 369 return s5p_gatectrl(S5P_CLKGATE_SCLK0, clk, enable); 370} 371 372static int s5pc100_sclk1_ctrl(struct clk *clk, int enable) 373{ 374 return s5p_gatectrl(S5P_CLKGATE_SCLK1, clk, enable); 375} 376 377/* 378 * The following clocks will be disabled during clock initialization. It is 379 * recommended to keep the following clocks disabled until the driver requests 380 * for enabling the clock. 381 */ 382static struct clk init_clocks_off[] = { 383 { 384 .name = "cssys", 385 .parent = &clk_div_d0_bus.clk, 386 .enable = s5pc100_d0_0_ctrl, 387 .ctrlbit = (1 << 6), 388 }, { 389 .name = "secss", 390 .parent = &clk_div_d0_bus.clk, 391 .enable = s5pc100_d0_0_ctrl, 392 .ctrlbit = (1 << 5), 393 }, { 394 .name = "g2d", 395 .parent = &clk_div_d0_bus.clk, 396 .enable = s5pc100_d0_0_ctrl, 397 .ctrlbit = (1 << 4), 398 }, { 399 .name = "mdma", 400 .parent = &clk_div_d0_bus.clk, 401 .enable = s5pc100_d0_0_ctrl, 402 .ctrlbit = (1 << 3), 403 }, { 404 .name = "cfcon", 405 .parent = &clk_div_d0_bus.clk, 406 .enable = s5pc100_d0_0_ctrl, 407 .ctrlbit = (1 << 2), 408 }, { 409 .name = "nfcon", 410 .parent = &clk_div_d0_bus.clk, 411 .enable = s5pc100_d0_1_ctrl, 412 .ctrlbit = (1 << 3), 413 }, { 414 .name = "onenandc", 415 .parent = &clk_div_d0_bus.clk, 416 .enable = s5pc100_d0_1_ctrl, 417 .ctrlbit = (1 << 2), 418 }, { 419 .name = "sdm", 420 .parent = &clk_div_d0_bus.clk, 421 .enable = s5pc100_d0_2_ctrl, 422 .ctrlbit = (1 << 2), 423 }, { 424 .name = "seckey", 425 .parent = &clk_div_d0_bus.clk, 426 .enable = s5pc100_d0_2_ctrl, 427 .ctrlbit = (1 << 1), 428 }, { 429 .name = "hsmmc", 430 .devname = "s3c-sdhci.2", 431 .parent = &clk_div_d1_bus.clk, 432 .enable = s5pc100_d1_0_ctrl, 433 .ctrlbit = (1 << 7), 434 }, { 435 .name = "hsmmc", 436 .devname = "s3c-sdhci.1", 437 .parent = &clk_div_d1_bus.clk, 438 .enable = s5pc100_d1_0_ctrl, 439 .ctrlbit = (1 << 6), 440 }, { 441 .name = "hsmmc", 442 .devname = "s3c-sdhci.0", 443 .parent = &clk_div_d1_bus.clk, 444 .enable = s5pc100_d1_0_ctrl, 445 .ctrlbit = (1 << 5), 446 }, { 447 .name = "modemif", 448 .parent = &clk_div_d1_bus.clk, 449 .enable = s5pc100_d1_0_ctrl, 450 .ctrlbit = (1 << 4), 451 }, { 452 .name = "otg", 453 .parent = &clk_div_d1_bus.clk, 454 .enable = s5pc100_d1_0_ctrl, 455 .ctrlbit = (1 << 3), 456 }, { 457 .name = "usbhost", 458 .parent = &clk_div_d1_bus.clk, 459 .enable = s5pc100_d1_0_ctrl, 460 .ctrlbit = (1 << 2), 461 }, { 462 .name = "dma", 463 .devname = "dma-pl330.1", 464 .parent = &clk_div_d1_bus.clk, 465 .enable = s5pc100_d1_0_ctrl, 466 .ctrlbit = (1 << 1), 467 }, { 468 .name = "dma", 469 .devname = "dma-pl330.0", 470 .parent = &clk_div_d1_bus.clk, 471 .enable = s5pc100_d1_0_ctrl, 472 .ctrlbit = (1 << 0), 473 }, { 474 .name = "lcd", 475 .parent = &clk_div_d1_bus.clk, 476 .enable = s5pc100_d1_1_ctrl, 477 .ctrlbit = (1 << 0), 478 }, { 479 .name = "rotator", 480 .parent = &clk_div_d1_bus.clk, 481 .enable = s5pc100_d1_1_ctrl, 482 .ctrlbit = (1 << 1), 483 }, { 484 .name = "fimc", 485 .devname = "s5p-fimc.0", 486 .parent = &clk_div_d1_bus.clk, 487 .enable = s5pc100_d1_1_ctrl, 488 .ctrlbit = (1 << 2), 489 }, { 490 .name = "fimc", 491 .devname = "s5p-fimc.1", 492 .parent = &clk_div_d1_bus.clk, 493 .enable = s5pc100_d1_1_ctrl, 494 .ctrlbit = (1 << 3), 495 }, { 496 .name = "fimc", 497 .devname = "s5p-fimc.2", 498 .enable = s5pc100_d1_1_ctrl, 499 .ctrlbit = (1 << 4), 500 }, { 501 .name = "jpeg", 502 .parent = &clk_div_d1_bus.clk, 503 .enable = s5pc100_d1_1_ctrl, 504 .ctrlbit = (1 << 5), 505 }, { 506 .name = "mipi-dsim", 507 .parent = &clk_div_d1_bus.clk, 508 .enable = s5pc100_d1_1_ctrl, 509 .ctrlbit = (1 << 6), 510 }, { 511 .name = "mipi-csis", 512 .parent = &clk_div_d1_bus.clk, 513 .enable = s5pc100_d1_1_ctrl, 514 .ctrlbit = (1 << 7), 515 }, { 516 .name = "g3d", 517 .parent = &clk_div_d1_bus.clk, 518 .enable = s5pc100_d1_0_ctrl, 519 .ctrlbit = (1 << 8), 520 }, { 521 .name = "tv", 522 .parent = &clk_div_d1_bus.clk, 523 .enable = s5pc100_d1_2_ctrl, 524 .ctrlbit = (1 << 0), 525 }, { 526 .name = "vp", 527 .parent = &clk_div_d1_bus.clk, 528 .enable = s5pc100_d1_2_ctrl, 529 .ctrlbit = (1 << 1), 530 }, { 531 .name = "mixer", 532 .parent = &clk_div_d1_bus.clk, 533 .enable = s5pc100_d1_2_ctrl, 534 .ctrlbit = (1 << 2), 535 }, { 536 .name = "hdmi", 537 .parent = &clk_div_d1_bus.clk, 538 .enable = s5pc100_d1_2_ctrl, 539 .ctrlbit = (1 << 3), 540 }, { 541 .name = "mfc", 542 .parent = &clk_div_d1_bus.clk, 543 .enable = s5pc100_d1_2_ctrl, 544 .ctrlbit = (1 << 4), 545 }, { 546 .name = "apc", 547 .parent = &clk_div_d1_bus.clk, 548 .enable = s5pc100_d1_3_ctrl, 549 .ctrlbit = (1 << 2), 550 }, { 551 .name = "iec", 552 .parent = &clk_div_d1_bus.clk, 553 .enable = s5pc100_d1_3_ctrl, 554 .ctrlbit = (1 << 3), 555 }, { 556 .name = "systimer", 557 .parent = &clk_div_d1_bus.clk, 558 .enable = s5pc100_d1_3_ctrl, 559 .ctrlbit = (1 << 7), 560 }, { 561 .name = "watchdog", 562 .parent = &clk_div_d1_bus.clk, 563 .enable = s5pc100_d1_3_ctrl, 564 .ctrlbit = (1 << 8), 565 }, { 566 .name = "rtc", 567 .parent = &clk_div_d1_bus.clk, 568 .enable = s5pc100_d1_3_ctrl, 569 .ctrlbit = (1 << 9), 570 }, { 571 .name = "i2c", 572 .devname = "s3c2440-i2c.0", 573 .parent = &clk_div_d1_bus.clk, 574 .enable = s5pc100_d1_4_ctrl, 575 .ctrlbit = (1 << 4), 576 }, { 577 .name = "i2c", 578 .devname = "s3c2440-i2c.1", 579 .parent = &clk_div_d1_bus.clk, 580 .enable = s5pc100_d1_4_ctrl, 581 .ctrlbit = (1 << 5), 582 }, { 583 .name = "spi", 584 .devname = "s3c64xx-spi.0", 585 .parent = &clk_div_d1_bus.clk, 586 .enable = s5pc100_d1_4_ctrl, 587 .ctrlbit = (1 << 6), 588 }, { 589 .name = "spi", 590 .devname = "s3c64xx-spi.1", 591 .parent = &clk_div_d1_bus.clk, 592 .enable = s5pc100_d1_4_ctrl, 593 .ctrlbit = (1 << 7), 594 }, { 595 .name = "spi", 596 .devname = "s3c64xx-spi.2", 597 .parent = &clk_div_d1_bus.clk, 598 .enable = s5pc100_d1_4_ctrl, 599 .ctrlbit = (1 << 8), 600 }, { 601 .name = "irda", 602 .parent = &clk_div_d1_bus.clk, 603 .enable = s5pc100_d1_4_ctrl, 604 .ctrlbit = (1 << 9), 605 }, { 606 .name = "ccan", 607 .parent = &clk_div_d1_bus.clk, 608 .enable = s5pc100_d1_4_ctrl, 609 .ctrlbit = (1 << 10), 610 }, { 611 .name = "ccan", 612 .parent = &clk_div_d1_bus.clk, 613 .enable = s5pc100_d1_4_ctrl, 614 .ctrlbit = (1 << 11), 615 }, { 616 .name = "hsitx", 617 .parent = &clk_div_d1_bus.clk, 618 .enable = s5pc100_d1_4_ctrl, 619 .ctrlbit = (1 << 12), 620 }, { 621 .name = "hsirx", 622 .parent = &clk_div_d1_bus.clk, 623 .enable = s5pc100_d1_4_ctrl, 624 .ctrlbit = (1 << 13), 625 }, { 626 .name = "iis", 627 .devname = "samsung-i2s.0", 628 .parent = &clk_div_pclkd1.clk, 629 .enable = s5pc100_d1_5_ctrl, 630 .ctrlbit = (1 << 0), 631 }, { 632 .name = "iis", 633 .devname = "samsung-i2s.1", 634 .parent = &clk_div_pclkd1.clk, 635 .enable = s5pc100_d1_5_ctrl, 636 .ctrlbit = (1 << 1), 637 }, { 638 .name = "iis", 639 .devname = "samsung-i2s.2", 640 .parent = &clk_div_pclkd1.clk, 641 .enable = s5pc100_d1_5_ctrl, 642 .ctrlbit = (1 << 2), 643 }, { 644 .name = "ac97", 645 .parent = &clk_div_pclkd1.clk, 646 .enable = s5pc100_d1_5_ctrl, 647 .ctrlbit = (1 << 3), 648 }, { 649 .name = "pcm", 650 .devname = "samsung-pcm.0", 651 .parent = &clk_div_pclkd1.clk, 652 .enable = s5pc100_d1_5_ctrl, 653 .ctrlbit = (1 << 4), 654 }, { 655 .name = "pcm", 656 .devname = "samsung-pcm.1", 657 .parent = &clk_div_pclkd1.clk, 658 .enable = s5pc100_d1_5_ctrl, 659 .ctrlbit = (1 << 5), 660 }, { 661 .name = "spdif", 662 .parent = &clk_div_pclkd1.clk, 663 .enable = s5pc100_d1_5_ctrl, 664 .ctrlbit = (1 << 6), 665 }, { 666 .name = "adc", 667 .parent = &clk_div_pclkd1.clk, 668 .enable = s5pc100_d1_5_ctrl, 669 .ctrlbit = (1 << 7), 670 }, { 671 .name = "keypad", 672 .parent = &clk_div_pclkd1.clk, 673 .enable = s5pc100_d1_5_ctrl, 674 .ctrlbit = (1 << 8), 675 }, { 676 .name = "spi_48m", 677 .devname = "s3c64xx-spi.0", 678 .parent = &clk_mout_48m.clk, 679 .enable = s5pc100_sclk0_ctrl, 680 .ctrlbit = (1 << 7), 681 }, { 682 .name = "spi_48m", 683 .devname = "s3c64xx-spi.1", 684 .parent = &clk_mout_48m.clk, 685 .enable = s5pc100_sclk0_ctrl, 686 .ctrlbit = (1 << 8), 687 }, { 688 .name = "spi_48m", 689 .devname = "s3c64xx-spi.2", 690 .parent = &clk_mout_48m.clk, 691 .enable = s5pc100_sclk0_ctrl, 692 .ctrlbit = (1 << 9), 693 }, { 694 .name = "mmc_48m", 695 .devname = "s3c-sdhci.0", 696 .parent = &clk_mout_48m.clk, 697 .enable = s5pc100_sclk0_ctrl, 698 .ctrlbit = (1 << 15), 699 }, { 700 .name = "mmc_48m", 701 .devname = "s3c-sdhci.1", 702 .parent = &clk_mout_48m.clk, 703 .enable = s5pc100_sclk0_ctrl, 704 .ctrlbit = (1 << 16), 705 }, { 706 .name = "mmc_48m", 707 .devname = "s3c-sdhci.2", 708 .parent = &clk_mout_48m.clk, 709 .enable = s5pc100_sclk0_ctrl, 710 .ctrlbit = (1 << 17), 711 }, 712}; 713 714static struct clk clk_vclk54m = { 715 .name = "vclk_54m", 716 .rate = 54000000, 717}; 718 719static struct clk clk_i2scdclk0 = { 720 .name = "i2s_cdclk0", 721}; 722 723static struct clk clk_i2scdclk1 = { 724 .name = "i2s_cdclk1", 725}; 726 727static struct clk clk_i2scdclk2 = { 728 .name = "i2s_cdclk2", 729}; 730 731static struct clk clk_pcmcdclk0 = { 732 .name = "pcm_cdclk0", 733}; 734 735static struct clk clk_pcmcdclk1 = { 736 .name = "pcm_cdclk1", 737}; 738 739static struct clk *clk_src_group1_list[] = { 740 [0] = &clk_mout_epll.clk, 741 [1] = &clk_div_mpll2.clk, 742 [2] = &clk_fin_epll, 743 [3] = &clk_mout_hpll.clk, 744}; 745 746struct clksrc_sources clk_src_group1 = { 747 .sources = clk_src_group1_list, 748 .nr_sources = ARRAY_SIZE(clk_src_group1_list), 749}; 750 751static struct clk *clk_src_group2_list[] = { 752 [0] = &clk_mout_epll.clk, 753 [1] = &clk_div_mpll.clk, 754}; 755 756struct clksrc_sources clk_src_group2 = { 757 .sources = clk_src_group2_list, 758 .nr_sources = ARRAY_SIZE(clk_src_group2_list), 759}; 760 761static struct clk *clk_src_group3_list[] = { 762 [0] = &clk_mout_epll.clk, 763 [1] = &clk_div_mpll.clk, 764 [2] = &clk_fin_epll, 765 [3] = &clk_i2scdclk0, 766 [4] = &clk_pcmcdclk0, 767 [5] = &clk_mout_hpll.clk, 768}; 769 770struct clksrc_sources clk_src_group3 = { 771 .sources = clk_src_group3_list, 772 .nr_sources = ARRAY_SIZE(clk_src_group3_list), 773}; 774 775static struct clksrc_clk clk_sclk_audio0 = { 776 .clk = { 777 .name = "sclk_audio", 778 .devname = "samsung-pcm.0", 779 .ctrlbit = (1 << 8), 780 .enable = s5pc100_sclk1_ctrl, 781 }, 782 .sources = &clk_src_group3, 783 .reg_src = { .reg = S5P_CLK_SRC3, .shift = 12, .size = 3 }, 784 .reg_div = { .reg = S5P_CLK_DIV4, .shift = 12, .size = 4 }, 785}; 786 787static struct clk *clk_src_group4_list[] = { 788 [0] = &clk_mout_epll.clk, 789 [1] = &clk_div_mpll.clk, 790 [2] = &clk_fin_epll, 791 [3] = &clk_i2scdclk1, 792 [4] = &clk_pcmcdclk1, 793 [5] = &clk_mout_hpll.clk, 794}; 795 796struct clksrc_sources clk_src_group4 = { 797 .sources = clk_src_group4_list, 798 .nr_sources = ARRAY_SIZE(clk_src_group4_list), 799}; 800 801static struct clksrc_clk clk_sclk_audio1 = { 802 .clk = { 803 .name = "sclk_audio", 804 .devname = "samsung-pcm.1", 805 .ctrlbit = (1 << 9), 806 .enable = s5pc100_sclk1_ctrl, 807 }, 808 .sources = &clk_src_group4, 809 .reg_src = { .reg = S5P_CLK_SRC3, .shift = 16, .size = 3 }, 810 .reg_div = { .reg = S5P_CLK_DIV4, .shift = 16, .size = 4 }, 811}; 812 813static struct clk *clk_src_group5_list[] = { 814 [0] = &clk_mout_epll.clk, 815 [1] = &clk_div_mpll.clk, 816 [2] = &clk_fin_epll, 817 [3] = &clk_i2scdclk2, 818 [4] = &clk_mout_hpll.clk, 819}; 820 821struct clksrc_sources clk_src_group5 = { 822 .sources = clk_src_group5_list, 823 .nr_sources = ARRAY_SIZE(clk_src_group5_list), 824}; 825 826static struct clksrc_clk clk_sclk_audio2 = { 827 .clk = { 828 .name = "sclk_audio", 829 .devname = "samsung-pcm.2", 830 .ctrlbit = (1 << 10), 831 .enable = s5pc100_sclk1_ctrl, 832 }, 833 .sources = &clk_src_group5, 834 .reg_src = { .reg = S5P_CLK_SRC3, .shift = 20, .size = 3 }, 835 .reg_div = { .reg = S5P_CLK_DIV4, .shift = 20, .size = 4 }, 836}; 837 838static struct clk *clk_src_group6_list[] = { 839 [0] = &s5p_clk_27m, 840 [1] = &clk_vclk54m, 841 [2] = &clk_div_hdmi.clk, 842}; 843 844struct clksrc_sources clk_src_group6 = { 845 .sources = clk_src_group6_list, 846 .nr_sources = ARRAY_SIZE(clk_src_group6_list), 847}; 848 849static struct clk *clk_src_group7_list[] = { 850 [0] = &clk_mout_epll.clk, 851 [1] = &clk_div_mpll.clk, 852 [2] = &clk_mout_hpll.clk, 853 [3] = &clk_vclk54m, 854}; 855 856struct clksrc_sources clk_src_group7 = { 857 .sources = clk_src_group7_list, 858 .nr_sources = ARRAY_SIZE(clk_src_group7_list), 859}; 860 861static struct clk *clk_src_mmc0_list[] = { 862 [0] = &clk_mout_epll.clk, 863 [1] = &clk_div_mpll.clk, 864 [2] = &clk_fin_epll, 865}; 866 867struct clksrc_sources clk_src_mmc0 = { 868 .sources = clk_src_mmc0_list, 869 .nr_sources = ARRAY_SIZE(clk_src_mmc0_list), 870}; 871 872static struct clk *clk_src_mmc12_list[] = { 873 [0] = &clk_mout_epll.clk, 874 [1] = &clk_div_mpll.clk, 875 [2] = &clk_fin_epll, 876 [3] = &clk_mout_hpll.clk, 877}; 878 879struct clksrc_sources clk_src_mmc12 = { 880 .sources = clk_src_mmc12_list, 881 .nr_sources = ARRAY_SIZE(clk_src_mmc12_list), 882}; 883 884static struct clk *clk_src_irda_usb_list[] = { 885 [0] = &clk_mout_epll.clk, 886 [1] = &clk_div_mpll.clk, 887 [2] = &clk_fin_epll, 888 [3] = &clk_mout_hpll.clk, 889}; 890 891struct clksrc_sources clk_src_irda_usb = { 892 .sources = clk_src_irda_usb_list, 893 .nr_sources = ARRAY_SIZE(clk_src_irda_usb_list), 894}; 895 896static struct clk *clk_src_pwi_list[] = { 897 [0] = &clk_fin_epll, 898 [1] = &clk_mout_epll.clk, 899 [2] = &clk_div_mpll.clk, 900}; 901 902struct clksrc_sources clk_src_pwi = { 903 .sources = clk_src_pwi_list, 904 .nr_sources = ARRAY_SIZE(clk_src_pwi_list), 905}; 906 907static struct clk *clk_sclk_spdif_list[] = { 908 [0] = &clk_sclk_audio0.clk, 909 [1] = &clk_sclk_audio1.clk, 910 [2] = &clk_sclk_audio2.clk, 911}; 912 913struct clksrc_sources clk_src_sclk_spdif = { 914 .sources = clk_sclk_spdif_list, 915 .nr_sources = ARRAY_SIZE(clk_sclk_spdif_list), 916}; 917 918static struct clksrc_clk clk_sclk_spdif = { 919 .clk = { 920 .name = "sclk_spdif", 921 .ctrlbit = (1 << 11), 922 .enable = s5pc100_sclk1_ctrl, 923 .ops = &s5p_sclk_spdif_ops, 924 }, 925 .sources = &clk_src_sclk_spdif, 926 .reg_src = { .reg = S5P_CLK_SRC3, .shift = 24, .size = 2 }, 927}; 928 929static struct clksrc_clk clksrcs[] = { 930 { 931 .clk = { 932 .name = "sclk_spi", 933 .devname = "s3c64xx-spi.0", 934 .ctrlbit = (1 << 4), 935 .enable = s5pc100_sclk0_ctrl, 936 937 }, 938 .sources = &clk_src_group1, 939 .reg_src = { .reg = S5P_CLK_SRC1, .shift = 4, .size = 2 }, 940 .reg_div = { .reg = S5P_CLK_DIV2, .shift = 4, .size = 4 }, 941 }, { 942 .clk = { 943 .name = "sclk_spi", 944 .devname = "s3c64xx-spi.1", 945 .ctrlbit = (1 << 5), 946 .enable = s5pc100_sclk0_ctrl, 947 948 }, 949 .sources = &clk_src_group1, 950 .reg_src = { .reg = S5P_CLK_SRC1, .shift = 8, .size = 2 }, 951 .reg_div = { .reg = S5P_CLK_DIV2, .shift = 8, .size = 4 }, 952 }, { 953 .clk = { 954 .name = "sclk_spi", 955 .devname = "s3c64xx-spi.2", 956 .ctrlbit = (1 << 6), 957 .enable = s5pc100_sclk0_ctrl, 958 959 }, 960 .sources = &clk_src_group1, 961 .reg_src = { .reg = S5P_CLK_SRC1, .shift = 12, .size = 2 }, 962 .reg_div = { .reg = S5P_CLK_DIV2, .shift = 12, .size = 4 }, 963 }, { 964 .clk = { 965 .name = "sclk_mixer", 966 .ctrlbit = (1 << 6), 967 .enable = s5pc100_sclk0_ctrl, 968 969 }, 970 .sources = &clk_src_group6, 971 .reg_src = { .reg = S5P_CLK_SRC2, .shift = 28, .size = 2 }, 972 }, { 973 .clk = { 974 .name = "sclk_lcd", 975 .ctrlbit = (1 << 0), 976 .enable = s5pc100_sclk1_ctrl, 977 978 }, 979 .sources = &clk_src_group7, 980 .reg_src = { .reg = S5P_CLK_SRC2, .shift = 12, .size = 2 }, 981 .reg_div = { .reg = S5P_CLK_DIV3, .shift = 12, .size = 4 }, 982 }, { 983 .clk = { 984 .name = "sclk_fimc", 985 .devname = "s5p-fimc.0", 986 .ctrlbit = (1 << 1), 987 .enable = s5pc100_sclk1_ctrl, 988 989 }, 990 .sources = &clk_src_group7, 991 .reg_src = { .reg = S5P_CLK_SRC2, .shift = 16, .size = 2 }, 992 .reg_div = { .reg = S5P_CLK_DIV3, .shift = 16, .size = 4 }, 993 }, { 994 .clk = { 995 .name = "sclk_fimc", 996 .devname = "s5p-fimc.1", 997 .ctrlbit = (1 << 2), 998 .enable = s5pc100_sclk1_ctrl, 999 1000 }, 1001 .sources = &clk_src_group7, 1002 .reg_src = { .reg = S5P_CLK_SRC2, .shift = 20, .size = 2 }, 1003 .reg_div = { .reg = S5P_CLK_DIV3, .shift = 20, .size = 4 }, 1004 }, { 1005 .clk = { 1006 .name = "sclk_fimc", 1007 .devname = "s5p-fimc.2", 1008 .ctrlbit = (1 << 3), 1009 .enable = s5pc100_sclk1_ctrl, 1010 1011 }, 1012 .sources = &clk_src_group7, 1013 .reg_src = { .reg = S5P_CLK_SRC2, .shift = 24, .size = 2 }, 1014 .reg_div = { .reg = S5P_CLK_DIV3, .shift = 24, .size = 4 }, 1015 }, { 1016 .clk = { 1017 .name = "sclk_mmc", 1018 .devname = "s3c-sdhci.0", 1019 .ctrlbit = (1 << 12), 1020 .enable = s5pc100_sclk1_ctrl, 1021 1022 }, 1023 .sources = &clk_src_mmc0, 1024 .reg_src = { .reg = S5P_CLK_SRC2, .shift = 0, .size = 2 }, 1025 .reg_div = { .reg = S5P_CLK_DIV3, .shift = 0, .size = 4 }, 1026 }, { 1027 .clk = { 1028 .name = "sclk_mmc", 1029 .devname = "s3c-sdhci.1", 1030 .ctrlbit = (1 << 13), 1031 .enable = s5pc100_sclk1_ctrl, 1032 1033 }, 1034 .sources = &clk_src_mmc12, 1035 .reg_src = { .reg = S5P_CLK_SRC2, .shift = 4, .size = 2 }, 1036 .reg_div = { .reg = S5P_CLK_DIV3, .shift = 4, .size = 4 }, 1037 }, { 1038 .clk = { 1039 .name = "sclk_mmc", 1040 .devname = "s3c-sdhci.2", 1041 .ctrlbit = (1 << 14), 1042 .enable = s5pc100_sclk1_ctrl, 1043 1044 }, 1045 .sources = &clk_src_mmc12, 1046 .reg_src = { .reg = S5P_CLK_SRC2, .shift = 8, .size = 2 }, 1047 .reg_div = { .reg = S5P_CLK_DIV3, .shift = 8, .size = 4 }, 1048 }, { 1049 .clk = { 1050 .name = "sclk_irda", 1051 .ctrlbit = (1 << 10), 1052 .enable = s5pc100_sclk0_ctrl, 1053 1054 }, 1055 .sources = &clk_src_irda_usb, 1056 .reg_src = { .reg = S5P_CLK_SRC2, .shift = 8, .size = 2 }, 1057 .reg_div = { .reg = S5P_CLK_DIV3, .shift = 8, .size = 4 }, 1058 }, { 1059 .clk = { 1060 .name = "sclk_irda", 1061 .ctrlbit = (1 << 10), 1062 .enable = s5pc100_sclk0_ctrl, 1063 1064 }, 1065 .sources = &clk_src_mmc12, 1066 .reg_src = { .reg = S5P_CLK_SRC1, .shift = 16, .size = 2 }, 1067 .reg_div = { .reg = S5P_CLK_DIV2, .shift = 16, .size = 4 }, 1068 }, { 1069 .clk = { 1070 .name = "sclk_pwi", 1071 .ctrlbit = (1 << 1), 1072 .enable = s5pc100_sclk0_ctrl, 1073 1074 }, 1075 .sources = &clk_src_pwi, 1076 .reg_src = { .reg = S5P_CLK_SRC3, .shift = 0, .size = 2 }, 1077 .reg_div = { .reg = S5P_CLK_DIV4, .shift = 0, .size = 3 }, 1078 }, { 1079 .clk = { 1080 .name = "sclk_uhost", 1081 .ctrlbit = (1 << 11), 1082 .enable = s5pc100_sclk0_ctrl, 1083 1084 }, 1085 .sources = &clk_src_irda_usb, 1086 .reg_src = { .reg = S5P_CLK_SRC1, .shift = 20, .size = 2 }, 1087 .reg_div = { .reg = S5P_CLK_DIV2, .shift = 20, .size = 4 }, 1088 }, 1089}; 1090 1091static struct clksrc_clk clk_sclk_uart = { 1092 .clk = { 1093 .name = "uclk1", 1094 .ctrlbit = (1 << 3), 1095 .enable = s5pc100_sclk0_ctrl, 1096 }, 1097 .sources = &clk_src_group2, 1098 .reg_src = { .reg = S5P_CLK_SRC1, .shift = 0, .size = 1 }, 1099 .reg_div = { .reg = S5P_CLK_DIV2, .shift = 0, .size = 4 }, 1100}; 1101 1102/* Clock initialisation code */ 1103static struct clksrc_clk *sysclks[] = { 1104 &clk_mout_apll, 1105 &clk_mout_epll, 1106 &clk_mout_mpll, 1107 &clk_mout_hpll, 1108 &clk_mout_href, 1109 &clk_mout_48m, 1110 &clk_div_apll, 1111 &clk_div_arm, 1112 &clk_div_d0_bus, 1113 &clk_div_pclkd0, 1114 &clk_div_secss, 1115 &clk_div_apll2, 1116 &clk_mout_am, 1117 &clk_div_d1_bus, 1118 &clk_div_mpll2, 1119 &clk_div_mpll, 1120 &clk_mout_onenand, 1121 &clk_div_onenand, 1122 &clk_div_pclkd1, 1123 &clk_div_cam, 1124 &clk_div_hdmi, 1125 &clk_sclk_audio0, 1126 &clk_sclk_audio1, 1127 &clk_sclk_audio2, 1128 &clk_sclk_spdif, 1129}; 1130 1131static struct clksrc_clk *clksrc_cdev[] = { 1132 &clk_sclk_uart, 1133}; 1134 1135void __init_or_cpufreq s5pc100_setup_clocks(void) 1136{ 1137 unsigned long xtal; 1138 unsigned long arm; 1139 unsigned long hclkd0; 1140 unsigned long hclkd1; 1141 unsigned long pclkd0; 1142 unsigned long pclkd1; 1143 unsigned long apll; 1144 unsigned long mpll; 1145 unsigned long epll; 1146 unsigned long hpll; 1147 unsigned int ptr; 1148 1149 /* Set S5PC100 functions for clk_fout_epll */ 1150 clk_fout_epll.enable = s5p_epll_enable; 1151 clk_fout_epll.ops = &s5pc100_epll_ops; 1152 1153 printk(KERN_DEBUG "%s: registering clocks\n", __func__); 1154 1155 xtal = clk_get_rate(&clk_xtal); 1156 1157 printk(KERN_DEBUG "%s: xtal is %ld\n", __func__, xtal); 1158 1159 apll = s5p_get_pll65xx(xtal, __raw_readl(S5P_APLL_CON)); 1160 mpll = s5p_get_pll65xx(xtal, __raw_readl(S5P_MPLL_CON)); 1161 epll = s5p_get_pll65xx(xtal, __raw_readl(S5P_EPLL_CON)); 1162 hpll = s5p_get_pll65xx(xtal, __raw_readl(S5P_HPLL_CON)); 1163 1164 printk(KERN_INFO "S5PC100: PLL settings, A=%ld.%ldMHz, M=%ld.%ldMHz, E=%ld.%ldMHz, H=%ld.%ldMHz\n", 1165 print_mhz(apll), print_mhz(mpll), print_mhz(epll), print_mhz(hpll)); 1166 1167 clk_fout_apll.rate = apll; 1168 clk_fout_mpll.rate = mpll; 1169 clk_fout_epll.rate = epll; 1170 clk_mout_hpll.clk.rate = hpll; 1171 1172 for (ptr = 0; ptr < ARRAY_SIZE(clksrcs); ptr++) 1173 s3c_set_clksrc(&clksrcs[ptr], true); 1174 1175 arm = clk_get_rate(&clk_div_arm.clk); 1176 hclkd0 = clk_get_rate(&clk_div_d0_bus.clk); 1177 pclkd0 = clk_get_rate(&clk_div_pclkd0.clk); 1178 hclkd1 = clk_get_rate(&clk_div_d1_bus.clk); 1179 pclkd1 = clk_get_rate(&clk_div_pclkd1.clk); 1180 1181 printk(KERN_INFO "S5PC100: HCLKD0=%ld.%ldMHz, HCLKD1=%ld.%ldMHz, PCLKD0=%ld.%ldMHz, PCLKD1=%ld.%ldMHz\n", 1182 print_mhz(hclkd0), print_mhz(hclkd1), print_mhz(pclkd0), print_mhz(pclkd1)); 1183 1184 clk_f.rate = arm; 1185 clk_h.rate = hclkd1; 1186 clk_p.rate = pclkd1; 1187} 1188 1189/* 1190 * The following clocks will be enabled during clock initialization. 1191 */ 1192static struct clk init_clocks[] = { 1193 { 1194 .name = "tzic", 1195 .parent = &clk_div_d0_bus.clk, 1196 .enable = s5pc100_d0_0_ctrl, 1197 .ctrlbit = (1 << 1), 1198 }, { 1199 .name = "intc", 1200 .parent = &clk_div_d0_bus.clk, 1201 .enable = s5pc100_d0_0_ctrl, 1202 .ctrlbit = (1 << 0), 1203 }, { 1204 .name = "ebi", 1205 .parent = &clk_div_d0_bus.clk, 1206 .enable = s5pc100_d0_1_ctrl, 1207 .ctrlbit = (1 << 5), 1208 }, { 1209 .name = "intmem", 1210 .parent = &clk_div_d0_bus.clk, 1211 .enable = s5pc100_d0_1_ctrl, 1212 .ctrlbit = (1 << 4), 1213 }, { 1214 .name = "sromc", 1215 .parent = &clk_div_d0_bus.clk, 1216 .enable = s5pc100_d0_1_ctrl, 1217 .ctrlbit = (1 << 1), 1218 }, { 1219 .name = "dmc", 1220 .parent = &clk_div_d0_bus.clk, 1221 .enable = s5pc100_d0_1_ctrl, 1222 .ctrlbit = (1 << 0), 1223 }, { 1224 .name = "chipid", 1225 .parent = &clk_div_d0_bus.clk, 1226 .enable = s5pc100_d0_1_ctrl, 1227 .ctrlbit = (1 << 0), 1228 }, { 1229 .name = "gpio", 1230 .parent = &clk_div_d1_bus.clk, 1231 .enable = s5pc100_d1_3_ctrl, 1232 .ctrlbit = (1 << 1), 1233 }, { 1234 .name = "uart", 1235 .devname = "s3c6400-uart.0", 1236 .parent = &clk_div_d1_bus.clk, 1237 .enable = s5pc100_d1_4_ctrl, 1238 .ctrlbit = (1 << 0), 1239 }, { 1240 .name = "uart", 1241 .devname = "s3c6400-uart.1", 1242 .parent = &clk_div_d1_bus.clk, 1243 .enable = s5pc100_d1_4_ctrl, 1244 .ctrlbit = (1 << 1), 1245 }, { 1246 .name = "uart", 1247 .devname = "s3c6400-uart.2", 1248 .parent = &clk_div_d1_bus.clk, 1249 .enable = s5pc100_d1_4_ctrl, 1250 .ctrlbit = (1 << 2), 1251 }, { 1252 .name = "uart", 1253 .devname = "s3c6400-uart.3", 1254 .parent = &clk_div_d1_bus.clk, 1255 .enable = s5pc100_d1_4_ctrl, 1256 .ctrlbit = (1 << 3), 1257 }, { 1258 .name = "timers", 1259 .parent = &clk_div_d1_bus.clk, 1260 .enable = s5pc100_d1_3_ctrl, 1261 .ctrlbit = (1 << 6), 1262 }, 1263}; 1264 1265static struct clk *clks[] __initdata = { 1266 &clk_ext, 1267 &clk_i2scdclk0, 1268 &clk_i2scdclk1, 1269 &clk_i2scdclk2, 1270 &clk_pcmcdclk0, 1271 &clk_pcmcdclk1, 1272}; 1273 1274static struct clk_lookup s5pc100_clk_lookup[] = { 1275 CLKDEV_INIT(NULL, "clk_uart_baud2", &clk_p), 1276 CLKDEV_INIT(NULL, "clk_uart_baud3", &clk_sclk_uart.clk), 1277}; 1278 1279void __init s5pc100_register_clocks(void) 1280{ 1281 int ptr; 1282 1283 s3c24xx_register_clocks(clks, ARRAY_SIZE(clks)); 1284 1285 for (ptr = 0; ptr < ARRAY_SIZE(sysclks); ptr++) 1286 s3c_register_clksrc(sysclks[ptr], 1); 1287 1288 s3c_register_clksrc(clksrcs, ARRAY_SIZE(clksrcs)); 1289 s3c_register_clocks(init_clocks, ARRAY_SIZE(init_clocks)); 1290 for (ptr = 0; ptr < ARRAY_SIZE(clksrc_cdev); ptr++) 1291 s3c_register_clksrc(clksrc_cdev[ptr], 1); 1292 1293 s3c_register_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off)); 1294 s3c_disable_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off)); 1295 clkdev_add_table(s5pc100_clk_lookup, ARRAY_SIZE(s5pc100_clk_lookup)); 1296 1297 s3c24xx_register_clock(&dummy_apb_pclk); 1298 1299 s3c_pwmclk_init(); 1300} 1301