aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/ath79/files/drivers/mtd/nand/raw/ar934x_nand.c
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/ath79/files/drivers/mtd/nand/raw/ar934x_nand.c')
-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);
}