|
@@ -1242,3 +1242,125 @@ void __init_or_cpufreq s5pv210_setup_clocks(void)
|
|
unsigned long pclk_msys;
|
|
unsigned long pclk_msys;
|
|
unsigned long pclk_dsys;
|
|
unsigned long pclk_dsys;
|
|
unsigned long pclk_psys;
|
|
unsigned long pclk_psys;
|
|
|
|
+ unsigned long apll;
|
|
|
|
+ unsigned long mpll;
|
|
|
|
+ unsigned long epll;
|
|
|
|
+ unsigned long vpll;
|
|
|
|
+ unsigned int ptr;
|
|
|
|
+ u32 clkdiv0, clkdiv1;
|
|
|
|
+
|
|
|
|
+ /* Set functions for clk_fout_epll */
|
|
|
|
+ clk_fout_epll.enable = s5p_epll_enable;
|
|
|
|
+ clk_fout_epll.ops = &s5pv210_epll_ops;
|
|
|
|
+
|
|
|
|
+ printk(KERN_DEBUG "%s: registering clocks\n", __func__);
|
|
|
|
+
|
|
|
|
+ clkdiv0 = __raw_readl(S5P_CLK_DIV0);
|
|
|
|
+ clkdiv1 = __raw_readl(S5P_CLK_DIV1);
|
|
|
|
+
|
|
|
|
+ printk(KERN_DEBUG "%s: clkdiv0 = %08x, clkdiv1 = %08x\n",
|
|
|
|
+ __func__, clkdiv0, clkdiv1);
|
|
|
|
+
|
|
|
|
+ xtal_clk = clk_get(NULL, "xtal");
|
|
|
|
+ BUG_ON(IS_ERR(xtal_clk));
|
|
|
|
+
|
|
|
|
+ xtal = clk_get_rate(xtal_clk);
|
|
|
|
+ clk_put(xtal_clk);
|
|
|
|
+
|
|
|
|
+ printk(KERN_DEBUG "%s: xtal is %ld\n", __func__, xtal);
|
|
|
|
+
|
|
|
|
+ apll = s5p_get_pll45xx(xtal, __raw_readl(S5P_APLL_CON), pll_4508);
|
|
|
|
+ mpll = s5p_get_pll45xx(xtal, __raw_readl(S5P_MPLL_CON), pll_4502);
|
|
|
|
+ epll = s5p_get_pll46xx(xtal, __raw_readl(S5P_EPLL_CON),
|
|
|
|
+ __raw_readl(S5P_EPLL_CON1), pll_4600);
|
|
|
|
+ vpllsrc = clk_get_rate(&clk_vpllsrc.clk);
|
|
|
|
+ vpll = s5p_get_pll45xx(vpllsrc, __raw_readl(S5P_VPLL_CON), pll_4502);
|
|
|
|
+
|
|
|
|
+ clk_fout_apll.ops = &clk_fout_apll_ops;
|
|
|
|
+ clk_fout_mpll.rate = mpll;
|
|
|
|
+ clk_fout_epll.rate = epll;
|
|
|
|
+ clk_fout_vpll.ops = &s5pv210_vpll_ops;
|
|
|
|
+ clk_fout_vpll.rate = vpll;
|
|
|
|
+
|
|
|
|
+ printk(KERN_INFO "S5PV210: PLL settings, A=%ld, M=%ld, E=%ld V=%ld",
|
|
|
|
+ apll, mpll, epll, vpll);
|
|
|
|
+
|
|
|
|
+ armclk = clk_get_rate(&clk_armclk.clk);
|
|
|
|
+ hclk_msys = clk_get_rate(&clk_hclk_msys.clk);
|
|
|
|
+ hclk_dsys = clk_get_rate(&clk_hclk_dsys.clk);
|
|
|
|
+ hclk_psys = clk_get_rate(&clk_hclk_psys.clk);
|
|
|
|
+ pclk_msys = clk_get_rate(&clk_pclk_msys.clk);
|
|
|
|
+ pclk_dsys = clk_get_rate(&clk_pclk_dsys.clk);
|
|
|
|
+ pclk_psys = clk_get_rate(&clk_pclk_psys.clk);
|
|
|
|
+
|
|
|
|
+ printk(KERN_INFO "S5PV210: ARMCLK=%ld, HCLKM=%ld, HCLKD=%ld\n"
|
|
|
|
+ "HCLKP=%ld, PCLKM=%ld, PCLKD=%ld, PCLKP=%ld\n",
|
|
|
|
+ armclk, hclk_msys, hclk_dsys, hclk_psys,
|
|
|
|
+ pclk_msys, pclk_dsys, pclk_psys);
|
|
|
|
+
|
|
|
|
+ clk_f.rate = armclk;
|
|
|
|
+ clk_h.rate = hclk_psys;
|
|
|
|
+ clk_p.rate = pclk_psys;
|
|
|
|
+
|
|
|
|
+ for (ptr = 0; ptr < ARRAY_SIZE(clksrcs); ptr++)
|
|
|
|
+ s3c_set_clksrc(&clksrcs[ptr], true);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static struct clk *clks[] __initdata = {
|
|
|
|
+ &clk_sclk_hdmi27m,
|
|
|
|
+ &clk_sclk_hdmiphy,
|
|
|
|
+ &clk_sclk_usbphy0,
|
|
|
|
+ &clk_sclk_usbphy1,
|
|
|
|
+ &clk_pcmcdclk0,
|
|
|
|
+ &clk_pcmcdclk1,
|
|
|
|
+ &clk_pcmcdclk2,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct clk_lookup s5pv210_clk_lookup[] = {
|
|
|
|
+ CLKDEV_INIT(NULL, "clk_uart_baud0", &clk_p),
|
|
|
|
+ CLKDEV_INIT("s5pv210-uart.0", "clk_uart_baud1", &clk_sclk_uart0.clk),
|
|
|
|
+ CLKDEV_INIT("s5pv210-uart.1", "clk_uart_baud1", &clk_sclk_uart1.clk),
|
|
|
|
+ CLKDEV_INIT("s5pv210-uart.2", "clk_uart_baud1", &clk_sclk_uart2.clk),
|
|
|
|
+ CLKDEV_INIT("s5pv210-uart.3", "clk_uart_baud1", &clk_sclk_uart3.clk),
|
|
|
|
+ CLKDEV_INIT("s3c-sdhci.0", "mmc_busclk.0", &clk_hsmmc0),
|
|
|
|
+ CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.0", &clk_hsmmc1),
|
|
|
|
+ CLKDEV_INIT("s3c-sdhci.2", "mmc_busclk.0", &clk_hsmmc2),
|
|
|
|
+ CLKDEV_INIT("s3c-sdhci.3", "mmc_busclk.0", &clk_hsmmc3),
|
|
|
|
+ CLKDEV_INIT("s3c-sdhci.0", "mmc_busclk.2", &clk_sclk_mmc0.clk),
|
|
|
|
+ CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.2", &clk_sclk_mmc1.clk),
|
|
|
|
+ CLKDEV_INIT("s3c-sdhci.2", "mmc_busclk.2", &clk_sclk_mmc2.clk),
|
|
|
|
+ CLKDEV_INIT("s3c-sdhci.3", "mmc_busclk.2", &clk_sclk_mmc3.clk),
|
|
|
|
+ CLKDEV_INIT(NULL, "spi_busclk0", &clk_p),
|
|
|
|
+ CLKDEV_INIT("s5pv210-spi.0", "spi_busclk1", &clk_sclk_spi0.clk),
|
|
|
|
+ CLKDEV_INIT("s5pv210-spi.1", "spi_busclk1", &clk_sclk_spi1.clk),
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+void __init s5pv210_register_clocks(void)
|
|
|
|
+{
|
|
|
|
+ int ptr;
|
|
|
|
+
|
|
|
|
+ s3c24xx_register_clocks(clks, ARRAY_SIZE(clks));
|
|
|
|
+
|
|
|
|
+ for (ptr = 0; ptr < ARRAY_SIZE(sysclks); ptr++)
|
|
|
|
+ s3c_register_clksrc(sysclks[ptr], 1);
|
|
|
|
+
|
|
|
|
+ for (ptr = 0; ptr < ARRAY_SIZE(sclk_tv); ptr++)
|
|
|
|
+ s3c_register_clksrc(sclk_tv[ptr], 1);
|
|
|
|
+
|
|
|
|
+ for (ptr = 0; ptr < ARRAY_SIZE(clksrc_cdev); ptr++)
|
|
|
|
+ s3c_register_clksrc(clksrc_cdev[ptr], 1);
|
|
|
|
+
|
|
|
|
+ s3c_register_clksrc(clksrcs, ARRAY_SIZE(clksrcs));
|
|
|
|
+ s3c_register_clocks(init_clocks, ARRAY_SIZE(init_clocks));
|
|
|
|
+
|
|
|
|
+ s3c_register_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off));
|
|
|
|
+ s3c_disable_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off));
|
|
|
|
+ clkdev_add_table(s5pv210_clk_lookup, ARRAY_SIZE(s5pv210_clk_lookup));
|
|
|
|
+
|
|
|
|
+ s3c24xx_register_clocks(clk_cdev, ARRAY_SIZE(clk_cdev));
|
|
|
|
+ for (ptr = 0; ptr < ARRAY_SIZE(clk_cdev); ptr++)
|
|
|
|
+ s3c_disable_clocks(clk_cdev[ptr], 1);
|
|
|
|
+
|
|
|
|
+ s3c24xx_register_clock(&dummy_apb_pclk);
|
|
|
|
+ s3c_pwmclk_init();
|
|
|
|
+}
|