--- /dev/null
+--- a/drivers/mtd/nand/ath79_spinand.c
++++ b/drivers/mtd/nand/ath79_spinand.c
+@@ -441,6 +441,9 @@ static int ath79_spinand_read_from_cache
+
+ cmd.cmd = ATH79_SPINAND_CMD_READ_RDM;
+ cmd.n_addr = 3;
++ cmd.addr[0] = 0;
++ cmd.addr[1] = (u8)(offset >> 8);
++ cmd.addr[2] = (u8)(offset >> 0);
+ cmd.n_dummy = 0;
+ cmd.n_rx = len;
+ cmd.rx_buf = rbuf;
+@@ -776,9 +779,9 @@ static void ath79_spinand_cmdfunc(struct
+ state->buf);
+ break;
+ case NAND_CMD_READOOB:
+- state->buf_ptr = 0;
+- ath79_spinand_read_page(info->spi, page, mtd->writesize,
+- mtd->oobsize, state->buf);
++ state->buf_ptr = mtd->writesize;
++ ath79_spinand_read_page(info->spi, page, 0x0,
++ mtd->writesize + mtd->oobsize, state->buf);
+ break;
+ case NAND_CMD_RNDOUT:
+ state->buf_ptr = column;
+@@ -1005,6 +1008,21 @@ static struct ath79_spinand_priv ath79_s
+ 0x07, /* ecc error code */
+ SZ_512, /* ecc size */
+ 16, /* ecc bytes */
++ 1, /* ecc strength */
++ &ath79_spinand_oob_128_gd, /* ecc layout */
++ &ath79_badblock_pattern_default, /* bad block pattern */
++ ath79_spinand_eccsr_gd, /* get ecc status */
++ ath79_spinand_read_rdm_addr_gd, /* wrap address for 03h command */
++ ath79_spinand_program_load_gd, /* program load data to cache */
++ ath79_spinand_erase_block_erase_common, /* erase block */
++ ath79_spinand_page_read_to_cache_common,/* page read to cache */
++ ath79_spinand_program_execute_common, /* program execute */
++ },
++ { /* FW PN Device */
++ NAND_MFR_FWDEVICE, /* manufacturer */
++ 0x07, /* ecc error code */
++ SZ_512, /* ecc size */
++ 16, /* ecc bytes */
+ 1, /* ecc strength */
+ &ath79_spinand_oob_128_gd, /* ecc layout */
+ &ath79_badblock_pattern_default, /* bad block pattern */
+--- a/drivers/mtd/nand/nand_ids.c
++++ b/drivers/mtd/nand/nand_ids.c
+@@ -55,6 +55,9 @@ struct nand_flash_dev nand_flash_ids[] =
+ {"GD5F1GQ4U 1G 3.3V 8-bit",
+ { .id = {0xc8, 0xb1} },
+ SZ_2K, SZ_128, SZ_128K, 0, 2, 128, NAND_ECC_INFO(4, SZ_512) },
++ {"PN256GO1 1G 3.3V 8-bit",
++ { .id = {0xa1, 0xe1} },
++ SZ_2K, SZ_128, SZ_128K, 0, 2, 128, NAND_ECC_INFO(4, SZ_512) },
+ {"GD5F2GQ4U 2G 3.3V 8-bit",
+ { .id = {0xc8, 0xb2} },
+ SZ_2K, SZ_256, SZ_128K, 0, 2, 128, NAND_ECC_INFO(4, SZ_512) },
+@@ -128,6 +131,7 @@ struct nand_flash_dev nand_flash_ids[] =
+ EXTENDED_ID_NAND("NAND 128MiB 3,3V 8-bit", 0xF1, 128, LP_OPTIONS),
+ EXTENDED_ID_NAND("NAND 128MiB 3,3V 8-bit", 0xD1, 128, LP_OPTIONS),
+ EXTENDED_ID_NAND("NAND 128MiB 1,8V 16-bit", 0xB1, 128, LP_OPTIONS16),
++ EXTENDED_ID_NAND("NAND 128MiB 3,3V 16-bit", 0xE1, 128, LP_OPTIONS16),
+ EXTENDED_ID_NAND("NAND 128MiB 3,3V 16-bit", 0xC1, 128, LP_OPTIONS16),
+ EXTENDED_ID_NAND("NAND 128MiB 1,8V 16-bit", 0xAD, 128, LP_OPTIONS16),
+
+@@ -207,6 +211,7 @@ struct nand_manufacturers nand_manuf_ids
+ {NAND_MFR_GIGADEVICE, "Giga Device"},
+ {NAND_MFR_WINBOND, "Winbond"},
+ {NAND_MFR_HEYANGTEK, "HeYang Tek"},
++ {NAND_MFR_FWDEVICE, "FW Device"},
+ {0x0, "Unknown"}
+ };
+
+--- a/include/linux/mtd/nand.h
++++ b/include/linux/mtd/nand.h
+@@ -735,6 +735,7 @@ struct nand_chip {
+ #define NAND_MFR_GIGADEVICE 0xc8
+ #define NAND_MFR_WINBOND 0xef
+ #define NAND_MFR_HEYANGTEK 0xc9
++#define NAND_MFR_FWDEVICE 0xA1
+ #define NAND_MFR_EON 0x92
+ #define NAND_MFR_SANDISK 0x45
+ #define NAND_MFR_INTEL 0x89