diff options
author | Felix Fietkau <nbd@openwrt.org> | 2014-05-24 08:01:42 +0000 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2014-05-24 08:01:42 +0000 |
commit | 30c105064f5a7e992e6a09d1a41b26a636990dae (patch) | |
tree | 5ef8b847dc760b57fdf3caa83972d0a58bdf6f77 /target/linux | |
parent | 5352064817670bc18fc907f4847f7ce127e21281 (diff) | |
download | master-187ad058-30c105064f5a7e992e6a09d1a41b26a636990dae.tar.gz master-187ad058-30c105064f5a7e992e6a09d1a41b26a636990dae.tar.bz2 master-187ad058-30c105064f5a7e992e6a09d1a41b26a636990dae.zip |
ar71xx: enable usb quirks for all chipidea based devices
The most important one is qca_force_host_mode, which also sets the
'Stream Disable' bit in the usbmode register.
Fixes usb stability issues on AR933x and AR7241/AR7242
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@40841 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux')
-rw-r--r-- | target/linux/ar71xx/patches-3.10/525-MIPS-ath79-enable-qca-usb-quirks.patch | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/target/linux/ar71xx/patches-3.10/525-MIPS-ath79-enable-qca-usb-quirks.patch b/target/linux/ar71xx/patches-3.10/525-MIPS-ath79-enable-qca-usb-quirks.patch index ede8035c7c..df6825771e 100644 --- a/target/linux/ar71xx/patches-3.10/525-MIPS-ath79-enable-qca-usb-quirks.patch +++ b/target/linux/ar71xx/patches-3.10/525-MIPS-ath79-enable-qca-usb-quirks.patch @@ -1,6 +1,15 @@ --- a/arch/mips/ath79/dev-usb.c +++ b/arch/mips/ath79/dev-usb.c -@@ -182,14 +182,34 @@ static void __init ar933x_usb_setup(void +@@ -37,6 +37,8 @@ static struct usb_ehci_pdata ath79_ehci_ + static struct usb_ehci_pdata ath79_ehci_pdata_v2 = { + .caps_offset = 0x100, + .has_tt = 1, ++ .qca_force_host_mode = 1, ++ .qca_force_16bit_ptw = 1, + }; + + static void __init ath79_usb_register(const char *name, int id, +@@ -182,14 +184,34 @@ static void __init ar933x_usb_setup(void &ath79_ehci_pdata_v2, sizeof(ath79_ehci_pdata_v2)); } @@ -10,11 +19,13 @@ - u32 bootstrap; + void __iomem *phy_reg; + u32 t; -+ + +- bootstrap = ath79_reset_rr(AR934X_RESET_REG_BOOTSTRAP); +- if (bootstrap & AR934X_BOOTSTRAP_USB_MODE_DEVICE) + phy_reg = ioremap(base, 4); + if (!phy_reg) -+ return; -+ + return; + + t = ioread32(phy_reg); + t &= ~0xff; + t |= 0x58; @@ -22,14 +33,12 @@ + + iounmap(phy_reg); +} - -- bootstrap = ath79_reset_rr(AR934X_RESET_REG_BOOTSTRAP); -- if (bootstrap & AR934X_BOOTSTRAP_USB_MODE_DEVICE) ++ +static void ar934x_usb_reset_notifier(struct platform_device *pdev) +{ + if (pdev->id != -1) - return; - ++ return; ++ + enable_tx_tx_idp_violation_fix(0x18116c94); + dev_info(&pdev->dev, "TX-TX IDP fix enabled\n"); +} @@ -39,12 +48,10 @@ ath79_device_reset_set(AR934X_RESET_USBSUS_OVERRIDE); udelay(1000); -@@ -202,14 +222,44 @@ static void __init ar934x_usb_setup(void +@@ -202,14 +224,40 @@ static void __init ar934x_usb_setup(void ath79_device_reset_clear(AR934X_RESET_USB_HOST); udelay(1000); -+ ath79_ehci_pdata_v2.qca_force_host_mode = 1; -+ ath79_ehci_pdata_v2.qca_force_16bit_ptw = 1; + if (ath79_soc_rev >= 3) + ath79_ehci_pdata_v2.reset_notifier = ar934x_usb_reset_notifier; + @@ -77,8 +84,6 @@ + static void __init qca955x_usb_setup(void) { -+ ath79_ehci_pdata_v2.qca_force_host_mode = 1; -+ ath79_ehci_pdata_v2.qca_force_16bit_ptw = 1; + ath79_ehci_pdata_v2.reset_notifier = qca955x_usb_reset_notifier; + ath79_usb_register("ehci-platform", 0, |