board/neo1973/neo1973.c (board_late_init): moved MMC power-up to separate
  function
cpu/arm920t/s3c24x0/mmc.c (mmc_init): call mmc_power_up and return -ENODEV
  immediately if there is no card

- Werner Almesberger <werner@openmoko.org>

Index: u-boot/board/neo1973/neo1973.c
===================================================================
--- u-boot.orig/board/neo1973/neo1973.c
+++ u-boot/board/neo1973/neo1973.c
@@ -223,6 +223,19 @@ int board_init (void)
 	return 0;
 }
 
+int mmc_power_up(void)
+{
+#if defined(CONFIG_ARCH_GTA01B_v4)
+	S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();
+
+	/* check if sd card is inserted, and power-up if it is */
+	if (gpio->GPFDAT & (1 << 5))
+		return 0;
+	gpio->GPBDAT &= ~(1 << 2);
+#endif /* !CONFIG_ARCH_GTA01B_v4 */
+	return 1;
+}
+
 int board_late_init(void)
 {
 	unsigned char tmp;
@@ -289,14 +302,8 @@ continue_boot:
 	/* switch on the backlight */
 	neo1973_backlight(1);
 
-#if defined(CONFIG_ARCH_GTA01B_v4)
-	{
-		/* check if sd card is inserted, and power-up if it is */
-		S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();
-		if (!(gpio->GPFDAT & (1 << 5)))
-			gpio->GPBDAT &= ~(1 << 2);
-	}
-#endif
+	/* check if sd card is inserted, and power-up if it is */
+	mmc_power_up();
 
 	return 0;
 }
Index: u-boot/cpu/arm920t/s3c24x0/mmc.c
===================================================================
--- u-boot.orig/cpu/arm920t/s3c24x0/mmc.c
+++ u-boot/cpu/arm920t/s3c24x0/mmc.c
@@ -381,6 +381,11 @@ static void print_sd_cid(const struct sd
 	    cid->crc >> 1, cid->crc & 1);
 }
 
+int __attribute__((weak)) mmc_power_up(void)
+{
+	return 1;
+}
+
 int mmc_init(int verbose)
 {
  	int retries, rc = -ENODEV;
@@ -393,6 +398,8 @@ int mmc_init(int verbose)
 	debug("mmc_init(PCLK=%u)\n", get_PCLK());
 
 	clk_power->CLKCON |= (1 << 9);
+	if (!mmc_power_up())
+		return -ENODEV;
 
 	/* S3C2410 has some bug that prevents reliable operation at higher speed */
 	//sdi->SDIPRE = 0x3e;  /* SDCLK = PCLK/2 / (SDIPRE+1) = 396kHz */
