Patchwork [U-Boot,RFC] net: emaclite: Support OF initialization

login
register
mail settings
Submitter Michal Simek
Date June 28, 2012, 7:26 a.m.
Message ID <1340868377-22461-1-git-send-email-monstr@monstr.eu>
Download mbox | patch
Permalink /patch/167807/
State RFC
Headers show

Comments

Michal Simek - June 28, 2012, 7:26 a.m.
Support new CONFIG_OF_CONTROL option where device
probing is done based on device tree description.

Signed-off-by: Michal Simek <monstr@monstr.eu>
---
 drivers/net/xilinx_emaclite.c |   30 ++++++++++++++++++++++++++++++
 1 files changed, 30 insertions(+), 0 deletions(-)
Simon Glass - July 3, 2012, 8:04 p.m.
Hi Michal,

On Thu, Jun 28, 2012 at 12:26 AM, Michal Simek <monstr@monstr.eu> wrote:

> Support new CONFIG_OF_CONTROL option where device
> probing is done based on device tree description.
>
> Signed-off-by: Michal Simek <monstr@monstr.eu>
> ---
>  drivers/net/xilinx_emaclite.c |   30 ++++++++++++++++++++++++++++++
>  1 files changed, 30 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/net/xilinx_emaclite.c b/drivers/net/xilinx_emaclite.c
> index e1af42a..0f6807d 100644
> --- a/drivers/net/xilinx_emaclite.c
> +++ b/drivers/net/xilinx_emaclite.c
> @@ -28,6 +28,9 @@
>  #include <config.h>
>  #include <malloc.h>
>  #include <asm/io.h>
> +#include <fdtdec.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
>
>  #undef DEBUG
>
> @@ -375,3 +378,30 @@ int xilinx_emaclite_initialize(bd_t *bis, unsigned
> long base_addr,
>
>         return 1;
>  }
> +
> +#ifdef CONFIG_OF_CONTROL
> +int xilinx_emaclite_init(bd_t *bis)
> +{
> +       int offset = 0;
> +       u32 ret = 0;
> +       u32 reg;
> +
> +       do {
> +               offset = fdt_node_offset_by_compatible(gd->fdt_blob,
> offset,
> +                                       "xlnx,xps-ethernetlite-1.00.a");
> +               if (offset != -1) {
>

offset > 0 or >= 0

> +                       reg = fdtdec_get_addr(gd->fdt_blob, offset, "reg");
> +                       if (reg != FDT_ADDR_T_NONE) {
> +                               u32 rxpp = fdtdec_get_int(gd->fdt_blob,
> offset,
> +
> "xlnx,rx-ping-pong", 0);
> +                               u32 txpp = fdtdec_get_int(gd->fdt_blob,
> offset,
> +
> "xlnx,tx-ping-pong", 0);
> +                               ret |= xilinx_emaclite_initialize(bis, reg,
> +                                                               txpp,
> rxpp);
> +                       }
> +               }
> +       } while (offset != -1);
>

Just offset > 0 here I think.


> +
> +       return ret;
> +}
> +#endif
>

This is fine I think. Do you want to impose an ordering on the interfaces,
or are you happy with them being assigned randomly? If you want an
ordering, see fdtdec_find_aliases_for_id().


