RE: [PATCH v3 01/13] OMAP: DMA: Replace read/write macros with functions

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




> -----Original Message-----
> From: Kevin Hilman [mailto:khilman@xxxxxxxxxxxxxxxxxxx] 
> Sent: Wednesday, November 10, 2010 9:33 PM
> To: G, Manjunath Kondaiah
> Cc: linux-omap@xxxxxxxxxxxxxxx; 
> linux-arm-kernel@xxxxxxxxxxxxxxxxxxx; Cousson, Benoit; 
> Shilimkar, Santosh
> Subject: Re: [PATCH v3 01/13] OMAP: DMA: Replace read/write 
> macros with functions
> 
> "G, Manjunath Kondaiah" <manjugk@xxxxxx> 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 

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux