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

sparc: Remove SBUS layer resource and irq handling.

All the drivers use OF device objects now for this
information.

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

+1 -185
-15
arch/sparc/include/asm/sbus_32.h
··· 51 51 int prom_node; 52 52 char prom_name[64]; 53 53 int slot; 54 - 55 - struct resource resource[PROMREG_MAX]; 56 - 57 - struct linux_prom_registers reg_addrs[PROMREG_MAX]; 58 - int num_registers; 59 - 60 - struct linux_prom_ranges device_ranges[PROMREG_MAX]; 61 - int num_device_ranges; 62 - 63 - unsigned int irqs[4]; 64 - int num_irqs; 65 54 }; 66 55 #define to_sbus_device(d) container_of(d, struct sbus_dev, ofdev.dev) 67 56 ··· 62 73 int prom_node; /* PROM device tree node for this SBus */ 63 74 char prom_name[64]; /* Usually "sbus" or "sbi" */ 64 75 int clock_freq; 65 - 66 - struct linux_prom_ranges sbus_ranges[PROMREG_MAX]; 67 - int num_sbus_ranges; 68 76 }; 69 77 #define to_sbus(d) container_of(d, struct sbus_bus, ofdev.dev) 70 78 ··· 89 103 void prom_adjust_ranges(struct linux_prom_ranges *, int, 90 104 struct linux_prom_ranges *, int); 91 105 92 - extern void sbus_arch_bus_ranges_init(struct device_node *, struct sbus_bus *); 93 106 extern void sbus_setup_iommu(struct sbus_bus *, struct device_node *); 94 107 extern int sbus_arch_preinit(void); 95 108 extern void sbus_arch_postinit(void);
-16
arch/sparc/include/asm/sbus_64.h
··· 51 51 int prom_node; 52 52 char prom_name[64]; 53 53 int slot; 54 - 55 - struct resource resource[PROMREG_MAX]; 56 - 57 - struct linux_prom_registers reg_addrs[PROMREG_MAX]; 58 - int num_registers; 59 - 60 - struct linux_prom_ranges device_ranges[PROMREG_MAX]; 61 - int num_device_ranges; 62 - 63 - unsigned int irqs[4]; 64 - int num_irqs; 65 54 }; 66 55 #define to_sbus_device(d) container_of(d, struct sbus_dev, ofdev.dev) 67 56 ··· 62 73 int prom_node; /* OBP node of SBUS */ 63 74 char prom_name[64]; /* Usually "sbus" or "sbi" */ 64 75 int clock_freq; 65 - 66 - struct linux_prom_ranges sbus_ranges[PROMREG_MAX]; 67 - int num_sbus_ranges; 68 - 69 76 int portid; 70 77 }; 71 78 #define to_sbus(d) container_of(d, struct sbus_bus, ofdev.dev) ··· 79 94 for ((bus) = sbus_root; (bus); (bus) = (bus)->next) \ 80 95 for ((device) = (bus)->devices; (device); (device) = (device)->next) 81 96 82 - extern void sbus_arch_bus_ranges_init(struct device_node *, struct sbus_bus *); 83 97 extern void sbus_setup_iommu(struct sbus_bus *, struct device_node *); 84 98 extern int sbus_arch_preinit(void); 85 99 extern void sbus_arch_postinit(void);
-27
arch/sparc/kernel/ioport.c
··· 394 394 } 395 395 396 396 /* Support code for sbus_init(). */ 397 - /* 398 - * XXX This functions appears to be a distorted version of 399 - * prom_sbus_ranges_init(), with all sun4d stuff cut away. 400 - * Ask DaveM what is going on here, how is sun4d supposed to work... XXX 401 - */ 402 - /* added back sun4d patch from Thomas Bogendoerfer - should be OK (crn) */ 403 - void __init sbus_arch_bus_ranges_init(struct device_node *pn, struct sbus_bus *sbus) 404 - { 405 - int parent_node = pn->node; 406 - 407 - if (sparc_cpu_model == sun4d) { 408 - struct linux_prom_ranges iounit_ranges[PROMREG_MAX]; 409 - int num_iounit_ranges, len; 410 - 411 - len = prom_getproperty(parent_node, "ranges", 412 - (char *) iounit_ranges, 413 - sizeof (iounit_ranges)); 414 - if (len != -1) { 415 - num_iounit_ranges = 416 - (len / sizeof(struct linux_prom_ranges)); 417 - prom_adjust_ranges(sbus->sbus_ranges, 418 - sbus->num_sbus_ranges, 419 - iounit_ranges, num_iounit_ranges); 420 - } 421 - } 422 - } 423 - 424 397 void __init sbus_setup_iommu(struct sbus_bus *sbus, struct device_node *dp) 425 398 { 426 399 #ifndef CONFIG_SUN4
-4
arch/sparc64/kernel/sbus.c
··· 650 650 prom_printf("sbus_iommu_init: Fatal memory allocation error.\n"); 651 651 } 652 652 653 - void __init sbus_arch_bus_ranges_init(struct device_node *pn, struct sbus_bus *sbus) 654 - { 655 - } 656 - 657 653 void __init sbus_setup_iommu(struct sbus_bus *sbus, struct device_node *dp) 658 654 { 659 655 sbus_iommu_init(dp->node, sbus);
+1 -123
drivers/sbus/sbus.c
··· 51 51 static void __init fill_sbus_device(struct device_node *dp, struct sbus_dev *sdev) 52 52 { 53 53 struct dev_archdata *sd; 54 - unsigned long base; 55 - const void *pval; 56 - int len, err; 54 + int err; 57 55 58 56 sdev->prom_node = dp->node; 59 57 strcpy(sdev->prom_name, dp->name); 60 - 61 - pval = of_get_property(dp, "reg", &len); 62 - sdev->num_registers = 0; 63 - if (pval) { 64 - memcpy(sdev->reg_addrs, pval, len); 65 - 66 - sdev->num_registers = 67 - len / sizeof(struct linux_prom_registers); 68 - 69 - base = (unsigned long) sdev->reg_addrs[0].phys_addr; 70 - 71 - /* Compute the slot number. */ 72 - if (base >= SUN_SBUS_BVADDR && sparc_cpu_model == sun4m) 73 - sdev->slot = sbus_dev_slot(base); 74 - else 75 - sdev->slot = sdev->reg_addrs[0].which_io; 76 - } 77 - 78 - pval = of_get_property(dp, "ranges", &len); 79 - sdev->num_device_ranges = 0; 80 - if (pval) { 81 - memcpy(sdev->device_ranges, pval, len); 82 - sdev->num_device_ranges = 83 - len / sizeof(struct linux_prom_ranges); 84 - } 85 58 86 59 sd = &sdev->ofdev.dev.archdata; 87 60 sd->prom_node = dp; ··· 76 103 err = sysfs_create_file(&sdev->ofdev.dev.kobj, &dev_attr_obppath.attr); 77 104 78 105 fill_sbus_device_iommu(sdev); 79 - } 80 - 81 - static void __init sbus_bus_ranges_init(struct device_node *dp, struct sbus_bus *sbus) 82 - { 83 - const void *pval; 84 - int len; 85 - 86 - pval = of_get_property(dp, "ranges", &len); 87 - sbus->num_sbus_ranges = 0; 88 - if (pval) { 89 - memcpy(sbus->sbus_ranges, pval, len); 90 - sbus->num_sbus_ranges = 91 - len / sizeof(struct linux_prom_ranges); 92 - 93 - sbus_arch_bus_ranges_init(dp->parent, sbus); 94 - } 95 - } 96 - 97 - static void __init __apply_ranges_to_regs(struct linux_prom_ranges *ranges, 98 - int num_ranges, 99 - struct linux_prom_registers *regs, 100 - int num_regs) 101 - { 102 - if (num_ranges) { 103 - int regnum; 104 - 105 - for (regnum = 0; regnum < num_regs; regnum++) { 106 - int rngnum; 107 - 108 - for (rngnum = 0; rngnum < num_ranges; rngnum++) { 109 - if (regs[regnum].which_io == ranges[rngnum].ot_child_space) 110 - break; 111 - } 112 - if (rngnum == num_ranges) { 113 - /* We used to flag this as an error. Actually 114 - * some devices do not report the regs as we expect. 115 - * For example, see SUNW,pln device. In that case 116 - * the reg property is in a format internal to that 117 - * node, ie. it is not in the SBUS register space 118 - * per se. -DaveM 119 - */ 120 - return; 121 - } 122 - regs[regnum].which_io = ranges[rngnum].ot_parent_space; 123 - regs[regnum].phys_addr -= ranges[rngnum].ot_child_base; 124 - regs[regnum].phys_addr += ranges[rngnum].ot_parent_base; 125 - } 126 - } 127 - } 128 - 129 - static void __init __fixup_regs_sdev(struct sbus_dev *sdev) 130 - { 131 - if (sdev->num_registers != 0) { 132 - struct sbus_dev *parent = sdev->parent; 133 - int i; 134 - 135 - while (parent != NULL) { 136 - __apply_ranges_to_regs(parent->device_ranges, 137 - parent->num_device_ranges, 138 - sdev->reg_addrs, 139 - sdev->num_registers); 140 - 141 - parent = parent->parent; 142 - } 143 - 144 - __apply_ranges_to_regs(sdev->bus->sbus_ranges, 145 - sdev->bus->num_sbus_ranges, 146 - sdev->reg_addrs, 147 - sdev->num_registers); 148 - 149 - for (i = 0; i < sdev->num_registers; i++) { 150 - struct resource *res = &sdev->resource[i]; 151 - 152 - res->start = sdev->reg_addrs[i].phys_addr; 153 - res->end = (res->start + 154 - (unsigned long)sdev->reg_addrs[i].reg_size - 1UL); 155 - res->flags = IORESOURCE_IO | 156 - (sdev->reg_addrs[i].which_io & 0xff); 157 - } 158 - } 159 - } 160 - 161 - static void __init sbus_fixup_all_regs(struct sbus_dev *first_sdev) 162 - { 163 - struct sbus_dev *sdev; 164 - 165 - for (sdev = first_sdev; sdev; sdev = sdev->next) { 166 - if (sdev->child) 167 - sbus_fixup_all_regs(sdev->child); 168 - __fixup_regs_sdev(sdev); 169 - } 170 106 } 171 107 172 108 /* We preserve the "probe order" of these bus and device lists to give ··· 145 263 146 264 strcpy(sbus->prom_name, dp->name); 147 265 148 - sbus_bus_ranges_init(dp, sbus); 149 - 150 266 sbus->ofdev.node = dp; 151 267 sbus->ofdev.dev.parent = NULL; 152 268 sbus->ofdev.dev.bus = &sbus_bus_type; ··· 175 295 } 176 296 dev_dp = dev_dp->sibling; 177 297 } 178 - 179 - sbus_fixup_all_regs(sbus->devices); 180 298 } 181 299 182 300 static int __init sbus_init(void)