diff --git a/target/copper/meminfo.c b/target/copper/meminfo.c
index fae3aea..e0feaa1 100644
--- a/target/copper/meminfo.c
+++ b/target/copper/meminfo.c
@@ -1,29 +1,29 @@
-/* Copyright (c) 2009-2012, Code Aurora Forum. All rights reserved.
+/* Copyright (c) 2012, The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
+ * modification, are permitted provided that the following conditions are
+ * met:
  *     * Redistributions of source code must retain the above copyright
  *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in the
- *       documentation and/or other materials provided with the distribution.
- *     * Neither the name of Code Aurora nor
- *       the names of its contributors may be used to endorse or promote
- *       products derived from this software without specific prior written
- *       permission.
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of The Linux Foundation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
  *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
 #if DEVICE_TREE /* If using device tree */
@@ -35,6 +35,7 @@
 #include <stdint.h>
 #include <libfdt.h>
 #include <platform/iomap.h>
+#include <dev_tree.h>
 
 #define SIZE_1M             (1024 * 1024)
 
@@ -43,7 +44,6 @@
 	uint32_t start_addr;
 }mem_info;
 
-
 mem_info copper_default_fixed_memory[] = {
 	{	.size = (132 * SIZE_1M),
 		.start_addr = SDRAM_START_ADDR
@@ -60,19 +60,13 @@
 	},
 };
 
-uint32_t *target_mem_dev_tree_create(uint32_t *ptr, uint32_t size, uint32_t addr)
-{
-	*ptr++ = cpu_to_fdt32(addr);
-	*ptr++ = cpu_to_fdt32(size);
-
-	return ptr;
-}
-
-uint32_t *target_dev_tree_create(uint32_t *ptr,
-								 mem_info usable_mem_map[],
-								 uint32_t num_regions)
+int target_add_first_mem_bank(void *fdt,
+							  uint32_t offset,
+							  mem_info usable_mem_map[],
+							  uint32_t num_regions)
 {
 	uint32_t i;
+	int ret;
 
 	ASSERT(num_regions);
 
@@ -80,96 +74,91 @@
 
 	for (i = 0; i < num_regions; i++)
 	{
-            ptr = target_mem_dev_tree_create(ptr,
-                            usable_mem_map[i].size,
-                            usable_mem_map[i].start_addr);
+           ret = dev_tree_add_mem_info(fdt,
+									   offset,
+									   usable_mem_map[i].start_addr,
+									   usable_mem_map[i].size);
 	}
-	return ptr;
+	return ret;
 }
 
