Re: [PATCH 5/7] Added support for AMBA bus. The device is a AMBA bus if

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

[Index of Archives]     [Kernel Development]     [DCCP]     [Linux ARM Development]     [Linux]     [Photo]     [Yosemite Help]     [Linux ARM Kernel]     [Linux SCSI]     [Linux x86_64]     [Linux Hams]

  Powered by Linux