aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/ar71xx/files/drivers/mtd/nand/rb750_nand.c
diff options
context:
space:
mode:
authorHauke Mehrtens <hauke@hauke-m.de>2017-10-03 18:02:59 +0200
committerHauke Mehrtens <hauke@hauke-m.de>2017-10-11 22:32:39 +0200
commit7bbf4117c6fe4b764d9d7c62fb2bcf6dd93bff2c (patch)
treee42a4555f9845f78fb9baf7102da8d3d45adfacc /target/linux/ar71xx/files/drivers/mtd/nand/rb750_nand.c
parent2909a4b78e2bce5f6b9c35361866d5e9477a1bdc (diff)
downloadupstream-7bbf4117c6fe4b764d9d7c62fb2bcf6dd93bff2c.tar.gz
upstream-7bbf4117c6fe4b764d9d7c62fb2bcf6dd93bff2c.tar.bz2
upstream-7bbf4117c6fe4b764d9d7c62fb2bcf6dd93bff2c.zip
ar71xx: Add kernel 4.9 support
This add support for kernel 4.9 to the ar71xx target. It was compile tested with the generic, NAND and mikrotik subtarget. Multiple members of the community tested it on their boards and did not report any major problem so far. Especially the NAND part received some changes to adapt to the new kernel APIs. The serial driver hack used for the Arduino Yun was not ported because the kernel changed there a lot. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
Diffstat (limited to 'target/linux/ar71xx/files/drivers/mtd/nand/rb750_nand.c')
-rw-r--r--target/linux/ar71xx/files/drivers/mtd/nand/rb750_nand.c56
1 files changed, 56 insertions, 0 deletions
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 0604c5a235..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 <linux/platform_device.h>
#include <linux/io.h>
#include <linux/slab.h>
+#include <linux/version.h>
#include <asm/mach-ath79/ar71xx_regs.h>
#include <asm/mach-ath79/ath79.h>
@@ -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",
@@ -292,7 +344,11 @@ static int 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) {