/*1* PMC-Sierra MSP board specific pci fixups.2*3* Copyright 2001 MontaVista Software Inc.4* Copyright 2005-2007 PMC-Sierra, Inc5*6* Author: MontaVista Software, Inc.7* [email protected] or [email protected]8*9* This program is free software; you can redistribute it and/or modify it10* under the terms of the GNU General Public License as published by the11* Free Software Foundation; either version 2 of the License, or (at your12* option) any later version.13*14* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED15* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF16* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN17* NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,18* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT19* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF20* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON21* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT22* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF23* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.24*25* You should have received a copy of the GNU General Public License along26* with this program; if not, write to the Free Software Foundation, Inc.,27* 675 Mass Ave, Cambridge, MA 02139, USA.28*/2930#ifdef CONFIG_PCI3132#include <linux/types.h>33#include <linux/pci.h>34#include <linux/kernel.h>35#include <linux/init.h>3637#include <asm/byteorder.h>3839#include <msp_pci.h>40#include <msp_cic_int.h>4142/* PCI interrupt pins */43#define IRQ4 MSP_INT_EXT444#define IRQ5 MSP_INT_EXT545#define IRQ6 MSP_INT_EXT64647#if defined(CONFIG_PMC_MSP7120_GW)48/* Garibaldi Board IRQ wiring to PCI slots */49static char irq_tab[][5] __initdata = {50/* INTA INTB INTC INTD */51{0, 0, 0, 0, 0 }, /* (AD[0]): Unused */52{0, 0, 0, 0, 0 }, /* (AD[1]): Unused */53{0, 0, 0, 0, 0 }, /* (AD[2]): Unused */54{0, 0, 0, 0, 0 }, /* (AD[3]): Unused */55{0, 0, 0, 0, 0 }, /* (AD[4]): Unused */56{0, 0, 0, 0, 0 }, /* (AD[5]): Unused */57{0, 0, 0, 0, 0 }, /* (AD[6]): Unused */58{0, 0, 0, 0, 0 }, /* (AD[7]): Unused */59{0, 0, 0, 0, 0 }, /* (AD[8]): Unused */60{0, 0, 0, 0, 0 }, /* (AD[9]): Unused */61{0, 0, 0, 0, 0 }, /* 0 (AD[10]): Unused */62{0, 0, 0, 0, 0 }, /* 1 (AD[11]): Unused */63{0, 0, 0, 0, 0 }, /* 2 (AD[12]): Unused */64{0, 0, 0, 0, 0 }, /* 3 (AD[13]): Unused */65{0, 0, 0, 0, 0 }, /* 4 (AD[14]): Unused */66{0, 0, 0, 0, 0 }, /* 5 (AD[15]): Unused */67{0, 0, 0, 0, 0 }, /* 6 (AD[16]): Unused */68{0, 0, 0, 0, 0 }, /* 7 (AD[17]): Unused */69{0, 0, 0, 0, 0 }, /* 8 (AD[18]): Unused */70{0, 0, 0, 0, 0 }, /* 9 (AD[19]): Unused */71{0, 0, 0, 0, 0 }, /* 10 (AD[20]): Unused */72{0, 0, 0, 0, 0 }, /* 11 (AD[21]): Unused */73{0, 0, 0, 0, 0 }, /* 12 (AD[22]): Unused */74{0, 0, 0, 0, 0 }, /* 13 (AD[23]): Unused */75{0, 0, 0, 0, 0 }, /* 14 (AD[24]): Unused */76{0, 0, 0, 0, 0 }, /* 15 (AD[25]): Unused */77{0, 0, 0, 0, 0 }, /* 16 (AD[26]): Unused */78{0, 0, 0, 0, 0 }, /* 17 (AD[27]): Unused */79{0, IRQ4, IRQ4, 0, 0 }, /* 18 (AD[28]): slot 0 */80{0, 0, 0, 0, 0 }, /* 19 (AD[29]): Unused */81{0, IRQ5, IRQ5, 0, 0 }, /* 20 (AD[30]): slot 1 */82{0, IRQ6, IRQ6, 0, 0 } /* 21 (AD[31]): slot 2 */83};8485#elif defined(CONFIG_PMC_MSP7120_EVAL)8687/* MSP7120 Eval Board IRQ wiring to PCI slots */88static char irq_tab[][5] __initdata = {89/* INTA INTB INTC INTD */90{0, 0, 0, 0, 0 }, /* (AD[0]): Unused */91{0, 0, 0, 0, 0 }, /* (AD[1]): Unused */92{0, 0, 0, 0, 0 }, /* (AD[2]): Unused */93{0, 0, 0, 0, 0 }, /* (AD[3]): Unused */94{0, 0, 0, 0, 0 }, /* (AD[4]): Unused */95{0, 0, 0, 0, 0 }, /* (AD[5]): Unused */96{0, 0, 0, 0, 0 }, /* (AD[6]): Unused */97{0, 0, 0, 0, 0 }, /* (AD[7]): Unused */98{0, 0, 0, 0, 0 }, /* (AD[8]): Unused */99{0, 0, 0, 0, 0 }, /* (AD[9]): Unused */100{0, 0, 0, 0, 0 }, /* 0 (AD[10]): Unused */101{0, 0, 0, 0, 0 }, /* 1 (AD[11]): Unused */102{0, 0, 0, 0, 0 }, /* 2 (AD[12]): Unused */103{0, 0, 0, 0, 0 }, /* 3 (AD[13]): Unused */104{0, 0, 0, 0, 0 }, /* 4 (AD[14]): Unused */105{0, 0, 0, 0, 0 }, /* 5 (AD[15]): Unused */106{0, IRQ6, IRQ6, 0, 0 }, /* 6 (AD[16]): slot 3 (mini) */107{0, IRQ5, IRQ5, 0, 0 }, /* 7 (AD[17]): slot 2 (mini) */108{0, IRQ4, IRQ4, IRQ4, IRQ4}, /* 8 (AD[18]): slot 0 (PCI) */109{0, IRQ5, IRQ5, IRQ5, IRQ5}, /* 9 (AD[19]): slot 1 (PCI) */110{0, 0, 0, 0, 0 }, /* 10 (AD[20]): Unused */111{0, 0, 0, 0, 0 }, /* 11 (AD[21]): Unused */112{0, 0, 0, 0, 0 }, /* 12 (AD[22]): Unused */113{0, 0, 0, 0, 0 }, /* 13 (AD[23]): Unused */114{0, 0, 0, 0, 0 }, /* 14 (AD[24]): Unused */115{0, 0, 0, 0, 0 }, /* 15 (AD[25]): Unused */116{0, 0, 0, 0, 0 }, /* 16 (AD[26]): Unused */117{0, 0, 0, 0, 0 }, /* 17 (AD[27]): Unused */118{0, 0, 0, 0, 0 }, /* 18 (AD[28]): Unused */119{0, 0, 0, 0, 0 }, /* 19 (AD[29]): Unused */120{0, 0, 0, 0, 0 }, /* 20 (AD[30]): Unused */121{0, 0, 0, 0, 0 } /* 21 (AD[31]): Unused */122};123124#else125126/* Unknown board -- don't assign any IRQs */127static char irq_tab[][5] __initdata = {128/* INTA INTB INTC INTD */129{0, 0, 0, 0, 0 }, /* (AD[0]): Unused */130{0, 0, 0, 0, 0 }, /* (AD[1]): Unused */131{0, 0, 0, 0, 0 }, /* (AD[2]): Unused */132{0, 0, 0, 0, 0 }, /* (AD[3]): Unused */133{0, 0, 0, 0, 0 }, /* (AD[4]): Unused */134{0, 0, 0, 0, 0 }, /* (AD[5]): Unused */135{0, 0, 0, 0, 0 }, /* (AD[6]): Unused */136{0, 0, 0, 0, 0 }, /* (AD[7]): Unused */137{0, 0, 0, 0, 0 }, /* (AD[8]): Unused */138{0, 0, 0, 0, 0 }, /* (AD[9]): Unused */139{0, 0, 0, 0, 0 }, /* 0 (AD[10]): Unused */140{0, 0, 0, 0, 0 }, /* 1 (AD[11]): Unused */141{0, 0, 0, 0, 0 }, /* 2 (AD[12]): Unused */142{0, 0, 0, 0, 0 }, /* 3 (AD[13]): Unused */143{0, 0, 0, 0, 0 }, /* 4 (AD[14]): Unused */144{0, 0, 0, 0, 0 }, /* 5 (AD[15]): Unused */145{0, 0, 0, 0, 0 }, /* 6 (AD[16]): Unused */146{0, 0, 0, 0, 0 }, /* 7 (AD[17]): Unused */147{0, 0, 0, 0, 0 }, /* 8 (AD[18]): Unused */148{0, 0, 0, 0, 0 }, /* 9 (AD[19]): Unused */149{0, 0, 0, 0, 0 }, /* 10 (AD[20]): Unused */150{0, 0, 0, 0, 0 }, /* 11 (AD[21]): Unused */151{0, 0, 0, 0, 0 }, /* 12 (AD[22]): Unused */152{0, 0, 0, 0, 0 }, /* 13 (AD[23]): Unused */153{0, 0, 0, 0, 0 }, /* 14 (AD[24]): Unused */154{0, 0, 0, 0, 0 }, /* 15 (AD[25]): Unused */155{0, 0, 0, 0, 0 }, /* 16 (AD[26]): Unused */156{0, 0, 0, 0, 0 }, /* 17 (AD[27]): Unused */157{0, 0, 0, 0, 0 }, /* 18 (AD[28]): Unused */158{0, 0, 0, 0, 0 }, /* 19 (AD[29]): Unused */159{0, 0, 0, 0, 0 }, /* 20 (AD[30]): Unused */160{0, 0, 0, 0, 0 } /* 21 (AD[31]): Unused */161};162#endif163164/*****************************************************************************165*166* FUNCTION: pcibios_plat_dev_init167* _________________________________________________________________________168*169* DESCRIPTION: Perform platform specific device initialization at170* pci_enable_device() time.171* None are needed for the MSP7120 PCI Controller.172*173* INPUTS: dev - structure describing the PCI device174*175* OUTPUTS: none176*177* RETURNS: PCIBIOS_SUCCESSFUL178*179****************************************************************************/180int pcibios_plat_dev_init(struct pci_dev *dev)181{182return PCIBIOS_SUCCESSFUL;183}184185/*****************************************************************************186*187* FUNCTION: pcibios_map_irq188* _________________________________________________________________________189*190* DESCRIPTION: Perform board supplied PCI IRQ mapping routine.191*192* INPUTS: dev - unused193* slot - PCI slot. Identified by which bit of the AD[] bus194* drives the IDSEL line. AD[10] is 0, AD[31] is195* slot 21.196* pin - numbered using the scheme of the PCI_INTERRUPT_PIN197* field of the config header.198*199* OUTPUTS: none200*201* RETURNS: IRQ number202*203****************************************************************************/204int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)205{206#if !defined(CONFIG_PMC_MSP7120_GW) && !defined(CONFIG_PMC_MSP7120_EVAL)207printk(KERN_WARNING "PCI: unknown board, no PCI IRQs assigned.\n");208#endif209printk(KERN_WARNING "PCI: irq_tab returned %d for slot=%d pin=%d\n",210irq_tab[slot][pin], slot, pin);211212return irq_tab[slot][pin];213}214215#endif /* CONFIG_PCI */216217218