15 #include <linux/module.h>
23 static int wm8350_read_battery_uvolts(
struct wm8350 *
wm8350)
29 static int wm8350_read_line_uvolts(
struct wm8350 *
wm8350)
41 #define WM8350_BATT_SUPPLY 1
42 #define WM8350_USB_SUPPLY 2
43 #define WM8350_LINE_SUPPLY 4
45 static inline int wm8350_charge_time_min(
struct wm8350 *
wm8350,
int min)
47 if (!wm8350->
power.rev_g_coeff)
48 return (((min - 30) / 15) & 0xf) << 8;
50 return (((min - 30) / 30) & 0xf) << 8;
89 static int wm8350_charger_config(
struct wm8350 *wm8350,
92 u16 reg, eoc_mA, fast_limit_mA;
96 "No charger policy, charger not configured.\n");
102 dev_err(wm8350->
dev,
"USB fast charge > 500mA\n");
123 fast_limit_mA | wm8350_charge_time_min(wm8350,
131 fast_limit_mA | wm8350_charge_time_min(wm8350,
139 static int wm8350_batt_status(
struct wm8350 *wm8350)
170 charge =
"Charger Off";
173 charge =
"Trickle Charging";
176 charge =
"Fast Charging";
182 return sprintf(buf,
"%s\n", charge);
189 struct wm8350 *wm8350 =
data;
211 wm8350_charger_config(wm8350, policy);
232 wm8350_charger_config(wm8350, policy);
240 dev_err(wm8350->
dev,
"Unknown interrupt %d\n", irq);
258 val->
intval = !!(wm8350_get_supplies(wm8350) &
262 val->
intval = wm8350_read_line_uvolts(wm8350);
279 static int wm8350_usb_get_prop(
struct power_supply *psy,
288 val->
intval = !!(wm8350_get_supplies(wm8350) &
292 val->
intval = wm8350_read_usb_uvolts(wm8350);
310 static int wm8350_bat_check_health(
struct wm8350 *wm8350)
314 if (wm8350_read_battery_uvolts(wm8350) < 2850000)
327 static int wm8350_bat_get_charge_type(
struct wm8350 *wm8350)
345 static int wm8350_bat_get_property(
struct power_supply *psy,
354 val->
intval = wm8350_batt_status(wm8350);
357 val->
intval = !!(wm8350_get_supplies(wm8350) &
361 val->
intval = wm8350_read_battery_uvolts(wm8350);
364 val->
intval = wm8350_bat_check_health(wm8350);
367 val->
intval = wm8350_bat_get_charge_type(wm8350);
389 static void wm8350_init_charger(
struct wm8350 *wm8350)
393 wm8350_charger_handler, 0,
"Battery hot", wm8350);
395 wm8350_charger_handler, 0,
"Battery cold", wm8350);
397 wm8350_charger_handler, 0,
"Battery fail", wm8350);
399 wm8350_charger_handler, 0,
400 "Charger timeout", wm8350);
402 wm8350_charger_handler, 0,
403 "Charge end", wm8350);
405 wm8350_charger_handler, 0,
406 "Charge start", wm8350);
408 wm8350_charger_handler, 0,
409 "Fast charge ready", wm8350);
411 wm8350_charger_handler, 0,
412 "Battery <3.9V", wm8350);
414 wm8350_charger_handler, 0,
415 "Battery <3.1V", wm8350);
417 wm8350_charger_handler, 0,
418 "Battery <2.85V", wm8350);
422 wm8350_charger_handler, 0,
"USB", wm8350);
424 wm8350_charger_handler, 0,
"Wall", wm8350);
426 wm8350_charger_handler, 0,
"Battery", wm8350);
429 static void free_charger_irq(
struct wm8350 *wm8350)
447 struct wm8350 *wm8350 = platform_get_drvdata(pdev);
455 ac->
name =
"wm8350-ac";
464 battery->
name =
"wm8350-battery";
473 usb->
name =
"wm8350-usb",
484 dev_warn(wm8350->
dev,
"failed to add charge sysfs: %d\n", ret);
487 wm8350_init_charger(wm8350);
488 if (wm8350_charger_config(wm8350, policy) == 0) {
506 struct wm8350 *wm8350 = platform_get_drvdata(pdev);
509 free_charger_irq(wm8350);
518 .probe = wm8350_power_probe,
521 .name =
"wm8350-power",