diff options
Diffstat (limited to 'driver')
-rw-r--r-- | driver/usb_mux.c | 7 | ||||
-rw-r--r-- | driver/usb_mux_virtual.c | 10 |
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, |