Loading drivers/power/supply/power_supply_sysfs.c +1 −0 Original line number Original line Diff line number Diff line Loading @@ -456,6 +456,7 @@ static struct device_attribute power_supply_attrs[] = { POWER_SUPPLY_ATTR(therm_icl_limit), POWER_SUPPLY_ATTR(therm_icl_limit), POWER_SUPPLY_ATTR(dc_reset), POWER_SUPPLY_ATTR(dc_reset), POWER_SUPPLY_ATTR(voltage_max_limit), POWER_SUPPLY_ATTR(voltage_max_limit), POWER_SUPPLY_ATTR(real_capacity), /* Charge pump properties */ /* Charge pump properties */ POWER_SUPPLY_ATTR(cp_status1), POWER_SUPPLY_ATTR(cp_status1), POWER_SUPPLY_ATTR(cp_status2), POWER_SUPPLY_ATTR(cp_status2), Loading drivers/power/supply/qcom/smb1390-charger-psy.c +15 −0 Original line number Original line Diff line number Diff line Loading @@ -1235,6 +1235,20 @@ static int smb1390_remove(struct platform_device *pdev) return 0; return 0; } } static void smb1390_shutdown(struct platform_device *pdev) { struct smb1390 *chip = platform_get_drvdata(pdev); int rc; power_supply_unreg_notifier(&chip->nb); /* Disable SMB1390 */ smb1390_dbg(chip, PR_MISC, "Disabling SMB1390\n"); rc = smb1390_masked_write(chip, CORE_CONTROL1_REG, CMD_EN_SWITCHER_BIT, 0); if (rc < 0) pr_err("Couldn't disable chip rc=%d\n", rc); } static int smb1390_suspend(struct device *dev) static int smb1390_suspend(struct device *dev) { { struct smb1390 *chip = dev_get_drvdata(dev); struct smb1390 *chip = dev_get_drvdata(dev); Loading Loading @@ -1272,6 +1286,7 @@ static struct platform_driver smb1390_driver = { }, }, .probe = smb1390_probe, .probe = smb1390_probe, .remove = smb1390_remove, .remove = smb1390_remove, .shutdown = smb1390_shutdown, }; }; module_platform_driver(smb1390_driver); module_platform_driver(smb1390_driver); Loading drivers/power/supply/qcom/smb5-lib.c +40 −0 Original line number Original line Diff line number Diff line Loading @@ -951,6 +951,9 @@ static int smblib_request_dpdm(struct smb_charger *chg, bool enable) { { int rc = 0; int rc = 0; if (chg->pr_swap_in_progress) return 0; /* fetch the DPDM regulator */ /* fetch the DPDM regulator */ if (!chg->dpdm_reg && of_get_property(chg->dev->of_node, if (!chg->dpdm_reg && of_get_property(chg->dev->of_node, "dpdm-supply", NULL)) { "dpdm-supply", NULL)) { Loading Loading @@ -4952,6 +4955,8 @@ void smblib_usb_plugin_locked(struct smb_charger *chg) chg->chg_freq.freq_removal); chg->chg_freq.freq_removal); if (vbus_rising) { if (vbus_rising) { cancel_delayed_work_sync(&chg->pr_swap_detach_work); vote(chg->awake_votable, DETACH_DETECT_VOTER, false, 0); rc = smblib_request_dpdm(chg, true); rc = smblib_request_dpdm(chg, true); if (rc < 0) if (rc < 0) smblib_err(chg, "Couldn't to enable DPDM rc=%d\n", rc); smblib_err(chg, "Couldn't to enable DPDM rc=%d\n", rc); Loading Loading @@ -6073,14 +6078,24 @@ int smblib_get_prop_pr_swap_in_progress(struct smb_charger *chg, return 0; return 0; } } #define DETACH_DETECT_DELAY_MS 20 int smblib_set_prop_pr_swap_in_progress(struct smb_charger *chg, int smblib_set_prop_pr_swap_in_progress(struct smb_charger *chg, const union power_supply_propval *val) const union power_supply_propval *val) { { int rc; int rc; u8 stat = 0, orientation; u8 stat = 0, orientation; smblib_dbg(chg, PR_MISC, "Requested PR_SWAP %d\n", val->intval); chg->pr_swap_in_progress = val->intval; chg->pr_swap_in_progress = val->intval; /* check for cable removal during pr_swap */ if (!chg->pr_swap_in_progress) { cancel_delayed_work_sync(&chg->pr_swap_detach_work); vote(chg->awake_votable, DETACH_DETECT_VOTER, true, 0); schedule_delayed_work(&chg->pr_swap_detach_work, msecs_to_jiffies(DETACH_DETECT_DELAY_MS)); } rc = smblib_masked_write(chg, TYPE_C_DEBOUNCE_OPTION_REG, rc = smblib_masked_write(chg, TYPE_C_DEBOUNCE_OPTION_REG, REDUCE_TCCDEBOUNCE_TO_2MS_BIT, REDUCE_TCCDEBOUNCE_TO_2MS_BIT, val->intval ? REDUCE_TCCDEBOUNCE_TO_2MS_BIT : 0); val->intval ? REDUCE_TCCDEBOUNCE_TO_2MS_BIT : 0); Loading Loading @@ -6132,6 +6147,28 @@ int smblib_set_prop_pr_swap_in_progress(struct smb_charger *chg, /*************** /*************** * Work Queues * * Work Queues * ***************/ ***************/ static void smblib_pr_swap_detach_work(struct work_struct *work) { struct smb_charger *chg = container_of(work, struct smb_charger, pr_swap_detach_work.work); int rc; u8 stat; rc = smblib_read(chg, TYPE_C_STATE_MACHINE_STATUS_REG, &stat); if (rc < 0) { smblib_err(chg, "Couldn't read STATE_MACHINE_STS rc=%d\n", rc); goto out; } smblib_dbg(chg, PR_REGISTER, "STATE_MACHINE_STS %x\n", stat); if (!(stat & TYPEC_ATTACH_DETACH_STATE_BIT)) { rc = smblib_request_dpdm(chg, false); if (rc < 0) smblib_err(chg, "Couldn't disable DPDM rc=%d\n", rc); } out: vote(chg->awake_votable, DETACH_DETECT_VOTER, false, 0); } static void smblib_uusb_otg_work(struct work_struct *work) static void smblib_uusb_otg_work(struct work_struct *work) { { struct smb_charger *chg = container_of(work, struct smb_charger, struct smb_charger *chg = container_of(work, struct smb_charger, Loading Loading @@ -6860,6 +6897,8 @@ int smblib_init(struct smb_charger *chg) INIT_DELAYED_WORK(&chg->thermal_regulation_work, INIT_DELAYED_WORK(&chg->thermal_regulation_work, smblib_thermal_regulation_work); smblib_thermal_regulation_work); INIT_DELAYED_WORK(&chg->usbov_dbc_work, smblib_usbov_dbc_work); INIT_DELAYED_WORK(&chg->usbov_dbc_work, smblib_usbov_dbc_work); INIT_DELAYED_WORK(&chg->pr_swap_detach_work, smblib_pr_swap_detach_work); if (chg->wa_flags & CHG_TERMINATION_WA) { if (chg->wa_flags & CHG_TERMINATION_WA) { INIT_WORK(&chg->chg_termination_work, INIT_WORK(&chg->chg_termination_work, Loading Loading @@ -6999,6 +7038,7 @@ int smblib_deinit(struct smb_charger *chg) cancel_delayed_work_sync(&chg->lpd_detach_work); cancel_delayed_work_sync(&chg->lpd_detach_work); cancel_delayed_work_sync(&chg->thermal_regulation_work); cancel_delayed_work_sync(&chg->thermal_regulation_work); cancel_delayed_work_sync(&chg->usbov_dbc_work); cancel_delayed_work_sync(&chg->usbov_dbc_work); cancel_delayed_work_sync(&chg->pr_swap_detach_work); power_supply_unreg_notifier(&chg->nb); power_supply_unreg_notifier(&chg->nb); smblib_destroy_votables(chg); smblib_destroy_votables(chg); qcom_step_chg_deinit(); qcom_step_chg_deinit(); Loading drivers/power/supply/qcom/smb5-lib.h +2 −0 Original line number Original line Diff line number Diff line Loading @@ -70,6 +70,7 @@ enum print_reason { #define USB_SUSPEND_VOTER "USB_SUSPEND_VOTER" #define USB_SUSPEND_VOTER "USB_SUSPEND_VOTER" #define CHARGER_TYPE_VOTER "CHARGER_TYPE_VOTER" #define CHARGER_TYPE_VOTER "CHARGER_TYPE_VOTER" #define HDC_IRQ_VOTER "HDC_IRQ_VOTER" #define HDC_IRQ_VOTER "HDC_IRQ_VOTER" #define DETACH_DETECT_VOTER "DETACH_DETECT_VOTER" #define BOOST_BACK_STORM_COUNT 3 #define BOOST_BACK_STORM_COUNT 3 #define WEAK_CHG_STORM_COUNT 8 #define WEAK_CHG_STORM_COUNT 8 Loading Loading @@ -417,6 +418,7 @@ struct smb_charger { struct delayed_work lpd_detach_work; struct delayed_work lpd_detach_work; struct delayed_work thermal_regulation_work; struct delayed_work thermal_regulation_work; struct delayed_work usbov_dbc_work; struct delayed_work usbov_dbc_work; struct delayed_work pr_swap_detach_work; struct alarm lpd_recheck_timer; struct alarm lpd_recheck_timer; struct alarm moisture_protection_alarm; struct alarm moisture_protection_alarm; Loading include/linux/power_supply.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -336,6 +336,7 @@ enum power_supply_property { POWER_SUPPLY_PROP_THERM_ICL_LIMIT, POWER_SUPPLY_PROP_THERM_ICL_LIMIT, POWER_SUPPLY_PROP_DC_RESET, POWER_SUPPLY_PROP_DC_RESET, POWER_SUPPLY_PROP_VOLTAGE_MAX_LIMIT, POWER_SUPPLY_PROP_VOLTAGE_MAX_LIMIT, POWER_SUPPLY_PROP_REAL_CAPACITY, /* Charge pump properties */ /* Charge pump properties */ POWER_SUPPLY_PROP_CP_STATUS1, POWER_SUPPLY_PROP_CP_STATUS1, POWER_SUPPLY_PROP_CP_STATUS2, POWER_SUPPLY_PROP_CP_STATUS2, Loading Loading
drivers/power/supply/power_supply_sysfs.c +1 −0 Original line number Original line Diff line number Diff line Loading @@ -456,6 +456,7 @@ static struct device_attribute power_supply_attrs[] = { POWER_SUPPLY_ATTR(therm_icl_limit), POWER_SUPPLY_ATTR(therm_icl_limit), POWER_SUPPLY_ATTR(dc_reset), POWER_SUPPLY_ATTR(dc_reset), POWER_SUPPLY_ATTR(voltage_max_limit), POWER_SUPPLY_ATTR(voltage_max_limit), POWER_SUPPLY_ATTR(real_capacity), /* Charge pump properties */ /* Charge pump properties */ POWER_SUPPLY_ATTR(cp_status1), POWER_SUPPLY_ATTR(cp_status1), POWER_SUPPLY_ATTR(cp_status2), POWER_SUPPLY_ATTR(cp_status2), Loading
drivers/power/supply/qcom/smb1390-charger-psy.c +15 −0 Original line number Original line Diff line number Diff line Loading @@ -1235,6 +1235,20 @@ static int smb1390_remove(struct platform_device *pdev) return 0; return 0; } } static void smb1390_shutdown(struct platform_device *pdev) { struct smb1390 *chip = platform_get_drvdata(pdev); int rc; power_supply_unreg_notifier(&chip->nb); /* Disable SMB1390 */ smb1390_dbg(chip, PR_MISC, "Disabling SMB1390\n"); rc = smb1390_masked_write(chip, CORE_CONTROL1_REG, CMD_EN_SWITCHER_BIT, 0); if (rc < 0) pr_err("Couldn't disable chip rc=%d\n", rc); } static int smb1390_suspend(struct device *dev) static int smb1390_suspend(struct device *dev) { { struct smb1390 *chip = dev_get_drvdata(dev); struct smb1390 *chip = dev_get_drvdata(dev); Loading Loading @@ -1272,6 +1286,7 @@ static struct platform_driver smb1390_driver = { }, }, .probe = smb1390_probe, .probe = smb1390_probe, .remove = smb1390_remove, .remove = smb1390_remove, .shutdown = smb1390_shutdown, }; }; module_platform_driver(smb1390_driver); module_platform_driver(smb1390_driver); Loading
drivers/power/supply/qcom/smb5-lib.c +40 −0 Original line number Original line Diff line number Diff line Loading @@ -951,6 +951,9 @@ static int smblib_request_dpdm(struct smb_charger *chg, bool enable) { { int rc = 0; int rc = 0; if (chg->pr_swap_in_progress) return 0; /* fetch the DPDM regulator */ /* fetch the DPDM regulator */ if (!chg->dpdm_reg && of_get_property(chg->dev->of_node, if (!chg->dpdm_reg && of_get_property(chg->dev->of_node, "dpdm-supply", NULL)) { "dpdm-supply", NULL)) { Loading Loading @@ -4952,6 +4955,8 @@ void smblib_usb_plugin_locked(struct smb_charger *chg) chg->chg_freq.freq_removal); chg->chg_freq.freq_removal); if (vbus_rising) { if (vbus_rising) { cancel_delayed_work_sync(&chg->pr_swap_detach_work); vote(chg->awake_votable, DETACH_DETECT_VOTER, false, 0); rc = smblib_request_dpdm(chg, true); rc = smblib_request_dpdm(chg, true); if (rc < 0) if (rc < 0) smblib_err(chg, "Couldn't to enable DPDM rc=%d\n", rc); smblib_err(chg, "Couldn't to enable DPDM rc=%d\n", rc); Loading Loading @@ -6073,14 +6078,24 @@ int smblib_get_prop_pr_swap_in_progress(struct smb_charger *chg, return 0; return 0; } } #define DETACH_DETECT_DELAY_MS 20 int smblib_set_prop_pr_swap_in_progress(struct smb_charger *chg, int smblib_set_prop_pr_swap_in_progress(struct smb_charger *chg, const union power_supply_propval *val) const union power_supply_propval *val) { { int rc; int rc; u8 stat = 0, orientation; u8 stat = 0, orientation; smblib_dbg(chg, PR_MISC, "Requested PR_SWAP %d\n", val->intval); chg->pr_swap_in_progress = val->intval; chg->pr_swap_in_progress = val->intval; /* check for cable removal during pr_swap */ if (!chg->pr_swap_in_progress) { cancel_delayed_work_sync(&chg->pr_swap_detach_work); vote(chg->awake_votable, DETACH_DETECT_VOTER, true, 0); schedule_delayed_work(&chg->pr_swap_detach_work, msecs_to_jiffies(DETACH_DETECT_DELAY_MS)); } rc = smblib_masked_write(chg, TYPE_C_DEBOUNCE_OPTION_REG, rc = smblib_masked_write(chg, TYPE_C_DEBOUNCE_OPTION_REG, REDUCE_TCCDEBOUNCE_TO_2MS_BIT, REDUCE_TCCDEBOUNCE_TO_2MS_BIT, val->intval ? REDUCE_TCCDEBOUNCE_TO_2MS_BIT : 0); val->intval ? REDUCE_TCCDEBOUNCE_TO_2MS_BIT : 0); Loading Loading @@ -6132,6 +6147,28 @@ int smblib_set_prop_pr_swap_in_progress(struct smb_charger *chg, /*************** /*************** * Work Queues * * Work Queues * ***************/ ***************/ static void smblib_pr_swap_detach_work(struct work_struct *work) { struct smb_charger *chg = container_of(work, struct smb_charger, pr_swap_detach_work.work); int rc; u8 stat; rc = smblib_read(chg, TYPE_C_STATE_MACHINE_STATUS_REG, &stat); if (rc < 0) { smblib_err(chg, "Couldn't read STATE_MACHINE_STS rc=%d\n", rc); goto out; } smblib_dbg(chg, PR_REGISTER, "STATE_MACHINE_STS %x\n", stat); if (!(stat & TYPEC_ATTACH_DETACH_STATE_BIT)) { rc = smblib_request_dpdm(chg, false); if (rc < 0) smblib_err(chg, "Couldn't disable DPDM rc=%d\n", rc); } out: vote(chg->awake_votable, DETACH_DETECT_VOTER, false, 0); } static void smblib_uusb_otg_work(struct work_struct *work) static void smblib_uusb_otg_work(struct work_struct *work) { { struct smb_charger *chg = container_of(work, struct smb_charger, struct smb_charger *chg = container_of(work, struct smb_charger, Loading Loading @@ -6860,6 +6897,8 @@ int smblib_init(struct smb_charger *chg) INIT_DELAYED_WORK(&chg->thermal_regulation_work, INIT_DELAYED_WORK(&chg->thermal_regulation_work, smblib_thermal_regulation_work); smblib_thermal_regulation_work); INIT_DELAYED_WORK(&chg->usbov_dbc_work, smblib_usbov_dbc_work); INIT_DELAYED_WORK(&chg->usbov_dbc_work, smblib_usbov_dbc_work); INIT_DELAYED_WORK(&chg->pr_swap_detach_work, smblib_pr_swap_detach_work); if (chg->wa_flags & CHG_TERMINATION_WA) { if (chg->wa_flags & CHG_TERMINATION_WA) { INIT_WORK(&chg->chg_termination_work, INIT_WORK(&chg->chg_termination_work, Loading Loading @@ -6999,6 +7038,7 @@ int smblib_deinit(struct smb_charger *chg) cancel_delayed_work_sync(&chg->lpd_detach_work); cancel_delayed_work_sync(&chg->lpd_detach_work); cancel_delayed_work_sync(&chg->thermal_regulation_work); cancel_delayed_work_sync(&chg->thermal_regulation_work); cancel_delayed_work_sync(&chg->usbov_dbc_work); cancel_delayed_work_sync(&chg->usbov_dbc_work); cancel_delayed_work_sync(&chg->pr_swap_detach_work); power_supply_unreg_notifier(&chg->nb); power_supply_unreg_notifier(&chg->nb); smblib_destroy_votables(chg); smblib_destroy_votables(chg); qcom_step_chg_deinit(); qcom_step_chg_deinit(); Loading
drivers/power/supply/qcom/smb5-lib.h +2 −0 Original line number Original line Diff line number Diff line Loading @@ -70,6 +70,7 @@ enum print_reason { #define USB_SUSPEND_VOTER "USB_SUSPEND_VOTER" #define USB_SUSPEND_VOTER "USB_SUSPEND_VOTER" #define CHARGER_TYPE_VOTER "CHARGER_TYPE_VOTER" #define CHARGER_TYPE_VOTER "CHARGER_TYPE_VOTER" #define HDC_IRQ_VOTER "HDC_IRQ_VOTER" #define HDC_IRQ_VOTER "HDC_IRQ_VOTER" #define DETACH_DETECT_VOTER "DETACH_DETECT_VOTER" #define BOOST_BACK_STORM_COUNT 3 #define BOOST_BACK_STORM_COUNT 3 #define WEAK_CHG_STORM_COUNT 8 #define WEAK_CHG_STORM_COUNT 8 Loading Loading @@ -417,6 +418,7 @@ struct smb_charger { struct delayed_work lpd_detach_work; struct delayed_work lpd_detach_work; struct delayed_work thermal_regulation_work; struct delayed_work thermal_regulation_work; struct delayed_work usbov_dbc_work; struct delayed_work usbov_dbc_work; struct delayed_work pr_swap_detach_work; struct alarm lpd_recheck_timer; struct alarm lpd_recheck_timer; struct alarm moisture_protection_alarm; struct alarm moisture_protection_alarm; Loading
include/linux/power_supply.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -336,6 +336,7 @@ enum power_supply_property { POWER_SUPPLY_PROP_THERM_ICL_LIMIT, POWER_SUPPLY_PROP_THERM_ICL_LIMIT, POWER_SUPPLY_PROP_DC_RESET, POWER_SUPPLY_PROP_DC_RESET, POWER_SUPPLY_PROP_VOLTAGE_MAX_LIMIT, POWER_SUPPLY_PROP_VOLTAGE_MAX_LIMIT, POWER_SUPPLY_PROP_REAL_CAPACITY, /* Charge pump properties */ /* Charge pump properties */ POWER_SUPPLY_PROP_CP_STATUS1, POWER_SUPPLY_PROP_CP_STATUS1, POWER_SUPPLY_PROP_CP_STATUS2, POWER_SUPPLY_PROP_CP_STATUS2, Loading