|  | @@ -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);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 |