From a026f64e8b15526bd05248dcee813d70495fa436 Mon Sep 17 00:00:00 2001 From: zain wang Date: Thu, 19 Oct 2017 17:08:33 +0800 Subject: [PATCH] mfd: fusb302: Don't send hardreset when hot reset FUSB302 default cc status is UFP. If we reset the UFP system, the UFP PD status would be reset, but the DPF can't detecte the disconnection since cc status did not changed. Reset UFP would send hardreset to DPF due to wait power caps timeout. And that would cause the power reset. So, let's use softreset instead of hardreset in this case. Change-Id: Ic896597569adb125bea3bf145c5c93712fa77539 Signed-off-by: zain wang --- drivers/mfd/fusb302.c | 28 +++++++++++++++++----------- drivers/mfd/fusb302.h | 1 + 2 files changed, 18 insertions(+), 11 deletions(-) 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 */