The following patch adds optional card detect switch sensing.

This eliminates having to probe to determine what type of card is
installed in mmc_rescan() if we can determine that nothing is installed.

It eliminates the "mmc0: error -22 whilst initialising SDIO card" error
message that occurs when nothing is installed in the socket. It also
makes mmc_detect_change() in the mmc_spi.c driver work correctly.

This was tested on an EP93xx based platform with the mmc_spi.c driver.

Please let me know if there is anything wrong with this patch.

Thanks,
Hartley Sweeten


diff -burN linux-2.6.25/include/linux/mmc/host.h
/home/bigguiness/linux-crater_1-0-3/kernel/linux-2.6.25/include/linux/mm
c/host.h
--- linux-2.6.25/include/linux/mmc/host.h       2008-04-16
19:49:44.000000000 -0700
+++
/home/bigguiness/linux-crater_1-0-3/kernel/linux-2.6.25/include/linux/mm
c/host.h        2008-04-30 13:49:27.000000000 -0700
@@ -54,6 +54,7 @@
        void    (*set_ios)(struct mmc_host *host, struct mmc_ios *ios);
        int     (*get_ro)(struct mmc_host *host);
        void    (*enable_sdio_irq)(struct mmc_host *host, int enable);
+       int     (*get_cd)(struct mmc_host *host);
 };
 
 struct mmc_card;
diff -burN linux-2.6.25/drivers/mmc/core/core.c
/home/bigguiness/linux-crater_1-0-3/kernel/linux-2.6.25/drivers/mmc/core
/core.c
--- linux-2.6.25/drivers/mmc/core/core.c        2008-04-16
19:49:44.000000000 -0700
+++
/home/bigguiness/linux-crater_1-0-3/kernel/linux-2.6.25/drivers/mmc/core
/core.c 2008-04-30 14:24:58.000000000 -0700
@@ -650,6 +650,17 @@
                mmc_send_if_cond(host, host->ocr_avail);
 
                /*
+                * Check the card detect switch, if supported...
+                */
+               if (host->ops->get_cd) {
+                       if (!host->ops->get_cd(host)) {
+                               mmc_release_host(host);
+                               mmc_power_off(host);
+                               return;
+                       }
+               }
+
+               /*
                 * First we search for SDIO...
                 */
                err = mmc_send_io_op_cond(host, 0, &ocr);
@@ -682,8 +693,19 @@
                mmc_release_host(host);
                mmc_power_off(host);
        } else {
-               if (host->bus_ops->detect && !host->bus_dead)
+               if (host->ops->get_cd) {
+                       if (!host->ops->get_cd(host)) {
+                               if (host->bus_ops->remove &&
!host->bus_dead) {
+                                       host->bus_ops->remove(host);
+
+                                       mmc_claim_host(host);
+                                       mmc_detach_bus(host);
+                                       mmc_release_host(host);
+                               }
+                       }
+               } else if (host->bus_ops->detect && !host->bus_dead) {
                        host->bus_ops->detect(host);
+               }
 
                mmc_bus_put(host);
        }
diff -burN linux-2.6.25/drivers/mmc/host/mmc_spi.c
/home/bigguiness/linux-crater_1-0-3/kernel/linux-2.6.25/drivers/mmc/host
/mmc_spi.c
--- linux-2.6.25/drivers/mmc/host/mmc_spi.c     2008-04-16
19:49:44.000000000 -0700
+++
/home/bigguiness/linux-crater_1-0-3/kernel/linux-2.6.25/drivers/mmc/host
/mmc_spi.c      2008-04-30 14:25:41.000000000 -0700
@@ -1131,11 +1131,21 @@
        return 0;
 }
 
+static int mmc_spi_get_cd(struct mmc_host *mmc)
+{
+       struct mmc_spi_host *host = mmc_priv(mmc);
+
+       if (host->pdata && host->pdata->get_cd)
+               return host->pdata->get_cd(mmc->parent);
+       /* board doesn't support card detection; assume present */
+       return 1;
+}
 
 static const struct mmc_host_ops mmc_spi_ops = {
        .request        = mmc_spi_request,
        .set_ios        = mmc_spi_set_ios,
        .get_ro         = mmc_spi_get_ro,
+       .get_cd         = mmc_spi_get_cd,
 };
 
  

-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference 
Don't miss this year's exciting event. There's still time to save $100. 
Use priority code J8TL2D2. 
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
_______________________________________________
spi-devel-general mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/spi-devel-general

Reply via email to