summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--board/plankton/usb_pd_policy.c4
-rw-r--r--board/zinger/usb_pd_policy.c2
-rw-r--r--common/usb_pd_policy.c18
-rw-r--r--include/usb_pd.h4
4 files changed, 19 insertions, 9 deletions
diff --git a/board/plankton/usb_pd_policy.c b/board/plankton/usb_pd_policy.c
index 1b5e0271df..d1f0a8487e 100644
--- a/board/plankton/usb_pd_policy.c
+++ b/board/plankton/usb_pd_policy.c
@@ -74,12 +74,12 @@ int pd_is_valid_input_voltage(int mv)
return 1;
}
-int pd_board_check_request(uint32_t rdo)
+int pd_board_check_request(uint32_t rdo, int pdo_cnt)
{
int idx = RDO_POS(rdo);
/* Check for invalid index */
- return (!idx || idx > pd_src_pdo_cnts[pd_src_pdo_idx]) ?
+ return (!idx || idx > pdo_cnt) ?
EC_ERROR_INVAL : EC_SUCCESS;
}
diff --git a/board/zinger/usb_pd_policy.c b/board/zinger/usb_pd_policy.c
index fd9cf8be7b..c210ce9cea 100644
--- a/board/zinger/usb_pd_policy.c
+++ b/board/zinger/usb_pd_policy.c
@@ -198,7 +198,7 @@ static int discharge_volt_idx;
/* output current measurement */
int vbus_amp;
-int pd_board_check_request(uint32_t rdo)
+int pd_board_check_request(uint32_t rdo, int pdo_cnt)
{
int idx = RDO_POS(rdo);
diff --git a/common/usb_pd_policy.c b/common/usb_pd_policy.c
index b1c4e17c92..87f6fbe3d1 100644
--- a/common/usb_pd_policy.c
+++ b/common/usb_pd_policy.c
@@ -40,13 +40,21 @@ int pd_check_requested_voltage(uint32_t rdo)
int idx = RDO_POS(rdo);
uint32_t pdo;
uint32_t pdo_ma;
+#if defined(CONFIG_USB_PD_DYNAMIC_SRC_CAP) || \
+ defined(CONFIG_USB_PD_MAX_SINGLE_SOURCE_CURRENT)
+ const uint32_t *src_pdo;
+ const int pdo_cnt = charge_manager_get_source_pdo(&src_pdo);
+#else
+ const uint32_t *src_pdo = pd_src_pdo;
+ const int pdo_cnt = pd_src_pdo_cnt;
+#endif
/* Board specific check for this request */
- if (pd_board_check_request(rdo))
+ if (pd_board_check_request(rdo, pdo_cnt))
return EC_ERROR_INVAL;
/* check current ... */
- pdo = pd_src_pdo[idx - 1];
+ pdo = src_pdo[idx - 1];
pdo_ma = (pdo & 0x3ff);
if (op_ma > pdo_ma)
return EC_ERROR_INVAL; /* too much op current */
@@ -61,15 +69,15 @@ int pd_check_requested_voltage(uint32_t rdo)
return EC_SUCCESS;
}
-static int stub_pd_board_check_request(uint32_t rdo)
+static int stub_pd_board_check_request(uint32_t rdo, int pdo_cnt)
{
int idx = RDO_POS(rdo);
/* Check for invalid index */
- return (!idx || idx > pd_src_pdo_cnt) ?
+ return (!idx || idx > pdo_cnt) ?
EC_ERROR_INVAL : EC_SUCCESS;
}
-int pd_board_check_request(uint32_t)
+int pd_board_check_request(uint32_t, int)
__attribute__((weak, alias("stub_pd_board_check_request")));
#ifdef CONFIG_USB_PD_DUAL_ROLE
diff --git a/include/usb_pd.h b/include/usb_pd.h
index 6ed339d94e..c588596e4c 100644
--- a/include/usb_pd.h
+++ b/include/usb_pd.h
@@ -919,9 +919,11 @@ int pd_check_requested_voltage(uint32_t rdo);
/**
* Run board specific checks on request message
*
+ * @param rdo the request data object word sent by the sink.
+ * @param pdo_cnt the total number of source PDOs.
* @return EC_SUCCESS if request is ok , <0 else.
*/
-int pd_board_check_request(uint32_t rdo);
+int pd_board_check_request(uint32_t rdo, int pdo_cnt);
/**
* Select a new output voltage.