diff --git a/drivers/power/mmi_discrete_charger/mmi_discrete_charger_core.c b/drivers/power/mmi_discrete_charger/mmi_discrete_charger_core.c index 6edf3d3370c4..7856dba3fcd3 100644 --- a/drivers/power/mmi_discrete_charger/mmi_discrete_charger_core.c +++ b/drivers/power/mmi_discrete_charger/mmi_discrete_charger_core.c @@ -2202,10 +2202,27 @@ int mmi_discrete_config_pd_active(struct mmi_discrete_charger *chip, int val) return 0; } + +int mmi_charger_pd_vdm_verify(struct mmi_discrete_charger *chip, int val) +{ + mmi_info(chip, "config pd_vdm_verify is %d old mode is %d\n", val, chip->pd_vdm_verify); + + if (chip->pd_vdm_verify && chip->pd_vdm_verify == val) + return 0; + + chip->pd_vdm_verify = val; + + if (chip->usb_psy && chip->pd_vdm_verify) + power_supply_changed(chip->usb_psy); + + return 0; +} + static int mmi_discrete_usb_plugout(struct mmi_discrete_charger * chip) { chip->real_charger_type = POWER_SUPPLY_TYPE_UNKNOWN; chip->pd_active = MMI_POWER_SUPPLY_PD_INACTIVE; + chip->pd_vdm_verify = false; if (chip->use_extcon) mmi_notify_device_mode(chip, false); vote(chip->usb_icl_votable, SW_ICL_MAX_VOTER, true, SDP_100_MA); diff --git a/drivers/power/mmi_discrete_charger/mmi_discrete_charger_core.h b/drivers/power/mmi_discrete_charger/mmi_discrete_charger_core.h index 13e74278f6dd..003e05f92f65 100644 --- a/drivers/power/mmi_discrete_charger/mmi_discrete_charger_core.h +++ b/drivers/power/mmi_discrete_charger/mmi_discrete_charger_core.h @@ -112,6 +112,7 @@ struct mmi_discrete_charger { /*PD*/ struct adapter_device *pd_adapter_dev; int pd_active; + int pd_vdm_verify; bool pd_supported; int dc_cl_ma; @@ -138,6 +139,7 @@ int mmi_discrete_otg_enable(struct mmi_discrete_charger *chip, bool en); int mmi_discrete_is_usb_suspended(struct mmi_discrete_charger *chip); int mmi_discrete_config_typec_mode(struct mmi_discrete_charger *chip, int val); int mmi_discrete_config_pd_active(struct mmi_discrete_charger *chip, int val); +int mmi_charger_pd_vdm_verify(struct mmi_discrete_charger *chip, int val); int mmi_discrete_get_hw_current_max(struct mmi_discrete_charger *chip, int *val); int mmi_discrete_config_charging_enabled(struct mmi_discrete_charger *chip, int val); int mmi_discrete_get_charging_enabled(struct mmi_discrete_charger *chip, bool *val); diff --git a/drivers/power/mmi_discrete_charger/mmi_discrete_charger_iio.c b/drivers/power/mmi_discrete_charger/mmi_discrete_charger_iio.c index 9b34ec465eb1..0b165557ab7c 100644 --- a/drivers/power/mmi_discrete_charger/mmi_discrete_charger_iio.c +++ b/drivers/power/mmi_discrete_charger/mmi_discrete_charger_iio.c @@ -48,6 +48,9 @@ static int mmi_discrete_iio_write_raw(struct iio_dev *indio_dev, case PSY_IIO_CP_ENABLE: chip->cp_active = !!val1; break; + case PSY_IIO_MMI_PD_VDM_VERIFY: + rc = mmi_charger_pd_vdm_verify(chip, val1); + break; default: pr_err("Unsupported mmi_discrete IIO chan %d\n", chan->channel); rc = -EINVAL; @@ -100,6 +103,9 @@ static int mmi_discrete_iio_read_raw(struct iio_dev *indio_dev, case PSY_IIO_CP_ENABLE: *val1 = chip->cp_active; break; + case PSY_IIO_MMI_PD_VDM_VERIFY: + *val1 = chip->pd_vdm_verify; + break; default: pr_err("Unsupported mmi_discrete IIO chan %d\n", chan->channel); rc = -EINVAL; diff --git a/drivers/power/mmi_discrete_charger/mmi_discrete_charger_iio.h b/drivers/power/mmi_discrete_charger/mmi_discrete_charger_iio.h index 8c7e4217ce38..5ca844fb596e 100644 --- a/drivers/power/mmi_discrete_charger/mmi_discrete_charger_iio.h +++ b/drivers/power/mmi_discrete_charger/mmi_discrete_charger_iio.h @@ -56,6 +56,7 @@ static const struct mmi_discrete_iio_channels mmi_discrete_iio_psy_channels[] = MMI_DISCRETE_CHAN_INDEX("usb_qc3p_power", PSY_IIO_MMI_QC3P_POWER) MMI_DISCRETE_CHAN_INDEX("typec_accessory_mode", PSY_IIO_TYPEC_ACCESSORY_MODE) MMI_DISCRETE_CHAN_INDEX("mmi_cp_enabled_status", PSY_IIO_CP_ENABLE) + MMI_DISCRETE_CHAN_INDEX("mmi_pd_vdm_verify", PSY_IIO_MMI_PD_VDM_VERIFY) }; int mmi_discrete_init_iio_psy(struct mmi_discrete_charger *chip,