linux/drivers/mtd/nand/atmel_nand.c
<<
>>
Prefs
   1/*
   2 *  Copyright © 2003 Rick Bronson
   3 *
   4 *  Derived from drivers/mtd/nand/autcpu12.c
   5 *       Copyright © 2001 Thomas Gleixner (gleixner@autronix.de)
   6 *
   7 *  Derived from drivers/mtd/spia.c
   8 *       Copyright © 2000 Steven J. Hill (sjhill@cotw.com)
   9 *
  10 *
  11 *  Add Hardware ECC support for AT91SAM9260 / AT91SAM9263
  12 *     Richard Genoud (richard.genoud@gmail.com), Adeneo Copyright © 2007
  13 *
  14 *     Derived from Das U-Boot source code
  15 *              (u-boot-1.1.5/board/atmel/at91sam9263ek/nand.c)
  16 *     © Copyright 2006 ATMEL Rousset, Lacressonniere Nicolas
  17 *
  18 *  Add Programmable Multibit ECC support for various AT91 SoC
  19 *     © Copyright 2012 ATMEL, Hong Xu
  20 *
  21 *  Add Nand Flash Controller support for SAMA5 SoC
  22 *     © Copyright 2013 ATMEL, Josh Wu (josh.wu@atmel.com)
  23 *
  24 * This program is free software; you can redistribute it and/or modify
  25 * it under the terms of the GNU General Public License version 2 as
  26 * published by the Free Software Foundation.
  27 *
  28 */
  29
  30#include <linux/clk.h>
  31#include <linux/dma-mapping.h>
  32#include <linux/slab.h>
  33#include <linux/module.h>
  34#include <linux/moduleparam.h>
  35#include <linux/platform_device.h>
  36#include <linux/of.h>
  37#include <linux/of_device.h>
  38#include <linux/of_gpio.h>
  39#include <linux/of_mtd.h>
  40#include <linux/mtd/mtd.h>
  41#include <linux/mtd/nand.h>
  42#include <linux/mtd/partitions.h>
  43
  44#include <linux/delay.h>
  45#include <linux/dmaengine.h>
  46#include <linux/gpio.h>
  47#include <linux/interrupt.h>
  48#include <linux/io.h>
  49#include <linux/platform_data/atmel.h>
  50
  51static int use_dma = 1;
  52module_param(use_dma, int, 0);
  53
  54static int on_flash_bbt = 0;
  55module_param(on_flash_bbt, int, 0);
  56
  57/* Register access macros */
  58#define ecc_readl(add, reg)                             \
  59        __raw_readl(add + ATMEL_ECC_##reg)
  60#define ecc_writel(add, reg, value)                     \
  61        __raw_writel((value), add + ATMEL_ECC_##reg)
  62
  63#include "atmel_nand_ecc.h"     /* Hardware ECC registers */
  64#include "atmel_nand_nfc.h"     /* Nand Flash Controller definition */
  65
  66struct atmel_nand_caps {
  67        bool pmecc_correct_erase_page;
  68        uint8_t pmecc_max_correction;
  69};
  70
  71struct atmel_nand_nfc_caps {
  72        uint32_t rb_mask;
  73};
  74
  75/* oob layout for large page size
  76 * bad block info is on bytes 0 and 1
  77 * the bytes have to be consecutives to avoid
  78 * several NAND_CMD_RNDOUT during read
  79 */
  80static struct nand_ecclayout atmel_oobinfo_large = {
  81        .eccbytes = 4,
  82        .eccpos = {60, 61, 62, 63},
  83        .oobfree = {
  84                {2, 58}
  85        },
  86};
  87
  88/* oob layout for small page size
  89 * bad block info is on bytes 4 and 5
  90 * the bytes have to be consecutives to avoid
  91 * several NAND_CMD_RNDOUT during read
  92 */
  93static struct nand_ecclayout atmel_oobinfo_small = {
  94        .eccbytes = 4,
  95        .eccpos = {0, 1, 2, 3},
  96        .oobfree = {
  97                {6, 10}
  98        },
  99};
 100
 101struct atmel_nfc {
 102        void __iomem            *base_cmd_regs;
 103        void __iomem            *hsmc_regs;
 104        void                    *sram_bank0;
 105        dma_addr_t              sram_bank0_phys;
 106        bool                    use_nfc_sram;
 107        bool                    write_by_sram;
 108
 109        struct clk              *clk;
 110
 111        bool                    is_initialized;
 112        struct completion       comp_ready;
 113        struct completion       comp_cmd_done;
 114        struct completion       comp_xfer_done;
 115
 116        /* Point to the sram bank which include readed data via NFC */
 117        void                    *data_in_sram;
 118        bool                    will_write_sram;
 119        const struct atmel_nand_nfc_caps *caps;
 120};
 121static struct atmel_nfc nand_nfc;
 122
 123struct atmel_nand_host {
 124        struct nand_chip        nand_chip;
 125        void __iomem            *io_base;
 126        dma_addr_t              io_phys;
 127        struct atmel_nand_data  board;
 128        struct device           *dev;
 129        void __iomem            *ecc;
 130
 131        struct completion       comp;
 132        struct dma_chan         *dma_chan;
 133
 134        struct atmel_nfc        *nfc;
 135
 136        const struct atmel_nand_caps    *caps;
 137        bool                    has_pmecc;
 138        u8                      pmecc_corr_cap;
 139        u16                     pmecc_sector_size;
 140        bool                    has_no_lookup_table;
 141        u32                     pmecc_lookup_table_offset;
 142        u32                     pmecc_lookup_table_offset_512;
 143        u32                     pmecc_lookup_table_offset_1024;
 144
 145        int                     pmecc_degree;   /* Degree of remainders */
 146        int                     pmecc_cw_len;   /* Length of codeword */
 147
 148        void __iomem            *pmerrloc_base;
 149        void __iomem            *pmerrloc_el_base;
 150        void __iomem            *pmecc_rom_base;
 151
 152        /* lookup table for alpha_to and index_of */
 153        void __iomem            *pmecc_alpha_to;
 154        void __iomem            *pmecc_index_of;
 155
 156        /* data for pmecc computation */
 157        int16_t                 *pmecc_partial_syn;
 158        int16_t                 *pmecc_si;
 159        int16_t                 *pmecc_smu;     /* Sigma table */
 160        int16_t                 *pmecc_lmu;     /* polynomal order */
 161        int                     *pmecc_mu;
 162        int                     *pmecc_dmu;
 163        int                     *pmecc_delta;
 164};
 165
 166static struct nand_ecclayout atmel_pmecc_oobinfo;
 167
 168/*
 169 * Enable NAND.
 170 */
 171static void atmel_nand_enable(struct atmel_nand_host *host)
 172{
 173        if (gpio_is_valid(host->board.enable_pin))
 174                gpio_set_value(host->board.enable_pin, 0);
 175}
 176
 177/*
 178 * Disable NAND.
 179 */
 180static void atmel_nand_disable(struct atmel_nand_host *host)
 181{
 182        if (gpio_is_valid(host->board.enable_pin))
 183                gpio_set_value(host->board.enable_pin, 1);
 184}
 185
 186/*
 187 * Hardware specific access to control-lines
 188 */
 189static void atmel_nand_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl)
 190{
 191        struct nand_chip *nand_chip = mtd_to_nand(mtd);
 192        struct atmel_nand_host *host = nand_get_controller_data(nand_chip);
 193
 194        if (ctrl & NAND_CTRL_CHANGE) {
 195                if (ctrl & NAND_NCE)
 196                        atmel_nand_enable(host);
 197                else
 198                        atmel_nand_disable(host);
 199        }
 200        if (cmd == NAND_CMD_NONE)
 201                return;
 202
 203        if (ctrl & NAND_CLE)
 204                writeb(cmd, host->io_base + (1 << host->board.cle));
 205        else
 206                writeb(cmd, host->io_base + (1 << host->board.ale));
 207}
 208
 209/*
 210 * Read the Device Ready pin.
 211 */
 212static int atmel_nand_device_ready(struct mtd_info *mtd)
 213{
 214        struct nand_chip *nand_chip = mtd_to_nand(mtd);
 215        struct atmel_nand_host *host = nand_get_controller_data(nand_chip);
 216
 217        return gpio_get_value(host->board.rdy_pin) ^
 218                !!host->board.rdy_pin_active_low;
 219}
 220
 221/* Set up for hardware ready pin and enable pin. */
 222static int atmel_nand_set_enable_ready_pins(struct mtd_info *mtd)
 223{
 224        struct nand_chip *chip = mtd_to_nand(mtd);
 225        struct atmel_nand_host *host = nand_get_controller_data(chip);
 226        int res = 0;
 227
 228        if (gpio_is_valid(host->board.rdy_pin)) {
 229                res = devm_gpio_request(host->dev,
 230                                host->board.rdy_pin, "nand_rdy");
 231                if (res < 0) {
 232                        dev_err(host->dev,
 233                                "can't request rdy gpio %d\n",
 234                                host->board.rdy_pin);
 235                        return res;
 236                }
 237
 238                res = gpio_direction_input(host->board.rdy_pin);
 239                if (res < 0) {
 240                        dev_err(host->dev,
 241                                "can't request input direction rdy gpio %d\n",
 242                                host->board.rdy_pin);
 243                        return res;
 244                }
 245
 246                chip->dev_ready = atmel_nand_device_ready;
 247        }
 248
 249        if (gpio_is_valid(host->board.enable_pin)) {
 250                res = devm_gpio_request(host->dev,
 251                                host->board.enable_pin, "nand_enable");
 252                if (res < 0) {
 253                        dev_err(host->dev,
 254                                "can't request enable gpio %d\n",
 255                                host->board.enable_pin);
 256                        return res;
 257                }
 258
 259                res = gpio_direction_output(host->board.enable_pin, 1);
 260                if (res < 0) {
 261                        dev_err(host->dev,
 262                                "can't request output direction enable gpio %d\n",
 263                                host->board.enable_pin);
 264                        return res;
 265                }
 266        }
 267
 268        return res;
 269}
 270
 271/*
 272 * Minimal-overhead PIO for data access.
 273 */
 274static void atmel_read_buf8(struct mtd_info *mtd, u8 *buf, int len)
 275{
 276        struct nand_chip        *nand_chip = mtd_to_nand(mtd);
 277        struct atmel_nand_host *host = nand_get_controller_data(nand_chip);
 278
 279        if (host->nfc && host->nfc->use_nfc_sram && host->nfc->data_in_sram) {
 280                memcpy(buf, host->nfc->data_in_sram, len);
 281                host->nfc->data_in_sram += len;
 282        } else {
 283                __raw_readsb(nand_chip->IO_ADDR_R, buf, len);
 284        }
 285}
 286
 287static void atmel_read_buf16(struct mtd_info *mtd, u8 *buf, int len)
 288{
 289        struct nand_chip        *nand_chip = mtd_to_nand(mtd);
 290        struct atmel_nand_host *host = nand_get_controller_data(nand_chip);
 291
 292        if (host->nfc && host->nfc->use_nfc_sram && host->nfc->data_in_sram) {
 293                memcpy(buf, host->nfc->data_in_sram, len);
 294                host->nfc->data_in_sram += len;
 295        } else {
 296                __raw_readsw(nand_chip->IO_ADDR_R, buf, len / 2);
 297        }
 298}
 299
 300static void atmel_write_buf8(struct mtd_info *mtd, const u8 *buf, int len)
 301{
 302        struct nand_chip        *nand_chip = mtd_to_nand(mtd);
 303
 304        __raw_writesb(nand_chip->IO_ADDR_W, buf, len);
 305}
 306
 307static void atmel_write_buf16(struct mtd_info *mtd, const u8 *buf, int len)
 308{
 309        struct nand_chip        *nand_chip = mtd_to_nand(mtd);
 310
 311        __raw_writesw(nand_chip->IO_ADDR_W, buf, len / 2);
 312}
 313
 314static void dma_complete_func(void *completion)
 315{
 316        complete(completion);
 317}
 318
 319static int nfc_set_sram_bank(struct atmel_nand_host *host, unsigned int bank)
 320{
 321        /* NFC only has two banks. Must be 0 or 1 */
 322        if (bank > 1)
 323                return -EINVAL;
 324
 325        if (bank) {
 326                struct mtd_info *mtd = nand_to_mtd(&host->nand_chip);
 327
 328                /* Only for a 2k-page or lower flash, NFC can handle 2 banks */
 329                if (mtd->writesize > 2048)
 330                        return -EINVAL;
 331                nfc_writel(host->nfc->hsmc_regs, BANK, ATMEL_HSMC_NFC_BANK1);
 332        } else {
 333                nfc_writel(host->nfc->hsmc_regs, BANK, ATMEL_HSMC_NFC_BANK0);
 334        }
 335
 336        return 0;
 337}
 338
 339static uint nfc_get_sram_off(struct atmel_nand_host *host)
 340{
 341        if (nfc_readl(host->nfc->hsmc_regs, BANK) & ATMEL_HSMC_NFC_BANK1)
 342                return NFC_SRAM_BANK1_OFFSET;
 343        else
 344                return 0;
 345}
 346
 347static dma_addr_t nfc_sram_phys(struct atmel_nand_host *host)
 348{
 349        if (nfc_readl(host->nfc->hsmc_regs, BANK) & ATMEL_HSMC_NFC_BANK1)
 350                return host->nfc->sram_bank0_phys + NFC_SRAM_BANK1_OFFSET;
 351        else
 352                return host->nfc->sram_bank0_phys;
 353}
 354
 355static int atmel_nand_dma_op(struct mtd_info *mtd, void *buf, int len,
 356                               int is_read)
 357{
 358        struct dma_device *dma_dev;
 359        enum dma_ctrl_flags flags;
 360        dma_addr_t dma_src_addr, dma_dst_addr, phys_addr;
 361        struct dma_async_tx_descriptor *tx = NULL;
 362        dma_cookie_t cookie;
 363        struct nand_chip *chip = mtd_to_nand(mtd);
 364        struct atmel_nand_host *host = nand_get_controller_data(chip);
 365        void *p = buf;
 366        int err = -EIO;
 367        enum dma_data_direction dir = is_read ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
 368        struct atmel_nfc *nfc = host->nfc;
 369
 370        if (buf >= high_memory)
 371                goto err_buf;
 372
 373        dma_dev = host->dma_chan->device;
 374
 375        flags = DMA_CTRL_ACK | DMA_PREP_INTERRUPT;
 376
 377        phys_addr = dma_map_single(dma_dev->dev, p, len, dir);
 378        if (dma_mapping_error(dma_dev->dev, phys_addr)) {
 379                dev_err(host->dev, "Failed to dma_map_single\n");
 380                goto err_buf;
 381        }
 382
 383        if (is_read) {
 384                if (nfc && nfc->data_in_sram)
 385                        dma_src_addr = nfc_sram_phys(host) + (nfc->data_in_sram
 386                                - (nfc->sram_bank0 + nfc_get_sram_off(host)));
 387                else
 388                        dma_src_addr = host->io_phys;
 389
 390                dma_dst_addr = phys_addr;
 391        } else {
 392                dma_src_addr = phys_addr;
 393
 394                if (nfc && nfc->write_by_sram)
 395                        dma_dst_addr = nfc_sram_phys(host);
 396                else
 397                        dma_dst_addr = host->io_phys;
 398        }
 399
 400        tx = dma_dev->device_prep_dma_memcpy(host->dma_chan, dma_dst_addr,
 401                                             dma_src_addr, len, flags);
 402        if (!tx) {
 403                dev_err(host->dev, "Failed to prepare DMA memcpy\n");
 404                goto err_dma;
 405        }
 406
 407        init_completion(&host->comp);
 408        tx->callback = dma_complete_func;
 409        tx->callback_param = &host->comp;
 410
 411        cookie = tx->tx_submit(tx);
 412        if (dma_submit_error(cookie)) {
 413                dev_err(host->dev, "Failed to do DMA tx_submit\n");
 414                goto err_dma;
 415        }
 416
 417        dma_async_issue_pending(host->dma_chan);
 418        wait_for_completion(&host->comp);
 419
 420        if (is_read && nfc && nfc->data_in_sram)
 421                /* After read data from SRAM, need to increase the position */
 422                nfc->data_in_sram += len;
 423
 424        err = 0;
 425
 426err_dma:
 427        dma_unmap_single(dma_dev->dev, phys_addr, len, dir);
 428err_buf:
 429        if (err != 0)
 430                dev_dbg(host->dev, "Fall back to CPU I/O\n");
 431        return err;
 432}
 433
 434static void atmel_read_buf(struct mtd_info *mtd, u8 *buf, int len)
 435{
 436        struct nand_chip *chip = mtd_to_nand(mtd);
 437        struct atmel_nand_host *host = nand_get_controller_data(chip);
 438
 439        if (use_dma && len > mtd->oobsize)
 440                /* only use DMA for bigger than oob size: better performances */
 441                if (atmel_nand_dma_op(mtd, buf, len, 1) == 0)
 442                        return;
 443
 444        if (host->board.bus_width_16)
 445                atmel_read_buf16(mtd, buf, len);
 446        else
 447                atmel_read_buf8(mtd, buf, len);
 448}
 449
 450static void atmel_write_buf(struct mtd_info *mtd, const u8 *buf, int len)
 451{
 452        struct nand_chip *chip = mtd_to_nand(mtd);
 453        struct atmel_nand_host *host = nand_get_controller_data(chip);
 454
 455        if (use_dma && len > mtd->oobsize)
 456                /* only use DMA for bigger than oob size: better performances */
 457                if (atmel_nand_dma_op(mtd, (void *)buf, len, 0) == 0)
 458                        return;
 459
 460        if (host->board.bus_width_16)
 461                atmel_write_buf16(mtd, buf, len);
 462        else
 463                atmel_write_buf8(mtd, buf, len);
 464}
 465
 466/*
 467 * Return number of ecc bytes per sector according to sector size and
 468 * correction capability
 469 *
 470 * Following table shows what at91 PMECC supported:
 471 * Correction Capability        Sector_512_bytes        Sector_1024_bytes
 472 * =====================        ================        =================
 473 *                2-bits                 4-bytes                  4-bytes
 474 *                4-bits                 7-bytes                  7-bytes
 475 *                8-bits                13-bytes                 14-bytes
 476 *               12-bits                20-bytes                 21-bytes
 477 *               24-bits                39-bytes                 42-bytes
 478 *               32-bits                52-bytes                 56-bytes
 479 */
 480static int pmecc_get_ecc_bytes(int cap, int sector_size)
 481{
 482        int m = 12 + sector_size / 512;
 483        return (m * cap + 7) / 8;
 484}
 485
 486static void pmecc_config_ecc_layout(struct nand_ecclayout *layout,
 487                                    int oobsize, int ecc_len)
 488{
 489        int i;
 490
 491        layout->eccbytes = ecc_len;
 492
 493        /* ECC will occupy the last ecc_len bytes continuously */
 494        for (i = 0; i < ecc_len; i++)
 495                layout->eccpos[i] = oobsize - ecc_len + i;
 496
 497        layout->oobfree[0].offset = PMECC_OOB_RESERVED_BYTES;
 498        layout->oobfree[0].length =
 499                oobsize - ecc_len - layout->oobfree[0].offset;
 500}
 501
 502static void __iomem *pmecc_get_alpha_to(struct atmel_nand_host *host)
 503{
 504        int table_size;
 505
 506        table_size = host->pmecc_sector_size == 512 ?
 507                PMECC_LOOKUP_TABLE_SIZE_512 : PMECC_LOOKUP_TABLE_SIZE_1024;
 508
 509        return host->pmecc_rom_base + host->pmecc_lookup_table_offset +
 510                        table_size * sizeof(int16_t);
 511}
 512
 513static int pmecc_data_alloc(struct atmel_nand_host *host)
 514{
 515        const int cap = host->pmecc_corr_cap;
 516        int size;
 517
 518        size = (2 * cap + 1) * sizeof(int16_t);
 519        host->pmecc_partial_syn = devm_kzalloc(host->dev, size, GFP_KERNEL);
 520        host->pmecc_si = devm_kzalloc(host->dev, size, GFP_KERNEL);
 521        host->pmecc_lmu = devm_kzalloc(host->dev,
 522                        (cap + 1) * sizeof(int16_t), GFP_KERNEL);
 523        host->pmecc_smu = devm_kzalloc(host->dev,
 524                        (cap + 2) * size, GFP_KERNEL);
 525
 526        size = (cap + 1) * sizeof(int);
 527        host->pmecc_mu = devm_kzalloc(host->dev, size, GFP_KERNEL);
 528        host->pmecc_dmu = devm_kzalloc(host->dev, size, GFP_KERNEL);
 529        host->pmecc_delta = devm_kzalloc(host->dev, size, GFP_KERNEL);
 530
 531        if (!host->pmecc_partial_syn ||
 532                !host->pmecc_si ||
 533                !host->pmecc_lmu ||
 534                !host->pmecc_smu ||
 535                !host->pmecc_mu ||
 536                !host->pmecc_dmu ||
 537                !host->pmecc_delta)
 538                return -ENOMEM;
 539
 540        return 0;
 541}
 542
 543static void pmecc_gen_syndrome(struct mtd_info *mtd, int sector)
 544{
 545        struct nand_chip *nand_chip = mtd_to_nand(mtd);
 546        struct atmel_nand_host *host = nand_get_controller_data(nand_chip);
 547        int i;
 548        uint32_t value;
 549
 550        /* Fill odd syndromes */
 551        for (i = 0; i < host->pmecc_corr_cap; i++) {
 552                value = pmecc_readl_rem_relaxed(host->ecc, sector, i / 2);
 553                if (i & 1)
 554                        value >>= 16;
 555                value &= 0xffff;
 556                host->pmecc_partial_syn[(2 * i) + 1] = (int16_t)value;
 557        }
 558}
 559
 560static void pmecc_substitute(struct mtd_info *mtd)
 561{
 562        struct nand_chip *nand_chip = mtd_to_nand(mtd);
 563        struct atmel_nand_host *host = nand_get_controller_data(nand_chip);
 564        int16_t __iomem *alpha_to = host->pmecc_alpha_to;
 565        int16_t __iomem *index_of = host->pmecc_index_of;
 566        int16_t *partial_syn = host->pmecc_partial_syn;
 567        const int cap = host->pmecc_corr_cap;
 568        int16_t *si;
 569        int i, j;
 570
 571        /* si[] is a table that holds the current syndrome value,
 572         * an element of that table belongs to the field
 573         */
 574        si = host->pmecc_si;
 575
 576        memset(&si[1], 0, sizeof(int16_t) * (2 * cap - 1));
 577
 578        /* Computation 2t syndromes based on S(x) */
 579        /* Odd syndromes */
 580        for (i = 1; i < 2 * cap; i += 2) {
 581                for (j = 0; j < host->pmecc_degree; j++) {
 582                        if (partial_syn[i] & ((unsigned short)0x1 << j))
 583                                si[i] = readw_relaxed(alpha_to + i * j) ^ si[i];
 584                }
 585        }
 586        /* Even syndrome = (Odd syndrome) ** 2 */
 587        for (i = 2, j = 1; j <= cap; i = ++j << 1) {
 588                if (si[j] == 0) {
 589                        si[i] = 0;
 590                } else {
 591                        int16_t tmp;
 592
 593                        tmp = readw_relaxed(index_of + si[j]);
 594                        tmp = (tmp * 2) % host->pmecc_cw_len;
 595                        si[i] = readw_relaxed(alpha_to + tmp);
 596                }
 597        }
 598
 599        return;
 600}
 601
 602static void pmecc_get_sigma(struct mtd_info *mtd)
 603{
 604        struct nand_chip *nand_chip = mtd_to_nand(mtd);
 605        struct atmel_nand_host *host = nand_get_controller_data(nand_chip);
 606
 607        int16_t *lmu = host->pmecc_lmu;
 608        int16_t *si = host->pmecc_si;
 609        int *mu = host->pmecc_mu;
 610        int *dmu = host->pmecc_dmu;     /* Discrepancy */
 611        int *delta = host->pmecc_delta; /* Delta order */
 612        int cw_len = host->pmecc_cw_len;
 613        const int16_t cap = host->pmecc_corr_cap;
 614        const int num = 2 * cap + 1;
 615        int16_t __iomem *index_of = host->pmecc_index_of;
 616        int16_t __iomem *alpha_to = host->pmecc_alpha_to;
 617        int i, j, k;
 618        uint32_t dmu_0_count, tmp;
 619        int16_t *smu = host->pmecc_smu;
 620
 621        /* index of largest delta */
 622        int ro;
 623        int largest;
 624        int diff;
 625
 626        dmu_0_count = 0;
 627
 628        /* First Row */
 629
 630        /* Mu */
 631        mu[0] = -1;
 632
 633        memset(smu, 0, sizeof(int16_t) * num);
 634        smu[0] = 1;
 635
 636        /* discrepancy set to 1 */
 637        dmu[0] = 1;
 638        /* polynom order set to 0 */
 639        lmu[0] = 0;
 640        delta[0] = (mu[0] * 2 - lmu[0]) >> 1;
 641
 642        /* Second Row */
 643
 644        /* Mu */
 645        mu[1] = 0;
 646        /* Sigma(x) set to 1 */
 647        memset(&smu[num], 0, sizeof(int16_t) * num);
 648        smu[num] = 1;
 649
 650        /* discrepancy set to S1 */
 651        dmu[1] = si[1];
 652
 653        /* polynom order set to 0 */
 654        lmu[1] = 0;
 655
 656        delta[1] = (mu[1] * 2 - lmu[1]) >> 1;
 657
 658        /* Init the Sigma(x) last row */
 659        memset(&smu[(cap + 1) * num], 0, sizeof(int16_t) * num);
 660
 661        for (i = 1; i <= cap; i++) {
 662                mu[i + 1] = i << 1;
 663                /* Begin Computing Sigma (Mu+1) and L(mu) */
 664                /* check if discrepancy is set to 0 */
 665                if (dmu[i] == 0) {
 666                        dmu_0_count++;
 667
 668                        tmp = ((cap - (lmu[i] >> 1) - 1) / 2);
 669                        if ((cap - (lmu[i] >> 1) - 1) & 0x1)
 670                                tmp += 2;
 671                        else
 672                                tmp += 1;
 673
 674                        if (dmu_0_count == tmp) {
 675                                for (j = 0; j <= (lmu[i] >> 1) + 1; j++)
 676                                        smu[(cap + 1) * num + j] =
 677                                                        smu[i * num + j];
 678
 679                                lmu[cap + 1] = lmu[i];
 680                                return;
 681                        }
 682
 683                        /* copy polynom */
 684                        for (j = 0; j <= lmu[i] >> 1; j++)
 685                                smu[(i + 1) * num + j] = smu[i * num + j];
 686
 687                        /* copy previous polynom order to the next */
 688                        lmu[i + 1] = lmu[i];
 689                } else {
 690                        ro = 0;
 691                        largest = -1;
 692                        /* find largest delta with dmu != 0 */
 693                        for (j = 0; j < i; j++) {
 694                                if ((dmu[j]) && (delta[j] > largest)) {
 695                                        largest = delta[j];
 696                                        ro = j;
 697                                }
 698                        }
 699
 700                        /* compute difference */
 701                        diff = (mu[i] - mu[ro]);
 702
 703                        /* Compute degree of the new smu polynomial */
 704                        if ((lmu[i] >> 1) > ((lmu[ro] >> 1) + diff))
 705                                lmu[i + 1] = lmu[i];
 706                        else
 707                                lmu[i + 1] = ((lmu[ro] >> 1) + diff) * 2;
 708
 709                        /* Init smu[i+1] with 0 */
 710                        for (k = 0; k < num; k++)
 711                                smu[(i + 1) * num + k] = 0;
 712
 713                        /* Compute smu[i+1] */
 714                        for (k = 0; k <= lmu[ro] >> 1; k++) {
 715                                int16_t a, b, c;
 716
 717                                if (!(smu[ro * num + k] && dmu[i]))
 718                                        continue;
 719                                a = readw_relaxed(index_of + dmu[i]);
 720                                b = readw_relaxed(index_of + dmu[ro]);
 721                                c = readw_relaxed(index_of + smu[ro * num + k]);
 722                                tmp = a + (cw_len - b) + c;
 723                                a = readw_relaxed(alpha_to + tmp % cw_len);
 724                                smu[(i + 1) * num + (k + diff)] = a;
 725                        }
 726
 727                        for (k = 0; k <= lmu[i] >> 1; k++)
 728                                smu[(i + 1) * num + k] ^= smu[i * num + k];
 729                }
 730
 731                /* End Computing Sigma (Mu+1) and L(mu) */
 732                /* In either case compute delta */
 733                delta[i + 1] = (mu[i + 1] * 2 - lmu[i + 1]) >> 1;
 734
 735                /* Do not compute discrepancy for the last iteration */
 736                if (i >= cap)
 737                        continue;
 738
 739                for (k = 0; k <= (lmu[i + 1] >> 1); k++) {
 740                        tmp = 2 * (i - 1);
 741                        if (k == 0) {
 742                                dmu[i + 1] = si[tmp + 3];
 743                        } else if (smu[(i + 1) * num + k] && si[tmp + 3 - k]) {
 744                                int16_t a, b, c;
 745                                a = readw_relaxed(index_of +
 746                                                smu[(i + 1) * num + k]);
 747                                b = si[2 * (i - 1) + 3 - k];
 748                                c = readw_relaxed(index_of + b);
 749                                tmp = a + c;
 750                                tmp %= cw_len;
 751                                dmu[i + 1] = readw_relaxed(alpha_to + tmp) ^
 752                                        dmu[i + 1];
 753                        }
 754                }
 755        }
 756
 757        return;
 758}
 759
 760static int pmecc_err_location(struct mtd_info *mtd)
 761{
 762        struct nand_chip *nand_chip = mtd_to_nand(mtd);
 763        struct atmel_nand_host *host = nand_get_controller_data(nand_chip);
 764        unsigned long end_time;
 765        const int cap = host->pmecc_corr_cap;
 766        const int num = 2 * cap + 1;
 767        int sector_size = host->pmecc_sector_size;
 768        int err_nbr = 0;        /* number of error */
 769        int roots_nbr;          /* number of roots */
 770        int i;
 771        uint32_t val;
 772        int16_t *smu = host->pmecc_smu;
 773
 774        pmerrloc_writel(host->pmerrloc_base, ELDIS, PMERRLOC_DISABLE);
 775
 776        for (i = 0; i <= host->pmecc_lmu[cap + 1] >> 1; i++) {
 777                pmerrloc_writel_sigma_relaxed(host->pmerrloc_base, i,
 778                                      smu[(cap + 1) * num + i]);
 779                err_nbr++;
 780        }
 781
 782        val = (err_nbr - 1) << 16;
 783        if (sector_size == 1024)
 784                val |= 1;
 785
 786        pmerrloc_writel(host->pmerrloc_base, ELCFG, val);
 787        pmerrloc_writel(host->pmerrloc_base, ELEN,
 788                        sector_size * 8 + host->pmecc_degree * cap);
 789
 790        end_time = jiffies + msecs_to_jiffies(PMECC_MAX_TIMEOUT_MS);
 791        while (!(pmerrloc_readl_relaxed(host->pmerrloc_base, ELISR)
 792                 & PMERRLOC_CALC_DONE)) {
 793                if (unlikely(time_after(jiffies, end_time))) {
 794                        dev_err(host->dev, "PMECC: Timeout to calculate error location.\n");
 795                        return -1;
 796                }
 797                cpu_relax();
 798        }
 799
 800        roots_nbr = (pmerrloc_readl_relaxed(host->pmerrloc_base, ELISR)
 801                & PMERRLOC_ERR_NUM_MASK) >> 8;
 802        /* Number of roots == degree of smu hence <= cap */
 803        if (roots_nbr == host->pmecc_lmu[cap + 1] >> 1)
 804                return err_nbr - 1;
 805
 806        /* Number of roots does not match the degree of smu
 807         * unable to correct error */
 808        return -1;
 809}
 810
 811static void pmecc_correct_data(struct mtd_info *mtd, uint8_t *buf, uint8_t *ecc,
 812                int sector_num, int extra_bytes, int err_nbr)
 813{
 814        struct nand_chip *nand_chip = mtd_to_nand(mtd);
 815        struct atmel_nand_host *host = nand_get_controller_data(nand_chip);
 816        int i = 0;
 817        int byte_pos, bit_pos, sector_size, pos;
 818        uint32_t tmp;
 819        uint8_t err_byte;
 820
 821        sector_size = host->pmecc_sector_size;
 822
 823        while (err_nbr) {
 824                tmp = pmerrloc_readl_el_relaxed(host->pmerrloc_el_base, i) - 1;
 825                byte_pos = tmp / 8;
 826                bit_pos  = tmp % 8;
 827
 828                if (byte_pos >= (sector_size + extra_bytes))
 829                        BUG();  /* should never happen */
 830
 831                if (byte_pos < sector_size) {
 832                        err_byte = *(buf + byte_pos);
 833                        *(buf + byte_pos) ^= (1 << bit_pos);
 834
 835                        pos = sector_num * host->pmecc_sector_size + byte_pos;
 836                        dev_dbg(host->dev, "Bit flip in data area, byte_pos: %d, bit_pos: %d, 0x%02x -> 0x%02x\n",
 837                                pos, bit_pos, err_byte, *(buf + byte_pos));
 838                } else {
 839                        /* Bit flip in OOB area */
 840                        tmp = sector_num * nand_chip->ecc.bytes
 841                                        + (byte_pos - sector_size);
 842                        err_byte = ecc[tmp];
 843                        ecc[tmp] ^= (1 << bit_pos);
 844
 845                        pos = tmp + nand_chip->ecc.layout->eccpos[0];
 846                        dev_dbg(host->dev, "Bit flip in OOB, oob_byte_pos: %d, bit_pos: %d, 0x%02x -> 0x%02x\n",
 847                                pos, bit_pos, err_byte, ecc[tmp]);
 848                }
 849
 850                i++;
 851                err_nbr--;
 852        }
 853
 854        return;
 855}
 856
 857static int pmecc_correction(struct mtd_info *mtd, u32 pmecc_stat, uint8_t *buf,
 858        u8 *ecc)
 859{
 860        struct nand_chip *nand_chip = mtd_to_nand(mtd);
 861        struct atmel_nand_host *host = nand_get_controller_data(nand_chip);
 862        int i, err_nbr;
 863        uint8_t *buf_pos;
 864        int max_bitflips = 0;
 865
 866        /* If can correct bitfilps from erased page, do the normal check */
 867        if (host->caps->pmecc_correct_erase_page)
 868                goto normal_check;
 869
 870        for (i = 0; i < nand_chip->ecc.total; i++)
 871                if (ecc[i] != 0xff)
 872                        goto normal_check;
 873        /* Erased page, return OK */
 874        return 0;
 875
 876normal_check:
 877        for (i = 0; i < nand_chip->ecc.steps; i++) {
 878                err_nbr = 0;
 879                if (pmecc_stat & 0x1) {
 880                        buf_pos = buf + i * host->pmecc_sector_size;
 881
 882                        pmecc_gen_syndrome(mtd, i);
 883                        pmecc_substitute(mtd);
 884                        pmecc_get_sigma(mtd);
 885
 886                        err_nbr = pmecc_err_location(mtd);
 887                        if (err_nbr == -1) {
 888                                dev_err(host->dev, "PMECC: Too many errors\n");
 889                                mtd->ecc_stats.failed++;
 890                                return -EIO;
 891                        } else {
 892                                pmecc_correct_data(mtd, buf_pos, ecc, i,
 893                                        nand_chip->ecc.bytes, err_nbr);
 894                                mtd->ecc_stats.corrected += err_nbr;
 895                                max_bitflips = max_t(int, max_bitflips, err_nbr);
 896                        }
 897                }
 898                pmecc_stat >>= 1;
 899        }
 900
 901        return max_bitflips;
 902}
 903
 904static void pmecc_enable(struct atmel_nand_host *host, int ecc_op)
 905{
 906        u32 val;
 907
 908        if (ecc_op != NAND_ECC_READ && ecc_op != NAND_ECC_WRITE) {
 909                dev_err(host->dev, "atmel_nand: wrong pmecc operation type!");
 910                return;
 911        }
 912
 913        pmecc_writel(host->ecc, CTRL, PMECC_CTRL_RST);
 914        pmecc_writel(host->ecc, CTRL, PMECC_CTRL_DISABLE);
 915        val = pmecc_readl_relaxed(host->ecc, CFG);
 916
 917        if (ecc_op == NAND_ECC_READ)
 918                pmecc_writel(host->ecc, CFG, (val & ~PMECC_CFG_WRITE_OP)
 919                        | PMECC_CFG_AUTO_ENABLE);
 920        else
 921                pmecc_writel(host->ecc, CFG, (val | PMECC_CFG_WRITE_OP)
 922                        & ~PMECC_CFG_AUTO_ENABLE);
 923
 924        pmecc_writel(host->ecc, CTRL, PMECC_CTRL_ENABLE);
 925        pmecc_writel(host->ecc, CTRL, PMECC_CTRL_DATA);
 926}
 927
 928static int atmel_nand_pmecc_read_page(struct mtd_info *mtd,
 929        struct nand_chip *chip, uint8_t *buf, int oob_required, int page)
 930{
 931        struct atmel_nand_host *host = nand_get_controller_data(chip);
 932        int eccsize = chip->ecc.size * chip->ecc.steps;
 933        uint8_t *oob = chip->oob_poi;
 934        uint32_t *eccpos = chip->ecc.layout->eccpos;
 935        uint32_t stat;
 936        unsigned long end_time;
 937        int bitflips = 0;
 938
 939        if (!host->nfc || !host->nfc->use_nfc_sram)
 940                pmecc_enable(host, NAND_ECC_READ);
 941
 942        chip->read_buf(mtd, buf, eccsize);
 943        chip->read_buf(mtd, oob, mtd->oobsize);
 944
 945        end_time = jiffies + msecs_to_jiffies(PMECC_MAX_TIMEOUT_MS);
 946        while ((pmecc_readl_relaxed(host->ecc, SR) & PMECC_SR_BUSY)) {
 947                if (unlikely(time_after(jiffies, end_time))) {
 948                        dev_err(host->dev, "PMECC: Timeout to get error status.\n");
 949                        return -EIO;
 950                }
 951                cpu_relax();
 952        }
 953
 954        stat = pmecc_readl_relaxed(host->ecc, ISR);
 955        if (stat != 0) {
 956                bitflips = pmecc_correction(mtd, stat, buf, &oob[eccpos[0]]);
 957                if (bitflips < 0)
 958                        /* uncorrectable errors */
 959                        return 0;
 960        }
 961
 962        return bitflips;
 963}
 964
 965static int atmel_nand_pmecc_write_page(struct mtd_info *mtd,
 966                struct nand_chip *chip, const uint8_t *buf, int oob_required,
 967                int page)
 968{
 969        struct atmel_nand_host *host = nand_get_controller_data(chip);
 970        uint32_t *eccpos = chip->ecc.layout->eccpos;
 971        int i, j;
 972        unsigned long end_time;
 973
 974        if (!host->nfc || !host->nfc->write_by_sram) {
 975                pmecc_enable(host, NAND_ECC_WRITE);
 976                chip->write_buf(mtd, (u8 *)buf, mtd->writesize);
 977        }
 978
 979        end_time = jiffies + msecs_to_jiffies(PMECC_MAX_TIMEOUT_MS);
 980        while ((pmecc_readl_relaxed(host->ecc, SR) & PMECC_SR_BUSY)) {
 981                if (unlikely(time_after(jiffies, end_time))) {
 982                        dev_err(host->dev, "PMECC: Timeout to get ECC value.\n");
 983                        return -EIO;
 984                }
 985                cpu_relax();
 986        }
 987
 988        for (i = 0; i < chip->ecc.steps; i++) {
 989                for (j = 0; j < chip->ecc.bytes; j++) {
 990                        int pos;
 991
 992                        pos = i * chip->ecc.bytes + j;
 993                        chip->oob_poi[eccpos[pos]] =
 994                                pmecc_readb_ecc_relaxed(host->ecc, i, j);
 995                }
 996        }
 997        chip->write_buf(mtd, chip->oob_poi, mtd->oobsize);
 998
 999        return 0;
1000}
1001
1002static void atmel_pmecc_core_init(struct mtd_info *mtd)
1003{
1004        struct nand_chip *nand_chip = mtd_to_nand(mtd);
1005        struct atmel_nand_host *host = nand_get_controller_data(nand_chip);
1006        uint32_t val = 0;
1007        struct nand_ecclayout *ecc_layout;
1008
1009        pmecc_writel(host->ecc, CTRL, PMECC_CTRL_RST);
1010        pmecc_writel(host->ecc, CTRL, PMECC_CTRL_DISABLE);
1011
1012        switch (host->pmecc_corr_cap) {
1013        case 2:
1014                val = PMECC_CFG_BCH_ERR2;
1015                break;
1016        case 4:
1017                val = PMECC_CFG_BCH_ERR4;
1018                break;
1019        case 8:
1020                val = PMECC_CFG_BCH_ERR8;
1021                break;
1022        case 12:
1023                val = PMECC_CFG_BCH_ERR12;
1024                break;
1025        case 24:
1026                val = PMECC_CFG_BCH_ERR24;
1027                break;
1028        case 32:
1029                val = PMECC_CFG_BCH_ERR32;
1030                break;
1031        }
1032
1033        if (host->pmecc_sector_size == 512)
1034                val |= PMECC_CFG_SECTOR512;
1035        else if (host->pmecc_sector_size == 1024)
1036                val |= PMECC_CFG_SECTOR1024;
1037
1038        switch (nand_chip->ecc.steps) {
1039        case 1:
1040                val |= PMECC_CFG_PAGE_1SECTOR;
1041                break;
1042        case 2:
1043                val |= PMECC_CFG_PAGE_2SECTORS;
1044                break;
1045        case 4:
1046                val |= PMECC_CFG_PAGE_4SECTORS;
1047                break;
1048        case 8:
1049                val |= PMECC_CFG_PAGE_8SECTORS;
1050                break;
1051        }
1052
1053        val |= (PMECC_CFG_READ_OP | PMECC_CFG_SPARE_DISABLE
1054                | PMECC_CFG_AUTO_DISABLE);
1055        pmecc_writel(host->ecc, CFG, val);
1056
1057        ecc_layout = nand_chip->ecc.layout;
1058        pmecc_writel(host->ecc, SAREA, mtd->oobsize - 1);
1059        pmecc_writel(host->ecc, SADDR, ecc_layout->eccpos[0]);
1060        pmecc_writel(host->ecc, EADDR,
1061                        ecc_layout->eccpos[ecc_layout->eccbytes - 1]);
1062        /* See datasheet about PMECC Clock Control Register */
1063        pmecc_writel(host->ecc, CLK, 2);
1064        pmecc_writel(host->ecc, IDR, 0xff);
1065        pmecc_writel(host->ecc, CTRL, PMECC_CTRL_ENABLE);
1066}
1067
1068/*
1069 * Get minimum ecc requirements from NAND.
1070 * If pmecc-cap, pmecc-sector-size in DTS are not specified, this function
1071 * will set them according to minimum ecc requirement. Otherwise, use the
1072 * value in DTS file.
1073 * return 0 if success. otherwise return error code.
1074 */
1075static int pmecc_choose_ecc(struct atmel_nand_host *host,
1076                int *cap, int *sector_size)
1077{
1078        /* Get minimum ECC requirements */
1079        if (host->nand_chip.ecc_strength_ds) {
1080                *cap = host->nand_chip.ecc_strength_ds;
1081                *sector_size = host->nand_chip.ecc_step_ds;
1082                dev_info(host->dev, "minimum ECC: %d bits in %d bytes\n",
1083                                *cap, *sector_size);
1084        } else {
1085                *cap = 2;
1086                *sector_size = 512;
1087                dev_info(host->dev, "can't detect min. ECC, assume 2 bits in 512 bytes\n");
1088        }
1089
1090        /* If device tree doesn't specify, use NAND's minimum ECC parameters */
1091        if (host->pmecc_corr_cap == 0) {
1092                if (*cap > host->caps->pmecc_max_correction)
1093                        return -EINVAL;
1094
1095                /* use the most fitable ecc bits (the near bigger one ) */
1096                if (*cap <= 2)
1097                        host->pmecc_corr_cap = 2;
1098                else if (*cap <= 4)
1099                        host->pmecc_corr_cap = 4;
1100                else if (*cap <= 8)
1101                        host->pmecc_corr_cap = 8;
1102                else if (*cap <= 12)
1103                        host->pmecc_corr_cap = 12;
1104                else if (*cap <= 24)
1105                        host->pmecc_corr_cap = 24;
1106                else if (*cap <= 32)
1107                        host->pmecc_corr_cap = 32;
1108                else
1109                        return -EINVAL;
1110        }
1111        if (host->pmecc_sector_size == 0) {
1112                /* use the most fitable sector size (the near smaller one ) */
1113                if (*sector_size >= 1024)
1114                        host->pmecc_sector_size = 1024;
1115                else if (*sector_size >= 512)
1116                        host->pmecc_sector_size = 512;
1117                else
1118                        return -EINVAL;
1119        }
1120        return 0;
1121}
1122
1123static inline int deg(unsigned int poly)
1124{
1125        /* polynomial degree is the most-significant bit index */
1126        return fls(poly) - 1;
1127}
1128
1129static int build_gf_tables(int mm, unsigned int poly,
1130                int16_t *index_of, int16_t *alpha_to)
1131{
1132        unsigned int i, x = 1;
1133        const unsigned int k = 1 << deg(poly);
1134        unsigned int nn = (1 << mm) - 1;
1135
1136        /* primitive polynomial must be of degree m */
1137        if (k != (1u << mm))
1138                return -EINVAL;
1139
1140        for (i = 0; i < nn; i++) {
1141                alpha_to[i] = x;
1142                index_of[x] = i;
1143                if (i && (x == 1))
1144                        /* polynomial is not primitive (a^i=1 with 0<i<2^m-1) */
1145                        return -EINVAL;
1146                x <<= 1;
1147                if (x & k)
1148                        x ^= poly;
1149        }
1150        alpha_to[nn] = 1;
1151        index_of[0] = 0;
1152
1153        return 0;
1154}
1155
1156static uint16_t *create_lookup_table(struct device *dev, int sector_size)
1157{
1158        int degree = (sector_size == 512) ?
1159                        PMECC_GF_DIMENSION_13 :
1160                        PMECC_GF_DIMENSION_14;
1161        unsigned int poly = (sector_size == 512) ?
1162                        PMECC_GF_13_PRIMITIVE_POLY :
1163                        PMECC_GF_14_PRIMITIVE_POLY;
1164        int table_size = (sector_size == 512) ?
1165                        PMECC_LOOKUP_TABLE_SIZE_512 :
1166                        PMECC_LOOKUP_TABLE_SIZE_1024;
1167
1168        int16_t *addr = devm_kzalloc(dev, 2 * table_size * sizeof(uint16_t),
1169                        GFP_KERNEL);
1170        if (addr && build_gf_tables(degree, poly, addr, addr + table_size))
1171                return NULL;
1172
1173        return addr;
1174}
1175
1176static int atmel_pmecc_nand_init_params(struct platform_device *pdev,
1177                                         struct atmel_nand_host *host)
1178{
1179        struct nand_chip *nand_chip = &host->nand_chip;
1180        struct mtd_info *mtd = nand_to_mtd(nand_chip);
1181        struct resource *regs, *regs_pmerr, *regs_rom;
1182        uint16_t *galois_table;
1183        int cap, sector_size, err_no;
1184
1185        err_no = pmecc_choose_ecc(host, &cap, &sector_size);
1186        if (err_no) {
1187                dev_err(host->dev, "The NAND flash's ECC requirement are not support!");
1188                return err_no;
1189        }
1190
1191        if (cap > host->pmecc_corr_cap ||
1192                        sector_size != host->pmecc_sector_size)
1193                dev_info(host->dev, "WARNING: Be Caution! Using different PMECC parameters from Nand ONFI ECC reqirement.\n");
1194
1195        cap = host->pmecc_corr_cap;
1196        sector_size = host->pmecc_sector_size;
1197        host->pmecc_lookup_table_offset = (sector_size == 512) ?
1198                        host->pmecc_lookup_table_offset_512 :
1199                        host->pmecc_lookup_table_offset_1024;
1200
1201        dev_info(host->dev, "Initialize PMECC params, cap: %d, sector: %d\n",
1202                 cap, sector_size);
1203
1204        regs = platform_get_resource(pdev, IORESOURCE_MEM, 1);
1205        if (!regs) {
1206                dev_warn(host->dev,
1207                        "Can't get I/O resource regs for PMECC controller, rolling back on software ECC\n");
1208                nand_chip->ecc.mode = NAND_ECC_SOFT;
1209                return 0;
1210        }
1211
1212        host->ecc = devm_ioremap_resource(&pdev->dev, regs);
1213        if (IS_ERR(host->ecc)) {
1214                err_no = PTR_ERR(host->ecc);
1215                goto err;
1216        }
1217
1218        regs_pmerr = platform_get_resource(pdev, IORESOURCE_MEM, 2);
1219        host->pmerrloc_base = devm_ioremap_resource(&pdev->dev, regs_pmerr);
1220        if (IS_ERR(host->pmerrloc_base)) {
1221                err_no = PTR_ERR(host->pmerrloc_base);
1222                goto err;
1223        }
1224        host->pmerrloc_el_base = host->pmerrloc_base + ATMEL_PMERRLOC_SIGMAx +
1225                (host->caps->pmecc_max_correction + 1) * 4;
1226
1227        if (!host->has_no_lookup_table) {
1228                regs_rom = platform_get_resource(pdev, IORESOURCE_MEM, 3);
1229                host->pmecc_rom_base = devm_ioremap_resource(&pdev->dev,
1230                                                                regs_rom);
1231                if (IS_ERR(host->pmecc_rom_base)) {
1232                        dev_err(host->dev, "Can not get I/O resource for ROM, will build a lookup table in runtime!\n");
1233                        host->has_no_lookup_table = true;
1234                }
1235        }
1236
1237        if (host->has_no_lookup_table) {
1238                /* Build the look-up table in runtime */
1239                galois_table = create_lookup_table(host->dev, sector_size);
1240                if (!galois_table) {
1241                        dev_err(host->dev, "Failed to build a lookup table in runtime!\n");
1242                        err_no = -EINVAL;
1243                        goto err;
1244                }
1245
1246                host->pmecc_rom_base = (void __iomem *)galois_table;
1247                host->pmecc_lookup_table_offset = 0;
1248        }
1249
1250        nand_chip->ecc.size = sector_size;
1251
1252        /* set ECC page size and oob layout */
1253        switch (mtd->writesize) {
1254        case 512:
1255        case 1024:
1256        case 2048:
1257        case 4096:
1258        case 8192:
1259                if (sector_size > mtd->writesize) {
1260                        dev_err(host->dev, "pmecc sector size is bigger than the page size!\n");
1261                        err_no = -EINVAL;
1262                        goto err;
1263                }
1264
1265                host->pmecc_degree = (sector_size == 512) ?
1266                        PMECC_GF_DIMENSION_13 : PMECC_GF_DIMENSION_14;
1267                host->pmecc_cw_len = (1 << host->pmecc_degree) - 1;
1268                host->pmecc_alpha_to = pmecc_get_alpha_to(host);
1269                host->pmecc_index_of = host->pmecc_rom_base +
1270                        host->pmecc_lookup_table_offset;
1271
1272                nand_chip->ecc.strength = cap;
1273                nand_chip->ecc.bytes = pmecc_get_ecc_bytes(cap, sector_size);
1274                nand_chip->ecc.steps = mtd->writesize / sector_size;
1275                nand_chip->ecc.total = nand_chip->ecc.bytes *
1276                        nand_chip->ecc.steps;
1277                if (nand_chip->ecc.total >
1278                                mtd->oobsize - PMECC_OOB_RESERVED_BYTES) {
1279                        dev_err(host->dev, "No room for ECC bytes\n");
1280                        err_no = -EINVAL;
1281                        goto err;
1282                }
1283                pmecc_config_ecc_layout(&atmel_pmecc_oobinfo,
1284                                        mtd->oobsize,
1285                                        nand_chip->ecc.total);
1286
1287                nand_chip->ecc.layout = &atmel_pmecc_oobinfo;
1288                break;
1289        default:
1290                dev_warn(host->dev,
1291                        "Unsupported page size for PMECC, use Software ECC\n");
1292                /* page size not handled by HW ECC */
1293                /* switching back to soft ECC */
1294                nand_chip->ecc.mode = NAND_ECC_SOFT;
1295                return 0;
1296        }
1297
1298        /* Allocate data for PMECC computation */
1299        err_no = pmecc_data_alloc(host);
1300        if (err_no) {
1301                dev_err(host->dev,
1302                                "Cannot allocate memory for PMECC computation!\n");
1303                goto err;
1304        }
1305
1306        nand_chip->options |= NAND_NO_SUBPAGE_WRITE;
1307        nand_chip->ecc.read_page = atmel_nand_pmecc_read_page;
1308        nand_chip->ecc.write_page = atmel_nand_pmecc_write_page;
1309
1310        atmel_pmecc_core_init(mtd);
1311
1312        return 0;
1313
1314err:
1315        return err_no;
1316}
1317
1318/*
1319 * Calculate HW ECC
1320 *
1321 * function called after a write
1322 *
1323 * mtd:        MTD block structure
1324 * dat:        raw data (unused)
1325 * ecc_code:   buffer for ECC
1326 */
1327static int atmel_nand_calculate(struct mtd_info *mtd,
1328                const u_char *dat, unsigned char *ecc_code)
1329{
1330        struct nand_chip *nand_chip = mtd_to_nand(mtd);
1331        struct atmel_nand_host *host = nand_get_controller_data(nand_chip);
1332        unsigned int ecc_value;
1333
1334        /* get the first 2 ECC bytes */
1335        ecc_value = ecc_readl(host->ecc, PR);
1336
1337        ecc_code[0] = ecc_value & 0xFF;
1338        ecc_code[1] = (ecc_value >> 8) & 0xFF;
1339
1340        /* get the last 2 ECC bytes */
1341        ecc_value = ecc_readl(host->ecc, NPR) & ATMEL_ECC_NPARITY;
1342
1343        ecc_code[2] = ecc_value & 0xFF;
1344        ecc_code[3] = (ecc_value >> 8) & 0xFF;
1345
1346        return 0;
1347}
1348
1349/*
1350 * HW ECC read page function
1351 *
1352 * mtd:        mtd info structure
1353 * chip:       nand chip info structure
1354 * buf:        buffer to store read data
1355 * oob_required:    caller expects OOB data read to chip->oob_poi
1356 */
1357static int atmel_nand_read_page(struct mtd_info *mtd, struct nand_chip *chip,
1358                                uint8_t *buf, int oob_required, int page)
1359{
1360        int eccsize = chip->ecc.size;
1361        int eccbytes = chip->ecc.bytes;
1362        uint32_t *eccpos = chip->ecc.layout->eccpos;
1363        uint8_t *p = buf;
1364        uint8_t *oob = chip->oob_poi;
1365        uint8_t *ecc_pos;
1366        int stat;
1367        unsigned int max_bitflips = 0;
1368
1369        /*
1370         * Errata: ALE is incorrectly wired up to the ECC controller
1371         * on the AP7000, so it will include the address cycles in the
1372         * ECC calculation.
1373         *
1374         * Workaround: Reset the parity registers before reading the
1375         * actual data.
1376         */
1377        struct atmel_nand_host *host = nand_get_controller_data(chip);
1378        if (host->board.need_reset_workaround)
1379                ecc_writel(host->ecc, CR, ATMEL_ECC_RST);
1380
1381        /* read the page */
1382        chip->read_buf(mtd, p, eccsize);
1383
1384        /* move to ECC position if needed */
1385        if (eccpos[0] != 0) {
1386                /* This only works on large pages
1387                 * because the ECC controller waits for
1388                 * NAND_CMD_RNDOUTSTART after the
1389                 * NAND_CMD_RNDOUT.
1390                 * anyway, for small pages, the eccpos[0] == 0
1391                 */
1392                chip->cmdfunc(mtd, NAND_CMD_RNDOUT,
1393                                mtd->writesize + eccpos[0], -1);
1394        }
1395
1396        /* the ECC controller needs to read the ECC just after the data */
1397        ecc_pos = oob + eccpos[0];
1398        chip->read_buf(mtd, ecc_pos, eccbytes);
1399
1400        /* check if there's an error */
1401        stat = chip->ecc.correct(mtd, p, oob, NULL);
1402
1403        if (stat < 0) {
1404                mtd->ecc_stats.failed++;
1405        } else {
1406                mtd->ecc_stats.corrected += stat;
1407                max_bitflips = max_t(unsigned int, max_bitflips, stat);
1408        }
1409
1410        /* get back to oob start (end of page) */
1411        chip->cmdfunc(mtd, NAND_CMD_RNDOUT, mtd->writesize, -1);
1412
1413        /* read the oob */
1414        chip->read_buf(mtd, oob, mtd->oobsize);
1415
1416        return max_bitflips;
1417}
1418
1419/*
1420 * HW ECC Correction
1421 *
1422 * function called after a read
1423 *
1424 * mtd:        MTD block structure
1425 * dat:        raw data read from the chip
1426 * read_ecc:   ECC from the chip (unused)
1427 * isnull:     unused
1428 *
1429 * Detect and correct a 1 bit error for a page
1430 */
1431static int atmel_nand_correct(struct mtd_info *mtd, u_char *dat,
1432                u_char *read_ecc, u_char *isnull)
1433{
1434        struct nand_chip *nand_chip = mtd_to_nand(mtd);
1435        struct atmel_nand_host *host = nand_get_controller_data(nand_chip);
1436        unsigned int ecc_status;
1437        unsigned int ecc_word, ecc_bit;
1438
1439        /* get the status from the Status Register */
1440        ecc_status = ecc_readl(host->ecc, SR);
1441
1442        /* if there's no error */
1443        if (likely(!(ecc_status & ATMEL_ECC_RECERR)))
1444                return 0;
1445
1446        /* get error bit offset (4 bits) */
1447        ecc_bit = ecc_readl(host->ecc, PR) & ATMEL_ECC_BITADDR;
1448        /* get word address (12 bits) */
1449        ecc_word = ecc_readl(host->ecc, PR) & ATMEL_ECC_WORDADDR;
1450        ecc_word >>= 4;
1451
1452        /* if there are multiple errors */
1453        if (ecc_status & ATMEL_ECC_MULERR) {
1454                /* check if it is a freshly erased block
1455                 * (filled with 0xff) */
1456                if ((ecc_bit == ATMEL_ECC_BITADDR)
1457                                && (ecc_word == (ATMEL_ECC_WORDADDR >> 4))) {
1458                        /* the block has just been erased, return OK */
1459                        return 0;
1460                }
1461                /* it doesn't seems to be a freshly
1462                 * erased block.
1463                 * We can't correct so many errors */
1464                dev_dbg(host->dev, "atmel_nand : multiple errors detected."
1465                                " Unable to correct.\n");
1466                return -EBADMSG;
1467        }
1468
1469        /* if there's a single bit error : we can correct it */
1470        if (ecc_status & ATMEL_ECC_ECCERR) {
1471                /* there's nothing much to do here.
1472                 * the bit error is on the ECC itself.
1473                 */
1474                dev_dbg(host->dev, "atmel_nand : one bit error on ECC code."
1475                                " Nothing to correct\n");
1476                return 0;
1477        }
1478
1479        dev_dbg(host->dev, "atmel_nand : one bit error on data."
1480                        " (word offset in the page :"
1481                        " 0x%x bit offset : 0x%x)\n",
1482                        ecc_word, ecc_bit);
1483        /* correct the error */
1484        if (nand_chip->options & NAND_BUSWIDTH_16) {
1485                /* 16 bits words */
1486                ((unsigned short *) dat)[ecc_word] ^= (1 << ecc_bit);
1487        } else {
1488                /* 8 bits words */
1489                dat[ecc_word] ^= (1 << ecc_bit);
1490        }
1491        dev_dbg(host->dev, "atmel_nand : error corrected\n");
1492        return 1;
1493}
1494
1495/*
1496 * Enable HW ECC : unused on most chips
1497 */
1498static void atmel_nand_hwctl(struct mtd_info *mtd, int mode)
1499{
1500        struct nand_chip *nand_chip = mtd_to_nand(mtd);
1501        struct atmel_nand_host *host = nand_get_controller_data(nand_chip);
1502
1503        if (host->board.need_reset_workaround)
1504                ecc_writel(host->ecc, CR, ATMEL_ECC_RST);
1505}
1506
1507static int atmel_of_init_port(struct atmel_nand_host *host,
1508                              struct device_node *np)
1509{
1510        u32 val;
1511        u32 offset[2];
1512        int ecc_mode;
1513        struct atmel_nand_data *board = &host->board;
1514        enum of_gpio_flags flags = 0;
1515
1516        host->caps = (struct atmel_nand_caps *)
1517                of_device_get_match_data(host->dev);
1518
1519        if (of_property_read_u32(np, "atmel,nand-addr-offset", &val) == 0) {
1520                if (val >= 32) {
1521                        dev_err(host->dev, "invalid addr-offset %u\n", val);
1522                        return -EINVAL;
1523                }
1524                board->ale = val;
1525        }
1526
1527        if (of_property_read_u32(np, "atmel,nand-cmd-offset", &val) == 0) {
1528                if (val >= 32) {
1529                        dev_err(host->dev, "invalid cmd-offset %u\n", val);
1530                        return -EINVAL;
1531                }
1532                board->cle = val;
1533        }
1534
1535        ecc_mode = of_get_nand_ecc_mode(np);
1536
1537        board->ecc_mode = ecc_mode < 0 ? NAND_ECC_SOFT : ecc_mode;
1538
1539        board->on_flash_bbt = of_get_nand_on_flash_bbt(np);
1540
1541        board->has_dma = of_property_read_bool(np, "atmel,nand-has-dma");
1542
1543        if (of_get_nand_bus_width(np) == 16)
1544                board->bus_width_16 = 1;
1545
1546        board->rdy_pin = of_get_gpio_flags(np, 0, &flags);
1547        board->rdy_pin_active_low = (flags == OF_GPIO_ACTIVE_LOW);
1548
1549        board->enable_pin = of_get_gpio(np, 1);
1550        board->det_pin = of_get_gpio(np, 2);
1551
1552        host->has_pmecc = of_property_read_bool(np, "atmel,has-pmecc");
1553
1554        /* load the nfc driver if there is */
1555        of_platform_populate(np, NULL, NULL, host->dev);
1556
1557        if (!(board->ecc_mode == NAND_ECC_HW) || !host->has_pmecc)
1558                return 0;       /* Not using PMECC */
1559
1560        /* use PMECC, get correction capability, sector size and lookup
1561         * table offset.
1562         * If correction bits and sector size are not specified, then find
1563         * them from NAND ONFI parameters.
1564         */
1565        if (of_property_read_u32(np, "atmel,pmecc-cap", &val) == 0) {
1566                if (val > host->caps->pmecc_max_correction) {
1567                        dev_err(host->dev,
1568                                "Required ECC strength too high: %u max %u\n",
1569                                val, host->caps->pmecc_max_correction);
1570                        return -EINVAL;
1571                }
1572                if ((val != 2)  && (val != 4)  && (val != 8) &&
1573                    (val != 12) && (val != 24) && (val != 32)) {
1574                        dev_err(host->dev,
1575                                "Required ECC strength not supported: %u\n",
1576                                val);
1577                        return -EINVAL;
1578                }
1579                host->pmecc_corr_cap = (u8)val;
1580        }
1581
1582        if (of_property_read_u32(np, "atmel,pmecc-sector-size", &val) == 0) {
1583                if ((val != 512) && (val != 1024)) {
1584                        dev_err(host->dev,
1585                                "Required ECC sector size not supported: %u\n",
1586                                val);
1587                        return -EINVAL;
1588                }
1589                host->pmecc_sector_size = (u16)val;
1590        }
1591
1592        if (of_property_read_u32_array(np, "atmel,pmecc-lookup-table-offset",
1593                        offset, 2) != 0) {
1594                dev_err(host->dev, "Cannot get PMECC lookup table offset, will build a lookup table in runtime.\n");
1595                host->has_no_lookup_table = true;
1596                /* Will build a lookup table and initialize the offset later */
1597                return 0;
1598        }
1599        if (!offset[0] && !offset[1]) {
1600                dev_err(host->dev, "Invalid PMECC lookup table offset\n");
1601                return -EINVAL;
1602        }
1603        host->pmecc_lookup_table_offset_512 = offset[0];
1604        host->pmecc_lookup_table_offset_1024 = offset[1];
1605
1606        return 0;
1607}
1608
1609static int atmel_hw_nand_init_params(struct platform_device *pdev,
1610                                         struct atmel_nand_host *host)
1611{
1612        struct nand_chip *nand_chip = &host->nand_chip;
1613        struct mtd_info *mtd = nand_to_mtd(nand_chip);
1614        struct resource         *regs;
1615
1616        regs = platform_get_resource(pdev, IORESOURCE_MEM, 1);
1617        if (!regs) {
1618                dev_err(host->dev,
1619                        "Can't get I/O resource regs, use software ECC\n");
1620                nand_chip->ecc.mode = NAND_ECC_SOFT;
1621                return 0;
1622        }
1623
1624        host->ecc = devm_ioremap_resource(&pdev->dev, regs);
1625        if (IS_ERR(host->ecc))
1626                return PTR_ERR(host->ecc);
1627
1628        /* ECC is calculated for the whole page (1 step) */
1629        nand_chip->ecc.size = mtd->writesize;
1630
1631        /* set ECC page size and oob layout */
1632        switch (mtd->writesize) {
1633        case 512:
1634                nand_chip->ecc.layout = &atmel_oobinfo_small;
1635                ecc_writel(host->ecc, MR, ATMEL_ECC_PAGESIZE_528);
1636                break;
1637        case 1024:
1638                nand_chip->ecc.layout = &atmel_oobinfo_large;
1639                ecc_writel(host->ecc, MR, ATMEL_ECC_PAGESIZE_1056);
1640                break;
1641        case 2048:
1642                nand_chip->ecc.layout = &atmel_oobinfo_large;
1643                ecc_writel(host->ecc, MR, ATMEL_ECC_PAGESIZE_2112);
1644                break;
1645        case 4096:
1646                nand_chip->ecc.layout = &atmel_oobinfo_large;
1647                ecc_writel(host->ecc, MR, ATMEL_ECC_PAGESIZE_4224);
1648                break;
1649        default:
1650                /* page size not handled by HW ECC */
1651                /* switching back to soft ECC */
1652                nand_chip->ecc.mode = NAND_ECC_SOFT;
1653                return 0;
1654        }
1655
1656        /* set up for HW ECC */
1657        nand_chip->ecc.calculate = atmel_nand_calculate;
1658        nand_chip->ecc.correct = atmel_nand_correct;
1659        nand_chip->ecc.hwctl = atmel_nand_hwctl;
1660        nand_chip->ecc.read_page = atmel_nand_read_page;
1661        nand_chip->ecc.bytes = 4;
1662        nand_chip->ecc.strength = 1;
1663
1664        return 0;
1665}
1666
1667static inline u32 nfc_read_status(struct atmel_nand_host *host)
1668{
1669        u32 err_flags = NFC_SR_DTOE | NFC_SR_UNDEF | NFC_SR_AWB | NFC_SR_ASE;
1670        u32 nfc_status = nfc_readl(host->nfc->hsmc_regs, SR);
1671
1672        if (unlikely(nfc_status & err_flags)) {
1673                if (nfc_status & NFC_SR_DTOE)
1674                        dev_err(host->dev, "NFC: Waiting Nand R/B Timeout Error\n");
1675                else if (nfc_status & NFC_SR_UNDEF)
1676                        dev_err(host->dev, "NFC: Access Undefined Area Error\n");
1677                else if (nfc_status & NFC_SR_AWB)
1678                        dev_err(host->dev, "NFC: Access memory While NFC is busy\n");
1679                else if (nfc_status & NFC_SR_ASE)
1680                        dev_err(host->dev, "NFC: Access memory Size Error\n");
1681        }
1682
1683        return nfc_status;
1684}
1685
1686/* SMC interrupt service routine */
1687static irqreturn_t hsmc_interrupt(int irq, void *dev_id)
1688{
1689        struct atmel_nand_host *host = dev_id;
1690        u32 status, mask, pending;
1691        irqreturn_t ret = IRQ_NONE;
1692
1693        status = nfc_read_status(host);
1694        mask = nfc_readl(host->nfc->hsmc_regs, IMR);
1695        pending = status & mask;
1696
1697        if (pending & NFC_SR_XFR_DONE) {
1698                complete(&host->nfc->comp_xfer_done);
1699                nfc_writel(host->nfc->hsmc_regs, IDR, NFC_SR_XFR_DONE);
1700                ret = IRQ_HANDLED;
1701        }
1702        if (pending & host->nfc->caps->rb_mask) {
1703                complete(&host->nfc->comp_ready);
1704                nfc_writel(host->nfc->hsmc_regs, IDR, host->nfc->caps->rb_mask);
1705                ret = IRQ_HANDLED;
1706        }
1707        if (pending & NFC_SR_CMD_DONE) {
1708                complete(&host->nfc->comp_cmd_done);
1709                nfc_writel(host->nfc->hsmc_regs, IDR, NFC_SR_CMD_DONE);
1710                ret = IRQ_HANDLED;
1711        }
1712
1713        return ret;
1714}
1715
1716/* NFC(Nand Flash Controller) related functions */
1717static void nfc_prepare_interrupt(struct atmel_nand_host *host, u32 flag)
1718{
1719        if (flag & NFC_SR_XFR_DONE)
1720                init_completion(&host->nfc->comp_xfer_done);
1721
1722        if (flag & host->nfc->caps->rb_mask)
1723                init_completion(&host->nfc->comp_ready);
1724
1725        if (flag & NFC_SR_CMD_DONE)
1726                init_completion(&host->nfc->comp_cmd_done);
1727
1728        /* Enable interrupt that need to wait for */
1729        nfc_writel(host->nfc->hsmc_regs, IER, flag);
1730}
1731
1732static int nfc_wait_interrupt(struct atmel_nand_host *host, u32 flag)
1733{
1734        int i, index = 0;
1735        struct completion *comp[3];     /* Support 3 interrupt completion */
1736
1737        if (flag & NFC_SR_XFR_DONE)
1738                comp[index++] = &host->nfc->comp_xfer_done;
1739
1740        if (flag & host->nfc->caps->rb_mask)
1741                comp[index++] = &host->nfc->comp_ready;
1742
1743        if (flag & NFC_SR_CMD_DONE)
1744                comp[index++] = &host->nfc->comp_cmd_done;
1745
1746        if (index == 0) {
1747                dev_err(host->dev, "Unknown interrupt flag: 0x%08x\n", flag);
1748                return -EINVAL;
1749        }
1750
1751        for (i = 0; i < index; i++) {
1752                if (wait_for_completion_timeout(comp[i],
1753                                msecs_to_jiffies(NFC_TIME_OUT_MS)))
1754                        continue;       /* wait for next completion */
1755                else
1756                        goto err_timeout;
1757        }
1758
1759        return 0;
1760
1761err_timeout:
1762        dev_err(host->dev, "Time out to wait for interrupt: 0x%08x\n", flag);
1763        /* Disable the interrupt as it is not handled by interrupt handler */
1764        nfc_writel(host->nfc->hsmc_regs, IDR, flag);
1765        return -ETIMEDOUT;
1766}
1767
1768static int nfc_send_command(struct atmel_nand_host *host,
1769        unsigned int cmd, unsigned int addr, unsigned char cycle0)
1770{
1771        unsigned long timeout;
1772        u32 flag = NFC_SR_CMD_DONE;
1773        flag |= cmd & NFCADDR_CMD_DATAEN ? NFC_SR_XFR_DONE : 0;
1774
1775        dev_dbg(host->dev,
1776                "nfc_cmd: 0x%08x, addr1234: 0x%08x, cycle0: 0x%02x\n",
1777                cmd, addr, cycle0);
1778
1779        timeout = jiffies + msecs_to_jiffies(NFC_TIME_OUT_MS);
1780        while (nfc_readl(host->nfc->hsmc_regs, SR) & NFC_SR_BUSY) {
1781                if (time_after(jiffies, timeout)) {
1782                        dev_err(host->dev,
1783                                "Time out to wait for NFC ready!\n");
1784                        return -ETIMEDOUT;
1785                }
1786        }
1787
1788        nfc_prepare_interrupt(host, flag);
1789        nfc_writel(host->nfc->hsmc_regs, CYCLE0, cycle0);
1790        nfc_cmd_addr1234_writel(cmd, addr, host->nfc->base_cmd_regs);
1791        return nfc_wait_interrupt(host, flag);
1792}
1793
1794static int nfc_device_ready(struct mtd_info *mtd)
1795{
1796        u32 status, mask;
1797        struct nand_chip *nand_chip = mtd_to_nand(mtd);
1798        struct atmel_nand_host *host = nand_get_controller_data(nand_chip);
1799
1800        status = nfc_read_status(host);
1801        mask = nfc_readl(host->nfc->hsmc_regs, IMR);
1802
1803        /* The mask should be 0. If not we may lost interrupts */
1804        if (unlikely(mask & status))
1805                dev_err(host->dev, "Lost the interrupt flags: 0x%08x\n",
1806                                mask & status);
1807
1808        return status & host->nfc->caps->rb_mask;
1809}
1810
1811static void nfc_select_chip(struct mtd_info *mtd, int chip)
1812{
1813        struct nand_chip *nand_chip = mtd_to_nand(mtd);
1814        struct atmel_nand_host *host = nand_get_controller_data(nand_chip);
1815
1816        if (chip == -1)
1817                nfc_writel(host->nfc->hsmc_regs, CTRL, NFC_CTRL_DISABLE);
1818        else
1819                nfc_writel(host->nfc->hsmc_regs, CTRL, NFC_CTRL_ENABLE);
1820}
1821
1822static int nfc_make_addr(struct mtd_info *mtd, int command, int column,
1823                int page_addr, unsigned int *addr1234, unsigned int *cycle0)
1824{
1825        struct nand_chip *chip = mtd_to_nand(mtd);
1826
1827        int acycle = 0;
1828        unsigned char addr_bytes[8];
1829        int index = 0, bit_shift;
1830
1831        BUG_ON(addr1234 == NULL || cycle0 == NULL);
1832
1833        *cycle0 = 0;
1834        *addr1234 = 0;
1835
1836        if (column != -1) {
1837                if (chip->options & NAND_BUSWIDTH_16 &&
1838                                !nand_opcode_8bits(command))
1839                        column >>= 1;
1840                addr_bytes[acycle++] = column & 0xff;
1841                if (mtd->writesize > 512)
1842                        addr_bytes[acycle++] = (column >> 8) & 0xff;
1843        }
1844
1845        if (page_addr != -1) {
1846                addr_bytes[acycle++] = page_addr & 0xff;
1847                addr_bytes[acycle++] = (page_addr >> 8) & 0xff;
1848                if (chip->chipsize > (128 << 20))
1849                        addr_bytes[acycle++] = (page_addr >> 16) & 0xff;
1850        }
1851
1852        if (acycle > 4)
1853                *cycle0 = addr_bytes[index++];
1854
1855        for (bit_shift = 0; index < acycle; bit_shift += 8)
1856                *addr1234 += addr_bytes[index++] << bit_shift;
1857
1858        /* return acycle in cmd register */
1859        return acycle << NFCADDR_CMD_ACYCLE_BIT_POS;
1860}
1861
1862static void nfc_nand_command(struct mtd_info *mtd, unsigned int command,
1863                                int column, int page_addr)
1864{
1865        struct nand_chip *chip = mtd_to_nand(mtd);
1866        struct atmel_nand_host *host = nand_get_controller_data(chip);
1867        unsigned long timeout;
1868        unsigned int nfc_addr_cmd = 0;
1869
1870        unsigned int cmd1 = command << NFCADDR_CMD_CMD1_BIT_POS;
1871
1872        /* Set default settings: no cmd2, no addr cycle. read from nand */
1873        unsigned int cmd2 = 0;
1874        unsigned int vcmd2 = 0;
1875        int acycle = NFCADDR_CMD_ACYCLE_NONE;
1876        int csid = NFCADDR_CMD_CSID_3;
1877        int dataen = NFCADDR_CMD_DATADIS;
1878        int nfcwr = NFCADDR_CMD_NFCRD;
1879        unsigned int addr1234 = 0;
1880        unsigned int cycle0 = 0;
1881        bool do_addr = true;
1882        host->nfc->data_in_sram = NULL;
1883
1884        dev_dbg(host->dev, "%s: cmd = 0x%02x, col = 0x%08x, page = 0x%08x\n",
1885             __func__, command, column, page_addr);
1886
1887        switch (command) {
1888        case NAND_CMD_RESET:
1889                nfc_addr_cmd = cmd1 | acycle | csid | dataen | nfcwr;
1890                nfc_send_command(host, nfc_addr_cmd, addr1234, cycle0);
1891                udelay(chip->chip_delay);
1892
1893                nfc_nand_command(mtd, NAND_CMD_STATUS, -1, -1);
1894                timeout = jiffies + msecs_to_jiffies(NFC_TIME_OUT_MS);
1895                while (!(chip->read_byte(mtd) & NAND_STATUS_READY)) {
1896                        if (time_after(jiffies, timeout)) {
1897                                dev_err(host->dev,
1898                                        "Time out to wait status ready!\n");
1899                                break;
1900                        }
1901                }
1902                return;
1903        case NAND_CMD_STATUS:
1904                do_addr = false;
1905                break;
1906        case NAND_CMD_PARAM:
1907        case NAND_CMD_READID:
1908                do_addr = false;
1909                acycle = NFCADDR_CMD_ACYCLE_1;
1910                if (column != -1)
1911                        addr1234 = column;
1912                break;
1913        case NAND_CMD_RNDOUT:
1914                cmd2 = NAND_CMD_RNDOUTSTART << NFCADDR_CMD_CMD2_BIT_POS;
1915                vcmd2 = NFCADDR_CMD_VCMD2;
1916                break;
1917        case NAND_CMD_READ0:
1918        case NAND_CMD_READOOB:
1919                if (command == NAND_CMD_READOOB) {
1920                        column += mtd->writesize;
1921                        command = NAND_CMD_READ0; /* only READ0 is valid */
1922                        cmd1 = command << NFCADDR_CMD_CMD1_BIT_POS;
1923                }
1924                if (host->nfc->use_nfc_sram) {
1925                        /* Enable Data transfer to sram */
1926                        dataen = NFCADDR_CMD_DATAEN;
1927
1928                        /* Need enable PMECC now, since NFC will transfer
1929                         * data in bus after sending nfc read command.
1930                         */
1931                        if (chip->ecc.mode == NAND_ECC_HW && host->has_pmecc)
1932                                pmecc_enable(host, NAND_ECC_READ);
1933                }
1934
1935                cmd2 = NAND_CMD_READSTART << NFCADDR_CMD_CMD2_BIT_POS;
1936                vcmd2 = NFCADDR_CMD_VCMD2;
1937                break;
1938        /* For prgramming command, the cmd need set to write enable */
1939        case NAND_CMD_PAGEPROG:
1940        case NAND_CMD_SEQIN:
1941        case NAND_CMD_RNDIN:
1942                nfcwr = NFCADDR_CMD_NFCWR;
1943                if (host->nfc->will_write_sram && command == NAND_CMD_SEQIN)
1944                        dataen = NFCADDR_CMD_DATAEN;
1945                break;
1946        default:
1947                break;
1948        }
1949
1950        if (do_addr)
1951                acycle = nfc_make_addr(mtd, command, column, page_addr,
1952                                &addr1234, &cycle0);
1953
1954        nfc_addr_cmd = cmd1 | cmd2 | vcmd2 | acycle | csid | dataen | nfcwr;
1955        nfc_send_command(host, nfc_addr_cmd, addr1234, cycle0);
1956
1957        /*
1958         * Program and erase have their own busy handlers status, sequential
1959         * in, and deplete1 need no delay.
1960         */
1961        switch (command) {
1962        case NAND_CMD_CACHEDPROG:
1963        case NAND_CMD_PAGEPROG:
1964        case NAND_CMD_ERASE1:
1965        case NAND_CMD_ERASE2:
1966        case NAND_CMD_RNDIN:
1967        case NAND_CMD_STATUS:
1968        case NAND_CMD_RNDOUT:
1969        case NAND_CMD_SEQIN:
1970        case NAND_CMD_READID:
1971                return;
1972
1973        case NAND_CMD_READ0:
1974                if (dataen == NFCADDR_CMD_DATAEN) {
1975                        host->nfc->data_in_sram = host->nfc->sram_bank0 +
1976                                nfc_get_sram_off(host);
1977                        return;
1978                }
1979                /* fall through */
1980        default:
1981                nfc_prepare_interrupt(host, host->nfc->caps->rb_mask);
1982                nfc_wait_interrupt(host, host->nfc->caps->rb_mask);
1983        }
1984}
1985
1986static int nfc_sram_write_page(struct mtd_info *mtd, struct nand_chip *chip,
1987                        uint32_t offset, int data_len, const uint8_t *buf,
1988                        int oob_required, int page, int cached, int raw)
1989{
1990        int cfg, len;
1991        int status = 0;
1992        struct atmel_nand_host *host = nand_get_controller_data(chip);
1993        void *sram = host->nfc->sram_bank0 + nfc_get_sram_off(host);
1994
1995        /* Subpage write is not supported */
1996        if (offset || (data_len < mtd->writesize))
1997                return -EINVAL;
1998
1999        len = mtd->writesize;
2000        /* Copy page data to sram that will write to nand via NFC */
2001        if (use_dma) {
2002                if (atmel_nand_dma_op(mtd, (void *)buf, len, 0) != 0)
2003                        /* Fall back to use cpu copy */
2004                        memcpy(sram, buf, len);
2005        } else {
2006                memcpy(sram, buf, len);
2007        }
2008
2009        cfg = nfc_readl(host->nfc->hsmc_regs, CFG);
2010        if (unlikely(raw) && oob_required) {
2011                memcpy(sram + len, chip->oob_poi, mtd->oobsize);
2012                len += mtd->oobsize;
2013                nfc_writel(host->nfc->hsmc_regs, CFG, cfg | NFC_CFG_WSPARE);
2014        } else {
2015                nfc_writel(host->nfc->hsmc_regs, CFG, cfg & ~NFC_CFG_WSPARE);
2016        }
2017
2018        if (chip->ecc.mode == NAND_ECC_HW && host->has_pmecc)
2019                /*
2020                 * When use NFC sram, need set up PMECC before send
2021                 * NAND_CMD_SEQIN command. Since when the nand command
2022                 * is sent, nfc will do transfer from sram and nand.
2023                 */
2024                pmecc_enable(host, NAND_ECC_WRITE);
2025
2026        host->nfc->will_write_sram = true;
2027        chip->cmdfunc(mtd, NAND_CMD_SEQIN, 0x00, page);
2028        host->nfc->will_write_sram = false;
2029
2030        if (likely(!raw))
2031                /* Need to write ecc into oob */
2032                status = chip->ecc.write_page(mtd, chip, buf, oob_required,
2033                                              page);
2034
2035        if (status < 0)
2036                return status;
2037
2038        chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1);
2039        status = chip->waitfunc(mtd, chip);
2040
2041        if ((status & NAND_STATUS_FAIL) && (chip->errstat))
2042                status = chip->errstat(mtd, chip, FL_WRITING, status, page);
2043
2044        if (status & NAND_STATUS_FAIL)
2045                return -EIO;
2046
2047        return 0;
2048}
2049
2050static int nfc_sram_init(struct mtd_info *mtd)
2051{
2052        struct nand_chip *chip = mtd_to_nand(mtd);
2053        struct atmel_nand_host *host = nand_get_controller_data(chip);
2054        int res = 0;
2055
2056        /* Initialize the NFC CFG register */
2057        unsigned int cfg_nfc = 0;
2058
2059        /* set page size and oob layout */
2060        switch (mtd->writesize) {
2061        case 512:
2062                cfg_nfc = NFC_CFG_PAGESIZE_512;
2063                break;
2064        case 1024:
2065                cfg_nfc = NFC_CFG_PAGESIZE_1024;
2066                break;
2067        case 2048:
2068                cfg_nfc = NFC_CFG_PAGESIZE_2048;
2069                break;
2070        case 4096:
2071                cfg_nfc = NFC_CFG_PAGESIZE_4096;
2072                break;
2073        case 8192:
2074                cfg_nfc = NFC_CFG_PAGESIZE_8192;
2075                break;
2076        default:
2077                dev_err(host->dev, "Unsupported page size for NFC.\n");
2078                res = -ENXIO;
2079                return res;
2080        }
2081
2082        /* oob bytes size = (NFCSPARESIZE + 1) * 4
2083         * Max support spare size is 512 bytes. */
2084        cfg_nfc |= (((mtd->oobsize / 4) - 1) << NFC_CFG_NFC_SPARESIZE_BIT_POS
2085                & NFC_CFG_NFC_SPARESIZE);
2086        /* default set a max timeout */
2087        cfg_nfc |= NFC_CFG_RSPARE |
2088                        NFC_CFG_NFC_DTOCYC | NFC_CFG_NFC_DTOMUL;
2089
2090        nfc_writel(host->nfc->hsmc_regs, CFG, cfg_nfc);
2091
2092        host->nfc->will_write_sram = false;
2093        nfc_set_sram_bank(host, 0);
2094
2095        /* Use Write page with NFC SRAM only for PMECC or ECC NONE. */
2096        if (host->nfc->write_by_sram) {
2097                if ((chip->ecc.mode == NAND_ECC_HW && host->has_pmecc) ||
2098                                chip->ecc.mode == NAND_ECC_NONE)
2099                        chip->write_page = nfc_sram_write_page;
2100                else
2101                        host->nfc->write_by_sram = false;
2102        }
2103
2104        dev_info(host->dev, "Using NFC Sram read %s\n",
2105                        host->nfc->write_by_sram ? "and write" : "");
2106        return 0;
2107}
2108
2109static struct platform_driver atmel_nand_nfc_driver;
2110/*
2111 * Probe for the NAND device.
2112 */
2113static int atmel_nand_probe(struct platform_device *pdev)
2114{
2115        struct atmel_nand_host *host;
2116        struct mtd_info *mtd;
2117        struct nand_chip *nand_chip;
2118        struct resource *mem;
2119        int res, irq;
2120
2121        /* Allocate memory for the device structure (and zero it) */
2122        host = devm_kzalloc(&pdev->dev, sizeof(*host), GFP_KERNEL);
2123        if (!host)
2124                return -ENOMEM;
2125
2126        res = platform_driver_register(&atmel_nand_nfc_driver);
2127        if (res)
2128                dev_err(&pdev->dev, "atmel_nand: can't register NFC driver\n");
2129
2130        mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2131        host->io_base = devm_ioremap_resource(&pdev->dev, mem);
2132        if (IS_ERR(host->io_base)) {
2133                res = PTR_ERR(host->io_base);
2134                goto err_nand_ioremap;
2135        }
2136        host->io_phys = (dma_addr_t)mem->start;
2137
2138        nand_chip = &host->nand_chip;
2139        mtd = nand_to_mtd(nand_chip);
2140        host->dev = &pdev->dev;
2141        if (IS_ENABLED(CONFIG_OF) && pdev->dev.of_node) {
2142                nand_set_flash_node(nand_chip, pdev->dev.of_node);
2143                /* Only when CONFIG_OF is enabled of_node can be parsed */
2144                res = atmel_of_init_port(host, pdev->dev.of_node);
2145                if (res)
2146                        goto err_nand_ioremap;
2147        } else {
2148                memcpy(&host->board, dev_get_platdata(&pdev->dev),
2149                       sizeof(struct atmel_nand_data));
2150        }
2151
2152         /* link the private data structures */
2153        nand_set_controller_data(nand_chip, host);
2154        mtd->dev.parent = &pdev->dev;
2155
2156        /* Set address of NAND IO lines */
2157        nand_chip->IO_ADDR_R = host->io_base;
2158        nand_chip->IO_ADDR_W = host->io_base;
2159
2160        if (nand_nfc.is_initialized) {
2161                /* NFC driver is probed and initialized */
2162                host->nfc = &nand_nfc;
2163
2164                nand_chip->select_chip = nfc_select_chip;
2165                nand_chip->dev_ready = nfc_device_ready;
2166                nand_chip->cmdfunc = nfc_nand_command;
2167
2168                /* Initialize the interrupt for NFC */
2169                irq = platform_get_irq(pdev, 0);
2170                if (irq < 0) {
2171                        dev_err(host->dev, "Cannot get HSMC irq!\n");
2172                        res = irq;
2173                        goto err_nand_ioremap;
2174                }
2175
2176                res = devm_request_irq(&pdev->dev, irq, hsmc_interrupt,
2177                                0, "hsmc", host);
2178                if (res) {
2179                        dev_err(&pdev->dev, "Unable to request HSMC irq %d\n",
2180                                irq);
2181                        goto err_nand_ioremap;
2182                }
2183        } else {
2184                res = atmel_nand_set_enable_ready_pins(mtd);
2185                if (res)
2186                        goto err_nand_ioremap;
2187
2188                nand_chip->cmd_ctrl = atmel_nand_cmd_ctrl;
2189        }
2190
2191        nand_chip->ecc.mode = host->board.ecc_mode;
2192        nand_chip->chip_delay = 40;             /* 40us command delay time */
2193
2194        if (host->board.bus_width_16)   /* 16-bit bus width */
2195                nand_chip->options |= NAND_BUSWIDTH_16;
2196
2197        nand_chip->read_buf = atmel_read_buf;
2198        nand_chip->write_buf = atmel_write_buf;
2199
2200        platform_set_drvdata(pdev, host);
2201        atmel_nand_enable(host);
2202
2203        if (gpio_is_valid(host->board.det_pin)) {
2204                res = devm_gpio_request(&pdev->dev,
2205                                host->board.det_pin, "nand_det");
2206                if (res < 0) {
2207                        dev_err(&pdev->dev,
2208                                "can't request det gpio %d\n",
2209                                host->board.det_pin);
2210                        goto err_no_card;
2211                }
2212
2213                res = gpio_direction_input(host->board.det_pin);
2214                if (res < 0) {
2215                        dev_err(&pdev->dev,
2216                                "can't request input direction det gpio %d\n",
2217                                host->board.det_pin);
2218                        goto err_no_card;
2219                }
2220
2221                if (gpio_get_value(host->board.det_pin)) {
2222                        dev_info(&pdev->dev, "No SmartMedia card inserted.\n");
2223                        res = -ENXIO;
2224                        goto err_no_card;
2225                }
2226        }
2227
2228        if (host->board.on_flash_bbt || on_flash_bbt) {
2229                dev_info(&pdev->dev, "Use On Flash BBT\n");
2230                nand_chip->bbt_options |= NAND_BBT_USE_FLASH;
2231        }
2232
2233        if (!host->board.has_dma)
2234                use_dma = 0;
2235
2236        if (use_dma) {
2237                dma_cap_mask_t mask;
2238
2239                dma_cap_zero(mask);
2240                dma_cap_set(DMA_MEMCPY, mask);
2241                host->dma_chan = dma_request_channel(mask, NULL, NULL);
2242                if (!host->dma_chan) {
2243                        dev_err(host->dev, "Failed to request DMA channel\n");
2244                        use_dma = 0;
2245                }
2246        }
2247        if (use_dma)
2248                dev_info(host->dev, "Using %s for DMA transfers.\n",
2249                                        dma_chan_name(host->dma_chan));
2250        else
2251                dev_info(host->dev, "No DMA support for NAND access.\n");
2252
2253        /* first scan to find the device and get the page size */
2254        if (nand_scan_ident(mtd, 1, NULL)) {
2255                res = -ENXIO;
2256                goto err_scan_ident;
2257        }
2258
2259        if (nand_chip->ecc.mode == NAND_ECC_HW) {
2260                if (host->has_pmecc)
2261                        res = atmel_pmecc_nand_init_params(pdev, host);
2262                else
2263                        res = atmel_hw_nand_init_params(pdev, host);
2264
2265                if (res != 0)
2266                        goto err_hw_ecc;
2267        }
2268
2269        /* initialize the nfc configuration register */
2270        if (host->nfc && host->nfc->use_nfc_sram) {
2271                res = nfc_sram_init(mtd);
2272                if (res) {
2273                        host->nfc->use_nfc_sram = false;
2274                        dev_err(host->dev, "Disable use nfc sram for data transfer.\n");
2275                }
2276        }
2277
2278        /* second phase scan */
2279        if (nand_scan_tail(mtd)) {
2280                res = -ENXIO;
2281                goto err_scan_tail;
2282        }
2283
2284        mtd->name = "atmel_nand";
2285        res = mtd_device_register(mtd, host->board.parts,
2286                                  host->board.num_parts);
2287        if (!res)
2288                return res;
2289
2290err_scan_tail:
2291        if (host->has_pmecc && host->nand_chip.ecc.mode == NAND_ECC_HW)
2292                pmecc_writel(host->ecc, CTRL, PMECC_CTRL_DISABLE);
2293err_hw_ecc:
2294err_scan_ident:
2295err_no_card:
2296        atmel_nand_disable(host);
2297        if (host->dma_chan)
2298                dma_release_channel(host->dma_chan);
2299err_nand_ioremap:
2300        return res;
2301}
2302
2303/*
2304 * Remove a NAND device.
2305 */
2306static int atmel_nand_remove(struct platform_device *pdev)
2307{
2308        struct atmel_nand_host *host = platform_get_drvdata(pdev);
2309        struct mtd_info *mtd = nand_to_mtd(&host->nand_chip);
2310
2311        nand_release(mtd);
2312
2313        atmel_nand_disable(host);
2314
2315        if (host->has_pmecc && host->nand_chip.ecc.mode == NAND_ECC_HW) {
2316                pmecc_writel(host->ecc, CTRL, PMECC_CTRL_DISABLE);
2317                pmerrloc_writel(host->pmerrloc_base, ELDIS,
2318                                PMERRLOC_DISABLE);
2319        }
2320
2321        if (host->dma_chan)
2322                dma_release_channel(host->dma_chan);
2323
2324        platform_driver_unregister(&atmel_nand_nfc_driver);
2325
2326        return 0;
2327}
2328
2329/*
2330 * AT91RM9200 does not have PMECC or PMECC Errloc peripherals for
2331 * BCH ECC. Combined with the "atmel,has-pmecc", it is used to describe
2332 * devices from the SAM9 family that have those.
2333 */
2334static const struct atmel_nand_caps at91rm9200_caps = {
2335        .pmecc_correct_erase_page = false,
2336        .pmecc_max_correction = 24,
2337};
2338
2339static const struct atmel_nand_caps sama5d4_caps = {
2340        .pmecc_correct_erase_page = true,
2341        .pmecc_max_correction = 24,
2342};
2343
2344/*
2345 * The PMECC Errloc controller starting in SAMA5D2 is not compatible,
2346 * as the increased correction strength requires more registers.
2347 */
2348static const struct atmel_nand_caps sama5d2_caps = {
2349        .pmecc_correct_erase_page = true,
2350        .pmecc_max_correction = 32,
2351};
2352
2353static const struct of_device_id atmel_nand_dt_ids[] = {
2354        { .compatible = "atmel,at91rm9200-nand", .data = &at91rm9200_caps },
2355        { .compatible = "atmel,sama5d4-nand", .data = &sama5d4_caps },
2356        { .compatible = "atmel,sama5d2-nand", .data = &sama5d2_caps },
2357        { /* sentinel */ }
2358};
2359
2360MODULE_DEVICE_TABLE(of, atmel_nand_dt_ids);
2361
2362static int atmel_nand_nfc_probe(struct platform_device *pdev)
2363{
2364        struct atmel_nfc *nfc = &nand_nfc;
2365        struct resource *nfc_cmd_regs, *nfc_hsmc_regs, *nfc_sram;
2366        int ret;
2367
2368        nfc_cmd_regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2369        nfc->base_cmd_regs = devm_ioremap_resource(&pdev->dev, nfc_cmd_regs);
2370        if (IS_ERR(nfc->base_cmd_regs))
2371                return PTR_ERR(nfc->base_cmd_regs);
2372
2373        nfc_hsmc_regs = platform_get_resource(pdev, IORESOURCE_MEM, 1);
2374        nfc->hsmc_regs = devm_ioremap_resource(&pdev->dev, nfc_hsmc_regs);
2375        if (IS_ERR(nfc->hsmc_regs))
2376                return PTR_ERR(nfc->hsmc_regs);
2377
2378        nfc_sram = platform_get_resource(pdev, IORESOURCE_MEM, 2);
2379        if (nfc_sram) {
2380                nfc->sram_bank0 = (void * __force)
2381                                devm_ioremap_resource(&pdev->dev, nfc_sram);
2382                if (IS_ERR(nfc->sram_bank0)) {
2383                        dev_warn(&pdev->dev, "Fail to ioremap the NFC sram with error: %ld. So disable NFC sram.\n",
2384                                        PTR_ERR(nfc->sram_bank0));
2385                } else {
2386                        nfc->use_nfc_sram = true;
2387                        nfc->sram_bank0_phys = (dma_addr_t)nfc_sram->start;
2388
2389                        if (pdev->dev.of_node)
2390                                nfc->write_by_sram = of_property_read_bool(
2391                                                pdev->dev.of_node,
2392                                                "atmel,write-by-sram");
2393                }
2394        }
2395
2396        nfc->caps = (const struct atmel_nand_nfc_caps *)
2397                of_device_get_match_data(&pdev->dev);
2398        if (!nfc->caps)
2399                return -ENODEV;
2400
2401        nfc_writel(nfc->hsmc_regs, IDR, 0xffffffff);
2402        nfc_readl(nfc->hsmc_regs, SR);  /* clear the NFC_SR */
2403
2404        nfc->clk = devm_clk_get(&pdev->dev, NULL);
2405        if (!IS_ERR(nfc->clk)) {
2406                ret = clk_prepare_enable(nfc->clk);
2407                if (ret)
2408                        return ret;
2409        } else {
2410                dev_warn(&pdev->dev, "NFC clock missing, update your Device Tree");
2411        }
2412
2413        nfc->is_initialized = true;
2414        dev_info(&pdev->dev, "NFC is probed.\n");
2415
2416        return 0;
2417}
2418
2419static int atmel_nand_nfc_remove(struct platform_device *pdev)
2420{
2421        struct atmel_nfc *nfc = &nand_nfc;
2422
2423        if (!IS_ERR(nfc->clk))
2424                clk_disable_unprepare(nfc->clk);
2425
2426        return 0;
2427}
2428
2429static const struct atmel_nand_nfc_caps sama5d3_nfc_caps = {
2430        .rb_mask = NFC_SR_RB_EDGE0,
2431};
2432
2433static const struct atmel_nand_nfc_caps sama5d4_nfc_caps = {
2434        .rb_mask = NFC_SR_RB_EDGE3,
2435};
2436
2437static const struct of_device_id atmel_nand_nfc_match[] = {
2438        { .compatible = "atmel,sama5d3-nfc", .data = &sama5d3_nfc_caps },
2439        { .compatible = "atmel,sama5d4-nfc", .data = &sama5d4_nfc_caps },
2440        { /* sentinel */ }
2441};
2442MODULE_DEVICE_TABLE(of, atmel_nand_nfc_match);
2443
2444static struct platform_driver atmel_nand_nfc_driver = {
2445        .driver = {
2446                .name = "atmel_nand_nfc",
2447                .of_match_table = of_match_ptr(atmel_nand_nfc_match),
2448        },
2449        .probe = atmel_nand_nfc_probe,
2450        .remove = atmel_nand_nfc_remove,
2451};
2452
2453static struct platform_driver atmel_nand_driver = {
2454        .probe          = atmel_nand_probe,
2455        .remove         = atmel_nand_remove,
2456        .driver         = {
2457                .name   = "atmel_nand",
2458                .of_match_table = of_match_ptr(atmel_nand_dt_ids),
2459        },
2460};
2461
2462module_platform_driver(atmel_nand_driver);
2463
2464MODULE_LICENSE("GPL");
2465MODULE_AUTHOR("Rick Bronson");
2466MODULE_DESCRIPTION("NAND/SmartMedia driver for AT91 / AVR32");
2467MODULE_ALIAS("platform:atmel_nand");
2468