diff options
Diffstat (limited to 'arch/powerpc/sysdev')
-rw-r--r-- | arch/powerpc/sysdev/fsl_rio.c | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/arch/powerpc/sysdev/fsl_rio.c b/arch/powerpc/sysdev/fsl_rio.c index a0fa4ebb39c..abdb124e1e2 100644 --- a/arch/powerpc/sysdev/fsl_rio.c +++ b/arch/powerpc/sysdev/fsl_rio.c @@ -18,6 +18,7 @@ #include <linux/types.h> #include <linux/dma-mapping.h> #include <linux/interrupt.h> +#include <linux/device.h> #include <linux/rio.h> #include <linux/rio_drv.h> #include <linux/of_platform.h> @@ -159,6 +160,7 @@ struct rio_msg_rx_ring { }; struct rio_priv { + struct device *dev; void __iomem *regs_win; struct rio_atmu_regs __iomem *atmu_regs; struct rio_atmu_regs __iomem *maint_atmu_regs; @@ -484,13 +486,13 @@ int rio_open_outb_mbox(struct rio_mport *mport, void *dev_id, int mbox, int entr for (i = 0; i < priv->msg_tx_ring.size; i++) { priv->msg_tx_ring.virt_buffer[i] = - dma_alloc_coherent(NULL, RIO_MSG_BUFFER_SIZE, + dma_alloc_coherent(priv->dev, RIO_MSG_BUFFER_SIZE, &priv->msg_tx_ring.phys_buffer[i], GFP_KERNEL); if (!priv->msg_tx_ring.virt_buffer[i]) { rc = -ENOMEM; for (j = 0; j < priv->msg_tx_ring.size; j++) if (priv->msg_tx_ring.virt_buffer[j]) - dma_free_coherent(NULL, + dma_free_coherent(priv->dev, RIO_MSG_BUFFER_SIZE, priv->msg_tx_ring. virt_buffer[j], @@ -501,7 +503,7 @@ int rio_open_outb_mbox(struct rio_mport *mport, void *dev_id, int mbox, int entr } /* Initialize outbound message descriptor ring */ - priv->msg_tx_ring.virt = dma_alloc_coherent(NULL, + priv->msg_tx_ring.virt = dma_alloc_coherent(priv->dev, priv->msg_tx_ring.size * RIO_MSG_DESC_SIZE, &priv->msg_tx_ring.phys, GFP_KERNEL); if (!priv->msg_tx_ring.virt) { @@ -549,12 +551,13 @@ int rio_open_outb_mbox(struct rio_mport *mport, void *dev_id, int mbox, int entr return rc; out_irq: - dma_free_coherent(NULL, priv->msg_tx_ring.size * RIO_MSG_DESC_SIZE, + dma_free_coherent(priv->dev, + priv->msg_tx_ring.size * RIO_MSG_DESC_SIZE, priv->msg_tx_ring.virt, priv->msg_tx_ring.phys); out_dma: for (i = 0; i < priv->msg_tx_ring.size; i++) - dma_free_coherent(NULL, RIO_MSG_BUFFER_SIZE, + dma_free_coherent(priv->dev, RIO_MSG_BUFFER_SIZE, priv->msg_tx_ring.virt_buffer[i], priv->msg_tx_ring.phys_buffer[i]); @@ -576,7 +579,8 @@ void rio_close_outb_mbox(struct rio_mport *mport, int mbox) out_be32(&priv->msg_regs->omr, 0); /* Free ring */ - dma_free_coherent(NULL, priv->msg_tx_ring.size * RIO_MSG_DESC_SIZE, + dma_free_coherent(priv->dev, + priv->msg_tx_ring.size * RIO_MSG_DESC_SIZE, priv->msg_tx_ring.virt, priv->msg_tx_ring.phys); /* Free interrupt */ @@ -654,7 +658,7 @@ int rio_open_inb_mbox(struct rio_mport *mport, void *dev_id, int mbox, int entri priv->msg_rx_ring.virt_buffer[i] = NULL; /* Initialize inbound message ring */ - priv->msg_rx_ring.virt = dma_alloc_coherent(NULL, + priv->msg_rx_ring.virt = dma_alloc_coherent(priv->dev, priv->msg_rx_ring.size * RIO_MAX_MSG_SIZE, &priv->msg_rx_ring.phys, GFP_KERNEL); if (!priv->msg_rx_ring.virt) { @@ -673,7 +677,7 @@ int rio_open_inb_mbox(struct rio_mport *mport, void *dev_id, int mbox, int entri rc = request_irq(IRQ_RIO_RX(mport), fsl_rio_rx_handler, 0, "msg_rx", (void *)mport); if (rc < 0) { - dma_free_coherent(NULL, RIO_MSG_BUFFER_SIZE, + dma_free_coherent(priv->dev, RIO_MSG_BUFFER_SIZE, priv->msg_tx_ring.virt_buffer[i], priv->msg_tx_ring.phys_buffer[i]); goto out; @@ -713,7 +717,7 @@ void rio_close_inb_mbox(struct rio_mport *mport, int mbox) out_be32(&priv->msg_regs->imr, 0); /* Free ring */ - dma_free_coherent(NULL, priv->msg_rx_ring.size * RIO_MAX_MSG_SIZE, + dma_free_coherent(priv->dev, priv->msg_rx_ring.size * RIO_MAX_MSG_SIZE, priv->msg_rx_ring.virt, priv->msg_rx_ring.phys); /* Free interrupt */ @@ -890,7 +894,7 @@ static int fsl_rio_doorbell_init(struct rio_mport *mport) } /* Initialize inbound doorbells */ - priv->dbell_ring.virt = dma_alloc_coherent(NULL, 512 * + priv->dbell_ring.virt = dma_alloc_coherent(priv->dev, 512 * DOORBELL_MESSAGE_SIZE, &priv->dbell_ring.phys, GFP_KERNEL); if (!priv->dbell_ring.virt) { printk(KERN_ERR "RIO: unable allocate inbound doorbell ring\n"); @@ -911,7 +915,7 @@ static int fsl_rio_doorbell_init(struct rio_mport *mport) "dbell_rx", (void *)mport); if (rc < 0) { iounmap(priv->dbell_win); - dma_free_coherent(NULL, 512 * DOORBELL_MESSAGE_SIZE, + dma_free_coherent(priv->dev, 512 * DOORBELL_MESSAGE_SIZE, priv->dbell_ring.virt, priv->dbell_ring.phys); printk(KERN_ERR "MPC85xx RIO: unable to request inbound doorbell irq"); @@ -1087,6 +1091,8 @@ int fsl_rio_setup(struct of_device *dev) rio_init_mbox_res(&port->riores[RIO_OUTB_MBOX_RESOURCE], 0, 0); strcpy(port->name, "RIO0 mport"); + priv->dev = &dev->dev; + port->ops = ops; port->host_deviceid = fsl_rio_get_hdid(port->id); |