mirror of https://gitee.com/openkylin/linux.git
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>
This commit is contained in:
parent
34a678110a
commit
7f58f0255a
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue