]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/virtio/virtio_pci.c
USB: musb: tusb6010 buildfix
[linux-2.6-omap-h63xx.git] / drivers / virtio / virtio_pci.c
index e37d686edfe07047e33298d5b3b93dae4d77560a..bef6b45e8a5ce4baaa0e1373338d5f02e879bbb0 100644 (file)
@@ -73,10 +73,7 @@ MODULE_DEVICE_TABLE(pci, virtio_pci_id_table);
 /* A PCI device has it's own struct device and so does a virtio device so
  * we create a place for the virtio devices to show up in sysfs.  I think it
  * would make more sense for virtio to not insist on having it's own device. */
-static struct device virtio_pci_root = {
-       .parent         = NULL,
-       .init_name      = "virtio-pci",
-};
+static struct device *virtio_pci_root;
 
 /* Convert a generic virtio device to our structure */
 static struct virtio_pci_device *to_vp_device(struct virtio_device *vdev)
@@ -237,7 +234,7 @@ static struct virtqueue *vp_find_vq(struct virtio_device *vdev, unsigned index,
        info->queue_index = index;
        info->num = num;
 
-       size = PAGE_ALIGN(vring_size(num, PAGE_SIZE));
+       size = PAGE_ALIGN(vring_size(num, VIRTIO_PCI_VRING_ALIGN));
        info->queue = alloc_pages_exact(size, GFP_KERNEL|__GFP_ZERO);
        if (info->queue == NULL) {
                err = -ENOMEM;
@@ -245,12 +242,12 @@ static struct virtqueue *vp_find_vq(struct virtio_device *vdev, unsigned index,
        }
 
        /* activate the queue */
-       iowrite32(virt_to_phys(info->queue) >> PAGE_SHIFT,
+       iowrite32(virt_to_phys(info->queue) >> VIRTIO_PCI_QUEUE_ADDR_SHIFT,
                  vp_dev->ioaddr + VIRTIO_PCI_QUEUE_PFN);
 
        /* create the vring */
-       vq = vring_new_virtqueue(info->num, vdev, info->queue,
-                                vp_notify, callback);
+       vq = vring_new_virtqueue(info->num, VIRTIO_PCI_VRING_ALIGN,
+                                vdev, info->queue, vp_notify, callback);
        if (!vq) {
                err = -ENOMEM;
                goto out_activate_queue;
@@ -290,7 +287,7 @@ static void vp_del_vq(struct virtqueue *vq)
        iowrite16(info->queue_index, vp_dev->ioaddr + VIRTIO_PCI_QUEUE_SEL);
        iowrite32(0, vp_dev->ioaddr + VIRTIO_PCI_QUEUE_PFN);
 
-       size = PAGE_ALIGN(vring_size(info->num, PAGE_SIZE));
+       size = PAGE_ALIGN(vring_size(info->num, VIRTIO_PCI_VRING_ALIGN));
        free_pages_exact(info->queue, size);
        kfree(info);
 }
@@ -307,6 +304,20 @@ static struct virtio_config_ops virtio_pci_config_ops = {
        .finalize_features = vp_finalize_features,
 };
 
+static void virtio_pci_release_dev(struct device *_d)
+{
+       struct virtio_device *dev = container_of(_d, struct virtio_device, dev);
+       struct virtio_pci_device *vp_dev = to_vp_device(dev);
+       struct pci_dev *pci_dev = vp_dev->pci_dev;
+
+       free_irq(pci_dev->irq, vp_dev);
+       pci_set_drvdata(pci_dev, NULL);
+       pci_iounmap(pci_dev, vp_dev->ioaddr);
+       pci_release_regions(pci_dev);
+       pci_disable_device(pci_dev);
+       kfree(vp_dev);
+}
+
 /* the PCI probing function */
 static int __devinit virtio_pci_probe(struct pci_dev *pci_dev,
                                      const struct pci_device_id *id)
@@ -329,7 +340,8 @@ static int __devinit virtio_pci_probe(struct pci_dev *pci_dev,
        if (vp_dev == NULL)
                return -ENOMEM;
 
-       vp_dev->vdev.dev.parent = &virtio_pci_root;
+       vp_dev->vdev.dev.parent = virtio_pci_root;
+       vp_dev->vdev.dev.release = virtio_pci_release_dev;
        vp_dev->vdev.config = &virtio_pci_config_ops;
        vp_dev->pci_dev = pci_dev;
        INIT_LIST_HEAD(&vp_dev->virtqueues);
@@ -389,12 +401,6 @@ static void __devexit virtio_pci_remove(struct pci_dev *pci_dev)
        struct virtio_pci_device *vp_dev = pci_get_drvdata(pci_dev);
 
        unregister_virtio_device(&vp_dev->vdev);
-       free_irq(pci_dev->irq, vp_dev);
-       pci_set_drvdata(pci_dev, NULL);
-       pci_iounmap(pci_dev, vp_dev->ioaddr);
-       pci_release_regions(pci_dev);
-       pci_disable_device(pci_dev);
-       kfree(vp_dev);
 }
 
 #ifdef CONFIG_PM
@@ -428,13 +434,13 @@ static int __init virtio_pci_init(void)
 {
        int err;
 
-       err = device_register(&virtio_pci_root);
-       if (err)
-               return err;
+       virtio_pci_root = root_device_register("virtio-pci");
+       if (IS_ERR(virtio_pci_root))
+               return PTR_ERR(virtio_pci_root);
 
        err = pci_register_driver(&virtio_pci_driver);
        if (err)
-               device_unregister(&virtio_pci_root);
+               device_unregister(virtio_pci_root);
 
        return err;
 }
@@ -443,8 +449,8 @@ module_init(virtio_pci_init);
 
 static void __exit virtio_pci_exit(void)
 {
-       device_unregister(&virtio_pci_root);
        pci_unregister_driver(&virtio_pci_driver);
+       root_device_unregister(virtio_pci_root);
 }
 
 module_exit(virtio_pci_exit);