Skip to contentSkip to conversation

OMAP: HSMMC: SDBP and missing clock enabled fixes

PATCH In review Adrian Hunter 1 participant 1 message Nov 21, 2008

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 9/9 OMAP: HSMMC: SDBP and missing clock enabled fixes

Disable SDBP at suspend and enable it resume. Make sure fclk is running at suspend before touching HCTL.

---
drivers/mmc/host/omap_hsmmc.c | 31 ++++++++++++-------------------

1 files changed, 12 insertions(+), 19 deletions(-)
drivers/mmc/host/omap_hsmmc.c +0 -0
index 6058a70..78c5c18 100644
@@ -897,10 +897,7 @@ static void omap_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
		OMAP_HSMMC_WRITE(host->base, CON,
				OMAP_HSMMC_READ(host->base, CON) | OD);

- if (ios->power_mode == MMC_POWER_OFF)
- mmc_omap_fclk_state(host, OFF);
- else
- mmc_omap_fclk_lazy_disable(host);
+ mmc_omap_fclk_lazy_disable(host);
}

static int omap_hsmmc_get_cd(struct mmc_host *mmc)
@@ -1207,12 +1204,11 @@ static int omap_mmc_suspend(struct platform_device *pdev, pm_message_t state)

		return 0;

	if (host) {
-		mmc_omap_fclk_state(host, ON);
-
		ret = mmc_suspend_host(host->mmc, state);
		if (ret == 0) {
			host->suspended = 1;
+			mmc_omap_fclk_state(host, ON);
			OMAP_HSMMC_WRITE(host->base, ISE, 0);
			OMAP_HSMMC_WRITE(host->base, IE, 0);

@@ -1224,19 +1220,8 @@ static int omap_mmc_suspend(struct platform_device *pdev, pm_message_t state)

						" level suspend\n");
			}

- if (!(OMAP_HSMMC_READ(host->base, HCTL) & SDVSDET)) {
- u32 hctl = OMAP_HSMMC_READ(host->base, HCTL) &
- SDVSCLR;
-
- if (host->id == OMAP_MMC1_DEVID)
- hctl |= SDVS30;
- else
- hctl |= SDVS18;
-
- OMAP_HSMMC_WRITE(host->base, HCTL, hctl);
- OMAP_HSMMC_WRITE(host->base, HCTL, hctl | SDBP);
- }
-
+ OMAP_HSMMC_WRITE(host->base, HCTL,

+					 OMAP_HSMMC_READ(host->base, HCTL) & ~SDBP);
			mmc_omap_fclk_state(host, OFF);
			clk_disable(host->iclk);
			clk_disable(host->dbclk);
@@ -1256,6 +1241,7 @@ static int omap_mmc_resume(struct platform_device *pdev)
		return 0;

	if (host) {
+		int i;
		if (mmc_omap_fclk_state(host, ON) != 0)
			goto clk_en_err;

@@ -1270,6 +1256,13 @@ static int omap_mmc_resume(struct platform_device *pdev)

			dev_dbg(mmc_dev(host->mmc),
					"Enabling debounce clk failed\n");

+ OMAP_HSMMC_WRITE(host->base, HCTL,
+ OMAP_HSMMC_READ(host->base, HCTL) | SDBP);
+
+ for (i = 0; i < 100; i++)
+ if (OMAP_HSMMC_READ(host->base, HCTL) & SDBP)
+ break;
+

		if (host->pdata->resume) {
			ret = host->pdata->resume(&pdev->dev, host->slot_id);
			if (ret)
Signature · 1 line
1.5.4.3