int am335xfb_init(struct am335x_lcdpanel *panel) { if (0 == gd->fb_base) { printf("ERROR: no valid fb_base stored in GLOBAL_DATA_PTR!\n"); return -1; } if (0 == panel) { printf("ERROR: missing ptr to am335x_lcdpanel!\n"); return -1; } debug("setting up LCD-Controller for %dx%dx%d (hfp=%d,hbp=%d,hsw=%d / ", panel->hactive, panel->vactive, panel->bpp, panel->hfp, panel->hbp, panel->hsw); debug("vfp=%d,vbp=%d,vsw=%d / clk-div=%d)\n", panel->vfp, panel->vfp, panel->vsw, panel->pxl_clk_div); debug("using frambuffer at 0x%08x with size %d.\n", (unsigned int)gd->fb_base, FBSIZE(panel)); /* palette default entry */ memset((void *)gd->fb_base, 0, 0x20); *(unsigned int *)gd->fb_base = 0x4000; lcdhw->clkc_enable = LCD_CORECLKEN | LCD_LIDDCLKEN | LCD_DMACLKEN; lcdhw->raster_ctrl = 0; lcdhw->ctrl = LCD_CLK_DIVISOR(panel->pxl_clk_div) | LCD_RASTER_MODE; lcdhw->lcddma_fb0_base = gd->fb_base; lcdhw->lcddma_fb0_ceiling = gd->fb_base + FBSIZE(panel) + 0x20; lcdhw->lcddma_fb1_base = gd->fb_base; lcdhw->lcddma_fb1_ceiling = gd->fb_base + FBSIZE(panel) + 0x20; lcdhw->lcddma_ctrl = LCD_DMA_BURST_SIZE(LCD_DMA_BURST_16); lcdhw->raster_timing0 = LCD_HORLSB(panel->hactive) | LCD_HORMSB(panel->hactive) | LCD_HFPLSB(panel->hfp) | LCD_HBPLSB(panel->hbp) | LCD_HSWLSB(panel->hsw); lcdhw->raster_timing1 = LCD_VBP(panel->vbp) | LCD_VFP(panel->vfp) | LCD_VSW(panel->vsw) | LCD_VERLSB(panel->vactive); lcdhw->raster_timing2 = LCD_HSWMSB(panel->hsw) | LCD_VERMSB(panel->vactive) | LCD_INVMASK(panel->pol) | LCD_HBPMSB(panel->hbp) | LCD_HFPMSB(panel->hfp) | 0x0000FF00; /* clk cycles for ac-bias */ lcdhw->raster_ctrl = LCD_TFT_24BPP_MODE | LCD_TFT_24BPP_UNPACK | LCD_PALMODE_RAWDATA | LCD_TFT_MODE | LCD_RASTER_ENABLE; gd->fb_base += 0x20; /* point fb behind palette */ /* turn ON display through powercontrol function if accessible */ if (0 != panel->panel_power_ctrl) { mdelay(panel->pon_delay); panel->panel_power_ctrl(1); } return 0; }
int am335xfb_init(struct am335x_lcdpanel *panel) { u32 raster_ctrl = 0; if (0 == gd->fb_base) { printf("ERROR: no valid fb_base stored in GLOBAL_DATA_PTR!\n"); return -1; } if (0 == panel) { printf("ERROR: missing ptr to am335x_lcdpanel!\n"); return -1; } /* We can already set the bits for the raster_ctrl in this check */ switch (panel->bpp) { case 16: break; case 32: raster_ctrl |= LCD_TFT_24BPP_UNPACK; /* fallthrough */ case 24: raster_ctrl |= LCD_TFT_24BPP_MODE; break; default: error("am335x-fb: invalid bpp value: %d\n", panel->bpp); return -1; } debug("setting up LCD-Controller for %dx%dx%d (hfp=%d,hbp=%d,hsw=%d / ", panel->hactive, panel->vactive, panel->bpp, panel->hfp, panel->hbp, panel->hsw); debug("vfp=%d,vbp=%d,vsw=%d / clk-div=%d)\n", panel->vfp, panel->vfp, panel->vsw, panel->pxl_clk_div); debug("using frambuffer at 0x%08x with size %d.\n", (unsigned int)gd->fb_base, FBSIZE(panel)); /* palette default entry */ memset((void *)gd->fb_base, 0, 0x20); *(unsigned int *)gd->fb_base = 0x4000; /* point fb behind palette */ gd->fb_base += 0x20; /* turn ON display through powercontrol function if accessible */ if (0 != panel->panel_power_ctrl) panel->panel_power_ctrl(1); debug("am335x-fb: wait for stable power ...\n"); mdelay(panel->pup_delay); lcdhw->clkc_enable = LCD_CORECLKEN | LCD_LIDDCLKEN | LCD_DMACLKEN; lcdhw->raster_ctrl = 0; lcdhw->ctrl = LCD_CLK_DIVISOR(panel->pxl_clk_div) | LCD_RASTER_MODE; lcdhw->lcddma_fb0_base = gd->fb_base; lcdhw->lcddma_fb0_ceiling = gd->fb_base + FBSIZE(panel); lcdhw->lcddma_fb1_base = gd->fb_base; lcdhw->lcddma_fb1_ceiling = gd->fb_base + FBSIZE(panel); lcdhw->lcddma_ctrl = LCD_DMA_BURST_SIZE(LCD_DMA_BURST_16); lcdhw->raster_timing0 = LCD_HORLSB(panel->hactive) | LCD_HORMSB(panel->hactive) | LCD_HFPLSB(panel->hfp) | LCD_HBPLSB(panel->hbp) | LCD_HSWLSB(panel->hsw); lcdhw->raster_timing1 = LCD_VBP(panel->vbp) | LCD_VFP(panel->vfp) | LCD_VSW(panel->vsw) | LCD_VERLSB(panel->vactive); lcdhw->raster_timing2 = LCD_HSWMSB(panel->hsw) | LCD_VERMSB(panel->vactive) | LCD_INVMASK(panel->pol) | LCD_HBPMSB(panel->hbp) | LCD_HFPMSB(panel->hfp) | 0x0000FF00; /* clk cycles for ac-bias */ lcdhw->raster_ctrl = raster_ctrl | LCD_PALMODE_RAWDATA | LCD_TFT_MODE | LCD_RASTER_ENABLE; debug("am335x-fb: waiting picture to be stable.\n."); mdelay(panel->pon_delay); return 0; }