|
@@ -52,9 +52,17 @@
|
|
#define MPC_DMA_DESCRIPTORS 64
|
|
#define MPC_DMA_DESCRIPTORS 64
|
|
|
|
|
|
/* Macro definitions */
|
|
/* Macro definitions */
|
|
-#define MPC_DMA_CHANNELS 64
|
|
|
|
#define MPC_DMA_TCD_OFFSET 0x1000
|
|
#define MPC_DMA_TCD_OFFSET 0x1000
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * Maximum channel counts for individual hardware variants
|
|
|
|
+ * and the maximum channel count over all supported controllers,
|
|
|
|
+ * used for data structure size
|
|
|
|
+ */
|
|
|
|
+#define MPC8308_DMACHAN_MAX 16
|
|
|
|
+#define MPC512x_DMACHAN_MAX 64
|
|
|
|
+#define MPC_DMA_CHANNELS 64
|
|
|
|
+
|
|
/* Arbitration mode of group and channel */
|
|
/* Arbitration mode of group and channel */
|
|
#define MPC_DMA_DMACR_EDCG (1 << 31)
|
|
#define MPC_DMA_DMACR_EDCG (1 << 31)
|
|
#define MPC_DMA_DMACR_ERGA (1 << 3)
|
|
#define MPC_DMA_DMACR_ERGA (1 << 3)
|
|
@@ -710,10 +718,10 @@ static int mpc_dma_probe(struct platform_device *op)
|
|
|
|
|
|
dma = &mdma->dma;
|
|
dma = &mdma->dma;
|
|
dma->dev = dev;
|
|
dma->dev = dev;
|
|
- if (!mdma->is_mpc8308)
|
|
|
|
- dma->chancnt = MPC_DMA_CHANNELS;
|
|
|
|
|
|
+ if (mdma->is_mpc8308)
|
|
|
|
+ dma->chancnt = MPC8308_DMACHAN_MAX;
|
|
else
|
|
else
|
|
- dma->chancnt = 16; /* MPC8308 DMA has only 16 channels */
|
|
|
|
|
|
+ dma->chancnt = MPC512x_DMACHAN_MAX;
|
|
dma->device_alloc_chan_resources = mpc_dma_alloc_chan_resources;
|
|
dma->device_alloc_chan_resources = mpc_dma_alloc_chan_resources;
|
|
dma->device_free_chan_resources = mpc_dma_free_chan_resources;
|
|
dma->device_free_chan_resources = mpc_dma_free_chan_resources;
|
|
dma->device_issue_pending = mpc_dma_issue_pending;
|
|
dma->device_issue_pending = mpc_dma_issue_pending;
|
|
@@ -747,7 +755,19 @@ static int mpc_dma_probe(struct platform_device *op)
|
|
* - Round-robin group arbitration,
|
|
* - Round-robin group arbitration,
|
|
* - Round-robin channel arbitration.
|
|
* - Round-robin channel arbitration.
|
|
*/
|
|
*/
|
|
- if (!mdma->is_mpc8308) {
|
|
|
|
|
|
+ if (mdma->is_mpc8308) {
|
|
|
|
+ /* MPC8308 has 16 channels and lacks some registers */
|
|
|
|
+ out_be32(&mdma->regs->dmacr, MPC_DMA_DMACR_ERCA);
|
|
|
|
+
|
|
|
|
+ /* enable snooping */
|
|
|
|
+ out_be32(&mdma->regs->dmagpor, MPC_DMA_DMAGPOR_SNOOP_ENABLE);
|
|
|
|
+ /* Disable error interrupts */
|
|
|
|
+ out_be32(&mdma->regs->dmaeeil, 0);
|
|
|
|
+
|
|
|
|
+ /* Clear interrupts status */
|
|
|
|
+ out_be32(&mdma->regs->dmaintl, 0xFFFF);
|
|
|
|
+ out_be32(&mdma->regs->dmaerrl, 0xFFFF);
|
|
|
|
+ } else {
|
|
out_be32(&mdma->regs->dmacr, MPC_DMA_DMACR_EDCG |
|
|
out_be32(&mdma->regs->dmacr, MPC_DMA_DMACR_EDCG |
|
|
MPC_DMA_DMACR_ERGA | MPC_DMA_DMACR_ERCA);
|
|
MPC_DMA_DMACR_ERGA | MPC_DMA_DMACR_ERCA);
|
|
|
|
|
|
@@ -768,18 +788,6 @@ static int mpc_dma_probe(struct platform_device *op)
|
|
/* Route interrupts to IPIC */
|
|
/* Route interrupts to IPIC */
|
|
out_be32(&mdma->regs->dmaihsa, 0);
|
|
out_be32(&mdma->regs->dmaihsa, 0);
|
|
out_be32(&mdma->regs->dmailsa, 0);
|
|
out_be32(&mdma->regs->dmailsa, 0);
|
|
- } else {
|
|
|
|
- /* MPC8308 has 16 channels and lacks some registers */
|
|
|
|
- out_be32(&mdma->regs->dmacr, MPC_DMA_DMACR_ERCA);
|
|
|
|
-
|
|
|
|
- /* enable snooping */
|
|
|
|
- out_be32(&mdma->regs->dmagpor, MPC_DMA_DMAGPOR_SNOOP_ENABLE);
|
|
|
|
- /* Disable error interrupts */
|
|
|
|
- out_be32(&mdma->regs->dmaeeil, 0);
|
|
|
|
-
|
|
|
|
- /* Clear interrupts status */
|
|
|
|
- out_be32(&mdma->regs->dmaintl, 0xFFFF);
|
|
|
|
- out_be32(&mdma->regs->dmaerrl, 0xFFFF);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
/* Register DMA engine */
|
|
/* Register DMA engine */
|