1. added dual rgb code to framebuffer driver.
2. modified board detection.
3. code clean.
Signed-off-by: daeinki <inki.dae@samsung.com>
#define J1_B2_BOARD 0x200
#define LIMO_UNIVERSAL_BOARD 0x400
#define LIMO_REAL_BOARD 0x800
+#define MEDIA_BOARD 0x1000
/* board is MACH_P1P2 and board is like below. */
#define P1_REAL_BOARD 0x200
#define P2_REAL_BOARD 0x400
-#define MEDIA_BOARD 0x1000
#define BOARD_MASK 0xF00
static int board_is_media(void)
{
- return machine_is_aquila() && (board_rev &
- (LIMO_REAL_BOARD | MEDIA_BOARD));
+ return machine_is_aquila() &&
+ board_rev & J1_B2_BOARD &&
+ board_rev & MEDIA_BOARD;
}
static int board_is_j1b2(void)
void lcd_cfg_gpio(void)
{
- unsigned int i;
+ unsigned int i, f3_end = 4;
for (i = 0; i < 8; i++) {
/* set GPF0,1,2[0:7] for RGB Interface and Data lines (32bit) */
gpio_set_rate(&gpio_base->gpio_f2, i, GPIO_DRV_SLOW);
}
- for (i =0; i < 4; i++) {
+ /* set DISPLAY_DE_B pin for dual rgb mode. */
+ if (board_is_media())
+ f3_end = 5;
+
+ for (i =0; i < f3_end; i++) {
/* set GPF3[0:3] for RGB Interface and Data lines (32bit) */
gpio_cfg_pin(&gpio_base->gpio_f3, i, GPIO_PULL_UP);
/* pull-up/down disable */
vid->vl_row = 800;
vid->vl_width = 480;
vid->vl_height = 800;
+
+ vid->dual_lcd_enabled = 0;
+
+ if (board_is_media()) {
+ vid->vl_col = 960;
+ vid->vl_row = 800;
+ vid->vl_width = 960;
+ vid->vl_height = 800;
+
+ /* enable dual lcd mode. */
+ vid->dual_lcd_enabled = 1;
+ }
+
vid->vl_clkp = CONFIG_SYS_HIGH;
vid->vl_hsp = CONFIG_SYS_LOW;
vid->vl_vsp = CONFIG_SYS_LOW;
return;
}
+static void s5pc_fimd_set_dualrgb(unsigned int enabled)
+{
+ unsigned int cfg = 0;
+
+ if (enabled) {
+ cfg = S5P_DUALRGB_BYPASS_DUAL | S5P_DUALRGB_LINESPLIT |
+ S5P_DUALRGB_VDEN_EN_ENABLE;
+
+ /* in case of Line Split mode, MAIN_CNT doesn't neet to set. */
+ cfg |= S5P_DUALRGB_SUB_CNT(pvid->vl_col/2) | S5P_DUALRGB_MAIN_CNT(0);
+ } else
+ cfg = 0;
+
+ writel(cfg, ctrl_base + S5P_DUALRGB);
+}
+
static void s5pc_fimd_set_par(unsigned int win_id)
{
unsigned int cfg = 0;
s5pc1xx_clock_init();
- max_clock = 66 * 1000000;
+ max_clock = 86 * 1000000;
+
+ if (pvid->dual_lcd_enabled)
+ pixel_clock = pvid->vl_freq * (pvid->vl_hspw + pvid->vl_hfpd +
+ pvid->vl_hbpd + pvid->vl_col / 2) * (pvid->vl_vspw +
+ pvid->vl_vfpd + pvid->vl_vbpd + pvid->vl_row);
+ else
+ pixel_clock = pvid->vl_freq * (pvid->vl_hspw + pvid->vl_hfpd +
+ pvid->vl_hbpd + pvid->vl_col) * (pvid->vl_vspw +
+ pvid->vl_vfpd + pvid->vl_vbpd + pvid->vl_row);
- pixel_clock = pvid->vl_freq * (pvid->vl_hspw + pvid->vl_hfpd +
- pvid->vl_hbpd + pvid->vl_width) * (pvid->vl_vspw +
- pvid->vl_vfpd + pvid->vl_vbpd + pvid->vl_height);
if (get_pll_clk == NULL) {
printf("get_pll_clk is null.\n");
* mpll is a parent of hclk_dsys.
*/
div = (unsigned int)((src_clock / (mpll_ratio + 1)) / pixel_clock);
+
+ /* in case of dual lcd mode. */
+ if (pvid->dual_lcd_enabled)
+ div--;
+
cfg |= S5P_VIDCON0_CLKVAL_F(div - 1);
writel(cfg, ctrl_base + S5P_VIDCON0);
/* set clock */
s5pc_fimd_set_clock();
+ /* set rgb mode to dual lcd. */
+ if (pvid->dual_lcd_enabled)
+ s5pc_fimd_set_dualrgb(1);
+ else
+ s5pc_fimd_set_dualrgb(0);
+
/* display on */
s5pc_fimd_lcd_on(win_id);
#define S5P_BLENDEQ3 S5P_LCDREG(0x024C) /* Window 3 blending equation control */
#define S5P_BLENDEQ4 S5P_LCDREG(0x0250) /* Window 4 blending equation control */
#define S5P_BLENDCON S5P_LCDREG(0x0260) /* Blending control */
+#define S5P_DUALRGB S5P_LCDREG(0x027C) /* DUALRGB Interface Setting Register */
/*
* Bit Definitions
unsigned int init_delay;
unsigned int power_on_delay;
unsigned int reset_delay;
+
+ unsigned int dual_lcd_enabled;
} vidinfo_t;
#else