Loading drivers/power/supply/qcom/smb5-lib.c +40 −0 Original line number Diff line number Diff line Loading @@ -944,6 +944,9 @@ static int smblib_request_dpdm(struct smb_charger *chg, bool enable) { int rc = 0; if (chg->pr_swap_in_progress) return 0; /* fetch the DPDM regulator */ if (!chg->dpdm_reg && of_get_property(chg->dev->of_node, "dpdm-supply", NULL)) { Loading Loading @@ -4813,6 +4816,8 @@ void smblib_usb_plugin_locked(struct smb_charger *chg) chg->chg_freq.freq_removal); 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); if (rc < 0) smblib_err(chg, "Couldn't to enable DPDM rc=%d\n", rc); Loading Loading @@ -5941,14 +5946,24 @@ int smblib_get_prop_pr_swap_in_progress(struct smb_charger *chg, return 0; } #define DETACH_DETECT_DELAY_MS 20 int smblib_set_prop_pr_swap_in_progress(struct smb_charger *chg, const union power_supply_propval *val) { int rc; u8 stat = 0, orientation; smblib_dbg(chg, PR_MISC, "Requested PR_SWAP %d\n", 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, REDUCE_TCCDEBOUNCE_TO_2MS_BIT, val->intval ? REDUCE_TCCDEBOUNCE_TO_2MS_BIT : 0); Loading Loading @@ -6000,6 +6015,28 @@ int smblib_set_prop_pr_swap_in_progress(struct smb_charger *chg, /*************** * 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) { struct smb_charger *chg = container_of(work, struct smb_charger, Loading Loading @@ -6821,6 +6858,8 @@ int smblib_init(struct smb_charger *chg) INIT_DELAYED_WORK(&chg->usbov_dbc_work, smblib_usbov_dbc_work); INIT_DELAYED_WORK(&chg->role_reversal_check, smblib_dual_role_check_work); INIT_DELAYED_WORK(&chg->pr_swap_detach_work, smblib_pr_swap_detach_work); if (chg->wa_flags & CHG_TERMINATION_WA) { INIT_WORK(&chg->chg_termination_work, Loading Loading @@ -6962,6 +7001,7 @@ int smblib_deinit(struct smb_charger *chg) cancel_delayed_work_sync(&chg->thermal_regulation_work); cancel_delayed_work_sync(&chg->usbov_dbc_work); cancel_delayed_work_sync(&chg->role_reversal_check); cancel_delayed_work_sync(&chg->pr_swap_detach_work); power_supply_unreg_notifier(&chg->nb); smblib_destroy_votables(chg); qcom_step_chg_deinit(); Loading drivers/power/supply/qcom/smb5-lib.h +2 −0 Original line number Diff line number Diff line Loading @@ -79,6 +79,7 @@ enum print_reason { #define USB_SUSPEND_VOTER "USB_SUSPEND_VOTER" #define CHARGER_TYPE_VOTER "CHARGER_TYPE_VOTER" #define HDC_IRQ_VOTER "HDC_IRQ_VOTER" #define DETACH_DETECT_VOTER "DETACH_DETECT_VOTER" #define BOOST_BACK_STORM_COUNT 3 #define WEAK_CHG_STORM_COUNT 8 Loading Loading @@ -433,6 +434,7 @@ struct smb_charger { struct delayed_work thermal_regulation_work; struct delayed_work usbov_dbc_work; struct delayed_work role_reversal_check; struct delayed_work pr_swap_detach_work; struct alarm lpd_recheck_timer; struct alarm moisture_protection_alarm; Loading Loading
drivers/power/supply/qcom/smb5-lib.c +40 −0 Original line number Diff line number Diff line Loading @@ -944,6 +944,9 @@ static int smblib_request_dpdm(struct smb_charger *chg, bool enable) { int rc = 0; if (chg->pr_swap_in_progress) return 0; /* fetch the DPDM regulator */ if (!chg->dpdm_reg && of_get_property(chg->dev->of_node, "dpdm-supply", NULL)) { Loading Loading @@ -4813,6 +4816,8 @@ void smblib_usb_plugin_locked(struct smb_charger *chg) chg->chg_freq.freq_removal); 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); if (rc < 0) smblib_err(chg, "Couldn't to enable DPDM rc=%d\n", rc); Loading Loading @@ -5941,14 +5946,24 @@ int smblib_get_prop_pr_swap_in_progress(struct smb_charger *chg, return 0; } #define DETACH_DETECT_DELAY_MS 20 int smblib_set_prop_pr_swap_in_progress(struct smb_charger *chg, const union power_supply_propval *val) { int rc; u8 stat = 0, orientation; smblib_dbg(chg, PR_MISC, "Requested PR_SWAP %d\n", 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, REDUCE_TCCDEBOUNCE_TO_2MS_BIT, val->intval ? REDUCE_TCCDEBOUNCE_TO_2MS_BIT : 0); Loading Loading @@ -6000,6 +6015,28 @@ int smblib_set_prop_pr_swap_in_progress(struct smb_charger *chg, /*************** * 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) { struct smb_charger *chg = container_of(work, struct smb_charger, Loading Loading @@ -6821,6 +6858,8 @@ int smblib_init(struct smb_charger *chg) INIT_DELAYED_WORK(&chg->usbov_dbc_work, smblib_usbov_dbc_work); INIT_DELAYED_WORK(&chg->role_reversal_check, smblib_dual_role_check_work); INIT_DELAYED_WORK(&chg->pr_swap_detach_work, smblib_pr_swap_detach_work); if (chg->wa_flags & CHG_TERMINATION_WA) { INIT_WORK(&chg->chg_termination_work, Loading Loading @@ -6962,6 +7001,7 @@ int smblib_deinit(struct smb_charger *chg) cancel_delayed_work_sync(&chg->thermal_regulation_work); cancel_delayed_work_sync(&chg->usbov_dbc_work); cancel_delayed_work_sync(&chg->role_reversal_check); cancel_delayed_work_sync(&chg->pr_swap_detach_work); power_supply_unreg_notifier(&chg->nb); smblib_destroy_votables(chg); qcom_step_chg_deinit(); Loading
drivers/power/supply/qcom/smb5-lib.h +2 −0 Original line number Diff line number Diff line Loading @@ -79,6 +79,7 @@ enum print_reason { #define USB_SUSPEND_VOTER "USB_SUSPEND_VOTER" #define CHARGER_TYPE_VOTER "CHARGER_TYPE_VOTER" #define HDC_IRQ_VOTER "HDC_IRQ_VOTER" #define DETACH_DETECT_VOTER "DETACH_DETECT_VOTER" #define BOOST_BACK_STORM_COUNT 3 #define WEAK_CHG_STORM_COUNT 8 Loading Loading @@ -433,6 +434,7 @@ struct smb_charger { struct delayed_work thermal_regulation_work; struct delayed_work usbov_dbc_work; struct delayed_work role_reversal_check; struct delayed_work pr_swap_detach_work; struct alarm lpd_recheck_timer; struct alarm moisture_protection_alarm; Loading