Skip to content

Commit

Permalink
usb: musb: Add support of CPPI 4.1 DMA controller to DA8xx
Browse files Browse the repository at this point in the history
Currently, only the PIO mode is supported.
This add support of CPPI 4.1 to DA8xx.
As in DA8xx the CPPI 4.1 DMA is a part of the USBSS, create the CPPI 4.1
device as a child of USB.

Signed-off-by: Alexandre Bailon <abailon@baylibre.com>
[b-liu@ti.com: minor tweak in the commit log]
Signed-off-by: Bin Liu <b-liu@ti.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
anobli authored and gregkh committed Apr 18, 2017
1 parent aa2fb88 commit d6299b6
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 3 deletions.
4 changes: 2 additions & 2 deletions drivers/usb/musb/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -160,8 +160,8 @@ config USB_TI_CPPI_DMA
Enable DMA transfers when TI CPPI DMA is available.

config USB_TI_CPPI41_DMA
bool 'TI CPPI 4.1 (AM335x)'
depends on ARCH_OMAP && DMADEVICES
bool 'TI CPPI 4.1'
depends on (ARCH_OMAP || ARCH_DAVINCI_DA8XX) && DMADEVICES
select TI_CPPI41

config USB_TUSB_OMAP_DMA
Expand Down
43 changes: 42 additions & 1 deletion drivers/usb/musb/da8xx.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
#include <linux/clk.h>
#include <linux/err.h>
#include <linux/io.h>
#include <linux/of_platform.h>
#include <linux/phy/phy.h>
#include <linux/platform_device.h>
#include <linux/dma-mapping.h>
Expand Down Expand Up @@ -456,12 +457,41 @@ static inline u8 get_vbus_power(struct device *dev)
return current_uA / 1000 / 2;
}

#ifdef CONFIG_USB_TI_CPPI41_DMA
static void da8xx_dma_controller_callback(struct dma_controller *c)
{
struct musb *musb = c->musb;
void __iomem *reg_base = musb->ctrl_base;

musb_writel(reg_base, DA8XX_USB_END_OF_INTR_REG, 0);
}

static struct dma_controller *
da8xx_dma_controller_create(struct musb *musb, void __iomem *base)
{
struct dma_controller *controller;

controller = cppi41_dma_controller_create(musb, base);
if (IS_ERR_OR_NULL(controller))
return controller;

controller->dma_callback = da8xx_dma_controller_callback;

return controller;
}
#endif

static const struct musb_platform_ops da8xx_ops = {
.quirks = MUSB_INDEXED_EP | MUSB_PRESERVE_SESSION,
.quirks = MUSB_INDEXED_EP | MUSB_PRESERVE_SESSION |
MUSB_DMA_CPPI41,
.init = da8xx_musb_init,
.exit = da8xx_musb_exit,

.fifo_mode = 2,
#ifdef CONFIG_USB_TI_CPPI41_DMA
.dma_init = da8xx_dma_controller_create,
.dma_exit = cppi41_dma_controller_destroy,
#endif
.enable = da8xx_musb_enable,
.disable = da8xx_musb_disable,

Expand All @@ -483,6 +513,12 @@ static const struct musb_hdrc_config da8xx_config = {
.multipoint = 1,
};

static struct of_dev_auxdata da8xx_auxdata_lookup[] __initdata = {
OF_DEV_AUXDATA("ti,da830-cppi41", 0x01e01000, "cppi41-dmaengine",
NULL),
{}
};

static int da8xx_probe(struct platform_device *pdev)
{
struct resource musb_resources[2];
Expand Down Expand Up @@ -533,6 +569,11 @@ static int da8xx_probe(struct platform_device *pdev)
}
platform_set_drvdata(pdev, glue);

ret = of_platform_populate(pdev->dev.of_node, NULL,
da8xx_auxdata_lookup, &pdev->dev);
if (ret)
return ret;

memset(musb_resources, 0x00, sizeof(*musb_resources) *
ARRAY_SIZE(musb_resources));

Expand Down

0 comments on commit d6299b6

Please sign in to comment.