#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>
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.
.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",
.offset = (256 * 1024),
.size = (4 * 1024 * 1024) - (256 * 1024),
}, {
- .name = "rootfs",
+ .name = "ubi",
.offset = MTDPART_OFS_NXTBLK,
.size = MTDPART_SIZ_FULL,
},
__raw_readl(base + AR71XX_GPIO_REG_OE);
}
-static int rb750_nand_read_verify(u8 *read_buf, unsigned len,
- const u8 *verify_buf)
+static void rb750_nand_read(u8 *read_buf, unsigned len)
{
void __iomem *base = ath79_gpio_base;
unsigned i;
/* deactivate RE line */
__raw_writel(RB750_NAND_NRE, base + AR71XX_GPIO_REG_SET);
- if (read_buf)
- read_buf[i] = data;
- else if (verify_buf && verify_buf[i] != data)
- return -EFAULT;
+ read_buf[i] = data;
}
-
- return 0;
}
static void rb750_nand_select_chip(struct mtd_info *mtd, int chip)
static u8 rb750_nand_read_byte(struct mtd_info *mtd)
{
u8 data = 0;
- rb750_nand_read_verify(&data, 1, NULL);
+ rb750_nand_read(&data, 1);
return data;
}
static void rb750_nand_read_buf(struct mtd_info *mtd, u8 *buf, int len)
{
- rb750_nand_read_verify(buf, len, NULL);
+ rb750_nand_read(buf, len);
}
static void rb750_nand_write_buf(struct mtd_info *mtd, const u8 *buf, int len)
rb750_nand_write(buf, len);
}
-static int rb750_nand_verify_buf(struct mtd_info *mtd, const u8 *buf, int len)
-{
- return rb750_nand_read_verify(NULL, len, buf);
-}
-
static void __init rb750_nand_gpio_init(struct rb750_nand_info *info)
{
void __iomem *base = ath79_gpio_base;
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;
info->chip.read_byte = rb750_nand_read_byte;
info->chip.write_buf = rb750_nand_write_buf;
info->chip.read_buf = rb750_nand_read_buf;
- info->chip.verify_buf = rb750_nand_verify_buf;
info->chip.chip_delay = 25;
info->chip.ecc.mode = NAND_ECC_SOFT;
+ info->chip.options = NAND_NO_SUBPAGE_WRITE;
info->pdata = pdata;
}
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) {
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);
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,