2007-06-15 01:56:23 +04:00
/*
* PMC - Sierra MSP board specific pci fixups .
*
* Copyright 2001 MontaVista Software Inc .
* Copyright 2005 - 2007 PMC - Sierra , Inc
*
* Author : MontaVista Software , Inc .
* ppopov @ mvista . com or source @ mvista . com
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation ; either version 2 of the License , or ( at your
* option ) any later version .
*
* THIS SOFTWARE IS PROVIDED ` ` AS IS ' ' AND ANY EXPRESS OR IMPLIED
* WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED . IN
* NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT , INDIRECT ,
* INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING , BUT
* NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF
* USE , DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
* ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
*
* You should have received a copy of the GNU General Public License along
* with this program ; if not , write to the Free Software Foundation , Inc . ,
* 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
# ifdef CONFIG_PCI
# include <linux/types.h>
# include <linux/pci.h>
# include <linux/kernel.h>
# include <linux/init.h>
# include <asm/byteorder.h>
# include <msp_pci.h>
# include <msp_cic_int.h>
/* PCI interrupt pins */
# define IRQ4 MSP_INT_EXT4
# define IRQ5 MSP_INT_EXT5
# define IRQ6 MSP_INT_EXT6
# if defined(CONFIG_PMC_MSP7120_GW)
/* Garibaldi Board IRQ wiring to PCI slots */
static char irq_tab [ ] [ 5 ] __initdata = {
/* INTA INTB INTC INTD */
{ 0 , 0 , 0 , 0 , 0 } , /* (AD[0]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* (AD[1]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* (AD[2]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* (AD[3]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* (AD[4]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* (AD[5]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* (AD[6]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* (AD[7]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* (AD[8]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* (AD[9]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 0 (AD[10]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 1 (AD[11]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 2 (AD[12]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 3 (AD[13]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 4 (AD[14]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 5 (AD[15]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 6 (AD[16]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 7 (AD[17]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 8 (AD[18]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 9 (AD[19]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 10 (AD[20]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 11 (AD[21]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 12 (AD[22]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 13 (AD[23]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 14 (AD[24]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 15 (AD[25]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 16 (AD[26]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 17 (AD[27]): Unused */
{ 0 , IRQ4 , IRQ4 , 0 , 0 } , /* 18 (AD[28]): slot 0 */
{ 0 , 0 , 0 , 0 , 0 } , /* 19 (AD[29]): Unused */
{ 0 , IRQ5 , IRQ5 , 0 , 0 } , /* 20 (AD[30]): slot 1 */
{ 0 , IRQ6 , IRQ6 , 0 , 0 } /* 21 (AD[31]): slot 2 */
} ;
# elif defined(CONFIG_PMC_MSP7120_EVAL)
/* MSP7120 Eval Board IRQ wiring to PCI slots */
static char irq_tab [ ] [ 5 ] __initdata = {
/* INTA INTB INTC INTD */
{ 0 , 0 , 0 , 0 , 0 } , /* (AD[0]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* (AD[1]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* (AD[2]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* (AD[3]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* (AD[4]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* (AD[5]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* (AD[6]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* (AD[7]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* (AD[8]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* (AD[9]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 0 (AD[10]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 1 (AD[11]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 2 (AD[12]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 3 (AD[13]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 4 (AD[14]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 5 (AD[15]): Unused */
{ 0 , IRQ6 , IRQ6 , 0 , 0 } , /* 6 (AD[16]): slot 3 (mini) */
{ 0 , IRQ5 , IRQ5 , 0 , 0 } , /* 7 (AD[17]): slot 2 (mini) */
{ 0 , IRQ4 , IRQ4 , IRQ4 , IRQ4 } , /* 8 (AD[18]): slot 0 (PCI) */
{ 0 , IRQ5 , IRQ5 , IRQ5 , IRQ5 } , /* 9 (AD[19]): slot 1 (PCI) */
{ 0 , 0 , 0 , 0 , 0 } , /* 10 (AD[20]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 11 (AD[21]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 12 (AD[22]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 13 (AD[23]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 14 (AD[24]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 15 (AD[25]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 16 (AD[26]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 17 (AD[27]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 18 (AD[28]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 19 (AD[29]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 20 (AD[30]): Unused */
{ 0 , 0 , 0 , 0 , 0 } /* 21 (AD[31]): Unused */
} ;
# else
/* Unknown board -- don't assign any IRQs */
static char irq_tab [ ] [ 5 ] __initdata = {
/* INTA INTB INTC INTD */
{ 0 , 0 , 0 , 0 , 0 } , /* (AD[0]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* (AD[1]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* (AD[2]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* (AD[3]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* (AD[4]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* (AD[5]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* (AD[6]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* (AD[7]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* (AD[8]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* (AD[9]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 0 (AD[10]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 1 (AD[11]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 2 (AD[12]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 3 (AD[13]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 4 (AD[14]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 5 (AD[15]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 6 (AD[16]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 7 (AD[17]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 8 (AD[18]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 9 (AD[19]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 10 (AD[20]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 11 (AD[21]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 12 (AD[22]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 13 (AD[23]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 14 (AD[24]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 15 (AD[25]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 16 (AD[26]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 17 (AD[27]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 18 (AD[28]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 19 (AD[29]): Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 20 (AD[30]): Unused */
{ 0 , 0 , 0 , 0 , 0 } /* 21 (AD[31]): Unused */
} ;
# endif
/*****************************************************************************
*
* FUNCTION : pcibios_plat_dev_init
* _________________________________________________________________________
*
* DESCRIPTION : Perform platform specific device initialization at
* pci_enable_device ( ) time .
* None are needed for the MSP7120 PCI Controller .
*
* INPUTS : dev - structure describing the PCI device
*
* OUTPUTS : none
*
* RETURNS : PCIBIOS_SUCCESSFUL
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int pcibios_plat_dev_init ( struct pci_dev * dev )
{
return PCIBIOS_SUCCESSFUL ;
}
/*****************************************************************************
*
* FUNCTION : pcibios_map_irq
* _________________________________________________________________________
*
* DESCRIPTION : Perform board supplied PCI IRQ mapping routine .
*
* INPUTS : dev - unused
* slot - PCI slot . Identified by which bit of the AD [ ] bus
* drives the IDSEL line . AD [ 10 ] is 0 , AD [ 31 ] is
* slot 21.
* pin - numbered using the scheme of the PCI_INTERRUPT_PIN
* field of the config header .
*
* OUTPUTS : none
*
* RETURNS : IRQ number
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-10-09 18:15:21 +04:00
int __init pcibios_map_irq ( const struct pci_dev * dev , u8 slot , u8 pin )
2007-06-15 01:56:23 +04:00
{
# if !defined(CONFIG_PMC_MSP7120_GW) && !defined(CONFIG_PMC_MSP7120_EVAL)
printk ( KERN_WARNING " PCI: unknown board, no PCI IRQs assigned. \n " ) ;
# endif
printk ( KERN_WARNING " PCI: irq_tab returned %d for slot=%d pin=%d \n " ,
irq_tab [ slot ] [ pin ] , slot , pin ) ;
return irq_tab [ slot ] [ pin ] ;
}
# endif /* CONFIG_PCI */