diff options
author | Anatolij Gustschin <agust@denx.de> | 2011-10-11 22:44:30 +0000 |
---|---|---|
committer | Wolfgang Denk <wd@denx.de> | 2011-10-15 22:16:53 +0200 |
commit | 0da1fb03c588eebd6287b3fc7d06bf01b0588d89 (patch) | |
tree | 740db526f8ef4a1aa4055140c6d78b325d66e50b /drivers | |
parent | 4f1ec4c176810bbc60e7142336b2bd74eac3bec1 (diff) | |
download | u-boot-imx-0da1fb03c588eebd6287b3fc7d06bf01b0588d89.zip u-boot-imx-0da1fb03c588eebd6287b3fc7d06bf01b0588d89.tar.gz u-boot-imx-0da1fb03c588eebd6287b3fc7d06bf01b0588d89.tar.bz2 |
pci: move pcidelay code to new location just before PCI bus scan
PCI cards might need some time after reset to respond. On some
boards (mpc5200 or mpc8260 based) the PCI bus reset is deasserted
at pci_init_board() time, so we currently can not use available
"pcidelay" option for waiting before PCI bus scan since this
waiting takes place before calling pci_init_board(). By moving
the pcidelay code to the new location using of the "pcidelay"
option is possible on mpc5200 or mpc8260 based boards, too.
Since pci_hose_scan() could be called multiple times, restrict
the function to wait only during its first call and to ignore
pcidelay for any further call (as pointed out by Matthias).
Signed-off-by: Anatolij Gustschin <agust@denx.de>
Cc: Matthias Fuchs <matthias.fuchs@esd.eu>
Acked-by: Stefan Roese <sr@denx.de>
Acked-by: Matthias Fuchs <matthias.fuchs@esd.eu>
Tested-by: Matthias Fuchs <matthias.fuchs@esd.eu>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/pci/pci.c | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 1a0b14c..5f1f128 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -695,6 +695,23 @@ int pci_hose_scan_bus(struct pci_controller *hose, int bus) int pci_hose_scan(struct pci_controller *hose) { +#if defined(CONFIG_PCI_BOOTDELAY) + static int pcidelay_done; + char *s; + int i; + + if (!pcidelay_done) { + /* wait "pcidelay" ms (if defined)... */ + s = getenv("pcidelay"); + if (s) { + int val = simple_strtoul(s, NULL, 10); + for (i = 0; i < val; i++) + udelay(1000); + } + pcidelay_done = 1; + } +#endif /* CONFIG_PCI_BOOTDELAY */ + /* Start scan at current_busno. * PCIe will start scan at first_busno+1. */ @@ -709,19 +726,6 @@ int pci_hose_scan(struct pci_controller *hose) void pci_init(void) { -#if defined(CONFIG_PCI_BOOTDELAY) - char *s; - int i; - - /* wait "pcidelay" ms (if defined)... */ - s = getenv ("pcidelay"); - if (s) { - int val = simple_strtoul (s, NULL, 10); - for (i=0; i<val; i++) - udelay (1000); - } -#endif /* CONFIG_PCI_BOOTDELAY */ - hose_head = NULL; /* now call board specific pci_init()... */ |