summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Bauer <mail@david-bauer.net>2020-03-17 21:59:27 +0100
committerDavid Bauer <mail@david-bauer.net>2020-03-22 20:03:18 +0100
commit94c0926106a28189eb5e15ab1b3c182c87796f8e (patch)
tree4581e18b2b95599db18ceb4f7e5b47e7aa227a85
parent9e5a25846f501acfd4aedccae8cef31ad8f2c456 (diff)
downloadopenwrt-94c0926106a28189eb5e15ab1b3c182c87796f8e.tar.gz
openwrt-94c0926106a28189eb5e15ab1b3c182c87796f8e.tar.bz2
openwrt-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>
-rw-r--r--target/linux/ath79/files/drivers/mtd/nand/raw/ar934x_nand.c127
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);
}