Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
arch
powerpc
kernel
of_platform.c
Go to the documentation of this file.
1
/*
2
* Copyright (C) 2006 Benjamin Herrenschmidt, IBM Corp.
3
* <
[email protected]
>
4
* and Arnd Bergmann, IBM Corp.
5
*
6
* This program is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU General Public License
8
* as published by the Free Software Foundation; either version
9
* 2 of the License, or (at your option) any later version.
10
*
11
*/
12
13
#undef DEBUG
14
15
#include <linux/string.h>
16
#include <linux/kernel.h>
17
#include <
linux/init.h
>
18
#include <linux/export.h>
19
#include <
linux/mod_devicetable.h
>
20
#include <linux/pci.h>
21
#include <
linux/of.h
>
22
#include <
linux/of_device.h
>
23
#include <
linux/of_platform.h
>
24
#include <
linux/atomic.h
>
25
26
#include <asm/errno.h>
27
#include <asm/topology.h>
28
#include <asm/pci-bridge.h>
29
#include <
asm/ppc-pci.h
>
30
#include <
asm/eeh.h
>
31
32
#ifdef CONFIG_PPC_OF_PLATFORM_PCI
33
34
/* The probing of PCI controllers from of_platform is currently
35
* 64 bits only, mostly due to gratuitous differences between
36
* the 32 and 64 bits PCI code on PowerPC and the 32 bits one
37
* lacking some bits needed here.
38
*/
39
40
static
int
__devinit
of_pci_phb_probe(
struct
platform_device
*
dev
)
41
{
42
struct
pci_controller
*phb;
43
44
/* Check if we can do that ... */
45
if
(
ppc_md
.pci_setup_phb ==
NULL
)
46
return
-
ENODEV
;
47
48
pr_info
(
"Setting up PCI bus %s\n"
, dev->
dev
.of_node->full_name);
49
50
/* Alloc and setup PHB data structure */
51
phb =
pcibios_alloc_controller
(dev->
dev
.of_node);
52
if
(!phb)
53
return
-
ENODEV
;
54
55
/* Setup parent in sysfs */
56
phb->parent = &dev->
dev
;
57
58
/* Setup the PHB using arch provided callback */
59
if
(
ppc_md
.pci_setup_phb(phb)) {
60
pcibios_free_controller
(phb);
61
return
-
ENODEV
;
62
}
63
64
/* Process "ranges" property */
65
pci_process_bridge_OF_ranges
(phb, dev->
dev
.of_node, 0);
66
67
/* Init pci_dn data structures */
68
pci_devs_phb_init_dynamic
(phb);
69
70
/* Create EEH devices for the PHB */
71
eeh_dev_phb_init_dynamic
(phb);
72
73
/* Register devices with EEH */
74
#ifdef CONFIG_EEH
75
if
(dev->
dev
.of_node->child)
76
eeh_add_device_tree_early
(dev->
dev
.of_node);
77
#endif
/* CONFIG_EEH */
78
79
/* Scan the bus */
80
pcibios_scan_phb
(phb);
81
if
(phb->bus ==
NULL
)
82
return
-
ENXIO
;
83
84
/* Claim resources. This might need some rework as well depending
85
* wether we are doing probe-only or not, like assigning unassigned
86
* resources etc...
87
*/
88
pcibios_claim_one_bus
(phb->bus);
89
90
/* Finish EEH setup */
91
#ifdef CONFIG_EEH
92
eeh_add_device_tree_late
(phb->bus);
93
#endif
94
95
/* Add probed PCI devices to the device model */
96
pci_bus_add_devices
(phb->bus);
97
98
return
0;
99
}
100
101
static
struct
of_device_id
of_pci_phb_ids[] = {
102
{ .
type
=
"pci"
, },
103
{ .type =
"pcix"
, },
104
{ .type =
"pcie"
, },
105
{ .type =
"pciex"
, },
106
{ .type =
"ht"
, },
107
{}
108
};
109
110
static
struct
platform_driver
of_pci_phb_driver = {
111
.
probe
= of_pci_phb_probe,
112
.driver = {
113
.name =
"of-pci"
,
114
.owner =
THIS_MODULE
,
115
.of_match_table = of_pci_phb_ids,
116
},
117
};
118
119
static
__init
int
of_pci_phb_init(
void
)
120
{
121
return
platform_driver_register
(&of_pci_phb_driver);
122
}
123
124
device_initcall
(of_pci_phb_init);
125
126
#endif
/* CONFIG_PPC_OF_PLATFORM_PCI */
Generated on Thu Jan 10 2013 13:13:43 for Linux Kernel by
1.8.2