Merge "msm8960: Support non-interleaved memory configuration"
diff --git a/platform/msm_shared/nand.c b/platform/msm_shared/nand.c
index 6264220..4529594 100644
--- a/platform/msm_shared/nand.c
+++ b/platform/msm_shared/nand.c
@@ -78,6 +78,7 @@
static unsigned ECC_BCH_CFG;
static uint32_t enable_bch_ecc;
+static unsigned int *bbtbl;
#define CFG1_WIDE_FLASH (1U << 1)
@@ -789,12 +790,33 @@
unsigned n;
int isbad = 0;
unsigned cwperpage;
+ unsigned block = 0;
cwperpage = (flash_pagesize >> 9);
- /* Check for bad block and read only from a good block */
- isbad = flash_nand_block_isbad(cmdlist, ptrlist, page);
- if (isbad)
+ /* Find the block no for the page */
+ block = page / num_pages_per_blk;
+
+ /* Check the bad block table for each block
+ * -1: indicates the block needs to be checked if good or bad
+ * 1 : The block is bad
+ * 0 : The block is good
+ */
+ if(bbtbl[block] == -1) {
+ isbad = flash_nand_block_isbad(cmdlist, ptrlist, page);
+ if(isbad) {
+ /* Found bad , set the bad table entry */
+ bbtbl[block] = 1;
+ return -2;
+ } else {
+ /* Found good block , set the table entry &
+ * continue reading the data
+ */
+ bbtbl[block] = 0;
+ }
+ } else if(bbtbl[block] == 1) {
+ /* If the block is already identified as bad, return error*/
return -2;
+ }
data->cmd = NAND_CMD_PAGE_READ_ECC;
data->addr0 = page << 16;
@@ -3351,6 +3373,7 @@
void flash_init(void)
{
+ int i = 0;
ASSERT(flash_ptable == NULL);
flash_ptrlist = memalign(32, 1024);
@@ -3366,6 +3389,10 @@
ASSERT(0);
}
}
+ /* Create a bad block table */
+ bbtbl = (unsigned int *) malloc(sizeof(unsigned int) * flash_info.num_blocks);
+ for(i = 0 ; i < flash_info.num_blocks ; i++)
+ bbtbl[i] = -1 ;
}
struct ptable *flash_get_ptable(void)
diff --git a/platform/msm_shared/smem.h b/platform/msm_shared/smem.h
index 6d1a616..4832c49 100644
--- a/platform/msm_shared/smem.h
+++ b/platform/msm_shared/smem.h
@@ -190,6 +190,7 @@
HW_PLATFORM_FLUID = 3,
HW_PLATFORM_SVLTE = 4,
HW_PLATFORM_QT = 6,
+ HW_PLATFORM_MTP = 8,
HW_PLATFORM_LIQUID = 9,
HW_PLATFORM_DRAGON = 10,
HW_PLATFORM_32BITS = 0x7FFFFFFF
diff --git a/target/msm8960/init.c b/target/msm8960/init.c
index 48482e1..dc2115d 100644
--- a/target/msm8960/init.c
+++ b/target/msm8960/init.c
@@ -146,7 +146,7 @@
case HW_PLATFORM_SURF:
mach_id = LINUX_MACHTYPE_8960_CDP;
break;
- case HW_PLATFORM_FFA:
+ case HW_PLATFORM_MTP:
mach_id = LINUX_MACHTYPE_8960_MTP;
break;
case HW_PLATFORM_FLUID: