Lines Matching +full:chg +full:- +full:int
1 // SPDX-License-Identifier: GPL-2.0-only
15 #include <linux/extcon-provider.h>
63 unsigned int reg[4];
65 unsigned int charge_voltage_max;
66 unsigned int charge_voltage_safe;
67 unsigned int charge_current_max;
68 unsigned int charge_current_safe;
71 static const unsigned int pm8916_lbc_charger_cable[] = {
83 static int pm8916_lbc_charger_configure(struct pm8916_lbc_charger *chg) in pm8916_lbc_charger_configure() argument
85 int ret = 0; in pm8916_lbc_charger_configure()
86 unsigned int tmp; in pm8916_lbc_charger_configure()
88 chg->charge_voltage_max = clamp_t(u32, chg->charge_voltage_max, in pm8916_lbc_charger_configure()
89 PM8916_LBC_CHGR_MIN_VOLTAGE, chg->charge_voltage_safe); in pm8916_lbc_charger_configure()
91 tmp = chg->charge_voltage_max - PM8916_LBC_CHGR_MIN_VOLTAGE; in pm8916_lbc_charger_configure()
93 chg->charge_voltage_max = PM8916_LBC_CHGR_MIN_VOLTAGE + tmp * PM8916_LBC_CHGR_VOLTAGE_STEP; in pm8916_lbc_charger_configure()
95 ret = regmap_write(chg->regmap, chg->reg[LBC_CHGR] + PM8916_LBC_CHGR_VDD_MAX, tmp); in pm8916_lbc_charger_configure()
99 chg->charge_current_max = min(chg->charge_current_max, chg->charge_current_safe); in pm8916_lbc_charger_configure()
101 tmp = clamp_t(u32, chg->charge_current_max, in pm8916_lbc_charger_configure()
104 tmp = chg->charge_current_max / PM8916_LBC_CHGR_MIN_CURRENT - 1; in pm8916_lbc_charger_configure()
105 chg->charge_current_max = (tmp + 1) * PM8916_LBC_CHGR_MIN_CURRENT; in pm8916_lbc_charger_configure()
107 ret = regmap_write(chg->regmap, chg->reg[LBC_CHGR] + PM8916_LBC_CHGR_IBAT_MAX, tmp); in pm8916_lbc_charger_configure()
111 ret = regmap_write(chg->regmap, chg->reg[LBC_CHGR] + PM8916_LBC_CHGR_CHG_CTRL, in pm8916_lbc_charger_configure()
119 dev_err(chg->dev, "Failed to configure charging: %pe\n", ERR_PTR(ret)); in pm8916_lbc_charger_configure()
123 static int pm8916_lbc_charger_get_property(struct power_supply *psy, in pm8916_lbc_charger_get_property()
127 struct pm8916_lbc_charger *chg = power_supply_get_drvdata(psy); in pm8916_lbc_charger_get_property() local
131 val->intval = chg->online; in pm8916_lbc_charger_get_property()
135 val->intval = chg->charge_voltage_max; in pm8916_lbc_charger_get_property()
139 val->intval = chg->charge_current_max; in pm8916_lbc_charger_get_property()
143 return -EINVAL; in pm8916_lbc_charger_get_property()
147 static int pm8916_lbc_charger_set_property(struct power_supply *psy, in pm8916_lbc_charger_set_property()
151 struct pm8916_lbc_charger *chg = power_supply_get_drvdata(psy); in pm8916_lbc_charger_set_property() local
155 chg->charge_current_max = val->intval; in pm8916_lbc_charger_set_property()
156 return pm8916_lbc_charger_configure(chg); in pm8916_lbc_charger_set_property()
158 return -EINVAL; in pm8916_lbc_charger_set_property()
162 static int pm8916_lbc_charger_property_is_writeable(struct power_supply *psy, in pm8916_lbc_charger_property_is_writeable()
179 static irqreturn_t pm8916_lbc_charger_state_changed_irq(int irq, void *data) in pm8916_lbc_charger_state_changed_irq()
181 struct pm8916_lbc_charger *chg = data; in pm8916_lbc_charger_state_changed_irq() local
182 unsigned int tmp; in pm8916_lbc_charger_state_changed_irq()
183 int ret; in pm8916_lbc_charger_state_changed_irq()
185 ret = regmap_read(chg->regmap, chg->reg[LBC_USB] + PM8916_INT_RT_STS, &tmp); in pm8916_lbc_charger_state_changed_irq()
189 chg->online = !!(tmp & PM8916_LBC_USB_USBIN_VALID); in pm8916_lbc_charger_state_changed_irq()
190 extcon_set_state_sync(chg->edev, EXTCON_USB, chg->online); in pm8916_lbc_charger_state_changed_irq()
192 power_supply_changed(chg->charger); in pm8916_lbc_charger_state_changed_irq()
197 static int pm8916_lbc_charger_probe_dt(struct pm8916_lbc_charger *chg) in pm8916_lbc_charger_probe_dt() argument
199 struct device *dev = chg->dev; in pm8916_lbc_charger_probe_dt()
200 int ret = 0; in pm8916_lbc_charger_probe_dt()
201 unsigned int tmp; in pm8916_lbc_charger_probe_dt()
203 ret = device_property_read_u32(dev, "qcom,fast-charge-safe-voltage", &chg->charge_voltage_safe); in pm8916_lbc_charger_probe_dt()
206 if (chg->charge_voltage_safe < PM8916_LBC_CHGR_MIN_VOLTAGE) in pm8916_lbc_charger_probe_dt()
207 return -EINVAL; in pm8916_lbc_charger_probe_dt()
209 chg->charge_voltage_safe = clamp_t(u32, chg->charge_voltage_safe, in pm8916_lbc_charger_probe_dt()
212 tmp = chg->charge_voltage_safe - PM8916_LBC_CHGR_MIN_VOLTAGE; in pm8916_lbc_charger_probe_dt()
214 ret = regmap_write(chg->regmap, chg->reg[LBC_CHGR] + PM8916_LBC_CHGR_VDD_SAFE, tmp); in pm8916_lbc_charger_probe_dt()
218 ret = device_property_read_u32(dev, "qcom,fast-charge-safe-current", &chg->charge_current_safe); in pm8916_lbc_charger_probe_dt()
221 if (chg->charge_current_safe < PM8916_LBC_CHGR_MIN_CURRENT) in pm8916_lbc_charger_probe_dt()
222 return -EINVAL; in pm8916_lbc_charger_probe_dt()
224 chg->charge_current_safe = clamp_t(u32, chg->charge_current_safe, in pm8916_lbc_charger_probe_dt()
227 chg->charge_current_max = chg->charge_current_safe; in pm8916_lbc_charger_probe_dt()
229 tmp = chg->charge_current_safe / PM8916_LBC_CHGR_MIN_CURRENT - 1; in pm8916_lbc_charger_probe_dt()
230 ret = regmap_write(chg->regmap, chg->reg[LBC_CHGR] + PM8916_LBC_CHGR_IBAT_SAFE, tmp); in pm8916_lbc_charger_probe_dt()
235 ret = regmap_write(chg->regmap, chg->reg[LBC_CHGR] + PM8916_LBC_CHGR_TCHG_MAX_EN, 0x00); in pm8916_lbc_charger_probe_dt()
243 .name = "pm8916-lbc-chgr",
252 static int pm8916_lbc_charger_probe(struct platform_device *pdev) in pm8916_lbc_charger_probe()
254 struct device *dev = &pdev->dev; in pm8916_lbc_charger_probe()
255 struct pm8916_lbc_charger *chg; in pm8916_lbc_charger_probe() local
257 int ret, len, irq; in pm8916_lbc_charger_probe()
258 unsigned int tmp; in pm8916_lbc_charger_probe()
260 chg = devm_kzalloc(dev, sizeof(*chg), GFP_KERNEL); in pm8916_lbc_charger_probe()
261 if (!chg) in pm8916_lbc_charger_probe()
262 return -ENOMEM; in pm8916_lbc_charger_probe()
264 chg->dev = dev; in pm8916_lbc_charger_probe()
266 chg->regmap = dev_get_regmap(pdev->dev.parent, NULL); in pm8916_lbc_charger_probe()
267 if (!chg->regmap) in pm8916_lbc_charger_probe()
268 return -ENODEV; in pm8916_lbc_charger_probe()
274 return dev_err_probe(dev, -EINVAL, in pm8916_lbc_charger_probe()
282 IRQF_ONESHOT, "pm8916_lbc", chg); in pm8916_lbc_charger_probe()
286 ret = device_property_read_u32_array(dev, "reg", chg->reg, len); in pm8916_lbc_charger_probe()
290 ret = regmap_bulk_read(chg->regmap, chg->reg[LBC_CHGR] + PM8916_PERPH_TYPE, &tmp, 2); in pm8916_lbc_charger_probe()
296 ret = regmap_bulk_read(chg->regmap, chg->reg[LBC_BAT_IF] + PM8916_PERPH_TYPE, &tmp, 2); in pm8916_lbc_charger_probe()
302 ret = regmap_bulk_read(chg->regmap, chg->reg[LBC_USB] + PM8916_PERPH_TYPE, &tmp, 2); in pm8916_lbc_charger_probe()
308 ret = regmap_bulk_read(chg->regmap, chg->reg[LBC_MISC] + PM8916_PERPH_TYPE, &tmp, 2); in pm8916_lbc_charger_probe()
314 ret = regmap_read(chg->regmap, chg->reg[LBC_CHGR] + PM8916_LBC_CHGR_CHG_OPTION, &tmp); in pm8916_lbc_charger_probe()
318 dev_err_probe(dev, -ENODEV, "The system is using an external charger\n"); in pm8916_lbc_charger_probe()
320 ret = pm8916_lbc_charger_probe_dt(chg); in pm8916_lbc_charger_probe()
324 psy_cfg.drv_data = chg; in pm8916_lbc_charger_probe()
325 psy_cfg.of_node = dev->of_node; in pm8916_lbc_charger_probe()
327 chg->charger = devm_power_supply_register(dev, &pm8916_lbc_charger_psy_desc, &psy_cfg); in pm8916_lbc_charger_probe()
328 if (IS_ERR(chg->charger)) in pm8916_lbc_charger_probe()
329 return dev_err_probe(dev, PTR_ERR(chg->charger), "Unable to register charger\n"); in pm8916_lbc_charger_probe()
331 ret = power_supply_get_battery_info(chg->charger, &chg->info); in pm8916_lbc_charger_probe()
335 chg->edev = devm_extcon_dev_allocate(dev, pm8916_lbc_charger_cable); in pm8916_lbc_charger_probe()
336 if (IS_ERR(chg->edev)) in pm8916_lbc_charger_probe()
337 return PTR_ERR(chg->edev); in pm8916_lbc_charger_probe()
339 ret = devm_extcon_dev_register(dev, chg->edev); in pm8916_lbc_charger_probe()
343 ret = regmap_read(chg->regmap, chg->reg[LBC_USB] + PM8916_INT_RT_STS, &tmp); in pm8916_lbc_charger_probe()
347 chg->online = !!(tmp & PM8916_LBC_USB_USBIN_VALID); in pm8916_lbc_charger_probe()
348 extcon_set_state_sync(chg->edev, EXTCON_USB, chg->online); in pm8916_lbc_charger_probe()
350 chg->charge_voltage_max = chg->info->voltage_max_design_uv; in pm8916_lbc_charger_probe()
351 ret = pm8916_lbc_charger_configure(chg); in pm8916_lbc_charger_probe()
361 return dev_err_probe(dev, -ENODEV, "Device reported wrong type: 0x%X\n", tmp); in pm8916_lbc_charger_probe()
365 { .compatible = "qcom,pm8916-lbc", },
372 .name = "pm8916-lbc",