diff -Naur linux-2.6.25/drivers/mmc/core/mmc.c linux-2.6.25.ep93xx/drivers/mmc/core/mmc.c
--- linux-2.6.25/drivers/mmc/core/mmc.c	2008-04-16 21:49:44.000000000 -0500
+++ linux-2.6.25.ep93xx/drivers/mmc/core/mmc.c	2008-08-18 14:05:42.000000000 -0500
@@ -452,7 +452,6 @@
 	if (!oldcard)
 		mmc_remove_card(card);
 err:
-
 	return err;
 }
 
diff -Naur linux-2.6.25/drivers/mmc/core/mmc_ops.c linux-2.6.25.ep93xx/drivers/mmc/core/mmc_ops.c
--- linux-2.6.25/drivers/mmc/core/mmc_ops.c	2008-04-16 21:49:44.000000000 -0500
+++ linux-2.6.25.ep93xx/drivers/mmc/core/mmc_ops.c	2008-08-18 14:05:42.000000000 -0500
@@ -71,6 +71,7 @@
 	 * rules that must accomodate non-MMC slaves which this layer
 	 * won't even know about.
 	 */
+
 	if (!mmc_host_is_spi(host)) {
 		mmc_set_chip_select(host, MMC_CS_HIGH);
 		mmc_delay(1);
diff -Naur linux-2.6.25/drivers/mmc/host/mmc_spi.c linux-2.6.25.ep93xx/drivers/mmc/host/mmc_spi.c
--- linux-2.6.25/drivers/mmc/host/mmc_spi.c	2008-04-16 21:49:44.000000000 -0500
+++ linux-2.6.25.ep93xx/drivers/mmc/host/mmc_spi.c	2008-08-18 14:05:42.000000000 -0500
@@ -121,6 +121,11 @@
 	u16			powerup_msecs;
 
 	struct mmc_spi_platform_data	*pdata;
+	
+	/* stores last Card-Detect status (when polling) */
+	int cd_status;
+	struct workqueue_struct *cd_poll_wqueue;
+	struct delayed_work cd_poll_work;
 
 	/* for bulk data transfers */
 	struct spi_transfer	token, t, crc, early_status;
@@ -1151,10 +1156,32 @@
 	struct mmc_spi_host *host = mmc_priv(mmc);
 	u16 delay_msec = max(host->pdata->detect_delay, (u16)100);
 
+#if 1
+    dev_info(&host->spi->dev, "MMC detect IRQ, delay: %i msec (%i msec)\n", delay_msec, host->pdata->detect_delay);
+#endif
+
 	mmc_detect_change(mmc, msecs_to_jiffies(delay_msec));
 	return IRQ_HANDLED;
 }
 
+static void mmc_spi_cd_poll_work(struct work_struct *work)
+{
+	struct mmc_spi_host *host = container_of(work, struct mmc_spi_host, cd_poll_work.work);
+	struct mmc_host *mmc = host->mmc;
+	int old_cd;
+
+	dev_dbg(&host->spi->dev, "polling for card detect...\n");
+
+	old_cd = host->cd_status;
+	host->cd_status = host->pdata->get_cd(mmc->parent);
+	if (old_cd != host->cd_status) {
+		/* ugh... this is ugly, but better than code duplication */
+		mmc_spi_detect_irq(NO_IRQ, mmc);
+	}
+
+	queue_delayed_work(host->cd_poll_wqueue, &host->cd_poll_work,MMC_SPI_POLL_INT);
+}
+
 struct count_children {
 	unsigned	n;
 	struct bus_type	*bus;
@@ -1215,7 +1242,7 @@
 				maybe_count_child);
 		if (status < 0) {
 			dev_err(&spi->dev, "can't share SPI bus\n");
-			return status;
+			//return status;
 		}
 
 		dev_warn(&spi->dev, "ASSUMING SPI bus stays unshared!\n");
@@ -1323,13 +1350,27 @@
 	if (status != 0)
 		goto fail_add_host;
 
-	dev_info(&spi->dev, "SD/MMC host %s%s%s%s\n",
-			mmc->class_dev.bus_id,
-			host->dma_dev ? "" : ", no DMA",
-			(host->pdata && host->pdata->get_ro)
-				? "" : ", no WP",
-			(host->pdata && host->pdata->setpower)
-				? "" : ", no poweroff");
+	if (host->pdata && host->pdata->get_cd) {
+		host->cd_status = host->pdata->get_cd(mmc->parent);
+		INIT_DELAYED_WORK(&host->cd_poll_work, mmc_spi_cd_poll_work);
+		host->cd_poll_wqueue = create_singlethread_workqueue(
+		mmc->class_dev.bus_id);
+		if (!host->cd_poll_wqueue) {
+			status = -ENOMEM;
+			goto fail_add_host;
+		}
+		queue_delayed_work(host->cd_poll_wqueue, &host->cd_poll_work, MMC_SPI_POLL_INT);
+	}
+
+	dev_info(&spi->dev, "SD/MMC host %s%s%s%s%s\n",
+		mmc->class_dev.bus_id,
+		host->dma_dev ? "" : ", no DMA",
+		(host->pdata && host->pdata->get_ro)
+			? "" : ", no WP",
+		(host->pdata && host->pdata->setpower)
+			? "" : ", no poweroff",
+		(host->pdata && host->pdata->get_cd)
+			? ", cd polling" : "");		
 	return 0;
 
 fail_add_host:
@@ -1362,6 +1403,12 @@
 		if (host->pdata && host->pdata->exit)
 			host->pdata->exit(&spi->dev, mmc);
 
+		if (host->pdata && host->pdata->get_cd) {
+			cancel_rearming_delayed_workqueue(
+			host->cd_poll_wqueue, &host->cd_poll_work);
+			destroy_workqueue(host->cd_poll_wqueue);
+		}
+
 		mmc_remove_host(mmc);
 
 		if (host->dma_dev) {
