2005-07-26 02:45:45 +04:00
/*
* Toshiba rbtx4938 pci routines
* Copyright ( C ) 2000 - 2001 Toshiba Corporation
*
* 2003 - 2005 ( c ) MontaVista Software , Inc . This file is licensed under the
* terms of the GNU General Public License version 2. This program is
* licensed " as is " without any warranty of any kind , whether express
* or implied .
*
* Support for TX4938 in 2.6 - Manish Lachwani ( mlachwani @ mvista . com )
*/
# include <linux/types.h>
# include <linux/pci.h>
# include <linux/kernel.h>
# include <linux/init.h>
2008-07-10 19:31:36 +04:00
# include <asm/txx9/rbtx4938.h>
2005-07-26 02:45:45 +04:00
extern struct pci_controller tx4938_pci_controller [ ] ;
2007-07-27 20:03:41 +04:00
static int pci_get_irq ( const struct pci_dev * dev , int pin )
2005-07-26 02:45:45 +04:00
{
int irq = pin ;
u8 slot = PCI_SLOT ( dev - > devfn ) ;
struct pci_controller * controller = ( struct pci_controller * ) dev - > sysdata ;
if ( controller = = & tx4938_pci_controller [ 1 ] ) {
/* TX4938 PCIC1 */
switch ( slot ) {
case TX4938_PCIC_IDSEL_AD_TO_SLOT ( 31 ) :
if ( tx4938_ccfgptr - > pcfg & TX4938_PCFG_ETH0_SEL )
return RBTX4938_IRQ_IRC + TX4938_IR_ETH0 ;
break ;
case TX4938_PCIC_IDSEL_AD_TO_SLOT ( 30 ) :
if ( tx4938_ccfgptr - > pcfg & TX4938_PCFG_ETH1_SEL )
return RBTX4938_IRQ_IRC + TX4938_IR_ETH1 ;
break ;
}
return 0 ;
}
/* IRQ rotation */
irq - - ; /* 0-3 */
if ( dev - > bus - > parent = = NULL & &
( slot = = TX4938_PCIC_IDSEL_AD_TO_SLOT ( 23 ) ) ) {
/* PCI CardSlot (IDSEL=A23) */
/* PCIA => PCIA (IDSEL=A23) */
irq = ( irq + 0 + slot ) % 4 ;
} else {
/* PCI Backplane */
irq = ( irq + 33 - slot ) % 4 ;
}
irq + + ; /* 1-4 */
switch ( irq ) {
case 1 :
irq = RBTX4938_IRQ_IOC_PCIA ;
break ;
case 2 :
irq = RBTX4938_IRQ_IOC_PCIB ;
break ;
case 3 :
irq = RBTX4938_IRQ_IOC_PCIC ;
break ;
case 4 :
irq = RBTX4938_IRQ_IOC_PCID ;
break ;
}
return irq ;
}
2007-07-10 20:33:00 +04:00
int __init pcibios_map_irq ( const struct pci_dev * dev , u8 slot , u8 pin )
2005-07-26 02:45:45 +04:00
{
unsigned char irq = 0 ;
irq = pci_get_irq ( dev , pin ) ;
printk ( KERN_INFO " PCI: 0x%02x:0x%02x(0x%02x,0x%02x) IRQ=%d \n " ,
dev - > bus - > number , dev - > devfn , PCI_SLOT ( dev - > devfn ) ,
PCI_FUNC ( dev - > devfn ) , irq ) ;
return irq ;
}
/*
* Do platform specific device initialization at pci_enable_device ( ) time
*/
int pcibios_plat_dev_init ( struct pci_dev * dev )
{
return 0 ;
}