[PATCH 106/133] [Jaunty SRU] ARM.imx51 Freescale:ENGR00112121 eSDHC driver enhancementes
Brad Figg
brad.figg at canonical.com
Thu Jul 9 16:49:36 UTC 2009
Eanble the MMC HIGHSPEED, make a double check to
enter the data_irq server, add multi-process data
protection when issue one cmd with internal DMA is used.
Signed-off-by: Richard Zhu <r65037 at freescale.com>
Signed-off-by: Brad Figg <brad.figg at canonical.com>
---
drivers/mmc/host/mx_sdhci.c | 21 ++++++++++++++++-----
1 files changed, 16 insertions(+), 5 deletions(-)
diff --git a/drivers/mmc/host/mx_sdhci.c b/drivers/mmc/host/mx_sdhci.c
index 64222a2..fda0984 100644
--- a/drivers/mmc/host/mx_sdhci.c
+++ b/drivers/mmc/host/mx_sdhci.c
@@ -508,15 +508,17 @@ static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_data *data)
int i;
struct scatterlist *tsg;
- DBG("Configure the sg DMA, %s, len is 0x%x\n",
- (data->flags & MMC_DATA_READ)
- ? "DMA_FROM_DEIVCE" : "DMA_TO_DEVICE", data->sg_len);
+ host->dma_size = data->blocks * data->blksz;
count =
dma_map_sg(mmc_dev(host->mmc), data->sg, data->sg_len,
(data->
flags & MMC_DATA_READ) ? DMA_FROM_DEVICE :
DMA_TO_DEVICE);
BUG_ON(count != data->sg_len);
+ DBG("Configure the sg DMA, %s, len is 0x%x, count is %d\n",
+ (data->flags & MMC_DATA_READ)
+ ? "DMA_FROM_DEIVCE" : "DMA_TO_DEVICE", host->dma_size,
+ count);
/* Make sure the ADMA mode is selected. */
i = readl(host->ioaddr + SDHCI_HOST_CONTROL);
@@ -901,6 +903,10 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq)
}
}
}
+
+ if (host->flags & SDHCI_USE_EXTERNAL_DMA)
+ spin_unlock_irqrestore(&host->lock, flags);
+
host->mrq = mrq;
if (!(host->flags & SDHCI_CD_PRESENT)) {
host->mrq->cmd->error = -ENOMEDIUM;
@@ -908,7 +914,8 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq)
} else
sdhci_send_command(host, mrq->cmd);
- spin_unlock_irqrestore(&host->lock, flags);
+ if (!(host->flags & SDHCI_USE_EXTERNAL_DMA))
+ spin_unlock_irqrestore(&host->lock, flags);
mmiowb();
}
@@ -1573,6 +1580,8 @@ static int sdhci_suspend(struct platform_device *pdev, pm_message_t state)
free_irq(chip->hosts[i]->irq, chip->hosts[i]);
}
+ gpio_sdhc_inactive(pdev->id);
+
return 0;
}
@@ -1587,6 +1596,8 @@ static int sdhci_resume(struct platform_device *pdev)
DBG("Resuming...\n");
+ gpio_sdhc_active(pdev->id);
+
for (i = 0; i < chip->num_slots; i++) {
if (!chip->hosts[i])
continue;
@@ -1769,7 +1780,7 @@ static int __devinit sdhci_probe_slot(struct platform_device
mmc->caps |= mmc_plat->caps;
if (caps & SDHCI_CAN_DO_HISPD)
- mmc->caps |= MMC_CAP_SD_HIGHSPEED;
+ mmc->caps |= MMC_CAP_SD_HIGHSPEED | MMC_CAP_MMC_HIGHSPEED;
mmc->ocr_avail = mmc_plat->ocr_mask;
if (caps & SDHCI_CAN_VDD_330)
--
1.6.0.4
More information about the kernel-team
mailing list