Update Yoichi Yuasa's e-mail address
[safe/jmp/linux-2.6] / drivers / pcmcia / cardbus.c
index 3ccb524..db77e1f 100644 (file)
 #include <asm/irq.h>
 #include <asm/io.h>
 
-#define IN_CARD_SERVICES
-#include <pcmcia/version.h>
 #include <pcmcia/cs_types.h>
 #include <pcmcia/ss.h>
 #include <pcmcia/cs.h>
-#include <pcmcia/bulkmem.h>
 #include <pcmcia/cistpl.h>
 #include "cs_internal.h"
 
 /*====================================================================*/
 
-#define FIND_FIRST_BIT(n)      ((n) - ((n) & ((n)-1)))
-
 /* Offsets in the Expansion ROM Image Header */
 #define ROM_SIGNATURE          0x0000  /* 2 bytes */
 #define ROM_DATA_PTR           0x0018  /* 2 bytes */
@@ -139,20 +134,23 @@ int read_cb_mem(struct pcmcia_socket * s, int space, u_int addr, u_int len, void
 
        cs_dbg(s, 3, "read_cb_mem(%d, %#x, %u)\n", space, addr, len);
 
-       dev = pci_find_slot(s->cb_dev->subordinate->number, 0);
+       dev = pci_get_slot(s->cb_dev->subordinate, 0);
        if (!dev)
                goto fail;
 
        /* Config space? */
        if (space == 0) {
                if (addr + len > 0x100)
-                       goto fail;
+                       goto failput;
                for (; len; addr++, ptr++, len--)
                        pci_read_config_byte(dev, addr, ptr);
                return 0;
        }
 
        res = dev->resource + space - 1;
+
+       pci_dev_put(dev);
+
        if (!res->flags)
                goto fail;
 
@@ -171,6 +169,8 @@ int read_cb_mem(struct pcmcia_socket * s, int space, u_int addr, u_int len, void
        memcpy_fromio(ptr, s->cb_cis_virt + addr, len);
        return 0;
 
+failput:
+       pci_dev_put(dev);
 fail:
        memset(ptr, 0xff, len);
        return -1;
@@ -207,7 +207,7 @@ static void cardbus_assign_irqs(struct pci_bus *bus, int irq)
        }
 }
 
-int cb_alloc(struct pcmcia_socket * s)
+int __ref cb_alloc(struct pcmcia_socket * s)
 {
        struct pci_bus *bus = s->cb_dev->subordinate;
        struct pci_dev *dev;
@@ -229,11 +229,16 @@ int cb_alloc(struct pcmcia_socket * s)
        pci_bus_size_bridges(bus);
        pci_bus_assign_resources(bus);
        cardbus_assign_irqs(bus, s->pci_irq);
+
+       /* socket specific tune function */
+       if (s->tune_bridge)
+               s->tune_bridge(s, bus);
+
        pci_enable_bridges(bus);
        pci_bus_add_devices(bus);
 
        s->irq.AssignedIRQ = s->pci_irq;
-       return CS_SUCCESS;
+       return 0;
 }
 
 void cb_free(struct pcmcia_socket * s)