2019-05-28 20:10:13 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2005-04-17 02:20:36 +04:00
/*
* Minimalist driver for a generic PCI - to - EISA bridge .
*
* ( C ) 2003 Marc Zyngier < maz @ wild - wind . fr . eu . org >
*
* Ivan Kokshaysky < ink @ jurassic . park . msu . ru > :
* Generalisation from i82375 to PCI_CLASS_BRIDGE_EISA .
*/
# include <linux/kernel.h>
# include <linux/device.h>
# include <linux/eisa.h>
# include <linux/pci.h>
# include <linux/module.h>
# include <linux/init.h>
/* There is only *one* pci_eisa device per machine, right ? */
static struct eisa_root_device pci_eisa_root ;
2013-03-28 08:28:05 +04:00
static int __init pci_eisa_init ( struct pci_dev * pdev )
2005-04-17 02:20:36 +04:00
{
2013-04-01 21:48:59 +04:00
struct resource * res , * bus_res = NULL ;
2023-03-30 19:24:33 +03:00
int rc ;
2005-04-17 02:20:36 +04:00
if ( ( rc = pci_enable_device ( pdev ) ) ) {
2013-04-16 00:33:42 +04:00
dev_err ( & pdev - > dev , " Could not enable device \n " ) ;
2005-04-17 02:20:36 +04:00
return rc ;
}
2013-04-01 21:48:59 +04:00
/*
* The Intel 82375 PCI - EISA bridge is a subtractive - decode PCI
* device , so the resources available on EISA are the same as those
* available on the 82375 bus . This works the same as a PCI - PCI
* bridge in subtractive - decode mode ( see pci_read_bridge_bases ( ) ) .
* We assume other PCI - EISA bridges are similar .
*
* eisa_root_register ( ) can only deal with a single io port resource ,
* so we use the first valid io port resource .
*/
2023-03-30 19:24:33 +03:00
pci_bus_for_each_resource ( pdev - > bus , res )
2013-04-01 21:48:59 +04:00
if ( res & & ( res - > flags & IORESOURCE_IO ) ) {
bus_res = res ;
break ;
}
if ( ! bus_res ) {
dev_err ( & pdev - > dev , " No resources available \n " ) ;
return - 1 ;
}
2018-01-17 12:44:06 +03:00
pci_eisa_root . dev = & pdev - > dev ;
pci_eisa_root . res = bus_res ;
pci_eisa_root . bus_base_addr = bus_res - > start ;
pci_eisa_root . slots = EISA_MAX_SLOTS ;
pci_eisa_root . dma_mask = pdev - > dma_mask ;
2009-05-01 01:43:31 +04:00
dev_set_drvdata ( pci_eisa_root . dev , & pci_eisa_root ) ;
2005-04-17 02:20:36 +04:00
if ( eisa_root_register ( & pci_eisa_root ) ) {
2013-04-16 00:33:42 +04:00
dev_err ( & pdev - > dev , " Could not register EISA root \n " ) ;
2005-04-17 02:20:36 +04:00
return - 1 ;
}
return 0 ;
}
2013-03-28 08:28:05 +04:00
/*
* We have to call pci_eisa_init_early ( ) before pnpacpi_init ( ) / isapnp_init ( ) .
* Otherwise pnp resource will get enabled early and could prevent eisa
* to be initialized .
* Also need to make sure pci_eisa_init_early ( ) is called after
* x86 / pci_subsys_init ( ) .
* So need to use subsys_initcall_sync with it .
*/
static int __init pci_eisa_init_early ( void )
{
struct pci_dev * dev = NULL ;
int ret ;
2005-04-17 02:20:36 +04:00
2013-03-28 08:28:05 +04:00
for_each_pci_dev ( dev )
if ( ( dev - > class > > 8 ) = = PCI_CLASS_BRIDGE_EISA ) {
ret = pci_eisa_init ( dev ) ;
if ( ret )
return ret ;
}
2005-04-17 02:20:36 +04:00
2013-03-28 08:28:05 +04:00
return 0 ;
2005-04-17 02:20:36 +04:00
}
2013-03-28 08:28:05 +04:00
subsys_initcall_sync ( pci_eisa_init_early ) ;