Lines Matching full:charge
356 struct rk817_charger *charge = power_supply_get_drvdata(psy); in rk817_charge_ac_get_property() local
361 if (charge->pdata->virtual_power) in rk817_charge_ac_get_property()
364 val->intval = (charge->ac_in | charge->dc_in); in rk817_charge_ac_get_property()
369 if (charge->pdata->virtual_power) in rk817_charge_ac_get_property()
372 val->intval = charge->prop_status; in rk817_charge_ac_get_property()
377 val->intval = charge->max_chrg_voltage * 1000; /* uV */ in rk817_charge_ac_get_property()
380 val->intval = charge->max_chrg_current * 1000; /* uA */ in rk817_charge_ac_get_property()
394 struct rk817_charger *charge = power_supply_get_drvdata(psy); in rk817_charge_usb_get_property() local
399 if (charge->pdata->virtual_power) in rk817_charge_usb_get_property()
402 val->intval = charge->usb_in; in rk817_charge_usb_get_property()
407 if (charge->pdata->virtual_power) in rk817_charge_usb_get_property()
410 val->intval = charge->prop_status; in rk817_charge_usb_get_property()
415 val->intval = charge->max_chrg_voltage; in rk817_charge_usb_get_property()
418 val->intval = charge->max_chrg_current; in rk817_charge_usb_get_property()
444 static int rk817_charge_init_power_supply(struct rk817_charger *charge) in rk817_charge_init_power_supply() argument
446 struct power_supply_config psy_cfg = { .drv_data = charge, }; in rk817_charge_init_power_supply()
448 charge->usb_psy = devm_power_supply_register(charge->dev, in rk817_charge_init_power_supply()
451 if (IS_ERR(charge->usb_psy)) { in rk817_charge_init_power_supply()
452 dev_err(charge->dev, "register usb power supply fail\n"); in rk817_charge_init_power_supply()
453 return PTR_ERR(charge->usb_psy); in rk817_charge_init_power_supply()
456 charge->ac_psy = devm_power_supply_register(charge->dev, &rk817_ac_desc, in rk817_charge_init_power_supply()
458 if (IS_ERR(charge->ac_psy)) { in rk817_charge_init_power_supply()
459 dev_err(charge->dev, "register ac power supply fail\n"); in rk817_charge_init_power_supply()
460 return PTR_ERR(charge->ac_psy); in rk817_charge_init_power_supply()
466 static int rk817_charge_field_read(struct rk817_charger *charge, in rk817_charge_field_read() argument
472 ret = regmap_field_read(charge->rmap_fields[field_id], &val); in rk817_charge_field_read()
479 static int rk817_charge_field_write(struct rk817_charger *charge, in rk817_charge_field_write() argument
483 return regmap_field_write(charge->rmap_fields[field_id], val); in rk817_charge_field_write()
486 static int rk817_charge_get_otg_state(struct rk817_charger *charge) in rk817_charge_get_otg_state() argument
488 return regulator_is_enabled(charge->otg5v_rdev); in rk817_charge_get_otg_state()
491 static void rk817_charge_boost_disable(struct rk817_charger *charge) in rk817_charge_boost_disable() argument
493 rk817_charge_field_write(charge, BOOST_EN, RK817_BOOST_DISABLE); in rk817_charge_boost_disable()
496 static void rk817_charge_boost_enable(struct rk817_charger *charge) in rk817_charge_boost_enable() argument
498 rk817_charge_field_write(charge, BOOST_EN, RK817_BOOST_ENABLE); in rk817_charge_boost_enable()
501 static void rk817_charge_otg_disable(struct rk817_charger *charge) in rk817_charge_otg_disable() argument
505 ret = regulator_disable(charge->otg5v_rdev); in rk817_charge_otg_disable()
515 static void rk817_charge_otg_enable(struct rk817_charger *charge) in rk817_charge_otg_enable() argument
519 ret = regulator_enable(charge->otg5v_rdev); in rk817_charge_otg_enable()
530 static int rk817_charge_get_otg_slp_state(struct rk817_charger *charge) in rk817_charge_get_otg_slp_state() argument
532 return (rk817_charge_field_read(charge, OTG_SLP_EN) & OTG_SLP_ENABLE); in rk817_charge_get_otg_slp_state()
535 static void rk817_charge_otg_slp_disable(struct rk817_charger *charge) in rk817_charge_otg_slp_disable() argument
537 rk817_charge_field_write(charge, OTG_SLP_EN, OTG_SLP_DISABLE); in rk817_charge_otg_slp_disable()
540 static void rk817_charge_otg_slp_enable(struct rk817_charger *charge) in rk817_charge_otg_slp_enable() argument
542 rk817_charge_field_write(charge, OTG_SLP_EN, OTG_SLP_ENABLE); in rk817_charge_otg_slp_enable()
546 static int rk817_charge_get_charge_state(struct rk817_charger *charge) in rk817_charge_get_charge_state() argument
548 return rk817_charge_field_read(charge, CHRG_EN); in rk817_charge_get_charge_state()
551 static void rk817_charge_enable_charge(struct rk817_charger *charge) in rk817_charge_enable_charge() argument
553 rk817_charge_field_write(charge, CHRG_EN, ENABLE); in rk817_charge_enable_charge()
556 static void rk817_charge_usb_to_sys_enable(struct rk817_charger *charge) in rk817_charge_usb_to_sys_enable() argument
558 rk817_charge_field_write(charge, USB_SYS_EN, ENABLE); in rk817_charge_usb_to_sys_enable()
561 static void rk817_charge_sys_can_sd_disable(struct rk817_charger *charge) in rk817_charge_sys_can_sd_disable() argument
563 rk817_charge_field_write(charge, SYS_CAN_SD, DISABLE); in rk817_charge_sys_can_sd_disable()
566 static int rk817_charge_get_charge_status(struct rk817_charger *charge) in rk817_charge_get_charge_status() argument
570 status = rk817_charge_field_read(charge, CHG_STS); in rk817_charge_get_charge_status()
574 DBG("charge off...\n"); in rk817_charge_get_charge_status()
577 DBG("dead charge...\n"); in rk817_charge_get_charge_status()
580 DBG("trickle charge...\n"); in rk817_charge_get_charge_status()
583 DBG("CC or CV charge...\n"); in rk817_charge_get_charge_status()
586 DBG("charge TERM...\n"); in rk817_charge_get_charge_status()
604 static int rk817_charge_get_plug_in_status(struct rk817_charger *charge) in rk817_charge_get_plug_in_status() argument
606 return rk817_charge_field_read(charge, PLUG_IN_STS); in rk817_charge_get_plug_in_status()
609 static void rk817_charge_set_charge_clock(struct rk817_charger *charge, in rk817_charge_set_charge_clock() argument
612 rk817_charge_field_write(charge, CHRG_CLK_SEL, clock); in rk817_charge_set_charge_clock()
615 static int is_battery_exist(struct rk817_charger *charge) in is_battery_exist() argument
617 return rk817_charge_field_read(charge, BAT_EXS); in is_battery_exist()
620 static void rk817_charge_set_chrg_voltage(struct rk817_charger *charge, in rk817_charge_set_chrg_voltage() argument
626 dev_err(charge->dev, "the charge voltage is error!\n"); in rk817_charge_set_chrg_voltage()
629 rk817_charge_field_write(charge, in rk817_charge_set_chrg_voltage()
635 static void rk817_charge_set_chrg_current(struct rk817_charger *charge, in rk817_charge_set_chrg_current() argument
639 dev_err(charge->dev, "the charge current is error!\n"); in rk817_charge_set_chrg_current()
642 rk817_charge_field_write(charge, CHRG_CUR_SEL, CHRG_CUR_500MA); in rk817_charge_set_chrg_current()
644 rk817_charge_field_write(charge, CHRG_CUR_SEL, CHRG_CUR_1000MA); in rk817_charge_set_chrg_current()
646 rk817_charge_field_write(charge, CHRG_CUR_SEL, CHRG_CUR_1500MA); in rk817_charge_set_chrg_current()
648 rk817_charge_field_write(charge, CHRG_CUR_SEL, CHRG_CUR_2000MA); in rk817_charge_set_chrg_current()
650 rk817_charge_field_write(charge, CHRG_CUR_SEL, CHRG_CUR_2500MA); in rk817_charge_set_chrg_current()
652 rk817_charge_field_write(charge, CHRG_CUR_SEL, CHRG_CUR_3000MA); in rk817_charge_set_chrg_current()
654 rk817_charge_field_write(charge, CHRG_CUR_SEL, CHRG_CUR_3500MA); in rk817_charge_set_chrg_current()
657 static void rk817_charge_vlimit_enable(struct rk817_charger *charge) in rk817_charge_vlimit_enable() argument
659 rk817_charge_field_write(charge, USB_VLIM_EN, ENABLE); in rk817_charge_vlimit_enable()
662 static void rk817_charge_set_input_voltage(struct rk817_charger *charge, in rk817_charge_set_input_voltage() argument
668 dev_err(charge->dev, "the input voltage is error.\n"); in rk817_charge_set_input_voltage()
672 rk817_charge_field_write(charge, USB_VLIM_SEL, voltage); in rk817_charge_set_input_voltage()
673 rk817_charge_vlimit_enable(charge); in rk817_charge_set_input_voltage()
676 static void rk817_charge_ilimit_enable(struct rk817_charger *charge) in rk817_charge_ilimit_enable() argument
678 rk817_charge_field_write(charge, USB_ILIM_EN, ENABLE); in rk817_charge_ilimit_enable()
681 static void rk817_charge_set_input_current(struct rk817_charger *charge, in rk817_charge_set_input_current() argument
685 dev_err(charge->dev, "the input current is error.\n"); in rk817_charge_set_input_current()
688 rk817_charge_field_write(charge, USB_ILIM_SEL, in rk817_charge_set_input_current()
691 rk817_charge_field_write(charge, USB_ILIM_SEL, in rk817_charge_set_input_current()
694 rk817_charge_field_write(charge, USB_ILIM_SEL, in rk817_charge_set_input_current()
697 rk817_charge_field_write(charge, USB_ILIM_SEL, in rk817_charge_set_input_current()
700 rk817_charge_field_write(charge, USB_ILIM_SEL, in rk817_charge_set_input_current()
703 rk817_charge_field_write(charge, USB_ILIM_SEL, in rk817_charge_set_input_current()
706 rk817_charge_field_write(charge, USB_ILIM_SEL, in rk817_charge_set_input_current()
709 rk817_charge_field_write(charge, USB_ILIM_SEL, in rk817_charge_set_input_current()
712 rk817_charge_ilimit_enable(charge); in rk817_charge_set_input_current()
715 static void rk817_charge_set_chrg_term_mod(struct rk817_charger *charge, in rk817_charge_set_chrg_term_mod() argument
718 rk817_charge_field_write(charge, CHRG_TERM_ANA_DIG, mode); in rk817_charge_set_chrg_term_mod()
721 static void rk817_charge_set_term_current_analog(struct rk817_charger *charge, in rk817_charge_set_term_current_analog() argument
735 rk817_charge_field_write(charge, in rk817_charge_set_term_current_analog()
740 static void rk817_charge_set_term_current_digital(struct rk817_charger *charge, in rk817_charge_set_term_current_digital() argument
746 value = CURRENT_TO_ADC(chrg_current, charge->res_div); in rk817_charge_set_term_current_digital()
750 rk817_charge_field_write(charge, CHRG_TERM_DIG, current_adc); in rk817_charge_set_term_current_digital()
753 static void rk817_charge_set_chrg_finish_condition(struct rk817_charger *charge) in rk817_charge_set_chrg_finish_condition() argument
755 if (charge->chrg_term_mode == CHRG_ANALOG) in rk817_charge_set_chrg_finish_condition()
756 rk817_charge_set_term_current_analog(charge, in rk817_charge_set_chrg_finish_condition()
757 charge->chrg_finish_cur); in rk817_charge_set_chrg_finish_condition()
759 rk817_charge_set_term_current_digital(charge, in rk817_charge_set_chrg_finish_condition()
760 charge->chrg_finish_cur); in rk817_charge_set_chrg_finish_condition()
762 rk817_charge_set_chrg_term_mod(charge, charge->chrg_term_mode); in rk817_charge_set_chrg_finish_condition()
765 static int rk817_charge_online(struct rk817_charger *charge) in rk817_charge_online() argument
767 return (charge->ac_in | charge->usb_in | charge->dc_in); in rk817_charge_online()
770 static int rk817_charge_get_dsoc(struct rk817_charger *charge) in rk817_charge_get_dsoc() argument
774 soc_save = rk817_charge_field_read(charge, SOC_REG0); in rk817_charge_get_dsoc()
775 soc_save |= (rk817_charge_field_read(charge, SOC_REG1) << 8); in rk817_charge_get_dsoc()
776 soc_save |= (rk817_charge_field_read(charge, SOC_REG2) << 16); in rk817_charge_get_dsoc()
781 static void rk817_charge_set_otg_in(struct rk817_charger *charge, int online) in rk817_charge_set_otg_in() argument
783 charge->otg_in = online; in rk817_charge_set_otg_in()
786 static void rk817_charge_set_chrg_param(struct rk817_charger *charge, in rk817_charge_set_chrg_param() argument
791 charge->usb_in = 0; in rk817_charge_set_chrg_param()
792 charge->ac_in = 0; in rk817_charge_set_chrg_param()
793 if (charge->dc_in == 0) { in rk817_charge_set_chrg_param()
794 charge->prop_status = POWER_SUPPLY_STATUS_DISCHARGING; in rk817_charge_set_chrg_param()
795 rk817_charge_set_input_current(charge, INPUT_450MA); in rk817_charge_set_chrg_param()
797 power_supply_changed(charge->usb_psy); in rk817_charge_set_chrg_param()
798 power_supply_changed(charge->ac_psy); in rk817_charge_set_chrg_param()
801 charge->usb_in = 1; in rk817_charge_set_chrg_param()
802 charge->ac_in = 0; in rk817_charge_set_chrg_param()
803 charge->prop_status = POWER_SUPPLY_STATUS_CHARGING; in rk817_charge_set_chrg_param()
804 if (charge->dc_in == 0) in rk817_charge_set_chrg_param()
805 rk817_charge_set_input_current(charge, INPUT_450MA); in rk817_charge_set_chrg_param()
806 power_supply_changed(charge->usb_psy); in rk817_charge_set_chrg_param()
807 power_supply_changed(charge->ac_psy); in rk817_charge_set_chrg_param()
811 charge->ac_in = 1; in rk817_charge_set_chrg_param()
812 charge->usb_in = 0; in rk817_charge_set_chrg_param()
813 charge->prop_status = POWER_SUPPLY_STATUS_CHARGING; in rk817_charge_set_chrg_param()
815 rk817_charge_set_input_current(charge, in rk817_charge_set_chrg_param()
816 charge->max_input_current); in rk817_charge_set_chrg_param()
818 rk817_charge_set_input_current(charge, in rk817_charge_set_chrg_param()
820 power_supply_changed(charge->usb_psy); in rk817_charge_set_chrg_param()
821 power_supply_changed(charge->ac_psy); in rk817_charge_set_chrg_param()
824 charge->dc_in = 1; in rk817_charge_set_chrg_param()
825 charge->prop_status = POWER_SUPPLY_STATUS_CHARGING; in rk817_charge_set_chrg_param()
826 rk817_charge_set_input_current(charge, in rk817_charge_set_chrg_param()
827 charge->max_input_current); in rk817_charge_set_chrg_param()
828 power_supply_changed(charge->usb_psy); in rk817_charge_set_chrg_param()
829 power_supply_changed(charge->ac_psy); in rk817_charge_set_chrg_param()
832 charge->dc_in = 0; in rk817_charge_set_chrg_param()
833 if (!rk817_charge_get_plug_in_status(charge)) { in rk817_charge_set_chrg_param()
834 charge->ac_in = 0; in rk817_charge_set_chrg_param()
835 charge->usb_in = 0; in rk817_charge_set_chrg_param()
836 charge->prop_status = POWER_SUPPLY_STATUS_DISCHARGING; in rk817_charge_set_chrg_param()
837 rk817_charge_set_input_current(charge, INPUT_450MA); in rk817_charge_set_chrg_param()
838 } else if (charge->usb_in) { in rk817_charge_set_chrg_param()
839 rk817_charge_set_input_current(charge, INPUT_450MA); in rk817_charge_set_chrg_param()
840 charge->prop_status = POWER_SUPPLY_STATUS_CHARGING; in rk817_charge_set_chrg_param()
842 power_supply_changed(charge->usb_psy); in rk817_charge_set_chrg_param()
843 power_supply_changed(charge->ac_psy); in rk817_charge_set_chrg_param()
846 charge->prop_status = POWER_SUPPLY_STATUS_DISCHARGING; in rk817_charge_set_chrg_param()
847 rk817_charge_set_input_current(charge, INPUT_450MA); in rk817_charge_set_chrg_param()
851 if (rk817_charge_online(charge) && rk817_charge_get_dsoc(charge) == 100) in rk817_charge_set_chrg_param()
852 charge->prop_status = POWER_SUPPLY_STATUS_FULL; in rk817_charge_set_chrg_param()
855 static void rk817_charge_set_otg_state(struct rk817_charger *charge, int state) in rk817_charge_set_otg_state() argument
859 if (charge->otg_in) { in rk817_charge_set_otg_state()
863 if (!rk817_charge_get_otg_state(charge)) { in rk817_charge_set_otg_state()
864 rk817_charge_otg_enable(charge); in rk817_charge_set_otg_state()
865 if (!rk817_charge_get_otg_state(charge)) { in rk817_charge_set_otg_state()
870 disable_irq(charge->plugin_irq); in rk817_charge_set_otg_state()
871 disable_irq(charge->plugout_irq); in rk817_charge_set_otg_state()
877 if (!charge->otg_in) { in rk817_charge_set_otg_state()
881 if (rk817_charge_get_otg_state(charge)) { in rk817_charge_set_otg_state()
882 rk817_charge_otg_disable(charge); in rk817_charge_set_otg_state()
883 if (rk817_charge_get_otg_state(charge)) { in rk817_charge_set_otg_state()
888 enable_irq(charge->plugin_irq); in rk817_charge_set_otg_state()
889 enable_irq(charge->plugout_irq); in rk817_charge_set_otg_state()
894 dev_err(charge->dev, "error otg type\n"); in rk817_charge_set_otg_state()
901 struct rk817_charger *charge = (struct rk817_charger *)charger; in rk817_charge_dc_det_isr() local
903 if (gpio_get_value(charge->pdata->dc_det_pin)) in rk817_charge_dc_det_isr()
908 queue_delayed_work(charge->dc_charger_wq, &charge->dc_work, in rk817_charge_dc_det_isr()
914 static enum charger_t rk817_charge_get_dc_state(struct rk817_charger *charge) in rk817_charge_get_dc_state() argument
918 if (!gpio_is_valid(charge->pdata->dc_det_pin)) in rk817_charge_get_dc_state()
921 level = gpio_get_value(charge->pdata->dc_det_pin); in rk817_charge_get_dc_state()
923 return (level == charge->pdata->dc_det_level) ? in rk817_charge_get_dc_state()
930 struct rk817_charger *charge = container_of(work, in rk817_charge_dc_det_worker() local
933 charger = rk817_charge_get_dc_state(charge); in rk817_charge_dc_det_worker()
936 rk817_charge_set_chrg_param(charge, DC_TYPE_DC_CHARGER); in rk817_charge_dc_det_worker()
938 if (charge->otg_in && charge->pdata->power_dc2otg) { in rk817_charge_dc_det_worker()
940 rk817_charge_set_otg_state(charge, USB_OTG_POWER_OFF); in rk817_charge_dc_det_worker()
943 rk817_charge_boost_disable(charge); in rk817_charge_dc_det_worker()
946 rk817_charge_set_chrg_param(charge, DC_TYPE_NONE_CHARGER); in rk817_charge_dc_det_worker()
947 rk817_charge_boost_enable(charge); in rk817_charge_dc_det_worker()
949 if (charge->otg_in) in rk817_charge_dc_det_worker()
950 rk817_charge_set_otg_state(charge, USB_OTG_POWER_ON); in rk817_charge_dc_det_worker()
954 static int rk817_charge_init_dc(struct rk817_charger *charge) in rk817_charge_init_dc() argument
960 charge->dc_charger_wq = alloc_ordered_workqueue("%s", in rk817_charge_init_dc()
963 INIT_DELAYED_WORK(&charge->dc_work, rk817_charge_dc_det_worker); in rk817_charge_init_dc()
964 charge->dc_charger = DC_TYPE_NONE_CHARGER; in rk817_charge_init_dc()
966 if (!charge->pdata->support_dc_det) in rk817_charge_init_dc()
969 ret = devm_gpio_request(charge->dev, in rk817_charge_init_dc()
970 charge->pdata->dc_det_pin, in rk817_charge_init_dc()
973 dev_err(charge->dev, "failed to request gpio %d\n", in rk817_charge_init_dc()
974 charge->pdata->dc_det_pin); in rk817_charge_init_dc()
978 ret = gpio_direction_input(charge->pdata->dc_det_pin); in rk817_charge_init_dc()
980 dev_err(charge->dev, "failed to set gpio input\n"); in rk817_charge_init_dc()
984 level = gpio_get_value(charge->pdata->dc_det_pin); in rk817_charge_init_dc()
985 if (level == charge->pdata->dc_det_level) in rk817_charge_init_dc()
986 charge->dc_charger = DC_TYPE_DC_CHARGER; in rk817_charge_init_dc()
988 charge->dc_charger = DC_TYPE_NONE_CHARGER; in rk817_charge_init_dc()
995 dc_det_irq = gpio_to_irq(charge->pdata->dc_det_pin); in rk817_charge_init_dc()
996 ret = devm_request_irq(charge->dev, dc_det_irq, rk817_charge_dc_det_isr, in rk817_charge_init_dc()
997 irq_flags, "rk817_dc_det", charge); in rk817_charge_init_dc()
999 dev_err(charge->dev, "rk817_dc_det_irq request failed!\n"); in rk817_charge_init_dc()
1005 if (charge->dc_charger != DC_TYPE_NONE_CHARGER) in rk817_charge_init_dc()
1006 rk817_charge_set_chrg_param(charge, charge->dc_charger); in rk817_charge_init_dc()
1013 struct rk817_charger *charge = container_of(work, in rk817_charge_host_evt_worker() local
1015 struct extcon_dev *edev = charge->cable_edev; in rk817_charge_host_evt_worker()
1020 if (charge->dc_in && charge->pdata->power_dc2otg) { in rk817_charge_host_evt_worker()
1021 if (charge->otg_in) in rk817_charge_host_evt_worker()
1022 rk817_charge_set_otg_state(charge, in rk817_charge_host_evt_worker()
1026 rk817_charge_set_otg_state(charge, USB_OTG_POWER_ON); in rk817_charge_host_evt_worker()
1028 rk817_charge_set_otg_in(charge, ONLINE); in rk817_charge_host_evt_worker()
1031 rk817_charge_set_otg_state(charge, USB_OTG_POWER_OFF); in rk817_charge_host_evt_worker()
1032 rk817_charge_set_otg_in(charge, OFFLINE); in rk817_charge_host_evt_worker()
1038 struct rk817_charger *charge = container_of(work, in rk817_charger_evt_worker() local
1040 struct extcon_dev *edev = charge->cable_edev; in rk817_charger_evt_worker()
1056 charge->usb_charger = charger; in rk817_charger_evt_worker()
1057 rk817_charge_set_chrg_param(charge, charger); in rk817_charger_evt_worker()
1063 struct rk817_charger *charge = container_of(work, in rk817_charge_discnt_evt_worker() local
1066 if (extcon_get_state(charge->cable_edev, EXTCON_USB) == 0) { in rk817_charge_discnt_evt_worker()
1069 rk817_charge_set_chrg_param(charge, USB_TYPE_NONE_CHARGER); in rk817_charge_discnt_evt_worker()
1075 struct rk817_charger *charge = container_of(work, in rk817_charge_bc_evt_worker() local
1082 switch (charge->bc_event) { in rk817_charge_bc_evt_worker()
1084 rk817_charge_set_chrg_param(charge, USB_TYPE_NONE_CHARGER); in rk817_charge_bc_evt_worker()
1087 rk817_charge_set_chrg_param(charge, USB_TYPE_USB_CHARGER); in rk817_charge_bc_evt_worker()
1090 rk817_charge_set_chrg_param(charge, USB_TYPE_AC_CHARGER); in rk817_charge_bc_evt_worker()
1093 rk817_charge_set_chrg_param(charge, USB_TYPE_CDP_CHARGER); in rk817_charge_bc_evt_worker()
1096 if (charge->pdata->power_dc2otg && charge->dc_in) in rk817_charge_bc_evt_worker()
1099 rk817_charge_set_otg_state(charge, USB_OTG_POWER_ON); in rk817_charge_bc_evt_worker()
1102 rk817_charge_set_otg_state(charge, USB_OTG_POWER_OFF); in rk817_charge_bc_evt_worker()
1108 DBG("receive bc notifier event: %s..\n", event_name[charge->bc_event]); in rk817_charge_bc_evt_worker()
1114 struct rk817_charger *charge = in rk817_charger_evt_notifier() local
1117 queue_delayed_work(charge->usb_charger_wq, &charge->usb_work, in rk817_charger_evt_notifier()
1126 struct rk817_charger *charge = in rk817_charge_host_evt_notifier() local
1129 queue_delayed_work(charge->usb_charger_wq, &charge->host_work, in rk817_charge_host_evt_notifier()
1138 struct rk817_charger *charge = in rk817_charge_discnt_evt_notfier() local
1141 queue_delayed_work(charge->usb_charger_wq, &charge->discnt_work, in rk817_charge_discnt_evt_notfier()
1150 struct rk817_charger *charge = in rk817_charge_bc_evt_notifier() local
1153 charge->bc_event = event; in rk817_charge_bc_evt_notifier()
1154 queue_delayed_work(charge->usb_charger_wq, &charge->usb_work, in rk817_charge_bc_evt_notifier()
1160 static int rk817_charge_usb_init(struct rk817_charger *charge) in rk817_charge_usb_init() argument
1165 struct device *dev = charge->dev; in rk817_charge_usb_init()
1168 charge->usb_charger_wq = alloc_ordered_workqueue("%s", in rk817_charge_usb_init()
1173 if (charge->pdata->extcon) { in rk817_charge_usb_init()
1182 INIT_DELAYED_WORK(&charge->usb_work, rk817_charger_evt_worker); in rk817_charge_usb_init()
1183 charge->cable_cg_nb.notifier_call = rk817_charger_evt_notifier; in rk817_charge_usb_init()
1185 &charge->cable_cg_nb); in rk817_charge_usb_init()
1192 &charge->cable_cg_nb); in rk817_charge_usb_init()
1196 &charge->cable_cg_nb); in rk817_charge_usb_init()
1201 &charge->cable_cg_nb); in rk817_charge_usb_init()
1205 &charge->cable_cg_nb); in rk817_charge_usb_init()
1207 &charge->cable_cg_nb); in rk817_charge_usb_init()
1212 INIT_DELAYED_WORK(&charge->host_work, in rk817_charge_usb_init()
1214 charge->cable_host_nb.notifier_call = in rk817_charge_usb_init()
1217 &charge->cable_host_nb); in rk817_charge_usb_init()
1221 &charge->cable_cg_nb); in rk817_charge_usb_init()
1223 &charge->cable_cg_nb); in rk817_charge_usb_init()
1225 &charge->cable_cg_nb); in rk817_charge_usb_init()
1231 INIT_DELAYED_WORK(&charge->discnt_work, in rk817_charge_usb_init()
1233 charge->cable_discnt_nb.notifier_call = in rk817_charge_usb_init()
1236 &charge->cable_discnt_nb); in rk817_charge_usb_init()
1240 &charge->cable_cg_nb); in rk817_charge_usb_init()
1242 &charge->cable_cg_nb); in rk817_charge_usb_init()
1244 &charge->cable_cg_nb); in rk817_charge_usb_init()
1246 &charge->cable_host_nb); in rk817_charge_usb_init()
1250 charge->cable_edev = edev; in rk817_charge_usb_init()
1254 INIT_DELAYED_WORK(&charge->usb_work, in rk817_charge_usb_init()
1256 charge->bc_nb.notifier_call = rk817_charge_bc_evt_notifier; in rk817_charge_usb_init()
1257 ret = rk_bc_detect_notifier_register(&charge->bc_nb, &bc_type); in rk817_charge_usb_init()
1279 charge->usb_charger = charger; in rk817_charge_usb_init()
1280 if (charge->dc_charger != DC_TYPE_NONE_CHARGER) in rk817_charge_usb_init()
1281 rk817_charge_set_chrg_param(charge, in rk817_charge_usb_init()
1282 charge->usb_charger); in rk817_charge_usb_init()
1290 static void rk817_charge_pre_init(struct rk817_charger *charge) in rk817_charge_pre_init() argument
1292 charge->max_chrg_current = charge->pdata->max_chrg_current; in rk817_charge_pre_init()
1293 charge->max_input_current = charge->pdata->max_input_current; in rk817_charge_pre_init()
1294 charge->max_chrg_voltage = charge->pdata->max_chrg_voltage; in rk817_charge_pre_init()
1295 charge->min_input_voltage = charge->pdata->min_input_voltage; in rk817_charge_pre_init()
1296 charge->chrg_finish_cur = charge->pdata->chrg_finish_cur; in rk817_charge_pre_init()
1297 charge->chrg_term_mode = charge->pdata->chrg_term_mode; in rk817_charge_pre_init()
1299 rk817_charge_set_input_voltage(charge, charge->min_input_voltage); in rk817_charge_pre_init()
1301 rk817_charge_set_chrg_voltage(charge, charge->max_chrg_voltage); in rk817_charge_pre_init()
1302 rk817_charge_set_chrg_current(charge, charge->max_chrg_current); in rk817_charge_pre_init()
1304 rk817_charge_set_chrg_finish_condition(charge); in rk817_charge_pre_init()
1306 if (rk817_charge_get_otg_state(charge)) in rk817_charge_pre_init()
1307 rk817_charge_otg_disable(charge); in rk817_charge_pre_init()
1308 rk817_charge_field_write(charge, OTG_EN, OTG_DISABLE); in rk817_charge_pre_init()
1309 rk817_charge_set_otg_in(charge, OFFLINE); in rk817_charge_pre_init()
1311 if (!charge->pdata->gate_function_disable) in rk817_charge_pre_init()
1312 rk817_charge_sys_can_sd_disable(charge); in rk817_charge_pre_init()
1313 rk817_charge_usb_to_sys_enable(charge); in rk817_charge_pre_init()
1314 rk817_charge_enable_charge(charge); in rk817_charge_pre_init()
1316 rk817_charge_set_charge_clock(charge, CHRG_CLK_2M); in rk817_charge_pre_init()
1319 static void rk817_chage_debug(struct rk817_charger *charge) in rk817_chage_debug() argument
1321 rk817_charge_get_charge_status(charge); in rk817_chage_debug()
1322 DBG("OTG state : %d\n", rk817_charge_get_otg_state(charge)); in rk817_chage_debug()
1323 DBG("charge state: %d\n", rk817_charge_get_charge_state(charge)); in rk817_chage_debug()
1330 charge->max_chrg_current, in rk817_chage_debug()
1331 charge->max_input_current, in rk817_chage_debug()
1332 charge->min_input_voltage, in rk817_chage_debug()
1333 charge->max_chrg_voltage, in rk817_chage_debug()
1334 charge->chrg_finish_cur, in rk817_chage_debug()
1335 charge->chrg_term_mode); in rk817_chage_debug()
1338 static int rk817_charge_get_otg5v_regulator(struct rk817_charger *charge) in rk817_charge_get_otg5v_regulator() argument
1342 charge->otg5v_rdev = devm_regulator_get(charge->dev, "otg_switch"); in rk817_charge_get_otg5v_regulator()
1343 if (IS_ERR(charge->otg5v_rdev)) { in rk817_charge_get_otg5v_regulator()
1344 ret = PTR_ERR(charge->otg5v_rdev); in rk817_charge_get_otg5v_regulator()
1345 dev_warn(charge->dev, "failed to get otg regulator: %d\n", ret); in rk817_charge_get_otg5v_regulator()
1352 static int rk817_charge_parse_dt(struct rk817_charger *charge) in rk817_charge_parse_dt() argument
1356 struct device *dev = charge->dev; in rk817_charge_parse_dt()
1357 struct device_node *np = charge->dev->of_node; in rk817_charge_parse_dt()
1364 charge->pdata = pdata; in rk817_charge_parse_dt()
1431 if (!is_battery_exist(charge)) in rk817_charge_parse_dt()
1434 charge->res_div = (charge->pdata->sample_res == SAMPLE_RES_10MR) ? in rk817_charge_parse_dt()
1470 static int rk817_charge_parse_dt(struct rk817_charger *charge) in rk817_charge_parse_dt() argument
1478 struct rk817_charger *charge = container_of(work, in rk817_charge_irq_delay_work() local
1481 if (charge->plugin_trigger) { in rk817_charge_irq_delay_work()
1483 charge->plugin_trigger = 0; in rk817_charge_irq_delay_work()
1484 if (charge->pdata->extcon) in rk817_charge_irq_delay_work()
1485 queue_delayed_work(charge->usb_charger_wq, &charge->usb_work, in rk817_charge_irq_delay_work()
1487 } else if (charge->plugout_trigger) { in rk817_charge_irq_delay_work()
1489 charge->plugout_trigger = 0; in rk817_charge_irq_delay_work()
1490 rk817_charge_set_chrg_param(charge, USB_TYPE_NONE_CHARGER); in rk817_charge_irq_delay_work()
1491 rk817_charge_set_chrg_param(charge, DC_TYPE_NONE_CHARGER); in rk817_charge_irq_delay_work()
1499 struct rk817_charger *charge; in rk817_plug_in_isr() local
1501 charge = (struct rk817_charger *)cg; in rk817_plug_in_isr()
1502 charge->plugin_trigger = 1; in rk817_plug_in_isr()
1503 queue_delayed_work(charge->usb_charger_wq, &charge->irq_work, in rk817_plug_in_isr()
1511 struct rk817_charger *charge; in rk817_plug_out_isr() local
1513 charge = (struct rk817_charger *)cg; in rk817_plug_out_isr()
1514 charge->plugout_trigger = 1; in rk817_plug_out_isr()
1515 queue_delayed_work(charge->usb_charger_wq, &charge->irq_work, in rk817_plug_out_isr()
1521 static int rk817_charge_init_irqs(struct rk817_charger *charge) in rk817_charge_init_irqs() argument
1523 struct rk808 *rk817 = charge->rk817; in rk817_charge_init_irqs()
1524 struct platform_device *pdev = charge->pdev; in rk817_charge_init_irqs()
1529 dev_err(charge->dev, "plug_in_irq request failed!\n"); in rk817_charge_init_irqs()
1535 dev_err(charge->dev, "plug_out_irq request failed!\n"); in rk817_charge_init_irqs()
1539 ret = devm_request_threaded_irq(charge->dev, plug_in_irq, NULL, in rk817_charge_init_irqs()
1542 "rk817_plug_in", charge); in rk817_charge_init_irqs()
1548 ret = devm_request_threaded_irq(charge->dev, plug_out_irq, NULL, in rk817_charge_init_irqs()
1551 "rk817_plug_out", charge); in rk817_charge_init_irqs()
1557 charge->plugin_irq = plug_in_irq; in rk817_charge_init_irqs()
1558 charge->plugout_irq = plug_out_irq; in rk817_charge_init_irqs()
1560 INIT_DELAYED_WORK(&charge->irq_work, rk817_charge_irq_delay_work); in rk817_charge_init_irqs()
1576 struct rk817_charger *charge; in rk817_charge_probe() local
1585 charge = devm_kzalloc(&pdev->dev, sizeof(*charge), GFP_KERNEL); in rk817_charge_probe()
1586 if (!charge) in rk817_charge_probe()
1589 charge->rk817 = rk817; in rk817_charge_probe()
1590 charge->pdev = pdev; in rk817_charge_probe()
1591 charge->dev = &pdev->dev; in rk817_charge_probe()
1592 charge->client = client; in rk817_charge_probe()
1593 platform_set_drvdata(pdev, charge); in rk817_charge_probe()
1595 charge->regmap = rk817->regmap; in rk817_charge_probe()
1596 if (IS_ERR(charge->regmap)) { in rk817_charge_probe()
1597 dev_err(charge->dev, "Failed to initialize regmap\n"); in rk817_charge_probe()
1604 charge->rmap_fields[i] = in rk817_charge_probe()
1605 devm_regmap_field_alloc(charge->dev, in rk817_charge_probe()
1606 charge->regmap, in rk817_charge_probe()
1608 if (IS_ERR(charge->rmap_fields[i])) { in rk817_charge_probe()
1609 dev_err(charge->dev, "cannot allocate regmap field\n"); in rk817_charge_probe()
1610 return PTR_ERR(charge->rmap_fields[i]); in rk817_charge_probe()
1614 ret = rk817_charge_parse_dt(charge); in rk817_charge_probe()
1616 dev_err(charge->dev, "charge parse dt failed!\n"); in rk817_charge_probe()
1619 rk817_charge_get_otg5v_regulator(charge); in rk817_charge_probe()
1621 rk817_charge_pre_init(charge); in rk817_charge_probe()
1623 ret = rk817_charge_init_power_supply(charge); in rk817_charge_probe()
1625 dev_err(charge->dev, "init power supply fail!\n"); in rk817_charge_probe()
1629 ret = rk817_charge_init_dc(charge); in rk817_charge_probe()
1631 dev_err(charge->dev, "init dc failed!\n"); in rk817_charge_probe()
1635 ret = rk817_charge_usb_init(charge); in rk817_charge_probe()
1637 dev_err(charge->dev, "init usb failed!\n"); in rk817_charge_probe()
1641 ret = rk817_charge_init_irqs(charge); in rk817_charge_probe()
1643 dev_err(charge->dev, "init irqs failed!\n"); in rk817_charge_probe()
1647 if (charge->pdata->extcon) { in rk817_charge_probe()
1648 schedule_delayed_work(&charge->host_work, 0); in rk817_charge_probe()
1649 schedule_delayed_work(&charge->usb_work, 0); in rk817_charge_probe()
1652 rk817_chage_debug(charge); in rk817_charge_probe()
1657 if (charge->pdata->extcon) { in rk817_charge_probe()
1658 cancel_delayed_work_sync(&charge->host_work); in rk817_charge_probe()
1659 cancel_delayed_work_sync(&charge->discnt_work); in rk817_charge_probe()
1662 cancel_delayed_work_sync(&charge->usb_work); in rk817_charge_probe()
1663 cancel_delayed_work_sync(&charge->dc_work); in rk817_charge_probe()
1664 cancel_delayed_work_sync(&charge->irq_work); in rk817_charge_probe()
1665 destroy_workqueue(charge->usb_charger_wq); in rk817_charge_probe()
1666 destroy_workqueue(charge->dc_charger_wq); in rk817_charge_probe()
1668 if (charge->pdata->extcon) { in rk817_charge_probe()
1669 extcon_unregister_notifier(charge->cable_edev, in rk817_charge_probe()
1671 &charge->cable_cg_nb); in rk817_charge_probe()
1672 extcon_unregister_notifier(charge->cable_edev, in rk817_charge_probe()
1674 &charge->cable_cg_nb); in rk817_charge_probe()
1675 extcon_unregister_notifier(charge->cable_edev, in rk817_charge_probe()
1677 &charge->cable_cg_nb); in rk817_charge_probe()
1678 extcon_unregister_notifier(charge->cable_edev, in rk817_charge_probe()
1680 &charge->cable_host_nb); in rk817_charge_probe()
1681 extcon_unregister_notifier(charge->cable_edev, in rk817_charge_probe()
1683 &charge->cable_discnt_nb); in rk817_charge_probe()
1685 rk_bc_detect_notifier_unregister(&charge->bc_nb); in rk817_charge_probe()
1695 struct rk817_charger *charge = dev_get_drvdata(&pdev->dev); in rk817_charge_pm_suspend() local
1697 charge->otg_slp_state = rk817_charge_get_otg_slp_state(charge); in rk817_charge_pm_suspend()
1700 if (charge->pdata->otg5v_suspend_enable) { in rk817_charge_pm_suspend()
1701 if ((charge->otg_in && !charge->dc_in) || in rk817_charge_pm_suspend()
1702 (charge->otg_in && charge->dc_in && in rk817_charge_pm_suspend()
1703 !charge->pdata->power_dc2otg)) { in rk817_charge_pm_suspend()
1704 rk817_charge_otg_slp_enable(charge); in rk817_charge_pm_suspend()
1711 rk817_charge_otg_slp_disable(charge); in rk817_charge_pm_suspend()
1719 struct rk817_charger *charge = dev_get_drvdata(&pdev->dev); in rk817_charge_pm_resume() local
1722 if (charge->otg_slp_state) in rk817_charge_pm_resume()
1723 rk817_charge_otg_slp_enable(charge); in rk817_charge_pm_resume()
1733 struct rk817_charger *charge = platform_get_drvdata(dev); in rk817_charger_shutdown() local
1736 if (charge->pdata->extcon) { in rk817_charger_shutdown()
1737 cancel_delayed_work_sync(&charge->host_work); in rk817_charger_shutdown()
1738 cancel_delayed_work_sync(&charge->discnt_work); in rk817_charger_shutdown()
1741 rk817_charge_set_otg_state(charge, USB_OTG_POWER_OFF); in rk817_charger_shutdown()
1742 rk817_charge_boost_disable(charge); in rk817_charger_shutdown()
1743 disable_irq(charge->plugin_irq); in rk817_charger_shutdown()
1744 disable_irq(charge->plugout_irq); in rk817_charger_shutdown()
1746 cancel_delayed_work_sync(&charge->usb_work); in rk817_charger_shutdown()
1747 cancel_delayed_work_sync(&charge->dc_work); in rk817_charger_shutdown()
1748 cancel_delayed_work_sync(&charge->irq_work); in rk817_charger_shutdown()
1749 flush_workqueue(charge->usb_charger_wq); in rk817_charger_shutdown()
1750 flush_workqueue(charge->dc_charger_wq); in rk817_charger_shutdown()
1752 if (charge->pdata->extcon) { in rk817_charger_shutdown()
1753 extcon_unregister_notifier(charge->cable_edev, in rk817_charger_shutdown()
1755 &charge->cable_cg_nb); in rk817_charger_shutdown()
1756 extcon_unregister_notifier(charge->cable_edev, in rk817_charger_shutdown()
1758 &charge->cable_cg_nb); in rk817_charger_shutdown()
1759 extcon_unregister_notifier(charge->cable_edev, in rk817_charger_shutdown()
1761 &charge->cable_cg_nb); in rk817_charger_shutdown()
1762 extcon_unregister_notifier(charge->cable_edev, in rk817_charger_shutdown()
1764 &charge->cable_host_nb); in rk817_charger_shutdown()
1765 extcon_unregister_notifier(charge->cable_edev, EXTCON_USB, in rk817_charger_shutdown()
1766 &charge->cable_discnt_nb); in rk817_charger_shutdown()
1768 rk_bc_detect_notifier_unregister(&charge->bc_nb); in rk817_charger_shutdown()
1772 charge->ac_in, charge->usb_in, charge->dc_in, charge->otg_in); in rk817_charger_shutdown()
1797 MODULE_DESCRIPTION("RK817 Charge driver");