mmc: sdhci: introduce get_ro private write-protect hook
authorWolfram Sang <w.sang@pengutronix.de>
Fri, 15 Oct 2010 10:21:01 +0000 (12:21 +0200)
committerChris Ball <cjb@laptop.org>
Sat, 23 Oct 2010 13:11:21 +0000 (21:11 +0800)
Some controllers handle their write-protection differently. Introduce a
callback to be able to handle it, ensuring the same locking takes place
for it. Rename the status variable to make it more obvious why the read
from the registers needs to be inverted.

Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
Tested-by: Eric BĂ©nard <eric@eukrea.com>
Signed-off-by: Chris Ball <cjb@laptop.org>
drivers/mmc/host/sdhci.c
drivers/mmc/host/sdhci.h

index 9cb60bac19501df146a16a062b862b48b6554c1b..782c0ee3c9251c6f804087308b097b44faca4f04 100644 (file)
@@ -1223,22 +1223,25 @@ static int sdhci_get_ro(struct mmc_host *mmc)
 {
        struct sdhci_host *host;
        unsigned long flags;
-       int present;
+       int is_readonly;
 
        host = mmc_priv(mmc);
 
        spin_lock_irqsave(&host->lock, flags);
 
        if (host->flags & SDHCI_DEVICE_DEAD)
-               present = 0;
+               is_readonly = 0;
+       else if (host->ops->get_ro)
+               is_readonly = host->ops->get_ro(host);
        else
-               present = sdhci_readl(host, SDHCI_PRESENT_STATE);
+               is_readonly = !(sdhci_readl(host, SDHCI_PRESENT_STATE)
+                               & SDHCI_WRITE_PROTECT);
 
        spin_unlock_irqrestore(&host->lock, flags);
 
-       if (host->quirks & SDHCI_QUIRK_INVERTED_WRITE_PROTECT)
-               return !!(present & SDHCI_WRITE_PROTECT);
-       return !(present & SDHCI_WRITE_PROTECT);
+       /* This quirk needs to be replaced by a callback-function later */
+       return host->quirks & SDHCI_QUIRK_INVERTED_WRITE_PROTECT ?
+               !is_readonly : is_readonly;
 }
 
 static void sdhci_enable_sdio_irq(struct mmc_host *mmc, int enable)
index bfcd611d7b774b5920af40b15987d6cd31aa308b..b7b8a3b28b01b00ff41b311cc6d3afde3bafeff3 100644 (file)
@@ -214,6 +214,7 @@ struct sdhci_ops {
        unsigned int    (*get_timeout_clock)(struct sdhci_host *host);
        void (*platform_send_init_74_clocks)(struct sdhci_host *host,
                                             u8 power_mode);
+       unsigned int    (*get_ro)(struct sdhci_host *host);
 };
 
 #ifdef CONFIG_MMC_SDHCI_IO_ACCESSORS