Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 643cc4de authored by Gregory Herrero's avatar Gregory Herrero Committed by Felipe Balbi
Browse files

usb: dwc2: gadget: add reset flag in init function



Add a flag to request physical reset of the controller when
s3c_hsotg_core_init_disconnected is called.
During the usb reset, controller must not be fully reconfigured and
resetted. Else this leads to shorter chirp-k duration during
enumeration.

Tested-by: default avatarRobert Baldyga <r.baldyga@samsung.com>
Acked-by: default avatarJohn Youn <johnyoun@synopsys.com>
Signed-off-by: default avatarGregory Herrero <gregory.herrero@intel.com>
Signed-off-by: default avatarMian Yousaf Kaukab <yousaf.kaukab@intel.com>
Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
parent 7d24c1b5
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -999,7 +999,8 @@ extern int s3c_hsotg_remove(struct dwc2_hsotg *hsotg);
extern int s3c_hsotg_suspend(struct dwc2_hsotg *dwc2);
extern int s3c_hsotg_resume(struct dwc2_hsotg *dwc2);
extern int dwc2_gadget_init(struct dwc2_hsotg *hsotg, int irq);
extern void s3c_hsotg_core_init_disconnected(struct dwc2_hsotg *dwc2);
extern void s3c_hsotg_core_init_disconnected(struct dwc2_hsotg *dwc2,
		bool reset);
extern void s3c_hsotg_core_connect(struct dwc2_hsotg *hsotg);
extern void s3c_hsotg_disconnect(struct dwc2_hsotg *dwc2);
#else
@@ -1011,7 +1012,8 @@ static inline int s3c_hsotg_resume(struct dwc2_hsotg *dwc2)
{ return 0; }
static inline int dwc2_gadget_init(struct dwc2_hsotg *hsotg, int irq)
{ return 0; }
static inline void s3c_hsotg_core_init_disconnected(struct dwc2_hsotg *dwc2) {}
static inline void s3c_hsotg_core_init_disconnected(struct dwc2_hsotg *dwc2,
		bool reset) {}
static inline void s3c_hsotg_core_connect(struct dwc2_hsotg *hsotg) {}
static inline void s3c_hsotg_disconnect(struct dwc2_hsotg *dwc2) {}
#endif
+21 −12
Original line number Diff line number Diff line
@@ -2271,8 +2271,12 @@ static int s3c_hsotg_corereset(struct dwc2_hsotg *hsotg)
 *
 * Issue a soft reset to the core, and await the core finishing it.
 */
void s3c_hsotg_core_init_disconnected(struct dwc2_hsotg *hsotg)
void s3c_hsotg_core_init_disconnected(struct dwc2_hsotg *hsotg,
						bool is_usb_reset)
{
	u32 val;

	if (!is_usb_reset)
		s3c_hsotg_corereset(hsotg);

	/*
@@ -2286,6 +2290,7 @@ void s3c_hsotg_core_init_disconnected(struct dwc2_hsotg *hsotg)

	s3c_hsotg_init_fifo(hsotg);

	if (!is_usb_reset)
		__orr32(hsotg->regs + DCTL, DCTL_SFTDISCON);

	writel(1 << 18 | DCFG_DEVSPD_HS,  hsotg->regs + DCFG);
@@ -2357,9 +2362,11 @@ void s3c_hsotg_core_init_disconnected(struct dwc2_hsotg *hsotg)
	s3c_hsotg_ctrl_epint(hsotg, 0, 0, 1);
	s3c_hsotg_ctrl_epint(hsotg, 0, 1, 1);

	if (!is_usb_reset) {
		__orr32(hsotg->regs + DCTL, DCTL_PWRONPRGDONE);
		udelay(10);  /* see openiboot */
		__bic32(hsotg->regs + DCTL, DCTL_PWRONPRGDONE);
	}

	dev_dbg(hsotg->dev, "DCTL=0x%08x\n", readl(hsotg->regs + DCTL));

@@ -2388,8 +2395,10 @@ void s3c_hsotg_core_init_disconnected(struct dwc2_hsotg *hsotg)
		readl(hsotg->regs + DOEPCTL0));

	/* clear global NAKs */
	writel(DCTL_CGOUTNAK | DCTL_CGNPINNAK | DCTL_SFTDISCON,
	       hsotg->regs + DCTL);
	val = DCTL_CGOUTNAK | DCTL_CGNPINNAK;
	if (!is_usb_reset)
		val |= DCTL_SFTDISCON;
	__orr32(hsotg->regs + DCTL, val);

	/* must be at-least 3ms to allow bus to see disconnect */
	mdelay(3);
@@ -2482,7 +2491,7 @@ static irqreturn_t s3c_hsotg_irq(int irq, void *pw)
				kill_all_requests(hsotg, hsotg->eps_out[0],
							  -ECONNRESET);

				s3c_hsotg_core_init_disconnected(hsotg);
				s3c_hsotg_core_init_disconnected(hsotg, true);
				s3c_hsotg_core_connect(hsotg);
			}
		}
@@ -3052,7 +3061,7 @@ static int s3c_hsotg_udc_start(struct usb_gadget *gadget,

	spin_lock_irqsave(&hsotg->lock, flags);
	s3c_hsotg_init(hsotg);
	s3c_hsotg_core_init_disconnected(hsotg);
	s3c_hsotg_core_init_disconnected(hsotg, false);
	hsotg->enabled = 0;
	spin_unlock_irqrestore(&hsotg->lock, flags);

@@ -3171,7 +3180,7 @@ static int s3c_hsotg_vbus_session(struct usb_gadget *gadget, int is_active)
	if (is_active) {
		/* Kill any ep0 requests as controller will be reinitialized */
		kill_all_requests(hsotg, hsotg->eps_out[0], -ECONNRESET);
		s3c_hsotg_core_init_disconnected(hsotg);
		s3c_hsotg_core_init_disconnected(hsotg, false);
		if (hsotg->enabled)
			s3c_hsotg_core_connect(hsotg);
	} else {
@@ -4097,7 +4106,7 @@ int s3c_hsotg_resume(struct dwc2_hsotg *hsotg)
		s3c_hsotg_phy_enable(hsotg);

		spin_lock_irqsave(&hsotg->lock, flags);
		s3c_hsotg_core_init_disconnected(hsotg);
		s3c_hsotg_core_init_disconnected(hsotg, false);
		if (hsotg->enabled)
			s3c_hsotg_core_connect(hsotg);
		spin_unlock_irqrestore(&hsotg->lock, flags);
+1 −1
Original line number Diff line number Diff line
@@ -1373,7 +1373,7 @@ static void dwc2_conn_id_status_change(struct work_struct *work)
		hsotg->op_state = OTG_STATE_B_PERIPHERAL;
		dwc2_core_init(hsotg, false, -1);
		dwc2_enable_global_interrupts(hsotg);
		s3c_hsotg_core_init_disconnected(hsotg);
		s3c_hsotg_core_init_disconnected(hsotg, false);
		s3c_hsotg_core_connect(hsotg);
	} else {
		/* A-Device connector (Host Mode) */