Loading drivers/power/supply/qcom/qpnp-smb5.c +2 −2 Original line number Diff line number Diff line Loading @@ -282,7 +282,7 @@ static int smb5_chg_config_init(struct smb5 *chip) break; case PMI632_SUBTYPE: chip->chg.smb_version = PMI632_SUBTYPE; chg->wa_flags |= WEAK_ADAPTER_WA; chg->wa_flags |= WEAK_ADAPTER_WA | USBIN_OV_WA; if (pmic_rev_id->rev4 >= 2) chg->wa_flags |= MOISTURE_PROTECTION_WA; chg->param = smb5_pmi632_params; Loading Loading @@ -2428,7 +2428,7 @@ static struct smb_irq_info smb5_irqs[] = { }, [USBIN_OV_IRQ] = { .name = "usbin-ov", .handler = default_irq_handler, .handler = usbin_ov_irq_handler, }, [USBIN_PLUGIN_IRQ] = { .name = "usbin-plugin", Loading drivers/power/supply/qcom/smb5-lib.c +83 −1 Original line number Diff line number Diff line Loading @@ -801,6 +801,11 @@ static void smblib_uusb_removal(struct smb_charger *chg) smblib_err(chg, "Couldn't set USBIN_ADAPTER_ALLOW_5V_OR_9V_TO_12V rc=%d\n", rc); /* reset USBOV votes and cancel work */ cancel_delayed_work_sync(&chg->usbov_dbc_work); vote(chg->awake_votable, USBOV_DBC_VOTER, false, 0); chg->dbc_usbov = false; chg->voltage_min_uv = MICRO_5V; chg->voltage_max_uv = MICRO_5V; chg->usb_icl_delta_ua = 0; Loading Loading @@ -1393,7 +1398,32 @@ int smblib_get_prop_batt_status(struct smb_charger *chg, union power_supply_propval pval = {0, }; bool usb_online, dc_online; u8 stat; int rc; int rc, suspend = 0; if (chg->dbc_usbov) { rc = smblib_get_prop_usb_present(chg, &pval); if (rc < 0) { smblib_err(chg, "Couldn't get usb present prop rc=%d\n", rc); return rc; } rc = smblib_get_usb_suspend(chg, &suspend); if (rc < 0) { smblib_err(chg, "Couldn't get usb suspend rc=%d\n", rc); return rc; } /* * Report charging as long as USBOV is not debounced and * charging path is un-suspended. */ if (pval.intval && !suspend) { val->intval = POWER_SUPPLY_STATUS_CHARGING; return 0; } } rc = smblib_get_prop_usb_online(chg, &pval); if (rc < 0) { Loading Loading @@ -3443,6 +3473,11 @@ static void typec_src_removal(struct smb_charger *chg) vote(chg->pl_enable_votable_indirect, USBIN_V_VOTER, false, 0); vote(chg->awake_votable, PL_DELAY_VOTER, false, 0); /* reset USBOV votes and cancel work */ cancel_delayed_work_sync(&chg->usbov_dbc_work); vote(chg->awake_votable, USBOV_DBC_VOTER, false, 0); chg->dbc_usbov = false; chg->pulse_cnt = 0; chg->usb_icl_delta_ua = 0; chg->voltage_min_uv = MICRO_5V; Loading Loading @@ -3724,6 +3759,51 @@ irqreturn_t wdog_bark_irq_handler(int irq, void *data) return IRQ_HANDLED; } static void smblib_usbov_dbc_work(struct work_struct *work) { struct smb_charger *chg = container_of(work, struct smb_charger, usbov_dbc_work.work); smblib_dbg(chg, PR_MISC, "Resetting USBOV debounce\n"); chg->dbc_usbov = false; vote(chg->awake_votable, USBOV_DBC_VOTER, false, 0); } irqreturn_t usbin_ov_irq_handler(int irq, void *data) { struct smb_irq_data *irq_data = data; struct smb_charger *chg = irq_data->parent_data; u8 stat; int rc; if (!(chg->wa_flags & USBIN_OV_WA)) goto out; rc = smblib_read(chg, USBIN_BASE + INT_RT_STS_OFFSET, &stat); if (rc < 0) { smblib_err(chg, "Couldn't read USB_INT_RT_STS rc=%d\n", rc); goto out; } smblib_dbg(chg, PR_INTERRUPT, "IRQ: %s stat=%x\n", irq_data->name, !!stat); if (stat & USBIN_OV_RT_STS_BIT) { chg->dbc_usbov = true; vote(chg->awake_votable, USBOV_DBC_VOTER, true, 0); schedule_delayed_work(&chg->usbov_dbc_work, msecs_to_jiffies(1000)); } else { cancel_delayed_work_sync(&chg->usbov_dbc_work); chg->dbc_usbov = false; vote(chg->awake_votable, USBOV_DBC_VOTER, true, 0); } out: smblib_dbg(chg, PR_MISC, "USBOV debounce status %d\n", chg->dbc_usbov); return IRQ_HANDLED; } /************** * Additional USB PSY getters/setters * that call interrupt functions Loading Loading @@ -4188,6 +4268,7 @@ int smblib_init(struct smb_charger *chg) INIT_DELAYED_WORK(&chg->pl_enable_work, smblib_pl_enable_work); INIT_DELAYED_WORK(&chg->uusb_otg_work, smblib_uusb_otg_work); INIT_DELAYED_WORK(&chg->bb_removal_work, smblib_bb_removal_work); INIT_DELAYED_WORK(&chg->usbov_dbc_work, smblib_usbov_dbc_work); if (chg->moisture_protection_enabled && (chg->wa_flags & MOISTURE_PROTECTION_WA)) { Loading Loading @@ -4277,6 +4358,7 @@ int smblib_deinit(struct smb_charger *chg) cancel_delayed_work_sync(&chg->pl_enable_work); cancel_delayed_work_sync(&chg->uusb_otg_work); cancel_delayed_work_sync(&chg->bb_removal_work); cancel_delayed_work_sync(&chg->usbov_dbc_work); power_supply_unreg_notifier(&chg->nb); smblib_destroy_votables(chg); qcom_step_chg_deinit(); Loading drivers/power/supply/qcom/smb5-lib.h +5 −0 Original line number Diff line number Diff line Loading @@ -70,6 +70,7 @@ enum print_reason { #define FORCE_RECHARGE_VOTER "FORCE_RECHARGE_VOTER" #define AICL_THRESHOLD_VOTER "AICL_THRESHOLD_VOTER" #define MOISTURE_VOTER "MOISTURE_VOTER" #define USBOV_DBC_VOTER "USBOV_DBC_VOTER" #define BOOST_BACK_STORM_COUNT 3 #define WEAK_CHG_STORM_COUNT 8 Loading Loading @@ -101,6 +102,7 @@ enum { BOOST_BACK_WA = BIT(0), WEAK_ADAPTER_WA = BIT(1), MOISTURE_PROTECTION_WA = BIT(2), USBIN_OV_WA = BIT(3), }; enum { Loading Loading @@ -348,6 +350,7 @@ struct smb_charger { struct delayed_work pl_enable_work; struct delayed_work uusb_otg_work; struct delayed_work bb_removal_work; struct delayed_work usbov_dbc_work; /* alarm */ struct alarm moisture_protection_alarm; Loading Loading @@ -406,6 +409,7 @@ struct smb_charger { /* workaround flag */ u32 wa_flags; int boost_current_ua; bool dbc_usbov; /* extcon for VBUS / ID notification to USB for uUSB */ struct extcon_dev *extcon; Loading Loading @@ -478,6 +482,7 @@ irqreturn_t high_duty_cycle_irq_handler(int irq, void *data); irqreturn_t switcher_power_ok_irq_handler(int irq, void *data); irqreturn_t wdog_bark_irq_handler(int irq, void *data); irqreturn_t typec_or_rid_detection_change_irq_handler(int irq, void *data); irqreturn_t usbin_ov_irq_handler(int irq, void *data); int smblib_get_prop_input_suspend(struct smb_charger *chg, union power_supply_propval *val); Loading Loading
drivers/power/supply/qcom/qpnp-smb5.c +2 −2 Original line number Diff line number Diff line Loading @@ -282,7 +282,7 @@ static int smb5_chg_config_init(struct smb5 *chip) break; case PMI632_SUBTYPE: chip->chg.smb_version = PMI632_SUBTYPE; chg->wa_flags |= WEAK_ADAPTER_WA; chg->wa_flags |= WEAK_ADAPTER_WA | USBIN_OV_WA; if (pmic_rev_id->rev4 >= 2) chg->wa_flags |= MOISTURE_PROTECTION_WA; chg->param = smb5_pmi632_params; Loading Loading @@ -2428,7 +2428,7 @@ static struct smb_irq_info smb5_irqs[] = { }, [USBIN_OV_IRQ] = { .name = "usbin-ov", .handler = default_irq_handler, .handler = usbin_ov_irq_handler, }, [USBIN_PLUGIN_IRQ] = { .name = "usbin-plugin", Loading
drivers/power/supply/qcom/smb5-lib.c +83 −1 Original line number Diff line number Diff line Loading @@ -801,6 +801,11 @@ static void smblib_uusb_removal(struct smb_charger *chg) smblib_err(chg, "Couldn't set USBIN_ADAPTER_ALLOW_5V_OR_9V_TO_12V rc=%d\n", rc); /* reset USBOV votes and cancel work */ cancel_delayed_work_sync(&chg->usbov_dbc_work); vote(chg->awake_votable, USBOV_DBC_VOTER, false, 0); chg->dbc_usbov = false; chg->voltage_min_uv = MICRO_5V; chg->voltage_max_uv = MICRO_5V; chg->usb_icl_delta_ua = 0; Loading Loading @@ -1393,7 +1398,32 @@ int smblib_get_prop_batt_status(struct smb_charger *chg, union power_supply_propval pval = {0, }; bool usb_online, dc_online; u8 stat; int rc; int rc, suspend = 0; if (chg->dbc_usbov) { rc = smblib_get_prop_usb_present(chg, &pval); if (rc < 0) { smblib_err(chg, "Couldn't get usb present prop rc=%d\n", rc); return rc; } rc = smblib_get_usb_suspend(chg, &suspend); if (rc < 0) { smblib_err(chg, "Couldn't get usb suspend rc=%d\n", rc); return rc; } /* * Report charging as long as USBOV is not debounced and * charging path is un-suspended. */ if (pval.intval && !suspend) { val->intval = POWER_SUPPLY_STATUS_CHARGING; return 0; } } rc = smblib_get_prop_usb_online(chg, &pval); if (rc < 0) { Loading Loading @@ -3443,6 +3473,11 @@ static void typec_src_removal(struct smb_charger *chg) vote(chg->pl_enable_votable_indirect, USBIN_V_VOTER, false, 0); vote(chg->awake_votable, PL_DELAY_VOTER, false, 0); /* reset USBOV votes and cancel work */ cancel_delayed_work_sync(&chg->usbov_dbc_work); vote(chg->awake_votable, USBOV_DBC_VOTER, false, 0); chg->dbc_usbov = false; chg->pulse_cnt = 0; chg->usb_icl_delta_ua = 0; chg->voltage_min_uv = MICRO_5V; Loading Loading @@ -3724,6 +3759,51 @@ irqreturn_t wdog_bark_irq_handler(int irq, void *data) return IRQ_HANDLED; } static void smblib_usbov_dbc_work(struct work_struct *work) { struct smb_charger *chg = container_of(work, struct smb_charger, usbov_dbc_work.work); smblib_dbg(chg, PR_MISC, "Resetting USBOV debounce\n"); chg->dbc_usbov = false; vote(chg->awake_votable, USBOV_DBC_VOTER, false, 0); } irqreturn_t usbin_ov_irq_handler(int irq, void *data) { struct smb_irq_data *irq_data = data; struct smb_charger *chg = irq_data->parent_data; u8 stat; int rc; if (!(chg->wa_flags & USBIN_OV_WA)) goto out; rc = smblib_read(chg, USBIN_BASE + INT_RT_STS_OFFSET, &stat); if (rc < 0) { smblib_err(chg, "Couldn't read USB_INT_RT_STS rc=%d\n", rc); goto out; } smblib_dbg(chg, PR_INTERRUPT, "IRQ: %s stat=%x\n", irq_data->name, !!stat); if (stat & USBIN_OV_RT_STS_BIT) { chg->dbc_usbov = true; vote(chg->awake_votable, USBOV_DBC_VOTER, true, 0); schedule_delayed_work(&chg->usbov_dbc_work, msecs_to_jiffies(1000)); } else { cancel_delayed_work_sync(&chg->usbov_dbc_work); chg->dbc_usbov = false; vote(chg->awake_votable, USBOV_DBC_VOTER, true, 0); } out: smblib_dbg(chg, PR_MISC, "USBOV debounce status %d\n", chg->dbc_usbov); return IRQ_HANDLED; } /************** * Additional USB PSY getters/setters * that call interrupt functions Loading Loading @@ -4188,6 +4268,7 @@ int smblib_init(struct smb_charger *chg) INIT_DELAYED_WORK(&chg->pl_enable_work, smblib_pl_enable_work); INIT_DELAYED_WORK(&chg->uusb_otg_work, smblib_uusb_otg_work); INIT_DELAYED_WORK(&chg->bb_removal_work, smblib_bb_removal_work); INIT_DELAYED_WORK(&chg->usbov_dbc_work, smblib_usbov_dbc_work); if (chg->moisture_protection_enabled && (chg->wa_flags & MOISTURE_PROTECTION_WA)) { Loading Loading @@ -4277,6 +4358,7 @@ int smblib_deinit(struct smb_charger *chg) cancel_delayed_work_sync(&chg->pl_enable_work); cancel_delayed_work_sync(&chg->uusb_otg_work); cancel_delayed_work_sync(&chg->bb_removal_work); cancel_delayed_work_sync(&chg->usbov_dbc_work); power_supply_unreg_notifier(&chg->nb); smblib_destroy_votables(chg); qcom_step_chg_deinit(); Loading
drivers/power/supply/qcom/smb5-lib.h +5 −0 Original line number Diff line number Diff line Loading @@ -70,6 +70,7 @@ enum print_reason { #define FORCE_RECHARGE_VOTER "FORCE_RECHARGE_VOTER" #define AICL_THRESHOLD_VOTER "AICL_THRESHOLD_VOTER" #define MOISTURE_VOTER "MOISTURE_VOTER" #define USBOV_DBC_VOTER "USBOV_DBC_VOTER" #define BOOST_BACK_STORM_COUNT 3 #define WEAK_CHG_STORM_COUNT 8 Loading Loading @@ -101,6 +102,7 @@ enum { BOOST_BACK_WA = BIT(0), WEAK_ADAPTER_WA = BIT(1), MOISTURE_PROTECTION_WA = BIT(2), USBIN_OV_WA = BIT(3), }; enum { Loading Loading @@ -348,6 +350,7 @@ struct smb_charger { struct delayed_work pl_enable_work; struct delayed_work uusb_otg_work; struct delayed_work bb_removal_work; struct delayed_work usbov_dbc_work; /* alarm */ struct alarm moisture_protection_alarm; Loading Loading @@ -406,6 +409,7 @@ struct smb_charger { /* workaround flag */ u32 wa_flags; int boost_current_ua; bool dbc_usbov; /* extcon for VBUS / ID notification to USB for uUSB */ struct extcon_dev *extcon; Loading Loading @@ -478,6 +482,7 @@ irqreturn_t high_duty_cycle_irq_handler(int irq, void *data); irqreturn_t switcher_power_ok_irq_handler(int irq, void *data); irqreturn_t wdog_bark_irq_handler(int irq, void *data); irqreturn_t typec_or_rid_detection_change_irq_handler(int irq, void *data); irqreturn_t usbin_ov_irq_handler(int irq, void *data); int smblib_get_prop_input_suspend(struct smb_charger *chg, union power_supply_propval *val); Loading