summaryrefslogtreecommitdiff
path: root/driver
diff options
context:
space:
mode:
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,