> --
> 1.7.0.4
>
>
Regards,
Simon
Michal Simek - July 4, 2012, 6:20 a.m.
2012/7/3 Simon Glass <sjg@chromium.org>:
> Hi Michal,
>
> On Thu, Jun 28, 2012 at 12:26 AM, Michal Simek <monstr@monstr.eu> wrote:
>>
>> Support new CONFIG_OF_CONTROL option where device
>> probing is done based on device tree description.
>>
>> Signed-off-by: Michal Simek <monstr@monstr.eu>
>> ---
>>  drivers/net/xilinx_emaclite.c |   30 ++++++++++++++++++++++++++++++
>>  1 files changed, 30 insertions(+), 0 deletions(-)
>>
>> diff --git a/drivers/net/xilinx_emaclite.c b/drivers/net/xilinx_emaclite.c
>> index e1af42a..0f6807d 100644
>> --- a/drivers/net/xilinx_emaclite.c
>> +++ b/drivers/net/xilinx_emaclite.c
>> @@ -28,6 +28,9 @@
>>  #include <config.h>
>>  #include <malloc.h>
>>  #include <asm/io.h>
>> +#include <fdtdec.h>
>> +
>> +DECLARE_GLOBAL_DATA_PTR;
>>
>>  #undef DEBUG
>>
>> @@ -375,3 +378,30 @@ int xilinx_emaclite_initialize(bd_t *bis, unsigned
>> long base_addr,
>>
>>         return 1;
>>  }
>> +
>> +#ifdef CONFIG_OF_CONTROL
>> +int xilinx_emaclite_init(bd_t *bis)
>> +{
>> +       int offset = 0;
>> +       u32 ret = 0;
>> +       u32 reg;
>> +
>> +       do {
>> +               offset = fdt_node_offset_by_compatible(gd->fdt_blob,
>> offset,
>> +                                       "xlnx,xps-ethernetlite-1.00.a");
>> +               if (offset != -1) {
>
>
> offset > 0 or >= 0

ok, probably safer.

>>
>> +                       reg = fdtdec_get_addr(gd->fdt_blob, offset,
>> "reg");
>> +                       if (reg != FDT_ADDR_T_NONE) {
>> +                               u32 rxpp = fdtdec_get_int(gd->fdt_blob,
>> offset,
>> +
>> "xlnx,rx-ping-pong", 0);
>> +                               u32 txpp = fdtdec_get_int(gd->fdt_blob,
>> offset,
>> +
>> "xlnx,tx-ping-pong", 0);
>> +                               ret |= xilinx_emaclite_initialize(bis,
>> reg,
>> +                                                               txpp,
>> rxpp);
>> +                       }
>> +               }
>> +       } while (offset != -1);
>
>
> Just offset > 0 here I think.

ok.

>
>>
>> +
>> +       return ret;
>> +}
>> +#endif
>
>
> This is fine I think. Do you want to impose an ordering on the interfaces,
> or are you happy with them being assigned randomly? If you want an ordering,
> see fdtdec_find_aliases_for_id().


For now, not. for future probably yes.
I have changed uartlite and uart16550 drivers where this is very important.

Thanks,
Michal

Patch

diff --git a/drivers/net/xilinx_emaclite.c b/drivers/net/xilinx_emaclite.c
index e1af42a..0f6807d 100644
--- a/drivers/net/xilinx_emaclite.c
+++ b/drivers/net/xilinx_emaclite.c
@@ -28,6 +28,9 @@ 
 #include <config.h>
 #include <malloc.h>
 #include <asm/io.h>
+#include <fdtdec.h>
+
+DECLARE_GLOBAL_DATA_PTR;
 
 #undef DEBUG
 
@@ -375,3 +378,30 @@  int xilinx_emaclite_initialize(bd_t *bis, unsigned long base_addr,
 
 	return 1;
 }
+
+#ifdef CONFIG_OF_CONTROL
+int xilinx_emaclite_init(bd_t *bis)
+{
+	int offset = 0;
+	u32 ret = 0;
+	u32 reg;
+
+	do {
+		offset = fdt_node_offset_by_compatible(gd->fdt_blob, offset,
+					"xlnx,xps-ethernetlite-1.00.a");
+		if (offset != -1) {
+			reg = fdtdec_get_addr(gd->fdt_blob, offset, "reg");
+			if (reg != FDT_ADDR_T_NONE) {
+				u32 rxpp = fdtdec_get_int(gd->fdt_blob, offset,
+							"xlnx,rx-ping-pong", 0);
+				u32 txpp = fdtdec_get_int(gd->fdt_blob, offset,
+							"xlnx,tx-ping-pong", 0);
+				ret |= xilinx_emaclite_initialize(bis, reg,
+								txpp, rxpp);
+			}
+		}
+	} while (offset != -1);
+
+	return ret;
+}
+#endif