[PATCH v3 01/13] OMAP: DMA: Replace read/write macros with functions
G, Manjunath Kondaiah
manjugk at ti.com
Wed Nov 10 12:16:04 EST 2010
> -----Original Message-----
> From: Kevin Hilman [mailto:khilman at deeprootsystems.com]
> Sent: Wednesday, November 10, 2010 9:33 PM
> 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:
>
> [...]
>
> >> > + 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) {
>
> The use of hard-coded constants still isn't right here. This is
> bascally the same as a cpu_is_omap1 check. After you separate out the
> device files, I thought you had separate omap1 and omap2+ versions of
> these, so I don't follow the need for this.
This code will be moved to respective mach-omapx dma files and this
conditional check vanishes automatically in PATCH 10/13. Since this patch
targets replacing read/write macros with inline functions, no functionality
changes(except change in logic for handling 16bit registers for omap1)
are done with new patch hence handling omap1 and omap2+ is
done this way.
I hope having the conditional check in this interim patch is ok.
-Manjunath
More information about the linux-arm-kernel
mailing list