diff options
Diffstat (limited to 'drivers/clk/samsung/clk-exynos4.c')
| -rw-r--r-- | drivers/clk/samsung/clk-exynos4.c | 231 |
1 files changed, 230 insertions, 1 deletions
diff --git a/drivers/clk/samsung/clk-exynos4.c b/drivers/clk/samsung/clk-exynos4.c index 7f4a473a7ad7..ac163d7f5bc3 100644 --- a/drivers/clk/samsung/clk-exynos4.c +++ b/drivers/clk/samsung/clk-exynos4.c | |||
| @@ -25,10 +25,12 @@ | |||
| 25 | #define DIV_LEFTBUS 0x4500 | 25 | #define DIV_LEFTBUS 0x4500 |
| 26 | #define GATE_IP_LEFTBUS 0x4800 | 26 | #define GATE_IP_LEFTBUS 0x4800 |
| 27 | #define E4X12_GATE_IP_IMAGE 0x4930 | 27 | #define E4X12_GATE_IP_IMAGE 0x4930 |
| 28 | #define CLKOUT_CMU_LEFTBUS 0x4a00 | ||
| 28 | #define SRC_RIGHTBUS 0x8200 | 29 | #define SRC_RIGHTBUS 0x8200 |
| 29 | #define DIV_RIGHTBUS 0x8500 | 30 | #define DIV_RIGHTBUS 0x8500 |
| 30 | #define GATE_IP_RIGHTBUS 0x8800 | 31 | #define GATE_IP_RIGHTBUS 0x8800 |
| 31 | #define E4X12_GATE_IP_PERIR 0x8960 | 32 | #define E4X12_GATE_IP_PERIR 0x8960 |
| 33 | #define CLKOUT_CMU_RIGHTBUS 0x8a00 | ||
| 32 | #define EPLL_LOCK 0xc010 | 34 | #define EPLL_LOCK 0xc010 |
| 33 | #define VPLL_LOCK 0xc020 | 35 | #define VPLL_LOCK 0xc020 |
| 34 | #define EPLL_CON0 0xc110 | 36 | #define EPLL_CON0 0xc110 |
| @@ -98,6 +100,7 @@ | |||
| 98 | #define GATE_IP_PERIL 0xc950 | 100 | #define GATE_IP_PERIL 0xc950 |
| 99 | #define E4210_GATE_IP_PERIR 0xc960 | 101 | #define E4210_GATE_IP_PERIR 0xc960 |
| 100 | #define GATE_BLOCK 0xc970 | 102 | #define GATE_BLOCK 0xc970 |
| 103 | #define CLKOUT_CMU_TOP 0xca00 | ||
| 101 | #define E4X12_MPLL_LOCK 0x10008 | 104 | #define E4X12_MPLL_LOCK 0x10008 |
| 102 | #define E4X12_MPLL_CON0 0x10108 | 105 | #define E4X12_MPLL_CON0 0x10108 |
| 103 | #define SRC_DMC 0x10200 | 106 | #define SRC_DMC 0x10200 |
| @@ -105,6 +108,7 @@ | |||
| 105 | #define DIV_DMC0 0x10500 | 108 | #define DIV_DMC0 0x10500 |
| 106 | #define DIV_DMC1 0x10504 | 109 | #define DIV_DMC1 0x10504 |
| 107 | #define GATE_IP_DMC 0x10900 | 110 | #define GATE_IP_DMC 0x10900 |
| 111 | #define CLKOUT_CMU_DMC 0x10a00 | ||
| 108 | #define APLL_LOCK 0x14000 | 112 | #define APLL_LOCK 0x14000 |
| 109 | #define E4210_MPLL_LOCK 0x14008 | 113 | #define E4210_MPLL_LOCK 0x14008 |
| 110 | #define APLL_CON0 0x14100 | 114 | #define APLL_CON0 0x14100 |
| @@ -114,11 +118,28 @@ | |||
| 114 | #define DIV_CPU1 0x14504 | 118 | #define DIV_CPU1 0x14504 |
| 115 | #define GATE_SCLK_CPU 0x14800 | 119 | #define GATE_SCLK_CPU 0x14800 |
| 116 | #define GATE_IP_CPU 0x14900 | 120 | #define GATE_IP_CPU 0x14900 |
| 121 | #define CLKOUT_CMU_CPU 0x14a00 | ||
| 122 | #define PWR_CTRL1 0x15020 | ||
| 123 | #define E4X12_PWR_CTRL2 0x15024 | ||
| 117 | #define E4X12_DIV_ISP0 0x18300 | 124 | #define E4X12_DIV_ISP0 0x18300 |
| 118 | #define E4X12_DIV_ISP1 0x18304 | 125 | #define E4X12_DIV_ISP1 0x18304 |
| 119 | #define E4X12_GATE_ISP0 0x18800 | 126 | #define E4X12_GATE_ISP0 0x18800 |
| 120 | #define E4X12_GATE_ISP1 0x18804 | 127 | #define E4X12_GATE_ISP1 0x18804 |
| 121 | 128 | ||
| 129 | /* Below definitions are used for PWR_CTRL settings */ | ||
| 130 | #define PWR_CTRL1_CORE2_DOWN_RATIO(x) (((x) & 0x7) << 28) | ||
| 131 | #define PWR_CTRL1_CORE1_DOWN_RATIO(x) (((x) & 0x7) << 16) | ||
| 132 | #define PWR_CTRL1_DIV2_DOWN_EN (1 << 9) | ||
| 133 | #define PWR_CTRL1_DIV1_DOWN_EN (1 << 8) | ||
| 134 | #define PWR_CTRL1_USE_CORE3_WFE (1 << 7) | ||
| 135 | #define PWR_CTRL1_USE_CORE2_WFE (1 << 6) | ||
| 136 | #define PWR_CTRL1_USE_CORE1_WFE (1 << 5) | ||
| 137 | #define PWR_CTRL1_USE_CORE0_WFE (1 << 4) | ||
| 138 | #define PWR_CTRL1_USE_CORE3_WFI (1 << 3) | ||
| 139 | #define PWR_CTRL1_USE_CORE2_WFI (1 << 2) | ||
| 140 | #define PWR_CTRL1_USE_CORE1_WFI (1 << 1) | ||
| 141 | #define PWR_CTRL1_USE_CORE0_WFI (1 << 0) | ||
| 142 | |||
| 122 | /* the exynos4 soc type */ | 143 | /* the exynos4 soc type */ |
| 123 | enum exynos4_soc { | 144 | enum exynos4_soc { |
| 124 | EXYNOS4210, | 145 | EXYNOS4210, |
| @@ -155,6 +176,7 @@ static unsigned long exynos4210_clk_save[] __initdata = { | |||
| 155 | E4210_GATE_IP_LCD1, | 176 | E4210_GATE_IP_LCD1, |
| 156 | E4210_GATE_IP_PERIR, | 177 | E4210_GATE_IP_PERIR, |
| 157 | E4210_MPLL_CON0, | 178 | E4210_MPLL_CON0, |
| 179 | PWR_CTRL1, | ||
| 158 | }; | 180 | }; |
| 159 | 181 | ||
| 160 | static unsigned long exynos4x12_clk_save[] __initdata = { | 182 | static unsigned long exynos4x12_clk_save[] __initdata = { |
| @@ -164,6 +186,8 @@ static unsigned long exynos4x12_clk_save[] __initdata = { | |||
| 164 | E4X12_DIV_ISP, | 186 | E4X12_DIV_ISP, |
| 165 | E4X12_DIV_CAM1, | 187 | E4X12_DIV_CAM1, |
| 166 | E4X12_MPLL_CON0, | 188 | E4X12_MPLL_CON0, |
| 189 | PWR_CTRL1, | ||
| 190 | E4X12_PWR_CTRL2, | ||
| 167 | }; | 191 | }; |
| 168 | 192 | ||
| 169 | static unsigned long exynos4_clk_pll_regs[] __initdata = { | 193 | static unsigned long exynos4_clk_pll_regs[] __initdata = { |
| @@ -242,6 +266,11 @@ static unsigned long exynos4_clk_regs[] __initdata = { | |||
| 242 | DIV_CPU1, | 266 | DIV_CPU1, |
| 243 | GATE_SCLK_CPU, | 267 | GATE_SCLK_CPU, |
| 244 | GATE_IP_CPU, | 268 | GATE_IP_CPU, |
| 269 | CLKOUT_CMU_LEFTBUS, | ||
| 270 | CLKOUT_CMU_RIGHTBUS, | ||
| 271 | CLKOUT_CMU_TOP, | ||
| 272 | CLKOUT_CMU_DMC, | ||
| 273 | CLKOUT_CMU_CPU, | ||
| 245 | }; | 274 | }; |
| 246 | 275 | ||
| 247 | static const struct samsung_clk_reg_dump src_mask_suspend[] = { | 276 | static const struct samsung_clk_reg_dump src_mask_suspend[] = { |
| @@ -397,10 +426,32 @@ PNAME(mout_audio2_p4210) = { "cdclk2", "none", "sclk_hdmi24m", | |||
| 397 | "sclk_epll", "sclk_vpll", }; | 426 | "sclk_epll", "sclk_vpll", }; |
| 398 | PNAME(mout_mixer_p4210) = { "sclk_dac", "sclk_hdmi", }; | 427 | PNAME(mout_mixer_p4210) = { "sclk_dac", "sclk_hdmi", }; |
| 399 | PNAME(mout_dac_p4210) = { "sclk_vpll", "sclk_hdmiphy", }; | 428 | PNAME(mout_dac_p4210) = { "sclk_vpll", "sclk_hdmiphy", }; |
| 429 | PNAME(mout_pwi_p4210) = { "xxti", "xusbxti", "sclk_hdmi24m", "sclk_usbphy0", | ||
| 430 | "sclk_usbphy1", "sclk_hdmiphy", "none", | ||
| 431 | "sclk_epll", "sclk_vpll" }; | ||
| 432 | PNAME(clkout_left_p4210) = { "sclk_mpll_div_2", "sclk_apll_div_2", | ||
| 433 | "div_gdl", "div_gpl" }; | ||
| 434 | PNAME(clkout_right_p4210) = { "sclk_mpll_div_2", "sclk_apll_div_2", | ||
| 435 | "div_gdr", "div_gpr" }; | ||
| 436 | PNAME(clkout_top_p4210) = { "fout_epll", "fout_vpll", "sclk_hdmi24m", | ||
| 437 | "sclk_usbphy0", "sclk_usbphy1", "sclk_hdmiphy", | ||
| 438 | "cdclk0", "cdclk1", "cdclk2", "spdif_extclk", | ||
| 439 | "aclk160", "aclk133", "aclk200", "aclk100", | ||
| 440 | "sclk_mfc", "sclk_g3d", "sclk_g2d", | ||
| 441 | "cam_a_pclk", "cam_b_pclk", "s_rxbyteclkhs0_2l", | ||
| 442 | "s_rxbyteclkhs0_4l" }; | ||
| 443 | PNAME(clkout_dmc_p4210) = { "div_dmcd", "div_dmcp", "div_acp_pclk", "div_dmc", | ||
| 444 | "div_dphy", "none", "div_pwi" }; | ||
| 445 | PNAME(clkout_cpu_p4210) = { "fout_apll_div_2", "none", "fout_mpll_div_2", | ||
| 446 | "none", "arm_clk_div_2", "div_corem0", | ||
| 447 | "div_corem1", "div_corem0", "div_atb", | ||
| 448 | "div_periph", "div_pclk_dbg", "div_hpm" }; | ||
| 400 | 449 | ||
| 401 | /* Exynos 4x12-specific parent groups */ | 450 | /* Exynos 4x12-specific parent groups */ |
| 402 | PNAME(mout_mpll_user_p4x12) = { "fin_pll", "sclk_mpll", }; | 451 | PNAME(mout_mpll_user_p4x12) = { "fin_pll", "sclk_mpll", }; |
| 403 | PNAME(mout_core_p4x12) = { "mout_apll", "mout_mpll_user_c", }; | 452 | PNAME(mout_core_p4x12) = { "mout_apll", "mout_mpll_user_c", }; |
| 453 | PNAME(mout_gdl_p4x12) = { "mout_mpll_user_l", "sclk_apll", }; | ||
| 454 | PNAME(mout_gdr_p4x12) = { "mout_mpll_user_r", "sclk_apll", }; | ||
| 404 | PNAME(sclk_ampll_p4x12) = { "mout_mpll_user_t", "sclk_apll", }; | 455 | PNAME(sclk_ampll_p4x12) = { "mout_mpll_user_t", "sclk_apll", }; |
| 405 | PNAME(group1_p4x12) = { "xxti", "xusbxti", "sclk_hdmi24m", "sclk_usbphy0", | 456 | PNAME(group1_p4x12) = { "xxti", "xusbxti", "sclk_hdmi24m", "sclk_usbphy0", |
| 406 | "none", "sclk_hdmiphy", "mout_mpll_user_t", | 457 | "none", "sclk_hdmiphy", "mout_mpll_user_t", |
| @@ -418,6 +469,32 @@ PNAME(aclk_p4412) = { "mout_mpll_user_t", "sclk_apll", }; | |||
| 418 | PNAME(mout_user_aclk400_mcuisp_p4x12) = {"fin_pll", "div_aclk400_mcuisp", }; | 469 | PNAME(mout_user_aclk400_mcuisp_p4x12) = {"fin_pll", "div_aclk400_mcuisp", }; |
| 419 | PNAME(mout_user_aclk200_p4x12) = {"fin_pll", "div_aclk200", }; | 470 | PNAME(mout_user_aclk200_p4x12) = {"fin_pll", "div_aclk200", }; |
| 420 | PNAME(mout_user_aclk266_gps_p4x12) = {"fin_pll", "div_aclk266_gps", }; | 471 | PNAME(mout_user_aclk266_gps_p4x12) = {"fin_pll", "div_aclk266_gps", }; |
| 472 | PNAME(mout_pwi_p4x12) = { "xxti", "xusbxti", "sclk_hdmi24m", "sclk_usbphy0", | ||
| 473 | "none", "sclk_hdmiphy", "sclk_mpll", | ||
| 474 | "sclk_epll", "sclk_vpll" }; | ||
| 475 | PNAME(clkout_left_p4x12) = { "sclk_mpll_user_l_div_2", "sclk_apll_div_2", | ||
| 476 | "div_gdl", "div_gpl" }; | ||
| 477 | PNAME(clkout_right_p4x12) = { "sclk_mpll_user_r_div_2", "sclk_apll_div_2", | ||
| 478 | "div_gdr", "div_gpr" }; | ||
| 479 | PNAME(clkout_top_p4x12) = { "fout_epll", "fout_vpll", "sclk_hdmi24m", | ||
| 480 | "sclk_usbphy0", "none", "sclk_hdmiphy", | ||
| 481 | "cdclk0", "cdclk1", "cdclk2", "spdif_extclk", | ||
| 482 | "aclk160", "aclk133", "aclk200", "aclk100", | ||
| 483 | "sclk_mfc", "sclk_g3d", "aclk400_mcuisp", | ||
| 484 | "cam_a_pclk", "cam_b_pclk", "s_rxbyteclkhs0_2l", | ||
| 485 | "s_rxbyteclkhs0_4l", "rx_half_byte_clk_csis0", | ||
| 486 | "rx_half_byte_clk_csis1", "div_jpeg", | ||
| 487 | "sclk_pwm_isp", "sclk_spi0_isp", | ||
| 488 | "sclk_spi1_isp", "sclk_uart_isp", | ||
| 489 | "sclk_mipihsi", "sclk_hdmi", "sclk_fimd0", | ||
| 490 | "sclk_pcm0" }; | ||
| 491 | PNAME(clkout_dmc_p4x12) = { "div_dmcd", "div_dmcp", "aclk_acp", "div_acp_pclk", | ||
| 492 | "div_dmc", "div_dphy", "fout_mpll_div_2", | ||
| 493 | "div_pwi", "none", "div_c2c", "div_c2c_aclk" }; | ||
| 494 | PNAME(clkout_cpu_p4x12) = { "fout_apll_div_2", "none", "none", "none", | ||
| 495 | "arm_clk_div_2", "div_corem0", "div_corem1", | ||
| 496 | "div_cores", "div_atb", "div_periph", | ||
| 497 | "div_pclk_dbg", "div_hpm" }; | ||
| 421 | 498 | ||
| 422 | /* fixed rate clocks generated outside the soc */ | 499 | /* fixed rate clocks generated outside the soc */ |
| 423 | static struct samsung_fixed_rate_clock exynos4_fixed_rate_ext_clks[] __initdata = { | 500 | static struct samsung_fixed_rate_clock exynos4_fixed_rate_ext_clks[] __initdata = { |
| @@ -436,6 +513,24 @@ static struct samsung_fixed_rate_clock exynos4210_fixed_rate_clks[] __initdata = | |||
| 436 | FRATE(0, "sclk_usbphy1", NULL, CLK_IS_ROOT, 48000000), | 513 | FRATE(0, "sclk_usbphy1", NULL, CLK_IS_ROOT, 48000000), |
| 437 | }; | 514 | }; |
| 438 | 515 | ||
| 516 | static struct samsung_fixed_factor_clock exynos4_fixed_factor_clks[] __initdata = { | ||
| 517 | FFACTOR(0, "sclk_apll_div_2", "sclk_apll", 1, 2, 0), | ||
| 518 | FFACTOR(0, "fout_mpll_div_2", "fout_mpll", 1, 2, 0), | ||
| 519 | FFACTOR(0, "fout_apll_div_2", "fout_apll", 1, 2, 0), | ||
| 520 | FFACTOR(0, "arm_clk_div_2", "arm_clk", 1, 2, 0), | ||
| 521 | }; | ||
| 522 | |||
| 523 | static struct samsung_fixed_factor_clock exynos4210_fixed_factor_clks[] __initdata = { | ||
| 524 | FFACTOR(0, "sclk_mpll_div_2", "sclk_mpll", 1, 2, 0), | ||
| 525 | }; | ||
| 526 | |||
| 527 | static struct samsung_fixed_factor_clock exynos4x12_fixed_factor_clks[] __initdata = { | ||
| 528 | FFACTOR(0, "sclk_mpll_user_l_div_2", "mout_mpll_user_l", 1, 2, 0), | ||
| 529 | FFACTOR(0, "sclk_mpll_user_r_div_2", "mout_mpll_user_r", 1, 2, 0), | ||
| 530 | FFACTOR(0, "sclk_mpll_user_t_div_2", "mout_mpll_user_t", 1, 2, 0), | ||
| 531 | FFACTOR(0, "sclk_mpll_user_c_div_2", "mout_mpll_user_c", 1, 2, 0), | ||
| 532 | }; | ||
| 533 | |||
| 439 | /* list of mux clocks supported in all exynos4 soc's */ | 534 | /* list of mux clocks supported in all exynos4 soc's */ |
| 440 | static struct samsung_mux_clock exynos4_mux_clks[] __initdata = { | 535 | static struct samsung_mux_clock exynos4_mux_clks[] __initdata = { |
| 441 | MUX_FA(CLK_MOUT_APLL, "mout_apll", mout_apll_p, SRC_CPU, 0, 1, | 536 | MUX_FA(CLK_MOUT_APLL, "mout_apll", mout_apll_p, SRC_CPU, 0, 1, |
| @@ -451,6 +546,9 @@ static struct samsung_mux_clock exynos4_mux_clks[] __initdata = { | |||
| 451 | MUX(0, "mout_onenand1", mout_onenand1_p, SRC_TOP0, 0, 1), | 546 | MUX(0, "mout_onenand1", mout_onenand1_p, SRC_TOP0, 0, 1), |
| 452 | MUX(CLK_SCLK_EPLL, "sclk_epll", mout_epll_p, SRC_TOP0, 4, 1), | 547 | MUX(CLK_SCLK_EPLL, "sclk_epll", mout_epll_p, SRC_TOP0, 4, 1), |
| 453 | MUX(0, "mout_onenand", mout_onenand_p, SRC_TOP0, 28, 1), | 548 | MUX(0, "mout_onenand", mout_onenand_p, SRC_TOP0, 28, 1), |
| 549 | |||
| 550 | MUX(0, "mout_dmc_bus", sclk_ampll_p4210, SRC_DMC, 4, 1), | ||
| 551 | MUX(0, "mout_dphy", sclk_ampll_p4210, SRC_DMC, 8, 1), | ||
| 454 | }; | 552 | }; |
| 455 | 553 | ||
| 456 | /* list of mux clocks supported in exynos4210 soc */ | 554 | /* list of mux clocks supported in exynos4210 soc */ |
| @@ -459,6 +557,14 @@ static struct samsung_mux_clock exynos4210_mux_early[] __initdata = { | |||
| 459 | }; | 557 | }; |
| 460 | 558 | ||
| 461 | static struct samsung_mux_clock exynos4210_mux_clks[] __initdata = { | 559 | static struct samsung_mux_clock exynos4210_mux_clks[] __initdata = { |
| 560 | MUX(0, "mout_gdl", sclk_ampll_p4210, SRC_LEFTBUS, 0, 1), | ||
| 561 | MUX(0, "mout_clkout_leftbus", clkout_left_p4210, | ||
| 562 | CLKOUT_CMU_LEFTBUS, 0, 5), | ||
| 563 | |||
| 564 | MUX(0, "mout_gdr", sclk_ampll_p4210, SRC_RIGHTBUS, 0, 1), | ||
| 565 | MUX(0, "mout_clkout_rightbus", clkout_right_p4210, | ||
| 566 | CLKOUT_CMU_RIGHTBUS, 0, 5), | ||
| 567 | |||
| 462 | MUX(0, "mout_aclk200", sclk_ampll_p4210, SRC_TOP0, 12, 1), | 568 | MUX(0, "mout_aclk200", sclk_ampll_p4210, SRC_TOP0, 12, 1), |
| 463 | MUX(0, "mout_aclk100", sclk_ampll_p4210, SRC_TOP0, 16, 1), | 569 | MUX(0, "mout_aclk100", sclk_ampll_p4210, SRC_TOP0, 16, 1), |
| 464 | MUX(0, "mout_aclk160", sclk_ampll_p4210, SRC_TOP0, 20, 1), | 570 | MUX(0, "mout_aclk160", sclk_ampll_p4210, SRC_TOP0, 20, 1), |
| @@ -472,6 +578,7 @@ static struct samsung_mux_clock exynos4210_mux_clks[] __initdata = { | |||
| 472 | MUX(0, "mout_mipi1", group1_p4210, E4210_SRC_LCD1, 12, 4), | 578 | MUX(0, "mout_mipi1", group1_p4210, E4210_SRC_LCD1, 12, 4), |
| 473 | MUX(CLK_SCLK_MPLL, "sclk_mpll", mout_mpll_p, SRC_CPU, 8, 1), | 579 | MUX(CLK_SCLK_MPLL, "sclk_mpll", mout_mpll_p, SRC_CPU, 8, 1), |
| 474 | MUX(CLK_MOUT_CORE, "mout_core", mout_core_p4210, SRC_CPU, 16, 1), | 580 | MUX(CLK_MOUT_CORE, "mout_core", mout_core_p4210, SRC_CPU, 16, 1), |
| 581 | MUX(0, "mout_hpm", mout_core_p4210, SRC_CPU, 20, 1), | ||
| 475 | MUX(CLK_SCLK_VPLL, "sclk_vpll", sclk_vpll_p4210, SRC_TOP0, 8, 1), | 582 | MUX(CLK_SCLK_VPLL, "sclk_vpll", sclk_vpll_p4210, SRC_TOP0, 8, 1), |
| 476 | MUX(CLK_MOUT_FIMC0, "mout_fimc0", group1_p4210, SRC_CAM, 0, 4), | 583 | MUX(CLK_MOUT_FIMC0, "mout_fimc0", group1_p4210, SRC_CAM, 0, 4), |
| 477 | MUX(CLK_MOUT_FIMC1, "mout_fimc1", group1_p4210, SRC_CAM, 4, 4), | 584 | MUX(CLK_MOUT_FIMC1, "mout_fimc1", group1_p4210, SRC_CAM, 4, 4), |
| @@ -503,12 +610,30 @@ static struct samsung_mux_clock exynos4210_mux_clks[] __initdata = { | |||
| 503 | MUX(0, "mout_spi0", group1_p4210, SRC_PERIL1, 16, 4), | 610 | MUX(0, "mout_spi0", group1_p4210, SRC_PERIL1, 16, 4), |
| 504 | MUX(0, "mout_spi1", group1_p4210, SRC_PERIL1, 20, 4), | 611 | MUX(0, "mout_spi1", group1_p4210, SRC_PERIL1, 20, 4), |
| 505 | MUX(0, "mout_spi2", group1_p4210, SRC_PERIL1, 24, 4), | 612 | MUX(0, "mout_spi2", group1_p4210, SRC_PERIL1, 24, 4), |
| 613 | MUX(0, "mout_clkout_top", clkout_top_p4210, CLKOUT_CMU_TOP, 0, 5), | ||
| 614 | |||
| 615 | MUX(0, "mout_pwi", mout_pwi_p4210, SRC_DMC, 16, 4), | ||
| 616 | MUX(0, "mout_clkout_dmc", clkout_dmc_p4210, CLKOUT_CMU_DMC, 0, 5), | ||
| 617 | |||
| 618 | MUX(0, "mout_clkout_cpu", clkout_cpu_p4210, CLKOUT_CMU_CPU, 0, 5), | ||
| 506 | }; | 619 | }; |
| 507 | 620 | ||
| 508 | /* list of mux clocks supported in exynos4x12 soc */ | 621 | /* list of mux clocks supported in exynos4x12 soc */ |
| 509 | static struct samsung_mux_clock exynos4x12_mux_clks[] __initdata = { | 622 | static struct samsung_mux_clock exynos4x12_mux_clks[] __initdata = { |
| 623 | MUX(0, "mout_mpll_user_l", mout_mpll_p, SRC_LEFTBUS, 4, 1), | ||
| 624 | MUX(0, "mout_gdl", mout_gdl_p4x12, SRC_LEFTBUS, 0, 1), | ||
| 625 | MUX(0, "mout_clkout_leftbus", clkout_left_p4x12, | ||
| 626 | CLKOUT_CMU_LEFTBUS, 0, 5), | ||
| 627 | |||
| 628 | MUX(0, "mout_mpll_user_r", mout_mpll_p, SRC_RIGHTBUS, 4, 1), | ||
| 629 | MUX(0, "mout_gdr", mout_gdr_p4x12, SRC_RIGHTBUS, 0, 1), | ||
| 630 | MUX(0, "mout_clkout_rightbus", clkout_right_p4x12, | ||
| 631 | CLKOUT_CMU_RIGHTBUS, 0, 5), | ||
| 632 | |||
| 510 | MUX(CLK_MOUT_MPLL_USER_C, "mout_mpll_user_c", mout_mpll_user_p4x12, | 633 | MUX(CLK_MOUT_MPLL_USER_C, "mout_mpll_user_c", mout_mpll_user_p4x12, |
| 511 | SRC_CPU, 24, 1), | 634 | SRC_CPU, 24, 1), |
| 635 | MUX(0, "mout_clkout_cpu", clkout_cpu_p4x12, CLKOUT_CMU_CPU, 0, 5), | ||
| 636 | |||
| 512 | MUX(0, "mout_aclk266_gps", aclk_p4412, SRC_TOP1, 4, 1), | 637 | MUX(0, "mout_aclk266_gps", aclk_p4412, SRC_TOP1, 4, 1), |
| 513 | MUX(0, "mout_aclk400_mcuisp", aclk_p4412, SRC_TOP1, 8, 1), | 638 | MUX(0, "mout_aclk400_mcuisp", aclk_p4412, SRC_TOP1, 8, 1), |
| 514 | MUX(CLK_MOUT_MPLL_USER_T, "mout_mpll_user_t", mout_mpll_user_p4x12, | 639 | MUX(CLK_MOUT_MPLL_USER_T, "mout_mpll_user_t", mout_mpll_user_p4x12, |
| @@ -531,6 +656,7 @@ static struct samsung_mux_clock exynos4x12_mux_clks[] __initdata = { | |||
| 531 | MUX(CLK_SCLK_MPLL, "sclk_mpll", mout_mpll_p, SRC_DMC, 12, 1), | 656 | MUX(CLK_SCLK_MPLL, "sclk_mpll", mout_mpll_p, SRC_DMC, 12, 1), |
| 532 | MUX(CLK_SCLK_VPLL, "sclk_vpll", mout_vpll_p, SRC_TOP0, 8, 1), | 657 | MUX(CLK_SCLK_VPLL, "sclk_vpll", mout_vpll_p, SRC_TOP0, 8, 1), |
| 533 | MUX(CLK_MOUT_CORE, "mout_core", mout_core_p4x12, SRC_CPU, 16, 1), | 658 | MUX(CLK_MOUT_CORE, "mout_core", mout_core_p4x12, SRC_CPU, 16, 1), |
| 659 | MUX(0, "mout_hpm", mout_core_p4x12, SRC_CPU, 20, 1), | ||
| 534 | MUX(CLK_MOUT_FIMC0, "mout_fimc0", group1_p4x12, SRC_CAM, 0, 4), | 660 | MUX(CLK_MOUT_FIMC0, "mout_fimc0", group1_p4x12, SRC_CAM, 0, 4), |
| 535 | MUX(CLK_MOUT_FIMC1, "mout_fimc1", group1_p4x12, SRC_CAM, 4, 4), | 661 | MUX(CLK_MOUT_FIMC1, "mout_fimc1", group1_p4x12, SRC_CAM, 4, 4), |
| 536 | MUX(CLK_MOUT_FIMC2, "mout_fimc2", group1_p4x12, SRC_CAM, 8, 4), | 662 | MUX(CLK_MOUT_FIMC2, "mout_fimc2", group1_p4x12, SRC_CAM, 8, 4), |
| @@ -565,15 +691,39 @@ static struct samsung_mux_clock exynos4x12_mux_clks[] __initdata = { | |||
| 565 | MUX(0, "mout_spi0_isp", group1_p4x12, E4X12_SRC_ISP, 4, 4), | 691 | MUX(0, "mout_spi0_isp", group1_p4x12, E4X12_SRC_ISP, 4, 4), |
| 566 | MUX(0, "mout_spi1_isp", group1_p4x12, E4X12_SRC_ISP, 8, 4), | 692 | MUX(0, "mout_spi1_isp", group1_p4x12, E4X12_SRC_ISP, 8, 4), |
| 567 | MUX(0, "mout_uart_isp", group1_p4x12, E4X12_SRC_ISP, 12, 4), | 693 | MUX(0, "mout_uart_isp", group1_p4x12, E4X12_SRC_ISP, 12, 4), |
| 694 | MUX(0, "mout_clkout_top", clkout_top_p4x12, CLKOUT_CMU_TOP, 0, 5), | ||
| 695 | |||
| 696 | MUX(0, "mout_c2c", sclk_ampll_p4210, SRC_DMC, 0, 1), | ||
| 697 | MUX(0, "mout_pwi", mout_pwi_p4x12, SRC_DMC, 16, 4), | ||
| 568 | MUX(0, "mout_g2d0", sclk_ampll_p4210, SRC_DMC, 20, 1), | 698 | MUX(0, "mout_g2d0", sclk_ampll_p4210, SRC_DMC, 20, 1), |
| 569 | MUX(0, "mout_g2d1", sclk_evpll_p, SRC_DMC, 24, 1), | 699 | MUX(0, "mout_g2d1", sclk_evpll_p, SRC_DMC, 24, 1), |
| 570 | MUX(0, "mout_g2d", mout_g2d_p, SRC_DMC, 28, 1), | 700 | MUX(0, "mout_g2d", mout_g2d_p, SRC_DMC, 28, 1), |
| 701 | MUX(0, "mout_clkout_dmc", clkout_dmc_p4x12, CLKOUT_CMU_DMC, 0, 5), | ||
| 571 | }; | 702 | }; |
| 572 | 703 | ||
| 573 | /* list of divider clocks supported in all exynos4 soc's */ | 704 | /* list of divider clocks supported in all exynos4 soc's */ |
| 574 | static struct samsung_div_clock exynos4_div_clks[] __initdata = { | 705 | static struct samsung_div_clock exynos4_div_clks[] __initdata = { |
| 706 | DIV(0, "div_gdl", "mout_gdl", DIV_LEFTBUS, 0, 3), | ||
| 707 | DIV(0, "div_gpl", "div_gdl", DIV_LEFTBUS, 4, 3), | ||
| 708 | DIV(0, "div_clkout_leftbus", "mout_clkout_leftbus", | ||
| 709 | CLKOUT_CMU_LEFTBUS, 8, 6), | ||
| 710 | |||
| 711 | DIV(0, "div_gdr", "mout_gdr", DIV_RIGHTBUS, 0, 3), | ||
| 712 | DIV(0, "div_gpr", "div_gdr", DIV_RIGHTBUS, 4, 3), | ||
| 713 | DIV(0, "div_clkout_rightbus", "mout_clkout_rightbus", | ||
| 714 | CLKOUT_CMU_RIGHTBUS, 8, 6), | ||
| 715 | |||
| 575 | DIV(0, "div_core", "mout_core", DIV_CPU0, 0, 3), | 716 | DIV(0, "div_core", "mout_core", DIV_CPU0, 0, 3), |
| 717 | DIV(0, "div_corem0", "div_core2", DIV_CPU0, 4, 3), | ||
| 718 | DIV(0, "div_corem1", "div_core2", DIV_CPU0, 8, 3), | ||
| 719 | DIV(0, "div_periph", "div_core2", DIV_CPU0, 12, 3), | ||
| 720 | DIV(0, "div_atb", "mout_core", DIV_CPU0, 16, 3), | ||
| 721 | DIV(0, "div_pclk_dbg", "div_atb", DIV_CPU0, 20, 3), | ||
| 576 | DIV(0, "div_core2", "div_core", DIV_CPU0, 28, 3), | 722 | DIV(0, "div_core2", "div_core", DIV_CPU0, 28, 3), |
| 723 | DIV(0, "div_copy", "mout_hpm", DIV_CPU1, 0, 3), | ||
| 724 | DIV(0, "div_hpm", "div_copy", DIV_CPU1, 4, 3), | ||
| 725 | DIV(0, "div_clkout_cpu", "mout_clkout_cpu", CLKOUT_CMU_CPU, 8, 6), | ||
| 726 | |||
| 577 | DIV(0, "div_fimc0", "mout_fimc0", DIV_CAM, 0, 4), | 727 | DIV(0, "div_fimc0", "mout_fimc0", DIV_CAM, 0, 4), |
| 578 | DIV(0, "div_fimc1", "mout_fimc1", DIV_CAM, 4, 4), | 728 | DIV(0, "div_fimc1", "mout_fimc1", DIV_CAM, 4, 4), |
| 579 | DIV(0, "div_fimc2", "mout_fimc2", DIV_CAM, 8, 4), | 729 | DIV(0, "div_fimc2", "mout_fimc2", DIV_CAM, 8, 4), |
| @@ -631,6 +781,16 @@ static struct samsung_div_clock exynos4_div_clks[] __initdata = { | |||
| 631 | CLK_SET_RATE_PARENT, 0), | 781 | CLK_SET_RATE_PARENT, 0), |
| 632 | DIV_F(0, "div_mmc_pre3", "div_mmc3", DIV_FSYS2, 24, 8, | 782 | DIV_F(0, "div_mmc_pre3", "div_mmc3", DIV_FSYS2, 24, 8, |
| 633 | CLK_SET_RATE_PARENT, 0), | 783 | CLK_SET_RATE_PARENT, 0), |
| 784 | DIV(0, "div_clkout_top", "mout_clkout_top", CLKOUT_CMU_TOP, 8, 6), | ||
| 785 | |||
| 786 | DIV(0, "div_acp", "mout_dmc_bus", DIV_DMC0, 0, 3), | ||
| 787 | DIV(0, "div_acp_pclk", "div_acp", DIV_DMC0, 4, 3), | ||
| 788 | DIV(0, "div_dphy", "mout_dphy", DIV_DMC0, 8, 3), | ||
| 789 | DIV(0, "div_dmc", "mout_dmc_bus", DIV_DMC0, 12, 3), | ||
| 790 | DIV(0, "div_dmcd", "div_dmc", DIV_DMC0, 16, 3), | ||
| 791 | DIV(0, "div_dmcp", "div_dmcd", DIV_DMC0, 20, 3), | ||
| 792 | DIV(0, "div_pwi", "mout_pwi", DIV_DMC1, 8, 4), | ||
| 793 | DIV(0, "div_clkout_dmc", "mout_clkout_dmc", CLKOUT_CMU_DMC, 8, 6), | ||
| 634 | }; | 794 | }; |
| 635 | 795 | ||
| 636 | /* list of divider clocks supported in exynos4210 soc */ | 796 | /* list of divider clocks supported in exynos4210 soc */ |
| @@ -671,6 +831,8 @@ static struct samsung_div_clock exynos4x12_div_clks[] __initdata = { | |||
| 671 | DIV_F(CLK_DIV_MCUISP1, "div_mcuisp1", "div_mcuisp0", E4X12_DIV_ISP1, | 831 | DIV_F(CLK_DIV_MCUISP1, "div_mcuisp1", "div_mcuisp0", E4X12_DIV_ISP1, |
| 672 | 8, 3, CLK_GET_RATE_NOCACHE, 0), | 832 | 8, 3, CLK_GET_RATE_NOCACHE, 0), |
| 673 | DIV(CLK_SCLK_FIMG2D, "sclk_fimg2d", "mout_g2d", DIV_DMC1, 0, 4), | 833 | DIV(CLK_SCLK_FIMG2D, "sclk_fimg2d", "mout_g2d", DIV_DMC1, 0, 4), |
| 834 | DIV(0, "div_c2c", "mout_c2c", DIV_DMC1, 4, 3), | ||
| 835 | DIV(0, "div_c2c_aclk", "div_c2c", DIV_DMC1, 12, 3), | ||
| 674 | }; | 836 | }; |
| 675 | 837 | ||
| 676 | /* list of gate clocks supported in all exynos4 soc's */ | 838 | /* list of gate clocks supported in all exynos4 soc's */ |
| @@ -680,6 +842,8 @@ static struct samsung_gate_clock exynos4_gate_clks[] __initdata = { | |||
| 680 | * the device name and clock alias names specified below for some | 842 | * the device name and clock alias names specified below for some |
| 681 | * of the clocks can be removed. | 843 | * of the clocks can be removed. |
| 682 | */ | 844 | */ |
| 845 | GATE(CLK_PPMULEFT, "ppmuleft", "aclk200", GATE_IP_LEFTBUS, 1, 0, 0), | ||
| 846 | GATE(CLK_PPMURIGHT, "ppmuright", "aclk200", GATE_IP_RIGHTBUS, 1, 0, 0), | ||
| 683 | GATE(CLK_SCLK_HDMI, "sclk_hdmi", "mout_hdmi", SRC_MASK_TV, 0, 0, 0), | 847 | GATE(CLK_SCLK_HDMI, "sclk_hdmi", "mout_hdmi", SRC_MASK_TV, 0, 0, 0), |
| 684 | GATE(CLK_SCLK_SPDIF, "sclk_spdif", "mout_spdif", SRC_MASK_PERIL1, 8, 0, | 848 | GATE(CLK_SCLK_SPDIF, "sclk_spdif", "mout_spdif", SRC_MASK_PERIL1, 8, 0, |
| 685 | 0), | 849 | 0), |
| @@ -695,11 +859,13 @@ static struct samsung_gate_clock exynos4_gate_clks[] __initdata = { | |||
| 695 | GATE(CLK_SROMC, "sromc", "aclk133", GATE_IP_FSYS, 11, 0, 0), | 859 | GATE(CLK_SROMC, "sromc", "aclk133", GATE_IP_FSYS, 11, 0, 0), |
| 696 | GATE(CLK_SCLK_G3D, "sclk_g3d", "div_g3d", GATE_IP_G3D, 0, | 860 | GATE(CLK_SCLK_G3D, "sclk_g3d", "div_g3d", GATE_IP_G3D, 0, |
| 697 | CLK_SET_RATE_PARENT, 0), | 861 | CLK_SET_RATE_PARENT, 0), |
| 862 | GATE(CLK_PPMUG3D, "ppmug3d", "aclk200", GATE_IP_G3D, 1, 0, 0), | ||
| 698 | GATE(CLK_USB_DEVICE, "usb_device", "aclk133", GATE_IP_FSYS, 13, 0, 0), | 863 | GATE(CLK_USB_DEVICE, "usb_device", "aclk133", GATE_IP_FSYS, 13, 0, 0), |
| 699 | GATE(CLK_ONENAND, "onenand", "aclk133", GATE_IP_FSYS, 15, 0, 0), | 864 | GATE(CLK_ONENAND, "onenand", "aclk133", GATE_IP_FSYS, 15, 0, 0), |
| 700 | GATE(CLK_NFCON, "nfcon", "aclk133", GATE_IP_FSYS, 16, 0, 0), | 865 | GATE(CLK_NFCON, "nfcon", "aclk133", GATE_IP_FSYS, 16, 0, 0), |
| 701 | GATE(CLK_GPS, "gps", "aclk133", GATE_IP_GPS, 0, 0, 0), | 866 | GATE(CLK_GPS, "gps", "aclk133", GATE_IP_GPS, 0, 0, 0), |
| 702 | GATE(CLK_SMMU_GPS, "smmu_gps", "aclk133", GATE_IP_GPS, 1, 0, 0), | 867 | GATE(CLK_SMMU_GPS, "smmu_gps", "aclk133", GATE_IP_GPS, 1, 0, 0), |
| 868 | GATE(CLK_PPMUGPS, "ppmugps", "aclk200", GATE_IP_GPS, 2, 0, 0), | ||
| 703 | GATE(CLK_SLIMBUS, "slimbus", "aclk100", GATE_IP_PERIL, 25, 0, 0), | 869 | GATE(CLK_SLIMBUS, "slimbus", "aclk100", GATE_IP_PERIL, 25, 0, 0), |
| 704 | GATE(CLK_SCLK_CAM0, "sclk_cam0", "div_cam0", GATE_SCLK_CAM, 4, | 870 | GATE(CLK_SCLK_CAM0, "sclk_cam0", "div_cam0", GATE_SCLK_CAM, 4, |
| 705 | CLK_SET_RATE_PARENT, 0), | 871 | CLK_SET_RATE_PARENT, 0), |
| @@ -781,19 +947,24 @@ static struct samsung_gate_clock exynos4_gate_clks[] __initdata = { | |||
| 781 | 0, 0), | 947 | 0, 0), |
| 782 | GATE(CLK_SMMU_JPEG, "smmu_jpeg", "aclk160", GATE_IP_CAM, 11, | 948 | GATE(CLK_SMMU_JPEG, "smmu_jpeg", "aclk160", GATE_IP_CAM, 11, |
| 783 | 0, 0), | 949 | 0, 0), |
| 950 | GATE(CLK_PPMUCAMIF, "ppmucamif", "aclk160", GATE_IP_CAM, 16, 0, 0), | ||
| 784 | GATE(CLK_PIXELASYNCM0, "pxl_async0", "aclk160", GATE_IP_CAM, 17, 0, 0), | 951 | GATE(CLK_PIXELASYNCM0, "pxl_async0", "aclk160", GATE_IP_CAM, 17, 0, 0), |
| 785 | GATE(CLK_PIXELASYNCM1, "pxl_async1", "aclk160", GATE_IP_CAM, 18, 0, 0), | 952 | GATE(CLK_PIXELASYNCM1, "pxl_async1", "aclk160", GATE_IP_CAM, 18, 0, 0), |
| 786 | GATE(CLK_SMMU_TV, "smmu_tv", "aclk160", GATE_IP_TV, 4, | 953 | GATE(CLK_SMMU_TV, "smmu_tv", "aclk160", GATE_IP_TV, 4, |
| 787 | 0, 0), | 954 | 0, 0), |
| 955 | GATE(CLK_PPMUTV, "ppmutv", "aclk160", GATE_IP_TV, 5, 0, 0), | ||
| 788 | GATE(CLK_MFC, "mfc", "aclk100", GATE_IP_MFC, 0, 0, 0), | 956 | GATE(CLK_MFC, "mfc", "aclk100", GATE_IP_MFC, 0, 0, 0), |
| 789 | GATE(CLK_SMMU_MFCL, "smmu_mfcl", "aclk100", GATE_IP_MFC, 1, | 957 | GATE(CLK_SMMU_MFCL, "smmu_mfcl", "aclk100", GATE_IP_MFC, 1, |
| 790 | 0, 0), | 958 | 0, 0), |
| 791 | GATE(CLK_SMMU_MFCR, "smmu_mfcr", "aclk100", GATE_IP_MFC, 2, | 959 | GATE(CLK_SMMU_MFCR, "smmu_mfcr", "aclk100", GATE_IP_MFC, 2, |
| 792 | 0, 0), | 960 | 0, 0), |
| 961 | GATE(CLK_PPMUMFC_L, "ppmumfc_l", "aclk100", GATE_IP_MFC, 3, 0, 0), | ||
| 962 | GATE(CLK_PPMUMFC_R, "ppmumfc_r", "aclk100", GATE_IP_MFC, 4, 0, 0), | ||
| 793 | GATE(CLK_FIMD0, "fimd0", "aclk160", GATE_IP_LCD0, 0, | 963 | GATE(CLK_FIMD0, "fimd0", "aclk160", GATE_IP_LCD0, 0, |
| 794 | 0, 0), | 964 | 0, 0), |
| 795 | GATE(CLK_SMMU_FIMD0, "smmu_fimd0", "aclk160", GATE_IP_LCD0, 4, | 965 | GATE(CLK_SMMU_FIMD0, "smmu_fimd0", "aclk160", GATE_IP_LCD0, 4, |
| 796 | 0, 0), | 966 | 0, 0), |
| 967 | GATE(CLK_PPMULCD0, "ppmulcd0", "aclk160", GATE_IP_LCD0, 5, 0, 0), | ||
| 797 | GATE(CLK_PDMA0, "pdma0", "aclk133", GATE_IP_FSYS, 0, | 968 | GATE(CLK_PDMA0, "pdma0", "aclk133", GATE_IP_FSYS, 0, |
| 798 | 0, 0), | 969 | 0, 0), |
| 799 | GATE(CLK_PDMA1, "pdma1", "aclk133", GATE_IP_FSYS, 1, | 970 | GATE(CLK_PDMA1, "pdma1", "aclk133", GATE_IP_FSYS, 1, |
| @@ -806,6 +977,7 @@ static struct samsung_gate_clock exynos4_gate_clks[] __initdata = { | |||
| 806 | 0, 0), | 977 | 0, 0), |
| 807 | GATE(CLK_SDMMC3, "sdmmc3", "aclk133", GATE_IP_FSYS, 8, | 978 | GATE(CLK_SDMMC3, "sdmmc3", "aclk133", GATE_IP_FSYS, 8, |
| 808 | 0, 0), | 979 | 0, 0), |
| 980 | GATE(CLK_PPMUFILE, "ppmufile", "aclk133", GATE_IP_FSYS, 17, 0, 0), | ||
| 809 | GATE(CLK_UART0, "uart0", "aclk100", GATE_IP_PERIL, 0, | 981 | GATE(CLK_UART0, "uart0", "aclk100", GATE_IP_PERIL, 0, |
| 810 | 0, 0), | 982 | 0, 0), |
| 811 | GATE(CLK_UART1, "uart1", "aclk100", GATE_IP_PERIL, 1, | 983 | GATE(CLK_UART1, "uart1", "aclk100", GATE_IP_PERIL, 1, |
| @@ -852,6 +1024,21 @@ static struct samsung_gate_clock exynos4_gate_clks[] __initdata = { | |||
| 852 | 0, 0), | 1024 | 0, 0), |
| 853 | GATE(CLK_AC97, "ac97", "aclk100", GATE_IP_PERIL, 27, | 1025 | GATE(CLK_AC97, "ac97", "aclk100", GATE_IP_PERIL, 27, |
| 854 | 0, 0), | 1026 | 0, 0), |
| 1027 | GATE(CLK_PPMUDMC0, "ppmudmc0", "aclk133", GATE_IP_DMC, 8, 0, 0), | ||
| 1028 | GATE(CLK_PPMUDMC1, "ppmudmc1", "aclk133", GATE_IP_DMC, 9, 0, 0), | ||
| 1029 | GATE(CLK_PPMUCPU, "ppmucpu", "aclk133", GATE_IP_DMC, 10, 0, 0), | ||
| 1030 | GATE(CLK_PPMUACP, "ppmuacp", "aclk133", GATE_IP_DMC, 16, 0, 0), | ||
| 1031 | |||
| 1032 | GATE(CLK_OUT_LEFTBUS, "clkout_leftbus", "div_clkout_leftbus", | ||
| 1033 | CLKOUT_CMU_LEFTBUS, 16, CLK_SET_RATE_PARENT, 0), | ||
| 1034 | GATE(CLK_OUT_RIGHTBUS, "clkout_rightbus", "div_clkout_rightbus", | ||
| 1035 | CLKOUT_CMU_RIGHTBUS, 16, CLK_SET_RATE_PARENT, 0), | ||
| 1036 | GATE(CLK_OUT_TOP, "clkout_top", "div_clkout_top", | ||
| 1037 | CLKOUT_CMU_TOP, 16, CLK_SET_RATE_PARENT, 0), | ||
| 1038 | GATE(CLK_OUT_DMC, "clkout_dmc", "div_clkout_dmc", | ||
| 1039 | CLKOUT_CMU_DMC, 16, CLK_SET_RATE_PARENT, 0), | ||
| 1040 | GATE(CLK_OUT_CPU, "clkout_cpu", "div_clkout_cpu", | ||
| 1041 | CLKOUT_CMU_CPU, 16, CLK_SET_RATE_PARENT, 0), | ||
| 855 | }; | 1042 | }; |
| 856 | 1043 | ||
| 857 | /* list of gate clocks supported in exynos4210 soc */ | 1044 | /* list of gate clocks supported in exynos4210 soc */ |
| @@ -863,6 +1050,9 @@ static struct samsung_gate_clock exynos4210_gate_clks[] __initdata = { | |||
| 863 | GATE(CLK_SMMU_G2D, "smmu_g2d", "aclk200", E4210_GATE_IP_IMAGE, 3, 0, 0), | 1050 | GATE(CLK_SMMU_G2D, "smmu_g2d", "aclk200", E4210_GATE_IP_IMAGE, 3, 0, 0), |
| 864 | GATE(CLK_SMMU_MDMA, "smmu_mdma", "aclk200", E4210_GATE_IP_IMAGE, 5, 0, | 1051 | GATE(CLK_SMMU_MDMA, "smmu_mdma", "aclk200", E4210_GATE_IP_IMAGE, 5, 0, |
| 865 | 0), | 1052 | 0), |
| 1053 | GATE(CLK_PPMUIMAGE, "ppmuimage", "aclk200", E4210_GATE_IP_IMAGE, 9, 0, | ||
| 1054 | 0), | ||
| 1055 | GATE(CLK_PPMULCD1, "ppmulcd1", "aclk160", E4210_GATE_IP_LCD1, 5, 0, 0), | ||
| 866 | GATE(CLK_PCIE_PHY, "pcie_phy", "aclk133", GATE_IP_FSYS, 2, 0, 0), | 1056 | GATE(CLK_PCIE_PHY, "pcie_phy", "aclk133", GATE_IP_FSYS, 2, 0, 0), |
| 867 | GATE(CLK_SATA_PHY, "sata_phy", "aclk133", GATE_IP_FSYS, 3, 0, 0), | 1057 | GATE(CLK_SATA_PHY, "sata_phy", "aclk133", GATE_IP_FSYS, 3, 0, 0), |
| 868 | GATE(CLK_SATA, "sata", "aclk133", GATE_IP_FSYS, 10, 0, 0), | 1058 | GATE(CLK_SATA, "sata", "aclk133", GATE_IP_FSYS, 10, 0, 0), |
| @@ -906,6 +1096,8 @@ static struct samsung_gate_clock exynos4x12_gate_clks[] __initdata = { | |||
| 906 | GATE(CLK_MDMA, "mdma", "aclk200", E4X12_GATE_IP_IMAGE, 2, 0, 0), | 1096 | GATE(CLK_MDMA, "mdma", "aclk200", E4X12_GATE_IP_IMAGE, 2, 0, 0), |
| 907 | GATE(CLK_SMMU_MDMA, "smmu_mdma", "aclk200", E4X12_GATE_IP_IMAGE, 5, 0, | 1097 | GATE(CLK_SMMU_MDMA, "smmu_mdma", "aclk200", E4X12_GATE_IP_IMAGE, 5, 0, |
| 908 | 0), | 1098 | 0), |
| 1099 | GATE(CLK_PPMUIMAGE, "ppmuimage", "aclk200", E4X12_GATE_IP_IMAGE, 9, 0, | ||
| 1100 | 0), | ||
| 909 | GATE(CLK_MIPI_HSI, "mipi_hsi", "aclk133", GATE_IP_FSYS, 10, 0, 0), | 1101 | GATE(CLK_MIPI_HSI, "mipi_hsi", "aclk133", GATE_IP_FSYS, 10, 0, 0), |
| 910 | GATE(CLK_CHIPID, "chipid", "aclk100", E4X12_GATE_IP_PERIR, 0, 0, 0), | 1102 | GATE(CLK_CHIPID, "chipid", "aclk100", E4X12_GATE_IP_PERIR, 0, 0, 0), |
| 911 | GATE(CLK_SYSREG, "sysreg", "aclk100", E4X12_GATE_IP_PERIR, 1, | 1103 | GATE(CLK_SYSREG, "sysreg", "aclk100", E4X12_GATE_IP_PERIR, 1, |
| @@ -1062,7 +1254,7 @@ static void __init exynos4_clk_register_finpll(struct samsung_clk_provider *ctx) | |||
| 1062 | 1254 | ||
| 1063 | } | 1255 | } |
| 1064 | 1256 | ||
| 1065 | static struct of_device_id ext_clk_match[] __initdata = { | 1257 | static const struct of_device_id ext_clk_match[] __initconst = { |
| 1066 | { .compatible = "samsung,clock-xxti", .data = (void *)0, }, | 1258 | { .compatible = "samsung,clock-xxti", .data = (void *)0, }, |
| 1067 | { .compatible = "samsung,clock-xusbxti", .data = (void *)1, }, | 1259 | { .compatible = "samsung,clock-xusbxti", .data = (void *)1, }, |
| 1068 | {}, | 1260 | {}, |
| @@ -1164,6 +1356,32 @@ static struct samsung_pll_clock exynos4x12_plls[nr_plls] __initdata = { | |||
| 1164 | VPLL_LOCK, VPLL_CON0, NULL), | 1356 | VPLL_LOCK, VPLL_CON0, NULL), |
| 1165 | }; | 1357 | }; |
| 1166 | 1358 | ||
| 1359 | static void __init exynos4_core_down_clock(enum exynos4_soc soc) | ||
| 1360 | { | ||
| 1361 | unsigned int tmp; | ||
| 1362 | |||
| 1363 | /* | ||
| 1364 | * Enable arm clock down (in idle) and set arm divider | ||
| 1365 | * ratios in WFI/WFE state. | ||
| 1366 | */ | ||
| 1367 | tmp = (PWR_CTRL1_CORE2_DOWN_RATIO(7) | PWR_CTRL1_CORE1_DOWN_RATIO(7) | | ||
| 1368 | PWR_CTRL1_DIV2_DOWN_EN | PWR_CTRL1_DIV1_DOWN_EN | | ||
| 1369 | PWR_CTRL1_USE_CORE1_WFE | PWR_CTRL1_USE_CORE0_WFE | | ||
| 1370 | PWR_CTRL1_USE_CORE1_WFI | PWR_CTRL1_USE_CORE0_WFI); | ||
| 1371 | /* On Exynos4412 enable it also on core 2 and 3 */ | ||
| 1372 | if (num_possible_cpus() == 4) | ||
| 1373 | tmp |= PWR_CTRL1_USE_CORE3_WFE | PWR_CTRL1_USE_CORE2_WFE | | ||
| 1374 | PWR_CTRL1_USE_CORE3_WFI | PWR_CTRL1_USE_CORE2_WFI; | ||
| 1375 | __raw_writel(tmp, reg_base + PWR_CTRL1); | ||
| 1376 | |||
| 1377 | /* | ||
| 1378 | * Disable the clock up feature on Exynos4x12, in case it was | ||
| 1379 | * enabled by bootloader. | ||
| 1380 | */ | ||
| 1381 | if (exynos4_soc == EXYNOS4X12) | ||
| 1382 | __raw_writel(0x0, reg_base + E4X12_PWR_CTRL2); | ||
| 1383 | } | ||
| 1384 | |||
| 1167 | /* register exynos4 clocks */ | 1385 | /* register exynos4 clocks */ |
| 1168 | static void __init exynos4_clk_init(struct device_node *np, | 1386 | static void __init exynos4_clk_init(struct device_node *np, |
| 1169 | enum exynos4_soc soc) | 1387 | enum exynos4_soc soc) |
| @@ -1224,6 +1442,8 @@ static void __init exynos4_clk_init(struct device_node *np, | |||
| 1224 | ARRAY_SIZE(exynos4_div_clks)); | 1442 | ARRAY_SIZE(exynos4_div_clks)); |
| 1225 | samsung_clk_register_gate(ctx, exynos4_gate_clks, | 1443 | samsung_clk_register_gate(ctx, exynos4_gate_clks, |
| 1226 | ARRAY_SIZE(exynos4_gate_clks)); | 1444 | ARRAY_SIZE(exynos4_gate_clks)); |
| 1445 | samsung_clk_register_fixed_factor(ctx, exynos4_fixed_factor_clks, | ||
| 1446 | ARRAY_SIZE(exynos4_fixed_factor_clks)); | ||
| 1227 | 1447 | ||
| 1228 | if (exynos4_soc == EXYNOS4210) { | 1448 | if (exynos4_soc == EXYNOS4210) { |
| 1229 | samsung_clk_register_fixed_rate(ctx, exynos4210_fixed_rate_clks, | 1449 | samsung_clk_register_fixed_rate(ctx, exynos4210_fixed_rate_clks, |
| @@ -1236,6 +1456,9 @@ static void __init exynos4_clk_init(struct device_node *np, | |||
| 1236 | ARRAY_SIZE(exynos4210_gate_clks)); | 1456 | ARRAY_SIZE(exynos4210_gate_clks)); |
| 1237 | samsung_clk_register_alias(ctx, exynos4210_aliases, | 1457 | samsung_clk_register_alias(ctx, exynos4210_aliases, |
| 1238 | ARRAY_SIZE(exynos4210_aliases)); | 1458 | ARRAY_SIZE(exynos4210_aliases)); |
| 1459 | samsung_clk_register_fixed_factor(ctx, | ||
| 1460 | exynos4210_fixed_factor_clks, | ||
| 1461 | ARRAY_SIZE(exynos4210_fixed_factor_clks)); | ||
| 1239 | } else { | 1462 | } else { |
| 1240 | samsung_clk_register_mux(ctx, exynos4x12_mux_clks, | 1463 | samsung_clk_register_mux(ctx, exynos4x12_mux_clks, |
| 1241 | ARRAY_SIZE(exynos4x12_mux_clks)); | 1464 | ARRAY_SIZE(exynos4x12_mux_clks)); |
| @@ -1245,13 +1468,19 @@ static void __init exynos4_clk_init(struct device_node *np, | |||
| 1245 | ARRAY_SIZE(exynos4x12_gate_clks)); | 1468 | ARRAY_SIZE(exynos4x12_gate_clks)); |
| 1246 | samsung_clk_register_alias(ctx, exynos4x12_aliases, | 1469 | samsung_clk_register_alias(ctx, exynos4x12_aliases, |
| 1247 | ARRAY_SIZE(exynos4x12_aliases)); | 1470 | ARRAY_SIZE(exynos4x12_aliases)); |
| 1471 | samsung_clk_register_fixed_factor(ctx, | ||
| 1472 | exynos4x12_fixed_factor_clks, | ||
| 1473 | ARRAY_SIZE(exynos4x12_fixed_factor_clks)); | ||
| 1248 | } | 1474 | } |
| 1249 | 1475 | ||
| 1250 | samsung_clk_register_alias(ctx, exynos4_aliases, | 1476 | samsung_clk_register_alias(ctx, exynos4_aliases, |
| 1251 | ARRAY_SIZE(exynos4_aliases)); | 1477 | ARRAY_SIZE(exynos4_aliases)); |
| 1252 | 1478 | ||
| 1479 | exynos4_core_down_clock(soc); | ||
| 1253 | exynos4_clk_sleep_init(); | 1480 | exynos4_clk_sleep_init(); |
| 1254 | 1481 | ||
| 1482 | samsung_clk_of_add_provider(np, ctx); | ||
| 1483 | |||
| 1255 | pr_info("%s clocks: sclk_apll = %ld, sclk_mpll = %ld\n" | 1484 | pr_info("%s clocks: sclk_apll = %ld, sclk_mpll = %ld\n" |
| 1256 | "\tsclk_epll = %ld, sclk_vpll = %ld, arm_clk = %ld\n", | 1485 | "\tsclk_epll = %ld, sclk_vpll = %ld, arm_clk = %ld\n", |
| 1257 | exynos4_soc == EXYNOS4210 ? "Exynos4210" : "Exynos4x12", | 1486 | exynos4_soc == EXYNOS4210 ? "Exynos4210" : "Exynos4x12", |
