diff options
author | Alec Berg <alecaberg@chromium.org> | 2015-03-31 16:09:24 -0700 |
---|---|---|
committer | ChromeOS Commit Bot <chromeos-commit-bot@chromium.org> | 2015-04-07 03:41:01 +0000 |
commit | 2d2d1e15cfd3a91c6d624d380ce44945855d0c83 (patch) | |
tree | cb8f816a2e42560baed6d0f2cb26030a69bd4f9a /board | |
parent | 077f7c8b4797218c7be52736b46e56a49c567765 (diff) | |
download | chrome-ec-2d2d1e15cfd3a91c6d624d380ce44945855d0c83.tar.gz |
pd: treat externally powered dualrole devices as dedicated chargers
Treat externally powered dualrole devices as dedicated chargers.
This allows us to default to consuming power from externally powered
dualrole devices and cancels a charger override when one is attached.
BUG=chrome-os-partner:38785
BRANCH=samus
TEST=tested with third-party dualrole device that can be externally
powered.
also tested with another samus that was hard-coded with externally
powered bit set, and deleted it's policy for power swapping. when
this externally-powered samus is plugged into a samus running this CL,
we always charge from the externally-powered samus.
Change-Id: I850eba668e86d311d9353aa3881fc3a518409630
Signed-off-by: Alec Berg <alecaberg@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/263331
Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
Diffstat (limited to 'board')
-rw-r--r-- | board/dingdong/usb_pd_policy.c | 4 | ||||
-rw-r--r-- | board/firefly/usb_pd_policy.c | 4 | ||||
-rw-r--r-- | board/fruitpie/usb_pd_policy.c | 4 | ||||
-rw-r--r-- | board/hoho/usb_pd_policy.c | 4 | ||||
-rw-r--r-- | board/honeybuns/usb_pd_policy.c | 4 | ||||
-rw-r--r-- | board/host/usb_pd_policy.c | 4 | ||||
-rw-r--r-- | board/plankton/usb_pd_policy.c | 7 | ||||
-rw-r--r-- | board/ryu/usb_pd_policy.c | 4 | ||||
-rw-r--r-- | board/samus_pd/usb_pd_policy.c | 26 | ||||
-rw-r--r-- | board/twinkie/usb_pd_policy.c | 4 | ||||
-rw-r--r-- | board/zinger/usb_pd_policy.c | 6 |
11 files changed, 42 insertions, 29 deletions
diff --git a/board/dingdong/usb_pd_policy.c b/board/dingdong/usb_pd_policy.c index 10f920b237..3d14329e59 100644 --- a/board/dingdong/usb_pd_policy.c +++ b/board/dingdong/usb_pd_policy.c @@ -91,11 +91,11 @@ void pd_execute_data_swap(int port, int data_role) /* Do nothing */ } -void pd_check_pr_role(int port, int pr_role, int partner_pr_swap) +void pd_check_pr_role(int port, int pr_role, int flags) { } -void pd_check_dr_role(int port, int dr_role, int partner_dr_swap) +void pd_check_dr_role(int port, int dr_role, int flags) { } /* ----------------- Vendor Defined Messages ------------------ */ diff --git a/board/firefly/usb_pd_policy.c b/board/firefly/usb_pd_policy.c index 44ccfe418b..2784f7799a 100644 --- a/board/firefly/usb_pd_policy.c +++ b/board/firefly/usb_pd_policy.c @@ -130,11 +130,11 @@ void pd_execute_data_swap(int port, int data_role) /* Do nothing */ } -void pd_check_pr_role(int port, int pr_role, int partner_pr_swap) +void pd_check_pr_role(int port, int pr_role, int flags) { } -void pd_check_dr_role(int port, int dr_role, int partner_dr_swap) +void pd_check_dr_role(int port, int dr_role, int flags) { } diff --git a/board/fruitpie/usb_pd_policy.c b/board/fruitpie/usb_pd_policy.c index 96668ff015..bf49a0ce64 100644 --- a/board/fruitpie/usb_pd_policy.c +++ b/board/fruitpie/usb_pd_policy.c @@ -117,11 +117,11 @@ void pd_execute_data_swap(int port, int data_role) /* Do nothing */ } -void pd_check_pr_role(int port, int pr_role, int partner_pr_swap) +void pd_check_pr_role(int port, int pr_role, int flags) { } -void pd_check_dr_role(int port, int dr_role, int partner_dr_swap) +void pd_check_dr_role(int port, int dr_role, int flags) { } /* ----------------- Vendor Defined Messages ------------------ */ diff --git a/board/hoho/usb_pd_policy.c b/board/hoho/usb_pd_policy.c index dc6eb7fc84..fff0399184 100644 --- a/board/hoho/usb_pd_policy.c +++ b/board/hoho/usb_pd_policy.c @@ -91,11 +91,11 @@ void pd_execute_data_swap(int port, int data_role) /* Do nothing */ } -void pd_check_pr_role(int port, int pr_role, int partner_pr_swap) +void pd_check_pr_role(int port, int pr_role, int flags) { } -void pd_check_dr_role(int port, int dr_role, int partner_dr_swap) +void pd_check_dr_role(int port, int dr_role, int flags) { } /* ----------------- Vendor Defined Messages ------------------ */ diff --git a/board/honeybuns/usb_pd_policy.c b/board/honeybuns/usb_pd_policy.c index 7e45a0cc87..67d39cbf68 100644 --- a/board/honeybuns/usb_pd_policy.c +++ b/board/honeybuns/usb_pd_policy.c @@ -116,11 +116,11 @@ void pd_execute_data_swap(int port, int data_role) /* Do nothing */ } -void pd_check_pr_role(int port, int pr_role, int partner_pr_swap) +void pd_check_pr_role(int port, int pr_role, int flags) { } -void pd_check_dr_role(int port, int dr_role, int partner_dr_swap) +void pd_check_dr_role(int port, int dr_role, int flags) { } diff --git a/board/host/usb_pd_policy.c b/board/host/usb_pd_policy.c index 9d108bf2cc..a515f58800 100644 --- a/board/host/usb_pd_policy.c +++ b/board/host/usb_pd_policy.c @@ -101,11 +101,11 @@ void pd_execute_data_swap(int port, int data_role) /* Do nothing */ } -void pd_check_pr_role(int port, int pr_role, int partner_pr_swap) +void pd_check_pr_role(int port, int pr_role, int flags) { } -void pd_check_dr_role(int port, int dr_role, int partner_dr_swap) +void pd_check_dr_role(int port, int dr_role, int flags) { } diff --git a/board/plankton/usb_pd_policy.c b/board/plankton/usb_pd_policy.c index f007cd4b91..59a37c6922 100644 --- a/board/plankton/usb_pd_policy.c +++ b/board/plankton/usb_pd_policy.c @@ -143,14 +143,15 @@ void pd_execute_data_swap(int port, int data_role) /* Do nothing */ } -void pd_check_pr_role(int port, int pr_role, int partner_pr_swap) +void pd_check_pr_role(int port, int pr_role, int flags) { } -void pd_check_dr_role(int port, int dr_role, int partner_dr_swap) +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 && partner_dr_swap) + if (board_in_hub_mode() && dr_role == PD_ROLE_DFP && + (flags & PD_FLAGS_PARTNER_DR_DATA)) pd_request_data_swap(port); } diff --git a/board/ryu/usb_pd_policy.c b/board/ryu/usb_pd_policy.c index 454a3523e1..b7550b1480 100644 --- a/board/ryu/usb_pd_policy.c +++ b/board/ryu/usb_pd_policy.c @@ -119,11 +119,11 @@ int pd_check_data_swap(int port, int data_role) return 1; } -void pd_check_pr_role(int port, int pr_role, int partner_pr_swap) +void pd_check_pr_role(int port, int pr_role, int flags) { } -void pd_check_dr_role(int port, int dr_role, int partner_dr_swap) +void pd_check_dr_role(int port, int dr_role, int flags) { } diff --git a/board/samus_pd/usb_pd_policy.c b/board/samus_pd/usb_pd_policy.c index d9477a9da5..85e3244527 100644 --- a/board/samus_pd/usb_pd_policy.c +++ b/board/samus_pd/usb_pd_policy.c @@ -157,18 +157,30 @@ void pd_execute_data_swap(int port, int data_role) set_usb_switches(port, (data_role == PD_ROLE_UFP)); } -void pd_check_pr_role(int port, int pr_role, int partner_pr_swap) +void pd_check_pr_role(int port, int pr_role, int flags) { - /* If sink, and dual role toggling is on, then switch to source */ - if (partner_pr_swap && pr_role == PD_ROLE_SINK && - pd_get_dual_role() == PD_DRP_TOGGLE_ON) - pd_request_power_swap(port); + /* + * If partner is dual-role power and dualrole toggling is on, consider + * if a power swap is necessary. + */ + if ((flags & PD_FLAGS_PARTNER_DR_POWER) && + pd_get_dual_role() == PD_DRP_TOGGLE_ON) { + /* + * If we are a sink and partner is not externally powered, then + * swap to become a source. If we are source and partner is + * externally powered, swap to become a sink. + */ + int partner_extpower = flags & PD_FLAGS_PARTNER_EXTPOWER; + if ((!partner_extpower && pr_role == PD_ROLE_SINK) || + (partner_extpower && pr_role == PD_ROLE_SOURCE)) + pd_request_power_swap(port); + } } -void pd_check_dr_role(int port, int dr_role, int partner_dr_swap) +void pd_check_dr_role(int port, int dr_role, int flags) { /* If UFP, try to switch to DFP */ - if (partner_dr_swap && dr_role == PD_ROLE_UFP) + if ((flags & PD_FLAGS_PARTNER_DR_DATA) && dr_role == PD_ROLE_UFP) pd_request_data_swap(port); } /* ----------------- Vendor Defined Messages ------------------ */ diff --git a/board/twinkie/usb_pd_policy.c b/board/twinkie/usb_pd_policy.c index b1e4c064da..8b19031f32 100644 --- a/board/twinkie/usb_pd_policy.c +++ b/board/twinkie/usb_pd_policy.c @@ -106,11 +106,11 @@ int pd_check_data_swap(int port, int data_role) return 1; } -void pd_check_pr_role(int port, int pr_role, int partner_pr_swap) +void pd_check_pr_role(int port, int pr_role, int flags) { } -void pd_check_dr_role(int port, int dr_role, int partner_dr_swap) +void pd_check_dr_role(int port, int dr_role, int flags) { } diff --git a/board/zinger/usb_pd_policy.c b/board/zinger/usb_pd_policy.c index cb1e3b743a..2f5b6c3e99 100644 --- a/board/zinger/usb_pd_policy.c +++ b/board/zinger/usb_pd_policy.c @@ -299,14 +299,14 @@ void pd_execute_data_swap(int port, int data_role) /* Do nothing */ } -void pd_check_pr_role(int port, int pr_role, int partner_pr_swap) +void pd_check_pr_role(int port, int pr_role, int flags) { } -void pd_check_dr_role(int port, int dr_role, int partner_dr_swap) +void pd_check_dr_role(int port, int dr_role, int flags) { /* If DFP, try to switch to UFP */ - if (partner_dr_swap && dr_role == PD_ROLE_DFP) + if ((flags & PD_FLAGS_PARTNER_DR_DATA) && dr_role == PD_ROLE_DFP) pd_request_data_swap(port); } |