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 8a92db809b9e..53351f9f9ad8 100644 --- a/drivers/power/mmi_discrete_charger/mmi_discrete_charger_core.c +++ b/drivers/power/mmi_discrete_charger/mmi_discrete_charger_core.c @@ -1885,6 +1885,58 @@ int mmi_discrete_config_typec_mode(struct mmi_discrete_charger *chip, int val) return 0; } +int mmi_discrete_get_hw_current_max(struct mmi_discrete_charger *chip, int *val) +{ + update_sw_icl_max(chip); + *val = get_effective_result(chip->usb_icl_votable); + mmi_dbg(chip, "get input current max :%d\n", + *val); + + return 0; +} + +int mmi_discrete_config_charging_enabled(struct mmi_discrete_charger *chip, int val) +{ + int rc = 0; + + mmi_dbg(chip, "mmi_discrete_config_charging_enabled val:%d\n",val); + + rc = charger_dev_enable_charging(chip->master_chg_dev, + val ? true:false); + if (rc) + mmi_err(chip, "Couldn't %s charging rc=%d\n", + val ? "enable":"disable", rc); + + return rc; +} + +int mmi_discrete_get_charging_enabled(struct mmi_discrete_charger *chip, bool *val) +{ + int rc = 0; + + mmi_dbg(chip, "mmi_discrete_get_charging_enabled val:%d\n",*val); + + rc = charger_dev_is_enabled_charging(chip->master_chg_dev, val); + if (rc) + mmi_err(chip, "Couldn't get charging status rc=%d\n", rc); + + return rc; +} + + +int mmi_discrete_config_input_current_settled(struct mmi_discrete_charger *chip, int val) +{ + + update_sw_icl_max(chip); + + mmi_dbg(chip, "mmi_discrete_config_input_current_settled val:%d\n",val); + + vote(chip->usb_icl_votable, QC3P_VOTER, true, val*1000); + if (chip->usb_psy) + power_supply_changed(chip->usb_psy); + return 0; +} + #define MMI_USBIN_500MA 500000 int mmi_discrete_config_pd_active(struct mmi_discrete_charger *chip, int val) { @@ -1920,6 +1972,7 @@ static int mmi_discrete_usb_plugout(struct mmi_discrete_charger * chip) vote(chip->usb_icl_votable, SW_ICL_MAX_VOTER, true, SDP_100_MA); vote(chip->usb_icl_votable, USB_PSY_VOTER, false, 0); vote(chip->usb_icl_votable, PD_VOTER, false, 0); + vote(chip->usb_icl_votable, QC3P_VOTER, false, 0); vote(chip->chg_disable_votable, MMI_HB_VOTER, true, 0); power_supply_changed(chip->usb_psy); mmi_info(chip, "%s\n",__func__); 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 097e914d1211..124a3a264ce4 100644 --- a/drivers/power/mmi_discrete_charger/mmi_discrete_charger_core.h +++ b/drivers/power/mmi_discrete_charger/mmi_discrete_charger_core.h @@ -30,6 +30,7 @@ #define HW_LIMIT_VOTER "HW_LIMIT_VOTER" #define DEFAULT_VOTER "DEFAULT_VOTER" #define PD_VOTER "PD_VOTER" +#define QC3P_VOTER "QC3P_VOTER" #define SDP_100_MA 100000 #define SDP_CURRENT_UA 500000 @@ -129,5 +130,9 @@ 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_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); +int mmi_discrete_config_input_current_settled(struct mmi_discrete_charger *chip, int val); #endif \ No newline at end of file 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 e369f70ee562..9fbdd9a6d964 100644 --- a/drivers/power/mmi_discrete_charger/mmi_discrete_charger_iio.c +++ b/drivers/power/mmi_discrete_charger/mmi_discrete_charger_iio.c @@ -29,6 +29,12 @@ static int mmi_discrete_iio_write_raw(struct iio_dev *indio_dev, case PSY_IIO_PD_ACTIVE: rc = mmi_discrete_config_pd_active(chip, val1); break; + case PSY_IIO_USB_CHARGING_ENABLED: + rc = mmi_discrete_config_charging_enabled(chip, val1); + break; + case PSY_IIO_INPUT_CURRENT_SETTLED: + rc = mmi_discrete_config_input_current_settled(chip, val1); + break; default: pr_err("Unsupported mmi_discrete IIO chan %d\n", chan->channel); rc = -EINVAL; @@ -48,13 +54,20 @@ static int mmi_discrete_iio_read_raw(struct iio_dev *indio_dev, { struct mmi_discrete_charger *chip = iio_priv(indio_dev); int rc = 0; - + bool val_bool = false; *val1 = 0; switch (chan->channel) { case PSY_IIO_USB_REAL_TYPE: *val1 = chip->real_charger_type; break; + case PSY_IIO_HW_CURRENT_MAX: + rc = mmi_discrete_get_hw_current_max(chip, val1); + break; + case PSY_IIO_USB_CHARGING_ENABLED: + rc = mmi_discrete_get_charging_enabled(chip, &val_bool); + *val1 = val_bool?1:0; + 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 0cc20ccd1627..8c45cf0afc03 100644 --- a/drivers/power/mmi_discrete_charger/mmi_discrete_charger_iio.h +++ b/drivers/power/mmi_discrete_charger/mmi_discrete_charger_iio.h @@ -44,6 +44,9 @@ static const struct mmi_discrete_iio_channels mmi_discrete_iio_psy_channels[] = MMI_DISCRETE_CHAN_INDEX("otg_enable", PSY_IIO_MMI_OTG_ENABLE) MMI_DISCRETE_CHAN_INDEX("typec_mode", PSY_IIO_TYPEC_MODE) MMI_DISCRETE_CHAN_INDEX("pd_active", PSY_IIO_PD_ACTIVE) + MMI_DISCRETE_CHAN_INDEX("hw_current_max", PSY_IIO_HW_CURRENT_MAX) + MMI_DISCRETE_CHAN_INDEX("charging_enabled", PSY_IIO_USB_CHARGING_ENABLED) + MMI_DISCRETE_CHAN_INDEX("input_current_settled", PSY_IIO_INPUT_CURRENT_SETTLED) }; int mmi_discrete_init_iio_psy(struct mmi_discrete_charger *chip,