diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-05-05 11:23:16 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-05-05 11:23:16 -0400 |
commit | 37ecfd807b82bf547429fe1376e1fe7000ba7cff (patch) | |
tree | 0d1810bce95fc46505ee7ab529e7795c23ef9c80 | |
parent | 71019c350aca8fe650246988e64bfd2c89192180 (diff) | |
parent | 2e058a6fb004a6b6c3eb6a219ae408f83b670598 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/drzeus/mmc
* '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
-rw-r--r-- | drivers/mmc/card/block.c | 8 | ||||
-rw-r--r-- | drivers/mmc/core/core.c | 4 | ||||
-rw-r--r-- | drivers/mmc/host/mmci.c | 2 | ||||
-rw-r--r-- | drivers/mmc/host/mvsdio.c | 11 | ||||
-rw-r--r-- | drivers/mmc/host/sdhci-pci.c | 8 | ||||
-rw-r--r-- | drivers/mmc/host/sdhci.h | 2 |
6 files changed, 22 insertions, 13 deletions
diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index fe8041e619ea..b25e9b6516ae 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c | |||
@@ -254,6 +254,14 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) | |||
254 | brq.data.blocks = req->nr_sectors; | 254 | brq.data.blocks = req->nr_sectors; |
255 | 255 | ||
256 | /* | 256 | /* |
257 | * The block layer doesn't support all sector count | ||
258 | * restrictions, so we need to be prepared for too big | ||
259 | * requests. | ||
260 | */ | ||
261 | if (brq.data.blocks > card->host->max_blk_count) | ||
262 | brq.data.blocks = card->host->max_blk_count; | ||
263 | |||
264 | /* | ||
257 | * After a read error, we redo the request one sector at a time | 265 | * After a read error, we redo the request one sector at a time |
258 | * in order to accurately determine which sectors can be read | 266 | * in order to accurately determine which sectors can be read |
259 | * successfully. | 267 | * successfully. |
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index fa073ab3fa34..264911732756 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c | |||
@@ -706,7 +706,7 @@ static void mmc_power_up(struct mmc_host *host) | |||
706 | * This delay should be sufficient to allow the power supply | 706 | * This delay should be sufficient to allow the power supply |
707 | * to reach the minimum voltage. | 707 | * to reach the minimum voltage. |
708 | */ | 708 | */ |
709 | mmc_delay(2); | 709 | mmc_delay(10); |
710 | 710 | ||
711 | host->ios.clock = host->f_min; | 711 | host->ios.clock = host->f_min; |
712 | host->ios.power_mode = MMC_POWER_ON; | 712 | host->ios.power_mode = MMC_POWER_ON; |
@@ -716,7 +716,7 @@ static void mmc_power_up(struct mmc_host *host) | |||
716 | * This delay must be at least 74 clock sizes, or 1 ms, or the | 716 | * This delay must be at least 74 clock sizes, or 1 ms, or the |
717 | * time required to reach a stable voltage. | 717 | * time required to reach a stable voltage. |
718 | */ | 718 | */ |
719 | mmc_delay(2); | 719 | mmc_delay(10); |
720 | } | 720 | } |
721 | 721 | ||
722 | static void mmc_power_off(struct mmc_host *host) | 722 | static void mmc_power_off(struct mmc_host *host) |
diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c index a663429b3d55..36875dcfa492 100644 --- a/drivers/mmc/host/mmci.c +++ b/drivers/mmc/host/mmci.c | |||
@@ -514,6 +514,7 @@ static int __devinit mmci_probe(struct amba_device *dev, void *id) | |||
514 | } | 514 | } |
515 | 515 | ||
516 | host = mmc_priv(mmc); | 516 | host = mmc_priv(mmc); |
517 | host->mmc = mmc; | ||
517 | /* Bits 12 thru 19 is the designer */ | 518 | /* Bits 12 thru 19 is the designer */ |
518 | host->hw_designer = (dev->periphid >> 12) & 0xff; | 519 | host->hw_designer = (dev->periphid >> 12) & 0xff; |
519 | /* Bits 20 thru 23 is the revison */ | 520 | /* Bits 20 thru 23 is the revison */ |
@@ -545,7 +546,6 @@ static int __devinit mmci_probe(struct amba_device *dev, void *id) | |||
545 | host->mclk = clk_get_rate(host->clk); | 546 | host->mclk = clk_get_rate(host->clk); |
546 | DBG(host, "eventual mclk rate: %u Hz\n", host->mclk); | 547 | DBG(host, "eventual mclk rate: %u Hz\n", host->mclk); |
547 | } | 548 | } |
548 | host->mmc = mmc; | ||
549 | host->base = ioremap(dev->res.start, SZ_4K); | 549 | host->base = ioremap(dev->res.start, SZ_4K); |
550 | if (!host->base) { | 550 | if (!host->base) { |
551 | ret = -ENOMEM; | 551 | ret = -ENOMEM; |
diff --git a/drivers/mmc/host/mvsdio.c b/drivers/mmc/host/mvsdio.c index b5c375d94ab3..c643d0fe118f 100644 --- a/drivers/mmc/host/mvsdio.c +++ b/drivers/mmc/host/mvsdio.c | |||
@@ -825,24 +825,23 @@ static int __exit mvsd_remove(struct platform_device *pdev) | |||
825 | } | 825 | } |
826 | 826 | ||
827 | #ifdef CONFIG_PM | 827 | #ifdef CONFIG_PM |
828 | static int mvsd_suspend(struct platform_device *dev, pm_message_t state, | 828 | static int mvsd_suspend(struct platform_device *dev, pm_message_t state) |
829 | u32 level) | ||
830 | { | 829 | { |
831 | struct mmc_host *mmc = platform_get_drvdata(dev); | 830 | struct mmc_host *mmc = platform_get_drvdata(dev); |
832 | int ret = 0; | 831 | int ret = 0; |
833 | 832 | ||
834 | if (mmc && level == SUSPEND_DISABLE) | 833 | if (mmc) |
835 | ret = mmc_suspend_host(mmc, state); | 834 | ret = mmc_suspend_host(mmc, state); |
836 | 835 | ||
837 | return ret; | 836 | return ret; |
838 | } | 837 | } |
839 | 838 | ||
840 | static int mvsd_resume(struct platform_device *dev, u32 level) | 839 | static int mvsd_resume(struct platform_device *dev) |
841 | { | 840 | { |
842 | struct mmc_host *mmc = platform_dev_get_drvdata(dev); | 841 | struct mmc_host *mmc = platform_get_drvdata(dev); |
843 | int ret = 0; | 842 | int ret = 0; |
844 | 843 | ||
845 | if (mmc && level == RESUME_ENABLE) | 844 | if (mmc) |
846 | ret = mmc_resume_host(mmc); | 845 | ret = mmc_resume_host(mmc); |
847 | 846 | ||
848 | return ret; | 847 | return ret; |
diff --git a/drivers/mmc/host/sdhci-pci.c b/drivers/mmc/host/sdhci-pci.c index cd37962ec44f..65be27995d5c 100644 --- a/drivers/mmc/host/sdhci-pci.c +++ b/drivers/mmc/host/sdhci-pci.c | |||
@@ -522,8 +522,8 @@ static struct sdhci_pci_slot * __devinit sdhci_pci_probe_slot( | |||
522 | 522 | ||
523 | host = sdhci_alloc_host(&pdev->dev, sizeof(struct sdhci_pci_slot)); | 523 | host = sdhci_alloc_host(&pdev->dev, sizeof(struct sdhci_pci_slot)); |
524 | if (IS_ERR(host)) { | 524 | if (IS_ERR(host)) { |
525 | ret = PTR_ERR(host); | 525 | dev_err(&pdev->dev, "cannot allocate host\n"); |
526 | goto unmap; | 526 | return ERR_PTR(PTR_ERR(host)); |
527 | } | 527 | } |
528 | 528 | ||
529 | slot = sdhci_priv(host); | 529 | slot = sdhci_priv(host); |
@@ -541,7 +541,7 @@ static struct sdhci_pci_slot * __devinit sdhci_pci_probe_slot( | |||
541 | ret = pci_request_region(pdev, bar, mmc_hostname(host->mmc)); | 541 | ret = pci_request_region(pdev, bar, mmc_hostname(host->mmc)); |
542 | if (ret) { | 542 | if (ret) { |
543 | dev_err(&pdev->dev, "cannot request region\n"); | 543 | dev_err(&pdev->dev, "cannot request region\n"); |
544 | return ERR_PTR(ret); | 544 | goto free; |
545 | } | 545 | } |
546 | 546 | ||
547 | addr = pci_resource_start(pdev, bar); | 547 | addr = pci_resource_start(pdev, bar); |
@@ -572,6 +572,8 @@ unmap: | |||
572 | 572 | ||
573 | release: | 573 | release: |
574 | pci_release_region(pdev, bar); | 574 | pci_release_region(pdev, bar); |
575 | |||
576 | free: | ||
575 | sdhci_free_host(host); | 577 | sdhci_free_host(host); |
576 | 578 | ||
577 | return ERR_PTR(ret); | 579 | return ERR_PTR(ret); |
diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h index f20a834f4309..65c6f996bbd3 100644 --- a/drivers/mmc/host/sdhci.h +++ b/drivers/mmc/host/sdhci.h | |||
@@ -125,7 +125,7 @@ | |||
125 | #define SDHCI_INT_DATA_MASK (SDHCI_INT_DATA_END | SDHCI_INT_DMA_END | \ | 125 | #define SDHCI_INT_DATA_MASK (SDHCI_INT_DATA_END | SDHCI_INT_DMA_END | \ |
126 | SDHCI_INT_DATA_AVAIL | SDHCI_INT_SPACE_AVAIL | \ | 126 | SDHCI_INT_DATA_AVAIL | SDHCI_INT_SPACE_AVAIL | \ |
127 | SDHCI_INT_DATA_TIMEOUT | SDHCI_INT_DATA_CRC | \ | 127 | SDHCI_INT_DATA_TIMEOUT | SDHCI_INT_DATA_CRC | \ |
128 | SDHCI_INT_DATA_END_BIT) | 128 | SDHCI_INT_DATA_END_BIT | SDHCI_ADMA_ERROR) |
129 | #define SDHCI_INT_ALL_MASK ((unsigned int)-1) | 129 | #define SDHCI_INT_ALL_MASK ((unsigned int)-1) |
130 | 130 | ||
131 | #define SDHCI_ACMD12_ERR 0x3C | 131 | #define SDHCI_ACMD12_ERR 0x3C |