Merge "libc: Add support for itoa and string reverse functions."
diff --git a/arch/arm/crt0.S b/arch/arm/crt0.S
index ce823c1..7f1ad16 100644
--- a/arch/arm/crt0.S
+++ b/arch/arm/crt0.S
@@ -187,14 +187,3 @@
 abort_stack:
 	.skip 1024
 abort_stack_top:
-
-.rodata:
-.align 2
-
-/* define the heap end as read-only data containing the end defined in the
- * linker script. other archs that use dynamic memory length discovery can make
- * this read-write and update it during init.
- */
-.global _heap_end
-_heap_end:
-	.int _end_of_ram
diff --git a/lib/heap/heap.c b/lib/heap/heap.c
index 71b6fa4..a3a35fb 100644
--- a/lib/heap/heap.c
+++ b/lib/heap/heap.c
@@ -52,10 +52,10 @@
 extern int _end;
 
 // end of memory
-extern int _heap_end;
+extern int _end_of_ram;
 
 #define HEAP_START ((unsigned long)&_end)
-#define HEAP_LEN ((size_t)_heap_end - (size_t)&_end)
+#define HEAP_LEN ((size_t)&_end_of_ram - (size_t)&_end)
 #endif
 
 struct free_heap_chunk {
diff --git a/platform/msm_shared/mmc.c b/platform/msm_shared/mmc.c
index 0f70b53..b504c35 100644
--- a/platform/msm_shared/mmc.c
+++ b/platform/msm_shared/mmc.c
@@ -2659,45 +2659,49 @@
 	unsigned int mmc_count = 0;
 	unsigned int write_error = MMC_BOOT_MCI_STAT_DATA_CRC_FAIL |
 	    MMC_BOOT_MCI_STAT_DATA_TIMEOUT | MMC_BOOT_MCI_STAT_TX_UNDRUN;
+	unsigned int count = 0;
+	unsigned int sz = 0;
 
 	/* Write the transfer data to SDCC3 FIFO */
 	do {
-		mmc_ret = MMC_BOOT_E_SUCCESS;
 		mmc_status = readl(MMC_BOOT_MCI_STATUS);
 
-		if (mmc_status & write_error) {
-			mmc_ret = mmc_boot_status_error(mmc_status);
-			break;
-		}
+		/* Bytes left to write */
+		count = data_len - mmc_count;
 
-		/* Write the data in MCI_FIFO register as long as TXFIFO_FULL bit of
-		   MCI_STATUS register is 0. Continue the writes until the whole
-		   transfer data is written. */
-		if (((data_len - mmc_count) >= MMC_BOOT_MCI_FIFO_SIZE / 2) &&
-		    (mmc_status & MMC_BOOT_MCI_STAT_TX_FIFO_HFULL)) {
-			for (int i = 0; i < MMC_BOOT_MCI_HFIFO_COUNT; i++) {
-				/* FIFO contains 16 32-bit data buffer on 16 sequential addresses */
-				writel(*mmc_ptr, MMC_BOOT_MCI_FIFO +
-				       (mmc_count % MMC_BOOT_MCI_FIFO_SIZE));
+		/* Break if whole data is transferred */
+		if (!count)
+			break;
+
+		/* Write half FIFO or less (remaining) words in MCI_FIFO as long as either
+		   TX_FIFO_EMPTY or TX_FIFO_HFULL bits of MCI_STATUS register are set. */
+		if ((mmc_status & MMC_BOOT_MCI_STAT_TX_FIFO_EMPTY) ||
+			(mmc_status & MMC_BOOT_MCI_STAT_TX_FIFO_HFULL)) {
+
+			/* Write minimum of half FIFO and remaining words */
+			sz = ((count >> 2) >  MMC_BOOT_MCI_HFIFO_COUNT) \
+				 ? MMC_BOOT_MCI_HFIFO_COUNT : (count >> 2);
+
+			for (int i = 0; i < sz; i++) {
+				writel(*mmc_ptr, MMC_BOOT_MCI_FIFO);
 				mmc_ptr++;
 				/* increase mmc_count by word size */
 				mmc_count += sizeof(unsigned int);
 			}
-
-		} else if (!(mmc_status & MMC_BOOT_MCI_STAT_TX_FIFO_FULL)
-			   && (mmc_count != data_len)) {
-			/* FIFO contains 16 32-bit data buffer on 16 sequential addresses */
-			writel(*mmc_ptr, MMC_BOOT_MCI_FIFO +
-			       (mmc_count % MMC_BOOT_MCI_FIFO_SIZE));
-			mmc_ptr++;
-			/* increase mmc_count by word size */
-			mmc_count += sizeof(unsigned int);
-		} else if ((mmc_status & MMC_BOOT_MCI_STAT_DATA_END)) {
-			break;	//success
 		}
-
 	}
 	while (1);
+
+	do
+	{
+		mmc_status = readl(MMC_BOOT_MCI_STATUS);
+		if (mmc_status & write_error) {
+			mmc_ret = mmc_boot_status_error(mmc_status);
+			break;
+		}
+	}
+	while (!(mmc_status & MMC_BOOT_MCI_STAT_DATA_END));
+
 	return mmc_ret;
 }
 
diff --git a/target/copper/atags.c b/target/copper/atags.c
deleted file mode 100644
index 174ae77..0000000
--- a/target/copper/atags.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/* Copyright (c) 2009-2012, Code Aurora Forum. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * 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.
- *
- * 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.
- *
- */
-
-#if !DEVICE_TREE /* If not using device tree */
-
-#include <reg.h>
-#include <debug.h>
-#include <smem.h>
-#include <platform/iomap.h>
-#include <stdint.h>
-
-#define SIZE_1M             (1024 * 1024)
-#define SIZE_2M             (2 * SIZE_1M)
-#define SIZE_256M           (256 * SIZE_1M)
-#define SIZE_512M           (512 * SIZE_1M)
-
-#define ATAG_MEM            0x54410002
-
-typedef struct {
-	uint32_t size;
-	uint32_t start_addr;
-}mem_info;
-
-
-mem_info copper_default_first_512M[] = {
-	{	.size = (250 * SIZE_1M),
-		.start_addr = SDRAM_START_ADDR
-	},
-	{	.size = (240 * SIZE_1M),
-		.start_addr = SDRAM_START_ADDR +
-				(16 * SIZE_1M) +
-				(256 * SIZE_1M)
-	}
-};
-
-unsigned *target_mem_atag_create(unsigned *ptr, uint32_t size, uint32_t addr)
-{
-    *ptr++ = 4;
-    *ptr++ = ATAG_MEM;
-    *ptr++ = size;
-    *ptr++ = addr;
-
-    return ptr;
-}
-
-
-unsigned *target_atag_create(unsigned *ptr,
-	mem_info usable_mem_map[], unsigned num_regions)
-{
-	unsigned int i;
-
-	ASSERT(num_regions);
-
-	dprintf(SPEW, "Number of HLOS regions in 1st bank = %u\n", num_regions);
-
-	for (i = 0; i < num_regions; i++)
-	{
-		ptr = target_mem_atag_create(ptr,
-			usable_mem_map[i].size,
-			usable_mem_map[i].start_addr);
-	}
-	return ptr;
-}
-
-unsigned *target_atag_mem(unsigned *ptr)
-{
-    struct smem_ram_ptable ram_ptable;
-    uint8_t i = 0;
-
-	/* Make sure RAM partition table is initialized */
-	ASSERT(smem_ram_ptable_init(&ram_ptable));
-
-	for (i = 0; i < ram_ptable.len; i++)
-	{
-		if (ram_ptable.parts[i].category == SDRAM &&
-			(ram_ptable.parts[i].type == SYS_MEMORY) &&
-			(ram_ptable.parts[i].start == SDRAM_START_ADDR))
-		{
-			ASSERT(ram_ptable.parts[i].size >= SIZE_512M);
-
-			if (ram_ptable.parts[i].start == SDRAM_START_ADDR)
-				ptr = target_atag_create(ptr,
-					copper_default_first_512M,
-					ARRAY_SIZE(copper_default_first_512M));
-
-		}
-
-		/* Pass along all other usable memory regions to Linux */
-		if (ram_ptable.parts[i].category == SDRAM &&
-			(ram_ptable.parts[i].type == SYS_MEMORY) &&
-			(ram_ptable.parts[i].start != SDRAM_START_ADDR))
-		{
-			ptr = target_mem_atag_create(ptr,
-				ram_ptable.parts[i].size,
-				ram_ptable.parts[i].start);
-		}
-	}
-
-    return ptr;
-}
-
-void *target_get_scratch_address(void)
-{
-	return ((void *)SCRATCH_ADDR);
-}
-
-#endif /* DEVICE_TREE */
-
diff --git a/target/copper/rules.mk b/target/copper/rules.mk
index 238dbe9..73eb416 100644
--- a/target/copper/rules.mk
+++ b/target/copper/rules.mk
@@ -32,5 +32,4 @@
 
 OBJS += \
     $(LOCAL_DIR)/init.o \
-    $(LOCAL_DIR)/atags.o \
     $(LOCAL_DIR)/meminfo.o
diff --git a/target/mdm9615/init.c b/target/mdm9615/init.c
index 653986b..daedbc3 100644
--- a/target/mdm9615/init.c
+++ b/target/mdm9615/init.c
@@ -287,6 +287,7 @@
 			ptentry_ptr[ptn_index].name[i] =
 		    tolower(ptentry_ptr[ptn_index].name[i]);
 		}
+        ptentry_ptr[ptn_index].type = TYPE_APPS_PARTITION;
 	}
 }