Skip to content

Commit 8ed6b88

Browse files
Dzmitry Sankouskisre
authored andcommitted
power: supply: max77705_charger: implement aicl feature
Adaptive input current allows charger to reduce it's current consumption, when source is not able to provide enough power. Signed-off-by: Dzmitry Sankouski <dsankouski@gmail.com> Link: https://patch.msgid.link/20250925-max77705_77976_charger_improvement-v6-1-972c716c17d1@gmail.com Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
1 parent b838cec commit 8ed6b88

2 files changed

Lines changed: 44 additions & 0 deletions

File tree

drivers/power/supply/max77705_charger.c

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,39 @@ static enum power_supply_property max77705_charger_props[] = {
4040
POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
4141
};
4242

43+
static irqreturn_t max77705_aicl_irq(int irq, void *irq_drv_data)
44+
{
45+
struct max77705_charger_data *chg = irq_drv_data;
46+
unsigned int regval, irq_status;
47+
int err;
48+
49+
err = regmap_read(chg->regmap, MAX77705_CHG_REG_INT_OK, &irq_status);
50+
if (err < 0)
51+
return IRQ_HANDLED;
52+
53+
// irq is fiered at the end of current decrease sequence too
54+
// early check AICL_I bit to guard against that excess irq call
55+
while (!(irq_status & BIT(MAX77705_AICL_I))) {
56+
err = regmap_field_read(chg->rfield[MAX77705_CHG_CHGIN_LIM], &regval);
57+
if (err < 0)
58+
return IRQ_HANDLED;
59+
60+
regval--;
61+
62+
err = regmap_field_write(chg->rfield[MAX77705_CHG_CHGIN_LIM], regval);
63+
if (err < 0)
64+
return IRQ_HANDLED;
65+
66+
msleep(AICL_WORK_DELAY_MS);
67+
68+
err = regmap_read(chg->regmap, MAX77705_CHG_REG_INT_OK, &irq_status);
69+
if (err < 0)
70+
return IRQ_HANDLED;
71+
}
72+
73+
return IRQ_HANDLED;
74+
}
75+
4376
static irqreturn_t max77705_chgin_irq(int irq, void *irq_drv_data)
4477
{
4578
struct max77705_charger_data *chg = irq_drv_data;
@@ -632,6 +665,15 @@ static int max77705_charger_probe(struct i2c_client *i2c)
632665
goto destroy_wq;
633666
}
634667

668+
ret = devm_request_threaded_irq(dev, regmap_irq_get_virq(irq_data, MAX77705_AICL_I),
669+
NULL, max77705_aicl_irq,
670+
IRQF_TRIGGER_NONE,
671+
"aicl-irq", chg);
672+
if (ret) {
673+
dev_err_probe(dev, ret, "Failed to Request aicl IRQ\n");
674+
goto destroy_wq;
675+
}
676+
635677
ret = max77705_charger_enable(chg);
636678
if (ret) {
637679
dev_err_probe(dev, ret, "failed to enable charge\n");

include/linux/power/max77705_charger.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,8 @@
123123
#define MAX77705_DISABLE_SKIP 1
124124
#define MAX77705_AUTO_SKIP 0
125125

126+
#define AICL_WORK_DELAY_MS 100
127+
126128
/* uA */
127129
#define MAX77705_CURRENT_CHGIN_STEP 25000
128130
#define MAX77705_CURRENT_CHG_STEP 50000

0 commit comments

Comments
 (0)