-uint32_t* target_dev_tree_mem(uint32_t *num_of_entries)
+/* Funtion to add the ram partition entries into device tree.
+ * The function assumes that all the entire fixed memory regions should
+ * be listed in the first bank of the passed in ddr regions.
+ */
+uint32_t target_dev_tree_mem(void *fdt, uint32_t memory_node_offset)
 {
     struct smem_ram_ptable ram_ptable;
-    uint32_t *meminfo_ptr;
-    uint32_t num_of_sections = 0;
-    uint32_t *ptr;
-    uint32_t last_fixed_add;
+    uint32_t last_fixed_addr;
     int n;
-    int i;
-    int index = 0;
-    int count = 0;
-    int overflow = 0;
+    unsigned int i;
+	int ret;
 
 	/* Make sure RAM partition table is initialized */
 	ASSERT(smem_ram_ptable_init(&ram_ptable));
 
     n = ARRAY_SIZE(copper_default_fixed_memory);
-    last_fixed_add = copper_default_fixed_memory[n-1].start_addr +
-                     copper_default_fixed_memory[n-1].size;
 
-    /* Find the number of parts in ram_ptable of category SDRAM and type SYS_MEMORY */
-    for(i = 0; i < ram_ptable.len; i++)
-    {   if((ram_ptable.parts[i].category ==SDRAM) &&
-           (ram_ptable.parts[i].type == SYS_MEMORY))
-            count++;
-    }
+    last_fixed_addr = copper_default_fixed_memory[n-1].start_addr +
+					copper_default_fixed_memory[n-1].size;
 
-    /* Calculating the size of the mem_info_ptr */
+     /* Calculating the size of the mem_info_ptr */
     for (i = 0 ; i < ram_ptable.len; i++)
     {
-        if((ram_ptable.parts[i].category ==SDRAM) &&
+        if((ram_ptable.parts[i].category == SDRAM) &&
            (ram_ptable.parts[i].type == SYS_MEMORY))
         {
-            if((ram_ptable.parts[i].start <= last_fixed_add) &&
-               ((ram_ptable.parts[i].start + ram_ptable.parts[i].size) >= last_fixed_add))
+            if((ram_ptable.parts[i].start <= last_fixed_addr) &&
+			   ((ram_ptable.parts[i].start + ram_ptable.parts[i].size) >= last_fixed_addr))
             {
-                if((ram_ptable.parts[i].start + ram_ptable.parts[i].size) == last_fixed_add)
-                {
-                    num_of_sections = n + (count - i - 1);
+
+				/* Pass along all fixed memory regions to Linux */
+				 ret = target_add_first_mem_bank(fdt,
+												 memory_node_offset,
+												 copper_default_fixed_memory,
+												 ARRAY_SIZE(copper_default_fixed_memory));
+
+				if (ret)
+				{
+					dprintf(CRITICAL, "Failed to add first bank fixed memory addresses\n");
+					goto target_dev_tree_mem_err;
+				}
+
+				if((ram_ptable.parts[i].start + ram_ptable.parts[i].size) != last_fixed_addr)
+			    {
+			        /* Pass the memory beyond the fixed memory present in the partition */
+					ret = dev_tree_add_mem_info(fdt,
+												memory_node_offset,
+												ram_ptable.parts[i].start + last_fixed_addr,
+												ram_ptable.parts[i].size - last_fixed_addr);
+
+					if (ret)
+					{
+						dprintf(CRITICAL, "Failed to add first bank memory addresses\n");
+						goto target_dev_tree_mem_err;
+					}
                 }
-                else
-                {
-                    num_of_sections = n + (count - i );
-                    overflow = 1;
-                }
-                index = i+1;
-                break;
-            }
-        }
+			}
+			else
+			{
+				/* Pass along all other usable memory regions to Linux */
+				ret = dev_tree_add_mem_info(fdt,
+											memory_node_offset,
+											ram_ptable.parts[i].start,
+											ram_ptable.parts[i].size);
+
+				if (ret)
+				{
+					dprintf(CRITICAL, "Failed to add secondary banks memory addresses\n");
+					goto target_dev_tree_mem_err;
+				}
+			}
+       }
     }
 
-    *num_of_entries = num_of_sections;
-    meminfo_ptr = (uint32_t*) malloc(sizeof(uint32_t) * num_of_sections * 2);
-    ptr = meminfo_ptr;
+target_dev_tree_mem_err:
 
-    /* Assumption that the fixed memory region always starts from the first ram_ptable part */
-    ASSERT((ram_ptable.parts[0].category ==SDRAM) &&
-           (ram_ptable.parts[0].type == SYS_MEMORY) &&
-           (ram_ptable.parts[0].start == SDRAM_START_ADDR));
-
-    /* Pass along all fixed memory regions to Linux */
-    meminfo_ptr = target_dev_tree_create(meminfo_ptr, copper_default_fixed_memory,
-                                          ARRAY_SIZE(copper_default_fixed_memory));
-
-    if(overflow)
-    {
-        /* Pass the memory beyond the fixed memory present in the partition */
-        meminfo_ptr = target_mem_dev_tree_create(meminfo_ptr,
-                                                 ram_ptable.parts[i].size - last_fixed_add,
-                                                 ram_ptable.parts[i].start + last_fixed_add);
-    }
-    for( i = index ; i < ram_ptable.len ; i ++)
-    {
-        if((ram_ptable.parts[i].category ==SDRAM) &&
-           (ram_ptable.parts[i].type == SYS_MEMORY))
-        {
-            /* Pass along all other usable memory regions to Linux */
-            meminfo_ptr = target_mem_dev_tree_create(meminfo_ptr,
-                                                      ram_ptable.parts[i].size,
-                                                      ram_ptable.parts[i].start);
-        }
-    }
-    return ptr;
+    return ret;
 }
 
 void *target_get_scratch_address(void)
@@ -182,4 +171,3 @@
 	return (512 * 1024 * 1024);
 }
 #endif /* DEVICE_TREE */
-
