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
This commit is contained in:
@@ -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.stop.flags = MMC_RSP_SPI_R1B | MMC_RSP_R1B | MMC_CMD_AC;
|
||||||
brq.data.blocks = req->nr_sectors;
|
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
|
* After a read error, we redo the request one sector at a time
|
||||||
* in order to accurately determine which sectors can be read
|
* in order to accurately determine which sectors can be read
|
||||||
|
@@ -706,7 +706,7 @@ static void mmc_power_up(struct mmc_host *host)
|
|||||||
* This delay should be sufficient to allow the power supply
|
* This delay should be sufficient to allow the power supply
|
||||||
* to reach the minimum voltage.
|
* to reach the minimum voltage.
|
||||||
*/
|
*/
|
||||||
mmc_delay(2);
|
mmc_delay(10);
|
||||||
|
|
||||||
host->ios.clock = host->f_min;
|
host->ios.clock = host->f_min;
|
||||||
host->ios.power_mode = MMC_POWER_ON;
|
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
|
* This delay must be at least 74 clock sizes, or 1 ms, or the
|
||||||
* time required to reach a stable voltage.
|
* time required to reach a stable voltage.
|
||||||
*/
|
*/
|
||||||
mmc_delay(2);
|
mmc_delay(10);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mmc_power_off(struct mmc_host *host)
|
static void mmc_power_off(struct mmc_host *host)
|
||||||
|
@@ -514,6 +514,7 @@ static int __devinit mmci_probe(struct amba_device *dev, void *id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
host = mmc_priv(mmc);
|
host = mmc_priv(mmc);
|
||||||
|
host->mmc = mmc;
|
||||||
/* Bits 12 thru 19 is the designer */
|
/* Bits 12 thru 19 is the designer */
|
||||||
host->hw_designer = (dev->periphid >> 12) & 0xff;
|
host->hw_designer = (dev->periphid >> 12) & 0xff;
|
||||||
/* Bits 20 thru 23 is the revison */
|
/* 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);
|
host->mclk = clk_get_rate(host->clk);
|
||||||
DBG(host, "eventual mclk rate: %u Hz\n", host->mclk);
|
DBG(host, "eventual mclk rate: %u Hz\n", host->mclk);
|
||||||
}
|
}
|
||||||
host->mmc = mmc;
|
|
||||||
host->base = ioremap(dev->res.start, SZ_4K);
|
host->base = ioremap(dev->res.start, SZ_4K);
|
||||||
if (!host->base) {
|
if (!host->base) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
|
@@ -825,24 +825,23 @@ static int __exit mvsd_remove(struct platform_device *pdev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM
|
||||||
static int mvsd_suspend(struct platform_device *dev, pm_message_t state,
|
static int mvsd_suspend(struct platform_device *dev, pm_message_t state)
|
||||||
u32 level)
|
|
||||||
{
|
{
|
||||||
struct mmc_host *mmc = platform_get_drvdata(dev);
|
struct mmc_host *mmc = platform_get_drvdata(dev);
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
if (mmc && level == SUSPEND_DISABLE)
|
if (mmc)
|
||||||
ret = mmc_suspend_host(mmc, state);
|
ret = mmc_suspend_host(mmc, state);
|
||||||
|
|
||||||
return ret;
|
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;
|
int ret = 0;
|
||||||
|
|
||||||
if (mmc && level == RESUME_ENABLE)
|
if (mmc)
|
||||||
ret = mmc_resume_host(mmc);
|
ret = mmc_resume_host(mmc);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@@ -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));
|
host = sdhci_alloc_host(&pdev->dev, sizeof(struct sdhci_pci_slot));
|
||||||
if (IS_ERR(host)) {
|
if (IS_ERR(host)) {
|
||||||
ret = PTR_ERR(host);
|
dev_err(&pdev->dev, "cannot allocate host\n");
|
||||||
goto unmap;
|
return ERR_PTR(PTR_ERR(host));
|
||||||
}
|
}
|
||||||
|
|
||||||
slot = sdhci_priv(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));
|
ret = pci_request_region(pdev, bar, mmc_hostname(host->mmc));
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(&pdev->dev, "cannot request region\n");
|
dev_err(&pdev->dev, "cannot request region\n");
|
||||||
return ERR_PTR(ret);
|
goto free;
|
||||||
}
|
}
|
||||||
|
|
||||||
addr = pci_resource_start(pdev, bar);
|
addr = pci_resource_start(pdev, bar);
|
||||||
@@ -572,6 +572,8 @@ unmap:
|
|||||||
|
|
||||||
release:
|
release:
|
||||||
pci_release_region(pdev, bar);
|
pci_release_region(pdev, bar);
|
||||||
|
|
||||||
|
free:
|
||||||
sdhci_free_host(host);
|
sdhci_free_host(host);
|
||||||
|
|
||||||
return ERR_PTR(ret);
|
return ERR_PTR(ret);
|
||||||
|
@@ -125,7 +125,7 @@
|
|||||||
#define SDHCI_INT_DATA_MASK (SDHCI_INT_DATA_END | SDHCI_INT_DMA_END | \
|
#define SDHCI_INT_DATA_MASK (SDHCI_INT_DATA_END | SDHCI_INT_DMA_END | \
|
||||||
SDHCI_INT_DATA_AVAIL | SDHCI_INT_SPACE_AVAIL | \
|
SDHCI_INT_DATA_AVAIL | SDHCI_INT_SPACE_AVAIL | \
|
||||||
SDHCI_INT_DATA_TIMEOUT | SDHCI_INT_DATA_CRC | \
|
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_INT_ALL_MASK ((unsigned int)-1)
|
||||||
|
|
||||||
#define SDHCI_ACMD12_ERR 0x3C
|
#define SDHCI_ACMD12_ERR 0x3C
|
||||||
|
Reference in New Issue
Block a user