mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-05 18:39:59 +00:00
usb: musb: Add noirq type of dma create interface
Add noirq type of dma create interface for platform which do not have dedicated DMA interrupt line, move musbhsdma macro definition to musb_dma.h Signed-off-by: Min Guo <min.guo@mediatek.com> Signed-off-by: Bin Liu <b-liu@ti.com> Link: https://lore.kernel.org/r/20200115132547.364-22-b-liu@ti.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
fe3bbd6b38
commit
edce61776c
2 changed files with 46 additions and 17 deletions
|
@ -35,6 +35,12 @@ struct musb_hw_ep;
|
|||
* whether shared with the Inventra core or separate.
|
||||
*/
|
||||
|
||||
#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
|
||||
|
||||
#define DMA_ADDR_INVALID (~(dma_addr_t)0)
|
||||
|
||||
#ifdef CONFIG_MUSB_PIO_ONLY
|
||||
|
@ -191,6 +197,9 @@ extern void (*musb_dma_controller_destroy)(struct dma_controller *);
|
|||
extern struct dma_controller *
|
||||
musbhs_dma_controller_create(struct musb *musb, void __iomem *base);
|
||||
extern void musbhs_dma_controller_destroy(struct dma_controller *c);
|
||||
extern struct dma_controller *
|
||||
musbhs_dma_controller_create_noirq(struct musb *musb, void __iomem *base);
|
||||
extern irqreturn_t dma_controller_irq(int irq, void *private_data);
|
||||
|
||||
extern struct dma_controller *
|
||||
tusb_dma_controller_create(struct musb *musb, void __iomem *base);
|
||||
|
|
|
@ -10,12 +10,7 @@
|
|||
#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;
|
||||
|
@ -383,6 +378,7 @@ static irqreturn_t dma_controller_irq(int irq, void *private_data)
|
|||
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 +394,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 +411,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 +444,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);
|
||||
|
|
Loading…
Reference in a new issue