summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCloud <cloud_lin@compal.com>2017-04-18 10:50:31 +0800
committerchrome-bot <chrome-bot@chromium.org>2017-07-13 22:03:36 -0700
commit53f6c38e9297adaf3f8384ac1e7ab29957f40064 (patch)
treec5729f976510e2355f8aef7491c65ce33cfe11a4
parent4ec4975d90713b58557beca7ed2a94745d7476e3 (diff)
downloadchrome-ec-53f6c38e9297adaf3f8384ac1e7ab29957f40064.tar.gz
kahlee: Modify pd control behavior
1. Fix a issue that user can't use type-c adapter and type-c device at the same time. ex. Plug in adapter in port1 and then plug in device in port2. Port1 will stop charge. 2. Update the vbus status when AC change to correct the charge source. 3. We use the typc adapter with capacity 5V/3A, 9V/3A, 15V/3A, 20V/2.25A. Add PD_PREFER_HIGH_VOLTAGE define to request voltage to 20V. BRANCH=None BUG=None TEST=Plug in type-c adapter and device to test Signed-off-by: Cloud Lin <cloud_lin@compal.com> Change-Id: I1927008a13651b8fa137d8d1a5000efd7db2e79f Reviewed-on: https://chromium-review.googlesource.com/485380 Commit-Ready: Lin Cloud <cloud_lin@compal.com> Tested-by: Lin Cloud <cloud_lin@compal.com> Reviewed-by: Martin Roth <martinroth@chromium.org>
-rw-r--r--board/kahlee/board.c82
-rw-r--r--board/kahlee/board.h3
-rw-r--r--board/kahlee/gpio.inc3
-rw-r--r--board/kahlee/usb_pd_policy.c7
4 files changed, 60 insertions, 35 deletions
diff --git a/board/kahlee/board.c b/board/kahlee/board.c
index 1ee7512873..7d7b3602a2 100644
--- a/board/kahlee/board.c
+++ b/board/kahlee/board.c
@@ -71,6 +71,16 @@ static void tcpc_alert_event(enum gpio_signal signal)
#endif
}
+void usb0_evt(enum gpio_signal signal)
+{
+ task_set_event(TASK_ID_USB_CHG_P0, USB_CHG_EVENT_BC12, 0);
+}
+
+void usb1_evt(enum gpio_signal signal)
+{
+ task_set_event(TASK_ID_USB_CHG_P1, USB_CHG_EVENT_BC12, 0);
+}
+
#include "gpio_list.h"
/* power signal list. Must match order of enum power_signal. */
@@ -251,24 +261,12 @@ void board_reset_pd_mcu(void)
void board_tcpc_init(void)
{
- int port, reg, reg2;
+ int port;
/* Only reset TCPC if not sysjump */
if (!system_jumped_to_this_image())
board_reset_pd_mcu();
- /*
- * TODO: Remove when Kahlee is updated with PS8751 A3.
- *
- * Force PS8751 A2 to wake from low power mode.
- * If PS8751 remains in low power mode after sysjump,
- * TCPM_INIT will fail due to not able to access PS8751.
- *
- * NOTE: PS8751 A3 will wake on any I2C access.
- */
- i2c_read8(NPCX_I2C_PORT0_0, 0x16, 0xA0, &reg);
- i2c_read8(NPCX_I2C_PORT0_1, 0x36, 0xA0, &reg2);
-
/* Enable TCPC0 interrupt */
gpio_enable_interrupt(GPIO_USB_C0_PD_INT_ODL);
@@ -297,29 +295,55 @@ DECLARE_HOOK(HOOK_CHIPSET_PRE_INIT, chipset_pre_init, HOOK_PRIO_DEFAULT);
/* Initialize board. */
static void board_init(void)
{
-
+ /* Enable pericom BC1.2 interrupts */
+ gpio_enable_interrupt(GPIO_USB_C0_BC12_INT_L);
+ gpio_enable_interrupt(GPIO_USB_C1_BC12_INT_L);
}
DECLARE_HOOK(HOOK_INIT, board_init, HOOK_PRIO_FIRST);
-int pd_snk_is_vbus_provided(int port)
+/*
+ * TODO(b/63514169)
+ * There is no VBUS detect pin in proto phase, EC needs to
+ * get VBUS information from BC1.2 chip. HW will add VBUS
+ * detect pin in EVT phase and EC can get VBUS status from
+ * GPIO.
+*/
+int check_vbus_status(int port)
{
- int is_vbus = 0;
int reg;
- switch (port) {
- case 0:
- i2c_read8(NPCX_I2C_PORT0_0, 0x4A, 0x1D, &reg);
- is_vbus = ((reg & 0x02) >> 1);
- break;
- case 1:
- i2c_read8(NPCX_I2C_PORT0_1, 0x4A, 0x1D, &reg);
- is_vbus = ((reg & 0x02) >> 1);
- break;
- default:
- break;
+ i2c_read8(pi3usb9281_chips[port].i2c_port,
+ 0x4A, PI3USB9281_REG_VBUS, &reg);
+
+ return ((reg & 0x02) >> 1);
+}
+
+void update_vbus_status(void)
+{
+ uint8_t port, vbus;
+
+ for (port = 0; port < CONFIG_USB_PD_PORT_COUNT; port++) {
+ vbus = check_vbus_status(port);
+ usb_charger_vbus_change(port, vbus);
+ task_wake(port ? TASK_ID_PD_C1 : TASK_ID_PD_C0);
}
+}
- return is_vbus;
+/*
+ * TODO(b/63514169)
+ * Check VBUS status when AC changes to update the charge source information.
+ * We will modify it to gpio interrupt control when HW adds vbus status pin
+ * in EVT phase.
+*/
+static void board_extpower(void)
+{
+ update_vbus_status();
+}
+DECLARE_HOOK(HOOK_AC_CHANGE, board_extpower, HOOK_PRIO_DEFAULT);
+
+int pd_snk_is_vbus_provided(int port)
+{
+ return check_vbus_status(port);
}
/**
@@ -362,8 +386,6 @@ int board_set_active_charge_port(int charge_port)
gpio_set_level(GPIO_USB_C1_20V_EN, 1);
break;
case CHARGE_PORT_NONE:
- gpio_set_level(GPIO_USB_C0_5V_EN, 0);
- gpio_set_level(GPIO_USB_C1_5V_EN, 0);
gpio_set_level(GPIO_USB_C0_20V_EN, 0);
gpio_set_level(GPIO_USB_C1_20V_EN, 0);
break;
diff --git a/board/kahlee/board.h b/board/kahlee/board.h
index 67355ed04f..4cec27346e 100644
--- a/board/kahlee/board.h
+++ b/board/kahlee/board.h
@@ -286,6 +286,9 @@ enum board_version {
#define PD_MAX_CURRENT_MA 3000
#define PD_MAX_VOLTAGE_MV 20000
+/* Request the max voltage for type-c adapter */
+#define PD_PREFER_HIGH_VOLTAGE
+
/* Reset PD MCU */
void board_reset_pd_mcu(void);
diff --git a/board/kahlee/gpio.inc b/board/kahlee/gpio.inc
index 2d7e406b9d..45d6b81f3a 100644
--- a/board/kahlee/gpio.inc
+++ b/board/kahlee/gpio.inc
@@ -11,6 +11,9 @@
GPIO_INT(USB_C0_PD_INT_ODL, PIN(3, 7), GPIO_INT_FALLING | GPIO_PULL_UP, tcpc_alert_event) /* from Parade TCPC1 */
GPIO_INT(USB_C1_PD_INT_ODL, PIN(B, 1), GPIO_INT_FALLING | GPIO_PULL_UP, tcpc_alert_event) /* from Parade TCPC2 */
+GPIO_INT(USB_C0_BC12_INT_L, PIN(0, 0), GPIO_INT_FALLING | GPIO_PULL_UP, usb0_evt)
+GPIO_INT(USB_C1_BC12_INT_L, PIN(8, 5), GPIO_INT_FALLING | GPIO_PULL_UP, usb1_evt)
+
GPIO_INT(PCH_SLP_S5_L, PIN(8, 6), GPIO_INT_BOTH, power_signal_interrupt) /* SLP_S5_L */
GPIO_INT(PCH_SLP_S3_L, PIN(7, 3), GPIO_INT_BOTH, power_signal_interrupt) /* SLP_S3_L */
diff --git a/board/kahlee/usb_pd_policy.c b/board/kahlee/usb_pd_policy.c
index 4e7d39488e..4f21038159 100644
--- a/board/kahlee/usb_pd_policy.c
+++ b/board/kahlee/usb_pd_policy.c
@@ -29,11 +29,11 @@
/* TODO: fill in correct source and sink capabilities */
const uint32_t pd_src_pdo[] = {
- PDO_FIXED(5000, 2250, PDO_FIXED_FLAGS),
+ PDO_FIXED(5000, 1500, PDO_FIXED_FLAGS),
};
const int pd_src_pdo_cnt = ARRAY_SIZE(pd_src_pdo);
const uint32_t pd_src_pdo_max[] = {
- PDO_FIXED(5000, 2250, PDO_FIXED_FLAGS),
+ PDO_FIXED(5000, 3000, PDO_FIXED_FLAGS),
};
const int pd_src_pdo_max_cnt = ARRAY_SIZE(pd_src_pdo_max);
@@ -65,8 +65,6 @@ int board_vbus_source_enabled(int port)
static void board_vbus_update_source_current(int port)
{
enum gpio_signal gpio = port ? GPIO_USB_C1_5V_EN : GPIO_USB_C0_5V_EN;
- enum gpio_signal gpio_AC = port ?
- GPIO_USB_C1_20V_EN : GPIO_USB_C0_20V_EN;
int flags = (vbus_rp[port] == TYPEC_RP_1A5 && vbus_en[port]) ?
(GPIO_INPUT | GPIO_PULL_UP) : (GPIO_OUTPUT | GPIO_PULL_UP);
@@ -78,7 +76,6 @@ static void board_vbus_update_source_current(int port)
* resistor on ILIM, setting a minimum OCP current of 1505 mA.
*/
gpio_set_level(gpio, vbus_en[port]);
- gpio_set_level(gpio_AC, 0);
gpio_set_flags(gpio, flags);
}