summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Brockus <dbrockus@chromium.org>2019-07-31 11:10:19 -0600
committerCommit Bot <commit-bot@chromium.org>2019-08-02 20:10:36 +0000
commit298abea55f87163aa0b4fd752f834751a31cf07f (patch)
treeec73ac1bad63874a016f5d35f7d556c48b879306
parent92ee51f7cccc65cba40aaf83c761a29013595068 (diff)
downloadchrome-ec-298abea55f87163aa0b4fd752f834751a31cf07f.tar.gz
Trembyle: Fix USB-C TCPC drivers
Add NCT3807 USB-C TCPC drivers BUG=b:138600238,b:138599948 BRANCH=none TEST=make buildall -j Change-Id: Id98df51748beb60e787350265127936b18f4cf46 Signed-off-by: Denis Brockus <dbrockus@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1728478 Commit-Queue: Edward Hill <ecgh@chromium.org> Reviewed-by: Edward Hill <ecgh@chromium.org>
-rw-r--r--baseboard/zork/baseboard.c87
-rw-r--r--baseboard/zork/baseboard.h14
-rw-r--r--board/trembyle/board.c16
-rw-r--r--board/trembyle/gpio.inc2
-rw-r--r--driver/tcpm/nct38xx.h3
-rw-r--r--include/config.h1
6 files changed, 103 insertions, 20 deletions
diff --git a/baseboard/zork/baseboard.c b/baseboard/zork/baseboard.c
index c8a6919fb3..cd8ed92419 100644
--- a/baseboard/zork/baseboard.c
+++ b/baseboard/zork/baseboard.c
@@ -21,6 +21,7 @@
#include "driver/bc12/pi3usb9201.h"
#include "driver/ppc/sn5s330.h"
#include "driver/tcpm/ps8xxx.h"
+#include "driver/tcpm/nct38xx.h"
#include "driver/temp_sensor/sb_tsi.h"
#include "ec_commands.h"
#include "extpower.h"
@@ -218,17 +219,17 @@ const struct tcpc_config_t tcpc_config[CONFIG_USB_PD_PORT_COUNT] = {
.bus_type = EC_BUS_TYPE_I2C,
.i2c_info = {
.port = I2C_PORT_TCPC0,
- .addr_flags = PS8751_I2C_ADDR1_FLAGS,
+ .addr_flags = NCT38xx_I2C_ADDR1_1_FLAGS,
},
- .drv = &ps8xxx_tcpm_drv,
+ .drv = &nct38xx_tcpm_drv,
},
[USBC_PORT_C1] = {
.bus_type = EC_BUS_TYPE_I2C,
.i2c_info = {
.port = I2C_PORT_TCPC1,
- .addr_flags = PS8751_I2C_ADDR1_FLAGS,
+ .addr_flags = NCT38xx_I2C_ADDR1_1_FLAGS,
},
- .drv = &ps8xxx_tcpm_drv,
+ .drv = &nct38xx_tcpm_drv,
},
};
BUILD_ASSERT(ARRAY_SIZE(tcpc_config) == USBC_PORT_COUNT);
@@ -246,6 +247,84 @@ const struct pi3usb9201_config_t pi3usb9201_bc12_chips[] = {
};
BUILD_ASSERT(ARRAY_SIZE(pi3usb9201_bc12_chips) == USBC_PORT_COUNT);
+void baseboard_tcpc_init(void)
+{
+ /* Enable PPC interrupts. */
+ gpio_enable_interrupt(GPIO_USB_C0_PPC_INT_ODL);
+ gpio_enable_interrupt(GPIO_USB_C1_PPC_INT_ODL);
+
+ /* Enable TCPC interrupts. */
+ gpio_enable_interrupt(GPIO_USB_C0_TCPC_INT_ODL);
+ gpio_enable_interrupt(GPIO_USB_C1_TCPC_INT_ODL);
+
+ /* Enable BC 1.2 interrupts */
+ gpio_enable_interrupt(GPIO_USB_C0_BC12_INT_ODL);
+ gpio_enable_interrupt(GPIO_USB_C1_BC12_INT_ODL);
+}
+DECLARE_HOOK(HOOK_INIT, baseboard_tcpc_init, HOOK_PRIO_INIT_I2C + 1);
+
+static void reset_pd_port(int port, enum gpio_signal reset_gpio_l,
+ int hold_delay, int finish_delay)
+{
+ gpio_set_level(reset_gpio_l, 0);
+ msleep(hold_delay);
+ gpio_set_level(reset_gpio_l, 1);
+ if (finish_delay)
+ msleep(finish_delay);
+}
+
+void board_reset_pd_mcu(void)
+{
+ /* Reset TCPC0 */
+ reset_pd_port(USBC_PORT_C0, GPIO_USB_C0_TCPC_RST_L,
+ NCT38XX_RESET_HOLD_DELAY_MS,
+ NCT38XX_RESET_POST_DELAY_MS);
+
+ /* Reset TCPC1 */
+ reset_pd_port(USBC_PORT_C1, GPIO_USB_C1_TCPC_RST_L,
+ NCT38XX_RESET_HOLD_DELAY_MS,
+ NCT38XX_RESET_POST_DELAY_MS);
+}
+
+uint16_t tcpc_get_alert_status(void)
+{
+ uint16_t status = 0;
+
+ /*
+ * Check which port has the ALERT line set and ignore if that TCPC has
+ * its reset line active.
+ */
+ if (!gpio_get_level(GPIO_USB_C0_TCPC_INT_ODL)) {
+ if (gpio_get_level(GPIO_USB_C0_TCPC_RST_L) != 0)
+ status |= PD_STATUS_TCPC_ALERT_0;
+ }
+
+ if (!gpio_get_level(GPIO_USB_C1_TCPC_INT_ODL)) {
+ if (gpio_get_level(GPIO_USB_C1_TCPC_RST_L) != 0)
+ status |= PD_STATUS_TCPC_ALERT_1;
+ }
+
+ return status;
+}
+
+void tcpc_alert_event(enum gpio_signal signal)
+{
+ int port = -1;
+
+ switch (signal) {
+ case GPIO_USB_C0_TCPC_INT_ODL:
+ port = 0;
+ break;
+ case GPIO_USB_C1_TCPC_INT_ODL:
+ port = 1;
+ break;
+ default:
+ return;
+ }
+
+ schedule_deferred_pd_interrupt(port);
+}
+
void bc12_interrupt(enum gpio_signal signal)
{
switch (signal) {
diff --git a/baseboard/zork/baseboard.h b/baseboard/zork/baseboard.h
index 49b153f789..706c492468 100644
--- a/baseboard/zork/baseboard.h
+++ b/baseboard/zork/baseboard.h
@@ -110,13 +110,24 @@
#define CONFIG_KEYBOARD_COL2_INVERTED
#define CONFIG_KEYBOARD_PROTOCOL_8042
+#define CONFIG_CMD_PD_CONTROL
#define CONFIG_USB_CHARGER
#define CONFIG_USB_POWER_DELIVERY
+#define CONFIG_USB_PD_ALT_MODE
+#define CONFIG_USB_PD_ALT_MODE_DFP
+#define CONFIG_USB_PD_COMM_LOCKED
+#define CONFIG_USB_PD_DISCHARGE_PPC
#define CONFIG_USB_PD_DUAL_ROLE
+#define CONFIG_USB_PD_DUAL_ROLE_AUTO_TOGGLE
+#define CONFIG_USB_PD_LOGGING
#define CONFIG_USB_PD_PORT_COUNT 2
+#define CONFIG_USB_PD_TCPC_LOW_POWER
#define CONFIG_USB_PD_TCPM_MUX
+#define CONFIG_USB_PD_TCPM_NCT38XX
#define CONFIG_USB_PD_TCPM_PS8751
#define CONFIG_USB_PD_TCPM_TCPCI
+#define CONFIG_USB_PD_TRY_SRC
+#define CONFIG_USB_PD_VBUS_DETECT_PPC
#define CONFIG_USB_PD_VBUS_MEASURE_CHARGER
#define CONFIG_USBC_PPC
#define CONFIG_USBC_PPC_DEDICATED_INT
@@ -124,6 +135,9 @@
#define CONFIG_USBC_PPC_SN5S330
#define CONFIG_USBC_PPC_VCONN
#define CONFIG_USBC_SS_MUX
+#define CONFIG_USBC_SS_MUX_DFP_ONLY
+#define CONFIG_USBC_VCONN
+#define CONFIG_USBC_VCONN_SWAP
#define PD_POWER_SUPPLY_TURN_ON_DELAY 30000 /* us */
#define PD_POWER_SUPPLY_TURN_OFF_DELAY 30000 /* us */
diff --git a/board/trembyle/board.c b/board/trembyle/board.c
index a43584da2d..7100029b9e 100644
--- a/board/trembyle/board.c
+++ b/board/trembyle/board.c
@@ -23,28 +23,12 @@ void board_update_sensor_config_from_sku(void)
gpio_enable_interrupt(GPIO_6AXIS_INT_L);
}
-void board_reset_pd_mcu(void)
-{
- /* TODO */
-}
-
uint32_t system_get_sku_id(void)
{
/* TODO */
return 0;
}
-uint16_t tcpc_get_alert_status(void)
-{
- /* TODO */
- return 0;
-}
-
-void tcpc_alert_event(enum gpio_signal signal)
-{
- /* TODO */
-}
-
int charger_get_vbus_voltage(int port)
{
/* TODO */
diff --git a/board/trembyle/gpio.inc b/board/trembyle/gpio.inc
index e83f035ee0..661613c67b 100644
--- a/board/trembyle/gpio.inc
+++ b/board/trembyle/gpio.inc
@@ -46,6 +46,8 @@ GPIO(PCH_WAKE_L, PIN(0, 3), GPIO_OUT_HIGH) /* Wake SOC */
GPIO(SYS_RESET_L, PIN(C, 7), GPIO_ODR_HIGH) /* Cold Reset to SOC */
GPIO(USB_C0_TCPC_RST_L, PIN(E, 1), GPIO_OUT_HIGH) /* C0 TCPC Reset */
GPIO(USB_C1_TCPC_RST_L, PIN(F, 0), GPIO_OUT_HIGH) /* C1 TCPC Reset */
+GPIO(USB_C0_DP_HPD, PIN(F, 5), GPIO_OUT_LOW) /* C0 DP Hotplug Detect */
+GPIO(USB_C1_DP_HPD, PIN(C, 1), GPIO_OUT_LOW) /* C1 DP Hotplug Detect */
GPIO(LED_FULL_L, PIN(6, 0), GPIO_OUT_HIGH)
GPIO(LED_CHRG_L, PIN(C, 0), GPIO_OUT_HIGH)
diff --git a/driver/tcpm/nct38xx.h b/driver/tcpm/nct38xx.h
index ad46ee6faf..5d80606018 100644
--- a/driver/tcpm/nct38xx.h
+++ b/driver/tcpm/nct38xx.h
@@ -49,6 +49,9 @@
#define NCT38XX_REG_CTRL_OUT_EN_SNKEN (1 << 2)
#define NCT38XX_REG_CTRL_OUT_EN_CONNDIREN (1 << 6)
+#define NCT38XX_RESET_HOLD_DELAY_MS 1
+#define NCT38XX_RESET_POST_DELAY_MS 0
+
extern const struct tcpm_drv nct38xx_tcpm_drv;
#endif /* defined(__CROS_EC_USB_PD_TCPM_NCT38XX_H) */
diff --git a/include/config.h b/include/config.h
index ba18c558a5..9295e2aada 100644
--- a/include/config.h
+++ b/include/config.h
@@ -3712,6 +3712,7 @@
#undef CONFIG_USB_PD_TCPM_ANX741X
#undef CONFIG_USB_PD_TCPM_ANX7447
#undef CONFIG_USB_PD_TCPM_ANX7688
+#undef CONFIG_USB_PD_TCPM_NCT38XX
#undef CONFIG_USB_PD_TCPM_PS8751
#undef CONFIG_USB_PD_TCPM_PS8805
#undef CONFIG_USB_PD_TCPM_MT6370