Lines Matching refs:bq

219 static int bq24257_field_read(struct bq24257_device *bq,  in bq24257_field_read()  argument
225 ret = regmap_field_read(bq->rmap_fields[field_id], &val); in bq24257_field_read()
232 static int bq24257_field_write(struct bq24257_device *bq, in bq24257_field_write() argument
235 return regmap_field_write(bq->rmap_fields[field_id], val); in bq24257_field_write()
270 static int bq24257_get_input_current_limit(struct bq24257_device *bq, in bq24257_get_input_current_limit() argument
275 ret = bq24257_field_read(bq, F_IILIMIT); in bq24257_get_input_current_limit()
294 static int bq24257_set_input_current_limit(struct bq24257_device *bq, in bq24257_set_input_current_limit() argument
302 if (bq->iilimit_autoset_enable) in bq24257_set_input_current_limit()
303 cancel_delayed_work_sync(&bq->iilimit_setup_work); in bq24257_set_input_current_limit()
305 return bq24257_field_write(bq, F_IILIMIT, in bq24257_set_input_current_limit()
315 struct bq24257_device *bq = power_supply_get_drvdata(psy); in bq24257_power_supply_get_property() local
318 mutex_lock(&bq->lock); in bq24257_power_supply_get_property()
319 state = bq->state; in bq24257_power_supply_get_property()
320 mutex_unlock(&bq->lock); in bq24257_power_supply_get_property()
341 val->strval = bq2425x_chip_name[bq->chip]; in bq24257_power_supply_get_property()
376 val->intval = bq24257_ichg_map[bq->init_data.ichg]; in bq24257_power_supply_get_property()
384 val->intval = bq24257_vbat_map[bq->init_data.vbat]; in bq24257_power_supply_get_property()
392 val->intval = bq24257_iterm_map[bq->init_data.iterm]; in bq24257_power_supply_get_property()
396 return bq24257_get_input_current_limit(bq, val); in bq24257_power_supply_get_property()
409 struct bq24257_device *bq = power_supply_get_drvdata(psy); in bq24257_power_supply_set_property() local
413 return bq24257_set_input_current_limit(bq, val); in bq24257_power_supply_set_property()
430 static int bq24257_get_chip_state(struct bq24257_device *bq, in bq24257_get_chip_state() argument
435 ret = bq24257_field_read(bq, F_STAT); in bq24257_get_chip_state()
441 ret = bq24257_field_read(bq, F_FAULT); in bq24257_get_chip_state()
447 if (bq->pg) in bq24257_get_chip_state()
448 state->power_good = !gpiod_get_value_cansleep(bq->pg); in bq24257_get_chip_state()
471 static bool bq24257_state_changed(struct bq24257_device *bq, in bq24257_state_changed() argument
476 mutex_lock(&bq->lock); in bq24257_state_changed()
477 ret = (bq->state.status != new_state->status || in bq24257_state_changed()
478 bq->state.fault != new_state->fault || in bq24257_state_changed()
479 bq->state.power_good != new_state->power_good); in bq24257_state_changed()
480 mutex_unlock(&bq->lock); in bq24257_state_changed()
539 static int bq24257_iilimit_autoset(struct bq24257_device *bq) in bq24257_iilimit_autoset() argument
552 ret = bq24257_field_read(bq, F_LOOP_STATUS); in bq24257_iilimit_autoset()
558 ret = bq24257_field_read(bq, F_IILIMIT); in bq24257_iilimit_autoset()
572 ret = bq24257_field_read(bq, F_USB_DET); in bq24257_iilimit_autoset()
578 ret = bq24257_field_write(bq, F_IILIMIT, new_iilimit[port_type]); in bq24257_iilimit_autoset()
582 ret = bq24257_field_write(bq, F_TMR, SAFETY_TIMER_360); in bq24257_iilimit_autoset()
586 ret = bq24257_field_write(bq, F_CLR_VDP, 1); in bq24257_iilimit_autoset()
590 dev_dbg(bq->dev, "port/loop = %d/%d -> iilimit = %d\n", in bq24257_iilimit_autoset()
596 dev_err(bq->dev, "%s: Error communicating with the chip.\n", __func__); in bq24257_iilimit_autoset()
602 struct bq24257_device *bq = container_of(work, struct bq24257_device, in bq24257_iilimit_setup_work() local
605 bq24257_iilimit_autoset(bq); in bq24257_iilimit_setup_work()
608 static void bq24257_handle_state_change(struct bq24257_device *bq, in bq24257_handle_state_change() argument
614 mutex_lock(&bq->lock); in bq24257_handle_state_change()
615 old_state = bq->state; in bq24257_handle_state_change()
616 mutex_unlock(&bq->lock); in bq24257_handle_state_change()
623 dev_dbg(bq->dev, "Power removed\n"); in bq24257_handle_state_change()
624 if (bq->iilimit_autoset_enable) { in bq24257_handle_state_change()
625 cancel_delayed_work_sync(&bq->iilimit_setup_work); in bq24257_handle_state_change()
628 ret = bq24257_field_write(bq, F_DPDM_EN, 1); in bq24257_handle_state_change()
636 ret = bq24257_field_write(bq, F_IILIMIT, bq->init_data.iilimit); in bq24257_handle_state_change()
640 dev_dbg(bq->dev, "Power inserted\n"); in bq24257_handle_state_change()
642 if (bq->iilimit_autoset_enable) in bq24257_handle_state_change()
644 schedule_delayed_work(&bq->iilimit_setup_work, in bq24257_handle_state_change()
647 dev_warn(bq->dev, "Battery removed\n"); in bq24257_handle_state_change()
649 dev_err(bq->dev, "Safety timer expired! Battery dead?\n"); in bq24257_handle_state_change()
655 dev_err(bq->dev, "%s: Error communicating with the chip.\n", __func__); in bq24257_handle_state_change()
661 struct bq24257_device *bq = private; in bq24257_irq_handler_thread() local
664 ret = bq24257_get_chip_state(bq, &state); in bq24257_irq_handler_thread()
668 if (!bq24257_state_changed(bq, &state)) in bq24257_irq_handler_thread()
671 dev_dbg(bq->dev, "irq(state changed): status/fault/pg = %d/%d/%d\n", in bq24257_irq_handler_thread()
674 bq24257_handle_state_change(bq, &state); in bq24257_irq_handler_thread()
676 mutex_lock(&bq->lock); in bq24257_irq_handler_thread()
677 bq->state = state; in bq24257_irq_handler_thread()
678 mutex_unlock(&bq->lock); in bq24257_irq_handler_thread()
680 power_supply_changed(bq->charger); in bq24257_irq_handler_thread()
685 static int bq24257_hw_init(struct bq24257_device *bq) in bq24257_hw_init() argument
695 {F_ICHG, bq->init_data.ichg}, in bq24257_hw_init()
696 {F_VBAT, bq->init_data.vbat}, in bq24257_hw_init()
697 {F_ITERM, bq->init_data.iterm}, in bq24257_hw_init()
698 {F_VOVP, bq->init_data.vovp}, in bq24257_hw_init()
699 {F_VINDPM, bq->init_data.vindpm}, in bq24257_hw_init()
706 ret = bq24257_field_write(bq, F_WD_EN, 0); in bq24257_hw_init()
712 ret = bq24257_field_write(bq, init_data[i].field, in bq24257_hw_init()
718 ret = bq24257_get_chip_state(bq, &state); in bq24257_hw_init()
722 mutex_lock(&bq->lock); in bq24257_hw_init()
723 bq->state = state; in bq24257_hw_init()
724 mutex_unlock(&bq->lock); in bq24257_hw_init()
726 if (!bq->iilimit_autoset_enable) { in bq24257_hw_init()
727 dev_dbg(bq->dev, "manually setting iilimit = %u\n", in bq24257_hw_init()
728 bq->init_data.iilimit); in bq24257_hw_init()
731 ret = bq24257_field_write(bq, F_IILIMIT, in bq24257_hw_init()
732 bq->init_data.iilimit); in bq24257_hw_init()
737 ret = bq24257_field_write(bq, F_DPDM_EN, 1); in bq24257_hw_init()
739 ret = bq24257_iilimit_autoset(bq); in bq24257_hw_init()
777 struct bq24257_device *bq = power_supply_get_drvdata(psy); in bq24257_show_ovp_voltage() local
780 bq24257_vovp_map[bq->init_data.vovp]); in bq24257_show_ovp_voltage()
788 struct bq24257_device *bq = power_supply_get_drvdata(psy); in bq24257_show_in_dpm_voltage() local
791 bq24257_vindpm_map[bq->init_data.vindpm]); in bq24257_show_in_dpm_voltage()
799 struct bq24257_device *bq = power_supply_get_drvdata(psy); in bq24257_sysfs_show_enable() local
803 ret = bq24257_field_read(bq, F_HZ_MODE); in bq24257_sysfs_show_enable()
805 ret = bq24257_field_read(bq, F_SYSOFF); in bq24257_sysfs_show_enable()
821 struct bq24257_device *bq = power_supply_get_drvdata(psy); in bq24257_sysfs_set_enable() local
829 ret = bq24257_field_write(bq, F_HZ_MODE, (bool)val); in bq24257_sysfs_set_enable()
831 ret = bq24257_field_write(bq, F_SYSOFF, (bool)val); in bq24257_sysfs_set_enable()
860 static int bq24257_power_supply_init(struct bq24257_device *bq) in bq24257_power_supply_init() argument
862 struct power_supply_config psy_cfg = { .drv_data = bq, }; in bq24257_power_supply_init()
867 bq->charger = devm_power_supply_register(bq->dev, in bq24257_power_supply_init()
871 return PTR_ERR_OR_ZERO(bq->charger); in bq24257_power_supply_init()
874 static void bq24257_pg_gpio_probe(struct bq24257_device *bq) in bq24257_pg_gpio_probe() argument
876 bq->pg = devm_gpiod_get_optional(bq->dev, BQ24257_PG_GPIO, GPIOD_IN); in bq24257_pg_gpio_probe()
878 if (PTR_ERR(bq->pg) == -EPROBE_DEFER) { in bq24257_pg_gpio_probe()
879 dev_info(bq->dev, "probe retry requested for PG pin\n"); in bq24257_pg_gpio_probe()
881 } else if (IS_ERR(bq->pg)) { in bq24257_pg_gpio_probe()
882 dev_err(bq->dev, "error probing PG pin\n"); in bq24257_pg_gpio_probe()
883 bq->pg = NULL; in bq24257_pg_gpio_probe()
887 if (bq->pg) in bq24257_pg_gpio_probe()
888 dev_dbg(bq->dev, "probed PG pin = %d\n", desc_to_gpio(bq->pg)); in bq24257_pg_gpio_probe()
891 static int bq24257_fw_probe(struct bq24257_device *bq) in bq24257_fw_probe() argument
897 ret = device_property_read_u32(bq->dev, "ti,charge-current", &property); in bq24257_fw_probe()
901 bq->init_data.ichg = bq24257_find_idx(property, bq24257_ichg_map, in bq24257_fw_probe()
904 ret = device_property_read_u32(bq->dev, "ti,battery-regulation-voltage", in bq24257_fw_probe()
909 bq->init_data.vbat = bq24257_find_idx(property, bq24257_vbat_map, in bq24257_fw_probe()
912 ret = device_property_read_u32(bq->dev, "ti,termination-current", in bq24257_fw_probe()
917 bq->init_data.iterm = bq24257_find_idx(property, bq24257_iterm_map, in bq24257_fw_probe()
921 ret = device_property_read_u32(bq->dev, "ti,current-limit", in bq24257_fw_probe()
924 bq->iilimit_autoset_enable = true; in bq24257_fw_probe()
931 bq->init_data.iilimit = IILIMIT_500; in bq24257_fw_probe()
933 bq->init_data.iilimit = in bq24257_fw_probe()
938 ret = device_property_read_u32(bq->dev, "ti,ovp-voltage", in bq24257_fw_probe()
941 bq->init_data.vovp = VOVP_6500; in bq24257_fw_probe()
943 bq->init_data.vovp = bq24257_find_idx(property, in bq24257_fw_probe()
947 ret = device_property_read_u32(bq->dev, "ti,in-dpm-voltage", in bq24257_fw_probe()
950 bq->init_data.vindpm = VINDPM_4360; in bq24257_fw_probe()
952 bq->init_data.vindpm = in bq24257_fw_probe()
966 struct bq24257_device *bq; in bq24257_probe() local
975 bq = devm_kzalloc(dev, sizeof(*bq), GFP_KERNEL); in bq24257_probe()
976 if (!bq) in bq24257_probe()
979 bq->client = client; in bq24257_probe()
980 bq->dev = dev; in bq24257_probe()
989 bq->chip = (enum bq2425x_chip)acpi_id->driver_data; in bq24257_probe()
991 bq->chip = (enum bq2425x_chip)id->driver_data; in bq24257_probe()
994 mutex_init(&bq->lock); in bq24257_probe()
996 bq->rmap = devm_regmap_init_i2c(client, &bq24257_regmap_config); in bq24257_probe()
997 if (IS_ERR(bq->rmap)) { in bq24257_probe()
999 return PTR_ERR(bq->rmap); in bq24257_probe()
1005 bq->rmap_fields[i] = devm_regmap_field_alloc(dev, bq->rmap, in bq24257_probe()
1007 if (IS_ERR(bq->rmap_fields[i])) { in bq24257_probe()
1009 return PTR_ERR(bq->rmap_fields[i]); in bq24257_probe()
1013 i2c_set_clientdata(client, bq); in bq24257_probe()
1016 ret = bq24257_fw_probe(bq); in bq24257_probe()
1030 if (bq->chip == BQ24250) in bq24257_probe()
1031 bq->iilimit_autoset_enable = false; in bq24257_probe()
1033 if (bq->iilimit_autoset_enable) in bq24257_probe()
1034 INIT_DELAYED_WORK(&bq->iilimit_setup_work, in bq24257_probe()
1043 if (bq->chip != BQ24250) in bq24257_probe()
1044 bq24257_pg_gpio_probe(bq); in bq24257_probe()
1046 if (PTR_ERR(bq->pg) == -EPROBE_DEFER) in bq24257_probe()
1047 return PTR_ERR(bq->pg); in bq24257_probe()
1048 else if (!bq->pg) in bq24257_probe()
1049 dev_info(bq->dev, "using SW-based power-good detection\n"); in bq24257_probe()
1052 ret = bq24257_field_write(bq, F_RESET, 1); in bq24257_probe()
1061 ret = bq24257_field_write(bq, F_RESET, 0); in bq24257_probe()
1065 ret = bq24257_hw_init(bq); in bq24257_probe()
1075 bq2425x_chip_name[bq->chip], bq); in bq24257_probe()
1081 ret = bq24257_power_supply_init(bq); in bq24257_probe()
1087 ret = sysfs_create_group(&bq->charger->dev.kobj, &bq24257_attr_group); in bq24257_probe()
1098 struct bq24257_device *bq = i2c_get_clientdata(client); in bq24257_remove() local
1100 if (bq->iilimit_autoset_enable) in bq24257_remove()
1101 cancel_delayed_work_sync(&bq->iilimit_setup_work); in bq24257_remove()
1103 sysfs_remove_group(&bq->charger->dev.kobj, &bq24257_attr_group); in bq24257_remove()
1105 bq24257_field_write(bq, F_RESET, 1); /* reset to defaults */ in bq24257_remove()
1113 struct bq24257_device *bq = dev_get_drvdata(dev); in bq24257_suspend() local
1116 if (bq->iilimit_autoset_enable) in bq24257_suspend()
1117 cancel_delayed_work_sync(&bq->iilimit_setup_work); in bq24257_suspend()
1120 ret = bq24257_field_write(bq, F_RESET, 1); in bq24257_suspend()
1122 dev_err(bq->dev, "Cannot reset chip to standalone mode.\n"); in bq24257_suspend()
1130 struct bq24257_device *bq = dev_get_drvdata(dev); in bq24257_resume() local
1132 ret = regcache_drop_region(bq->rmap, BQ24257_REG_1, BQ24257_REG_7); in bq24257_resume()
1136 ret = bq24257_field_write(bq, F_RESET, 0); in bq24257_resume()
1140 ret = bq24257_hw_init(bq); in bq24257_resume()
1142 dev_err(bq->dev, "Cannot init chip after resume.\n"); in bq24257_resume()
1147 power_supply_changed(bq->charger); in bq24257_resume()