From: Russell King Date: Fri, 26 Oct 2007 16:56:40 +0000 (+0100) Subject: [ARM] Fix pxamci regression X-Git-Tag: v2.6.24-rc2~64^2~7 X-Git-Url: http://pilppa.com/gitweb/?a=commitdiff_plain;h=d8cb70d10a2d4e6b083b89044a68d860d0bf1eec;p=linux-2.6-omap-h63xx.git [ARM] Fix pxamci regression Fix: WARNING: at arch/arm/mach-pxa/clock.c:69 clk_disable() [] (dump_stack+0x0/0x14) from [] (clk_disable+0x34/0xa0) [] (clk_disable+0x0/0xa0) from [] (pxamci_set_ios+0x74/0xf0) [] (pxamci_set_ios+0x0/0xf0) from [] (mmc_power_off+0x90/0x9c) [] (mmc_power_off+0x0/0x9c) from [] (mmc_start_host+0x18/0x28) [] (mmc_start_host+0x0/0x28) from [] (mmc_add_host+0xe8/0x104) [] (mmc_add_host+0x0/0x104) from [] (pxamci_probe+0x24c/0x2f4) [] (pxamci_probe+0x0/0x2f4) from [] (platform_drv_probe+0x20/0x24) ... Signed-off-by: Russell King --- diff --git a/drivers/mmc/host/pxamci.c b/drivers/mmc/host/pxamci.c index a25ee71998a..1654a333034 100644 --- a/drivers/mmc/host/pxamci.c +++ b/drivers/mmc/host/pxamci.c @@ -39,6 +39,7 @@ #define DRIVER_NAME "pxa2xx-mci" #define NR_SG 1 +#define CLKRT_OFF (~0) struct pxamci_host { struct mmc_host *mmc; @@ -371,6 +372,9 @@ static void pxamci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) unsigned long rate = host->clkrate; unsigned int clk = rate / ios->clock; + if (host->clkrt == CLKRT_OFF) + clk_enable(host->clk); + /* * clk might result in a lower divisor than we * desire. check for that condition and adjust @@ -379,14 +383,16 @@ static void pxamci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) if (rate / clk > ios->clock) clk <<= 1; host->clkrt = fls(clk) - 1; - clk_enable(host->clk); /* * we write clkrt on the next command */ } else { pxamci_stop_clock(host); - clk_disable(host->clk); + if (host->clkrt != CLKRT_OFF) { + host->clkrt = CLKRT_OFF; + clk_disable(host->clk); + } } if (host->power_mode != ios->power_mode) { @@ -498,6 +504,7 @@ static int pxamci_probe(struct platform_device *pdev) host->mmc = mmc; host->dma = -1; host->pdata = pdev->dev.platform_data; + host->clkrt = CLKRT_OFF; host->clk = clk_get(&pdev->dev, "MMCCLK"); if (IS_ERR(host->clk)) {