[PATCH 1/2] ARM: EXYNOS: Add EHCI AHB burst function
From: Sangwook Lee <hidden>
Date: 2012-02-29 12:41:22
Also in:
linux-samsung-soc
Subsystem:
arm port, the rest · Maintainers:
Russell King, Linus Torvalds
Enable burst transfer from AHB for EHCI. This fixes data transfer of USB Ethernet with EHCI. Without this patch, scp hardly works. Signed-off-by: Sangwook Lee <redacted> --- arch/arm/mach-exynos/setup-usb-phy.c | 6 ++++++ arch/arm/plat-samsung/devs.c | 2 ++ arch/arm/plat-samsung/include/plat/ehci.h | 19 +++++++++++++++++++ 3 files changed, 27 insertions(+), 0 deletions(-)
diff --git a/arch/arm/mach-exynos/setup-usb-phy.c b/arch/arm/mach-exynos/setup-usb-phy.c
index 41743d2..5a20460 100644
--- a/arch/arm/mach-exynos/setup-usb-phy.c
+++ b/arch/arm/mach-exynos/setup-usb-phy.c@@ -18,6 +18,7 @@ #include <mach/regs-usb-phy.h> #include <plat/cpu.h> #include <plat/usb-phy.h> +#include <plat/ehci.h> static atomic_t host_usage;
@@ -149,3 +150,8 @@ int s5p_usb_phy_exit(struct platform_device *pdev, int type) return -EINVAL; } + +void s5p_ehci_burst_enable(struct platform_device *pdev, void __iomem *base) +{ + writel(EHCI_INSNREG00_ENABLE_BURST, base + EHCI_INSNREG00); +}
diff --git a/arch/arm/plat-samsung/devs.c b/arch/arm/plat-samsung/devs.c
index f10768e..8fd1bd3 100644
--- a/arch/arm/plat-samsung/devs.c
+++ b/arch/arm/plat-samsung/devs.c@@ -1402,6 +1402,8 @@ void __init s5p_ehci_set_platdata(struct s5p_ehci_platdata *pd) npd->phy_init = s5p_usb_phy_init; if (!npd->phy_exit) npd->phy_exit = s5p_usb_phy_exit; + if (!npd->burst_enable) + npd->burst_enable = s5p_ehci_burst_enable; } #endif /* CONFIG_S5P_DEV_USB_EHCI */
diff --git a/arch/arm/plat-samsung/include/plat/ehci.h b/arch/arm/plat-samsung/include/plat/ehci.h
index 5f28cae..9c866b7 100644
--- a/arch/arm/plat-samsung/include/plat/ehci.h
+++ b/arch/arm/plat-samsung/include/plat/ehci.h@@ -14,8 +14,27 @@ struct s5p_ehci_platdata { int (*phy_init)(struct platform_device *pdev, int type); int (*phy_exit)(struct platform_device *pdev, int type); + void (*burst_enable)(struct platform_device *pdev, void __iomem *base); }; extern void s5p_ehci_set_platdata(struct s5p_ehci_platdata *pd); +extern void s5p_ehci_burst_enable(struct platform_device *pdev, + void __iomem *base); + +/* EHCI EXYNOS specific register */ +#define EHCI_INSNREG00 0x90 + +/* + * EHCI INSNREG00 Specific fields + * Enable AHB master to use burst transfer from 4 to 16 + */ +#define EHCI_INSNREG00_ENABLE_INCR16 (1 << 25) +#define EHCI_INSNREG00_ENABLE_INCR8 (1 << 24) +#define EHCI_INSNREG00_ENABLE_INCR4 (1 << 23) +/* Force AHB master to start burst transfer only for 4,8,16 alignment */ +#define EHCI_INSNREG00_ENABLE_INCRX_ALIGN (1 << 22) +#define EHCI_INSNREG00_ENABLE_BURST \ + (EHCI_INSNREG00_ENABLE_INCR16 | EHCI_INSNREG00_ENABLE_INCR8 | \ + EHCI_INSNREG00_ENABLE_INCR4 | EHCI_INSNREG00_ENABLE_INCRX_ALIGN) #endif /* __PLAT_SAMSUNG_EHCI_H */
--
1.7.4.1