[PATCH] fsl_soc: Fix get_immrbase() to use ranges, rather than reg.
Scott Wood
scottwood at freescale.com
Wed Jan 16 03:40:53 EST 2008
On Mon, Jan 14, 2008 at 08:37:27PM -0600, Kumar Gala wrote:
> >diff --git a/arch/powerpc/sysdev/fsl_soc.c b/arch/powerpc/sysdev/
> >fsl_soc.c
> >index 3ace747..7502e03 100644
> >--- a/arch/powerpc/sysdev/fsl_soc.c
> >+++ b/arch/powerpc/sysdev/fsl_soc.c
> >@@ -54,10 +54,18 @@ phys_addr_t get_immrbase(void)
> > soc = of_find_node_by_type(NULL, "soc");
> > if (soc) {
> > int size;
> >- const void *prop = of_get_property(soc, "reg", &size);
> >+ u32 naddr;
> >+ const u32 *prop = of_get_property(soc, "#address-cells",
> >&size);
> >+
> >+ if (prop && size == 4)
> >+ naddr = *prop;
> >+ else
> >+ naddr = 2;
>
> Why default to two?
Because that's what the OF spec says the default is?
> >+ prop = of_get_property(soc, "ranges", &size);
> >+ if (prop && size == 12)
> >+ immrbase = of_translate_address(soc, prop + naddr);
Grr, I thought I removed the size == 12 check...
> >- if (prop)
> >- immrbase = of_translate_address(soc, prop);
>
> why not make your code an else case if we don't have reg?
Why?
> or something like, than we don't have to worry about adjust anything,
> and if you don't have any children its kinda a pointless device tree :)
It's not pointless, it's just incomplete.
> if (soc) {
> struct device_node *child = of_get_next_child(soc, NULL);
> if (child) {
> const void *prop = of_get_property(soc, "ranges",
> NULL);
> if (prop)
> immrbase = of_translate_address(child, prop);
> of_node_put(child);
> }
> of_node_put(soc);
> }
Why go out of our way to fail on a childless soc node?
-Scott
More information about the Linuxppc-dev
mailing list