diff options
Diffstat (limited to 'target/linux/ar71xx/files/arch/mips/ath79/mach-rb95x.c')
-rw-r--r-- | target/linux/ar71xx/files/arch/mips/ath79/mach-rb95x.c | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-rb95x.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-rb95x.c index e940d6cc11..9eaeaa7f9d 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/mach-rb95x.c +++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-rb95x.c @@ -24,6 +24,7 @@ #include <linux/spi/flash.h> #include <linux/routerboot.h> #include <linux/gpio.h> +#include <linux/version.h> #include <asm/mach-ath79/ath79.h> #include <asm/mach-ath79/ar71xx_regs.h> @@ -146,6 +147,7 @@ static void rb95x_nand_select_chip(int chip_no) ndelay(500); } +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0) static struct nand_ecclayout rb95x_nand_ecclayout = { .eccbytes = 6, .eccpos = { 8, 9, 10, 13, 14, 15 }, @@ -153,6 +155,56 @@ static struct nand_ecclayout rb95x_nand_ecclayout = { .oobfree = { { 0, 4 }, { 6, 2 }, { 11, 2 }, { 4, 1 } } }; +#else + +static int rb95x_ooblayout_ecc(struct mtd_info *mtd, int section, + struct mtd_oob_region *oobregion) +{ + switch (section) { + case 0: + oobregion->offset = 8; + oobregion->length = 3; + return 0; + case 1: + oobregion->offset = 13; + oobregion->length = 3; + return 0; + default: + return -ERANGE; + } +} + +static int rb95x_ooblayout_free(struct mtd_info *mtd, int section, + struct mtd_oob_region *oobregion) +{ + switch (section) { + case 0: + oobregion->offset = 0; + oobregion->length = 4; + return 0; + case 1: + oobregion->offset = 4; + oobregion->length = 1; + return 0; + case 2: + oobregion->offset = 6; + oobregion->length = 2; + return 0; + case 3: + oobregion->offset = 11; + oobregion->length = 2; + return 0; + default: + return -ERANGE; + } +} + +static const struct mtd_ooblayout_ops rb95x_nand_ecclayout_ops = { + .ecc = rb95x_ooblayout_ecc, + .free = rb95x_ooblayout_free, +}; +#endif /* < 4.6 */ + static int rb95x_nand_scan_fixup(struct mtd_info *mtd) { struct nand_chip *chip = mtd->priv; @@ -162,7 +214,11 @@ static int rb95x_nand_scan_fixup(struct mtd_info *mtd) * Use the OLD Yaffs-1 OOB layout, otherwise RouterBoot * will not be able to find the kernel that we load. */ +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0) chip->ecc.layout = &rb95x_nand_ecclayout; +#else + mtd_set_ooblayout(mtd, &rb95x_nand_ecclayout_ops); +#endif } chip->options = NAND_NO_SUBPAGE_WRITE; |