1 #include <linux/kernel.h>
2 #include <linux/init.h>
4 #include <linux/slab.h>
8 struct sparc_isa_bridge *isa_chain;
10 static void __init fatal_err(const char *reason)
12 prom_printf("ISA: fatal error, %s.\n", reason);
15 static void __init report_dev(struct sparc_isa_device *isa_dev, int child)
18 printk(" (%s)", isa_dev->prom_node->name);
20 printk(" [%s", isa_dev->prom_node->name);
23 static struct linux_prom_registers * __init
24 isa_dev_get_resource(struct sparc_isa_device *isa_dev)
26 struct linux_prom_registers *pregs;
27 unsigned long base, len;
30 pregs = of_get_property(isa_dev->prom_node, "reg", &prop_len);
32 /* Only the first one is interesting. */
33 len = pregs[0].reg_size;
34 base = (((unsigned long)pregs[0].which_io << 32) |
35 (unsigned long)pregs[0].phys_addr);
36 base += isa_dev->bus->parent->io_space.start;
38 isa_dev->resource.start = base;
39 isa_dev->resource.end = (base + len - 1UL);
40 isa_dev->resource.flags = IORESOURCE_IO;
41 isa_dev->resource.name = isa_dev->prom_node->name;
43 request_resource(&isa_dev->bus->parent->io_space,
49 /* I can't believe they didn't put a real INO in the isa device
50 * interrupts property. The whole point of the OBP properties
51 * is to shield the kernel from IRQ routing details.
53 * The P1275 standard for ISA devices seems to also have been
56 * On later systems, an interrupt-map and interrupt-map-mask scheme
57 * akin to EBUS is used.
62 } grover_irq_table[] = {
63 { 1, 0x00 }, /* dma, unknown ino at this point */
64 { 2, 0x27 }, /* floppy */
65 { 3, 0x22 }, /* parallel */
66 { 4, 0x2b }, /* serial */
67 { 5, 0x25 }, /* acpi power management */
69 { 0, 0x00 } /* end of table */
72 static int __init isa_dev_get_irq_using_imap(struct sparc_isa_device *isa_dev,
73 struct sparc_isa_bridge *isa_br,
75 struct linux_prom_registers *pregs)
77 unsigned int hi, lo, irq;
80 hi = pregs->which_io & isa_br->isa_intmask.phys_hi;
81 lo = pregs->phys_addr & isa_br->isa_intmask.phys_lo;
82 irq = *interrupt & isa_br->isa_intmask.interrupt;
83 for (i = 0; i < isa_br->num_isa_intmap; i++) {
84 if ((isa_br->isa_intmap[i].phys_hi == hi) &&
85 (isa_br->isa_intmap[i].phys_lo == lo) &&
86 (isa_br->isa_intmap[i].interrupt == irq)) {
87 *interrupt = isa_br->isa_intmap[i].cinterrupt;
94 static void __init isa_dev_get_irq(struct sparc_isa_device *isa_dev,
95 struct linux_prom_registers *pregs)
99 irq_prop = of_getintprop_default(isa_dev->prom_node,
104 struct pci_controller_info *pcic;
105 struct pci_pbm_info *pbm;
108 if (isa_dev->bus->num_isa_intmap) {
109 if (!isa_dev_get_irq_using_imap(isa_dev,
116 for (i = 0; grover_irq_table[i].obp_irq != 0; i++) {
117 if (grover_irq_table[i].obp_irq == irq_prop) {
118 int ino = grover_irq_table[i].pci_ino;
130 pbm = isa_dev->bus->parent;
132 isa_dev->irq = pcic->irq_build(pbm, NULL, irq_prop);
137 isa_dev->irq = PCI_IRQ_NONE;
140 static void __init isa_fill_children(struct sparc_isa_device *parent_isa_dev)
142 struct device_node *dp = parent_isa_dev->prom_node->child;
149 struct linux_prom_registers *regs;
150 struct sparc_isa_device *isa_dev;
152 isa_dev = kmalloc(sizeof(*isa_dev), GFP_KERNEL);
154 fatal_err("cannot allocate child isa_dev");
158 memset(isa_dev, 0, sizeof(*isa_dev));
160 /* Link it in to parent. */
161 isa_dev->next = parent_isa_dev->child;
162 parent_isa_dev->child = isa_dev;
164 isa_dev->bus = parent_isa_dev->bus;
165 isa_dev->prom_node = dp;
167 regs = isa_dev_get_resource(isa_dev);
168 isa_dev_get_irq(isa_dev, regs);
170 report_dev(isa_dev, 1);
176 static void __init isa_fill_devices(struct sparc_isa_bridge *isa_br)
178 struct device_node *dp = isa_br->prom_node->child;
181 struct linux_prom_registers *regs;
182 struct sparc_isa_device *isa_dev;
184 isa_dev = kmalloc(sizeof(*isa_dev), GFP_KERNEL);
186 fatal_err("cannot allocate isa_dev");
190 memset(isa_dev, 0, sizeof(*isa_dev));
193 isa_dev->next = NULL;
194 if (isa_br->devices == NULL) {
195 isa_br->devices = isa_dev;
197 struct sparc_isa_device *tmp = isa_br->devices;
205 isa_dev->bus = isa_br;
206 isa_dev->prom_node = dp;
208 regs = isa_dev_get_resource(isa_dev);
209 isa_dev_get_irq(isa_dev, regs);
211 report_dev(isa_dev, 0);
213 isa_fill_children(isa_dev);
221 static void __init get_bridge_props(struct sparc_isa_bridge *isa_br)
223 struct device_node *dp = isa_br->prom_node;
227 pval = of_get_property(dp, "ranges", &len);
229 memcpy(isa_br->isa_ranges, pval, len);
230 isa_br->num_isa_ranges =
231 len / sizeof(struct linux_prom_isa_ranges);
233 isa_br->num_isa_ranges = 0;
236 pval = of_get_property(dp, "interrupt-map", &len);
238 memcpy(isa_br->isa_intmap, pval, len);
239 isa_br->num_isa_intmap =
240 (len / sizeof(struct linux_prom_isa_intmap));
242 isa_br->num_isa_intmap = 0;
245 pval = of_get_property(dp, "interrupt-map-mask", &len);
247 memcpy(&isa_br->isa_intmask, pval,
248 sizeof(isa_br->isa_intmask));
251 void __init isa_init(void)
253 struct pci_dev *pdev;
254 unsigned short vendor, device;
257 vendor = PCI_VENDOR_ID_AL;
258 device = PCI_DEVICE_ID_AL_M1533;
261 while ((pdev = pci_get_device(vendor, device, pdev)) != NULL) {
262 struct pcidev_cookie *pdev_cookie;
263 struct pci_pbm_info *pbm;
264 struct sparc_isa_bridge *isa_br;
266 pdev_cookie = pdev->sysdata;
268 printk("ISA: Warning, ISA bridge ignored due to "
269 "lack of OBP data.\n");
272 pbm = pdev_cookie->pbm;
274 isa_br = kmalloc(sizeof(*isa_br), GFP_KERNEL);
276 fatal_err("cannot allocate sparc_isa_bridge");
280 memset(isa_br, 0, sizeof(*isa_br));
283 isa_br->next = isa_chain;
286 isa_br->parent = pbm;
288 isa_br->index = index++;
289 isa_br->prom_node = pdev_cookie->prom_node;
291 get_bridge_props(isa_br);
293 printk("isa%d:", isa_br->index);
295 isa_fill_devices(isa_br);