Our v2 controller supports 8 bit data.  add software hooks to
allow adaptation layer to control 8 bit width support.

new callback -- platform_8_bit_width

patch builds upon other patch for v3 8 bit support

Signed-off-by: Philip Rakity <[email protected]>
---
 drivers/mmc/host/sdhci.c |   42 ++++++++++++++++++++++--------------------
 drivers/mmc/host/sdhci.h |    2 ++
 2 files changed, 24 insertions(+), 20 deletions(-)

diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index 90cfdfb..21b4ff9 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -1188,29 +1188,30 @@ static void sdhci_set_ios(struct mmc_host *mmc, struct 
mmc_ios *ios)
        if (host->ops->platform_send_init_74_clocks)
                host->ops->platform_send_init_74_clocks(host, ios->power_mode);
 
-       ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL);
-       if (ios->bus_width == MMC_BUS_WIDTH_8) {
-               ctrl &= ~SDHCI_CTRL_4BITBUS;
-               if (host->version >= SDHCI_SPEC_300)
-                       ctrl |= SDHCI_CTRL_8BITBUS;
-       } else {
-               if (host->version >= SDHCI_SPEC_300)
-                       ctrl &= ~SDHCI_CTRL_8BITBUS;
-               if (ios->bus_width == MMC_BUS_WIDTH_4)
-                       ctrl |= SDHCI_CTRL_4BITBUS;
-               else
+       /*
+        * use platform_8_bit_width if not v3 controller
+        * or if special hw/board specific processing is needed
+        */
+       if (host->ops->platform_8_bit_width)
+               host->ops->platform_8_bit_width(host, ios->bus_width);
+       else {
+               ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL);
+               if (ios->bus_width == MMC_BUS_WIDTH_8) {
                        ctrl &= ~SDHCI_CTRL_4BITBUS;
+                       if (host->version >= SDHCI_SPEC_300)
+                               ctrl |= SDHCI_CTRL_8BITBUS;
+               } else {
+                       if (host->version >= SDHCI_SPEC_300)
+                               ctrl &= ~SDHCI_CTRL_8BITBUS;
+                       if (ios->bus_width == MMC_BUS_WIDTH_4)
+                               ctrl |= SDHCI_CTRL_4BITBUS;
+                       else
+                               ctrl &= ~SDHCI_CTRL_4BITBUS;
+               }
+               sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL);
        }
 
-       if (ios->bus_width == MMC_BUS_WIDTH_8)
-               ctrl |= SDHCI_CTRL_8BITBUS;
-       else
-               ctrl &= ~SDHCI_CTRL_8BITBUS;
-
-       if (ios->bus_width == MMC_BUS_WIDTH_4)
-               ctrl |= SDHCI_CTRL_4BITBUS;
-       else
-               ctrl &= ~SDHCI_CTRL_4BITBUS;
+       ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL);
 
        if ((ios->timing == MMC_TIMING_SD_HS ||
             ios->timing == MMC_TIMING_MMC_HS)
@@ -1857,6 +1858,7 @@ int sdhci_add_host(struct sdhci_host *host)
                mmc->f_min = host->max_clk / SDHCI_MAX_DIV_SPEC_300;
        else
                mmc->f_min = host->max_clk / SDHCI_MAX_DIV_SPEC_200;
+
        mmc->f_max = host->max_clk;
        mmc->caps |= MMC_CAP_SDIO_IRQ;
 
diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h
index c87e3c4..ae30f7d 100644
--- a/drivers/mmc/host/sdhci.h
+++ b/drivers/mmc/host/sdhci.h
@@ -215,6 +215,8 @@ 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);
+       void            (*platform_8_bit_width)(struct sdhci_host *host,
+                               int width);
 };
 
 #ifdef CONFIG_MMC_SDHCI_IO_ACCESSORS
-- 
1.6.0.4

--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to