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>
master
David Bauer 4 years ago
parent 9e5a25846f
commit 94c0926106

@ -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);
}

Loading…
Cancel
Save