Loading drivers/power/qpnp-charger.c +101 −2 Original line number Diff line number Diff line Loading @@ -115,6 +115,7 @@ #define USB_OCP_THR 0x52 #define USB_OCP_CLR 0x53 #define BAT_IF_TEMP_STATUS 0x09 #define BOOST_ILIM 0x78 #define REG_OFFSET_PERP_SUBTYPE 0x05 Loading Loading @@ -368,6 +369,7 @@ struct qpnp_chg_chip { struct work_struct soc_check_work; struct delayed_work aicl_check_work; struct work_struct insertion_ocv_work; struct work_struct ocp_clear_work; struct qpnp_chg_regulator otg_vreg; struct qpnp_chg_regulator boost_vreg; struct qpnp_chg_regulator batfet_vreg; Loading Loading @@ -1237,10 +1239,36 @@ static irqreturn_t qpnp_chg_usb_usb_ocp_irq_handler(int irq, void *_chip) { struct qpnp_chg_chip *chip = _chip; int rc; pr_debug("usb-ocp triggered\n"); schedule_work(&chip->ocp_clear_work); return IRQ_HANDLED; } #define BOOST_ILIMIT_MIN 0x07 #define BOOST_ILIMIT_DEF 0x02 #define BOOST_ILIMT_MASK 0xFF static void qpnp_chg_ocp_clear_work(struct work_struct *work) { int rc; u8 usb_sts; struct qpnp_chg_chip *chip = container_of(work, struct qpnp_chg_chip, ocp_clear_work); if (chip->type == SMBBP) { rc = qpnp_chg_masked_write(chip, chip->boost_base + BOOST_ILIM, BOOST_ILIMT_MASK, BOOST_ILIMIT_MIN, 1); if (rc) { pr_err("Failed to turn configure ilim rc = %d\n", rc); return; } } rc = qpnp_chg_masked_write(chip, chip->usb_chgpth_base + USB_OCP_CLR, OCP_CLR_BIT, Loading @@ -1256,7 +1284,29 @@ qpnp_chg_usb_usb_ocp_irq_handler(int irq, void *_chip) if (rc) pr_err("Failed to turn off usb ovp rc = %d\n", rc); return IRQ_HANDLED; if (chip->type == SMBBP) { /* Wait for OCP circuitry to be powered up */ msleep(100); rc = qpnp_chg_read(chip, &usb_sts, INT_RT_STS(chip->usb_chgpth_base), 1); if (rc) { pr_err("failed to read interrupt sts %d\n", rc); return; } if (usb_sts & COARSE_DET_USB_IRQ) { rc = qpnp_chg_masked_write(chip, chip->boost_base + BOOST_ILIM, BOOST_ILIMT_MASK, BOOST_ILIMIT_DEF, 1); if (rc) { pr_err("Failed to set ilim rc = %d\n", rc); return; } } else { pr_warn_ratelimited("USB short to GND detected!\n"); } } } #define QPNP_CHG_VDDMAX_MIN 3400 Loading Loading @@ -1861,6 +1911,17 @@ switch_usb_to_charge_mode(struct qpnp_chg_chip *chip) if (!qpnp_chg_is_otg_en_set(chip)) return 0; if (chip->type == SMBBP) { rc = qpnp_chg_masked_write(chip, chip->boost_base + BOOST_ILIM, BOOST_ILIMT_MASK, BOOST_ILIMIT_DEF, 1); if (rc) { pr_err("Failed to set ilim rc = %d\n", rc); return rc; } } /* enable usb ovp fet */ rc = qpnp_chg_masked_write(chip, chip->usb_chgpth_base + CHGR_USB_USB_OTG_CTL, Loading @@ -1884,11 +1945,23 @@ static int switch_usb_to_host_mode(struct qpnp_chg_chip *chip) { int rc; u8 usb_sts; pr_debug("switch to host mode\n"); if (qpnp_chg_is_otg_en_set(chip)) return 0; if (chip->type == SMBBP) { rc = qpnp_chg_masked_write(chip, chip->boost_base + BOOST_ILIM, BOOST_ILIMT_MASK, BOOST_ILIMIT_MIN, 1); if (rc) { pr_err("Failed to turn configure ilim rc = %d\n", rc); return rc; } } if (!qpnp_chg_is_dc_chg_plugged_in(chip)) { rc = qpnp_chg_force_run_on_batt(chip, 1); if (rc) { Loading @@ -1907,6 +1980,30 @@ switch_usb_to_host_mode(struct qpnp_chg_chip *chip) return rc; } if (chip->type == SMBBP) { /* Wait for OCP circuitry to be powered up */ msleep(100); rc = qpnp_chg_read(chip, &usb_sts, INT_RT_STS(chip->usb_chgpth_base), 1); if (rc) { pr_err("failed to read interrupt sts %d\n", rc); return rc; } if (usb_sts & COARSE_DET_USB_IRQ) { rc = qpnp_chg_masked_write(chip, chip->boost_base + BOOST_ILIM, BOOST_ILIMT_MASK, BOOST_ILIMIT_DEF, 1); if (rc) { pr_err("Failed to set ilim rc = %d\n", rc); return rc; } } else { pr_warn_ratelimited("USB short to GND detected!\n"); } } return 0; } Loading Loading @@ -4621,6 +4718,8 @@ qpnp_charger_probe(struct spmi_device *spmi) qpnp_chg_reduce_power_stage_callback); INIT_WORK(&chip->reduce_power_stage_work, qpnp_chg_reduce_power_stage_work); INIT_WORK(&chip->ocp_clear_work, qpnp_chg_ocp_clear_work); INIT_WORK(&chip->insertion_ocv_work, qpnp_chg_insertion_ocv_work); INIT_WORK(&chip->batfet_lcl_work, Loading Loading
drivers/power/qpnp-charger.c +101 −2 Original line number Diff line number Diff line Loading @@ -115,6 +115,7 @@ #define USB_OCP_THR 0x52 #define USB_OCP_CLR 0x53 #define BAT_IF_TEMP_STATUS 0x09 #define BOOST_ILIM 0x78 #define REG_OFFSET_PERP_SUBTYPE 0x05 Loading Loading @@ -368,6 +369,7 @@ struct qpnp_chg_chip { struct work_struct soc_check_work; struct delayed_work aicl_check_work; struct work_struct insertion_ocv_work; struct work_struct ocp_clear_work; struct qpnp_chg_regulator otg_vreg; struct qpnp_chg_regulator boost_vreg; struct qpnp_chg_regulator batfet_vreg; Loading Loading @@ -1237,10 +1239,36 @@ static irqreturn_t qpnp_chg_usb_usb_ocp_irq_handler(int irq, void *_chip) { struct qpnp_chg_chip *chip = _chip; int rc; pr_debug("usb-ocp triggered\n"); schedule_work(&chip->ocp_clear_work); return IRQ_HANDLED; } #define BOOST_ILIMIT_MIN 0x07 #define BOOST_ILIMIT_DEF 0x02 #define BOOST_ILIMT_MASK 0xFF static void qpnp_chg_ocp_clear_work(struct work_struct *work) { int rc; u8 usb_sts; struct qpnp_chg_chip *chip = container_of(work, struct qpnp_chg_chip, ocp_clear_work); if (chip->type == SMBBP) { rc = qpnp_chg_masked_write(chip, chip->boost_base + BOOST_ILIM, BOOST_ILIMT_MASK, BOOST_ILIMIT_MIN, 1); if (rc) { pr_err("Failed to turn configure ilim rc = %d\n", rc); return; } } rc = qpnp_chg_masked_write(chip, chip->usb_chgpth_base + USB_OCP_CLR, OCP_CLR_BIT, Loading @@ -1256,7 +1284,29 @@ qpnp_chg_usb_usb_ocp_irq_handler(int irq, void *_chip) if (rc) pr_err("Failed to turn off usb ovp rc = %d\n", rc); return IRQ_HANDLED; if (chip->type == SMBBP) { /* Wait for OCP circuitry to be powered up */ msleep(100); rc = qpnp_chg_read(chip, &usb_sts, INT_RT_STS(chip->usb_chgpth_base), 1); if (rc) { pr_err("failed to read interrupt sts %d\n", rc); return; } if (usb_sts & COARSE_DET_USB_IRQ) { rc = qpnp_chg_masked_write(chip, chip->boost_base + BOOST_ILIM, BOOST_ILIMT_MASK, BOOST_ILIMIT_DEF, 1); if (rc) { pr_err("Failed to set ilim rc = %d\n", rc); return; } } else { pr_warn_ratelimited("USB short to GND detected!\n"); } } } #define QPNP_CHG_VDDMAX_MIN 3400 Loading Loading @@ -1861,6 +1911,17 @@ switch_usb_to_charge_mode(struct qpnp_chg_chip *chip) if (!qpnp_chg_is_otg_en_set(chip)) return 0; if (chip->type == SMBBP) { rc = qpnp_chg_masked_write(chip, chip->boost_base + BOOST_ILIM, BOOST_ILIMT_MASK, BOOST_ILIMIT_DEF, 1); if (rc) { pr_err("Failed to set ilim rc = %d\n", rc); return rc; } } /* enable usb ovp fet */ rc = qpnp_chg_masked_write(chip, chip->usb_chgpth_base + CHGR_USB_USB_OTG_CTL, Loading @@ -1884,11 +1945,23 @@ static int switch_usb_to_host_mode(struct qpnp_chg_chip *chip) { int rc; u8 usb_sts; pr_debug("switch to host mode\n"); if (qpnp_chg_is_otg_en_set(chip)) return 0; if (chip->type == SMBBP) { rc = qpnp_chg_masked_write(chip, chip->boost_base + BOOST_ILIM, BOOST_ILIMT_MASK, BOOST_ILIMIT_MIN, 1); if (rc) { pr_err("Failed to turn configure ilim rc = %d\n", rc); return rc; } } if (!qpnp_chg_is_dc_chg_plugged_in(chip)) { rc = qpnp_chg_force_run_on_batt(chip, 1); if (rc) { Loading @@ -1907,6 +1980,30 @@ switch_usb_to_host_mode(struct qpnp_chg_chip *chip) return rc; } if (chip->type == SMBBP) { /* Wait for OCP circuitry to be powered up */ msleep(100); rc = qpnp_chg_read(chip, &usb_sts, INT_RT_STS(chip->usb_chgpth_base), 1); if (rc) { pr_err("failed to read interrupt sts %d\n", rc); return rc; } if (usb_sts & COARSE_DET_USB_IRQ) { rc = qpnp_chg_masked_write(chip, chip->boost_base + BOOST_ILIM, BOOST_ILIMT_MASK, BOOST_ILIMIT_DEF, 1); if (rc) { pr_err("Failed to set ilim rc = %d\n", rc); return rc; } } else { pr_warn_ratelimited("USB short to GND detected!\n"); } } return 0; } Loading Loading @@ -4621,6 +4718,8 @@ qpnp_charger_probe(struct spmi_device *spmi) qpnp_chg_reduce_power_stage_callback); INIT_WORK(&chip->reduce_power_stage_work, qpnp_chg_reduce_power_stage_work); INIT_WORK(&chip->ocp_clear_work, qpnp_chg_ocp_clear_work); INIT_WORK(&chip->insertion_ocv_work, qpnp_chg_insertion_ocv_work); INIT_WORK(&chip->batfet_lcl_work, Loading