]> git.sur5r.net Git - u-boot/blobdiff - drivers/usb/host/dwc2.c
spi: zynq_[q]spi: Use BIT macro
[u-boot] / drivers / usb / host / dwc2.c
index 702ef63f87451466eea7b7601e3bf056270bfa64..541c0f968701ef9ed6d9e290b54bd8e927b51fce 100644 (file)
@@ -10,6 +10,7 @@
 #include <errno.h>
 #include <usb.h>
 #include <malloc.h>
+#include <memalign.h>
 #include <phys2bus.h>
 #include <usbroothubdes.h>
 #include <asm/io.h>
@@ -27,8 +28,8 @@
 
 struct dwc2_priv {
 #ifdef CONFIG_DM_USB
-       uint8_t aligned_buffer[DWC2_DATA_BUF_SIZE] __aligned(8);
-       uint8_t status_buffer[DWC2_STATUS_BUF_SIZE] __aligned(8);
+       uint8_t aligned_buffer[DWC2_DATA_BUF_SIZE] __aligned(ARCH_DMA_MINALIGN);
+       uint8_t status_buffer[DWC2_STATUS_BUF_SIZE] __aligned(ARCH_DMA_MINALIGN);
 #else
        uint8_t *aligned_buffer;
        uint8_t *status_buffer;
@@ -39,9 +40,11 @@ struct dwc2_priv {
 };
 
 #ifndef CONFIG_DM_USB
-/* We need doubleword-aligned buffers for DMA transfers */
-DEFINE_ALIGN_BUFFER(uint8_t, aligned_buffer_addr, DWC2_DATA_BUF_SIZE, 8);
-DEFINE_ALIGN_BUFFER(uint8_t, status_buffer_addr, DWC2_STATUS_BUF_SIZE, 8);
+/* We need cacheline-aligned buffers for DMA transfers and dcache support */
+DEFINE_ALIGN_BUFFER(uint8_t, aligned_buffer_addr, DWC2_DATA_BUF_SIZE,
+               ARCH_DMA_MINALIGN);
+DEFINE_ALIGN_BUFFER(uint8_t, status_buffer_addr, DWC2_STATUS_BUF_SIZE,
+               ARCH_DMA_MINALIGN);
 
 static struct dwc2_priv local;
 #endif
@@ -821,8 +824,11 @@ int chunk_msg(struct dwc2_priv *priv, struct usb_device *dev,
                       &hc_regs->hctsiz);
 
                if (!in) {
-                       memcpy(priv->aligned_buffer, (char *)buffer + done,
-                              len);
+                       memcpy(priv->aligned_buffer, (char *)buffer + done, len);
+
+                       flush_dcache_range((unsigned long)priv->aligned_buffer,
+                               (unsigned long)((void *)priv->aligned_buffer +
+                               roundup(len, ARCH_DMA_MINALIGN)));
                }
 
                writel(phys_to_bus((unsigned long)priv->aligned_buffer),
@@ -840,6 +846,11 @@ int chunk_msg(struct dwc2_priv *priv, struct usb_device *dev,
 
                if (in) {
                        xfer_len -= sub;
+
+                       invalidate_dcache_range((unsigned long)priv->aligned_buffer,
+                               (unsigned long)((void *)priv->aligned_buffer +
+                               roundup(xfer_len, ARCH_DMA_MINALIGN)));
+
                        memcpy(buffer + done, priv->aligned_buffer, xfer_len);
                        if (sub)
                                stop_transfer = 1;
@@ -1103,11 +1114,12 @@ struct dm_usb_ops dwc2_usb_ops = {
 
 static const struct udevice_id dwc2_usb_ids[] = {
        { .compatible = "brcm,bcm2835-usb" },
+       { .compatible = "snps,dwc2" },
        { }
 };
 
 U_BOOT_DRIVER(usb_dwc2) = {
-       .name   = "dwc2_exynos",
+       .name   = "dwc2_usb",
        .id     = UCLASS_USB,
        .of_match = dwc2_usb_ids,
        .ofdata_to_platdata = dwc2_usb_ofdata_to_platdata,