#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/mutex.h>
#include <linux/clk.h>
#include <linux/interrupt.h>
#include <linux/dma-mapping.h>
#include <linux/iopoll.h>
#include <linux/of.h>
#include <linux/platform_device.h>
#include <linux/mtd/nand-ecc-mtk.h>
#include <linux/spi/spi.h>
#include <linux/spi/spi-mem.h>
#include <linux/mtd/nand.h>
#define NFI_CNFG …
#define CNFG_OP_MODE_S …
#define CNFG_OP_MODE_CUST …
#define CNFG_OP_MODE_PROGRAM …
#define CNFG_AUTO_FMT_EN …
#define CNFG_HW_ECC_EN …
#define CNFG_DMA_BURST_EN …
#define CNFG_READ_MODE …
#define CNFG_DMA_MODE …
#define NFI_PAGEFMT …
#define NFI_SPARE_SIZE_LS_S …
#define NFI_FDM_ECC_NUM_S …
#define NFI_FDM_NUM_S …
#define NFI_SPARE_SIZE_S …
#define NFI_SEC_SEL_512 …
#define NFI_PAGE_SIZE_S …
#define NFI_PAGE_SIZE_512_2K …
#define NFI_PAGE_SIZE_2K_4K …
#define NFI_PAGE_SIZE_4K_8K …
#define NFI_PAGE_SIZE_8K_16K …
#define NFI_CON …
#define CON_SEC_NUM_S …
#define CON_BWR …
#define CON_BRD …
#define CON_NFI_RST …
#define CON_FIFO_FLUSH …
#define NFI_INTR_EN …
#define NFI_INTR_STA …
#define NFI_IRQ_INTR_EN …
#define NFI_IRQ_CUS_READ …
#define NFI_IRQ_CUS_PG …
#define NFI_CMD …
#define NFI_CMD_DUMMY_READ …
#define NFI_CMD_DUMMY_WRITE …
#define NFI_STRDATA …
#define STR_DATA …
#define NFI_STA …
#define NFI_NAND_FSM_7622 …
#define NFI_NAND_FSM_7986 …
#define NFI_FSM …
#define READ_EMPTY …
#define NFI_FIFOSTA …
#define FIFO_WR_REMAIN_S …
#define FIFO_RD_REMAIN_S …
#define NFI_ADDRCNTR …
#define SEC_CNTR …
#define SEC_CNTR_S …
#define NFI_SEC_CNTR(val) …
#define NFI_STRADDR …
#define NFI_BYTELEN …
#define BUS_SEC_CNTR(val) …
#define NFI_FDM0L …
#define NFI_FDM0M …
#define NFI_FDML(n) …
#define NFI_FDMM(n) …
#define NFI_DEBUG_CON1 …
#define WBUF_EN …
#define NFI_MASTERSTA …
#define MAS_ADDR …
#define MAS_RD …
#define MAS_WR …
#define MAS_RDDLY …
#define NFI_MASTERSTA_MASK_7622 …
#define NFI_MASTERSTA_MASK_7986 …
#define SNF_MAC_CTL …
#define MAC_XIO_SEL …
#define SF_MAC_EN …
#define SF_TRIG …
#define WIP_READY …
#define WIP …
#define SNF_MAC_OUTL …
#define SNF_MAC_INL …
#define SNF_RD_CTL2 …
#define DATA_READ_DUMMY_S …
#define DATA_READ_MAX_DUMMY …
#define DATA_READ_CMD_S …
#define SNF_RD_CTL3 …
#define SNF_PG_CTL1 …
#define PG_LOAD_CMD_S …
#define SNF_PG_CTL2 …
#define SNF_MISC_CTL …
#define SW_RST …
#define FIFO_RD_LTC_S …
#define PG_LOAD_X4_EN …
#define DATA_READ_MODE_S …
#define DATA_READ_MODE …
#define DATA_READ_MODE_X1 …
#define DATA_READ_MODE_X2 …
#define DATA_READ_MODE_X4 …
#define DATA_READ_MODE_DUAL …
#define DATA_READ_MODE_QUAD …
#define DATA_READ_LATCH_LAT …
#define DATA_READ_LATCH_LAT_S …
#define PG_LOAD_CUSTOM_EN …
#define DATARD_CUSTOM_EN …
#define CS_DESELECT_CYC_S …
#define SNF_MISC_CTL2 …
#define PROGRAM_LOAD_BYTE_NUM_S …
#define READ_DATA_BYTE_NUM_S …
#define SNF_DLY_CTL3 …
#define SFCK_SAM_DLY_S …
#define SFCK_SAM_DLY …
#define SFCK_SAM_DLY_TOTAL …
#define SFCK_SAM_DLY_RANGE …
#define SNF_STA_CTL1 …
#define CUS_PG_DONE …
#define CUS_READ_DONE …
#define SPI_STATE_S …
#define SPI_STATE …
#define SNF_CFG …
#define SPI_MODE …
#define SNF_GPRAM …
#define SNF_GPRAM_SIZE …
#define SNFI_POLL_INTERVAL …
static const u8 mt7622_spare_sizes[] = …;
static const u8 mt7986_spare_sizes[] = …;
struct mtk_snand_caps { … };
static const struct mtk_snand_caps mt7622_snand_caps = …;
static const struct mtk_snand_caps mt7629_snand_caps = …;
static const struct mtk_snand_caps mt7986_snand_caps = …;
struct mtk_snand_conf { … };
struct mtk_snand { … };
static struct mtk_snand *nand_to_mtk_snand(struct nand_device *nand)
{ … }
static inline int snand_prepare_bouncebuf(struct mtk_snand *snf, size_t size)
{ … }
static inline u32 nfi_read32(struct mtk_snand *snf, u32 reg)
{ … }
static inline void nfi_write32(struct mtk_snand *snf, u32 reg, u32 val)
{ … }
static inline void nfi_write16(struct mtk_snand *snf, u32 reg, u16 val)
{ … }
static inline void nfi_rmw32(struct mtk_snand *snf, u32 reg, u32 clr, u32 set)
{ … }
static void nfi_read_data(struct mtk_snand *snf, u32 reg, u8 *data, u32 len)
{ … }
static int mtk_nfi_reset(struct mtk_snand *snf)
{ … }
static int mtk_snand_mac_reset(struct mtk_snand *snf)
{ … }
static int mtk_snand_mac_trigger(struct mtk_snand *snf, u32 outlen, u32 inlen)
{ … }
static int mtk_snand_mac_io(struct mtk_snand *snf, const struct spi_mem_op *op)
{ … }
static int mtk_snand_setup_pagefmt(struct mtk_snand *snf, u32 page_size,
u32 oob_size)
{ … }
static int mtk_snand_ooblayout_ecc(struct mtd_info *mtd, int section,
struct mtd_oob_region *oobecc)
{ … }
static int mtk_snand_ooblayout_free(struct mtd_info *mtd, int section,
struct mtd_oob_region *oobfree)
{ … }
static const struct mtd_ooblayout_ops mtk_snand_ooblayout = …;
static int mtk_snand_ecc_init_ctx(struct nand_device *nand)
{ … }
static void mtk_snand_ecc_cleanup_ctx(struct nand_device *nand)
{ … }
static int mtk_snand_ecc_prepare_io_req(struct nand_device *nand,
struct nand_page_io_req *req)
{ … }
static int mtk_snand_ecc_finish_io_req(struct nand_device *nand,
struct nand_page_io_req *req)
{ … }
static struct nand_ecc_engine_ops mtk_snfi_ecc_engine_ops = …;
static void mtk_snand_read_fdm(struct mtk_snand *snf, u8 *buf)
{ … }
static void mtk_snand_write_fdm(struct mtk_snand *snf, const u8 *buf)
{ … }
static void mtk_snand_bm_swap(struct mtk_snand *snf, u8 *buf)
{ … }
static void mtk_snand_fdm_bm_swap(struct mtk_snand *snf)
{ … }
static int mtk_snand_read_page_cache(struct mtk_snand *snf,
const struct spi_mem_op *op)
{ … }
static int mtk_snand_write_page_cache(struct mtk_snand *snf,
const struct spi_mem_op *op)
{ … }
static bool mtk_snand_is_page_ops(const struct spi_mem_op *op)
{ … }
static bool mtk_snand_supports_op(struct spi_mem *mem,
const struct spi_mem_op *op)
{ … }
static int mtk_snand_adjust_op_size(struct spi_mem *mem, struct spi_mem_op *op)
{ … }
static int mtk_snand_exec_op(struct spi_mem *mem, const struct spi_mem_op *op)
{ … }
static const struct spi_controller_mem_ops mtk_snand_mem_ops = …;
static const struct spi_controller_mem_caps mtk_snand_mem_caps = …;
static irqreturn_t mtk_snand_irq(int irq, void *id)
{ … }
static const struct of_device_id mtk_snand_ids[] = …;
MODULE_DEVICE_TABLE(of, mtk_snand_ids);
static int mtk_snand_probe(struct platform_device *pdev)
{ … }
static void mtk_snand_remove(struct platform_device *pdev)
{ … }
static struct platform_driver mtk_snand_driver = …;
module_platform_driver(…) …;
MODULE_LICENSE(…) …;
MODULE_AUTHOR(…) …;
MODULE_DESCRIPTION(…) …;