diff options
author | Siva Yerramreddy <yshivakrishna@gmail.com> | 2014-07-11 14:04:25 -0700 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2014-07-11 18:31:12 -0700 |
commit | a93a5244ed7bd3c5f7b51ccb08a14655820e38c3 (patch) | |
tree | 406592c575c8d4e767df755cd8820d2485a494dc /drivers/misc/mic/card/mic_x100.c | |
parent | 9c3d37c7a1efcb1815ec5cb22f70ca98da24f6b1 (diff) | |
download | talos-obmc-linux-a93a5244ed7bd3c5f7b51ccb08a14655820e38c3.tar.gz talos-obmc-linux-a93a5244ed7bd3c5f7b51ccb08a14655820e38c3.zip |
misc: mic: add dma support in card driver
This patch adds a dma device on the mic virtual bus
Reviewed-by: Nikhil Rao <nikhil.rao@intel.com>
Signed-off-by: Sudeep Dutt <sudeep.dutt@intel.com>
Signed-off-by: Siva Yerramreddy <yshivakrishna@gmail.com>
Signed-off-by: Ashutosh Dixit <ashutosh.dixit@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/misc/mic/card/mic_x100.c')
-rw-r--r-- | drivers/misc/mic/card/mic_x100.c | 55 |
1 files changed, 54 insertions, 1 deletions
diff --git a/drivers/misc/mic/card/mic_x100.c b/drivers/misc/mic/card/mic_x100.c index 2868945c9a4d..55c9465bd260 100644 --- a/drivers/misc/mic/card/mic_x100.c +++ b/drivers/misc/mic/card/mic_x100.c @@ -148,6 +148,47 @@ void mic_card_unmap(struct mic_device *mdev, void __iomem *addr) iounmap(addr); } +static inline struct mic_driver *mbdev_to_mdrv(struct mbus_device *mbdev) +{ + return dev_get_drvdata(mbdev->dev.parent); +} + +static struct mic_irq * +_mic_request_threaded_irq(struct mbus_device *mbdev, + irq_handler_t handler, irq_handler_t thread_fn, + const char *name, void *data, int intr_src) +{ + int rc = 0; + unsigned int irq = intr_src; + unsigned long cookie = irq; + + rc = request_threaded_irq(irq, handler, thread_fn, 0, name, data); + if (rc) { + dev_err(mbdev_to_mdrv(mbdev)->dev, + "request_threaded_irq failed rc = %d\n", rc); + return ERR_PTR(rc); + } + return (struct mic_irq *)cookie; +} + +static void _mic_free_irq(struct mbus_device *mbdev, + struct mic_irq *cookie, void *data) +{ + unsigned long irq = (unsigned long)cookie; + free_irq(irq, data); +} + +static void _mic_ack_interrupt(struct mbus_device *mbdev, int num) +{ + mic_ack_interrupt(&mbdev_to_mdrv(mbdev)->mdev); +} + +static struct mbus_hw_ops mbus_hw_ops = { + .request_threaded_irq = _mic_request_threaded_irq, + .free_irq = _mic_free_irq, + .ack_interrupt = _mic_ack_interrupt, +}; + static int __init mic_probe(struct platform_device *pdev) { struct mic_driver *mdrv = &g_drv; @@ -166,13 +207,24 @@ static int __init mic_probe(struct platform_device *pdev) goto done; } mic_hw_intr_init(mdrv); + platform_set_drvdata(pdev, mdrv); + mdrv->dma_mbdev = mbus_register_device(mdrv->dev, MBUS_DEV_DMA_MIC, + NULL, &mbus_hw_ops, + mdrv->mdev.mmio.va); + if (IS_ERR(mdrv->dma_mbdev)) { + rc = PTR_ERR(mdrv->dma_mbdev); + dev_err(&pdev->dev, "mbus_add_device failed rc %d\n", rc); + goto iounmap; + } rc = mic_driver_init(mdrv); if (rc) { dev_err(&pdev->dev, "mic_driver_init failed rc %d\n", rc); - goto iounmap; + goto remove_dma; } done: return rc; +remove_dma: + mbus_unregister_device(mdrv->dma_mbdev); iounmap: iounmap(mdev->mmio.va); return rc; @@ -184,6 +236,7 @@ static int mic_remove(struct platform_device *pdev) struct mic_device *mdev = &mdrv->mdev; mic_driver_uninit(mdrv); + mbus_unregister_device(mdrv->dma_mbdev); iounmap(mdev->mmio.va); return 0; } |