aboutsummaryrefslogtreecommitdiff
path: root/arch/sparc/kernel/of_device_64.c
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2009-06-07 12:22:15 +0200
committerIngo Molnar <mingo@elte.hu>2009-06-07 12:22:15 +0200
commit5f4457a4f62cc9d78e04c0eb12ff0540899aad89 (patch)
tree0b973d527ea6b2ae31e08da0746b4965a3c5a6d8 /arch/sparc/kernel/of_device_64.c
parent9b94b3a19b13e094c10f65f24bc358f6ffe4eacd (diff)
parentb87297fb405ef13cac375f202d114323b076a56d (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.c24
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 b4a12c9aa5f..5ac287ac03d 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,