ACPI: TAD: Support RTC without wakeup

The ACPI TAD can provide a functional RTC without wakeup capabilities,
so stop failing probe if AC wakeup is not supported.

Also, if _PRW is missing, do not fail probe, but clear the wakeup bits
in capabilities.

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Link: https://patch.msgid.link/1959268.tdWV9SEqCh@rafael.j.wysocki
This commit is contained in:
Rafael J. Wysocki 2026-03-04 19:13:15 +01:00
parent 8be4a29b49
commit 6c711fde3a

View File

@ -546,8 +546,9 @@ static umode_t acpi_tad_attr_is_visible(struct kobject *kobj,
if (a == &dev_attr_caps.attr)
return a->mode;
if (a == &dev_attr_ac_alarm.attr || a == &dev_attr_ac_policy.attr ||
a == &dev_attr_ac_status.attr)
if ((dd->capabilities & ACPI_TAD_AC_WAKE) &&
(a == &dev_attr_ac_alarm.attr || a == &dev_attr_ac_policy.attr ||
a == &dev_attr_ac_status.attr))
return a->mode;
if ((dd->capabilities & ACPI_TAD_DC_WAKE) &&
@ -581,8 +582,10 @@ static void acpi_tad_remove(struct platform_device *pdev)
sysfs_remove_group(&dev->kobj, &acpi_tad_attr_group);
scoped_guard(pm_runtime_noresume, dev) {
acpi_tad_disable_timer(dev, ACPI_TAD_AC_TIMER);
acpi_tad_clear_status(dev, ACPI_TAD_AC_TIMER);
if (dd->capabilities & ACPI_TAD_AC_WAKE) {
acpi_tad_disable_timer(dev, ACPI_TAD_AC_TIMER);
acpi_tad_clear_status(dev, ACPI_TAD_AC_TIMER);
}
if (dd->capabilities & ACPI_TAD_DC_WAKE) {
acpi_tad_disable_timer(dev, ACPI_TAD_DC_TIMER);
acpi_tad_clear_status(dev, ACPI_TAD_DC_TIMER);
@ -612,14 +615,9 @@ static int acpi_tad_probe(struct platform_device *pdev)
return -ENODEV;
}
if (!(caps & ACPI_TAD_AC_WAKE)) {
dev_info(dev, "Unsupported capabilities\n");
return -ENODEV;
}
if (!acpi_has_method(handle, "_PRW")) {
dev_info(dev, "Missing _PRW\n");
return -ENODEV;
caps &= ~(ACPI_TAD_AC_WAKE | ACPI_TAD_DC_WAKE);
}
dd = devm_kzalloc(dev, sizeof(*dd), GFP_KERNEL);
@ -635,9 +633,11 @@ static int acpi_tad_probe(struct platform_device *pdev)
* runtime suspend. Everything else should be taken care of by the ACPI
* PM domain callbacks.
*/
device_init_wakeup(dev, true);
dev_pm_set_driver_flags(dev, DPM_FLAG_SMART_SUSPEND |
DPM_FLAG_MAY_SKIP_RESUME);
if (ACPI_TAD_AC_WAKE | ACPI_TAD_DC_WAKE) {
device_init_wakeup(dev, true);
dev_pm_set_driver_flags(dev, DPM_FLAG_SMART_SUSPEND |
DPM_FLAG_MAY_SKIP_RESUME);
}
/*
* The platform bus type layer tells the ACPI PM domain powers up the