]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/mmc/host/omap_hsmmc.c
omap_hsmmc: Fix MMC3 dma
[linux-2.6-omap-h63xx.git] / drivers / mmc / host / omap_hsmmc.c
index 283265154944a7ae8e0486ae76d5a29e8cb7451d..61883093e25b01080db5403fe7e3687f5f96b588 100644 (file)
  */
 #define OMAP_MMC1_DEVID                0
 #define OMAP_MMC2_DEVID                1
+#define OMAP_MMC3_DEVID                2
 
 #define MMC_TIMEOUT_MS         20
 #define OMAP_MMC_MASTER_CLOCK  96000000
@@ -144,6 +145,7 @@ struct mmc_omap_host {
        int                     irq;
        int                     carddetect;
        int                     use_dma, dma_ch;
+       int                     dma_line_tx, dma_line_rx;
        int                     slot_id;
        int                     dbclk_enabled;
        int                     response_busy;
@@ -602,17 +604,10 @@ static int mmc_omap_get_dma_sync_dev(struct mmc_omap_host *host,
 {
        int sync_dev;
 
-       if (data->flags & MMC_DATA_WRITE) {
-               if (host->id == OMAP_MMC1_DEVID)
-                       sync_dev = OMAP24XX_DMA_MMC1_TX;
-               else
-                       sync_dev = OMAP24XX_DMA_MMC2_TX;
-       } else {
-               if (host->id == OMAP_MMC1_DEVID)
-                       sync_dev = OMAP24XX_DMA_MMC1_RX;
-               else
-                       sync_dev = OMAP24XX_DMA_MMC2_RX;
-       }
+       if (data->flags & MMC_DATA_WRITE)
+               sync_dev = host->dma_line_tx;
+       else
+               sync_dev = host->dma_line_rx;
        return sync_dev;
 }
 
@@ -1075,6 +1070,25 @@ static int __init omap_mmc_probe(struct platform_device *pdev)
 
        omap_hsmmc_init(host);
 
+       /* Select DMA lines */
+       switch (host->id) {
+       case OMAP_MMC1_DEVID:
+               host->dma_line_tx = OMAP24XX_DMA_MMC1_TX;
+               host->dma_line_rx = OMAP24XX_DMA_MMC1_RX;
+               break;
+       case OMAP_MMC2_DEVID:
+               host->dma_line_tx = OMAP24XX_DMA_MMC2_TX;
+               host->dma_line_rx = OMAP24XX_DMA_MMC2_RX;
+               break;
+       case OMAP_MMC3_DEVID:
+               host->dma_line_tx = OMAP34XX_DMA_MMC3_TX;
+               host->dma_line_rx = OMAP34XX_DMA_MMC3_RX;
+               break;
+       default:
+               dev_err(mmc_dev(host->mmc), "Invalid MMC id\n");
+               goto err_irq;
+       }
+
        /* Request IRQ for MMC operations */
        ret = request_irq(host->irq, mmc_omap_irq, IRQF_DISABLED,
                        mmc_hostname(mmc), host);