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 sangwook.lee@linaro.org --- 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 */