#include <asm/system.h>
#include <asm/mach/pci.h>
#include <asm/hardware.h>
-#include <asm/sizes.h>
/*
* these transactions are atomic or we will end up
* with corrupt data on the bus or in a driver.
*/
-static spinlock_t ixp4xx_pci_lock = SPIN_LOCK_UNLOCKED;
+static DEFINE_SPINLOCK(ixp4xx_pci_lock);
/*
* Read from PCI config space
return 0xffffffff;
}
-static int read_config(u8 bus_num, u16 devfn, int where, int size, u32 *value)
+static int ixp4xx_pci_read_config(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 *value)
{
u32 n, byte_enables, addr, data;
+ u8 bus_num = bus->number;
pr_debug("read_config from %d size %d dev %d:%d:%d\n", where, size,
bus_num, PCI_SLOT(devfn), PCI_FUNC(devfn));
return PCIBIOS_SUCCESSFUL;
}
-static int write_config(u8 bus_num, u16 devfn, int where, int size, u32 value)
+static int ixp4xx_pci_write_config(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 value)
{
u32 n, byte_enables, addr, data;
+ u8 bus_num = bus->number;
pr_debug("write_config_byte %#x to %d size %d dev %d:%d:%d\n", value, where,
size, bus_num, PCI_SLOT(devfn), PCI_FUNC(devfn));
return PCIBIOS_SUCCESSFUL;
}
-/*
- * Generalized PCI config access functions.
- */
-static int ixp4xx_read_config(struct pci_bus *bus, unsigned int devfn,
- int where, int size, u32 *value)
-{
- if (bus->number && !PCI_SLOT(devfn))
- return local_read_config(where, size, value);
- return read_config(bus->number, devfn, where, size, value);
-}
-
-static int ixp4xx_write_config(struct pci_bus *bus, unsigned int devfn,
- int where, int size, u32 value)
-{
- if (bus->number && !PCI_SLOT(devfn))
- return local_write_config(where, size, value);
- return write_config(bus->number, devfn, where, size, value);
-}
-
struct pci_ops ixp4xx_ops = {
- .read = ixp4xx_read_config,
- .write = ixp4xx_write_config,
+ .read = ixp4xx_pci_read_config,
+ .write = ixp4xx_pci_write_config,
};
-
/*
* PCI abort handler
*/
asm("mrc p15, 0, %0, cr0, cr0, 0;" : "=r"(processor_id) :);
/*
- * Determine which PCI read method to use
+ * Determine which PCI read method to use.
+ * Rev 0 IXP425 requires workaround.
*/
- if (!(processor_id & 0xf)) {
- printk("PCI: IXP4xx A0 silicon detected - "
+ if (!(processor_id & 0xf) && !cpu_is_ixp46x()) {
+ printk("PCI: IXP42x A0 silicon detected - "
"PCI Non-Prefetch Workaround Enabled\n");
ixp4xx_pci_read = ixp4xx_pci_read_errata;
} else