LK: Add support for splash screen on MSM7627_SURF

Moving lcdc.c file from qsd8k and msm7x30 to msm_shared under platform
directory.
diff --git a/app/aboot/aboot.c b/app/aboot/aboot.c
index 6abe321..cbdc64a 100755
--- a/app/aboot/aboot.c
+++ b/app/aboot/aboot.c
@@ -2,7 +2,7 @@
  * Copyright (c) 2009, Google Inc.
  * All rights reserved.
  *
- * Copyright (c) 2009, Code Aurora Forum. All rights reserved.
+ * Copyright (c) 2009-2010, Code Aurora Forum. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are met:
@@ -41,6 +41,7 @@
 #include <dev/flash.h>
 #include <lib/ptable.h>
 #include <dev/keys.h>
+#include <dev/fbcon.h>
 
 #include "bootimg.h"
 #include "fastboot.h"
@@ -187,7 +188,7 @@
 	struct ptable *ptable;
 	unsigned offset = 0;
 	const char *cmdline;
-
+	struct fbcon_config *fb_display = NULL;
 
 	if (target_is_emmc_boot()) {
 		hdr = (struct boot_img_hdr *)EMMC_BOOT_IMG_HEADER_ADDR;
@@ -204,6 +205,22 @@
 		return -1;
 	}
 
+#if DISPLAY_SPLASH_SCREEN
+	ptn = ptable_find(ptable, "splash");
+	if (ptn == NULL) {
+        dprintf(CRITICAL, "ERROR: No splash partition found\n");
+	} else {
+		fb_display = fbcon_display();
+		if (fb_display) {
+			if (flash_read(ptn, 0, fb_display->base,
+			    (fb_display->width * fb_display->height * fb_display->bpp/8))) {
+				fbcon_clear();
+				dprintf(CRITICAL, "ERROR: Cannot read splash image\n");
+			}
+		}
+	}
+#endif
+
 	if(!boot_into_recovery)
 	{
 	        ptn = ptable_find(ptable, "boot");
@@ -397,7 +414,13 @@
 
 void aboot_init(const struct app_descriptor *app)
 {
-        unsigned reboot_mode = 0;
+	unsigned reboot_mode = 0;
+	unsigned disp_init = 0;
+	#if DISPLAY_SPLASH_SCREEN
+	display_init();
+	dprintf(INFO, "Diplay initialized\n");
+	disp_init = 1;
+	#endif
 	page_size = flash_page_size();
 	page_mask = page_size - 1;
 	if (keys_get_state(KEY_HOME) != 0)
@@ -419,7 +442,11 @@
 		"to fastboot mode.\n");
 
 fastboot:
-        display_init();
+	if(!disp_init) {
+		display_init();
+	} else {
+		fbcon_clear();
+	}
 	dprintf(INFO, "Diplay initialized\n");
 	udc_init(&surf_udc_device);
 
diff --git a/dev/fbcon/fbcon.c b/dev/fbcon/fbcon.c
index abe1c79..5aadb1f 100644
--- a/dev/fbcon/fbcon.c
+++ b/dev/fbcon/fbcon.c
@@ -2,6 +2,8 @@
  * Copyright (c) 2008, Google Inc.
  * All rights reserved.
  *
+ * Copyright (c) 2009-2010, Code Aurora Forum. All rights reserved.
+ *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
@@ -109,7 +111,7 @@
 }
 
 /* TODO: take stride into account */
-static void fbcon_clear(void)
+void fbcon_clear(void)
 {
 	uint16_t *dst = config->base;
 	unsigned count = config->width * config->height;
@@ -197,3 +199,8 @@
 	max_pos.x = config->width / (FONT_WIDTH+1);
 	max_pos.y = (config->height - 1) / FONT_HEIGHT;
 }
+
+struct fbcon_config* fbcon_display(void)
+{
+    return config;
+}
diff --git a/include/dev/fbcon.h b/include/dev/fbcon.h
index 49d73b5..e7121f5 100644
--- a/include/dev/fbcon.h
+++ b/include/dev/fbcon.h
@@ -2,6 +2,8 @@
  * Copyright (c) 2008, Google Inc.
  * All rights reserved.
  *
+ * Copyright (c) 2009-2010, Code Aurora Forum. All rights reserved.
+ *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
@@ -45,5 +47,7 @@
 
 void fbcon_setup(struct fbcon_config *cfg);
 void fbcon_putc(char c);
