#include <linux/io.h>
#include <linux/gpio.h>
#include <linux/slab.h>
+#include <linux/version.h>
#include <asm/mach-ath79/ath79.h>
#include <asm/mach-ath79/rb4xx_cpld.h>
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.
.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",
.size = (4 * 1024 * 1024) - (256 * 1024),
},
{
- .name = "rootfs",
+ .name = "ubi",
.offset = MTDPART_OFS_NXTBLK,
.size = MTDPART_SIZ_FULL,
},
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;
{
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;
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_SUBPAGE_WRITE;
platform_set_drvdata(pdev, info);
}
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) {
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);
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,