From: Nicolas Ferre <[email protected]>

Enable high speed support for atmel-mci driver.  This support is dependent
of the revision of the IP and, of course, the capacity of the SD card
used.

Signed-off-by: Nicolas Ferre <[email protected]>
Reviewed-by: Haavard Skinnemoen <[email protected]>
Cc: Maciej Sosnowski <[email protected]>
Cc: <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
---

 drivers/mmc/host/atmel-mci.c |   22 +++++++++++++++++++---
 1 file changed, 19 insertions(+), 3 deletions(-)

diff -puN 
drivers/mmc/host/atmel-mci.c~mmc-atmel-mci-enable-sd-high-speed-support 
drivers/mmc/host/atmel-mci.c
--- a/drivers/mmc/host/atmel-mci.c~mmc-atmel-mci-enable-sd-high-speed-support
+++ a/drivers/mmc/host/atmel-mci.c
@@ -952,10 +952,21 @@ static void atmci_set_ios(struct mmc_hos
                if (mci_has_rwproof())
                        host->mode_reg |= (MCI_MR_WRPROOF | MCI_MR_RDPROOF);
 
-               if (list_empty(&host->queue))
+               if (atmci_is_mci2()) {
+                       /* setup High Speed mode in relation with card capacity 
*/
+                       if (ios->timing == MMC_TIMING_SD_HS)
+                               host->cfg_reg |= MCI_CFG_HSMODE;
+                       else
+                               host->cfg_reg &= ~MCI_CFG_HSMODE;
+               }
+
+               if (list_empty(&host->queue)) {
                        mci_writel(host, MR, host->mode_reg);
-               else
+                       if (atmci_is_mci2())
+                               mci_writel(host, CFG, host->cfg_reg);
+               } else {
                        host->need_clock_update = true;
+               }
 
                spin_unlock_bh(&host->lock);
        } else {
@@ -1052,8 +1063,11 @@ static void atmci_request_end(struct atm
         * necessary if set_ios() is called when a different slot is
         * busy transfering data.
         */
-       if (host->need_clock_update)
+       if (host->need_clock_update) {
                mci_writel(host, MR, host->mode_reg);
+               if (atmci_is_mci2())
+                       mci_writel(host, CFG, host->cfg_reg);
+       }
 
        host->cur_slot->mrq = NULL;
        host->mrq = NULL;
@@ -1565,6 +1579,8 @@ static int __init atmci_init_slot(struct
        mmc->f_min = DIV_ROUND_UP(host->bus_hz, 512);
        mmc->f_max = host->bus_hz / 2;
        mmc->ocr_avail  = MMC_VDD_32_33 | MMC_VDD_33_34;
+       if (atmci_is_mci2())
+               mmc->caps |= MMC_CAP_SD_HIGHSPEED;
        if (slot_data->bus_width >= 4)
                mmc->caps |= MMC_CAP_4_BIT_DATA;
 
_
--
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