staging: vme: make [alloc|free]_consistent bridge specific
authorManohar Vanga <manohar.vanga@cern.ch>
Wed, 10 Aug 2011 09:33:46 +0000 (11:33 +0200)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 23 Aug 2011 22:08:09 +0000 (15:08 -0700)
Make PCI dependent functions ([alloc|free]_consistent() in
'vme.c') bridge specific. By removing the dependency of the
VME bridge framework on PCI, this patch allows for addition of
non-PCI based VME bridges.

Signed-off-by: Manohar Vanga <manohar.vanga@cern.ch>
Acked-by: Martyn Welch <martyn.welch@ge.com>
Acked-by: Dan Carpenter <error27@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/vme/bridges/vme_ca91cx42.c
drivers/staging/vme/bridges/vme_tsi148.c
drivers/staging/vme/vme.c
drivers/staging/vme/vme_bridge.h

index 5122c13a9563876baaadb512b5754cdfcc5df12e..0e4feac138eb0704736333edb7a03b04cb33a33d 100644 (file)
@@ -1500,6 +1500,28 @@ static int ca91cx42_slot_get(struct vme_bridge *ca91cx42_bridge)
 
 }
 
+void *ca91cx42_alloc_consistent(struct device *parent, size_t size,
+       dma_addr_t *dma)
+{
+       struct pci_dev *pdev;
+
+       /* Find pci_dev container of dev */
+       pdev = container_of(parent, struct pci_dev, dev);
+
+       return pci_alloc_consistent(pdev, size, dma);
+}
+
+void ca91cx42_free_consistent(struct device *parent, size_t size, void *vaddr,
+       dma_addr_t dma)
+{
+       struct pci_dev *pdev;
+
+       /* Find pci_dev container of dev */
+       pdev = container_of(parent, struct pci_dev, dev);
+
+       pci_free_consistent(pdev, size, vaddr, dma);
+}
+
 static int __init ca91cx42_init(void)
 {
        return pci_register_driver(&ca91cx42_driver);
@@ -1769,6 +1791,8 @@ static int ca91cx42_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        ca91cx42_bridge->lm_attach = ca91cx42_lm_attach;
        ca91cx42_bridge->lm_detach = ca91cx42_lm_detach;
        ca91cx42_bridge->slot_get = ca91cx42_slot_get;
+       ca91cx42_bridge->alloc_consistent = ca91cx42_alloc_consistent;
+       ca91cx42_bridge->free_consistent = ca91cx42_free_consistent;
 
        data = ioread32(ca91cx42_device->base + MISC_CTL);
        dev_info(&pdev->dev, "Board is%s the VME system controller\n",
index 9c539513c74be7facdefc62613a4fd262292adb0..6c1167c2bea942f7f53ab3b9bd3dc691b4391826 100644 (file)
@@ -2114,6 +2114,28 @@ static int tsi148_slot_get(struct vme_bridge *tsi148_bridge)
        return (int)slot;
 }
 
+void *tsi148_alloc_consistent(struct device *parent, size_t size,
+       dma_addr_t *dma)
+{
+       struct pci_dev *pdev;
+
+       /* Find pci_dev container of dev */
+       pdev = container_of(parent, struct pci_dev, dev);
+
+       return pci_alloc_consistent(pdev, size, dma);
+}
+
+void tsi148_free_consistent(struct device *parent, size_t size, void *vaddr,
+       dma_addr_t dma)
+{
+       struct pci_dev *pdev;
+
+       /* Find pci_dev container of dev */
+       pdev = container_of(parent, struct pci_dev, dev);
+
+       pci_free_consistent(pdev, size, vaddr, dma);
+}
+
 static int __init tsi148_init(void)
 {
        return pci_register_driver(&tsi148_driver);
@@ -2443,6 +2465,8 @@ static int tsi148_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        tsi148_bridge->lm_attach = tsi148_lm_attach;
        tsi148_bridge->lm_detach = tsi148_lm_detach;
        tsi148_bridge->slot_get = tsi148_slot_get;
+       tsi148_bridge->alloc_consistent = tsi148_alloc_consistent;
+       tsi148_bridge->free_consistent = tsi148_free_consistent;
 
        data = ioread32be(tsi148_device->base + TSI148_LCSR_VSTAT);
        dev_info(&pdev->dev, "Board is%s the VME system controller\n",
index c078ce369df9498da3fe2b760eb4c755c20a3133..4ca9d02cc2c8b869b6f452135e169d46e53f01a0 100644 (file)
@@ -83,15 +83,11 @@ static struct vme_bridge *find_bridge(struct vme_resource *resource)
 /*
  * Allocate a contiguous block of memory for use by the driver. This is used to
  * create the buffers for the slave windows.
- *
- * XXX VME bridges could be available on buses other than PCI. At the momment
- *     this framework only supports PCI devices.
  */
 void *vme_alloc_consistent(struct vme_resource *resource, size_t size,
        dma_addr_t *dma)
 {
        struct vme_bridge *bridge;
-       struct pci_dev *pdev;
 
        if (resource == NULL) {
                printk(KERN_ERR "No resource\n");
@@ -104,28 +100,29 @@ void *vme_alloc_consistent(struct vme_resource *resource, size_t size,
                return NULL;
        }
 
-       /* Find pci_dev container of dev */
        if (bridge->parent == NULL) {
-               printk(KERN_ERR "Dev entry NULL\n");
+               printk(KERN_ERR "Dev entry NULL for"
+                       " bridge %s\n", bridge->name);
+               return NULL;
+       }
+
+       if (bridge->alloc_consistent == NULL) {
+               printk(KERN_ERR "alloc_consistent not supported by"
+                       " bridge %s\n", bridge->name);
                return NULL;
        }
-       pdev = container_of(bridge->parent, struct pci_dev, dev);
 
-       return pci_alloc_consistent(pdev, size, dma);
+       return bridge->alloc_consistent(bridge->parent, size, dma);
 }
 EXPORT_SYMBOL(vme_alloc_consistent);
 
 /*
  * Free previously allocated contiguous block of memory.
- *
- * XXX VME bridges could be available on buses other than PCI. At the momment
- *     this framework only supports PCI devices.
  */
 void vme_free_consistent(struct vme_resource *resource, size_t size,
        void *vaddr, dma_addr_t dma)
 {
        struct vme_bridge *bridge;
-       struct pci_dev *pdev;
 
        if (resource == NULL) {
                printk(KERN_ERR "No resource\n");
@@ -138,10 +135,19 @@ void vme_free_consistent(struct vme_resource *resource, size_t size,
                return;
        }
 
-       /* Find pci_dev container of dev */
-       pdev = container_of(bridge->parent, struct pci_dev, dev);
+       if (bridge->parent == NULL) {
+               printk(KERN_ERR "Dev entry NULL for"
+                       " bridge %s\n", bridge->name);
+               return;
+       }
+
+       if (bridge->free_consistent == NULL) {
+               printk(KERN_ERR "free_consistent not supported by"
+                       " bridge %s\n", bridge->name);
+               return;
+       }
 
-       pci_free_consistent(pdev, size, vaddr, dma);
+       bridge->free_consistent(bridge->parent, size, vaddr, dma);
 }
 EXPORT_SYMBOL(vme_free_consistent);
 
index 4c6ec31b01db5c27859f56f13e234087c7f2b1e8..a9084f0f34e73f7ad8321d7b60172a797605c88f 100644 (file)
@@ -98,8 +98,6 @@ struct vme_irq {
 /* This structure stores all the information about one bridge
  * The structure should be dynamically allocated by the driver and one instance
  * of the structure should be present for each VME chip present in the system.
- *
- * Currently we assume that all chips are PCI-based
  */
 struct vme_bridge {
        char name[VMENAMSIZ];
@@ -112,7 +110,7 @@ struct vme_bridge {
        struct list_head vme_errors;    /* List for errors generated on VME */
 
        /* Bridge Info - XXX Move to private structure? */
-       struct device *parent;  /* Generic device struct (pdev->dev for PCI) */
+       struct device *parent;  /* Parent device (eg. pdev->dev for PCI) */
        void *driver_priv;      /* Private pointer for the bridge driver */
 
        struct device dev[VME_SLOTS_MAX];       /* Device registered with
@@ -165,6 +163,12 @@ struct vme_bridge {
 
        /* CR/CSR space functions */
        int (*slot_get) (struct vme_bridge *);
+
+       /* Bridge parent interface */
+       void *(*alloc_consistent)(struct device *dev, size_t size,
+               dma_addr_t *dma);
+       void (*free_consistent)(struct device *dev, size_t size,
+               void *vaddr, dma_addr_t dma);
 };
 
 void vme_irq_handler(struct vme_bridge *, int, int);