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;
}
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;
}
iounmap(sock->base);
yenta_free_resources(sock);
+ pci_release_regions(dev);
pci_set_drvdata(dev, NULL);
}
{
struct yenta_socket *socket;
struct cardbus_override_struct *d;
+ int ret;
socket = kmalloc(sizeof(struct yenta_socket), GFP_KERNEL);
if (!socket)
/*
* 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;
}
/*
* 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);
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++;
}
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);
}
}
-static struct pci_device_id yenta_table [] __devinitdata = { {
+static struct pci_device_id yenta_table [] = { {
.class = PCI_CLASS_BRIDGE_CARDBUS << 8,
.class_mask = ~0,