[Feature][ZXW-130]merge P50U02 version
Only Configure: No
Affected branch: master
Affected module: unknow
Is it affected on both ZXIC and MTK: only ZXIC
Self-test: Yes
Doc Update: No
Change-Id: I4f29ec5bb7c59385f23738d2b7ca84e67c100f69
diff --git a/ap/os/linux/linux-3.4.x/drivers/mtd/cmdlinepart.c b/ap/os/linux/linux-3.4.x/drivers/mtd/cmdlinepart.c
old mode 100644
new mode 100755
index 3e65e07..f95d187
--- a/ap/os/linux/linux-3.4.x/drivers/mtd/cmdlinepart.c
+++ b/ap/os/linux/linux-3.4.x/drivers/mtd/cmdlinepart.c
@@ -73,6 +73,7 @@
/* the command line passed to mtdpart_setupd() */
static char *cmdline;
static int cmdline_parsed = 0;
+char *nor_cmdline;
/*
* Parse one partition definition for an MTD. Since there can be many
@@ -375,6 +376,15 @@
__setup("mtdparts=", mtdpart_setup);
+static int nor_cmdline_setup(char *s)
+{
+ nor_cmdline = s;
+ return 1;
+}
+
+__setup("EnhancedSecurity=", nor_cmdline_setup);
+
+
static struct mtd_part_parser cmdline_parser = {
.owner = THIS_MODULE,
.parse_fn = parse_cmdline_partitions,
diff --git a/ap/os/linux/linux-3.4.x/drivers/mtd/nand/nand_ids.c b/ap/os/linux/linux-3.4.x/drivers/mtd/nand/nand_ids.c
index ca6012e..e15a472 100755
--- a/ap/os/linux/linux-3.4.x/drivers/mtd/nand/nand_ids.c
+++ b/ap/os/linux/linux-3.4.x/drivers/mtd/nand/nand_ids.c
@@ -89,6 +89,7 @@
{"SPI-NAND 512MiB 1,8V", 0x35, 4096, 512, 0x40000, 0},
{"SPI-NAND 512MiB 1,8V", 0x45, 2048, 512, 0x20000, 0}, //GD5F4GQ6REY2G
{"SPI-NAND 512MiB 1,8V", 0x53, 4096, 512, 0x40000, 0}, //XT26Q04D-B
+ {"SPI-NAND 128MiB 1,8V", 0x15, 2048, 128, 0x20000, 0}, //UM19A0LISW
/*
* These are the new chips with large page size. The pagesize and the
* erasesize is determined from the extended id bytes
@@ -225,6 +226,7 @@
{NAND_MFR_EMST, "emst"},
{NAND_MFR_FORESEE, "foresee"},
{NAND_MFR_XTX, "xtx"},
+ {NAND_MFR_UNIM, "unim"},
{0x0, "Unknown"}
};
diff --git a/ap/os/linux/linux-3.4.x/drivers/mtd/nand/spi_nand_devices.c b/ap/os/linux/linux-3.4.x/drivers/mtd/nand/spi_nand_devices.c
index a2eb6b1..6f4db46 100755
--- a/ap/os/linux/linux-3.4.x/drivers/mtd/nand/spi_nand_devices.c
+++ b/ap/os/linux/linux-3.4.x/drivers/mtd/nand/spi_nand_devices.c
@@ -283,6 +283,21 @@
}
}
+static void get_unim_nand_para(uint8_t device_id)
+{
+
+ switch (device_id) {
+ case 0x15:
+ main_size = 2048;
+ spare_size = 64;
+ break;
+ default:
+ printk("Spectra: Unknown unim NAND (Device ID: 0x%x)."
+ "Will use default parameter values instead.\n",
+ device_id);
+ }
+}
+
void spi_nand_get_param(uint32_t maf_id, uint32_t dev_id)
{
@@ -329,6 +344,9 @@
else if (maf_id == NAND_MFR_XTX) {
get_xtx_nand_para(dev_id);
}
+ else if (maf_id == NAND_MFR_UNIM) {
+ get_unim_nand_para(dev_id);
+ }
else{
printk("Spectra: Unknown manufacturer (ID: 0x%x).", maf_id);
}
@@ -413,7 +431,11 @@
.eccbytes = 192,
.oobfree = {{2,62}}
};
-
+
+static struct nand_ecclayout nand_unim_oob_64= {
+ .oobfree = {{2,62}}
+};
+
static void spi_nand_winbond_init(struct spi_nand_info *spi_nand)
{
uint8_t dev_id = spi_nand->dev_id;
@@ -501,6 +523,7 @@
||(g_maf_id == NAND_MFR_GIGADEVICE)
||(g_maf_id == NAND_MFR_WINBOND)
|| (g_maf_id == NAND_MFR_XTX)
+ || (g_maf_id == NAND_MFR_UNIM)
||(g_maf_id == NAND_MFR_MICRON))
return PLX4_MODE;
else
@@ -519,6 +542,7 @@
||(g_maf_id == NAND_MFR_GIGADEVICE)
||(g_maf_id == NAND_MFR_WINBOND)
|| (g_maf_id == NAND_MFR_XTX)
+ || (g_maf_id == NAND_MFR_UNIM)
||(g_maf_id == NAND_MFR_MICRON))
return RDX4_MODE;
else
@@ -653,6 +677,12 @@
chip->ecc.layout =&nand_xtx_oob_256;
}
break;
+ case NAND_MFR_UNIM:
+ if(mtd->oobsize==64 && mtd->writesize==2048)
+ {
+ chip->ecc.layout =&nand_unim_oob_64;
+ }
+ break;
default:
break;
}
diff --git a/ap/os/linux/linux-3.4.x/drivers/mtd/nand/zxic_spifc.c b/ap/os/linux/linux-3.4.x/drivers/mtd/nand/zxic_spifc.c
index 98a0ccc..16c0efe 100755
--- a/ap/os/linux/linux-3.4.x/drivers/mtd/nand/zxic_spifc.c
+++ b/ap/os/linux/linux-3.4.x/drivers/mtd/nand/zxic_spifc.c
@@ -44,15 +44,17 @@
#include "zxic_spifc.h"
#include "spi_nand.h"
+
#define zDrv_ASSERT(_EXP) printk("spifc error\n")
+
struct spifc_info g_spifc;
extern unsigned char g_maf_id;
-
+extern char *nor_cmdline;
static int spifc_get_feature( uint32_t reg_addr, uint8_t *value);
static uint32_t spi_fc_wait_cmd_end(void);
int winbond_dev_id2 = 0;
-
+unsigned char g_nor_flag = 0;
/* SPI NAND FLASH COMMAND FORMAT TYPE */
/********************************************************************************
[Instruction] |--write enable
@@ -550,6 +552,9 @@
do
{
+ if(g_nor_flag == 1)
+ gpio_set_value(86,GPIO_LOW);//spp
+
spi_fc_clear_fifo();
spi_fc_clear_int();
spi_fc_config_ctrl(FC_DMA_NONE);
@@ -561,6 +566,10 @@
{
continue; /* ¡ä?¨º?¨º¡ì¡ã¨¹¡ê??¨¢¨º?¡À?¡ä??-?¡¤2¡é??¡ä? */
}
+
+ if(g_nor_flag == 1)
+ gpio_set_value(86,GPIO_HIGH);//spp
+
break;
} while( --retries != 0 );
@@ -595,7 +604,10 @@
};
while(1)
{
- do
+ if(g_nor_flag == 1)
+ gpio_set_value(86,GPIO_LOW);//spp
+
+ do
{
spi_fc_clear_fifo();
spi_fc_clear_int();
@@ -612,6 +624,11 @@
}
while ( --retries != 0 );
+ if(g_nor_flag == 1)
+ gpio_set_value(86,GPIO_HIGH);//spp
+
+ udelay(5);
+
/* µÈ´ýÉÏ´ÎÃüÁîÖ´ÐÐÍê³É */
do
{
@@ -655,6 +672,9 @@
};
do
{
+ if(g_nor_flag == 1)
+ gpio_set_value(86,GPIO_LOW);//spp
+
spi_fc_clear_fifo();
spi_fc_clear_int();
spi_fc_config_ctrl(FC_DMA_NONE);
@@ -666,6 +686,9 @@
continue; /* ´«Êäʧ°Ü£¬½áÊø±¾´ÎÑ»·²¢ÖØ´« */
}
+ if(g_nor_flag == 1)
+ gpio_set_value(86,GPIO_HIGH);//spp
+
break;
}
while ( --retries != 0 );
@@ -701,8 +724,11 @@
0 /* ¿ÕÏеȴýÖÜÆÚ x1 */
};
do
- {
- spi_fc_setup_cmd(&cmd, 0, 0); /* ÃüÁîÅäÖà */
+ {
+ if(g_nor_flag == 1)
+ gpio_set_value(86,GPIO_LOW);//spp
+
+ spi_fc_setup_cmd(&cmd, 0, 0); /* ÃüÁîÅäÖà */
spi_fc_clear_int();
spi_fc_start(); /* ¿ªÊ¼´«Êä */
ret = spi_fc_wait_cmd_end(); /* µÈ´ýÃüÁî½áÊø */
@@ -710,6 +736,11 @@
{
continue; /* ´«Êäʧ°Ü£¬½áÊø±¾´ÎÑ»·²¢ÖØ´« */
}
+ if(g_nor_flag == 1)
+ gpio_set_value(86,GPIO_HIGH);//spp
+
+ udelay(5);
+
do
{
spifc_get_feature(REG_STATUS, &status);
@@ -755,6 +786,9 @@
};
do
{
+ if(g_nor_flag == 1)
+ gpio_set_value(86,GPIO_LOW);//spp
+
spi_fc_clear_fifo();
spi_fc_clear_int();
spi_fc_config_ctrl(FC_DMA_NONE);
@@ -772,6 +806,9 @@
continue; /* ´«Êäʧ°Ü£¬½áÊø±¾´ÎÑ»·²¢ÖØ´« */
}
+ if(g_nor_flag == 1)
+ gpio_set_value(86,GPIO_HIGH);//spp
+
break;
}
while ( --retries != 0 );
@@ -812,6 +849,9 @@
};
do
{
+ if(g_nor_flag == 1)
+ gpio_set_value(86,GPIO_LOW);//spp
+
spi_fc_clear_fifo();
spi_fc_clear_int();
spi_fc_config_ctrl(FC_DMA_NONE);
@@ -823,6 +863,10 @@
{
continue; /* ´«Êäʧ°Ü£¬½áÊø±¾´ÎÑ»·²¢ÖØ´« */
}
+
+ if(g_nor_flag == 1)
+ gpio_set_value(86,GPIO_HIGH);//spp
+
break;
}
while ( --retries != 0 );
@@ -864,6 +908,9 @@
do
{
+ if(g_nor_flag == 1)
+ gpio_set_value(86,GPIO_LOW);//spp
+
spi_fc_clear_fifo();
spi_fc_clear_int();
spi_fc_config_ctrl(FC_DMA_NONE);
@@ -884,6 +931,9 @@
continue; /* ´«Êäʧ°Ü£¬½áÊø±¾´ÎÑ»·²¢ÖØ´« */
}
+ if(g_nor_flag == 1)
+ gpio_set_value(86,GPIO_HIGH);//spp
+
break;
}
while ( --retries != 0 );
@@ -927,6 +977,9 @@
};
do
{
+ if(g_nor_flag == 1)
+ gpio_set_value(86,GPIO_LOW);//spp
+
spi_fc_clear_fifo();
spi_fc_clear_int();
spi_fc_config_ctrl(FC_DMA_NONE);
@@ -938,6 +991,10 @@
continue; /* ´«Êäʧ°Ü£¬½áÊø±¾´ÎÑ»·²¢ÖØ´« */
}
+ if(g_nor_flag == 1)
+ gpio_set_value(86,GPIO_HIGH);//spp
+ udelay(5);
+
/* µÈ´ýÃüÁîÖ´ÐÐÍê³É */
do
{
@@ -996,6 +1053,9 @@
};
do
{
+ if(g_nor_flag == 1)
+ gpio_set_value(86,GPIO_LOW);//spp
+
spi_fc_clear_fifo();
spi_fc_clear_int();
spi_fc_config_ctrl(FC_DMA_NONE);
@@ -1007,6 +1067,10 @@
continue; /* ´«Êäʧ°Ü£¬½áÊø±¾´ÎÑ»·²¢ÖØ´« */
}
+ if(g_nor_flag == 1)
+ gpio_set_value(86,GPIO_HIGH);//spp
+ udelay(5);
+
/* µÈ´ýÃüÁîÖ´ÐÐÍê³É */
do
{
@@ -1155,6 +1219,9 @@
do
{
+ if(g_nor_flag == 1)
+ gpio_set_value(86,GPIO_LOW);//spp
+
spi_fc_clear_fifo();
spi_fc_clear_int();
spi_fc_setup_cmd(&cmd, column_addr, len); /* ÃüÁîÅäÖà */
@@ -1185,7 +1252,9 @@
spifc_wait_dma_done(FC_DMA_RX);
spi_fc_config_ctrl(FC_DMA_NONE);
#endif
-
+ if(g_nor_flag == 1)
+ gpio_set_value(86,GPIO_HIGH);//spp
+
break;
}
while ( --retries != 0 );
@@ -1240,6 +1309,9 @@
do
{
+ if(g_nor_flag == 1)
+ gpio_set_value(86,GPIO_LOW);//spp
+
spi_fc_clear_fifo();
spi_fc_clear_int();
spi_fc_setup_cmd(&cmd, column_addr, page_len+oob_len); /* ÃüÁîÅäÖà */
@@ -1265,7 +1337,10 @@
#if TRANS_USE_DMA
spifc_wait_dma_done(FC_DMA_TX);
spi_fc_config_ctrl(FC_DMA_NONE);
-#endif
+#endif
+ if(g_nor_flag == 1)
+ gpio_set_value(86,GPIO_HIGH);//spp
+
break;
}
while ( --retries != 0 );
@@ -1308,6 +1383,9 @@
};
do
{
+ if(g_nor_flag == 1)
+ gpio_set_value(86,GPIO_LOW);//spp
+
spi_fc_clear_fifo();
spi_fc_clear_int();
spi_fc_config_ctrl(FC_DMA_NONE);
@@ -1319,6 +1397,10 @@
continue; /* ´«Êäʧ°Ü£¬½áÊø±¾´ÎÑ»·²¢ÖØ´« */
}
+ if(g_nor_flag == 1)
+ gpio_set_value(86,GPIO_HIGH);//spp
+ udelay(5);
+
/* µÈ´ýÃüÁîÖ´ÐÐÍê³É */
do
{
@@ -1497,6 +1579,7 @@
zx29_gpio_config(95, 0x1);
/*configure gpio5 to sfc_cs*/
+
ret = gpio_request(93, "sfc_cs");
if (ret)
{
@@ -1504,8 +1587,21 @@
zDrv_ASSERT(0);
return;
}
- zx29_gpio_config(93, 0x1);
-
+ if(g_nor_flag == 1){
+ zx29_gpio_config(93, GPIO93_GPIO93);
+ gpio_direction_output(93,1);
+
+ ret = gpio_request(ZX29_GPIO_86, "gpio");
+ if (ret)
+ {
+ printk("gpio86 fail\n");
+ zDrv_ASSERT(0);
+ return;
+ }
+ zx29_gpio_config(ZX29_GPIO_86, GPIO86_GPIO86);
+ gpio_direction_output(ZX29_GPIO_86,1);
+ }
+
/*configure gpio3 to sfc_sclk*/
ret = gpio_request(94, "sfc_sclk");
if (ret)
@@ -1763,12 +1859,22 @@
int ret = 0;
struct spi_nand_info *spifc;
- pr_info("spi_nand_probe------------\n");
+ /*ÅжÏÊÇ·ñΪÔöÇ¿ÐͰ²È«Æô¶¯*/
+ if(nor_cmdline != NULL)
+ {
+ if (!strcmp(nor_cmdline, "1"))
+ {
+ g_nor_flag = 1;
+ //printk("----------EnhancedSecurity---------\n");
+ }
+ }
+
+ pr_info("----------spi_nand_probe-----------\n");
spifc = kzalloc(sizeof(*spifc), GFP_KERNEL);
if (!spifc)
return -ENOMEM;
-
+
soft_spin_lock(NAND_SFLOCK);
ret = spifc_init_resource(pdev, spifc);
@@ -1800,12 +1906,12 @@
soft_spin_unlock(NAND_SFLOCK);
return ret;
}
-
- read_only_partitons_table_init();
+ read_only_partitons_table_init();
soft_spin_unlock(NAND_SFLOCK);
platform_set_drvdata(pdev, spifc);
+ printk("----------spi_nand_probe end!-----------\n");
return 0;
failed_alloc_memery: