linux/drivers/mtd/nand/sunxi_nand.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2013 Boris BREZILLON <b.brezillon.dev@gmail.com>
   3 *
   4 * Derived from:
   5 *      https://github.com/yuq/sunxi-nfc-mtd
   6 *      Copyright (C) 2013 Qiang Yu <yuq825@gmail.com>
   7 *
   8 *      https://github.com/hno/Allwinner-Info
   9 *      Copyright (C) 2013 Henrik Nordström <Henrik Nordström>
  10 *
  11 *      Copyright (C) 2013 Dmitriy B. <rzk333@gmail.com>
  12 *      Copyright (C) 2013 Sergey Lapin <slapin@ossfans.org>
  13 *
  14 * This program is free software; you can redistribute it and/or modify
  15 * it under the terms of the GNU General Public License as published by
  16 * the Free Software Foundation; either version 2 of the License, or
  17 * (at your option) any later version.
  18 *
  19 * This program is distributed in the hope that it will be useful,
  20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  22 * GNU General Public License for more details.
  23 */
  24
  25#include <linux/dma-mapping.h>
  26#include <linux/slab.h>
  27#include <linux/module.h>
  28#include <linux/moduleparam.h>
  29#include <linux/platform_device.h>
  30#include <linux/of.h>
  31#include <linux/of_device.h>
  32#include <linux/of_gpio.h>
  33#include <linux/of_mtd.h>
  34#include <linux/mtd/mtd.h>
  35#include <linux/mtd/nand.h>
  36#include <linux/mtd/partitions.h>
  37#include <linux/clk.h>
  38#include <linux/delay.h>
  39#include <linux/dmaengine.h>
  40#include <linux/gpio.h>
  41#include <linux/interrupt.h>
  42#include <linux/io.h>
  43
  44#define NFC_REG_CTL             0x0000
  45#define NFC_REG_ST              0x0004
  46#define NFC_REG_INT             0x0008
  47#define NFC_REG_TIMING_CTL      0x000C
  48#define NFC_REG_TIMING_CFG      0x0010
  49#define NFC_REG_ADDR_LOW        0x0014
  50#define NFC_REG_ADDR_HIGH       0x0018
  51#define NFC_REG_SECTOR_NUM      0x001C
  52#define NFC_REG_CNT             0x0020
  53#define NFC_REG_CMD             0x0024
  54#define NFC_REG_RCMD_SET        0x0028
  55#define NFC_REG_WCMD_SET        0x002C
  56#define NFC_REG_IO_DATA         0x0030
  57#define NFC_REG_ECC_CTL         0x0034
  58#define NFC_REG_ECC_ST          0x0038
  59#define NFC_REG_DEBUG           0x003C
  60#define NFC_REG_ECC_ERR_CNT(x)  ((0x0040 + (x)) & ~0x3)
  61#define NFC_REG_USER_DATA(x)    (0x0050 + ((x) * 4))
  62#define NFC_REG_SPARE_AREA      0x00A0
  63#define NFC_REG_PAT_ID          0x00A4
  64#define NFC_RAM0_BASE           0x0400
  65#define NFC_RAM1_BASE           0x0800
  66
  67/* define bit use in NFC_CTL */
  68#define NFC_EN                  BIT(0)
  69#define NFC_RESET               BIT(1)
  70#define NFC_BUS_WIDTH_MSK       BIT(2)
  71#define NFC_BUS_WIDTH_8         (0 << 2)
  72#define NFC_BUS_WIDTH_16        (1 << 2)
  73#define NFC_RB_SEL_MSK          BIT(3)
  74#define NFC_RB_SEL(x)           ((x) << 3)
  75#define NFC_CE_SEL_MSK          GENMASK(26, 24)
  76#define NFC_CE_SEL(x)           ((x) << 24)
  77#define NFC_CE_CTL              BIT(6)
  78#define NFC_PAGE_SHIFT_MSK      GENMASK(11, 8)
  79#define NFC_PAGE_SHIFT(x)       (((x) < 10 ? 0 : (x) - 10) << 8)
  80#define NFC_SAM                 BIT(12)
  81#define NFC_RAM_METHOD          BIT(14)
  82#define NFC_DEBUG_CTL           BIT(31)
  83
  84/* define bit use in NFC_ST */
  85#define NFC_RB_B2R              BIT(0)
  86#define NFC_CMD_INT_FLAG        BIT(1)
  87#define NFC_DMA_INT_FLAG        BIT(2)
  88#define NFC_CMD_FIFO_STATUS     BIT(3)
  89#define NFC_STA                 BIT(4)
  90#define NFC_NATCH_INT_FLAG      BIT(5)
  91#define NFC_RB_STATE(x)         BIT(x + 8)
  92
  93/* define bit use in NFC_INT */
  94#define NFC_B2R_INT_ENABLE      BIT(0)
  95#define NFC_CMD_INT_ENABLE      BIT(1)
  96#define NFC_DMA_INT_ENABLE      BIT(2)
  97#define NFC_INT_MASK            (NFC_B2R_INT_ENABLE | \
  98                                 NFC_CMD_INT_ENABLE | \
  99                                 NFC_DMA_INT_ENABLE)
 100
 101/* define bit use in NFC_TIMING_CTL */
 102#define NFC_TIMING_CTL_EDO      BIT(8)
 103
 104/* define NFC_TIMING_CFG register layout */
 105#define NFC_TIMING_CFG(tWB, tADL, tWHR, tRHW, tCAD)             \
 106        (((tWB) & 0x3) | (((tADL) & 0x3) << 2) |                \
 107        (((tWHR) & 0x3) << 4) | (((tRHW) & 0x3) << 6) |         \
 108        (((tCAD) & 0x7) << 8))
 109
 110/* define bit use in NFC_CMD */
 111#define NFC_CMD_LOW_BYTE_MSK    GENMASK(7, 0)
 112#define NFC_CMD_HIGH_BYTE_MSK   GENMASK(15, 8)
 113#define NFC_CMD(x)              (x)
 114#define NFC_ADR_NUM_MSK         GENMASK(18, 16)
 115#define NFC_ADR_NUM(x)          (((x) - 1) << 16)
 116#define NFC_SEND_ADR            BIT(19)
 117#define NFC_ACCESS_DIR          BIT(20)
 118#define NFC_DATA_TRANS          BIT(21)
 119#define NFC_SEND_CMD1           BIT(22)
 120#define NFC_WAIT_FLAG           BIT(23)
 121#define NFC_SEND_CMD2           BIT(24)
 122#define NFC_SEQ                 BIT(25)
 123#define NFC_DATA_SWAP_METHOD    BIT(26)
 124#define NFC_ROW_AUTO_INC        BIT(27)
 125#define NFC_SEND_CMD3           BIT(28)
 126#define NFC_SEND_CMD4           BIT(29)
 127#define NFC_CMD_TYPE_MSK        GENMASK(31, 30)
 128#define NFC_NORMAL_OP           (0 << 30)
 129#define NFC_ECC_OP              (1 << 30)
 130#define NFC_PAGE_OP             (2 << 30)
 131
 132/* define bit use in NFC_RCMD_SET */
 133#define NFC_READ_CMD_MSK        GENMASK(7, 0)
 134#define NFC_RND_READ_CMD0_MSK   GENMASK(15, 8)
 135#define NFC_RND_READ_CMD1_MSK   GENMASK(23, 16)
 136
 137/* define bit use in NFC_WCMD_SET */
 138#define NFC_PROGRAM_CMD_MSK     GENMASK(7, 0)
 139#define NFC_RND_WRITE_CMD_MSK   GENMASK(15, 8)
 140#define NFC_READ_CMD0_MSK       GENMASK(23, 16)
 141#define NFC_READ_CMD1_MSK       GENMASK(31, 24)
 142
 143/* define bit use in NFC_ECC_CTL */
 144#define NFC_ECC_EN              BIT(0)
 145#define NFC_ECC_PIPELINE        BIT(3)
 146#define NFC_ECC_EXCEPTION       BIT(4)
 147#define NFC_ECC_BLOCK_SIZE_MSK  BIT(5)
 148#define NFC_RANDOM_EN           BIT(9)
 149#define NFC_RANDOM_DIRECTION    BIT(10)
 150#define NFC_ECC_MODE_MSK        GENMASK(15, 12)
 151#define NFC_ECC_MODE(x)         ((x) << 12)
 152#define NFC_RANDOM_SEED_MSK     GENMASK(30, 16)
 153#define NFC_RANDOM_SEED(x)      ((x) << 16)
 154
 155/* define bit use in NFC_ECC_ST */
 156#define NFC_ECC_ERR(x)          BIT(x)
 157#define NFC_ECC_PAT_FOUND(x)    BIT(x + 16)
 158#define NFC_ECC_ERR_CNT(b, x)   (((x) >> ((b) * 8)) & 0xff)
 159
 160#define NFC_DEFAULT_TIMEOUT_MS  1000
 161
 162#define NFC_SRAM_SIZE           1024
 163
 164#define NFC_MAX_CS              7
 165
 166/*
 167 * Ready/Busy detection type: describes the Ready/Busy detection modes
 168 *
 169 * @RB_NONE:    no external detection available, rely on STATUS command
 170 *              and software timeouts
 171 * @RB_NATIVE:  use sunxi NAND controller Ready/Busy support. The Ready/Busy
 172 *              pin of the NAND flash chip must be connected to one of the
 173 *              native NAND R/B pins (those which can be muxed to the NAND
 174 *              Controller)
 175 * @RB_GPIO:    use a simple GPIO to handle Ready/Busy status. The Ready/Busy
 176 *              pin of the NAND flash chip must be connected to a GPIO capable
 177 *              pin.
 178 */
 179enum sunxi_nand_rb_type {
 180        RB_NONE,
 181        RB_NATIVE,
 182        RB_GPIO,
 183};
 184
 185/*
 186 * Ready/Busy structure: stores information related to Ready/Busy detection
 187 *
 188 * @type:       the Ready/Busy detection mode
 189 * @info:       information related to the R/B detection mode. Either a gpio
 190 *              id or a native R/B id (those supported by the NAND controller).
 191 */
 192struct sunxi_nand_rb {
 193        enum sunxi_nand_rb_type type;
 194        union {
 195                int gpio;
 196                int nativeid;
 197        } info;
 198};
 199
 200/*
 201 * Chip Select structure: stores information related to NAND Chip Select
 202 *
 203 * @cs:         the NAND CS id used to communicate with a NAND Chip
 204 * @rb:         the Ready/Busy description
 205 */
 206struct sunxi_nand_chip_sel {
 207        u8 cs;
 208        struct sunxi_nand_rb rb;
 209};
 210
 211/*
 212 * sunxi HW ECC infos: stores information related to HW ECC support
 213 *
 214 * @mode:       the sunxi ECC mode field deduced from ECC requirements
 215 * @layout:     the OOB layout depending on the ECC requirements and the
 216 *              selected ECC mode
 217 */
 218struct sunxi_nand_hw_ecc {
 219        int mode;
 220        struct nand_ecclayout layout;
 221};
 222
 223/*
 224 * NAND chip structure: stores NAND chip device related information
 225 *
 226 * @node:               used to store NAND chips into a list
 227 * @nand:               base NAND chip structure
 228 * @mtd:                base MTD structure
 229 * @clk_rate:           clk_rate required for this NAND chip
 230 * @timing_cfg          TIMING_CFG register value for this NAND chip
 231 * @selected:           current active CS
 232 * @nsels:              number of CS lines required by the NAND chip
 233 * @sels:               array of CS lines descriptions
 234 */
 235struct sunxi_nand_chip {
 236        struct list_head node;
 237        struct nand_chip nand;
 238        unsigned long clk_rate;
 239        u32 timing_cfg;
 240        u32 timing_ctl;
 241        int selected;
 242        int nsels;
 243        struct sunxi_nand_chip_sel sels[0];
 244};
 245
 246static inline struct sunxi_nand_chip *to_sunxi_nand(struct nand_chip *nand)
 247{
 248        return container_of(nand, struct sunxi_nand_chip, nand);
 249}
 250
 251/*
 252 * NAND Controller structure: stores sunxi NAND controller information
 253 *
 254 * @controller:         base controller structure
 255 * @dev:                parent device (used to print error messages)
 256 * @regs:               NAND controller registers
 257 * @ahb_clk:            NAND Controller AHB clock
 258 * @mod_clk:            NAND Controller mod clock
 259 * @assigned_cs:        bitmask describing already assigned CS lines
 260 * @clk_rate:           NAND controller current clock rate
 261 * @chips:              a list containing all the NAND chips attached to
 262 *                      this NAND controller
 263 * @complete:           a completion object used to wait for NAND
 264 *                      controller events
 265 */
 266struct sunxi_nfc {
 267        struct nand_hw_control controller;
 268        struct device *dev;
 269        void __iomem *regs;
 270        struct clk *ahb_clk;
 271        struct clk *mod_clk;
 272        unsigned long assigned_cs;
 273        unsigned long clk_rate;
 274        struct list_head chips;
 275        struct completion complete;
 276};
 277
 278static inline struct sunxi_nfc *to_sunxi_nfc(struct nand_hw_control *ctrl)
 279{
 280        return container_of(ctrl, struct sunxi_nfc, controller);
 281}
 282
 283static irqreturn_t sunxi_nfc_interrupt(int irq, void *dev_id)
 284{
 285        struct sunxi_nfc *nfc = dev_id;
 286        u32 st = readl(nfc->regs + NFC_REG_ST);
 287        u32 ien = readl(nfc->regs + NFC_REG_INT);
 288
 289        if (!(ien & st))
 290                return IRQ_NONE;
 291
 292        if ((ien & st) == ien)
 293                complete(&nfc->complete);
 294
 295        writel(st & NFC_INT_MASK, nfc->regs + NFC_REG_ST);
 296        writel(~st & ien & NFC_INT_MASK, nfc->regs + NFC_REG_INT);
 297
 298        return IRQ_HANDLED;
 299}
 300
 301static int sunxi_nfc_wait_int(struct sunxi_nfc *nfc, u32 flags,
 302                              unsigned int timeout_ms)
 303{
 304        init_completion(&nfc->complete);
 305
 306        writel(flags, nfc->regs + NFC_REG_INT);
 307
 308        if (!timeout_ms)
 309                timeout_ms = NFC_DEFAULT_TIMEOUT_MS;
 310
 311        if (!wait_for_completion_timeout(&nfc->complete,
 312                                         msecs_to_jiffies(timeout_ms))) {
 313                dev_err(nfc->dev, "wait interrupt timedout\n");
 314                return -ETIMEDOUT;
 315        }
 316
 317        return 0;
 318}
 319
 320static int sunxi_nfc_wait_cmd_fifo_empty(struct sunxi_nfc *nfc)
 321{
 322        unsigned long timeout = jiffies +
 323                                msecs_to_jiffies(NFC_DEFAULT_TIMEOUT_MS);
 324
 325        do {
 326                if (!(readl(nfc->regs + NFC_REG_ST) & NFC_CMD_FIFO_STATUS))
 327                        return 0;
 328        } while (time_before(jiffies, timeout));
 329
 330        dev_err(nfc->dev, "wait for empty cmd FIFO timedout\n");
 331        return -ETIMEDOUT;
 332}
 333
 334static int sunxi_nfc_rst(struct sunxi_nfc *nfc)
 335{
 336        unsigned long timeout = jiffies +
 337                                msecs_to_jiffies(NFC_DEFAULT_TIMEOUT_MS);
 338
 339        writel(0, nfc->regs + NFC_REG_ECC_CTL);
 340        writel(NFC_RESET, nfc->regs + NFC_REG_CTL);
 341
 342        do {
 343                if (!(readl(nfc->regs + NFC_REG_CTL) & NFC_RESET))
 344                        return 0;
 345        } while (time_before(jiffies, timeout));
 346
 347        dev_err(nfc->dev, "wait for NAND controller reset timedout\n");
 348        return -ETIMEDOUT;
 349}
 350
 351static int sunxi_nfc_dev_ready(struct mtd_info *mtd)
 352{
 353        struct nand_chip *nand = mtd_to_nand(mtd);
 354        struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
 355        struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
 356        struct sunxi_nand_rb *rb;
 357        unsigned long timeo = (sunxi_nand->nand.state == FL_ERASING ? 400 : 20);
 358        int ret;
 359
 360        if (sunxi_nand->selected < 0)
 361                return 0;
 362
 363        rb = &sunxi_nand->sels[sunxi_nand->selected].rb;
 364
 365        switch (rb->type) {
 366        case RB_NATIVE:
 367                ret = !!(readl(nfc->regs + NFC_REG_ST) &
 368                         NFC_RB_STATE(rb->info.nativeid));
 369                if (ret)
 370                        break;
 371
 372                sunxi_nfc_wait_int(nfc, NFC_RB_B2R, timeo);
 373                ret = !!(readl(nfc->regs + NFC_REG_ST) &
 374                         NFC_RB_STATE(rb->info.nativeid));
 375                break;
 376        case RB_GPIO:
 377                ret = gpio_get_value(rb->info.gpio);
 378                break;
 379        case RB_NONE:
 380        default:
 381                ret = 0;
 382                dev_err(nfc->dev, "cannot check R/B NAND status!\n");
 383                break;
 384        }
 385
 386        return ret;
 387}
 388
 389static void sunxi_nfc_select_chip(struct mtd_info *mtd, int chip)
 390{
 391        struct nand_chip *nand = mtd_to_nand(mtd);
 392        struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
 393        struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
 394        struct sunxi_nand_chip_sel *sel;
 395        u32 ctl;
 396
 397        if (chip > 0 && chip >= sunxi_nand->nsels)
 398                return;
 399
 400        if (chip == sunxi_nand->selected)
 401                return;
 402
 403        ctl = readl(nfc->regs + NFC_REG_CTL) &
 404              ~(NFC_PAGE_SHIFT_MSK | NFC_CE_SEL_MSK | NFC_RB_SEL_MSK | NFC_EN);
 405
 406        if (chip >= 0) {
 407                sel = &sunxi_nand->sels[chip];
 408
 409                ctl |= NFC_CE_SEL(sel->cs) | NFC_EN |
 410                       NFC_PAGE_SHIFT(nand->page_shift - 10);
 411                if (sel->rb.type == RB_NONE) {
 412                        nand->dev_ready = NULL;
 413                } else {
 414                        nand->dev_ready = sunxi_nfc_dev_ready;
 415                        if (sel->rb.type == RB_NATIVE)
 416                                ctl |= NFC_RB_SEL(sel->rb.info.nativeid);
 417                }
 418
 419                writel(mtd->writesize, nfc->regs + NFC_REG_SPARE_AREA);
 420
 421                if (nfc->clk_rate != sunxi_nand->clk_rate) {
 422                        clk_set_rate(nfc->mod_clk, sunxi_nand->clk_rate);
 423                        nfc->clk_rate = sunxi_nand->clk_rate;
 424                }
 425        }
 426
 427        writel(sunxi_nand->timing_ctl, nfc->regs + NFC_REG_TIMING_CTL);
 428        writel(sunxi_nand->timing_cfg, nfc->regs + NFC_REG_TIMING_CFG);
 429        writel(ctl, nfc->regs + NFC_REG_CTL);
 430
 431        sunxi_nand->selected = chip;
 432}
 433
 434static void sunxi_nfc_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
 435{
 436        struct nand_chip *nand = mtd_to_nand(mtd);
 437        struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
 438        struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
 439        int ret;
 440        int cnt;
 441        int offs = 0;
 442        u32 tmp;
 443
 444        while (len > offs) {
 445                cnt = min(len - offs, NFC_SRAM_SIZE);
 446
 447                ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
 448                if (ret)
 449                        break;
 450
 451                writel(cnt, nfc->regs + NFC_REG_CNT);
 452                tmp = NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD;
 453                writel(tmp, nfc->regs + NFC_REG_CMD);
 454
 455                ret = sunxi_nfc_wait_int(nfc, NFC_CMD_INT_FLAG, 0);
 456                if (ret)
 457                        break;
 458
 459                if (buf)
 460                        memcpy_fromio(buf + offs, nfc->regs + NFC_RAM0_BASE,
 461                                      cnt);
 462                offs += cnt;
 463        }
 464}
 465
 466static void sunxi_nfc_write_buf(struct mtd_info *mtd, const uint8_t *buf,
 467                                int len)
 468{
 469        struct nand_chip *nand = mtd_to_nand(mtd);
 470        struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
 471        struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
 472        int ret;
 473        int cnt;
 474        int offs = 0;
 475        u32 tmp;
 476
 477        while (len > offs) {
 478                cnt = min(len - offs, NFC_SRAM_SIZE);
 479
 480                ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
 481                if (ret)
 482                        break;
 483
 484                writel(cnt, nfc->regs + NFC_REG_CNT);
 485                memcpy_toio(nfc->regs + NFC_RAM0_BASE, buf + offs, cnt);
 486                tmp = NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD |
 487                      NFC_ACCESS_DIR;
 488                writel(tmp, nfc->regs + NFC_REG_CMD);
 489
 490                ret = sunxi_nfc_wait_int(nfc, NFC_CMD_INT_FLAG, 0);
 491                if (ret)
 492                        break;
 493
 494                offs += cnt;
 495        }
 496}
 497
 498static uint8_t sunxi_nfc_read_byte(struct mtd_info *mtd)
 499{
 500        uint8_t ret;
 501
 502        sunxi_nfc_read_buf(mtd, &ret, 1);
 503
 504        return ret;
 505}
 506
 507static void sunxi_nfc_cmd_ctrl(struct mtd_info *mtd, int dat,
 508                               unsigned int ctrl)
 509{
 510        struct nand_chip *nand = mtd_to_nand(mtd);
 511        struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
 512        struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
 513        int ret;
 514        u32 tmp;
 515
 516        ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
 517        if (ret)
 518                return;
 519
 520        if (ctrl & NAND_CTRL_CHANGE) {
 521                tmp = readl(nfc->regs + NFC_REG_CTL);
 522                if (ctrl & NAND_NCE)
 523                        tmp |= NFC_CE_CTL;
 524                else
 525                        tmp &= ~NFC_CE_CTL;
 526                writel(tmp, nfc->regs + NFC_REG_CTL);
 527        }
 528
 529        if (dat == NAND_CMD_NONE)
 530                return;
 531
 532        if (ctrl & NAND_CLE) {
 533                writel(NFC_SEND_CMD1 | dat, nfc->regs + NFC_REG_CMD);
 534        } else {
 535                writel(dat, nfc->regs + NFC_REG_ADDR_LOW);
 536                writel(NFC_SEND_ADR, nfc->regs + NFC_REG_CMD);
 537        }
 538
 539        sunxi_nfc_wait_int(nfc, NFC_CMD_INT_FLAG, 0);
 540}
 541
 542/* These seed values have been extracted from Allwinner's BSP */
 543static const u16 sunxi_nfc_randomizer_page_seeds[] = {
 544        0x2b75, 0x0bd0, 0x5ca3, 0x62d1, 0x1c93, 0x07e9, 0x2162, 0x3a72,
 545        0x0d67, 0x67f9, 0x1be7, 0x077d, 0x032f, 0x0dac, 0x2716, 0x2436,
 546        0x7922, 0x1510, 0x3860, 0x5287, 0x480f, 0x4252, 0x1789, 0x5a2d,
 547        0x2a49, 0x5e10, 0x437f, 0x4b4e, 0x2f45, 0x216e, 0x5cb7, 0x7130,
 548        0x2a3f, 0x60e4, 0x4dc9, 0x0ef0, 0x0f52, 0x1bb9, 0x6211, 0x7a56,
 549        0x226d, 0x4ea7, 0x6f36, 0x3692, 0x38bf, 0x0c62, 0x05eb, 0x4c55,
 550        0x60f4, 0x728c, 0x3b6f, 0x2037, 0x7f69, 0x0936, 0x651a, 0x4ceb,
 551        0x6218, 0x79f3, 0x383f, 0x18d9, 0x4f05, 0x5c82, 0x2912, 0x6f17,
 552        0x6856, 0x5938, 0x1007, 0x61ab, 0x3e7f, 0x57c2, 0x542f, 0x4f62,
 553        0x7454, 0x2eac, 0x7739, 0x42d4, 0x2f90, 0x435a, 0x2e52, 0x2064,
 554        0x637c, 0x66ad, 0x2c90, 0x0bad, 0x759c, 0x0029, 0x0986, 0x7126,
 555        0x1ca7, 0x1605, 0x386a, 0x27f5, 0x1380, 0x6d75, 0x24c3, 0x0f8e,
 556        0x2b7a, 0x1418, 0x1fd1, 0x7dc1, 0x2d8e, 0x43af, 0x2267, 0x7da3,
 557        0x4e3d, 0x1338, 0x50db, 0x454d, 0x764d, 0x40a3, 0x42e6, 0x262b,
 558        0x2d2e, 0x1aea, 0x2e17, 0x173d, 0x3a6e, 0x71bf, 0x25f9, 0x0a5d,
 559        0x7c57, 0x0fbe, 0x46ce, 0x4939, 0x6b17, 0x37bb, 0x3e91, 0x76db,
 560};
 561
 562/*
 563 * sunxi_nfc_randomizer_ecc512_seeds and sunxi_nfc_randomizer_ecc1024_seeds
 564 * have been generated using
 565 * sunxi_nfc_randomizer_step(seed, (step_size * 8) + 15), which is what
 566 * the randomizer engine does internally before de/scrambling OOB data.
 567 *
 568 * Those tables are statically defined to avoid calculating randomizer state
 569 * at runtime.
 570 */
 571static const u16 sunxi_nfc_randomizer_ecc512_seeds[] = {
 572        0x3346, 0x367f, 0x1f18, 0x769a, 0x4f64, 0x068c, 0x2ef1, 0x6b64,
 573        0x28a9, 0x15d7, 0x30f8, 0x3659, 0x53db, 0x7c5f, 0x71d4, 0x4409,
 574        0x26eb, 0x03cc, 0x655d, 0x47d4, 0x4daa, 0x0877, 0x712d, 0x3617,
 575        0x3264, 0x49aa, 0x7f9e, 0x588e, 0x4fbc, 0x7176, 0x7f91, 0x6c6d,
 576        0x4b95, 0x5fb7, 0x3844, 0x4037, 0x0184, 0x081b, 0x0ee8, 0x5b91,
 577        0x293d, 0x1f71, 0x0e6f, 0x402b, 0x5122, 0x1e52, 0x22be, 0x3d2d,
 578        0x75bc, 0x7c60, 0x6291, 0x1a2f, 0x61d4, 0x74aa, 0x4140, 0x29ab,
 579        0x472d, 0x2852, 0x017e, 0x15e8, 0x5ec2, 0x17cf, 0x7d0f, 0x06b8,
 580        0x117a, 0x6b94, 0x789b, 0x3126, 0x6ac5, 0x5be7, 0x150f, 0x51f8,
 581        0x7889, 0x0aa5, 0x663d, 0x77e8, 0x0b87, 0x3dcb, 0x360d, 0x218b,
 582        0x512f, 0x7dc9, 0x6a4d, 0x630a, 0x3547, 0x1dd2, 0x5aea, 0x69a5,
 583        0x7bfa, 0x5e4f, 0x1519, 0x6430, 0x3a0e, 0x5eb3, 0x5425, 0x0c7a,
 584        0x5540, 0x3670, 0x63c1, 0x31e9, 0x5a39, 0x2de7, 0x5979, 0x2891,
 585        0x1562, 0x014b, 0x5b05, 0x2756, 0x5a34, 0x13aa, 0x6cb5, 0x2c36,
 586        0x5e72, 0x1306, 0x0861, 0x15ef, 0x1ee8, 0x5a37, 0x7ac4, 0x45dd,
 587        0x44c4, 0x7266, 0x2f41, 0x3ccc, 0x045e, 0x7d40, 0x7c66, 0x0fa0,
 588};
 589
 590static const u16 sunxi_nfc_randomizer_ecc1024_seeds[] = {
 591        0x2cf5, 0x35f1, 0x63a4, 0x5274, 0x2bd2, 0x778b, 0x7285, 0x32b6,
 592        0x6a5c, 0x70d6, 0x757d, 0x6769, 0x5375, 0x1e81, 0x0cf3, 0x3982,
 593        0x6787, 0x042a, 0x6c49, 0x1925, 0x56a8, 0x40a9, 0x063e, 0x7bd9,
 594        0x4dbf, 0x55ec, 0x672e, 0x7334, 0x5185, 0x4d00, 0x232a, 0x7e07,
 595        0x445d, 0x6b92, 0x528f, 0x4255, 0x53ba, 0x7d82, 0x2a2e, 0x3a4e,
 596        0x75eb, 0x450c, 0x6844, 0x1b5d, 0x581a, 0x4cc6, 0x0379, 0x37b2,
 597        0x419f, 0x0e92, 0x6b27, 0x5624, 0x01e3, 0x07c1, 0x44a5, 0x130c,
 598        0x13e8, 0x5910, 0x0876, 0x60c5, 0x54e3, 0x5b7f, 0x2269, 0x509f,
 599        0x7665, 0x36fd, 0x3e9a, 0x0579, 0x6295, 0x14ef, 0x0a81, 0x1bcc,
 600        0x4b16, 0x64db, 0x0514, 0x4f07, 0x0591, 0x3576, 0x6853, 0x0d9e,
 601        0x259f, 0x38b7, 0x64fb, 0x3094, 0x4693, 0x6ddd, 0x29bb, 0x0bc8,
 602        0x3f47, 0x490e, 0x0c0e, 0x7933, 0x3c9e, 0x5840, 0x398d, 0x3e68,
 603        0x4af1, 0x71f5, 0x57cf, 0x1121, 0x64eb, 0x3579, 0x15ac, 0x584d,
 604        0x5f2a, 0x47e2, 0x6528, 0x6eac, 0x196e, 0x6b96, 0x0450, 0x0179,
 605        0x609c, 0x06e1, 0x4626, 0x42c7, 0x273e, 0x486f, 0x0705, 0x1601,
 606        0x145b, 0x407e, 0x062b, 0x57a5, 0x53f9, 0x5659, 0x4410, 0x3ccd,
 607};
 608
 609static u16 sunxi_nfc_randomizer_step(u16 state, int count)
 610{
 611        state &= 0x7fff;
 612
 613        /*
 614         * This loop is just a simple implementation of a Fibonacci LFSR using
 615         * the x16 + x15 + 1 polynomial.
 616         */
 617        while (count--)
 618                state = ((state >> 1) |
 619                         (((state ^ (state >> 1)) & 1) << 14)) & 0x7fff;
 620
 621        return state;
 622}
 623
 624static u16 sunxi_nfc_randomizer_state(struct mtd_info *mtd, int page, bool ecc)
 625{
 626        const u16 *seeds = sunxi_nfc_randomizer_page_seeds;
 627        int mod = mtd_div_by_ws(mtd->erasesize, mtd);
 628
 629        if (mod > ARRAY_SIZE(sunxi_nfc_randomizer_page_seeds))
 630                mod = ARRAY_SIZE(sunxi_nfc_randomizer_page_seeds);
 631
 632        if (ecc) {
 633                if (mtd->ecc_step_size == 512)
 634                        seeds = sunxi_nfc_randomizer_ecc512_seeds;
 635                else
 636                        seeds = sunxi_nfc_randomizer_ecc1024_seeds;
 637        }
 638
 639        return seeds[page % mod];
 640}
 641
 642static void sunxi_nfc_randomizer_config(struct mtd_info *mtd,
 643                                        int page, bool ecc)
 644{
 645        struct nand_chip *nand = mtd_to_nand(mtd);
 646        struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
 647        u32 ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL);
 648        u16 state;
 649
 650        if (!(nand->options & NAND_NEED_SCRAMBLING))
 651                return;
 652
 653        ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL);
 654        state = sunxi_nfc_randomizer_state(mtd, page, ecc);
 655        ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL) & ~NFC_RANDOM_SEED_MSK;
 656        writel(ecc_ctl | NFC_RANDOM_SEED(state), nfc->regs + NFC_REG_ECC_CTL);
 657}
 658
 659static void sunxi_nfc_randomizer_enable(struct mtd_info *mtd)
 660{
 661        struct nand_chip *nand = mtd_to_nand(mtd);
 662        struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
 663
 664        if (!(nand->options & NAND_NEED_SCRAMBLING))
 665                return;
 666
 667        writel(readl(nfc->regs + NFC_REG_ECC_CTL) | NFC_RANDOM_EN,
 668               nfc->regs + NFC_REG_ECC_CTL);
 669}
 670
 671static void sunxi_nfc_randomizer_disable(struct mtd_info *mtd)
 672{
 673        struct nand_chip *nand = mtd_to_nand(mtd);
 674        struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
 675
 676        if (!(nand->options & NAND_NEED_SCRAMBLING))
 677                return;
 678
 679        writel(readl(nfc->regs + NFC_REG_ECC_CTL) & ~NFC_RANDOM_EN,
 680               nfc->regs + NFC_REG_ECC_CTL);
 681}
 682
 683static void sunxi_nfc_randomize_bbm(struct mtd_info *mtd, int page, u8 *bbm)
 684{
 685        u16 state = sunxi_nfc_randomizer_state(mtd, page, true);
 686
 687        bbm[0] ^= state;
 688        bbm[1] ^= sunxi_nfc_randomizer_step(state, 8);
 689}
 690
 691static void sunxi_nfc_randomizer_write_buf(struct mtd_info *mtd,
 692                                           const uint8_t *buf, int len,
 693                                           bool ecc, int page)
 694{
 695        sunxi_nfc_randomizer_config(mtd, page, ecc);
 696        sunxi_nfc_randomizer_enable(mtd);
 697        sunxi_nfc_write_buf(mtd, buf, len);
 698        sunxi_nfc_randomizer_disable(mtd);
 699}
 700
 701static void sunxi_nfc_randomizer_read_buf(struct mtd_info *mtd, uint8_t *buf,
 702                                          int len, bool ecc, int page)
 703{
 704        sunxi_nfc_randomizer_config(mtd, page, ecc);
 705        sunxi_nfc_randomizer_enable(mtd);
 706        sunxi_nfc_read_buf(mtd, buf, len);
 707        sunxi_nfc_randomizer_disable(mtd);
 708}
 709
 710static void sunxi_nfc_hw_ecc_enable(struct mtd_info *mtd)
 711{
 712        struct nand_chip *nand = mtd_to_nand(mtd);
 713        struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
 714        struct sunxi_nand_hw_ecc *data = nand->ecc.priv;
 715        u32 ecc_ctl;
 716
 717        ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL);
 718        ecc_ctl &= ~(NFC_ECC_MODE_MSK | NFC_ECC_PIPELINE |
 719                     NFC_ECC_BLOCK_SIZE_MSK);
 720        ecc_ctl |= NFC_ECC_EN | NFC_ECC_MODE(data->mode) | NFC_ECC_EXCEPTION;
 721
 722        writel(ecc_ctl, nfc->regs + NFC_REG_ECC_CTL);
 723}
 724
 725static void sunxi_nfc_hw_ecc_disable(struct mtd_info *mtd)
 726{
 727        struct nand_chip *nand = mtd_to_nand(mtd);
 728        struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
 729
 730        writel(readl(nfc->regs + NFC_REG_ECC_CTL) & ~NFC_ECC_EN,
 731               nfc->regs + NFC_REG_ECC_CTL);
 732}
 733
 734static inline void sunxi_nfc_user_data_to_buf(u32 user_data, u8 *buf)
 735{
 736        buf[0] = user_data;
 737        buf[1] = user_data >> 8;
 738        buf[2] = user_data >> 16;
 739        buf[3] = user_data >> 24;
 740}
 741
 742static int sunxi_nfc_hw_ecc_read_chunk(struct mtd_info *mtd,
 743                                       u8 *data, int data_off,
 744                                       u8 *oob, int oob_off,
 745                                       int *cur_off,
 746                                       unsigned int *max_bitflips,
 747                                       bool bbm, int page)
 748{
 749        struct nand_chip *nand = mtd_to_nand(mtd);
 750        struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
 751        struct nand_ecc_ctrl *ecc = &nand->ecc;
 752        int raw_mode = 0;
 753        u32 status;
 754        int ret;
 755
 756        if (*cur_off != data_off)
 757                nand->cmdfunc(mtd, NAND_CMD_RNDOUT, data_off, -1);
 758
 759        sunxi_nfc_randomizer_read_buf(mtd, NULL, ecc->size, false, page);
 760
 761        if (data_off + ecc->size != oob_off)
 762                nand->cmdfunc(mtd, NAND_CMD_RNDOUT, oob_off, -1);
 763
 764        ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
 765        if (ret)
 766                return ret;
 767
 768        sunxi_nfc_randomizer_enable(mtd);
 769        writel(NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD | NFC_ECC_OP,
 770               nfc->regs + NFC_REG_CMD);
 771
 772        ret = sunxi_nfc_wait_int(nfc, NFC_CMD_INT_FLAG, 0);
 773        sunxi_nfc_randomizer_disable(mtd);
 774        if (ret)
 775                return ret;
 776
 777        *cur_off = oob_off + ecc->bytes + 4;
 778
 779        status = readl(nfc->regs + NFC_REG_ECC_ST);
 780        if (status & NFC_ECC_PAT_FOUND(0)) {
 781                u8 pattern = 0xff;
 782
 783                if (unlikely(!(readl(nfc->regs + NFC_REG_PAT_ID) & 0x1)))
 784                        pattern = 0x0;
 785
 786                memset(data, pattern, ecc->size);
 787                memset(oob, pattern, ecc->bytes + 4);
 788
 789                return 1;
 790        }
 791
 792        ret = NFC_ECC_ERR_CNT(0, readl(nfc->regs + NFC_REG_ECC_ERR_CNT(0)));
 793
 794        memcpy_fromio(data, nfc->regs + NFC_RAM0_BASE, ecc->size);
 795
 796        nand->cmdfunc(mtd, NAND_CMD_RNDOUT, oob_off, -1);
 797        sunxi_nfc_randomizer_read_buf(mtd, oob, ecc->bytes + 4, true, page);
 798
 799        if (status & NFC_ECC_ERR(0)) {
 800                /*
 801                 * Re-read the data with the randomizer disabled to identify
 802                 * bitflips in erased pages.
 803                 */
 804                if (nand->options & NAND_NEED_SCRAMBLING) {
 805                        nand->cmdfunc(mtd, NAND_CMD_RNDOUT, data_off, -1);
 806                        nand->read_buf(mtd, data, ecc->size);
 807                        nand->cmdfunc(mtd, NAND_CMD_RNDOUT, oob_off, -1);
 808                        nand->read_buf(mtd, oob, ecc->bytes + 4);
 809                }
 810
 811                ret = nand_check_erased_ecc_chunk(data, ecc->size,
 812                                                  oob, ecc->bytes + 4,
 813                                                  NULL, 0, ecc->strength);
 814                if (ret >= 0)
 815                        raw_mode = 1;
 816        } else {
 817                /*
 818                 * The engine protects 4 bytes of OOB data per chunk.
 819                 * Retrieve the corrected OOB bytes.
 820                 */
 821                sunxi_nfc_user_data_to_buf(readl(nfc->regs + NFC_REG_USER_DATA(0)),
 822                                           oob);
 823
 824                /* De-randomize the Bad Block Marker. */
 825                if (bbm && nand->options & NAND_NEED_SCRAMBLING)
 826                        sunxi_nfc_randomize_bbm(mtd, page, oob);
 827        }
 828
 829        if (ret < 0) {
 830                mtd->ecc_stats.failed++;
 831        } else {
 832                mtd->ecc_stats.corrected += ret;
 833                *max_bitflips = max_t(unsigned int, *max_bitflips, ret);
 834        }
 835
 836        return raw_mode;
 837}
 838
 839static void sunxi_nfc_hw_ecc_read_extra_oob(struct mtd_info *mtd,
 840                                            u8 *oob, int *cur_off,
 841                                            bool randomize, int page)
 842{
 843        struct nand_chip *nand = mtd_to_nand(mtd);
 844        struct nand_ecc_ctrl *ecc = &nand->ecc;
 845        int offset = ((ecc->bytes + 4) * ecc->steps);
 846        int len = mtd->oobsize - offset;
 847
 848        if (len <= 0)
 849                return;
 850
 851        if (*cur_off != offset)
 852                nand->cmdfunc(mtd, NAND_CMD_RNDOUT,
 853                              offset + mtd->writesize, -1);
 854
 855        if (!randomize)
 856                sunxi_nfc_read_buf(mtd, oob + offset, len);
 857        else
 858                sunxi_nfc_randomizer_read_buf(mtd, oob + offset, len,
 859                                              false, page);
 860
 861        *cur_off = mtd->oobsize + mtd->writesize;
 862}
 863
 864static inline u32 sunxi_nfc_buf_to_user_data(const u8 *buf)
 865{
 866        return buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
 867}
 868
 869static int sunxi_nfc_hw_ecc_write_chunk(struct mtd_info *mtd,
 870                                        const u8 *data, int data_off,
 871                                        const u8 *oob, int oob_off,
 872                                        int *cur_off, bool bbm,
 873                                        int page)
 874{
 875        struct nand_chip *nand = mtd_to_nand(mtd);
 876        struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
 877        struct nand_ecc_ctrl *ecc = &nand->ecc;
 878        int ret;
 879
 880        if (data_off != *cur_off)
 881                nand->cmdfunc(mtd, NAND_CMD_RNDIN, data_off, -1);
 882
 883        sunxi_nfc_randomizer_write_buf(mtd, data, ecc->size, false, page);
 884
 885        /* Fill OOB data in */
 886        if ((nand->options & NAND_NEED_SCRAMBLING) && bbm) {
 887                u8 user_data[4];
 888
 889                memcpy(user_data, oob, 4);
 890                sunxi_nfc_randomize_bbm(mtd, page, user_data);
 891                writel(sunxi_nfc_buf_to_user_data(user_data),
 892                       nfc->regs + NFC_REG_USER_DATA(0));
 893        } else {
 894                writel(sunxi_nfc_buf_to_user_data(oob),
 895                       nfc->regs + NFC_REG_USER_DATA(0));
 896        }
 897
 898        if (data_off + ecc->size != oob_off)
 899                nand->cmdfunc(mtd, NAND_CMD_RNDIN, oob_off, -1);
 900
 901        ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
 902        if (ret)
 903                return ret;
 904
 905        sunxi_nfc_randomizer_enable(mtd);
 906        writel(NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD |
 907               NFC_ACCESS_DIR | NFC_ECC_OP,
 908               nfc->regs + NFC_REG_CMD);
 909
 910        ret = sunxi_nfc_wait_int(nfc, NFC_CMD_INT_FLAG, 0);
 911        sunxi_nfc_randomizer_disable(mtd);
 912        if (ret)
 913                return ret;
 914
 915        *cur_off = oob_off + ecc->bytes + 4;
 916
 917        return 0;
 918}
 919
 920static void sunxi_nfc_hw_ecc_write_extra_oob(struct mtd_info *mtd,
 921                                             u8 *oob, int *cur_off,
 922                                             int page)
 923{
 924        struct nand_chip *nand = mtd_to_nand(mtd);
 925        struct nand_ecc_ctrl *ecc = &nand->ecc;
 926        int offset = ((ecc->bytes + 4) * ecc->steps);
 927        int len = mtd->oobsize - offset;
 928
 929        if (len <= 0)
 930                return;
 931
 932        if (*cur_off != offset)
 933                nand->cmdfunc(mtd, NAND_CMD_RNDIN,
 934                              offset + mtd->writesize, -1);
 935
 936        sunxi_nfc_randomizer_write_buf(mtd, oob + offset, len, false, page);
 937
 938        *cur_off = mtd->oobsize + mtd->writesize;
 939}
 940
 941static int sunxi_nfc_hw_ecc_read_page(struct mtd_info *mtd,
 942                                      struct nand_chip *chip, uint8_t *buf,
 943                                      int oob_required, int page)
 944{
 945        struct nand_ecc_ctrl *ecc = &chip->ecc;
 946        unsigned int max_bitflips = 0;
 947        int ret, i, cur_off = 0;
 948        bool raw_mode = false;
 949
 950        sunxi_nfc_hw_ecc_enable(mtd);
 951
 952        for (i = 0; i < ecc->steps; i++) {
 953                int data_off = i * ecc->size;
 954                int oob_off = i * (ecc->bytes + 4);
 955                u8 *data = buf + data_off;
 956                u8 *oob = chip->oob_poi + oob_off;
 957
 958                ret = sunxi_nfc_hw_ecc_read_chunk(mtd, data, data_off, oob,
 959                                                  oob_off + mtd->writesize,
 960                                                  &cur_off, &max_bitflips,
 961                                                  !i, page);
 962                if (ret < 0)
 963                        return ret;
 964                else if (ret)
 965                        raw_mode = true;
 966        }
 967
 968        if (oob_required)
 969                sunxi_nfc_hw_ecc_read_extra_oob(mtd, chip->oob_poi, &cur_off,
 970                                                !raw_mode, page);
 971
 972        sunxi_nfc_hw_ecc_disable(mtd);
 973
 974        return max_bitflips;
 975}
 976
 977static int sunxi_nfc_hw_ecc_write_page(struct mtd_info *mtd,
 978                                       struct nand_chip *chip,
 979                                       const uint8_t *buf, int oob_required,
 980                                       int page)
 981{
 982        struct nand_ecc_ctrl *ecc = &chip->ecc;
 983        int ret, i, cur_off = 0;
 984
 985        sunxi_nfc_hw_ecc_enable(mtd);
 986
 987        for (i = 0; i < ecc->steps; i++) {
 988                int data_off = i * ecc->size;
 989                int oob_off = i * (ecc->bytes + 4);
 990                const u8 *data = buf + data_off;
 991                const u8 *oob = chip->oob_poi + oob_off;
 992
 993                ret = sunxi_nfc_hw_ecc_write_chunk(mtd, data, data_off, oob,
 994                                                   oob_off + mtd->writesize,
 995                                                   &cur_off, !i, page);
 996                if (ret)
 997                        return ret;
 998        }
 999
1000        if (oob_required || (chip->options & NAND_NEED_SCRAMBLING))
1001                sunxi_nfc_hw_ecc_write_extra_oob(mtd, chip->oob_poi,
1002                                                 &cur_off, page);
1003
1004        sunxi_nfc_hw_ecc_disable(mtd);
1005
1006        return 0;
1007}
1008
1009static int sunxi_nfc_hw_syndrome_ecc_read_page(struct mtd_info *mtd,
1010                                               struct nand_chip *chip,
1011                                               uint8_t *buf, int oob_required,
1012                                               int page)
1013{
1014        struct nand_ecc_ctrl *ecc = &chip->ecc;
1015        unsigned int max_bitflips = 0;
1016        int ret, i, cur_off = 0;
1017        bool raw_mode = false;
1018
1019        sunxi_nfc_hw_ecc_enable(mtd);
1020
1021        for (i = 0; i < ecc->steps; i++) {
1022                int data_off = i * (ecc->size + ecc->bytes + 4);
1023                int oob_off = data_off + ecc->size;
1024                u8 *data = buf + (i * ecc->size);
1025                u8 *oob = chip->oob_poi + (i * (ecc->bytes + 4));
1026
1027                ret = sunxi_nfc_hw_ecc_read_chunk(mtd, data, data_off, oob,
1028                                                  oob_off, &cur_off,
1029                                                  &max_bitflips, !i, page);
1030                if (ret < 0)
1031                        return ret;
1032                else if (ret)
1033                        raw_mode = true;
1034        }
1035
1036        if (oob_required)
1037                sunxi_nfc_hw_ecc_read_extra_oob(mtd, chip->oob_poi, &cur_off,
1038                                                !raw_mode, page);
1039
1040        sunxi_nfc_hw_ecc_disable(mtd);
1041
1042        return max_bitflips;
1043}
1044
1045static int sunxi_nfc_hw_syndrome_ecc_write_page(struct mtd_info *mtd,
1046                                                struct nand_chip *chip,
1047                                                const uint8_t *buf,
1048                                                int oob_required, int page)
1049{
1050        struct nand_ecc_ctrl *ecc = &chip->ecc;
1051        int ret, i, cur_off = 0;
1052
1053        sunxi_nfc_hw_ecc_enable(mtd);
1054
1055        for (i = 0; i < ecc->steps; i++) {
1056                int data_off = i * (ecc->size + ecc->bytes + 4);
1057                int oob_off = data_off + ecc->size;
1058                const u8 *data = buf + (i * ecc->size);
1059                const u8 *oob = chip->oob_poi + (i * (ecc->bytes + 4));
1060
1061                ret = sunxi_nfc_hw_ecc_write_chunk(mtd, data, data_off,
1062                                                   oob, oob_off, &cur_off,
1063                                                   false, page);
1064                if (ret)
1065                        return ret;
1066        }
1067
1068        if (oob_required || (chip->options & NAND_NEED_SCRAMBLING))
1069                sunxi_nfc_hw_ecc_write_extra_oob(mtd, chip->oob_poi,
1070                                                 &cur_off, page);
1071
1072        sunxi_nfc_hw_ecc_disable(mtd);
1073
1074        return 0;
1075}
1076
1077static const s32 tWB_lut[] = {6, 12, 16, 20};
1078static const s32 tRHW_lut[] = {4, 8, 12, 20};
1079
1080static int _sunxi_nand_lookup_timing(const s32 *lut, int lut_size, u32 duration,
1081                u32 clk_period)
1082{
1083        u32 clk_cycles = DIV_ROUND_UP(duration, clk_period);
1084        int i;
1085
1086        for (i = 0; i < lut_size; i++) {
1087                if (clk_cycles <= lut[i])
1088                        return i;
1089        }
1090
1091        /* Doesn't fit */
1092        return -EINVAL;
1093}
1094
1095#define sunxi_nand_lookup_timing(l, p, c) \
1096                        _sunxi_nand_lookup_timing(l, ARRAY_SIZE(l), p, c)
1097
1098static int sunxi_nand_chip_set_timings(struct sunxi_nand_chip *chip,
1099                                       const struct nand_sdr_timings *timings)
1100{
1101        struct sunxi_nfc *nfc = to_sunxi_nfc(chip->nand.controller);
1102        u32 min_clk_period = 0;
1103        s32 tWB, tADL, tWHR, tRHW, tCAD;
1104
1105        /* T1 <=> tCLS */
1106        if (timings->tCLS_min > min_clk_period)
1107                min_clk_period = timings->tCLS_min;
1108
1109        /* T2 <=> tCLH */
1110        if (timings->tCLH_min > min_clk_period)
1111                min_clk_period = timings->tCLH_min;
1112
1113        /* T3 <=> tCS */
1114        if (timings->tCS_min > min_clk_period)
1115                min_clk_period = timings->tCS_min;
1116
1117        /* T4 <=> tCH */
1118        if (timings->tCH_min > min_clk_period)
1119                min_clk_period = timings->tCH_min;
1120
1121        /* T5 <=> tWP */
1122        if (timings->tWP_min > min_clk_period)
1123                min_clk_period = timings->tWP_min;
1124
1125        /* T6 <=> tWH */
1126        if (timings->tWH_min > min_clk_period)
1127                min_clk_period = timings->tWH_min;
1128
1129        /* T7 <=> tALS */
1130        if (timings->tALS_min > min_clk_period)
1131                min_clk_period = timings->tALS_min;
1132
1133        /* T8 <=> tDS */
1134        if (timings->tDS_min > min_clk_period)
1135                min_clk_period = timings->tDS_min;
1136
1137        /* T9 <=> tDH */
1138        if (timings->tDH_min > min_clk_period)
1139                min_clk_period = timings->tDH_min;
1140
1141        /* T10 <=> tRR */
1142        if (timings->tRR_min > (min_clk_period * 3))
1143                min_clk_period = DIV_ROUND_UP(timings->tRR_min, 3);
1144
1145        /* T11 <=> tALH */
1146        if (timings->tALH_min > min_clk_period)
1147                min_clk_period = timings->tALH_min;
1148
1149        /* T12 <=> tRP */
1150        if (timings->tRP_min > min_clk_period)
1151                min_clk_period = timings->tRP_min;
1152
1153        /* T13 <=> tREH */
1154        if (timings->tREH_min > min_clk_period)
1155                min_clk_period = timings->tREH_min;
1156
1157        /* T14 <=> tRC */
1158        if (timings->tRC_min > (min_clk_period * 2))
1159                min_clk_period = DIV_ROUND_UP(timings->tRC_min, 2);
1160
1161        /* T15 <=> tWC */
1162        if (timings->tWC_min > (min_clk_period * 2))
1163                min_clk_period = DIV_ROUND_UP(timings->tWC_min, 2);
1164
1165        /* T16 - T19 + tCAD */
1166        tWB  = sunxi_nand_lookup_timing(tWB_lut, timings->tWB_max,
1167                                        min_clk_period);
1168        if (tWB < 0) {
1169                dev_err(nfc->dev, "unsupported tWB\n");
1170                return tWB;
1171        }
1172
1173        tADL = DIV_ROUND_UP(timings->tADL_min, min_clk_period) >> 3;
1174        if (tADL > 3) {
1175                dev_err(nfc->dev, "unsupported tADL\n");
1176                return -EINVAL;
1177        }
1178
1179        tWHR = DIV_ROUND_UP(timings->tWHR_min, min_clk_period) >> 3;
1180        if (tWHR > 3) {
1181                dev_err(nfc->dev, "unsupported tWHR\n");
1182                return -EINVAL;
1183        }
1184
1185        tRHW = sunxi_nand_lookup_timing(tRHW_lut, timings->tRHW_min,
1186                                        min_clk_period);
1187        if (tRHW < 0) {
1188                dev_err(nfc->dev, "unsupported tRHW\n");
1189                return tRHW;
1190        }
1191
1192        /*
1193         * TODO: according to ONFI specs this value only applies for DDR NAND,
1194         * but Allwinner seems to set this to 0x7. Mimic them for now.
1195         */
1196        tCAD = 0x7;
1197
1198        /* TODO: A83 has some more bits for CDQSS, CS, CLHZ, CCS, WC */
1199        chip->timing_cfg = NFC_TIMING_CFG(tWB, tADL, tWHR, tRHW, tCAD);
1200
1201        /*
1202         * ONFI specification 3.1, paragraph 4.15.2 dictates that EDO data
1203         * output cycle timings shall be used if the host drives tRC less than
1204         * 30 ns.
1205         */
1206        chip->timing_ctl = (timings->tRC_min < 30000) ? NFC_TIMING_CTL_EDO : 0;
1207
1208        /* Convert min_clk_period from picoseconds to nanoseconds */
1209        min_clk_period = DIV_ROUND_UP(min_clk_period, 1000);
1210
1211        /*
1212         * Convert min_clk_period into a clk frequency, then get the
1213         * appropriate rate for the NAND controller IP given this formula
1214         * (specified in the datasheet):
1215         * nand clk_rate = 2 * min_clk_rate
1216         */
1217        chip->clk_rate = (2 * NSEC_PER_SEC) / min_clk_period;
1218
1219        return 0;
1220}
1221
1222static int sunxi_nand_chip_init_timings(struct sunxi_nand_chip *chip,
1223                                        struct device_node *np)
1224{
1225        struct mtd_info *mtd = nand_to_mtd(&chip->nand);
1226        const struct nand_sdr_timings *timings;
1227        int ret;
1228        int mode;
1229
1230        mode = onfi_get_async_timing_mode(&chip->nand);
1231        if (mode == ONFI_TIMING_MODE_UNKNOWN) {
1232                mode = chip->nand.onfi_timing_mode_default;
1233        } else {
1234                uint8_t feature[ONFI_SUBFEATURE_PARAM_LEN] = {};
1235                int i;
1236
1237                mode = fls(mode) - 1;
1238                if (mode < 0)
1239                        mode = 0;
1240
1241                feature[0] = mode;
1242                for (i = 0; i < chip->nsels; i++) {
1243                        chip->nand.select_chip(mtd, i);
1244                        ret = chip->nand.onfi_set_features(mtd, &chip->nand,
1245                                                ONFI_FEATURE_ADDR_TIMING_MODE,
1246                                                feature);
1247                        chip->nand.select_chip(mtd, -1);
1248                        if (ret)
1249                                return ret;
1250                }
1251        }
1252
1253        timings = onfi_async_timing_mode_to_sdr_timings(mode);
1254        if (IS_ERR(timings))
1255                return PTR_ERR(timings);
1256
1257        return sunxi_nand_chip_set_timings(chip, timings);
1258}
1259
1260static int sunxi_nand_hw_common_ecc_ctrl_init(struct mtd_info *mtd,
1261                                              struct nand_ecc_ctrl *ecc,
1262                                              struct device_node *np)
1263{
1264        static const u8 strengths[] = { 16, 24, 28, 32, 40, 48, 56, 60, 64 };
1265        struct nand_chip *nand = mtd_to_nand(mtd);
1266        struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
1267        struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
1268        struct sunxi_nand_hw_ecc *data;
1269        struct nand_ecclayout *layout;
1270        int nsectors;
1271        int ret;
1272        int i;
1273
1274        data = kzalloc(sizeof(*data), GFP_KERNEL);
1275        if (!data)
1276                return -ENOMEM;
1277
1278        /* Add ECC info retrieval from DT */
1279        for (i = 0; i < ARRAY_SIZE(strengths); i++) {
1280                if (ecc->strength <= strengths[i])
1281                        break;
1282        }
1283
1284        if (i >= ARRAY_SIZE(strengths)) {
1285                dev_err(nfc->dev, "unsupported strength\n");
1286                ret = -ENOTSUPP;
1287                goto err;
1288        }
1289
1290        data->mode = i;
1291
1292        /* HW ECC always request ECC bytes for 1024 bytes blocks */
1293        ecc->bytes = DIV_ROUND_UP(ecc->strength * fls(8 * 1024), 8);
1294
1295        /* HW ECC always work with even numbers of ECC bytes */
1296        ecc->bytes = ALIGN(ecc->bytes, 2);
1297
1298        layout = &data->layout;
1299        nsectors = mtd->writesize / ecc->size;
1300
1301        if (mtd->oobsize < ((ecc->bytes + 4) * nsectors)) {
1302                ret = -EINVAL;
1303                goto err;
1304        }
1305
1306        layout->eccbytes = (ecc->bytes * nsectors);
1307
1308        ecc->layout = layout;
1309        ecc->priv = data;
1310
1311        return 0;
1312
1313err:
1314        kfree(data);
1315
1316        return ret;
1317}
1318
1319static void sunxi_nand_hw_common_ecc_ctrl_cleanup(struct nand_ecc_ctrl *ecc)
1320{
1321        kfree(ecc->priv);
1322}
1323
1324static int sunxi_nand_hw_ecc_ctrl_init(struct mtd_info *mtd,
1325                                       struct nand_ecc_ctrl *ecc,
1326                                       struct device_node *np)
1327{
1328        struct nand_ecclayout *layout;
1329        int nsectors;
1330        int i, j;
1331        int ret;
1332
1333        ret = sunxi_nand_hw_common_ecc_ctrl_init(mtd, ecc, np);
1334        if (ret)
1335                return ret;
1336
1337        ecc->read_page = sunxi_nfc_hw_ecc_read_page;
1338        ecc->write_page = sunxi_nfc_hw_ecc_write_page;
1339        layout = ecc->layout;
1340        nsectors = mtd->writesize / ecc->size;
1341
1342        for (i = 0; i < nsectors; i++) {
1343                if (i) {
1344                        layout->oobfree[i].offset =
1345                                layout->oobfree[i - 1].offset +
1346                                layout->oobfree[i - 1].length +
1347                                ecc->bytes;
1348                        layout->oobfree[i].length = 4;
1349                } else {
1350                        /*
1351                         * The first 2 bytes are used for BB markers, hence we
1352                         * only have 2 bytes available in the first user data
1353                         * section.
1354                         */
1355                        layout->oobfree[i].length = 2;
1356                        layout->oobfree[i].offset = 2;
1357                }
1358
1359                for (j = 0; j < ecc->bytes; j++)
1360                        layout->eccpos[(ecc->bytes * i) + j] =
1361                                        layout->oobfree[i].offset +
1362                                        layout->oobfree[i].length + j;
1363        }
1364
1365        if (mtd->oobsize > (ecc->bytes + 4) * nsectors) {
1366                layout->oobfree[nsectors].offset =
1367                                layout->oobfree[nsectors - 1].offset +
1368                                layout->oobfree[nsectors - 1].length +
1369                                ecc->bytes;
1370                layout->oobfree[nsectors].length = mtd->oobsize -
1371                                ((ecc->bytes + 4) * nsectors);
1372        }
1373
1374        return 0;
1375}
1376
1377static int sunxi_nand_hw_syndrome_ecc_ctrl_init(struct mtd_info *mtd,
1378                                                struct nand_ecc_ctrl *ecc,
1379                                                struct device_node *np)
1380{
1381        struct nand_ecclayout *layout;
1382        int nsectors;
1383        int i;
1384        int ret;
1385
1386        ret = sunxi_nand_hw_common_ecc_ctrl_init(mtd, ecc, np);
1387        if (ret)
1388                return ret;
1389
1390        ecc->prepad = 4;
1391        ecc->read_page = sunxi_nfc_hw_syndrome_ecc_read_page;
1392        ecc->write_page = sunxi_nfc_hw_syndrome_ecc_write_page;
1393
1394        layout = ecc->layout;
1395        nsectors = mtd->writesize / ecc->size;
1396
1397        for (i = 0; i < (ecc->bytes * nsectors); i++)
1398                layout->eccpos[i] = i;
1399
1400        layout->oobfree[0].length = mtd->oobsize - i;
1401        layout->oobfree[0].offset = i;
1402
1403        return 0;
1404}
1405
1406static void sunxi_nand_ecc_cleanup(struct nand_ecc_ctrl *ecc)
1407{
1408        switch (ecc->mode) {
1409        case NAND_ECC_HW:
1410        case NAND_ECC_HW_SYNDROME:
1411                sunxi_nand_hw_common_ecc_ctrl_cleanup(ecc);
1412                break;
1413        case NAND_ECC_NONE:
1414                kfree(ecc->layout);
1415        default:
1416                break;
1417        }
1418}
1419
1420static int sunxi_nand_ecc_init(struct mtd_info *mtd, struct nand_ecc_ctrl *ecc,
1421                               struct device_node *np)
1422{
1423        struct nand_chip *nand = mtd_to_nand(mtd);
1424        int ret;
1425
1426        if (!ecc->size) {
1427                ecc->size = nand->ecc_step_ds;
1428                ecc->strength = nand->ecc_strength_ds;
1429        }
1430
1431        if (!ecc->size || !ecc->strength)
1432                return -EINVAL;
1433
1434        switch (ecc->mode) {
1435        case NAND_ECC_SOFT_BCH:
1436                break;
1437        case NAND_ECC_HW:
1438                ret = sunxi_nand_hw_ecc_ctrl_init(mtd, ecc, np);
1439                if (ret)
1440                        return ret;
1441                break;
1442        case NAND_ECC_HW_SYNDROME:
1443                ret = sunxi_nand_hw_syndrome_ecc_ctrl_init(mtd, ecc, np);
1444                if (ret)
1445                        return ret;
1446                break;
1447        case NAND_ECC_NONE:
1448                ecc->layout = kzalloc(sizeof(*ecc->layout), GFP_KERNEL);
1449                if (!ecc->layout)
1450                        return -ENOMEM;
1451                ecc->layout->oobfree[0].length = mtd->oobsize;
1452        case NAND_ECC_SOFT:
1453                break;
1454        default:
1455                return -EINVAL;
1456        }
1457
1458        return 0;
1459}
1460
1461static int sunxi_nand_chip_init(struct device *dev, struct sunxi_nfc *nfc,
1462                                struct device_node *np)
1463{
1464        const struct nand_sdr_timings *timings;
1465        struct sunxi_nand_chip *chip;
1466        struct mtd_info *mtd;
1467        struct nand_chip *nand;
1468        int nsels;
1469        int ret;
1470        int i;
1471        u32 tmp;
1472
1473        if (!of_get_property(np, "reg", &nsels))
1474                return -EINVAL;
1475
1476        nsels /= sizeof(u32);
1477        if (!nsels) {
1478                dev_err(dev, "invalid reg property size\n");
1479                return -EINVAL;
1480        }
1481
1482        chip = devm_kzalloc(dev,
1483                            sizeof(*chip) +
1484                            (nsels * sizeof(struct sunxi_nand_chip_sel)),
1485                            GFP_KERNEL);
1486        if (!chip) {
1487                dev_err(dev, "could not allocate chip\n");
1488                return -ENOMEM;
1489        }
1490
1491        chip->nsels = nsels;
1492        chip->selected = -1;
1493
1494        for (i = 0; i < nsels; i++) {
1495                ret = of_property_read_u32_index(np, "reg", i, &tmp);
1496                if (ret) {
1497                        dev_err(dev, "could not retrieve reg property: %d\n",
1498                                ret);
1499                        return ret;
1500                }
1501
1502                if (tmp > NFC_MAX_CS) {
1503                        dev_err(dev,
1504                                "invalid reg value: %u (max CS = 7)\n",
1505                                tmp);
1506                        return -EINVAL;
1507                }
1508
1509                if (test_and_set_bit(tmp, &nfc->assigned_cs)) {
1510                        dev_err(dev, "CS %d already assigned\n", tmp);
1511                        return -EINVAL;
1512                }
1513
1514                chip->sels[i].cs = tmp;
1515
1516                if (!of_property_read_u32_index(np, "allwinner,rb", i, &tmp) &&
1517                    tmp < 2) {
1518                        chip->sels[i].rb.type = RB_NATIVE;
1519                        chip->sels[i].rb.info.nativeid = tmp;
1520                } else {
1521                        ret = of_get_named_gpio(np, "rb-gpios", i);
1522                        if (ret >= 0) {
1523                                tmp = ret;
1524                                chip->sels[i].rb.type = RB_GPIO;
1525                                chip->sels[i].rb.info.gpio = tmp;
1526                                ret = devm_gpio_request(dev, tmp, "nand-rb");
1527                                if (ret)
1528                                        return ret;
1529
1530                                ret = gpio_direction_input(tmp);
1531                                if (ret)
1532                                        return ret;
1533                        } else {
1534                                chip->sels[i].rb.type = RB_NONE;
1535                        }
1536                }
1537        }
1538
1539        timings = onfi_async_timing_mode_to_sdr_timings(0);
1540        if (IS_ERR(timings)) {
1541                ret = PTR_ERR(timings);
1542                dev_err(dev,
1543                        "could not retrieve timings for ONFI mode 0: %d\n",
1544                        ret);
1545                return ret;
1546        }
1547
1548        ret = sunxi_nand_chip_set_timings(chip, timings);
1549        if (ret) {
1550                dev_err(dev, "could not configure chip timings: %d\n", ret);
1551                return ret;
1552        }
1553
1554        nand = &chip->nand;
1555        /* Default tR value specified in the ONFI spec (chapter 4.15.1) */
1556        nand->chip_delay = 200;
1557        nand->controller = &nfc->controller;
1558        /*
1559         * Set the ECC mode to the default value in case nothing is specified
1560         * in the DT.
1561         */
1562        nand->ecc.mode = NAND_ECC_HW;
1563        nand_set_flash_node(nand, np);
1564        nand->select_chip = sunxi_nfc_select_chip;
1565        nand->cmd_ctrl = sunxi_nfc_cmd_ctrl;
1566        nand->read_buf = sunxi_nfc_read_buf;
1567        nand->write_buf = sunxi_nfc_write_buf;
1568        nand->read_byte = sunxi_nfc_read_byte;
1569
1570        mtd = nand_to_mtd(nand);
1571        mtd->dev.parent = dev;
1572
1573        ret = nand_scan_ident(mtd, nsels, NULL);
1574        if (ret)
1575                return ret;
1576
1577        if (nand->bbt_options & NAND_BBT_USE_FLASH)
1578                nand->bbt_options |= NAND_BBT_NO_OOB;
1579
1580        if (nand->options & NAND_NEED_SCRAMBLING)
1581                nand->options |= NAND_NO_SUBPAGE_WRITE;
1582
1583        ret = sunxi_nand_chip_init_timings(chip, np);
1584        if (ret) {
1585                dev_err(dev, "could not configure chip timings: %d\n", ret);
1586                return ret;
1587        }
1588
1589        ret = sunxi_nand_ecc_init(mtd, &nand->ecc, np);
1590        if (ret) {
1591                dev_err(dev, "ECC init failed: %d\n", ret);
1592                return ret;
1593        }
1594
1595        ret = nand_scan_tail(mtd);
1596        if (ret) {
1597                dev_err(dev, "nand_scan_tail failed: %d\n", ret);
1598                return ret;
1599        }
1600
1601        ret = mtd_device_register(mtd, NULL, 0);
1602        if (ret) {
1603                dev_err(dev, "failed to register mtd device: %d\n", ret);
1604                nand_release(mtd);
1605                return ret;
1606        }
1607
1608        list_add_tail(&chip->node, &nfc->chips);
1609
1610        return 0;
1611}
1612
1613static int sunxi_nand_chips_init(struct device *dev, struct sunxi_nfc *nfc)
1614{
1615        struct device_node *np = dev->of_node;
1616        struct device_node *nand_np;
1617        int nchips = of_get_child_count(np);
1618        int ret;
1619
1620        if (nchips > 8) {
1621                dev_err(dev, "too many NAND chips: %d (max = 8)\n", nchips);
1622                return -EINVAL;
1623        }
1624
1625        for_each_child_of_node(np, nand_np) {
1626                ret = sunxi_nand_chip_init(dev, nfc, nand_np);
1627                if (ret) {
1628                        of_node_put(nand_np);
1629                        return ret;
1630                }
1631        }
1632
1633        return 0;
1634}
1635
1636static void sunxi_nand_chips_cleanup(struct sunxi_nfc *nfc)
1637{
1638        struct sunxi_nand_chip *chip;
1639
1640        while (!list_empty(&nfc->chips)) {
1641                chip = list_first_entry(&nfc->chips, struct sunxi_nand_chip,
1642                                        node);
1643                nand_release(nand_to_mtd(&chip->nand));
1644                sunxi_nand_ecc_cleanup(&chip->nand.ecc);
1645                list_del(&chip->node);
1646        }
1647}
1648
1649static int sunxi_nfc_probe(struct platform_device *pdev)
1650{
1651        struct device *dev = &pdev->dev;
1652        struct resource *r;
1653        struct sunxi_nfc *nfc;
1654        int irq;
1655        int ret;
1656
1657        nfc = devm_kzalloc(dev, sizeof(*nfc), GFP_KERNEL);
1658        if (!nfc)
1659                return -ENOMEM;
1660
1661        nfc->dev = dev;
1662        spin_lock_init(&nfc->controller.lock);
1663        init_waitqueue_head(&nfc->controller.wq);
1664        INIT_LIST_HEAD(&nfc->chips);
1665
1666        r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1667        nfc->regs = devm_ioremap_resource(dev, r);
1668        if (IS_ERR(nfc->regs))
1669                return PTR_ERR(nfc->regs);
1670
1671        irq = platform_get_irq(pdev, 0);
1672        if (irq < 0) {
1673                dev_err(dev, "failed to retrieve irq\n");
1674                return irq;
1675        }
1676
1677        nfc->ahb_clk = devm_clk_get(dev, "ahb");
1678        if (IS_ERR(nfc->ahb_clk)) {
1679                dev_err(dev, "failed to retrieve ahb clk\n");
1680                return PTR_ERR(nfc->ahb_clk);
1681        }
1682
1683        ret = clk_prepare_enable(nfc->ahb_clk);
1684        if (ret)
1685                return ret;
1686
1687        nfc->mod_clk = devm_clk_get(dev, "mod");
1688        if (IS_ERR(nfc->mod_clk)) {
1689                dev_err(dev, "failed to retrieve mod clk\n");
1690                ret = PTR_ERR(nfc->mod_clk);
1691                goto out_ahb_clk_unprepare;
1692        }
1693
1694        ret = clk_prepare_enable(nfc->mod_clk);
1695        if (ret)
1696                goto out_ahb_clk_unprepare;
1697
1698        ret = sunxi_nfc_rst(nfc);
1699        if (ret)
1700                goto out_mod_clk_unprepare;
1701
1702        writel(0, nfc->regs + NFC_REG_INT);
1703        ret = devm_request_irq(dev, irq, sunxi_nfc_interrupt,
1704                               0, "sunxi-nand", nfc);
1705        if (ret)
1706                goto out_mod_clk_unprepare;
1707
1708        platform_set_drvdata(pdev, nfc);
1709
1710        ret = sunxi_nand_chips_init(dev, nfc);
1711        if (ret) {
1712                dev_err(dev, "failed to init nand chips\n");
1713                goto out_mod_clk_unprepare;
1714        }
1715
1716        return 0;
1717
1718out_mod_clk_unprepare:
1719        clk_disable_unprepare(nfc->mod_clk);
1720out_ahb_clk_unprepare:
1721        clk_disable_unprepare(nfc->ahb_clk);
1722
1723        return ret;
1724}
1725
1726static int sunxi_nfc_remove(struct platform_device *pdev)
1727{
1728        struct sunxi_nfc *nfc = platform_get_drvdata(pdev);
1729
1730        sunxi_nand_chips_cleanup(nfc);
1731
1732        return 0;
1733}
1734
1735static const struct of_device_id sunxi_nfc_ids[] = {
1736        { .compatible = "allwinner,sun4i-a10-nand" },
1737        { /* sentinel */ }
1738};
1739MODULE_DEVICE_TABLE(of, sunxi_nfc_ids);
1740
1741static struct platform_driver sunxi_nfc_driver = {
1742        .driver = {
1743                .name = "sunxi_nand",
1744                .of_match_table = sunxi_nfc_ids,
1745        },
1746        .probe = sunxi_nfc_probe,
1747        .remove = sunxi_nfc_remove,
1748};
1749module_platform_driver(sunxi_nfc_driver);
1750
1751MODULE_LICENSE("GPL v2");
1752MODULE_AUTHOR("Boris BREZILLON");
1753MODULE_DESCRIPTION("Allwinner NAND Flash Controller driver");
1754MODULE_ALIAS("platform:sunxi_nand");
1755