diff options
author | Bill Richardson <wfrichar@chromium.org> | 2016-06-03 16:36:07 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2016-06-08 14:02:22 -0700 |
commit | bb6918cbdfd521dc30316deaa03788db569fadc5 (patch) | |
tree | 87b1bac41177735d0dc1f359f93ff0e133f81042 /chip/g/usb.c | |
parent | 8b961f9c75549cf7f4178e849cee681ffbab8dbf (diff) | |
download | chrome-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.c | 13 |
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; |