+void fbcon_clear(void);
+struct fbcon_config* fbcon_display(void);
 
 #endif /* __DEV_FBCON_H */
diff --git a/platform/msm7k/platform.c b/platform/msm7k/platform.c
index ded9cca..409af52 100755
--- a/platform/msm7k/platform.c
+++ b/platform/msm7k/platform.c
@@ -2,6 +2,8 @@
  * Copyright (c) 2008, Google Inc.
  * All rights reserved.
  *
+ * Copyright (c) 2009-2010, Code Aurora Forum. All rights reserved.
+ *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
@@ -71,4 +73,9 @@
 	ASSERT(fb_config);
 	fbcon_setup(fb_config);
 #endif
+#if DISPLAY_TYPE_LCDC
+    fb_config = lcdc_init();
+    ASSERT(fb_config);
+    fbcon_setup(fb_config);
+#endif
 }
diff --git a/platform/msm7x30/rules.mk b/platform/msm7x30/rules.mk
index 237c469..7a1d434 100644
--- a/platform/msm7x30/rules.mk
+++ b/platform/msm7x30/rules.mk
@@ -17,8 +17,7 @@
 	$(LOCAL_DIR)/platform.o \
 	$(LOCAL_DIR)/interrupts.o \
 	$(LOCAL_DIR)/gpio.o \
-	$(LOCAL_DIR)/acpuclock.o \
-	$(LOCAL_DIR)/lcdc.o
+	$(LOCAL_DIR)/acpuclock.o
 
 LINKER_SCRIPT += $(BUILDDIR)/system-onesegment.ld
 
diff --git a/platform/msm7x30/lcdc.c b/platform/msm_shared/lcdc.c
old mode 100644
new mode 100755
similarity index 99%
rename from platform/msm7x30/lcdc.c
rename to platform/msm_shared/lcdc.c
index 29152d3..9970923
--- a/platform/msm7x30/lcdc.c
+++ b/platform/msm_shared/lcdc.c
@@ -140,3 +140,4 @@
 
 	return &fb_cfg;
 }
+
diff --git a/platform/msm_shared/rules.mk b/platform/msm_shared/rules.mk
old mode 100644
new mode 100755
index d856dfa..7e48af7
--- a/platform/msm_shared/rules.mk
+++ b/platform/msm_shared/rules.mk
@@ -13,5 +13,6 @@
 	$(LOCAL_DIR)/hsusb.o \
 	$(LOCAL_DIR)/jtag_hook.o \
 	$(LOCAL_DIR)/jtag.o \
-	$(LOCAL_DIR)/nand.o
+	$(LOCAL_DIR)/nand.o \
+	$(LOCAL_DIR)/lcdc.o
 
