Lines Matching refs:bci
156 static int twl4030_is_battery_present(struct twl4030_bci *bci) in twl4030_is_battery_present() argument
185 static int twl4030_bci_have_vbus(struct twl4030_bci *bci) in twl4030_bci_have_vbus() argument
195 dev_dbg(bci->dev, "check_vbus: HW_CONDITIONS %02x\n", hwsts); in twl4030_bci_have_vbus()
207 static int twl4030_charger_enable_usb(struct twl4030_bci *bci, bool enable) in twl4030_charger_enable_usb() argument
213 if (!twl4030_bci_have_vbus(bci)) in twl4030_charger_enable_usb()
221 dev_warn(bci->dev, "USB charging is disabled.\n"); in twl4030_charger_enable_usb()
226 if (!bci->usb_enabled) { in twl4030_charger_enable_usb()
227 ret = regulator_enable(bci->usb_reg); in twl4030_charger_enable_usb()
229 dev_err(bci->dev, in twl4030_charger_enable_usb()
233 bci->usb_enabled = 1; in twl4030_charger_enable_usb()
246 if (bci->usb_enabled) { in twl4030_charger_enable_usb()
247 regulator_disable(bci->usb_reg); in twl4030_charger_enable_usb()
248 bci->usb_enabled = 0; in twl4030_charger_enable_usb()
318 struct twl4030_bci *bci = arg; in twl4030_charger_interrupt() local
320 dev_dbg(bci->dev, "CHG_PRES irq\n"); in twl4030_charger_interrupt()
321 power_supply_changed(bci->ac); in twl4030_charger_interrupt()
322 power_supply_changed(bci->usb); in twl4030_charger_interrupt()
332 struct twl4030_bci *bci = arg; in twl4030_bci_interrupt() local
346 dev_dbg(bci->dev, "BCI irq %02x %02x\n", irqs2, irqs1); in twl4030_bci_interrupt()
350 power_supply_changed(bci->ac); in twl4030_bci_interrupt()
351 power_supply_changed(bci->usb); in twl4030_bci_interrupt()
356 dev_warn(bci->dev, "battery temperature out of range\n"); in twl4030_bci_interrupt()
359 dev_crit(bci->dev, "battery disconnected\n"); in twl4030_bci_interrupt()
362 dev_crit(bci->dev, "VBAT overvoltage\n"); in twl4030_bci_interrupt()
365 dev_crit(bci->dev, "VBUS overvoltage\n"); in twl4030_bci_interrupt()
368 dev_crit(bci->dev, "Ac charger overvoltage\n"); in twl4030_bci_interrupt()
375 struct twl4030_bci *bci = container_of(data, struct twl4030_bci, work); in twl4030_bci_usb_work() local
377 switch (bci->event) { in twl4030_bci_usb_work()
380 twl4030_charger_enable_usb(bci, true); in twl4030_bci_usb_work()
383 twl4030_charger_enable_usb(bci, false); in twl4030_bci_usb_work()
391 struct twl4030_bci *bci = container_of(nb, struct twl4030_bci, usb_nb); in twl4030_bci_usb_ncb() local
393 dev_dbg(bci->dev, "OTG notify %lu\n", val); in twl4030_bci_usb_ncb()
395 bci->event = val; in twl4030_bci_usb_ncb()
396 schedule_work(&bci->work); in twl4030_bci_usb_ncb()
434 static int twl4030bci_state(struct twl4030_bci *bci) in twl4030bci_state() argument
445 dev_dbg(bci->dev, "state: %02x\n", state); in twl4030bci_state()
466 struct twl4030_bci *bci = dev_get_drvdata(psy->dev.parent); in twl4030_bci_get_property() local
471 state = twl4030bci_state(bci); in twl4030_bci_get_property()
579 struct twl4030_bci *bci; in twl4030_bci_probe() local
584 bci = kzalloc(sizeof(*bci), GFP_KERNEL); in twl4030_bci_probe()
585 if (bci == NULL) in twl4030_bci_probe()
591 bci->dev = &pdev->dev; in twl4030_bci_probe()
592 bci->irq_chg = platform_get_irq(pdev, 0); in twl4030_bci_probe()
593 bci->irq_bci = platform_get_irq(pdev, 1); in twl4030_bci_probe()
596 ret = twl4030_is_battery_present(bci); in twl4030_bci_probe()
602 platform_set_drvdata(pdev, bci); in twl4030_bci_probe()
604 bci->ac = power_supply_register(&pdev->dev, &twl4030_bci_ac_desc, in twl4030_bci_probe()
606 if (IS_ERR(bci->ac)) { in twl4030_bci_probe()
607 ret = PTR_ERR(bci->ac); in twl4030_bci_probe()
612 bci->usb_reg = regulator_get(bci->dev, "bci3v1"); in twl4030_bci_probe()
614 bci->usb = power_supply_register(&pdev->dev, &twl4030_bci_usb_desc, in twl4030_bci_probe()
616 if (IS_ERR(bci->usb)) { in twl4030_bci_probe()
617 ret = PTR_ERR(bci->usb); in twl4030_bci_probe()
622 ret = request_threaded_irq(bci->irq_chg, NULL, in twl4030_bci_probe()
624 bci); in twl4030_bci_probe()
627 bci->irq_chg, ret); in twl4030_bci_probe()
631 ret = request_threaded_irq(bci->irq_bci, NULL, in twl4030_bci_probe()
632 twl4030_bci_interrupt, IRQF_ONESHOT, pdev->name, bci); in twl4030_bci_probe()
635 bci->irq_bci, ret); in twl4030_bci_probe()
639 INIT_WORK(&bci->work, twl4030_bci_usb_work); in twl4030_bci_probe()
641 bci->transceiver = usb_get_phy(USB_PHY_TYPE_USB2); in twl4030_bci_probe()
642 if (!IS_ERR_OR_NULL(bci->transceiver)) { in twl4030_bci_probe()
643 bci->usb_nb.notifier_call = twl4030_bci_usb_ncb; in twl4030_bci_probe()
644 usb_register_notifier(bci->transceiver, &bci->usb_nb); in twl4030_bci_probe()
664 twl4030_charger_enable_usb(bci, true); in twl4030_bci_probe()
674 if (!IS_ERR_OR_NULL(bci->transceiver)) { in twl4030_bci_probe()
675 usb_unregister_notifier(bci->transceiver, &bci->usb_nb); in twl4030_bci_probe()
676 usb_put_phy(bci->transceiver); in twl4030_bci_probe()
678 free_irq(bci->irq_bci, bci); in twl4030_bci_probe()
680 free_irq(bci->irq_chg, bci); in twl4030_bci_probe()
682 power_supply_unregister(bci->usb); in twl4030_bci_probe()
684 power_supply_unregister(bci->ac); in twl4030_bci_probe()
687 kfree(bci); in twl4030_bci_probe()
694 struct twl4030_bci *bci = platform_get_drvdata(pdev); in twl4030_bci_remove() local
697 twl4030_charger_enable_usb(bci, false); in twl4030_bci_remove()
706 if (!IS_ERR_OR_NULL(bci->transceiver)) { in twl4030_bci_remove()
707 usb_unregister_notifier(bci->transceiver, &bci->usb_nb); in twl4030_bci_remove()
708 usb_put_phy(bci->transceiver); in twl4030_bci_remove()
710 free_irq(bci->irq_bci, bci); in twl4030_bci_remove()
711 free_irq(bci->irq_chg, bci); in twl4030_bci_remove()
712 power_supply_unregister(bci->usb); in twl4030_bci_remove()
713 power_supply_unregister(bci->ac); in twl4030_bci_remove()
714 kfree(bci); in twl4030_bci_remove()