|
|
|
@ -73,6 +73,8 @@ struct gen3_clk_priv { |
|
|
|
|
struct clk clk_extal; |
|
|
|
|
struct clk clk_extalr; |
|
|
|
|
const struct rcar_gen3_cpg_pll_config *cpg_pll_config; |
|
|
|
|
const struct cpg_core_clk *core_clk; |
|
|
|
|
u32 core_clk_size; |
|
|
|
|
const struct mssr_mod_clk *mod_clk; |
|
|
|
|
u32 mod_clk_size; |
|
|
|
|
}; |
|
|
|
@ -181,7 +183,7 @@ enum clk_ids { |
|
|
|
|
MOD_CLK_BASE |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static const struct cpg_core_clk gen3_core_clks[] = { |
|
|
|
|
static const struct cpg_core_clk r8a7795_core_clks[] = { |
|
|
|
|
/* External Clock Inputs */ |
|
|
|
|
DEF_INPUT("extal", CLK_EXTAL), |
|
|
|
|
DEF_INPUT("extalr", CLK_EXTALR), |
|
|
|
@ -203,38 +205,38 @@ static const struct cpg_core_clk gen3_core_clks[] = { |
|
|
|
|
DEF_FIXED(".sdsrc", CLK_SDSRC, CLK_PLL1_DIV2, 2, 1), |
|
|
|
|
|
|
|
|
|
/* Core Clock Outputs */ |
|
|
|
|
DEF_FIXED("ztr", R8A7796_CLK_ZTR, CLK_PLL1_DIV2, 6, 1), |
|
|
|
|
DEF_FIXED("ztrd2", R8A7796_CLK_ZTRD2, CLK_PLL1_DIV2, 12, 1), |
|
|
|
|
DEF_FIXED("zt", R8A7796_CLK_ZT, CLK_PLL1_DIV2, 4, 1), |
|
|
|
|
DEF_FIXED("zx", R8A7796_CLK_ZX, CLK_PLL1_DIV2, 2, 1), |
|
|
|
|
DEF_FIXED("s0d1", R8A7796_CLK_S0D1, CLK_S0, 1, 1), |
|
|
|
|
DEF_FIXED("s0d2", R8A7796_CLK_S0D2, CLK_S0, 2, 1), |
|
|
|
|
DEF_FIXED("s0d3", R8A7796_CLK_S0D3, CLK_S0, 3, 1), |
|
|
|
|
DEF_FIXED("s0d4", R8A7796_CLK_S0D4, CLK_S0, 4, 1), |
|
|
|
|
DEF_FIXED("s0d6", R8A7796_CLK_S0D6, CLK_S0, 6, 1), |
|
|
|
|
DEF_FIXED("s0d8", R8A7796_CLK_S0D8, CLK_S0, 8, 1), |
|
|
|
|
DEF_FIXED("s0d12", R8A7796_CLK_S0D12, CLK_S0, 12, 1), |
|
|
|
|
DEF_FIXED("s1d1", R8A7796_CLK_S1D1, CLK_S1, 1, 1), |
|
|
|
|
DEF_FIXED("s1d2", R8A7796_CLK_S1D2, CLK_S1, 2, 1), |
|
|
|
|
DEF_FIXED("s1d4", R8A7796_CLK_S1D4, CLK_S1, 4, 1), |
|
|
|
|
DEF_FIXED("s2d1", R8A7796_CLK_S2D1, CLK_S2, 1, 1), |
|
|
|
|
DEF_FIXED("s2d2", R8A7796_CLK_S2D2, CLK_S2, 2, 1), |
|
|
|
|
DEF_FIXED("s2d4", R8A7796_CLK_S2D4, CLK_S2, 4, 1), |
|
|
|
|
DEF_FIXED("s3d1", R8A7796_CLK_S3D1, CLK_S3, 1, 1), |
|
|
|
|
DEF_FIXED("s3d2", R8A7796_CLK_S3D2, CLK_S3, 2, 1), |
|
|
|
|
DEF_FIXED("s3d4", R8A7796_CLK_S3D4, CLK_S3, 4, 1), |
|
|
|
|
|
|
|
|
|
DEF_GEN3_SD("sd0", R8A7796_CLK_SD0, CLK_SDSRC, 0x074), |
|
|
|
|
DEF_GEN3_SD("sd1", R8A7796_CLK_SD1, CLK_SDSRC, 0x078), |
|
|
|
|
DEF_GEN3_SD("sd2", R8A7796_CLK_SD2, CLK_SDSRC, 0x268), |
|
|
|
|
DEF_GEN3_SD("sd3", R8A7796_CLK_SD3, CLK_SDSRC, 0x26c), |
|
|
|
|
|
|
|
|
|
DEF_FIXED("cl", R8A7796_CLK_CL, CLK_PLL1_DIV2, 48, 1), |
|
|
|
|
DEF_FIXED("cp", R8A7796_CLK_CP, CLK_EXTAL, 2, 1), |
|
|
|
|
DEF_FIXED("ztr", R8A7795_CLK_ZTR, CLK_PLL1_DIV2, 6, 1), |
|
|
|
|
DEF_FIXED("ztrd2", R8A7795_CLK_ZTRD2, CLK_PLL1_DIV2, 12, 1), |
|
|
|
|
DEF_FIXED("zt", R8A7795_CLK_ZT, CLK_PLL1_DIV2, 4, 1), |
|
|
|
|
DEF_FIXED("zx", R8A7795_CLK_ZX, CLK_PLL1_DIV2, 2, 1), |
|
|
|
|
DEF_FIXED("s0d1", R8A7795_CLK_S0D1, CLK_S0, 1, 1), |
|
|
|
|
DEF_FIXED("s0d2", R8A7795_CLK_S0D2, CLK_S0, 2, 1), |
|
|
|
|
DEF_FIXED("s0d3", R8A7795_CLK_S0D3, CLK_S0, 3, 1), |
|
|
|
|
DEF_FIXED("s0d4", R8A7795_CLK_S0D4, CLK_S0, 4, 1), |
|
|
|
|
DEF_FIXED("s0d6", R8A7795_CLK_S0D6, CLK_S0, 6, 1), |
|
|
|
|
DEF_FIXED("s0d8", R8A7795_CLK_S0D8, CLK_S0, 8, 1), |
|
|
|
|
DEF_FIXED("s0d12", R8A7795_CLK_S0D12, CLK_S0, 12, 1), |
|
|
|
|
DEF_FIXED("s1d1", R8A7795_CLK_S1D1, CLK_S1, 1, 1), |
|
|
|
|
DEF_FIXED("s1d2", R8A7795_CLK_S1D2, CLK_S1, 2, 1), |
|
|
|
|
DEF_FIXED("s1d4", R8A7795_CLK_S1D4, CLK_S1, 4, 1), |
|
|
|
|
DEF_FIXED("s2d1", R8A7795_CLK_S2D1, CLK_S2, 1, 1), |
|
|
|
|
DEF_FIXED("s2d2", R8A7795_CLK_S2D2, CLK_S2, 2, 1), |
|
|
|
|
DEF_FIXED("s2d4", R8A7795_CLK_S2D4, CLK_S2, 4, 1), |
|
|
|
|
DEF_FIXED("s3d1", R8A7795_CLK_S3D1, CLK_S3, 1, 1), |
|
|
|
|
DEF_FIXED("s3d2", R8A7795_CLK_S3D2, CLK_S3, 2, 1), |
|
|
|
|
DEF_FIXED("s3d4", R8A7795_CLK_S3D4, CLK_S3, 4, 1), |
|
|
|
|
|
|
|
|
|
DEF_GEN3_SD("sd0", R8A7795_CLK_SD0, CLK_SDSRC, 0x074), |
|
|
|
|
DEF_GEN3_SD("sd1", R8A7795_CLK_SD1, CLK_SDSRC, 0x078), |
|
|
|
|
DEF_GEN3_SD("sd2", R8A7795_CLK_SD2, CLK_SDSRC, 0x268), |
|
|
|
|
DEF_GEN3_SD("sd3", R8A7795_CLK_SD3, CLK_SDSRC, 0x26c), |
|
|
|
|
|
|
|
|
|
DEF_FIXED("cl", R8A7795_CLK_CL, CLK_PLL1_DIV2, 48, 1), |
|
|
|
|
DEF_FIXED("cp", R8A7795_CLK_CP, CLK_EXTAL, 2, 1), |
|
|
|
|
|
|
|
|
|
/* NOTE: HDMI, CSI, CAN etc. clock are missing */ |
|
|
|
|
|
|
|
|
|
DEF_BASE("r", R8A7796_CLK_R, CLK_TYPE_GEN3_R, CLK_RINT), |
|
|
|
|
DEF_BASE("r", R8A7795_CLK_R, CLK_TYPE_GEN3_R, CLK_RINT), |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static const struct mssr_mod_clk r8a7795_mod_clks[] = { |
|
|
|
@ -392,6 +394,62 @@ static const struct mssr_mod_clk r8a7795_mod_clks[] = { |
|
|
|
|
DEF_MOD("scu-src0", 1031, MOD_CLK_ID(1017)), |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static const struct cpg_core_clk r8a7796_core_clks[] = { |
|
|
|
|
/* External Clock Inputs */ |
|
|
|
|
DEF_INPUT("extal", CLK_EXTAL), |
|
|
|
|
DEF_INPUT("extalr", CLK_EXTALR), |
|
|
|
|
|
|
|
|
|
/* Internal Core Clocks */ |
|
|
|
|
DEF_BASE(".main", CLK_MAIN, CLK_TYPE_GEN3_MAIN, CLK_EXTAL), |
|
|
|
|
DEF_BASE(".pll0", CLK_PLL0, CLK_TYPE_GEN3_PLL0, CLK_MAIN), |
|
|
|
|
DEF_BASE(".pll1", CLK_PLL1, CLK_TYPE_GEN3_PLL1, CLK_MAIN), |
|
|
|
|
DEF_BASE(".pll2", CLK_PLL2, CLK_TYPE_GEN3_PLL2, CLK_MAIN), |
|
|
|
|
DEF_BASE(".pll3", CLK_PLL3, CLK_TYPE_GEN3_PLL3, CLK_MAIN), |
|
|
|
|
DEF_BASE(".pll4", CLK_PLL4, CLK_TYPE_GEN3_PLL4, CLK_MAIN), |
|
|
|
|
|
|
|
|
|
DEF_FIXED(".pll1_div2", CLK_PLL1_DIV2, CLK_PLL1, 2, 1), |
|
|
|
|
DEF_FIXED(".pll1_div4", CLK_PLL1_DIV4, CLK_PLL1_DIV2, 2, 1), |
|
|
|
|
DEF_FIXED(".s0", CLK_S0, CLK_PLL1_DIV2, 2, 1), |
|
|
|
|
DEF_FIXED(".s1", CLK_S1, CLK_PLL1_DIV2, 3, 1), |
|
|
|
|
DEF_FIXED(".s2", CLK_S2, CLK_PLL1_DIV2, 4, 1), |
|
|
|
|
DEF_FIXED(".s3", CLK_S3, CLK_PLL1_DIV2, 6, 1), |
|
|
|
|
DEF_FIXED(".sdsrc", CLK_SDSRC, CLK_PLL1_DIV2, 2, 1), |
|
|
|
|
|
|
|
|
|
/* Core Clock Outputs */ |
|
|
|
|
DEF_FIXED("ztr", R8A7796_CLK_ZTR, CLK_PLL1_DIV2, 6, 1), |
|
|
|
|
DEF_FIXED("ztrd2", R8A7796_CLK_ZTRD2, CLK_PLL1_DIV2, 12, 1), |
|
|
|
|
DEF_FIXED("zt", R8A7796_CLK_ZT, CLK_PLL1_DIV2, 4, 1), |
|
|
|
|
DEF_FIXED("zx", R8A7796_CLK_ZX, CLK_PLL1_DIV2, 2, 1), |
|
|
|
|
DEF_FIXED("s0d1", R8A7796_CLK_S0D1, CLK_S0, 1, 1), |
|
|
|
|
DEF_FIXED("s0d2", R8A7796_CLK_S0D2, CLK_S0, 2, 1), |
|
|
|
|
DEF_FIXED("s0d3", R8A7796_CLK_S0D3, CLK_S0, 3, 1), |
|
|
|
|
DEF_FIXED("s0d4", R8A7796_CLK_S0D4, CLK_S0, 4, 1), |
|
|
|
|
DEF_FIXED("s0d6", R8A7796_CLK_S0D6, CLK_S0, 6, 1), |
|
|
|
|
DEF_FIXED("s0d8", R8A7796_CLK_S0D8, CLK_S0, 8, 1), |
|
|
|
|
DEF_FIXED("s0d12", R8A7796_CLK_S0D12, CLK_S0, 12, 1), |
|
|
|
|
DEF_FIXED("s1d1", R8A7796_CLK_S1D1, CLK_S1, 1, 1), |
|
|
|
|
DEF_FIXED("s1d2", R8A7796_CLK_S1D2, CLK_S1, 2, 1), |
|
|
|
|
DEF_FIXED("s1d4", R8A7796_CLK_S1D4, CLK_S1, 4, 1), |
|
|
|
|
DEF_FIXED("s2d1", R8A7796_CLK_S2D1, CLK_S2, 1, 1), |
|
|
|
|
DEF_FIXED("s2d2", R8A7796_CLK_S2D2, CLK_S2, 2, 1), |
|
|
|
|
DEF_FIXED("s2d4", R8A7796_CLK_S2D4, CLK_S2, 4, 1), |
|
|
|
|
DEF_FIXED("s3d1", R8A7796_CLK_S3D1, CLK_S3, 1, 1), |
|
|
|
|
DEF_FIXED("s3d2", R8A7796_CLK_S3D2, CLK_S3, 2, 1), |
|
|
|
|
DEF_FIXED("s3d4", R8A7796_CLK_S3D4, CLK_S3, 4, 1), |
|
|
|
|
|
|
|
|
|
DEF_GEN3_SD("sd0", R8A7796_CLK_SD0, CLK_SDSRC, 0x074), |
|
|
|
|
DEF_GEN3_SD("sd1", R8A7796_CLK_SD1, CLK_SDSRC, 0x078), |
|
|
|
|
DEF_GEN3_SD("sd2", R8A7796_CLK_SD2, CLK_SDSRC, 0x268), |
|
|
|
|
DEF_GEN3_SD("sd3", R8A7796_CLK_SD3, CLK_SDSRC, 0x26c), |
|
|
|
|
|
|
|
|
|
DEF_FIXED("cl", R8A7796_CLK_CL, CLK_PLL1_DIV2, 48, 1), |
|
|
|
|
DEF_FIXED("cp", R8A7796_CLK_CP, CLK_EXTAL, 2, 1), |
|
|
|
|
|
|
|
|
|
/* NOTE: HDMI, CSI, CAN etc. clock are missing */ |
|
|
|
|
|
|
|
|
|
DEF_BASE("r", R8A7796_CLK_R, CLK_TYPE_GEN3_R, CLK_RINT), |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static const struct mssr_mod_clk r8a7796_mod_clks[] = { |
|
|
|
|
DEF_MOD("scif5", 202, R8A7796_CLK_S3D4), |
|
|
|
|
DEF_MOD("scif4", 203, R8A7796_CLK_S3D4), |
|
|
|
@ -648,17 +706,18 @@ static int gen3_clk_get_mod(struct clk *clk, const struct mssr_mod_clk **mssr) |
|
|
|
|
|
|
|
|
|
static int gen3_clk_get_core(struct clk *clk, const struct cpg_core_clk **core) |
|
|
|
|
{ |
|
|
|
|
struct gen3_clk_priv *priv = dev_get_priv(clk->dev); |
|
|
|
|
const unsigned long clkid = clk->id & 0xffff; |
|
|
|
|
int i; |
|
|
|
|
|
|
|
|
|
if (gen3_clk_is_mod(clk)) |
|
|
|
|
return -EINVAL; |
|
|
|
|
|
|
|
|
|
for (i = 0; i < ARRAY_SIZE(gen3_core_clks); i++) { |
|
|
|
|
if (gen3_core_clks[i].id != clkid) |
|
|
|
|
for (i = 0; i < priv->core_clk_size; i++) { |
|
|
|
|
if (priv->core_clk[i].id != clkid) |
|
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
*core = &gen3_core_clks[i]; |
|
|
|
|
*core = &priv->core_clk[i]; |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -895,6 +954,8 @@ static int gen3_clk_probe(struct udevice *dev) |
|
|
|
|
|
|
|
|
|
switch (model) { |
|
|
|
|
case CLK_R8A7795: |
|
|
|
|
priv->core_clk = r8a7795_core_clks; |
|
|
|
|
priv->core_clk_size = ARRAY_SIZE(r8a7795_core_clks); |
|
|
|
|
priv->mod_clk = r8a7795_mod_clks; |
|
|
|
|
priv->mod_clk_size = ARRAY_SIZE(r8a7795_mod_clks); |
|
|
|
|
ret = fdt_node_offset_by_compatible(gd->fdt_blob, -1, |
|
|
|
@ -903,6 +964,8 @@ static int gen3_clk_probe(struct udevice *dev) |
|
|
|
|
return ret; |
|
|
|
|
break; |
|
|
|
|
case CLK_R8A7796: |
|
|
|
|
priv->core_clk = r8a7796_core_clks; |
|
|
|
|
priv->core_clk_size = ARRAY_SIZE(r8a7796_core_clks); |
|
|
|
|
priv->mod_clk = r8a7796_mod_clks; |
|
|
|
|
priv->mod_clk_size = ARRAY_SIZE(r8a7796_mod_clks); |
|
|
|
|
ret = fdt_node_offset_by_compatible(gd->fdt_blob, -1, |
|
|
|
|