Lines Matching +full:chg +full:- +full:int

1 // SPDX-License-Identifier: GPL-2.0
6 // Battery charger driver for MAXIM 77650/77651 charger/power-supply.
28 /* Charger is in fast-charge constant current mode. */
30 /* Charger is in JEITA modified fast-charge constant-current mode. */
32 /* Charger is in fast-charge constant-voltage mode. */
34 /* Charger is in JEITA modified fast-charge constant-voltage mode. */
36 /* Charger is in top-off mode. */
38 /* Charger is in JEITA modified top-off mode. */
46 /* Charger is suspended due to a fast-charge timer fault. */
80 static const unsigned int max77650_charger_vchgin_min_table[] = {
84 static const unsigned int max77650_charger_ichgin_lim_table[] = {
88 static int max77650_charger_set_vchgin_min(struct max77650_charger_data *chg, in max77650_charger_set_vchgin_min() argument
89 unsigned int val) in max77650_charger_set_vchgin_min()
91 int i, rv; in max77650_charger_set_vchgin_min()
95 rv = regmap_update_bits(chg->map, in max77650_charger_set_vchgin_min()
106 return -EINVAL; in max77650_charger_set_vchgin_min()
109 static int max77650_charger_set_ichgin_lim(struct max77650_charger_data *chg, in max77650_charger_set_ichgin_lim() argument
110 unsigned int val) in max77650_charger_set_ichgin_lim()
112 int i, rv; in max77650_charger_set_ichgin_lim()
116 rv = regmap_update_bits(chg->map, in max77650_charger_set_ichgin_lim()
127 return -EINVAL; in max77650_charger_set_ichgin_lim()
130 static int max77650_charger_enable(struct max77650_charger_data *chg) in max77650_charger_enable() argument
132 int rv; in max77650_charger_enable()
134 rv = regmap_update_bits(chg->map, in max77650_charger_enable()
139 dev_err(chg->dev, "unable to enable the charger: %d\n", rv); in max77650_charger_enable()
144 static void max77650_charger_disable(struct max77650_charger_data *chg) in max77650_charger_disable() argument
146 int rv; in max77650_charger_disable()
148 rv = regmap_update_bits(chg->map, in max77650_charger_disable()
153 dev_err(chg->dev, "unable to disable the charger: %d\n", rv); in max77650_charger_disable()
156 static irqreturn_t max77650_charger_check_status(int irq, void *data) in max77650_charger_check_status()
158 struct max77650_charger_data *chg = data; in max77650_charger_check_status() local
159 int rv, reg; in max77650_charger_check_status()
161 rv = regmap_read(chg->map, MAX77650_REG_STAT_CHG_B, &reg); in max77650_charger_check_status()
163 dev_err(chg->dev, in max77650_charger_check_status()
170 dev_err(chg->dev, "undervoltage lockout detected, disabling charger\n"); in max77650_charger_check_status()
171 max77650_charger_disable(chg); in max77650_charger_check_status()
174 dev_err(chg->dev, "overvoltage lockout detected, disabling charger\n"); in max77650_charger_check_status()
175 max77650_charger_disable(chg); in max77650_charger_check_status()
178 max77650_charger_enable(chg); in max77650_charger_check_status()
181 /* May be 0x10 - debouncing */ in max77650_charger_check_status()
188 static int max77650_charger_get_property(struct power_supply *psy, in max77650_charger_get_property()
192 struct max77650_charger_data *chg = power_supply_get_drvdata(psy); in max77650_charger_get_property() local
193 int rv, reg; in max77650_charger_get_property()
197 rv = regmap_read(chg->map, MAX77650_REG_STAT_CHG_B, &reg); in max77650_charger_get_property()
202 val->intval = POWER_SUPPLY_STATUS_CHARGING; in max77650_charger_get_property()
211 val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING; in max77650_charger_get_property()
220 val->intval = POWER_SUPPLY_STATUS_CHARGING; in max77650_charger_get_property()
223 val->intval = POWER_SUPPLY_STATUS_FULL; in max77650_charger_get_property()
226 val->intval = POWER_SUPPLY_STATUS_UNKNOWN; in max77650_charger_get_property()
230 rv = regmap_read(chg->map, MAX77650_REG_STAT_CHG_B, &reg); in max77650_charger_get_property()
234 val->intval = MAX77650_CHARGER_CHG_CHARGING(reg); in max77650_charger_get_property()
237 rv = regmap_read(chg->map, MAX77650_REG_STAT_CHG_B, &reg); in max77650_charger_get_property()
242 val->intval = POWER_SUPPLY_CHARGE_TYPE_NONE; in max77650_charger_get_property()
252 val->intval = POWER_SUPPLY_CHARGE_TYPE_FAST; in max77650_charger_get_property()
256 val->intval = POWER_SUPPLY_CHARGE_TYPE_TRICKLE; in max77650_charger_get_property()
259 val->intval = POWER_SUPPLY_CHARGE_TYPE_UNKNOWN; in max77650_charger_get_property()
263 return -EINVAL; in max77650_charger_get_property()
277 static int max77650_charger_probe(struct platform_device *pdev) in max77650_charger_probe()
280 struct max77650_charger_data *chg; in max77650_charger_probe() local
283 int rv, chg_irq, chgin_irq; in max77650_charger_probe()
284 unsigned int prop; in max77650_charger_probe()
286 dev = &pdev->dev; in max77650_charger_probe()
287 parent = dev->parent; in max77650_charger_probe()
289 chg = devm_kzalloc(dev, sizeof(*chg), GFP_KERNEL); in max77650_charger_probe()
290 if (!chg) in max77650_charger_probe()
291 return -ENOMEM; in max77650_charger_probe()
293 platform_set_drvdata(pdev, chg); in max77650_charger_probe()
295 chg->map = dev_get_regmap(parent, NULL); in max77650_charger_probe()
296 if (!chg->map) in max77650_charger_probe()
297 return -ENODEV; in max77650_charger_probe()
299 chg->dev = dev; in max77650_charger_probe()
301 pscfg.of_node = dev->of_node; in max77650_charger_probe()
302 pscfg.drv_data = chg; in max77650_charger_probe()
304 chg_irq = platform_get_irq_byname(pdev, "CHG"); in max77650_charger_probe()
314 IRQF_ONESHOT, "chg", chg); in max77650_charger_probe()
320 IRQF_ONESHOT, "chgin", chg); in max77650_charger_probe()
329 rv = of_property_read_u32(dev->of_node, in max77650_charger_probe()
330 "input-voltage-min-microvolt", &prop); in max77650_charger_probe()
332 rv = max77650_charger_set_vchgin_min(chg, prop); in max77650_charger_probe()
337 rv = of_property_read_u32(dev->of_node, in max77650_charger_probe()
338 "input-current-limit-microamp", &prop); in max77650_charger_probe()
340 rv = max77650_charger_set_ichgin_lim(chg, prop); in max77650_charger_probe()
345 return max77650_charger_enable(chg); in max77650_charger_probe()
350 struct max77650_charger_data *chg = platform_get_drvdata(pdev); in max77650_charger_remove() local
352 max77650_charger_disable(chg); in max77650_charger_remove()
356 { .compatible = "maxim,max77650-charger" },
363 .name = "max77650-charger",
374 MODULE_ALIAS("platform:max77650-charger");