diff options
Diffstat (limited to 'arch')
| -rw-r--r-- | arch/sparc/kernel/ioport.c | 85 | ||||
| -rw-r--r-- | arch/sparc64/kernel/sbus.c | 31 |
2 files changed, 115 insertions, 1 deletions
diff --git a/arch/sparc/kernel/ioport.c b/arch/sparc/kernel/ioport.c index 00cf41182912..ae4c667c906f 100644 --- a/arch/sparc/kernel/ioport.c +++ b/arch/sparc/kernel/ioport.c | |||
| @@ -39,6 +39,8 @@ | |||
| 39 | #include <asm/io.h> | 39 | #include <asm/io.h> |
| 40 | #include <asm/vaddrs.h> | 40 | #include <asm/vaddrs.h> |
| 41 | #include <asm/oplib.h> | 41 | #include <asm/oplib.h> |
| 42 | #include <asm/prom.h> | ||
| 43 | #include <asm/sbus.h> | ||
| 42 | #include <asm/page.h> | 44 | #include <asm/page.h> |
| 43 | #include <asm/pgalloc.h> | 45 | #include <asm/pgalloc.h> |
| 44 | #include <asm/dma.h> | 46 | #include <asm/dma.h> |
| @@ -458,6 +460,89 @@ void sbus_dma_sync_sg_for_device(struct sbus_dev *sdev, struct scatterlist *sg, | |||
| 458 | { | 460 | { |
| 459 | printk("sbus_dma_sync_sg_for_device: not implemented yet\n"); | 461 | printk("sbus_dma_sync_sg_for_device: not implemented yet\n"); |
| 460 | } | 462 | } |
| 463 | |||
| 464 | /* Support code for sbus_init(). */ | ||
| 465 | /* | ||
| 466 | * XXX This functions appears to be a distorted version of | ||
| 467 | * prom_sbus_ranges_init(), with all sun4d stuff cut away. | ||
| 468 | * Ask DaveM what is going on here, how is sun4d supposed to work... XXX | ||
| 469 | */ | ||
| 470 | /* added back sun4d patch from Thomas Bogendoerfer - should be OK (crn) */ | ||
| 471 | void __init sbus_arch_bus_ranges_init(struct device_node *pn, struct sbus_bus *sbus) | ||
| 472 | { | ||
| 473 | int parent_node = pn->node; | ||
| 474 | |||
| 475 | if (sparc_cpu_model == sun4d) { | ||
| 476 | struct linux_prom_ranges iounit_ranges[PROMREG_MAX]; | ||
| 477 | int num_iounit_ranges, len; | ||
| 478 | |||
| 479 | len = prom_getproperty(parent_node, "ranges", | ||
| 480 | (char *) iounit_ranges, | ||
| 481 | sizeof (iounit_ranges)); | ||
| 482 | if (len != -1) { | ||
| 483 | num_iounit_ranges = | ||
| 484 | (len / sizeof(struct linux_prom_ranges)); | ||
| 485 | prom_adjust_ranges(sbus->sbus_ranges, | ||
| 486 | sbus->num_sbus_ranges, | ||
| 487 | iounit_ranges, num_iounit_ranges); | ||
| 488 | } | ||
| 489 | } | ||
| 490 | } | ||
| 491 | |||
| 492 | void __init sbus_setup_iommu(struct sbus_bus *sbus, struct device_node *dp) | ||
| 493 | { | ||
| 494 | struct device_node *parent = dp->parent; | ||
| 495 | |||
| 496 | if (sparc_cpu_model != sun4d && | ||
| 497 | parent != NULL && | ||
| 498 | !strcmp(parent->name, "iommu")) { | ||
| 499 | extern void iommu_init(int iommu_node, struct sbus_bus *sbus); | ||
| 500 | |||
| 501 | iommu_init(parent->node, sbus); | ||
| 502 | } | ||
| 503 | |||
| 504 | if (sparc_cpu_model == sun4d) { | ||
| 505 | extern void iounit_init(int sbi_node, int iounit_node, | ||
| 506 | struct sbus_bus *sbus); | ||
| 507 | |||
| 508 | iounit_init(dp->node, parent->node, sbus); | ||
| 509 | } | ||
| 510 | } | ||
| 511 | |||
| 512 | void __init sbus_setup_arch_props(struct sbus_bus *sbus, struct device_node *dp) | ||
| 513 | { | ||
| 514 | if (sparc_cpu_model == sun4d) { | ||
| 515 | struct device_node *parent = dp->parent; | ||
| 516 | |||
| 517 | sbus->devid = of_getintprop_default(parent, "device-id", 0); | ||
| 518 | sbus->board = of_getintprop_default(parent, "board#", 0); | ||
| 519 | } | ||
| 520 | } | ||
| 521 | |||
| 522 | int __init sbus_arch_preinit(void) | ||
| 523 | { | ||
| 524 | extern void register_proc_sparc_ioport(void); | ||
| 525 | |||
| 526 | register_proc_sparc_ioport(); | ||
| 527 | |||
| 528 | #ifdef CONFIG_SUN4 | ||
| 529 | { | ||
| 530 | extern void sun4_dvma_init(void); | ||
| 531 | sun4_dvma_init(); | ||
| 532 | } | ||
| 533 | return 1; | ||
| 534 | #else | ||
| 535 | return 0; | ||
| 536 | #endif | ||
| 537 | } | ||
| 538 | |||
| 539 | void __init sbus_arch_postinit(void) | ||
| 540 | { | ||
| 541 | if (sparc_cpu_model == sun4d) { | ||
| 542 | extern void sun4d_init_sbi_irq(void); | ||
| 543 | sun4d_init_sbi_irq(); | ||
| 544 | } | ||
| 545 | } | ||
| 461 | #endif /* CONFIG_SBUS */ | 546 | #endif /* CONFIG_SBUS */ |
| 462 | 547 | ||
| 463 | #ifdef CONFIG_PCI | 548 | #ifdef CONFIG_PCI |
diff --git a/arch/sparc64/kernel/sbus.c b/arch/sparc64/kernel/sbus.c index a72bba398809..d3da23cdc264 100644 --- a/arch/sparc64/kernel/sbus.c +++ b/arch/sparc64/kernel/sbus.c | |||
| @@ -1099,7 +1099,7 @@ static void __init sysio_register_error_handlers(struct sbus_bus *sbus) | |||
| 1099 | } | 1099 | } |
| 1100 | 1100 | ||
| 1101 | /* Boot time initialization. */ | 1101 | /* Boot time initialization. */ |
| 1102 | void __init sbus_iommu_init(int __node, struct sbus_bus *sbus) | 1102 | static void __init sbus_iommu_init(int __node, struct sbus_bus *sbus) |
| 1103 | { | 1103 | { |
| 1104 | struct linux_prom64_registers *pr; | 1104 | struct linux_prom64_registers *pr; |
| 1105 | struct device_node *dp; | 1105 | struct device_node *dp; |
| @@ -1247,3 +1247,32 @@ void sbus_fill_device_irq(struct sbus_dev *sdev) | |||
| 1247 | sdev->irqs[0] = sbus_build_irq(sdev->bus, pri); | 1247 | sdev->irqs[0] = sbus_build_irq(sdev->bus, pri); |
| 1248 | } | 1248 | } |
| 1249 | } | 1249 | } |
| 1250 | |||
| 1251 | void __init sbus_arch_bus_ranges_init(struct device_node *pn, struct sbus_bus *sbus) | ||
| 1252 | { | ||
| 1253 | } | ||
| 1254 | |||
| 1255 | void __init sbus_setup_iommu(struct sbus_bus *sbus, struct device_node *dp) | ||
| 1256 | { | ||
| 1257 | sbus_iommu_init(dp->node, sbus); | ||
| 1258 | } | ||
| 1259 | |||
| 1260 | void __init sbus_setup_arch_props(struct sbus_bus *sbus, struct device_node *dp) | ||
| 1261 | { | ||
| 1262 | } | ||
| 1263 | |||
| 1264 | int __init sbus_arch_preinit(void) | ||
| 1265 | { | ||
| 1266 | return 0; | ||
| 1267 | } | ||
| 1268 | |||
| 1269 | void __init sbus_arch_postinit(void) | ||
| 1270 | { | ||
| 1271 | extern void firetruck_init(void); | ||
| 1272 | extern void auxio_probe(void); | ||
| 1273 | extern void clock_probe(void); | ||
| 1274 | |||
| 1275 | firetruck_init(); | ||
| 1276 | auxio_probe(); | ||
| 1277 | clock_probe(); | ||
| 1278 | } | ||
