1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * arch/arm/mach-ixp4xx/miccpt-pci.c 4 * 5 * MICCPT board-level PCI initialization 6 * 7 * Copyright (C) 2002 Intel Corporation. 8 * Copyright (C) 2003-2004 MontaVista Software, Inc. 9 * Copyright (C) 2006 OMICRON electronics GmbH 10 * 11 * Author: Michael Jochum <michael.jochum@omicron.at> 12 */ 13 14#include <linux/kernel.h> 15#include <linux/pci.h> 16#include <linux/init.h> 17#include <linux/delay.h> 18#include <linux/irq.h> 19#include <asm/mach/pci.h> 20#include <asm/irq.h> 21#include <mach/hardware.h> 22#include <asm/mach-types.h> 23 24#include "irqs.h" 25 26#define MAX_DEV 4 27#define IRQ_LINES 4 28 29/* PCI controller GPIO to IRQ pin mappings */ 30#define INTA 1 31#define INTB 2 32#define INTC 3 33#define INTD 4 34 35 36void __init miccpt_pci_preinit(void) 37{ 38 irq_set_irq_type(IXP4XX_GPIO_IRQ(INTA), IRQ_TYPE_LEVEL_LOW); 39 irq_set_irq_type(IXP4XX_GPIO_IRQ(INTB), IRQ_TYPE_LEVEL_LOW); 40 irq_set_irq_type(IXP4XX_GPIO_IRQ(INTC), IRQ_TYPE_LEVEL_LOW); 41 irq_set_irq_type(IXP4XX_GPIO_IRQ(INTD), IRQ_TYPE_LEVEL_LOW); 42 ixp4xx_pci_preinit(); 43} 44 45static int __init miccpt_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) 46{ 47 static int pci_irq_table[IRQ_LINES] = { 48 IXP4XX_GPIO_IRQ(INTA), 49 IXP4XX_GPIO_IRQ(INTB), 50 IXP4XX_GPIO_IRQ(INTC), 51 IXP4XX_GPIO_IRQ(INTD) 52 }; 53 54 if (slot >= 1 && slot <= MAX_DEV && pin >= 1 && pin <= IRQ_LINES) 55 return pci_irq_table[(slot + pin - 2) % 4]; 56 57 return -1; 58} 59 60struct hw_pci miccpt_pci __initdata = { 61 .nr_controllers = 1, 62 .ops = &ixp4xx_ops, 63 .preinit = miccpt_pci_preinit, 64 .setup = ixp4xx_setup, 65 .map_irq = miccpt_map_irq, 66}; 67 68int __init miccpt_pci_init(void) 69{ 70 if (machine_is_miccpt()) 71 pci_common_init(&miccpt_pci); 72 return 0; 73} 74 75subsys_initcall(miccpt_pci_init); 76