Lines Matching full:tcpci

16 #include "tcpci.h"
29 struct tcpci { struct
44 struct tcpci *tcpci; argument
48 static inline struct tcpci *tcpc_to_tcpci(struct tcpc_dev *tcpc) in tcpc_to_tcpci()
50 return container_of(tcpc, struct tcpci, tcpc); in tcpc_to_tcpci()
53 static int tcpci_read16(struct tcpci *tcpci, unsigned int reg, u16 *val) in tcpci_read16() argument
58 ret = dm_i2c_read(tcpci->dev, reg, buffer, 2); in tcpci_read16()
70 static int tcpci_block_read(struct tcpci *tcpci, unsigned int reg, in tcpci_block_read() argument
75 ret = dm_i2c_read(tcpci->dev, reg, data, length); in tcpci_block_read()
83 static int tcpci_write16(struct tcpci *tcpci, unsigned int reg, u16 val) in tcpci_write16() argument
90 ret = dm_i2c_write(tcpci->dev, reg, buffer, 2); in tcpci_write16()
98 static int tcpci_block_write(struct tcpci *tcpci, unsigned int reg, in tcpci_block_write() argument
103 ret = dm_i2c_write(tcpci->dev, reg, data, length); in tcpci_block_write()
113 struct tcpci *tcpci = tcpc_to_tcpci(tcpc); in tcpci_set_cc() local
151 ret = dm_i2c_reg_write(tcpci->dev, TCPC_ROLE_CTRL, reg); in tcpci_set_cc()
163 struct tcpci *tcpci = tcpc_to_tcpci(tcpc); in tcpci_start_toggling() local
170 if (tcpci->data->start_drp_toggling) { in tcpci_start_toggling()
171 ret = tcpci->data->start_drp_toggling(tcpci, tcpci->data, cc); in tcpci_start_toggling()
198 ret = dm_i2c_reg_write(tcpci->dev, TCPC_ROLE_CTRL, reg); in tcpci_start_toggling()
201 return dm_i2c_reg_write(tcpci->dev, TCPC_COMMAND, in tcpci_start_toggling()
225 struct tcpci *tcpci = tcpc_to_tcpci(tcpc); in tcpci_get_cc() local
228 role_control = dm_i2c_reg_read(tcpci->dev, TCPC_ROLE_CTRL); in tcpci_get_cc()
232 reg = dm_i2c_reg_read(tcpci->dev, TCPC_CC_STATUS); in tcpci_get_cc()
251 struct tcpci *tcpci = tcpc_to_tcpci(tcpc); in tcpci_set_polarity() local
257 reg = dm_i2c_reg_read(tcpci->dev, TCPC_ROLE_CTRL); in tcpci_set_polarity()
299 ret = dm_i2c_reg_write(tcpci->dev, TCPC_ROLE_CTRL, reg); in tcpci_set_polarity()
303 return dm_i2c_reg_write(tcpci->dev, TCPC_TCPC_CTRL, in tcpci_set_polarity()
310 struct tcpci *tcpci = tcpc_to_tcpci(tcpc); in tcpci_set_vconn() local
315 if (tcpci->data->set_vconn) { in tcpci_set_vconn()
316 ret = tcpci->data->set_vconn(tcpci, tcpci->data, enable); in tcpci_set_vconn()
321 reg = dm_i2c_reg_read(tcpci->dev, TCPC_POWER_CTRL); in tcpci_set_vconn()
326 return dm_i2c_reg_write(tcpci->dev, TCPC_POWER_CTRL, reg); in tcpci_set_vconn()
332 struct tcpci *tcpci = tcpc_to_tcpci(tcpc); in tcpci_set_roles() local
341 ret = dm_i2c_reg_write(tcpci->dev, TCPC_MSG_HDR_INFO, reg); in tcpci_set_roles()
350 struct tcpci *tcpci = tcpc_to_tcpci(tcpc); in tcpci_set_pd_rx() local
356 ret = dm_i2c_reg_write(tcpci->dev, TCPC_RX_DETECT, reg); in tcpci_set_pd_rx()
365 struct tcpci *tcpci = tcpc_to_tcpci(tcpc); in tcpci_get_vbus() local
368 reg = dm_i2c_reg_read(tcpci->dev, TCPC_POWER_STATUS); in tcpci_get_vbus()
377 struct tcpci *tcpci = tcpc_to_tcpci(tcpc); in tcpci_set_vbus() local
383 ret = dm_i2c_reg_write(tcpci->dev, TCPC_COMMAND, in tcpci_set_vbus()
390 ret = dm_i2c_reg_write(tcpci->dev, TCPC_COMMAND, in tcpci_set_vbus()
397 ret = dm_i2c_reg_write(tcpci->dev, TCPC_COMMAND, in tcpci_set_vbus()
404 ret = dm_i2c_reg_write(tcpci->dev, TCPC_COMMAND, in tcpci_set_vbus()
418 struct tcpci *tcpci = tcpc_to_tcpci(tcpc); in tcpci_pd_transmit() local
424 ret = dm_i2c_reg_write(tcpci->dev, TCPC_TX_BYTE_CNT, cnt + 2); in tcpci_pd_transmit()
428 ret = tcpci_write16(tcpci, TCPC_TX_HDR, header); in tcpci_pd_transmit()
433 ret = tcpci_block_write(tcpci, TCPC_TX_DATA, in tcpci_pd_transmit()
441 ret = dm_i2c_reg_write(tcpci->dev, TCPC_TRANSMIT, reg); in tcpci_pd_transmit()
450 struct tcpci *tcpci = tcpc_to_tcpci(tcpc); in tcpci_init() local
456 reg = dm_i2c_reg_read(tcpci->dev, TCPC_POWER_STATUS); in tcpci_init()
468 if (tcpci->data->init) { in tcpci_init()
469 ret = tcpci->data->init(tcpci, tcpci->data); in tcpci_init()
475 ret = tcpci_write16(tcpci, TCPC_ALERT, 0xffff); in tcpci_init()
479 if (tcpci->controls_vbus) in tcpci_init()
483 ret = dm_i2c_reg_write(tcpci->dev, TCPC_POWER_STATUS_MASK, reg); in tcpci_init()
488 ret = dm_i2c_reg_write(tcpci->dev, TCPC_COMMAND, in tcpci_init()
496 if (tcpci->controls_vbus) in tcpci_init()
498 return tcpci_write16(tcpci, TCPC_ALERT_MASK, reg); in tcpci_init()
504 struct tcpci *tcpci = tcpc_to_tcpci(tcpc); in tcpci_poll_event() local
506 if (tcpci->gpio_cc_int_present) in tcpci_poll_event()
507 if (!dm_gpio_get_value(&tcpci->gpio_cc_int)) in tcpci_poll_event()
510 tcpci_read16(tcpci, TCPC_ALERT, &status); in tcpci_poll_event()
517 tcpci_write16(tcpci, TCPC_ALERT, in tcpci_poll_event()
521 tcpm_cc_change(tcpci->port); in tcpci_poll_event()
526 reg = dm_i2c_reg_read(tcpci->dev, TCPC_POWER_STATUS_MASK); in tcpci_poll_event()
535 tcpm_tcpc_reset(tcpci->port); in tcpci_poll_event()
537 tcpm_vbus_change(tcpci->port); in tcpci_poll_event()
545 cnt = dm_i2c_reg_read(tcpci->dev, TCPC_RX_BYTE_CNT); in tcpci_poll_event()
550 * of the TCPCI spec [Rev 2.0 Ver 1.0 October 2017] and is in tcpci_poll_event()
559 tcpci_read16(tcpci, TCPC_RX_HDR, &header); in tcpci_poll_event()
566 tcpci_block_read(tcpci, TCPC_RX_DATA, in tcpci_poll_event()
570 tcpci_write16(tcpci, TCPC_ALERT, TCPC_ALERT_RX_STATUS); in tcpci_poll_event()
572 tcpm_pd_receive(tcpci->port, &msg); in tcpci_poll_event()
576 tcpm_pd_hard_reset(tcpci->port); in tcpci_poll_event()
579 tcpm_pd_transmit_complete(tcpci->port, TCPC_TX_SUCCESS); in tcpci_poll_event()
581 tcpm_pd_transmit_complete(tcpci->port, TCPC_TX_DISCARDED); in tcpci_poll_event()
583 tcpm_pd_transmit_complete(tcpci->port, TCPC_TX_FAILED); in tcpci_poll_event()
590 struct tcpci *tcpci = tcpc_to_tcpci(tcpc); in tcpci_enter_low_power_mode() local
594 ret = tcpci_write16(tcpci, TCPC_ALERT_MASK, 0); in tcpci_enter_low_power_mode()
598 reg = dm_i2c_reg_read(tcpci->dev, TCPC_BMCIO_CTRL); in tcpci_enter_low_power_mode()
610 return dm_i2c_reg_write(tcpci->dev, TCPC_BMCIO_CTRL, reg); in tcpci_enter_low_power_mode()
613 static int tcpci_parse_config(struct tcpci *tcpci) in tcpci_parse_config() argument
615 tcpci->controls_vbus = true; /* XXX */ in tcpci_parse_config()
617 tcpci->tcpc.connector_node = dev_read_subnode(tcpci->dev, "connector"); in tcpci_parse_config()
618 if (!ofnode_valid(tcpci->tcpc.connector_node)) { in tcpci_parse_config()
626 struct tcpci *tcpci_register_port(struct udevice *dev, struct tcpci_data *data) in tcpci_register_port()
628 struct tcpci *tcpci; in tcpci_register_port() local
631 tcpci = devm_kzalloc(dev, sizeof(*tcpci), GFP_KERNEL); in tcpci_register_port()
632 if (!tcpci) in tcpci_register_port()
635 err = gpio_request_by_name(dev, "int-n-gpios", 0, &tcpci->gpio_cc_int, GPIOD_IS_IN); in tcpci_register_port()
638 tcpci->gpio_cc_int_present = false; in tcpci_register_port()
640 tcpci->gpio_cc_int_present = true; in tcpci_register_port()
643 tcpci->dev = dev; in tcpci_register_port()
644 tcpci->data = data; in tcpci_register_port()
646 tcpci->tcpc.init = tcpci_init; in tcpci_register_port()
647 tcpci->tcpc.get_vbus = tcpci_get_vbus; in tcpci_register_port()
648 tcpci->tcpc.set_vbus = tcpci_set_vbus; in tcpci_register_port()
649 tcpci->tcpc.set_cc = tcpci_set_cc; in tcpci_register_port()
650 tcpci->tcpc.get_cc = tcpci_get_cc; in tcpci_register_port()
651 tcpci->tcpc.set_polarity = tcpci_set_polarity; in tcpci_register_port()
652 tcpci->tcpc.set_vconn = tcpci_set_vconn; in tcpci_register_port()
653 tcpci->tcpc.start_toggling = tcpci_start_toggling; in tcpci_register_port()
655 tcpci->tcpc.set_pd_rx = tcpci_set_pd_rx; in tcpci_register_port()
656 tcpci->tcpc.set_roles = tcpci_set_roles; in tcpci_register_port()
657 tcpci->tcpc.pd_transmit = tcpci_pd_transmit; in tcpci_register_port()
658 tcpci->tcpc.poll_event = tcpci_poll_event; in tcpci_register_port()
659 tcpci->tcpc.enter_low_power_mode = tcpci_enter_low_power_mode; in tcpci_register_port()
661 err = tcpci_parse_config(tcpci); in tcpci_register_port()
665 tcpci->port = tcpm_port_init(tcpci->dev, &tcpci->tcpc); in tcpci_register_port()
666 if (IS_ERR(tcpci->port)) { in tcpci_register_port()
668 return ERR_CAST(tcpci->port); in tcpci_register_port()
671 tcpm_poll_event(tcpci->port); in tcpci_register_port()
673 return tcpci; in tcpci_register_port()
677 void tcpci_unregister_port(struct tcpci *tcpci) in tcpci_unregister_port() argument
679 tcpm_uninit_port(tcpci->port); in tcpci_unregister_port()
683 int tcpci_get_voltage_fun(struct tcpci *tcpci) in tcpci_get_voltage_fun() argument
685 return tcpm_get_voltage(tcpci->port); in tcpci_get_voltage_fun()
689 int tcpci_get_current_fun(struct tcpci *tcpci) in tcpci_get_current_fun() argument
691 return tcpm_get_current(tcpci->port); in tcpci_get_current_fun()
695 int tcpci_get_online_fun(struct tcpci *tcpci) in tcpci_get_online_fun() argument
697 return tcpm_get_online(tcpci->port); in tcpci_get_online_fun()
710 err = tcpci_write16(chip->tcpci, TCPC_ALERT_MASK, val); in tcpci_probe()
714 chip->tcpci = tcpci_register_port(chip->udev, &chip->data); in tcpci_probe()
715 if (IS_ERR(chip->tcpci)) in tcpci_probe()
716 return PTR_ERR(chip->tcpci); in tcpci_probe()
727 err = tcpci_write16(chip->tcpci, TCPC_ALERT_MASK, 0); in tcpci_remove()
731 tcpci_unregister_port(chip->tcpci); in tcpci_remove()
740 return tcpm_get_voltage(chip->tcpci->port); in tcpci_get_voltage()
747 return tcpm_get_current(chip->tcpci->port); in tcpci_get_current()
754 return tcpm_get_online(chip->tcpci->port); in tcpci_get_online()
768 U_BOOT_DRIVER(tcpci) = {
769 .name = "tcpci",