Lines Matching refs:bq
210 static int bq24257_field_read(struct bq24257_device *bq, in bq24257_field_read() argument
216 ret = regmap_field_read(bq->rmap_fields[field_id], &val); in bq24257_field_read()
223 static int bq24257_field_write(struct bq24257_device *bq, in bq24257_field_write() argument
226 return regmap_field_write(bq->rmap_fields[field_id], val); in bq24257_field_write()
261 static int bq24257_get_input_current_limit(struct bq24257_device *bq, in bq24257_get_input_current_limit() argument
266 ret = bq24257_field_read(bq, F_IILIMIT); in bq24257_get_input_current_limit()
285 static int bq24257_set_input_current_limit(struct bq24257_device *bq, in bq24257_set_input_current_limit() argument
293 if (bq->iilimit_autoset_enable) in bq24257_set_input_current_limit()
294 cancel_delayed_work_sync(&bq->iilimit_setup_work); in bq24257_set_input_current_limit()
296 return bq24257_field_write(bq, F_IILIMIT, in bq24257_set_input_current_limit()
306 struct bq24257_device *bq = power_supply_get_drvdata(psy); in bq24257_power_supply_get_property() local
309 mutex_lock(&bq->lock); in bq24257_power_supply_get_property()
310 state = bq->state; in bq24257_power_supply_get_property()
311 mutex_unlock(&bq->lock); in bq24257_power_supply_get_property()
332 val->strval = bq2425x_chip_name[bq->chip]; in bq24257_power_supply_get_property()
367 val->intval = bq24257_ichg_map[bq->init_data.ichg]; in bq24257_power_supply_get_property()
375 val->intval = bq24257_vbat_map[bq->init_data.vbat]; in bq24257_power_supply_get_property()
383 val->intval = bq24257_iterm_map[bq->init_data.iterm]; in bq24257_power_supply_get_property()
387 return bq24257_get_input_current_limit(bq, val); in bq24257_power_supply_get_property()
400 struct bq24257_device *bq = power_supply_get_drvdata(psy); in bq24257_power_supply_set_property() local
404 return bq24257_set_input_current_limit(bq, val); in bq24257_power_supply_set_property()
421 static int bq24257_get_chip_state(struct bq24257_device *bq, in bq24257_get_chip_state() argument
426 ret = bq24257_field_read(bq, F_STAT); in bq24257_get_chip_state()
432 ret = bq24257_field_read(bq, F_FAULT); in bq24257_get_chip_state()
438 if (bq->pg) in bq24257_get_chip_state()
439 state->power_good = !gpiod_get_value_cansleep(bq->pg); in bq24257_get_chip_state()
462 static bool bq24257_state_changed(struct bq24257_device *bq, in bq24257_state_changed() argument
467 mutex_lock(&bq->lock); in bq24257_state_changed()
468 ret = (bq->state.status != new_state->status || in bq24257_state_changed()
469 bq->state.fault != new_state->fault || in bq24257_state_changed()
470 bq->state.power_good != new_state->power_good); in bq24257_state_changed()
471 mutex_unlock(&bq->lock); in bq24257_state_changed()
530 static int bq24257_iilimit_autoset(struct bq24257_device *bq) in bq24257_iilimit_autoset() argument
543 ret = bq24257_field_read(bq, F_LOOP_STATUS); in bq24257_iilimit_autoset()
549 ret = bq24257_field_read(bq, F_IILIMIT); in bq24257_iilimit_autoset()
563 ret = bq24257_field_read(bq, F_USB_DET); in bq24257_iilimit_autoset()
569 ret = bq24257_field_write(bq, F_IILIMIT, new_iilimit[port_type]); in bq24257_iilimit_autoset()
573 ret = bq24257_field_write(bq, F_TMR, SAFETY_TIMER_360); in bq24257_iilimit_autoset()
577 ret = bq24257_field_write(bq, F_CLR_VDP, 1); in bq24257_iilimit_autoset()
581 dev_dbg(bq->dev, "port/loop = %d/%d -> iilimit = %d\n", in bq24257_iilimit_autoset()
587 dev_err(bq->dev, "%s: Error communicating with the chip.\n", __func__); in bq24257_iilimit_autoset()
593 struct bq24257_device *bq = container_of(work, struct bq24257_device, in bq24257_iilimit_setup_work() local
596 bq24257_iilimit_autoset(bq); in bq24257_iilimit_setup_work()
599 static void bq24257_handle_state_change(struct bq24257_device *bq, in bq24257_handle_state_change() argument
605 mutex_lock(&bq->lock); in bq24257_handle_state_change()
606 old_state = bq->state; in bq24257_handle_state_change()
607 mutex_unlock(&bq->lock); in bq24257_handle_state_change()
614 dev_dbg(bq->dev, "Power removed\n"); in bq24257_handle_state_change()
615 if (bq->iilimit_autoset_enable) { in bq24257_handle_state_change()
616 cancel_delayed_work_sync(&bq->iilimit_setup_work); in bq24257_handle_state_change()
619 ret = bq24257_field_write(bq, F_DPDM_EN, 1); in bq24257_handle_state_change()
627 ret = bq24257_field_write(bq, F_IILIMIT, bq->init_data.iilimit); in bq24257_handle_state_change()
631 dev_dbg(bq->dev, "Power inserted\n"); in bq24257_handle_state_change()
633 if (bq->iilimit_autoset_enable) in bq24257_handle_state_change()
635 schedule_delayed_work(&bq->iilimit_setup_work, in bq24257_handle_state_change()
638 dev_warn(bq->dev, "Battery removed\n"); in bq24257_handle_state_change()
640 dev_err(bq->dev, "Safety timer expired! Battery dead?\n"); in bq24257_handle_state_change()
646 dev_err(bq->dev, "%s: Error communicating with the chip.\n", __func__); in bq24257_handle_state_change()
652 struct bq24257_device *bq = private; in bq24257_irq_handler_thread() local
655 ret = bq24257_get_chip_state(bq, &state); in bq24257_irq_handler_thread()
659 if (!bq24257_state_changed(bq, &state)) in bq24257_irq_handler_thread()
662 dev_dbg(bq->dev, "irq(state changed): status/fault/pg = %d/%d/%d\n", in bq24257_irq_handler_thread()
665 bq24257_handle_state_change(bq, &state); in bq24257_irq_handler_thread()
667 mutex_lock(&bq->lock); in bq24257_irq_handler_thread()
668 bq->state = state; in bq24257_irq_handler_thread()
669 mutex_unlock(&bq->lock); in bq24257_irq_handler_thread()
671 power_supply_changed(bq->charger); in bq24257_irq_handler_thread()
676 static int bq24257_hw_init(struct bq24257_device *bq) in bq24257_hw_init() argument
686 {F_ICHG, bq->init_data.ichg}, in bq24257_hw_init()
687 {F_VBAT, bq->init_data.vbat}, in bq24257_hw_init()
688 {F_ITERM, bq->init_data.iterm}, in bq24257_hw_init()
689 {F_VOVP, bq->init_data.vovp}, in bq24257_hw_init()
690 {F_VINDPM, bq->init_data.vindpm}, in bq24257_hw_init()
697 ret = bq24257_field_write(bq, F_WD_EN, 0); in bq24257_hw_init()
703 ret = bq24257_field_write(bq, init_data[i].field, in bq24257_hw_init()
709 ret = bq24257_get_chip_state(bq, &state); in bq24257_hw_init()
713 mutex_lock(&bq->lock); in bq24257_hw_init()
714 bq->state = state; in bq24257_hw_init()
715 mutex_unlock(&bq->lock); in bq24257_hw_init()
717 if (!bq->iilimit_autoset_enable) { in bq24257_hw_init()
718 dev_dbg(bq->dev, "manually setting iilimit = %u\n", in bq24257_hw_init()
719 bq->init_data.iilimit); in bq24257_hw_init()
722 ret = bq24257_field_write(bq, F_IILIMIT, in bq24257_hw_init()
723 bq->init_data.iilimit); in bq24257_hw_init()
728 ret = bq24257_field_write(bq, F_DPDM_EN, 1); in bq24257_hw_init()
730 ret = bq24257_iilimit_autoset(bq); in bq24257_hw_init()
768 struct bq24257_device *bq = power_supply_get_drvdata(psy); in bq24257_show_ovp_voltage() local
771 bq24257_vovp_map[bq->init_data.vovp]); in bq24257_show_ovp_voltage()
779 struct bq24257_device *bq = power_supply_get_drvdata(psy); in bq24257_show_in_dpm_voltage() local
782 bq24257_vindpm_map[bq->init_data.vindpm]); in bq24257_show_in_dpm_voltage()
790 struct bq24257_device *bq = power_supply_get_drvdata(psy); in bq24257_sysfs_show_enable() local
794 ret = bq24257_field_read(bq, F_HZ_MODE); in bq24257_sysfs_show_enable()
796 ret = bq24257_field_read(bq, F_SYSOFF); in bq24257_sysfs_show_enable()
812 struct bq24257_device *bq = power_supply_get_drvdata(psy); in bq24257_sysfs_set_enable() local
820 ret = bq24257_field_write(bq, F_HZ_MODE, (bool)val); in bq24257_sysfs_set_enable()
822 ret = bq24257_field_write(bq, F_SYSOFF, (bool)val); in bq24257_sysfs_set_enable()
849 static int bq24257_power_supply_init(struct bq24257_device *bq) in bq24257_power_supply_init() argument
851 struct power_supply_config psy_cfg = { .drv_data = bq, }; in bq24257_power_supply_init()
857 bq->charger = devm_power_supply_register(bq->dev, in bq24257_power_supply_init()
861 return PTR_ERR_OR_ZERO(bq->charger); in bq24257_power_supply_init()
864 static void bq24257_pg_gpio_probe(struct bq24257_device *bq) in bq24257_pg_gpio_probe() argument
866 bq->pg = devm_gpiod_get_optional(bq->dev, BQ24257_PG_GPIO, GPIOD_IN); in bq24257_pg_gpio_probe()
868 if (PTR_ERR(bq->pg) == -EPROBE_DEFER) { in bq24257_pg_gpio_probe()
869 dev_info(bq->dev, "probe retry requested for PG pin\n"); in bq24257_pg_gpio_probe()
871 } else if (IS_ERR(bq->pg)) { in bq24257_pg_gpio_probe()
872 dev_err(bq->dev, "error probing PG pin\n"); in bq24257_pg_gpio_probe()
873 bq->pg = NULL; in bq24257_pg_gpio_probe()
877 if (bq->pg) in bq24257_pg_gpio_probe()
878 dev_dbg(bq->dev, "probed PG pin = %d\n", desc_to_gpio(bq->pg)); in bq24257_pg_gpio_probe()
881 static int bq24257_fw_probe(struct bq24257_device *bq) in bq24257_fw_probe() argument
887 ret = device_property_read_u32(bq->dev, "ti,charge-current", &property); in bq24257_fw_probe()
891 bq->init_data.ichg = bq24257_find_idx(property, bq24257_ichg_map, in bq24257_fw_probe()
894 ret = device_property_read_u32(bq->dev, "ti,battery-regulation-voltage", in bq24257_fw_probe()
899 bq->init_data.vbat = bq24257_find_idx(property, bq24257_vbat_map, in bq24257_fw_probe()
902 ret = device_property_read_u32(bq->dev, "ti,termination-current", in bq24257_fw_probe()
907 bq->init_data.iterm = bq24257_find_idx(property, bq24257_iterm_map, in bq24257_fw_probe()
911 ret = device_property_read_u32(bq->dev, "ti,current-limit", in bq24257_fw_probe()
914 bq->iilimit_autoset_enable = true; in bq24257_fw_probe()
921 bq->init_data.iilimit = IILIMIT_500; in bq24257_fw_probe()
923 bq->init_data.iilimit = in bq24257_fw_probe()
928 ret = device_property_read_u32(bq->dev, "ti,ovp-voltage", in bq24257_fw_probe()
931 bq->init_data.vovp = VOVP_6500; in bq24257_fw_probe()
933 bq->init_data.vovp = bq24257_find_idx(property, in bq24257_fw_probe()
937 ret = device_property_read_u32(bq->dev, "ti,in-dpm-voltage", in bq24257_fw_probe()
940 bq->init_data.vindpm = VINDPM_4360; in bq24257_fw_probe()
942 bq->init_data.vindpm = in bq24257_fw_probe()
956 struct bq24257_device *bq; in bq24257_probe() local
965 bq = devm_kzalloc(dev, sizeof(*bq), GFP_KERNEL); in bq24257_probe()
966 if (!bq) in bq24257_probe()
969 bq->client = client; in bq24257_probe()
970 bq->dev = dev; in bq24257_probe()
979 bq->chip = (enum bq2425x_chip)acpi_id->driver_data; in bq24257_probe()
981 bq->chip = (enum bq2425x_chip)id->driver_data; in bq24257_probe()
984 mutex_init(&bq->lock); in bq24257_probe()
986 bq->rmap = devm_regmap_init_i2c(client, &bq24257_regmap_config); in bq24257_probe()
987 if (IS_ERR(bq->rmap)) { in bq24257_probe()
989 return PTR_ERR(bq->rmap); in bq24257_probe()
995 bq->rmap_fields[i] = devm_regmap_field_alloc(dev, bq->rmap, in bq24257_probe()
997 if (IS_ERR(bq->rmap_fields[i])) { in bq24257_probe()
999 return PTR_ERR(bq->rmap_fields[i]); in bq24257_probe()
1003 i2c_set_clientdata(client, bq); in bq24257_probe()
1006 ret = bq24257_fw_probe(bq); in bq24257_probe()
1020 if (bq->chip == BQ24250) in bq24257_probe()
1021 bq->iilimit_autoset_enable = false; in bq24257_probe()
1023 if (bq->iilimit_autoset_enable) in bq24257_probe()
1024 INIT_DELAYED_WORK(&bq->iilimit_setup_work, in bq24257_probe()
1033 if (bq->chip != BQ24250) in bq24257_probe()
1034 bq24257_pg_gpio_probe(bq); in bq24257_probe()
1036 if (PTR_ERR(bq->pg) == -EPROBE_DEFER) in bq24257_probe()
1037 return PTR_ERR(bq->pg); in bq24257_probe()
1038 else if (!bq->pg) in bq24257_probe()
1039 dev_info(bq->dev, "using SW-based power-good detection\n"); in bq24257_probe()
1042 ret = bq24257_field_write(bq, F_RESET, 1); in bq24257_probe()
1051 ret = bq24257_field_write(bq, F_RESET, 0); in bq24257_probe()
1055 ret = bq24257_hw_init(bq); in bq24257_probe()
1061 ret = bq24257_power_supply_init(bq); in bq24257_probe()
1071 bq2425x_chip_name[bq->chip], bq); in bq24257_probe()
1082 struct bq24257_device *bq = i2c_get_clientdata(client); in bq24257_remove() local
1084 if (bq->iilimit_autoset_enable) in bq24257_remove()
1085 cancel_delayed_work_sync(&bq->iilimit_setup_work); in bq24257_remove()
1087 bq24257_field_write(bq, F_RESET, 1); /* reset to defaults */ in bq24257_remove()
1095 struct bq24257_device *bq = dev_get_drvdata(dev); in bq24257_suspend() local
1098 if (bq->iilimit_autoset_enable) in bq24257_suspend()
1099 cancel_delayed_work_sync(&bq->iilimit_setup_work); in bq24257_suspend()
1102 ret = bq24257_field_write(bq, F_RESET, 1); in bq24257_suspend()
1104 dev_err(bq->dev, "Cannot reset chip to standalone mode.\n"); in bq24257_suspend()
1112 struct bq24257_device *bq = dev_get_drvdata(dev); in bq24257_resume() local
1114 ret = regcache_drop_region(bq->rmap, BQ24257_REG_1, BQ24257_REG_7); in bq24257_resume()
1118 ret = bq24257_field_write(bq, F_RESET, 0); in bq24257_resume()
1122 ret = bq24257_hw_init(bq); in bq24257_resume()
1124 dev_err(bq->dev, "Cannot init chip after resume.\n"); in bq24257_resume()
1129 power_supply_changed(bq->charger); in bq24257_resume()