diff options
author | David Bauer <mail@david-bauer.net> | 2020-03-17 21:59:27 +0100 |
---|---|---|
committer | David Bauer <mail@david-bauer.net> | 2020-03-22 20:03:18 +0100 |
commit | 94c0926106a28189eb5e15ab1b3c182c87796f8e (patch) | |
tree | 4581e18b2b95599db18ceb4f7e5b47e7aa227a85 /target/linux/ath79 | |
parent | 9e5a25846f501acfd4aedccae8cef31ad8f2c456 (diff) | |
download | upstream-94c0926106a28189eb5e15ab1b3c182c87796f8e.tar.gz upstream-94c0926106a28189eb5e15ab1b3c182c87796f8e.tar.bz2 upstream-94c0926106a28189eb5e15ab1b3c182c87796f8e.zip |
ath79: fix NAND driver compilation for kernel 5.4
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>
Diffstat (limited to 'target/linux/ath79')
-rw-r--r-- | target/linux/ath79/files/drivers/mtd/nand/raw/ar934x_nand.c | 127 |
1 files 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); } |