@@ -67,18 +67,12 @@ struct ps8xxx_cfg {
67
67
static int tcpci_init_alert_mask (const struct device * dev )
68
68
{
69
69
const struct ps8xxx_cfg * cfg = dev -> config ;
70
- int ret ;
71
70
72
71
uint16_t mask = TCPC_REG_ALERT_TX_COMPLETE | TCPC_REG_ALERT_RX_STATUS |
73
72
TCPC_REG_ALERT_RX_HARD_RST | TCPC_REG_ALERT_CC_STATUS |
74
73
TCPC_REG_ALERT_FAULT | TCPC_REG_ALERT_POWER_STATUS ;
75
74
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 );
82
76
}
83
77
84
78
static 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)
136
130
137
131
data -> cc_changed = true;
138
132
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 );
141
134
}
142
135
143
136
int ps8xxx_tcpc_get_rp_value (const struct device * dev , enum tc_rp_value * rp )
144
137
{
145
138
const struct ps8xxx_cfg * cfg = dev -> config ;
146
- uint8_t reg_value = 0 ;
147
- int ret ;
148
139
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 );
153
141
}
154
142
155
143
int 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)
163
151
164
152
data -> cc_changed = true;
165
153
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 );
169
155
}
170
156
171
157
void 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)
202
188
}
203
189
204
190
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 );
207
192
208
193
if (ret != 0 ) {
209
194
return ret ;
@@ -221,8 +206,7 @@ int ps8xxx_tcpc_set_roles(const struct device *dev, enum tc_power_role power_rol
221
206
{
222
207
const struct ps8xxx_cfg * cfg = dev -> config ;
223
208
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 );
226
210
}
227
211
228
212
int 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)
302
286
const struct ps8xxx_cfg * cfg = dev -> config ;
303
287
int detect_sop_en = enable ? TCPC_REG_RX_DETECT_SOP_HRST_MASK : 0 ;
304
288
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 );
306
290
}
307
291
308
292
int 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
315
299
return - EIO ;
316
300
}
317
301
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 );
321
303
322
304
if (ret != 0 ) {
323
305
return ret ;
@@ -332,90 +314,16 @@ int ps8xxx_tcpc_transmit_data(const struct device *dev, struct pd_msg *msg)
332
314
{
333
315
const struct ps8xxx_cfg * cfg = dev -> config ;
334
316
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 );
395
318
}
396
319
397
320
int ps8xxx_tcpc_dump_std_reg (const struct device * dev )
398
321
{
399
322
const struct ps8xxx_cfg * cfg = dev -> config ;
400
- uint16_t value ;
401
323
402
324
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
- }
417
325
418
- return 0 ;
326
+ return tcpci_tcpm_dump_std_reg ( & cfg -> bus ) ;
419
327
}
420
328
421
329
void 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
490
398
return - EIO ;
491
399
}
492
400
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 );
496
402
497
403
/* Vendor specific register for PS8815 model only */
498
404
if (chip_info -> product_id == PS8815_PRODUCT_ID ) {
@@ -596,7 +502,7 @@ void ps8xxx_alert_work_cb(struct k_work *work)
596
502
return ;
597
503
}
598
504
599
- tcpci_read_reg16 (& cfg -> bus , TCPC_REG_ALERT , & alert_reg );
505
+ tcpci_tcpm_get_status_register (& cfg -> bus , TCPC_ALERT_STATUS , & alert_reg );
600
506
601
507
while (alert_reg != 0 ) {
602
508
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)
608
514
} else if (alert_type == TCPC_ALERT_FAULT_STATUS ) {
609
515
uint8_t fault ;
610
516
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 );
613
521
614
522
LOG_DBG ("PS8xxx fault: %02x" , fault );
615
523
} else if (alert_type == TCPC_ALERT_EXTENDED_STATUS ) {
616
524
uint8_t ext_status ;
617
525
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 );
620
530
621
531
data -> cc_changed = true;
622
532
LOG_DBG ("PS8xxx ext status: %02x" , ext_status );
623
533
} else if (alert_type == TCPC_ALERT_POWER_STATUS ) {
624
534
uint8_t pwr_status ;
625
535
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 );
628
540
629
541
LOG_DBG ("PS8xxx power status: %02x" , pwr_status );
630
542
} else if (alert_type == TCPC_ALERT_EXTENDED ) {
631
543
uint8_t alert_status ;
632
544
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 );
635
549
636
550
LOG_DBG ("PS8xxx ext alert: %02x" , alert_status );
637
551
} else if (alert_type == TCPC_ALERT_MSG_STATUS ) {
@@ -641,16 +555,16 @@ void ps8xxx_alert_work_cb(struct k_work *work)
641
555
}
642
556
643
557
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 );
645
559
}
646
560
647
561
clear_flags |= BIT (alert_type );
648
562
alert_reg &= ~BIT (alert_type );
649
563
}
650
564
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 );
652
567
653
- tcpci_read_reg16 (& cfg -> bus , TCPC_REG_ALERT , & alert_reg );
654
568
if (alert_reg != 0 ) {
655
569
k_work_submit (work );
656
570
}
@@ -663,14 +577,12 @@ void ps8xxx_init_work_cb(struct k_work *work)
663
577
664
578
const struct ps8xxx_cfg * cfg = data -> dev -> config ;
665
579
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 ;
670
582
671
583
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 )) {
674
586
data -> init_retries ++ ;
675
587
676
588
if (data -> init_retries > CONFIG_USBC_TCPC_PS8XXX_INIT_RETRIES ) {
@@ -679,16 +591,14 @@ void ps8xxx_init_work_cb(struct k_work *work)
679
591
}
680
592
681
593
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 ));
684
595
685
596
return ;
686
597
}
687
598
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 );
692
602
693
603
/* Initialize alert interrupt */
694
604
gpio_pin_configure_dt (& cfg -> alert_gpio , GPIO_INPUT );
@@ -718,8 +628,7 @@ static int ps8xxx_dev_init(const struct device *dev)
718
628
}
719
629
720
630
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 ));
723
632
724
633
k_work_init (& data -> alert_work , ps8xxx_alert_work_cb );
725
634
0 commit comments