On Wed, Jun 10, 2009 at 20:19, <konrad@xxxxxxxxxxx> wrote: > From: Konrad Eisele <konrad@xxxxxxxxxxx> > > it is a child of prom node "ambapp" (AMBA plug and play). > Two functions leon_trans_init() and leon_node_init() > (defined in sparc/kernel/leon.c) are called in the > prom_build_tree() path if CONFIG_SPARC_LEON is defined. > leon_node_init() will build up the device tree using > AMBA plug and play. > --- > arch/sparc/kernel/of_device_32.c | 45 +++++++++++++++++++++++++++++++++++++- > arch/sparc/kernel/prom_32.c | 38 ++++++++++++++++++++++++++++++++ > arch/sparc/kernel/prom_common.c | 10 +++++++- > 3 files changed, 90 insertions(+), 3 deletions(-) > > diff --git a/arch/sparc/kernel/of_device_32.c b/arch/sparc/kernel/of_device_32.c > index 0a83bd7..e62daa2 100644 > --- a/arch/sparc/kernel/of_device_32.c > +++ b/arch/sparc/kernel/of_device_32.c > @@ -125,7 +126,7 @@ static int of_out_of_range(const u32 *ad > return 0; > } > > -static int of_bus_default_map(u32 *addr, const u32 *range, > +SPARC_LEON_STATIC int of_bus_default_map(u32 *addr, const u32 *range, > int na, int ns, int pna) > { > u32 result[OF_MAX_ADDR_CELLS]; This is still ugly. Arguably, having it non-static wouldn't be a problem as it is used by the leon-specific code. I understand that you want to make this entire patch set disappear when SPARC_LEON is unselected, but this is just making the existing code messy. > @@ -269,6 +270,37 @@ static unsigned long of_bus_sbus_get_fla > return IORESOURCE_MEM; > } > > +#ifdef CONFIG_SPARC_LEON > + > + /* > + * AMBAPP bus specific translator > + */ > + > +int of_bus_ambapp_match(struct device_node *np) > +{ > + return !strcmp(np->name, "ambapp"); > +} > + > +void of_bus_ambapp_count_cells(struct device_node *child, > + int *addrc, int *sizec) > +{ > + if (addrc) > + *addrc = 1; > + if (sizec) > + *sizec = 1; > +} > + > +int of_bus_ambapp_map(u32 *addr, const u32 *range, int na, int ns, int pna) > +{ > + return of_bus_default_map(addr, range, na, ns, pna); > +} > + > +unsigned long of_bus_ambapp_get_flags(const u32 *addr, unsigned long flags) > +{ > + return IORESOURCE_MEM; > +} > + > +#endif > > /* > * Array of bus specific translators > @@ -293,6 +325,17 @@ static struct of_bus of_busses[] = { > .map = of_bus_sbus_map, > .get_flags = of_bus_sbus_get_flags, > }, > +#ifdef CONFIG_SPARC_LEON > + /* AMBA */ > + { > + .name = "ambapp", > + .addr_prop_name = "reg", > + .match = of_bus_ambapp_match, > + .count_cells = of_bus_ambapp_count_cells, > + .map = of_bus_ambapp_map, > + .get_flags = of_bus_ambapp_get_flags, > + }, > +#endif > /* Default */ > { > .name = "default", > diff --git a/arch/sparc/kernel/prom_32.c b/arch/sparc/kernel/prom_32.c > index fe43e80..5aee484 100644 > --- a/arch/sparc/kernel/prom_32.c > +++ b/arch/sparc/kernel/prom_32.c > @@ -24,6 +24,7 @@ #include <linux/module.h> > > #include <asm/prom.h> > #include <asm/oplib.h> > +#include <asm/leon.h> > > #include "prom.h" > > @@ -131,6 +132,39 @@ static void __init ebus_path_component(s > regs->which_io, regs->phys_addr); > } > > +#ifdef CONFIG_SPARC_LEON > + > +/* "name@irq,addrlo" */ > +static void __init ambapp_path_component(struct device_node *dp, char *tmp_buf) > +{ > + struct amba_prom_registers *regs; unsigned int *intr; > + unsigned int *device, *vendor; > + struct property *prop; > + > + prop = of_find_property(dp, "reg", NULL); > + if (!prop) > + return; > + regs = prop->value; > + prop = of_find_property(dp, "interrupts", NULL); > + if (!prop) > + return; > + intr = prop->value; > + prop = of_find_property(dp, "vendor", NULL); > + if (!prop) > + return; > + vendor = prop->value; > + prop = of_find_property(dp, "device", NULL); > + if (!prop) > + return; > + device = prop->value; > + > + sprintf(tmp_buf, "%s:%d:%d@%x,%x", > + dp->name, *vendor, *device, > + *intr, regs->phys_addr); > +} > + > +#endif > + > static void __init __build_path_component(struct device_node *dp, char *tmp_buf) > { > struct device_node *parent = dp->parent; > @@ -143,6 +177,10 @@ static void __init __build_path_componen > return sbus_path_component(dp, tmp_buf); > if (!strcmp(parent->type, "ebus")) > return ebus_path_component(dp, tmp_buf); > +#ifdef CONFIG_SPARC_LEON > + if (!strcmp(parent->type, "ambapp")) > + return ambapp_path_component(dp, tmp_buf); > +#endif > > /* "isa" is handled with platform naming */ > } Speaking of things that are arguably unnecessary, the #ifdef CONFIG_SPARC_LEON guards in this part of the patch seem to be somewhat unnecessary - this code will not affect the existing code, apart from making it slightly bigger. Thanks, -- Julian Calaby Email: julian.calaby@xxxxxxxxx .Plan: http://sites.google.com/site/juliancalaby/ -- To unsubscribe from this list: send the line "unsubscribe sparclinux" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html