From bb6918cbdfd521dc30316deaa03788db569fadc5 Mon Sep 17 00:00:00 2001 From: Bill Richardson Date: Fri, 3 Jun 2016 16:36:07 -0700 Subject: g: Enable SOF calibration after first SOF token Instead of enabling the SOF calibration at usb_init(), enable it only when the first SOF packet is seen following the usb_init(), as suggested in the recommendations document linked from the bug report. Also fix the code to do the right thing. The original reference code had errors. BUG=chrome-os-partner:50800 BRANCH=none TEST=make buildall; test on Cr50 After adding some instrumentation code, I see the SOF being detected and the calibration started. It only happens once after each usb_init() and only when the USB traffic begins. Change-Id: Id2b9a41d90ce9cc9e467fb759463d69a57bb5540 Signed-off-by: Bill Richardson Reviewed-on: https://chromium-review.googlesource.com/350371 Reviewed-by: Mary Ruthven --- chip/g/usb.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) (limited to 'chip/g/usb.c') diff --git a/chip/g/usb.c b/chip/g/usb.c index d47912dd02..0acacb8fa2 100644 --- a/chip/g/usb.c +++ b/chip/g/usb.c @@ -1074,9 +1074,6 @@ static void usb_reset(void) /* Reinitialize all the endpoints */ usb_init_endpoints(); - - /* Init the clock calibrator */ - init_sof_clock(); } static void usb_resetdet(void) @@ -1123,6 +1120,12 @@ void usb_interrupt(void) if (status & GINTSTS(USBRST)) usb_reset(); + /* Initialize the SOF clock calibrator only on the first SOF */ + if (GR_USB_GINTMSK & GINTMSK(SOF) && status & GINTSTS(SOF)) { + init_sof_clock(); + GR_USB_GINTMSK &= ~GINTMSK(SOF); + } + /* Endpoint interrupts */ if (oepint || iepint) { /* Note: It seems that the DAINT bits are only trustworthy for @@ -1327,7 +1330,9 @@ void usb_init(void) /* Reset detected while suspended. Need to wake up. */ GINTMSK(RESETDET) | /* TODO: Do we need this? */ /* Idle, Suspend detected. Should go to sleep. */ - GINTMSK(ERLYSUSP) | GINTMSK(USBSUSP); + GINTMSK(ERLYSUSP) | GINTMSK(USBSUSP) | + /* Watch for first SOF */ + GINTMSK(SOF); /* Device registers have been setup */ GR_USB_DCTL |= DCTL_PWRONPRGDONE; -- cgit v1.2.1