Commit 7f58f025 authored by Manohar Vanga's avatar Manohar Vanga Committed by Greg Kroah-Hartman

staging: vme: make [alloc|free]_consistent bridge specific

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: default avatarManohar Vanga <manohar.vanga@cern.ch>
Acked-by: default avatarMartyn Welch <martyn.welch@ge.com>
Acked-by: default avatarDan Carpenter <error27@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 34a67811
...@@ -1500,6 +1500,28 @@ static int ca91cx42_slot_get(struct vme_bridge *ca91cx42_bridge) ...@@ -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) static int __init ca91cx42_init(void)
{ {
return pci_register_driver(&ca91cx42_driver); return pci_register_driver(&ca91cx42_driver);
...@@ -1769,6 +1791,8 @@ static int ca91cx42_probe(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -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_attach = ca91cx42_lm_attach;
ca91cx42_bridge->lm_detach = ca91cx42_lm_detach; ca91cx42_bridge->lm_detach = ca91cx42_lm_detach;
ca91cx42_bridge->slot_get = ca91cx42_slot_get; 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); data = ioread32(ca91cx42_device->base + MISC_CTL);
dev_info(&pdev->dev, "Board is%s the VME system controller\n", dev_info(&pdev->dev, "Board is%s the VME system controller\n",
......
...@@ -2114,6 +2114,28 @@ static int tsi148_slot_get(struct vme_bridge *tsi148_bridge) ...@@ -2114,6 +2114,28 @@ static int tsi148_slot_get(struct vme_bridge *tsi148_bridge)
return (int)slot; 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) static int __init tsi148_init(void)
{ {
return pci_register_driver(&tsi148_driver); return pci_register_driver(&tsi148_driver);
...@@ -2443,6 +2465,8 @@ static int tsi148_probe(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -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_attach = tsi148_lm_attach;
tsi148_bridge->lm_detach = tsi148_lm_detach; tsi148_bridge->lm_detach = tsi148_lm_detach;
tsi148_bridge->slot_get = tsi148_slot_get; 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); data = ioread32be(tsi148_device->base + TSI148_LCSR_VSTAT);
dev_info(&pdev->dev, "Board is%s the VME system controller\n", dev_info(&pdev->dev, "Board is%s the VME system controller\n",
......
...@@ -83,15 +83,11 @@ static struct vme_bridge *find_bridge(struct vme_resource *resource) ...@@ -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 * Allocate a contiguous block of memory for use by the driver. This is used to
* create the buffers for the slave windows. * 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, void *vme_alloc_consistent(struct vme_resource *resource, size_t size,
dma_addr_t *dma) dma_addr_t *dma)
{ {
struct vme_bridge *bridge; struct vme_bridge *bridge;
struct pci_dev *pdev;
if (resource == NULL) { if (resource == NULL) {
printk(KERN_ERR "No resource\n"); printk(KERN_ERR "No resource\n");
...@@ -104,28 +100,29 @@ void *vme_alloc_consistent(struct vme_resource *resource, size_t size, ...@@ -104,28 +100,29 @@ void *vme_alloc_consistent(struct vme_resource *resource, size_t size,
return NULL; return NULL;
} }
/* Find pci_dev container of dev */
if (bridge->parent == NULL) { 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; 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); EXPORT_SYMBOL(vme_alloc_consistent);
/* /*
* Free previously allocated contiguous block of memory. * 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 vme_free_consistent(struct vme_resource *resource, size_t size,
void *vaddr, dma_addr_t dma) void *vaddr, dma_addr_t dma)
{ {
struct vme_bridge *bridge; struct vme_bridge *bridge;
struct pci_dev *pdev;
if (resource == NULL) { if (resource == NULL) {
printk(KERN_ERR "No resource\n"); printk(KERN_ERR "No resource\n");
...@@ -138,10 +135,19 @@ void vme_free_consistent(struct vme_resource *resource, size_t size, ...@@ -138,10 +135,19 @@ void vme_free_consistent(struct vme_resource *resource, size_t size,
return; return;
} }
/* Find pci_dev container of dev */ if (bridge->parent == NULL) {
pdev = container_of(bridge->parent, struct pci_dev, dev); 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); EXPORT_SYMBOL(vme_free_consistent);
......
...@@ -98,8 +98,6 @@ struct vme_irq { ...@@ -98,8 +98,6 @@ struct vme_irq {
/* This structure stores all the information about one bridge /* This structure stores all the information about one bridge
* The structure should be dynamically allocated by the driver and one instance * 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. * 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 { struct vme_bridge {
char name[VMENAMSIZ]; char name[VMENAMSIZ];
...@@ -112,7 +110,7 @@ struct vme_bridge { ...@@ -112,7 +110,7 @@ struct vme_bridge {
struct list_head vme_errors; /* List for errors generated on VME */ struct list_head vme_errors; /* List for errors generated on VME */
/* Bridge Info - XXX Move to private structure? */ /* 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 */ void *driver_priv; /* Private pointer for the bridge driver */
struct device dev[VME_SLOTS_MAX]; /* Device registered with struct device dev[VME_SLOTS_MAX]; /* Device registered with
...@@ -165,6 +163,12 @@ struct vme_bridge { ...@@ -165,6 +163,12 @@ struct vme_bridge {
/* CR/CSR space functions */ /* CR/CSR space functions */
int (*slot_get) (struct vme_bridge *); 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); void vme_irq_handler(struct vme_bridge *, int, int);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment