• Home
  • Raw
  • Download

Lines Matching +full:buck +full:- +full:boost

12  * This driver is for the multi-block Switch-Mode Battery Charger and Boost
14 * integrated, single-cell lithium-ion battery charger.
16 * Sub-components:
17 * - Charger core
18 * - Buck
19 * - DC charge-path
20 * - USB charge-path
21 * - Battery interface
22 * - Boost (not implemented)
23 * - Misc
24 * - HF-Buck
37 #include <linux/extcon-provider.h>
149 return 5600000 + (index - 43) * 200000; in smbb_vin_fn()
196 .name = "qcom,fast-charge-safe-current",
204 .name = "qcom,fast-charge-current-limit",
212 .name = "qcom,dc-current-limit",
219 .name = "qcom,fast-charge-safe-voltage",
227 .name = "qcom,fast-charge-high-threshold-voltage",
235 .name = "qcom,fast-charge-low-threshold-voltage",
242 .name = "qcom,auto-recharge-threshold-voltage",
249 .name = "qcom,minimum-input-voltage",
256 .name = "usb-charge-current-limit",
274 if (val > prop->max || val < prop->min) { in smbb_charger_attr_write()
275 dev_err(chg->dev, "value out of range for %s [%u:%u]\n", in smbb_charger_attr_write()
276 prop->name, prop->min, prop->max); in smbb_charger_attr_write()
277 return -EINVAL; in smbb_charger_attr_write()
280 if (prop->safe_reg) { in smbb_charger_attr_write()
281 rc = regmap_read(chg->regmap, in smbb_charger_attr_write()
282 chg->addr + prop->safe_reg, &wval); in smbb_charger_attr_write()
284 dev_err(chg->dev, in smbb_charger_attr_write()
286 prop->name); in smbb_charger_attr_write()
290 wval = prop->hw_fn(wval); in smbb_charger_attr_write()
293 dev_warn(chg->dev, in smbb_charger_attr_write()
295 prop->name, wval); in smbb_charger_attr_write()
300 wval = smbb_hw_lookup(val, prop->hw_fn); in smbb_charger_attr_write()
302 rc = regmap_write(chg->regmap, chg->addr + prop->reg, wval); in smbb_charger_attr_write()
304 dev_err(chg->dev, "unable to update %s", prop->name); in smbb_charger_attr_write()
307 out = prop->hw_fn(wval); in smbb_charger_attr_write()
309 dev_warn(chg->dev, in smbb_charger_attr_write()
311 prop->name, out); in smbb_charger_attr_write()
314 dev_dbg(chg->dev, "%s <= %d\n", prop->name, out); in smbb_charger_attr_write()
316 chg->attr[which] = out; in smbb_charger_attr_write()
330 rc = regmap_read(chg->regmap, chg->addr + prop->reg, &val); in smbb_charger_attr_read()
332 dev_err(chg->dev, "failed to read %s\n", prop->name); in smbb_charger_attr_read()
335 val = prop->hw_fn(val); in smbb_charger_attr_read()
336 dev_dbg(chg->dev, "%s => %d\n", prop->name, val); in smbb_charger_attr_read()
338 chg->attr[which] = val; in smbb_charger_attr_read()
352 rc = of_property_read_u32(chg->dev->of_node, prop->name, &val); in smbb_charger_attr_parse()
355 if (!rc || !prop->fail_ok) in smbb_charger_attr_parse()
368 dev_err(chg->dev, "failed to read irq line\n"); in smbb_set_line_flag()
372 mutex_lock(&chg->statlock); in smbb_set_line_flag()
374 chg->status |= flag; in smbb_set_line_flag()
376 chg->status &= ~flag; in smbb_set_line_flag()
377 mutex_unlock(&chg->statlock); in smbb_set_line_flag()
379 dev_dbg(chg->dev, "status = %03lx\n", chg->status); in smbb_set_line_flag()
387 extcon_set_state_sync(chg->edev, EXTCON_USB, in smbb_usb_valid_handler()
388 chg->status & STATUS_USBIN_VALID); in smbb_usb_valid_handler()
389 power_supply_changed(chg->usb_psy); in smbb_usb_valid_handler()
399 if (!chg->dc_disabled) in smbb_dc_valid_handler()
400 power_supply_changed(chg->dc_psy); in smbb_dc_valid_handler()
411 rc = regmap_read(chg->regmap, chg->addr + SMBB_BAT_TEMP_STATUS, &val); in smbb_bat_temp_handler()
415 mutex_lock(&chg->statlock); in smbb_bat_temp_handler()
417 chg->status |= STATUS_BAT_OK; in smbb_bat_temp_handler()
419 chg->status &= ~STATUS_BAT_OK; in smbb_bat_temp_handler()
421 chg->status |= STATUS_BAT_HOT; in smbb_bat_temp_handler()
423 mutex_unlock(&chg->statlock); in smbb_bat_temp_handler()
425 power_supply_changed(chg->bat_psy); in smbb_bat_temp_handler()
434 power_supply_changed(chg->bat_psy); in smbb_bat_present_handler()
444 power_supply_changed(chg->bat_psy); in smbb_chg_done_handler()
454 power_supply_changed(chg->bat_psy); in smbb_chg_gone_handler()
455 power_supply_changed(chg->usb_psy); in smbb_chg_gone_handler()
456 if (!chg->dc_disabled) in smbb_chg_gone_handler()
457 power_supply_changed(chg->dc_psy); in smbb_chg_gone_handler()
467 power_supply_changed(chg->bat_psy); in smbb_chg_fast_handler()
477 power_supply_changed(chg->bat_psy); in smbb_chg_trkl_handler()
486 { "chg-done", smbb_chg_done_handler },
487 { "chg-fast", smbb_chg_fast_handler },
488 { "chg-trkl", smbb_chg_trkl_handler },
489 { "bat-temp-ok", smbb_bat_temp_handler },
490 { "bat-present", smbb_bat_present_handler },
491 { "chg-gone", smbb_chg_gone_handler },
492 { "usb-valid", smbb_usb_valid_handler },
493 { "dc-valid", smbb_dc_valid_handler },
505 mutex_lock(&chg->statlock); in smbb_usbin_get_property()
506 val->intval = !(chg->status & STATUS_CHG_GONE) && in smbb_usbin_get_property()
507 (chg->status & STATUS_USBIN_VALID); in smbb_usbin_get_property()
508 mutex_unlock(&chg->statlock); in smbb_usbin_get_property()
511 val->intval = chg->attr[ATTR_USBIN_IMAX]; in smbb_usbin_get_property()
514 val->intval = 2500000; in smbb_usbin_get_property()
517 rc = -EINVAL; in smbb_usbin_get_property()
534 val->intval); in smbb_usbin_set_property()
537 rc = -EINVAL; in smbb_usbin_set_property()
553 mutex_lock(&chg->statlock); in smbb_dcin_get_property()
554 val->intval = !(chg->status & STATUS_CHG_GONE) && in smbb_dcin_get_property()
555 (chg->status & STATUS_DCIN_VALID); in smbb_dcin_get_property()
556 mutex_unlock(&chg->statlock); in smbb_dcin_get_property()
559 val->intval = chg->attr[ATTR_DCIN_IMAX]; in smbb_dcin_get_property()
562 val->intval = 2500000; in smbb_dcin_get_property()
565 rc = -EINVAL; in smbb_dcin_get_property()
582 val->intval); in smbb_dcin_set_property()
585 rc = -EINVAL; in smbb_dcin_set_property()
606 mutex_lock(&chg->statlock); in smbb_battery_get_property()
607 status = chg->status; in smbb_battery_get_property()
608 mutex_unlock(&chg->statlock); in smbb_battery_get_property()
613 val->intval = POWER_SUPPLY_STATUS_DISCHARGING; in smbb_battery_get_property()
615 val->intval = POWER_SUPPLY_STATUS_DISCHARGING; in smbb_battery_get_property()
617 val->intval = POWER_SUPPLY_STATUS_FULL; in smbb_battery_get_property()
619 val->intval = POWER_SUPPLY_STATUS_DISCHARGING; in smbb_battery_get_property()
621 val->intval = POWER_SUPPLY_STATUS_CHARGING; in smbb_battery_get_property()
623 val->intval = POWER_SUPPLY_STATUS_DISCHARGING; in smbb_battery_get_property()
627 val->intval = POWER_SUPPLY_HEALTH_GOOD; in smbb_battery_get_property()
629 val->intval = POWER_SUPPLY_HEALTH_OVERHEAT; in smbb_battery_get_property()
631 val->intval = POWER_SUPPLY_HEALTH_COLD; in smbb_battery_get_property()
635 val->intval = POWER_SUPPLY_CHARGE_TYPE_FAST; in smbb_battery_get_property()
637 val->intval = POWER_SUPPLY_CHARGE_TYPE_TRICKLE; in smbb_battery_get_property()
639 val->intval = POWER_SUPPLY_CHARGE_TYPE_NONE; in smbb_battery_get_property()
642 val->intval = !!(status & STATUS_BAT_PRESENT); in smbb_battery_get_property()
645 val->intval = chg->attr[ATTR_BAT_IMAX]; in smbb_battery_get_property()
648 val->intval = chg->attr[ATTR_BAT_VMAX]; in smbb_battery_get_property()
651 /* this charger is a single-cell lithium-ion battery charger in smbb_battery_get_property()
655 val->intval = POWER_SUPPLY_TECHNOLOGY_LION; in smbb_battery_get_property()
658 val->intval = 3000000; /* single-cell li-ion low end */ in smbb_battery_get_property()
661 rc = -EINVAL; in smbb_battery_get_property()
677 rc = smbb_charger_attr_write(chg, ATTR_BAT_IMAX, val->intval); in smbb_battery_set_property()
680 rc = smbb_charger_attr_write(chg, ATTR_BAT_VMAX, val->intval); in smbb_battery_set_property()
683 rc = -EINVAL; in smbb_battery_set_property()
764 static char *smbb_bif[] = { "smbb-bif" };
767 .name = "smbb-bif",
777 .name = "smbb-usbin",
787 .name = "smbb-dcin",
801 rc = regmap_update_bits(chg->regmap, chg->addr + SMBB_USB_OTG_CTL, in smbb_chg_otg_enable()
804 dev_err(chg->dev, "failed to update OTG_CTL\n"); in smbb_chg_otg_enable()
813 rc = regmap_update_bits(chg->regmap, chg->addr + SMBB_USB_OTG_CTL, in smbb_chg_otg_disable()
816 dev_err(chg->dev, "failed to update OTG_CTL\n"); in smbb_chg_otg_disable()
826 rc = regmap_read(chg->regmap, chg->addr + SMBB_USB_OTG_CTL, &value); in smbb_chg_otg_is_enabled()
828 dev_err(chg->dev, "failed to read OTG_CTL\n"); in smbb_chg_otg_is_enabled()
848 chg = devm_kzalloc(&pdev->dev, sizeof(*chg), GFP_KERNEL); in smbb_charger_probe()
850 return -ENOMEM; in smbb_charger_probe()
852 chg->dev = &pdev->dev; in smbb_charger_probe()
853 mutex_init(&chg->statlock); in smbb_charger_probe()
855 chg->regmap = dev_get_regmap(pdev->dev.parent, NULL); in smbb_charger_probe()
856 if (!chg->regmap) { in smbb_charger_probe()
857 dev_err(&pdev->dev, "failed to locate regmap\n"); in smbb_charger_probe()
858 return -ENODEV; in smbb_charger_probe()
861 rc = of_property_read_u32(pdev->dev.of_node, "reg", &chg->addr); in smbb_charger_probe()
863 dev_err(&pdev->dev, "missing or invalid 'reg' property\n"); in smbb_charger_probe()
867 rc = regmap_read(chg->regmap, chg->addr + SMBB_MISC_REV2, &chg->revision); in smbb_charger_probe()
869 dev_err(&pdev->dev, "unable to read revision\n"); in smbb_charger_probe()
873 chg->revision += 1; in smbb_charger_probe()
874 if (chg->revision != 2 && chg->revision != 3) { in smbb_charger_probe()
875 dev_err(&pdev->dev, "v1 hardware not supported\n"); in smbb_charger_probe()
876 return -ENODEV; in smbb_charger_probe()
878 dev_info(&pdev->dev, "Initializing SMBB rev %u", chg->revision); in smbb_charger_probe()
880 chg->dc_disabled = of_property_read_bool(pdev->dev.of_node, "qcom,disable-dc"); in smbb_charger_probe()
885 dev_err(&pdev->dev, "failed to parse/apply settings\n"); in smbb_charger_probe()
891 bat_cfg.of_node = pdev->dev.of_node; in smbb_charger_probe()
892 chg->bat_psy = devm_power_supply_register(&pdev->dev, in smbb_charger_probe()
895 if (IS_ERR(chg->bat_psy)) { in smbb_charger_probe()
896 dev_err(&pdev->dev, "failed to register battery\n"); in smbb_charger_probe()
897 return PTR_ERR(chg->bat_psy); in smbb_charger_probe()
903 chg->usb_psy = devm_power_supply_register(&pdev->dev, in smbb_charger_probe()
906 if (IS_ERR(chg->usb_psy)) { in smbb_charger_probe()
907 dev_err(&pdev->dev, "failed to register USB power supply\n"); in smbb_charger_probe()
908 return PTR_ERR(chg->usb_psy); in smbb_charger_probe()
911 chg->edev = devm_extcon_dev_allocate(&pdev->dev, smbb_usb_extcon_cable); in smbb_charger_probe()
912 if (IS_ERR(chg->edev)) { in smbb_charger_probe()
913 dev_err(&pdev->dev, "failed to allocate extcon device\n"); in smbb_charger_probe()
914 return -ENOMEM; in smbb_charger_probe()
917 rc = devm_extcon_dev_register(&pdev->dev, chg->edev); in smbb_charger_probe()
919 dev_err(&pdev->dev, "failed to register extcon device\n"); in smbb_charger_probe()
923 if (!chg->dc_disabled) { in smbb_charger_probe()
927 chg->dc_psy = devm_power_supply_register(&pdev->dev, in smbb_charger_probe()
930 if (IS_ERR(chg->dc_psy)) { in smbb_charger_probe()
931 dev_err(&pdev->dev, "failed to register DC power supply\n"); in smbb_charger_probe()
932 return PTR_ERR(chg->dc_psy); in smbb_charger_probe()
941 dev_err(&pdev->dev, "failed to get irq '%s'\n", in smbb_charger_probe()
948 rc = devm_request_threaded_irq(&pdev->dev, irq, NULL, in smbb_charger_probe()
952 dev_err(&pdev->dev, "failed to request irq '%s'\n", in smbb_charger_probe()
962 chg->otg_rdesc.id = -1; in smbb_charger_probe()
963 chg->otg_rdesc.name = "otg-vbus"; in smbb_charger_probe()
964 chg->otg_rdesc.ops = &smbb_chg_otg_ops; in smbb_charger_probe()
965 chg->otg_rdesc.owner = THIS_MODULE; in smbb_charger_probe()
966 chg->otg_rdesc.type = REGULATOR_VOLTAGE; in smbb_charger_probe()
967 chg->otg_rdesc.supply_name = "usb-otg-in"; in smbb_charger_probe()
968 chg->otg_rdesc.of_match = "otg-vbus"; in smbb_charger_probe()
970 config.dev = &pdev->dev; in smbb_charger_probe()
973 chg->otg_reg = devm_regulator_register(&pdev->dev, &chg->otg_rdesc, in smbb_charger_probe()
975 if (IS_ERR(chg->otg_reg)) in smbb_charger_probe()
976 return PTR_ERR(chg->otg_reg); in smbb_charger_probe()
978 chg->jeita_ext_temp = of_property_read_bool(pdev->dev.of_node, in smbb_charger_probe()
979 "qcom,jeita-extended-temp-range"); in smbb_charger_probe()
982 rc = regmap_update_bits(chg->regmap, chg->addr + SMBB_BAT_BTC_CTRL, in smbb_charger_probe()
984 chg->jeita_ext_temp ? in smbb_charger_probe()
988 dev_err(&pdev->dev, in smbb_charger_probe()
990 chg->jeita_ext_temp ? "JEITA extended" : "normal"); in smbb_charger_probe()
997 if (r->rev_mask & BIT(chg->revision)) in smbb_charger_probe()
1000 rc = regmap_update_bits(chg->regmap, chg->addr + r->offset, in smbb_charger_probe()
1001 r->mask, r->value); in smbb_charger_probe()
1003 dev_err(&pdev->dev, in smbb_charger_probe()
1020 regmap_update_bits(chg->regmap, chg->addr + SMBB_CHG_CTRL, CTRL_EN, 0); in smbb_charger_remove()
1026 { .compatible = "qcom,pm8941-charger" },
1035 .name = "qcom-smbb",
1041 MODULE_DESCRIPTION("Qualcomm Switch-Mode Battery Charger and Boost driver");