sh: pci: Consolidate the remaining common bits.
[linux-2.6] / arch / sh / drivers / pci / pci.c
1 /*
2  * arch/sh/drivers/pci/pci.c
3  *
4  * Copyright (c) 2002 M. R. Brown  <mrbrown@linux-sh.org>
5  * Copyright (c) 2004 - 2006 Paul Mundt  <lethal@linux-sh.org>
6  *
7  * These functions are collected here to reduce duplication of common
8  * code amongst the many platform-specific PCI support code files.
9  *
10  * These routines require the following board-specific routines:
11  * void pcibios_fixup_irqs();
12  *
13  * See include/asm-sh/pci.h for more information.
14  *
15  * This file is subject to the terms and conditions of the GNU General Public
16  * License.  See the file "COPYING" in the main directory of this archive
17  * for more details.
18  */
19 #include <linux/kernel.h>
20 #include <linux/pci.h>
21 #include <linux/init.h>
22 #include <linux/dma-debug.h>
23 #include <asm/io.h>
24
25 static int __init pcibios_init(void)
26 {
27         struct pci_channel *p;
28         struct pci_bus *bus;
29         int busno;
30
31         /* init channels */
32         busno = 0;
33         for (p = board_pci_channels; p->init; p++) {
34                 if (p->init(p) == 0)
35                         p->enabled = 1;
36                 else
37                         pr_err("Unable to init pci channel %d\n", busno);
38                 busno++;
39         }
40
41 #ifdef CONFIG_PCI_AUTO
42         /* assign resources */
43         busno = 0;
44         for (p = board_pci_channels; p->init; p++)
45                 if (p->enabled)
46                         busno = pciauto_assign_resources(busno, p) + 1;
47 #endif
48
49         /* scan the buses */
50         busno = 0;
51         for (p = board_pci_channels; p->init; p++) {
52                 if (p->enabled) {
53                         bus = pci_scan_bus(busno, p->pci_ops, p);
54                         busno = bus->subordinate + 1;
55                 }
56         }
57
58         pci_fixup_irqs(pci_common_swizzle, pcibios_map_platform_irq);
59
60         dma_debug_add_bus(&pci_bus_type);
61
62         return 0;
63 }
64 subsys_initcall(pcibios_init);
65
66 /*
67  *  Called after each bus is probed, but before its children
68  *  are examined.
69  */
70 void __devinit __weak pcibios_fixup_bus(struct pci_bus *bus)
71 {
72         pci_read_bridge_bases(bus);
73 }
74
75 EXPORT_SYMBOL(board_pci_channels);