X-Git-Url: http://git.openwrt.org/?a=blobdiff_plain;f=target%2Flinux%2Far71xx%2Ffiles%2Fdrivers%2Fmtd%2Fnand%2Frb4xx_nand.c;h=b397575f7725ab6e905e0f8dbc6031b22f9e9441;hb=7bbf4117c6fe4b764d9d7c62fb2bcf6dd93bff2c;hp=1cb8f82407d3afa2bba3b28a4dd32dafe643e5c7;hpb=fe0c7aac669c960c7cc9683d5068980bf732c2f6;p=openwrt%2Fstaging%2Fmkresin.git diff --git a/target/linux/ar71xx/files/drivers/mtd/nand/rb4xx_nand.c b/target/linux/ar71xx/files/drivers/mtd/nand/rb4xx_nand.c index 1cb8f82407..b397575f77 100644 --- a/target/linux/ar71xx/files/drivers/mtd/nand/rb4xx_nand.c +++ b/target/linux/ar71xx/files/drivers/mtd/nand/rb4xx_nand.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -41,6 +42,7 @@ struct rb4xx_nand_info { struct mtd_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. @@ -52,6 +54,56 @@ static struct nand_ecclayout rb4xx_nand_ecclayout = { .oobfree = { { 0, 4 }, { 6, 2 }, { 11, 2 }, { 4, 1 } } }; +#else + +static int rb4xx_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 rb4xx_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 rb4xx_nand_ecclayout_ops = { + .ecc = rb4xx_ooblayout_ecc, + .free = rb4xx_ooblayout_free, +}; +#endif /* < 4.6 */ + static struct mtd_partition rb4xx_nand_partitions[] = { { .name = "booter", @@ -62,10 +114,10 @@ static struct mtd_partition rb4xx_nand_partitions[] = { { .name = "kernel", .offset = (256 * 1024), - .size = (6 * 1024 * 1024) - (256 * 1024), + .size = (4 * 1024 * 1024) - (256 * 1024), }, { - .name = "rootfs", + .name = "ubi", .offset = MTDPART_OFS_NXTBLK, .size = MTDPART_SIZ_FULL, }, @@ -107,7 +159,7 @@ static unsigned char rb4xx_nand_read_byte(struct mtd_info *mtd) unsigned char data = 0; int err; - err = rb4xx_cpld_read(&data, NULL, 1); + err = rb4xx_cpld_read(&data, 1); if (err) { pr_err("rb4xx_nand: read data failed, err=%d\n", err); data = 0xff; @@ -131,12 +183,12 @@ static void rb4xx_nand_read_buf(struct mtd_info *mtd, unsigned char *buf, { int err; - err = rb4xx_cpld_read(buf, NULL, len); + err = rb4xx_cpld_read(buf, len); if (err) pr_err("rb4xx_nand: read buf failed, err=%d\n", err); } -static int __devinit rb4xx_nand_probe(struct platform_device *pdev) +static int rb4xx_nand_probe(struct platform_device *pdev) { struct rb4xx_nand_info *info; int ret; @@ -215,13 +267,10 @@ static int __devinit rb4xx_nand_probe(struct platform_device *pdev) info->chip.read_byte = rb4xx_nand_read_byte; info->chip.write_buf = rb4xx_nand_write_buf; info->chip.read_buf = rb4xx_nand_read_buf; -#if 0 - info->chip.verify_buf = rb4xx_nand_verify_buf; -#endif info->chip.chip_delay = 25; info->chip.ecc.mode = NAND_ECC_SOFT; - info->chip.options |= NAND_NO_AUTOINCR; + info->chip.options = NAND_NO_SUBPAGE_WRITE; platform_set_drvdata(pdev, info); @@ -232,7 +281,11 @@ static int __devinit rb4xx_nand_probe(struct platform_device *pdev) } if (info->mtd.writesize == 512) +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0) info->chip.ecc.layout = &rb4xx_nand_ecclayout; +#else + mtd_set_ooblayout(&info->mtd, &rb4xx_nand_ecclayout_ops); +#endif ret = nand_scan_tail(&info->mtd); if (ret) { @@ -265,7 +318,7 @@ err: return ret; } -static int __devexit rb4xx_nand_remove(struct platform_device *pdev) +static int rb4xx_nand_remove(struct platform_device *pdev) { struct rb4xx_nand_info *info = platform_get_drvdata(pdev); @@ -282,7 +335,7 @@ static int __devexit rb4xx_nand_remove(struct platform_device *pdev) static struct platform_driver rb4xx_nand_driver = { .probe = rb4xx_nand_probe, - .remove = __devexit_p(rb4xx_nand_remove), + .remove = rb4xx_nand_remove, .driver = { .name = DRV_NAME, .owner = THIS_MODULE,