Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5e2ea617 authored by Adrian Hunter's avatar Adrian Hunter Committed by Linus Torvalds
Browse files

omap_hsmmc: make use of new enable/disable interface



For the moment enable / disable just turns the fclk on and off.

Signed-off-by: default avatarAdrian Hunter <adrian.hunter@nokia.com>
Acked-by: default avatarMatt Fleming <matt@console-pimps.org>
Cc: Ian Molton <ian@mnementh.co.uk>
Cc: "Roberto A. Foglietta" <roberto.foglietta@gmail.com>
Cc: Jarkko Lavinen <jarkko.lavinen@nokia.com>
Cc: Denis Karpov <ext-denis.2.karpov@nokia.com>
Cc: Pierre Ossman <pierre@ossman.eu>
Cc: Philip Langdale <philipl@overt.org>
Cc: "Madhusudhan" <madhu.cr@ti.com>
Cc: <linux-mmc@vger.kernel.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent d900f712
Loading
Loading
Loading
Loading
+58 −10
Original line number Diff line number Diff line
@@ -605,7 +605,9 @@ static void mmc_omap_detect(struct work_struct *work)
	if (host->carddetect) {
		mmc_detect_change(host->mmc, (HZ * 200) / 1000);
	} else {
		mmc_host_enable(host->mmc);
		mmc_omap_reset_controller_fsm(host, SRD);
		mmc_host_lazy_disable(host->mmc);
		mmc_detect_change(host->mmc, (HZ * 50) / 1000);
	}
}
@@ -818,6 +820,27 @@ mmc_omap_prepare_data(struct mmc_omap_host *host, struct mmc_request *req)
	return 0;
}

static int omap_mmc_enable(struct mmc_host *mmc)
{
	struct mmc_omap_host *host = mmc_priv(mmc);
	int err;

	err = clk_enable(host->fclk);
	if (err)
		return err;
	dev_dbg(mmc_dev(host->mmc), "mmc_fclk: enabled\n");
	return 0;
}

static int omap_mmc_disable(struct mmc_host *mmc, int lazy)
{
	struct mmc_omap_host *host = mmc_priv(mmc);

	clk_disable(host->fclk);
	dev_dbg(mmc_dev(host->mmc), "mmc_fclk: disabled\n");
	return 0;
}

/*
 * Request function. for read/write operation
 */
@@ -841,6 +864,8 @@ static void omap_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
	unsigned long timeout;
	u32 con;

	mmc_host_enable(host->mmc);

	switch (ios->power_mode) {
	case MMC_POWER_OFF:
		mmc_slot(host).set_power(host->dev, host->slot_id, 0, 0);
@@ -919,6 +944,8 @@ static void omap_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
	if (ios->bus_mode == MMC_BUSMODE_OPENDRAIN)
		OMAP_HSMMC_WRITE(host->base, CON,
				OMAP_HSMMC_READ(host->base, CON) | OD);

	mmc_host_lazy_disable(host->mmc);
}

static int omap_hsmmc_get_cd(struct mmc_host *mmc)
@@ -969,6 +996,8 @@ static void omap_hsmmc_init(struct mmc_omap_host *host)
}

static struct mmc_host_ops mmc_omap_ops = {
	.enable = omap_mmc_enable,
	.disable = omap_mmc_disable,
	.request = omap_mmc_request,
	.set_ios = omap_mmc_set_ios,
	.get_cd = omap_hsmmc_get_cd,
@@ -983,7 +1012,16 @@ static int mmc_regs_show(struct seq_file *s, void *data)
	struct mmc_host *mmc = s->private;
	struct mmc_omap_host *host = mmc_priv(mmc);

	seq_printf(s, "mmc%d regs:\n", mmc->index);
	seq_printf(s, "mmc%d:\n"
			" enabled:\t%d\n"
			" nesting_cnt:\t%d\n"
			"\nregs:\n",
			mmc->index, mmc->enabled ? 1 : 0, mmc->nesting_cnt);

	if (clk_enable(host->fclk) != 0) {
		seq_printf(s, "can't read the regs\n");
		goto err;
	}

