Skip to content

Commit

Permalink
staging: vme: make [alloc|free]_consistent bridge specific
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Manohar Vanga authored and Greg Kroah-Hartman committed Aug 23, 2011
1 parent 34a6781 commit 7f58f02
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 18 deletions.
24 changes: 24 additions & 0 deletions drivers/staging/vme/bridges/vme_ca91cx42.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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",
Expand Down
24 changes: 24 additions & 0 deletions drivers/staging/vme/bridges/vme_tsi148.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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",
Expand Down
36 changes: 21 additions & 15 deletions drivers/staging/vme/vme.c
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand All @@ -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");
Expand All @@ -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);

Expand Down
10 changes: 7 additions & 3 deletions drivers/staging/vme/vme_bridge.h
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand All @@ -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
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 7f58f02

Please sign in to comment.