2019-06-04 10:11:33 +02:00
// SPDX-License-Identifier: GPL-2.0-only
2010-04-10 21:32:39 +01:00
/*
* arch / arch / mach - ixp4xx / vulcan - pci . c
*
* Vulcan board - level PCI initialization
*
* Copyright ( C ) 2010 Marc Zyngier < maz @ misterjones . org >
*
* based on ixdp425 - pci . c :
* Copyright ( C ) 2002 Intel Corporation .
* Copyright ( C ) 2003 - 2004 MontaVista Software , Inc .
*/
# include <linux/pci.h>
# include <linux/init.h>
# include <linux/irq.h>
# include <asm/mach/pci.h>
# include <asm/mach-types.h>
2019-06-17 14:24:32 +02:00
# include "irqs.h"
2010-04-10 21:32:39 +01:00
/* PCI controller GPIO to IRQ pin mappings */
# define INTA 2
# define INTB 3
void __init vulcan_pci_preinit ( void )
{
# ifndef CONFIG_IXP4XX_INDIRECT_PCI
/*
* Cardbus bridge wants way more than the SoC can actually offer ,
* and leaves the whole PCI bus in a mess . Artificially limit it
* to 8 MB per region . Of course indirect mode doesn ' t have this
* limitation . . .
*/
pci_cardbus_mem_size = SZ_8M ;
pr_info ( " Vulcan PCI: limiting CardBus memory size to %dMB \n " ,
( int ) ( pci_cardbus_mem_size > > 20 ) ) ;
# endif
2011-03-24 13:25:22 +01:00
irq_set_irq_type ( IXP4XX_GPIO_IRQ ( INTA ) , IRQ_TYPE_LEVEL_LOW ) ;
irq_set_irq_type ( IXP4XX_GPIO_IRQ ( INTB ) , IRQ_TYPE_LEVEL_LOW ) ;
2010-04-10 21:32:39 +01:00
ixp4xx_pci_preinit ( ) ;
}
2011-06-10 15:30:21 +01:00
static int __init vulcan_map_irq ( const struct pci_dev * dev , u8 slot , u8 pin )
2010-04-10 21:32:39 +01:00
{
if ( slot = = 1 )
return IXP4XX_GPIO_IRQ ( INTA ) ;
if ( slot = = 2 )
return IXP4XX_GPIO_IRQ ( INTB ) ;
return - 1 ;
}
struct hw_pci vulcan_pci __initdata = {
. nr_controllers = 1 ,
2012-03-10 12:49:16 +00:00
. ops = & ixp4xx_ops ,
2010-04-10 21:32:39 +01:00
. preinit = vulcan_pci_preinit ,
. setup = ixp4xx_setup ,
. map_irq = vulcan_map_irq ,
} ;
int __init vulcan_pci_init ( void )
{
if ( machine_is_arcom_vulcan ( ) )
pci_common_init ( & vulcan_pci ) ;
return 0 ;
}
subsys_initcall ( vulcan_pci_init ) ;