u32 parent_con;
};
-#define CODEC_PLL(_mhz, _parent, band, nr, nf, no) \
+#define CODEC_PLL(_khz, _parent, band, nr, nf, no) \
{ \
- .rate = _mhz * MHZ, \
+ .rate = _khz * KHZ, \
.pll_con = PLL_##band##_BAND | PLL_CLKR(nr) | PLL_CLKF(nf) | PLL_NO_##no, \
.parent_con = CODEC_PLL_PARENT_XIN##_parent##M, \
}
static const struct codec_pll_set codec_pll[] = {
- // rate parent band NR NF NO
- CODEC_PLL(108, 24, LOW, 1, 18, 4), // for TV
- CODEC_PLL(648, 24, HIGH, 1, 27, 1),
- CODEC_PLL(297, 27, LOW, 1, 22, 2), // for HDMI
- CODEC_PLL(594, 27, HIGH, 1, 22, 1),
- CODEC_PLL(300, 24, LOW, 1, 25, 2), // for GPU
- CODEC_PLL(360, 24, LOW, 1, 15, 1),
- CODEC_PLL(408, 24, LOW, 1, 17, 1),
- CODEC_PLL(456, 24, LOW, 1, 19, 1),
- CODEC_PLL(504, 24, LOW, 1, 21, 1),
- CODEC_PLL(552, 24, LOW, 1, 23, 1),
- CODEC_PLL(600, 24, HIGH, 1, 25, 1),
+ // rate parent band NR NF NO
+ CODEC_PLL(108000, 24, LOW, 1, 18, 4), // for TV
+ CODEC_PLL(648000, 24, HIGH, 1, 27, 1),
+ CODEC_PLL(297000, 27, LOW, 1, 22, 2), // for HDMI
+ CODEC_PLL(445500, 27, LOW, 2, 33, 1),
+ CODEC_PLL(594000, 27, HIGH, 1, 22, 1),
+ CODEC_PLL(300000, 24, LOW, 1, 25, 2), // for GPU
+ CODEC_PLL(360000, 24, LOW, 1, 15, 1),
+ CODEC_PLL(408000, 24, LOW, 1, 17, 1),
+ CODEC_PLL(456000, 24, LOW, 1, 19, 1),
+ CODEC_PLL(504000, 24, LOW, 1, 21, 1),
+ CODEC_PLL(552000, 24, LOW, 1, 23, 1),
+ CODEC_PLL(600000, 24, HIGH, 1, 25, 1),
};
static int codec_pll_clk_set_rate(struct clk *clk, unsigned long rate)
static int i2s_set_rate(struct clk *clk, unsigned long rate)
{
- int ret;
+ int ret = 0;
struct clk *parent;
if (rate == 12 * MHZ) {
return ret;
}
if (clk->parent != parent)
- clk_set_parent_nolock(clk, parent);
+ ret = clk_set_parent_nolock(clk, parent);
return ret;
}
static int clk_uart_set_rate(struct clk *clk, unsigned long rate)
{
- int ret;
+ int ret = 0;
struct clk *parent;
struct clk *clk_div = clk->parents[0];
}
if (clk->parent != parent)
- clk_set_parent_nolock(clk, parent);
+ ret = clk_set_parent_nolock(clk, parent);
- return 0;
+ return ret;
}
static int clk_uart_frac_div_set_rate(struct clk *clk, unsigned long rate)
};
+static int dclk_lcdc_div_set_rate(struct clk *clk, unsigned long rate)
+{
+ struct clk *parent;
+
+ switch (rate) {
+ case 27000 * KHZ:
+ case 74250 * KHZ:
+ case 148500 * KHZ:
+ case 297 * MHZ:
+ case 594 * MHZ:
+ parent = &codec_pll_clk;
+ break;
+ default:
+ parent = &general_pll_clk;
+ break;
+ }
+ if (clk->parent != parent)
+ clk_set_parent_nolock(clk, parent);
+
+ return clksel_set_rate_div(clk, rate);
+}
+
static struct clk *dclk_lcdc_div_parents[4] = { &codec_pll_clk, &ddr_pll_clk, &general_pll_clk, &arm_pll_clk };
static struct clk dclk_lcdc_div = {
.name = "dclk_lcdc_div",
.recalc = clksel_recalc_div,
- .set_rate = clksel_set_rate_div,
+ .set_rate = dclk_lcdc_div_set_rate,
.clksel_con = CRU_CLKSEL16_CON,
.clksel_mask = 0xFF,
.clksel_shift = 2,
.parents = dclk_lcdc_div_parents,
};
+static int dclk_lcdc_set_rate(struct clk *clk, unsigned long rate)
+{
+ int ret = 0;
+ struct clk *parent;
+
+ if (rate == 27 * MHZ && has_xin27m) {
+ parent = &xin27m;
+ } else {
+ parent = &dclk_lcdc_div;
+ ret = clk_set_rate_nolock(parent, rate);
+ if (ret)
+ return ret;
+ }
+ if (clk->parent != parent)
+ ret = clk_set_parent_nolock(clk, parent);
+
+ return ret;
+}
+
static struct clk *dclk_lcdc_parents[2] = { &dclk_lcdc_div, &xin27m };
static struct clk dclk_lcdc = {
.name = "dclk_lcdc",
.mode = gate_mode,
+ .set_rate = dclk_lcdc_set_rate,
.gate_idx = CLK_GATE_DCLK_LCDC,
.clksel_con = CRU_CLKSEL16_CON,
.clksel_parent_mask = 1,
clk_set_parent_nolock(&clk_i2s1_div, &general_pll_clk);
clk_set_parent_nolock(&clk_spdif_div, &general_pll_clk);
clk_set_parent_nolock(&clk_spi_src, &general_pll_clk);
+ clk_set_rate_nolock(&clk_spi0, 40 * MHZ);
+ clk_set_rate_nolock(&clk_spi1, 40 * MHZ);
clk_set_parent_nolock(&clk_mmc_src, &general_pll_clk);
clk_set_parent_nolock(&clk_uart01_src, &general_pll_clk);
clk_set_parent_nolock(&clk_uart23_src, &general_pll_clk);
rk29_clock_common_init(ppll_rate, cpll_rate);
- printk(KERN_INFO "Clocking rate (apll/dpll/cpll/gpll/core/aclk_cpu/hclk_cpu/pclk_cpu/aclk_periph/hclk_periph/pclk_periph): %ld/%ld/%ld/%ld/%ld/%ld/%ld/%ld/%ld/%ld/%ld MHz\n",
+ printk(KERN_INFO "Clocking rate (apll/dpll/cpll/gpll/core/aclk_cpu/hclk_cpu/pclk_cpu/aclk_periph/hclk_periph/pclk_periph): %ld/%ld/%ld/%ld/%ld/%ld/%ld/%ld/%ld/%ld/%ld MHz (20110617)\n",
arm_pll_clk.rate / MHZ, ddr_pll_clk.rate / MHZ, codec_pll_clk.rate / MHZ, general_pll_clk.rate / MHZ, clk_core.rate / MHZ,
aclk_cpu.rate / MHZ, hclk_cpu.rate / MHZ, pclk_cpu.rate / MHZ, aclk_periph.rate / MHZ, hclk_periph.rate / MHZ, pclk_periph.rate / MHZ);
}
void __init rk29_clock_init(enum periph_pll ppll_rate)
{
- rk29_clock_init2(ppll_rate, codec_pll_594mhz, true);
+ rk29_clock_init2(ppll_rate, codec_pll_445mhz, true);
}
#ifdef CONFIG_PROC_FS
struct clk *clk;
struct clk *dclk; //lcdc dclk
- struct clk *dclk_parent; //lcdc dclk divider frequency source
- struct clk *dclk_divider; //lcdc demodulator divider frequency
struct clk *aclk; //lcdc share memory frequency
struct clk *aclk_parent; //lcdc aclk divider frequency source
struct clk *aclk_ddr_lcdc; //DDR LCDC AXI clock disable.
printk(KERN_ERR "failed to get lcd dclock source\n");
return ;
}
- inf->dclk_divider= clk_get(NULL, "dclk_lcdc_div");
- if (IS_ERR(inf->dclk_divider))
- {
- printk(KERN_ERR "failed to get lcd clock lcdc_divider source \n");
- return ;
- }
-
- if((inf->cur_screen->type == SCREEN_HDMI) || (inf->cur_screen->type == SCREEN_TVOUT)){
- inf->dclk_parent = clk_get(NULL, "codec_pll");
- } else {
- inf->dclk_parent = clk_get(NULL, "general_pll");
- }
-
- if (IS_ERR(inf->dclk_parent))
- {
- printk(KERN_ERR "failed to get lcd dclock parent source\n");
- return;
- }
inf->aclk = clk_get(NULL, "aclk_lcdc");
if (IS_ERR(inf->aclk))
return;
}
inf->aclk_parent = clk_get(NULL, "ddr_pll");//general_pll //ddr_pll
- if (IS_ERR(inf->dclk_parent))
+ if (IS_ERR(inf->aclk_parent))
{
- printk(KERN_ERR "failed to get lcd dclock parent source\n");
+ printk(KERN_ERR "failed to get lcd clock parent source\n");
return ;
}
clk_disable(inf->hclk_cpu_display);
clk_disable(inf->clk);
- clk_set_parent(inf->dclk_divider, inf->dclk_parent);
- clk_set_parent(inf->dclk, inf->dclk_divider);
ret = clk_set_parent(inf->aclk, inf->aclk_parent);
fbprintk(">>>>>> set lcdc dclk need %d HZ, clk_parent = %d hz ret =%d\n ", screen->pixclock, screen->lcdc_aclk, ret);
- ret = clk_set_rate(inf->dclk_divider, screen->pixclock);
+ ret = clk_set_rate(inf->dclk, screen->pixclock);
if(ret)
{
- printk(KERN_ERR ">>>>>> set lcdc dclk_divider faild \n ");
+ printk(KERN_ERR ">>>>>> set lcdc dclk failed\n");
}
if(screen->lcdc_aclk){
}
ret = clk_set_rate(inf->aclk, aclk_rate);
if(ret){
- printk(KERN_ERR ">>>>>> set lcdc dclk_divider faild \n ");
+ printk(KERN_ERR ">>>>>> set lcdc aclk failed\n");
}
clk_enable(inf->aclk_ddr_lcdc);
CHK_SUSPEND(inf);
if((var->rotate == 270)||(var->rotate == 90))
{
- #if CONFIG_FB_ROTATE_VIDEO
+ #ifdef CONFIG_FB_ROTATE_VIDEO
xpos = (var->nonstd>>20) & 0xfff; //visiable pos in panel
ypos = (var->nonstd>>8) & 0xfff;
xsize = (var->grayscale>>20) & 0xfff; //visiable size in panel
}
wq_condition2 = 0;
-#if CONFIG_FB_ROTATE_VIDEO
+#ifdef CONFIG_FB_ROTATE_VIDEO
//need refresh ,zyc add
if((has_set_rotate == true) && (last_yuv_phy[0] != 0) && (last_yuv_phy[1] != 0))
{
par->addr_seted = 0;
inf->video_mode = 1;
wq_condition2 = 1;
-#if CONFIG_FB_ROTATE_VIDEO
+#ifdef CONFIG_FB_ROTATE_VIDEO
//reinitialize the var when open,zyc
last_yuv_phy[0] = 0;
last_yuv_phy[1] = 0;