diff options
author | Denis Brockus <dbrockus@chromium.org> | 2019-07-31 11:10:19 -0600 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2019-08-02 20:10:36 +0000 |
commit | 298abea55f87163aa0b4fd752f834751a31cf07f (patch) | |
tree | ec73ac1bad63874a016f5d35f7d556c48b879306 | |
parent | 92ee51f7cccc65cba40aaf83c761a29013595068 (diff) | |
download | chrome-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.c | 87 | ||||
-rw-r--r-- | baseboard/zork/baseboard.h | 14 | ||||
-rw-r--r-- | board/trembyle/board.c | 16 | ||||
-rw-r--r-- | board/trembyle/gpio.inc | 2 | ||||
-rw-r--r-- | driver/tcpm/nct38xx.h | 3 | ||||
-rw-r--r-- | include/config.h | 1 |
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 |