mirror of
https://github.com/torvalds/linux.git
synced 2024-11-28 23:21:31 +00:00
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:
parent
85b59f5bb2
commit
bcf39352eb
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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 = {
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user