diff options
author | Shawn Nematbakhsh <shawnn@chromium.org> | 2016-08-06 18:02:17 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2016-08-10 20:07:32 -0700 |
commit | d54387c18e20f5973ae62fdc7f8a95872b52f4f5 (patch) | |
tree | c9e552984b2e25a68d3f7bf7ee840582c3f2011a /driver | |
parent | 8230e5b356a60831ecc47cd25696d0a1b880c552 (diff) | |
download | chrome-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.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, |