Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f0d35283 authored by Anirudh Ghayal's avatar Anirudh Ghayal
Browse files

power: Add snapshot of SMB1360 and QPNP Linear charger



Update the SMB1360 and QPNP linear charger drivers to
their latest versions as on msm-3.10.
[snapshot from msm-3.10
commit: 7704c94d47f8ed7cc81e487ab9d576ef52e0f1e5]

Change-Id: Ia83471531a29128a8f1dc2efd0302fd6d6dc7f4f
Signed-off-by: default avatarAnirudh Ghayal <aghayal@codeaurora.org>
parent b4709eef
Loading
Loading
Loading
Loading
+26 −5
Original line number Diff line number Diff line
@@ -117,11 +117,28 @@ Optional Properties:
- qcom,config-hard-thresholds	This property indicates if cold and hot thresholds need be modified.
				If it's not defined, default temp thresholds will be used. If this
				defined, it's required to specify the "qcom,hot-bat-decidegc" and
				"qcom,cold-bat-decidegc" values.
- qcom,hot-bat-decidegc		Hot battery temperature in decidegC. This property must be
				out of range [0, 55].
- qcom,cold-bat-decidegc	Cold battery temperature in decidegC. This property must be
				out of range [0, 55].
				"qcom,cold-bat-decidegc" values. If this defined, the serial properties
				(qcom,otp-hard-jeita-config, qcom,otp-hot-bat-decidegc,
				qcom,otp-cold-bat-decidegc) mustn't be defined.
- qcom,hot-bat-decidegc		Hot battery temperature in decidegC. This property should only be
				defined when "qcom,config-hard-thresholds" defined, and the value
				must be out of range [0, 55].
- qcom,cold-bat-decidegc	Cold battery temperature in decidegC. This property should only be
				defined when "qcom,config-hard-thresholds" defined, and the value
				must be out of range [0, 55].
- qcom,otp-hard-jeita-config	This property indicates if cold and hot thresholds need be modified.
				If it's not defined, default temp thresholds [0, 55] will be used.
				If this defined, it's required to specify the "qcom,otp-hot-bat-decidegc"
				and "qcom,otp-cold-bat-decidegc" values. If this is defined, the serial
				properties (qcom,config-hard-thresholds, qcom,hot-bat-decidegc,
				qcom,cold-bat-decidegc) mustn't be defined.
- qcom,otp-hot-bat-decidegc	Hot battery temperature in decidegC. This property could only be
				defined when qcom,config-otp-hard-jeita exist.
- qcom,otp-cold-bat-decidegc	Cold battery temperature in decidegC. This property could only be
				defined when qcom,config-otp-hard-jeita exist.
- qcom,otp-hard-jeita-hysteresis This property contains two intergers to define the temperature
				hysteresis (in decidegC unit) for hard cold and hard hot.
				This property could only be defined when qcom,config-otp-hard-jeita exist.
- qcom,soft-jeita-supported	This property indicates whether soft jeita supported.
- qcom,warm-bat-decidegc	Warm battery temperature in decidegC. After hitting this threshold,
				"qcom,warm-bat-ma" defines maximum charging current and
@@ -211,6 +228,10 @@ Example:
			qcom,soft-jeita-supported;
			qcom,warm-bat-decidegc = <450>;
			qcom,cool-bat-decidegc = <100>;
			qcom,otp-hard-jeita-config;
			qcom,otp-hot-bat-decidegc = <550>;
			qcom,otp-cold-bat-decidegc = <0>;
			qcom,otp-hard-jeita-hysteresis = <0, 50>;
			qcom,warm-bat-mv = <4100>;
			qcom,cool-bat-mv = <4100>;
			qcom,warm-bat-ma = <750>;
+217 −67
Original line number Diff line number Diff line
@@ -40,8 +40,15 @@

/* USB CHARGER PATH peripheral register offsets */
#define USB_IN_VALID_MASK			BIT(1)
#define CHG_GONE_BIT				BIT(2)
#define USB_SUSP_REG				0x47
#define USB_SUSPEND_BIT				BIT(0)
#define USB_COMP_OVR1_REG			0xEA
#define USBIN_LLIMIT_OK_MASK			LBC_MASK(1, 0)
#define USBIN_LLIMIT_OK_NO_OVERRIDE		0x00
#define USBIN_LLIMIT_OK_OVERRIDE_1		0x03
#define USB_OVP_TST5_REG			0xE7
#define CHG_GONE_OK_EN_BIT			BIT(2)

