summaryrefslogtreecommitdiff
path: root/common/usb_pd_policy.c
diff options
context:
space:
mode:
authorAlec Berg <alecaberg@chromium.org>2015-10-13 13:51:26 -0700
committerchrome-bot <chrome-bot@chromium.org>2015-10-13 18:44:01 -0700
commit89067fc458d8533a74e45a1285091dda7a96669e (patch)
tree7736222d644ef1ae412b4d9cd9c3e91e72834263 /common/usb_pd_policy.c
parent6b498ef31825ae4da01b26644c232726fbcf3a75 (diff)
downloadchrome-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.c39
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 */