From d9fa15722d45f4ff6aa1cc08059f1807a37768d7 Mon Sep 17 00:00:00 2001 From: Edward Hill Date: Thu, 19 Dec 2019 23:06:34 -0700 Subject: retimer: Add PS8818 driver BUG=b:139428235, b:145766506 BRANCH=none TEST=USB3 device enumerates as 5G on Trembyle OPT1 USB-C1 Change-Id: I96ddd393626000630daf1ce517e003f6472c50cd Signed-off-by: Edward Hill Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1977983 Reviewed-by: Denis Brockus Commit-Queue: Denis Brockus --- driver/retimer/ps8818.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ driver/retimer/ps8818.h | 22 ++++++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 driver/retimer/ps8818.c create mode 100644 driver/retimer/ps8818.h (limited to 'driver/retimer') diff --git a/driver/retimer/ps8818.c b/driver/retimer/ps8818.c new file mode 100644 index 0000000000..d58d9966e2 --- /dev/null +++ b/driver/retimer/ps8818.c @@ -0,0 +1,46 @@ +/* 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. + * + * PS8818 retimer. + */ + +#include "ps8818.h" +#include "common.h" +#include "console.h" +#include "gpio.h" +#include "i2c.h" +#include "ioexpander.h" +#include "usb_mux.h" + +static int ps8818_i2c_write(int port, int offset, int data) +{ + return i2c_write8(usb_retimers[port].i2c_port, + usb_retimers[port].i2c_addr_flags, + offset, data); +} + +static int ps8818_set_mux(int port, mux_state_t mux_state) +{ + int val = 0; + int rv; + + if (mux_state & MUX_USB_ENABLED) + val |= PS8818_MODE_USB_ENABLE; + if (mux_state & MUX_DP_ENABLED) + val |= PS8818_MODE_DP_ENABLE; + + rv = ps8818_i2c_write(port, PS8818_REG_MODE, val); + if (rv) + return rv; + + val = 0; + if (mux_state & MUX_POLARITY_INVERTED) + val |= PS8818_FLIP_CONFIG; + + return ps8818_i2c_write(port, PS8818_REG_FLIP, val); +} + +const struct usb_retimer_driver ps8818_usb_retimer = { + .set = ps8818_set_mux, +}; diff --git a/driver/retimer/ps8818.h b/driver/retimer/ps8818.h new file mode 100644 index 0000000000..93481d3e4b --- /dev/null +++ b/driver/retimer/ps8818.h @@ -0,0 +1,22 @@ +/* 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. + * + * PS8818 retimer. + */ + +#ifndef __CROS_EC_USB_RETIMER_PS8818_H +#define __CROS_EC_USB_RETIMER_PS8818_H + +#define PS8818_I2C_ADDR_FLAGS 0x28 + +#define PS8818_REG_FLIP 0x00 +#define PS8818_FLIP_CONFIG BIT(7) + +#define PS8818_REG_MODE 0x01 +#define PS8818_MODE_DP_ENABLE BIT(7) +#define PS8818_MODE_USB_ENABLE BIT(6) + +extern const struct usb_retimer_driver ps8818_usb_retimer; + +#endif /* __CROS_EC_USB_RETIMER_PS8818_H */ -- cgit v1.2.1