sh: Handle PCI controller resource conflicts.

register_pci_controller() can fail, but presently is a void function.
Change this over to an int so that we can bail early before continuing on
with post-registration initialization (such as throwing the controller in
to 66MHz mode in the case of the SH7780 host controller).

Signed-off-by: Paul Mundt <lethal@linux-sh.org>
This commit is contained in:
Paul Mundt 2010-02-01 13:11:25 +09:00
parent 85b59f5bb2
commit bcf39352eb
7 changed files with 12 additions and 16 deletions

View File

@ -95,8 +95,6 @@ static int __init gapspci_init(void)
outl(0x00002001, GAPSPCI_BBA_CONFIG+0x10); outl(0x00002001, GAPSPCI_BBA_CONFIG+0x10);
outl(0x01000000, GAPSPCI_BBA_CONFIG+0x14); outl(0x01000000, GAPSPCI_BBA_CONFIG+0x14);
register_pci_controller(&dreamcast_pci_controller); return register_pci_controller(&dreamcast_pci_controller);
return 0;
} }
arch_initcall(gapspci_init); arch_initcall(gapspci_init);

View File

@ -216,8 +216,6 @@ static int __init sh5pci_init(void)
sh5_mem_resource.start = memStart; sh5_mem_resource.start = memStart;
sh5_mem_resource.end = memStart + memSize; sh5_mem_resource.end = memStart + memSize;
register_pci_controller(&sh5pci_controller); return register_pci_controller(&sh5pci_controller);
return 0;
} }
arch_initcall(sh5pci_init); arch_initcall(sh5pci_init);

View File

@ -176,8 +176,6 @@ static int __init sh7751_pci_init(void)
word = SH4_PCICR_PREFIX | SH4_PCICR_CFIN | SH4_PCICR_ARBM; word = SH4_PCICR_PREFIX | SH4_PCICR_CFIN | SH4_PCICR_ARBM;
pci_write_reg(chan, word, SH4_PCICR); pci_write_reg(chan, word, SH4_PCICR);
register_pci_controller(chan); return register_pci_controller(chan);
return 0;
} }
arch_initcall(sh7751_pci_init); arch_initcall(sh7751_pci_init);

View File

@ -71,6 +71,7 @@ static int __init sh7780_pci_init(void)
size_t memsize; size_t memsize;
unsigned int id; unsigned int id;
const char *type; const char *type;
int ret;
printk(KERN_NOTICE "PCI: Starting intialization.\n"); printk(KERN_NOTICE "PCI: Starting intialization.\n");
@ -197,7 +198,9 @@ static int __init sh7780_pci_init(void)
__raw_writel(SH4_PCICR_PREFIX | SH4_PCICR_CFIN | SH4_PCICR_FTO, __raw_writel(SH4_PCICR_PREFIX | SH4_PCICR_CFIN | SH4_PCICR_FTO,
chan->reg_base + SH4_PCICR); chan->reg_base + SH4_PCICR);
register_pci_controller(chan); ret = register_pci_controller(chan);
if (unlikely(ret))
return ret;
sh7780_pci66_init(chan); sh7780_pci66_init(chan);

View File

@ -58,7 +58,7 @@ static void __devinit pcibios_scanbus(struct pci_channel *hose)
static DEFINE_MUTEX(pci_scan_mutex); static DEFINE_MUTEX(pci_scan_mutex);
void __devinit register_pci_controller(struct pci_channel *hose) int __devinit register_pci_controller(struct pci_channel *hose)
{ {
if (request_resource(&iomem_resource, hose->mem_resource) < 0) if (request_resource(&iomem_resource, hose->mem_resource) < 0)
goto out; goto out;
@ -88,10 +88,11 @@ void __devinit register_pci_controller(struct pci_channel *hose)
mutex_unlock(&pci_scan_mutex); mutex_unlock(&pci_scan_mutex);
} }
return; return 0;
out: out:
printk(KERN_WARNING "Skipping PCI bus scan due to resource conflict\n"); printk(KERN_WARNING "Skipping PCI bus scan due to resource conflict\n");
return -1;
} }
static int __init pcibios_init(void) static int __init pcibios_init(void)

View File

@ -296,9 +296,7 @@ static int __devinit sh7786_pcie_init_hw(struct sh7786_pcie_port *port)
if (unlikely(ret < 0)) if (unlikely(ret < 0))
return ret; return ret;
register_pci_controller(port->hose); return register_pci_controller(port->hose);
return 0;
} }
static struct sh7786_pcie_hwops sh7786_65nm_pcie_hwops __initdata = { static struct sh7786_pcie_hwops sh7786_65nm_pcie_hwops __initdata = {

View File

@ -31,7 +31,7 @@ struct pci_channel {
unsigned int need_domain_info; unsigned int need_domain_info;
}; };
extern void register_pci_controller(struct pci_channel *hose); extern int register_pci_controller(struct pci_channel *hose);
extern int pci_is_66mhz_capable(struct pci_channel *hose, extern int pci_is_66mhz_capable(struct pci_channel *hose,
int top_bus, int current_bus); int top_bus, int current_bus);