|
@@ -353,3 +353,162 @@ static struct clk init_clocks[] = {
|
|
|
}, {
|
|
|
.name = "gpio",
|
|
|
.parent = &clk_p,
|
|
|
+ .enable = s3c64xx_pclk_ctrl,
|
|
|
+ .ctrlbit = S3C_CLKCON_PCLK_GPIO,
|
|
|
+ }, {
|
|
|
+ .name = "usb-host",
|
|
|
+ .parent = &clk_h,
|
|
|
+ .enable = s3c64xx_hclk_ctrl,
|
|
|
+ .ctrlbit = S3C_CLKCON_HCLK_UHOST,
|
|
|
+ }, {
|
|
|
+ .name = "otg",
|
|
|
+ .parent = &clk_h,
|
|
|
+ .enable = s3c64xx_hclk_ctrl,
|
|
|
+ .ctrlbit = S3C_CLKCON_HCLK_USB,
|
|
|
+ }, {
|
|
|
+ .name = "timers",
|
|
|
+ .parent = &clk_p,
|
|
|
+ .enable = s3c64xx_pclk_ctrl,
|
|
|
+ .ctrlbit = S3C_CLKCON_PCLK_PWM,
|
|
|
+ }, {
|
|
|
+ .name = "uart",
|
|
|
+ .devname = "s3c6400-uart.0",
|
|
|
+ .parent = &clk_p,
|
|
|
+ .enable = s3c64xx_pclk_ctrl,
|
|
|
+ .ctrlbit = S3C_CLKCON_PCLK_UART0,
|
|
|
+ }, {
|
|
|
+ .name = "uart",
|
|
|
+ .devname = "s3c6400-uart.1",
|
|
|
+ .parent = &clk_p,
|
|
|
+ .enable = s3c64xx_pclk_ctrl,
|
|
|
+ .ctrlbit = S3C_CLKCON_PCLK_UART1,
|
|
|
+ }, {
|
|
|
+ .name = "uart",
|
|
|
+ .devname = "s3c6400-uart.2",
|
|
|
+ .parent = &clk_p,
|
|
|
+ .enable = s3c64xx_pclk_ctrl,
|
|
|
+ .ctrlbit = S3C_CLKCON_PCLK_UART2,
|
|
|
+ }, {
|
|
|
+ .name = "uart",
|
|
|
+ .devname = "s3c6400-uart.3",
|
|
|
+ .parent = &clk_p,
|
|
|
+ .enable = s3c64xx_pclk_ctrl,
|
|
|
+ .ctrlbit = S3C_CLKCON_PCLK_UART3,
|
|
|
+ }, {
|
|
|
+ .name = "watchdog",
|
|
|
+ .parent = &clk_p,
|
|
|
+ .ctrlbit = S3C_CLKCON_PCLK_WDT,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct clk clk_hsmmc0 = {
|
|
|
+ .name = "hsmmc",
|
|
|
+ .devname = "s3c-sdhci.0",
|
|
|
+ .parent = &clk_h,
|
|
|
+ .enable = s3c64xx_hclk_ctrl,
|
|
|
+ .ctrlbit = S3C_CLKCON_HCLK_HSMMC0,
|
|
|
+};
|
|
|
+
|
|
|
+static struct clk clk_hsmmc1 = {
|
|
|
+ .name = "hsmmc",
|
|
|
+ .devname = "s3c-sdhci.1",
|
|
|
+ .parent = &clk_h,
|
|
|
+ .enable = s3c64xx_hclk_ctrl,
|
|
|
+ .ctrlbit = S3C_CLKCON_HCLK_HSMMC1,
|
|
|
+};
|
|
|
+
|
|
|
+static struct clk clk_hsmmc2 = {
|
|
|
+ .name = "hsmmc",
|
|
|
+ .devname = "s3c-sdhci.2",
|
|
|
+ .parent = &clk_h,
|
|
|
+ .enable = s3c64xx_hclk_ctrl,
|
|
|
+ .ctrlbit = S3C_CLKCON_HCLK_HSMMC2,
|
|
|
+};
|
|
|
+
|
|
|
+static struct clk clk_fout_apll = {
|
|
|
+ .name = "fout_apll",
|
|
|
+};
|
|
|
+
|
|
|
+static struct clk *clk_src_apll_list[] = {
|
|
|
+ [0] = &clk_fin_apll,
|
|
|
+ [1] = &clk_fout_apll,
|
|
|
+};
|
|
|
+
|
|
|
+static struct clksrc_sources clk_src_apll = {
|
|
|
+ .sources = clk_src_apll_list,
|
|
|
+ .nr_sources = ARRAY_SIZE(clk_src_apll_list),
|
|
|
+};
|
|
|
+
|
|
|
+static struct clksrc_clk clk_mout_apll = {
|
|
|
+ .clk = {
|
|
|
+ .name = "mout_apll",
|
|
|
+ },
|
|
|
+ .reg_src = { .reg = S3C_CLK_SRC, .shift = 0, .size = 1 },
|
|
|
+ .sources = &clk_src_apll,
|
|
|
+};
|
|
|
+
|
|
|
+static struct clk *clk_src_epll_list[] = {
|
|
|
+ [0] = &clk_fin_epll,
|
|
|
+ [1] = &clk_fout_epll,
|
|
|
+};
|
|
|
+
|
|
|
+static struct clksrc_sources clk_src_epll = {
|
|
|
+ .sources = clk_src_epll_list,
|
|
|
+ .nr_sources = ARRAY_SIZE(clk_src_epll_list),
|
|
|
+};
|
|
|
+
|
|
|
+static struct clksrc_clk clk_mout_epll = {
|
|
|
+ .clk = {
|
|
|
+ .name = "mout_epll",
|
|
|
+ },
|
|
|
+ .reg_src = { .reg = S3C_CLK_SRC, .shift = 2, .size = 1 },
|
|
|
+ .sources = &clk_src_epll,
|
|
|
+};
|
|
|
+
|
|
|
+static struct clk *clk_src_mpll_list[] = {
|
|
|
+ [0] = &clk_fin_mpll,
|
|
|
+ [1] = &clk_fout_mpll,
|
|
|
+};
|
|
|
+
|
|
|
+static struct clksrc_sources clk_src_mpll = {
|
|
|
+ .sources = clk_src_mpll_list,
|
|
|
+ .nr_sources = ARRAY_SIZE(clk_src_mpll_list),
|
|
|
+};
|
|
|
+
|
|
|
+static struct clksrc_clk clk_mout_mpll = {
|
|
|
+ .clk = {
|
|
|
+ .name = "mout_mpll",
|
|
|
+ },
|
|
|
+ .reg_src = { .reg = S3C_CLK_SRC, .shift = 1, .size = 1 },
|
|
|
+ .sources = &clk_src_mpll,
|
|
|
+};
|
|
|
+
|
|
|
+static unsigned int armclk_mask;
|
|
|
+
|
|
|
+static unsigned long s3c64xx_clk_arm_get_rate(struct clk *clk)
|
|
|
+{
|
|
|
+ unsigned long rate = clk_get_rate(clk->parent);
|
|
|
+ u32 clkdiv;
|
|
|
+
|
|
|
+ /* divisor mask starts at bit0, so no need to shift */
|
|
|
+ clkdiv = __raw_readl(S3C_CLK_DIV0) & armclk_mask;
|
|
|
+
|
|
|
+ return rate / (clkdiv + 1);
|
|
|
+}
|
|
|
+
|
|
|
+static unsigned long s3c64xx_clk_arm_round_rate(struct clk *clk,
|
|
|
+ unsigned long rate)
|
|
|
+{
|
|
|
+ unsigned long parent = clk_get_rate(clk->parent);
|
|
|
+ u32 div;
|
|
|
+
|
|
|
+ if (parent < rate)
|
|
|
+ return parent;
|
|
|
+
|
|
|
+ div = (parent / rate) - 1;
|
|
|
+ if (div > armclk_mask)
|
|
|
+ div = armclk_mask;
|
|
|
+
|
|
|
+ return parent / (div + 1);
|
|
|
+}
|
|
|
+
|