fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / arch / mips / pci / ops-au1000.c
index b921cc6..8ae4648 100644 (file)
@@ -28,7 +28,6 @@
  *  with this program; if not, write  to the Free Software Foundation, Inc.,
  *  675 Mass Ave, Cambridge, MA 02139, USA.
  */
-#include <linux/config.h>
 #include <linux/types.h>
 #include <linux/pci.h>
 #include <linux/kernel.h>
 
 int (*board_pci_idsel)(unsigned int devsel, int assert);
 
-/* CP0 hazard avoidance. */
-#define BARRIER __asm__ __volatile__(".set noreorder\n\t" \
-                                    "nop; nop; nop; nop;\t" \
-                                    ".set reorder\n\t")
-
 void mod_wired_entry(int entry, unsigned long entrylo0,
                unsigned long entrylo1, unsigned long entryhi,
                unsigned long pagemask)
@@ -66,16 +60,12 @@ void mod_wired_entry(int entry, unsigned long entrylo0,
        old_ctx = read_c0_entryhi() & 0xff;
        old_pagemask = read_c0_pagemask();
        write_c0_index(entry);
-       BARRIER;
        write_c0_pagemask(pagemask);
        write_c0_entryhi(entryhi);
        write_c0_entrylo0(entrylo0);
        write_c0_entrylo1(entrylo1);
-       BARRIER;
        tlb_write_indexed();
-       BARRIER;
        write_c0_entryhi(old_ctx);
-       BARRIER;
        write_c0_pagemask(old_pagemask);
 }
 
@@ -120,7 +110,7 @@ static int config_access(unsigned char access_type, struct pci_bus *bus,
        if (first_cfg) {
                /* reserve a wired entry for pci config accesses */
                first_cfg = 0;
-               pci_cfg_vm = get_vm_area(0x2000, 0);
+               pci_cfg_vm = get_vm_area(0x2000, VM_IOREMAP);
                if (!pci_cfg_vm)
                        panic (KERN_ERR "PCI unable to get vm area\n");
                pci_cfg_wired_entry = read_c0_wired();
@@ -128,9 +118,8 @@ static int config_access(unsigned char access_type, struct pci_bus *bus,
                last_entryLo0  = last_entryLo1 = 0xffffffff;
        }
 
-       /* Since the Au1xxx doesn't do the idsel timing exactly to spec,
-        * many board vendors implement their own off-chip idsel, so call
-        * it now.  If it doesn't succeed, may as well bail out at this point.
+       /* Allow board vendors to implement their own off-chip idsel.
+        * If it doesn't succeed, may as well bail out at this point.
         */
        if (board_pci_idsel) {
                if (board_pci_idsel(device, 1) == 0) {
@@ -288,10 +277,18 @@ static int config_read(struct pci_bus *bus, unsigned int devfn,
                       int where, int size, u32 * val)
 {
        switch (size) {
-       case 1:
-               return read_config_byte(bus, devfn, where, (u8 *) val);
-       case 2:
-               return read_config_word(bus, devfn, where, (u16 *) val);
+       case 1: {
+                       u8 _val;
+                       int rc = read_config_byte(bus, devfn, where, &_val);
+                       *val = _val;
+                       return rc;
+               }
+       case 2: {
+                       u16 _val;
+                       int rc = read_config_word(bus, devfn, where, &_val);
+                       *val = _val;
+                       return rc;
+               }
        default:
                return read_config_dword(bus, devfn, where, val);
        }