summaryrefslogtreecommitdiff
path: root/common/usb_pd_tcpc.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/usb_pd_tcpc.c')
-rw-r--r--common/usb_pd_tcpc.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/common/usb_pd_tcpc.c b/common/usb_pd_tcpc.c
index d7314b1a53..5c42640d5b 100644
--- a/common/usb_pd_tcpc.c
+++ b/common/usb_pd_tcpc.c
@@ -227,6 +227,9 @@ static struct pd_port_controller {
uint8_t rx_enabled;
/* TCPC flags */
uint8_t flags;
+ /* Power status */
+ uint8_t power_status;
+ uint8_t power_status_mask;
/* Last received */
int rx_head[RX_BUFFER_SIZE+1];
@@ -958,6 +961,29 @@ int tcpc_set_polarity(int port, int polarity)
return EC_SUCCESS;
}
+#ifdef CONFIG_USB_PD_TCPM_VBUS
+static int tcpc_set_power_status(int port, int vbus_present)
+{
+ /* Update VBUS present bit */
+ if (vbus_present)
+ pd[port].power_status |= TCPC_REG_POWER_VBUS_PRES;
+ else
+ pd[port].power_status &= ~TCPC_REG_POWER_VBUS_PRES;
+
+ /* Set bit Port Power Status bit in Alert register */
+ if (pd[port].power_status_mask & TCPC_REG_POWER_VBUS_PRES)
+ alert(port, TCPC_REG_ALERT_POWER_STATUS);
+
+ return EC_SUCCESS;
+}
+#endif /* CONFIG_USB_PD_TCPM_VBUS */
+
+int tcpc_set_power_status_mask(int port, uint8_t mask)
+{
+ pd[port].power_status_mask = mask;
+ return EC_SUCCESS;
+}
+
int tcpc_set_vconn(int port, int enable)
{
#ifdef CONFIG_USBC_VCONN
@@ -1011,6 +1037,25 @@ int tcpc_get_message(int port, uint32_t *payload, int *head)
return EC_SUCCESS;
}
+
+#ifdef CONFIG_USB_PD_TCPM_VBUS
+void pd_vbus_evt_p0(enum gpio_signal signal)
+{
+ tcpc_set_power_status(TASK_ID_TO_PD_PORT(TASK_ID_PD_C0),
+ !gpio_get_level(GPIO_USB_C0_VBUS_WAKE_L));
+ task_wake(TASK_ID_PD_C0);
+}
+
+#if CONFIG_USB_PD_PORT_COUNT >= 2
+void pd_vbus_evt_p1(enum gpio_signal signal)
+{
+ tcpc_set_power_status(TASK_ID_TO_PD_PORT(TASK_ID_PD_C1),
+ !gpio_get_level(GPIO_USB_C1_VBUS_WAKE_L));
+ task_wake(TASK_ID_PD_C1);
+}
+#endif /* PD_PORT_COUNT >= 2 */
+#endif /* CONFIG_USB_PD_TCPM_VBUS */
+
#ifndef CONFIG_USB_POWER_DELIVERY
static void tcpc_i2c_write(int port, int reg, int len, uint8_t *payload)
{
@@ -1044,6 +1089,9 @@ static void tcpc_i2c_write(int port, int reg, int len, uint8_t *payload)
tcpc_set_rx_enable(port, payload[1] &
TCPC_REG_RX_DETECT_SOP_HRST_MASK);
break;
+ case TCPC_REG_POWER_STATUS_MASK:
+ tcpc_set_power_status_mask(port, payload[1]);
+ break;
case TCPC_REG_TX_HDR:
pd[port].tx_head = (payload[2] << 8) | payload[1];
break;
@@ -1114,6 +1162,9 @@ static int tcpc_i2c_read(int port, int reg, uint8_t *payload)
memcpy(payload, pd[port].rx_payload[pd[port].rx_buf_tail],
sizeof(pd[port].rx_payload[pd[port].rx_buf_tail]));
return sizeof(pd[port].rx_payload[pd[port].rx_buf_tail]);
+ case TCPC_REG_POWER_STATUS:
+ payload[0] = pd[port].power_status;
+ return 1;
case TCPC_REG_TX_BYTE_CNT:
payload[0] = PD_HEADER_CNT(pd[port].tx_head);
return 1;