diff --git a/platform/qsd8k/lcdc.c b/platform/qsd8k/lcdc.c
deleted file mode 100644
index 29152d3..0000000
--- a/platform/qsd8k/lcdc.c
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright (c) 2008, Google Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the 
- *    distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <debug.h>
-#include <stdlib.h>
-#include <reg.h>
-#include <platform/iomap.h>
-#include <dev/fbcon.h>
-
-#define MSM_MDP_BASE1 0xAA200000
-
-#define LCDC_PIXCLK_IN_PS 26
-#define LCDC_FB_PHYS      0x16600000
-#define LCDC_FB_BPP       16
-
-#if 1
-/* SURF */
-#define LCDC_FB_WIDTH     800
-#define LCDC_FB_HEIGHT    480
-
-#define LCDC_HSYNC_PULSE_WIDTH_DCLK 60
-#define LCDC_HSYNC_BACK_PORCH_DCLK  81
-#define LCDC_HSYNC_FRONT_PORCH_DCLK 81
-#define LCDC_HSYNC_SKEW_DCLK        0
-
-#define LCDC_VSYNC_PULSE_WIDTH_LINES 2
-#define LCDC_VSYNC_BACK_PORCH_LINES  20
-#define LCDC_VSYNC_FRONT_PORCH_LINES 27
-
-#else
-/* FFA */
-#define LCDC_FB_WIDTH     480
-#define LCDC_FB_HEIGHT    640
-
-#define LCDC_HSYNC_PULSE_WIDTH_DCLK 60
-#define LCDC_HSYNC_BACK_PORCH_DCLK  144
-#define LCDC_HSYNC_FRONT_PORCH_DCLK 33
-#define LCDC_HSYNC_SKEW_DCLK        0
-
-#define LCDC_VSYNC_PULSE_WIDTH_LINES 2
-#define LCDC_VSYNC_BACK_PORCH_LINES  2
-#define LCDC_VSYNC_FRONT_PORCH_LINES 2
-
-#endif
-
-#define BIT(x)  (1<<(x))
-#define DMA_DSTC0G_8BITS (BIT(1)|BIT(0))
-#define DMA_DSTC1B_8BITS (BIT(3)|BIT(2))
-#define DMA_DSTC2R_8BITS (BIT(5)|BIT(4))
-#define CLR_G 0x0
-#define CLR_B 0x1
-#define CLR_R 0x2
-#define MDP_GET_PACK_PATTERN(a,x,y,z,bit) (((a)<<(bit*3))|((x)<<(bit*2))|((y)<<bit)|(z))
-#define DMA_PACK_ALIGN_LSB 0
-#define DMA_PACK_PATTERN_RGB					\
-        (MDP_GET_PACK_PATTERN(0,CLR_R,CLR_G,CLR_B,2)<<8)
-#define DMA_DITHER_EN                       BIT(24)
-#define DMA_OUT_SEL_LCDC                    BIT(20)
-#define DMA_IBUF_FORMAT_RGB565              BIT(25)
-
-static struct fbcon_config fb_cfg = {
-	.height		= LCDC_FB_HEIGHT,
-	.width		= LCDC_FB_WIDTH,
-	.stride		= LCDC_FB_WIDTH,
-	.format		= FB_FORMAT_RGB565,
-	.bpp		= LCDC_FB_BPP,
-	.update_start	= NULL,
-	.update_done	= NULL,
-};
-
-void lcdc_clock_init(unsigned rate);
-
-struct fbcon_config *lcdc_init(void)
-{
-	dprintf(INFO, "lcdc_init(): panel is %d x %d\n", fb_cfg.width, fb_cfg.height);
-
-	fb_cfg.base =
-		memalign(4096, fb_cfg.width * fb_cfg.height * (fb_cfg.bpp / 8));
-
-	lcdc_clock_init(1000000000 / LCDC_PIXCLK_IN_PS);
-
-	writel((unsigned) fb_cfg.base, MSM_MDP_BASE1 + 0x90008);
-
-	writel((fb_cfg.height << 16) | fb_cfg.width, MSM_MDP_BASE1 + 0x90004);
-	writel(fb_cfg.width * fb_cfg.bpp / 8, MSM_MDP_BASE1 + 0x9000c);
-	writel(0, MSM_MDP_BASE1 + 0x90010);
-
-	writel(DMA_PACK_ALIGN_LSB|DMA_PACK_PATTERN_RGB|DMA_DITHER_EN|DMA_OUT_SEL_LCDC|
-	       DMA_IBUF_FORMAT_RGB565|DMA_DSTC0G_8BITS|DMA_DSTC1B_8BITS|DMA_DSTC2R_8BITS,
-	       MSM_MDP_BASE1 + 0x90000);
-
-	int hsync_period  = LCDC_HSYNC_PULSE_WIDTH_DCLK + LCDC_HSYNC_BACK_PORCH_DCLK + fb_cfg.width + LCDC_HSYNC_FRONT_PORCH_DCLK;
-	int vsync_period  = (LCDC_VSYNC_PULSE_WIDTH_LINES + LCDC_VSYNC_BACK_PORCH_LINES + fb_cfg.height + LCDC_VSYNC_FRONT_PORCH_LINES) * hsync_period;
-	int hsync_start_x = LCDC_HSYNC_PULSE_WIDTH_DCLK + LCDC_HSYNC_BACK_PORCH_DCLK;
-	int hsync_end_x   = hsync_period - LCDC_HSYNC_FRONT_PORCH_DCLK - 1;
-	int display_hctl  = (hsync_end_x << 16) | hsync_start_x;
-	int display_vstart= (LCDC_VSYNC_PULSE_WIDTH_LINES + LCDC_VSYNC_BACK_PORCH_LINES) * hsync_period + LCDC_HSYNC_SKEW_DCLK;
-	int display_vend  = vsync_period - (LCDC_VSYNC_FRONT_PORCH_LINES * hsync_period) + LCDC_HSYNC_SKEW_DCLK - 1;
-
-	writel((hsync_period << 16) | LCDC_HSYNC_PULSE_WIDTH_DCLK, MSM_MDP_BASE1 + 0xe0004);
-	writel(vsync_period, MSM_MDP_BASE1 + 0xe0008);
-	writel(LCDC_VSYNC_PULSE_WIDTH_LINES * hsync_period, MSM_MDP_BASE1 + 0xe000c);
-	writel(display_hctl, MSM_MDP_BASE1 + 0xe0010);
-	writel(display_vstart, MSM_MDP_BASE1 + 0xe0014);
-	writel(display_vend, MSM_MDP_BASE1 + 0xe0018);
-	writel(0, MSM_MDP_BASE1 + 0xe0028);
-	writel(0xff, MSM_MDP_BASE1 + 0xe002c);
-	writel(LCDC_HSYNC_SKEW_DCLK, MSM_MDP_BASE1 + 0xe0030);
-	writel(0, MSM_MDP_BASE1 + 0xe0038);
-	writel(0, MSM_MDP_BASE1 + 0xe001c);
-	writel(0, MSM_MDP_BASE1 + 0xe0020);
-	writel(0, MSM_MDP_BASE1 + 0xe0024);
-
-	writel(1, MSM_MDP_BASE1 + 0xe0000);
-
-	return &fb_cfg;
-}
diff --git a/platform/qsd8k/rules.mk b/platform/qsd8k/rules.mk
index 237c469..7a1d434 100644
--- a/platform/qsd8k/rules.mk
+++ b/platform/qsd8k/rules.mk
@@ -17,8 +17,7 @@
 	$(LOCAL_DIR)/platform.o \
 	$(LOCAL_DIR)/interrupts.o \
 	$(LOCAL_DIR)/gpio.o \
