summaryrefslogtreecommitdiff
path: root/driver
diff options
context:
space:
mode:
authorEdward Hill <ecgh@chromium.org>2019-08-14 15:31:11 -0600
committerCommit Bot <commit-bot@chromium.org>2019-10-23 18:12:17 +0000
commitbd751b403f996c603f28f20810a8fa2bf257553e (patch)
tree12fe529f074cc80d114a4dc2b6d89d368eb7851f /driver
parent7b7f7b136e58429a8afd6f41ee11cd105baefeba (diff)
downloadchrome-ec-bd751b403f996c603f28f20810a8fa2bf257553e.tar.gz
usb_mux: Add driver for AMD FP5 USB/DP Mux
BUG=b:138600585 BRANCH=none TEST=build Change-Id: I547309c7000e7d3ca8549a7e626a63789665305d Signed-off-by: Edward Hill <ecgh@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1868921 Reviewed-by: Denis Brockus <dbrockus@chromium.org>
Diffstat (limited to 'driver')
-rw-r--r--driver/build.mk1
-rw-r--r--driver/usb_mux/amd_fp5.c97
-rw-r--r--driver/usb_mux/amd_fp5.h21
3 files changed, 119 insertions, 0 deletions
diff --git a/driver/build.mk b/driver/build.mk
index 4af4264c22..b562d556a9 100644
--- a/driver/build.mk
+++ b/driver/build.mk
@@ -137,6 +137,7 @@ driver-$(CONFIG_USB_PD_RETIMER_INTEL_BB)+=retimer/bb_retimer.o
driver-$(CONFIG_USBC_SS_MUX)+=usb_mux/usb_mux.o
# USB muxes
+driver-$(CONFIG_USB_MUX_AMD_FP5)+=usb_mux/amd_fp5.o
driver-$(CONFIG_USB_MUX_IT5205)+=usb_mux/it5205.o
driver-$(CONFIG_USB_MUX_PI3USB30532)+=usb_mux/pi3usb30532.o
driver-$(CONFIG_USB_MUX_PS8740)+=usb_mux/ps874x.o
diff --git a/driver/usb_mux/amd_fp5.c b/driver/usb_mux/amd_fp5.c
new file mode 100644
index 0000000000..f88df52577
--- /dev/null
+++ b/driver/usb_mux/amd_fp5.c
@@ -0,0 +1,97 @@
+/* Copyright 2019 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.
+ *
+ * AMD FP5 USB/DP Mux.
+ */
+
+#include "amd_fp5.h"
+#include "common.h"
+#include "i2c.h"
+#include "usb_mux.h"
+
+static inline int amd_fp5_mux_read(int port, uint8_t *val)
+{
+ uint8_t buf[3] = { 0 };
+ int rv;
+
+ rv = i2c_xfer(I2C_PORT_USB_MUX, AMD_FP5_MUX_I2C_ADDR_FLAGS,
+ NULL, 0, buf, 3);
+ if (rv)
+ return rv;
+
+ *val = buf[port + 1];
+
+ return EC_SUCCESS;
+}
+
+static inline int amd_fp5_mux_write(int port, uint8_t val)
+{
+ return i2c_write8(I2C_PORT_USB_MUX, AMD_FP5_MUX_I2C_ADDR_FLAGS,
+ port, val);
+}
+
+static int amd_fp5_init(int port)
+{
+ return EC_SUCCESS;
+}
+
+static int amd_fp5_set_mux(int port, mux_state_t mux_state)
+{
+ uint8_t val = 0;
+
+ if ((mux_state & MUX_USB_ENABLED) && (mux_state & MUX_DP_ENABLED))
+ val = (mux_state & MUX_POLARITY_INVERTED)
+ ? AMD_FP5_MUX_DOCK_INVERTED : AMD_FP5_MUX_DOCK;
+ else if (mux_state & MUX_USB_ENABLED)
+ val = (mux_state & MUX_POLARITY_INVERTED)
+ ? AMD_FP5_MUX_USB_INVERTED : AMD_FP5_MUX_USB;
+ else if (mux_state & MUX_DP_ENABLED)
+ val = (mux_state & MUX_POLARITY_INVERTED)
+ ? AMD_FP5_MUX_DP_INVERTED : AMD_FP5_MUX_DP;
+
+ return amd_fp5_mux_write(port, val);
+}
+
+static int amd_fp5_get_mux(int port, mux_state_t *mux_state)
+{
+ uint8_t val = 0;
+ int rv;
+
+ rv = amd_fp5_mux_read(port, &val);
+ if (rv)
+ return rv;
+
+ switch (val) {
+ case AMD_FP5_MUX_USB:
+ *mux_state = MUX_USB_ENABLED;
+ break;
+ case AMD_FP5_MUX_USB_INVERTED:
+ *mux_state = MUX_USB_ENABLED | MUX_POLARITY_INVERTED;
+ break;
+ case AMD_FP5_MUX_DOCK:
+ *mux_state = MUX_USB_ENABLED | MUX_DP_ENABLED;
+ break;
+ case AMD_FP5_MUX_DOCK_INVERTED:
+ *mux_state = MUX_USB_ENABLED | MUX_DP_ENABLED
+ | MUX_POLARITY_INVERTED;
+ break;
+ case AMD_FP5_MUX_DP:
+ *mux_state = MUX_DP_ENABLED;
+ break;
+ case AMD_FP5_MUX_DP_INVERTED:
+ *mux_state = MUX_DP_ENABLED | MUX_POLARITY_INVERTED;
+ break;
+ default:
+ *mux_state = 0;
+ break;
+ }
+
+ return EC_SUCCESS;
+}
+
+const struct usb_mux_driver amd_fp5_usb_mux_driver = {
+ .init = amd_fp5_init,
+ .set = amd_fp5_set_mux,
+ .get = amd_fp5_get_mux,
+};
diff --git a/driver/usb_mux/amd_fp5.h b/driver/usb_mux/amd_fp5.h
new file mode 100644
index 0000000000..7534ea0d8a
--- /dev/null
+++ b/driver/usb_mux/amd_fp5.h
@@ -0,0 +1,21 @@
+/* Copyright 2019 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.
+ *
+ * AMD FP5 USB/DP Mux.
+ */
+
+#ifndef __CROS_EC_USB_MUX_AMD_FP5_H
+#define __CROS_EC_USB_MUX_AMD_FP5_H
+
+#define AMD_FP5_MUX_I2C_ADDR_FLAGS 0x5C
+
+#define AMD_FP5_MUX_SAFE 0x00
+#define AMD_FP5_MUX_USB 0x02
+#define AMD_FP5_MUX_USB_INVERTED 0x11
+#define AMD_FP5_MUX_DOCK 0x06
+#define AMD_FP5_MUX_DOCK_INVERTED 0x19
+#define AMD_FP5_MUX_DP 0x0C
+#define AMD_FP5_MUX_DP_INVERTED 0x1C
+
+#endif /* __CROS_EC_USB_MUX_AMD_FP5_H */