Lines Matching refs:wm8350

3  * Battery driver for wm8350 PMIC
16 #include <linux/mfd/wm8350/supply.h>
17 #include <linux/mfd/wm8350/core.h>
18 #include <linux/mfd/wm8350/comparator.h>
20 static int wm8350_read_battery_uvolts(struct wm8350 *wm8350)
22 return wm8350_read_auxadc(wm8350, WM8350_AUXADC_BATT, 0, 0)
26 static int wm8350_read_line_uvolts(struct wm8350 *wm8350)
28 return wm8350_read_auxadc(wm8350, WM8350_AUXADC_LINE, 0, 0)
32 static int wm8350_read_usb_uvolts(struct wm8350 *wm8350)
34 return wm8350_read_auxadc(wm8350, WM8350_AUXADC_USB, 0, 0)
42 static inline int wm8350_charge_time_min(struct wm8350 *wm8350, int min)
44 if (!wm8350->power.rev_g_coeff)
50 static int wm8350_get_supplies(struct wm8350 *wm8350)
55 sm = wm8350_reg_read(wm8350, WM8350_STATE_MACHINE_STATUS);
56 ov = wm8350_reg_read(wm8350, WM8350_MISC_OVERRIDES);
57 co = wm8350_reg_read(wm8350, WM8350_COMPARATOR_OVERRIDES);
58 chrg = wm8350_reg_read(wm8350, WM8350_BATTERY_CHARGER_CONTROL_2);
86 static int wm8350_charger_config(struct wm8350 *wm8350,
92 dev_warn(wm8350->dev,
99 dev_err(wm8350->dev, "USB fast charge > 500mA\n");
105 wm8350_reg_unlock(wm8350);
107 reg = wm8350_reg_read(wm8350, WM8350_BATTERY_CHARGER_CONTROL_1)
109 wm8350_reg_write(wm8350, WM8350_BATTERY_CHARGER_CONTROL_1,
115 if (wm8350_get_supplies(wm8350) & WM8350_USB_SUPPLY) {
118 wm8350_reg_write(wm8350, WM8350_BATTERY_CHARGER_CONTROL_2,
120 fast_limit_mA | wm8350_charge_time_min(wm8350,
126 wm8350_reg_write(wm8350, WM8350_BATTERY_CHARGER_CONTROL_2,
128 fast_limit_mA | wm8350_charge_time_min(wm8350,
132 wm8350_reg_lock(wm8350);
136 static int wm8350_batt_status(struct wm8350 *wm8350)
140 state = wm8350_reg_read(wm8350, WM8350_BATTERY_CHARGER_CONTROL_2);
159 struct wm8350 *wm8350 = dev_get_drvdata(dev);
163 state = wm8350_reg_read(wm8350, WM8350_BATTERY_CHARGER_CONTROL_2) &
186 struct wm8350 *wm8350 = data;
187 struct wm8350_power *power = &wm8350->power;
190 switch (irq - wm8350->irq_base) {
192 dev_err(wm8350->dev, "battery failed\n");
195 dev_err(wm8350->dev, "charger timeout\n");
207 dev_dbg(wm8350->dev, "fast charger ready\n");
208 wm8350_charger_config(wm8350, policy);
209 wm8350_reg_unlock(wm8350);
210 wm8350_set_bits(wm8350, WM8350_BATTERY_CHARGER_CONTROL_1,
212 wm8350_reg_lock(wm8350);
216 dev_warn(wm8350->dev, "battery < 3.9V\n");
219 dev_warn(wm8350->dev, "battery < 3.1V\n");
222 dev_warn(wm8350->dev, "battery < 2.85V\n");
229 wm8350_charger_config(wm8350, policy);
238 dev_err(wm8350->dev, "Unknown interrupt %d\n", irq);
251 struct wm8350 *wm8350 = dev_get_drvdata(psy->dev.parent);
256 val->intval = !!(wm8350_get_supplies(wm8350) &
260 val->intval = wm8350_read_line_uvolts(wm8350);
281 struct wm8350 *wm8350 = dev_get_drvdata(psy->dev.parent);
286 val->intval = !!(wm8350_get_supplies(wm8350) &
290 val->intval = wm8350_read_usb_uvolts(wm8350);
308 static int wm8350_bat_check_health(struct wm8350 *wm8350)
312 if (wm8350_read_battery_uvolts(wm8350) < 2850000)
315 reg = wm8350_reg_read(wm8350, WM8350_CHARGER_OVERRIDES);
325 static int wm8350_bat_get_charge_type(struct wm8350 *wm8350)
329 state = wm8350_reg_read(wm8350, WM8350_BATTERY_CHARGER_CONTROL_2) &
347 struct wm8350 *wm8350 = dev_get_drvdata(psy->dev.parent);
352 val->intval = wm8350_batt_status(wm8350);
355 val->intval = !!(wm8350_get_supplies(wm8350) &
359 val->intval = wm8350_read_battery_uvolts(wm8350);
362 val->intval = wm8350_bat_check_health(wm8350);
365 val->intval = wm8350_bat_get_charge_type(wm8350);
384 .name = "wm8350-ac",
392 .name = "wm8350-battery",
400 .name = "wm8350-usb",
411 static int wm8350_init_charger(struct wm8350 *wm8350)
416 ret = wm8350_register_irq(wm8350, WM8350_IRQ_CHG_BAT_HOT,
417 wm8350_charger_handler, 0, "Battery hot", wm8350);
421 ret = wm8350_register_irq(wm8350, WM8350_IRQ_CHG_BAT_COLD,
422 wm8350_charger_handler, 0, "Battery cold", wm8350);
426 ret = wm8350_register_irq(wm8350, WM8350_IRQ_CHG_BAT_FAIL,
427 wm8350_charger_handler, 0, "Battery fail", wm8350);
431 ret = wm8350_register_irq(wm8350, WM8350_IRQ_CHG_TO,
433 "Charger timeout", wm8350);
437 ret = wm8350_register_irq(wm8350, WM8350_IRQ_CHG_END,
439 "Charge end", wm8350);
443 ret = wm8350_register_irq(wm8350, WM8350_IRQ_CHG_START,
445 "Charge start", wm8350);
449 ret = wm8350_register_irq(wm8350, WM8350_IRQ_CHG_FAST_RDY,
451 "Fast charge ready", wm8350);
455 ret = wm8350_register_irq(wm8350, WM8350_IRQ_CHG_VBATT_LT_3P9,
457 "Battery <3.9V", wm8350);
461 ret = wm8350_register_irq(wm8350, WM8350_IRQ_CHG_VBATT_LT_3P1,
463 "Battery <3.1V", wm8350);
467 ret = wm8350_register_irq(wm8350, WM8350_IRQ_CHG_VBATT_LT_2P85,
469 "Battery <2.85V", wm8350);
474 ret = wm8350_register_irq(wm8350, WM8350_IRQ_EXT_USB_FB,
475 wm8350_charger_handler, 0, "USB", wm8350);
479 ret = wm8350_register_irq(wm8350, WM8350_IRQ_EXT_WALL_FB,
480 wm8350_charger_handler, 0, "Wall", wm8350);
484 ret = wm8350_register_irq(wm8350, WM8350_IRQ_EXT_BAT_FB,
485 wm8350_charger_handler, 0, "Battery", wm8350);
492 wm8350_free_irq(wm8350, WM8350_IRQ_EXT_WALL_FB, wm8350);
494 wm8350_free_irq(wm8350, WM8350_IRQ_EXT_USB_FB, wm8350);
496 wm8350_free_irq(wm8350, WM8350_IRQ_CHG_VBATT_LT_2P85, wm8350);
498 wm8350_free_irq(wm8350, WM8350_IRQ_CHG_VBATT_LT_3P1, wm8350);
500 wm8350_free_irq(wm8350, WM8350_IRQ_CHG_VBATT_LT_3P9, wm8350);
502 wm8350_free_irq(wm8350, WM8350_IRQ_CHG_FAST_RDY, wm8350);
504 wm8350_free_irq(wm8350, WM8350_IRQ_CHG_START, wm8350);
506 wm8350_free_irq(wm8350, WM8350_IRQ_CHG_END, wm8350);
508 wm8350_free_irq(wm8350, WM8350_IRQ_CHG_TO, wm8350);
510 wm8350_free_irq(wm8350, WM8350_IRQ_CHG_BAT_FAIL, wm8350);
512 wm8350_free_irq(wm8350, WM8350_IRQ_CHG_BAT_COLD, wm8350);
514 wm8350_free_irq(wm8350, WM8350_IRQ_CHG_BAT_HOT, wm8350);
519 static void free_charger_irq(struct wm8350 *wm8350)
521 wm8350_free_irq(wm8350, WM8350_IRQ_CHG_BAT_HOT, wm8350);
522 wm8350_free_irq(wm8350, WM8350_IRQ_CHG_BAT_COLD, wm8350);
523 wm8350_free_irq(wm8350, WM8350_IRQ_CHG_BAT_FAIL, wm8350);
524 wm8350_free_irq(wm8350, WM8350_IRQ_CHG_TO, wm8350);
525 wm8350_free_irq(wm8350, WM8350_IRQ_CHG_END, wm8350);
526 wm8350_free_irq(wm8350, WM8350_IRQ_CHG_START, wm8350);
527 wm8350_free_irq(wm8350, WM8350_IRQ_CHG_FAST_RDY, wm8350);
528 wm8350_free_irq(wm8350, WM8350_IRQ_CHG_VBATT_LT_3P9, wm8350);
529 wm8350_free_irq(wm8350, WM8350_IRQ_CHG_VBATT_LT_3P1, wm8350);
530 wm8350_free_irq(wm8350, WM8350_IRQ_CHG_VBATT_LT_2P85, wm8350);
531 wm8350_free_irq(wm8350, WM8350_IRQ_EXT_USB_FB, wm8350);
532 wm8350_free_irq(wm8350, WM8350_IRQ_EXT_WALL_FB, wm8350);
533 wm8350_free_irq(wm8350, WM8350_IRQ_EXT_BAT_FB, wm8350);
538 struct wm8350 *wm8350 = platform_get_drvdata(pdev);
539 struct wm8350_power *power = &wm8350->power;
562 dev_warn(wm8350->dev, "failed to add charge sysfs: %d\n", ret);
565 wm8350_init_charger(wm8350);
566 if (wm8350_charger_config(wm8350, policy) == 0) {
567 wm8350_reg_unlock(wm8350);
568 wm8350_set_bits(wm8350, WM8350_POWER_MGMT_5, WM8350_CHG_ENA);
569 wm8350_reg_lock(wm8350);
584 struct wm8350 *wm8350 = platform_get_drvdata(pdev);
585 struct wm8350_power *power = &wm8350->power;
587 free_charger_irq(wm8350);
599 .name = "wm8350-power",
607 MODULE_ALIAS("platform:wm8350-power");