ath79: fix NAND driver compilation for kernel 5.4
authorDavid Bauer <mail@david-bauer.net>
Tue, 17 Mar 2020 20:59:27 +0000 (21:59 +0100)
committerDavid Bauer <mail@david-bauer.net>
Sun, 22 Mar 2020 19:03:18 +0000 (20:03 +0100)
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@wp.pl>
CC: André Valentin <avalentin@marcant.net>
CC: WeiDong Jia <jwdsccd@gmail.com>
Signed-off-by: David Bauer <mail@david-bauer.net>
Tested-by: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl>
target/linux/ath79/files/drivers/mtd/nand/raw/ar934x_nand.c

index 58198e446562d96c1a8f3207de7dab81c94a4e7e..70aa396e25b05a11e549a2cc166c670864398320 100644 (file)
@@ -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);
        }