aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/sparc/kernel/sun4d_irq.c34
1 files changed, 22 insertions, 12 deletions
diff --git a/arch/sparc/kernel/sun4d_irq.c b/arch/sparc/kernel/sun4d_irq.c
index eaec8a90fb9f..1d13c5bda0b1 100644
--- a/arch/sparc/kernel/sun4d_irq.c
+++ b/arch/sparc/kernel/sun4d_irq.c
@@ -334,7 +334,8 @@ unsigned int sun4d_build_device_irq(struct platform_device *op,
334 unsigned int real_irq) 334 unsigned int real_irq)
335{ 335{
336 struct device_node *dp = op->dev.of_node; 336 struct device_node *dp = op->dev.of_node;
337 struct device_node *io_unit, *sbi = dp->parent; 337 struct device_node *board_parent, *bus = dp->parent;
338 char *bus_connection;
338 const struct linux_prom_registers *regs; 339 const struct linux_prom_registers *regs;
339 unsigned int pil; 340 unsigned int pil;
340 unsigned int irq; 341 unsigned int irq;
@@ -342,13 +343,20 @@ unsigned int sun4d_build_device_irq(struct platform_device *op,
342 int sbusl; 343 int sbusl;
343 344
344 irq = real_irq; 345 irq = real_irq;
345 while (sbi) { 346 while (bus) {
346 if (!strcmp(sbi->name, "sbi")) 347 if (!strcmp(bus->name, "sbi")) {
348 bus_connection = "io-unit";
347 break; 349 break;
350 }
351
352 if (!strcmp(bus->name, "bootbus")) {
353 bus_connection = "cpu-unit";
354 break;
355 }
348 356
349 sbi = sbi->parent; 357 bus = bus->parent;
350 } 358 }
351 if (!sbi) 359 if (!bus)
352 goto err_out; 360 goto err_out;
353 361
354 regs = of_get_property(dp, "reg", NULL); 362 regs = of_get_property(dp, "reg", NULL);
@@ -358,17 +366,19 @@ unsigned int sun4d_build_device_irq(struct platform_device *op,
358 slot = regs->which_io; 366 slot = regs->which_io;
359 367
360 /* 368 /*
361 * If SBI's parent is not io-unit or the io-unit lacks 369 * If Bus nodes parent is not io-unit/cpu-unit or the io-unit/cpu-unit
362 * a "board#" property, something is very wrong. 370 * lacks a "board#" property, something is very wrong.
363 */ 371 */
364 if (!sbi->parent || strcmp(sbi->parent->name, "io-unit")) { 372 if (!bus->parent || strcmp(bus->parent->name, bus_connection)) {
365 printk("%s: Error, parent is not io-unit.\n", sbi->full_name); 373 printk(KERN_ERR "%s: Error, parent is not %s.\n",
374 bus->full_name, bus_connection);
366 goto err_out; 375 goto err_out;
367 } 376 }
368 io_unit = sbi->parent; 377 board_parent = bus->parent;
369 board = of_getintprop_default(io_unit, "board#", -1); 378 board = of_getintprop_default(board_parent, "board#", -1);
370 if (board == -1) { 379 if (board == -1) {
371 printk("%s: Error, lacks board# property.\n", io_unit->full_name); 380 printk(KERN_ERR "%s: Error, lacks board# property.\n",
381 board_parent->full_name);
372 goto err_out; 382 goto err_out;
373 } 383 }
374 384