diff options
author | Alec Berg <alecaberg@chromium.org> | 2015-10-13 13:51:26 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2015-10-13 18:44:01 -0700 |
commit | 89067fc458d8533a74e45a1285091dda7a96669e (patch) | |
tree | 7736222d644ef1ae412b4d9cd9c3e91e72834263 /common/usb_pd_policy.c | |
parent | 6b498ef31825ae4da01b26644c232726fbcf3a75 (diff) | |
download | chrome-ec-89067fc458d8533a74e45a1285091dda7a96669e.tar.gz |
cleanup: pd: remove duplicate code for checking request msg
Remove duplicate code for checking request message, but keep
a board specific check of the request message for custom checks
needed on zinger and plankton.
BUG=chrome-os-partner:42490
BRANCH=none
TEST=make -j buildall. run on samus and connect a hoho, make
sure we successfully negotiate a contract.
Change-Id: I7398953a158d340e3e113f5a816b55445a857711
Signed-off-by: Alec Berg <alecaberg@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/305374
Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
Diffstat (limited to 'common/usb_pd_policy.c')
-rw-r--r-- | common/usb_pd_policy.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/common/usb_pd_policy.c b/common/usb_pd_policy.c index 0cd4160614..e20605f9ff 100644 --- a/common/usb_pd_policy.c +++ b/common/usb_pd_policy.c @@ -32,6 +32,45 @@ static int rw_flash_changed = 1; +int pd_check_requested_voltage(uint32_t rdo) +{ + int max_ma = rdo & 0x3FF; + int op_ma = (rdo >> 10) & 0x3FF; + int idx = RDO_POS(rdo); + uint32_t pdo; + uint32_t pdo_ma; + + /* Board specific check for this request */ + if (pd_board_check_request(rdo)) + return EC_ERROR_INVAL; + + /* check current ... */ + pdo = pd_src_pdo[idx - 1]; + pdo_ma = (pdo & 0x3ff); + if (op_ma > pdo_ma) + return EC_ERROR_INVAL; /* too much op current */ + if (max_ma > pdo_ma) + return EC_ERROR_INVAL; /* too much max current */ + + CPRINTF("Requested %d V %d mA (for %d/%d mA)\n", + ((pdo >> 10) & 0x3ff) * 50, (pdo & 0x3ff) * 10, + op_ma * 10, max_ma * 10); + + /* Accept the requested voltage */ + return EC_SUCCESS; +} + +static int stub_pd_board_check_request(uint32_t rdo) +{ + int idx = RDO_POS(rdo); + + /* Check for invalid index */ + return (!idx || idx > pd_src_pdo_cnt) ? + EC_ERROR_INVAL : EC_SUCCESS; +} +int pd_board_check_request(uint32_t) + __attribute__((weak, alias("stub_pd_board_check_request"))); + #ifdef CONFIG_USB_PD_DUAL_ROLE /* Cap on the max voltage requested as a sink (in millivolts) */ static unsigned max_request_mv = PD_MAX_VOLTAGE_MV; /* no cap */ |