static int bd99955_reset_to_zero(void) { int rv; rv = charger_set_current(0); if (rv) return rv; return charger_set_voltage(0); }
/** * Enable or disable charging, and set requested voltage and current. If either * of voltage and current is set to 0, charging is disable. * * @param voltage Requested voltage in mV. Set -1 to preserve current value. * @param current Requested current in mA. Set -1 to preserve current value. */ static int charge_request(int voltage, int current) { int rv = EC_SUCCESS; if (voltage == -1 && current == -1) return EC_SUCCESS; #ifdef CONFIG_CHARGER_EN_GPIO if (voltage == 0 || current == 0) { charge_set_charger_en_gpio(0); return EC_SUCCESS; } else { charge_set_charger_en_gpio(1); } #endif if (voltage != -1) rv |= charger_set_voltage(voltage); if (current != -1) rv |= charger_set_current(current); return rv; }
/* * Ask the charger for some voltage and current. If either value is 0, * charging is disabled; otherwise it's enabled. Negative values are ignored. */ static int charge_request(int voltage, int current) { int r1 = EC_SUCCESS, r2 = EC_SUCCESS, r3 = EC_SUCCESS; static int __bss_slow prev_volt, prev_curr; if (!voltage || !current) { #ifdef CONFIG_CHARGER_NARROW_VDC current = 0; /* With NVDC charger, keep VSYS voltage higher than battery */ voltage = charger_closest_voltage( curr.batt.voltage + charger_get_info()->voltage_step); /* If the battery is full, request the max voltage. */ if (is_full) voltage = battery_get_info()->voltage_max; /* And handle dead battery case */ voltage = MAX(voltage, battery_get_info()->voltage_min); #else voltage = current = 0; #endif } if (curr.ac) { if (prev_volt != voltage || prev_curr != current) CPRINTS("%s(%dmV, %dmA)", __func__, voltage, current); } /* * Set current before voltage so that if we are just starting * to charge, we allow some time (i2c delay) for charging circuit to * start at a voltage just above battery voltage before jumping * up. This helps avoid large current spikes when connecting * battery. */ if (current >= 0) r2 = charger_set_current(current); if (r2 != EC_SUCCESS) problem(PR_SET_CURRENT, r2); if (voltage >= 0) r1 = charger_set_voltage(voltage); if (r1 != EC_SUCCESS) problem(PR_SET_VOLTAGE, r1); /* * Set the charge inhibit bit when possible as it appears to save * power in some cases (e.g. Nyan with BQ24735). */ #if defined(CONFIG_CHARGER_BD99955) || defined(CONFIG_CHARGER_BD99956) /* Charger auto exits from battery learn mode if charge inhibited */ if (current > 0 || chg_ctl_mode == CHARGE_CONTROL_DISCHARGE) #else if (voltage > 0 || current > 0) #endif r3 = charger_set_mode(0); else r3 = charger_set_mode(CHARGE_FLAG_INHIBIT_CHARGE); if (r3 != EC_SUCCESS) problem(PR_SET_MODE, r3); /* * Only update if the request worked, so we'll keep trying on failures. */ if (!r1 && !r2) { prev_volt = voltage; prev_curr = current; } return r1 ? r1 : r2; }