From 18c253631602adb4ed84d827048487d613398ae3 Mon Sep 17 00:00:00 2001 From: Jan Dabros Date: Thu, 10 Dec 2020 01:12:05 +0100 Subject: servo_v4p1: Fix GPIO assignments in ioexpanders Fix improper GPIO connections and add new ones in ioexpanders to match EVT hardware layout. Old assignments were implemented for PVT design. BUG:b:144776402,b:168385201 BRANCH:master TEST:make -b servo_v4p1. Verify that usb redriver TUSB1064 is working (DP connection). Verify that DUT charger is working correctly. Signed-off-by: Jan Dabros Change-Id: I8229690440a70fd78c5b5671368212d4eb325d51 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2582666 Reviewed-by: Brian Nemec --- board/servo_v4p1/board.c | 6 ++--- board/servo_v4p1/gpio.inc | 2 +- board/servo_v4p1/ioexpanders.c | 50 +++++++++++++++++++++++++++++++----------- board/servo_v4p1/ioexpanders.h | 34 ++++++++++++++++++++-------- board/servo_v4p1/tusb1064.c | 3 --- 5 files changed, 66 insertions(+), 29 deletions(-) diff --git a/board/servo_v4p1/board.c b/board/servo_v4p1/board.c index 3ece1b8bbe..2d8725f206 100644 --- a/board/servo_v4p1/board.c +++ b/board/servo_v4p1/board.c @@ -166,9 +166,9 @@ static void hub_evt(enum gpio_signal signal) hook_call_deferred(&host_hub_evt_data, 0); } -static void bc12_evt(enum gpio_signal signal) +static void dut_pwr_evt(enum gpio_signal signal) { - ccprintf("bc12_evt\n"); + ccprintf("dut_pwr_evt\n"); } /* Enable uservo USB. */ @@ -430,7 +430,7 @@ static void board_init(void) gpio_enable_interrupt(GPIO_STM_FAULT_IRQ_L); gpio_enable_interrupt(GPIO_DP_HPD); gpio_enable_interrupt(GPIO_USBH_I2C_BUSY_INT); - gpio_enable_interrupt(GPIO_BC12_INT_ODL); + gpio_enable_interrupt(GPIO_DUT_PWR_IRQ_ODL); /* Disable power to DUT by default */ chg_power_select(CHG_POWER_OFF); diff --git a/board/servo_v4p1/gpio.inc b/board/servo_v4p1/gpio.inc index b42bde495b..52a689c03f 100644 --- a/board/servo_v4p1/gpio.inc +++ b/board/servo_v4p1/gpio.inc @@ -12,7 +12,7 @@ GPIO_INT(STM_FAULT_IRQ_L, PIN(A, 8), GPIO_INT_FALLING, tca_evt) GPIO_INT(DP_HPD, PIN(A, 15), GPIO_INT_BOTH, dp_evt) GPIO_INT(CHGSRV_TCPC_INT_ODL, PIN(C, 0), GPIO_INT_FALLING, tcpc_evt) GPIO_INT(USBH_I2C_BUSY_INT, PIN(C, 9), GPIO_INT_FALLING, hub_evt) -GPIO_INT(BC12_INT_ODL, PIN(F, 1), GPIO_INT_FALLING, bc12_evt) +GPIO_INT(DUT_PWR_IRQ_ODL, PIN(F, 1), GPIO_INT_FALLING, dut_pwr_evt) #endif /* SECTION_IS_RO */ /* Outputs */ diff --git a/board/servo_v4p1/ioexpanders.c b/board/servo_v4p1/ioexpanders.c index 6617a8d30e..f411cbbc73 100644 --- a/board/servo_v4p1/ioexpanders.c +++ b/board/servo_v4p1/ioexpanders.c @@ -14,6 +14,7 @@ */ static int dut_chg_en_state; +static int bc12_charger; /* Enable all ioexpander outputs. */ int init_ioexpanders(void) @@ -51,10 +52,10 @@ int init_ioexpanders(void) * BIT-3 (BOARD_ID) | I | x * BIT-4 (BOARD ID) | I | x * BIT-5 (BOARD_ID) | I | x - * BIT-6 (CMUX_EN) | O | 1 + * BIT-6 (VBUS_DISCHRG_EN) | O | 0 * BIT-7 (DONGLE_DET) | I | x */ - ret = tca6416a_write_byte(1, TCA6416A_OUT_PORT_1, 0x40); + ret = tca6416a_write_byte(1, TCA6416A_OUT_PORT_1, 0x0); if (ret != EC_SUCCESS) return ret; @@ -73,7 +74,7 @@ int init_ioexpanders(void) * BIT-4 (EN_VOUT_BUF_CC1) | O | 0 * BIT-5 (EN_VOUT_BUF_CC2) | O | 0 * BIT-6 (DUT_CHG_EN) | O | 0 - * BIT-7 (HOST_OR_CHG_CTL | O | 0 + * BIT-7 (HOST_OR_CHG_CTL) | O | 0 */ ret = tca6424a_write_byte(1, TCA6424A_OUT_PORT_0, 0x02); if (ret != EC_SUCCESS) @@ -104,34 +105,43 @@ int init_ioexpanders(void) * Init TCA6424A, PORT 2 * NAME | DIR | Initial setting * ------------------------------------------------ - * BIT-0 (VBUS_DISCHRG_EN) | O | 0 + * BIT-0 (HOST_CHRG_DET) | I | x * BIT-1 (USBH_PWRDN_L) | O | 1 * BIT-2 (UNUSED) | I | x * BIT-3 (UNUSED) | I | x * BIT-4 (UNUSED) | I | x * BIT-5 (UNUSED) | I | x - * BIT-6 (UNUSED) | I | x + * BIT-6 (SYS_PWR_IRQ_ODL) | I | x * BIT-7 (DBG_LED_K_ODL) | O | 0 */ ret = tca6424a_write_byte(1, TCA6424A_OUT_PORT_2, 0x02); if (ret != EC_SUCCESS) return ret; - ret = tca6424a_write_byte(1, TCA6424A_DIR_PORT_2, 0x7c); + ret = tca6424a_write_byte(1, TCA6424A_DIR_PORT_2, 0x7d); if (ret != EC_SUCCESS) return ret; - /* Clear any faults */ + /* Clear any faults and other IRQs*/ read_faults(); + read_irqs(); + + /* + * Cache initial value for BC1.2 indicator. This is the only pin, which + * notifies about event on both low and high levels, while notification + * should happen only when state has changed. + */ + bc12_charger = get_host_chrg_det(); return EC_SUCCESS; } static void ioexpanders_irq(void) { - int fault; + int fault, irqs; fault = read_faults(); + irqs = read_irqs(); if (!(fault & USERVO_FAULT_L)) ccprintf("FAULT: Microservo USB A port load switch\n"); @@ -159,6 +169,15 @@ static void ioexpanders_irq(void) ccprintf("limits or exceeded current limits. Power "); ccprintf("off DAC1 to clear the fault\n"); } + + if ((irqs & HOST_CHRG_DET) != bc12_charger) { + ccprintf("BC1.2 charger %s\n", (irqs & HOST_CHRG_DET) ? + "plugged" : "unplugged"); + bc12_charger = irqs & HOST_CHRG_DET; + } + + if (!(irqs & SYS_PWR_IRQ_ODL)) + ccprintf("System full power threshold exceeded\n"); } DECLARE_DEFERRED(ioexpanders_irq); @@ -235,14 +254,14 @@ inline int board_id_det(void) return (id >> 3) & 0x7; } -inline int cmux_en(int en) +inline int dongle_det(void) { - return tca6416a_write_bit(1, TCA6416A_OUT_PORT_1, 6, en); + return tca6416a_read_bit(1, TCA6416A_IN_PORT_1, 7); } -inline int dongle_det(void) +inline int get_host_chrg_det(void) { - return tca6416a_read_bit(1, TCA6416A_IN_PORT_1, 7); + return tca6424a_read_bit(1, TCA6424A_IN_PORT_2, 0); } inline int en_pp5000_alt_3p3(int en) @@ -296,9 +315,14 @@ inline int read_faults(void) return tca6424a_read_byte(1, TCA6424A_IN_PORT_1); } +inline int read_irqs(void) +{ + return tca6424a_read_byte(1, TCA6424A_IN_PORT_2); +} + inline int vbus_dischrg_en(int en) { - return tca6424a_write_bit(1, TCA6424A_OUT_PORT_2, 0, en); + return tca6416a_write_bit(1, TCA6416A_OUT_PORT_1, 6, en); } inline int usbh_pwrdn_l(int en) diff --git a/board/servo_v4p1/ioexpanders.h b/board/servo_v4p1/ioexpanders.h index d444a6fca3..b6aded8654 100644 --- a/board/servo_v4p1/ioexpanders.h +++ b/board/servo_v4p1/ioexpanders.h @@ -128,15 +128,6 @@ int usb3_a1_mux_sel(int en); */ int board_id_det(void); -/** - * USBC 4:6 redriver enable - * - * @param en 0 - TUSB1064 disabled - * 1 - TUSB1064 enabled - * @return EC_SUCCESS or EC_xxx on error - */ -int cmux_en(int en); - /** * Reads the TypeA/TypeC DUT cable assembly pigtail * @@ -145,6 +136,14 @@ int cmux_en(int en); */ int dongle_det(void); +/** + * Reads state of BC1.2 on host connection + * + * @return 0 - BC1.2 not present + * 1 - BC1.2 present + */ +int get_host_chrg_det(void); + /** * Enable signal for supplemental power supply. This supply will support higher * wattage servo needs. 10ms after enabling this bit, the server supply should @@ -268,6 +267,23 @@ int host_or_chg_ctl(int en); */ int read_faults(void); +#define HOST_CHRG_DET BIT(0) +#define SYS_PWR_IRQ_ODL BIT(6) + +/** + * Read irqs which indicate some system event. + * + * BIT + * 0 (HOST_CHRG_DET) - Change of state of BC1.2 on host connection + * 0 - BC1.2 not present + * 1 - BC1.2 present + * 6 (SYS_PWR_IRQ_ODL) - IRQ from system full power INA231 monitor. IRQ can be + * programmed to trip on wattage threshold. + * 0 - IRQ asserted + * 1 - no IRQ + */ +int read_irqs(void); + /** * Enables active discharge for USB DUT Charger * diff --git a/board/servo_v4p1/tusb1064.c b/board/servo_v4p1/tusb1064.c index 30816da11b..d9f4a47973 100644 --- a/board/servo_v4p1/tusb1064.c +++ b/board/servo_v4p1/tusb1064.c @@ -11,9 +11,6 @@ int init_tusb1064(int port) { uint8_t val; - /* Enable the TUSB1064 redriver */ - cmux_en(1); - /* Disconnect USB3.1 and DP */ val = tusb1064_read_byte(port, TUSB1064_REG_GENERAL); if (val < 0) -- cgit v1.2.1