Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

sparc32: Convert sun4d IRQ code to use generic device tree probing.

Signed-off-by: David S. Miller <davem@davemloft.net>

+48 -35
+48 -35
arch/sparc/kernel/sun4d_irq.c
··· 409 409 /* Setup IRQ distribution scheme. */ 410 410 void __init sun4d_distribute_irqs(void) 411 411 { 412 + struct device_node *dp; 413 + 412 414 #ifdef DISTRIBUTE_IRQS 413 - struct sbus_bus *sbus; 414 - unsigned long sbus_serving_map; 415 + cpumask_t sbus_serving_map; 415 416 416 417 sbus_serving_map = cpu_present_map; 417 - for_each_sbus(sbus) { 418 - if ((sbus->board * 2) == boot_cpu_id && (cpu_present_map & (1 << (sbus->board * 2 + 1)))) 419 - sbus_tid[sbus->board] = (sbus->board * 2 + 1); 420 - else if (cpu_present_map & (1 << (sbus->board * 2))) 421 - sbus_tid[sbus->board] = (sbus->board * 2); 422 - else if (cpu_present_map & (1 << (sbus->board * 2 + 1))) 423 - sbus_tid[sbus->board] = (sbus->board * 2 + 1); 418 + for_each_node_by_name(dp, "sbi") { 419 + int board = of_getintprop_default(dp, "board#", 0); 420 + 421 + if ((board * 2) == boot_cpu_id && cpu_isset(board * 2 + 1, cpu_present_map)) 422 + sbus_tid[board] = (board * 2 + 1); 423 + else if (cpu_isset(board * 2, cpu_present_map)) 424 + sbus_tid[board] = (board * 2); 425 + else if (cpu_isset(board * 2 + 1, cpu_present_map)) 426 + sbus_tid[board] = (board * 2 + 1); 424 427 else 425 - sbus_tid[sbus->board] = 0xff; 426 - if (sbus_tid[sbus->board] != 0xff) 427 - sbus_serving_map &= ~(1 << sbus_tid[sbus->board]); 428 + sbus_tid[board] = 0xff; 429 + if (sbus_tid[board] != 0xff) 430 + cpu_clear(sbus_tid[board], sbus_serving_map); 428 431 } 429 - for_each_sbus(sbus) 430 - if (sbus_tid[sbus->board] == 0xff) { 432 + for_each_node_by_name(dp, "sbi") { 433 + int board = of_getintprop_default(dp, "board#", 0); 434 + if (sbus_tid[board] == 0xff) { 431 435 int i = 31; 432 436 433 - if (!sbus_serving_map) 437 + if (cpus_empty(sbus_serving_map)) 434 438 sbus_serving_map = cpu_present_map; 435 - while (!(sbus_serving_map & (1 << i))) 439 + while (cpu_isset(i, sbus_serving_map)) 436 440 i--; 437 - sbus_tid[sbus->board] = i; 438 - sbus_serving_map &= ~(1 << i); 441 + sbus_tid[board] = i; 442 + cpu_clear(i, sbus_serving_map); 439 443 } 440 - for_each_sbus(sbus) { 441 - printk("sbus%d IRQs directed to CPU%d\n", sbus->board, sbus_tid[sbus->board]); 442 - set_sbi_tid(sbus->devid, sbus_tid[sbus->board] << 3); 444 + } 445 + for_each_node_by_name(dp, "sbi") { 446 + int devid = of_getintprop_default(dp, "device-id", 0); 447 + int board = of_getintprop_default(dp, "board#", 0); 448 + printk("sbus%d IRQs directed to CPU%d\n", board, sbus_tid[board]); 449 + set_sbi_tid(devid, sbus_tid[board] << 3); 443 450 } 444 451 #else 445 - struct sbus_bus *sbus; 446 452 int cpuid = cpu_logical_map(1); 447 453 448 454 if (cpuid == -1) 449 455 cpuid = cpu_logical_map(0); 450 - for_each_sbus(sbus) { 451 - sbus_tid[sbus->board] = cpuid; 452 - set_sbi_tid(sbus->devid, cpuid << 3); 456 + for_each_node_by_name(dp, "sbi") { 457 + int devid = of_getintprop_default(dp, "device-id", 0); 458 + int board = of_getintprop_default(dp, "board#", 0); 459 + sbus_tid[board] = cpuid; 460 + set_sbi_tid(devid, cpuid << 3); 453 461 } 454 462 printk("All sbus IRQs directed to CPU%d\n", cpuid); 455 463 #endif ··· 549 541 550 542 void __init sun4d_init_sbi_irq(void) 551 543 { 552 - struct sbus_bus *sbus; 553 - unsigned mask; 544 + struct device_node *dp; 554 545 555 546 nsbi = 0; 556 - for_each_sbus(sbus) 547 + for_each_node_by_name(dp, "sbi") 557 548 nsbi++; 558 549 sbus_actions = kzalloc (nsbi * 8 * 4 * sizeof(struct sbus_action), GFP_ATOMIC); 559 550 if (!sbus_actions) { 560 551 prom_printf("SUN4D: Cannot allocate sbus_actions, halting.\n"); 561 552 prom_halt(); 562 553 } 563 - for_each_sbus(sbus) { 554 + for_each_node_by_name(dp, "sbi") { 555 + int devid = of_getintprop_default(dp, "device-id", 0); 556 + int board = of_getintprop_default(dp, "board#", 0); 557 + unsigned int mask; 558 + 564 559 #ifdef CONFIG_SMP 565 - extern unsigned char boot_cpu_id; 560 + { 561 + extern unsigned char boot_cpu_id; 566 562 567 - set_sbi_tid(sbus->devid, boot_cpu_id << 3); 568 - sbus_tid[sbus->board] = boot_cpu_id; 563 + set_sbi_tid(devid, boot_cpu_id << 3); 564 + sbus_tid[board] = boot_cpu_id; 565 + } 569 566 #endif 570 567 /* Get rid of pending irqs from PROM */ 571 - mask = acquire_sbi(sbus->devid, 0xffffffff); 568 + mask = acquire_sbi(devid, 0xffffffff); 572 569 if (mask) { 573 - printk ("Clearing pending IRQs %08x on SBI %d\n", mask, sbus->board); 574 - release_sbi(sbus->devid, mask); 570 + printk ("Clearing pending IRQs %08x on SBI %d\n", mask, board); 571 + release_sbi(devid, mask); 575 572 } 576 573 } 577 574 }