diff options
author | Mary Ruthven <mruthven@chromium.org> | 2017-01-09 15:22:37 -0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2017-01-13 21:48:55 -0800 |
commit | a9c79eede9fdff172ddc0b1048f0c544f85bf27e (patch) | |
tree | 9f24428db20b2781c39ff01b794dc6a4126e372f | |
parent | f4c99dfd27c6d95a516f748b15318b0a95c5d543 (diff) | |
download | chrome-ec-a9c79eede9fdff172ddc0b1048f0c544f85bf27e.tar.gz |
g: debounce rdd disconnect
When the EC does a sysjump it redoes the PD negotiation. This changes
the voltage levels on the CC lines. Debounce the rdd disconnect signal
for 2 seconds so cr50 will ignore the negotiation and keep CCD enabled.
BUG=chrome-os-partner:60924
BRANCH=none
TEST=connect suzyq. Make sure usb does not drop out during a EC sysjump
or reboot.
Change-Id: I95b9bc81f736e3b7a65103817c140874b1ed34ec
Signed-off-by: Mary Ruthven <mruthven@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/426398
Reviewed-by: Vadim Bendebury <vbendeb@chromium.org>
-rw-r--r-- | chip/g/rdd.c | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/chip/g/rdd.c b/chip/g/rdd.c index d02ec362f7..bd0d2360d8 100644 --- a/chip/g/rdd.c +++ b/chip/g/rdd.c @@ -31,30 +31,38 @@ int debug_cable_is_attached(void) return (cc1 == cc2 && (cc1 == 3 || cc1 == 1)); } -void rdd_interrupt(void) +static void rdd_disconnected(void) { - int is_debug; + CPRINTS("Debug Accessory disconnected"); + + rdd_detached(); +} +DECLARE_DEFERRED(rdd_disconnected); +void rdd_interrupt(void) +{ delay_sleep_by(1 * SECOND); - is_debug = debug_cable_is_attached(); + if (debug_cable_is_attached()) { + /* cancel pending rdd disconnect */ + hook_call_deferred(&rdd_disconnected_data, -1); - if (is_debug) { CPRINTS("Debug Accessory connected"); /* Detect when debug cable is disconnected */ GWRITE(RDD, PROG_DEBUG_STATE_MAP, DETECT_DISCONNECT); rdd_attached(); - } else if (!is_debug) { - CPRINTS("Debug Accessory disconnected"); - + } else { /* Detect when debug cable is connected */ GWRITE(RDD, PROG_DEBUG_STATE_MAP, DETECT_DEBUG); - rdd_detached(); - - cflush(); + /* + * Debounce the RDD disconnect for 2 seconds so rdd events + * won't be triggered by any PD negotiation the EC does during + * reset or sysjump. + */ + hook_call_deferred(&rdd_disconnected_data, 2 * SECOND); } /* Clear interrupt */ |