Skip to content

Commit

Permalink
ARM: fix insl() and outsl() endianness on IXP4xx architecture.
Browse files Browse the repository at this point in the history
The repetitive in/out functions must preserve order, not value.

Signed-off-by: Krzysztof Hałasa <khc@pm.waw.pl>
  • Loading branch information
Krzysztof Hałasa committed Dec 5, 2009
1 parent 8ae45a5 commit 9f2c949
Showing 1 changed file with 4 additions and 3 deletions.
7 changes: 4 additions & 3 deletions arch/arm/mach-ixp4xx/include/mach/io.h
Original file line number Diff line number Diff line change
Expand Up @@ -311,7 +311,7 @@ static inline void
__ixp4xx_outsl(u32 io_addr, const u32 *vaddr, u32 count)
{
while (count--)
outl(*vaddr++, io_addr);
outl(cpu_to_le32(*vaddr++), io_addr);
}

static inline u8
Expand Down Expand Up @@ -366,20 +366,21 @@ static inline void
__ixp4xx_insl(u32 io_addr, u32 *vaddr, u32 count)
{
while (count--)
*vaddr++ = inl(io_addr);
*vaddr++ = le32_to_cpu(inl(io_addr));
}

#define PIO_OFFSET 0x10000UL
#define PIO_MASK 0x0ffffUL

#define __is_io_address(p) (((unsigned long)p >= PIO_OFFSET) && \
((unsigned long)p <= (PIO_MASK + PIO_OFFSET)))

static inline unsigned int
__ixp4xx_ioread8(const void __iomem *addr)
{
unsigned long port = (unsigned long __force)addr;
if (__is_io_address(port))
return (unsigned int)__ixp4xx_inb(port & PIO_MASK);
return (unsigned int)__ixp4xx_inb(port & PIO_MASK);
else
#ifndef CONFIG_IXP4XX_INDIRECT_PCI
return (unsigned int)__raw_readb(port);
Expand Down

0 comments on commit 9f2c949

Please sign in to comment.