return 0;
}
+static int tcpci_vbus_detect(struct tcpc_dev *tcpc, bool enable)
+{
+ struct tcpci *tcpci = tcpc_to_tcpci(tcpc);
+ int ret;
+
+ if (enable) {
+ ret = regmap_write(tcpci->regmap, TCPC_COMMAND,
+ TCPC_CMD_ENABLE_VBUS_DETECT);
+ if (ret < 0)
+ return ret;
+ } else {
+ ret = regmap_write(tcpci->regmap, TCPC_COMMAND,
+ TCPC_CMD_DISABLE_VBUS_DETECT);
+ if (ret < 0)
+ return ret;
+ }
+
+ return 0;
+}
+
static int tcpci_init(struct tcpc_dev *tcpc)
{
struct tcpci *tcpci = tcpc_to_tcpci(tcpc);
tcpci->tcpc.set_polarity = tcpci_set_polarity;
tcpci->tcpc.set_vconn = tcpci_set_vconn;
tcpci->tcpc.start_drp_toggling = tcpci_start_drp_toggling;
+ tcpci->tcpc.vbus_detect = tcpci_vbus_detect;
tcpci->tcpc.set_pd_rx = tcpci_set_pd_rx;
tcpci->tcpc.set_roles = tcpci_set_roles;
tcpm_detach(port);
}
+static void tcpm_vbus_det(struct tcpm_port *port, bool enable)
+{
+ if (port->tcpc && port->tcpc->vbus_detect)
+ port->tcpc->vbus_detect(port->tcpc, true);
+}
+
static inline enum tcpm_state hard_reset_state(struct tcpm_port *port)
{
if (port->hard_reset_count < PD_N_HARD_RESET_COUNT)
if ((port->cc1 == TYPEC_CC_OPEN &&
port->cc2 != TYPEC_CC_OPEN) ||
(port->cc1 != TYPEC_CC_OPEN &&
- port->cc2 == TYPEC_CC_OPEN))
+ port->cc2 == TYPEC_CC_OPEN)) {
tcpm_set_state(port, SNK_DEBOUNCED,
PD_T_CC_DEBOUNCE);
- else if (tcpm_port_is_disconnected(port))
+ tcpm_vbus_det(port, true);
+ } else if (tcpm_port_is_disconnected(port))
tcpm_set_state(port, SNK_UNATTACHED,
PD_T_PD_DEBOUNCE);
break;
int (*try_role)(struct tcpc_dev *dev, int role);
int (*pd_transmit)(struct tcpc_dev *dev, enum tcpm_transmit_type type,
const struct pd_message *msg);
+ int (*vbus_detect)(struct tcpc_dev *dev, bool enable);
struct tcpc_mux_dev *mux;
};