Lines Matching defs:bci

238 static int twl4030_charger_update_current(struct twl4030_bci *bci)
251 if (ac_available(bci->channel_vac)) {
252 cur = bci->ac_cur;
253 bci->ac_is_active = true;
255 cur = bci->usb_cur;
256 bci->ac_is_active = false;
257 if (cur > bci->usb_cur_target) {
258 cur = bci->usb_cur_target;
259 bci->usb_cur = cur;
261 if (cur < bci->usb_cur_target)
262 schedule_delayed_work(&bci->current_worker, USB_CUR_DELAY);
266 if (bci->ichg_eoc >= 200000)
268 if (bci->ichg_lo >= 400000)
270 if (bci->ichg_hi >= 820000)
295 reg = ua2regval(bci->ichg_eoc, cgain);
307 reg = ua2regval(bci->ichg_lo, cgain);
329 reg = ua2regval(bci->ichg_hi, cgain);
403 struct twl4030_bci *bci = container_of(data, struct twl4030_bci,
414 dev_dbg(bci->dev, "v=%d cur=%d limit=%d target=%d\n", v, curr,
415 bci->usb_cur, bci->usb_cur_target);
419 if (bci->usb_cur >= USB_CUR_STEP)
420 bci->usb_cur -= USB_CUR_STEP;
421 bci->usb_cur_target = bci->usb_cur;
422 } else if (bci->usb_cur >= bci->usb_cur_target ||
423 bci->usb_cur + USB_CUR_STEP > USB_MAX_CURRENT) {
427 bci->usb_cur += USB_CUR_STEP;
428 schedule_delayed_work(&bci->current_worker, USB_CUR_DELAY);
430 twl4030_charger_update_current(bci);
436 static int twl4030_charger_enable_usb(struct twl4030_bci *bci, bool enable)
441 if (bci->usb_mode == CHARGE_OFF)
443 if (enable && !IS_ERR_OR_NULL(bci->transceiver)) {
445 twl4030_charger_update_current(bci);
448 if (!bci->usb_enabled) {
449 pm_runtime_get_sync(bci->transceiver->dev);
450 bci->usb_enabled = 1;
453 if (bci->usb_mode == CHARGE_AUTO) {
461 dev_err(bci->dev,
473 if (bci->usb_mode == CHARGE_LINEAR) {
480 dev_err(bci->dev,
513 if (bci->usb_enabled) {
514 pm_runtime_mark_last_busy(bci->transceiver->dev);
515 pm_runtime_put_autosuspend(bci->transceiver->dev);
516 bci->usb_enabled = 0;
518 bci->usb_cur = 0;
527 static int twl4030_charger_enable_ac(struct twl4030_bci *bci, bool enable)
531 if (bci->ac_mode == CHARGE_OFF)
590 struct twl4030_bci *bci = arg;
592 dev_dbg(bci->dev, "CHG_PRES irq\n");
594 bci->ac_cur = 500000;
595 twl4030_charger_update_current(bci);
596 power_supply_changed(bci->ac);
597 power_supply_changed(bci->usb);
607 struct twl4030_bci *bci = arg;
621 dev_dbg(bci->dev, "BCI irq %02x %02x\n", irqs2, irqs1);
625 power_supply_changed(bci->ac);
626 power_supply_changed(bci->usb);
628 twl4030_charger_update_current(bci);
632 dev_warn(bci->dev, "battery temperature out of range\n");
635 dev_crit(bci->dev, "battery disconnected\n");
638 dev_crit(bci->dev, "VBAT overvoltage\n");
641 dev_crit(bci->dev, "VBUS overvoltage\n");
644 dev_crit(bci->dev, "Ac charger overvoltage\n");
651 struct twl4030_bci *bci = container_of(data, struct twl4030_bci, work);
653 switch (bci->event) {
656 twl4030_charger_enable_usb(bci, true);
659 twl4030_charger_enable_usb(bci, false);
667 struct twl4030_bci *bci = container_of(nb, struct twl4030_bci, usb_nb);
669 dev_dbg(bci->dev, "OTG notify %lu\n", val);
673 bci->usb_cur_target = 500000;
675 bci->usb_cur_target = 100000;
677 bci->event = val;
678 schedule_work(&bci->work);
690 struct twl4030_bci *bci = dev_get_drvdata(dev->parent);
698 if (dev == &bci->ac->dev) {
701 twl4030_charger_enable_ac(bci, false);
702 bci->ac_mode = mode;
703 status = twl4030_charger_enable_ac(bci, true);
705 twl4030_charger_enable_usb(bci, false);
706 bci->usb_mode = mode;
707 status = twl4030_charger_enable_usb(bci, true);
719 struct twl4030_bci *bci = dev_get_drvdata(dev->parent);
722 int mode = bci->usb_mode;
724 if (dev == &bci->ac->dev)
725 mode = bci->ac_mode;
761 static int twl4030bci_state(struct twl4030_bci *bci)
768 dev_err(bci->dev, "error reading BCIMSTATEC\n");
772 dev_dbg(bci->dev, "state: %02x\n", state);
793 struct twl4030_bci *bci = dev_get_drvdata(psy->dev.parent);
798 state = twl4030bci_state(bci);
862 if (!bci->ac_is_active)
863 val->intval = bci->ac_cur;
865 if (bci->ac_is_active)
866 val->intval = bci->usb_cur_target;
892 struct twl4030_bci *bci = dev_get_drvdata(psy->dev.parent);
897 bci->usb_cur_target = val->intval;
899 bci->ac_cur = val->intval;
900 twl4030_charger_update_current(bci);
978 struct twl4030_bci *bci;
983 bci = devm_kzalloc(&pdev->dev, sizeof(*bci), GFP_KERNEL);
984 if (bci == NULL)
990 bci->ichg_eoc = 80100; /* Stop charging when current drops to here */
991 bci->ichg_lo = 241000; /* Low threshold */
992 bci->ichg_hi = 500000; /* High threshold */
993 bci->ac_cur = 500000; /* 500mA */
995 bci->usb_cur_target = 500000; /* 500mA */
997 bci->usb_cur_target = 100000; /* 100mA */
998 bci->usb_mode = CHARGE_AUTO;
999 bci->ac_mode = CHARGE_AUTO;
1001 bci->dev = &pdev->dev;
1002 bci->irq_chg = platform_get_irq(pdev, 0);
1003 bci->irq_bci = platform_get_irq(pdev, 1);
1005 platform_set_drvdata(pdev, bci);
1007 INIT_WORK(&bci->work, twl4030_bci_usb_work);
1008 INIT_DELAYED_WORK(&bci->current_worker, twl4030_current_worker);
1010 bci->channel_vac = devm_iio_channel_get(&pdev->dev, "vac");
1011 if (IS_ERR(bci->channel_vac)) {
1012 ret = PTR_ERR(bci->channel_vac);
1017 bci->channel_vac = NULL;
1020 if (bci->dev->of_node) {
1023 phynode = of_get_compatible_child(bci->dev->of_node->parent,
1026 bci->usb_nb.notifier_call = twl4030_bci_usb_ncb;
1027 bci->transceiver = devm_usb_get_phy_by_node(
1028 bci->dev, phynode, &bci->usb_nb);
1030 if (IS_ERR(bci->transceiver)) {
1031 ret = PTR_ERR(bci->transceiver);
1036 bci->transceiver = NULL;
1041 bci->ac = devm_power_supply_register(&pdev->dev, &twl4030_bci_ac_desc,
1043 if (IS_ERR(bci->ac)) {
1044 ret = PTR_ERR(bci->ac);
1049 bci->usb = devm_power_supply_register(&pdev->dev, &twl4030_bci_usb_desc,
1051 if (IS_ERR(bci->usb)) {
1052 ret = PTR_ERR(bci->usb);
1057 ret = devm_request_threaded_irq(&pdev->dev, bci->irq_chg, NULL,
1059 bci);
1062 bci->irq_chg, ret);
1066 ret = devm_request_threaded_irq(&pdev->dev, bci->irq_bci, NULL,
1067 twl4030_bci_interrupt, IRQF_ONESHOT, pdev->name, bci);
1070 bci->irq_bci, ret);
1090 twl4030_charger_update_current(bci);
1091 if (device_create_file(&bci->usb->dev, &dev_attr_mode))
1093 if (device_create_file(&bci->ac->dev, &dev_attr_mode))
1096 twl4030_charger_enable_ac(bci, true);
1097 if (!IS_ERR_OR_NULL(bci->transceiver))
1098 twl4030_bci_usb_ncb(&bci->usb_nb,
1099 bci->transceiver->last_event,
1102 twl4030_charger_enable_usb(bci, false);
1114 struct twl4030_bci *bci = platform_get_drvdata(pdev);
1116 twl4030_charger_enable_ac(bci, false);
1117 twl4030_charger_enable_usb(bci, false);
1120 device_remove_file(&bci->usb->dev, &dev_attr_mode);
1121 device_remove_file(&bci->ac->dev, &dev_attr_mode);
1132 {.compatible = "ti,twl4030-bci", },