msm_shared: Add fastboot erase functionality

Change-Id: I802de831df38f0dcfe7fcd4f18bac79f2cde1fc3
diff --git a/platform/msm_shared/qpic_nand.c b/platform/msm_shared/qpic_nand.c
index 693ecf2..771b188 100644
--- a/platform/msm_shared/qpic_nand.c
+++ b/platform/msm_shared/qpic_nand.c
@@ -849,7 +849,7 @@
 					 CMD_PIPE_INDEX,
 					 (unsigned char*)cmd_list_ptr_start,
 					 (uint32_t)cmd_list_ptr - (uint32_t)cmd_list_ptr_start,
-					 BAM_DESC_NWD_FLAG | BAM_DESC_CMD_FLAG | BAM_DESC_INT_FLAG);
+					 BAM_DESC_NWD_FLAG | BAM_DESC_CMD_FLAG | BAM_DESC_INT_FLAG | BAM_DESC_LOCK_FLAG);
 
 	cmd_list_ptr_start = cmd_list_ptr;
 	num_desc++;
@@ -873,7 +873,7 @@
 					 CMD_PIPE_INDEX,
 					 (unsigned char*)cmd_list_ptr_start,
 					 (uint32_t)cmd_list_ptr - (uint32_t)cmd_list_ptr_start,
-					 BAM_DESC_INT_FLAG | BAM_DESC_CMD_FLAG);
+					 BAM_DESC_INT_FLAG | BAM_DESC_CMD_FLAG | BAM_DESC_UNLOCK_FLAG) ;
 
 	num_desc = 1;
 	qpic_nand_wait_for_cmd_exec(num_desc);
@@ -888,7 +888,7 @@
 	}
 
 	/* Check for PROG_ERASE_OP_RESULT bit for the result of erase operation. */
-	if (status & PROG_ERASE_OP_RESULT)
+	if (!(status & PROG_ERASE_OP_RESULT))
 		return NANDC_RESULT_SUCCESS;
 
 	return NANDC_RESULT_FAILURE;
@@ -1376,7 +1376,8 @@
 	buffer += DATA_BYTES_IN_IMG_PER_CW;
 	}
 
-	buffer_sts[i] = qpic_nand_read_reg(NAND_BUFFER_STATUS, BAM_DESC_UNLOCK_FLAG, cmd_list_ptr++);
+	/* Read the buffer status again so that we can unlock the bam with this desc. */
+	buffer_sts[--i] = qpic_nand_read_reg(NAND_BUFFER_STATUS, BAM_DESC_UNLOCK_FLAG, cmd_list_ptr++);
 
 	/* Check status */
 	for (i = 0; i < flash.cws_per_page ; i ++)
@@ -1488,8 +1489,18 @@
 int
 flash_erase(struct ptentry *ptn)
 {
-	return -1;
+	uint32_t block = ptn->start;
+	uint32_t count = ptn->length;
+	int ret = 0;
+
+	ret = qpic_nand_blk_erase(ptn->start * flash.num_pages_per_blk);
+
+	if (ret)
+		dprintf(CRITICAL, "Erase operation failed \n");
+
+	return ret;
 }
+
 int
 flash_ecc_bch_enabled()
 {
@@ -1530,7 +1541,7 @@
 
 		if ((page & flash.num_pages_per_blk_mask) == 0)
 		{
-			if (qpic_nand_blk_erase(page / flash.num_pages_per_blk))
+			if (qpic_nand_blk_erase(page))
 			{
 				dprintf(INFO,
 					"flash_write_image: bad block @ %d\n",