Lines Matching +full:otg +full:- +full:rev
1 // SPDX-License-Identifier: GPL-2.0-or-later
264 * Most of the val -> idx conversions can be computed, given the minimum,
335 ret = regmap_field_read(bq->rmap_fields[field_id], &val); in bq25890_field_read()
345 return regmap_field_write(bq->rmap_fields[field_id], val); in bq25890_field_write()
362 rtbl_size = (rtbl->max - rtbl->min) / rtbl->step + 1; in bq25890_find_idx()
365 idx < rtbl_size && (idx * rtbl->step + rtbl->min <= value); in bq25890_find_idx()
370 return idx - 1; in bq25890_find_idx()
384 return (rtbl->min + idx * rtbl->step); in bq25890_find_val()
424 mutex_lock(&bq->lock); in bq25890_power_supply_get_property()
427 state = bq->state; in bq25890_power_supply_get_property()
431 mutex_unlock(&bq->lock); in bq25890_power_supply_get_property()
434 regmap_field_read_poll_timeout(bq->rmap_fields[F_CONV_START], in bq25890_power_supply_get_property()
440 val->intval = POWER_SUPPLY_STATUS_DISCHARGING; in bq25890_power_supply_get_property()
442 val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING; in bq25890_power_supply_get_property()
445 val->intval = POWER_SUPPLY_STATUS_CHARGING; in bq25890_power_supply_get_property()
447 val->intval = POWER_SUPPLY_STATUS_FULL; in bq25890_power_supply_get_property()
449 val->intval = POWER_SUPPLY_STATUS_UNKNOWN; in bq25890_power_supply_get_property()
456 val->intval = POWER_SUPPLY_CHARGE_TYPE_NONE; in bq25890_power_supply_get_property()
458 val->intval = POWER_SUPPLY_CHARGE_TYPE_STANDARD; in bq25890_power_supply_get_property()
460 val->intval = POWER_SUPPLY_CHARGE_TYPE_FAST; in bq25890_power_supply_get_property()
462 val->intval = POWER_SUPPLY_CHARGE_TYPE_UNKNOWN; in bq25890_power_supply_get_property()
466 val->strval = BQ25890_MANUFACTURER; in bq25890_power_supply_get_property()
470 val->strval = bq25890_chip_name[bq->chip_version]; in bq25890_power_supply_get_property()
474 val->intval = state.online; in bq25890_power_supply_get_property()
479 val->intval = POWER_SUPPLY_HEALTH_GOOD; in bq25890_power_supply_get_property()
481 val->intval = POWER_SUPPLY_HEALTH_OVERVOLTAGE; in bq25890_power_supply_get_property()
483 val->intval = POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE; in bq25890_power_supply_get_property()
485 val->intval = POWER_SUPPLY_HEALTH_OVERHEAT; in bq25890_power_supply_get_property()
487 val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE; in bq25890_power_supply_get_property()
491 val->intval = bq25890_find_val(bq->init_data.ichg, TBL_ICHG); in bq25890_power_supply_get_property()
496 val->intval = 0; in bq25890_power_supply_get_property()
505 val->intval = 2304000 + ret * 20000; in bq25890_power_supply_get_property()
509 val->intval = bq25890_find_val(bq->init_data.vreg, TBL_VREG); in bq25890_power_supply_get_property()
513 val->intval = bq25890_find_val(bq->init_data.iprechg, TBL_ITERM); in bq25890_power_supply_get_property()
517 val->intval = bq25890_find_val(bq->init_data.iterm, TBL_ITERM); in bq25890_power_supply_get_property()
525 val->intval = bq25890_find_val(ret, TBL_IILIM); in bq25890_power_supply_get_property()
534 val->intval = 2304000 + ret * 20000; in bq25890_power_supply_get_property()
543 val->intval = ret * -50000; in bq25890_power_supply_get_property()
547 return -EINVAL; in bq25890_power_supply_get_property()
562 {F_CHG_STAT, &state->chrg_status}, in bq25890_get_chip_state()
563 {F_PG_STAT, &state->online}, in bq25890_get_chip_state()
564 {F_VSYS_STAT, &state->vsys_status}, in bq25890_get_chip_state()
565 {F_BOOST_FAULT, &state->boost_fault}, in bq25890_get_chip_state()
566 {F_BAT_FAULT, &state->bat_fault}, in bq25890_get_chip_state()
567 {F_CHG_FAULT, &state->chrg_fault} in bq25890_get_chip_state()
578 dev_dbg(bq->dev, "S:CHG/PG/VSYS=%d/%d/%d, F:CHG/BOOST/BAT=%d/%d/%d\n", in bq25890_get_chip_state()
579 state->chrg_status, state->online, state->vsys_status, in bq25890_get_chip_state()
580 state->chrg_fault, state->boost_fault, state->bat_fault); in bq25890_get_chip_state()
594 if (!memcmp(&bq->state, &new_state, sizeof(new_state))) in __bq25890_handle_irq()
597 if (!new_state.online && bq->state.online) { /* power removed */ in __bq25890_handle_irq()
602 } else if (new_state.online && !bq->state.online) { /* power inserted */ in __bq25890_handle_irq()
609 bq->state = new_state; in __bq25890_handle_irq()
610 power_supply_changed(bq->charger); in __bq25890_handle_irq()
614 dev_err(bq->dev, "Error communicating with the chip: %pe\n", in __bq25890_handle_irq()
624 mutex_lock(&bq->lock); in bq25890_irq_handler_thread()
626 mutex_unlock(&bq->lock); in bq25890_irq_handler_thread()
646 } while (ret == 1 && --rst_check_counter); in bq25890_chip_reset()
649 return -ETIMEDOUT; in bq25890_chip_reset()
663 {F_ICHG, bq->init_data.ichg}, in bq25890_hw_init()
664 {F_VREG, bq->init_data.vreg}, in bq25890_hw_init()
665 {F_ITERM, bq->init_data.iterm}, in bq25890_hw_init()
666 {F_IPRECHG, bq->init_data.iprechg}, in bq25890_hw_init()
667 {F_SYSVMIN, bq->init_data.sysvmin}, in bq25890_hw_init()
668 {F_BOOSTV, bq->init_data.boostv}, in bq25890_hw_init()
669 {F_BOOSTI, bq->init_data.boosti}, in bq25890_hw_init()
670 {F_BOOSTF, bq->init_data.boostf}, in bq25890_hw_init()
671 {F_EN_ILIM, bq->init_data.ilim_en}, in bq25890_hw_init()
672 {F_TREG, bq->init_data.treg}, in bq25890_hw_init()
673 {F_BATCMP, bq->init_data.rbatcomp}, in bq25890_hw_init()
674 {F_VCLAMP, bq->init_data.vclamp}, in bq25890_hw_init()
679 dev_dbg(bq->dev, "Reset failed %d\n", ret); in bq25890_hw_init()
686 dev_dbg(bq->dev, "Disabling watchdog failed %d\n", ret); in bq25890_hw_init()
695 dev_dbg(bq->dev, "Writing init data failed %d\n", ret); in bq25890_hw_init()
701 ret = bq25890_field_write(bq, F_CONV_RATE, !!bq->state.online); in bq25890_hw_init()
703 dev_dbg(bq->dev, "Config ADC failed %d\n", ret); in bq25890_hw_init()
707 ret = bq25890_get_chip_state(bq, &bq->state); in bq25890_hw_init()
709 dev_dbg(bq->dev, "Get state failed %d\n", ret); in bq25890_hw_init()
734 "main-battery",
738 .name = "bq25890-charger",
751 psy_cfg.of_node = bq->dev->of_node; in bq25890_power_supply_init()
753 bq->charger = power_supply_register(bq->dev, &bq25890_power_supply_desc, in bq25890_power_supply_init()
756 return PTR_ERR_OR_ZERO(bq->charger); in bq25890_power_supply_init()
765 switch (bq->usb_event) { in bq25890_usb_work()
779 power_supply_changed(bq->charger); in bq25890_usb_work()
786 dev_err(bq->dev, "Error switching to boost/charger mode.\n"); in bq25890_usb_work()
795 bq->usb_event = val; in bq25890_usb_notifier()
796 queue_work(system_power_efficient_wq, &bq->usb_work); in bq25890_usb_notifier()
803 int id, rev; in bq25890_get_chip_version() local
807 dev_err(bq->dev, "Cannot read chip ID.\n"); in bq25890_get_chip_version()
811 rev = bq25890_field_read(bq, F_DEV_REV); in bq25890_get_chip_version()
812 if (rev < 0) { in bq25890_get_chip_version()
813 dev_err(bq->dev, "Cannot read chip revision.\n"); in bq25890_get_chip_version()
814 return rev; in bq25890_get_chip_version()
819 bq->chip_version = BQ25890; in bq25890_get_chip_version()
824 switch (rev) { in bq25890_get_chip_version()
826 bq->chip_version = BQ25896; in bq25890_get_chip_version()
829 bq->chip_version = BQ25892; in bq25890_get_chip_version()
832 dev_err(bq->dev, in bq25890_get_chip_version()
834 rev); in bq25890_get_chip_version()
835 bq->chip_version = BQ25892; in bq25890_get_chip_version()
840 bq->chip_version = BQ25895; in bq25890_get_chip_version()
844 bq->chip_version = SY6970; in bq25890_get_chip_version()
848 dev_err(bq->dev, "Unknown chip ID %d\n", id); in bq25890_get_chip_version()
849 return -ENODEV; in bq25890_get_chip_version()
859 irq = devm_gpiod_get(bq->dev, BQ25890_IRQ_PIN, GPIOD_IN); in bq25890_irq_probe()
861 dev_err(bq->dev, "Could not probe irq pin.\n"); in bq25890_irq_probe()
873 struct bq25890_init_data *init = &bq->init_data; in bq25890_fw_read_u32_props()
881 {"ti,charge-current", false, TBL_ICHG, &init->ichg}, in bq25890_fw_read_u32_props()
882 {"ti,battery-regulation-voltage", false, TBL_VREG, &init->vreg}, in bq25890_fw_read_u32_props()
883 {"ti,termination-current", false, TBL_ITERM, &init->iterm}, in bq25890_fw_read_u32_props()
884 {"ti,precharge-current", false, TBL_ITERM, &init->iprechg}, in bq25890_fw_read_u32_props()
885 {"ti,minimum-sys-voltage", false, TBL_SYSVMIN, &init->sysvmin}, in bq25890_fw_read_u32_props()
886 {"ti,boost-voltage", false, TBL_BOOSTV, &init->boostv}, in bq25890_fw_read_u32_props()
887 {"ti,boost-max-current", false, TBL_BOOSTI, &init->boosti}, in bq25890_fw_read_u32_props()
890 {"ti,thermal-regulation-threshold", true, TBL_TREG, &init->treg}, in bq25890_fw_read_u32_props()
891 {"ti,ibatcomp-micro-ohms", true, TBL_RBATCOMP, &init->rbatcomp}, in bq25890_fw_read_u32_props()
892 {"ti,ibatcomp-clamp-microvolt", true, TBL_VBATCOMP, &init->vclamp}, in bq25890_fw_read_u32_props()
896 init->treg = 3; /* 120 degrees Celsius */ in bq25890_fw_read_u32_props()
897 init->rbatcomp = init->vclamp = 0; /* IBAT compensation disabled */ in bq25890_fw_read_u32_props()
900 ret = device_property_read_u32(bq->dev, props[i].name, in bq25890_fw_read_u32_props()
906 dev_err(bq->dev, "Unable to read property %d %s\n", ret, in bq25890_fw_read_u32_props()
922 struct bq25890_init_data *init = &bq->init_data; in bq25890_fw_probe()
928 init->ilim_en = device_property_read_bool(bq->dev, "ti,use-ilim-pin"); in bq25890_fw_probe()
929 init->boostf = device_property_read_bool(bq->dev, "ti,boost-low-freq"); in bq25890_fw_probe()
930 bq->notify_node = of_parse_phandle(bq->dev->of_node, in bq25890_fw_probe()
931 "ti,usb-charger-detection", 0); in bq25890_fw_probe()
932 bq->otg_mode_en_io = devm_gpiod_get_optional(bq->dev, in bq25890_fw_probe()
933 "otg-mode-en", in bq25890_fw_probe()
935 if (!IS_ERR_OR_NULL(bq->otg_mode_en_io)) in bq25890_fw_probe()
936 gpiod_direction_output(bq->otg_mode_en_io, 0); in bq25890_fw_probe()
952 vol_limit = vol_limit - 1280000 - 3200000; in bq25890_set_pd_param()
966 dev_info(bq->dev, "vol=%d cur=%d INPUT_CURRENT:%x, INPUT_VOLTAGE:%x, CHARGE_CURRENT:%x\n", in bq25890_set_pd_param()
969 bq25890_get_chip_state(bq, &bq->state); in bq25890_set_pd_param()
970 power_supply_changed(bq->charger); in bq25890_set_pd_param()
986 if (bq->notify_node) { in bq25890_pd_notifier_call()
987 if (!psy->dev.parent || in bq25890_pd_notifier_call()
988 psy->dev.parent->of_node != bq->notify_node) in bq25890_pd_notifier_call()
997 bq->pd_cur = 450000; in bq25890_pd_notifier_call()
998 bq->pd_vol = 5000000; in bq25890_pd_notifier_call()
999 queue_delayed_work(bq->charger_wq, &bq->pd_work, in bq25890_pd_notifier_call()
1007 bq->pd_cur = prop.intval; in bq25890_pd_notifier_call()
1008 if (bq->pd_cur > 0) { in bq25890_pd_notifier_call()
1013 bq->pd_vol = prop.intval; in bq25890_pd_notifier_call()
1015 queue_delayed_work(bq->charger_wq, &bq->pd_work, in bq25890_pd_notifier_call()
1028 bq25890_set_pd_param(bq, bq->pd_vol, bq->pd_cur); in bq25890_pd_evt_worker()
1037 if (!bq->notify_node) in bq25890_register_pd_psy()
1038 return -EINVAL; in bq25890_register_pd_psy()
1040 bq->charger_wq = alloc_ordered_workqueue("%s", in bq25890_register_pd_psy()
1043 "bq25890-charge-wq"); in bq25890_register_pd_psy()
1044 INIT_DELAYED_WORK(&bq->pd_work, in bq25890_register_pd_psy()
1047 bq->nb.notifier_call = bq25890_pd_notifier_call; in bq25890_register_pd_psy()
1048 ret = power_supply_reg_notifier(&bq->nb); in bq25890_register_pd_psy()
1050 dev_err(bq->dev, "failed to reg notifier: %d\n", ret); in bq25890_register_pd_psy()
1055 if (bq->nb.notifier_call) { in bq25890_register_pd_psy()
1056 notify_psy = power_supply_get_by_phandle(bq->dev->of_node, in bq25890_register_pd_psy()
1057 "ti,usb-charger-detection"); in bq25890_register_pd_psy()
1059 dev_info(bq->dev, "bq25700 notify_psy is error\n"); in bq25890_register_pd_psy()
1070 bq->pd_cur = prop.intval; in bq25890_register_pd_psy()
1077 bq->pd_vol = prop.intval; in bq25890_register_pd_psy()
1079 queue_delayed_work(bq->charger_wq, &bq->pd_work, in bq25890_register_pd_psy()
1088 if (!IS_ERR_OR_NULL(bq->otg_mode_en_io)) in bq25890_set_otg_vbus()
1089 gpiod_direction_output(bq->otg_mode_en_io, enable); in bq25890_set_otg_vbus()
1118 if (!IS_ERR_OR_NULL(bq->otg_mode_en_io)) in bq25890_otg_vbus_is_enabled()
1119 gpio_status = gpiod_get_value(bq->otg_mode_en_io); in bq25890_otg_vbus_is_enabled()
1131 .name = "otg-vbus",
1132 .of_match = "otg-vbus",
1146 np = of_get_child_by_name(bq->dev->of_node, "regulators"); in bq25890_register_otg_vbus_regulator()
1148 dev_warn(bq->dev, "cannot find regulators node\n"); in bq25890_register_otg_vbus_regulator()
1149 return -ENXIO; in bq25890_register_otg_vbus_regulator()
1152 config.dev = bq->dev; in bq25890_register_otg_vbus_regulator()
1155 bq->otg_vbus_reg = devm_regulator_register(bq->dev, in bq25890_register_otg_vbus_regulator()
1158 if (IS_ERR(bq->otg_vbus_reg)) in bq25890_register_otg_vbus_regulator()
1159 return PTR_ERR(bq->otg_vbus_reg); in bq25890_register_otg_vbus_regulator()
1168 /* OTG reporting */ in bq25890_otg_register()
1169 bq->usb_phy = devm_usb_get_phy(bq->dev, USB_PHY_TYPE_USB2); in bq25890_otg_register()
1170 if (!IS_ERR_OR_NULL(bq->usb_phy)) { in bq25890_otg_register()
1171 INIT_WORK(&bq->usb_work, bq25890_usb_work); in bq25890_otg_register()
1172 bq->usb_nb.notifier_call = bq25890_usb_notifier; in bq25890_otg_register()
1173 usb_register_notifier(bq->usb_phy, &bq->usb_nb); in bq25890_otg_register()
1179 dev_warn(bq->dev, in bq25890_otg_register()
1180 "Cannot register otg vbus regulator\n"); in bq25890_otg_register()
1181 bq->otg_vbus_reg = NULL; in bq25890_otg_register()
1192 struct device *dev = &client->dev; in bq25890_probe()
1199 return -ENOMEM; in bq25890_probe()
1201 bq->client = client; in bq25890_probe()
1202 bq->dev = dev; in bq25890_probe()
1204 mutex_init(&bq->lock); in bq25890_probe()
1206 bq->rmap = devm_regmap_init_i2c(client, &bq25890_regmap_config); in bq25890_probe()
1207 if (IS_ERR(bq->rmap)) { in bq25890_probe()
1209 return PTR_ERR(bq->rmap); in bq25890_probe()
1215 bq->rmap_fields[i] = devm_regmap_field_alloc(dev, bq->rmap, in bq25890_probe()
1217 if (IS_ERR(bq->rmap_fields[i])) { in bq25890_probe()
1219 return PTR_ERR(bq->rmap_fields[i]); in bq25890_probe()
1231 if (!dev->platform_data) { in bq25890_probe()
1238 return -ENODEV; in bq25890_probe()
1247 if (client->irq <= 0) in bq25890_probe()
1248 client->irq = bq25890_irq_probe(bq); in bq25890_probe()
1250 if (client->irq < 0) { in bq25890_probe()
1252 return client->irq; in bq25890_probe()
1257 ret = devm_request_threaded_irq(dev, client->irq, NULL, in bq25890_probe()
1275 if (!IS_ERR_OR_NULL(bq->usb_phy)) in bq25890_probe()
1276 usb_unregister_notifier(bq->usb_phy, &bq->usb_nb); in bq25890_probe()
1285 power_supply_unregister(bq->charger); in bq25890_remove()
1287 if (!IS_ERR_OR_NULL(bq->usb_phy)) in bq25890_remove()
1288 usb_unregister_notifier(bq->usb_phy, &bq->usb_nb); in bq25890_remove()
1313 mutex_lock(&bq->lock); in bq25890_resume()
1315 ret = bq25890_get_chip_state(bq, &bq->state); in bq25890_resume()
1319 /* Re-enable ADC only if charger is plugged in. */ in bq25890_resume()
1320 if (bq->state.online) { in bq25890_resume()
1327 power_supply_changed(bq->charger); in bq25890_resume()
1330 mutex_unlock(&bq->lock); in bq25890_resume()
1370 .name = "bq25890-charger",