Commit 5669d92f authored by Marc Zyngier's avatar Marc Zyngier Committed by Daniel Lezcano
Browse files

ACPI: GTDT: Generate platform devices for MMIO timers



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: default avatarMarc Zyngier <maz@kernel.org>
Signed-off-by: default avatarDaniel Lezcano <daniel.lezcano@linaro.org>
Tested-by: default avatarSudeep Holla <sudeep.holla@arm.com>
Reviewed-by: default avatarSudeep Holla <sudeep.holla@arm.com>
Link: https://lore.kernel.org/r/20250807160243.1970533-2-maz@kernel.org
parent bee33f22
Loading
Loading
Loading
Loading
+25 −4
Original line number Diff line number Diff line
@@ -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);