summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Hurst <shurst@google.com>2017-10-27 10:15:37 -0700
committerchrome-bot <chrome-bot@chromium.org>2017-11-14 16:03:23 -0800
commitee208a57b7db9075d6279e66360c6cc1b0f5114b (patch)
treeeccc876b5c78ca5771f772183931827488988868
parent6d4674fd0520ae6f1210b1a8b1cc654119344795 (diff)
downloadchrome-ec-ee208a57b7db9075d6279e66360c6cc1b0f5114b.tar.gz
PS8751 and PS8805 does not generate BIST Carrier Mode 2
On Nasher, sending TCPC_TX_BIST_MODE_2 to register 0x50 on the PS8751 TCPC does not generate BIST Carrier Mode 2. BUG=b:68337231 BRANCH=None TEST=`make -j buildall` Generated an eye diagram for Nasher on the GRL USB-PD test station Signed-off-by: Sam Hurst <shurst@chromium.org> Change-Id: Ia6e5df54a183c989a68d12be3a46896e3daea738 Reviewed-on: https://chromium-review.googlesource.com/741090 Commit-Ready: Sam Hurst <shurst@google.com> Tested-by: Sam Hurst <shurst@google.com> Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
-rw-r--r--driver/tcpm/ps8xxx.c32
-rw-r--r--driver/tcpm/ps8xxx.h16
2 files changed, 47 insertions, 1 deletions
diff --git a/driver/tcpm/ps8xxx.c b/driver/tcpm/ps8xxx.c
index bbabb854ab..09e4a404b9 100644
--- a/driver/tcpm/ps8xxx.c
+++ b/driver/tcpm/ps8xxx.c
@@ -92,6 +92,36 @@ int ps8xxx_tcpc_get_fw_version(int port, int *version)
return tcpc_read(port, FW_VER_REG, version);
}
+static int ps8xxx_tcpc_bist_mode_2(int port)
+{
+ int rv;
+
+ /* Generate BIST for 50ms. */
+ rv = tcpc_write(port,
+ PS8XXX_REG_BIST_CONT_MODE_BYTE0, PS8751_BIST_COUNTER_BYTE0);
+ rv |= tcpc_write(port,
+ PS8XXX_REG_BIST_CONT_MODE_BYTE1, PS8751_BIST_COUNTER_BYTE1);
+ rv |= tcpc_write(port,
+ PS8XXX_REG_BIST_CONT_MODE_BYTE2, PS8751_BIST_COUNTER_BYTE2);
+
+ /* Auto stop */
+ rv |= tcpc_write(port, PS8XXX_REG_BIST_CONT_MODE_CTR, 0);
+
+ /* Start BIST MODE 2 */
+ rv |= tcpc_write(port, TCPC_REG_TRANSMIT, TCPC_TX_BIST_MODE_2);
+
+ return rv;
+}
+
+static int ps8xxx_tcpm_transmit(int port, enum tcpm_transmit_type type,
+ uint16_t header, const uint32_t *data)
+{
+ if (type == TCPC_TX_BIST_MODE_2)
+ return ps8xxx_tcpc_bist_mode_2(port);
+ else
+ return tcpci_tcpm_transmit(port, type, header, data);
+}
+
static int ps8xxx_tcpm_release(int port)
{
int version;
@@ -120,7 +150,7 @@ const struct tcpm_drv ps8xxx_tcpm_drv = {
.set_msg_header = &tcpci_tcpm_set_msg_header,
.set_rx_enable = &tcpci_tcpm_set_rx_enable,
.get_message = &tcpci_tcpm_get_message,
- .transmit = &tcpci_tcpm_transmit,
+ .transmit = &ps8xxx_tcpm_transmit,
.tcpc_alert = &tcpci_tcpc_alert,
#ifdef CONFIG_USB_PD_DISCHARGE_TCPC
.tcpc_discharge_vbus = &tcpci_tcpc_discharge_vbus,
diff --git a/driver/tcpm/ps8xxx.h b/driver/tcpm/ps8xxx.h
index 1035af8077..5789cb733c 100644
--- a/driver/tcpm/ps8xxx.h
+++ b/driver/tcpm/ps8xxx.h
@@ -8,7 +8,23 @@
#ifndef __CROS_EC_USB_PD_TCPM_PS8XXX_H
#define __CROS_EC_USB_PD_TCPM_PS8XXX_H
+#define PS8751_BIST_TIMER_FREQ 15000000
+#define PS8751_BIST_DELAY_MS 50
+
+#define PS8751_BIST_COUNTER (PS8751_BIST_TIMER_FREQ / MSEC \
+ * PS8751_BIST_DELAY_MS)
+
+#define PS8751_BIST_COUNTER_BYTE0 (PS8751_BIST_COUNTER & 0xff)
+#define PS8751_BIST_COUNTER_BYTE1 ((PS8751_BIST_COUNTER >> 8) & 0xff)
+#define PS8751_BIST_COUNTER_BYTE2 ((PS8751_BIST_COUNTER >> 16) & 0xff)
+
#define PS8XXX_VENDOR_ID 0x1DA0
+#define PS8XXX_REG_I2C_DEBUGGING_ENABLE 0xA0
+#define PS8XXX_REG_BIST_CONT_MODE_BYTE0 0xBC
+#define PS8XXX_REG_BIST_CONT_MODE_BYTE1 0xBD
+#define PS8XXX_REG_BIST_CONT_MODE_BYTE2 0xBE
+#define PS8XXX_REG_BIST_CONT_MODE_CTR 0XBF
+#define PS8XXX_REG_DET_CTRL0 0x08
#if defined(CONFIG_USB_PD_TCPM_PS8751)
/* Vendor defined registers */