mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 03:15:31 +09:00
drivers: rkflash: Support new devices
Change-Id: Ieb7a1217a92d47581faf0ac3dfcd4db78b84f098 Signed-off-by: Jon Lin <jon.lin@rock-chips.com>
This commit is contained in:
@@ -22,6 +22,7 @@ static u32 sfc_nand_get_ecc_status5(void);
|
||||
static u32 sfc_nand_get_ecc_status6(void);
|
||||
static u32 sfc_nand_get_ecc_status7(void);
|
||||
static u32 sfc_nand_get_ecc_status8(void);
|
||||
static u32 sfc_nand_get_ecc_status9(void);
|
||||
|
||||
static struct nand_info spi_nand_tbl[] = {
|
||||
/* TC58CVG0S0HxAIx */
|
||||
@@ -47,6 +48,12 @@ static struct nand_info spi_nand_tbl[] = {
|
||||
{ 0xC2, 0x92, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x4, 1, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 },
|
||||
/* MX35UF2GE4AC */
|
||||
{ 0xC2, 0xA2, 0x00, 4, 0x40, 1, 2048, 0x0C, 19, 0x4, 1, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 },
|
||||
/* MX35UF1GE4AD */
|
||||
{ 0xC2, 0x96, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x8, 1, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 },
|
||||
/* MX35UF2GE4AD */
|
||||
{ 0xC2, 0xA6, 0x00, 4, 0x40, 1, 2048, 0x0C, 19, 0x8, 1, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 },
|
||||
/* MX35UF4GE4AD */
|
||||
{ 0xC2, 0xB7, 0x00, 8, 0x40, 1, 2048, 0x0C, 20, 0x8, 1, { 0x04, 0x08, 0x14, 0x18 }, &sfc_nand_get_ecc_status0 },
|
||||
|
||||
/* GD5F1GQ4UAYIG */
|
||||
{ 0xC8, 0xF1, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x8, 1, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 },
|
||||
@@ -61,11 +68,23 @@ static struct nand_info spi_nand_tbl[] = {
|
||||
/* GD5F1GQ4R */
|
||||
{ 0xC8, 0xC1, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x8, 1, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status3 },
|
||||
/* GD5F4GQ6RExxG 1*4096 */
|
||||
{ 0xC8, 0x45, 0x00, 4, 0x40, 2, 2048, 0x4C, 20, 0x4, 1, { 0x04, 0x08, 0X14, 0x18 }, &sfc_nand_get_ecc_status2 },
|
||||
{ 0xC8, 0x45, 0x00, 4, 0x40, 2, 2048, 0x4C, 20, 0x4, 1, { 0x04, 0x08, 0x14, 0x18 }, &sfc_nand_get_ecc_status2 },
|
||||
/* GD5F4GQ6UExxG 1*4096 */
|
||||
{ 0xC8, 0x55, 0x00, 4, 0x40, 2, 2048, 0x4C, 20, 0x4, 1, { 0x04, 0x08, 0X14, 0x18 }, &sfc_nand_get_ecc_status2 },
|
||||
{ 0xC8, 0x55, 0x00, 4, 0x40, 2, 2048, 0x4C, 20, 0x4, 1, { 0x04, 0x08, 0x14, 0x18 }, &sfc_nand_get_ecc_status2 },
|
||||
/* GD5F1GQ4UExxH */
|
||||
{ 0xC8, 0xD9, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x8, 1, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status3 },
|
||||
/* GD5F1GQ5REYIG */
|
||||
{ 0xC8, 0x41, 0x00, 4, 0x40, 1, 1024, 0x4C, 18, 0x4, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status2 },
|
||||
/* GD5F2GQ5REYIG */
|
||||
{ 0xC8, 0x42, 0x00, 4, 0x40, 1, 2048, 0x4C, 19, 0x4, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status2 },
|
||||
/* GD5F2GM7RxG */
|
||||
{ 0xC8, 0x82, 0x00, 4, 0x40, 1, 2048, 0x0C, 19, 0x8, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status2 },
|
||||
/* GD5F2GM7UxG */
|
||||
{ 0xC8, 0x92, 0x00, 4, 0x40, 1, 2048, 0x0C, 19, 0x8, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status2 },
|
||||
/* GD5F1GM7UxG */
|
||||
{ 0xC8, 0x91, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x8, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status2 },
|
||||
/* GD5F4GQ4UAYIG 1*4096 */
|
||||
{ 0xC8, 0xF4, 0x00, 4, 0x40, 2, 2048, 0x0C, 20, 0x8, 1, { 0x04, 0x08, 0x14, 0x18 }, &sfc_nand_get_ecc_status0 },
|
||||
|
||||
/* W25N01GV */
|
||||
{ 0xEF, 0xAA, 0x21, 4, 0x40, 1, 1024, 0x4C, 18, 0x1, 0, { 0x04, 0x14, 0x24, 0xFF }, &sfc_nand_get_ecc_status1 },
|
||||
@@ -74,9 +93,13 @@ static struct nand_info spi_nand_tbl[] = {
|
||||
/* W25N04KVZEIR */
|
||||
{ 0xEF, 0xAA, 0x23, 4, 0x40, 1, 4096, 0x4C, 20, 0x8, 0, { 0x04, 0x14, 0x24, 0x34 }, &sfc_nand_get_ecc_status0 },
|
||||
/* W25N01GW */
|
||||
{ 0xEF, 0xBA, 0x00, 4, 0x40, 1, 1024, 0x4C, 18, 0x1, 0, { 0x04, 0x14, 0x24, 0xFF }, &sfc_nand_get_ecc_status1 },
|
||||
{ 0xEF, 0xBA, 0x21, 4, 0x40, 1, 1024, 0x4C, 18, 0x1, 0, { 0x04, 0x14, 0x24, 0xFF }, &sfc_nand_get_ecc_status1 },
|
||||
/* W25N02KW */
|
||||
{ 0xEF, 0xBA, 0x22, 4, 0x40, 1, 2048, 0x4C, 19, 0x8, 0, { 0x04, 0x14, 0x24, 0xFF }, &sfc_nand_get_ecc_status0 },
|
||||
/* W25N512GVEIG */
|
||||
{ 0xEF, 0xAA, 0x20, 4, 0x40, 1, 512, 0x4C, 17, 0x1, 0, { 0x04, 0x14, 0x24, 0xFF }, &sfc_nand_get_ecc_status1 },
|
||||
/* W25N01KV */
|
||||
{ 0xEF, 0xAE, 0x21, 4, 0x40, 1, 1024, 0x4C, 18, 0x4, 0, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 },
|
||||
|
||||
/* HYF2GQ4UAACAE */
|
||||
{ 0xC9, 0x52, 0x00, 4, 0x40, 1, 2048, 0x4C, 19, 0xE, 1, { 0x04, 0x24, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 },
|
||||
@@ -103,6 +126,12 @@ static struct nand_info spi_nand_tbl[] = {
|
||||
{ 0xCD, 0xEC, 0x00, 4, 0x40, 2, 2048, 0x4C, 20, 0x4, 0, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 },
|
||||
/* F35SQA001G */
|
||||
{ 0xCD, 0x71, 0x00, 4, 0x40, 1, 1024, 0x4C, 18, 0x1, 1, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 },
|
||||
/* F35SQA002G */
|
||||
{ 0xCD, 0x72, 0x00, 4, 0x40, 1, 2048, 0x4C, 19, 0x1, 1, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 },
|
||||
/* F35SQA512M */
|
||||
{ 0xCD, 0x70, 0x00, 4, 0x40, 1, 512, 0x4C, 17, 0x1, 1, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 },
|
||||
/* F35UQA512M */
|
||||
{ 0xCD, 0x60, 0x00, 4, 0x40, 1, 512, 0x4C, 17, 0x1, 1, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 },
|
||||
|
||||
/* DS35Q1GA-IB */
|
||||
{ 0xE5, 0x71, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x4, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 },
|
||||
@@ -110,8 +139,16 @@ static struct nand_info spi_nand_tbl[] = {
|
||||
{ 0xE5, 0x72, 0x00, 4, 0x40, 2, 1024, 0x0C, 19, 0x4, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 },
|
||||
/* DS35M1GA-1B */
|
||||
{ 0xE5, 0x21, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x4, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 },
|
||||
/* DS35M2GA-IB */
|
||||
{ 0xE5, 0x22, 0x00, 4, 0x40, 2, 1024, 0x0C, 19, 0x4, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 },
|
||||
/* DS35Q1GB-IB */
|
||||
{ 0xE5, 0xF1, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x8, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status6 },
|
||||
/* DS35Q2GB-IB */
|
||||
{ 0xE5, 0xF2, 0x00, 4, 0x40, 2, 1024, 0x0C, 19, 0x8, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status6 },
|
||||
/* DS35Q4GM */
|
||||
{ 0xE5, 0xF4, 0x00, 4, 0x40, 2, 2048, 0x0C, 20, 0x8, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status6 },
|
||||
/* DS35M1GB-IB */
|
||||
{ 0xE5, 0xA1, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x8, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status6 },
|
||||
|
||||
/* EM73C044VCC-H */
|
||||
{ 0xD5, 0x22, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x8, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 },
|
||||
@@ -152,6 +189,8 @@ static struct nand_info spi_nand_tbl[] = {
|
||||
{ 0xA1, 0xE4, 0x00, 4, 0x40, 1, 1024, 0x4C, 18, 0x1, 0, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 },
|
||||
/* FM25S02A */
|
||||
{ 0xA1, 0xE5, 0x00, 4, 0x40, 2, 1024, 0x4C, 19, 0x1, 1, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 },
|
||||
/* FM25LS01 */
|
||||
{ 0xA1, 0xA5, 0x00, 4, 0x40, 1, 1024, 0x4C, 18, 0x1, 0, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 },
|
||||
|
||||
/* IS37SML01G1 */
|
||||
{ 0xC8, 0x21, 0x00, 4, 0x40, 1, 1024, 0x00, 18, 0x1, 0, { 0x08, 0x0C, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 },
|
||||
@@ -165,6 +204,12 @@ static struct nand_info spi_nand_tbl[] = {
|
||||
{ 0xBF, 0x21, 0x00, 4, 0x40, 1, 1024, 0x40, 18, 0x4, 1, { 0x08, 0x0C, 0xFF, 0xFF }, &sfc_nand_get_ecc_status8 },
|
||||
/* SGM7000I-S24W1GH */
|
||||
{ 0xEA, 0xC1, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x4, 1, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 },
|
||||
/* TX25G01 */
|
||||
{ 0xA1, 0xF1, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x4, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status8 },
|
||||
/* S35ML02G3 */
|
||||
{ 0x01, 0x25, 0x00, 4, 0x40, 2, 1024, 0x4C, 19, 0x4, 1, { 0x04, 0x08, 0x0C, 0x10 }, &sfc_nand_get_ecc_status9 },
|
||||
/* S35ML04G3 */
|
||||
{ 0x01, 0x35, 0x00, 4, 0x40, 2, 2048, 0x4C, 20, 0x4, 1, { 0x04, 0x08, 0x0C, 0x10 }, &sfc_nand_get_ecc_status9 },
|
||||
};
|
||||
|
||||
static struct nand_info *p_nand_info;
|
||||
@@ -689,6 +734,46 @@ static u32 sfc_nand_get_ecc_status8(void)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* ecc spectial type9:
|
||||
* ecc bits: 0xC0[4,5]
|
||||
* 0b00, No bit errors were detected
|
||||
* 0b01, 1-2Bit errors were detected and corrected.
|
||||
* 0b10, 3-4Bit errors were detected and corrected.
|
||||
* 0b11, 11 can be used as uncorrectable
|
||||
*/
|
||||
static u32 sfc_nand_get_ecc_status9(void)
|
||||
{
|
||||
u32 ret;
|
||||
u32 i;
|
||||
u8 ecc;
|
||||
u8 status;
|
||||
u32 timeout = 1000 * 1000;
|
||||
|
||||
for (i = 0; i < timeout; i++) {
|
||||
ret = sfc_nand_read_feature(0xC0, &status);
|
||||
|
||||
if (ret != SFC_OK)
|
||||
return SFC_NAND_ECC_ERROR;
|
||||
|
||||
if (!(status & (1 << 0)))
|
||||
break;
|
||||
|
||||
sfc_delay(1);
|
||||
}
|
||||
|
||||
ecc = (status >> 4) & 0x03;
|
||||
|
||||
if (ecc <= 1)
|
||||
ret = SFC_NAND_ECC_OK;
|
||||
else if (ecc == 2)
|
||||
ret = SFC_NAND_ECC_REFRESH;
|
||||
else
|
||||
ret = (u32)SFC_NAND_ECC_ERROR;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
u32 sfc_nand_erase_block(u8 cs, u32 addr)
|
||||
{
|
||||
int ret;
|
||||
|
||||
Reference in New Issue
Block a user