162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2020 Western Digital Corporation or its affiliates.
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci#include <linux/init.h>
662306a36Sopenharmony_ci#include <linux/libfdt.h>
762306a36Sopenharmony_ci#include <linux/pgtable.h>
862306a36Sopenharmony_ci#include <asm/soc.h>
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci/*
1162306a36Sopenharmony_ci * This is called extremly early, before parse_dtb(), to allow initializing
1262306a36Sopenharmony_ci * SoC hardware before memory or any device driver initialization.
1362306a36Sopenharmony_ci */
1462306a36Sopenharmony_civoid __init soc_early_init(void)
1562306a36Sopenharmony_ci{
1662306a36Sopenharmony_ci	void (*early_fn)(const void *fdt);
1762306a36Sopenharmony_ci	const struct of_device_id *s;
1862306a36Sopenharmony_ci	const void *fdt = dtb_early_va;
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci	for (s = (void *)&__soc_early_init_table_start;
2162306a36Sopenharmony_ci	     (void *)s < (void *)&__soc_early_init_table_end; s++) {
2262306a36Sopenharmony_ci		if (!fdt_node_check_compatible(fdt, 0, s->compatible)) {
2362306a36Sopenharmony_ci			early_fn = s->data;
2462306a36Sopenharmony_ci			early_fn(fdt);
2562306a36Sopenharmony_ci			return;
2662306a36Sopenharmony_ci		}
2762306a36Sopenharmony_ci	}
2862306a36Sopenharmony_ci}
29