aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mmc
diff options
context:
space:
mode:
authorGrazvydas Ignotas <notasas@gmail.com>2009-01-03 05:36:13 -0500
committerPierre Ossman <drzeus@drzeus.cx>2009-03-24 16:30:06 -0400
commitf3e2f1dd3bbe9352654eec8223495d35e1f52af2 (patch)
tree8c81cf861a65d530bfcf8635710e60cec624c34c /drivers/mmc
parent0683af4887bf61b5285c4e08cad5c7d110fbd605 (diff)
omap_hsmmc: Fix MMC3 dma
Data transfers on third OMAP3 MMC controller don't work because DMA line numbers are only defined for MMC1 and MMC2. Fix that and store line numbers in mmc_omap_host structure to reduce code size. Tested on OMAP3 pandora board. Signed-off-by: Grazvydas Ignotas <notasas@gmail.com> Signed-off-by: Pierre Ossman <drzeus@drzeus.cx>
Diffstat (limited to 'drivers/mmc')
-rw-r--r--drivers/mmc/host/omap_hsmmc.c36
1 files changed, 25 insertions, 11 deletions
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index 283265154944..61883093e25b 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -100,6 +100,7 @@
100 */ 100 */
101#define OMAP_MMC1_DEVID 0 101#define OMAP_MMC1_DEVID 0
102#define OMAP_MMC2_DEVID 1 102#define OMAP_MMC2_DEVID 1
103#define OMAP_MMC3_DEVID 2
103 104
104#define MMC_TIMEOUT_MS 20 105#define MMC_TIMEOUT_MS 20
105#define OMAP_MMC_MASTER_CLOCK 96000000 106#define OMAP_MMC_MASTER_CLOCK 96000000
@@ -144,6 +145,7 @@ struct mmc_omap_host {
144 int irq; 145 int irq;
145 int carddetect; 146 int carddetect;
146 int use_dma, dma_ch; 147 int use_dma, dma_ch;
148 int dma_line_tx, dma_line_rx;
147 int slot_id; 149 int slot_id;
148 int dbclk_enabled; 150 int dbclk_enabled;
149 int response_busy; 151 int response_busy;
@@ -602,17 +604,10 @@ static int mmc_omap_get_dma_sync_dev(struct mmc_omap_host *host,
602{ 604{
603 int sync_dev; 605 int sync_dev;
604 606
605 if (data->flags & MMC_DATA_WRITE) { 607 if (data->flags & MMC_DATA_WRITE)
606 if (host->id == OMAP_MMC1_DEVID) 608 sync_dev = host->dma_line_tx;
607 sync_dev = OMAP24XX_DMA_MMC1_TX; 609 else
608 else 610 sync_dev = host->dma_line_rx;
609 sync_dev = OMAP24XX_DMA_MMC2_TX;
610 } else {
611 if (host->id == OMAP_MMC1_DEVID)
612 sync_dev = OMAP24XX_DMA_MMC1_RX;
613 else
614 sync_dev = OMAP24XX_DMA_MMC2_RX;
615 }
616 return sync_dev; 611 return sync_dev;
617} 612}
618 613
@@ -1075,6 +1070,25 @@ static int __init omap_mmc_probe(struct platform_device *pdev)
1075 1070
1076 omap_hsmmc_init(host); 1071 omap_hsmmc_init(host);
1077 1072
1073 /* Select DMA lines */
1074 switch (host->id) {
1075 case OMAP_MMC1_DEVID:
1076 host->dma_line_tx = OMAP24XX_DMA_MMC1_TX;
1077 host->dma_line_rx = OMAP24XX_DMA_MMC1_RX;
1078 break;
1079 case OMAP_MMC2_DEVID:
1080 host->dma_line_tx = OMAP24XX_DMA_MMC2_TX;
1081 host->dma_line_rx = OMAP24XX_DMA_MMC2_RX;
1082 break;
1083 case OMAP_MMC3_DEVID:
1084 host->dma_line_tx = OMAP34XX_DMA_MMC3_TX;
1085 host->dma_line_rx = OMAP34XX_DMA_MMC3_RX;
1086 break;
1087 default:
1088 dev_err(mmc_dev(host->mmc), "Invalid MMC id\n");
1089 goto err_irq;
1090 }
1091
1078 /* Request IRQ for MMC operations */ 1092 /* Request IRQ for MMC operations */
1079 ret = request_irq(host->irq, mmc_omap_irq, IRQF_DISABLED, 1093 ret = request_irq(host->irq, mmc_omap_irq, IRQF_DISABLED,
1080 mmc_hostname(mmc), host); 1094 mmc_hostname(mmc), host);