summaryrefslogtreecommitdiffstats
path: root/arch/sparc64
diff options
context:
space:
mode:
Diffstat (limited to 'arch/sparc64')
-rw-r--r--arch/sparc64/kernel/ebus.c65
-rw-r--r--arch/sparc64/kernel/isa.c68
2 files changed, 41 insertions, 92 deletions
diff --git a/arch/sparc64/kernel/ebus.c b/arch/sparc64/kernel/ebus.c
index 919a91d9e5d..33d79e10c65 100644
--- a/arch/sparc64/kernel/ebus.c
+++ b/arch/sparc64/kernel/ebus.c
@@ -283,60 +283,32 @@ static inline void *ebus_alloc(size_t size)
return mem;
}
-static void __init ebus_ranges_init(struct linux_ebus *ebus)
-{
- struct linux_prom_ebus_ranges *rngs;
- int len;
-
- ebus->num_ebus_ranges = 0;
- rngs = of_get_property(ebus->prom_node, "ranges", &len);
- if (rngs) {
- memcpy(ebus->ebus_ranges, rngs, len);
- ebus->num_ebus_ranges =
- (len / sizeof(struct linux_prom_ebus_ranges));
- }
-}
-
-static void __init ebus_intmap_init(struct linux_ebus *ebus)
+int __init ebus_intmap_match(struct linux_ebus *ebus,
+ struct linux_prom_registers *reg,
+ int *interrupt)
{
struct linux_prom_ebus_intmap *imap;
struct linux_prom_ebus_intmask *imask;
- int len;
+ unsigned int hi, lo, irq;
+ int i, len, n_imap;
- ebus->num_ebus_intmap = 0;
imap = of_get_property(ebus->prom_node, "interrupt-map", &len);
if (!imap)
- return;
-
- memcpy(ebus->ebus_intmap, imap, len);
- ebus->num_ebus_intmap = (len / sizeof(struct linux_prom_ebus_intmap));
-
- imask = of_get_property(ebus->prom_node, "interrupt-map-mask", &len);
- if (!imask) {
- prom_printf("EBUS: can't get interrupt-map-mask\n");
- prom_halt();
- }
- memcpy(&ebus->ebus_intmask, imask, sizeof(ebus->ebus_intmask));
-}
-
-int __init ebus_intmap_match(struct linux_ebus *ebus,
- struct linux_prom_registers *reg,
- int *interrupt)
-{
- unsigned int hi, lo, irq;
- int i;
+ return 0;
+ n_imap = len / sizeof(imap[0]);
- if (!ebus->num_ebus_intmap)
+ imask = of_get_property(ebus->prom_node, "interrupt-map-mask", NULL);
+ if (!imask)
return 0;
- hi = reg->which_io & ebus->ebus_intmask.phys_hi;
- lo = reg->phys_addr & ebus->ebus_intmask.phys_lo;
- irq = *interrupt & ebus->ebus_intmask.interrupt;
- for (i = 0; i < ebus->num_ebus_intmap; i++) {
- if ((ebus->ebus_intmap[i].phys_hi == hi) &&
- (ebus->ebus_intmap[i].phys_lo == lo) &&
- (ebus->ebus_intmap[i].interrupt == irq)) {
- *interrupt = ebus->ebus_intmap[i].cinterrupt;
+ hi = reg->which_io & imask->phys_hi;
+ lo = reg->phys_addr & imask->phys_lo;
+ irq = *interrupt & imask->interrupt;
+ for (i = 0; i < n_imap; i++) {
+ if ((imap[i].phys_hi == hi) &&
+ (imap[i].phys_lo == lo) &&
+ (imap[i].interrupt == irq)) {
+ *interrupt = imap[i].cinterrupt;
return 0;
}
}
@@ -598,9 +570,6 @@ void __init ebus_init(void)
ebus->self = pdev;
ebus->parent = pbm = cookie->pbm;
- ebus_ranges_init(ebus);
- ebus_intmap_init(ebus);
-
child = dp->child;
if (!child)
goto next_ebus;
diff --git a/arch/sparc64/kernel/isa.c b/arch/sparc64/kernel/isa.c
index 8c8c5a491ad..2693f2de549 100644
--- a/arch/sparc64/kernel/isa.c
+++ b/arch/sparc64/kernel/isa.c
@@ -72,19 +72,30 @@ static struct {
static int __init isa_dev_get_irq_using_imap(struct sparc_isa_device *isa_dev,
struct sparc_isa_bridge *isa_br,
int *interrupt,
- struct linux_prom_registers *pregs)
+ struct linux_prom_registers *reg)
{
+ struct linux_prom_ebus_intmap *imap;
+ struct linux_prom_ebus_intmap *imask;
unsigned int hi, lo, irq;
- int i;
-
- hi = pregs->which_io & isa_br->isa_intmask.phys_hi;
- lo = pregs->phys_addr & isa_br->isa_intmask.phys_lo;
- irq = *interrupt & isa_br->isa_intmask.interrupt;
- for (i = 0; i < isa_br->num_isa_intmap; i++) {
- if ((isa_br->isa_intmap[i].phys_hi == hi) &&
- (isa_br->isa_intmap[i].phys_lo == lo) &&
- (isa_br->isa_intmap[i].interrupt == irq)) {
- *interrupt = isa_br->isa_intmap[i].cinterrupt;
+ int i, len, n_imap;
+
+ imap = of_get_property(isa_br->prom_node, "interrupt-map", &len);
+ if (!imap)
+ return 0;
+ n_imap = len / sizeof(imap[0]);
+
+ imask = of_get_property(isa_br->prom_node, "interrupt-map-mask", NULL);
+ if (!imask)
+ return 0;
+
+ hi = reg->which_io & imask->phys_hi;
+ lo = reg->phys_addr & imask->phys_lo;
+ irq = *interrupt & imask->interrupt;
+ for (i = 0; i < n_imap; i++) {
+ if ((imap[i].phys_hi == hi) &&
+ (imap[i].phys_lo == lo) &&
+ (imap[i].interrupt == irq)) {
+ *interrupt = imap[i].cinterrupt;
return 0;
}
}
@@ -105,7 +116,8 @@ static void __init isa_dev_get_irq(struct sparc_isa_device *isa_dev,
struct pci_pbm_info *pbm;
int i;
- if (isa_dev->bus->num_isa_intmap) {
+ if (of_find_property(isa_dev->bus->prom_node,
+ "interrupt-map", NULL)) {
if (!isa_dev_get_irq_using_imap(isa_dev,
isa_dev->bus,
&irq_prop,
@@ -218,36 +230,6 @@ static void __init isa_fill_devices(struct sparc_isa_bridge *isa_br)
}
}
-static void __init get_bridge_props(struct sparc_isa_bridge *isa_br)
-{
- struct device_node *dp = isa_br->prom_node;
- void *pval;
- int len;
-
- pval = of_get_property(dp, "ranges", &len);
- if (pval) {
- memcpy(isa_br->isa_ranges, pval, len);
- isa_br->num_isa_ranges =
- len / sizeof(struct linux_prom_isa_ranges);
- } else {
- isa_br->num_isa_ranges = 0;
- }
-
- pval = of_get_property(dp, "interrupt-map", &len);
- if (pval) {
- memcpy(isa_br->isa_intmap, pval, len);
- isa_br->num_isa_intmap =
- (len / sizeof(struct linux_prom_isa_intmap));
- } else {
- isa_br->num_isa_intmap = 0;
- }
-
- pval = of_get_property(dp, "interrupt-map-mask", &len);
- if (pval)
- memcpy(&isa_br->isa_intmask, pval,
- sizeof(isa_br->isa_intmask));
-}
-
void __init isa_init(void)
{
struct pci_dev *pdev;
@@ -288,8 +270,6 @@ void __init isa_init(void)
isa_br->index = index++;
isa_br->prom_node = pdev_cookie->prom_node;
- get_bridge_props(isa_br);
-
printk("isa%d:", isa_br->index);
isa_fill_devices(isa_br);