diff options
| author | Ingo Molnar <mingo@elte.hu> | 2009-06-07 12:22:15 +0200 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2009-06-07 12:22:15 +0200 |
| commit | 5f4457a4f62cc9d78e04c0eb12ff0540899aad89 (patch) | |
| tree | 0b973d527ea6b2ae31e08da0746b4965a3c5a6d8 /arch/sparc/kernel/of_device_64.c | |
| parent | 9b94b3a19b13e094c10f65f24bc358f6ffe4eacd (diff) | |
| parent | b87297fb405ef13cac375f202d114323b076a56d (diff) | |
Merge branch 'linus' into x86/cpu
Diffstat (limited to 'arch/sparc/kernel/of_device_64.c')
| -rw-r--r-- | arch/sparc/kernel/of_device_64.c | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/arch/sparc/kernel/of_device_64.c b/arch/sparc/kernel/of_device_64.c index b4a12c9aa5f8..5ac287ac03de 100644 --- a/arch/sparc/kernel/of_device_64.c +++ b/arch/sparc/kernel/of_device_64.c @@ -99,8 +99,7 @@ static inline u64 of_read_addr(const u32 *cell, int size) return r; } -static void __init get_cells(struct device_node *dp, - int *addrc, int *sizec) +static void get_cells(struct device_node *dp, int *addrc, int *sizec) { if (addrc) *addrc = of_n_addr_cells(dp); @@ -301,8 +300,25 @@ static unsigned long of_bus_pci_get_flags(const u32 *addr, unsigned long flags) static int of_bus_sbus_match(struct device_node *np) { - return !strcmp(np->name, "sbus") || - !strcmp(np->name, "sbi"); + struct device_node *dp = np; + + while (dp) { + if (!strcmp(dp->name, "sbus") || + !strcmp(dp->name, "sbi")) + return 1; + + /* Have a look at use_1to1_mapping(). We're trying + * to match SBUS if that's the top-level bus and we + * don't have some intervening real bus that provides + * ranges based translations. + */ + if (of_find_property(dp, "ranges", NULL) != NULL) + break; + + dp = dp->parent; + } + + return 0; } static void of_bus_sbus_count_cells(struct device_node *child, |
