diff options
author | Edward Hill <ecgh@chromium.org> | 2019-08-14 15:31:11 -0600 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2019-10-23 18:12:17 +0000 |
commit | bd751b403f996c603f28f20810a8fa2bf257553e (patch) | |
tree | 12fe529f074cc80d114a4dc2b6d89d368eb7851f /driver | |
parent | 7b7f7b136e58429a8afd6f41ee11cd105baefeba (diff) | |
download | chrome-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.mk | 1 | ||||
-rw-r--r-- | driver/usb_mux/amd_fp5.c | 97 | ||||
-rw-r--r-- | driver/usb_mux/amd_fp5.h | 21 |
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 */ |