Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/drzeus/mmc
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 5 May 2009 15:23:16 +0000 (08:23 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 5 May 2009 15:23:16 +0000 (08:23 -0700)
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/drzeus/mmc:
  mvsdio: fix CONFIG_PM=y build
  mmci: fix crash with debug enabled
  sdhci: catch ADMA errors
  mmc: increase power up delay
  sdhci-pci: bad error handling in probe function
  mmc_block: be prepared for oversized requests

drivers/mmc/card/block.c
drivers/mmc/core/core.c
drivers/mmc/host/mmci.c
drivers/mmc/host/mvsdio.c
drivers/mmc/host/sdhci-pci.c
drivers/mmc/host/sdhci.h

index fe8041e..b25e9b6 100644 (file)
@@ -253,6 +253,14 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)
                brq.stop.flags = MMC_RSP_SPI_R1B | MMC_RSP_R1B | MMC_CMD_AC;
                brq.data.blocks = req->nr_sectors;
 
+               /*
+                * The block layer doesn't support all sector count
+                * restrictions, so we need to be prepared for too big
+                * requests.
+                */
+               if (brq.data.blocks > card->host->max_blk_count)
+                       brq.data.blocks = card->host->max_blk_count;
+
                /*
                 * After a read error, we redo the request one sector at a time
                 * in order to accurately determine which sectors can be read
index fa073ab..2649117 100644 (file)
@@ -706,7 +706,7 @@ static void mmc_power_up(struct mmc_host *host)
         * This delay should be sufficient to allow the power supply
         * to reach the minimum voltage.
         */
-       mmc_delay(2);
+       mmc_delay(10);
 
        host->ios.clock = host->f_min;
        host->ios.power_mode = MMC_POWER_ON;
@@ -716,7 +716,7 @@ static void mmc_power_up(struct mmc_host *host)
         * This delay must be at least 74 clock sizes, or 1 ms, or the
         * time required to reach a stable voltage.
         */
-       mmc_delay(2);
+       mmc_delay(10);
 }
 
 static void mmc_power_off(struct mmc_host *host)
index a663429..36875dc 100644 (file)
@@ -514,6 +514,7 @@ static int __devinit mmci_probe(struct amba_device *dev, void *id)
        }
 
        host = mmc_priv(mmc);
+       host->mmc = mmc;
        /* Bits 12 thru 19 is the designer */
        host->hw_designer = (dev->periphid >> 12) & 0xff;
        /* Bits 20 thru 23 is the revison */
@@ -545,7 +546,6 @@ static int __devinit mmci_probe(struct amba_device *dev, void *id)
                host->mclk = clk_get_rate(host->clk);
                DBG(host, "eventual mclk rate: %u Hz\n", host->mclk);
        }
-       host->mmc = mmc;
        host->base = ioremap(dev->res.start, SZ_4K);
        if (!host->base) {
                ret = -ENOMEM;
index b5c375d..c643d0f 100644 (file)
@@ -825,24 +825,23 @@ static int __exit mvsd_remove(struct platform_device *pdev)
 }
 
 #ifdef CONFIG_PM
-static int mvsd_suspend(struct platform_device *dev, pm_message_t state,
-                          u32 level)
+static int mvsd_suspend(struct platform_device *dev, pm_message_t state)
 {
        struct mmc_host *mmc = platform_get_drvdata(dev);
        int ret = 0;
 
-       if (mmc && level == SUSPEND_DISABLE)
+       if (mmc)
                ret = mmc_suspend_host(mmc, state);
 
        return ret;
 }
 
-static int mvsd_resume(struct platform_device *dev, u32 level)
+static int mvsd_resume(struct platform_device *dev)
 {
-       struct mmc_host *mmc = platform_dev_get_drvdata(dev);
+       struct mmc_host *mmc = platform_get_drvdata(dev);
        int ret = 0;
 
-       if (mmc && level == RESUME_ENABLE)
+       if (mmc)
                ret = mmc_resume_host(mmc);
 
        return ret;
index cd37962..65be279 100644 (file)
@@ -522,8 +522,8 @@ static struct sdhci_pci_slot * __devinit sdhci_pci_probe_slot(
 
        host = sdhci_alloc_host(&pdev->dev, sizeof(struct sdhci_pci_slot));
        if (IS_ERR(host)) {
-               ret = PTR_ERR(host);
-               goto unmap;
+               dev_err(&pdev->dev, "cannot allocate host\n");
+               return ERR_PTR(PTR_ERR(host));
        }
 
        slot = sdhci_priv(host);
@@ -541,7 +541,7 @@ static struct sdhci_pci_slot * __devinit sdhci_pci_probe_slot(
        ret = pci_request_region(pdev, bar, mmc_hostname(host->mmc));
        if (ret) {
                dev_err(&pdev->dev, "cannot request region\n");
-               return ERR_PTR(ret);
+               goto free;
        }
 
        addr = pci_resource_start(pdev, bar);
@@ -572,6 +572,8 @@ unmap:
 
 release:
        pci_release_region(pdev, bar);
+
+free:
        sdhci_free_host(host);
 
        return ERR_PTR(ret);
index f20a834..65c6f99 100644 (file)
 #define  SDHCI_INT_DATA_MASK   (SDHCI_INT_DATA_END | SDHCI_INT_DMA_END | \
                SDHCI_INT_DATA_AVAIL | SDHCI_INT_SPACE_AVAIL | \
                SDHCI_INT_DATA_TIMEOUT | SDHCI_INT_DATA_CRC | \
-               SDHCI_INT_DATA_END_BIT)
+               SDHCI_INT_DATA_END_BIT | SDHCI_ADMA_ERROR)
 #define SDHCI_INT_ALL_MASK     ((unsigned int)-1)
 
 #define SDHCI_ACMD12_ERR       0x3C