summaryrefslogtreecommitdiff
path: root/board/servo_v4p1
diff options
context:
space:
mode:
authorJan Dabros <jsd@semihalf.com>2020-12-10 01:12:05 +0100
committerCommit Bot <commit-bot@chromium.org>2020-12-17 16:49:07 +0000
commit18c253631602adb4ed84d827048487d613398ae3 (patch)
treebc9889bba0fa0bb780d0c015c0d40ef3d4f81e9f /board/servo_v4p1
parent2cf881abe17a5f927479b9b197e4fbca7b80ae8e (diff)
downloadchrome-ec-18c253631602adb4ed84d827048487d613398ae3.tar.gz
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 <jsd@semihalf.com> Change-Id: I8229690440a70fd78c5b5671368212d4eb325d51 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2582666 Reviewed-by: Brian Nemec <bnemec@chromium.org>
Diffstat (limited to 'board/servo_v4p1')
-rw-r--r--board/servo_v4p1/board.c6
-rw-r--r--board/servo_v4p1/gpio.inc2
-rw-r--r--board/servo_v4p1/ioexpanders.c50
-rw-r--r--board/servo_v4p1/ioexpanders.h34
-rw-r--r--board/servo_v4p1/tusb1064.c3
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
@@ -129,15 +129,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
*
* @return 0 - for TypeA
@@ -146,6 +137,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
* switch over from the host supply and the higher wattage will be available
@@ -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)