Re: [PATCH 0/2] platform/x86: ideapad-laptop: Add charge_types:Fast (Rapid Charge)
From: Jelle van der Waa
Date: Mon Nov 03 2025 - 16:31:44 EST
On 11/2/25 20:24, Rong Zhang wrote:
On Mon, 2025-11-03 at 02:57 +0800, Rong Zhang wrote:
Hi Jelle,
On Sun, 2025-11-02 at 17:09 +0100, Jelle van der Waa wrote:
On 10/20/25 21:24, Rong Zhang wrote:
The GBMD/SBMC interface on IdeaPad/ThinkBook supports Rapid Charge mode
(charge_types: Fast) in addition to Conservation Mode (charge_types:
Long_Life).
This patchset exposes these two modes while carefully maintaining their
mutually exclusive state, which aligns with the behavior of manufacturer
utilities on Windows.
Tested on ThinkBook 14 G7+ ASP.
Tested this patch on my Lenovo Ideapad U330p, it now advertises that
`Fast` is a supported charge_type although my laptop does not seem to
support it:
[root@archlinux jelle]# cat /sys/class/power_supply/BAT1/charge_types
Fast [Standard] Long_Life
[root@archlinux jelle]# echo 'Fast' >
/sys/class/power_supply/BAT1/charge_types
[root@archlinux jelle]# cat /sys/class/power_supply/BAT1/charge_types
Fast [Standard] Long_Life
Ahh, then we need an approach to determine if it is supported on a
specific device.
Glancing at the disassembled DSDT.dsl of my device, I found:
Method (GBMD, 0, NotSerialized)
{
[...]
If ((One == QCGS))
{
Local0 |= 0x00020000
}
[...]
}
BIT(17) of GBMD is 1 on my device. Maybe QCGS means "Quick CharGe
Supported?"
With this assumption, I did some random Internet digging. The same bit
on other devices is called QKSP ("QuicK charge SuPported?"), SQCG
("Support Quick CharGe?"), or QCBX (see below).
Method (GBMD, 0, NotSerialized)
{
[...]
If ((One == QCBX))
{
If ((One == QCHO))
{
Local0 |= 0x04
}
}
[...]
If ((One == QCBX))
{
Local0 |= 0x00020000
}
[...]
}
https://badland.io/static/acpidump.txt
0x04 is BIT(2)/GBMD_RAPID_CHARGE_STATE_BIT. With all these pieces of
information, I presume BIT(17) of GBMD is what we are searching for.
I'm wondering if the battery extension API allows to not advertise a
property if it isn't supported or if it should at least return -EINVAL.
We can achieve this by defining multiple struct power_supply_ext. See
drivers/power/supply/cros_charge-control.c.
Could you test the patch below (based on "review-ilpo-next")?
Note: this patch is just a quick PoC (I am going to sleep now, zzz...).
ideapad_psy_ext_{get,set}_prop need to be reorganized to properly
support your device. If `cat charge_types' doesn't show `Fast', we're
in the right direction.
Thanks for the quick patch!
Tested it on my Ideapad U330p:
[root@archlinux ~]# cat /sys/class/power_supply/BAT1/charge_types
[Standard] Long_Life
[root@archlinux ~]# echo Long_Life > /sys/class/power_supply/BAT1/charge_types
[root@archlinux ~]# cat /sys/class/power_supply/BAT1/charge_types
Standard [Long_Life]
I'm however still waiting on the laptop to slowly charge to 80% to confirm that charge limits are applied.
Greetings,
Jelle van der Waa