1 #include <linux/kernel.h>
2 #include <linux/init.h>
4 #include <linux/slab.h>
7 #include <asm/of_device.h>
10 struct sparc_isa_bridge
*isa_chain
;
12 static void __init
fatal_err(const char *reason
)
14 prom_printf("ISA: fatal error, %s.\n", reason
);
17 static void __init
report_dev(struct sparc_isa_device
*isa_dev
, int child
)
20 printk(" (%s)", isa_dev
->prom_node
->name
);
22 printk(" [%s", isa_dev
->prom_node
->name
);
25 static void __init
isa_dev_get_resource(struct sparc_isa_device
*isa_dev
)
27 struct of_device
*op
= of_find_device_by_node(isa_dev
->prom_node
);
29 memcpy(&isa_dev
->resource
, &op
->resource
[0], sizeof(struct resource
));
32 static void __init
isa_dev_get_irq(struct sparc_isa_device
*isa_dev
)
34 struct of_device
*op
= of_find_device_by_node(isa_dev
->prom_node
);
36 if (!op
|| !op
->num_irqs
) {
37 isa_dev
->irq
= PCI_IRQ_NONE
;
39 isa_dev
->irq
= op
->irqs
[0];
43 static void __init
isa_fill_children(struct sparc_isa_device
*parent_isa_dev
)
45 struct device_node
*dp
= parent_isa_dev
->prom_node
->child
;
52 struct sparc_isa_device
*isa_dev
;
54 isa_dev
= kzalloc(sizeof(*isa_dev
), GFP_KERNEL
);
56 fatal_err("cannot allocate child isa_dev");
60 /* Link it in to parent. */
61 isa_dev
->next
= parent_isa_dev
->child
;
62 parent_isa_dev
->child
= isa_dev
;
64 isa_dev
->bus
= parent_isa_dev
->bus
;
65 isa_dev
->prom_node
= dp
;
67 isa_dev_get_resource(isa_dev
);
68 isa_dev_get_irq(isa_dev
);
70 report_dev(isa_dev
, 1);
76 static void __init
isa_fill_devices(struct sparc_isa_bridge
*isa_br
)
78 struct device_node
*dp
= isa_br
->prom_node
->child
;
81 struct sparc_isa_device
*isa_dev
;
82 struct dev_archdata
*sd
;
84 isa_dev
= kzalloc(sizeof(*isa_dev
), GFP_KERNEL
);
86 printk(KERN_DEBUG
"ISA: cannot allocate isa_dev");
90 sd
= &isa_dev
->ofdev
.dev
.archdata
;
92 sd
->op
= &isa_dev
->ofdev
;
93 sd
->iommu
= isa_br
->ofdev
.dev
.parent
->archdata
.iommu
;
94 sd
->stc
= isa_br
->ofdev
.dev
.parent
->archdata
.stc
;
96 isa_dev
->ofdev
.node
= dp
;
97 isa_dev
->ofdev
.dev
.parent
= &isa_br
->ofdev
.dev
;
98 isa_dev
->ofdev
.dev
.bus
= &isa_bus_type
;
99 sprintf(isa_dev
->ofdev
.dev
.bus_id
, "isa[%08x]", dp
->node
);
101 /* Register with core */
102 if (of_device_register(&isa_dev
->ofdev
) != 0) {
103 printk(KERN_DEBUG
"isa: device registration error for %s!\n",
104 dp
->path_component_name
);
110 isa_dev
->next
= NULL
;
111 if (isa_br
->devices
== NULL
) {
112 isa_br
->devices
= isa_dev
;
114 struct sparc_isa_device
*tmp
= isa_br
->devices
;
122 isa_dev
->bus
= isa_br
;
123 isa_dev
->prom_node
= dp
;
125 isa_dev_get_resource(isa_dev
);
126 isa_dev_get_irq(isa_dev
);
128 report_dev(isa_dev
, 0);
130 isa_fill_children(isa_dev
);
139 void __init
isa_init(void)
141 struct pci_dev
*pdev
;
142 unsigned short vendor
, device
;
145 vendor
= PCI_VENDOR_ID_AL
;
146 device
= PCI_DEVICE_ID_AL_M1533
;
149 while ((pdev
= pci_get_device(vendor
, device
, pdev
)) != NULL
) {
150 struct sparc_isa_bridge
*isa_br
;
151 struct device_node
*dp
;
153 dp
= pci_device_to_OF_node(pdev
);
155 isa_br
= kzalloc(sizeof(*isa_br
), GFP_KERNEL
);
157 printk(KERN_DEBUG
"isa: cannot allocate sparc_isa_bridge");
162 isa_br
->ofdev
.node
= dp
;
163 isa_br
->ofdev
.dev
.parent
= &pdev
->dev
;
164 isa_br
->ofdev
.dev
.bus
= &isa_bus_type
;
165 sprintf(isa_br
->ofdev
.dev
.bus_id
, "isa%d", index
);
167 /* Register with core */
168 if (of_device_register(&isa_br
->ofdev
) != 0) {
169 printk(KERN_DEBUG
"isa: device registration error for %s!\n",
170 dp
->path_component_name
);
177 isa_br
->next
= isa_chain
;
181 isa_br
->index
= index
++;
182 isa_br
->prom_node
= dp
;
184 printk("isa%d:", isa_br
->index
);
186 isa_fill_devices(isa_br
);