@@ -67,18 +67,12 @@ struct ps8xxx_cfg {
6767static int tcpci_init_alert_mask (const struct device * dev )
6868{
6969 const struct ps8xxx_cfg * cfg = dev -> config ;
70- int ret ;
7170
7271 uint16_t mask = TCPC_REG_ALERT_TX_COMPLETE | TCPC_REG_ALERT_RX_STATUS |
7372 TCPC_REG_ALERT_RX_HARD_RST | TCPC_REG_ALERT_CC_STATUS |
7473 TCPC_REG_ALERT_FAULT | TCPC_REG_ALERT_POWER_STATUS ;
7574
76- ret = tcpci_write_reg16 (& cfg -> bus , TCPC_REG_ALERT_MASK , mask );
77- if (ret != 0 ) {
78- return ret ;
79- }
80-
81- return 0 ;
75+ return tcpci_tcpm_mask_status_register (& cfg -> bus , TCPC_ALERT_STATUS , mask );
8276}
8377
8478static int ps8xxx_tcpc_init (const struct device * dev )
@@ -136,20 +130,14 @@ int ps8xxx_tcpc_select_rp_value(const struct device *dev, enum tc_rp_value rp)
136130
137131 data -> cc_changed = true;
138132
139- return tcpci_update_reg8 (& cfg -> bus , TCPC_REG_ROLE_CTRL , TCPC_REG_ROLE_CTRL_RP_MASK ,
140- TCPC_REG_ROLE_CTRL_SET (0 , rp , 0 , 0 ));
133+ return tcpci_tcpm_select_rp_value (& cfg -> bus , rp );
141134}
142135
143136int ps8xxx_tcpc_get_rp_value (const struct device * dev , enum tc_rp_value * rp )
144137{
145138 const struct ps8xxx_cfg * cfg = dev -> config ;
146- uint8_t reg_value = 0 ;
147- int ret ;
148139
149- ret = tcpci_read_reg8 (& cfg -> bus , TCPC_REG_ROLE_CTRL , & reg_value );
150- * rp = TCPC_REG_ROLE_CTRL_RP (reg_value );
151-
152- return ret ;
140+ return tcpci_tcpm_get_rp_value (& cfg -> bus , rp );
153141}
154142
155143int ps8xxx_tcpc_set_cc (const struct device * dev , enum tc_cc_pull pull )
@@ -163,9 +151,7 @@ int ps8xxx_tcpc_set_cc(const struct device *dev, enum tc_cc_pull pull)
163151
164152 data -> cc_changed = true;
165153
166- return tcpci_update_reg8 (& cfg -> bus , TCPC_REG_ROLE_CTRL ,
167- TCPC_REG_ROLE_CTRL_CC1_MASK | TCPC_REG_ROLE_CTRL_CC2_MASK ,
168- TCPC_REG_ROLE_CTRL_SET (0 , 0 , pull , pull ));
154+ return tcpci_tcpm_set_cc (& cfg -> bus , pull );
169155}
170156
171157void ps8xxx_tcpc_set_vconn_discharge_cb (const struct device * dev , tcpc_vconn_discharge_cb_t cb )
@@ -202,8 +188,7 @@ int ps8xxx_tcpc_set_vconn(const struct device *dev, bool enable)
202188 }
203189
204190 data -> cc_changed = true;
205- ret = tcpci_update_reg8 (& cfg -> bus , TCPC_REG_POWER_CTRL , TCPC_REG_POWER_CTRL_VCONN_EN ,
206- enable ? TCPC_REG_POWER_CTRL_VCONN_EN : 0 );
191+ ret = tcpci_tcpm_set_vconn (& cfg -> bus , enable );
207192
208193 if (ret != 0 ) {
209194 return ret ;
@@ -221,8 +206,7 @@ int ps8xxx_tcpc_set_roles(const struct device *dev, enum tc_power_role power_rol
221206{
222207 const struct ps8xxx_cfg * cfg = dev -> config ;
223208
224- return tcpci_update_reg8 (& cfg -> bus , TCPC_REG_MSG_HDR_INFO , TCPC_REG_MSG_HDR_INFO_ROLES_MASK ,
225- TCPC_REG_MSG_HDR_INFO_SET (PD_REV30 , data_role , power_role ));
209+ return tcpci_tcpm_set_roles (& cfg -> bus , PD_REV30 , power_role , data_role );
226210}
227211
228212int ps8xxx_tcpc_get_rx_pending_msg (const struct device * dev , struct pd_msg * msg )
@@ -302,7 +286,7 @@ int ps8xxx_tcpc_set_rx_enable(const struct device *dev, bool enable)
302286 const struct ps8xxx_cfg * cfg = dev -> config ;
303287 int detect_sop_en = enable ? TCPC_REG_RX_DETECT_SOP_HRST_MASK : 0 ;
304288
305- return tcpci_write_reg8 (& cfg -> bus , TCPC_REG_RX_DETECT , detect_sop_en );
289+ return tcpci_tcpm_set_rx_type (& cfg -> bus , detect_sop_en );
306290}
307291
308292int ps8xxx_tcpc_set_cc_polarity (const struct device * dev , enum tc_cc_polarity polarity )
@@ -315,9 +299,7 @@ int ps8xxx_tcpc_set_cc_polarity(const struct device *dev, enum tc_cc_polarity po
315299 return - EIO ;
316300 }
317301
318- ret = tcpci_update_reg8 (
319- & cfg -> bus , TCPC_REG_TCPC_CTRL , TCPC_REG_TCPC_CTRL_PLUG_ORIENTATION ,
320- (polarity == TC_POLARITY_CC1 ) ? 0 : TCPC_REG_TCPC_CTRL_PLUG_ORIENTATION );
302+ ret = tcpci_tcpm_set_cc_polarity (& cfg -> bus , polarity );
321303
322304 if (ret != 0 ) {
323305 return ret ;
@@ -332,90 +314,16 @@ int ps8xxx_tcpc_transmit_data(const struct device *dev, struct pd_msg *msg)
332314{
333315 const struct ps8xxx_cfg * cfg = dev -> config ;
334316
335- int reg = TCPC_REG_TX_BUFFER ;
336- int rv ;
337- int cnt = 4 * msg -> header .number_of_data_objects ;
338-
339- /* If not SOP* transmission, just write to the transmit register */
340- if (msg -> header .message_type >= NUM_SOP_STAR_TYPES ) {
341- /*
342- * Per TCPCI spec, do not specify retry (although the TCPC
343- * should ignore retry field for these 3 types).
344- */
345- return tcpci_write_reg8 (
346- & cfg -> bus , TCPC_REG_TRANSMIT ,
347- TCPC_REG_TRANSMIT_SET_WITHOUT_RETRY (msg -> header .message_type ));
348- }
349-
350- if (cnt > 0 ) {
351- reg = TCPC_REG_TX_BUFFER ;
352- /* TX_BYTE_CNT includes extra bytes for message header */
353- cnt += sizeof (msg -> header .raw_value );
354-
355- struct i2c_msg buf [3 ];
356-
357- uint8_t tmp [2 ] = {TCPC_REG_TX_BUFFER , cnt };
358-
359- buf [0 ].buf = tmp ;
360- buf [0 ].len = 2 ;
361- buf [0 ].flags = I2C_MSG_WRITE ;
362-
363- buf [1 ].buf = (uint8_t * )& msg -> header .raw_value ;
364- buf [1 ].len = sizeof (msg -> header .raw_value );
365- buf [1 ].flags = I2C_MSG_WRITE ;
366-
367- buf [2 ].buf = (uint8_t * )msg -> data ;
368- buf [2 ].len = msg -> len ;
369- buf [2 ].flags = I2C_MSG_WRITE | I2C_MSG_STOP ;
370-
371- if (cnt > sizeof (msg -> header .raw_value )) {
372- rv = i2c_transfer (cfg -> bus .bus , buf , 3 , cfg -> bus .addr );
373- } else {
374- buf [1 ].flags |= I2C_MSG_STOP ;
375- rv = i2c_transfer (cfg -> bus .bus , buf , 2 , cfg -> bus .addr );
376- }
377-
378- /* If tcpc write fails, return error */
379- if (rv ) {
380- return rv ;
381- }
382- }
383-
384- /*
385- * We always retry in TCPC hardware since the TCPM is too slow to
386- * respond within tRetry (~195 usec).
387- *
388- * The retry count used is dependent on the maximum PD revision
389- * supported at build time.
390- */
391- rv = tcpci_write_reg8 (& cfg -> bus , TCPC_REG_TRANSMIT ,
392- TCPC_REG_TRANSMIT_SET_WITH_RETRY (cfg -> transmit_retries , msg -> type ));
393-
394- return rv ;
317+ return tcpci_tcpm_transmit_data (& cfg -> bus , msg , cfg -> transmit_retries );
395318}
396319
397320int ps8xxx_tcpc_dump_std_reg (const struct device * dev )
398321{
399322 const struct ps8xxx_cfg * cfg = dev -> config ;
400- uint16_t value ;
401323
402324 LOG_INF ("TCPC %s:%s registers:" , cfg -> bus .bus -> name , dev -> name );
403- for (unsigned int a = 0 ; a < TCPCI_STD_REGS_SIZE ; a ++ ) {
404- switch (tcpci_std_regs [a ].size ) {
405- case 1 :
406- tcpci_read_reg8 (& cfg -> bus , tcpci_std_regs [a ].addr , (uint8_t * )& value );
407- LOG_INF ("- %-30s(0x%02x) = 0x%02x" , tcpci_std_regs [a ].name ,
408- tcpci_std_regs [a ].addr , (uint8_t )value );
409- break ;
410- case 2 :
411- tcpci_read_reg16 (& cfg -> bus , tcpci_std_regs [a ].addr , & value );
412- LOG_INF ("- %-30s(0x%02x) = 0x%04x" , tcpci_std_regs [a ].name ,
413- tcpci_std_regs [a ].addr , value );
414- break ;
415- }
416- }
417325
418- return 0 ;
326+ return tcpci_tcpm_dump_std_reg ( & cfg -> bus ) ;
419327}
420328
421329void ps8xxx_tcpc_alert_handler_cb (const struct device * dev , void * data , enum tcpc_alert alert )
@@ -490,9 +398,7 @@ int ps8xxx_tcpc_get_chip_info(const struct device *dev, struct tcpc_chip_info *c
490398 return - EIO ;
491399 }
492400
493- ret |= tcpci_read_reg16 (& cfg -> bus , TCPC_REG_VENDOR_ID , & chip_info -> vendor_id );
494- ret |= tcpci_read_reg16 (& cfg -> bus , TCPC_REG_PRODUCT_ID , & chip_info -> product_id );
495- ret |= tcpci_read_reg16 (& cfg -> bus , TCPC_REG_BCD_DEV , & chip_info -> device_id );
401+ ret = tcpci_tcpm_get_chip_info (& cfg -> bus , chip_info );
496402
497403 /* Vendor specific register for PS8815 model only */
498404 if (chip_info -> product_id == PS8815_PRODUCT_ID ) {
@@ -596,7 +502,7 @@ void ps8xxx_alert_work_cb(struct k_work *work)
596502 return ;
597503 }
598504
599- tcpci_read_reg16 (& cfg -> bus , TCPC_REG_ALERT , & alert_reg );
505+ tcpci_tcpm_get_status_register (& cfg -> bus , TCPC_ALERT_STATUS , & alert_reg );
600506
601507 while (alert_reg != 0 ) {
602508 enum tcpc_alert alert_type = tcpci_alert_reg_to_enum (alert_reg );
@@ -608,30 +514,38 @@ void ps8xxx_alert_work_cb(struct k_work *work)
608514 } else if (alert_type == TCPC_ALERT_FAULT_STATUS ) {
609515 uint8_t fault ;
610516
611- tcpci_read_reg8 (& cfg -> bus , TCPC_REG_FAULT_STATUS , & fault );
612- tcpci_write_reg8 (& cfg -> bus , TCPC_REG_FAULT_STATUS , fault );
517+ tcpci_tcpm_get_status_register (& cfg -> bus , TCPC_FAULT_STATUS ,
518+ (uint16_t * )& fault );
519+ tcpci_tcpm_clear_status_register (& cfg -> bus , TCPC_FAULT_STATUS ,
520+ (uint16_t )fault );
613521
614522 LOG_DBG ("PS8xxx fault: %02x" , fault );
615523 } else if (alert_type == TCPC_ALERT_EXTENDED_STATUS ) {
616524 uint8_t ext_status ;
617525
618- tcpci_read_reg8 (& cfg -> bus , TCPC_REG_EXT_STATUS , & ext_status );
619- tcpci_write_reg8 (& cfg -> bus , TCPC_REG_EXT_STATUS , ext_status );
526+ tcpci_tcpm_get_status_register (& cfg -> bus , TCPC_EXTENDED_STATUS ,
527+ (uint16_t * )& ext_status );
528+ tcpci_tcpm_clear_status_register (& cfg -> bus , TCPC_EXTENDED_STATUS ,
529+ (uint16_t )ext_status );
620530
621531 data -> cc_changed = true;
622532 LOG_DBG ("PS8xxx ext status: %02x" , ext_status );
623533 } else if (alert_type == TCPC_ALERT_POWER_STATUS ) {
624534 uint8_t pwr_status ;
625535
626- tcpci_read_reg8 (& cfg -> bus , TCPC_REG_POWER_STATUS , & pwr_status );
627- tcpci_write_reg8 (& cfg -> bus , TCPC_REG_POWER_STATUS , pwr_status );
536+ tcpci_tcpm_get_status_register (& cfg -> bus , TCPC_POWER_STATUS ,
537+ (uint16_t * )& pwr_status );
538+ tcpci_tcpm_clear_status_register (& cfg -> bus , TCPC_POWER_STATUS ,
539+ (uint16_t )pwr_status );
628540
629541 LOG_DBG ("PS8xxx power status: %02x" , pwr_status );
630542 } else if (alert_type == TCPC_ALERT_EXTENDED ) {
631543 uint8_t alert_status ;
632544
633- tcpci_read_reg8 (& cfg -> bus , TCPC_REG_ALERT_EXT , & alert_status );
634- tcpci_write_reg8 (& cfg -> bus , TCPC_REG_ALERT_EXT , alert_status );
545+ tcpci_tcpm_get_status_register (& cfg -> bus , TCPC_EXTENDED_ALERT_STATUS ,
546+ (uint16_t * )& alert_status );
547+ tcpci_tcpm_clear_status_register (& cfg -> bus , TCPC_EXTENDED_ALERT_STATUS ,
548+ (uint16_t )alert_status );
635549
636550 LOG_DBG ("PS8xxx ext alert: %02x" , alert_status );
637551 } else if (alert_type == TCPC_ALERT_MSG_STATUS ) {
@@ -641,16 +555,16 @@ void ps8xxx_alert_work_cb(struct k_work *work)
641555 }
642556
643557 if (data -> alert_handler != NULL ) {
644- data -> alert_handler (data -> dev , data -> alert_handler_data , alert_type );
558+ data -> alert_handler (dev , data -> alert_handler_data , alert_type );
645559 }
646560
647561 clear_flags |= BIT (alert_type );
648562 alert_reg &= ~BIT (alert_type );
649563 }
650564
651- tcpci_write_reg16 (& cfg -> bus , TCPC_REG_ALERT , clear_flags );
565+ tcpci_tcpm_clear_status_register (& cfg -> bus , TCPC_ALERT_STATUS , clear_flags );
566+ tcpci_tcpm_get_status_register (& cfg -> bus , TCPC_ALERT_STATUS , & alert_reg );
652567
653- tcpci_read_reg16 (& cfg -> bus , TCPC_REG_ALERT , & alert_reg );
654568 if (alert_reg != 0 ) {
655569 k_work_submit (work );
656570 }
@@ -663,14 +577,12 @@ void ps8xxx_init_work_cb(struct k_work *work)
663577
664578 const struct ps8xxx_cfg * cfg = data -> dev -> config ;
665579 uint8_t power_reg = 0 ;
666- uint16_t idVendor = 0 ;
667- uint16_t idProduct = 0 ;
668- uint16_t idDevice = 0 ;
669- int res ;
580+ struct tcpc_chip_info chip_info ;
581+ int ret ;
670582
671583 LOG_INF ("Initializing PS8xxx chip: %s" , data -> dev -> name );
672- res = tcpci_read_reg8 (& cfg -> bus , TCPC_REG_POWER_STATUS , & power_reg );
673- if (res != 0 || (power_reg & TCPC_REG_POWER_STATUS_UNINIT )) {
584+ ret = tcpci_tcpm_get_status_register (& cfg -> bus , TCPC_POWER_STATUS , ( uint16_t * ) & power_reg );
585+ if (ret != 0 || (power_reg & TCPC_REG_POWER_STATUS_UNINIT )) {
674586 data -> init_retries ++ ;
675587
676588 if (data -> init_retries > CONFIG_USBC_TCPC_PS8XXX_INIT_RETRIES ) {
@@ -679,16 +591,14 @@ void ps8xxx_init_work_cb(struct k_work *work)
679591 }
680592
681593 LOG_DBG ("Postpone chip initialization %d" , data -> init_retries );
682- k_work_schedule_for_queue (& k_sys_work_q , & data -> init_dwork ,
683- K_MSEC (CONFIG_USBC_TCPC_PS8XXX_INIT_DELAY ));
594+ k_work_schedule (& data -> init_dwork , K_MSEC (CONFIG_USBC_TCPC_PS8XXX_INIT_DELAY ));
684595
685596 return ;
686597 }
687598
688- tcpci_read_reg16 (& cfg -> bus , TCPC_REG_VENDOR_ID , & idVendor );
689- tcpci_read_reg16 (& cfg -> bus , TCPC_REG_PRODUCT_ID , & idProduct );
690- tcpci_read_reg16 (& cfg -> bus , TCPC_REG_BCD_DEV , & idDevice );
691- LOG_INF ("Initialized chip is: %04x:%04x:%04x" , idVendor , idProduct , idDevice );
599+ ps8xxx_tcpc_get_chip_info (data -> dev , & chip_info );
600+ LOG_INF ("Initialized chip is: %04x:%04x:%04x" , chip_info .vendor_id , chip_info .product_id ,
601+ chip_info .device_id );
692602
693603 /* Initialize alert interrupt */
694604 gpio_pin_configure_dt (& cfg -> alert_gpio , GPIO_INPUT );
@@ -718,8 +628,7 @@ static int ps8xxx_dev_init(const struct device *dev)
718628 }
719629
720630 k_work_init_delayable (& data -> init_dwork , ps8xxx_init_work_cb );
721- k_work_schedule_for_queue (& k_sys_work_q , & data -> init_dwork ,
722- K_MSEC (CONFIG_USBC_TCPC_PS8XXX_INIT_DELAY ));
631+ k_work_schedule (& data -> init_dwork , K_MSEC (CONFIG_USBC_TCPC_PS8XXX_INIT_DELAY ));
723632
724633 k_work_init (& data -> alert_work , ps8xxx_alert_work_cb );
725634
0 commit comments