/* CHARGER peripheral register offset */
#define CHG_OPTION_REG				0x08
@@ -71,6 +78,8 @@
#define CHG_PERPH_RESET_CTRL3_REG		0xDA
#define CHG_COMP_OVR1				0xEE
#define CHG_VBAT_DET_OVR_MASK			LBC_MASK(1, 0)
#define CHG_TEST_LOOP_REG			0xE5
#define VIN_MIN_LOOP_DISABLE_BIT		BIT(0)
#define OVERRIDE_0				0x2
#define OVERRIDE_NONE				0x0

@@ -147,6 +156,7 @@ enum {
	CURRENT = BIT(2),
	SOC	= BIT(3),
	PARALLEL = BIT(4),
	COLLAPSE = BIT(5),
};

enum bpd_type {
@@ -272,6 +282,7 @@ struct vddtrim_map vddtrim_map[] = {
 * @cfg_charger_detect_eoc:	charger can detect end of charging
 * @cfg_disable_vbatdet_based_recharge:	keep VBATDET comparator overriden to
 *				low and VBATDET irq disabled.
 * @cfg_collapsible_chgr_support: support collapsible charger
 * @cfg_chgr_led_support:	support charger led work.
 * @cfg_safe_current:		battery safety current setting
 * @cfg_hot_batt_p:		hot battery threshold setting
@@ -324,7 +335,7 @@ struct qpnp_lbc_chip {
	bool				fastchg_on;
	bool				cfg_use_external_charger;
	bool				cfg_chgr_led_support;
	bool				cfg_bms_controlled_charging;
	bool				non_collapsible_chgr_detected;
	unsigned int			cfg_warm_bat_chg_ma;
	unsigned int			cfg_cool_bat_chg_ma;
	unsigned int			cfg_safe_voltage_mv;
@@ -333,6 +344,7 @@ struct qpnp_lbc_chip {
	unsigned int			cfg_charger_detect_eoc;
	unsigned int			cfg_disable_vbatdet_based_recharge;
	unsigned int			cfg_batt_weak_voltage_uv;
	unsigned int			cfg_collapsible_chgr_support;
	unsigned int			cfg_warm_bat_mv;
	unsigned int			cfg_cool_bat_mv;
	unsigned int			cfg_hot_batt_p;
@@ -355,6 +367,7 @@ struct qpnp_lbc_chip {
	int				usb_psy_ma;
	int				delta_vddmax_uv;
	int				init_trim_uv;
	struct delayed_work		collapsible_detection_work;

	/* parallel-chg params */
	int				parallel_charging_enabled;
@@ -598,9 +611,10 @@ static u8 qpnp_lbc_get_trim_val(struct qpnp_lbc_chip *chip)
					return vddtrim_map[i + 1].trim_val;
			}
		}
		i = 0;
		break;
	case 1:
		for (i = TRIM_CENTER; i <= 7; i++) {
		for (i = TRIM_CENTER; i < ARRAY_SIZE(vddtrim_map); i++) {
			if (vddtrim_map[i].trim_uv < chip->delta_vddmax_uv) {
				delta_uv = AVG(vddtrim_map[i].trim_uv,
						vddtrim_map[i - 1].trim_uv);
@@ -610,6 +624,7 @@ static u8 qpnp_lbc_get_trim_val(struct qpnp_lbc_chip *chip)
					return vddtrim_map[i].trim_val;
			}
		}
		i = ARRAY_SIZE(vddtrim_map) - 1;
		break;
	}

@@ -634,6 +649,24 @@ static int qpnp_lbc_is_usb_chg_plugged_in(struct qpnp_lbc_chip *chip)
	return (usbin_valid_rt_sts & USB_IN_VALID_MASK) ? 1 : 0;
}

static int qpnp_lbc_is_chg_gone(struct qpnp_lbc_chip *chip)
{
	u8 rt_sts;
	int rc;

	rc = qpnp_lbc_read(chip, chip->usb_chgpth_base + INT_RT_STS_REG,
				&rt_sts, 1);
	if (rc) {
		pr_err("spmi read failed: addr=0x%04x, rc=%d\n",
				chip->usb_chgpth_base + INT_RT_STS_REG, rc);
		return rc;
	}

	pr_debug("rt_sts 0x%x\n", rt_sts);

	return (rt_sts & CHG_GONE_BIT) ? 1 : 0;
}

static int qpnp_lbc_charger_enable(struct qpnp_lbc_chip *chip, int reason,
					int enable)
{
@@ -700,10 +733,9 @@ static int qpnp_lbc_bat_if_configure_btc(struct qpnp_lbc_chip *chip)
		mask |= BTC_COLD_MASK;
	}

	if (!chip->cfg_btc_disabled) {
	mask |= BTC_COMP_EN_MASK;
	if (!chip->cfg_btc_disabled)
		btc_cfg |= BTC_COMP_EN_MASK;
	}

	pr_debug("BTC configuration mask=%x\n", btc_cfg);

@@ -716,6 +748,75 @@ static int qpnp_lbc_bat_if_configure_btc(struct qpnp_lbc_chip *chip)
	return rc;
}

static int qpnp_chg_collapsible_chgr_config(struct qpnp_lbc_chip *chip,
		bool enable)
{
	u8 reg_val;
	int rc;

	pr_debug("Configure for %scollapsible charger\n",
			enable ? "" : "non-");
	/*
	 * The flow to enable/disable the collapsible charger configuration:
	 *	Enable:  Override USBIN_LLIMIT_OK -->
	 *		 Disable VIN_MIN comparator -->
	 *		 Enable CHG_GONE comparator
	 *	Disable: Enable VIN_MIN comparator -->
	 *		 Enable USBIN_LLIMIT_OK -->
	 *		 Disable CHG_GONE comparator
	 */
	if (enable) {
		/* Override USBIN_LLIMIT_OK */
		reg_val = USBIN_LLIMIT_OK_OVERRIDE_1;
		rc = __qpnp_lbc_secure_masked_write(chip->spmi,
				chip->usb_chgpth_base,
				USB_COMP_OVR1_REG,
				USBIN_LLIMIT_OK_MASK, reg_val);
		if (rc) {
			pr_err("Failed to override USB_LLIMIT_OK rc = %d\n",
							rc);
			return rc;
		}
	}

	/* Configure VIN_MIN comparator */
	rc = __qpnp_lbc_secure_masked_write(chip->spmi,
			chip->chgr_base, CHG_TEST_LOOP_REG,
			VIN_MIN_LOOP_DISABLE_BIT,
			enable ? VIN_MIN_LOOP_DISABLE_BIT : 0);
	if (rc) {
		pr_err("Failed to %s VIN_MIN comparator rc = %d\n",
				enable ? "disable" : "enable", rc);
		return rc;
	}

	if (!enable) {
		/* Enable USBIN_LLIMIT_OK */
		reg_val = USBIN_LLIMIT_OK_NO_OVERRIDE;
		rc = __qpnp_lbc_secure_masked_write(chip->spmi,
				chip->usb_chgpth_base,
				USB_COMP_OVR1_REG,
				USBIN_LLIMIT_OK_MASK, reg_val);
		if (rc) {
			pr_err("Failed to override USB_LLIMIT_OK rc = %d\n",
							rc);
			return rc;
		}
	}

	/* Configure CHG_GONE comparator */
	reg_val = enable ? CHG_GONE_OK_EN_BIT : 0;
	rc = __qpnp_lbc_secure_masked_write(chip->spmi,
			chip->usb_chgpth_base, USB_OVP_TST5_REG,
			CHG_GONE_OK_EN_BIT, reg_val);
	if (rc) {
		pr_err("Failed to write CHG_GONE comparator rc = %d\n", rc);
		return rc;
	}

	return 0;
}

#define QPNP_LBC_VBATWEAK_MIN_UV        3000000
#define QPNP_LBC_VBATWEAK_MAX_UV        3581250
#define QPNP_LBC_VBATWEAK_STEP_UV       18750
@@ -1218,7 +1319,7 @@ static int get_prop_current_now(struct qpnp_lbc_chip *chip)
static int get_prop_capacity(struct qpnp_lbc_chip *chip)
{
	union power_supply_propval ret = {0,};
	int soc, battery_status, charger_in;
	int soc;

	if (chip->fake_battery_soc >= 0)
		return chip->fake_battery_soc;
@@ -1229,33 +1330,6 @@ static int get_prop_capacity(struct qpnp_lbc_chip *chip)
	if (chip->bms_psy) {
		chip->bms_psy->get_property(chip->bms_psy,
				POWER_SUPPLY_PROP_CAPACITY, &ret);
		mutex_lock(&chip->chg_enable_lock);
		if (chip->chg_done)
			chip->bms_psy->get_property(chip->bms_psy,
					POWER_SUPPLY_PROP_CAPACITY, &ret);
		battery_status = get_prop_batt_status(chip);
		charger_in = qpnp_lbc_is_usb_chg_plugged_in(chip);

		/* reset chg_done flag if capacity not 100% */
		if (ret.intval < 100 && chip->chg_done) {
			chip->chg_done = false;
			power_supply_changed(&chip->batt_psy);
		}

		if (battery_status != POWER_SUPPLY_STATUS_CHARGING
				&& charger_in
				&& !chip->cfg_charging_disabled
				&& chip->cfg_soc_resume_limit
				&& ret.intval <= chip->cfg_soc_resume_limit
				&& !chip->cfg_bms_controlled_charging) {
			pr_debug("resuming charging at %d%% soc\n",
					ret.intval);
			if (!chip->cfg_disable_vbatdet_based_recharge)
				qpnp_lbc_vbatdet_override(chip, OVERRIDE_0);
			qpnp_lbc_charger_enable(chip, SOC, 1);
		}
		mutex_unlock(&chip->chg_enable_lock);

		soc = ret.intval;
		if (soc == 0) {
			if (!qpnp_lbc_is_usb_chg_plugged_in(chip))
@@ -1523,10 +1597,10 @@ static int qpnp_batt_power_set_property(struct power_supply *psy,
	switch (psp) {
	case POWER_SUPPLY_PROP_STATUS:
		mutex_lock(&chip->chg_enable_lock);

		if (val->intval == POWER_SUPPLY_STATUS_FULL &&
				!chip->cfg_float_charge) {

		switch (val->intval) {
		case POWER_SUPPLY_STATUS_FULL:
			if (chip->cfg_float_charge)
				break;
			/* Disable charging */
			rc = qpnp_lbc_charger_enable(chip, SOC, 0);
			if (rc)
@@ -1551,17 +1625,13 @@ static int qpnp_batt_power_set_property(struct power_supply *psy,
					qpnp_lbc_enable_irq(chip,
						&chip->irqs[CHG_VBAT_DET_LO]);
			}

		}

		if (chip->cfg_bms_controlled_charging) {
			switch (val->intval) {
			break;
		case POWER_SUPPLY_STATUS_CHARGING:
			chip->chg_done = false;
			pr_debug("resuming charging by bms\n");
			if (!chip->cfg_disable_vbatdet_based_recharge)
					qpnp_lbc_vbatdet_override(chip,
								OVERRIDE_0);
				qpnp_lbc_vbatdet_override(chip, OVERRIDE_0);

			qpnp_lbc_charger_enable(chip, SOC, 1);
			break;
		case POWER_SUPPLY_STATUS_DISCHARGING:
@@ -1572,8 +1642,6 @@ static int qpnp_batt_power_set_property(struct power_supply *psy,
		default:
			break;
		}
		}

		mutex_unlock(&chip->chg_enable_lock);
		break;
	case POWER_SUPPLY_PROP_COOL_TEMP:
@@ -2105,7 +2173,6 @@ static int show_lbc_config(struct seq_file *m, void *data)
			"cfg_use_fake_battery\t=\t%d\n"
			"cfg_use_external_charger\t=\t%d\n"
			"cfg_chgr_led_support\t=\t%d\n"
			"cfg_bms_controlled_charging\t=\t%d\n"
			"cfg_warm_bat_chg_ma\t=\t%d\n"
			"cfg_cool_bat_chg_ma\t=\t%d\n"
			"cfg_safe_voltage_mv\t=\t%d\n"
@@ -2113,6 +2180,7 @@ static int show_lbc_config(struct seq_file *m, void *data)
			"cfg_min_voltage_mv\t=\t%d\n"
			"cfg_charger_detect_eoc\t=\t%d\n"
			"cfg_disable_vbatdet_based_recharge\t=\t%d\n"
			"cfg_collapsible_chgr_support\t=\t%d\n"
			"cfg_batt_weak_voltage_uv\t=\t%d\n"
			"cfg_warm_bat_mv\t=\t%d\n"
			"cfg_cool_bat_mv\t=\t%d\n"
@@ -2131,7 +2199,6 @@ static int show_lbc_config(struct seq_file *m, void *data)
			chip->cfg_use_fake_battery,
			chip->cfg_use_external_charger,
			chip->cfg_chgr_led_support,
			chip->cfg_bms_controlled_charging,
			chip->cfg_warm_bat_chg_ma,
			chip->cfg_cool_bat_chg_ma,
			chip->cfg_safe_voltage_mv,
@@ -2139,6 +2206,7 @@ static int show_lbc_config(struct seq_file *m, void *data)
			chip->cfg_min_voltage_mv,
			chip->cfg_charger_detect_eoc,
			chip->cfg_disable_vbatdet_based_recharge,
			chip->cfg_collapsible_chgr_support,
			chip->cfg_batt_weak_voltage_uv,
			chip->cfg_warm_bat_mv,
			chip->cfg_cool_bat_mv,
@@ -2284,9 +2352,10 @@ static int qpnp_charger_read_dt_props(struct qpnp_lbc_chip *chip)
			of_property_read_bool(chip->spmi->dev.of_node,
					"qcom,chgr-led-support");

	chip->cfg_bms_controlled_charging =
	/* Get the collapsible charger support property */
	chip->cfg_collapsible_chgr_support =
			of_property_read_bool(chip->spmi->dev.of_node,
					"qcom,bms-controlled-charging");
					"qcom,collapsible-chgr-support");

	/* Disable charging when faking battery values */
	if (chip->cfg_use_fake_battery)
@@ -2343,17 +2412,50 @@ static int qpnp_charger_read_dt_props(struct qpnp_lbc_chip *chip)
			chip->cfg_charging_disabled,
			chip->cfg_use_fake_battery,
			chip->cfg_float_charge);
	pr_debug("charger-detect-eoc=%d, disable-vbatdet-based-recharge=%d, chgr-led-support=%d, bms-controlled-charging=%d\n",
	pr_debug("charger-detect-eoc=%d, disable-vbatdet-based-recharge=%d, chgr-led-support=%d\n",
			chip->cfg_charger_detect_eoc,
			chip->cfg_disable_vbatdet_based_recharge,
			chip->cfg_chgr_led_support,
			chip->cfg_bms_controlled_charging);
	pr_debug("use-external-charger=%d, thermal_levels=%d\n",
			chip->cfg_chgr_led_support);
	pr_debug("collapsible-chg-support=%d, use-external-charger=%d, thermal_levels=%d\n",
			chip->cfg_collapsible_chgr_support,
			chip->cfg_use_external_charger,
			chip->cfg_thermal_levels);
	return rc;
}

#define CHG_REMOVAL_DETECT_DLY_MS	300
static irqreturn_t qpnp_lbc_chg_gone_irq_handler(int irq, void *_chip)
{
	struct qpnp_lbc_chip *chip = _chip;
	int chg_gone;

	if (chip->cfg_collapsible_chgr_support) {
		chg_gone = qpnp_lbc_is_chg_gone(chip);
		pr_debug("chg-gone triggered, rt_sts: %d\n", chg_gone);
		if (chg_gone) {
			/*
			 * Disable charger to prevent fastchg irq storming
			 * if a non-collapsible charger is being used.
			 */
			pr_debug("disable charging for non-collapsbile charger\n");
			qpnp_lbc_charger_enable(chip, COLLAPSE, 0);
			qpnp_lbc_disable_irq(chip, &chip->irqs[USBIN_VALID]);
			qpnp_lbc_disable_irq(chip, &chip->irqs[USB_CHG_GONE]);
			qpnp_chg_collapsible_chgr_config(chip, 0);
			/*
			 * Check after a delay if the charger is still
			 * inserted. It decides if a non-collapsible
			 * charger is being used, or charger has been
			 * removed.
			 */
			schedule_delayed_work(&chip->collapsible_detection_work,
				msecs_to_jiffies(CHG_REMOVAL_DETECT_DLY_MS));
		}
	}

	return IRQ_HANDLED;
}

static irqreturn_t qpnp_lbc_usbin_valid_irq_handler(int irq, void *_chip)
{
	struct qpnp_lbc_chip *chip = _chip;
@@ -2372,6 +2474,11 @@ static irqreturn_t qpnp_lbc_usbin_valid_irq_handler(int irq, void *_chip)
			qpnp_lbc_set_appropriate_current(chip);
			spin_unlock_irqrestore(&chip->ibat_change_lock,
								flags);
			if (chip->cfg_collapsible_chgr_support)
				chip->non_collapsible_chgr_detected = false;

			if (chip->supported_feature_flag & VDD_TRIM_SUPPORTED)
				alarm_try_to_cancel(&chip->vddtrim_alarm);
		} else {
			/*
			 * Override VBAT_DET comparator to start charging
@@ -2380,6 +2487,16 @@ static irqreturn_t qpnp_lbc_usbin_valid_irq_handler(int irq, void *_chip)
			if (!chip->cfg_disable_vbatdet_based_recharge)
				qpnp_lbc_vbatdet_override(chip, OVERRIDE_0);

			/*
			 * If collapsible charger supported, enable chgr_gone
			 * irq, and configure for collapsible charger.
			 */
			if (chip->cfg_collapsible_chgr_support &&
					!chip->non_collapsible_chgr_detected) {
				qpnp_lbc_enable_irq(chip,
						&chip->irqs[USB_CHG_GONE]);
				qpnp_chg_collapsible_chgr_config(chip, 1);
			}
			/*
			 * Enable SOC based charging to make sure
			 * charging gets enabled on USB insertion
@@ -2685,6 +2802,9 @@ static int qpnp_lbc_request_irqs(struct qpnp_lbc_chip *chip)
	SPMI_REQUEST_IRQ(chip, USBIN_VALID, rc, usbin_valid, 0,
			IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, 1);

	SPMI_REQUEST_IRQ(chip, USB_CHG_GONE, rc, chg_gone, 0,
			IRQF_TRIGGER_RISING, 1);

	SPMI_REQUEST_IRQ(chip, USB_OVER_TEMP, rc, usb_overtemp, 0,
			IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, 0);

@@ -2720,6 +2840,8 @@ static int qpnp_lbc_get_irqs(struct qpnp_lbc_chip *chip, u8 subtype,
						USBIN_VALID, usbin-valid);
		SPMI_GET_IRQ_RESOURCE(chip, rc, spmi_resource,
						USB_OVER_TEMP, usb-over-temp);
		SPMI_GET_IRQ_RESOURCE(chip, rc, spmi_resource,
						USB_CHG_GONE, chg-gone);
		break;
	};

@@ -2735,9 +2857,34 @@ static void determine_initial_status(struct qpnp_lbc_chip *chip)
	 * Set USB psy online to avoid userspace from shutting down if battery
	 * capacity is at zero and no chargers online.
	 */
	if (chip->usb_present)
	if (chip->usb_present) {
		if (chip->cfg_collapsible_chgr_support &&
				!chip->non_collapsible_chgr_detected) {
			qpnp_lbc_enable_irq(chip,
					&chip->irqs[USB_CHG_GONE]);
			qpnp_chg_collapsible_chgr_config(chip, 1);
		}
		power_supply_set_online(chip->usb_psy, 1);
	}
}

static void qpnp_lbc_collapsible_detection_work(struct work_struct *work)
{
	struct delayed_work *dwork = to_delayed_work(work);
	struct qpnp_lbc_chip *chip = container_of(dwork,
			struct qpnp_lbc_chip,
			collapsible_detection_work);

	if (qpnp_lbc_is_usb_chg_plugged_in(chip)) {
		chip->non_collapsible_chgr_detected = true;
		pr_debug("Non-collapsible charger detected\n");
	} else {
		chip->non_collapsible_chgr_detected = false;
		pr_debug("Charger removal detected\n");
	}
	qpnp_lbc_charger_enable(chip, COLLAPSE, 1);
	qpnp_lbc_enable_irq(chip, &chip->irqs[USBIN_VALID]);
}

#define IBAT_TRIM			-300
static void qpnp_lbc_vddtrim_work_fn(struct work_struct *work)
@@ -3041,6 +3188,8 @@ static int qpnp_lbc_main_probe(struct spmi_device *spmi)
	spin_lock_init(&chip->irq_lock);
	INIT_WORK(&chip->vddtrim_work, qpnp_lbc_vddtrim_work_fn);
	alarm_init(&chip->vddtrim_alarm, ALARM_REALTIME, vddtrim_callback);
	INIT_DELAYED_WORK(&chip->collapsible_detection_work,
			qpnp_lbc_collapsible_detection_work);

	/* Get all device-tree properties */
	rc = qpnp_charger_read_dt_props(chip);
@@ -3226,6 +3375,7 @@ static int qpnp_lbc_remove(struct spmi_device *spmi)
		alarm_cancel(&chip->vddtrim_alarm);
		cancel_work_sync(&chip->vddtrim_work);
	}
	cancel_delayed_work_sync(&chip->collapsible_detection_work);
	debugfs_remove_recursive(chip->debug_root);
	if (chip->bat_if_base)
		power_supply_unregister(&chip->batt_psy);
+763 −194

File changed.

Preview size limit exceeded, changes collapsed.