summaryrefslogtreecommitdiff
path: root/driver/usb_mux_virtual.c
diff options
context:
space:
mode:
Diffstat (limited to 'driver/usb_mux_virtual.c')
-rw-r--r--driver/usb_mux_virtual.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/driver/usb_mux_virtual.c b/driver/usb_mux_virtual.c
new file mode 100644
index 0000000000..564bff952b
--- /dev/null
+++ b/driver/usb_mux_virtual.c
@@ -0,0 +1,49 @@
+/* Copyright 2016 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ *
+ * Virtual USB mux driver for host-controlled USB muxes.
+ */
+
+#include "common.h"
+#include "console.h"
+#include "host_command.h"
+#include "usb_mux.h"
+#include "util.h"
+
+static mux_state_t virtual_mux_state[CONFIG_USB_PD_PORT_COUNT];
+
+static int virtual_init(int port)
+{
+ return EC_SUCCESS;
+}
+
+/*
+ * Set the state of our 'virtual' mux. The EC does not actually control this
+ * mux, so update the desired state, then notify the host of the update.
+ */
+static int virtual_set_mux(int port, mux_state_t mux_state)
+{
+ if (virtual_mux_state[port] != mux_state) {
+ virtual_mux_state[port] = mux_state;
+ host_set_single_event(EC_HOST_EVENT_USB_MUX);
+ }
+ return EC_SUCCESS;
+}
+
+/*
+ * Get the state of our 'virtual' mux. Since we the EC does not actually
+ * control this mux, and the EC has no way of knowing its actual status,
+ * we return the desired state here.
+ */
+static int virtual_get_mux(int port, mux_state_t *mux_state)
+{
+ *mux_state = virtual_mux_state[port];
+ return EC_SUCCESS;
+}
+
+const struct usb_mux_driver virtual_usb_mux_driver = {
+ .init = virtual_init,
+ .set = virtual_set_mux,
+ .get = virtual_get_mux,
+};