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
* <benh@kernel.crashing.org>
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