dt confusion, for_each_matching_node...

Grant Likely grant.likely at secretlab.ca
Fri Jul 29 08:27:21 EST 2011


On Tue, Jul 26, 2011 at 10:15:56PM +0200, Niklas Hernaeus wrote:
> Hi Grant.
> 
> I am afraid I am seriously confused about how the dt is supposed to work.
> Maybe I simply lack a detail, if I am lucky... perhaps it is to late in the
> day...
> 
> Problem:
> I cannot get the for_each_matching_node macro to give me anything, so the I
> guess the of_find_matching_node cannot find anything.
> I am using the uarts in the test code. With the test code below the snowball
> dies.
> Anyone see my mistake?
> 
> Thanks for any and all input.
> /Niklas.

The code looks fine, but as discussed on IRC, it looks like the dtb
isn't getting handed to the kernel in the first place, which would be
the root cause.  :-)

g.

> 
> Suggestion: I forgot some initialization somewhere?
> 
> In this device tree I have:
> 
> / {
>         model = "ST-Ericsson Snowball";
>         compatible = "snowball";
>         #address-cells = <1>;
>         #size-cells = <1>;
> 
>         #chosen {
>                 bootargs = "root=/dev/ram0 console=ttyAMA2,115200n8 debug
> earlyprintk";
>         };
> 
>         #memory {
>                 reg = <0x90000000 0x20000000>;
>         };
> 
>         #soc-u8500 {
>                 address-cells = <1>;
>                 size-cells = <1>;
>                 compatible = "simple-bus";
>                 periph1-base = <0x32000>;
> 
>                 cpus {
>                         #address-cells = <1>;
>                         #size-cells = <0>;
>                         cpu at 0 {
>                                 compatible = "arm,cortex-a9";
>                                 reg = <0>;
>                         };
>                         cpu at 1 {
>                                 compatible = "arm,cortex-a9";
>                                 reg = <1>;
>                         };
>                 };
>         };
> 
>         uart at 80120000 {
>                 compatible = "arm,pl011";
>         };
>         uart at 80121000 {
>                 compatible = "arm,pl011";
>         };
>         uart at 80007000 {
>                 compatible = "arm,pl011";
>         };
>   };
> 
> 
> Test code:
> 
> static const struct of_device_id snowball_uarts[] __initconst={
>         {.compatible="arm,pl011"},
>         {},
> };
> 
> static void __init mop500_uart_init_dt(void)
> {
>         struct device_node *node;
>         u32 p0;
>         int ret;
> 
>         /* Get device info from device-tree */
>         for_each_matching_node(node, snowball_uarts) {
>                 goto doit;  /* Got something, all ok */
>         }
>         goto die;
> 
>  doit:
>         /* Standard init, no dt */
>         db8500_add_uart0(&uart0_plat);
>         db8500_add_uart1(&uart1_plat);
>         db8500_add_uart2(&uart2_plat);
> die:
>         ;
> };


More information about the devicetree-discuss mailing list