[LEDE-DEV] [PATCH] ar71xx: Chipidea USB device support for QCA953x
Piotr Dymacz
pepe2k at gmail.com
Sun Sep 10 16:05:14 PDT 2017
Hello Sergey,
On 01.09.2017 06:16, adron at yapic.net wrote:
> From: Sergey Sergeev <adron at yapic.net>
>
> Changes the platform to use the Chipidea driver instead of the
> generic USB host driver which has support for both host and
> device modes (selected on boot) for QCA953x based boards.
>
> It was tested on GL.iNet GL-AR300M with USB DEVICE mode config.
>
> More details is available here:
> https://github.com/adron-s/QCA953x-usb-device-mode
Please, have a look at 'ar71xx_qca9k-usb-device-mode' branch in my
staging tree [1]. There is a slightly modified version of Felix's
'ar71xx: rework chipidea usb controller patch' change, from his staging
tree [2].
I tested it successfully on AR9331, AR9344, QCA9531 and QCA9557 based
devices (I plan to make some tests on QCA956x later), with USB in device
and host mode. I also dropped 'ar933x_usb_setup_ctrl_config()' function
which was toggling 'HOST_ONLY' bit in 'USB_CONFIG' register as it wasn't
make any difference on all tested platforms.
[1] https://git.lede-project.org/?p=lede/pepe2k/staging.git;a=summary
[2] https://git.lede-project.org/?p=lede/nbd/staging.git;a=summary
--
Cheers,
Piotr
>
> Signed-off-by: Sergey Sergeev <adron at yapic.net>
> ---
> ...940-usb-chipidea-QCA953x-platform-support.patch | 87 ++++++++++++++++++++++
> 1 file changed, 87 insertions(+)
> create mode 100644 target/linux/ar71xx/patches-4.4/940-usb-chipidea-QCA953x-platform-support.patch
>
> diff --git a/target/linux/ar71xx/patches-4.4/940-usb-chipidea-QCA953x-platform-support.patch b/target/linux/ar71xx/patches-4.4/940-usb-chipidea-QCA953x-platform-support.patch
> new file mode 100644
> index 0000000..a3e2509
> --- /dev/null
> +++ b/target/linux/ar71xx/patches-4.4/940-usb-chipidea-QCA953x-platform-support.patch
> @@ -0,0 +1,87 @@
> +--- a/arch/mips/ath79/dev-usb.c
> ++++ b/arch/mips/ath79/dev-usb.c
> +@@ -286,6 +286,51 @@
> + &ath79_ehci_pdata_v2, sizeof(ath79_ehci_pdata_v2));
> + }
> +
> ++#if IS_ENABLED(CONFIG_USB_CHIPIDEA)
> ++static void __init qca953x_usb_setup_ctrl_config(void)
> ++{
> ++ void __iomem *usb_ctrl_base, *usb_config_reg;
> ++ u32 usb_config;
> ++
> ++ usb_ctrl_base = ioremap(AR71XX_USB_CTRL_BASE, AR71XX_USB_CTRL_SIZE);
> ++ usb_config_reg = usb_ctrl_base + AR71XX_USB_CTRL_REG_CONFIG;
> ++ usb_config = __raw_readl(usb_config_reg);
> ++ usb_config &= ~QCA953X_USB_CONFIG_HOST_ONLY;
> ++ __raw_writel(usb_config, usb_config_reg);
> ++ iounmap(usb_ctrl_base);
> ++}
> ++
> ++static void __init qca953x_ci_usb_setup(u32 bootstrap)
> ++{
> ++ enum usb_dr_mode dr_mode;
> ++ struct ci_hdrc_platform_data ci_pdata;
> ++
> ++ if (bootstrap & QCA953X_BOOTSTRAP_USB_MODE_DEVICE) {
> ++ dr_mode = USB_DR_MODE_PERIPHERAL;
> ++ qca953x_usb_setup_ctrl_config();
> ++ } else {
> ++ dr_mode = USB_DR_MODE_HOST;
> ++ }
> ++
> ++ memset(&ci_pdata, 0, sizeof(ci_pdata));
> ++ ci_pdata.name = "ci_hdrc_qca953x";
> ++ ci_pdata.capoffset = DEF_CAPOFFSET;
> ++ ci_pdata.dr_mode = dr_mode;
> ++ ci_pdata.flags = CI_HDRC_DUAL_ROLE_NOT_OTG | CI_HDRC_DP_ALWAYS_PULLUP;
> ++ ci_pdata.vbus_extcon.edev = ERR_PTR(-ENODEV);
> ++ ci_pdata.id_extcon.edev = ERR_PTR(-ENODEV);
> ++ ci_pdata.itc_setting = 1;
> ++
> ++ platform_device_register_simple("usb_phy_generic",
> ++ PLATFORM_DEVID_AUTO, NULL, 0);
> ++
> ++ ath79_usb_register("ci_hdrc", -1,
> ++ QCA953X_EHCI_BASE, QCA953X_EHCI_SIZE,
> ++ ATH79_CPU_IRQ(3),
> ++ &ci_pdata, sizeof(ci_pdata));
> ++}
> ++#endif
> ++
> + static void __init qca953x_usb_setup(void)
> + {
> + u32 bootstrap;
> +@@ -304,10 +349,14 @@
> + ath79_device_reset_clear(QCA953X_RESET_USB_HOST);
> + udelay(1000);
> +
> ++#if IS_ENABLED(CONFIG_USB_CHIPIDEA)
> ++ qca953x_ci_usb_setup(bootstrap);
> ++#else
> + ath79_usb_register("ehci-platform", -1,
> + QCA953X_EHCI_BASE, QCA953X_EHCI_SIZE,
> + ATH79_CPU_IRQ(3),
> + &ath79_ehci_pdata_v2, sizeof(ath79_ehci_pdata_v2));
> ++#endif
> + }
> +
> + static void qca955x_usb_reset_notifier(struct platform_device *pdev)
> +--- a/arch/mips/include/asm/mach-ath79/ar71xx_regs.h
> ++++ b/arch/mips/include/asm/mach-ath79/ar71xx_regs.h
> +@@ -660,6 +660,7 @@
> + #define AR933X_BOOTSTRAP_MDIO_GPIO_EN BIT(18)
> + #define AR933X_BOOTSTRAP_EEPBUSY BIT(4)
> + #define AR933X_BOOTSTRAP_USB_MODE_HOST BIT(3)
> ++#define QCA953X_BOOTSTRAP_USB_MODE_DEVICE BIT(7)
> + #define AR933X_BOOTSTRAP_REF_CLK_40 BIT(0)
> +
> + #define AR934X_BOOTSTRAP_SW_OPTION8 BIT(23)
> +@@ -690,6 +691,7 @@
> + #define QCA956X_BOOTSTRAP_REF_CLK_40 BIT(2)
> +
> + #define AR933X_USB_CONFIG_HOST_ONLY BIT(8)
> ++#define QCA953X_USB_CONFIG_HOST_ONLY BIT(4)
> +
> + #define AR934X_PCIE_WMAC_INT_WMAC_MISC BIT(0)
> + #define AR934X_PCIE_WMAC_INT_WMAC_TX BIT(1)
>
More information about the Lede-dev
mailing list