18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * linux/arch/arm/mach-footbridge/cats-pci.c
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * PCI bios-type initialisation for PCI machines
68c2ecf20Sopenharmony_ci *
78c2ecf20Sopenharmony_ci * Bits taken from various places.
88c2ecf20Sopenharmony_ci */
98c2ecf20Sopenharmony_ci#include <linux/kernel.h>
108c2ecf20Sopenharmony_ci#include <linux/pci.h>
118c2ecf20Sopenharmony_ci#include <linux/init.h>
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci#include <asm/irq.h>
148c2ecf20Sopenharmony_ci#include <asm/mach/pci.h>
158c2ecf20Sopenharmony_ci#include <asm/mach-types.h>
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ci/* cats host-specific stuff */
188c2ecf20Sopenharmony_cistatic int irqmap_cats[] = { IRQ_PCI, IRQ_IN0, IRQ_IN1, IRQ_IN3 };
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_cistatic u8 cats_no_swizzle(struct pci_dev *dev, u8 *pin)
218c2ecf20Sopenharmony_ci{
228c2ecf20Sopenharmony_ci	return 0;
238c2ecf20Sopenharmony_ci}
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_cistatic int cats_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
268c2ecf20Sopenharmony_ci{
278c2ecf20Sopenharmony_ci	if (dev->irq >= 255)
288c2ecf20Sopenharmony_ci		return -1;	/* not a valid interrupt. */
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_ci	if (dev->irq >= 128)
318c2ecf20Sopenharmony_ci		return dev->irq & 0x1f;
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_ci	if (dev->irq >= 1 && dev->irq <= 4)
348c2ecf20Sopenharmony_ci		return irqmap_cats[dev->irq - 1];
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ci	if (dev->irq != 0)
378c2ecf20Sopenharmony_ci		printk("PCI: device %02x:%02x has unknown irq line %x\n",
388c2ecf20Sopenharmony_ci		       dev->bus->number, dev->devfn, dev->irq);
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_ci	return -1;
418c2ecf20Sopenharmony_ci}
428c2ecf20Sopenharmony_ci
438c2ecf20Sopenharmony_ci/*
448c2ecf20Sopenharmony_ci * why not the standard PCI swizzle?  does this prevent 4-port tulip
458c2ecf20Sopenharmony_ci * cards being used (ie, pci-pci bridge based cards)?
468c2ecf20Sopenharmony_ci */
478c2ecf20Sopenharmony_cistatic struct hw_pci cats_pci __initdata = {
488c2ecf20Sopenharmony_ci	.swizzle		= cats_no_swizzle,
498c2ecf20Sopenharmony_ci	.map_irq		= cats_map_irq,
508c2ecf20Sopenharmony_ci	.nr_controllers		= 1,
518c2ecf20Sopenharmony_ci	.ops			= &dc21285_ops,
528c2ecf20Sopenharmony_ci	.setup			= dc21285_setup,
538c2ecf20Sopenharmony_ci	.preinit		= dc21285_preinit,
548c2ecf20Sopenharmony_ci	.postinit		= dc21285_postinit,
558c2ecf20Sopenharmony_ci};
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_cistatic int __init cats_pci_init(void)
588c2ecf20Sopenharmony_ci{
598c2ecf20Sopenharmony_ci	if (machine_is_cats())
608c2ecf20Sopenharmony_ci		pci_common_init(&cats_pci);
618c2ecf20Sopenharmony_ci	return 0;
628c2ecf20Sopenharmony_ci}
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_cisubsys_initcall(cats_pci_init);
65