summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorli feng <li1.feng@intel.com>2016-06-22 17:25:01 -0700
committerchrome-bot <chrome-bot@chromium.org>2016-06-27 17:14:01 -0700
commit66b2f33e7dc929e64298f71707ce2f912b592129 (patch)
tree0e6c681088af9cd06e8e32e4a8b1dc04e8ee70e2
parente84a71fe67c08dd3d1777c0cd22fd1e35ea1d7e0 (diff)
downloadchrome-ec-66b2f33e7dc929e64298f71707ce2f912b592129.tar.gz
reef: Support DP alt mode of Type-C controller
BUG=chrome-os-partner:54413,chrome-os-partner:54649 BRANCH=none TEST=none Change-Id: I32c969a97f84bf4e9953031c69008f8e598b7920 Signed-off-by: li feng <li1.feng@intel.com> Signed-off-by: Divya Sasidharan <divya.s.sasidharan@intel.com> Reviewed-on: https://chromium-review.googlesource.com/355604 Commit-Ready: Kevin K Wong <kevin.k.wong@intel.com> Tested-by: Kevin K Wong <kevin.k.wong@intel.com> Reviewed-by: Shawn N <shawnn@chromium.org>
-rw-r--r--board/reef/board.c3
-rw-r--r--board/reef/board.h5
-rw-r--r--board/reef/gpio.inc10
-rw-r--r--board/reef/usb_pd_policy.c30
4 files changed, 38 insertions, 10 deletions
diff --git a/board/reef/board.c b/board/reef/board.c
index 324ff47941..51a836b1e4 100644
--- a/board/reef/board.c
+++ b/board/reef/board.c
@@ -20,6 +20,7 @@
#include "driver/accelgyro_bmi160.h"
#include "driver/charger/bd99955.h"
#include "driver/tcpm/anx74xx.h"
+#include "driver/tcpm/ps8751.h"
#include "driver/tcpm/tcpci.h"
#include "extpower.h"
#include "gpio.h"
@@ -151,10 +152,12 @@ struct usb_mux usb_muxes[CONFIG_USB_PD_PORT_COUNT] = {
{
.port_addr = 0, /* don't care / unused */
.driver = &anx74xx_tcpm_usb_mux_driver,
+ .hpd_update = &anx74xx_tcpc_update_hpd_status,
},
{
.port_addr = 1,
.driver = &tcpci_tcpm_usb_mux_driver,
+ .hpd_update = &ps8751_tcpc_update_hpd_status,
}
};
diff --git a/board/reef/board.h b/board/reef/board.h
index d231b8d1bf..73bb77c8b9 100644
--- a/board/reef/board.h
+++ b/board/reef/board.h
@@ -41,9 +41,10 @@
#define CONFIG_USB_PD_LOG_SIZE 512
#define CONFIG_USB_PD_PORT_COUNT 2
#define CONFIG_USB_PD_VBUS_DETECT_CHARGER
-#define CONFIG_USB_PD_TCPM_MUX /* for both PS8751 and ANX3429 */
-#define CONFIG_USB_PD_TCPM_TCPCI
+#define CONFIG_USB_PD_TCPM_MUX /* for both PS8751 and ANX3429 */
#define CONFIG_USB_PD_TCPM_ANX74XX
+#define CONFIG_USB_PD_TCPM_PS8751
+#define CONFIG_USB_PD_TCPM_TCPCI
#define CONFIG_USB_PD_TRY_SRC
#define CONFIG_USB_POWER_DELIVERY
diff --git a/board/reef/gpio.inc b/board/reef/gpio.inc
index 853aea32a7..755b3f75d7 100644
--- a/board/reef/gpio.inc
+++ b/board/reef/gpio.inc
@@ -12,7 +12,7 @@ GPIO_INT(CHARGER_INT_L, PIN(3, 3), GPIO_INT_FALLING, bd99955_vbus_interrupt) /
GPIO_INT(USB_C0_PD_INT, PIN(3, 7), GPIO_INT_RISING, tcpc_alert_event) /* from Analogix TCPC */
GPIO_INT(USB_C1_PD_INT_ODL, PIN(D, 2), GPIO_INT_FALLING, tcpc_alert_event) /* from Parade TCPC */
-GPIO_INT(PCH_SLP_S4_L, PIN(8, 6), GPIO_INT_BOTH, power_signal_interrupt) /* SLP_S4_L */
+GPIO_INT(PCH_SLP_S4_L, PIN(8, 6), GPIO_INT_BOTH, power_signal_interrupt) /* SLP_S4_L */
GPIO_INT(PCH_SLP_S3_L, PIN(7, 3), GPIO_INT_BOTH, power_signal_interrupt) /* SLP_S3_L */
GPIO_INT(PCH_SLP_S0_L, PIN(7, 5), GPIO_INT_BOTH, power_signal_interrupt) /* SLP_S0_L */
GPIO_INT(SUSPWRNACK, PIN(7, 2), GPIO_INT_BOTH, power_signal_interrupt)
@@ -82,7 +82,7 @@ GPIO(USB_C0_CABLE_DET, PIN(C, 5), GPIO_INPUT)
GPIO(PCH_RSMRST_L, PIN(7, 0), GPIO_OUT_LOW)
GPIO(EC_BATT_PRES_L, PIN(3, 4), GPIO_INPUT)
GPIO(V5A_EN, PIN(8, 5), GPIO_OUT_LOW) /* PMIC_EN */
-GPIO(EN_PP3300, PIN(C, 2), GPIO_OUT_LOW)
+GPIO(EN_PP3300, PIN(C, 2), GPIO_OUT_LOW)
GPIO(PP3300_PG, PIN(6, 2), GPIO_INPUT)
GPIO(EN_PP5000, PIN(C, 6), GPIO_OUT_LOW)
GPIO(PP5000_PG, PIN(7, 1), GPIO_INPUT)
@@ -92,13 +92,13 @@ GPIO(ENABLE_BACKLIGHT, PIN(9, 7), GPIO_ODR_HIGH | GPIO_SEL_1P8V) /* EC_BL_EN_OD
GPIO(WIRELESS_GPIO_WLAN_POWER, PIN(6, 6), GPIO_ODR_HIGH) /* EN_PP3300_WLAN_ODL */
-GPIO(CPU_PROCHOT, PIN(7, 4), GPIO_INPUT | GPIO_SEL_1P8V) /* PCH_PROCHOT_ODL */
+GPIO(CPU_PROCHOT, PIN(7, 4), GPIO_INPUT | GPIO_SEL_1P8V) /* PCH_PROCHOT_ODL */
GPIO(EC_PCH_PROCHOT_OVERRIDE_ODL,PIN(A, 3), GPIO_ODR_HIGH | GPIO_SEL_1P8V)
GPIO(PCH_PWRBTN_L, PIN(0, 1), GPIO_ODR_HIGH) /* EC_PCH_PWR_BTN_ODL */
GPIO(PCH_WAKE_L, PIN(8, 1), GPIO_ODR_HIGH) /* EC_PCH_WAKE_ODL */
-GPIO(USB_C0_HPD_1P8_ODL, PIN(9, 4), GPIO_ODR_HIGH)
-GPIO(USB_C1_HPD_1P8_ODL, PIN(A, 5), GPIO_ODR_HIGH)
+GPIO(USB_C0_HPD_1P8_ODL, PIN(9, 4), GPIO_INPUT | GPIO_SEL_1P8V)
+GPIO(USB_C1_HPD_1P8_ODL, PIN(A, 5), GPIO_INPUT | GPIO_SEL_1P8V)
GPIO(USB2_OTG_ID, PIN(A, 1), GPIO_OUTPUT) /* FIXME: what should this init to? */
GPIO(USB2_OTG_VBUSSENSE, PIN(9, 5), GPIO_OUTPUT)
diff --git a/board/reef/usb_pd_policy.c b/board/reef/usb_pd_policy.c
index e399e1686c..f442f725f3 100644
--- a/board/reef/usb_pd_policy.c
+++ b/board/reef/usb_pd_policy.c
@@ -9,6 +9,8 @@
#include "common.h"
#include "console.h"
#include "driver/charger/bd99955.h"
+#include "driver/tcpm/anx74xx.h"
+#include "driver/tcpm/ps8751.h"
#include "gpio.h"
#include "hooks.h"
#include "host_command.h"
@@ -246,12 +248,15 @@ int pd_custom_vdm(int port, int cnt, uint32_t *payload,
#ifdef CONFIG_USB_PD_ALT_MODE_DFP
static int dp_flags[CONFIG_USB_PD_PORT_COUNT];
+static uint32_t dp_status[CONFIG_USB_PD_PORT_COUNT];
static void svdm_safe_dp_mode(int port)
{
/* make DP interface safe until configure */
dp_flags[port] = 0;
- /* board_set_usb_mux(port, TYPEC_MUX_NONE, pd_get_polarity(port)); */
+ dp_status[port] = 0;
+ usb_mux_set(port, TYPEC_MUX_NONE,
+ USB_SWITCH_CONNECT, pd_get_polarity(port));
}
static int svdm_enter_dp_mode(int port, uint32_t mode_caps)
@@ -285,7 +290,10 @@ static int svdm_dp_status(int port, uint32_t *payload)
static int svdm_dp_config(int port, uint32_t *payload)
{
int opos = pd_alt_mode(port, USB_SID_DISPLAYPORT);
- /* board_set_usb_mux(port, TYPEC_MUX_DP, pd_get_polarity(port)); */
+
+ usb_mux_set(port, TYPEC_MUX_DP,
+ USB_SWITCH_CONNECT, pd_get_polarity(port));
+
payload[0] = VDO(USB_SID_DISPLAYPORT, 1,
CMD_DP_CONFIG | VDO_OPOS(opos));
payload[1] = VDO_DP_CFG(MODE_DP_PIN_E, /* pin mode */
@@ -296,21 +304,37 @@ static int svdm_dp_config(int port, uint32_t *payload)
static void svdm_dp_post_config(int port)
{
+ const struct usb_mux *mux = &usb_muxes[port];
+
dp_flags[port] |= DP_FLAGS_DP_ON;
if (!(dp_flags[port] & DP_FLAGS_HPD_HI_PENDING))
return;
+ mux->hpd_update(port, 1, 0);
}
static int svdm_dp_attention(int port, uint32_t *payload)
{
+ int lvl = PD_VDO_DPSTS_HPD_LVL(payload[1]);
+ int irq = PD_VDO_DPSTS_HPD_IRQ(payload[1]);
+ const struct usb_mux *mux = &usb_muxes[port];
+
+ dp_status[port] = payload[1];
+ if (!(dp_flags[port] & DP_FLAGS_DP_ON)) {
+ if (lvl)
+ dp_flags[port] |= DP_FLAGS_HPD_HI_PENDING;
+ return 1;
+ }
+ mux->hpd_update(port, lvl, irq);
+
/* ack */
return 1;
}
static void svdm_exit_dp_mode(int port)
{
+ const struct usb_mux *mux = &usb_muxes[port];
svdm_safe_dp_mode(port);
- /* gpio_set_level(PORT_TO_HPD(port), 0); */
+ mux->hpd_update(port, 0, 0);
}
static int svdm_enter_gfu_mode(int port, uint32_t mode_caps)