|  | @@ -259,3 +259,178 @@ static struct clk_div4_table div4_table = {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  enum { DIV4_I, DIV4_ZG, DIV4_M3, DIV4_B, DIV4_M1, DIV4_M2,
 | 
	
		
			
				|  |  |  	DIV4_Z, DIV4_ZTR, DIV4_ZT, DIV4_ZX, DIV4_HP, DIV4_NR };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#define DIV4(_reg, _bit, _mask, _flags) \
 | 
	
		
			
				|  |  | +	SH_CLK_DIV4(&pll1_clk, _reg, _bit, _mask, _flags)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static struct clk div4_clks[DIV4_NR] = {
 | 
	
		
			
				|  |  | +	[DIV4_I] = DIV4(FRQCRA, 20, 0xfff, CLK_ENABLE_ON_INIT),
 | 
	
		
			
				|  |  | +	[DIV4_ZG] = DIV4(FRQCRA, 16, 0xbff, CLK_ENABLE_ON_INIT),
 | 
	
		
			
				|  |  | +	[DIV4_M3] = DIV4(FRQCRA, 12, 0xfff, CLK_ENABLE_ON_INIT),
 | 
	
		
			
				|  |  | +	[DIV4_B] = DIV4(FRQCRA, 8, 0xfff, CLK_ENABLE_ON_INIT),
 | 
	
		
			
				|  |  | +	[DIV4_M1] = DIV4(FRQCRA, 4, 0xfff, 0),
 | 
	
		
			
				|  |  | +	[DIV4_M2] = DIV4(FRQCRA, 0, 0xfff, 0),
 | 
	
		
			
				|  |  | +	[DIV4_Z] = DIV4(FRQCRB, 24, 0xbff, 0),
 | 
	
		
			
				|  |  | +	[DIV4_ZTR] = DIV4(FRQCRB, 20, 0xfff, 0),
 | 
	
		
			
				|  |  | +	[DIV4_ZT] = DIV4(FRQCRB, 16, 0xfff, 0),
 | 
	
		
			
				|  |  | +	[DIV4_ZX] = DIV4(FRQCRB, 12, 0xfff, 0),
 | 
	
		
			
				|  |  | +	[DIV4_HP] = DIV4(FRQCRB, 4, 0xfff, 0),
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +enum { DIV6_VCK1, DIV6_VCK2, DIV6_VCK3, DIV6_ZB1,
 | 
	
		
			
				|  |  | +	DIV6_FLCTL, DIV6_SDHI0, DIV6_SDHI1, DIV6_SDHI2,
 | 
	
		
			
				|  |  | +	DIV6_FSIA, DIV6_FSIB, DIV6_SUB,
 | 
	
		
			
				|  |  | +	DIV6_SPUA, DIV6_SPUV, DIV6_MSU,
 | 
	
		
			
				|  |  | +	DIV6_HSI,  DIV6_MFG1, DIV6_MFG2,
 | 
	
		
			
				|  |  | +	DIV6_DSIT, DIV6_DSI0P, DIV6_DSI1P,
 | 
	
		
			
				|  |  | +	DIV6_NR };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static struct clk *vck_parent[8] = {
 | 
	
		
			
				|  |  | +	[0] = &pll1_div2_clk,
 | 
	
		
			
				|  |  | +	[1] = &pll2_clk,
 | 
	
		
			
				|  |  | +	[2] = &sh73a0_extcki_clk,
 | 
	
		
			
				|  |  | +	[3] = &sh73a0_extal2_clk,
 | 
	
		
			
				|  |  | +	[4] = &main_div2_clk,
 | 
	
		
			
				|  |  | +	[5] = &sh73a0_extalr_clk,
 | 
	
		
			
				|  |  | +	[6] = &main_clk,
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static struct clk *pll_parent[4] = {
 | 
	
		
			
				|  |  | +	[0] = &pll1_div2_clk,
 | 
	
		
			
				|  |  | +	[1] = &pll2_clk,
 | 
	
		
			
				|  |  | +	[2] = &pll1_div13_clk,
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static struct clk *hsi_parent[4] = {
 | 
	
		
			
				|  |  | +	[0] = &pll1_div2_clk,
 | 
	
		
			
				|  |  | +	[1] = &pll2_clk,
 | 
	
		
			
				|  |  | +	[2] = &pll1_div7_clk,
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static struct clk *pll_extal2_parent[] = {
 | 
	
		
			
				|  |  | +	[0] = &pll1_div2_clk,
 | 
	
		
			
				|  |  | +	[1] = &pll2_clk,
 | 
	
		
			
				|  |  | +	[2] = &sh73a0_extal2_clk,
 | 
	
		
			
				|  |  | +	[3] = &sh73a0_extal2_clk,
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static struct clk *dsi_parent[8] = {
 | 
	
		
			
				|  |  | +	[0] = &pll1_div2_clk,
 | 
	
		
			
				|  |  | +	[1] = &pll2_clk,
 | 
	
		
			
				|  |  | +	[2] = &main_clk,
 | 
	
		
			
				|  |  | +	[3] = &sh73a0_extal2_clk,
 | 
	
		
			
				|  |  | +	[4] = &sh73a0_extcki_clk,
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static struct clk div6_clks[DIV6_NR] = {
 | 
	
		
			
				|  |  | +	[DIV6_VCK1] = SH_CLK_DIV6_EXT(VCLKCR1, 0,
 | 
	
		
			
				|  |  | +			vck_parent, ARRAY_SIZE(vck_parent), 12, 3),
 | 
	
		
			
				|  |  | +	[DIV6_VCK2] = SH_CLK_DIV6_EXT(VCLKCR2, 0,
 | 
	
		
			
				|  |  | +			vck_parent, ARRAY_SIZE(vck_parent), 12, 3),
 | 
	
		
			
				|  |  | +	[DIV6_VCK3] = SH_CLK_DIV6_EXT(VCLKCR3, 0,
 | 
	
		
			
				|  |  | +			vck_parent, ARRAY_SIZE(vck_parent), 12, 3),
 | 
	
		
			
				|  |  | +	[DIV6_ZB1] = SH_CLK_DIV6_EXT(ZBCKCR, CLK_ENABLE_ON_INIT,
 | 
	
		
			
				|  |  | +			pll_parent, ARRAY_SIZE(pll_parent), 7, 1),
 | 
	
		
			
				|  |  | +	[DIV6_FLCTL] = SH_CLK_DIV6_EXT(FLCKCR, 0,
 | 
	
		
			
				|  |  | +			pll_parent, ARRAY_SIZE(pll_parent), 7, 1),
 | 
	
		
			
				|  |  | +	[DIV6_SDHI0] = SH_CLK_DIV6_EXT(SD0CKCR, 0,
 | 
	
		
			
				|  |  | +			pll_parent, ARRAY_SIZE(pll_parent), 6, 2),
 | 
	
		
			
				|  |  | +	[DIV6_SDHI1] = SH_CLK_DIV6_EXT(SD1CKCR, 0,
 | 
	
		
			
				|  |  | +			pll_parent, ARRAY_SIZE(pll_parent), 6, 2),
 | 
	
		
			
				|  |  | +	[DIV6_SDHI2] = SH_CLK_DIV6_EXT(SD2CKCR, 0,
 | 
	
		
			
				|  |  | +			pll_parent, ARRAY_SIZE(pll_parent), 6, 2),
 | 
	
		
			
				|  |  | +	[DIV6_FSIA] = SH_CLK_DIV6_EXT(FSIACKCR, 0,
 | 
	
		
			
				|  |  | +			pll_parent, ARRAY_SIZE(pll_parent), 6, 1),
 | 
	
		
			
				|  |  | +	[DIV6_FSIB] = SH_CLK_DIV6_EXT(FSIBCKCR, 0,
 | 
	
		
			
				|  |  | +			pll_parent, ARRAY_SIZE(pll_parent), 6, 1),
 | 
	
		
			
				|  |  | +	[DIV6_SUB] = SH_CLK_DIV6_EXT(SUBCKCR, 0,
 | 
	
		
			
				|  |  | +			pll_extal2_parent, ARRAY_SIZE(pll_extal2_parent), 6, 2),
 | 
	
		
			
				|  |  | +	[DIV6_SPUA] = SH_CLK_DIV6_EXT(SPUACKCR, 0,
 | 
	
		
			
				|  |  | +			pll_extal2_parent, ARRAY_SIZE(pll_extal2_parent), 6, 2),
 | 
	
		
			
				|  |  | +	[DIV6_SPUV] = SH_CLK_DIV6_EXT(SPUVCKCR, 0,
 | 
	
		
			
				|  |  | +			pll_extal2_parent, ARRAY_SIZE(pll_extal2_parent), 6, 2),
 | 
	
		
			
				|  |  | +	[DIV6_MSU] = SH_CLK_DIV6_EXT(MSUCKCR, 0,
 | 
	
		
			
				|  |  | +			pll_parent, ARRAY_SIZE(pll_parent), 7, 1),
 | 
	
		
			
				|  |  | +	[DIV6_HSI] = SH_CLK_DIV6_EXT(HSICKCR, 0,
 | 
	
		
			
				|  |  | +			hsi_parent, ARRAY_SIZE(hsi_parent), 6, 2),
 | 
	
		
			
				|  |  | +	[DIV6_MFG1] = SH_CLK_DIV6_EXT(MFCK1CR, 0,
 | 
	
		
			
				|  |  | +			pll_parent, ARRAY_SIZE(pll_parent), 7, 1),
 | 
	
		
			
				|  |  | +	[DIV6_MFG2] = SH_CLK_DIV6_EXT(MFCK2CR, 0,
 | 
	
		
			
				|  |  | +			pll_parent, ARRAY_SIZE(pll_parent), 7, 1),
 | 
	
		
			
				|  |  | +	[DIV6_DSIT] = SH_CLK_DIV6_EXT(DSITCKCR, 0,
 | 
	
		
			
				|  |  | +			pll_parent, ARRAY_SIZE(pll_parent), 7, 1),
 | 
	
		
			
				|  |  | +	[DIV6_DSI0P] = SH_CLK_DIV6_EXT(DSI0PCKCR, 0,
 | 
	
		
			
				|  |  | +			dsi_parent, ARRAY_SIZE(dsi_parent), 12, 3),
 | 
	
		
			
				|  |  | +	[DIV6_DSI1P] = SH_CLK_DIV6_EXT(DSI1PCKCR, 0,
 | 
	
		
			
				|  |  | +			dsi_parent, ARRAY_SIZE(dsi_parent), 12, 3),
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/* DSI DIV */
 | 
	
		
			
				|  |  | +static unsigned long dsiphy_recalc(struct clk *clk)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	u32 value;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	value = __raw_readl(clk->mapping->base);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	/* FIXME */
 | 
	
		
			
				|  |  | +	if (!(value & 0x000B8000))
 | 
	
		
			
				|  |  | +		return clk->parent->rate;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	value &= 0x3f;
 | 
	
		
			
				|  |  | +	value += 1;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if ((value < 12) ||
 | 
	
		
			
				|  |  | +	    (value > 33)) {
 | 
	
		
			
				|  |  | +		pr_err("DSIPHY has wrong value (%d)", value);
 | 
	
		
			
				|  |  | +		return 0;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	return clk->parent->rate / value;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static long dsiphy_round_rate(struct clk *clk, unsigned long rate)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	return clk_rate_mult_range_round(clk, 12, 33, rate);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static void dsiphy_disable(struct clk *clk)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	u32 value;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	value = __raw_readl(clk->mapping->base);
 | 
	
		
			
				|  |  | +	value &= ~0x000B8000;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	__raw_writel(value , clk->mapping->base);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static int dsiphy_enable(struct clk *clk)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	u32 value;
 | 
	
		
			
				|  |  | +	int multi;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	value = __raw_readl(clk->mapping->base);
 | 
	
		
			
				|  |  | +	multi = (value & 0x3f) + 1;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if ((multi < 12) || (multi > 33))
 | 
	
		
			
				|  |  | +		return -EIO;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	__raw_writel(value | 0x000B8000, clk->mapping->base);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	return 0;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static int dsiphy_set_rate(struct clk *clk, unsigned long rate)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	u32 value;
 | 
	
		
			
				|  |  | +	int idx;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	idx = rate / clk->parent->rate;
 | 
	
		
			
				|  |  | +	if ((idx < 12) || (idx > 33))
 | 
	
		
			
				|  |  | +		return -EINVAL;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	idx += -1;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	value = __raw_readl(clk->mapping->base);
 | 
	
		
			
				|  |  | +	value = (value & ~0x3f) + idx;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	__raw_writel(value, clk->mapping->base);
 |