Lines Matching +full:pm8916 +full:- +full:bms +full:- +full:vm
1 // SPDX-License-Identifier: GPL-2.0-only
63 struct power_supply_battery_info *info = bat->info; in pm8916_bms_vm_battery_get_property()
70 if (supplied < 0 && supplied != -ENODEV) in pm8916_bms_vm_battery_get_property()
72 else if (supplied && supplied != -ENODEV) in pm8916_bms_vm_battery_get_property()
73 val->intval = POWER_SUPPLY_STATUS_CHARGING; in pm8916_bms_vm_battery_get_property()
75 val->intval = POWER_SUPPLY_STATUS_DISCHARGING; in pm8916_bms_vm_battery_get_property()
79 if (bat->vbat_now < info->voltage_min_design_uv) in pm8916_bms_vm_battery_get_property()
80 val->intval = POWER_SUPPLY_HEALTH_DEAD; in pm8916_bms_vm_battery_get_property()
81 else if (bat->vbat_now > info->voltage_max_design_uv) in pm8916_bms_vm_battery_get_property()
82 val->intval = POWER_SUPPLY_HEALTH_OVERVOLTAGE; in pm8916_bms_vm_battery_get_property()
84 val->intval = POWER_SUPPLY_HEALTH_GOOD; in pm8916_bms_vm_battery_get_property()
88 val->intval = bat->vbat_now; in pm8916_bms_vm_battery_get_property()
96 if (ktime_get_seconds() - bat->last_ocv_time > 180) in pm8916_bms_vm_battery_get_property()
97 return -ENODATA; in pm8916_bms_vm_battery_get_property()
99 val->intval = bat->last_ocv; in pm8916_bms_vm_battery_get_property()
103 return -EINVAL; in pm8916_bms_vm_battery_get_property()
120 ret = regmap_bulk_read(bat->regmap, bat->reg + PM8916_BMS_VM_BMS_FIFO_REG_0_LSB, in pm8916_bms_vm_fifo_update_done_irq()
126 * The VM-BMS hardware only collects voltage data and the software in pm8916_bms_vm_fifo_update_done_irq()
133 bat->vbat_now = vbat_data[PM8916_BMS_VM_FIFO_COUNT - 1] * 300; in pm8916_bms_vm_fifo_update_done_irq()
135 power_supply_changed(bat->battery); in pm8916_bms_vm_fifo_update_done_irq()
141 .name = "pm8916-bms-vm",
150 struct device *dev = &pdev->dev; in pm8916_bms_vm_battery_probe()
158 return -ENOMEM; in pm8916_bms_vm_battery_probe()
160 bat->dev = dev; in pm8916_bms_vm_battery_probe()
162 bat->regmap = dev_get_regmap(pdev->dev.parent, NULL); in pm8916_bms_vm_battery_probe()
163 if (!bat->regmap) in pm8916_bms_vm_battery_probe()
164 return -ENODEV; in pm8916_bms_vm_battery_probe()
166 ret = device_property_read_u32(dev, "reg", &bat->reg); in pm8916_bms_vm_battery_probe()
168 return -EINVAL; in pm8916_bms_vm_battery_probe()
179 ret = regmap_bulk_read(bat->regmap, bat->reg + PM8916_PERPH_TYPE, &tmp, 2); in pm8916_bms_vm_battery_probe()
184 return dev_err_probe(dev, -ENODEV, "Device reported wrong type: 0x%X\n", tmp); in pm8916_bms_vm_battery_probe()
186 ret = regmap_write(bat->regmap, bat->reg + PM8916_BMS_VM_S1_SAMPLE_INTERVAL_CTL, in pm8916_bms_vm_battery_probe()
190 ret = regmap_write(bat->regmap, bat->reg + PM8916_BMS_VM_S2_SAMPLE_INTERVAL_CTL, in pm8916_bms_vm_battery_probe()
194 ret = regmap_write(bat->regmap, bat->reg + PM8916_BMS_VM_FIFO_LENGTH_CTL, in pm8916_bms_vm_battery_probe()
198 ret = regmap_write(bat->regmap, in pm8916_bms_vm_battery_probe()
199 bat->reg + PM8916_BMS_VM_EN_CTL, PM8916_BMS_ENABLED); in pm8916_bms_vm_battery_probe()
203 ret = regmap_bulk_read(bat->regmap, in pm8916_bms_vm_battery_probe()
204 bat->reg + PM8916_BMS_VM_S3_S7_OCV_DATA0, &tmp, 2); in pm8916_bms_vm_battery_probe()
208 bat->last_ocv_time = ktime_get_seconds(); in pm8916_bms_vm_battery_probe()
209 bat->last_ocv = tmp * 300; in pm8916_bms_vm_battery_probe()
210 bat->vbat_now = bat->last_ocv; in pm8916_bms_vm_battery_probe()
213 psy_cfg.of_node = dev->of_node; in pm8916_bms_vm_battery_probe()
215 bat->battery = devm_power_supply_register(dev, &pm8916_bms_vm_battery_psy_desc, &psy_cfg); in pm8916_bms_vm_battery_probe()
216 if (IS_ERR(bat->battery)) in pm8916_bms_vm_battery_probe()
217 return dev_err_probe(dev, PTR_ERR(bat->battery), "Unable to register battery\n"); in pm8916_bms_vm_battery_probe()
219 ret = power_supply_get_battery_info(bat->battery, &bat->info); in pm8916_bms_vm_battery_probe()
242 ret = regmap_write(bat->regmap, in pm8916_bms_vm_battery_suspend()
243 bat->reg + PM8916_SEC_ACCESS, PM8916_SEC_MAGIC); in pm8916_bms_vm_battery_suspend()
246 ret = regmap_write(bat->regmap, in pm8916_bms_vm_battery_suspend()
247 bat->reg + PM8916_BMS_VM_MODE_CTL, PM8916_BMS_VM_MODE_FORCE_S3); in pm8916_bms_vm_battery_suspend()
254 dev_err(bat->dev, "Failed to force S3 mode: %pe\n", ERR_PTR(ret)); in pm8916_bms_vm_battery_suspend()
264 ret = regmap_bulk_read(bat->regmap, in pm8916_bms_vm_battery_resume()
265 bat->reg + PM8916_BMS_VM_S3_S7_OCV_DATA0, &tmp, 2); in pm8916_bms_vm_battery_resume()
267 bat->last_ocv_time = ktime_get_seconds(); in pm8916_bms_vm_battery_resume()
268 bat->last_ocv = tmp * 300; in pm8916_bms_vm_battery_resume()
270 ret = regmap_write(bat->regmap, in pm8916_bms_vm_battery_resume()
271 bat->reg + PM8916_SEC_ACCESS, PM8916_SEC_MAGIC); in pm8916_bms_vm_battery_resume()
274 ret = regmap_write(bat->regmap, in pm8916_bms_vm_battery_resume()
275 bat->reg + PM8916_BMS_VM_MODE_CTL, PM8916_BMS_VM_MODE_NORMAL); in pm8916_bms_vm_battery_resume()
282 dev_err(bat->dev, "Failed to return normal mode: %pe\n", ERR_PTR(ret)); in pm8916_bms_vm_battery_resume()
287 { .compatible = "qcom,pm8916-bms-vm", },
294 .name = "pm8916-bms-vm",
303 MODULE_DESCRIPTION("pm8916 BMS-VM driver");