[PATCH v3 01/13] OMAP: DMA: Replace read/write macros with functions
G, Manjunath Kondaiah
manjugk at ti.com
Wed Nov 10 09:01:52 EST 2010
> -----Original Message-----
> From: Kevin Hilman [mailto:khilman at deeprootsystems.com]
> Sent: Wednesday, November 10, 2010 3:08 AM
> To: G, Manjunath Kondaiah
> Cc: linux-omap at vger.kernel.org;
> linux-arm-kernel at lists.infradead.org; Cousson, Benoit;
> Shilimkar, Santosh
> Subject: Re: [PATCH v3 01/13] OMAP: DMA: Replace read/write
> macros with functions
>
> "G, Manjunath Kondaiah" <manjugk at ti.com> writes:
>
> > The low level read/write macros are replaced with static
> inline functions
> > and register offsets are handled through static register
> offset tables
> > mapped through enumeration constants.
> >
> > The objective of this patch is to prepare for omap dma
> driver cleanup
> > and dma hwmod implementation. The code optimization and
> moving machine
> > specific code to respective mach-omapx dma file will be
> handled in the
> > rest of this patch series.
>
> [...]
>
> > -#define dma_write(val, reg)
> \
> > -({
> \
> > - if (cpu_class_is_omap1())
> \
> > - __raw_writew((u16)(val), omap_dma_base +
> OMAP1_DMA_##reg); \
> > - else
> \
> > - __raw_writel((val), omap_dma_base +
> OMAP_DMA4_##reg); \
> > -})
> > +static inline void dma_write(u32 val, int reg, int lch)
> > +{
> > + if (cpu_class_is_omap1()) {
>
> Reminder: any use of cpu_is_* checks outside of init code
> will be NAK'd.
>
> cpu_is_* check do not belong at runtime, especially in a crucial path
> like this.
ok. removed cpu_is_* checks and taken care in init.
>
> > + if (reg > OMAP1_CH_COMMON_START)
> > + __raw_writew(val, dma_base +
> > + (reg_map_omap1[reg] + 0x40 * lch));
> > + else
> > + __raw_writew(val, dma_base +
> reg_map_omap1[reg]);
> > + } else {
> > + if (reg > OMAP2_CH_COMMON_START)
> > + __raw_writel(val, dma_base +
> > + (reg_map_omap2[reg] + 0x60 * lch));
> > + else
> > + __raw_writel(val, dma_base +
> reg_map_omap2[reg]);
> > + }
> > +}
>
> The register base offset, register array and the stride
> (offset between
> instances: 0x40 or 0x60) are detectable at init time, and there's no
> reason to have conditional code for them. IOW, they should
> be init time
> constants. Doing so would greatly simply these functions.
> In fact the
> CH_COMMON_START could also be an init time constant as well.
> So, given
> the following init_time constants: dma_ch_common_start, dma_stride,
> reg_map, the above would be reduced to something actually worth
> inlining, for example (not actually tested):
>
> static inline void dma_write(u32 val, int reg, int lch)
> {
> u8 stride = (reg > dma_ch_common_start) ? dma_stride : 0;
>
> __raw_writel(val, dma_base + (reg_map[reg] + stride * lch));
> }
>
> Same applies to dma_read().
Thanks for the suggestion. It is taken care along with Tony's comment
for handling these read/write's between omap1 and omap2+.
Here is code snippet for handling both omap1(includes 16 bit
registers) and omap2+
static inline void dma_write(u32 val, int reg, int lch)
{
u8 stride;
u32 offset;
stride = (reg >= dma_common_ch_start) ? dma_stride : 0;
offset = reg_map[reg] + (stride * lch);
if (dma_stride == 0x40) {
__raw_writew(val, omap_dma_base + offset);
if ((reg > CLNK_CTRL && reg < CCR2) ||
(reg > PCHD_ID && reg < CAPS_2)) {
u32 offset2 = reg_map[reg] + 2 + (stride * lch);
__raw_writew(val >> 16, omap_dma_base + offset2);
}
} else
__raw_writel(val, omap_dma_base + offset);
}
static inline u32 dma_read(int reg, int lch)
{
u8 stride;
u32 offset, val;
stride = (reg >= dma_common_ch_start) ? dma_stride : 0;
offset = reg_map[reg] + (stride * lch);
if (dma_stride == 0x40) {
val = __raw_readw(omap_dma_base + offset);
if ((reg > CLNK_CTRL && reg < CCR2) ||
(reg > PCHD_ID && reg < CAPS_2)) {
u16 upper;
u32 offset2 = reg_map[reg] + 2 + (stride * lch);
upper = __raw_readw(omap_dma_base + offset2);
val |= (upper << 16);
}
} else
val = __raw_readl(omap_dma_base + offset);
return val;
}
-Manjunath
More information about the linux-arm-kernel
mailing list