summaryrefslogtreecommitdiff
path: root/board/coffeecake/usb_pd_policy.c
diff options
context:
space:
mode:
Diffstat (limited to 'board/coffeecake/usb_pd_policy.c')
-rw-r--r--board/coffeecake/usb_pd_policy.c56
1 files changed, 47 insertions, 9 deletions
diff --git a/board/coffeecake/usb_pd_policy.c b/board/coffeecake/usb_pd_policy.c
index 2b9e9d60d3..e6150dea63 100644
--- a/board/coffeecake/usb_pd_policy.c
+++ b/board/coffeecake/usb_pd_policy.c
@@ -5,6 +5,7 @@
#include "adc.h"
#include "board.h"
+#include "charger/sy21612.h"
#include "common.h"
#include "console.h"
#include "ec_commands.h"
@@ -22,15 +23,28 @@
#define CPRINTF(format, args...) cprintf(CC_USBPD, format, ## args)
#define CPRINTS(format, args...) cprints(CC_USBPD, format, ## args)
-#define PDO_FIXED_FLAGS PDO_FIXED_COMM_CAP
+#define PDO_FIXED_FLAGS (PDO_FIXED_DUAL_ROLE | PDO_FIXED_DATA_SWAP |\
+ PDO_FIXED_COMM_CAP)
-/* Source PDOs */
-const uint32_t pd_src_pdo[] = {};
+
+/* Voltage indexes for the PDOs */
+enum volt_idx {
+ PDO_IDX_5V = 0,
+ PDO_IDX_9V = 1,
+ /* TODO: add PPS support */
+ PDO_IDX_COUNT
+};
+
+/* PDOs */
+const uint32_t pd_src_pdo[] = {
+ [PDO_IDX_5V] = PDO_FIXED(5000, 3000, PDO_FIXED_FLAGS),
+ [PDO_IDX_9V] = PDO_FIXED(9000, 3000, PDO_FIXED_FLAGS),
+};
const int pd_src_pdo_cnt = ARRAY_SIZE(pd_src_pdo);
+BUILD_ASSERT(ARRAY_SIZE(pd_src_pdo) == PDO_IDX_COUNT);
-/* Fake PDOs : we just want our pre-defined voltages */
const uint32_t pd_snk_pdo[] = {
- PDO_FIXED(5000, 500, PDO_FIXED_FLAGS),
+ PDO_FIXED(5000, 1500, PDO_FIXED_FLAGS),
};
const int pd_snk_pdo_cnt = ARRAY_SIZE(pd_snk_pdo);
@@ -52,16 +66,35 @@ int pd_is_valid_input_voltage(int mv)
void pd_transition_voltage(int idx)
{
- /* No operation: sink only */
+ /* TODO: discharge, PPS */
+ switch (idx - 1) {
+ case PDO_IDX_9V:
+ board_set_usb_output_voltage(9000);
+ break;
+ case PDO_IDX_5V:
+ default:
+ board_set_usb_output_voltage(5000);
+ break;
+ }
}
int pd_set_power_supply_ready(int port)
{
+ sy21612_set_sink_mode(1);
+ sy21612_set_vbus_volt(SY21612_VBUS_9V);
+ sy21612_set_adc_mode(1);
+ sy21612_enable_adc(1);
+ sy21612_set_vbus_discharge(1);
return EC_SUCCESS;
}
void pd_power_supply_reset(int port)
{
+ sy21612_set_sink_mode(0);
+ sy21612_set_vbus_volt(SY21612_VBUS_9V);
+ sy21612_set_adc_mode(1);
+ sy21612_enable_adc(1);
+ sy21612_set_vbus_discharge(1);
}
int pd_snk_is_vbus_provided(int port)
@@ -82,21 +115,26 @@ int pd_check_power_swap(int port)
int pd_check_data_swap(int port, int data_role)
{
- /* Always refuse data swap */
- return 0;
+ /* We can swap to UFP */
+ return data_role == PD_ROLE_DFP;
}
void pd_execute_data_swap(int port, int data_role)
{
- /* Do nothing */
+ /* TODO: turn on pp5000, pp3300 */
}
void pd_check_pr_role(int port, int pr_role, int flags)
{
+ if (pr_role == PD_ROLE_UFP && !gpio_get_level(GPIO_AC_PRESENT_L))
+ pd_request_power_swap(port);
+
}
void pd_check_dr_role(int port, int dr_role, int flags)
{
+ if ((flags & PD_FLAGS_PARTNER_DR_DATA) && dr_role == PD_ROLE_DFP)
+ pd_request_data_swap(port);
}
/* ----------------- Vendor Defined Messages ------------------ */
const uint32_t vdo_idh = VDO_IDH(0, /* data caps as USB host */