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