From 54830a62b9df484f7676b4131db28e0e246a1673 Mon Sep 17 00:00:00 2001 From: lyz Date: Fri, 22 Aug 2014 11:57:21 +0800 Subject: [PATCH] rk312x: usb-uart: support disable usb-uart bypass in DTS --- arch/arm/boot/dts/rk3036-sdk.dts | 6 ++++ arch/arm/boot/dts/rk3126-sdk.dts | 5 ++++ arch/arm/boot/dts/rk3128-box.dts | 6 ++++ arch/arm/boot/dts/rk3128-sdk.dts | 6 ++++ drivers/usb/dwc_otg_310/usbdev_rk3036.c | 36 +++++++++++++++++++----- drivers/usb/dwc_otg_310/usbdev_rk3126.c | 37 ++++++++++++++++++++----- 6 files changed, 82 insertions(+), 14 deletions(-) diff --git a/arch/arm/boot/dts/rk3036-sdk.dts b/arch/arm/boot/dts/rk3036-sdk.dts index 3d5788c90a8b..a7db2827173d 100644 --- a/arch/arm/boot/dts/rk3036-sdk.dts +++ b/arch/arm/boot/dts/rk3036-sdk.dts @@ -229,3 +229,9 @@ // power-gpio = <&gpio0 GPIO_A6 GPIO_ACTIVE_HIGH>; reset-gpio = <&gpio2 GPIO_C6 GPIO_ACTIVE_LOW>; }; + +&dwc_control_usb { + usb_uart { + status = "disabled"; + }; +}; diff --git a/arch/arm/boot/dts/rk3126-sdk.dts b/arch/arm/boot/dts/rk3126-sdk.dts index 52b69333bfb0..a4875b0732c6 100755 --- a/arch/arm/boot/dts/rk3126-sdk.dts +++ b/arch/arm/boot/dts/rk3126-sdk.dts @@ -83,3 +83,8 @@ hp_ctl_io = <&gpio1 GPIO_A0 0>; }; +&dwc_control_usb { + usb_uart { + status = "disabled"; + }; +}; diff --git a/arch/arm/boot/dts/rk3128-box.dts b/arch/arm/boot/dts/rk3128-box.dts index d4561c247813..225c5f4815c3 100755 --- a/arch/arm/boot/dts/rk3128-box.dts +++ b/arch/arm/boot/dts/rk3128-box.dts @@ -161,3 +161,9 @@ &codec { hp_ctl_io = <&gpio1 GPIO_A3 0>; }; + +&dwc_control_usb { + usb_uart { + status = "disabled"; + }; +}; diff --git a/arch/arm/boot/dts/rk3128-sdk.dts b/arch/arm/boot/dts/rk3128-sdk.dts index dc5dd1f9285b..71f575ddf852 100755 --- a/arch/arm/boot/dts/rk3128-sdk.dts +++ b/arch/arm/boot/dts/rk3128-sdk.dts @@ -62,3 +62,9 @@ gpio-key,wakeup; }; }; + +&dwc_control_usb { + usb_uart { + status = "ok"; + }; +}; diff --git a/drivers/usb/dwc_otg_310/usbdev_rk3036.c b/drivers/usb/dwc_otg_310/usbdev_rk3036.c index b8fe46c40ce6..6f2e197cf8a4 100755 --- a/drivers/usb/dwc_otg_310/usbdev_rk3036.c +++ b/drivers/usb/dwc_otg_310/usbdev_rk3036.c @@ -141,20 +141,42 @@ static int usb20otg_get_status(int id) return ret; } +#ifdef CONFIG_RK_USB_UART +/** + * dwc_otg_uart_enabled - check if a usb-uart bypass func is enabled in DT + * + * Returns true if the status property of node "usb_uart" is set to "okay" + * or "ok", if this property is absent it will use the default status "ok" + * 0 otherwise + */ +static bool dwc_otg_uart_enabled(void) +{ + struct device_node *np; + + np = of_find_node_by_name(NULL, "usb_uart"); + if (np && of_device_is_available(np)) + return true; + + return false; +} + static void dwc_otg_uart_mode(void *pdata, int enter_usb_uart_mode) { -#ifdef CONFIG_RK_USB_UART - if (1 == enter_usb_uart_mode) { + if ((1 == enter_usb_uart_mode) && dwc_otg_uart_enabled()) { /* bypass dm, enter uart mode */ - writel(UOC_HIWORD_UPDATE(0x3, 0x3, 12), - RK_GRF_VIRT + RK3036_GRF_UOC1_CON4); + writel(UOC_HIWORD_UPDATE(0x3, 0x3, 12), RK_GRF_VIRT + + RK3036_GRF_UOC1_CON4); } else if (0 == enter_usb_uart_mode) { /* enter usb mode */ - writel(UOC_HIWORD_UPDATE(0x0, 0x3, 12), - RK_GRF_VIRT + RK3036_GRF_UOC1_CON4); + writel(UOC_HIWORD_UPDATE(0x0, 0x3, 12), RK_GRF_VIRT + + RK3036_GRF_UOC1_CON4); } -#endif } +#else +static void dwc_otg_uart_mode(void *pdata, int enter_usb_uart_mode) +{ +} +#endif static void usb20otg_power_enable(int enable) { diff --git a/drivers/usb/dwc_otg_310/usbdev_rk3126.c b/drivers/usb/dwc_otg_310/usbdev_rk3126.c index 5c6debc79e15..b14679996572 100755 --- a/drivers/usb/dwc_otg_310/usbdev_rk3126.c +++ b/drivers/usb/dwc_otg_310/usbdev_rk3126.c @@ -139,20 +139,43 @@ static int usb20otg_get_status(int id) return ret; } +#ifdef CONFIG_RK_USB_UART +/** + * dwc_otg_uart_enabled - check if a usb-uart bypass func is enabled in DT + * + * Returns true if the status property of node "usb_uart" is set to "okay" + * or "ok", if this property is absent it will use the default status "ok" + * 0 otherwise + */ +static bool dwc_otg_uart_enabled(void) +{ + struct device_node *np; + + np = of_find_node_by_name(NULL, "usb_uart"); + if (np && of_device_is_available(np)) + return true; + + return false; +} + static void dwc_otg_uart_mode(void *pdata, int enter_usb_uart_mode) { -#ifdef CONFIG_RK_USB_UART - if (1 == enter_usb_uart_mode) { + if ((1 == enter_usb_uart_mode) && dwc_otg_uart_enabled()) { /* bypass dm, enter uart mode */ - writel(UOC_HIWORD_UPDATE(0x3, 0x3, 12), - RK_GRF_VIRT + RK312X_GRF_UOC1_CON4); + writel(UOC_HIWORD_UPDATE(0x3, 0x3, 12), RK_GRF_VIRT + + RK312X_GRF_UOC1_CON4); + } else if (0 == enter_usb_uart_mode) { /* enter usb mode */ - writel(UOC_HIWORD_UPDATE(0x0, 0x3, 12), - RK_GRF_VIRT + RK312X_GRF_UOC1_CON4); + writel(UOC_HIWORD_UPDATE(0x0, 0x3, 12), RK_GRF_VIRT + + RK312X_GRF_UOC1_CON4); } -#endif } +#else +static void dwc_otg_uart_mode(void *pdata, int enter_usb_uart_mode) +{ +} +#endif static void usb20otg_power_enable(int enable) { -- 2.34.1