From 592ef1dafdd59629df85b9852fbb629c0323acd6 Mon Sep 17 00:00:00 2001 From: Rob Barnes Date: Mon, 7 Jun 2021 14:53:59 -0600 Subject: guybrush: Add PS8811 driver Add PS8811 USB A retimer driver. Reusing USB mux structure even though the retimer does not have a mux. BUG=b:176987937 TEST=Build and run BRANCH=None Signed-off-by: Rob Barnes Change-Id: Ie11a105f344e6acc1312cda517fdfe54ecb8c8ea Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2946307 Commit-Queue: Diana Z Reviewed-by: Diana Z --- driver/build.mk | 1 + driver/retimer/ps8811.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ driver/retimer/ps8811.h | 42 +++++++++++++++++++++++++++++++++++++++--- 3 files changed, 88 insertions(+), 3 deletions(-) create mode 100644 driver/retimer/ps8811.c (limited to 'driver') diff --git a/driver/build.mk b/driver/build.mk index dd57ef69e4..db25932f40 100644 --- a/driver/build.mk +++ b/driver/build.mk @@ -166,6 +166,7 @@ driver-$(CONFIG_USBC_RETIMER_NB7V904M)+=retimer/nb7v904m.o driver-$(CONFIG_USBC_RETIMER_PI3DPX1207)+=retimer/pi3dpx1207.o driver-$(CONFIG_USBC_RETIMER_PI3HDX1204)+=retimer/pi3hdx1204.o driver-$(CONFIG_USBC_RETIMER_PS8802)+=retimer/ps8802.o +driver-$(CONFIG_USBC_RETIMER_PS8811)+=retimer/ps8811.o driver-$(CONFIG_USBC_RETIMER_PS8818)+=retimer/ps8818.o driver-$(CONFIG_USBC_RETIMER_TUSB544)+=retimer/tusb544.o diff --git a/driver/retimer/ps8811.c b/driver/retimer/ps8811.c new file mode 100644 index 0000000000..6a66248d38 --- /dev/null +++ b/driver/retimer/ps8811.c @@ -0,0 +1,48 @@ +/* Copyright 2021 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. + * + * PS8811 retimer. + */ + +#include "common.h" +#include "console.h" +#include "i2c.h" +#include "ps8811.h" +#include "usb_mux.h" + +int ps8811_i2c_read(const struct usb_mux *me, int page, int offset, int *data) +{ + int rv; + + rv = i2c_read8(me->i2c_port, + me->i2c_addr_flags + page, + offset, data); + + return rv; +} + +int ps8811_i2c_write(const struct usb_mux *me, int page, int offset, int data) +{ + int rv; + + rv = i2c_write8(me->i2c_port, + me->i2c_addr_flags + page, + offset, data); + + return rv; +} + +int ps8811_i2c_field_update(const struct usb_mux *me, int page, int offset, + uint8_t field_mask, uint8_t set_value) +{ + int rv; + + rv = i2c_field_update8(me->i2c_port, + me->i2c_addr_flags + page, + offset, + field_mask, + set_value); + + return rv; +} diff --git a/driver/retimer/ps8811.h b/driver/retimer/ps8811.h index 03cf8f604e..81b84d32e5 100644 --- a/driver/retimer/ps8811.h +++ b/driver/retimer/ps8811.h @@ -5,6 +5,8 @@ * PS8811 retimer. */ +#include "usb_mux.h" + #ifndef __CROS_EC_USB_RETIMER_PS8811_H #define __CROS_EC_USB_RETIMER_PS8811_H @@ -26,9 +28,9 @@ /* * PAGE 1 Register Definitions */ -#define PS8811_REG_PAGE1 0x01 +#define PS8811_REG_PAGE1 0x01 -#define PS8811_REG1_USB_BEQ_LEVEL 0x05 +#define PS8811_REG1_USB_BEQ_LEVEL 0x05 #define PS8811_BEQ_PIN_LEVEL_UP_9DB 0x00 #define PS8811_BEQ_PIN_LEVEL_UP_10_5DB 0x01 #define PS8811_BEQ_PIN_LEVEL_UP_12DB 0x02 @@ -52,8 +54,42 @@ #define PS8811_BEQ_I2C_LEVEL_UP_21DB 0x90 #define PS8811_BEQ_I2C_LEVEL_UP_23DB 0xA0 -#define PS8811_REG1_USB_BEQ_CONFIG 0x06 +#define PS8811_REG1_USB_BEQ_CONFIG 0x06 #define PS8811_BEQ_CONFIG_REG_ENABLE BIT(0) +#define PS8811_REG1_USB_CHAN_A_SWING 0x66 +#define PS8811_CHAN_A_SWING_MASK GENMASK(6, 4) +#define PS8811_CHAN_A_SWING_SHIFT 4 + +#define PS8811_REG1_USB_CHAN_B_SWING 0xA4 +#define PS8811_CHAN_B_SWING_MASK GENMASK(2, 0) +#define PS8811_CHAN_B_SWING_SHIFT 0 + +/* De-emphasis -2.2 dB, Pre-shoot 1.2 dB */ +#define PS8811_CHAN_B_DE_2_2_PS_1_2_LSB 0x1 +#define PS8811_CHAN_B_DE_2_2_PS_1_2_MSB 0x13 + +/* De-emphasis -3.5 dB, Pre-shoot 0 dB */ +#define PS8811_CHAN_B_DE_3_5_PS_0_LSB 0x0 +#define PS8811_CHAN_B_DE_3_5_PS_0_MSB 0x5 + +/* De-emphasis -4.5 dB, Pre-shoot 0 dB */ +#define PS8811_CHAN_B_DE_4_5_PS_0_LSB 0x0 +#define PS8811_CHAN_B_DE_4_5_PS_0_MSB 0x6 + +/* De-emphasis -6 dB, Pre-shoot 3 dB */ +#define PS8811_CHAN_B_DE_6_PS_3_LSB 0x4 +#define PS8811_CHAN_B_DE_6_PS_3_MSB 0x16 + +#define PS8811_REG1_USB_CHAN_B_DE_PS_LSB 0xA5 +#define PS8811_CHAN_B_DE_PS_LSB_MASK GENMASK(2, 0) + +#define PS8811_REG1_USB_CHAN_B_DE_PS_MSB 0xA6 +#define PS8811_CHAN_B_DE_PS_MSB_MASK GENMASK(5, 0) + +int ps8811_i2c_read(const struct usb_mux *me, int page, int offset, int *data); +int ps8811_i2c_write(const struct usb_mux *me, int page, int offset, int data); +int ps8811_i2c_field_update(const struct usb_mux *me, int page, int offset, + uint8_t field_mask, uint8_t set_value); #endif /* __CROS_EC_USB_RETIMER_PS8802_H */ -- cgit v1.2.1