[PATCH 3/3 v2] dmaengine: Add Freescale i.MX SDMA support

Sascha Hauer s.hauer at pengutronix.de
Tue Aug 24 02:58:43 EDT 2010


On Mon, Aug 23, 2010 at 07:30:34PM +0200, Linus Walleij wrote:
> 2010/8/23 Sascha Hauer <s.hauer at pengutronix.de>:
> 
> > This patch adds support for the Freescale i.MX SDMA engine.
> 
> Great progress!
> 
> > (...)
> > diff --git a/drivers/dma/imx-sdma.c b/drivers/dma/imx-sdma.c
> > (...)
> > +/* SDMA registers */
> > +#define SDMA_H_C0PTR           (sdma->regs + 0x000)
> > +#define SDMA_H_INTR            (sdma->regs + 0x004)
> > +#define SDMA_H_STATSTOP                (sdma->regs + 0x008)
> > +#define SDMA_H_START           (sdma->regs + 0x00c)
> > +#define SDMA_H_EVTOVR          (sdma->regs + 0x010)
> > +#define SDMA_H_DSPOVR          (sdma->regs + 0x014)
> > +#define SDMA_H_HOSTOVR         (sdma->regs + 0x018)
> > +#define SDMA_H_EVTPEND         (sdma->regs + 0x01c)
> > +#define SDMA_H_DSPENBL         (sdma->regs + 0x020)
> > +#define SDMA_H_RESET           (sdma->regs + 0x024)
> > +#define SDMA_H_EVTERR          (sdma->regs + 0x028)
> > +#define SDMA_H_INTRMSK         (sdma->regs + 0x02c)
> > +#define SDMA_H_PSW             (sdma->regs + 0x030)
> > +#define SDMA_H_EVTERRDBG       (sdma->regs + 0x034)
> > +#define SDMA_H_CONFIG          (sdma->regs + 0x038)
> > +#define SDMA_ONCE_ENB          (sdma->regs + 0x040)
> > +#define SDMA_ONCE_DATA         (sdma->regs + 0x044)
> > +#define SDMA_ONCE_INSTR                (sdma->regs + 0x048)
> > +#define SDMA_ONCE_STAT         (sdma->regs + 0x04c)
> > +#define SDMA_ONCE_CMD          (sdma->regs + 0x050)
> > +#define SDMA_EVT_MIRROR                (sdma->regs + 0x054)
> > +#define SDMA_ILLINSTADDR       (sdma->regs + 0x058)
> > +#define SDMA_CHN0ADDR          (sdma->regs + 0x05c)
> > +#define SDMA_ONCE_RTB          (sdma->regs + 0x060)
> > +#define SDMA_XTRIG_CONF1       (sdma->regs + 0x070)
> > +#define SDMA_XTRIG_CONF2       (sdma->regs + 0x074)
> > +#define SDMA_CHNENBL_0         (sdma->regs + (sdma->version == 2 ? 0x200 : 0x80))
> > +#define SDMA_CHNPRI_0          (sdma->regs + 0x100)
> 
> These macros expand to the local variable "sdma" which must
> be present in all functions using them. I don't know what is
> considered moste readable, but I would certainly just
> 
> #define SDMA_FOO (0x0123)
> (...)
> u32 foo = readl(sdma->regs + SDMA_FOO);
> 
> That is more common I think.
> > +
> > +/*
> > + * This enumerates transfer types
> > + */
> > +enum {
> > +       emi_2_per = 0,          /* EMI memory to peripheral */
> > +       emi_2_int,              /* EMI memory to internal RAM */
> > +       emi_2_emi,              /* EMI memory to EMI memory */
> > +       emi_2_dsp,              /* EMI memory to DSP memory */
> > +       per_2_int,              /* Peripheral to internal RAM */
> > +       per_2_emi,              /* Peripheral to internal EMI memory */
> > +       per_2_dsp,              /* Peripheral to DSP memory */
> > +       per_2_per,              /* Peripheral to Peripheral */
> > +       int_2_per,              /* Internal RAM to peripheral */
> > +       int_2_int,              /* Internal RAM to Internal RAM */
> > +       int_2_emi,              /* Internal RAM to EMI memory */
> > +       int_2_dsp,              /* Internal RAM to DSP memory */
> > +       dsp_2_per,              /* DSP memory to peripheral */
> > +       dsp_2_int,              /* DSP memory to internal RAM */
> > +       dsp_2_emi,              /* DSP memory to EMI memory */
> > +       dsp_2_dsp,              /* DSP memory to DSP memory */
> > +       emi_2_dsp_loop,         /* EMI memory to DSP memory loopback */
> > +       dsp_2_emi_loop,         /* DSP memory to EMI memory loopback */
> > +       dvfs_pll,               /* DVFS script with PLL change       */
> > +       dvfs_pdr                /* DVFS script without PLL change    */
> > +} sdma_transfer_type;
> 
> Picky me, but it's no type, its an enum. I understand that it is
> a technical term...
> 
> What about just calling is sdma_transfer? Short and nice.
> Or sdma_transfer_line?

This turned out to be unused anyway, so the simple fix was to remove it.

> 
> > (...)
> > +/*
> > + * Stores the start address of the SDMA scripts
> > + */
> > +static struct sdma_script_start_addrs __sdma_script_addrs;
> > +static struct sdma_script_start_addrs *sdma_script_addrs = &__sdma_script_addrs;
> 
> What's the rationale behind prefixing that variable with __?
> 
> The same name for struct and variable is perfectly viable.

The rationale was to statically allocate a struct
sdma_script_start_addrs and create a pointer to it so that I don't have
to use &__sdma_script_addrs in the code.

I forgot this one while converting the driver to multi instance, so this
is now part of struct sdma_engine.

Fixed the other stuff aswell, I will send an update shortly.

Regards,
  Sascha

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |



More information about the linux-arm-kernel mailing list