Yosemite/440EP why are readl()/ioread32() setup to read little-endian?

Eugene Surovegin ebs at ebshome.net
Thu Jan 26 05:51:31 EST 2006


On Wed, Jan 25, 2006 at 10:26:55AM -0800, David Hawkins wrote:
> Hi Stefan,
> 
> >>readl() and ioread32() read the registers in little-endian format!
> > 
> > Correct. That's how it is implemented on all platforms. Think for example of 
> > an pci device driver. Using these IO functions, the driver will become 
> > platform independent, running without modifications on little- and big-endian 
> > machines.
> 
> Ok, I figured that was probably the case. Thanks for the confirmation.
> 
> >>Should I just be using pointers for remapped processor
> >>registers, and only use readl(), ioread32(), etc, on external
> >>memory?
> > 
> > That's how I do it. Only use readl() and friends for pci spaces (or other 
> > little endian memory mapped areas).
> 
> I took a look at the Yosemite network and USB drivers, it looks like
> the authors of those drivers chose to use in_be32() and out_be32().
> 
> Personally I like the concept of using pointers, or more usefully
> pointers to structure overlays for device control. However, the
> impression I have is that this is inherently more non-portable
> than using the readl()/writel(), ioread32()/iowrite32(), and
> now I guess I can add in_be32()/out_be32() to that list.
> 
> But if you use pointers, thats good enough for me!

use in_/out_ accessors, not pointers. Look at other 4xx drivers (i2c, 
emac)

Also, you don't have worry about this code being non-portable, because 
every chip has it's own GPIO impl anyway.

-- 
Eugene




More information about the Linuxppc-embedded mailing list