diff options
-rw-r--r-- | board/eve/usb_pd_policy.c | 5 | ||||
-rw-r--r-- | board/kevin/board.c | 7 | ||||
-rw-r--r-- | board/kevin/usb_pd_policy.c | 47 | ||||
-rw-r--r-- | board/pyro/usb_pd_policy.c | 5 | ||||
-rw-r--r-- | board/reef/usb_pd_policy.c | 5 | ||||
-rw-r--r-- | board/snappy/usb_pd_policy.c | 5 | ||||
-rw-r--r-- | common/charge_manager.c | 1 | ||||
-rw-r--r-- | common/usb_pd_policy.c | 3 | ||||
-rw-r--r-- | include/charge_manager.h | 8 | ||||
-rw-r--r-- | include/usb_pd.h | 8 |
10 files changed, 81 insertions, 13 deletions
diff --git a/board/eve/usb_pd_policy.c b/board/eve/usb_pd_policy.c index 74c1c54c80..3311f13b73 100644 --- a/board/eve/usb_pd_policy.c +++ b/board/eve/usb_pd_policy.c @@ -51,6 +51,11 @@ void pd_transition_voltage(int idx) /* No-operation: we are always 5V */ } +int board_vbus_source_enabled(int port) +{ + return gpio_get_level(port ? GPIO_USB_C1_5V_EN : GPIO_USB_C0_5V_EN); +} + int pd_set_power_supply_ready(int port) { /* Ensure we're not charging from this port */ diff --git a/board/kevin/board.c b/board/kevin/board.c index 0b9e77e22b..940c2e4045 100644 --- a/board/kevin/board.c +++ b/board/kevin/board.c @@ -220,8 +220,7 @@ int board_set_active_charge_port(int charge_port) switch (charge_port) { case 0: case 1: /* Don't charge from a source port */ - if (gpio_get_level(charge_port == 0 ? - GPIO_USB_C0_5V_EN : GPIO_USB_C1_5V_EN)) + if (board_vbus_source_enabled(charge_port)) return -1; bd9995x_port = bd9995x_pd_port_to_chg_port(charge_port); @@ -261,8 +260,8 @@ void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma) int extpower_is_present(void) { int port; - int p0_src = gpio_get_level(GPIO_USB_C0_5V_EN); - int p1_src = gpio_get_level(GPIO_USB_C1_5V_EN); + int p0_src = board_vbus_source_enabled(0); + int p1_src = board_vbus_source_enabled(1); /* * The charger will indicate VBUS presence if we're sourcing 5V, diff --git a/board/kevin/usb_pd_policy.c b/board/kevin/usb_pd_policy.c index 4f145dc1ad..4e753d76a9 100644 --- a/board/kevin/usb_pd_policy.c +++ b/board/kevin/usb_pd_policy.c @@ -18,6 +18,7 @@ #include "util.h" #include "usb_mux.h" #include "usb_pd.h" +#include "usb_pd_tcpm.h" #define CPRINTF(format, args...) cprintf(CC_USBPD, format, ## args) #define CPRINTS(format, args...) cprints(CC_USBPD, format, ## args) @@ -51,6 +52,31 @@ void pd_transition_voltage(int idx) /* No-operation: we are always 5V */ } +static uint8_t vbus_en[CONFIG_USB_PD_PORT_COUNT]; +static uint8_t vbus_rp[CONFIG_USB_PD_PORT_COUNT] = {TYPEC_RP_1A5, TYPEC_RP_1A5}; + +int board_vbus_source_enabled(int port) +{ + return vbus_en[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; + int flags = (vbus_rp[port] == TYPEC_RP_1A5 && vbus_en[port]) ? + (GPIO_INPUT | GPIO_PULL_UP) : GPIO_OUTPUT; + + /* + * Driving USB_Cx_5V_EN high, actually put a 16.5k resistance + * (2x 33k in parallel) on the NX5P3290 load switch ILIM pin, + * setting a minimum OCP current of 3186 mA. + * Putting an internal pull-up on USB_Cx_5V_EN, effectively put a 33k + * resistor on ILIM, setting a minimum OCP current of 1505 mA. + */ + gpio_set_level(gpio, vbus_en[port]); + gpio_set_flags(gpio, flags); +} + int pd_set_power_supply_ready(int port) { /* Ensure we're not charging from this port */ @@ -59,10 +85,10 @@ int pd_set_power_supply_ready(int port) /* Ensure we advertise the proper available current quota */ charge_manager_source_port(port, 1); - /* Provide VBUS */ - gpio_set_level(port ? GPIO_USB_C1_5V_EN : - GPIO_USB_C0_5V_EN, 1); pd_set_vbus_discharge(port, 0); + /* Provide VBUS */ + vbus_en[port] = 1; + board_vbus_update_source_current(port); /* notify host of power info change */ pd_send_host_event(PD_EVENT_POWER_CHANGE); @@ -72,13 +98,12 @@ int pd_set_power_supply_ready(int port) void pd_power_supply_reset(int port) { - enum gpio_signal gpio; int prev_en; - gpio = port ? GPIO_USB_C1_5V_EN : GPIO_USB_C0_5V_EN; - prev_en = gpio_get_level(gpio); + prev_en = vbus_en[port]; /* Disable VBUS */ - gpio_set_level(gpio, 0); + vbus_en[port] = 0; + board_vbus_update_source_current(port); /* Enable discharge if we were previously sourcing 5V */ if (prev_en) pd_set_vbus_discharge(port, 1); @@ -114,6 +139,14 @@ void typec_set_input_current_limit(int port, uint32_t max_ma, #endif } +void typec_set_source_current_limit(int port, int rp) +{ + vbus_rp[port] = rp; + + /* change the GPIO driving the load switch if needed */ + board_vbus_update_source_current(port); +} + int pd_board_checks(void) { return EC_SUCCESS; diff --git a/board/pyro/usb_pd_policy.c b/board/pyro/usb_pd_policy.c index e2f8157dc3..cf83ea05bc 100644 --- a/board/pyro/usb_pd_policy.c +++ b/board/pyro/usb_pd_policy.c @@ -51,6 +51,11 @@ void pd_transition_voltage(int idx) /* No-operation: we are always 5V */ } +int board_vbus_source_enabled(int port) +{ + return gpio_get_level(port ? GPIO_USB_C1_5V_EN : GPIO_USB_C0_5V_EN); +} + int pd_set_power_supply_ready(int port) { /* Ensure we're not charging from this port */ diff --git a/board/reef/usb_pd_policy.c b/board/reef/usb_pd_policy.c index 6e515abf81..693bd6e2e4 100644 --- a/board/reef/usb_pd_policy.c +++ b/board/reef/usb_pd_policy.c @@ -51,6 +51,11 @@ void pd_transition_voltage(int idx) /* No-operation: we are always 5V */ } +int board_vbus_source_enabled(int port) +{ + return gpio_get_level(port ? GPIO_USB_C1_5V_EN : GPIO_USB_C0_5V_EN); +} + int pd_set_power_supply_ready(int port) { /* Ensure we're not charging from this port */ diff --git a/board/snappy/usb_pd_policy.c b/board/snappy/usb_pd_policy.c index e2f8157dc3..cf83ea05bc 100644 --- a/board/snappy/usb_pd_policy.c +++ b/board/snappy/usb_pd_policy.c @@ -51,6 +51,11 @@ void pd_transition_voltage(int idx) /* No-operation: we are always 5V */ } +int board_vbus_source_enabled(int port) +{ + return gpio_get_level(port ? GPIO_USB_C1_5V_EN : GPIO_USB_C0_5V_EN); +} + int pd_set_power_supply_ready(int port) { /* Ensure we're not charging from this port */ diff --git a/common/charge_manager.c b/common/charge_manager.c index eeae350f10..3455c8e3f6 100644 --- a/common/charge_manager.c +++ b/common/charge_manager.c @@ -939,6 +939,7 @@ void charge_manager_source_port(int port, int enable) charge_manager_save_log(p); #endif + typec_set_source_current_limit(p, rp); tcpm_select_rp_value(p, rp); pd_update_contract(p); } diff --git a/common/usb_pd_policy.c b/common/usb_pd_policy.c index 87f6fbe3d1..5a37a943e3 100644 --- a/common/usb_pd_policy.c +++ b/common/usb_pd_policy.c @@ -968,8 +968,7 @@ void pd_set_vbus_discharge(int port, int enable) static struct mutex discharge_lock[CONFIG_USB_PD_PORT_COUNT]; mutex_lock(&discharge_lock[port]); - enable &= !gpio_get_level(port ? GPIO_USB_C1_5V_EN : - GPIO_USB_C0_5V_EN); + enable &= !board_vbus_source_enabled(port); #ifdef CONFIG_USB_PD_DISCHARGE_GPIO gpio_set_level(port ? GPIO_USB_C1_DISCHARGE : GPIO_USB_C0_DISCHARGE, enable); diff --git a/include/charge_manager.h b/include/charge_manager.h index 51007f3d7b..939471163b 100644 --- a/include/charge_manager.h +++ b/include/charge_manager.h @@ -120,4 +120,12 @@ int board_set_active_charge_port(int charge_port); */ void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma); +/* + * Get whether the port is sourcing power on VBUS. + * + * @param port PD port. + * @return VBUS power state. + */ +int board_vbus_source_enabled(int port); + #endif /* __CROS_EC_CHARGE_MANAGER_H */ diff --git a/include/usb_pd.h b/include/usb_pd.h index c588596e4c..a6be237102 100644 --- a/include/usb_pd.h +++ b/include/usb_pd.h @@ -1002,6 +1002,14 @@ void typec_set_input_current_limit(int port, uint32_t max_ma, uint32_t supply_voltage); /** + * Set the type-C current limit when sourcing current.. + * + * @param port USB-C port number + * @param rp One of enum tcpc_rp_value (eg TYPEC_RP_3A0) defining the limit. + */ +void typec_set_source_current_limit(int port, int rp); + +/** * Verify board specific health status : current, voltages... * * @return EC_SUCCESS if the board is good, <0 else. |