Skip to content

Commit

Permalink
usb: dwc2: gadget: decouple setting soft-disconnect from s3c_hsotg_co…
Browse files Browse the repository at this point in the history
…re_init

This patch changes s3c_hsotg_core_init function to leave hardware in
soft disconnect mode, so the moment of coupling the hardware to the usb
bus can be later controlled by the separate functions for enabling and
disabling soft disconnect mode. This patch is a preparation to rework
pullup() method.

Acked-by: Paul Zimmerman <paulz@synopsys.com>
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
  • Loading branch information
Marek Szyprowski authored and Felipe Balbi committed Nov 3, 2014
1 parent ac3c81f commit ad38dc5
Showing 1 changed file with 17 additions and 5 deletions.
22 changes: 17 additions & 5 deletions drivers/usb/dwc2/gadget.c
Original file line number Diff line number Diff line change
Expand Up @@ -2124,7 +2124,7 @@ static int s3c_hsotg_corereset(struct s3c_hsotg *hsotg)
*
* Issue a soft reset to the core, and await the core finishing it.
*/
static void s3c_hsotg_core_init(struct s3c_hsotg *hsotg)
static void s3c_hsotg_core_init_disconnected(struct s3c_hsotg *hsotg)
{
s3c_hsotg_corereset(hsotg);

Expand Down Expand Up @@ -2241,14 +2241,23 @@ static void s3c_hsotg_core_init(struct s3c_hsotg *hsotg)
readl(hsotg->regs + DOEPCTL0));

/* clear global NAKs */
writel(DCTL_CGOUTNAK | DCTL_CGNPINNAK,
writel(DCTL_CGOUTNAK | DCTL_CGNPINNAK | DCTL_SFTDISCON,
hsotg->regs + DCTL);

/* must be at-least 3ms to allow bus to see disconnect */
mdelay(3);

hsotg->last_rst = jiffies;
}

static void s3c_hsotg_core_disconnect(struct s3c_hsotg *hsotg)
{
/* set the soft-disconnect bit */
__orr32(hsotg->regs + DCTL, DCTL_SFTDISCON);
}

static void s3c_hsotg_core_connect(struct s3c_hsotg *hsotg)
{
/* remove the soft-disconnect and let's go */
__bic32(hsotg->regs + DCTL, DCTL_SFTDISCON);
}
Expand Down Expand Up @@ -2342,7 +2351,8 @@ static irqreturn_t s3c_hsotg_irq(int irq, void *pw)
kill_all_requests(hsotg, &hsotg->eps[0],
-ECONNRESET, true);

s3c_hsotg_core_init(hsotg);
s3c_hsotg_core_init_disconnected(hsotg);
s3c_hsotg_core_connect(hsotg);
}
}
}
Expand Down Expand Up @@ -2977,7 +2987,8 @@ static int s3c_hsotg_pullup(struct usb_gadget *gadget, int is_on)
if (is_on) {
s3c_hsotg_phy_enable(hsotg);
clk_enable(hsotg->clk);
s3c_hsotg_core_init(hsotg);
s3c_hsotg_core_init_disconnected(hsotg);
s3c_hsotg_core_connect(hsotg);
} else {
clk_disable(hsotg->clk);
s3c_hsotg_phy_disable(hsotg);
Expand Down Expand Up @@ -3657,7 +3668,8 @@ static int s3c_hsotg_resume(struct platform_device *pdev)

spin_lock_irqsave(&hsotg->lock, flags);
s3c_hsotg_phy_enable(hsotg);
s3c_hsotg_core_init(hsotg);
s3c_hsotg_core_init_disconnected(hsotg);
s3c_hsotg_core_connect(hsotg);
spin_unlock_irqrestore(&hsotg->lock, flags);

return ret;
Expand Down

0 comments on commit ad38dc5

Please sign in to comment.