[OpenWrt-Devel] [PATCH] ath79: fix NAND driver compilation for kernel 5.4

David Bauer mail at david-bauer.net
Tue Mar 17 16:59:27 EDT 2020


This fixes the compilation of the AR934x NAND controller
driver for kernel 5.4 while leaving it untouched for
kernel 4.19.

This change is currently not run-tested, as i do not have such
a device at hand.

CC: Michal Cieslakiewicz <michal.cieslakiewicz at wp.pl>
CC: André Valentin <avalentin at marcant.net>
CC: WeiDong Jia <jwdsccd at gmail.com>
Signed-off-by: David Bauer <mail at david-bauer.net>
---
 .../files/drivers/mtd/nand/raw/ar934x_nand.c  | 127 +++++++++++++++++-
 1 file changed, 122 insertions(+), 5 deletions(-)

diff --git a/target/linux/ath79/files/drivers/mtd/nand/raw/ar934x_nand.c b/target/linux/ath79/files/drivers/mtd/nand/raw/ar934x_nand.c
index 58198e4465..70aa396e25 100644
--- a/target/linux/ath79/files/drivers/mtd/nand/raw/ar934x_nand.c
+++ b/target/linux/ath79/files/drivers/mtd/nand/raw/ar934x_nand.c
@@ -631,11 +631,19 @@ static void ar934x_nfc_read_status(struct ar934x_nfc *nfc)
 		nfc->buf[0] = status;
 }
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 20, 0)
 static void ar934x_nfc_cmdfunc(struct mtd_info *mtd, unsigned int command,
 			       int column, int page_addr)
 {
 	struct ar934x_nfc *nfc = mtd_to_ar934x_nfc(mtd);
 	struct nand_chip *nand = &nfc->nand_chip;
+#else
+static void ar934x_nfc_cmdfunc(struct nand_chip *nand, unsigned int command,
+			       int column, int page_addr)
+{
+	struct mtd_info *mtd = nand_to_mtd(nand);
+	struct ar934x_nfc *nfc = nand->priv;
+#endif
 
 	nfc->read_id = false;
 	if (command != NAND_CMD_PAGEPROG)
@@ -740,16 +748,28 @@ static void ar934x_nfc_cmdfunc(struct mtd_info *mtd, unsigned int command,
 	}
 }
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 20, 0)
 static int ar934x_nfc_dev_ready(struct mtd_info *mtd)
 {
 	struct ar934x_nfc *nfc = mtd_to_ar934x_nfc(mtd);
+#else
+static int ar934x_nfc_dev_ready(struct nand_chip *chip)
+{
+	struct ar934x_nfc *nfc = chip->priv;
+#endif
 
 	return __ar934x_nfc_dev_ready(nfc);
 }
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 20, 0)
 static u8 ar934x_nfc_read_byte(struct mtd_info *mtd)
 {
 	struct ar934x_nfc *nfc = mtd_to_ar934x_nfc(mtd);
+#else
+static u8 ar934x_nfc_read_byte(struct nand_chip *chip)
+{
+	struct ar934x_nfc *nfc = chip->priv;
+#endif
 	u8 data;
 
 	WARN_ON(nfc->buf_index >= nfc->buf_size);
@@ -764,9 +784,15 @@ static u8 ar934x_nfc_read_byte(struct mtd_info *mtd)
 	return data;
 }
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 20, 0)
 static void ar934x_nfc_write_buf(struct mtd_info *mtd, const u8 *buf, int len)
 {
 	struct ar934x_nfc *nfc = mtd_to_ar934x_nfc(mtd);
+#else
+static void ar934x_nfc_write_buf(struct nand_chip *chip, const u8 *buf, int len)
+{
+	struct ar934x_nfc *nfc = chip->priv;
+#endif
 	int i;
 
 	WARN_ON(nfc->buf_index + len > nfc->buf_size);
@@ -784,9 +810,15 @@ static void ar934x_nfc_write_buf(struct mtd_info *mtd, const u8 *buf, int len)
 	}
 }
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 20, 0)
 static void ar934x_nfc_read_buf(struct mtd_info *mtd, u8 *buf, int len)
 {
 	struct ar934x_nfc *nfc = mtd_to_ar934x_nfc(mtd);
+#else
+static void ar934x_nfc_read_buf(struct nand_chip *chip, u8 *buf, int len)
+{
+	struct ar934x_nfc *nfc = chip->priv;
+#endif
 	int buf_index;
 	int i;
 
@@ -821,10 +853,18 @@ static inline void ar934x_nfc_disable_hwecc(struct ar934x_nfc *nfc)
 	nfc->ctrl_reg |= AR934X_NFC_CTRL_CUSTOM_SIZE_EN;
 }
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 20, 0)
 static int ar934x_nfc_read_oob(struct mtd_info *mtd, struct nand_chip *chip,
 			       int page)
 {
 	struct ar934x_nfc *nfc = mtd_to_ar934x_nfc(mtd);
+#else
+static int ar934x_nfc_read_oob(struct nand_chip *chip,
+			       int page)
+{
+	struct ar934x_nfc *nfc = chip->priv;
+	struct mtd_info *mtd = ar934x_nfc_to_mtd(nfc);
+#endif
 	int err;
 
 	nfc_dbg(nfc, "read_oob: page:%d\n", page);
@@ -839,11 +879,18 @@ static int ar934x_nfc_read_oob(struct mtd_info *mtd, struct nand_chip *chip,
 	return 0;
 }
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 20, 0)
 static int ar934x_nfc_write_oob(struct mtd_info *mtd, struct nand_chip *chip,
 				int page)
 {
 	struct ar934x_nfc *nfc = mtd_to_ar934x_nfc(mtd);
-
+#else
+static int ar934x_nfc_write_oob(struct nand_chip *chip,
+				int page)
+{
+	struct ar934x_nfc *nfc = chip->priv;
+	struct mtd_info *mtd = ar934x_nfc_to_mtd(nfc);
+#endif
 	nfc_dbg(nfc, "write_oob: page:%d\n", page);
 
 	memcpy(nfc->buf, chip->oob_poi, mtd->oobsize);
@@ -852,11 +899,20 @@ static int ar934x_nfc_write_oob(struct mtd_info *mtd, struct nand_chip *chip,
 				     page, mtd->oobsize);
 }
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 20, 0)
 static int ar934x_nfc_read_page_raw(struct mtd_info *mtd,
 				    struct nand_chip *chip, u8 *buf,
 				    int oob_required, int page)
 {
 	struct ar934x_nfc *nfc = mtd_to_ar934x_nfc(mtd);
+#else
+static int ar934x_nfc_read_page_raw(
+				    struct nand_chip *chip, u8 *buf,
+				    int oob_required, int page)
+{
+	struct ar934x_nfc *nfc = chip->priv;
+	struct mtd_info *mtd = ar934x_nfc_to_mtd(nfc);
+#endif
 	int len;
 	int err;
 
@@ -878,10 +934,18 @@ static int ar934x_nfc_read_page_raw(struct mtd_info *mtd,
 	return 0;
 }
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 20, 0)
 static int ar934x_nfc_read_page(struct mtd_info *mtd, struct nand_chip *chip,
 				u8 *buf, int oob_required, int page)
 {
 	struct ar934x_nfc *nfc = mtd_to_ar934x_nfc(mtd);
+#else
+static int ar934x_nfc_read_page(struct nand_chip *chip,
+				u8 *buf, int oob_required, int page)
+{
+	struct ar934x_nfc *nfc = chip->priv;
+	struct mtd_info *mtd = ar934x_nfc_to_mtd(nfc);
+#endif
 	u32 ecc_ctrl;
 	int max_bitflips = 0;
 	bool ecc_failed;
@@ -950,11 +1014,20 @@ static int ar934x_nfc_read_page(struct mtd_info *mtd, struct nand_chip *chip,
 	return max_bitflips;
 }
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 20, 0)
 static int ar934x_nfc_write_page_raw(struct mtd_info *mtd,
 				     struct nand_chip *chip, const u8 *buf,
 				     int oob_required, int page)
 {
 	struct ar934x_nfc *nfc = mtd_to_ar934x_nfc(mtd);
+#else
+static int ar934x_nfc_write_page_raw(
+				     struct nand_chip *chip, const u8 *buf,
+				     int oob_required, int page)
+{
+	struct ar934x_nfc *nfc = chip->priv;
+	struct mtd_info *mtd = ar934x_nfc_to_mtd(nfc);
+#endif
 	int len;
 
 	nfc_dbg(nfc, "write_page_raw: page:%d oob:%d\n", page, oob_required);
@@ -970,10 +1043,18 @@ static int ar934x_nfc_write_page_raw(struct mtd_info *mtd,
 	return ar934x_nfc_send_write(nfc, NAND_CMD_PAGEPROG, 0, page, len);
 }
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 20, 0)
 static int ar934x_nfc_write_page(struct mtd_info *mtd, struct nand_chip *chip,
 				 const u8 *buf, int oob_required, int page)
 {
 	struct ar934x_nfc *nfc = mtd_to_ar934x_nfc(mtd);
+#else
+static int ar934x_nfc_write_page(struct nand_chip *chip,
+				 const u8 *buf, int oob_required, int page)
+{
+	struct ar934x_nfc *nfc = chip->priv;
+	struct mtd_info *mtd = ar934x_nfc_to_mtd(nfc);
+#endif
 	int err;
 
 	nfc_dbg(nfc, "write_page: page:%d oob:%d\n", page, oob_required);
@@ -981,7 +1062,11 @@ static int ar934x_nfc_write_page(struct mtd_info *mtd, struct nand_chip *chip,
 	/* write OOB first */
 	if (oob_required &&
 	    !is_all_ff(chip->oob_poi, mtd->oobsize)) {
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 20, 0)
 		err = ar934x_nfc_write_oob(mtd, chip, page);
+#else
+		err = ar934x_nfc_write_oob(chip, page);
+#endif
 		if (err)
 			return err;
 	}
@@ -1083,6 +1168,11 @@ static int ar934x_nfc_init_tail(struct mtd_info *mtd)
 {
 	struct ar934x_nfc *nfc = mtd_to_ar934x_nfc(mtd);
 	struct nand_chip *chip = &nfc->nand_chip;
+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 2, 0)
+	u64 chipsize = chip->chipsize;
+#else
+	u64 chipsize = nanddev_target_size(&chip->base);
+#endif
 	u32 ctrl;
 	u32 t;
 	int err;
@@ -1169,10 +1259,10 @@ static int ar934x_nfc_init_tail(struct mtd_info *mtd)
 	if (nfc->small_page) {
 		ctrl |= AR934X_NFC_CTRL_SMALL_PAGE;
 
-		if (chip->chipsize > (32 << 20)) {
+		if (chipsize > (32 << 20)) {
 			nfc->addr_count0 = 4;
 			nfc->addr_count1 = 3;
-		} else if (chip->chipsize > (2 << 16)) {
+		} else if (chipsize > (2 << 16)) {
 			nfc->addr_count0 = 3;
 			nfc->addr_count1 = 2;
 		} else {
@@ -1180,10 +1270,10 @@ static int ar934x_nfc_init_tail(struct mtd_info *mtd)
 			nfc->addr_count1 = 1;
 		}
 	} else {
-		if (chip->chipsize > (128 << 20)) {
+		if (chipsize > (128 << 20)) {
 			nfc->addr_count0 = 5;
 			nfc->addr_count1 = 3;
-		} else if (chip->chipsize > (8 << 16)) {
+		} else if (chipsize > (8 << 16)) {
 			nfc->addr_count0 = 4;
 			nfc->addr_count1 = 2;
 		} else {
@@ -1329,8 +1419,13 @@ static int ar934x_nfc_attach_chip(struct nand_chip *nand)
 
 static u64 ar934x_nfc_dma_mask = DMA_BIT_MASK(32);
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 20, 0)
 static void ar934x_nfc_cmd_ctrl(struct mtd_info *mtd, int dat,
 				unsigned int ctrl)
+#else
+static void ar934x_nfc_cmd_ctrl(struct nand_chip *chip, int dat,
+				unsigned int ctrl)
+#endif
 {
 	WARN_ON(dat != NAND_CMD_NONE);
 }
@@ -1401,6 +1496,7 @@ static int ar934x_nfc_probe(struct platform_device *pdev)
 
 	nand_set_controller_data(nand, nfc);
 	nand_set_flash_node(nand, pdev->dev.of_node);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 20, 0)
 	nand->chip_delay = 25;
 	nand->dev_ready = ar934x_nfc_dev_ready;
 	nand->cmdfunc = ar934x_nfc_cmdfunc;
@@ -1408,7 +1504,17 @@ static int ar934x_nfc_probe(struct platform_device *pdev)
 	nand->read_byte = ar934x_nfc_read_byte;
 	nand->write_buf = ar934x_nfc_write_buf;
 	nand->read_buf = ar934x_nfc_read_buf;
+#else
+	nand->legacy.chip_delay = 25;
+	nand->legacy.dev_ready = ar934x_nfc_dev_ready;
+	nand->legacy.cmdfunc = ar934x_nfc_cmdfunc;
+	nand->legacy.cmd_ctrl = ar934x_nfc_cmd_ctrl;	/* dummy */
+	nand->legacy.read_byte = ar934x_nfc_read_byte;
+	nand->legacy.write_buf = ar934x_nfc_write_buf;
+	nand->legacy.read_buf = ar934x_nfc_read_buf;
+#endif
 	nand->ecc.mode = NAND_ECC_HW;	/* default */
+	nand->priv = nfc;
 	platform_set_drvdata(pdev, nfc);
 
 	ret = ar934x_nfc_alloc_buf(nfc, AR934X_NFC_ID_BUF_SIZE);
@@ -1421,8 +1527,13 @@ static int ar934x_nfc_probe(struct platform_device *pdev)
 		goto err_free_buf;
 	}
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 20, 0)
 	nand->dummy_controller.ops = &ar934x_nfc_controller_ops;
 	ret = nand_scan(mtd, 1);
+#else
+	nand->legacy.dummy_controller.ops = &ar934x_nfc_controller_ops;
+	ret = nand_scan(nand, 1);
+#endif
 	if (ret) {
 		dev_err(&pdev->dev, "nand_scan failed, err:%d\n", ret);
 		goto err_free_buf;
@@ -1444,12 +1555,18 @@ err_free_buf:
 static int ar934x_nfc_remove(struct platform_device *pdev)
 {
 	struct ar934x_nfc *nfc;
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 20, 0)
 	struct mtd_info *mtd;
+#endif
 
 	nfc = platform_get_drvdata(pdev);
 	if (nfc) {
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 20, 0)
 		mtd = ar934x_nfc_to_mtd(nfc);
 		nand_release(mtd);
+#else
+		nand_release(&nfc->nand_chip);
+#endif
 		ar934x_nfc_free_buf(nfc);
 	}
 
-- 
2.25.1


_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel


More information about the openwrt-devel mailing list