diff --git a/drivers/mfd/fusb302.c b/drivers/mfd/fusb302.c index bdba379bdd71..a7a3303d09cc 100644 --- a/drivers/mfd/fusb302.c +++ b/drivers/mfd/fusb302.c @@ -639,6 +639,16 @@ static void tcpm_select_rp_value(struct fusb30x_chip *chip, u32 rp) regmap_write(chip->regmap, FUSB_REG_CONTROL0, control0_reg); } +static int tcpm_check_vbus(struct fusb30x_chip *chip) +{ + u32 val; + + /* Read status register */ + regmap_read(chip->regmap, FUSB_REG_STATUS0, &val); + + return (val & STATUS0_VBUSOK) ? 1 : 0; +} + static void tcpm_init(struct fusb30x_chip *chip) { u8 val; @@ -693,6 +703,7 @@ static void tcpm_init(struct fusb30x_chip *chip) tcpm_set_vconn(chip, 0); regmap_write(chip->regmap, FUSB_REG_POWER, 0xf); + chip->vbus_begin = tcpm_check_vbus(chip); } static void pd_execute_hard_reset(struct fusb30x_chip *chip) @@ -823,16 +834,6 @@ static void set_state_unattached(struct fusb30x_chip *chip) gpiod_set_value(chip->gpio_discharge, 0); } -static int tcpm_check_vbus(struct fusb30x_chip *chip) -{ - u32 val; - - /* Read status register */ - regmap_read(chip->regmap, FUSB_REG_STATUS0, &val); - - return (val & STATUS0_VBUSOK) ? 1 : 0; -} - static void set_mesg(struct fusb30x_chip *chip, int cmd, int is_DMT) { int i; @@ -1905,7 +1906,12 @@ static void fusb_state_snk_wait_caps(struct fusb30x_chip *chip, int evt) } } else if (evt & EVENT_TIMER_STATE) { if (chip->hardrst_count <= N_HARDRESET_COUNT) { - set_state(chip, policy_snk_send_hardrst); + if (chip->vbus_begin) { + chip->vbus_begin = false; + set_state(chip, policy_snk_send_softrst); + } else { + set_state(chip, policy_snk_send_hardrst); + } } else { if (chip->is_pd_support) set_state(chip, error_recovery); diff --git a/drivers/mfd/fusb302.h b/drivers/mfd/fusb302.h index bb1cbdf0da99..e2740ae5fa2f 100644 --- a/drivers/mfd/fusb302.h +++ b/drivers/mfd/fusb302.h @@ -442,6 +442,7 @@ struct fusb30x_chip { int pd_output_cur; int cc_meas_high; int cc_meas_low; + bool vbus_begin; }; #endif /* FUSB302_H */