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