|
@@ -638,6 +638,41 @@ static void omap_hsmmc_set_clock(struct omap_hsmmc_host *host)
|
|
|
omap_hsmmc_start_clock(host);
|
|
|
}
|
|
|
|
|
|
+static void omap_hsmmc_set_bus_width(struct omap_hsmmc_host *host)
|
|
|
+{
|
|
|
+ struct mmc_ios *ios = &host->mmc->ios;
|
|
|
+ u32 con;
|
|
|
+
|
|
|
+ con = OMAP_HSMMC_READ(host->base, CON);
|
|
|
+ switch (ios->bus_width) {
|
|
|
+ case MMC_BUS_WIDTH_8:
|
|
|
+ OMAP_HSMMC_WRITE(host->base, CON, con | DW8);
|
|
|
+ break;
|
|
|
+ case MMC_BUS_WIDTH_4:
|
|
|
+ OMAP_HSMMC_WRITE(host->base, CON, con & ~DW8);
|
|
|
+ OMAP_HSMMC_WRITE(host->base, HCTL,
|
|
|
+ OMAP_HSMMC_READ(host->base, HCTL) | FOUR_BIT);
|
|
|
+ break;
|
|
|
+ case MMC_BUS_WIDTH_1:
|
|
|
+ OMAP_HSMMC_WRITE(host->base, CON, con & ~DW8);
|
|
|
+ OMAP_HSMMC_WRITE(host->base, HCTL,
|
|
|
+ OMAP_HSMMC_READ(host->base, HCTL) & ~FOUR_BIT);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+static void omap_hsmmc_set_bus_mode(struct omap_hsmmc_host *host)
|
|
|
+{
|
|
|
+ struct mmc_ios *ios = &host->mmc->ios;
|
|
|
+ u32 con;
|
|
|
+
|
|
|
+ con = OMAP_HSMMC_READ(host->base, CON);
|
|
|
+ if (ios->bus_mode == MMC_BUSMODE_OPENDRAIN)
|
|
|
+ OMAP_HSMMC_WRITE(host->base, CON, con | OD);
|
|
|
+ else
|
|
|
+ OMAP_HSMMC_WRITE(host->base, CON, con & ~OD);
|
|
|
+}
|
|
|
+
|
|
|
#ifdef CONFIG_PM
|
|
|
|
|
|
/*
|
|
@@ -649,7 +684,7 @@ static int omap_hsmmc_context_restore(struct omap_hsmmc_host *host)
|
|
|
struct mmc_ios *ios = &host->mmc->ios;
|
|
|
struct omap_mmc_platform_data *pdata = host->pdata;
|
|
|
int context_loss = 0;
|
|
|
- u32 hctl, capa, con;
|
|
|
+ u32 hctl, capa;
|
|
|
unsigned long timeout;
|
|
|
|
|
|
if (pdata->get_context_loss_count) {
|
|
@@ -711,30 +746,12 @@ static int omap_hsmmc_context_restore(struct omap_hsmmc_host *host)
|
|
|
if (host->power_mode == MMC_POWER_OFF)
|
|
|
goto out;
|
|
|
|
|
|
- con = OMAP_HSMMC_READ(host->base, CON);
|
|
|
- switch (ios->bus_width) {
|
|
|
- case MMC_BUS_WIDTH_8:
|
|
|
- OMAP_HSMMC_WRITE(host->base, CON, con | DW8);
|
|
|
- break;
|
|
|
- case MMC_BUS_WIDTH_4:
|
|
|
- OMAP_HSMMC_WRITE(host->base, CON, con & ~DW8);
|
|
|
- OMAP_HSMMC_WRITE(host->base, HCTL,
|
|
|
- OMAP_HSMMC_READ(host->base, HCTL) | FOUR_BIT);
|
|
|
- break;
|
|
|
- case MMC_BUS_WIDTH_1:
|
|
|
- OMAP_HSMMC_WRITE(host->base, CON, con & ~DW8);
|
|
|
- OMAP_HSMMC_WRITE(host->base, HCTL,
|
|
|
- OMAP_HSMMC_READ(host->base, HCTL) & ~FOUR_BIT);
|
|
|
- break;
|
|
|
- }
|
|
|
+ omap_hsmmc_set_bus_width(host);
|
|
|
|
|
|
omap_hsmmc_set_clock(host);
|
|
|
|
|
|
- con = OMAP_HSMMC_READ(host->base, CON);
|
|
|
- if (ios->bus_mode == MMC_BUSMODE_OPENDRAIN)
|
|
|
- OMAP_HSMMC_WRITE(host->base, CON, con | OD);
|
|
|
- else
|
|
|
- OMAP_HSMMC_WRITE(host->base, CON, con & ~OD);
|
|
|
+ omap_hsmmc_set_bus_mode(host);
|
|
|
+
|
|
|
out:
|
|
|
host->context_loss = context_loss;
|
|
|
|
|
@@ -1628,7 +1645,6 @@ static void omap_hsmmc_request(struct mmc_host *mmc, struct mmc_request *req)
|
|
|
static void omap_hsmmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
|
|
|
{
|
|
|
struct omap_hsmmc_host *host = mmc_priv(mmc);
|
|
|
- u32 con;
|
|
|
int do_send_init_stream = 0;
|
|
|
|
|
|
pm_runtime_get_sync(host->dev);
|
|
@@ -1654,22 +1670,7 @@ static void omap_hsmmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
|
|
|
|
|
|
/* FIXME: set registers based only on changes to ios */
|
|
|
|
|
|
- con = OMAP_HSMMC_READ(host->base, CON);
|
|
|
- switch (mmc->ios.bus_width) {
|
|
|
- case MMC_BUS_WIDTH_8:
|
|
|
- OMAP_HSMMC_WRITE(host->base, CON, con | DW8);
|
|
|
- break;
|
|
|
- case MMC_BUS_WIDTH_4:
|
|
|
- OMAP_HSMMC_WRITE(host->base, CON, con & ~DW8);
|
|
|
- OMAP_HSMMC_WRITE(host->base, HCTL,
|
|
|
- OMAP_HSMMC_READ(host->base, HCTL) | FOUR_BIT);
|
|
|
- break;
|
|
|
- case MMC_BUS_WIDTH_1:
|
|
|
- OMAP_HSMMC_WRITE(host->base, CON, con & ~DW8);
|
|
|
- OMAP_HSMMC_WRITE(host->base, HCTL,
|
|
|
- OMAP_HSMMC_READ(host->base, HCTL) & ~FOUR_BIT);
|
|
|
- break;
|
|
|
- }
|
|
|
+ omap_hsmmc_set_bus_width(host);
|
|
|
|
|
|
if (host->pdata->controller_flags & OMAP_HSMMC_SUPPORTS_DUAL_VOLT) {
|
|
|
/* Only MMC1 can interface at 3V without some flavor
|
|
@@ -1694,11 +1695,7 @@ static void omap_hsmmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
|
|
|
if (do_send_init_stream)
|
|
|
send_init_stream(host);
|
|
|
|
|
|
- con = OMAP_HSMMC_READ(host->base, CON);
|
|
|
- if (ios->bus_mode == MMC_BUSMODE_OPENDRAIN)
|
|
|
- OMAP_HSMMC_WRITE(host->base, CON, con | OD);
|
|
|
- else
|
|
|
- OMAP_HSMMC_WRITE(host->base, CON, con & ~OD);
|
|
|
+ omap_hsmmc_set_bus_mode(host);
|
|
|
|
|
|
pm_runtime_put_autosuspend(host->dev);
|
|
|
}
|