* David Brownell <[EMAIL PROTECTED]> [080516 14:26]:
> On Friday 16 May 2008, Tony Lindgren wrote:
> > @@ -38,19 +38,19 @@
> > #define CF_BASE 0xfffe2800
> >
> > /* status; read after IRQ */
> > -#define CF_STATUS_REG __REG16(CF_BASE + 0x00)
> > +#define CF_STATUS (CF_BASE + 0x00)
> > # define CF_STATUS_BAD_READ (1 << 2)
> > # define CF_STATUS_BAD_WRITE (1 << 1)
> > # define CF_STATUS_CARD_DETECT (1 << 0)
> >
> > /* which chipselect (CS0..CS3) is used for CF (active low) */
> > -#define CF_CFG_REG __REG16(CF_BASE + 0x02)
> > +#define CF_CFG (CF_BASE + 0x02)
> >
> > ...
>
> Trying to understand the plan here. This first patches
> are to remove __REG*() access, we hillater patches will
> be needed to convert things to omap_readl(BASE + OFFSET)
> style accessors? (BASE being SOC-specific, and passed
> down from system init code.)
>
> Not that CF is a good example of that. I don't think
> it exists on current chips. ;)
Well ideally we would set the base offset during driver init, then
just use __raw_read/write().
But that's lot of work, so it's easier first to convert __REG access
to use omap_read/write(). I'll post multi-omap series as soon as I have
it booting.. But to give you and idea, we can have something like following
work for multi-omap.
In arch/arm/Makefile:
arch-$(CONFIG_MULTI_OMAP) :=-D__LINUX_ARM_ARCH__=5 $(call
cc-option,-march=armv5te -Wa$(comma)-march=armv7a,-march=armv6,-march=armv5t)
This works for 926, arm11 and cortex.
Then in io.h:
#if defined(MULTI_OMAP)
extern unsigned long io_p2v(u32 pa);
extern unsigned long io_v2p(u32 va);
extern unsigned char omap_readb(void __iomem *a);
extern unsigned short omap_readw(void __iomem *a);
extern unsigned long omap_readl(void __iomem *a);
...
#else
#ifdef CONFIG_ARCH_OMAP1
#define io_p2v(pa) OMAP1_IO_ADDRESS(pa)
#define io_v2p(va) ((va) + OMAP1_IO_OFFSET)
#define omap_readb(a) (*(volatile unsigned char *)OMAP1_IO_ADDRESS(a))
#define omap_readw(a) (*(volatile unsigned short *)OMAP1_IO_ADDRESS(a))
#define omap_readl(a) (*(volatile unsigned int *)OMAP1_IO_ADDRESS(a))
...
#elif defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
#define io_p2v(pa) OMAP2_IO_ADDRESS(pa)
#define io_v2p(va) ((va) + OMAP2_IO_OFFSET)
#define omap_readb(a) (*(volatile unsigned char*)OMAP2_IO_ADDRESS(a))
#define omap_readw(a) (*(volatile unsigned short *)OMAP2_IO_ADDRESS(a))
#define omap_readl(a) (*(volatile unsigned int *)OMAP2_IO_ADDRESS(a))
...
#endif
#endif
Then in io.c:
unsigned long io_p2v(u32 pa)
{
if (cpu_class_is_omap1())
return OMAP1_IO_ADDRESS(pa);
else
return OMAP2_IO_ADDRESS(pa);
}
unsigned long io_v2p(u32 va)
{
if (cpu_class_is_omap1())
return va + OMAP1_IO_OFFSET;
else
return va + OMAP2_IO_OFFSET;
}
unsigned char omap_readb(void __iomem *a)
{
if (cpu_class_is_omap1())
return __raw_readb(OMAP1_IO_ADDRESS(a));
else if (cpu_is_omap24xx())
return __raw_readb(OMAP24XX_IO_ADDRESS(a));
else if (cpu_is_omap34xx())
return __raw_readb(OMAP34XX_IO_ADDRESS(a));
...
Regards,
Tony
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html