Merge tag 'ras_core_for_v5.13' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
[linux-2.6-microblaze.git] / drivers / usb / musb / musbhsdma.c
index 2d3751d..7acd163 100644 (file)
 #include <linux/platform_device.h>
 #include <linux/slab.h>
 #include "musb_core.h"
-
-#define MUSB_HSDMA_BASE                0x200
-#define MUSB_HSDMA_INTR                (MUSB_HSDMA_BASE + 0)
-#define MUSB_HSDMA_CONTROL             0x4
-#define MUSB_HSDMA_ADDRESS             0x8
-#define MUSB_HSDMA_COUNT               0xc
+#include "musb_dma.h"
 
 #define MUSB_HSDMA_CHANNEL_OFFSET(_bchannel, _offset)          \
                (MUSB_HSDMA_BASE + (_bchannel << 4) + _offset)
@@ -268,7 +263,7 @@ static int dma_channel_abort(struct dma_channel *channel)
        return 0;
 }
 
-static irqreturn_t dma_controller_irq(int irq, void *private_data)
+irqreturn_t dma_controller_irq(int irq, void *private_data)
 {
        struct musb_dma_controller *controller = private_data;
        struct musb *musb = controller->private_data;
@@ -289,7 +284,7 @@ static irqreturn_t dma_controller_irq(int irq, void *private_data)
 
        spin_lock_irqsave(&musb->lock, flags);
 
-       int_hsdma = musb_readb(mbase, MUSB_HSDMA_INTR);
+       int_hsdma = musb_clearb(mbase, MUSB_HSDMA_INTR);
 
        if (!int_hsdma) {
                musb_dbg(musb, "spurious DMA irq");
@@ -326,8 +321,6 @@ static irqreturn_t dma_controller_irq(int irq, void *private_data)
                                musb_channel->channel.status =
                                        MUSB_DMA_STATUS_BUS_ABORT;
                        } else {
-                               u8 devctl;
-
                                addr = musb_read_hsdma_addr(mbase,
                                                bchannel);
                                channel->actual_len = addr
@@ -341,8 +334,6 @@ static irqreturn_t dma_controller_irq(int irq, void *private_data)
                                                < musb_channel->len) ?
                                        "=> reconfig 0" : "=> complete");
 
-                               devctl = musb_readb(mbase, MUSB_DEVCTL);
-
                                channel->status = MUSB_DMA_STATUS_FREE;
 
                                /* completed */
@@ -383,6 +374,7 @@ done:
        spin_unlock_irqrestore(&musb->lock, flags);
        return retval;
 }
+EXPORT_SYMBOL_GPL(dma_controller_irq);
 
 void musbhs_dma_controller_destroy(struct dma_controller *c)
 {
@@ -398,18 +390,10 @@ void musbhs_dma_controller_destroy(struct dma_controller *c)
 }
 EXPORT_SYMBOL_GPL(musbhs_dma_controller_destroy);
 
-struct dma_controller *musbhs_dma_controller_create(struct musb *musb,
-                                                   void __iomem *base)
+static struct musb_dma_controller *
+dma_controller_alloc(struct musb *musb, void __iomem *base)
 {
        struct musb_dma_controller *controller;
-       struct device *dev = musb->controller;
-       struct platform_device *pdev = to_platform_device(dev);
-       int irq = platform_get_irq_byname(pdev, "dma");
-
-       if (irq <= 0) {
-               dev_err(dev, "No DMA interrupt line!\n");
-               return NULL;
-       }
 
        controller = kzalloc(sizeof(*controller), GFP_KERNEL);
        if (!controller)
@@ -423,6 +407,25 @@ struct dma_controller *musbhs_dma_controller_create(struct musb *musb,
        controller->controller.channel_release = dma_channel_release;
        controller->controller.channel_program = dma_channel_program;
        controller->controller.channel_abort = dma_channel_abort;
+       return controller;
+}
+
+struct dma_controller *
+musbhs_dma_controller_create(struct musb *musb, void __iomem *base)
+{
+       struct musb_dma_controller *controller;
+       struct device *dev = musb->controller;
+       struct platform_device *pdev = to_platform_device(dev);
+       int irq = platform_get_irq_byname(pdev, "dma");
+
+       if (irq <= 0) {
+               dev_err(dev, "No DMA interrupt line!\n");
+               return NULL;
+       }
+
+       controller = dma_controller_alloc(musb, base);
+       if (!controller)
+               return NULL;
 
        if (request_irq(irq, dma_controller_irq, 0,
                        dev_name(musb->controller), controller)) {
@@ -437,3 +440,16 @@ struct dma_controller *musbhs_dma_controller_create(struct musb *musb,
        return &controller->controller;
 }
 EXPORT_SYMBOL_GPL(musbhs_dma_controller_create);
+
+struct dma_controller *
+musbhs_dma_controller_create_noirq(struct musb *musb, void __iomem *base)
+{
+       struct musb_dma_controller *controller;
+
+       controller = dma_controller_alloc(musb, base);
+       if (!controller)
+               return NULL;
+
+       return &controller->controller;
+}
+EXPORT_SYMBOL_GPL(musbhs_dma_controller_create_noirq);