-	$(LOCAL_DIR)/acpuclock.o \
-	$(LOCAL_DIR)/lcdc.o
+	$(LOCAL_DIR)/acpuclock.o
 
 LINKER_SCRIPT += $(BUILDDIR)/system-onesegment.ld
 
diff --git a/project/msm7627_surf.mk b/project/msm7627_surf.mk
index 59f98ed..0b98025 100644
--- a/project/msm7627_surf.mk
+++ b/project/msm7627_surf.mk
@@ -8,4 +8,4 @@
 
 #DEFINES += WITH_DEBUG_DCC=1
 #DEFINES += WITH_DEBUG_UART=1
-#DEFINES += WITH_DEBUG_FBCON=1
\ No newline at end of file
+DEFINES += WITH_DEBUG_FBCON=1
diff --git a/target/msm7627_surf/init.c b/target/msm7627_surf/init.c
index c62a6b3..f1cb0b2 100644
--- a/target/msm7627_surf/init.c
+++ b/target/msm7627_surf/init.c
@@ -1,7 +1,7 @@
 /*
  * Copyright (c) 2009, Google Inc.
  * All rights reserved.
- * Copyright (c) 2009, Code Aurora Forum. All rights reserved.
+ * Copyright (c) 2009-2010, Code Aurora Forum. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -65,12 +65,17 @@
 		.name = "system",
 	},
 	{
-		.start = 720,
+                .start = 720,
+                .length = 8,
+                .name = "splash",
+	},
+	{
+		.start = 728,
 		.length = 40  /* 5MB */,
 		.name = "cache",
 	},
 	{
-		.start = 760,
+		.start = 768,
 		.length = VARIABLE_LENGTH,
 		.name = "userdata",
 	},
diff --git a/target/msm7627_surf/rules.mk b/target/msm7627_surf/rules.mk
index c473d06..b62c420 100644
--- a/target/msm7627_surf/rules.mk
+++ b/target/msm7627_surf/rules.mk
@@ -17,6 +17,8 @@
 KEYS_USE_GPIO_KEYPAD := 1
 
 DEFINES += DISPLAY_TYPE_MDDI=0
+DEFINES += DISPLAY_TYPE_LCDC=1
+DEFINES += DISPLAY_SPLASH_SCREEN=0
 
 MODULES += \
 	dev/keys \