	seq_printf(s, "SYSCONFIG:\t0x%08x\n",
			OMAP_HSMMC_READ(host->base, SYSCONFIG));
@@ -999,6 +1037,9 @@ static int mmc_regs_show(struct seq_file *s, void *data)
			OMAP_HSMMC_READ(host->base, ISE));
	seq_printf(s, "CAPA:\t\t0x%08x\n",
			OMAP_HSMMC_READ(host->base, CAPA));

	clk_disable(host->fclk);
err:
	return 0;
}

@@ -1099,14 +1140,16 @@ static int __init omap_mmc_probe(struct platform_device *pdev)
		goto err1;
	}

	if (clk_enable(host->fclk) != 0) {
	mmc->caps |= MMC_CAP_DISABLE;
	mmc_set_disable_delay(mmc, 100);
	if (mmc_host_enable(host->mmc) != 0) {
		clk_put(host->iclk);
		clk_put(host->fclk);
		goto err1;
	}

	if (clk_enable(host->iclk) != 0) {
		clk_disable(host->fclk);
		mmc_host_disable(host->mmc);
		clk_put(host->iclk);
		clk_put(host->fclk);
		goto err1;
@@ -1197,6 +1240,8 @@ static int __init omap_mmc_probe(struct platform_device *pdev)
	OMAP_HSMMC_WRITE(host->base, ISE, INT_EN_MASK);
	OMAP_HSMMC_WRITE(host->base, IE, INT_EN_MASK);

	mmc_host_lazy_disable(host->mmc);

	mmc_add_host(mmc);

	if (host->pdata->slots[host->slot_id].name != NULL) {
@@ -1225,7 +1270,7 @@ static int __init omap_mmc_probe(struct platform_device *pdev)
err_irq_cd_init:
	free_irq(host->irq, host);
err_irq:
	clk_disable(host->fclk);
	mmc_host_disable(host->mmc);
	clk_disable(host->iclk);
	clk_put(host->fclk);
	clk_put(host->iclk);
@@ -1250,6 +1295,7 @@ static int omap_mmc_remove(struct platform_device *pdev)
	struct resource *res;

	if (host) {
		mmc_host_enable(host->mmc);
		mmc_remove_host(host->mmc);
		if (host->pdata->cleanup)
			host->pdata->cleanup(&pdev->dev);
@@ -1258,7 +1304,7 @@ static int omap_mmc_remove(struct platform_device *pdev)
			free_irq(mmc_slot(host).card_detect_irq, host);
		flush_scheduled_work();

		clk_disable(host->fclk);
		mmc_host_disable(host->mmc);
		clk_disable(host->iclk);
		clk_put(host->fclk);
		clk_put(host->iclk);
@@ -1289,6 +1335,7 @@ static int omap_mmc_suspend(struct platform_device *pdev, pm_message_t state)
		return 0;

	if (host) {
		mmc_host_enable(host->mmc);
		ret = mmc_suspend_host(host->mmc, state);
		if (ret == 0) {
			host->suspended = 1;
@@ -1307,10 +1354,11 @@ static int omap_mmc_suspend(struct platform_device *pdev, pm_message_t state)

			OMAP_HSMMC_WRITE(host->base, HCTL,
					 OMAP_HSMMC_READ(host->base, HCTL) & ~SDBP);
			clk_disable(host->fclk);
			mmc_host_disable(host->mmc);
			clk_disable(host->iclk);
			clk_disable(host->dbclk);
		}
		} else
			mmc_host_disable(host->mmc);

	}
	return ret;
@@ -1327,13 +1375,12 @@ static int omap_mmc_resume(struct platform_device *pdev)

	if (host) {

		ret = clk_enable(host->fclk);
		if (ret)
		if (mmc_host_enable(host->mmc) != 0)
			goto clk_en_err;

		ret = clk_enable(host->iclk);
		if (ret) {
			clk_disable(host->fclk);
			mmc_host_disable(host->mmc);
			clk_put(host->fclk);
			goto clk_en_err;
		}
@@ -1355,6 +1402,7 @@ static int omap_mmc_resume(struct platform_device *pdev)
		ret = mmc_resume_host(host->mmc);
		if (ret == 0)
			host->suspended = 0;
		mmc_host_lazy_disable(host->mmc);
	}

	return ret;