diff options
author | Gabor Juhos <juhosg@openwrt.org> | 2013-05-30 16:23:06 +0000 |
---|---|---|
committer | Gabor Juhos <juhosg@openwrt.org> | 2013-05-30 16:23:06 +0000 |
commit | f02765086dbb51df6dc24942cd2d5cc02db77af6 (patch) | |
tree | 5ccb25ea41c60bdce0cf5a8d0aa13d237fd05366 /target/linux/ar71xx/patches-3.8/525-MIPS-ath79-enable-qca-usb-quirks.patch | |
parent | 6ff976a87a5442bc18fe64deda758e026374f7f6 (diff) | |
download | mtk-20170518-f02765086dbb51df6dc24942cd2d5cc02db77af6.zip mtk-20170518-f02765086dbb51df6dc24942cd2d5cc02db77af6.tar.gz mtk-20170518-f02765086dbb51df6dc24942cd2d5cc02db77af6.tar.bz2 |
ar71xx: add USB workarounds for AR934x/QCA955x SoCs
Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
SVN-Revision: 36787
Diffstat (limited to 'target/linux/ar71xx/patches-3.8/525-MIPS-ath79-enable-qca-usb-quirks.patch')
-rw-r--r-- | target/linux/ar71xx/patches-3.8/525-MIPS-ath79-enable-qca-usb-quirks.patch | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/target/linux/ar71xx/patches-3.8/525-MIPS-ath79-enable-qca-usb-quirks.patch b/target/linux/ar71xx/patches-3.8/525-MIPS-ath79-enable-qca-usb-quirks.patch new file mode 100644 index 0000000..ede8035 --- /dev/null +++ b/target/linux/ar71xx/patches-3.8/525-MIPS-ath79-enable-qca-usb-quirks.patch @@ -0,0 +1,86 @@ +--- 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 + &ath79_ehci_pdata_v2, sizeof(ath79_ehci_pdata_v2)); + } + +-static void __init ar934x_usb_setup(void) ++static void enable_tx_tx_idp_violation_fix(unsigned base) + { +- u32 bootstrap; ++ void __iomem *phy_reg; ++ u32 t; ++ ++ phy_reg = ioremap(base, 4); ++ if (!phy_reg) ++ return; ++ ++ t = ioread32(phy_reg); ++ t &= ~0xff; ++ t |= 0x58; ++ iowrite32(t, phy_reg); ++ ++ 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; + ++ enable_tx_tx_idp_violation_fix(0x18116c94); ++ dev_info(&pdev->dev, "TX-TX IDP fix enabled\n"); ++} ++ ++static void __init ar934x_usb_setup(void) ++{ + ath79_device_reset_set(AR934X_RESET_USBSUS_OVERRIDE); + udelay(1000); + +@@ -202,14 +222,44 @@ 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; ++ + ath79_usb_register("ehci-platform", -1, + AR934X_EHCI_BASE, AR934X_EHCI_SIZE, + ATH79_CPU_IRQ(3), + &ath79_ehci_pdata_v2, sizeof(ath79_ehci_pdata_v2)); + } + ++static void qca955x_usb_reset_notifier(struct platform_device *pdev) ++{ ++ u32 base; ++ ++ switch (pdev->id) { ++ case 0: ++ base = 0x18116c94; ++ break; ++ ++ case 1: ++ base = 0x18116e54; ++ break; ++ ++ default: ++ return; ++ } ++ ++ enable_tx_tx_idp_violation_fix(base); ++ dev_info(&pdev->dev, "TX-TX IDP fix enabled\n"); ++} ++ + 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, + QCA955X_EHCI0_BASE, QCA955X_EHCI_SIZE, + ATH79_IP3_IRQ(0), |