From a9099ee3fcd922e3e8ee5f1e417403c9bfee970d Mon Sep 17 00:00:00 2001 From: Vic Yang Date: Wed, 24 Dec 2014 23:05:47 -0800 Subject: [PATCH] plankton: treat USB mode as DP detached When a DP cable is attached, if we toggle the USB/DP mux to USB mode, the DP data link is broken. In this case, we should send a HPD event to notify the host. Similarily, when we switch back to DP mode when a cable is attached, we should send a HPD attachment event and then a HPD IRQ to notify the host that the DP link is ready. BRANCH=None BUG=chrome-os-partner:34296 TEST=Connect Plankton to Samus. Perform the following tests: 1. Attach a cable, and switch between USB and DP mode. 2. Attach a cable in DP mode, switch to USB mode, unplug the cable, and then switch back to DP mode. 3. Similar to 2 but start without the cable. Change-Id: I5db0c036ce45850b2f4ca142957f4a235673df6f Signed-off-by: Vic Yang Reviewed-on: https://chromium-review.googlesource.com/237604 Reviewed-by: Alec Berg Commit-Queue: Todd Broch Tested-by: Todd Broch --- board/plankton/board.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/board/plankton/board.c b/board/plankton/board.c index bd6fe3637a..e5afef21ad 100644 --- a/board/plankton/board.c +++ b/board/plankton/board.c @@ -57,11 +57,13 @@ static int sn75dp130_dpcd_init(void); void hpd_lvl_deferred(void) { int level = gpio_get_level(GPIO_DPSRC_HPD); + int dp_mode = !gpio_get_level(GPIO_USBC_SS_USB_MODE); if (level != hpd_prev_level) { /* Stable level changed. Send HPD event */ hpd_prev_level = level; - pd_send_hpd(0, level ? hpd_high : hpd_low); + if (dp_mode) + pd_send_hpd(0, level ? hpd_high : hpd_low); /* Configure redriver's back side */ if (level) sn75dp130_dpcd_init(); @@ -69,7 +71,7 @@ void hpd_lvl_deferred(void) } /* Send queued IRQ if the cable is attached */ - if (hpd_possible_irq && level) + if (hpd_possible_irq && level && dp_mode) pd_send_hpd(0, hpd_irq); hpd_possible_irq = 0; @@ -147,6 +149,18 @@ static void set_usbc_action(enum usbc_action act) was_usb_mode = gpio_get_level(GPIO_USBC_SS_USB_MODE); gpio_set_level(GPIO_USBC_SS_USB_MODE, !was_usb_mode); gpio_set_level(GPIO_CASE_CLOSE_EN, !was_usb_mode); + if (!gpio_get_level(GPIO_DPSRC_HPD)) + break; + /* + * DP cable is connected. Send HPD event according to USB/DP + * mux state. + */ + if (!was_usb_mode) { + pd_send_hpd(0, hpd_low); + } else { + pd_send_hpd(0, hpd_high); + pd_send_hpd(0, hpd_irq); + } break; case USBC_ACT_USB_EN: gpio_set_level(GPIO_USBC_SS_USB_MODE, 1);