static int wm8350_charger_config(struct wm8350 *wm8350, struct wm8350_charger_policy *policy) { u16 reg, eoc_mA, fast_limit_mA; if (!policy) { dev_warn(wm8350->dev, "No charger policy, charger not configured.\n"); return -EINVAL; } /* make sure USB fast charge current is not > 500mA */ if (policy->fast_limit_USB_mA > 500) { dev_err(wm8350->dev, "USB fast charge > 500mA\n"); return -EINVAL; } eoc_mA = WM8350_CHG_EOC_mA(policy->eoc_mA); wm8350_reg_unlock(wm8350); reg = wm8350_reg_read(wm8350, WM8350_BATTERY_CHARGER_CONTROL_1) & WM8350_CHG_ENA_R168; wm8350_reg_write(wm8350, WM8350_BATTERY_CHARGER_CONTROL_1, reg | eoc_mA | policy->trickle_start_mV | WM8350_CHG_TRICKLE_TEMP_CHOKE | WM8350_CHG_TRICKLE_USB_CHOKE | WM8350_CHG_FAST_USB_THROTTLE); if (wm8350_get_supplies(wm8350) & WM8350_USB_SUPPLY) { fast_limit_mA = WM8350_CHG_FAST_LIMIT_mA(policy->fast_limit_USB_mA); wm8350_reg_write(wm8350, WM8350_BATTERY_CHARGER_CONTROL_2, policy->charge_mV | policy->trickle_charge_USB_mA | fast_limit_mA | wm8350_charge_time_min(wm8350, policy->charge_timeout)); } else { fast_limit_mA = WM8350_CHG_FAST_LIMIT_mA(policy->fast_limit_mA); wm8350_reg_write(wm8350, WM8350_BATTERY_CHARGER_CONTROL_2, policy->charge_mV | policy->trickle_charge_mA | fast_limit_mA | wm8350_charge_time_min(wm8350, policy->charge_timeout)); } wm8350_reg_lock(wm8350); return 0; }
static int wm8350_init_battery(struct wm8350 *wm8350) { struct wm8350_power *power = &wm8350->power; struct wm8350_charger_policy *policy = &power->policy; policy->eoc_mA = WM8350_CHG_EOC_mA(10); policy->charge_mV = WM8350_CHG_4_05V; policy->fast_limit_mA = WM8350_CHG_FAST_LIMIT_mA(400); policy->charge_timeout = WM8350_CHG_TIME_MIN(60); policy->trickle_start_mV = WM8350_CHG_TRICKLE_3_1V; policy->trickle_charge_mA = WM8350_CHG_TRICKLE_50mA; wm8350_charger_enable(power, 1); wm8350_fast_charger_enable(power, 1); return 0; }