162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Freescale P2020 board Setup
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright 2007,2009,2012-2013 Freescale Semiconductor Inc.
662306a36Sopenharmony_ci * Copyright 2022-2023 Pali Rohár <pali@kernel.org>
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/stddef.h>
1062306a36Sopenharmony_ci#include <linux/kernel.h>
1162306a36Sopenharmony_ci#include <linux/of.h>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include <asm/machdep.h>
1462306a36Sopenharmony_ci#include <asm/udbg.h>
1562306a36Sopenharmony_ci#include <asm/mpic.h>
1662306a36Sopenharmony_ci#include <asm/swiotlb.h>
1762306a36Sopenharmony_ci#include <asm/ppc-pci.h>
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci#include <sysdev/fsl_pci.h>
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci#include "smp.h"
2262306a36Sopenharmony_ci#include "mpc85xx.h"
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_cistatic void __init p2020_pic_init(void)
2562306a36Sopenharmony_ci{
2662306a36Sopenharmony_ci	struct mpic *mpic;
2762306a36Sopenharmony_ci	int flags = MPIC_BIG_ENDIAN | MPIC_SINGLE_DEST_CPU;
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci	mpic = mpic_alloc(NULL, 0, flags, 0, 256, " OpenPIC  ");
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci	if (WARN_ON(!mpic))
3262306a36Sopenharmony_ci		return;
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci	mpic_init(mpic);
3562306a36Sopenharmony_ci	mpc85xx_8259_init();
3662306a36Sopenharmony_ci}
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci/*
3962306a36Sopenharmony_ci * Setup the architecture
4062306a36Sopenharmony_ci */
4162306a36Sopenharmony_cistatic void __init p2020_setup_arch(void)
4262306a36Sopenharmony_ci{
4362306a36Sopenharmony_ci	swiotlb_detect_4g();
4462306a36Sopenharmony_ci	fsl_pci_assign_primary();
4562306a36Sopenharmony_ci	uli_init();
4662306a36Sopenharmony_ci	mpc85xx_smp_init();
4762306a36Sopenharmony_ci	mpc85xx_qe_par_io_init();
4862306a36Sopenharmony_ci}
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci/*
5162306a36Sopenharmony_ci * Called very early, device-tree isn't unflattened
5262306a36Sopenharmony_ci */
5362306a36Sopenharmony_cistatic int __init p2020_probe(void)
5462306a36Sopenharmony_ci{
5562306a36Sopenharmony_ci	struct device_node *p2020_cpu;
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci	/*
5862306a36Sopenharmony_ci	 * There is no common compatible string for all P2020 boards.
5962306a36Sopenharmony_ci	 * The only common thing is "PowerPC,P2020@0" cpu node.
6062306a36Sopenharmony_ci	 * So check for P2020 board via this cpu node.
6162306a36Sopenharmony_ci	 */
6262306a36Sopenharmony_ci	p2020_cpu = of_find_node_by_path("/cpus/PowerPC,P2020@0");
6362306a36Sopenharmony_ci	of_node_put(p2020_cpu);
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci	return !!p2020_cpu;
6662306a36Sopenharmony_ci}
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_cimachine_arch_initcall(p2020, mpc85xx_common_publish_devices);
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_cidefine_machine(p2020) {
7162306a36Sopenharmony_ci	.name			= "Freescale P2020",
7262306a36Sopenharmony_ci	.probe			= p2020_probe,
7362306a36Sopenharmony_ci	.setup_arch		= p2020_setup_arch,
7462306a36Sopenharmony_ci	.init_IRQ		= p2020_pic_init,
7562306a36Sopenharmony_ci#ifdef CONFIG_PCI
7662306a36Sopenharmony_ci	.pcibios_fixup_bus	= fsl_pcibios_fixup_bus,
7762306a36Sopenharmony_ci	.pcibios_fixup_phb	= fsl_pcibios_fixup_phb,
7862306a36Sopenharmony_ci#endif
7962306a36Sopenharmony_ci	.get_irq		= mpic_get_irq,
8062306a36Sopenharmony_ci	.progress		= udbg_progress,
8162306a36Sopenharmony_ci};
82