rtc: cmos: Honor explicit use_acpi_alarm parameter value

An explicit rtc_cmos.use_acpi_alarm=0 command-line argument is ignored
on systems where use_acpi_alarm_quirks() enables ACPI RTC alarms. The
argument appears in /proc/cmdline, but the read-only parameter reports Y.

The boolean parameter defaults to false, so the driver cannot distinguish
an omitted argument from an explicit false value. Use a custom setter to
record whether parsing occurred and skip automatic selection when it did.
Preserve the bool parameter type metadata. Automatic selection remains
unchanged when the parameter is omitted.

On the affected system, the explicit false value reports N after this
change. The HPET-emulated path completed 100 test runs without a failure
while the ACPI RTC event counter remained at zero.

Fixes: 36d91a4d40 ("rtc: cmos: introduce quirks to enable use_acpi_alarm mode")
Cc: stable@vger.kernel.org
Signed-off-by: Gregory Price (Meta) <gourry@gourry.net>
Link: https://patch.msgid.link/20261015173029.3091872-3-gourry@gourry.net
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
This commit is contained in:
Gregory Price 2026-10-15 13:30:29 -04:00 committed by Alexandre Belloni
parent 3f67038df8
commit 3c7acb209e

View File

@ -57,7 +57,28 @@
*/
static bool use_acpi_alarm;
module_param(use_acpi_alarm, bool, 0444);
static bool use_acpi_alarm_explicit;
static int set_use_acpi_alarm(const char *val, const struct kernel_param *kp)
{
int ret;
ret = param_set_bool(val, kp);
if (!ret)
use_acpi_alarm_explicit = true;
return ret;
}
static const struct kernel_param_ops use_acpi_alarm_ops = {
.flags = KERNEL_PARAM_OPS_FL_NOARG,
.set = set_use_acpi_alarm,
.get = param_get_bool,
};
param_check_bool(use_acpi_alarm, &use_acpi_alarm);
module_param_cb(use_acpi_alarm, &use_acpi_alarm_ops, &use_acpi_alarm, 0444);
__MODULE_PARM_TYPE(use_acpi_alarm, "bool");
static inline int cmos_use_acpi_alarm(void)
{
@ -822,6 +843,9 @@ static void rtc_wake_off(struct device *dev)
#ifdef CONFIG_X86
static void use_acpi_alarm_quirks(void)
{
if (use_acpi_alarm_explicit)
return;
if (acpi_gbl_FADT.flags & ACPI_FADT_FIXED_RTC)
return;