#include <linux/delay.h>
#include <linux/init.h>
#include <linux/io.h>
#include <linux/list.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/gpio/consumer.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/jz4780-nemc.h>
#include "ingenic_ecc.h"
#define DRV_NAME …
struct jz_soc_info { … };
struct ingenic_nand_cs { … };
struct ingenic_nfc { … };
struct ingenic_nand { … };
static inline struct ingenic_nand *to_ingenic_nand(struct mtd_info *mtd)
{ … }
static inline struct ingenic_nfc *to_ingenic_nfc(struct nand_controller *ctrl)
{ … }
static int qi_lb60_ooblayout_ecc(struct mtd_info *mtd, int section,
struct mtd_oob_region *oobregion)
{ … }
static int qi_lb60_ooblayout_free(struct mtd_info *mtd, int section,
struct mtd_oob_region *oobregion)
{ … }
static const struct mtd_ooblayout_ops qi_lb60_ooblayout_ops = …;
static int jz4725b_ooblayout_ecc(struct mtd_info *mtd, int section,
struct mtd_oob_region *oobregion)
{ … }
static int jz4725b_ooblayout_free(struct mtd_info *mtd, int section,
struct mtd_oob_region *oobregion)
{ … }
static const struct mtd_ooblayout_ops jz4725b_ooblayout_ops = …;
static void ingenic_nand_ecc_hwctl(struct nand_chip *chip, int mode)
{ … }
static int ingenic_nand_ecc_calculate(struct nand_chip *chip, const u8 *dat,
u8 *ecc_code)
{ … }
static int ingenic_nand_ecc_correct(struct nand_chip *chip, u8 *dat,
u8 *read_ecc, u8 *calc_ecc)
{ … }
static int ingenic_nand_attach_chip(struct nand_chip *chip)
{ … }
static int ingenic_nand_exec_instr(struct nand_chip *chip,
struct ingenic_nand_cs *cs,
const struct nand_op_instr *instr)
{ … }
static int ingenic_nand_exec_op(struct nand_chip *chip,
const struct nand_operation *op,
bool check_only)
{ … }
static const struct nand_controller_ops ingenic_nand_controller_ops = …;
static int ingenic_nand_init_chip(struct platform_device *pdev,
struct ingenic_nfc *nfc,
struct device_node *np,
unsigned int chipnr)
{ … }
static void ingenic_nand_cleanup_chips(struct ingenic_nfc *nfc)
{ … }
static int ingenic_nand_init_chips(struct ingenic_nfc *nfc,
struct platform_device *pdev)
{ … }
static int ingenic_nand_probe(struct platform_device *pdev)
{ … }
static void ingenic_nand_remove(struct platform_device *pdev)
{ … }
static const struct jz_soc_info jz4740_soc_info = …;
static const struct jz_soc_info jz4725b_soc_info = …;
static const struct jz_soc_info jz4780_soc_info = …;
static const struct of_device_id ingenic_nand_dt_match[] = …;
MODULE_DEVICE_TABLE(of, ingenic_nand_dt_match);
static struct platform_driver ingenic_nand_driver = …;
module_platform_driver(…) …;
MODULE_AUTHOR(…) …;
MODULE_AUTHOR(…) …;
MODULE_DESCRIPTION(…) …;
MODULE_LICENSE(…) …;