cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

sunxi_nand.c (60242B)


      1// SPDX-License-Identifier: GPL-2.0+
      2/*
      3 * Copyright (C) 2013 Boris BREZILLON <b.brezillon.dev@gmail.com>
      4 *
      5 * Derived from:
      6 *	https://github.com/yuq/sunxi-nfc-mtd
      7 *	Copyright (C) 2013 Qiang Yu <yuq825@gmail.com>
      8 *
      9 *	https://github.com/hno/Allwinner-Info
     10 *	Copyright (C) 2013 Henrik Nordström <Henrik Nordström>
     11 *
     12 *	Copyright (C) 2013 Dmitriy B. <rzk333@gmail.com>
     13 *	Copyright (C) 2013 Sergey Lapin <slapin@ossfans.org>
     14 */
     15
     16#include <linux/dma-mapping.h>
     17#include <linux/slab.h>
     18#include <linux/module.h>
     19#include <linux/moduleparam.h>
     20#include <linux/platform_device.h>
     21#include <linux/of.h>
     22#include <linux/of_device.h>
     23#include <linux/mtd/mtd.h>
     24#include <linux/mtd/rawnand.h>
     25#include <linux/mtd/partitions.h>
     26#include <linux/clk.h>
     27#include <linux/delay.h>
     28#include <linux/dmaengine.h>
     29#include <linux/interrupt.h>
     30#include <linux/iopoll.h>
     31#include <linux/reset.h>
     32
     33#define NFC_REG_CTL		0x0000
     34#define NFC_REG_ST		0x0004
     35#define NFC_REG_INT		0x0008
     36#define NFC_REG_TIMING_CTL	0x000C
     37#define NFC_REG_TIMING_CFG	0x0010
     38#define NFC_REG_ADDR_LOW	0x0014
     39#define NFC_REG_ADDR_HIGH	0x0018
     40#define NFC_REG_SECTOR_NUM	0x001C
     41#define NFC_REG_CNT		0x0020
     42#define NFC_REG_CMD		0x0024
     43#define NFC_REG_RCMD_SET	0x0028
     44#define NFC_REG_WCMD_SET	0x002C
     45#define NFC_REG_A10_IO_DATA	0x0030
     46#define NFC_REG_A23_IO_DATA	0x0300
     47#define NFC_REG_ECC_CTL		0x0034
     48#define NFC_REG_ECC_ST		0x0038
     49#define NFC_REG_DEBUG		0x003C
     50#define NFC_REG_ECC_ERR_CNT(x)	((0x0040 + (x)) & ~0x3)
     51#define NFC_REG_USER_DATA(x)	(0x0050 + ((x) * 4))
     52#define NFC_REG_SPARE_AREA	0x00A0
     53#define NFC_REG_PAT_ID		0x00A4
     54#define NFC_REG_MDMA_ADDR	0x00C0
     55#define NFC_REG_MDMA_CNT	0x00C4
     56#define NFC_RAM0_BASE		0x0400
     57#define NFC_RAM1_BASE		0x0800
     58
     59/* define bit use in NFC_CTL */
     60#define NFC_EN			BIT(0)
     61#define NFC_RESET		BIT(1)
     62#define NFC_BUS_WIDTH_MSK	BIT(2)
     63#define NFC_BUS_WIDTH_8		(0 << 2)
     64#define NFC_BUS_WIDTH_16	(1 << 2)
     65#define NFC_RB_SEL_MSK		BIT(3)
     66#define NFC_RB_SEL(x)		((x) << 3)
     67#define NFC_CE_SEL_MSK		GENMASK(26, 24)
     68#define NFC_CE_SEL(x)		((x) << 24)
     69#define NFC_CE_CTL		BIT(6)
     70#define NFC_PAGE_SHIFT_MSK	GENMASK(11, 8)
     71#define NFC_PAGE_SHIFT(x)	(((x) < 10 ? 0 : (x) - 10) << 8)
     72#define NFC_SAM			BIT(12)
     73#define NFC_RAM_METHOD		BIT(14)
     74#define NFC_DMA_TYPE_NORMAL	BIT(15)
     75#define NFC_DEBUG_CTL		BIT(31)
     76
     77/* define bit use in NFC_ST */
     78#define NFC_RB_B2R		BIT(0)
     79#define NFC_CMD_INT_FLAG	BIT(1)
     80#define NFC_DMA_INT_FLAG	BIT(2)
     81#define NFC_CMD_FIFO_STATUS	BIT(3)
     82#define NFC_STA			BIT(4)
     83#define NFC_NATCH_INT_FLAG	BIT(5)
     84#define NFC_RB_STATE(x)		BIT(x + 8)
     85
     86/* define bit use in NFC_INT */
     87#define NFC_B2R_INT_ENABLE	BIT(0)
     88#define NFC_CMD_INT_ENABLE	BIT(1)
     89#define NFC_DMA_INT_ENABLE	BIT(2)
     90#define NFC_INT_MASK		(NFC_B2R_INT_ENABLE | \
     91				 NFC_CMD_INT_ENABLE | \
     92				 NFC_DMA_INT_ENABLE)
     93
     94/* define bit use in NFC_TIMING_CTL */
     95#define NFC_TIMING_CTL_EDO	BIT(8)
     96
     97/* define NFC_TIMING_CFG register layout */
     98#define NFC_TIMING_CFG(tWB, tADL, tWHR, tRHW, tCAD)		\
     99	(((tWB) & 0x3) | (((tADL) & 0x3) << 2) |		\
    100	(((tWHR) & 0x3) << 4) | (((tRHW) & 0x3) << 6) |		\
    101	(((tCAD) & 0x7) << 8))
    102
    103/* define bit use in NFC_CMD */
    104#define NFC_CMD_LOW_BYTE_MSK	GENMASK(7, 0)
    105#define NFC_CMD_HIGH_BYTE_MSK	GENMASK(15, 8)
    106#define NFC_CMD(x)		(x)
    107#define NFC_ADR_NUM_MSK		GENMASK(18, 16)
    108#define NFC_ADR_NUM(x)		(((x) - 1) << 16)
    109#define NFC_SEND_ADR		BIT(19)
    110#define NFC_ACCESS_DIR		BIT(20)
    111#define NFC_DATA_TRANS		BIT(21)
    112#define NFC_SEND_CMD1		BIT(22)
    113#define NFC_WAIT_FLAG		BIT(23)
    114#define NFC_SEND_CMD2		BIT(24)
    115#define NFC_SEQ			BIT(25)
    116#define NFC_DATA_SWAP_METHOD	BIT(26)
    117#define NFC_ROW_AUTO_INC	BIT(27)
    118#define NFC_SEND_CMD3		BIT(28)
    119#define NFC_SEND_CMD4		BIT(29)
    120#define NFC_CMD_TYPE_MSK	GENMASK(31, 30)
    121#define NFC_NORMAL_OP		(0 << 30)
    122#define NFC_ECC_OP		(1 << 30)
    123#define NFC_PAGE_OP		(2U << 30)
    124
    125/* define bit use in NFC_RCMD_SET */
    126#define NFC_READ_CMD_MSK	GENMASK(7, 0)
    127#define NFC_RND_READ_CMD0_MSK	GENMASK(15, 8)
    128#define NFC_RND_READ_CMD1_MSK	GENMASK(23, 16)
    129
    130/* define bit use in NFC_WCMD_SET */
    131#define NFC_PROGRAM_CMD_MSK	GENMASK(7, 0)
    132#define NFC_RND_WRITE_CMD_MSK	GENMASK(15, 8)
    133#define NFC_READ_CMD0_MSK	GENMASK(23, 16)
    134#define NFC_READ_CMD1_MSK	GENMASK(31, 24)
    135
    136/* define bit use in NFC_ECC_CTL */
    137#define NFC_ECC_EN		BIT(0)
    138#define NFC_ECC_PIPELINE	BIT(3)
    139#define NFC_ECC_EXCEPTION	BIT(4)
    140#define NFC_ECC_BLOCK_SIZE_MSK	BIT(5)
    141#define NFC_ECC_BLOCK_512	BIT(5)
    142#define NFC_RANDOM_EN		BIT(9)
    143#define NFC_RANDOM_DIRECTION	BIT(10)
    144#define NFC_ECC_MODE_MSK	GENMASK(15, 12)
    145#define NFC_ECC_MODE(x)		((x) << 12)
    146#define NFC_RANDOM_SEED_MSK	GENMASK(30, 16)
    147#define NFC_RANDOM_SEED(x)	((x) << 16)
    148
    149/* define bit use in NFC_ECC_ST */
    150#define NFC_ECC_ERR(x)		BIT(x)
    151#define NFC_ECC_ERR_MSK		GENMASK(15, 0)
    152#define NFC_ECC_PAT_FOUND(x)	BIT(x + 16)
    153#define NFC_ECC_ERR_CNT(b, x)	(((x) >> (((b) % 4) * 8)) & 0xff)
    154
    155#define NFC_DEFAULT_TIMEOUT_MS	1000
    156
    157#define NFC_SRAM_SIZE		1024
    158
    159#define NFC_MAX_CS		7
    160
    161/**
    162 * struct sunxi_nand_chip_sel - stores information related to NAND Chip Select
    163 *
    164 * @cs: the NAND CS id used to communicate with a NAND Chip
    165 * @rb: the Ready/Busy pin ID. -1 means no R/B pin connected to the NFC
    166 */
    167struct sunxi_nand_chip_sel {
    168	u8 cs;
    169	s8 rb;
    170};
    171
    172/**
    173 * struct sunxi_nand_hw_ecc - stores information related to HW ECC support
    174 *
    175 * @mode: the sunxi ECC mode field deduced from ECC requirements
    176 */
    177struct sunxi_nand_hw_ecc {
    178	int mode;
    179};
    180
    181/**
    182 * struct sunxi_nand_chip - stores NAND chip device related information
    183 *
    184 * @node: used to store NAND chips into a list
    185 * @nand: base NAND chip structure
    186 * @ecc: ECC controller structure
    187 * @clk_rate: clk_rate required for this NAND chip
    188 * @timing_cfg: TIMING_CFG register value for this NAND chip
    189 * @timing_ctl: TIMING_CTL register value for this NAND chip
    190 * @nsels: number of CS lines required by the NAND chip
    191 * @sels: array of CS lines descriptions
    192 */
    193struct sunxi_nand_chip {
    194	struct list_head node;
    195	struct nand_chip nand;
    196	struct sunxi_nand_hw_ecc *ecc;
    197	unsigned long clk_rate;
    198	u32 timing_cfg;
    199	u32 timing_ctl;
    200	int nsels;
    201	struct sunxi_nand_chip_sel sels[];
    202};
    203
    204static inline struct sunxi_nand_chip *to_sunxi_nand(struct nand_chip *nand)
    205{
    206	return container_of(nand, struct sunxi_nand_chip, nand);
    207}
    208
    209/*
    210 * NAND Controller capabilities structure: stores NAND controller capabilities
    211 * for distinction between compatible strings.
    212 *
    213 * @has_mdma:		Use mbus dma mode, otherwise general dma
    214 *			through MBUS on A23/A33 needs extra configuration.
    215 * @reg_io_data:	I/O data register
    216 * @dma_maxburst:	DMA maxburst
    217 */
    218struct sunxi_nfc_caps {
    219	bool has_mdma;
    220	unsigned int reg_io_data;
    221	unsigned int dma_maxburst;
    222};
    223
    224/**
    225 * struct sunxi_nfc - stores sunxi NAND controller information
    226 *
    227 * @controller: base controller structure
    228 * @dev: parent device (used to print error messages)
    229 * @regs: NAND controller registers
    230 * @ahb_clk: NAND controller AHB clock
    231 * @mod_clk: NAND controller mod clock
    232 * @reset: NAND controller reset line
    233 * @assigned_cs: bitmask describing already assigned CS lines
    234 * @clk_rate: NAND controller current clock rate
    235 * @chips: a list containing all the NAND chips attached to this NAND
    236 *	   controller
    237 * @complete: a completion object used to wait for NAND controller events
    238 * @dmac: the DMA channel attached to the NAND controller
    239 * @caps: NAND Controller capabilities
    240 */
    241struct sunxi_nfc {
    242	struct nand_controller controller;
    243	struct device *dev;
    244	void __iomem *regs;
    245	struct clk *ahb_clk;
    246	struct clk *mod_clk;
    247	struct reset_control *reset;
    248	unsigned long assigned_cs;
    249	unsigned long clk_rate;
    250	struct list_head chips;
    251	struct completion complete;
    252	struct dma_chan *dmac;
    253	const struct sunxi_nfc_caps *caps;
    254};
    255
    256static inline struct sunxi_nfc *to_sunxi_nfc(struct nand_controller *ctrl)
    257{
    258	return container_of(ctrl, struct sunxi_nfc, controller);
    259}
    260
    261static irqreturn_t sunxi_nfc_interrupt(int irq, void *dev_id)
    262{
    263	struct sunxi_nfc *nfc = dev_id;
    264	u32 st = readl(nfc->regs + NFC_REG_ST);
    265	u32 ien = readl(nfc->regs + NFC_REG_INT);
    266
    267	if (!(ien & st))
    268		return IRQ_NONE;
    269
    270	if ((ien & st) == ien)
    271		complete(&nfc->complete);
    272
    273	writel(st & NFC_INT_MASK, nfc->regs + NFC_REG_ST);
    274	writel(~st & ien & NFC_INT_MASK, nfc->regs + NFC_REG_INT);
    275
    276	return IRQ_HANDLED;
    277}
    278
    279static int sunxi_nfc_wait_events(struct sunxi_nfc *nfc, u32 events,
    280				 bool use_polling, unsigned int timeout_ms)
    281{
    282	int ret;
    283
    284	if (events & ~NFC_INT_MASK)
    285		return -EINVAL;
    286
    287	if (!timeout_ms)
    288		timeout_ms = NFC_DEFAULT_TIMEOUT_MS;
    289
    290	if (!use_polling) {
    291		init_completion(&nfc->complete);
    292
    293		writel(events, nfc->regs + NFC_REG_INT);
    294
    295		ret = wait_for_completion_timeout(&nfc->complete,
    296						msecs_to_jiffies(timeout_ms));
    297		if (!ret)
    298			ret = -ETIMEDOUT;
    299		else
    300			ret = 0;
    301
    302		writel(0, nfc->regs + NFC_REG_INT);
    303	} else {
    304		u32 status;
    305
    306		ret = readl_poll_timeout(nfc->regs + NFC_REG_ST, status,
    307					 (status & events) == events, 1,
    308					 timeout_ms * 1000);
    309	}
    310
    311	writel(events & NFC_INT_MASK, nfc->regs + NFC_REG_ST);
    312
    313	if (ret)
    314		dev_err(nfc->dev, "wait interrupt timedout\n");
    315
    316	return ret;
    317}
    318
    319static int sunxi_nfc_wait_cmd_fifo_empty(struct sunxi_nfc *nfc)
    320{
    321	u32 status;
    322	int ret;
    323
    324	ret = readl_poll_timeout(nfc->regs + NFC_REG_ST, status,
    325				 !(status & NFC_CMD_FIFO_STATUS), 1,
    326				 NFC_DEFAULT_TIMEOUT_MS * 1000);
    327	if (ret)
    328		dev_err(nfc->dev, "wait for empty cmd FIFO timedout\n");
    329
    330	return ret;
    331}
    332
    333static int sunxi_nfc_rst(struct sunxi_nfc *nfc)
    334{
    335	u32 ctl;
    336	int ret;
    337
    338	writel(0, nfc->regs + NFC_REG_ECC_CTL);
    339	writel(NFC_RESET, nfc->regs + NFC_REG_CTL);
    340
    341	ret = readl_poll_timeout(nfc->regs + NFC_REG_CTL, ctl,
    342				 !(ctl & NFC_RESET), 1,
    343				 NFC_DEFAULT_TIMEOUT_MS * 1000);
    344	if (ret)
    345		dev_err(nfc->dev, "wait for NAND controller reset timedout\n");
    346
    347	return ret;
    348}
    349
    350static int sunxi_nfc_dma_op_prepare(struct sunxi_nfc *nfc, const void *buf,
    351				    int chunksize, int nchunks,
    352				    enum dma_data_direction ddir,
    353				    struct scatterlist *sg)
    354{
    355	struct dma_async_tx_descriptor *dmad;
    356	enum dma_transfer_direction tdir;
    357	dma_cookie_t dmat;
    358	int ret;
    359
    360	if (ddir == DMA_FROM_DEVICE)
    361		tdir = DMA_DEV_TO_MEM;
    362	else
    363		tdir = DMA_MEM_TO_DEV;
    364
    365	sg_init_one(sg, buf, nchunks * chunksize);
    366	ret = dma_map_sg(nfc->dev, sg, 1, ddir);
    367	if (!ret)
    368		return -ENOMEM;
    369
    370	if (!nfc->caps->has_mdma) {
    371		dmad = dmaengine_prep_slave_sg(nfc->dmac, sg, 1, tdir, DMA_CTRL_ACK);
    372		if (!dmad) {
    373			ret = -EINVAL;
    374			goto err_unmap_buf;
    375		}
    376	}
    377
    378	writel(readl(nfc->regs + NFC_REG_CTL) | NFC_RAM_METHOD,
    379	       nfc->regs + NFC_REG_CTL);
    380	writel(nchunks, nfc->regs + NFC_REG_SECTOR_NUM);
    381	writel(chunksize, nfc->regs + NFC_REG_CNT);
    382
    383	if (nfc->caps->has_mdma) {
    384		writel(readl(nfc->regs + NFC_REG_CTL) & ~NFC_DMA_TYPE_NORMAL,
    385		       nfc->regs + NFC_REG_CTL);
    386		writel(chunksize * nchunks, nfc->regs + NFC_REG_MDMA_CNT);
    387		writel(sg_dma_address(sg), nfc->regs + NFC_REG_MDMA_ADDR);
    388	} else {
    389		dmat = dmaengine_submit(dmad);
    390
    391		ret = dma_submit_error(dmat);
    392		if (ret)
    393			goto err_clr_dma_flag;
    394	}
    395
    396	return 0;
    397
    398err_clr_dma_flag:
    399	writel(readl(nfc->regs + NFC_REG_CTL) & ~NFC_RAM_METHOD,
    400	       nfc->regs + NFC_REG_CTL);
    401
    402err_unmap_buf:
    403	dma_unmap_sg(nfc->dev, sg, 1, ddir);
    404	return ret;
    405}
    406
    407static void sunxi_nfc_dma_op_cleanup(struct sunxi_nfc *nfc,
    408				     enum dma_data_direction ddir,
    409				     struct scatterlist *sg)
    410{
    411	dma_unmap_sg(nfc->dev, sg, 1, ddir);
    412	writel(readl(nfc->regs + NFC_REG_CTL) & ~NFC_RAM_METHOD,
    413	       nfc->regs + NFC_REG_CTL);
    414}
    415
    416static void sunxi_nfc_select_chip(struct nand_chip *nand, unsigned int cs)
    417{
    418	struct mtd_info *mtd = nand_to_mtd(nand);
    419	struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
    420	struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
    421	struct sunxi_nand_chip_sel *sel;
    422	u32 ctl;
    423
    424	if (cs > 0 && cs >= sunxi_nand->nsels)
    425		return;
    426
    427	ctl = readl(nfc->regs + NFC_REG_CTL) &
    428	      ~(NFC_PAGE_SHIFT_MSK | NFC_CE_SEL_MSK | NFC_RB_SEL_MSK | NFC_EN);
    429
    430	sel = &sunxi_nand->sels[cs];
    431	ctl |= NFC_CE_SEL(sel->cs) | NFC_EN | NFC_PAGE_SHIFT(nand->page_shift);
    432	if (sel->rb >= 0)
    433		ctl |= NFC_RB_SEL(sel->rb);
    434
    435	writel(mtd->writesize, nfc->regs + NFC_REG_SPARE_AREA);
    436
    437	if (nfc->clk_rate != sunxi_nand->clk_rate) {
    438		clk_set_rate(nfc->mod_clk, sunxi_nand->clk_rate);
    439		nfc->clk_rate = sunxi_nand->clk_rate;
    440	}
    441
    442	writel(sunxi_nand->timing_ctl, nfc->regs + NFC_REG_TIMING_CTL);
    443	writel(sunxi_nand->timing_cfg, nfc->regs + NFC_REG_TIMING_CFG);
    444	writel(ctl, nfc->regs + NFC_REG_CTL);
    445}
    446
    447static void sunxi_nfc_read_buf(struct nand_chip *nand, uint8_t *buf, int len)
    448{
    449	struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
    450	struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
    451	int ret;
    452	int cnt;
    453	int offs = 0;
    454	u32 tmp;
    455
    456	while (len > offs) {
    457		bool poll = false;
    458
    459		cnt = min(len - offs, NFC_SRAM_SIZE);
    460
    461		ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
    462		if (ret)
    463			break;
    464
    465		writel(cnt, nfc->regs + NFC_REG_CNT);
    466		tmp = NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD;
    467		writel(tmp, nfc->regs + NFC_REG_CMD);
    468
    469		/* Arbitrary limit for polling mode */
    470		if (cnt < 64)
    471			poll = true;
    472
    473		ret = sunxi_nfc_wait_events(nfc, NFC_CMD_INT_FLAG, poll, 0);
    474		if (ret)
    475			break;
    476
    477		if (buf)
    478			memcpy_fromio(buf + offs, nfc->regs + NFC_RAM0_BASE,
    479				      cnt);
    480		offs += cnt;
    481	}
    482}
    483
    484static void sunxi_nfc_write_buf(struct nand_chip *nand, const uint8_t *buf,
    485				int len)
    486{
    487	struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
    488	struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
    489	int ret;
    490	int cnt;
    491	int offs = 0;
    492	u32 tmp;
    493
    494	while (len > offs) {
    495		bool poll = false;
    496
    497		cnt = min(len - offs, NFC_SRAM_SIZE);
    498
    499		ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
    500		if (ret)
    501			break;
    502
    503		writel(cnt, nfc->regs + NFC_REG_CNT);
    504		memcpy_toio(nfc->regs + NFC_RAM0_BASE, buf + offs, cnt);
    505		tmp = NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD |
    506		      NFC_ACCESS_DIR;
    507		writel(tmp, nfc->regs + NFC_REG_CMD);
    508
    509		/* Arbitrary limit for polling mode */
    510		if (cnt < 64)
    511			poll = true;
    512
    513		ret = sunxi_nfc_wait_events(nfc, NFC_CMD_INT_FLAG, poll, 0);
    514		if (ret)
    515			break;
    516
    517		offs += cnt;
    518	}
    519}
    520
    521/* These seed values have been extracted from Allwinner's BSP */
    522static const u16 sunxi_nfc_randomizer_page_seeds[] = {
    523	0x2b75, 0x0bd0, 0x5ca3, 0x62d1, 0x1c93, 0x07e9, 0x2162, 0x3a72,
    524	0x0d67, 0x67f9, 0x1be7, 0x077d, 0x032f, 0x0dac, 0x2716, 0x2436,
    525	0x7922, 0x1510, 0x3860, 0x5287, 0x480f, 0x4252, 0x1789, 0x5a2d,
    526	0x2a49, 0x5e10, 0x437f, 0x4b4e, 0x2f45, 0x216e, 0x5cb7, 0x7130,
    527	0x2a3f, 0x60e4, 0x4dc9, 0x0ef0, 0x0f52, 0x1bb9, 0x6211, 0x7a56,
    528	0x226d, 0x4ea7, 0x6f36, 0x3692, 0x38bf, 0x0c62, 0x05eb, 0x4c55,
    529	0x60f4, 0x728c, 0x3b6f, 0x2037, 0x7f69, 0x0936, 0x651a, 0x4ceb,
    530	0x6218, 0x79f3, 0x383f, 0x18d9, 0x4f05, 0x5c82, 0x2912, 0x6f17,
    531	0x6856, 0x5938, 0x1007, 0x61ab, 0x3e7f, 0x57c2, 0x542f, 0x4f62,
    532	0x7454, 0x2eac, 0x7739, 0x42d4, 0x2f90, 0x435a, 0x2e52, 0x2064,
    533	0x637c, 0x66ad, 0x2c90, 0x0bad, 0x759c, 0x0029, 0x0986, 0x7126,
    534	0x1ca7, 0x1605, 0x386a, 0x27f5, 0x1380, 0x6d75, 0x24c3, 0x0f8e,
    535	0x2b7a, 0x1418, 0x1fd1, 0x7dc1, 0x2d8e, 0x43af, 0x2267, 0x7da3,
    536	0x4e3d, 0x1338, 0x50db, 0x454d, 0x764d, 0x40a3, 0x42e6, 0x262b,
    537	0x2d2e, 0x1aea, 0x2e17, 0x173d, 0x3a6e, 0x71bf, 0x25f9, 0x0a5d,
    538	0x7c57, 0x0fbe, 0x46ce, 0x4939, 0x6b17, 0x37bb, 0x3e91, 0x76db,
    539};
    540
    541/*
    542 * sunxi_nfc_randomizer_ecc512_seeds and sunxi_nfc_randomizer_ecc1024_seeds
    543 * have been generated using
    544 * sunxi_nfc_randomizer_step(seed, (step_size * 8) + 15), which is what
    545 * the randomizer engine does internally before de/scrambling OOB data.
    546 *
    547 * Those tables are statically defined to avoid calculating randomizer state
    548 * at runtime.
    549 */
    550static const u16 sunxi_nfc_randomizer_ecc512_seeds[] = {
    551	0x3346, 0x367f, 0x1f18, 0x769a, 0x4f64, 0x068c, 0x2ef1, 0x6b64,
    552	0x28a9, 0x15d7, 0x30f8, 0x3659, 0x53db, 0x7c5f, 0x71d4, 0x4409,
    553	0x26eb, 0x03cc, 0x655d, 0x47d4, 0x4daa, 0x0877, 0x712d, 0x3617,
    554	0x3264, 0x49aa, 0x7f9e, 0x588e, 0x4fbc, 0x7176, 0x7f91, 0x6c6d,
    555	0x4b95, 0x5fb7, 0x3844, 0x4037, 0x0184, 0x081b, 0x0ee8, 0x5b91,
    556	0x293d, 0x1f71, 0x0e6f, 0x402b, 0x5122, 0x1e52, 0x22be, 0x3d2d,
    557	0x75bc, 0x7c60, 0x6291, 0x1a2f, 0x61d4, 0x74aa, 0x4140, 0x29ab,
    558	0x472d, 0x2852, 0x017e, 0x15e8, 0x5ec2, 0x17cf, 0x7d0f, 0x06b8,
    559	0x117a, 0x6b94, 0x789b, 0x3126, 0x6ac5, 0x5be7, 0x150f, 0x51f8,
    560	0x7889, 0x0aa5, 0x663d, 0x77e8, 0x0b87, 0x3dcb, 0x360d, 0x218b,
    561	0x512f, 0x7dc9, 0x6a4d, 0x630a, 0x3547, 0x1dd2, 0x5aea, 0x69a5,
    562	0x7bfa, 0x5e4f, 0x1519, 0x6430, 0x3a0e, 0x5eb3, 0x5425, 0x0c7a,
    563	0x5540, 0x3670, 0x63c1, 0x31e9, 0x5a39, 0x2de7, 0x5979, 0x2891,
    564	0x1562, 0x014b, 0x5b05, 0x2756, 0x5a34, 0x13aa, 0x6cb5, 0x2c36,
    565	0x5e72, 0x1306, 0x0861, 0x15ef, 0x1ee8, 0x5a37, 0x7ac4, 0x45dd,
    566	0x44c4, 0x7266, 0x2f41, 0x3ccc, 0x045e, 0x7d40, 0x7c66, 0x0fa0,
    567};
    568
    569static const u16 sunxi_nfc_randomizer_ecc1024_seeds[] = {
    570	0x2cf5, 0x35f1, 0x63a4, 0x5274, 0x2bd2, 0x778b, 0x7285, 0x32b6,
    571	0x6a5c, 0x70d6, 0x757d, 0x6769, 0x5375, 0x1e81, 0x0cf3, 0x3982,
    572	0x6787, 0x042a, 0x6c49, 0x1925, 0x56a8, 0x40a9, 0x063e, 0x7bd9,
    573	0x4dbf, 0x55ec, 0x672e, 0x7334, 0x5185, 0x4d00, 0x232a, 0x7e07,
    574	0x445d, 0x6b92, 0x528f, 0x4255, 0x53ba, 0x7d82, 0x2a2e, 0x3a4e,
    575	0x75eb, 0x450c, 0x6844, 0x1b5d, 0x581a, 0x4cc6, 0x0379, 0x37b2,
    576	0x419f, 0x0e92, 0x6b27, 0x5624, 0x01e3, 0x07c1, 0x44a5, 0x130c,
    577	0x13e8, 0x5910, 0x0876, 0x60c5, 0x54e3, 0x5b7f, 0x2269, 0x509f,
    578	0x7665, 0x36fd, 0x3e9a, 0x0579, 0x6295, 0x14ef, 0x0a81, 0x1bcc,
    579	0x4b16, 0x64db, 0x0514, 0x4f07, 0x0591, 0x3576, 0x6853, 0x0d9e,
    580	0x259f, 0x38b7, 0x64fb, 0x3094, 0x4693, 0x6ddd, 0x29bb, 0x0bc8,
    581	0x3f47, 0x490e, 0x0c0e, 0x7933, 0x3c9e, 0x5840, 0x398d, 0x3e68,
    582	0x4af1, 0x71f5, 0x57cf, 0x1121, 0x64eb, 0x3579, 0x15ac, 0x584d,
    583	0x5f2a, 0x47e2, 0x6528, 0x6eac, 0x196e, 0x6b96, 0x0450, 0x0179,
    584	0x609c, 0x06e1, 0x4626, 0x42c7, 0x273e, 0x486f, 0x0705, 0x1601,
    585	0x145b, 0x407e, 0x062b, 0x57a5, 0x53f9, 0x5659, 0x4410, 0x3ccd,
    586};
    587
    588static u16 sunxi_nfc_randomizer_step(u16 state, int count)
    589{
    590	state &= 0x7fff;
    591
    592	/*
    593	 * This loop is just a simple implementation of a Fibonacci LFSR using
    594	 * the x16 + x15 + 1 polynomial.
    595	 */
    596	while (count--)
    597		state = ((state >> 1) |
    598			 (((state ^ (state >> 1)) & 1) << 14)) & 0x7fff;
    599
    600	return state;
    601}
    602
    603static u16 sunxi_nfc_randomizer_state(struct nand_chip *nand, int page,
    604				      bool ecc)
    605{
    606	struct mtd_info *mtd = nand_to_mtd(nand);
    607	const u16 *seeds = sunxi_nfc_randomizer_page_seeds;
    608	int mod = mtd_div_by_ws(mtd->erasesize, mtd);
    609
    610	if (mod > ARRAY_SIZE(sunxi_nfc_randomizer_page_seeds))
    611		mod = ARRAY_SIZE(sunxi_nfc_randomizer_page_seeds);
    612
    613	if (ecc) {
    614		if (mtd->ecc_step_size == 512)
    615			seeds = sunxi_nfc_randomizer_ecc512_seeds;
    616		else
    617			seeds = sunxi_nfc_randomizer_ecc1024_seeds;
    618	}
    619
    620	return seeds[page % mod];
    621}
    622
    623static void sunxi_nfc_randomizer_config(struct nand_chip *nand, int page,
    624					bool ecc)
    625{
    626	struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
    627	u32 ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL);
    628	u16 state;
    629
    630	if (!(nand->options & NAND_NEED_SCRAMBLING))
    631		return;
    632
    633	ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL);
    634	state = sunxi_nfc_randomizer_state(nand, page, ecc);
    635	ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL) & ~NFC_RANDOM_SEED_MSK;
    636	writel(ecc_ctl | NFC_RANDOM_SEED(state), nfc->regs + NFC_REG_ECC_CTL);
    637}
    638
    639static void sunxi_nfc_randomizer_enable(struct nand_chip *nand)
    640{
    641	struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
    642
    643	if (!(nand->options & NAND_NEED_SCRAMBLING))
    644		return;
    645
    646	writel(readl(nfc->regs + NFC_REG_ECC_CTL) | NFC_RANDOM_EN,
    647	       nfc->regs + NFC_REG_ECC_CTL);
    648}
    649
    650static void sunxi_nfc_randomizer_disable(struct nand_chip *nand)
    651{
    652	struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
    653
    654	if (!(nand->options & NAND_NEED_SCRAMBLING))
    655		return;
    656
    657	writel(readl(nfc->regs + NFC_REG_ECC_CTL) & ~NFC_RANDOM_EN,
    658	       nfc->regs + NFC_REG_ECC_CTL);
    659}
    660
    661static void sunxi_nfc_randomize_bbm(struct nand_chip *nand, int page, u8 *bbm)
    662{
    663	u16 state = sunxi_nfc_randomizer_state(nand, page, true);
    664
    665	bbm[0] ^= state;
    666	bbm[1] ^= sunxi_nfc_randomizer_step(state, 8);
    667}
    668
    669static void sunxi_nfc_randomizer_write_buf(struct nand_chip *nand,
    670					   const uint8_t *buf, int len,
    671					   bool ecc, int page)
    672{
    673	sunxi_nfc_randomizer_config(nand, page, ecc);
    674	sunxi_nfc_randomizer_enable(nand);
    675	sunxi_nfc_write_buf(nand, buf, len);
    676	sunxi_nfc_randomizer_disable(nand);
    677}
    678
    679static void sunxi_nfc_randomizer_read_buf(struct nand_chip *nand, uint8_t *buf,
    680					  int len, bool ecc, int page)
    681{
    682	sunxi_nfc_randomizer_config(nand, page, ecc);
    683	sunxi_nfc_randomizer_enable(nand);
    684	sunxi_nfc_read_buf(nand, buf, len);
    685	sunxi_nfc_randomizer_disable(nand);
    686}
    687
    688static void sunxi_nfc_hw_ecc_enable(struct nand_chip *nand)
    689{
    690	struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
    691	struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
    692	u32 ecc_ctl;
    693
    694	ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL);
    695	ecc_ctl &= ~(NFC_ECC_MODE_MSK | NFC_ECC_PIPELINE |
    696		     NFC_ECC_BLOCK_SIZE_MSK);
    697	ecc_ctl |= NFC_ECC_EN | NFC_ECC_MODE(sunxi_nand->ecc->mode) |
    698		   NFC_ECC_EXCEPTION | NFC_ECC_PIPELINE;
    699
    700	if (nand->ecc.size == 512)
    701		ecc_ctl |= NFC_ECC_BLOCK_512;
    702
    703	writel(ecc_ctl, nfc->regs + NFC_REG_ECC_CTL);
    704}
    705
    706static void sunxi_nfc_hw_ecc_disable(struct nand_chip *nand)
    707{
    708	struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
    709
    710	writel(readl(nfc->regs + NFC_REG_ECC_CTL) & ~NFC_ECC_EN,
    711	       nfc->regs + NFC_REG_ECC_CTL);
    712}
    713
    714static inline void sunxi_nfc_user_data_to_buf(u32 user_data, u8 *buf)
    715{
    716	buf[0] = user_data;
    717	buf[1] = user_data >> 8;
    718	buf[2] = user_data >> 16;
    719	buf[3] = user_data >> 24;
    720}
    721
    722static inline u32 sunxi_nfc_buf_to_user_data(const u8 *buf)
    723{
    724	return buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
    725}
    726
    727static void sunxi_nfc_hw_ecc_get_prot_oob_bytes(struct nand_chip *nand, u8 *oob,
    728						int step, bool bbm, int page)
    729{
    730	struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
    731
    732	sunxi_nfc_user_data_to_buf(readl(nfc->regs + NFC_REG_USER_DATA(step)),
    733				   oob);
    734
    735	/* De-randomize the Bad Block Marker. */
    736	if (bbm && (nand->options & NAND_NEED_SCRAMBLING))
    737		sunxi_nfc_randomize_bbm(nand, page, oob);
    738}
    739
    740static void sunxi_nfc_hw_ecc_set_prot_oob_bytes(struct nand_chip *nand,
    741						const u8 *oob, int step,
    742						bool bbm, int page)
    743{
    744	struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
    745	u8 user_data[4];
    746
    747	/* Randomize the Bad Block Marker. */
    748	if (bbm && (nand->options & NAND_NEED_SCRAMBLING)) {
    749		memcpy(user_data, oob, sizeof(user_data));
    750		sunxi_nfc_randomize_bbm(nand, page, user_data);
    751		oob = user_data;
    752	}
    753
    754	writel(sunxi_nfc_buf_to_user_data(oob),
    755	       nfc->regs + NFC_REG_USER_DATA(step));
    756}
    757
    758static void sunxi_nfc_hw_ecc_update_stats(struct nand_chip *nand,
    759					  unsigned int *max_bitflips, int ret)
    760{
    761	struct mtd_info *mtd = nand_to_mtd(nand);
    762
    763	if (ret < 0) {
    764		mtd->ecc_stats.failed++;
    765	} else {
    766		mtd->ecc_stats.corrected += ret;
    767		*max_bitflips = max_t(unsigned int, *max_bitflips, ret);
    768	}
    769}
    770
    771static int sunxi_nfc_hw_ecc_correct(struct nand_chip *nand, u8 *data, u8 *oob,
    772				    int step, u32 status, bool *erased)
    773{
    774	struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
    775	struct nand_ecc_ctrl *ecc = &nand->ecc;
    776	u32 tmp;
    777
    778	*erased = false;
    779
    780	if (status & NFC_ECC_ERR(step))
    781		return -EBADMSG;
    782
    783	if (status & NFC_ECC_PAT_FOUND(step)) {
    784		u8 pattern;
    785
    786		if (unlikely(!(readl(nfc->regs + NFC_REG_PAT_ID) & 0x1))) {
    787			pattern = 0x0;
    788		} else {
    789			pattern = 0xff;
    790			*erased = true;
    791		}
    792
    793		if (data)
    794			memset(data, pattern, ecc->size);
    795
    796		if (oob)
    797			memset(oob, pattern, ecc->bytes + 4);
    798
    799		return 0;
    800	}
    801
    802	tmp = readl(nfc->regs + NFC_REG_ECC_ERR_CNT(step));
    803
    804	return NFC_ECC_ERR_CNT(step, tmp);
    805}
    806
    807static int sunxi_nfc_hw_ecc_read_chunk(struct nand_chip *nand,
    808				       u8 *data, int data_off,
    809				       u8 *oob, int oob_off,
    810				       int *cur_off,
    811				       unsigned int *max_bitflips,
    812				       bool bbm, bool oob_required, int page)
    813{
    814	struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
    815	struct nand_ecc_ctrl *ecc = &nand->ecc;
    816	int raw_mode = 0;
    817	bool erased;
    818	int ret;
    819
    820	if (*cur_off != data_off)
    821		nand_change_read_column_op(nand, data_off, NULL, 0, false);
    822
    823	sunxi_nfc_randomizer_read_buf(nand, NULL, ecc->size, false, page);
    824
    825	if (data_off + ecc->size != oob_off)
    826		nand_change_read_column_op(nand, oob_off, NULL, 0, false);
    827
    828	ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
    829	if (ret)
    830		return ret;
    831
    832	sunxi_nfc_randomizer_enable(nand);
    833	writel(NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD | NFC_ECC_OP,
    834	       nfc->regs + NFC_REG_CMD);
    835
    836	ret = sunxi_nfc_wait_events(nfc, NFC_CMD_INT_FLAG, false, 0);
    837	sunxi_nfc_randomizer_disable(nand);
    838	if (ret)
    839		return ret;
    840
    841	*cur_off = oob_off + ecc->bytes + 4;
    842
    843	ret = sunxi_nfc_hw_ecc_correct(nand, data, oob_required ? oob : NULL, 0,
    844				       readl(nfc->regs + NFC_REG_ECC_ST),
    845				       &erased);
    846	if (erased)
    847		return 1;
    848
    849	if (ret < 0) {
    850		/*
    851		 * Re-read the data with the randomizer disabled to identify
    852		 * bitflips in erased pages.
    853		 */
    854		if (nand->options & NAND_NEED_SCRAMBLING)
    855			nand_change_read_column_op(nand, data_off, data,
    856						   ecc->size, false);
    857		else
    858			memcpy_fromio(data, nfc->regs + NFC_RAM0_BASE,
    859				      ecc->size);
    860
    861		nand_change_read_column_op(nand, oob_off, oob, ecc->bytes + 4,
    862					   false);
    863
    864		ret = nand_check_erased_ecc_chunk(data,	ecc->size,
    865						  oob, ecc->bytes + 4,
    866						  NULL, 0, ecc->strength);
    867		if (ret >= 0)
    868			raw_mode = 1;
    869	} else {
    870		memcpy_fromio(data, nfc->regs + NFC_RAM0_BASE, ecc->size);
    871
    872		if (oob_required) {
    873			nand_change_read_column_op(nand, oob_off, NULL, 0,
    874						   false);
    875			sunxi_nfc_randomizer_read_buf(nand, oob, ecc->bytes + 4,
    876						      true, page);
    877
    878			sunxi_nfc_hw_ecc_get_prot_oob_bytes(nand, oob, 0,
    879							    bbm, page);
    880		}
    881	}
    882
    883	sunxi_nfc_hw_ecc_update_stats(nand, max_bitflips, ret);
    884
    885	return raw_mode;
    886}
    887
    888static void sunxi_nfc_hw_ecc_read_extra_oob(struct nand_chip *nand,
    889					    u8 *oob, int *cur_off,
    890					    bool randomize, int page)
    891{
    892	struct mtd_info *mtd = nand_to_mtd(nand);
    893	struct nand_ecc_ctrl *ecc = &nand->ecc;
    894	int offset = ((ecc->bytes + 4) * ecc->steps);
    895	int len = mtd->oobsize - offset;
    896
    897	if (len <= 0)
    898		return;
    899
    900	if (!cur_off || *cur_off != offset)
    901		nand_change_read_column_op(nand, mtd->writesize, NULL, 0,
    902					   false);
    903
    904	if (!randomize)
    905		sunxi_nfc_read_buf(nand, oob + offset, len);
    906	else
    907		sunxi_nfc_randomizer_read_buf(nand, oob + offset, len,
    908					      false, page);
    909
    910	if (cur_off)
    911		*cur_off = mtd->oobsize + mtd->writesize;
    912}
    913
    914static int sunxi_nfc_hw_ecc_read_chunks_dma(struct nand_chip *nand, uint8_t *buf,
    915					    int oob_required, int page,
    916					    int nchunks)
    917{
    918	bool randomized = nand->options & NAND_NEED_SCRAMBLING;
    919	struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
    920	struct mtd_info *mtd = nand_to_mtd(nand);
    921	struct nand_ecc_ctrl *ecc = &nand->ecc;
    922	unsigned int max_bitflips = 0;
    923	int ret, i, raw_mode = 0;
    924	struct scatterlist sg;
    925	u32 status, wait;
    926
    927	ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
    928	if (ret)
    929		return ret;
    930
    931	ret = sunxi_nfc_dma_op_prepare(nfc, buf, ecc->size, nchunks,
    932				       DMA_FROM_DEVICE, &sg);
    933	if (ret)
    934		return ret;
    935
    936	sunxi_nfc_hw_ecc_enable(nand);
    937	sunxi_nfc_randomizer_config(nand, page, false);
    938	sunxi_nfc_randomizer_enable(nand);
    939
    940	writel((NAND_CMD_RNDOUTSTART << 16) | (NAND_CMD_RNDOUT << 8) |
    941	       NAND_CMD_READSTART, nfc->regs + NFC_REG_RCMD_SET);
    942
    943	wait = NFC_CMD_INT_FLAG;
    944
    945	if (nfc->caps->has_mdma)
    946		wait |= NFC_DMA_INT_FLAG;
    947	else
    948		dma_async_issue_pending(nfc->dmac);
    949
    950	writel(NFC_PAGE_OP | NFC_DATA_SWAP_METHOD | NFC_DATA_TRANS,
    951	       nfc->regs + NFC_REG_CMD);
    952
    953	ret = sunxi_nfc_wait_events(nfc, wait, false, 0);
    954	if (ret && !nfc->caps->has_mdma)
    955		dmaengine_terminate_all(nfc->dmac);
    956
    957	sunxi_nfc_randomizer_disable(nand);
    958	sunxi_nfc_hw_ecc_disable(nand);
    959
    960	sunxi_nfc_dma_op_cleanup(nfc, DMA_FROM_DEVICE, &sg);
    961
    962	if (ret)
    963		return ret;
    964
    965	status = readl(nfc->regs + NFC_REG_ECC_ST);
    966
    967	for (i = 0; i < nchunks; i++) {
    968		int data_off = i * ecc->size;
    969		int oob_off = i * (ecc->bytes + 4);
    970		u8 *data = buf + data_off;
    971		u8 *oob = nand->oob_poi + oob_off;
    972		bool erased;
    973
    974		ret = sunxi_nfc_hw_ecc_correct(nand, randomized ? data : NULL,
    975					       oob_required ? oob : NULL,
    976					       i, status, &erased);
    977
    978		/* ECC errors are handled in the second loop. */
    979		if (ret < 0)
    980			continue;
    981
    982		if (oob_required && !erased) {
    983			/* TODO: use DMA to retrieve OOB */
    984			nand_change_read_column_op(nand,
    985						   mtd->writesize + oob_off,
    986						   oob, ecc->bytes + 4, false);
    987
    988			sunxi_nfc_hw_ecc_get_prot_oob_bytes(nand, oob, i,
    989							    !i, page);
    990		}
    991
    992		if (erased)
    993			raw_mode = 1;
    994
    995		sunxi_nfc_hw_ecc_update_stats(nand, &max_bitflips, ret);
    996	}
    997
    998	if (status & NFC_ECC_ERR_MSK) {
    999		for (i = 0; i < nchunks; i++) {
   1000			int data_off = i * ecc->size;
   1001			int oob_off = i * (ecc->bytes + 4);
   1002			u8 *data = buf + data_off;
   1003			u8 *oob = nand->oob_poi + oob_off;
   1004
   1005			if (!(status & NFC_ECC_ERR(i)))
   1006				continue;
   1007
   1008			/*
   1009			 * Re-read the data with the randomizer disabled to
   1010			 * identify bitflips in erased pages.
   1011			 * TODO: use DMA to read page in raw mode
   1012			 */
   1013			if (randomized)
   1014				nand_change_read_column_op(nand, data_off,
   1015							   data, ecc->size,
   1016							   false);
   1017
   1018			/* TODO: use DMA to retrieve OOB */
   1019			nand_change_read_column_op(nand,
   1020						   mtd->writesize + oob_off,
   1021						   oob, ecc->bytes + 4, false);
   1022
   1023			ret = nand_check_erased_ecc_chunk(data,	ecc->size,
   1024							  oob, ecc->bytes + 4,
   1025							  NULL, 0,
   1026							  ecc->strength);
   1027			if (ret >= 0)
   1028				raw_mode = 1;
   1029
   1030			sunxi_nfc_hw_ecc_update_stats(nand, &max_bitflips, ret);
   1031		}
   1032	}
   1033
   1034	if (oob_required)
   1035		sunxi_nfc_hw_ecc_read_extra_oob(nand, nand->oob_poi,
   1036						NULL, !raw_mode,
   1037						page);
   1038
   1039	return max_bitflips;
   1040}
   1041
   1042static int sunxi_nfc_hw_ecc_write_chunk(struct nand_chip *nand,
   1043					const u8 *data, int data_off,
   1044					const u8 *oob, int oob_off,
   1045					int *cur_off, bool bbm,
   1046					int page)
   1047{
   1048	struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
   1049	struct nand_ecc_ctrl *ecc = &nand->ecc;
   1050	int ret;
   1051
   1052	if (data_off != *cur_off)
   1053		nand_change_write_column_op(nand, data_off, NULL, 0, false);
   1054
   1055	sunxi_nfc_randomizer_write_buf(nand, data, ecc->size, false, page);
   1056
   1057	if (data_off + ecc->size != oob_off)
   1058		nand_change_write_column_op(nand, oob_off, NULL, 0, false);
   1059
   1060	ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
   1061	if (ret)
   1062		return ret;
   1063
   1064	sunxi_nfc_randomizer_enable(nand);
   1065	sunxi_nfc_hw_ecc_set_prot_oob_bytes(nand, oob, 0, bbm, page);
   1066
   1067	writel(NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD |
   1068	       NFC_ACCESS_DIR | NFC_ECC_OP,
   1069	       nfc->regs + NFC_REG_CMD);
   1070
   1071	ret = sunxi_nfc_wait_events(nfc, NFC_CMD_INT_FLAG, false, 0);
   1072	sunxi_nfc_randomizer_disable(nand);
   1073	if (ret)
   1074		return ret;
   1075
   1076	*cur_off = oob_off + ecc->bytes + 4;
   1077
   1078	return 0;
   1079}
   1080
   1081static void sunxi_nfc_hw_ecc_write_extra_oob(struct nand_chip *nand,
   1082					     u8 *oob, int *cur_off,
   1083					     int page)
   1084{
   1085	struct mtd_info *mtd = nand_to_mtd(nand);
   1086	struct nand_ecc_ctrl *ecc = &nand->ecc;
   1087	int offset = ((ecc->bytes + 4) * ecc->steps);
   1088	int len = mtd->oobsize - offset;
   1089
   1090	if (len <= 0)
   1091		return;
   1092
   1093	if (!cur_off || *cur_off != offset)
   1094		nand_change_write_column_op(nand, offset + mtd->writesize,
   1095					    NULL, 0, false);
   1096
   1097	sunxi_nfc_randomizer_write_buf(nand, oob + offset, len, false, page);
   1098
   1099	if (cur_off)
   1100		*cur_off = mtd->oobsize + mtd->writesize;
   1101}
   1102
   1103static int sunxi_nfc_hw_ecc_read_page(struct nand_chip *nand, uint8_t *buf,
   1104				      int oob_required, int page)
   1105{
   1106	struct mtd_info *mtd = nand_to_mtd(nand);
   1107	struct nand_ecc_ctrl *ecc = &nand->ecc;
   1108	unsigned int max_bitflips = 0;
   1109	int ret, i, cur_off = 0;
   1110	bool raw_mode = false;
   1111
   1112	sunxi_nfc_select_chip(nand, nand->cur_cs);
   1113
   1114	nand_read_page_op(nand, page, 0, NULL, 0);
   1115
   1116	sunxi_nfc_hw_ecc_enable(nand);
   1117
   1118	for (i = 0; i < ecc->steps; i++) {
   1119		int data_off = i * ecc->size;
   1120		int oob_off = i * (ecc->bytes + 4);
   1121		u8 *data = buf + data_off;
   1122		u8 *oob = nand->oob_poi + oob_off;
   1123
   1124		ret = sunxi_nfc_hw_ecc_read_chunk(nand, data, data_off, oob,
   1125						  oob_off + mtd->writesize,
   1126						  &cur_off, &max_bitflips,
   1127						  !i, oob_required, page);
   1128		if (ret < 0)
   1129			return ret;
   1130		else if (ret)
   1131			raw_mode = true;
   1132	}
   1133
   1134	if (oob_required)
   1135		sunxi_nfc_hw_ecc_read_extra_oob(nand, nand->oob_poi, &cur_off,
   1136						!raw_mode, page);
   1137
   1138	sunxi_nfc_hw_ecc_disable(nand);
   1139
   1140	return max_bitflips;
   1141}
   1142
   1143static int sunxi_nfc_hw_ecc_read_page_dma(struct nand_chip *nand, u8 *buf,
   1144					  int oob_required, int page)
   1145{
   1146	int ret;
   1147
   1148	sunxi_nfc_select_chip(nand, nand->cur_cs);
   1149
   1150	nand_read_page_op(nand, page, 0, NULL, 0);
   1151
   1152	ret = sunxi_nfc_hw_ecc_read_chunks_dma(nand, buf, oob_required, page,
   1153					       nand->ecc.steps);
   1154	if (ret >= 0)
   1155		return ret;
   1156
   1157	/* Fallback to PIO mode */
   1158	return sunxi_nfc_hw_ecc_read_page(nand, buf, oob_required, page);
   1159}
   1160
   1161static int sunxi_nfc_hw_ecc_read_subpage(struct nand_chip *nand,
   1162					 u32 data_offs, u32 readlen,
   1163					 u8 *bufpoi, int page)
   1164{
   1165	struct mtd_info *mtd = nand_to_mtd(nand);
   1166	struct nand_ecc_ctrl *ecc = &nand->ecc;
   1167	int ret, i, cur_off = 0;
   1168	unsigned int max_bitflips = 0;
   1169
   1170	sunxi_nfc_select_chip(nand, nand->cur_cs);
   1171
   1172	nand_read_page_op(nand, page, 0, NULL, 0);
   1173
   1174	sunxi_nfc_hw_ecc_enable(nand);
   1175
   1176	for (i = data_offs / ecc->size;
   1177	     i < DIV_ROUND_UP(data_offs + readlen, ecc->size); i++) {
   1178		int data_off = i * ecc->size;
   1179		int oob_off = i * (ecc->bytes + 4);
   1180		u8 *data = bufpoi + data_off;
   1181		u8 *oob = nand->oob_poi + oob_off;
   1182
   1183		ret = sunxi_nfc_hw_ecc_read_chunk(nand, data, data_off,
   1184						  oob,
   1185						  oob_off + mtd->writesize,
   1186						  &cur_off, &max_bitflips, !i,
   1187						  false, page);
   1188		if (ret < 0)
   1189			return ret;
   1190	}
   1191
   1192	sunxi_nfc_hw_ecc_disable(nand);
   1193
   1194	return max_bitflips;
   1195}
   1196
   1197static int sunxi_nfc_hw_ecc_read_subpage_dma(struct nand_chip *nand,
   1198					     u32 data_offs, u32 readlen,
   1199					     u8 *buf, int page)
   1200{
   1201	int nchunks = DIV_ROUND_UP(data_offs + readlen, nand->ecc.size);
   1202	int ret;
   1203
   1204	sunxi_nfc_select_chip(nand, nand->cur_cs);
   1205
   1206	nand_read_page_op(nand, page, 0, NULL, 0);
   1207
   1208	ret = sunxi_nfc_hw_ecc_read_chunks_dma(nand, buf, false, page, nchunks);
   1209	if (ret >= 0)
   1210		return ret;
   1211
   1212	/* Fallback to PIO mode */
   1213	return sunxi_nfc_hw_ecc_read_subpage(nand, data_offs, readlen,
   1214					     buf, page);
   1215}
   1216
   1217static int sunxi_nfc_hw_ecc_write_page(struct nand_chip *nand,
   1218				       const uint8_t *buf, int oob_required,
   1219				       int page)
   1220{
   1221	struct mtd_info *mtd = nand_to_mtd(nand);
   1222	struct nand_ecc_ctrl *ecc = &nand->ecc;
   1223	int ret, i, cur_off = 0;
   1224
   1225	sunxi_nfc_select_chip(nand, nand->cur_cs);
   1226
   1227	nand_prog_page_begin_op(nand, page, 0, NULL, 0);
   1228
   1229	sunxi_nfc_hw_ecc_enable(nand);
   1230
   1231	for (i = 0; i < ecc->steps; i++) {
   1232		int data_off = i * ecc->size;
   1233		int oob_off = i * (ecc->bytes + 4);
   1234		const u8 *data = buf + data_off;
   1235		const u8 *oob = nand->oob_poi + oob_off;
   1236
   1237		ret = sunxi_nfc_hw_ecc_write_chunk(nand, data, data_off, oob,
   1238						   oob_off + mtd->writesize,
   1239						   &cur_off, !i, page);
   1240		if (ret)
   1241			return ret;
   1242	}
   1243
   1244	if (oob_required || (nand->options & NAND_NEED_SCRAMBLING))
   1245		sunxi_nfc_hw_ecc_write_extra_oob(nand, nand->oob_poi,
   1246						 &cur_off, page);
   1247
   1248	sunxi_nfc_hw_ecc_disable(nand);
   1249
   1250	return nand_prog_page_end_op(nand);
   1251}
   1252
   1253static int sunxi_nfc_hw_ecc_write_subpage(struct nand_chip *nand,
   1254					  u32 data_offs, u32 data_len,
   1255					  const u8 *buf, int oob_required,
   1256					  int page)
   1257{
   1258	struct mtd_info *mtd = nand_to_mtd(nand);
   1259	struct nand_ecc_ctrl *ecc = &nand->ecc;
   1260	int ret, i, cur_off = 0;
   1261
   1262	sunxi_nfc_select_chip(nand, nand->cur_cs);
   1263
   1264	nand_prog_page_begin_op(nand, page, 0, NULL, 0);
   1265
   1266	sunxi_nfc_hw_ecc_enable(nand);
   1267
   1268	for (i = data_offs / ecc->size;
   1269	     i < DIV_ROUND_UP(data_offs + data_len, ecc->size); i++) {
   1270		int data_off = i * ecc->size;
   1271		int oob_off = i * (ecc->bytes + 4);
   1272		const u8 *data = buf + data_off;
   1273		const u8 *oob = nand->oob_poi + oob_off;
   1274
   1275		ret = sunxi_nfc_hw_ecc_write_chunk(nand, data, data_off, oob,
   1276						   oob_off + mtd->writesize,
   1277						   &cur_off, !i, page);
   1278		if (ret)
   1279			return ret;
   1280	}
   1281
   1282	sunxi_nfc_hw_ecc_disable(nand);
   1283
   1284	return nand_prog_page_end_op(nand);
   1285}
   1286
   1287static int sunxi_nfc_hw_ecc_write_page_dma(struct nand_chip *nand,
   1288					   const u8 *buf,
   1289					   int oob_required,
   1290					   int page)
   1291{
   1292	struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
   1293	struct nand_ecc_ctrl *ecc = &nand->ecc;
   1294	struct scatterlist sg;
   1295	u32 wait;
   1296	int ret, i;
   1297
   1298	sunxi_nfc_select_chip(nand, nand->cur_cs);
   1299
   1300	ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
   1301	if (ret)
   1302		return ret;
   1303
   1304	ret = sunxi_nfc_dma_op_prepare(nfc, buf, ecc->size, ecc->steps,
   1305				       DMA_TO_DEVICE, &sg);
   1306	if (ret)
   1307		goto pio_fallback;
   1308
   1309	for (i = 0; i < ecc->steps; i++) {
   1310		const u8 *oob = nand->oob_poi + (i * (ecc->bytes + 4));
   1311
   1312		sunxi_nfc_hw_ecc_set_prot_oob_bytes(nand, oob, i, !i, page);
   1313	}
   1314
   1315	nand_prog_page_begin_op(nand, page, 0, NULL, 0);
   1316
   1317	sunxi_nfc_hw_ecc_enable(nand);
   1318	sunxi_nfc_randomizer_config(nand, page, false);
   1319	sunxi_nfc_randomizer_enable(nand);
   1320
   1321	writel((NAND_CMD_RNDIN << 8) | NAND_CMD_PAGEPROG,
   1322	       nfc->regs + NFC_REG_WCMD_SET);
   1323
   1324	wait = NFC_CMD_INT_FLAG;
   1325
   1326	if (nfc->caps->has_mdma)
   1327		wait |= NFC_DMA_INT_FLAG;
   1328	else
   1329		dma_async_issue_pending(nfc->dmac);
   1330
   1331	writel(NFC_PAGE_OP | NFC_DATA_SWAP_METHOD |
   1332	       NFC_DATA_TRANS | NFC_ACCESS_DIR,
   1333	       nfc->regs + NFC_REG_CMD);
   1334
   1335	ret = sunxi_nfc_wait_events(nfc, wait, false, 0);
   1336	if (ret && !nfc->caps->has_mdma)
   1337		dmaengine_terminate_all(nfc->dmac);
   1338
   1339	sunxi_nfc_randomizer_disable(nand);
   1340	sunxi_nfc_hw_ecc_disable(nand);
   1341
   1342	sunxi_nfc_dma_op_cleanup(nfc, DMA_TO_DEVICE, &sg);
   1343
   1344	if (ret)
   1345		return ret;
   1346
   1347	if (oob_required || (nand->options & NAND_NEED_SCRAMBLING))
   1348		/* TODO: use DMA to transfer extra OOB bytes ? */
   1349		sunxi_nfc_hw_ecc_write_extra_oob(nand, nand->oob_poi,
   1350						 NULL, page);
   1351
   1352	return nand_prog_page_end_op(nand);
   1353
   1354pio_fallback:
   1355	return sunxi_nfc_hw_ecc_write_page(nand, buf, oob_required, page);
   1356}
   1357
   1358static int sunxi_nfc_hw_ecc_read_oob(struct nand_chip *nand, int page)
   1359{
   1360	u8 *buf = nand_get_data_buf(nand);
   1361
   1362	return nand->ecc.read_page(nand, buf, 1, page);
   1363}
   1364
   1365static int sunxi_nfc_hw_ecc_write_oob(struct nand_chip *nand, int page)
   1366{
   1367	struct mtd_info *mtd = nand_to_mtd(nand);
   1368	u8 *buf = nand_get_data_buf(nand);
   1369	int ret;
   1370
   1371	memset(buf, 0xff, mtd->writesize);
   1372	ret = nand->ecc.write_page(nand, buf, 1, page);
   1373	if (ret)
   1374		return ret;
   1375
   1376	/* Send command to program the OOB data */
   1377	return nand_prog_page_end_op(nand);
   1378}
   1379
   1380static const s32 tWB_lut[] = {6, 12, 16, 20};
   1381static const s32 tRHW_lut[] = {4, 8, 12, 20};
   1382
   1383static int _sunxi_nand_lookup_timing(const s32 *lut, int lut_size, u32 duration,
   1384		u32 clk_period)
   1385{
   1386	u32 clk_cycles = DIV_ROUND_UP(duration, clk_period);
   1387	int i;
   1388
   1389	for (i = 0; i < lut_size; i++) {
   1390		if (clk_cycles <= lut[i])
   1391			return i;
   1392	}
   1393
   1394	/* Doesn't fit */
   1395	return -EINVAL;
   1396}
   1397
   1398#define sunxi_nand_lookup_timing(l, p, c) \
   1399			_sunxi_nand_lookup_timing(l, ARRAY_SIZE(l), p, c)
   1400
   1401static int sunxi_nfc_setup_interface(struct nand_chip *nand, int csline,
   1402				     const struct nand_interface_config *conf)
   1403{
   1404	struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
   1405	struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
   1406	const struct nand_sdr_timings *timings;
   1407	u32 min_clk_period = 0;
   1408	s32 tWB, tADL, tWHR, tRHW, tCAD;
   1409	long real_clk_rate;
   1410
   1411	timings = nand_get_sdr_timings(conf);
   1412	if (IS_ERR(timings))
   1413		return -ENOTSUPP;
   1414
   1415	/* T1 <=> tCLS */
   1416	if (timings->tCLS_min > min_clk_period)
   1417		min_clk_period = timings->tCLS_min;
   1418
   1419	/* T2 <=> tCLH */
   1420	if (timings->tCLH_min > min_clk_period)
   1421		min_clk_period = timings->tCLH_min;
   1422
   1423	/* T3 <=> tCS */
   1424	if (timings->tCS_min > min_clk_period)
   1425		min_clk_period = timings->tCS_min;
   1426
   1427	/* T4 <=> tCH */
   1428	if (timings->tCH_min > min_clk_period)
   1429		min_clk_period = timings->tCH_min;
   1430
   1431	/* T5 <=> tWP */
   1432	if (timings->tWP_min > min_clk_period)
   1433		min_clk_period = timings->tWP_min;
   1434
   1435	/* T6 <=> tWH */
   1436	if (timings->tWH_min > min_clk_period)
   1437		min_clk_period = timings->tWH_min;
   1438
   1439	/* T7 <=> tALS */
   1440	if (timings->tALS_min > min_clk_period)
   1441		min_clk_period = timings->tALS_min;
   1442
   1443	/* T8 <=> tDS */
   1444	if (timings->tDS_min > min_clk_period)
   1445		min_clk_period = timings->tDS_min;
   1446
   1447	/* T9 <=> tDH */
   1448	if (timings->tDH_min > min_clk_period)
   1449		min_clk_period = timings->tDH_min;
   1450
   1451	/* T10 <=> tRR */
   1452	if (timings->tRR_min > (min_clk_period * 3))
   1453		min_clk_period = DIV_ROUND_UP(timings->tRR_min, 3);
   1454
   1455	/* T11 <=> tALH */
   1456	if (timings->tALH_min > min_clk_period)
   1457		min_clk_period = timings->tALH_min;
   1458
   1459	/* T12 <=> tRP */
   1460	if (timings->tRP_min > min_clk_period)
   1461		min_clk_period = timings->tRP_min;
   1462
   1463	/* T13 <=> tREH */
   1464	if (timings->tREH_min > min_clk_period)
   1465		min_clk_period = timings->tREH_min;
   1466
   1467	/* T14 <=> tRC */
   1468	if (timings->tRC_min > (min_clk_period * 2))
   1469		min_clk_period = DIV_ROUND_UP(timings->tRC_min, 2);
   1470
   1471	/* T15 <=> tWC */
   1472	if (timings->tWC_min > (min_clk_period * 2))
   1473		min_clk_period = DIV_ROUND_UP(timings->tWC_min, 2);
   1474
   1475	/* T16 - T19 + tCAD */
   1476	if (timings->tWB_max > (min_clk_period * 20))
   1477		min_clk_period = DIV_ROUND_UP(timings->tWB_max, 20);
   1478
   1479	if (timings->tADL_min > (min_clk_period * 32))
   1480		min_clk_period = DIV_ROUND_UP(timings->tADL_min, 32);
   1481
   1482	if (timings->tWHR_min > (min_clk_period * 32))
   1483		min_clk_period = DIV_ROUND_UP(timings->tWHR_min, 32);
   1484
   1485	if (timings->tRHW_min > (min_clk_period * 20))
   1486		min_clk_period = DIV_ROUND_UP(timings->tRHW_min, 20);
   1487
   1488	/*
   1489	 * In non-EDO, tREA should be less than tRP to guarantee that the
   1490	 * controller does not sample the IO lines too early. Unfortunately,
   1491	 * the sunxi NAND controller does not allow us to have different
   1492	 * values for tRP and tREH (tRP = tREH = tRW / 2).
   1493	 *
   1494	 * We have 2 options to overcome this limitation:
   1495	 *
   1496	 * 1/ Extend tRC to fulfil the tREA <= tRC / 2 constraint
   1497	 * 2/ Use EDO mode (only works if timings->tRLOH > 0)
   1498	 */
   1499	if (timings->tREA_max > min_clk_period && !timings->tRLOH_min)
   1500		min_clk_period = timings->tREA_max;
   1501
   1502	tWB  = sunxi_nand_lookup_timing(tWB_lut, timings->tWB_max,
   1503					min_clk_period);
   1504	if (tWB < 0) {
   1505		dev_err(nfc->dev, "unsupported tWB\n");
   1506		return tWB;
   1507	}
   1508
   1509	tADL = DIV_ROUND_UP(timings->tADL_min, min_clk_period) >> 3;
   1510	if (tADL > 3) {
   1511		dev_err(nfc->dev, "unsupported tADL\n");
   1512		return -EINVAL;
   1513	}
   1514
   1515	tWHR = DIV_ROUND_UP(timings->tWHR_min, min_clk_period) >> 3;
   1516	if (tWHR > 3) {
   1517		dev_err(nfc->dev, "unsupported tWHR\n");
   1518		return -EINVAL;
   1519	}
   1520
   1521	tRHW = sunxi_nand_lookup_timing(tRHW_lut, timings->tRHW_min,
   1522					min_clk_period);
   1523	if (tRHW < 0) {
   1524		dev_err(nfc->dev, "unsupported tRHW\n");
   1525		return tRHW;
   1526	}
   1527
   1528	if (csline == NAND_DATA_IFACE_CHECK_ONLY)
   1529		return 0;
   1530
   1531	/*
   1532	 * TODO: according to ONFI specs this value only applies for DDR NAND,
   1533	 * but Allwinner seems to set this to 0x7. Mimic them for now.
   1534	 */
   1535	tCAD = 0x7;
   1536
   1537	/* TODO: A83 has some more bits for CDQSS, CS, CLHZ, CCS, WC */
   1538	sunxi_nand->timing_cfg = NFC_TIMING_CFG(tWB, tADL, tWHR, tRHW, tCAD);
   1539
   1540	/* Convert min_clk_period from picoseconds to nanoseconds */
   1541	min_clk_period = DIV_ROUND_UP(min_clk_period, 1000);
   1542
   1543	/*
   1544	 * Unlike what is stated in Allwinner datasheet, the clk_rate should
   1545	 * be set to (1 / min_clk_period), and not (2 / min_clk_period).
   1546	 * This new formula was verified with a scope and validated by
   1547	 * Allwinner engineers.
   1548	 */
   1549	sunxi_nand->clk_rate = NSEC_PER_SEC / min_clk_period;
   1550	real_clk_rate = clk_round_rate(nfc->mod_clk, sunxi_nand->clk_rate);
   1551	if (real_clk_rate <= 0) {
   1552		dev_err(nfc->dev, "Unable to round clk %lu\n",
   1553			sunxi_nand->clk_rate);
   1554		return -EINVAL;
   1555	}
   1556
   1557	sunxi_nand->timing_ctl = 0;
   1558
   1559	/*
   1560	 * ONFI specification 3.1, paragraph 4.15.2 dictates that EDO data
   1561	 * output cycle timings shall be used if the host drives tRC less than
   1562	 * 30 ns. We should also use EDO mode if tREA is bigger than tRP.
   1563	 */
   1564	min_clk_period = NSEC_PER_SEC / real_clk_rate;
   1565	if (min_clk_period * 2 < 30 || min_clk_period * 1000 < timings->tREA_max)
   1566		sunxi_nand->timing_ctl = NFC_TIMING_CTL_EDO;
   1567
   1568	return 0;
   1569}
   1570
   1571static int sunxi_nand_ooblayout_ecc(struct mtd_info *mtd, int section,
   1572				    struct mtd_oob_region *oobregion)
   1573{
   1574	struct nand_chip *nand = mtd_to_nand(mtd);
   1575	struct nand_ecc_ctrl *ecc = &nand->ecc;
   1576
   1577	if (section >= ecc->steps)
   1578		return -ERANGE;
   1579
   1580	oobregion->offset = section * (ecc->bytes + 4) + 4;
   1581	oobregion->length = ecc->bytes;
   1582
   1583	return 0;
   1584}
   1585
   1586static int sunxi_nand_ooblayout_free(struct mtd_info *mtd, int section,
   1587				     struct mtd_oob_region *oobregion)
   1588{
   1589	struct nand_chip *nand = mtd_to_nand(mtd);
   1590	struct nand_ecc_ctrl *ecc = &nand->ecc;
   1591
   1592	if (section > ecc->steps)
   1593		return -ERANGE;
   1594
   1595	/*
   1596	 * The first 2 bytes are used for BB markers, hence we
   1597	 * only have 2 bytes available in the first user data
   1598	 * section.
   1599	 */
   1600	if (!section && ecc->engine_type == NAND_ECC_ENGINE_TYPE_ON_HOST) {
   1601		oobregion->offset = 2;
   1602		oobregion->length = 2;
   1603
   1604		return 0;
   1605	}
   1606
   1607	oobregion->offset = section * (ecc->bytes + 4);
   1608
   1609	if (section < ecc->steps)
   1610		oobregion->length = 4;
   1611	else
   1612		oobregion->offset = mtd->oobsize - oobregion->offset;
   1613
   1614	return 0;
   1615}
   1616
   1617static const struct mtd_ooblayout_ops sunxi_nand_ooblayout_ops = {
   1618	.ecc = sunxi_nand_ooblayout_ecc,
   1619	.free = sunxi_nand_ooblayout_free,
   1620};
   1621
   1622static void sunxi_nand_hw_ecc_ctrl_cleanup(struct sunxi_nand_chip *sunxi_nand)
   1623{
   1624	kfree(sunxi_nand->ecc);
   1625}
   1626
   1627static int sunxi_nand_hw_ecc_ctrl_init(struct nand_chip *nand,
   1628				       struct nand_ecc_ctrl *ecc,
   1629				       struct device_node *np)
   1630{
   1631	static const u8 strengths[] = { 16, 24, 28, 32, 40, 48, 56, 60, 64 };
   1632	struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
   1633	struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
   1634	struct mtd_info *mtd = nand_to_mtd(nand);
   1635	struct nand_device *nanddev = mtd_to_nanddev(mtd);
   1636	int nsectors;
   1637	int ret;
   1638	int i;
   1639
   1640	if (nanddev->ecc.user_conf.flags & NAND_ECC_MAXIMIZE_STRENGTH) {
   1641		int bytes;
   1642
   1643		ecc->size = 1024;
   1644		nsectors = mtd->writesize / ecc->size;
   1645
   1646		/* Reserve 2 bytes for the BBM */
   1647		bytes = (mtd->oobsize - 2) / nsectors;
   1648
   1649		/* 4 non-ECC bytes are added before each ECC bytes section */
   1650		bytes -= 4;
   1651
   1652		/* and bytes has to be even. */
   1653		if (bytes % 2)
   1654			bytes--;
   1655
   1656		ecc->strength = bytes * 8 / fls(8 * ecc->size);
   1657
   1658		for (i = 0; i < ARRAY_SIZE(strengths); i++) {
   1659			if (strengths[i] > ecc->strength)
   1660				break;
   1661		}
   1662
   1663		if (!i)
   1664			ecc->strength = 0;
   1665		else
   1666			ecc->strength = strengths[i - 1];
   1667	}
   1668
   1669	if (ecc->size != 512 && ecc->size != 1024)
   1670		return -EINVAL;
   1671
   1672	sunxi_nand->ecc = kzalloc(sizeof(*sunxi_nand->ecc), GFP_KERNEL);
   1673	if (!sunxi_nand->ecc)
   1674		return -ENOMEM;
   1675
   1676	/* Prefer 1k ECC chunk over 512 ones */
   1677	if (ecc->size == 512 && mtd->writesize > 512) {
   1678		ecc->size = 1024;
   1679		ecc->strength *= 2;
   1680	}
   1681
   1682	/* Add ECC info retrieval from DT */
   1683	for (i = 0; i < ARRAY_SIZE(strengths); i++) {
   1684		if (ecc->strength <= strengths[i]) {
   1685			/*
   1686			 * Update ecc->strength value with the actual strength
   1687			 * that will be used by the ECC engine.
   1688			 */
   1689			ecc->strength = strengths[i];
   1690			break;
   1691		}
   1692	}
   1693
   1694	if (i >= ARRAY_SIZE(strengths)) {
   1695		dev_err(nfc->dev, "unsupported strength\n");
   1696		ret = -ENOTSUPP;
   1697		goto err;
   1698	}
   1699
   1700	sunxi_nand->ecc->mode = i;
   1701
   1702	/* HW ECC always request ECC bytes for 1024 bytes blocks */
   1703	ecc->bytes = DIV_ROUND_UP(ecc->strength * fls(8 * 1024), 8);
   1704
   1705	/* HW ECC always work with even numbers of ECC bytes */
   1706	ecc->bytes = ALIGN(ecc->bytes, 2);
   1707
   1708	nsectors = mtd->writesize / ecc->size;
   1709
   1710	if (mtd->oobsize < ((ecc->bytes + 4) * nsectors)) {
   1711		ret = -EINVAL;
   1712		goto err;
   1713	}
   1714
   1715	ecc->read_oob = sunxi_nfc_hw_ecc_read_oob;
   1716	ecc->write_oob = sunxi_nfc_hw_ecc_write_oob;
   1717	mtd_set_ooblayout(mtd, &sunxi_nand_ooblayout_ops);
   1718
   1719	if (nfc->dmac || nfc->caps->has_mdma) {
   1720		ecc->read_page = sunxi_nfc_hw_ecc_read_page_dma;
   1721		ecc->read_subpage = sunxi_nfc_hw_ecc_read_subpage_dma;
   1722		ecc->write_page = sunxi_nfc_hw_ecc_write_page_dma;
   1723		nand->options |= NAND_USES_DMA;
   1724	} else {
   1725		ecc->read_page = sunxi_nfc_hw_ecc_read_page;
   1726		ecc->read_subpage = sunxi_nfc_hw_ecc_read_subpage;
   1727		ecc->write_page = sunxi_nfc_hw_ecc_write_page;
   1728	}
   1729
   1730	/* TODO: support DMA for raw accesses and subpage write */
   1731	ecc->write_subpage = sunxi_nfc_hw_ecc_write_subpage;
   1732	ecc->read_oob_raw = nand_read_oob_std;
   1733	ecc->write_oob_raw = nand_write_oob_std;
   1734
   1735	return 0;
   1736
   1737err:
   1738	kfree(sunxi_nand->ecc);
   1739
   1740	return ret;
   1741}
   1742
   1743static void sunxi_nand_ecc_cleanup(struct sunxi_nand_chip *sunxi_nand)
   1744{
   1745	struct nand_ecc_ctrl *ecc = &sunxi_nand->nand.ecc;
   1746
   1747	switch (ecc->engine_type) {
   1748	case NAND_ECC_ENGINE_TYPE_ON_HOST:
   1749		sunxi_nand_hw_ecc_ctrl_cleanup(sunxi_nand);
   1750		break;
   1751	case NAND_ECC_ENGINE_TYPE_NONE:
   1752	default:
   1753		break;
   1754	}
   1755}
   1756
   1757static int sunxi_nand_attach_chip(struct nand_chip *nand)
   1758{
   1759	const struct nand_ecc_props *requirements =
   1760		nanddev_get_ecc_requirements(&nand->base);
   1761	struct nand_ecc_ctrl *ecc = &nand->ecc;
   1762	struct device_node *np = nand_get_flash_node(nand);
   1763	int ret;
   1764
   1765	if (nand->bbt_options & NAND_BBT_USE_FLASH)
   1766		nand->bbt_options |= NAND_BBT_NO_OOB;
   1767
   1768	if (nand->options & NAND_NEED_SCRAMBLING)
   1769		nand->options |= NAND_NO_SUBPAGE_WRITE;
   1770
   1771	nand->options |= NAND_SUBPAGE_READ;
   1772
   1773	if (!ecc->size) {
   1774		ecc->size = requirements->step_size;
   1775		ecc->strength = requirements->strength;
   1776	}
   1777
   1778	if (!ecc->size || !ecc->strength)
   1779		return -EINVAL;
   1780
   1781	switch (ecc->engine_type) {
   1782	case NAND_ECC_ENGINE_TYPE_ON_HOST:
   1783		ret = sunxi_nand_hw_ecc_ctrl_init(nand, ecc, np);
   1784		if (ret)
   1785			return ret;
   1786		break;
   1787	case NAND_ECC_ENGINE_TYPE_NONE:
   1788	case NAND_ECC_ENGINE_TYPE_SOFT:
   1789		break;
   1790	default:
   1791		return -EINVAL;
   1792	}
   1793
   1794	return 0;
   1795}
   1796
   1797static int sunxi_nfc_exec_subop(struct nand_chip *nand,
   1798				const struct nand_subop *subop)
   1799{
   1800	struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
   1801	u32 cmd = 0, extcmd = 0, cnt = 0, addrs[2] = { };
   1802	unsigned int i, j, remaining, start;
   1803	void *inbuf = NULL;
   1804	int ret;
   1805
   1806	for (i = 0; i < subop->ninstrs; i++) {
   1807		const struct nand_op_instr *instr = &subop->instrs[i];
   1808
   1809		switch (instr->type) {
   1810		case NAND_OP_CMD_INSTR:
   1811			if (cmd & NFC_SEND_CMD1) {
   1812				if (WARN_ON(cmd & NFC_SEND_CMD2))
   1813					return -EINVAL;
   1814
   1815				cmd |= NFC_SEND_CMD2;
   1816				extcmd |= instr->ctx.cmd.opcode;
   1817			} else {
   1818				cmd |= NFC_SEND_CMD1 |
   1819				       NFC_CMD(instr->ctx.cmd.opcode);
   1820			}
   1821			break;
   1822
   1823		case NAND_OP_ADDR_INSTR:
   1824			remaining = nand_subop_get_num_addr_cyc(subop, i);
   1825			start = nand_subop_get_addr_start_off(subop, i);
   1826			for (j = 0; j < 8 && j + start < remaining; j++) {
   1827				u32 addr = instr->ctx.addr.addrs[j + start];
   1828
   1829				addrs[j / 4] |= addr << (j % 4) * 8;
   1830			}
   1831
   1832			if (j)
   1833				cmd |= NFC_SEND_ADR | NFC_ADR_NUM(j);
   1834
   1835			break;
   1836
   1837		case NAND_OP_DATA_IN_INSTR:
   1838		case NAND_OP_DATA_OUT_INSTR:
   1839			start = nand_subop_get_data_start_off(subop, i);
   1840			remaining = nand_subop_get_data_len(subop, i);
   1841			cnt = min_t(u32, remaining, NFC_SRAM_SIZE);
   1842			cmd |= NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD;
   1843
   1844			if (instr->type == NAND_OP_DATA_OUT_INSTR) {
   1845				cmd |= NFC_ACCESS_DIR;
   1846				memcpy_toio(nfc->regs + NFC_RAM0_BASE,
   1847					    instr->ctx.data.buf.out + start,
   1848					    cnt);
   1849			} else {
   1850				inbuf = instr->ctx.data.buf.in + start;
   1851			}
   1852
   1853			break;
   1854
   1855		case NAND_OP_WAITRDY_INSTR:
   1856			cmd |= NFC_WAIT_FLAG;
   1857			break;
   1858		}
   1859	}
   1860
   1861	ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
   1862	if (ret)
   1863		return ret;
   1864
   1865	if (cmd & NFC_SEND_ADR) {
   1866		writel(addrs[0], nfc->regs + NFC_REG_ADDR_LOW);
   1867		writel(addrs[1], nfc->regs + NFC_REG_ADDR_HIGH);
   1868	}
   1869
   1870	if (cmd & NFC_SEND_CMD2)
   1871		writel(extcmd,
   1872		       nfc->regs +
   1873		       (cmd & NFC_ACCESS_DIR ?
   1874			NFC_REG_WCMD_SET : NFC_REG_RCMD_SET));
   1875
   1876	if (cmd & NFC_DATA_TRANS)
   1877		writel(cnt, nfc->regs + NFC_REG_CNT);
   1878
   1879	writel(cmd, nfc->regs + NFC_REG_CMD);
   1880
   1881	ret = sunxi_nfc_wait_events(nfc, NFC_CMD_INT_FLAG,
   1882				    !(cmd & NFC_WAIT_FLAG) && cnt < 64,
   1883				    0);
   1884	if (ret)
   1885		return ret;
   1886
   1887	if (inbuf)
   1888		memcpy_fromio(inbuf, nfc->regs + NFC_RAM0_BASE, cnt);
   1889
   1890	return 0;
   1891}
   1892
   1893static int sunxi_nfc_soft_waitrdy(struct nand_chip *nand,
   1894				  const struct nand_subop *subop)
   1895{
   1896	return nand_soft_waitrdy(nand,
   1897				 subop->instrs[0].ctx.waitrdy.timeout_ms);
   1898}
   1899
   1900static const struct nand_op_parser sunxi_nfc_op_parser = NAND_OP_PARSER(
   1901	NAND_OP_PARSER_PATTERN(sunxi_nfc_exec_subop,
   1902			       NAND_OP_PARSER_PAT_CMD_ELEM(true),
   1903			       NAND_OP_PARSER_PAT_ADDR_ELEM(true, 8),
   1904			       NAND_OP_PARSER_PAT_CMD_ELEM(true),
   1905			       NAND_OP_PARSER_PAT_WAITRDY_ELEM(true),
   1906			       NAND_OP_PARSER_PAT_DATA_IN_ELEM(true, 1024)),
   1907	NAND_OP_PARSER_PATTERN(sunxi_nfc_exec_subop,
   1908			       NAND_OP_PARSER_PAT_CMD_ELEM(true),
   1909			       NAND_OP_PARSER_PAT_ADDR_ELEM(true, 8),
   1910			       NAND_OP_PARSER_PAT_DATA_OUT_ELEM(true, 1024),
   1911			       NAND_OP_PARSER_PAT_CMD_ELEM(true),
   1912			       NAND_OP_PARSER_PAT_WAITRDY_ELEM(true)),
   1913);
   1914
   1915static const struct nand_op_parser sunxi_nfc_norb_op_parser = NAND_OP_PARSER(
   1916	NAND_OP_PARSER_PATTERN(sunxi_nfc_exec_subop,
   1917			       NAND_OP_PARSER_PAT_CMD_ELEM(true),
   1918			       NAND_OP_PARSER_PAT_ADDR_ELEM(true, 8),
   1919			       NAND_OP_PARSER_PAT_CMD_ELEM(true),
   1920			       NAND_OP_PARSER_PAT_DATA_IN_ELEM(true, 1024)),
   1921	NAND_OP_PARSER_PATTERN(sunxi_nfc_exec_subop,
   1922			       NAND_OP_PARSER_PAT_CMD_ELEM(true),
   1923			       NAND_OP_PARSER_PAT_ADDR_ELEM(true, 8),
   1924			       NAND_OP_PARSER_PAT_DATA_OUT_ELEM(true, 1024),
   1925			       NAND_OP_PARSER_PAT_CMD_ELEM(true)),
   1926	NAND_OP_PARSER_PATTERN(sunxi_nfc_soft_waitrdy,
   1927			       NAND_OP_PARSER_PAT_WAITRDY_ELEM(false)),
   1928);
   1929
   1930static int sunxi_nfc_exec_op(struct nand_chip *nand,
   1931			     const struct nand_operation *op, bool check_only)
   1932{
   1933	struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
   1934	const struct nand_op_parser *parser;
   1935
   1936	if (!check_only)
   1937		sunxi_nfc_select_chip(nand, op->cs);
   1938
   1939	if (sunxi_nand->sels[op->cs].rb >= 0)
   1940		parser = &sunxi_nfc_op_parser;
   1941	else
   1942		parser = &sunxi_nfc_norb_op_parser;
   1943
   1944	return nand_op_parser_exec_op(nand, parser, op, check_only);
   1945}
   1946
   1947static const struct nand_controller_ops sunxi_nand_controller_ops = {
   1948	.attach_chip = sunxi_nand_attach_chip,
   1949	.setup_interface = sunxi_nfc_setup_interface,
   1950	.exec_op = sunxi_nfc_exec_op,
   1951};
   1952
   1953static int sunxi_nand_chip_init(struct device *dev, struct sunxi_nfc *nfc,
   1954				struct device_node *np)
   1955{
   1956	struct sunxi_nand_chip *sunxi_nand;
   1957	struct mtd_info *mtd;
   1958	struct nand_chip *nand;
   1959	int nsels;
   1960	int ret;
   1961	int i;
   1962	u32 tmp;
   1963
   1964	if (!of_get_property(np, "reg", &nsels))
   1965		return -EINVAL;
   1966
   1967	nsels /= sizeof(u32);
   1968	if (!nsels) {
   1969		dev_err(dev, "invalid reg property size\n");
   1970		return -EINVAL;
   1971	}
   1972
   1973	sunxi_nand = devm_kzalloc(dev, struct_size(sunxi_nand, sels, nsels),
   1974				  GFP_KERNEL);
   1975	if (!sunxi_nand)
   1976		return -ENOMEM;
   1977
   1978	sunxi_nand->nsels = nsels;
   1979
   1980	for (i = 0; i < nsels; i++) {
   1981		ret = of_property_read_u32_index(np, "reg", i, &tmp);
   1982		if (ret) {
   1983			dev_err(dev, "could not retrieve reg property: %d\n",
   1984				ret);
   1985			return ret;
   1986		}
   1987
   1988		if (tmp > NFC_MAX_CS) {
   1989			dev_err(dev,
   1990				"invalid reg value: %u (max CS = 7)\n",
   1991				tmp);
   1992			return -EINVAL;
   1993		}
   1994
   1995		if (test_and_set_bit(tmp, &nfc->assigned_cs)) {
   1996			dev_err(dev, "CS %d already assigned\n", tmp);
   1997			return -EINVAL;
   1998		}
   1999
   2000		sunxi_nand->sels[i].cs = tmp;
   2001
   2002		if (!of_property_read_u32_index(np, "allwinner,rb", i, &tmp) &&
   2003		    tmp < 2)
   2004			sunxi_nand->sels[i].rb = tmp;
   2005		else
   2006			sunxi_nand->sels[i].rb = -1;
   2007	}
   2008
   2009	nand = &sunxi_nand->nand;
   2010	/* Default tR value specified in the ONFI spec (chapter 4.15.1) */
   2011	nand->controller = &nfc->controller;
   2012	nand->controller->ops = &sunxi_nand_controller_ops;
   2013
   2014	/*
   2015	 * Set the ECC mode to the default value in case nothing is specified
   2016	 * in the DT.
   2017	 */
   2018	nand->ecc.engine_type = NAND_ECC_ENGINE_TYPE_ON_HOST;
   2019	nand_set_flash_node(nand, np);
   2020
   2021	mtd = nand_to_mtd(nand);
   2022	mtd->dev.parent = dev;
   2023
   2024	ret = nand_scan(nand, nsels);
   2025	if (ret)
   2026		return ret;
   2027
   2028	ret = mtd_device_register(mtd, NULL, 0);
   2029	if (ret) {
   2030		dev_err(dev, "failed to register mtd device: %d\n", ret);
   2031		nand_cleanup(nand);
   2032		return ret;
   2033	}
   2034
   2035	list_add_tail(&sunxi_nand->node, &nfc->chips);
   2036
   2037	return 0;
   2038}
   2039
   2040static int sunxi_nand_chips_init(struct device *dev, struct sunxi_nfc *nfc)
   2041{
   2042	struct device_node *np = dev->of_node;
   2043	struct device_node *nand_np;
   2044	int nchips = of_get_child_count(np);
   2045	int ret;
   2046
   2047	if (nchips > 8) {
   2048		dev_err(dev, "too many NAND chips: %d (max = 8)\n", nchips);
   2049		return -EINVAL;
   2050	}
   2051
   2052	for_each_child_of_node(np, nand_np) {
   2053		ret = sunxi_nand_chip_init(dev, nfc, nand_np);
   2054		if (ret) {
   2055			of_node_put(nand_np);
   2056			return ret;
   2057		}
   2058	}
   2059
   2060	return 0;
   2061}
   2062
   2063static void sunxi_nand_chips_cleanup(struct sunxi_nfc *nfc)
   2064{
   2065	struct sunxi_nand_chip *sunxi_nand;
   2066	struct nand_chip *chip;
   2067	int ret;
   2068
   2069	while (!list_empty(&nfc->chips)) {
   2070		sunxi_nand = list_first_entry(&nfc->chips,
   2071					      struct sunxi_nand_chip,
   2072					      node);
   2073		chip = &sunxi_nand->nand;
   2074		ret = mtd_device_unregister(nand_to_mtd(chip));
   2075		WARN_ON(ret);
   2076		nand_cleanup(chip);
   2077		sunxi_nand_ecc_cleanup(sunxi_nand);
   2078		list_del(&sunxi_nand->node);
   2079	}
   2080}
   2081
   2082static int sunxi_nfc_dma_init(struct sunxi_nfc *nfc, struct resource *r)
   2083{
   2084	int ret;
   2085
   2086	if (nfc->caps->has_mdma)
   2087		return 0;
   2088
   2089	nfc->dmac = dma_request_chan(nfc->dev, "rxtx");
   2090	if (IS_ERR(nfc->dmac)) {
   2091		ret = PTR_ERR(nfc->dmac);
   2092		if (ret == -EPROBE_DEFER)
   2093			return ret;
   2094
   2095		/* Ignore errors to fall back to PIO mode */
   2096		dev_warn(nfc->dev, "failed to request rxtx DMA channel: %d\n", ret);
   2097		nfc->dmac = NULL;
   2098	} else {
   2099		struct dma_slave_config dmac_cfg = { };
   2100
   2101		dmac_cfg.src_addr = r->start + nfc->caps->reg_io_data;
   2102		dmac_cfg.dst_addr = dmac_cfg.src_addr;
   2103		dmac_cfg.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
   2104		dmac_cfg.dst_addr_width = dmac_cfg.src_addr_width;
   2105		dmac_cfg.src_maxburst = nfc->caps->dma_maxburst;
   2106		dmac_cfg.dst_maxburst = nfc->caps->dma_maxburst;
   2107		dmaengine_slave_config(nfc->dmac, &dmac_cfg);
   2108	}
   2109	return 0;
   2110}
   2111
   2112static int sunxi_nfc_probe(struct platform_device *pdev)
   2113{
   2114	struct device *dev = &pdev->dev;
   2115	struct resource *r;
   2116	struct sunxi_nfc *nfc;
   2117	int irq;
   2118	int ret;
   2119
   2120	nfc = devm_kzalloc(dev, sizeof(*nfc), GFP_KERNEL);
   2121	if (!nfc)
   2122		return -ENOMEM;
   2123
   2124	nfc->dev = dev;
   2125	nand_controller_init(&nfc->controller);
   2126	INIT_LIST_HEAD(&nfc->chips);
   2127
   2128	r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
   2129	nfc->regs = devm_ioremap_resource(dev, r);
   2130	if (IS_ERR(nfc->regs))
   2131		return PTR_ERR(nfc->regs);
   2132
   2133	irq = platform_get_irq(pdev, 0);
   2134	if (irq < 0)
   2135		return irq;
   2136
   2137	nfc->ahb_clk = devm_clk_get(dev, "ahb");
   2138	if (IS_ERR(nfc->ahb_clk)) {
   2139		dev_err(dev, "failed to retrieve ahb clk\n");
   2140		return PTR_ERR(nfc->ahb_clk);
   2141	}
   2142
   2143	ret = clk_prepare_enable(nfc->ahb_clk);
   2144	if (ret)
   2145		return ret;
   2146
   2147	nfc->mod_clk = devm_clk_get(dev, "mod");
   2148	if (IS_ERR(nfc->mod_clk)) {
   2149		dev_err(dev, "failed to retrieve mod clk\n");
   2150		ret = PTR_ERR(nfc->mod_clk);
   2151		goto out_ahb_clk_unprepare;
   2152	}
   2153
   2154	ret = clk_prepare_enable(nfc->mod_clk);
   2155	if (ret)
   2156		goto out_ahb_clk_unprepare;
   2157
   2158	nfc->reset = devm_reset_control_get_optional_exclusive(dev, "ahb");
   2159	if (IS_ERR(nfc->reset)) {
   2160		ret = PTR_ERR(nfc->reset);
   2161		goto out_mod_clk_unprepare;
   2162	}
   2163
   2164	ret = reset_control_deassert(nfc->reset);
   2165	if (ret) {
   2166		dev_err(dev, "reset err %d\n", ret);
   2167		goto out_mod_clk_unprepare;
   2168	}
   2169
   2170	nfc->caps = of_device_get_match_data(&pdev->dev);
   2171	if (!nfc->caps) {
   2172		ret = -EINVAL;
   2173		goto out_ahb_reset_reassert;
   2174	}
   2175
   2176	ret = sunxi_nfc_rst(nfc);
   2177	if (ret)
   2178		goto out_ahb_reset_reassert;
   2179
   2180	writel(0, nfc->regs + NFC_REG_INT);
   2181	ret = devm_request_irq(dev, irq, sunxi_nfc_interrupt,
   2182			       0, "sunxi-nand", nfc);
   2183	if (ret)
   2184		goto out_ahb_reset_reassert;
   2185
   2186	ret = sunxi_nfc_dma_init(nfc, r);
   2187
   2188	if (ret)
   2189		goto out_ahb_reset_reassert;
   2190
   2191	platform_set_drvdata(pdev, nfc);
   2192
   2193	ret = sunxi_nand_chips_init(dev, nfc);
   2194	if (ret) {
   2195		dev_err(dev, "failed to init nand chips\n");
   2196		goto out_release_dmac;
   2197	}
   2198
   2199	return 0;
   2200
   2201out_release_dmac:
   2202	if (nfc->dmac)
   2203		dma_release_channel(nfc->dmac);
   2204out_ahb_reset_reassert:
   2205	reset_control_assert(nfc->reset);
   2206out_mod_clk_unprepare:
   2207	clk_disable_unprepare(nfc->mod_clk);
   2208out_ahb_clk_unprepare:
   2209	clk_disable_unprepare(nfc->ahb_clk);
   2210
   2211	return ret;
   2212}
   2213
   2214static int sunxi_nfc_remove(struct platform_device *pdev)
   2215{
   2216	struct sunxi_nfc *nfc = platform_get_drvdata(pdev);
   2217
   2218	sunxi_nand_chips_cleanup(nfc);
   2219
   2220	reset_control_assert(nfc->reset);
   2221
   2222	if (nfc->dmac)
   2223		dma_release_channel(nfc->dmac);
   2224	clk_disable_unprepare(nfc->mod_clk);
   2225	clk_disable_unprepare(nfc->ahb_clk);
   2226
   2227	return 0;
   2228}
   2229
   2230static const struct sunxi_nfc_caps sunxi_nfc_a10_caps = {
   2231	.reg_io_data = NFC_REG_A10_IO_DATA,
   2232	.dma_maxburst = 4,
   2233};
   2234
   2235static const struct sunxi_nfc_caps sunxi_nfc_a23_caps = {
   2236	.has_mdma = true,
   2237	.reg_io_data = NFC_REG_A23_IO_DATA,
   2238	.dma_maxburst = 8,
   2239};
   2240
   2241static const struct of_device_id sunxi_nfc_ids[] = {
   2242	{
   2243		.compatible = "allwinner,sun4i-a10-nand",
   2244		.data = &sunxi_nfc_a10_caps,
   2245	},
   2246	{
   2247		.compatible = "allwinner,sun8i-a23-nand-controller",
   2248		.data = &sunxi_nfc_a23_caps,
   2249	},
   2250	{ /* sentinel */ }
   2251};
   2252MODULE_DEVICE_TABLE(of, sunxi_nfc_ids);
   2253
   2254static struct platform_driver sunxi_nfc_driver = {
   2255	.driver = {
   2256		.name = "sunxi_nand",
   2257		.of_match_table = sunxi_nfc_ids,
   2258	},
   2259	.probe = sunxi_nfc_probe,
   2260	.remove = sunxi_nfc_remove,
   2261};
   2262module_platform_driver(sunxi_nfc_driver);
   2263
   2264MODULE_LICENSE("GPL");
   2265MODULE_AUTHOR("Boris BREZILLON");
   2266MODULE_DESCRIPTION("Allwinner NAND Flash Controller driver");
   2267MODULE_ALIAS("platform:sunxi_nand");