ACPI: GTDT: Generate platform devices for MMIO timers
authorMarc Zyngier <maz@kernel.org>
Thu, 14 Aug 2025 15:46:19 +0000 (16:46 +0100)
committerDaniel Lezcano <daniel.lezcano@linaro.org>
Tue, 23 Sep 2025 10:30:25 +0000 (12:30 +0200)
In preparation for the MMIO timer support code becoming an actual
driver, mimic what is done for the SBSA watchdog and expose
a synthetic device for each MMIO timer block.

Signed-off-by: Marc Zyngier <maz@kernel.org>
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Tested-by: Sudeep Holla <sudeep.holla@arm.com>
Reviewed-by: Sudeep Holla <sudeep.holla@arm.com>
Link: https://lore.kernel.org/r/20250807160243.1970533-2-maz@kernel.org
drivers/acpi/arm64/gtdt.c

index 70f8290..fd995a1 100644 (file)
@@ -388,11 +388,11 @@ static int __init gtdt_import_sbsa_gwdt(struct acpi_gtdt_watchdog *wd,
        return 0;
 }
 
-static int __init gtdt_sbsa_gwdt_init(void)
+static int __init gtdt_platform_timer_init(void)
 {
        void *platform_timer;
        struct acpi_table_header *table;
-       int ret, timer_count, gwdt_count = 0;
+       int ret, timer_count, gwdt_count = 0, mmio_timer_count = 0;
 
        if (acpi_disabled)
                return 0;
@@ -414,20 +414,41 @@ static int __init gtdt_sbsa_gwdt_init(void)
                goto out_put_gtdt;
 
        for_each_platform_timer(platform_timer) {
+               ret = 0;
+
                if (is_non_secure_watchdog(platform_timer)) {
                        ret = gtdt_import_sbsa_gwdt(platform_timer, gwdt_count);
                        if (ret)
-                               break;
+                               continue;
                        gwdt_count++;
+               } else  if (is_timer_block(platform_timer)) {
+                       struct arch_timer_mem atm = {};
+                       struct platform_device *pdev;
+
+                       ret = gtdt_parse_timer_block(platform_timer, &atm);
+                       if (ret)
+                               continue;
+
+                       pdev = platform_device_register_data(NULL, "gtdt-arm-mmio-timer",
+                                                            gwdt_count, &atm,
+                                                            sizeof(atm));
+                       if (IS_ERR(pdev)) {
+                               pr_err("Can't register timer %d\n", gwdt_count);
+                               continue;
+                       }
+
+                       mmio_timer_count++;
                }
        }
 
        if (gwdt_count)
                pr_info("found %d SBSA generic Watchdog(s).\n", gwdt_count);
+       if (mmio_timer_count)
+               pr_info("found %d Generic MMIO timer(s).\n", mmio_timer_count);
 
 out_put_gtdt:
        acpi_put_table(table);
        return ret;
 }
 
-device_initcall(gtdt_sbsa_gwdt_init);
+device_initcall(gtdt_platform_timer_init);