Loading drivers/power/supply/qcom/smb5-lib.c +25 −4 Original line number Diff line number Diff line Loading @@ -1843,11 +1843,21 @@ int smblib_dp_dm(struct smb_charger *chg, int val) pr_err("Failed to force 5V\n"); break; case POWER_SUPPLY_DP_DM_FORCE_9V: if (chg->qc2_unsupported_voltage == QC2_NON_COMPLIANT_9V) { smblib_err(chg, "Couldn't set 9V: unsupported\n"); return -EINVAL; } rc = smblib_force_vbus_voltage(chg, FORCE_9V_BIT); if (rc < 0) pr_err("Failed to force 9V\n"); break; case POWER_SUPPLY_DP_DM_FORCE_12V: if (chg->qc2_unsupported_voltage == QC2_NON_COMPLIANT_12V) { smblib_err(chg, "Couldn't set 12V: unsupported\n"); return -EINVAL; } rc = smblib_force_vbus_voltage(chg, FORCE_12V_BIT); if (rc < 0) pr_err("Failed to force 12V\n"); Loading Loading @@ -2044,6 +2054,15 @@ int smblib_get_prop_usb_voltage_max(struct smb_charger *chg, { switch (chg->real_charger_type) { case POWER_SUPPLY_TYPE_USB_HVDCP: if (chg->qc2_unsupported_voltage == QC2_NON_COMPLIANT_9V) { val->intval = MICRO_5V; break; } else if (chg->qc2_unsupported_voltage == QC2_NON_COMPLIANT_12V) { val->intval = MICRO_9V; break; } /* else, fallthrough */ case POWER_SUPPLY_TYPE_USB_HVDCP_3: case POWER_SUPPLY_TYPE_USB_PD: if (chg->smb_version == PMI632_SUBTYPE) Loading Loading @@ -3135,7 +3154,8 @@ irqreturn_t usbin_uv_irq_handler(int irq, void *data) wdata = &chg->irq_info[SWITCHER_POWER_OK_IRQ].irq_data->storm_data; reset_storm_count(wdata); if (!chg->non_compliant_chg_detected && /* Workaround for non-QC2.0-compliant chargers follows */ if (!chg->qc2_unsupported_voltage && apsd->pst == POWER_SUPPLY_TYPE_USB_HVDCP) { rc = smblib_read(chg, QC_CHANGE_STATUS_REG, &stat); if (rc < 0) Loading @@ -3150,11 +3170,11 @@ irqreturn_t usbin_uv_irq_handler(int irq, void *data) smblib_err(chg, "Couldn't read QC2 max pulses rc=%d\n", rc); chg->non_compliant_chg_detected = true; chg->qc2_max_pulses = (max_pulses & HVDCP_PULSE_COUNT_MAX_QC2_MASK); if (stat & QC_12V_BIT) { chg->qc2_unsupported_voltage = QC2_NON_COMPLIANT_12V; rc = smblib_masked_write(chg, HVDCP_PULSE_COUNT_MAX_REG, HVDCP_PULSE_COUNT_MAX_QC2_MASK, HVDCP_PULSE_COUNT_MAX_QC2_9V); Loading @@ -3163,6 +3183,7 @@ irqreturn_t usbin_uv_irq_handler(int irq, void *data) rc); } else if (stat & QC_9V_BIT) { chg->qc2_unsupported_voltage = QC2_NON_COMPLIANT_9V; rc = smblib_masked_write(chg, HVDCP_PULSE_COUNT_MAX_REG, HVDCP_PULSE_COUNT_MAX_QC2_MASK, HVDCP_PULSE_COUNT_MAX_QC2_5V); Loading Loading @@ -3762,7 +3783,7 @@ static void typec_src_removal(struct smb_charger *chg) * if non-compliant charger caused UV, restore original max pulses * and turn SUSPEND_ON_COLLAPSE_USBIN_BIT back on. */ if (chg->non_compliant_chg_detected) { if (chg->qc2_unsupported_voltage) { rc = smblib_masked_write(chg, HVDCP_PULSE_COUNT_MAX_REG, HVDCP_PULSE_COUNT_MAX_QC2_MASK, chg->qc2_max_pulses); Loading @@ -3777,7 +3798,7 @@ static void typec_src_removal(struct smb_charger *chg) smblib_err(chg, "Couldn't turn on SUSPEND_ON_COLLAPSE_USBIN_BIT rc=%d\n", rc); chg->non_compliant_chg_detected = false; chg->qc2_unsupported_voltage = QC2_COMPLIANT; } if (chg->use_extcon) Loading drivers/power/supply/qcom/smb5-lib.h +7 −1 Original line number Diff line number Diff line Loading @@ -80,6 +80,12 @@ enum sink_src_mode { UNATTACHED_MODE, }; enum qc2_non_comp_voltage { QC2_COMPLIANT, QC2_NON_COMPLIANT_9V, QC2_NON_COMPLIANT_12V }; enum { BOOST_BACK_WA = BIT(0), }; Loading Loading @@ -374,7 +380,7 @@ struct smb_charger { u32 wa_flags; int boost_current_ua; int qc2_max_pulses; bool non_compliant_chg_detected; enum qc2_non_comp_voltage qc2_unsupported_voltage; /* extcon for VBUS / ID notification to USB for uUSB */ struct extcon_dev *extcon; Loading Loading
drivers/power/supply/qcom/smb5-lib.c +25 −4 Original line number Diff line number Diff line Loading @@ -1843,11 +1843,21 @@ int smblib_dp_dm(struct smb_charger *chg, int val) pr_err("Failed to force 5V\n"); break; case POWER_SUPPLY_DP_DM_FORCE_9V: if (chg->qc2_unsupported_voltage == QC2_NON_COMPLIANT_9V) { smblib_err(chg, "Couldn't set 9V: unsupported\n"); return -EINVAL; } rc = smblib_force_vbus_voltage(chg, FORCE_9V_BIT); if (rc < 0) pr_err("Failed to force 9V\n"); break; case POWER_SUPPLY_DP_DM_FORCE_12V: if (chg->qc2_unsupported_voltage == QC2_NON_COMPLIANT_12V) { smblib_err(chg, "Couldn't set 12V: unsupported\n"); return -EINVAL; } rc = smblib_force_vbus_voltage(chg, FORCE_12V_BIT); if (rc < 0) pr_err("Failed to force 12V\n"); Loading Loading @@ -2044,6 +2054,15 @@ int smblib_get_prop_usb_voltage_max(struct smb_charger *chg, { switch (chg->real_charger_type) { case POWER_SUPPLY_TYPE_USB_HVDCP: if (chg->qc2_unsupported_voltage == QC2_NON_COMPLIANT_9V) { val->intval = MICRO_5V; break; } else if (chg->qc2_unsupported_voltage == QC2_NON_COMPLIANT_12V) { val->intval = MICRO_9V; break; } /* else, fallthrough */ case POWER_SUPPLY_TYPE_USB_HVDCP_3: case POWER_SUPPLY_TYPE_USB_PD: if (chg->smb_version == PMI632_SUBTYPE) Loading Loading @@ -3135,7 +3154,8 @@ irqreturn_t usbin_uv_irq_handler(int irq, void *data) wdata = &chg->irq_info[SWITCHER_POWER_OK_IRQ].irq_data->storm_data; reset_storm_count(wdata); if (!chg->non_compliant_chg_detected && /* Workaround for non-QC2.0-compliant chargers follows */ if (!chg->qc2_unsupported_voltage && apsd->pst == POWER_SUPPLY_TYPE_USB_HVDCP) { rc = smblib_read(chg, QC_CHANGE_STATUS_REG, &stat); if (rc < 0) Loading @@ -3150,11 +3170,11 @@ irqreturn_t usbin_uv_irq_handler(int irq, void *data) smblib_err(chg, "Couldn't read QC2 max pulses rc=%d\n", rc); chg->non_compliant_chg_detected = true; chg->qc2_max_pulses = (max_pulses & HVDCP_PULSE_COUNT_MAX_QC2_MASK); if (stat & QC_12V_BIT) { chg->qc2_unsupported_voltage = QC2_NON_COMPLIANT_12V; rc = smblib_masked_write(chg, HVDCP_PULSE_COUNT_MAX_REG, HVDCP_PULSE_COUNT_MAX_QC2_MASK, HVDCP_PULSE_COUNT_MAX_QC2_9V); Loading @@ -3163,6 +3183,7 @@ irqreturn_t usbin_uv_irq_handler(int irq, void *data) rc); } else if (stat & QC_9V_BIT) { chg->qc2_unsupported_voltage = QC2_NON_COMPLIANT_9V; rc = smblib_masked_write(chg, HVDCP_PULSE_COUNT_MAX_REG, HVDCP_PULSE_COUNT_MAX_QC2_MASK, HVDCP_PULSE_COUNT_MAX_QC2_5V); Loading Loading @@ -3762,7 +3783,7 @@ static void typec_src_removal(struct smb_charger *chg) * if non-compliant charger caused UV, restore original max pulses * and turn SUSPEND_ON_COLLAPSE_USBIN_BIT back on. */ if (chg->non_compliant_chg_detected) { if (chg->qc2_unsupported_voltage) { rc = smblib_masked_write(chg, HVDCP_PULSE_COUNT_MAX_REG, HVDCP_PULSE_COUNT_MAX_QC2_MASK, chg->qc2_max_pulses); Loading @@ -3777,7 +3798,7 @@ static void typec_src_removal(struct smb_charger *chg) smblib_err(chg, "Couldn't turn on SUSPEND_ON_COLLAPSE_USBIN_BIT rc=%d\n", rc); chg->non_compliant_chg_detected = false; chg->qc2_unsupported_voltage = QC2_COMPLIANT; } if (chg->use_extcon) Loading
drivers/power/supply/qcom/smb5-lib.h +7 −1 Original line number Diff line number Diff line Loading @@ -80,6 +80,12 @@ enum sink_src_mode { UNATTACHED_MODE, }; enum qc2_non_comp_voltage { QC2_COMPLIANT, QC2_NON_COMPLIANT_9V, QC2_NON_COMPLIANT_12V }; enum { BOOST_BACK_WA = BIT(0), }; Loading Loading @@ -374,7 +380,7 @@ struct smb_charger { u32 wa_flags; int boost_current_ua; int qc2_max_pulses; bool non_compliant_chg_detected; enum qc2_non_comp_voltage qc2_unsupported_voltage; /* extcon for VBUS / ID notification to USB for uUSB */ struct extcon_dev *extcon; Loading