summaryrefslogtreecommitdiff
path: root/board/plankton
diff options
context:
space:
mode:
authorAseda Aboagye <aaboagye@google.com>2019-11-27 23:59:24 -0800
committerCommit Bot <commit-bot@chromium.org>2019-12-10 22:49:35 +0000
commit5ebaed65363f96873a348bbf8468d6a6e67117bc (patch)
tree178a62de51ec3a3b29f499970d2792ec7c925c4d /board/plankton
parent68650b554531de4cd2480b5cec5589d483bc0dba (diff)
downloadchrome-ec-5ebaed65363f96873a348bbf8468d6a6e67117bc.tar.gz
usb_pd_policy: Make a lot of objects common
There is a board specific usb_pd_policy.c file that contains a lot of code for handling DisplayPort Alternate mode, Google Firmware Update Alternate mode, as well as some PD policy functions such as deciding to Accept or Reject a data role swap or a power role swap. Several boards simply copy/paste this code from project to project as a lot of this functionality is not actually board specific. This commit tries to refactor this by pulling the functions that are not mainly board specific into common code. The functions are made overridable such that boards that truly do require a different implementation may do so. Additionally, this consolidation changes the policy behaviour for some boards, but they should be for the better. Some examples include that data swaps are always allowed if we are a UFP (no system image requirement), power swaps are allowed to become a sink if we are no longer dual role (e.g. - in suspend), and DisplayPort Alternate Mode is not entered if the AP is off. In order to facilitate this refactor, a couple CONFIG_* options were introduced: - CONFIG_USB_PD_DP_HPD_GPIO /* HPD is sent to the GPU from the EC via a GPIO */ - CONFIG_USB_PD_CUSTOM_VDO /* * Define this if a board needs custom SNK and/or SRC PDOs. * * The default SRC PDO is a fixed 5V/1.5A with PDO_FIXED_FLAGS indicating * Dual-Role power, USB Communication Capable, and Dual-Role data. * * The default SNK PDOs are: * - Fixed 5V/500mA with the same PDO_FIXED_FLAGS * - Variable (non-battery) min 4.75V, max PD_MAX_VOLTAGE_MV, * operational current PD_MAX_CURRENT_MA, * - Battery min 4.75V, max PD_MAX_VOLTAGE_MV, operational power * PD_OPERATING_POWER_MW */ BUG=chromium:1021724,b:141458448 BRANCH=<as many as we can that are still supported> TEST=`make -j buildall` TEST=Flash a kohaku, verify that DP Alt Mode still works with a variety of DP peripherals TEST=Repeat above with a nocturne TEST=Repeat above with an atlas Change-Id: I18fd7e22dc77fe1dc6c21c38cd7f1bc53cae86cb Signed-off-by: Aseda Aboagye <aaboagye@google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1949052 Tested-by: Aseda Aboagye <aaboagye@chromium.org> Reviewed-by: Paul Fagerburg <pfagerburg@chromium.org> Reviewed-by: Diana Z <dzigterman@chromium.org> Reviewed-by: Denis Brockus <dbrockus@chromium.org> Commit-Queue: Aseda Aboagye <aaboagye@chromium.org>
Diffstat (limited to 'board/plankton')
-rw-r--r--board/plankton/board.h1
-rw-r--r--board/plankton/usb_pd_policy.c32
2 files changed, 12 insertions, 21 deletions
diff --git a/board/plankton/board.h b/board/plankton/board.h
index 92201ca68b..a23e861293 100644
--- a/board/plankton/board.h
+++ b/board/plankton/board.h
@@ -20,6 +20,7 @@
#define CONFIG_USB_POWER_DELIVERY
#define CONFIG_USB_PD_ALT_MODE
#define CONFIG_USB_PD_COMM_DISABLED
+#define CONFIG_USB_PD_CUSTOM_PDO
#define CONFIG_USB_PD_DUAL_ROLE
#define CONFIG_USB_PD_DYNAMIC_SRC_CAP
#define CONFIG_USB_PD_IDENTITY_HW_VERS 1
diff --git a/board/plankton/usb_pd_policy.c b/board/plankton/usb_pd_policy.c
index e94a88517e..abc5f91f53 100644
--- a/board/plankton/usb_pd_policy.c
+++ b/board/plankton/usb_pd_policy.c
@@ -31,7 +31,7 @@ const uint32_t pd_src_pdo[] = {
PDO_FIXED(12000, 3000, PDO_FIXED_FLAGS),
PDO_FIXED(20000, 3000, PDO_FIXED_FLAGS),
};
-static const int pd_src_pdo_cnts[3] = {
+static const int pd_src_pdo_cnts[] = {
[SRC_CAP_5V] = 1,
[SRC_CAP_12V] = 2,
[SRC_CAP_20V] = 3,
@@ -68,12 +68,6 @@ void pd_set_input_current_limit(int port, uint32_t max_ma,
return;
}
-int pd_is_valid_input_voltage(int mv)
-{
- /* Any voltage less than the max is allowed */
- return 1;
-}
-
int pd_board_check_request(uint32_t rdo, int pdo_cnt)
{
int idx = RDO_POS(rdo);
@@ -83,7 +77,7 @@ int pd_board_check_request(uint32_t rdo, int pdo_cnt)
EC_ERROR_INVAL : EC_SUCCESS;
}
-void pd_transition_voltage(int idx)
+__override void pd_transition_voltage(int idx)
{
gpio_set_level(GPIO_USBC_VSEL_0, idx >= 2);
gpio_set_level(GPIO_USBC_VSEL_1, idx >= 3);
@@ -110,7 +104,7 @@ int pd_snk_is_vbus_provided(int port)
return gpio_get_level(GPIO_VBUS_WAKE);
}
-int pd_board_checks(void)
+__override int pd_board_checks(void)
{
static int was_connected = -1;
if (was_connected != 1 && pd_is_connected(0))
@@ -119,28 +113,23 @@ int pd_board_checks(void)
return EC_SUCCESS;
}
-int pd_check_power_swap(int port)
+__override int pd_check_power_swap(int port)
{
/* Always allow power swap */
return 1;
}
-int pd_check_data_swap(int port, int data_role)
+__override int pd_check_data_swap(int port, int data_role)
{
/* Always allow data swap */
return 1;
}
-void pd_execute_data_swap(int port, int data_role)
-{
- /* Do nothing */
-}
-
-void pd_check_pr_role(int port, int pr_role, int flags)
+__override void pd_check_pr_role(int port, int pr_role, int flags)
{
}
-void pd_check_dr_role(int port, int dr_role, int flags)
+__override void pd_check_dr_role(int port, int dr_role, int flags)
{
/* If Plankton is in USB hub mode, always act as UFP */
if (board_in_hub_mode() && dr_role == PD_ROLE_DFP &&
@@ -233,7 +222,7 @@ static int dp_config(int port, uint32_t *payload)
return 1;
}
-static int svdm_enter_mode(int port, uint32_t *payload)
+int svdm_enter_mode(int port, uint32_t *payload)
{
int usb_mode = gpio_get_level(GPIO_USBC_SS_USB_MODE);
@@ -271,7 +260,7 @@ static struct amode_fx dp_fx = {
.config = &dp_config,
};
-const struct svdm_response svdm_rsp = {
+__override const struct svdm_response svdm_rsp = {
.identity = &svdm_response_identity,
.svids = &svdm_response_svids,
.modes = &svdm_response_modes,
@@ -280,7 +269,8 @@ const struct svdm_response svdm_rsp = {
.exit_mode = &svdm_exit_mode,
};
-int pd_custom_vdm(int port, int cnt, uint32_t *payload, uint32_t **rpayload)
+__override int pd_custom_vdm(int port, int cnt, uint32_t *payload,
+ uint32_t **rpayload)
{
int cmd = PD_VDO_CMD(payload[0]);
int rsize = 1;