diff --git a/drivers/power/mmi_discrete_charger/mmi_discrete_charger_class.c b/drivers/power/mmi_discrete_charger/mmi_discrete_charger_class.c index 66d61a4bcad6..7c17e62d294a 100644 --- a/drivers/power/mmi_discrete_charger/mmi_discrete_charger_class.c +++ b/drivers/power/mmi_discrete_charger/mmi_discrete_charger_class.c @@ -71,6 +71,16 @@ int charger_dev_enable_charging(struct charger_device *chg_dev, bool en) } EXPORT_SYMBOL(charger_dev_enable_charging); +int charger_dev_enable_termination(struct charger_device *chg_dev, bool en) +{ + if (chg_dev != NULL && chg_dev->ops != NULL && + chg_dev->ops->enable_termination) + return chg_dev->ops->enable_termination(chg_dev, en); + + return -ENOTSUPP; +} +EXPORT_SYMBOL(charger_dev_enable_termination); + int charger_dev_is_enabled_charging(struct charger_device *chg_dev, bool *en) { if (chg_dev != NULL && chg_dev->ops != NULL && 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 c11a22650e06..1ea61afd34c9 100644 --- a/drivers/power/mmi_discrete_charger/mmi_discrete_charger_core.c +++ b/drivers/power/mmi_discrete_charger/mmi_discrete_charger_core.c @@ -1952,6 +1952,21 @@ int mmi_discrete_config_charging_enabled(struct mmi_discrete_charger *chip, int return rc; } +int mmi_discrete_config_termination_enabled(struct mmi_discrete_charger *chip, int val) +{ + int rc = 0; + + mmi_dbg(chip, "mmi_discrete_config_termination_enabled val:%d\n",val); + + rc = charger_dev_enable_termination(chip->master_chg_dev, + val ? true:false); + if (rc) + mmi_err(chip, "Couldn't %s termination 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; 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 59cb6df7c83c..7f8b4410da7f 100644 --- a/drivers/power/mmi_discrete_charger/mmi_discrete_charger_core.h +++ b/drivers/power/mmi_discrete_charger/mmi_discrete_charger_core.h @@ -137,5 +137,6 @@ 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); +int mmi_discrete_config_termination_enabled(struct mmi_discrete_charger *chip, int val); -#endif \ No newline at end of file +#endif 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 9fbdd9a6d964..d6a50fcf1644 100644 --- a/drivers/power/mmi_discrete_charger/mmi_discrete_charger_iio.c +++ b/drivers/power/mmi_discrete_charger/mmi_discrete_charger_iio.c @@ -35,6 +35,9 @@ static int mmi_discrete_iio_write_raw(struct iio_dev *indio_dev, case PSY_IIO_INPUT_CURRENT_SETTLED: rc = mmi_discrete_config_input_current_settled(chip, val1); break; + case PSY_IIO_USB_TERMINATION_ENABLED: + rc = mmi_discrete_config_termination_enabled(chip, val1); + 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 8c45cf0afc03..cd3bbff31193 100644 --- a/drivers/power/mmi_discrete_charger/mmi_discrete_charger_iio.h +++ b/drivers/power/mmi_discrete_charger/mmi_discrete_charger_iio.h @@ -47,6 +47,7 @@ static const struct mmi_discrete_iio_channels mmi_discrete_iio_psy_channels[] = 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) + MMI_DISCRETE_CHAN_INDEX("termination_enabled", PSY_IIO_USB_TERMINATION_ENABLED) }; int mmi_discrete_init_iio_psy(struct mmi_discrete_charger *chip, diff --git a/include/linux/mmi_discrete_charger_class.h b/include/linux/mmi_discrete_charger_class.h index 3af78a49964d..f09d3fd88261 100644 --- a/include/linux/mmi_discrete_charger_class.h +++ b/include/linux/mmi_discrete_charger_class.h @@ -80,6 +80,7 @@ struct charger_ops { int (*is_charge_halted)(struct charger_device *dev, bool *en); int (*dump_registers)(struct charger_device *dev, struct seq_file *m); + int (*enable_termination)(struct charger_device *dev, bool en); }; #define to_charger_device(obj) container_of(obj, struct charger_device, dev) @@ -106,6 +107,8 @@ extern int charger_dev_get_charging_current(struct charger_device *chg_dev, u32 extern int charger_dev_enable_charging(struct charger_device *chg_dev, bool en); +extern int charger_dev_enable_termination(struct charger_device *chg_dev, bool en); + extern int charger_dev_is_enabled_charging(struct charger_device *chg_dev, bool *en); extern int charger_dev_dump_registers(struct charger_device *chg_dev, struct seq_file *m);