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