summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--board/plankton/usb_pd_policy.c2
-rw-r--r--board/servo_v4/usb_pd_policy.c2
-rw-r--r--common/charge_manager.c24
-rw-r--r--common/usb_pd_policy.c4
-rw-r--r--common/usb_pd_protocol.c4
-rw-r--r--include/charge_manager.h5
-rw-r--r--include/usb_pd.h3
-rw-r--r--util/genvif.c2
8 files changed, 24 insertions, 22 deletions
diff --git a/board/plankton/usb_pd_policy.c b/board/plankton/usb_pd_policy.c
index 6db20d33cb..42dd5180f8 100644
--- a/board/plankton/usb_pd_policy.c
+++ b/board/plankton/usb_pd_policy.c
@@ -55,7 +55,7 @@ void board_set_source_cap(enum board_src_cap cap)
pd_src_pdo_idx = cap;
}
-int charge_manager_get_source_pdo(const uint32_t **src_pdo)
+int charge_manager_get_source_pdo(const uint32_t **src_pdo, const int port)
{
*src_pdo = pd_src_pdo;
return pd_src_pdo_cnts[pd_src_pdo_idx];
diff --git a/board/servo_v4/usb_pd_policy.c b/board/servo_v4/usb_pd_policy.c
index 019b35f763..011994a2c9 100644
--- a/board/servo_v4/usb_pd_policy.c
+++ b/board/servo_v4/usb_pd_policy.c
@@ -352,7 +352,7 @@ int board_select_rp_value(int port, int rp)
return pd_set_rp_rd(port, TYPEC_CC_RP, rp);
}
-int charge_manager_get_source_pdo(const uint32_t **src_pdo)
+int charge_manager_get_source_pdo(const uint32_t **src_pdo, const int port)
{
int pdo_cnt;
/*
diff --git a/common/charge_manager.c b/common/charge_manager.c
index 7b119da347..9d9226cb19 100644
--- a/common/charge_manager.c
+++ b/common/charge_manager.c
@@ -963,20 +963,20 @@ void charge_manager_source_port(int port, int enable)
}
}
-int charge_manager_get_source_pdo(const uint32_t **src_pdo)
+int charge_manager_get_source_pdo(const uint32_t **src_pdo, const int port)
{
- int p;
- int count = 0;
-
- /* count the number of connected sinks */
- for (p = 0; p < CONFIG_USB_PD_PORT_COUNT; p++)
- if (source_port_bitmap & (1 << p))
- count++;
-
- /* send the maximum current if we are sourcing only on one port */
- *src_pdo = count <= 1 ? pd_src_pdo_max : pd_src_pdo;
+ /* Are there any other connected sinks? */
+ if (source_port_bitmap & ~(1 << port)) {
+ *src_pdo = pd_src_pdo;
+ return pd_src_pdo_cnt;
+ }
- return count <= 1 ? pd_src_pdo_cnt : pd_src_pdo_max_cnt;
+ /*
+ * If not, send the maximum current since we're sourcing on only one
+ * port.
+ */
+ *src_pdo = pd_src_pdo_max;
+ return pd_src_pdo_max_cnt;
}
#endif /* CONFIG_USB_PD_MAX_SINGLE_SOURCE_CURRENT */
diff --git a/common/usb_pd_policy.c b/common/usb_pd_policy.c
index 62f9ecbfa5..cf58e7ff07 100644
--- a/common/usb_pd_policy.c
+++ b/common/usb_pd_policy.c
@@ -33,7 +33,7 @@
static int rw_flash_changed = 1;
-int pd_check_requested_voltage(uint32_t rdo)
+int pd_check_requested_voltage(uint32_t rdo, const int port)
{
int max_ma = rdo & 0x3FF;
int op_ma = (rdo >> 10) & 0x3FF;
@@ -43,7 +43,7 @@ int pd_check_requested_voltage(uint32_t rdo)
#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);
+ const int pdo_cnt = charge_manager_get_source_pdo(&src_pdo, port);
#else
const uint32_t *src_pdo = pd_src_pdo;
const int pdo_cnt = pd_src_pdo_cnt;
diff --git a/common/usb_pd_protocol.c b/common/usb_pd_protocol.c
index 2f701e6bfc..0526aaaf65 100644
--- a/common/usb_pd_protocol.c
+++ b/common/usb_pd_protocol.c
@@ -441,7 +441,7 @@ static int send_source_cap(int port)
#if defined(CONFIG_USB_PD_DYNAMIC_SRC_CAP) || \
defined(CONFIG_USB_PD_MAX_SINGLE_SOURCE_CURRENT)
const uint32_t *src_pdo;
- const int src_pdo_cnt = charge_manager_get_source_pdo(&src_pdo);
+ const int src_pdo_cnt = charge_manager_get_source_pdo(&src_pdo, port);
#else
const uint32_t *src_pdo = pd_src_pdo;
const int src_pdo_cnt = pd_src_pdo_cnt;
@@ -801,7 +801,7 @@ static void handle_data_request(int port, uint16_t head,
#endif /* CONFIG_USB_PD_DUAL_ROLE */
case PD_DATA_REQUEST:
if ((pd[port].power_role == PD_ROLE_SOURCE) && (cnt == 1))
- if (!pd_check_requested_voltage(payload[0])) {
+ if (!pd_check_requested_voltage(payload[0], port)) {
if (send_control(port, PD_CTRL_ACCEPT) < 0)
/*
* if we fail to send accept, do
diff --git a/include/charge_manager.h b/include/charge_manager.h
index 2137899a13..037723047c 100644
--- a/include/charge_manager.h
+++ b/include/charge_manager.h
@@ -161,10 +161,11 @@ void charge_manager_source_port(int port, int enable);
/**
* Get PD source power data objects.
*
- * @param src_pdo pointer to the data to return.
+ * @param src_pdo Pointer to the data to return.
+ * @param port Current port to evaluate against.
* @return number of PDOs returned.
*/
-int charge_manager_get_source_pdo(const uint32_t **src_pdo);
+int charge_manager_get_source_pdo(const uint32_t **src_pdo, const int port);
/* Board-level callback functions */
diff --git a/include/usb_pd.h b/include/usb_pd.h
index cefe8abe06..9deed54b88 100644
--- a/include/usb_pd.h
+++ b/include/usb_pd.h
@@ -942,9 +942,10 @@ int pd_is_valid_input_voltage(int mv);
* Request a new operating voltage.
*
* @param rdo Request Data Object with the selected operating point.
+ * @param port The port which the request came in on.
* @return EC_SUCCESS if we can get the requested voltage/OP, <0 else.
*/
-int pd_check_requested_voltage(uint32_t rdo);
+int pd_check_requested_voltage(uint32_t rdo, const int port);
/**
* Run board specific checks on request message
diff --git a/util/genvif.c b/util/genvif.c
index 6b3d685b37..865ae550df 100644
--- a/util/genvif.c
+++ b/util/genvif.c
@@ -48,7 +48,7 @@ enum system_image_copy_t system_get_image_copy(void)
static void init_src_pdos(void)
{
#ifdef CONFIG_USB_PD_DYNAMIC_SRC_CAP
- src_pdo_cnt = charge_manager_get_source_pdo(&src_pdo);
+ src_pdo_cnt = charge_manager_get_source_pdo(&src_pdo, 0);
#else
src_pdo_cnt = pd_src_pdo_cnt;
src_pdo = pd_src_pdo;