|
@@ -33,6 +33,7 @@
|
|
#include <linux/clk.h>
|
|
#include <linux/clk.h>
|
|
#include <linux/err.h>
|
|
#include <linux/err.h>
|
|
#include <linux/io.h>
|
|
#include <linux/io.h>
|
|
|
|
+#include <linux/of_platform.h>
|
|
#include <linux/phy/phy.h>
|
|
#include <linux/phy/phy.h>
|
|
#include <linux/platform_device.h>
|
|
#include <linux/platform_device.h>
|
|
#include <linux/dma-mapping.h>
|
|
#include <linux/dma-mapping.h>
|
|
@@ -456,12 +457,41 @@ static inline u8 get_vbus_power(struct device *dev)
|
|
return current_uA / 1000 / 2;
|
|
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 = {
|
|
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,
|
|
.init = da8xx_musb_init,
|
|
.exit = da8xx_musb_exit,
|
|
.exit = da8xx_musb_exit,
|
|
|
|
|
|
.fifo_mode = 2,
|
|
.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,
|
|
.enable = da8xx_musb_enable,
|
|
.disable = da8xx_musb_disable,
|
|
.disable = da8xx_musb_disable,
|
|
|
|
|
|
@@ -483,6 +513,12 @@ static const struct musb_hdrc_config da8xx_config = {
|
|
.multipoint = 1,
|
|
.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)
|
|
static int da8xx_probe(struct platform_device *pdev)
|
|
{
|
|
{
|
|
struct resource musb_resources[2];
|
|
struct resource musb_resources[2];
|
|
@@ -533,6 +569,11 @@ static int da8xx_probe(struct platform_device *pdev)
|
|
}
|
|
}
|
|
platform_set_drvdata(pdev, glue);
|
|
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) *
|
|
memset(musb_resources, 0x00, sizeof(*musb_resources) *
|
|
ARRAY_SIZE(musb_resources));
|
|
ARRAY_SIZE(musb_resources));
|
|
|
|
|