From c219d84cdb41e720b0f144b5b393102344de195a Mon Sep 17 00:00:00 2001 From: Kisang Lee Date: Thu, 18 Apr 2019 17:01:13 +0900 Subject: [PATCH] [RAMEN9610-14520] [COMMON] usb: ignore USB disconnect message at reset Change-Id: I5ecee0ab18945062ac2518e23c48f2146ddf9627 Signed-off-by: Kisang Lee --- drivers/usb/dwc3/ep0.c | 3 ++- drivers/usb/dwc3/gadget.c | 40 +++++++++++++++++++++++++++++++++++ drivers/usb/gadget/Kconfig | 7 ++++++ include/linux/usb/composite.h | 8 +++++++ 4 files changed, 57 insertions(+), 1 deletion(-) diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c index 4652820a0b57..ed95980f40f6 100644 --- a/drivers/usb/dwc3/ep0.c +++ b/drivers/usb/dwc3/ep0.c @@ -247,7 +247,8 @@ static void dwc3_ep0_stall_and_restart(struct dwc3 *dwc) /* stall is always issued on EP0 */ dep = dwc->eps[0]; - __dwc3_gadget_ep_set_halt(dep, 1, false); + /* mtp reset signal issue */ + __dwc3_gadget_ep_set_halt(dep, 1, true); dep->flags = DWC3_EP_ENABLED; dwc->delayed_status = false; diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index e70ecb6651c5..ac810f867e02 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -31,6 +31,9 @@ #include #include #include +#ifdef CONFIG_USB_ANDROID_SAMSUNG_COMPOSITE +#include +#endif #include "debug.h" #include "core.h" @@ -38,6 +41,27 @@ #include "gadget.h" #include "io.h" +#ifdef CONFIG_USB_ANDROID_SAMSUNG_COMPOSITE +static void dwc3_disconnect_gadget(struct dwc3 *dwc); +static void dwc3_gadget_cable_connect(struct dwc3 *dwc, bool connect) +{ + static bool last_connect; + struct usb_composite_dev *cdev; + + if (last_connect != connect) { + if (!connect) { + cdev = get_gadget_data(&dwc->gadget); + if (cdev != NULL) { + cdev->mute_switch = 0; + cdev->force_disconnect = 1; + dev_info(dwc->dev, "Force Disconnect set to 1\n"); + } + } + last_connect = connect; + } +} +#endif + /** * dwc3_gadget_set_test_mode - enables usb2 test modes * @dwc: pointer to our context structure @@ -2090,7 +2114,17 @@ static int dwc3_gadget_vbus_session(struct usb_gadget *g, int is_active) */ ret = dwc3_gadget_run_stop_vbus(dwc, 1, false); } else { +#ifdef CONFIG_USB_ANDROID_SAMSUNG_COMPOSITE + dwc3_gadget_cable_connect(dwc, false); + dwc->start_config_issued = false; + dwc->gadget.speed = USB_SPEED_UNKNOWN; + dwc->setup_packet_pending = false; +#endif ret = dwc3_gadget_run_stop_vbus(dwc, 0, false); +#ifdef CONFIG_USB_ANDROID_SAMSUNG_COMPOSITE + dwc3_disconnect_gadget(dwc); + printk("usb: %s : link state = %d\n", __func__, dwc3_gadget_get_link_state(dwc)); +#endif } } @@ -3421,12 +3455,18 @@ static void dwc3_gadget_interrupt(struct dwc3 *dwc, { switch (event->type) { case DWC3_DEVICE_EVENT_DISCONNECT: +#ifdef CONFIG_USB_ANDROID_SAMSUNG_COMPOSITE + dwc3_gadget_cable_connect(dwc, false); +#endif dwc3_gadget_disconnect_interrupt(dwc); break; case DWC3_DEVICE_EVENT_RESET: dwc3_gadget_reset_interrupt(dwc); break; case DWC3_DEVICE_EVENT_CONNECT_DONE: +#ifdef CONFIG_USB_ANDROID_SAMSUNG_COMPOSITE + dwc3_gadget_cable_connect(dwc, true); +#endif dwc3_gadget_conndone_interrupt(dwc); break; case DWC3_DEVICE_EVENT_WAKEUP: diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig index 23eb9f6daade..6a8c187a562e 100644 --- a/drivers/usb/gadget/Kconfig +++ b/drivers/usb/gadget/Kconfig @@ -134,6 +134,13 @@ config U_SERIAL_CONSOLE help It supports the serial gadget can be used as a console. +config USB_ANDROID_SAMSUNG_COMPOSITE + bool "Samsung Composite function" + help + Provides SAMSUNG composite driver. + Multi Configuration. + If you enable this option, android composite will be changed. + source "drivers/usb/gadget/udc/Kconfig" # diff --git a/include/linux/usb/composite.h b/include/linux/usb/composite.h index 84da4e5e3ad2..327d0fc2baeb 100644 --- a/include/linux/usb/composite.h +++ b/include/linux/usb/composite.h @@ -519,6 +519,14 @@ struct usb_composite_dev { /* public: */ unsigned int setup_pending:1; unsigned int os_desc_pending:1; + +#ifdef CONFIG_USB_ANDROID_SAMSUNG_COMPOSITE + /* used by enable_store function of android.c + * to avoid signalling switch changes + */ + bool mute_switch; + bool force_disconnect; +#endif }; extern int usb_string_id(struct usb_composite_dev *c); -- 2.20.1