1
0
Fork 0

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: 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>
hifive-unleashed-5.1
Manohar Vanga 2011-08-10 11:33:46 +02:00 committed by Greg Kroah-Hartman
parent 34a678110a
commit 7f58f0255a
4 changed files with 76 additions and 18 deletions

View 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",

View 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",

View 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;
}
pdev = container_of(bridge->parent, struct pci_dev, dev);
return pci_alloc_consistent(pdev, size, dma);
if (bridge->alloc_consistent == NULL) {
printk(KERN_ERR "alloc_consistent not supported by"
" bridge %s\n", bridge->name);
return NULL;
}
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;
}
pci_free_consistent(pdev, size, vaddr, dma);
if (bridge->free_consistent == NULL) {
printk(KERN_ERR "free_consistent not supported by"
" bridge %s\n", bridge->name);
return;
}
bridge->free_consistent(bridge->parent, size, vaddr, dma);
}
EXPORT_SYMBOL(vme_free_consistent);

View 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);