summaryrefslogtreecommitdiff
path: root/driver
diff options
context:
space:
mode:
authorShawn Nematbakhsh <shawnn@chromium.org>2016-08-06 18:02:17 -0700
committerchrome-bot <chrome-bot@chromium.org>2016-08-10 20:07:32 -0700
commitd54387c18e20f5973ae62fdc7f8a95872b52f4f5 (patch)
treec9e552984b2e25a68d3f7bf7ee840582c3f2011a /driver
parent8230e5b356a60831ecc47cd25696d0a1b880c552 (diff)
downloadchrome-ec-d54387c18e20f5973ae62fdc7f8a95872b52f4f5.tar.gz
kevin / gru: Notify host of HPD IRQ status
If an HPD IRQ event is seen, make note of it and keep the status set until informing the host. BUG=chrome-os-partner:55925 BRANCH=None TEST=Manual on kevin, trigger HPD event, verify that event bit is set in reply to first host command and not subsequent host commands. Change-Id: I0900a683dcb344d5d4d03a1fa6e3d8de913597b2 Signed-off-by: Shawn Nematbakhsh <shawnn@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/366990 Commit-Ready: Shawn N <shawnn@chromium.org> Tested-by: Chris Zhong <zyw@rock-chips.com> Tested-by: Shawn N <shawnn@chromium.org> Reviewed-by: Guenter Roeck <groeck@chromium.org>
Diffstat (limited to 'driver')
-rw-r--r--driver/usb_mux.c7
-rw-r--r--driver/usb_mux_virtual.c10
2 files changed, 17 insertions, 0 deletions
diff --git a/driver/usb_mux.c b/driver/usb_mux.c
index db2a03bdd2..05222e1d84 100644
--- a/driver/usb_mux.c
+++ b/driver/usb_mux.c
@@ -170,6 +170,13 @@ static int hc_usb_pd_mux_info(struct host_cmd_handler_args *args)
if (mux->driver->get(mux->port_addr, &r->flags) != EC_SUCCESS)
return EC_RES_ERROR;
+#ifdef CONFIG_USB_MUX_VIRTUAL
+ /* Clear HPD IRQ event since we're about to inform host of it. */
+ if ((r->flags & USB_PD_MUX_HPD_IRQ) &&
+ mux->driver == &virtual_usb_mux_driver)
+ mux->hpd_update(port, 0, 0);
+#endif
+
args->response_size = sizeof(*r);
return EC_RES_SUCCESS;
}
diff --git a/driver/usb_mux_virtual.c b/driver/usb_mux_virtual.c
index 564bff952b..433c5bcdbe 100644
--- a/driver/usb_mux_virtual.c
+++ b/driver/usb_mux_virtual.c
@@ -12,6 +12,7 @@
#include "util.h"
static mux_state_t virtual_mux_state[CONFIG_USB_PD_PORT_COUNT];
+static int hpd_irq_state[CONFIG_USB_PD_PORT_COUNT];
static int virtual_init(int port)
{
@@ -39,9 +40,18 @@ static int virtual_set_mux(int port, mux_state_t mux_state)
static int virtual_get_mux(int port, mux_state_t *mux_state)
{
*mux_state = virtual_mux_state[port];
+ *mux_state |= hpd_irq_state[port] ? USB_PD_MUX_HPD_IRQ : 0;
+
return EC_SUCCESS;
}
+void virtual_hpd_update(int port, int hpd_lvl, int hpd_irq)
+{
+ hpd_irq_state[port] = hpd_irq;
+ if (hpd_irq)
+ host_set_single_event(EC_HOST_EVENT_USB_MUX);
+}
+
const struct usb_mux_driver virtual_usb_mux_driver = {
.init = virtual_init,
.set = virtual_set_mux,