162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (c) 2008 Emcraft Systems
462306a36Sopenharmony_ci * Sergei Poselenov <sposelenov@emcraft.com>
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Based on MPC8560 ADS and arch/ppc tqm85xx ports
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci * Maintained by Kumar Gala (see MAINTAINERS for contact information)
962306a36Sopenharmony_ci *
1062306a36Sopenharmony_ci * Copyright 2008 Freescale Semiconductor Inc.
1162306a36Sopenharmony_ci *
1262306a36Sopenharmony_ci * Copyright (c) 2005-2006 DENX Software Engineering
1362306a36Sopenharmony_ci * Stefan Roese <sr@denx.de>
1462306a36Sopenharmony_ci *
1562306a36Sopenharmony_ci * Based on original work by
1662306a36Sopenharmony_ci * 	Kumar Gala <kumar.gala@freescale.com>
1762306a36Sopenharmony_ci *      Copyright 2004 Freescale Semiconductor Inc.
1862306a36Sopenharmony_ci */
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#include <linux/stddef.h>
2162306a36Sopenharmony_ci#include <linux/kernel.h>
2262306a36Sopenharmony_ci#include <linux/pci.h>
2362306a36Sopenharmony_ci#include <linux/kdev_t.h>
2462306a36Sopenharmony_ci#include <linux/delay.h>
2562306a36Sopenharmony_ci#include <linux/seq_file.h>
2662306a36Sopenharmony_ci#include <linux/of.h>
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci#include <asm/time.h>
2962306a36Sopenharmony_ci#include <asm/machdep.h>
3062306a36Sopenharmony_ci#include <asm/pci-bridge.h>
3162306a36Sopenharmony_ci#include <asm/mpic.h>
3262306a36Sopenharmony_ci#include <mm/mmu_decl.h>
3362306a36Sopenharmony_ci#include <asm/udbg.h>
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci#include <sysdev/fsl_soc.h>
3662306a36Sopenharmony_ci#include <sysdev/fsl_pci.h>
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci#include "mpc85xx.h"
3962306a36Sopenharmony_ci#include "socrates_fpga_pic.h"
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_cistatic void __init socrates_pic_init(void)
4262306a36Sopenharmony_ci{
4362306a36Sopenharmony_ci	struct device_node *np;
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci	struct mpic *mpic = mpic_alloc(NULL, 0, MPIC_BIG_ENDIAN,
4662306a36Sopenharmony_ci			0, 256, " OpenPIC  ");
4762306a36Sopenharmony_ci	BUG_ON(mpic == NULL);
4862306a36Sopenharmony_ci	mpic_init(mpic);
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci	np = of_find_compatible_node(NULL, NULL, "abb,socrates-fpga-pic");
5162306a36Sopenharmony_ci	if (!np) {
5262306a36Sopenharmony_ci		printk(KERN_ERR "Could not find socrates-fpga-pic node\n");
5362306a36Sopenharmony_ci		return;
5462306a36Sopenharmony_ci	}
5562306a36Sopenharmony_ci	socrates_fpga_pic_init(np);
5662306a36Sopenharmony_ci	of_node_put(np);
5762306a36Sopenharmony_ci}
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci/*
6062306a36Sopenharmony_ci * Setup the architecture
6162306a36Sopenharmony_ci */
6262306a36Sopenharmony_cistatic void __init socrates_setup_arch(void)
6362306a36Sopenharmony_ci{
6462306a36Sopenharmony_ci	if (ppc_md.progress)
6562306a36Sopenharmony_ci		ppc_md.progress("socrates_setup_arch()", 0);
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci	fsl_pci_assign_primary();
6862306a36Sopenharmony_ci}
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_cimachine_arch_initcall(socrates, mpc85xx_common_publish_devices);
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_cidefine_machine(socrates) {
7362306a36Sopenharmony_ci	.name			= "Socrates",
7462306a36Sopenharmony_ci	.compatible		= "abb,socrates",
7562306a36Sopenharmony_ci	.setup_arch		= socrates_setup_arch,
7662306a36Sopenharmony_ci	.init_IRQ		= socrates_pic_init,
7762306a36Sopenharmony_ci	.get_irq		= mpic_get_irq,
7862306a36Sopenharmony_ci	.progress		= udbg_progress,
7962306a36Sopenharmony_ci};
80