[PATCH RFC v5 1/5] dma: mpc512x: reorder mpc8308 specific instructions
Anatolij Gustschin
agust at denx.de
Fri Nov 1 21:04:18 EST 2013
On Fri, 1 Nov 2013 11:19:30 +0400
Alexander Popov <a13xp0p0v88 at gmail.com> wrote:
> Concentrate the specific code for MPC8308 in the 'if' branch
> and handle MPC512x in the 'else' branch.
> This modification only reorders instructions but doesn't change behaviour.
>
> Signed-off-by: Alexander Popov <a13xp0p0v88 at gmail.com>
> ---
> drivers/dma/mpc512x_dma.c | 42 +++++++++++++++++++++++++-----------------
> 1 file changed, 25 insertions(+), 17 deletions(-)
Acked-by: Anatolij Gustschin <agust at denx.de>
>
> diff --git a/drivers/dma/mpc512x_dma.c b/drivers/dma/mpc512x_dma.c
> index 2fe4353..f41639f 100644
> --- a/drivers/dma/mpc512x_dma.c
> +++ b/drivers/dma/mpc512x_dma.c
> @@ -50,9 +50,17 @@
> #define MPC_DMA_DESCRIPTORS 64
>
> /* Macro definitions */
> -#define MPC_DMA_CHANNELS 64
> #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 */
> #define MPC_DMA_DMACR_EDCG (1 << 31)
> #define MPC_DMA_DMACR_ERGA (1 << 3)
> @@ -708,10 +716,10 @@ static int mpc_dma_probe(struct platform_device *op)
>
> dma = &mdma->dma;
> dma->dev = dev;
> - if (!mdma->is_mpc8308)
> - dma->chancnt = MPC_DMA_CHANNELS;
> + if (mdma->is_mpc8308)
> + dma->chancnt = MPC8308_DMACHAN_MAX;
> 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_free_chan_resources = mpc_dma_free_chan_resources;
> dma->device_issue_pending = mpc_dma_issue_pending;
> @@ -745,7 +753,19 @@ static int mpc_dma_probe(struct platform_device *op)
> * - Round-robin group 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 |
> MPC_DMA_DMACR_ERGA | MPC_DMA_DMACR_ERCA);
>
> @@ -766,18 +786,6 @@ static int mpc_dma_probe(struct platform_device *op)
> /* Route interrupts to IPIC */
> out_be32(&mdma->regs->dmaihsa, 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 */
More information about the Linuxppc-dev
mailing list