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