[ARM] 4454/1: Use word accesses in Versatile PCI config reads
authorAndrzej Zaborowski <balrogg@gmail.com>
Tue, 26 Jun 2007 13:31:23 +0000 (14:31 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Mon, 2 Jul 2007 12:39:35 +0000 (13:39 +0100)
ARM Versatile PCI config reads of one byte width have the lowest two
bits of the address cleared and result in reading from a wrong place
in the config space.  This change is to use word size accesses like it is done for halfword reads.

Byte reads are used for retrieving the IRQ number of a PCI device and the problem was not exposed until 2.6.20 because the value read was discarded in drivers/pci/setup-irq.c (recently fixed).

Signed-off-by: Andrzej Zaborowski <andrew@openedhand.com>
Acked-by: Paul Brook <paul@codesourcery.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/mach-versatile/pci.c

index ba58223f12be8243a3f94e8d241fa1314b65b931..ca8290159432dd029463d7828f26acd2d5e01caf 100644 (file)
@@ -117,7 +117,10 @@ static int versatile_read_config(struct pci_bus *bus, unsigned int devfn, int wh
        } else {
                switch (size) {
                case 1:
-                       v = __raw_readb(addr);
+                       v = __raw_readl(addr);
+                       if (where & 2) v >>= 16;
+                       if (where & 1) v >>= 8;
+                       v &= 0xff;
                        break;
 
                case 2: