s5pc110: added dual lcd support for Media and modified board detection.
authordaeinki <inki.dae@samsung.com>
Fri, 18 Dec 2009 08:08:59 +0000 (17:08 +0900)
committerdaeinki <inki.dae@samsung.com>
Fri, 18 Dec 2009 08:08:59 +0000 (17:08 +0900)
1. added dual rgb code to framebuffer driver.
2. modified board detection.
3. code clean.

Signed-off-by: daeinki <inki.dae@samsung.com>
board/samsung/universal/universal.c
drivers/video/s5p-fimd.c
include/asm-arm/arch-s5pc1xx/regs-fb.h
include/lcd.h

index 49f86a9..4eb1b06 100644 (file)
@@ -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;
index e0ca5c2..0d3d782 100644 (file)
@@ -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);
 
index ff455e3..976a3f4 100644 (file)
 #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
index 3c024ec..323d7e8 100644 (file)
@@ -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