@@ -46,6 +46,8 @@ struct ps8xxx_data {
46
46
/** Polarity of CC lines for PD and VCONN */
47
47
enum tc_cc_polarity cc_polarity ;
48
48
49
+ /** Boolean value if there was a change on the CC lines since last check */
50
+ bool cc_changed ;
49
51
/** State of CC1 line */
50
52
enum tc_cc_voltage_state cc1 ;
51
53
/** State of CC2 line */
@@ -107,6 +109,15 @@ int ps8xxx_tcpc_get_cc(const struct device *dev, enum tc_cc_voltage_state *cc1,
107
109
return - EIO ;
108
110
}
109
111
112
+ if (IS_ENABLED (CONFIG_USBC_CSM_SINK_ONLY ) && !data -> cc_changed ) {
113
+ * cc1 = data -> cc1 ;
114
+ * cc2 = data -> cc2 ;
115
+
116
+ return 0 ;
117
+ }
118
+
119
+ data -> cc_changed = false;
120
+
110
121
ret = tcpci_tcpm_get_cc (& cfg -> bus , cc1 , cc2 );
111
122
112
123
if (IS_ENABLED (CONFIG_USBC_CSM_SINK_ONLY ) || * cc1 != data -> cc1 || * cc2 != data -> cc2 ) {
@@ -123,6 +134,8 @@ int ps8xxx_tcpc_select_rp_value(const struct device *dev, enum tc_rp_value rp)
123
134
const struct ps8xxx_cfg * cfg = dev -> config ;
124
135
struct ps8xxx_data * data = dev -> data ;
125
136
137
+ data -> cc_changed = true;
138
+
126
139
return tcpci_update_reg8 (& cfg -> bus , TCPC_REG_ROLE_CTRL , TCPC_REG_ROLE_CTRL_RP_MASK ,
127
140
TCPC_REG_ROLE_CTRL_SET (0 , rp , 0 , 0 ));
128
141
}
@@ -148,6 +161,8 @@ int ps8xxx_tcpc_set_cc(const struct device *dev, enum tc_cc_pull pull)
148
161
return - EIO ;
149
162
}
150
163
164
+ data -> cc_changed = true;
165
+
151
166
return tcpci_update_reg8 (& cfg -> bus , TCPC_REG_ROLE_CTRL ,
152
167
TCPC_REG_ROLE_CTRL_CC1_MASK | TCPC_REG_ROLE_CTRL_CC2_MASK ,
153
168
TCPC_REG_ROLE_CTRL_SET (0 , 0 , pull , pull ));
@@ -188,6 +203,7 @@ int ps8xxx_tcpc_set_vconn(const struct device *dev, bool enable)
188
203
return - EIO ;
189
204
}
190
205
206
+ data -> cc_changed = true;
191
207
ret = tcpci_update_reg8 (& cfg -> bus , TCPC_REG_POWER_CTRL , TCPC_REG_POWER_CTRL_VCONN_EN ,
192
208
enable ? TCPC_REG_POWER_CTRL_VCONN_EN : 0 );
193
209
@@ -309,6 +325,7 @@ int ps8xxx_tcpc_set_cc_polarity(const struct device *dev, enum tc_cc_polarity po
309
325
return ret ;
310
326
}
311
327
328
+ data -> cc_changed = true;
312
329
data -> cc_polarity = polarity ;
313
330
return 0 ;
314
331
}
@@ -589,6 +606,7 @@ void ps8xxx_alert_work_cb(struct k_work *work)
589
606
if (alert_type == TCPC_ALERT_HARD_RESET_RECEIVED ) {
590
607
LOG_DBG ("PS8xxx hard rst received" );
591
608
tcpci_init_alert_mask (dev );
609
+ data -> cc_changed = true;
592
610
} else if (alert_type == TCPC_ALERT_FAULT_STATUS ) {
593
611
uint8_t fault ;
594
612
@@ -602,6 +620,7 @@ void ps8xxx_alert_work_cb(struct k_work *work)
602
620
tcpci_read_reg8 (& cfg -> bus , TCPC_REG_EXT_STATUS , & ext_status );
603
621
tcpci_write_reg8 (& cfg -> bus , TCPC_REG_EXT_STATUS , ext_status );
604
622
623
+ data -> cc_changed = true;
605
624
LOG_DBG ("PS8xxx ext status: %02x" , ext_status );
606
625
} else if (alert_type == TCPC_ALERT_POWER_STATUS ) {
607
626
uint8_t pwr_status ;
@@ -619,6 +638,8 @@ void ps8xxx_alert_work_cb(struct k_work *work)
619
638
LOG_DBG ("PS8xxx ext alert: %02x" , alert_status );
620
639
} else if (alert_type == TCPC_ALERT_MSG_STATUS ) {
621
640
data -> msg_pending = true;
641
+ } else if (alert_type == TCPC_ALERT_CC_STATUS ) {
642
+ data -> cc_changed = true;
622
643
}
623
644
624
645
if (data -> alert_handler != NULL ) {
@@ -711,6 +732,7 @@ static int ps8xxx_dev_init(const struct device *dev)
711
732
{ \
712
733
.dev = DEVICE_DT_GET(node), \
713
734
.init_retries = 0, \
735
+ .cc_changed = true, \
714
736
}
715
737
716
738
#define PS8XXX_DRIVER_CFG_INIT (node ) \
0 commit comments