Lines Matching refs:info

187 static inline int axp288_charger_set_cc(struct axp288_chrg_info *info, int cc)  in axp288_charger_set_cc()  argument
194 else if (cc > info->max_cc) in axp288_charger_set_cc()
195 cc = info->max_cc; in axp288_charger_set_cc()
201 ret = regmap_update_bits(info->regmap, in axp288_charger_set_cc()
205 info->cc = cc; in axp288_charger_set_cc()
210 static inline int axp288_charger_set_cv(struct axp288_chrg_info *info, int cv) in axp288_charger_set_cv() argument
231 ret = regmap_update_bits(info->regmap, in axp288_charger_set_cv()
236 info->cv = cv; in axp288_charger_set_cv()
241 static inline int axp288_charger_set_vbus_inlmt(struct axp288_chrg_info *info, in axp288_charger_set_vbus_inlmt() argument
249 ret = regmap_read(info->regmap, AXP20X_CHRG_BAK_CTRL, &val); in axp288_charger_set_vbus_inlmt()
278 ret = regmap_write(info->regmap, AXP20X_CHRG_BAK_CTRL, reg_val); in axp288_charger_set_vbus_inlmt()
280 info->inlmt = inlmt; in axp288_charger_set_vbus_inlmt()
282 dev_err(&info->pdev->dev, "charger BAK control %d\n", ret); in axp288_charger_set_vbus_inlmt()
289 static int axp288_charger_vbus_path_select(struct axp288_chrg_info *info, in axp288_charger_vbus_path_select() argument
295 ret = regmap_update_bits(info->regmap, AXP20X_VBUS_IPSOUT_MGMT, in axp288_charger_vbus_path_select()
298 ret = regmap_update_bits(info->regmap, AXP20X_VBUS_IPSOUT_MGMT, in axp288_charger_vbus_path_select()
302 dev_err(&info->pdev->dev, "axp288 vbus path select %d\n", ret); in axp288_charger_vbus_path_select()
308 static int axp288_charger_enable_charger(struct axp288_chrg_info *info, in axp288_charger_enable_charger() argument
314 ret = regmap_update_bits(info->regmap, AXP20X_CHRG_CTRL1, in axp288_charger_enable_charger()
317 ret = regmap_update_bits(info->regmap, AXP20X_CHRG_CTRL1, in axp288_charger_enable_charger()
320 dev_err(&info->pdev->dev, "axp288 enable charger %d\n", ret); in axp288_charger_enable_charger()
322 info->is_charger_enabled = enable; in axp288_charger_enable_charger()
327 static int axp288_charger_is_present(struct axp288_chrg_info *info) in axp288_charger_is_present() argument
332 ret = regmap_read(info->regmap, AXP20X_PWR_INPUT_STATUS, &val); in axp288_charger_is_present()
341 static int axp288_charger_is_online(struct axp288_chrg_info *info) in axp288_charger_is_online() argument
346 ret = regmap_read(info->regmap, AXP20X_PWR_INPUT_STATUS, &val); in axp288_charger_is_online()
355 static int axp288_get_charger_health(struct axp288_chrg_info *info) in axp288_get_charger_health() argument
361 ret = regmap_read(info->regmap, AXP20X_PWR_INPUT_STATUS, &val); in axp288_get_charger_health()
367 ret = regmap_read(info->regmap, AXP20X_PWR_OP_MODE, &val); in axp288_get_charger_health()
390 struct axp288_chrg_info *info = power_supply_get_drvdata(psy); in axp288_charger_usb_set_property() local
394 mutex_lock(&info->lock); in axp288_charger_usb_set_property()
398 scaled_val = min(val->intval, info->max_cc); in axp288_charger_usb_set_property()
400 ret = axp288_charger_set_cc(info, scaled_val); in axp288_charger_usb_set_property()
402 dev_warn(&info->pdev->dev, "set charge current failed\n"); in axp288_charger_usb_set_property()
405 scaled_val = min(val->intval, info->max_cv); in axp288_charger_usb_set_property()
407 ret = axp288_charger_set_cv(info, scaled_val); in axp288_charger_usb_set_property()
409 dev_warn(&info->pdev->dev, "set charge voltage failed\n"); in axp288_charger_usb_set_property()
415 mutex_unlock(&info->lock); in axp288_charger_usb_set_property()
423 struct axp288_chrg_info *info = power_supply_get_drvdata(psy); in axp288_charger_usb_get_property() local
426 mutex_lock(&info->lock); in axp288_charger_usb_get_property()
431 if (info->otg.id_short) { in axp288_charger_usb_get_property()
435 ret = axp288_charger_is_present(info); in axp288_charger_usb_get_property()
438 info->present = ret; in axp288_charger_usb_get_property()
439 val->intval = info->present; in axp288_charger_usb_get_property()
443 if (info->otg.id_short) { in axp288_charger_usb_get_property()
447 ret = axp288_charger_is_online(info); in axp288_charger_usb_get_property()
450 info->online = ret; in axp288_charger_usb_get_property()
451 val->intval = info->online; in axp288_charger_usb_get_property()
454 val->intval = axp288_get_charger_health(info); in axp288_charger_usb_get_property()
457 val->intval = info->cc * 1000; in axp288_charger_usb_get_property()
460 val->intval = info->max_cc * 1000; in axp288_charger_usb_get_property()
463 val->intval = info->cv * 1000; in axp288_charger_usb_get_property()
466 val->intval = info->max_cv * 1000; in axp288_charger_usb_get_property()
469 val->intval = info->inlmt * 1000; in axp288_charger_usb_get_property()
477 mutex_unlock(&info->lock); in axp288_charger_usb_get_property()
522 struct axp288_chrg_info *info = dev; in axp288_charger_irq_thread_handler() local
526 if (info->irq[i] == irq) in axp288_charger_irq_thread_handler()
531 dev_warn(&info->pdev->dev, "spurious interrupt!!\n"); in axp288_charger_irq_thread_handler()
537 dev_dbg(&info->pdev->dev, "VBUS Over Voltage INTR\n"); in axp288_charger_irq_thread_handler()
540 dev_dbg(&info->pdev->dev, "Charging Done INTR\n"); in axp288_charger_irq_thread_handler()
543 dev_dbg(&info->pdev->dev, "Start Charging IRQ\n"); in axp288_charger_irq_thread_handler()
546 dev_dbg(&info->pdev->dev, in axp288_charger_irq_thread_handler()
550 dev_dbg(&info->pdev->dev, in axp288_charger_irq_thread_handler()
554 dev_dbg(&info->pdev->dev, in axp288_charger_irq_thread_handler()
558 dev_dbg(&info->pdev->dev, in axp288_charger_irq_thread_handler()
562 dev_dbg(&info->pdev->dev, in axp288_charger_irq_thread_handler()
566 dev_dbg(&info->pdev->dev, in axp288_charger_irq_thread_handler()
570 dev_warn(&info->pdev->dev, "Spurious Interrupt!!!\n"); in axp288_charger_irq_thread_handler()
574 power_supply_changed(info->psy_usb); in axp288_charger_irq_thread_handler()
581 struct axp288_chrg_info *info = in axp288_charger_extcon_evt_worker() local
585 struct extcon_dev *edev = info->cable.edev; in axp288_charger_extcon_evt_worker()
586 bool old_connected = info->cable.connected; in axp288_charger_extcon_evt_worker()
590 dev_dbg(&info->pdev->dev, "USB SDP charger is connected"); in axp288_charger_extcon_evt_worker()
591 info->cable.connected = true; in axp288_charger_extcon_evt_worker()
592 info->cable.chg_type = POWER_SUPPLY_TYPE_USB; in axp288_charger_extcon_evt_worker()
595 dev_dbg(&info->pdev->dev, "USB CDP charger is connected"); in axp288_charger_extcon_evt_worker()
596 info->cable.connected = true; in axp288_charger_extcon_evt_worker()
597 info->cable.chg_type = POWER_SUPPLY_TYPE_USB_CDP; in axp288_charger_extcon_evt_worker()
600 dev_dbg(&info->pdev->dev, "USB DCP charger is connected"); in axp288_charger_extcon_evt_worker()
601 info->cable.connected = true; in axp288_charger_extcon_evt_worker()
602 info->cable.chg_type = POWER_SUPPLY_TYPE_USB_DCP; in axp288_charger_extcon_evt_worker()
605 dev_dbg(&info->pdev->dev, "USB charger disconnected"); in axp288_charger_extcon_evt_worker()
606 info->cable.connected = false; in axp288_charger_extcon_evt_worker()
607 info->cable.chg_type = POWER_SUPPLY_TYPE_USB; in axp288_charger_extcon_evt_worker()
611 if (old_connected != info->cable.connected) in axp288_charger_extcon_evt_worker()
617 mutex_lock(&info->lock); in axp288_charger_extcon_evt_worker()
619 if (info->is_charger_enabled && !info->cable.connected) { in axp288_charger_extcon_evt_worker()
620 info->enable_charger = false; in axp288_charger_extcon_evt_worker()
621 ret = axp288_charger_enable_charger(info, info->enable_charger); in axp288_charger_extcon_evt_worker()
623 dev_err(&info->pdev->dev, in axp288_charger_extcon_evt_worker()
626 } else if (!info->is_charger_enabled && info->cable.connected) { in axp288_charger_extcon_evt_worker()
627 switch (info->cable.chg_type) { in axp288_charger_extcon_evt_worker()
644 ret = axp288_charger_set_vbus_inlmt(info, current_limit); in axp288_charger_extcon_evt_worker()
646 dev_err(&info->pdev->dev, in axp288_charger_extcon_evt_worker()
649 info->enable_charger = (current_limit > 0); in axp288_charger_extcon_evt_worker()
650 ret = axp288_charger_enable_charger(info, in axp288_charger_extcon_evt_worker()
651 info->enable_charger); in axp288_charger_extcon_evt_worker()
653 dev_err(&info->pdev->dev, in axp288_charger_extcon_evt_worker()
659 info->health = axp288_get_charger_health(info); in axp288_charger_extcon_evt_worker()
661 mutex_unlock(&info->lock); in axp288_charger_extcon_evt_worker()
664 power_supply_changed(info->psy_usb); in axp288_charger_extcon_evt_worker()
670 struct axp288_chrg_info *info = in axp288_charger_handle_cable_evt() local
673 schedule_work(&info->cable.work); in axp288_charger_handle_cable_evt()
680 struct axp288_chrg_info *info = in axp288_charger_otg_evt_worker() local
685 ret = axp288_charger_vbus_path_select(info, !info->otg.id_short); in axp288_charger_otg_evt_worker()
687 dev_warn(&info->pdev->dev, "vbus path disable failed\n"); in axp288_charger_otg_evt_worker()
693 struct axp288_chrg_info *info = in axp288_charger_handle_otg_evt() local
698 dev_dbg(&info->pdev->dev, "external connector USB-Host is %s\n", in axp288_charger_handle_otg_evt()
705 info->otg.id_short = usb_host; in axp288_charger_handle_otg_evt()
706 schedule_work(&info->otg.work); in axp288_charger_handle_otg_evt()
711 static void charger_init_hw_regs(struct axp288_chrg_info *info) in charger_init_hw_regs() argument
717 ret = regmap_write(info->regmap, AXP20X_V_LTF_CHRG, CHRG_VLTFC_0C); in charger_init_hw_regs()
719 dev_warn(&info->pdev->dev, "register(%x) write error(%d)\n", in charger_init_hw_regs()
722 ret = regmap_write(info->regmap, AXP20X_V_HTF_CHRG, CHRG_VHTFC_45C); in charger_init_hw_regs()
724 dev_warn(&info->pdev->dev, "register(%x) write error(%d)\n", in charger_init_hw_regs()
728 ret = regmap_update_bits(info->regmap, in charger_init_hw_regs()
732 dev_warn(&info->pdev->dev, "register(%x) write error(%d)\n", in charger_init_hw_regs()
736 ret = regmap_update_bits(info->regmap, in charger_init_hw_regs()
740 dev_warn(&info->pdev->dev, "register(%x) write error(%d)\n", in charger_init_hw_regs()
743 ret = regmap_update_bits(info->regmap, AXP20X_IRQ3_EN, in charger_init_hw_regs()
746 dev_warn(&info->pdev->dev, "register(%x) write error(%d)\n", in charger_init_hw_regs()
750 ret = regmap_update_bits(info->regmap, in charger_init_hw_regs()
754 dev_warn(&info->pdev->dev, "register(%x) write error(%d)\n", in charger_init_hw_regs()
758 ret = regmap_update_bits(info->regmap, in charger_init_hw_regs()
762 dev_warn(&info->pdev->dev, "register(%x) write error(%d)\n", in charger_init_hw_regs()
766 info->max_cc = info->pdata->max_cc; in charger_init_hw_regs()
767 info->max_cv = info->pdata->max_cv; in charger_init_hw_regs()
770 ret = regmap_read(info->regmap, AXP20X_CHRG_CTRL1, &val); in charger_init_hw_regs()
773 info->cc = info->pdata->def_cc; in charger_init_hw_regs()
774 info->cv = info->pdata->def_cv; in charger_init_hw_regs()
780 info->cv = CV_4100MV; in charger_init_hw_regs()
783 info->cv = CV_4150MV; in charger_init_hw_regs()
786 info->cv = CV_4200MV; in charger_init_hw_regs()
789 info->cv = CV_4350MV; in charger_init_hw_regs()
792 info->cv = INT_MAX; in charger_init_hw_regs()
799 info->cc = cc; in charger_init_hw_regs()
802 cc = min(info->pdata->def_cc, info->max_cc); in charger_init_hw_regs()
803 cv = min(info->pdata->def_cv, info->max_cv); in charger_init_hw_regs()
805 ret = axp288_charger_set_cc(info, cc); in charger_init_hw_regs()
807 dev_warn(&info->pdev->dev, in charger_init_hw_regs()
810 ret = axp288_charger_set_cv(info, cv); in charger_init_hw_regs()
812 dev_warn(&info->pdev->dev, in charger_init_hw_regs()
820 struct axp288_chrg_info *info; in axp288_charger_probe() local
824 info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL); in axp288_charger_probe()
825 if (!info) in axp288_charger_probe()
828 info->pdev = pdev; in axp288_charger_probe()
829 info->regmap = axp20x->regmap; in axp288_charger_probe()
830 info->regmap_irqc = axp20x->regmap_irqc; in axp288_charger_probe()
831 info->pdata = pdev->dev.platform_data; in axp288_charger_probe()
833 if (!info->pdata) { in axp288_charger_probe()
841 info->cable.edev = extcon_get_extcon_dev(AXP288_EXTCON_DEV_NAME); in axp288_charger_probe()
842 if (info->cable.edev == NULL) { in axp288_charger_probe()
849 INIT_WORK(&info->cable.work, axp288_charger_extcon_evt_worker); in axp288_charger_probe()
850 info->cable.nb.notifier_call = axp288_charger_handle_cable_evt; in axp288_charger_probe()
851 ret = extcon_register_notifier(info->cable.edev, EXTCON_NONE, &info->cable.nb); in axp288_charger_probe()
853 dev_err(&info->pdev->dev, in axp288_charger_probe()
858 platform_set_drvdata(pdev, info); in axp288_charger_probe()
859 mutex_init(&info->lock); in axp288_charger_probe()
862 charger_cfg.drv_data = info; in axp288_charger_probe()
863 info->psy_usb = power_supply_register(&pdev->dev, &axp288_charger_desc, in axp288_charger_probe()
865 if (IS_ERR(info->psy_usb)) { in axp288_charger_probe()
867 ret = PTR_ERR(info->psy_usb); in axp288_charger_probe()
872 INIT_WORK(&info->otg.work, axp288_charger_otg_evt_worker); in axp288_charger_probe()
873 info->otg.id_nb.notifier_call = axp288_charger_handle_otg_evt; in axp288_charger_probe()
874 ret = extcon_register_interest(&info->otg.cable, NULL, "USB-Host", in axp288_charger_probe()
875 &info->otg.id_nb); in axp288_charger_probe()
879 if (info->otg.cable.edev) in axp288_charger_probe()
880 info->otg.id_short = extcon_get_cable_state( in axp288_charger_probe()
881 info->otg.cable.edev, "USB-Host"); in axp288_charger_probe()
885 pirq = platform_get_irq(info->pdev, i); in axp288_charger_probe()
886 info->irq[i] = regmap_irq_get_virq(info->regmap_irqc, pirq); in axp288_charger_probe()
887 if (info->irq[i] < 0) { in axp288_charger_probe()
888 dev_warn(&info->pdev->dev, in axp288_charger_probe()
890 ret = info->irq[i]; in axp288_charger_probe()
893 ret = devm_request_threaded_irq(&info->pdev->dev, info->irq[i], in axp288_charger_probe()
895 IRQF_ONESHOT, info->pdev->name, info); in axp288_charger_probe()
898 info->irq[i]); in axp288_charger_probe()
903 charger_init_hw_regs(info); in axp288_charger_probe()
908 if (info->otg.cable.edev) in axp288_charger_probe()
909 extcon_unregister_interest(&info->otg.cable); in axp288_charger_probe()
910 power_supply_unregister(info->psy_usb); in axp288_charger_probe()
912 extcon_unregister_notifier(info->cable.edev, EXTCON_NONE, &info->cable.nb); in axp288_charger_probe()
918 struct axp288_chrg_info *info = dev_get_drvdata(&pdev->dev); in axp288_charger_remove() local
920 if (info->otg.cable.edev) in axp288_charger_remove()
921 extcon_unregister_interest(&info->otg.cable); in axp288_charger_remove()
923 extcon_unregister_notifier(info->cable.edev, EXTCON_NONE, &info->cable.nb); in axp288_charger_remove()
924 power_supply_unregister(info->psy_usb); in axp288_charger_remove()