Lines Matching refs:bq

205 static int bq24257_field_read(struct bq24257_device *bq,
211 ret = regmap_field_read(bq->rmap_fields[field_id], &val);
218 static int bq24257_field_write(struct bq24257_device *bq,
221 return regmap_field_write(bq->rmap_fields[field_id], val);
256 static int bq24257_get_input_current_limit(struct bq24257_device *bq,
261 ret = bq24257_field_read(bq, F_IILIMIT);
280 static int bq24257_set_input_current_limit(struct bq24257_device *bq,
288 if (bq->iilimit_autoset_enable)
289 cancel_delayed_work_sync(&bq->iilimit_setup_work);
291 return bq24257_field_write(bq, F_IILIMIT,
301 struct bq24257_device *bq = power_supply_get_drvdata(psy);
304 mutex_lock(&bq->lock);
305 state = bq->state;
306 mutex_unlock(&bq->lock);
327 val->strval = bq->info->name;
362 val->intval = bq24257_ichg_map[bq->init_data.ichg];
370 val->intval = bq24257_vbat_map[bq->init_data.vbat];
378 val->intval = bq24257_iterm_map[bq->init_data.iterm];
382 return bq24257_get_input_current_limit(bq, val);
395 struct bq24257_device *bq = power_supply_get_drvdata(psy);
399 return bq24257_set_input_current_limit(bq, val);
416 static int bq24257_get_chip_state(struct bq24257_device *bq,
421 ret = bq24257_field_read(bq, F_STAT);
427 ret = bq24257_field_read(bq, F_FAULT);
433 if (bq->pg)
434 state->power_good = !gpiod_get_value_cansleep(bq->pg);
457 static bool bq24257_state_changed(struct bq24257_device *bq,
462 mutex_lock(&bq->lock);
463 ret = (bq->state.status != new_state->status ||
464 bq->state.fault != new_state->fault ||
465 bq->state.power_good != new_state->power_good);
466 mutex_unlock(&bq->lock);
525 static int bq24257_iilimit_autoset(struct bq24257_device *bq)
538 ret = bq24257_field_read(bq, F_LOOP_STATUS);
544 ret = bq24257_field_read(bq, F_IILIMIT);
558 ret = bq24257_field_read(bq, F_USB_DET);
564 ret = bq24257_field_write(bq, F_IILIMIT, new_iilimit[port_type]);
568 ret = bq24257_field_write(bq, F_TMR, SAFETY_TIMER_360);
572 ret = bq24257_field_write(bq, F_CLR_VDP, 1);
576 dev_dbg(bq->dev, "port/loop = %d/%d -> iilimit = %d\n",
582 dev_err(bq->dev, "%s: Error communicating with the chip.\n", __func__);
588 struct bq24257_device *bq = container_of(work, struct bq24257_device,
591 bq24257_iilimit_autoset(bq);
594 static void bq24257_handle_state_change(struct bq24257_device *bq,
600 mutex_lock(&bq->lock);
601 old_state = bq->state;
602 mutex_unlock(&bq->lock);
609 dev_dbg(bq->dev, "Power removed\n");
610 if (bq->iilimit_autoset_enable) {
611 cancel_delayed_work_sync(&bq->iilimit_setup_work);
614 ret = bq24257_field_write(bq, F_DPDM_EN, 1);
622 ret = bq24257_field_write(bq, F_IILIMIT, bq->init_data.iilimit);
626 dev_dbg(bq->dev, "Power inserted\n");
628 if (bq->iilimit_autoset_enable)
630 schedule_delayed_work(&bq->iilimit_setup_work,
633 dev_warn(bq->dev, "Battery removed\n");
635 dev_err(bq->dev, "Safety timer expired! Battery dead?\n");
641 dev_err(bq->dev, "%s: Error communicating with the chip.\n", __func__);
647 struct bq24257_device *bq = private;
650 ret = bq24257_get_chip_state(bq, &state);
654 if (!bq24257_state_changed(bq, &state))
657 dev_dbg(bq->dev, "irq(state changed): status/fault/pg = %d/%d/%d\n",
660 bq24257_handle_state_change(bq, &state);
662 mutex_lock(&bq->lock);
663 bq->state = state;
664 mutex_unlock(&bq->lock);
666 power_supply_changed(bq->charger);
671 static int bq24257_hw_init(struct bq24257_device *bq)
681 {F_ICHG, bq->init_data.ichg},
682 {F_VBAT, bq->init_data.vbat},
683 {F_ITERM, bq->init_data.iterm},
684 {F_VOVP, bq->init_data.vovp},
685 {F_VINDPM, bq->init_data.vindpm},
692 ret = bq24257_field_write(bq, F_WD_EN, 0);
698 ret = bq24257_field_write(bq, init_data[i].field,
704 ret = bq24257_get_chip_state(bq, &state);
708 mutex_lock(&bq->lock);
709 bq->state = state;
710 mutex_unlock(&bq->lock);
712 if (!bq->iilimit_autoset_enable) {
713 dev_dbg(bq->dev, "manually setting iilimit = %u\n",
714 bq->init_data.iilimit);
717 ret = bq24257_field_write(bq, F_IILIMIT,
718 bq->init_data.iilimit);
723 ret = bq24257_field_write(bq, F_DPDM_EN, 1);
725 ret = bq24257_iilimit_autoset(bq);
763 struct bq24257_device *bq = power_supply_get_drvdata(psy);
765 return sysfs_emit(buf, "%u\n", bq24257_vovp_map[bq->init_data.vovp]);
773 struct bq24257_device *bq = power_supply_get_drvdata(psy);
775 return sysfs_emit(buf, "%u\n", bq24257_vindpm_map[bq->init_data.vindpm]);
783 struct bq24257_device *bq = power_supply_get_drvdata(psy);
787 ret = bq24257_field_read(bq, F_HZ_MODE);
789 ret = bq24257_field_read(bq, F_SYSOFF);
805 struct bq24257_device *bq = power_supply_get_drvdata(psy);
813 ret = bq24257_field_write(bq, F_HZ_MODE, (bool)val);
815 ret = bq24257_field_write(bq, F_SYSOFF, (bool)val);
842 static int bq24257_power_supply_init(struct bq24257_device *bq)
844 struct power_supply_config psy_cfg = { .drv_data = bq, };
850 bq->charger = devm_power_supply_register(bq->dev,
854 return PTR_ERR_OR_ZERO(bq->charger);
857 static void bq24257_pg_gpio_probe(struct bq24257_device *bq)
859 bq->pg = devm_gpiod_get_optional(bq->dev, BQ24257_PG_GPIO, GPIOD_IN);
861 if (PTR_ERR(bq->pg) == -EPROBE_DEFER) {
862 dev_info(bq->dev, "probe retry requested for PG pin\n");
864 } else if (IS_ERR(bq->pg)) {
865 dev_err(bq->dev, "error probing PG pin\n");
866 bq->pg = NULL;
870 if (bq->pg)
871 dev_dbg(bq->dev, "probed PG pin = %d\n", desc_to_gpio(bq->pg));
874 static int bq24257_fw_probe(struct bq24257_device *bq)
880 ret = device_property_read_u32(bq->dev, "ti,charge-current", &property);
884 bq->init_data.ichg = bq24257_find_idx(property, bq24257_ichg_map,
887 ret = device_property_read_u32(bq->dev, "ti,battery-regulation-voltage",
892 bq->init_data.vbat = bq24257_find_idx(property, bq24257_vbat_map,
895 ret = device_property_read_u32(bq->dev, "ti,termination-current",
900 bq->init_data.iterm = bq24257_find_idx(property, bq24257_iterm_map,
904 ret = device_property_read_u32(bq->dev, "ti,current-limit",
907 bq->iilimit_autoset_enable = true;
914 bq->init_data.iilimit = IILIMIT_500;
916 bq->init_data.iilimit =
921 ret = device_property_read_u32(bq->dev, "ti,ovp-voltage",
924 bq->init_data.vovp = VOVP_6500;
926 bq->init_data.vovp = bq24257_find_idx(property,
930 ret = device_property_read_u32(bq->dev, "ti,in-dpm-voltage",
933 bq->init_data.vindpm = VINDPM_4360;
935 bq->init_data.vindpm =
947 struct bq24257_device *bq;
956 bq = devm_kzalloc(dev, sizeof(*bq), GFP_KERNEL);
957 if (!bq)
960 bq->client = client;
961 bq->dev = dev;
963 bq->info = i2c_get_match_data(client);
964 if (!bq->info)
967 mutex_init(&bq->lock);
969 bq->rmap = devm_regmap_init_i2c(client, &bq24257_regmap_config);
970 if (IS_ERR(bq->rmap)) {
972 return PTR_ERR(bq->rmap);
978 bq->rmap_fields[i] = devm_regmap_field_alloc(dev, bq->rmap,
980 if (IS_ERR(bq->rmap_fields[i])) {
982 return PTR_ERR(bq->rmap_fields[i]);
986 i2c_set_clientdata(client, bq);
989 ret = bq24257_fw_probe(bq);
1003 if (bq->info->chip == BQ24250)
1004 bq->iilimit_autoset_enable = false;
1006 if (bq->iilimit_autoset_enable)
1007 INIT_DELAYED_WORK(&bq->iilimit_setup_work,
1016 if (bq->info->chip != BQ24250)
1017 bq24257_pg_gpio_probe(bq);
1019 if (PTR_ERR(bq->pg) == -EPROBE_DEFER)
1020 return PTR_ERR(bq->pg);
1021 else if (!bq->pg)
1022 dev_info(bq->dev, "using SW-based power-good detection\n");
1025 ret = bq24257_field_write(bq, F_RESET, 1);
1034 ret = bq24257_field_write(bq, F_RESET, 0);
1038 ret = bq24257_hw_init(bq);
1044 ret = bq24257_power_supply_init(bq);
1054 bq->info->name, bq);
1065 struct bq24257_device *bq = i2c_get_clientdata(client);
1067 if (bq->iilimit_autoset_enable)
1068 cancel_delayed_work_sync(&bq->iilimit_setup_work);
1070 bq24257_field_write(bq, F_RESET, 1); /* reset to defaults */
1076 struct bq24257_device *bq = dev_get_drvdata(dev);
1079 if (bq->iilimit_autoset_enable)
1080 cancel_delayed_work_sync(&bq->iilimit_setup_work);
1083 ret = bq24257_field_write(bq, F_RESET, 1);
1085 dev_err(bq->dev, "Cannot reset chip to standalone mode.\n");
1093 struct bq24257_device *bq = dev_get_drvdata(dev);
1095 ret = regcache_drop_region(bq->rmap, BQ24257_REG_1, BQ24257_REG_7);
1099 ret = bq24257_field_write(bq, F_RESET, 0);
1103 ret = bq24257_hw_init(bq);
1105 dev_err(bq->dev, "Cannot init chip after resume.\n");
1110 power_supply_changed(bq->charger);