From 4d25efd146acca7bb7ab7fde877c05765586b34a Mon Sep 17 00:00:00 2001 From: daeinki Date: Fri, 18 Dec 2009 17:08:59 +0900 Subject: [PATCH] s5pc110: added dual lcd support for Media and modified board detection. 1. added dual rgb code to framebuffer driver. 2. modified board detection. 3. code clean. Signed-off-by: daeinki --- board/samsung/universal/universal.c | 28 ++++++++++++++++++----- drivers/video/s5p-fimd.c | 41 ++++++++++++++++++++++++++++++---- include/asm-arm/arch-s5pc1xx/regs-fb.h | 1 + include/lcd.h | 2 ++ 4 files changed, 63 insertions(+), 9 deletions(-) diff --git a/board/samsung/universal/universal.c b/board/samsung/universal/universal.c index 49f86a9..4eb1b06 100644 --- a/board/samsung/universal/universal.c +++ b/board/samsung/universal/universal.c @@ -163,10 +163,10 @@ enum { #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 @@ -212,8 +212,9 @@ static int board_is_limo_real(void) 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) @@ -1399,7 +1400,7 @@ struct s5pc110_gpio *gpio_base = (struct s5pc110_gpio *) S5PC110_GPIO_BASE; 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) */ @@ -1420,7 +1421,11 @@ void lcd_cfg_gpio(void) 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 */ @@ -1568,6 +1573,19 @@ void init_panel_info(vidinfo_t *vid) 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; diff --git a/drivers/video/s5p-fimd.c b/drivers/video/s5p-fimd.c index e0ca5c2..0d3d782 100644 --- a/drivers/video/s5p-fimd.c +++ b/drivers/video/s5p-fimd.c @@ -55,6 +55,22 @@ void s5pc_fimd_lcd_init_mem(u_long screen_base, u_long fb_size, u_long palette_s 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; @@ -123,11 +139,17 @@ static void s5pc_fimd_set_clock(void) 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"); @@ -156,6 +178,11 @@ static void s5pc_fimd_set_clock(void) * 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); @@ -277,6 +304,12 @@ void s5pc_fimd_lcd_init(vidinfo_t *vid) /* 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); diff --git a/include/asm-arm/arch-s5pc1xx/regs-fb.h b/include/asm-arm/arch-s5pc1xx/regs-fb.h index ff455e3..976a3f4 100644 --- a/include/asm-arm/arch-s5pc1xx/regs-fb.h +++ b/include/asm-arm/arch-s5pc1xx/regs-fb.h @@ -134,6 +134,7 @@ #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 diff --git a/include/lcd.h b/include/lcd.h index 3c024ec..323d7e8 100644 --- a/include/lcd.h +++ b/include/lcd.h @@ -218,6 +218,8 @@ typedef struct vidinfo { unsigned int init_delay; unsigned int power_on_delay; unsigned int reset_delay; + + unsigned int dual_lcd_enabled; } vidinfo_t; #else -- 2.7.4