* [PATCH RESEND] usb: dwc2: rework initialization of host and gadget in dual-role mode
@ 2015-03-10 12:41 Marek Szyprowski
2015-03-11 22:51 ` John Youn
0 siblings, 1 reply; 2+ messages in thread
From: Marek Szyprowski @ 2015-03-10 12:41 UTC (permalink / raw)
To: linux-usb-u79uwXL29TY76Z2rM5mHXA,
linux-samsung-soc-u79uwXL29TY76Z2rM5mHXA
Cc: Marek Szyprowski, Robert Baldyga, Paul Zimmerman, Felipe Balbi,
John Youn
If device is configured to work only in HOST or DEVICE mode, there is
no point in initializing both subdrivers. This patch also fixes
resource leakage if host subdriver fails to initialize.
Signed-off-by: Marek Szyprowski <m.szyprowski-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
---
drivers/usb/dwc2/core.h | 2 ++
drivers/usb/dwc2/platform.c | 29 +++++++++++++++++++++--------
2 files changed, 23 insertions(+), 8 deletions(-)
diff --git a/drivers/usb/dwc2/core.h b/drivers/usb/dwc2/core.h
index 7a70a1349334..f93b06daef97 100644
--- a/drivers/usb/dwc2/core.h
+++ b/drivers/usb/dwc2/core.h
@@ -570,6 +570,8 @@ struct dwc2_hsotg {
struct dwc2_core_params *core_params;
enum usb_otg_state op_state;
enum usb_dr_mode dr_mode;
+ unsigned int hcd_enabled:1;
+ unsigned int gadget_enabled:1;
struct phy *phy;
struct usb_phy *uphy;
diff --git a/drivers/usb/dwc2/platform.c b/drivers/usb/dwc2/platform.c
index 6a795aa2ff05..ee0b0b06d0fc 100644
--- a/drivers/usb/dwc2/platform.c
+++ b/drivers/usb/dwc2/platform.c
@@ -121,8 +121,10 @@ static int dwc2_driver_remove(struct platform_device *dev)
{
struct dwc2_hsotg *hsotg = platform_get_drvdata(dev);
- dwc2_hcd_remove(hsotg);
- s3c_hsotg_remove(hsotg);
+ if (hsotg->hcd_enabled)
+ dwc2_hcd_remove(hsotg);
+ if (hsotg->gadget_enabled)
+ s3c_hsotg_remove(hsotg);
return 0;
}
@@ -214,12 +216,23 @@ static int dwc2_driver_probe(struct platform_device *dev)
spin_lock_init(&hsotg->lock);
mutex_init(&hsotg->init_mutex);
- retval = dwc2_gadget_init(hsotg, irq);
- if (retval)
- return retval;
- retval = dwc2_hcd_init(hsotg, irq, params);
- if (retval)
- return retval;
+
+ if (hsotg->dr_mode != USB_DR_MODE_HOST) {
+ retval = dwc2_gadget_init(hsotg, irq);
+ if (retval)
+ return retval;
+ hsotg->gadget_enabled = 1;
+ }
+
+ if (hsotg->dr_mode != USB_DR_MODE_PERIPHERAL) {
+ retval = dwc2_hcd_init(hsotg, irq, params);
+ if (retval) {
+ if (hsotg->gadget_enabled)
+ s3c_hsotg_remove(hsotg);
+ return retval;
+ }
+ hsotg->hcd_enabled = 1;
+ }
platform_set_drvdata(dev, hsotg);
--
1.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH RESEND] usb: dwc2: rework initialization of host and gadget in dual-role mode
2015-03-10 12:41 [PATCH RESEND] usb: dwc2: rework initialization of host and gadget in dual-role mode Marek Szyprowski
@ 2015-03-11 22:51 ` John Youn
0 siblings, 0 replies; 2+ messages in thread
From: John Youn @ 2015-03-11 22:51 UTC (permalink / raw)
To: Marek Szyprowski, linux-usb@vger.kernel.org,
linux-samsung-soc@vger.kernel.org
Cc: Robert Baldyga, Paul Zimmerman, Felipe Balbi, John Youn
On 3/10/2015 5:41 AM, Marek Szyprowski wrote:
> If device is configured to work only in HOST or DEVICE mode, there is
> no point in initializing both subdrivers. This patch also fixes
> resource leakage if host subdriver fails to initialize.
>
> Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
> ---
> drivers/usb/dwc2/core.h | 2 ++
> drivers/usb/dwc2/platform.c | 29 +++++++++++++++++++++--------
> 2 files changed, 23 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/usb/dwc2/core.h b/drivers/usb/dwc2/core.h
> index 7a70a1349334..f93b06daef97 100644
> --- a/drivers/usb/dwc2/core.h
> +++ b/drivers/usb/dwc2/core.h
> @@ -570,6 +570,8 @@ struct dwc2_hsotg {
> struct dwc2_core_params *core_params;
> enum usb_otg_state op_state;
> enum usb_dr_mode dr_mode;
> + unsigned int hcd_enabled:1;
> + unsigned int gadget_enabled:1;
>
> struct phy *phy;
> struct usb_phy *uphy;
> diff --git a/drivers/usb/dwc2/platform.c b/drivers/usb/dwc2/platform.c
> index 6a795aa2ff05..ee0b0b06d0fc 100644
> --- a/drivers/usb/dwc2/platform.c
> +++ b/drivers/usb/dwc2/platform.c
> @@ -121,8 +121,10 @@ static int dwc2_driver_remove(struct platform_device *dev)
> {
> struct dwc2_hsotg *hsotg = platform_get_drvdata(dev);
>
> - dwc2_hcd_remove(hsotg);
> - s3c_hsotg_remove(hsotg);
> + if (hsotg->hcd_enabled)
> + dwc2_hcd_remove(hsotg);
> + if (hsotg->gadget_enabled)
> + s3c_hsotg_remove(hsotg);
>
> return 0;
> }
> @@ -214,12 +216,23 @@ static int dwc2_driver_probe(struct platform_device *dev)
>
> spin_lock_init(&hsotg->lock);
> mutex_init(&hsotg->init_mutex);
> - retval = dwc2_gadget_init(hsotg, irq);
> - if (retval)
> - return retval;
> - retval = dwc2_hcd_init(hsotg, irq, params);
> - if (retval)
> - return retval;
> +
> + if (hsotg->dr_mode != USB_DR_MODE_HOST) {
> + retval = dwc2_gadget_init(hsotg, irq);
> + if (retval)
> + return retval;
> + hsotg->gadget_enabled = 1;
> + }
> +
> + if (hsotg->dr_mode != USB_DR_MODE_PERIPHERAL) {
> + retval = dwc2_hcd_init(hsotg, irq, params);
> + if (retval) {
> + if (hsotg->gadget_enabled)
> + s3c_hsotg_remove(hsotg);
> + return retval;
> + }
> + hsotg->hcd_enabled = 1;
> + }
>
> platform_set_drvdata(dev, hsotg);
>
>
Acked-by: John Youn <johnyoun@synopsys.com>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2015-03-11 22:53 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-03-10 12:41 [PATCH RESEND] usb: dwc2: rework initialization of host and gadget in dual-role mode Marek Szyprowski
2015-03-11 22:51 ` John Youn
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.