Lines Matching +full:on +full:- +full:chip

1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright 2016-2017 Google, Inc
5 * Fairchild FUSB302 Type-C Chip Driver
17 * for the current capability offered by the SRC. As FUSB302 chip fires
18 * the BC_LVL interrupt on PD signalings, cc lvl should be handled after
19 * a delay to avoid measuring on PD activities. The delay is slightly
20 * longer than PD_T_PD_DEBPUNCE (10-20ms).
81 static int fusb302_i2c_write(struct fusb302_chip *chip, in fusb302_i2c_write() argument
86 ret = dm_i2c_write(chip->udev, address, &data, 1); in fusb302_i2c_write()
94 static int fusb302_i2c_block_write(struct fusb302_chip *chip, u8 address, in fusb302_i2c_block_write() argument
102 ret = dm_i2c_write(chip->udev, address, data, length); in fusb302_i2c_block_write()
110 static int fusb302_i2c_read(struct fusb302_chip *chip, in fusb302_i2c_read() argument
115 ret = dm_i2c_read(chip->udev, address, data, 1); in fusb302_i2c_read()
123 static int fusb302_i2c_block_read(struct fusb302_chip *chip, u8 address, in fusb302_i2c_block_read() argument
131 ret = dm_i2c_read(chip->udev, address, data, length); in fusb302_i2c_block_read()
138 static int fusb302_i2c_mask_write(struct fusb302_chip *chip, u8 address, in fusb302_i2c_mask_write() argument
144 ret = fusb302_i2c_read(chip, address, &data); in fusb302_i2c_mask_write()
149 ret = fusb302_i2c_write(chip, address, data); in fusb302_i2c_mask_write()
156 static int fusb302_i2c_set_bits(struct fusb302_chip *chip, u8 address, in fusb302_i2c_set_bits() argument
159 return fusb302_i2c_mask_write(chip, address, 0x00, set_bits); in fusb302_i2c_set_bits()
162 static int fusb302_i2c_clear_bits(struct fusb302_chip *chip, u8 address, in fusb302_i2c_clear_bits() argument
165 return fusb302_i2c_mask_write(chip, address, clear_bits, 0x00); in fusb302_i2c_clear_bits()
168 static int fusb302_sw_reset(struct fusb302_chip *chip) in fusb302_sw_reset() argument
172 ret = fusb302_i2c_write(chip, FUSB_REG_RESET, in fusb302_sw_reset()
182 static int fusb302_enable_tx_auto_retries(struct fusb302_chip *chip, u8 retry_count) in fusb302_enable_tx_auto_retries() argument
186 ret = fusb302_i2c_set_bits(chip, FUSB_REG_CONTROL3, retry_count | in fusb302_enable_tx_auto_retries()
193 * mask all interrupt on the chip
195 static int fusb302_mask_interrupt(struct fusb302_chip *chip) in fusb302_mask_interrupt() argument
199 ret = fusb302_i2c_write(chip, FUSB_REG_MASK, 0xFF); in fusb302_mask_interrupt()
202 ret = fusb302_i2c_write(chip, FUSB_REG_MASKA, 0xFF); in fusb302_mask_interrupt()
205 ret = fusb302_i2c_write(chip, FUSB_REG_MASKB, 0xFF); in fusb302_mask_interrupt()
208 ret = fusb302_i2c_set_bits(chip, FUSB_REG_CONTROL0, in fusb302_mask_interrupt()
214 * initialize interrupt on the chip
215 * - unmasked interrupt: VBUS_OK
217 static int fusb302_init_interrupt(struct fusb302_chip *chip) in fusb302_init_interrupt() argument
221 ret = fusb302_i2c_write(chip, FUSB_REG_MASK, in fusb302_init_interrupt()
225 ret = fusb302_i2c_write(chip, FUSB_REG_MASKA, 0xFF); in fusb302_init_interrupt()
228 ret = fusb302_i2c_write(chip, FUSB_REG_MASKB, 0xFF); in fusb302_init_interrupt()
231 ret = fusb302_i2c_clear_bits(chip, FUSB_REG_CONTROL0, in fusb302_init_interrupt()
236 static int fusb302_set_power_mode(struct fusb302_chip *chip, u8 power_mode) in fusb302_set_power_mode() argument
240 ret = fusb302_i2c_write(chip, FUSB_REG_POWER, power_mode); in fusb302_set_power_mode()
247 struct fusb302_chip *chip = container_of(dev, struct fusb302_chip, in tcpm_init() local
252 ret = fusb302_sw_reset(chip); in tcpm_init()
255 ret = fusb302_enable_tx_auto_retries(chip, FUSB_REG_CONTROL3_N_RETRIES_3); in tcpm_init()
258 ret = fusb302_init_interrupt(chip); in tcpm_init()
261 ret = fusb302_set_power_mode(chip, FUSB_REG_POWER_PWR_ALL); in tcpm_init()
264 ret = fusb302_i2c_read(chip, FUSB_REG_STATUS0, &data); in tcpm_init()
267 chip->vbus_present = !!(data & FUSB_REG_STATUS0_VBUSOK); in tcpm_init()
268 ret = fusb302_i2c_read(chip, FUSB_REG_DEVICE_ID, &data); in tcpm_init()
278 struct fusb302_chip *chip = container_of(dev, struct fusb302_chip, in tcpm_get_vbus() local
280 return chip->vbus_present ? 1 : 0; in tcpm_get_vbus()
287 struct fusb302_chip *chip = container_of(dev, struct fusb302_chip,
292 if (!chip->extcon)
301 if (extcon_get_state(chip->extcon, EXTCON_CHG_USB_SDP) == 1)
304 if (extcon_get_state(chip->extcon, EXTCON_CHG_USB_CDP) == 1 ||
305 extcon_get_state(chip->extcon, EXTCON_CHG_USB_ACA) == 1)
308 if (extcon_get_state(chip->extcon, EXTCON_CHG_USB_DCP) == 1)
318 static int fusb302_set_src_current(struct fusb302_chip *chip, in fusb302_set_src_current() argument
323 chip->src_current_status = status; in fusb302_set_src_current()
326 ret = fusb302_i2c_mask_write(chip, FUSB_REG_CONTROL0, in fusb302_set_src_current()
331 ret = fusb302_i2c_mask_write(chip, FUSB_REG_CONTROL0, in fusb302_set_src_current()
336 ret = fusb302_i2c_mask_write(chip, FUSB_REG_CONTROL0, in fusb302_set_src_current()
347 static int fusb302_set_toggling(struct fusb302_chip *chip, in fusb302_set_toggling() argument
353 ret = fusb302_i2c_clear_bits(chip, FUSB_REG_CONTROL2, in fusb302_set_toggling()
358 ret = fusb302_i2c_set_bits(chip, FUSB_REG_MASK, in fusb302_set_toggling()
363 chip->intr_bc_lvl = false; in fusb302_set_toggling()
364 chip->intr_comp_chng = false; in fusb302_set_toggling()
368 ret = fusb302_i2c_mask_write(chip, FUSB_REG_CONTROL2, in fusb302_set_toggling()
373 ret = fusb302_i2c_mask_write(chip, FUSB_REG_CONTROL2, in fusb302_set_toggling()
378 ret = fusb302_i2c_mask_write(chip, FUSB_REG_CONTROL2, in fusb302_set_toggling()
383 ret = fusb302_i2c_mask_write(chip, FUSB_REG_CONTROL2, in fusb302_set_toggling()
396 ret = fusb302_i2c_set_bits(chip, FUSB_REG_MASKA, in fusb302_set_toggling()
400 chip->intr_togdone = false; in fusb302_set_toggling()
403 if (chip->vconn_on) in fusb302_set_toggling()
404 printf("%s: Vconn is on during toggle start\n", __func__); in fusb302_set_toggling()
406 ret = fusb302_i2c_clear_bits(chip, FUSB_REG_MASKA, in fusb302_set_toggling()
410 chip->intr_togdone = true; in fusb302_set_toggling()
412 ret = fusb302_i2c_set_bits(chip, FUSB_REG_CONTROL2, in fusb302_set_toggling()
417 chip->cc1 = TYPEC_CC_OPEN; in fusb302_set_toggling()
418 chip->cc2 = TYPEC_CC_OPEN; in fusb302_set_toggling()
420 chip->toggling_mode = mode; in fusb302_set_toggling()
429 [TYPEC_CC_RP_DEF] = "Rp-def",
430 [TYPEC_CC_RP_1_5] = "Rp-1.5",
431 [TYPEC_CC_RP_3_0] = "Rp-3.0",
445 struct fusb302_chip *chip = container_of(dev, struct fusb302_chip, in tcpm_set_cc() local
464 switches0_data |= (chip->cc_polarity == TYPEC_POLARITY_CC1) ? in tcpm_set_cc()
471 ret = -EINVAL; in tcpm_set_cc()
475 ret = fusb302_set_toggling(chip, TOGGLING_MODE_OFF); in tcpm_set_cc()
481 ret = fusb302_i2c_mask_write(chip, FUSB_REG_SWITCHES0, in tcpm_set_cc()
484 printf("%s: cannot set pull-up/-down(%d)\n", __func__, ret); in tcpm_set_cc()
488 chip->cc1 = TYPEC_CC_OPEN; in tcpm_set_cc()
489 chip->cc2 = TYPEC_CC_OPEN; in tcpm_set_cc()
492 ret = fusb302_set_src_current(chip, cc_src_current[cc]); in tcpm_set_cc()
505 ret = fusb302_i2c_write(chip, FUSB_REG_MEASURE, rd_mda); in tcpm_set_cc()
511 ret = fusb302_i2c_mask_write(chip, FUSB_REG_MASK, in tcpm_set_cc()
520 chip->intr_comp_chng = true; in tcpm_set_cc()
523 ret = fusb302_i2c_mask_write(chip, FUSB_REG_MASK, in tcpm_set_cc()
532 chip->intr_bc_lvl = true; in tcpm_set_cc()
544 struct fusb302_chip *chip = container_of(dev, struct fusb302_chip, in tcpm_get_cc() local
547 *cc1 = chip->cc1; in tcpm_get_cc()
548 *cc2 = chip->cc2; in tcpm_get_cc()
561 static int tcpm_set_vconn(struct tcpc_dev *dev, bool on) in tcpm_set_vconn() argument
563 struct fusb302_chip *chip = container_of(dev, struct fusb302_chip, in tcpm_set_vconn() local
570 if (chip->vconn_on == on) { in tcpm_set_vconn()
571 printf("vconn is already %s\n", on ? "On" : "Off"); in tcpm_set_vconn()
574 if (on) { in tcpm_set_vconn()
575 switches0_data = (chip->cc_polarity == TYPEC_POLARITY_CC1) ? in tcpm_set_vconn()
579 ret = fusb302_i2c_mask_write(chip, FUSB_REG_SWITCHES0, in tcpm_set_vconn()
583 debug("%s: vconn := %s\n", __func__, on ? "On" : "Off"); in tcpm_set_vconn()
588 static int tcpm_set_vbus(struct tcpc_dev *dev, bool on, bool charge) in tcpm_set_vbus() argument
591 struct fusb302_chip *chip = container_of(dev, struct fusb302_chip, in tcpm_set_vbus()
595 mutex_lock(&chip->lock); in tcpm_set_vbus()
596 if (chip->vbus_on == on) { in tcpm_set_vbus()
597 printf("%s: vbus is already %s\n", __func__, on ? "On" : "Off"); in tcpm_set_vbus()
599 if (on) in tcpm_set_vbus()
600 ret = regulator_enable(chip->vbus); in tcpm_set_vbus()
602 ret = regulator_disable(chip->vbus); in tcpm_set_vbus()
605 __func__, on ? "enable" : "disable", ret); in tcpm_set_vbus()
608 chip->vbus_on = on; in tcpm_set_vbus()
609 debug("%s: vbus := %s\n", __func__, on ? "On" : "Off"); in tcpm_set_vbus()
611 if (chip->charge_on == charge) in tcpm_set_vbus()
613 __func__, charge ? "On" : "Off"); in tcpm_set_vbus()
615 chip->charge_on = charge; in tcpm_set_vbus()
618 mutex_unlock(&chip->lock); in tcpm_set_vbus()
624 static int fusb302_pd_tx_flush(struct fusb302_chip *chip) in fusb302_pd_tx_flush() argument
626 return fusb302_i2c_set_bits(chip, FUSB_REG_CONTROL0, in fusb302_pd_tx_flush()
630 static int fusb302_pd_rx_flush(struct fusb302_chip *chip) in fusb302_pd_rx_flush() argument
632 return fusb302_i2c_set_bits(chip, FUSB_REG_CONTROL1, in fusb302_pd_rx_flush()
636 static int fusb302_pd_set_auto_goodcrc(struct fusb302_chip *chip, bool on) in fusb302_pd_set_auto_goodcrc() argument
638 if (on) in fusb302_pd_set_auto_goodcrc()
639 return fusb302_i2c_set_bits(chip, FUSB_REG_SWITCHES1, in fusb302_pd_set_auto_goodcrc()
641 return fusb302_i2c_clear_bits(chip, FUSB_REG_SWITCHES1, in fusb302_pd_set_auto_goodcrc()
645 static int fusb302_pd_set_interrupts(struct fusb302_chip *chip, bool on) in fusb302_pd_set_interrupts() argument
655 ret = on ? in fusb302_pd_set_interrupts()
656 fusb302_i2c_clear_bits(chip, FUSB_REG_MASK, mask_interrupts) : in fusb302_pd_set_interrupts()
657 fusb302_i2c_set_bits(chip, FUSB_REG_MASK, mask_interrupts); in fusb302_pd_set_interrupts()
660 ret = on ? in fusb302_pd_set_interrupts()
661 fusb302_i2c_clear_bits(chip, FUSB_REG_MASKA, maska_interrupts) : in fusb302_pd_set_interrupts()
662 fusb302_i2c_set_bits(chip, FUSB_REG_MASKA, maska_interrupts); in fusb302_pd_set_interrupts()
665 ret = on ? in fusb302_pd_set_interrupts()
666 fusb302_i2c_clear_bits(chip, FUSB_REG_MASKB, maskb_interrupts) : in fusb302_pd_set_interrupts()
667 fusb302_i2c_set_bits(chip, FUSB_REG_MASKB, maskb_interrupts); in fusb302_pd_set_interrupts()
671 static int tcpm_set_pd_rx(struct tcpc_dev *dev, bool on) in tcpm_set_pd_rx() argument
673 struct fusb302_chip *chip = container_of(dev, struct fusb302_chip, in tcpm_set_pd_rx() local
677 ret = fusb302_pd_rx_flush(chip); in tcpm_set_pd_rx()
682 ret = fusb302_pd_tx_flush(chip); in tcpm_set_pd_rx()
687 ret = fusb302_pd_set_auto_goodcrc(chip, on); in tcpm_set_pd_rx()
690 __func__, on ? "on" : "off", ret); in tcpm_set_pd_rx()
693 ret = fusb302_pd_set_interrupts(chip, on); in tcpm_set_pd_rx()
696 __func__, on ? "on" : "off", ret); in tcpm_set_pd_rx()
699 debug("%s: pd := %s\n", __func__, on ? "on" : "off"); in tcpm_set_pd_rx()
717 struct fusb302_chip *chip = container_of(dev, struct fusb302_chip, in tcpm_set_roles() local
728 ret = fusb302_i2c_mask_write(chip, FUSB_REG_SWITCHES1, in tcpm_set_roles()
746 struct fusb302_chip *chip = container_of(dev, struct fusb302_chip, in tcpm_start_toggling() local
763 ret = fusb302_set_src_current(chip, cc_src_current[cc]); in tcpm_start_toggling()
769 ret = fusb302_set_toggling(chip, mode); in tcpm_start_toggling()
780 static int fusb302_pd_send_message(struct fusb302_chip *chip, in fusb302_pd_send_message() argument
794 len = pd_header_cnt_le(msg->header) * 4; in fusb302_pd_send_message()
799 return -EINVAL; in fusb302_pd_send_message()
801 /* packsym tells the FUSB302 chip that the next X bytes are payload */ in fusb302_pd_send_message()
803 memcpy(&buf[pos], &msg->header, sizeof(msg->header)); in fusb302_pd_send_message()
804 pos += sizeof(msg->header); in fusb302_pd_send_message()
806 len -= 2; in fusb302_pd_send_message()
807 memcpy(&buf[pos], msg->payload, len); in fusb302_pd_send_message()
819 ret = fusb302_i2c_block_write(chip, FUSB_REG_FIFOS, pos, buf); in fusb302_pd_send_message()
822 debug("sending PD message header: %x\n", msg->header); in fusb302_pd_send_message()
828 static int fusb302_pd_send_hardreset(struct fusb302_chip *chip) in fusb302_pd_send_hardreset() argument
830 return fusb302_i2c_set_bits(chip, FUSB_REG_CONTROL3, in fusb302_pd_send_hardreset()
848 struct fusb302_chip *chip = container_of(dev, struct fusb302_chip, in tcpm_pd_transmit() local
855 ret = fusb302_enable_tx_auto_retries(chip, negotiated_rev > PD_REV20 ? in tcpm_pd_transmit()
862 ret = fusb302_pd_send_message(chip, msg); in tcpm_pd_transmit()
868 ret = fusb302_pd_send_hardreset(chip); in tcpm_pd_transmit()
876 ret = -EINVAL; in tcpm_pd_transmit()
893 static void fusb302_bc_lvl_handler(struct fusb302_chip *chip) in fusb302_bc_lvl_handler() argument
900 if (!chip->intr_bc_lvl) { in fusb302_bc_lvl_handler()
904 ret = fusb302_i2c_read(chip, FUSB_REG_STATUS0, &status0); in fusb302_bc_lvl_handler()
913 if (chip->cc_polarity == TYPEC_POLARITY_CC1) { in fusb302_bc_lvl_handler()
914 if (chip->cc1 != cc_status) { in fusb302_bc_lvl_handler()
915 debug("cc1: %s -> %s\n", in fusb302_bc_lvl_handler()
916 typec_cc_status_name[chip->cc1], in fusb302_bc_lvl_handler()
918 chip->cc1 = cc_status; in fusb302_bc_lvl_handler()
919 tcpm_cc_change(chip->tcpm_port); in fusb302_bc_lvl_handler()
922 if (chip->cc2 != cc_status) { in fusb302_bc_lvl_handler()
923 debug("cc2: %s -> %s\n", in fusb302_bc_lvl_handler()
924 typec_cc_status_name[chip->cc2], in fusb302_bc_lvl_handler()
926 chip->cc2 = cc_status; in fusb302_bc_lvl_handler()
927 tcpm_cc_change(chip->tcpm_port); in fusb302_bc_lvl_handler()
935 static void fusb302_interrupt_handle(struct fusb302_chip *chip);
938 struct fusb302_chip *chip = container_of(dev, struct fusb302_chip, in fusb302_poll_event() local
941 fusb302_interrupt_handle(chip); in fusb302_poll_event()
947 struct fusb302_chip *chip = container_of(dev, struct fusb302_chip, in fusb302_enter_low_power_mode() local
952 ret = fusb302_mask_interrupt(chip); in fusb302_enter_low_power_mode()
962 return fusb302_set_power_mode(chip, reg); in fusb302_enter_low_power_mode()
967 fusb302_tcpc_dev->init = tcpm_init; in init_tcpc_dev()
968 fusb302_tcpc_dev->get_vbus = tcpm_get_vbus; in init_tcpc_dev()
969 //fusb302_tcpc_dev->get_current_limit = tcpm_get_current_limit; in init_tcpc_dev()
970 fusb302_tcpc_dev->set_cc = tcpm_set_cc; in init_tcpc_dev()
971 fusb302_tcpc_dev->get_cc = tcpm_get_cc; in init_tcpc_dev()
972 fusb302_tcpc_dev->set_polarity = tcpm_set_polarity; in init_tcpc_dev()
973 fusb302_tcpc_dev->set_vconn = tcpm_set_vconn; in init_tcpc_dev()
974 fusb302_tcpc_dev->set_vbus = tcpm_set_vbus; in init_tcpc_dev()
975 fusb302_tcpc_dev->set_pd_rx = tcpm_set_pd_rx; in init_tcpc_dev()
976 fusb302_tcpc_dev->set_roles = tcpm_set_roles; in init_tcpc_dev()
977 fusb302_tcpc_dev->start_toggling = tcpm_start_toggling; in init_tcpc_dev()
978 fusb302_tcpc_dev->pd_transmit = tcpm_pd_transmit; in init_tcpc_dev()
979 fusb302_tcpc_dev->poll_event = fusb302_poll_event; in init_tcpc_dev()
980 fusb302_tcpc_dev->enter_low_power_mode = fusb302_enter_low_power_mode; in init_tcpc_dev()
988 static int fusb302_set_cc_polarity_and_pull(struct fusb302_chip *chip, in fusb302_set_cc_polarity_and_pull() argument
1004 if (chip->vconn_on) in fusb302_set_cc_polarity_and_pull()
1011 if (chip->vconn_on) in fusb302_set_cc_polarity_and_pull()
1017 ret = fusb302_i2c_write(chip, FUSB_REG_SWITCHES0, switches0_data); in fusb302_set_cc_polarity_and_pull()
1020 ret = fusb302_i2c_mask_write(chip, FUSB_REG_SWITCHES1, in fusb302_set_cc_polarity_and_pull()
1024 chip->cc_polarity = cc_polarity; in fusb302_set_cc_polarity_and_pull()
1029 static int fusb302_handle_togdone_snk(struct fusb302_chip *chip, in fusb302_handle_togdone_snk() argument
1041 ret = fusb302_set_cc_polarity_and_pull(chip, cc_polarity, false, true); in fusb302_handle_togdone_snk()
1048 ret = fusb302_i2c_read(chip, FUSB_REG_STATUS0, &status0); in fusb302_handle_togdone_snk()
1053 /* restart toggling if the cc status on the active line is OPEN */ in fusb302_handle_togdone_snk()
1056 ret = fusb302_set_toggling(chip, chip->toggling_mode); in fusb302_handle_togdone_snk()
1064 if ((chip->cc1 != cc1) || (chip->cc2 != cc2)) { in fusb302_handle_togdone_snk()
1065 chip->cc1 = cc1; in fusb302_handle_togdone_snk()
1066 chip->cc2 = cc2; in fusb302_handle_togdone_snk()
1067 tcpm_cc_change(chip->tcpm_port); in fusb302_handle_togdone_snk()
1070 ret = fusb302_set_toggling(chip, TOGGLING_MODE_OFF); in fusb302_handle_togdone_snk()
1076 ret = fusb302_i2c_clear_bits(chip, FUSB_REG_MASK, FUSB_REG_MASK_BC_LVL); in fusb302_handle_togdone_snk()
1081 chip->intr_bc_lvl = true; in fusb302_handle_togdone_snk()
1089 /* On error returns < 0, otherwise a typec_cc_status value */
1090 static int fusb302_get_src_cc_status(struct fusb302_chip *chip, in fusb302_get_src_cc_status() argument
1094 u8 ra_mda = ra_mda_value[chip->src_current_status]; in fusb302_get_src_cc_status()
1095 u8 rd_mda = rd_mda_value[chip->src_current_status]; in fusb302_get_src_cc_status()
1103 ret = fusb302_i2c_write(chip, FUSB_REG_SWITCHES0, switches0_data); in fusb302_get_src_cc_status()
1107 fusb302_i2c_read(chip, FUSB_REG_SWITCHES0, &status0); in fusb302_get_src_cc_status()
1111 ret = fusb302_i2c_write(chip, FUSB_REG_MEASURE, rd_mda); in fusb302_get_src_cc_status()
1116 ret = fusb302_i2c_read(chip, FUSB_REG_STATUS0, &status0); in fusb302_get_src_cc_status()
1127 ret = fusb302_i2c_write(chip, FUSB_REG_MEASURE, ra_mda); in fusb302_get_src_cc_status()
1132 ret = fusb302_i2c_read(chip, FUSB_REG_STATUS0, &status0); in fusb302_get_src_cc_status()
1145 static int fusb302_handle_togdone_src(struct fusb302_chip *chip, in fusb302_handle_togdone_src() argument
1149 * - set polarity (measure cc, vconn, tx) in fusb302_handle_togdone_src()
1150 * - set pull_up, pull_down in fusb302_handle_togdone_src()
1151 * - set cc1, cc2, and update to tcpm_port in fusb302_handle_togdone_src()
1152 * - set I_COMP interrupt on in fusb302_handle_togdone_src()
1155 u8 rd_mda = rd_mda_value[chip->src_current_status]; in fusb302_handle_togdone_src()
1156 enum toggling_mode toggling_mode = chip->toggling_mode; in fusb302_handle_togdone_src()
1161 * The toggle-engine will stop in a src state if it sees either Ra or in fusb302_handle_togdone_src()
1166 ret = fusb302_get_src_cc_status(chip, TYPEC_POLARITY_CC1, &cc1); in fusb302_handle_togdone_src()
1168 ret = fusb302_get_src_cc_status(chip, TYPEC_POLARITY_CC2, &cc2); in fusb302_handle_togdone_src()
1172 ret = fusb302_set_toggling(chip, TOGGLING_MODE_OFF); in fusb302_handle_togdone_src()
1179 ret = fusb302_get_src_cc_status(chip, TYPEC_POLARITY_CC2, &cc2); in fusb302_handle_togdone_src()
1181 ret = fusb302_get_src_cc_status(chip, TYPEC_POLARITY_CC1, &cc1); in fusb302_handle_togdone_src()
1185 /* determine polarity based on the status of both pins */ in fusb302_handle_togdone_src()
1196 return fusb302_set_toggling(chip, toggling_mode); in fusb302_handle_togdone_src()
1199 ret = fusb302_set_cc_polarity_and_pull(chip, cc_polarity, true, false); in fusb302_handle_togdone_src()
1206 if ((chip->cc1 != cc1) || (chip->cc2 != cc2)) { in fusb302_handle_togdone_src()
1207 chip->cc1 = cc1; in fusb302_handle_togdone_src()
1208 chip->cc2 = cc2; in fusb302_handle_togdone_src()
1209 tcpm_cc_change(chip->tcpm_port); in fusb302_handle_togdone_src()
1212 ret = fusb302_i2c_write(chip, FUSB_REG_MEASURE, rd_mda); in fusb302_handle_togdone_src()
1216 ret = fusb302_i2c_clear_bits(chip, FUSB_REG_MASK, in fusb302_handle_togdone_src()
1222 chip->intr_comp_chng = true; in fusb302_handle_togdone_src()
1230 static int fusb302_handle_togdone(struct fusb302_chip *chip) in fusb302_handle_togdone() argument
1236 ret = fusb302_i2c_read(chip, FUSB_REG_STATUS1A, &status1a); in fusb302_handle_togdone()
1244 return fusb302_handle_togdone_snk(chip, togdone_result); in fusb302_handle_togdone()
1247 return fusb302_handle_togdone_src(chip, togdone_result); in fusb302_handle_togdone()
1251 fusb302_set_toggling(chip, chip->toggling_mode); in fusb302_handle_togdone()
1255 fusb302_set_toggling(chip, chip->toggling_mode); in fusb302_handle_togdone()
1261 static int fusb302_pd_reset(struct fusb302_chip *chip) in fusb302_pd_reset() argument
1263 return fusb302_i2c_set_bits(chip, FUSB_REG_RESET, in fusb302_pd_reset()
1267 static int fusb302_pd_read_message(struct fusb302_chip *chip, in fusb302_pd_read_message() argument
1276 ret = fusb302_i2c_read(chip, FUSB_REG_FIFOS, &token); in fusb302_pd_read_message()
1279 ret = fusb302_i2c_block_read(chip, FUSB_REG_FIFOS, 2, in fusb302_pd_read_message()
1280 (u8 *)&msg->header); in fusb302_pd_read_message()
1283 len = pd_header_cnt_le(msg->header) * 4; in fusb302_pd_read_message()
1287 return -EINVAL; in fusb302_pd_read_message()
1290 ret = fusb302_i2c_block_read(chip, FUSB_REG_FIFOS, len, in fusb302_pd_read_message()
1291 (u8 *)msg->payload); in fusb302_pd_read_message()
1296 ret = fusb302_i2c_block_read(chip, FUSB_REG_FIFOS, 4, crc); in fusb302_pd_read_message()
1299 debug("%s: PD message header: %x\n", __func__, msg->header); in fusb302_pd_read_message()
1307 * We make this check here instead of basing the reporting decision on in fusb302_pd_read_message()
1308 * the IRQ event type, as it's possible for the chip to report the in fusb302_pd_read_message()
1309 * TX_SUCCESS and GCRCSENT events out of order on occasion, so we need in fusb302_pd_read_message()
1312 if ((!len) && (pd_header_type_le(msg->header) == PD_CTRL_GOOD_CRC)) in fusb302_pd_read_message()
1313 tcpm_pd_transmit_complete(chip->tcpm_port, TCPC_TX_SUCCESS); in fusb302_pd_read_message()
1315 tcpm_pd_receive(chip->tcpm_port, msg); in fusb302_pd_read_message()
1320 static void fusb302_interrupt_handle(struct fusb302_chip *chip) in fusb302_interrupt_handle() argument
1335 intr_togdone = chip->intr_togdone; in fusb302_interrupt_handle()
1336 intr_bc_lvl = chip->intr_bc_lvl; in fusb302_interrupt_handle()
1337 intr_comp_chng = chip->intr_comp_chng; in fusb302_interrupt_handle()
1339 if (chip->gpio_cc_int_present) in fusb302_interrupt_handle()
1340 if (!dm_gpio_get_value(&chip->gpio_cc_int)) in fusb302_interrupt_handle()
1343 ret = fusb302_i2c_read(chip, FUSB_REG_INTERRUPT, &interrupt); in fusb302_interrupt_handle()
1346 ret = fusb302_i2c_read(chip, FUSB_REG_INTERRUPTA, &interrupta); in fusb302_interrupt_handle()
1349 ret = fusb302_i2c_read(chip, FUSB_REG_INTERRUPTB, &interruptb); in fusb302_interrupt_handle()
1352 ret = fusb302_i2c_read(chip, FUSB_REG_STATUS0, &status0); in fusb302_interrupt_handle()
1360 debug("IRQ: VBUS_OK, vbus=%s\n", vbus_present ? "On" : "Off"); in fusb302_interrupt_handle()
1361 if (vbus_present != chip->vbus_present) { in fusb302_interrupt_handle()
1362 chip->vbus_present = vbus_present; in fusb302_interrupt_handle()
1363 tcpm_vbus_change(chip->tcpm_port); in fusb302_interrupt_handle()
1369 ret = fusb302_handle_togdone(chip); in fusb302_interrupt_handle()
1384 fusb302_bc_lvl_handler(chip); in fusb302_interrupt_handle()
1392 chip->cc1 = TYPEC_CC_OPEN; in fusb302_interrupt_handle()
1393 chip->cc2 = TYPEC_CC_OPEN; in fusb302_interrupt_handle()
1394 tcpm_cc_change(chip->tcpm_port); in fusb302_interrupt_handle()
1400 tcpm_pd_transmit_complete(chip->tcpm_port, TCPC_TX_FAILED); in fusb302_interrupt_handle()
1405 tcpm_pd_transmit_complete(chip->tcpm_port, TCPC_TX_FAILED); in fusb302_interrupt_handle()
1410 ret = fusb302_pd_reset(chip); in fusb302_interrupt_handle()
1415 tcpm_pd_transmit_complete(chip->tcpm_port, TCPC_TX_SUCCESS); in fusb302_interrupt_handle()
1420 ret = fusb302_pd_read_message(chip, &pd_msg); in fusb302_interrupt_handle()
1429 ret = fusb302_pd_reset(chip); in fusb302_interrupt_handle()
1434 tcpm_pd_hard_reset(chip->tcpm_port); in fusb302_interrupt_handle()
1439 ret = fusb302_pd_read_message(chip, &pd_msg); in fusb302_interrupt_handle()
1449 struct fusb302_chip *chip = dev_get_priv(dev); in fusb302_probe() local
1452 chip->udev = dev; in fusb302_probe()
1456 ret = regulator_get_by_platname("vbus5v0_typec", chip->vbus_regulator); in fusb302_probe()
1459 chip->vbus_regulator = NULL; in fusb302_probe()
1463 chip->tcpc_dev.connector_node = dev_read_subnode(dev, "connector"); in fusb302_probe()
1464 if (!ofnode_valid(chip->tcpc_dev.connector_node)) { in fusb302_probe()
1466 return -ENODEV; in fusb302_probe()
1469 init_tcpc_dev(&chip->tcpc_dev); in fusb302_probe()
1471 ret = gpio_request_by_name(dev, "int-n-gpios", 0, in fusb302_probe()
1472 &chip->gpio_cc_int, GPIOD_IS_IN); in fusb302_probe()
1475 chip->gpio_cc_int_present = false; in fusb302_probe()
1477 chip->gpio_cc_int_present = true; in fusb302_probe()
1480 chip->tcpm_port = tcpm_port_init(dev, &chip->tcpc_dev); in fusb302_probe()
1481 if (IS_ERR(chip->tcpm_port)) { in fusb302_probe()
1483 return PTR_ERR(chip->tcpm_port); in fusb302_probe()
1486 tcpm_poll_event(chip->tcpm_port); in fusb302_probe()
1494 struct fusb302_chip *chip = dev_get_priv(dev); in fusb302_get_voltage() local
1496 return tcpm_get_voltage(chip->tcpm_port); in fusb302_get_voltage()
1501 struct fusb302_chip *chip = dev_get_priv(dev); in fusb302_get_current() local
1503 return tcpm_get_current(chip->tcpm_port); in fusb302_get_current()
1508 struct fusb302_chip *chip = dev_get_priv(dev); in fusb302_get_online() local
1510 return tcpm_get_online(chip->tcpm_port); in fusb302_get_online()