Skip to content

Commit 416bf22

Browse files
recalcikartben
authored andcommitted
drivers: tcpc: Modify the ps8xxx.c
This commit modifies the ps8xxx.c driver to use the generic TCPCI function. Signed-off-by: Jianxiong Gu <[email protected]>
1 parent 391008b commit 416bf22

File tree

1 file changed

+40
-131
lines changed

1 file changed

+40
-131
lines changed

drivers/usb_c/tcpc/ps8xxx.c

Lines changed: 40 additions & 131 deletions
Original file line numberDiff line numberDiff line change
@@ -67,18 +67,12 @@ struct ps8xxx_cfg {
6767
static 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

8478
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)
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

143136
int 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

155143
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)
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

171157
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)
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

228212
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)
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

308292
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
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

397320
int 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

421329
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
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

Comments
 (0)