clk: rockchip: rk3288: add clk_set_default

support aclk_vio\hclk_vio clk setting.

Change-Id: Ie826c770670598161f22208f504d8762b8597811
Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>
This commit is contained in:
Elaine Zhang 2019-01-24 11:11:19 +08:00 committed by Kever Yang
parent 544e79360d
commit 5561190119
3 changed files with 46 additions and 26 deletions

View File

@ -25,6 +25,8 @@
#define PERI_HCLK_HZ 148500000
#define PERI_PCLK_HZ 74250000
#define HCLK_VIO_HZ 100000000
/* Private data for the clock driver - used by rockchip_get_cru() */
struct rk3288_clk_priv {
struct rk3288_grf *grf;
@ -155,6 +157,12 @@ enum {
DCLK_VOP0_SELECT_NPLL = 2,
};
/* CRU_CLKSEL28_CON */
enum {
HCLK_VIO_DIV_SHIFT = 8,
HCLK_VIO_DIV_MASK = 0x1f << HCLK_VIO_DIV_SHIFT,
};
/* CRU_CLKSEL29_CON */
enum {
DCLK_VOP1_DIV_SHIFT = 8,
@ -168,17 +176,17 @@ enum {
/* CRU_CLKSEL31_CON */
enum {
ACLK_VOP_SELECT_CPLL = 0,
ACLK_VOP_SELECT_GPLL = 1,
ACLK_VOP_SELECT_USB480 = 2,
ACLK_VOP1_PLL_SHIFT = 14,
ACLK_VOP1_PLL_MASK = 3 << ACLK_VOP1_PLL_SHIFT,
ACLK_VOP1_DIV_SHIFT = 8,
ACLK_VOP1_DIV_MASK = 0x1f << ACLK_VOP1_DIV_SHIFT,
ACLK_VOP0_PLL_SHIFT = 6,
ACLK_VOP0_PLL_MASK = 3 << ACLK_VOP0_PLL_SHIFT,
ACLK_VOP0_DIV_SHIFT = 0,
ACLK_VOP0_DIV_MASK = 0x1f << ACLK_VOP0_DIV_SHIFT,
ACLK_VIO_SELECT_CPLL = 0,
ACLK_VIO_SELECT_GPLL = 1,
ACLK_VIO_SELECT_USB480 = 2,
ACLK_VIO1_PLL_SHIFT = 14,
ACLK_VIO1_PLL_MASK = 3 << ACLK_VIO1_PLL_SHIFT,
ACLK_VIO1_DIV_SHIFT = 8,
ACLK_VIO1_DIV_MASK = 0x1f << ACLK_VIO1_DIV_SHIFT,
ACLK_VIO0_PLL_SHIFT = 6,
ACLK_VIO0_PLL_MASK = 3 << ACLK_VIO0_PLL_SHIFT,
ACLK_VIO0_DIV_SHIFT = 0,
ACLK_VIO0_DIV_MASK = 0x1f << ACLK_VIO0_DIV_SHIFT,
};
/* CRU_CLKSEL37_CON */

View File

@ -406,7 +406,7 @@ static int rockchip_vop_set_clk(struct rk3288_cru *cru, struct rk3288_grf *grf,
struct pll_div cpll_config = {0};
u32 lcdc_div, parent;
int ret;
unsigned int gpll_rate, npll_rate, cpll_rate;
unsigned int gpll_rate, npll_rate;
gpll_rate = rkclk_pll_get_rate(cru, CLK_GENERAL);
npll_rate = rkclk_pll_get_rate(cru, CLK_NEW);
@ -488,21 +488,24 @@ static int rockchip_vop_set_clk(struct rk3288_cru *cru, struct rk3288_grf *grf,
((lcdc_div - 1) << DCLK_VOP1_DIV_SHIFT) |
(parent << DCLK_VOP1_PLL_SHIFT));
break;
case ACLK_VOP0:
cpll_rate = rkclk_pll_get_rate(cru, CLK_CODEC);
lcdc_div = DIV_ROUND_UP(cpll_rate, rate_hz);
case ACLK_VIO0:
lcdc_div = DIV_ROUND_UP(gpll_rate, rate_hz);
rk_clrsetreg(&cru->cru_clksel_con[31],
ACLK_VOP0_PLL_MASK | ACLK_VOP0_DIV_MASK,
ACLK_VOP_SELECT_CPLL << ACLK_VOP0_PLL_SHIFT |
(lcdc_div - 1) << ACLK_VOP0_DIV_SHIFT);
ACLK_VIO0_PLL_MASK | ACLK_VIO0_DIV_MASK,
ACLK_VIO_SELECT_GPLL << ACLK_VIO0_PLL_SHIFT |
(lcdc_div - 1) << ACLK_VIO0_DIV_SHIFT);
break;
case ACLK_VOP1:
cpll_rate = rkclk_pll_get_rate(cru, CLK_CODEC);
lcdc_div = DIV_ROUND_UP(cpll_rate, rate_hz);
case ACLK_VIO1:
lcdc_div = DIV_ROUND_UP(gpll_rate, rate_hz);
rk_clrsetreg(&cru->cru_clksel_con[31],
ACLK_VOP1_PLL_MASK | ACLK_VOP1_DIV_MASK,
ACLK_VOP_SELECT_CPLL << ACLK_VOP1_PLL_SHIFT |
(lcdc_div - 1) << ACLK_VOP1_DIV_SHIFT);
ACLK_VIO1_PLL_MASK | ACLK_VIO1_DIV_MASK,
ACLK_VIO_SELECT_GPLL << ACLK_VIO1_PLL_SHIFT |
(lcdc_div - 1) << ACLK_VIO1_DIV_SHIFT);
lcdc_div = DIV_ROUND_UP(rate_hz, HCLK_VIO_HZ);
rk_clrsetreg(&cru->cru_clksel_con[28],
HCLK_VIO_DIV_MASK,
(lcdc_div - 1) << HCLK_VIO_DIV_SHIFT);
break;
}
@ -956,8 +959,8 @@ static ulong rk3288_clk_set_rate(struct clk *clk, ulong rate)
break;
case DCLK_VOP0:
case DCLK_VOP1:
case ACLK_VOP0:
case ACLK_VOP1:
case ACLK_VIO0:
case ACLK_VIO1:
new_rate = rockchip_vop_set_clk(cru, priv->grf, clk->id, rate);
break;
case SCLK_EDP_24M:
@ -1244,6 +1247,7 @@ static int rk3288_clk_probe(struct udevice *dev)
{
struct rk3288_clk_priv *priv = dev_get_priv(dev);
bool init_clocks = false;
int ret;
priv->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
if (IS_ERR(priv->grf))
@ -1287,6 +1291,12 @@ static int rk3288_clk_probe(struct udevice *dev)
priv->armclk_init_hz = priv->armclk_enter_hz;
}
ret = clk_set_defaults(dev);
if (ret)
debug("%s clk_set_defaults failed %d\n", __func__, ret);
else
priv->sync_kernel = true;
return 0;
}

View File

@ -105,6 +105,8 @@
#define ACLK_VCODEC 208
#define ACLK_CPU 209
#define ACLK_PERI 210
#define ACLK_VIO0 211
#define ACLK_VIO1 212
/* pclk gates */
#define PCLK_GPIO0 320