commented early_printk patch because of rejects.
[linux-flexiantxendom0-3.2.10.git] / drivers / pcmcia / yenta_socket.c
index 5056a66..1d24940 100644 (file)
@@ -657,7 +657,7 @@ static void yenta_allocate_res(struct yenta_socket *socket, int nr, unsigned typ
                if (request_resource(root, res) == 0)
                        return;
                printk(KERN_INFO "yenta %s: Preassigned resource %d busy, reconfiguring...\n",
-                               socket->dev->slot_name, nr);
+                               pci_name(socket->dev), nr);
                res->start = res->end = 0;
        }
 
@@ -697,7 +697,7 @@ static void yenta_allocate_res(struct yenta_socket *socket, int nr, unsigned typ
                align = size;
        } while (size >= min);
        printk(KERN_INFO "yenta %s: no resource of type %x available, trying to continue...\n",
-                       socket->dev->slot_name, type);
+                       pci_name(socket->dev), type);
        res->start = res->end = 0;
 }
 
@@ -752,6 +752,7 @@ static void yenta_close(struct pci_dev *dev)
                iounmap(sock->base);
        yenta_free_resources(sock);
 
+       pci_release_regions(dev);
        pci_set_drvdata(dev, NULL);
 }
 
@@ -823,6 +824,7 @@ static int __devinit yenta_probe (struct pci_dev *dev, const struct pci_device_i
 {
        struct yenta_socket *socket;
        struct cardbus_override_struct *d;
+       int ret;
        
        socket = kmalloc(sizeof(struct yenta_socket), GFP_KERNEL);
        if (!socket)
@@ -842,11 +844,19 @@ static int __devinit yenta_probe (struct pci_dev *dev, const struct pci_device_i
        /*
         * Do some basic sanity checking..
         */
-       if (pci_enable_device(dev))
-               return -1;
+       if (pci_enable_device(dev)) {
+               ret = -EBUSY;
+               goto free;
+       }
+
+       ret = pci_request_regions(dev, "yenta_socket");
+       if (ret)
+               goto disable;
+
        if (!pci_resource_start(dev, 0)) {
                printk("No cardbus resource!\n");
-               return -1;
+               ret = -ENODEV;
+               goto release;
        }
 
        /*
@@ -854,8 +864,17 @@ static int __devinit yenta_probe (struct pci_dev *dev, const struct pci_device_i
         * and request the IRQ.
         */
        socket->base = ioremap(pci_resource_start(dev, 0), 0x1000);
-       if (!socket->base)
-               return -1;
+       if (!socket->base) {
+               ret = -ENOMEM;
+               goto release;
+       }
+
+       /*
+        * report the subsystem vendor and device for help debugging
+        * the irq stuff...
+        */
+       printk(KERN_INFO "Yenta: CardBus bridge found at %s [%04x:%04x]\n",
+               dev->slot_name, dev->subsystem_vendor, dev->subsystem_device);
 
        yenta_config_init(socket);
 
@@ -871,9 +890,9 @@ static int __devinit yenta_probe (struct pci_dev *dev, const struct pci_device_i
        d = cardbus_override;
        while (d->override) {
                if ((dev->vendor == d->vendor) && (dev->device == d->device)) {
-                       int retval = d->override(socket);
-                       if (retval < 0)
-                               return retval;
+                       ret = d->override(socket);
+                       if (ret < 0)
+                               goto unmap;
                }
                d++;
        }
@@ -895,13 +914,26 @@ static int __devinit yenta_probe (struct pci_dev *dev, const struct pci_device_i
        printk("Socket status: %08x\n", cb_readl(socket, CB_SOCKET_STATE));
 
        /* Register it with the pcmcia layer.. */
-       return pcmcia_register_socket(&socket->socket);
+       ret = pcmcia_register_socket(&socket->socket);
+       if (ret == 0)
+               goto out;
+
+ unmap:
+       iounmap(socket->base);
+ release:
+       pci_release_regions(dev);
+ disable:
+       pci_disable_device(dev);
+ free:
+       kfree(socket);
+ out:
+       return ret;
 }
 
 
 static int yenta_dev_suspend (struct pci_dev *dev, u32 state)
 {
-       return pcmcia_socket_dev_suspend(&dev->dev, state, 0);
+       return pcmcia_socket_dev_suspend(&dev->dev, state, SUSPEND_SAVE_STATE);
 }
 
 
@@ -911,7 +943,7 @@ static int yenta_dev_resume (struct pci_dev *dev)
 }
 
 
-static struct pci_device_id yenta_table [] __devinitdata = { {
+static struct pci_device_id yenta_table [] = { {
        .class          = PCI_CLASS_BRIDGE_CARDBUS << 8,
        .class_mask     = ~0,