X-Git-Url: http://git.openwrt.org/?a=blobdiff_plain;f=target%2Flinux%2Far71xx%2Ffiles%2Fdrivers%2Fmtd%2Fnand%2Frb750_nand.c;h=f8a6722cba3f095924ea0e06d6953002cef78285;hb=7bbf4117c6fe4b764d9d7c62fb2bcf6dd93bff2c;hp=94dedd8e44997a1a8c6bb7252f970befc984d07f;hpb=188908e8858c46c0245efa12be87c021d71ff53c;p=openwrt%2Fstaging%2Fstintel.git diff --git a/target/linux/ar71xx/files/drivers/mtd/nand/rb750_nand.c b/target/linux/ar71xx/files/drivers/mtd/nand/rb750_nand.c index 94dedd8e44..f8a6722cba 100644 --- a/target/linux/ar71xx/files/drivers/mtd/nand/rb750_nand.c +++ b/target/linux/ar71xx/files/drivers/mtd/nand/rb750_nand.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -49,6 +50,7 @@ static inline struct rb750_nand_info *mtd_to_rbinfo(struct mtd_info *mtd) return container_of(mtd, struct rb750_nand_info, mtd); } +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0) /* * We need to use the OLD Yaffs-1 OOB layout, otherwise the RB bootloader * will not be able to find the kernel that we load. @@ -60,6 +62,56 @@ static struct nand_ecclayout rb750_nand_ecclayout = { .oobfree = { { 0, 4 }, { 6, 2 }, { 11, 2 }, { 4, 1 } } }; +#else + +static int rb750_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 rb750_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 rb750_nand_ecclayout_ops = { + .ecc = rb750_ooblayout_ecc, + .free = rb750_ooblayout_free, +}; +#endif /* < 4.6 */ + static struct mtd_partition rb750_nand_partitions[] = { { .name = "booter", @@ -71,7 +123,7 @@ static struct mtd_partition rb750_nand_partitions[] = { .offset = (256 * 1024), .size = (4 * 1024 * 1024) - (256 * 1024), }, { - .name = "rootfs", + .name = "ubi", .offset = MTDPART_OFS_NXTBLK, .size = MTDPART_SIZ_FULL, }, @@ -248,7 +300,7 @@ static void __init rb750_nand_gpio_init(struct rb750_nand_info *info) info->pdata->latch_change(~out & RB750_NAND_IO0, out & RB750_NAND_IO0); } -static int __devinit rb750_nand_probe(struct platform_device *pdev) +static int rb750_nand_probe(struct platform_device *pdev) { struct rb750_nand_info *info; struct rb7xx_nand_platform_data *pdata; @@ -277,6 +329,7 @@ static int __devinit rb750_nand_probe(struct platform_device *pdev) info->chip.chip_delay = 25; info->chip.ecc.mode = NAND_ECC_SOFT; + info->chip.options = NAND_NO_SUBPAGE_WRITE; info->pdata = pdata; @@ -291,7 +344,11 @@ static int __devinit rb750_nand_probe(struct platform_device *pdev) } if (info->mtd.writesize == 512) +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0) info->chip.ecc.layout = &rb750_nand_ecclayout; +#else + mtd_set_ooblayout(&info->mtd, &rb750_nand_ecclayout_ops); +#endif ret = nand_scan_tail(&info->mtd); if (ret) { @@ -315,7 +372,7 @@ err_free_info: return ret; } -static int __devexit rb750_nand_remove(struct platform_device *pdev) +static int rb750_nand_remove(struct platform_device *pdev) { struct rb750_nand_info *info = platform_get_drvdata(pdev); @@ -328,7 +385,7 @@ static int __devexit rb750_nand_remove(struct platform_device *pdev) static struct platform_driver rb750_nand_driver = { .probe = rb750_nand_probe, - .remove = __devexit_p(rb750_nand_remove), + .remove = rb750_nand_remove, .driver = { .name = DRV_NAME, .owner = THIS_MODULE,