summaryrefslogtreecommitdiff
path: root/chip/g/usb.c
diff options
context:
space:
mode:
authorBill Richardson <wfrichar@chromium.org>2016-06-03 16:36:07 -0700
committerchrome-bot <chrome-bot@chromium.org>2016-06-08 14:02:22 -0700
commitbb6918cbdfd521dc30316deaa03788db569fadc5 (patch)
tree87b1bac41177735d0dc1f359f93ff0e133f81042 /chip/g/usb.c
parent8b961f9c75549cf7f4178e849cee681ffbab8dbf (diff)
downloadchrome-ec-bb6918cbdfd521dc30316deaa03788db569fadc5.tar.gz
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 <wfrichar@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/350371 Reviewed-by: Mary Ruthven <mruthven@chromium.org>
Diffstat (limited to 'chip/g/usb.c')
-rw-r--r--chip/g/usb.c13
1 files changed, 9 insertions, 4 deletions
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;