linux/drivers/mtd/nand/raw/omap2.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Copyright © 2004 Texas Instruments, Jian Zhang <jzhang@ti.com>
   4 * Copyright © 2004 Micron Technology Inc.
   5 * Copyright © 2004 David Brownell
   6 */
   7
   8#include <linux/platform_device.h>
   9#include <linux/dmaengine.h>
  10#include <linux/dma-mapping.h>
  11#include <linux/delay.h>
  12#include <linux/gpio/consumer.h>
  13#include <linux/module.h>
  14#include <linux/interrupt.h>
  15#include <linux/jiffies.h>
  16#include <linux/sched.h>
  17#include <linux/mtd/mtd.h>
  18#include <linux/mtd/nand-ecc-sw-bch.h>
  19#include <linux/mtd/rawnand.h>
  20#include <linux/mtd/partitions.h>
  21#include <linux/omap-dma.h>
  22#include <linux/io.h>
  23#include <linux/slab.h>
  24#include <linux/of.h>
  25#include <linux/of_device.h>
  26
  27#include <linux/platform_data/elm.h>
  28
  29#include <linux/omap-gpmc.h>
  30#include <linux/platform_data/mtd-nand-omap2.h>
  31
  32#define DRIVER_NAME     "omap2-nand"
  33#define OMAP_NAND_TIMEOUT_MS    5000
  34
  35#define NAND_Ecc_P1e            (1 << 0)
  36#define NAND_Ecc_P2e            (1 << 1)
  37#define NAND_Ecc_P4e            (1 << 2)
  38#define NAND_Ecc_P8e            (1 << 3)
  39#define NAND_Ecc_P16e           (1 << 4)
  40#define NAND_Ecc_P32e           (1 << 5)
  41#define NAND_Ecc_P64e           (1 << 6)
  42#define NAND_Ecc_P128e          (1 << 7)
  43#define NAND_Ecc_P256e          (1 << 8)
  44#define NAND_Ecc_P512e          (1 << 9)
  45#define NAND_Ecc_P1024e         (1 << 10)
  46#define NAND_Ecc_P2048e         (1 << 11)
  47
  48#define NAND_Ecc_P1o            (1 << 16)
  49#define NAND_Ecc_P2o            (1 << 17)
  50#define NAND_Ecc_P4o            (1 << 18)
  51#define NAND_Ecc_P8o            (1 << 19)
  52#define NAND_Ecc_P16o           (1 << 20)
  53#define NAND_Ecc_P32o           (1 << 21)
  54#define NAND_Ecc_P64o           (1 << 22)
  55#define NAND_Ecc_P128o          (1 << 23)
  56#define NAND_Ecc_P256o          (1 << 24)
  57#define NAND_Ecc_P512o          (1 << 25)
  58#define NAND_Ecc_P1024o         (1 << 26)
  59#define NAND_Ecc_P2048o         (1 << 27)
  60
  61#define TF(value)       (value ? 1 : 0)
  62
  63#define P2048e(a)       (TF(a & NAND_Ecc_P2048e)        << 0)
  64#define P2048o(a)       (TF(a & NAND_Ecc_P2048o)        << 1)
  65#define P1e(a)          (TF(a & NAND_Ecc_P1e)           << 2)
  66#define P1o(a)          (TF(a & NAND_Ecc_P1o)           << 3)
  67#define P2e(a)          (TF(a & NAND_Ecc_P2e)           << 4)
  68#define P2o(a)          (TF(a & NAND_Ecc_P2o)           << 5)
  69#define P4e(a)          (TF(a & NAND_Ecc_P4e)           << 6)
  70#define P4o(a)          (TF(a & NAND_Ecc_P4o)           << 7)
  71
  72#define P8e(a)          (TF(a & NAND_Ecc_P8e)           << 0)
  73#define P8o(a)          (TF(a & NAND_Ecc_P8o)           << 1)
  74#define P16e(a)         (TF(a & NAND_Ecc_P16e)          << 2)
  75#define P16o(a)         (TF(a & NAND_Ecc_P16o)          << 3)
  76#define P32e(a)         (TF(a & NAND_Ecc_P32e)          << 4)
  77#define P32o(a)         (TF(a & NAND_Ecc_P32o)          << 5)
  78#define P64e(a)         (TF(a & NAND_Ecc_P64e)          << 6)
  79#define P64o(a)         (TF(a & NAND_Ecc_P64o)          << 7)
  80
  81#define P128e(a)        (TF(a & NAND_Ecc_P128e)         << 0)
  82#define P128o(a)        (TF(a & NAND_Ecc_P128o)         << 1)
  83#define P256e(a)        (TF(a & NAND_Ecc_P256e)         << 2)
  84#define P256o(a)        (TF(a & NAND_Ecc_P256o)         << 3)
  85#define P512e(a)        (TF(a & NAND_Ecc_P512e)         << 4)
  86#define P512o(a)        (TF(a & NAND_Ecc_P512o)         << 5)
  87#define P1024e(a)       (TF(a & NAND_Ecc_P1024e)        << 6)
  88#define P1024o(a)       (TF(a & NAND_Ecc_P1024o)        << 7)
  89
  90#define P8e_s(a)        (TF(a & NAND_Ecc_P8e)           << 0)
  91#define P8o_s(a)        (TF(a & NAND_Ecc_P8o)           << 1)
  92#define P16e_s(a)       (TF(a & NAND_Ecc_P16e)          << 2)
  93#define P16o_s(a)       (TF(a & NAND_Ecc_P16o)          << 3)
  94#define P1e_s(a)        (TF(a & NAND_Ecc_P1e)           << 4)
  95#define P1o_s(a)        (TF(a & NAND_Ecc_P1o)           << 5)
  96#define P2e_s(a)        (TF(a & NAND_Ecc_P2e)           << 6)
  97#define P2o_s(a)        (TF(a & NAND_Ecc_P2o)           << 7)
  98
  99#define P4e_s(a)        (TF(a & NAND_Ecc_P4e)           << 0)
 100#define P4o_s(a)        (TF(a & NAND_Ecc_P4o)           << 1)
 101
 102#define PREFETCH_CONFIG1_CS_SHIFT       24
 103#define ECC_CONFIG_CS_SHIFT             1
 104#define CS_MASK                         0x7
 105#define ENABLE_PREFETCH                 (0x1 << 7)
 106#define DMA_MPU_MODE_SHIFT              2
 107#define ECCSIZE0_SHIFT                  12
 108#define ECCSIZE1_SHIFT                  22
 109#define ECC1RESULTSIZE                  0x1
 110#define ECCCLEAR                        0x100
 111#define ECC1                            0x1
 112#define PREFETCH_FIFOTHRESHOLD_MAX      0x40
 113#define PREFETCH_FIFOTHRESHOLD(val)     ((val) << 8)
 114#define PREFETCH_STATUS_COUNT(val)      (val & 0x00003fff)
 115#define PREFETCH_STATUS_FIFO_CNT(val)   ((val >> 24) & 0x7F)
 116#define STATUS_BUFF_EMPTY               0x00000001
 117
 118#define SECTOR_BYTES            512
 119/* 4 bit padding to make byte aligned, 56 = 52 + 4 */
 120#define BCH4_BIT_PAD            4
 121
 122/* GPMC ecc engine settings for read */
 123#define BCH_WRAPMODE_1          1       /* BCH wrap mode 1 */
 124#define BCH8R_ECC_SIZE0         0x1a    /* ecc_size0 = 26 */
 125#define BCH8R_ECC_SIZE1         0x2     /* ecc_size1 = 2 */
 126#define BCH4R_ECC_SIZE0         0xd     /* ecc_size0 = 13 */
 127#define BCH4R_ECC_SIZE1         0x3     /* ecc_size1 = 3 */
 128
 129/* GPMC ecc engine settings for write */
 130#define BCH_WRAPMODE_6          6       /* BCH wrap mode 6 */
 131#define BCH_ECC_SIZE0           0x0     /* ecc_size0 = 0, no oob protection */
 132#define BCH_ECC_SIZE1           0x20    /* ecc_size1 = 32 */
 133
 134#define BADBLOCK_MARKER_LENGTH          2
 135
 136static u_char bch16_vector[] = {0xf5, 0x24, 0x1c, 0xd0, 0x61, 0xb3, 0xf1, 0x55,
 137                                0x2e, 0x2c, 0x86, 0xa3, 0xed, 0x36, 0x1b, 0x78,
 138                                0x48, 0x76, 0xa9, 0x3b, 0x97, 0xd1, 0x7a, 0x93,
 139                                0x07, 0x0e};
 140static u_char bch8_vector[] = {0xf3, 0xdb, 0x14, 0x16, 0x8b, 0xd2, 0xbe, 0xcc,
 141        0xac, 0x6b, 0xff, 0x99, 0x7b};
 142static u_char bch4_vector[] = {0x00, 0x6b, 0x31, 0xdd, 0x41, 0xbc, 0x10};
 143
 144struct omap_nand_info {
 145        struct nand_chip                nand;
 146        struct platform_device          *pdev;
 147
 148        int                             gpmc_cs;
 149        bool                            dev_ready;
 150        enum nand_io                    xfer_type;
 151        int                             devsize;
 152        enum omap_ecc                   ecc_opt;
 153        struct device_node              *elm_of_node;
 154
 155        unsigned long                   phys_base;
 156        struct completion               comp;
 157        struct dma_chan                 *dma;
 158        int                             gpmc_irq_fifo;
 159        int                             gpmc_irq_count;
 160        enum {
 161                OMAP_NAND_IO_READ = 0,  /* read */
 162                OMAP_NAND_IO_WRITE,     /* write */
 163        } iomode;
 164        u_char                          *buf;
 165        int                                     buf_len;
 166        /* Interface to GPMC */
 167        struct gpmc_nand_regs           reg;
 168        struct gpmc_nand_ops            *ops;
 169        bool                            flash_bbt;
 170        /* fields specific for BCHx_HW ECC scheme */
 171        struct device                   *elm_dev;
 172        /* NAND ready gpio */
 173        struct gpio_desc                *ready_gpiod;
 174};
 175
 176static inline struct omap_nand_info *mtd_to_omap(struct mtd_info *mtd)
 177{
 178        return container_of(mtd_to_nand(mtd), struct omap_nand_info, nand);
 179}
 180
 181/**
 182 * omap_prefetch_enable - configures and starts prefetch transfer
 183 * @cs: cs (chip select) number
 184 * @fifo_th: fifo threshold to be used for read/ write
 185 * @dma_mode: dma mode enable (1) or disable (0)
 186 * @u32_count: number of bytes to be transferred
 187 * @is_write: prefetch read(0) or write post(1) mode
 188 * @info: NAND device structure containing platform data
 189 */
 190static int omap_prefetch_enable(int cs, int fifo_th, int dma_mode,
 191        unsigned int u32_count, int is_write, struct omap_nand_info *info)
 192{
 193        u32 val;
 194
 195        if (fifo_th > PREFETCH_FIFOTHRESHOLD_MAX)
 196                return -1;
 197
 198        if (readl(info->reg.gpmc_prefetch_control))
 199                return -EBUSY;
 200
 201        /* Set the amount of bytes to be prefetched */
 202        writel(u32_count, info->reg.gpmc_prefetch_config2);
 203
 204        /* Set dma/mpu mode, the prefetch read / post write and
 205         * enable the engine. Set which cs is has requested for.
 206         */
 207        val = ((cs << PREFETCH_CONFIG1_CS_SHIFT) |
 208                PREFETCH_FIFOTHRESHOLD(fifo_th) | ENABLE_PREFETCH |
 209                (dma_mode << DMA_MPU_MODE_SHIFT) | (is_write & 0x1));
 210        writel(val, info->reg.gpmc_prefetch_config1);
 211
 212        /*  Start the prefetch engine */
 213        writel(0x1, info->reg.gpmc_prefetch_control);
 214
 215        return 0;
 216}
 217
 218/*
 219 * omap_prefetch_reset - disables and stops the prefetch engine
 220 */
 221static int omap_prefetch_reset(int cs, struct omap_nand_info *info)
 222{
 223        u32 config1;
 224
 225        /* check if the same module/cs is trying to reset */
 226        config1 = readl(info->reg.gpmc_prefetch_config1);
 227        if (((config1 >> PREFETCH_CONFIG1_CS_SHIFT) & CS_MASK) != cs)
 228                return -EINVAL;
 229
 230        /* Stop the PFPW engine */
 231        writel(0x0, info->reg.gpmc_prefetch_control);
 232
 233        /* Reset/disable the PFPW engine */
 234        writel(0x0, info->reg.gpmc_prefetch_config1);
 235
 236        return 0;
 237}
 238
 239/**
 240 * omap_hwcontrol - hardware specific access to control-lines
 241 * @chip: NAND chip object
 242 * @cmd: command to device
 243 * @ctrl:
 244 * NAND_NCE: bit 0 -> don't care
 245 * NAND_CLE: bit 1 -> Command Latch
 246 * NAND_ALE: bit 2 -> Address Latch
 247 *
 248 * NOTE: boards may use different bits for these!!
 249 */
 250static void omap_hwcontrol(struct nand_chip *chip, int cmd, unsigned int ctrl)
 251{
 252        struct omap_nand_info *info = mtd_to_omap(nand_to_mtd(chip));
 253
 254        if (cmd != NAND_CMD_NONE) {
 255                if (ctrl & NAND_CLE)
 256                        writeb(cmd, info->reg.gpmc_nand_command);
 257
 258                else if (ctrl & NAND_ALE)
 259                        writeb(cmd, info->reg.gpmc_nand_address);
 260
 261                else /* NAND_NCE */
 262                        writeb(cmd, info->reg.gpmc_nand_data);
 263        }
 264}
 265
 266/**
 267 * omap_read_buf8 - read data from NAND controller into buffer
 268 * @mtd: MTD device structure
 269 * @buf: buffer to store date
 270 * @len: number of bytes to read
 271 */
 272static void omap_read_buf8(struct mtd_info *mtd, u_char *buf, int len)
 273{
 274        struct nand_chip *nand = mtd_to_nand(mtd);
 275
 276        ioread8_rep(nand->legacy.IO_ADDR_R, buf, len);
 277}
 278
 279/**
 280 * omap_write_buf8 - write buffer to NAND controller
 281 * @mtd: MTD device structure
 282 * @buf: data buffer
 283 * @len: number of bytes to write
 284 */
 285static void omap_write_buf8(struct mtd_info *mtd, const u_char *buf, int len)
 286{
 287        struct omap_nand_info *info = mtd_to_omap(mtd);
 288        u_char *p = (u_char *)buf;
 289        bool status;
 290
 291        while (len--) {
 292                iowrite8(*p++, info->nand.legacy.IO_ADDR_W);
 293                /* wait until buffer is available for write */
 294                do {
 295                        status = info->ops->nand_writebuffer_empty();
 296                } while (!status);
 297        }
 298}
 299
 300/**
 301 * omap_read_buf16 - read data from NAND controller into buffer
 302 * @mtd: MTD device structure
 303 * @buf: buffer to store date
 304 * @len: number of bytes to read
 305 */
 306static void omap_read_buf16(struct mtd_info *mtd, u_char *buf, int len)
 307{
 308        struct nand_chip *nand = mtd_to_nand(mtd);
 309
 310        ioread16_rep(nand->legacy.IO_ADDR_R, buf, len / 2);
 311}
 312
 313/**
 314 * omap_write_buf16 - write buffer to NAND controller
 315 * @mtd: MTD device structure
 316 * @buf: data buffer
 317 * @len: number of bytes to write
 318 */
 319static void omap_write_buf16(struct mtd_info *mtd, const u_char * buf, int len)
 320{
 321        struct omap_nand_info *info = mtd_to_omap(mtd);
 322        u16 *p = (u16 *) buf;
 323        bool status;
 324        /* FIXME try bursts of writesw() or DMA ... */
 325        len >>= 1;
 326
 327        while (len--) {
 328                iowrite16(*p++, info->nand.legacy.IO_ADDR_W);
 329                /* wait until buffer is available for write */
 330                do {
 331                        status = info->ops->nand_writebuffer_empty();
 332                } while (!status);
 333        }
 334}
 335
 336/**
 337 * omap_read_buf_pref - read data from NAND controller into buffer
 338 * @chip: NAND chip object
 339 * @buf: buffer to store date
 340 * @len: number of bytes to read
 341 */
 342static void omap_read_buf_pref(struct nand_chip *chip, u_char *buf, int len)
 343{
 344        struct mtd_info *mtd = nand_to_mtd(chip);
 345        struct omap_nand_info *info = mtd_to_omap(mtd);
 346        uint32_t r_count = 0;
 347        int ret = 0;
 348        u32 *p = (u32 *)buf;
 349
 350        /* take care of subpage reads */
 351        if (len % 4) {
 352                if (info->nand.options & NAND_BUSWIDTH_16)
 353                        omap_read_buf16(mtd, buf, len % 4);
 354                else
 355                        omap_read_buf8(mtd, buf, len % 4);
 356                p = (u32 *) (buf + len % 4);
 357                len -= len % 4;
 358        }
 359
 360        /* configure and start prefetch transfer */
 361        ret = omap_prefetch_enable(info->gpmc_cs,
 362                        PREFETCH_FIFOTHRESHOLD_MAX, 0x0, len, 0x0, info);
 363        if (ret) {
 364                /* PFPW engine is busy, use cpu copy method */
 365                if (info->nand.options & NAND_BUSWIDTH_16)
 366                        omap_read_buf16(mtd, (u_char *)p, len);
 367                else
 368                        omap_read_buf8(mtd, (u_char *)p, len);
 369        } else {
 370                do {
 371                        r_count = readl(info->reg.gpmc_prefetch_status);
 372                        r_count = PREFETCH_STATUS_FIFO_CNT(r_count);
 373                        r_count = r_count >> 2;
 374                        ioread32_rep(info->nand.legacy.IO_ADDR_R, p, r_count);
 375                        p += r_count;
 376                        len -= r_count << 2;
 377                } while (len);
 378                /* disable and stop the PFPW engine */
 379                omap_prefetch_reset(info->gpmc_cs, info);
 380        }
 381}
 382
 383/**
 384 * omap_write_buf_pref - write buffer to NAND controller
 385 * @chip: NAND chip object
 386 * @buf: data buffer
 387 * @len: number of bytes to write
 388 */
 389static void omap_write_buf_pref(struct nand_chip *chip, const u_char *buf,
 390                                int len)
 391{
 392        struct mtd_info *mtd = nand_to_mtd(chip);
 393        struct omap_nand_info *info = mtd_to_omap(mtd);
 394        uint32_t w_count = 0;
 395        int i = 0, ret = 0;
 396        u16 *p = (u16 *)buf;
 397        unsigned long tim, limit;
 398        u32 val;
 399
 400        /* take care of subpage writes */
 401        if (len % 2 != 0) {
 402                writeb(*buf, info->nand.legacy.IO_ADDR_W);
 403                p = (u16 *)(buf + 1);
 404                len--;
 405        }
 406
 407        /*  configure and start prefetch transfer */
 408        ret = omap_prefetch_enable(info->gpmc_cs,
 409                        PREFETCH_FIFOTHRESHOLD_MAX, 0x0, len, 0x1, info);
 410        if (ret) {
 411                /* PFPW engine is busy, use cpu copy method */
 412                if (info->nand.options & NAND_BUSWIDTH_16)
 413                        omap_write_buf16(mtd, (u_char *)p, len);
 414                else
 415                        omap_write_buf8(mtd, (u_char *)p, len);
 416        } else {
 417                while (len) {
 418                        w_count = readl(info->reg.gpmc_prefetch_status);
 419                        w_count = PREFETCH_STATUS_FIFO_CNT(w_count);
 420                        w_count = w_count >> 1;
 421                        for (i = 0; (i < w_count) && len; i++, len -= 2)
 422                                iowrite16(*p++, info->nand.legacy.IO_ADDR_W);
 423                }
 424                /* wait for data to flushed-out before reset the prefetch */
 425                tim = 0;
 426                limit = (loops_per_jiffy *
 427                                        msecs_to_jiffies(OMAP_NAND_TIMEOUT_MS));
 428                do {
 429                        cpu_relax();
 430                        val = readl(info->reg.gpmc_prefetch_status);
 431                        val = PREFETCH_STATUS_COUNT(val);
 432                } while (val && (tim++ < limit));
 433
 434                /* disable and stop the PFPW engine */
 435                omap_prefetch_reset(info->gpmc_cs, info);
 436        }
 437}
 438
 439/*
 440 * omap_nand_dma_callback: callback on the completion of dma transfer
 441 * @data: pointer to completion data structure
 442 */
 443static void omap_nand_dma_callback(void *data)
 444{
 445        complete((struct completion *) data);
 446}
 447
 448/*
 449 * omap_nand_dma_transfer: configure and start dma transfer
 450 * @mtd: MTD device structure
 451 * @addr: virtual address in RAM of source/destination
 452 * @len: number of data bytes to be transferred
 453 * @is_write: flag for read/write operation
 454 */
 455static inline int omap_nand_dma_transfer(struct mtd_info *mtd, void *addr,
 456                                        unsigned int len, int is_write)
 457{
 458        struct omap_nand_info *info = mtd_to_omap(mtd);
 459        struct dma_async_tx_descriptor *tx;
 460        enum dma_data_direction dir = is_write ? DMA_TO_DEVICE :
 461                                                        DMA_FROM_DEVICE;
 462        struct scatterlist sg;
 463        unsigned long tim, limit;
 464        unsigned n;
 465        int ret;
 466        u32 val;
 467
 468        if (!virt_addr_valid(addr))
 469                goto out_copy;
 470
 471        sg_init_one(&sg, addr, len);
 472        n = dma_map_sg(info->dma->device->dev, &sg, 1, dir);
 473        if (n == 0) {
 474                dev_err(&info->pdev->dev,
 475                        "Couldn't DMA map a %d byte buffer\n", len);
 476                goto out_copy;
 477        }
 478
 479        tx = dmaengine_prep_slave_sg(info->dma, &sg, n,
 480                is_write ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM,
 481                DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
 482        if (!tx)
 483                goto out_copy_unmap;
 484
 485        tx->callback = omap_nand_dma_callback;
 486        tx->callback_param = &info->comp;
 487        dmaengine_submit(tx);
 488
 489        init_completion(&info->comp);
 490
 491        /* setup and start DMA using dma_addr */
 492        dma_async_issue_pending(info->dma);
 493
 494        /*  configure and start prefetch transfer */
 495        ret = omap_prefetch_enable(info->gpmc_cs,
 496                PREFETCH_FIFOTHRESHOLD_MAX, 0x1, len, is_write, info);
 497        if (ret)
 498                /* PFPW engine is busy, use cpu copy method */
 499                goto out_copy_unmap;
 500
 501        wait_for_completion(&info->comp);
 502        tim = 0;
 503        limit = (loops_per_jiffy * msecs_to_jiffies(OMAP_NAND_TIMEOUT_MS));
 504
 505        do {
 506                cpu_relax();
 507                val = readl(info->reg.gpmc_prefetch_status);
 508                val = PREFETCH_STATUS_COUNT(val);
 509        } while (val && (tim++ < limit));
 510
 511        /* disable and stop the PFPW engine */
 512        omap_prefetch_reset(info->gpmc_cs, info);
 513
 514        dma_unmap_sg(info->dma->device->dev, &sg, 1, dir);
 515        return 0;
 516
 517out_copy_unmap:
 518        dma_unmap_sg(info->dma->device->dev, &sg, 1, dir);
 519out_copy:
 520        if (info->nand.options & NAND_BUSWIDTH_16)
 521                is_write == 0 ? omap_read_buf16(mtd, (u_char *) addr, len)
 522                        : omap_write_buf16(mtd, (u_char *) addr, len);
 523        else
 524                is_write == 0 ? omap_read_buf8(mtd, (u_char *) addr, len)
 525                        : omap_write_buf8(mtd, (u_char *) addr, len);
 526        return 0;
 527}
 528
 529/**
 530 * omap_read_buf_dma_pref - read data from NAND controller into buffer
 531 * @chip: NAND chip object
 532 * @buf: buffer to store date
 533 * @len: number of bytes to read
 534 */
 535static void omap_read_buf_dma_pref(struct nand_chip *chip, u_char *buf,
 536                                   int len)
 537{
 538        struct mtd_info *mtd = nand_to_mtd(chip);
 539
 540        if (len <= mtd->oobsize)
 541                omap_read_buf_pref(chip, buf, len);
 542        else
 543                /* start transfer in DMA mode */
 544                omap_nand_dma_transfer(mtd, buf, len, 0x0);
 545}
 546
 547/**
 548 * omap_write_buf_dma_pref - write buffer to NAND controller
 549 * @chip: NAND chip object
 550 * @buf: data buffer
 551 * @len: number of bytes to write
 552 */
 553static void omap_write_buf_dma_pref(struct nand_chip *chip, const u_char *buf,
 554                                    int len)
 555{
 556        struct mtd_info *mtd = nand_to_mtd(chip);
 557
 558        if (len <= mtd->oobsize)
 559                omap_write_buf_pref(chip, buf, len);
 560        else
 561                /* start transfer in DMA mode */
 562                omap_nand_dma_transfer(mtd, (u_char *)buf, len, 0x1);
 563}
 564
 565/*
 566 * omap_nand_irq - GPMC irq handler
 567 * @this_irq: gpmc irq number
 568 * @dev: omap_nand_info structure pointer is passed here
 569 */
 570static irqreturn_t omap_nand_irq(int this_irq, void *dev)
 571{
 572        struct omap_nand_info *info = (struct omap_nand_info *) dev;
 573        u32 bytes;
 574
 575        bytes = readl(info->reg.gpmc_prefetch_status);
 576        bytes = PREFETCH_STATUS_FIFO_CNT(bytes);
 577        bytes = bytes  & 0xFFFC; /* io in multiple of 4 bytes */
 578        if (info->iomode == OMAP_NAND_IO_WRITE) { /* checks for write io */
 579                if (this_irq == info->gpmc_irq_count)
 580                        goto done;
 581
 582                if (info->buf_len && (info->buf_len < bytes))
 583                        bytes = info->buf_len;
 584                else if (!info->buf_len)
 585                        bytes = 0;
 586                iowrite32_rep(info->nand.legacy.IO_ADDR_W, (u32 *)info->buf,
 587                              bytes >> 2);
 588                info->buf = info->buf + bytes;
 589                info->buf_len -= bytes;
 590
 591        } else {
 592                ioread32_rep(info->nand.legacy.IO_ADDR_R, (u32 *)info->buf,
 593                             bytes >> 2);
 594                info->buf = info->buf + bytes;
 595
 596                if (this_irq == info->gpmc_irq_count)
 597                        goto done;
 598        }
 599
 600        return IRQ_HANDLED;
 601
 602done:
 603        complete(&info->comp);
 604
 605        disable_irq_nosync(info->gpmc_irq_fifo);
 606        disable_irq_nosync(info->gpmc_irq_count);
 607
 608        return IRQ_HANDLED;
 609}
 610
 611/*
 612 * omap_read_buf_irq_pref - read data from NAND controller into buffer
 613 * @chip: NAND chip object
 614 * @buf: buffer to store date
 615 * @len: number of bytes to read
 616 */
 617static void omap_read_buf_irq_pref(struct nand_chip *chip, u_char *buf,
 618                                   int len)
 619{
 620        struct mtd_info *mtd = nand_to_mtd(chip);
 621        struct omap_nand_info *info = mtd_to_omap(mtd);
 622        int ret = 0;
 623
 624        if (len <= mtd->oobsize) {
 625                omap_read_buf_pref(chip, buf, len);
 626                return;
 627        }
 628
 629        info->iomode = OMAP_NAND_IO_READ;
 630        info->buf = buf;
 631        init_completion(&info->comp);
 632
 633        /*  configure and start prefetch transfer */
 634        ret = omap_prefetch_enable(info->gpmc_cs,
 635                        PREFETCH_FIFOTHRESHOLD_MAX/2, 0x0, len, 0x0, info);
 636        if (ret)
 637                /* PFPW engine is busy, use cpu copy method */
 638                goto out_copy;
 639
 640        info->buf_len = len;
 641
 642        enable_irq(info->gpmc_irq_count);
 643        enable_irq(info->gpmc_irq_fifo);
 644
 645        /* waiting for read to complete */
 646        wait_for_completion(&info->comp);
 647
 648        /* disable and stop the PFPW engine */
 649        omap_prefetch_reset(info->gpmc_cs, info);
 650        return;
 651
 652out_copy:
 653        if (info->nand.options & NAND_BUSWIDTH_16)
 654                omap_read_buf16(mtd, buf, len);
 655        else
 656                omap_read_buf8(mtd, buf, len);
 657}
 658
 659/*
 660 * omap_write_buf_irq_pref - write buffer to NAND controller
 661 * @chip: NAND chip object
 662 * @buf: data buffer
 663 * @len: number of bytes to write
 664 */
 665static void omap_write_buf_irq_pref(struct nand_chip *chip, const u_char *buf,
 666                                    int len)
 667{
 668        struct mtd_info *mtd = nand_to_mtd(chip);
 669        struct omap_nand_info *info = mtd_to_omap(mtd);
 670        int ret = 0;
 671        unsigned long tim, limit;
 672        u32 val;
 673
 674        if (len <= mtd->oobsize) {
 675                omap_write_buf_pref(chip, buf, len);
 676                return;
 677        }
 678
 679        info->iomode = OMAP_NAND_IO_WRITE;
 680        info->buf = (u_char *) buf;
 681        init_completion(&info->comp);
 682
 683        /* configure and start prefetch transfer : size=24 */
 684        ret = omap_prefetch_enable(info->gpmc_cs,
 685                (PREFETCH_FIFOTHRESHOLD_MAX * 3) / 8, 0x0, len, 0x1, info);
 686        if (ret)
 687                /* PFPW engine is busy, use cpu copy method */
 688                goto out_copy;
 689
 690        info->buf_len = len;
 691
 692        enable_irq(info->gpmc_irq_count);
 693        enable_irq(info->gpmc_irq_fifo);
 694
 695        /* waiting for write to complete */
 696        wait_for_completion(&info->comp);
 697
 698        /* wait for data to flushed-out before reset the prefetch */
 699        tim = 0;
 700        limit = (loops_per_jiffy *  msecs_to_jiffies(OMAP_NAND_TIMEOUT_MS));
 701        do {
 702                val = readl(info->reg.gpmc_prefetch_status);
 703                val = PREFETCH_STATUS_COUNT(val);
 704                cpu_relax();
 705        } while (val && (tim++ < limit));
 706
 707        /* disable and stop the PFPW engine */
 708        omap_prefetch_reset(info->gpmc_cs, info);
 709        return;
 710
 711out_copy:
 712        if (info->nand.options & NAND_BUSWIDTH_16)
 713                omap_write_buf16(mtd, buf, len);
 714        else
 715                omap_write_buf8(mtd, buf, len);
 716}
 717
 718/**
 719 * gen_true_ecc - This function will generate true ECC value
 720 * @ecc_buf: buffer to store ecc code
 721 *
 722 * This generated true ECC value can be used when correcting
 723 * data read from NAND flash memory core
 724 */
 725static void gen_true_ecc(u8 *ecc_buf)
 726{
 727        u32 tmp = ecc_buf[0] | (ecc_buf[1] << 16) |
 728                ((ecc_buf[2] & 0xF0) << 20) | ((ecc_buf[2] & 0x0F) << 8);
 729
 730        ecc_buf[0] = ~(P64o(tmp) | P64e(tmp) | P32o(tmp) | P32e(tmp) |
 731                        P16o(tmp) | P16e(tmp) | P8o(tmp) | P8e(tmp));
 732        ecc_buf[1] = ~(P1024o(tmp) | P1024e(tmp) | P512o(tmp) | P512e(tmp) |
 733                        P256o(tmp) | P256e(tmp) | P128o(tmp) | P128e(tmp));
 734        ecc_buf[2] = ~(P4o(tmp) | P4e(tmp) | P2o(tmp) | P2e(tmp) | P1o(tmp) |
 735                        P1e(tmp) | P2048o(tmp) | P2048e(tmp));
 736}
 737
 738/**
 739 * omap_compare_ecc - Detect (2 bits) and correct (1 bit) error in data
 740 * @ecc_data1:  ecc code from nand spare area
 741 * @ecc_data2:  ecc code from hardware register obtained from hardware ecc
 742 * @page_data:  page data
 743 *
 744 * This function compares two ECC's and indicates if there is an error.
 745 * If the error can be corrected it will be corrected to the buffer.
 746 * If there is no error, %0 is returned. If there is an error but it
 747 * was corrected, %1 is returned. Otherwise, %-1 is returned.
 748 */
 749static int omap_compare_ecc(u8 *ecc_data1,      /* read from NAND memory */
 750                            u8 *ecc_data2,      /* read from register */
 751                            u8 *page_data)
 752{
 753        uint    i;
 754        u8      tmp0_bit[8], tmp1_bit[8], tmp2_bit[8];
 755        u8      comp0_bit[8], comp1_bit[8], comp2_bit[8];
 756        u8      ecc_bit[24];
 757        u8      ecc_sum = 0;
 758        u8      find_bit = 0;
 759        uint    find_byte = 0;
 760        int     isEccFF;
 761
 762        isEccFF = ((*(u32 *)ecc_data1 & 0xFFFFFF) == 0xFFFFFF);
 763
 764        gen_true_ecc(ecc_data1);
 765        gen_true_ecc(ecc_data2);
 766
 767        for (i = 0; i <= 2; i++) {
 768                *(ecc_data1 + i) = ~(*(ecc_data1 + i));
 769                *(ecc_data2 + i) = ~(*(ecc_data2 + i));
 770        }
 771
 772        for (i = 0; i < 8; i++) {
 773                tmp0_bit[i]     = *ecc_data1 % 2;
 774                *ecc_data1      = *ecc_data1 / 2;
 775        }
 776
 777        for (i = 0; i < 8; i++) {
 778                tmp1_bit[i]      = *(ecc_data1 + 1) % 2;
 779                *(ecc_data1 + 1) = *(ecc_data1 + 1) / 2;
 780        }
 781
 782        for (i = 0; i < 8; i++) {
 783                tmp2_bit[i]      = *(ecc_data1 + 2) % 2;
 784                *(ecc_data1 + 2) = *(ecc_data1 + 2) / 2;
 785        }
 786
 787        for (i = 0; i < 8; i++) {
 788                comp0_bit[i]     = *ecc_data2 % 2;
 789                *ecc_data2       = *ecc_data2 / 2;
 790        }
 791
 792        for (i = 0; i < 8; i++) {
 793                comp1_bit[i]     = *(ecc_data2 + 1) % 2;
 794                *(ecc_data2 + 1) = *(ecc_data2 + 1) / 2;
 795        }
 796
 797        for (i = 0; i < 8; i++) {
 798                comp2_bit[i]     = *(ecc_data2 + 2) % 2;
 799                *(ecc_data2 + 2) = *(ecc_data2 + 2) / 2;
 800        }
 801
 802        for (i = 0; i < 6; i++)
 803                ecc_bit[i] = tmp2_bit[i + 2] ^ comp2_bit[i + 2];
 804
 805        for (i = 0; i < 8; i++)
 806                ecc_bit[i + 6] = tmp0_bit[i] ^ comp0_bit[i];
 807
 808        for (i = 0; i < 8; i++)
 809                ecc_bit[i + 14] = tmp1_bit[i] ^ comp1_bit[i];
 810
 811        ecc_bit[22] = tmp2_bit[0] ^ comp2_bit[0];
 812        ecc_bit[23] = tmp2_bit[1] ^ comp2_bit[1];
 813
 814        for (i = 0; i < 24; i++)
 815                ecc_sum += ecc_bit[i];
 816
 817        switch (ecc_sum) {
 818        case 0:
 819                /* Not reached because this function is not called if
 820                 *  ECC values are equal
 821                 */
 822                return 0;
 823
 824        case 1:
 825                /* Uncorrectable error */
 826                pr_debug("ECC UNCORRECTED_ERROR 1\n");
 827                return -EBADMSG;
 828
 829        case 11:
 830                /* UN-Correctable error */
 831                pr_debug("ECC UNCORRECTED_ERROR B\n");
 832                return -EBADMSG;
 833
 834        case 12:
 835                /* Correctable error */
 836                find_byte = (ecc_bit[23] << 8) +
 837                            (ecc_bit[21] << 7) +
 838                            (ecc_bit[19] << 6) +
 839                            (ecc_bit[17] << 5) +
 840                            (ecc_bit[15] << 4) +
 841                            (ecc_bit[13] << 3) +
 842                            (ecc_bit[11] << 2) +
 843                            (ecc_bit[9]  << 1) +
 844                            ecc_bit[7];
 845
 846                find_bit = (ecc_bit[5] << 2) + (ecc_bit[3] << 1) + ecc_bit[1];
 847
 848                pr_debug("Correcting single bit ECC error at offset: "
 849                                "%d, bit: %d\n", find_byte, find_bit);
 850
 851                page_data[find_byte] ^= (1 << find_bit);
 852
 853                return 1;
 854        default:
 855                if (isEccFF) {
 856                        if (ecc_data2[0] == 0 &&
 857                            ecc_data2[1] == 0 &&
 858                            ecc_data2[2] == 0)
 859                                return 0;
 860                }
 861                pr_debug("UNCORRECTED_ERROR default\n");
 862                return -EBADMSG;
 863        }
 864}
 865
 866/**
 867 * omap_correct_data - Compares the ECC read with HW generated ECC
 868 * @chip: NAND chip object
 869 * @dat: page data
 870 * @read_ecc: ecc read from nand flash
 871 * @calc_ecc: ecc read from HW ECC registers
 872 *
 873 * Compares the ecc read from nand spare area with ECC registers values
 874 * and if ECC's mismatched, it will call 'omap_compare_ecc' for error
 875 * detection and correction. If there are no errors, %0 is returned. If
 876 * there were errors and all of the errors were corrected, the number of
 877 * corrected errors is returned. If uncorrectable errors exist, %-1 is
 878 * returned.
 879 */
 880static int omap_correct_data(struct nand_chip *chip, u_char *dat,
 881                             u_char *read_ecc, u_char *calc_ecc)
 882{
 883        struct omap_nand_info *info = mtd_to_omap(nand_to_mtd(chip));
 884        int blockCnt = 0, i = 0, ret = 0;
 885        int stat = 0;
 886
 887        /* Ex NAND_ECC_HW12_2048 */
 888        if (info->nand.ecc.engine_type == NAND_ECC_ENGINE_TYPE_ON_HOST &&
 889            info->nand.ecc.size == 2048)
 890                blockCnt = 4;
 891        else
 892                blockCnt = 1;
 893
 894        for (i = 0; i < blockCnt; i++) {
 895                if (memcmp(read_ecc, calc_ecc, 3) != 0) {
 896                        ret = omap_compare_ecc(read_ecc, calc_ecc, dat);
 897                        if (ret < 0)
 898                                return ret;
 899                        /* keep track of the number of corrected errors */
 900                        stat += ret;
 901                }
 902                read_ecc += 3;
 903                calc_ecc += 3;
 904                dat      += 512;
 905        }
 906        return stat;
 907}
 908
 909/**
 910 * omap_calcuate_ecc - Generate non-inverted ECC bytes.
 911 * @chip: NAND chip object
 912 * @dat: The pointer to data on which ecc is computed
 913 * @ecc_code: The ecc_code buffer
 914 *
 915 * Using noninverted ECC can be considered ugly since writing a blank
 916 * page ie. padding will clear the ECC bytes. This is no problem as long
 917 * nobody is trying to write data on the seemingly unused page. Reading
 918 * an erased page will produce an ECC mismatch between generated and read
 919 * ECC bytes that has to be dealt with separately.
 920 */
 921static int omap_calculate_ecc(struct nand_chip *chip, const u_char *dat,
 922                              u_char *ecc_code)
 923{
 924        struct omap_nand_info *info = mtd_to_omap(nand_to_mtd(chip));
 925        u32 val;
 926
 927        val = readl(info->reg.gpmc_ecc_config);
 928        if (((val >> ECC_CONFIG_CS_SHIFT) & CS_MASK) != info->gpmc_cs)
 929                return -EINVAL;
 930
 931        /* read ecc result */
 932        val = readl(info->reg.gpmc_ecc1_result);
 933        *ecc_code++ = val;          /* P128e, ..., P1e */
 934        *ecc_code++ = val >> 16;    /* P128o, ..., P1o */
 935        /* P2048o, P1024o, P512o, P256o, P2048e, P1024e, P512e, P256e */
 936        *ecc_code++ = ((val >> 8) & 0x0f) | ((val >> 20) & 0xf0);
 937
 938        return 0;
 939}
 940
 941/**
 942 * omap_enable_hwecc - This function enables the hardware ecc functionality
 943 * @chip: NAND chip object
 944 * @mode: Read/Write mode
 945 */
 946static void omap_enable_hwecc(struct nand_chip *chip, int mode)
 947{
 948        struct omap_nand_info *info = mtd_to_omap(nand_to_mtd(chip));
 949        unsigned int dev_width = (chip->options & NAND_BUSWIDTH_16) ? 1 : 0;
 950        u32 val;
 951
 952        /* clear ecc and enable bits */
 953        val = ECCCLEAR | ECC1;
 954        writel(val, info->reg.gpmc_ecc_control);
 955
 956        /* program ecc and result sizes */
 957        val = ((((info->nand.ecc.size >> 1) - 1) << ECCSIZE1_SHIFT) |
 958                         ECC1RESULTSIZE);
 959        writel(val, info->reg.gpmc_ecc_size_config);
 960
 961        switch (mode) {
 962        case NAND_ECC_READ:
 963        case NAND_ECC_WRITE:
 964                writel(ECCCLEAR | ECC1, info->reg.gpmc_ecc_control);
 965                break;
 966        case NAND_ECC_READSYN:
 967                writel(ECCCLEAR, info->reg.gpmc_ecc_control);
 968                break;
 969        default:
 970                dev_info(&info->pdev->dev,
 971                        "error: unrecognized Mode[%d]!\n", mode);
 972                break;
 973        }
 974
 975        /* (ECC 16 or 8 bit col) | ( CS  )  | ECC Enable */
 976        val = (dev_width << 7) | (info->gpmc_cs << 1) | (0x1);
 977        writel(val, info->reg.gpmc_ecc_config);
 978}
 979
 980/**
 981 * omap_wait - wait until the command is done
 982 * @this: NAND Chip structure
 983 *
 984 * Wait function is called during Program and erase operations and
 985 * the way it is called from MTD layer, we should wait till the NAND
 986 * chip is ready after the programming/erase operation has completed.
 987 *
 988 * Erase can take up to 400ms and program up to 20ms according to
 989 * general NAND and SmartMedia specs
 990 */
 991static int omap_wait(struct nand_chip *this)
 992{
 993        struct omap_nand_info *info = mtd_to_omap(nand_to_mtd(this));
 994        unsigned long timeo = jiffies;
 995        int status;
 996
 997        timeo += msecs_to_jiffies(400);
 998
 999        writeb(NAND_CMD_STATUS & 0xFF, info->reg.gpmc_nand_command);
1000        while (time_before(jiffies, timeo)) {
1001                status = readb(info->reg.gpmc_nand_data);
1002                if (status & NAND_STATUS_READY)
1003                        break;
1004                cond_resched();
1005        }
1006
1007        status = readb(info->reg.gpmc_nand_data);
1008        return status;
1009}
1010
1011/**
1012 * omap_dev_ready - checks the NAND Ready GPIO line
1013 * @chip: NAND chip object
1014 *
1015 * Returns true if ready and false if busy.
1016 */
1017static int omap_dev_ready(struct nand_chip *chip)
1018{
1019        struct omap_nand_info *info = mtd_to_omap(nand_to_mtd(chip));
1020
1021        return gpiod_get_value(info->ready_gpiod);
1022}
1023
1024/**
1025 * omap_enable_hwecc_bch - Program GPMC to perform BCH ECC calculation
1026 * @chip: NAND chip object
1027 * @mode: Read/Write mode
1028 *
1029 * When using BCH with SW correction (i.e. no ELM), sector size is set
1030 * to 512 bytes and we use BCH_WRAPMODE_6 wrapping mode
1031 * for both reading and writing with:
1032 * eccsize0 = 0  (no additional protected byte in spare area)
1033 * eccsize1 = 32 (skip 32 nibbles = 16 bytes per sector in spare area)
1034 */
1035static void __maybe_unused omap_enable_hwecc_bch(struct nand_chip *chip,
1036                                                 int mode)
1037{
1038        unsigned int bch_type;
1039        unsigned int dev_width, nsectors;
1040        struct omap_nand_info *info = mtd_to_omap(nand_to_mtd(chip));
1041        enum omap_ecc ecc_opt = info->ecc_opt;
1042        u32 val, wr_mode;
1043        unsigned int ecc_size1, ecc_size0;
1044
1045        /* GPMC configurations for calculating ECC */
1046        switch (ecc_opt) {
1047        case OMAP_ECC_BCH4_CODE_HW_DETECTION_SW:
1048                bch_type = 0;
1049                nsectors = 1;
1050                wr_mode   = BCH_WRAPMODE_6;
1051                ecc_size0 = BCH_ECC_SIZE0;
1052                ecc_size1 = BCH_ECC_SIZE1;
1053                break;
1054        case OMAP_ECC_BCH4_CODE_HW:
1055                bch_type = 0;
1056                nsectors = chip->ecc.steps;
1057                if (mode == NAND_ECC_READ) {
1058                        wr_mode   = BCH_WRAPMODE_1;
1059                        ecc_size0 = BCH4R_ECC_SIZE0;
1060                        ecc_size1 = BCH4R_ECC_SIZE1;
1061                } else {
1062                        wr_mode   = BCH_WRAPMODE_6;
1063                        ecc_size0 = BCH_ECC_SIZE0;
1064                        ecc_size1 = BCH_ECC_SIZE1;
1065                }
1066                break;
1067        case OMAP_ECC_BCH8_CODE_HW_DETECTION_SW:
1068                bch_type = 1;
1069                nsectors = 1;
1070                wr_mode   = BCH_WRAPMODE_6;
1071                ecc_size0 = BCH_ECC_SIZE0;
1072                ecc_size1 = BCH_ECC_SIZE1;
1073                break;
1074        case OMAP_ECC_BCH8_CODE_HW:
1075                bch_type = 1;
1076                nsectors = chip->ecc.steps;
1077                if (mode == NAND_ECC_READ) {
1078                        wr_mode   = BCH_WRAPMODE_1;
1079                        ecc_size0 = BCH8R_ECC_SIZE0;
1080                        ecc_size1 = BCH8R_ECC_SIZE1;
1081                } else {
1082                        wr_mode   = BCH_WRAPMODE_6;
1083                        ecc_size0 = BCH_ECC_SIZE0;
1084                        ecc_size1 = BCH_ECC_SIZE1;
1085                }
1086                break;
1087        case OMAP_ECC_BCH16_CODE_HW:
1088                bch_type = 0x2;
1089                nsectors = chip->ecc.steps;
1090                if (mode == NAND_ECC_READ) {
1091                        wr_mode   = 0x01;
1092                        ecc_size0 = 52; /* ECC bits in nibbles per sector */
1093                        ecc_size1 = 0;  /* non-ECC bits in nibbles per sector */
1094                } else {
1095                        wr_mode   = 0x01;
1096                        ecc_size0 = 0;  /* extra bits in nibbles per sector */
1097                        ecc_size1 = 52; /* OOB bits in nibbles per sector */
1098                }
1099                break;
1100        default:
1101                return;
1102        }
1103
1104        writel(ECC1, info->reg.gpmc_ecc_control);
1105
1106        /* Configure ecc size for BCH */
1107        val = (ecc_size1 << ECCSIZE1_SHIFT) | (ecc_size0 << ECCSIZE0_SHIFT);
1108        writel(val, info->reg.gpmc_ecc_size_config);
1109
1110        dev_width = (chip->options & NAND_BUSWIDTH_16) ? 1 : 0;
1111
1112        /* BCH configuration */
1113        val = ((1                        << 16) | /* enable BCH */
1114               (bch_type                 << 12) | /* BCH4/BCH8/BCH16 */
1115               (wr_mode                  <<  8) | /* wrap mode */
1116               (dev_width                <<  7) | /* bus width */
1117               (((nsectors-1) & 0x7)     <<  4) | /* number of sectors */
1118               (info->gpmc_cs            <<  1) | /* ECC CS */
1119               (0x1));                            /* enable ECC */
1120
1121        writel(val, info->reg.gpmc_ecc_config);
1122
1123        /* Clear ecc and enable bits */
1124        writel(ECCCLEAR | ECC1, info->reg.gpmc_ecc_control);
1125}
1126
1127static u8  bch4_polynomial[] = {0x28, 0x13, 0xcc, 0x39, 0x96, 0xac, 0x7f};
1128static u8  bch8_polynomial[] = {0xef, 0x51, 0x2e, 0x09, 0xed, 0x93, 0x9a, 0xc2,
1129                                0x97, 0x79, 0xe5, 0x24, 0xb5};
1130
1131/**
1132 * _omap_calculate_ecc_bch - Generate ECC bytes for one sector
1133 * @mtd:        MTD device structure
1134 * @dat:        The pointer to data on which ecc is computed
1135 * @ecc_calc:   The ecc_code buffer
1136 * @i:          The sector number (for a multi sector page)
1137 *
1138 * Support calculating of BCH4/8/16 ECC vectors for one sector
1139 * within a page. Sector number is in @i.
1140 */
1141static int _omap_calculate_ecc_bch(struct mtd_info *mtd,
1142                                   const u_char *dat, u_char *ecc_calc, int i)
1143{
1144        struct omap_nand_info *info = mtd_to_omap(mtd);
1145        int eccbytes    = info->nand.ecc.bytes;
1146        struct gpmc_nand_regs   *gpmc_regs = &info->reg;
1147        u8 *ecc_code;
1148        unsigned long bch_val1, bch_val2, bch_val3, bch_val4;
1149        u32 val;
1150        int j;
1151
1152        ecc_code = ecc_calc;
1153        switch (info->ecc_opt) {
1154        case OMAP_ECC_BCH8_CODE_HW_DETECTION_SW:
1155        case OMAP_ECC_BCH8_CODE_HW:
1156                bch_val1 = readl(gpmc_regs->gpmc_bch_result0[i]);
1157                bch_val2 = readl(gpmc_regs->gpmc_bch_result1[i]);
1158                bch_val3 = readl(gpmc_regs->gpmc_bch_result2[i]);
1159                bch_val4 = readl(gpmc_regs->gpmc_bch_result3[i]);
1160                *ecc_code++ = (bch_val4 & 0xFF);
1161                *ecc_code++ = ((bch_val3 >> 24) & 0xFF);
1162                *ecc_code++ = ((bch_val3 >> 16) & 0xFF);
1163                *ecc_code++ = ((bch_val3 >> 8) & 0xFF);
1164                *ecc_code++ = (bch_val3 & 0xFF);
1165                *ecc_code++ = ((bch_val2 >> 24) & 0xFF);
1166                *ecc_code++ = ((bch_val2 >> 16) & 0xFF);
1167                *ecc_code++ = ((bch_val2 >> 8) & 0xFF);
1168                *ecc_code++ = (bch_val2 & 0xFF);
1169                *ecc_code++ = ((bch_val1 >> 24) & 0xFF);
1170                *ecc_code++ = ((bch_val1 >> 16) & 0xFF);
1171                *ecc_code++ = ((bch_val1 >> 8) & 0xFF);
1172                *ecc_code++ = (bch_val1 & 0xFF);
1173                break;
1174        case OMAP_ECC_BCH4_CODE_HW_DETECTION_SW:
1175        case OMAP_ECC_BCH4_CODE_HW:
1176                bch_val1 = readl(gpmc_regs->gpmc_bch_result0[i]);
1177                bch_val2 = readl(gpmc_regs->gpmc_bch_result1[i]);
1178                *ecc_code++ = ((bch_val2 >> 12) & 0xFF);
1179                *ecc_code++ = ((bch_val2 >> 4) & 0xFF);
1180                *ecc_code++ = ((bch_val2 & 0xF) << 4) |
1181                        ((bch_val1 >> 28) & 0xF);
1182                *ecc_code++ = ((bch_val1 >> 20) & 0xFF);
1183                *ecc_code++ = ((bch_val1 >> 12) & 0xFF);
1184                *ecc_code++ = ((bch_val1 >> 4) & 0xFF);
1185                *ecc_code++ = ((bch_val1 & 0xF) << 4);
1186                break;
1187        case OMAP_ECC_BCH16_CODE_HW:
1188                val = readl(gpmc_regs->gpmc_bch_result6[i]);
1189                ecc_code[0]  = ((val >>  8) & 0xFF);
1190                ecc_code[1]  = ((val >>  0) & 0xFF);
1191                val = readl(gpmc_regs->gpmc_bch_result5[i]);
1192                ecc_code[2]  = ((val >> 24) & 0xFF);
1193                ecc_code[3]  = ((val >> 16) & 0xFF);
1194                ecc_code[4]  = ((val >>  8) & 0xFF);
1195                ecc_code[5]  = ((val >>  0) & 0xFF);
1196                val = readl(gpmc_regs->gpmc_bch_result4[i]);
1197                ecc_code[6]  = ((val >> 24) & 0xFF);
1198                ecc_code[7]  = ((val >> 16) & 0xFF);
1199                ecc_code[8]  = ((val >>  8) & 0xFF);
1200                ecc_code[9]  = ((val >>  0) & 0xFF);
1201                val = readl(gpmc_regs->gpmc_bch_result3[i]);
1202                ecc_code[10] = ((val >> 24) & 0xFF);
1203                ecc_code[11] = ((val >> 16) & 0xFF);
1204                ecc_code[12] = ((val >>  8) & 0xFF);
1205                ecc_code[13] = ((val >>  0) & 0xFF);
1206                val = readl(gpmc_regs->gpmc_bch_result2[i]);
1207                ecc_code[14] = ((val >> 24) & 0xFF);
1208                ecc_code[15] = ((val >> 16) & 0xFF);
1209                ecc_code[16] = ((val >>  8) & 0xFF);
1210                ecc_code[17] = ((val >>  0) & 0xFF);
1211                val = readl(gpmc_regs->gpmc_bch_result1[i]);
1212                ecc_code[18] = ((val >> 24) & 0xFF);
1213                ecc_code[19] = ((val >> 16) & 0xFF);
1214                ecc_code[20] = ((val >>  8) & 0xFF);
1215                ecc_code[21] = ((val >>  0) & 0xFF);
1216                val = readl(gpmc_regs->gpmc_bch_result0[i]);
1217                ecc_code[22] = ((val >> 24) & 0xFF);
1218                ecc_code[23] = ((val >> 16) & 0xFF);
1219                ecc_code[24] = ((val >>  8) & 0xFF);
1220                ecc_code[25] = ((val >>  0) & 0xFF);
1221                break;
1222        default:
1223                return -EINVAL;
1224        }
1225
1226        /* ECC scheme specific syndrome customizations */
1227        switch (info->ecc_opt) {
1228        case OMAP_ECC_BCH4_CODE_HW_DETECTION_SW:
1229                /* Add constant polynomial to remainder, so that
1230                 * ECC of blank pages results in 0x0 on reading back
1231                 */
1232                for (j = 0; j < eccbytes; j++)
1233                        ecc_calc[j] ^= bch4_polynomial[j];
1234                break;
1235        case OMAP_ECC_BCH4_CODE_HW:
1236                /* Set  8th ECC byte as 0x0 for ROM compatibility */
1237                ecc_calc[eccbytes - 1] = 0x0;
1238                break;
1239        case OMAP_ECC_BCH8_CODE_HW_DETECTION_SW:
1240                /* Add constant polynomial to remainder, so that
1241                 * ECC of blank pages results in 0x0 on reading back
1242                 */
1243                for (j = 0; j < eccbytes; j++)
1244                        ecc_calc[j] ^= bch8_polynomial[j];
1245                break;
1246        case OMAP_ECC_BCH8_CODE_HW:
1247                /* Set 14th ECC byte as 0x0 for ROM compatibility */
1248                ecc_calc[eccbytes - 1] = 0x0;
1249                break;
1250        case OMAP_ECC_BCH16_CODE_HW:
1251                break;
1252        default:
1253                return -EINVAL;
1254        }
1255
1256        return 0;
1257}
1258
1259/**
1260 * omap_calculate_ecc_bch_sw - ECC generator for sector for SW based correction
1261 * @chip:       NAND chip object
1262 * @dat:        The pointer to data on which ecc is computed
1263 * @ecc_calc:   Buffer storing the calculated ECC bytes
1264 *
1265 * Support calculating of BCH4/8/16 ECC vectors for one sector. This is used
1266 * when SW based correction is required as ECC is required for one sector
1267 * at a time.
1268 */
1269static int omap_calculate_ecc_bch_sw(struct nand_chip *chip,
1270                                     const u_char *dat, u_char *ecc_calc)
1271{
1272        return _omap_calculate_ecc_bch(nand_to_mtd(chip), dat, ecc_calc, 0);
1273}
1274
1275/**
1276 * omap_calculate_ecc_bch_multi - Generate ECC for multiple sectors
1277 * @mtd:        MTD device structure
1278 * @dat:        The pointer to data on which ecc is computed
1279 * @ecc_calc:   Buffer storing the calculated ECC bytes
1280 *
1281 * Support calculating of BCH4/8/16 ecc vectors for the entire page in one go.
1282 */
1283static int omap_calculate_ecc_bch_multi(struct mtd_info *mtd,
1284                                        const u_char *dat, u_char *ecc_calc)
1285{
1286        struct omap_nand_info *info = mtd_to_omap(mtd);
1287        int eccbytes = info->nand.ecc.bytes;
1288        unsigned long nsectors;
1289        int i, ret;
1290
1291        nsectors = ((readl(info->reg.gpmc_ecc_config) >> 4) & 0x7) + 1;
1292        for (i = 0; i < nsectors; i++) {
1293                ret = _omap_calculate_ecc_bch(mtd, dat, ecc_calc, i);
1294                if (ret)
1295                        return ret;
1296
1297                ecc_calc += eccbytes;
1298        }
1299
1300        return 0;
1301}
1302
1303/**
1304 * erased_sector_bitflips - count bit flips
1305 * @data:       data sector buffer
1306 * @oob:        oob buffer
1307 * @info:       omap_nand_info
1308 *
1309 * Check the bit flips in erased page falls below correctable level.
1310 * If falls below, report the page as erased with correctable bit
1311 * flip, else report as uncorrectable page.
1312 */
1313static int erased_sector_bitflips(u_char *data, u_char *oob,
1314                struct omap_nand_info *info)
1315{
1316        int flip_bits = 0, i;
1317
1318        for (i = 0; i < info->nand.ecc.size; i++) {
1319                flip_bits += hweight8(~data[i]);
1320                if (flip_bits > info->nand.ecc.strength)
1321                        return 0;
1322        }
1323
1324        for (i = 0; i < info->nand.ecc.bytes - 1; i++) {
1325                flip_bits += hweight8(~oob[i]);
1326                if (flip_bits > info->nand.ecc.strength)
1327                        return 0;
1328        }
1329
1330        /*
1331         * Bit flips falls in correctable level.
1332         * Fill data area with 0xFF
1333         */
1334        if (flip_bits) {
1335                memset(data, 0xFF, info->nand.ecc.size);
1336                memset(oob, 0xFF, info->nand.ecc.bytes);
1337        }
1338
1339        return flip_bits;
1340}
1341
1342/**
1343 * omap_elm_correct_data - corrects page data area in case error reported
1344 * @chip:       NAND chip object
1345 * @data:       page data
1346 * @read_ecc:   ecc read from nand flash
1347 * @calc_ecc:   ecc read from HW ECC registers
1348 *
1349 * Calculated ecc vector reported as zero in case of non-error pages.
1350 * In case of non-zero ecc vector, first filter out erased-pages, and
1351 * then process data via ELM to detect bit-flips.
1352 */
1353static int omap_elm_correct_data(struct nand_chip *chip, u_char *data,
1354                                 u_char *read_ecc, u_char *calc_ecc)
1355{
1356        struct omap_nand_info *info = mtd_to_omap(nand_to_mtd(chip));
1357        struct nand_ecc_ctrl *ecc = &info->nand.ecc;
1358        int eccsteps = info->nand.ecc.steps;
1359        int i , j, stat = 0;
1360        int eccflag, actual_eccbytes;
1361        struct elm_errorvec err_vec[ERROR_VECTOR_MAX];
1362        u_char *ecc_vec = calc_ecc;
1363        u_char *spare_ecc = read_ecc;
1364        u_char *erased_ecc_vec;
1365        u_char *buf;
1366        int bitflip_count;
1367        bool is_error_reported = false;
1368        u32 bit_pos, byte_pos, error_max, pos;
1369        int err;
1370
1371        switch (info->ecc_opt) {
1372        case OMAP_ECC_BCH4_CODE_HW:
1373                /* omit  7th ECC byte reserved for ROM code compatibility */
1374                actual_eccbytes = ecc->bytes - 1;
1375                erased_ecc_vec = bch4_vector;
1376                break;
1377        case OMAP_ECC_BCH8_CODE_HW:
1378                /* omit 14th ECC byte reserved for ROM code compatibility */
1379                actual_eccbytes = ecc->bytes - 1;
1380                erased_ecc_vec = bch8_vector;
1381                break;
1382        case OMAP_ECC_BCH16_CODE_HW:
1383                actual_eccbytes = ecc->bytes;
1384                erased_ecc_vec = bch16_vector;
1385                break;
1386        default:
1387                dev_err(&info->pdev->dev, "invalid driver configuration\n");
1388                return -EINVAL;
1389        }
1390
1391        /* Initialize elm error vector to zero */
1392        memset(err_vec, 0, sizeof(err_vec));
1393
1394        for (i = 0; i < eccsteps ; i++) {
1395                eccflag = 0;    /* initialize eccflag */
1396
1397                /*
1398                 * Check any error reported,
1399                 * In case of error, non zero ecc reported.
1400                 */
1401                for (j = 0; j < actual_eccbytes; j++) {
1402                        if (calc_ecc[j] != 0) {
1403                                eccflag = 1; /* non zero ecc, error present */
1404                                break;
1405                        }
1406                }
1407
1408                if (eccflag == 1) {
1409                        if (memcmp(calc_ecc, erased_ecc_vec,
1410                                                actual_eccbytes) == 0) {
1411                                /*
1412                                 * calc_ecc[] matches pattern for ECC(all 0xff)
1413                                 * so this is definitely an erased-page
1414                                 */
1415                        } else {
1416                                buf = &data[info->nand.ecc.size * i];
1417                                /*
1418                                 * count number of 0-bits in read_buf.
1419                                 * This check can be removed once a similar
1420                                 * check is introduced in generic NAND driver
1421                                 */
1422                                bitflip_count = erased_sector_bitflips(
1423                                                buf, read_ecc, info);
1424                                if (bitflip_count) {
1425                                        /*
1426                                         * number of 0-bits within ECC limits
1427                                         * So this may be an erased-page
1428                                         */
1429                                        stat += bitflip_count;
1430                                } else {
1431                                        /*
1432                                         * Too many 0-bits. It may be a
1433                                         * - programmed-page, OR
1434                                         * - erased-page with many bit-flips
1435                                         * So this page requires check by ELM
1436                                         */
1437                                        err_vec[i].error_reported = true;
1438                                        is_error_reported = true;
1439                                }
1440                        }
1441                }
1442
1443                /* Update the ecc vector */
1444                calc_ecc += ecc->bytes;
1445                read_ecc += ecc->bytes;
1446        }
1447
1448        /* Check if any error reported */
1449        if (!is_error_reported)
1450                return stat;
1451
1452        /* Decode BCH error using ELM module */
1453        elm_decode_bch_error_page(info->elm_dev, ecc_vec, err_vec);
1454
1455        err = 0;
1456        for (i = 0; i < eccsteps; i++) {
1457                if (err_vec[i].error_uncorrectable) {
1458                        dev_err(&info->pdev->dev,
1459                                "uncorrectable bit-flips found\n");
1460                        err = -EBADMSG;
1461                } else if (err_vec[i].error_reported) {
1462                        for (j = 0; j < err_vec[i].error_count; j++) {
1463                                switch (info->ecc_opt) {
1464                                case OMAP_ECC_BCH4_CODE_HW:
1465                                        /* Add 4 bits to take care of padding */
1466                                        pos = err_vec[i].error_loc[j] +
1467                                                BCH4_BIT_PAD;
1468                                        break;
1469                                case OMAP_ECC_BCH8_CODE_HW:
1470                                case OMAP_ECC_BCH16_CODE_HW:
1471                                        pos = err_vec[i].error_loc[j];
1472                                        break;
1473                                default:
1474                                        return -EINVAL;
1475                                }
1476                                error_max = (ecc->size + actual_eccbytes) * 8;
1477                                /* Calculate bit position of error */
1478                                bit_pos = pos % 8;
1479
1480                                /* Calculate byte position of error */
1481                                byte_pos = (error_max - pos - 1) / 8;
1482
1483                                if (pos < error_max) {
1484                                        if (byte_pos < 512) {
1485                                                pr_debug("bitflip@dat[%d]=%x\n",
1486                                                     byte_pos, data[byte_pos]);
1487                                                data[byte_pos] ^= 1 << bit_pos;
1488                                        } else {
1489                                                pr_debug("bitflip@oob[%d]=%x\n",
1490                                                        (byte_pos - 512),
1491                                                     spare_ecc[byte_pos - 512]);
1492                                                spare_ecc[byte_pos - 512] ^=
1493                                                        1 << bit_pos;
1494                                        }
1495                                } else {
1496                                        dev_err(&info->pdev->dev,
1497                                                "invalid bit-flip @ %d:%d\n",
1498                                                byte_pos, bit_pos);
1499                                        err = -EBADMSG;
1500                                }
1501                        }
1502                }
1503
1504                /* Update number of correctable errors */
1505                stat = max_t(unsigned int, stat, err_vec[i].error_count);
1506
1507                /* Update page data with sector size */
1508                data += ecc->size;
1509                spare_ecc += ecc->bytes;
1510        }
1511
1512        return (err) ? err : stat;
1513}
1514
1515/**
1516 * omap_write_page_bch - BCH ecc based write page function for entire page
1517 * @chip:               nand chip info structure
1518 * @buf:                data buffer
1519 * @oob_required:       must write chip->oob_poi to OOB
1520 * @page:               page
1521 *
1522 * Custom write page method evolved to support multi sector writing in one shot
1523 */
1524static int omap_write_page_bch(struct nand_chip *chip, const uint8_t *buf,
1525                               int oob_required, int page)
1526{
1527        struct mtd_info *mtd = nand_to_mtd(chip);
1528        int ret;
1529        uint8_t *ecc_calc = chip->ecc.calc_buf;
1530
1531        nand_prog_page_begin_op(chip, page, 0, NULL, 0);
1532
1533        /* Enable GPMC ecc engine */
1534        chip->ecc.hwctl(chip, NAND_ECC_WRITE);
1535
1536        /* Write data */
1537        chip->legacy.write_buf(chip, buf, mtd->writesize);
1538
1539        /* Update ecc vector from GPMC result registers */
1540        omap_calculate_ecc_bch_multi(mtd, buf, &ecc_calc[0]);
1541
1542        ret = mtd_ooblayout_set_eccbytes(mtd, ecc_calc, chip->oob_poi, 0,
1543                                         chip->ecc.total);
1544        if (ret)
1545                return ret;
1546
1547        /* Write ecc vector to OOB area */
1548        chip->legacy.write_buf(chip, chip->oob_poi, mtd->oobsize);
1549
1550        return nand_prog_page_end_op(chip);
1551}
1552
1553/**
1554 * omap_write_subpage_bch - BCH hardware ECC based subpage write
1555 * @chip:       nand chip info structure
1556 * @offset:     column address of subpage within the page
1557 * @data_len:   data length
1558 * @buf:        data buffer
1559 * @oob_required: must write chip->oob_poi to OOB
1560 * @page: page number to write
1561 *
1562 * OMAP optimized subpage write method.
1563 */
1564static int omap_write_subpage_bch(struct nand_chip *chip, u32 offset,
1565                                  u32 data_len, const u8 *buf,
1566                                  int oob_required, int page)
1567{
1568        struct mtd_info *mtd = nand_to_mtd(chip);
1569        u8 *ecc_calc = chip->ecc.calc_buf;
1570        int ecc_size      = chip->ecc.size;
1571        int ecc_bytes     = chip->ecc.bytes;
1572        int ecc_steps     = chip->ecc.steps;
1573        u32 start_step = offset / ecc_size;
1574        u32 end_step   = (offset + data_len - 1) / ecc_size;
1575        int step, ret = 0;
1576
1577        /*
1578         * Write entire page at one go as it would be optimal
1579         * as ECC is calculated by hardware.
1580         * ECC is calculated for all subpages but we choose
1581         * only what we want.
1582         */
1583        nand_prog_page_begin_op(chip, page, 0, NULL, 0);
1584
1585        /* Enable GPMC ECC engine */
1586        chip->ecc.hwctl(chip, NAND_ECC_WRITE);
1587
1588        /* Write data */
1589        chip->legacy.write_buf(chip, buf, mtd->writesize);
1590
1591        for (step = 0; step < ecc_steps; step++) {
1592                /* mask ECC of un-touched subpages by padding 0xFF */
1593                if (step < start_step || step > end_step)
1594                        memset(ecc_calc, 0xff, ecc_bytes);
1595                else
1596                        ret = _omap_calculate_ecc_bch(mtd, buf, ecc_calc, step);
1597
1598                if (ret)
1599                        return ret;
1600
1601                buf += ecc_size;
1602                ecc_calc += ecc_bytes;
1603        }
1604
1605        /* copy calculated ECC for whole page to chip->buffer->oob */
1606        /* this include masked-value(0xFF) for unwritten subpages */
1607        ecc_calc = chip->ecc.calc_buf;
1608        ret = mtd_ooblayout_set_eccbytes(mtd, ecc_calc, chip->oob_poi, 0,
1609                                         chip->ecc.total);
1610        if (ret)
1611                return ret;
1612
1613        /* write OOB buffer to NAND device */
1614        chip->legacy.write_buf(chip, chip->oob_poi, mtd->oobsize);
1615
1616        return nand_prog_page_end_op(chip);
1617}
1618
1619/**
1620 * omap_read_page_bch - BCH ecc based page read function for entire page
1621 * @chip:               nand chip info structure
1622 * @buf:                buffer to store read data
1623 * @oob_required:       caller requires OOB data read to chip->oob_poi
1624 * @page:               page number to read
1625 *
1626 * For BCH ecc scheme, GPMC used for syndrome calculation and ELM module
1627 * used for error correction.
1628 * Custom method evolved to support ELM error correction & multi sector
1629 * reading. On reading page data area is read along with OOB data with
1630 * ecc engine enabled. ecc vector updated after read of OOB data.
1631 * For non error pages ecc vector reported as zero.
1632 */
1633static int omap_read_page_bch(struct nand_chip *chip, uint8_t *buf,
1634                              int oob_required, int page)
1635{
1636        struct mtd_info *mtd = nand_to_mtd(chip);
1637        uint8_t *ecc_calc = chip->ecc.calc_buf;
1638        uint8_t *ecc_code = chip->ecc.code_buf;
1639        int stat, ret;
1640        unsigned int max_bitflips = 0;
1641
1642        nand_read_page_op(chip, page, 0, NULL, 0);
1643
1644        /* Enable GPMC ecc engine */
1645        chip->ecc.hwctl(chip, NAND_ECC_READ);
1646
1647        /* Read data */
1648        chip->legacy.read_buf(chip, buf, mtd->writesize);
1649
1650        /* Read oob bytes */
1651        nand_change_read_column_op(chip,
1652                                   mtd->writesize + BADBLOCK_MARKER_LENGTH,
1653                                   chip->oob_poi + BADBLOCK_MARKER_LENGTH,
1654                                   chip->ecc.total, false);
1655
1656        /* Calculate ecc bytes */
1657        omap_calculate_ecc_bch_multi(mtd, buf, ecc_calc);
1658
1659        ret = mtd_ooblayout_get_eccbytes(mtd, ecc_code, chip->oob_poi, 0,
1660                                         chip->ecc.total);
1661        if (ret)
1662                return ret;
1663
1664        stat = chip->ecc.correct(chip, buf, ecc_code, ecc_calc);
1665
1666        if (stat < 0) {
1667                mtd->ecc_stats.failed++;
1668        } else {
1669                mtd->ecc_stats.corrected += stat;
1670                max_bitflips = max_t(unsigned int, max_bitflips, stat);
1671        }
1672
1673        return max_bitflips;
1674}
1675
1676/**
1677 * is_elm_present - checks for presence of ELM module by scanning DT nodes
1678 * @info: NAND device structure containing platform data
1679 * @elm_node: ELM's DT node
1680 */
1681static bool is_elm_present(struct omap_nand_info *info,
1682                           struct device_node *elm_node)
1683{
1684        struct platform_device *pdev;
1685
1686        /* check whether elm-id is passed via DT */
1687        if (!elm_node) {
1688                dev_err(&info->pdev->dev, "ELM devicetree node not found\n");
1689                return false;
1690        }
1691        pdev = of_find_device_by_node(elm_node);
1692        /* check whether ELM device is registered */
1693        if (!pdev) {
1694                dev_err(&info->pdev->dev, "ELM device not found\n");
1695                return false;
1696        }
1697        /* ELM module available, now configure it */
1698        info->elm_dev = &pdev->dev;
1699        return true;
1700}
1701
1702static bool omap2_nand_ecc_check(struct omap_nand_info *info)
1703{
1704        bool ecc_needs_bch, ecc_needs_omap_bch, ecc_needs_elm;
1705
1706        switch (info->ecc_opt) {
1707        case OMAP_ECC_BCH4_CODE_HW_DETECTION_SW:
1708        case OMAP_ECC_BCH8_CODE_HW_DETECTION_SW:
1709                ecc_needs_omap_bch = false;
1710                ecc_needs_bch = true;
1711                ecc_needs_elm = false;
1712                break;
1713        case OMAP_ECC_BCH4_CODE_HW:
1714        case OMAP_ECC_BCH8_CODE_HW:
1715        case OMAP_ECC_BCH16_CODE_HW:
1716                ecc_needs_omap_bch = true;
1717                ecc_needs_bch = false;
1718                ecc_needs_elm = true;
1719                break;
1720        default:
1721                ecc_needs_omap_bch = false;
1722                ecc_needs_bch = false;
1723                ecc_needs_elm = false;
1724                break;
1725        }
1726
1727        if (ecc_needs_bch && !IS_ENABLED(CONFIG_MTD_NAND_ECC_SW_BCH)) {
1728                dev_err(&info->pdev->dev,
1729                        "CONFIG_MTD_NAND_ECC_SW_BCH not enabled\n");
1730                return false;
1731        }
1732        if (ecc_needs_omap_bch && !IS_ENABLED(CONFIG_MTD_NAND_OMAP_BCH)) {
1733                dev_err(&info->pdev->dev,
1734                        "CONFIG_MTD_NAND_OMAP_BCH not enabled\n");
1735                return false;
1736        }
1737        if (ecc_needs_elm && !is_elm_present(info, info->elm_of_node)) {
1738                dev_err(&info->pdev->dev, "ELM not available\n");
1739                return false;
1740        }
1741
1742        return true;
1743}
1744
1745static const char * const nand_xfer_types[] = {
1746        [NAND_OMAP_PREFETCH_POLLED] = "prefetch-polled",
1747        [NAND_OMAP_POLLED] = "polled",
1748        [NAND_OMAP_PREFETCH_DMA] = "prefetch-dma",
1749        [NAND_OMAP_PREFETCH_IRQ] = "prefetch-irq",
1750};
1751
1752static int omap_get_dt_info(struct device *dev, struct omap_nand_info *info)
1753{
1754        struct device_node *child = dev->of_node;
1755        int i;
1756        const char *s;
1757        u32 cs;
1758
1759        if (of_property_read_u32(child, "reg", &cs) < 0) {
1760                dev_err(dev, "reg not found in DT\n");
1761                return -EINVAL;
1762        }
1763
1764        info->gpmc_cs = cs;
1765
1766        /* detect availability of ELM module. Won't be present pre-OMAP4 */
1767        info->elm_of_node = of_parse_phandle(child, "ti,elm-id", 0);
1768        if (!info->elm_of_node) {
1769                info->elm_of_node = of_parse_phandle(child, "elm_id", 0);
1770                if (!info->elm_of_node)
1771                        dev_dbg(dev, "ti,elm-id not in DT\n");
1772        }
1773
1774        /* select ecc-scheme for NAND */
1775        if (of_property_read_string(child, "ti,nand-ecc-opt", &s)) {
1776                dev_err(dev, "ti,nand-ecc-opt not found\n");
1777                return -EINVAL;
1778        }
1779
1780        if (!strcmp(s, "sw")) {
1781                info->ecc_opt = OMAP_ECC_HAM1_CODE_SW;
1782        } else if (!strcmp(s, "ham1") ||
1783                   !strcmp(s, "hw") || !strcmp(s, "hw-romcode")) {
1784                info->ecc_opt = OMAP_ECC_HAM1_CODE_HW;
1785        } else if (!strcmp(s, "bch4")) {
1786                if (info->elm_of_node)
1787                        info->ecc_opt = OMAP_ECC_BCH4_CODE_HW;
1788                else
1789                        info->ecc_opt = OMAP_ECC_BCH4_CODE_HW_DETECTION_SW;
1790        } else if (!strcmp(s, "bch8")) {
1791                if (info->elm_of_node)
1792                        info->ecc_opt = OMAP_ECC_BCH8_CODE_HW;
1793                else
1794                        info->ecc_opt = OMAP_ECC_BCH8_CODE_HW_DETECTION_SW;
1795        } else if (!strcmp(s, "bch16")) {
1796                info->ecc_opt = OMAP_ECC_BCH16_CODE_HW;
1797        } else {
1798                dev_err(dev, "unrecognized value for ti,nand-ecc-opt\n");
1799                return -EINVAL;
1800        }
1801
1802        /* select data transfer mode */
1803        if (!of_property_read_string(child, "ti,nand-xfer-type", &s)) {
1804                for (i = 0; i < ARRAY_SIZE(nand_xfer_types); i++) {
1805                        if (!strcasecmp(s, nand_xfer_types[i])) {
1806                                info->xfer_type = i;
1807                                return 0;
1808                        }
1809                }
1810
1811                dev_err(dev, "unrecognized value for ti,nand-xfer-type\n");
1812                return -EINVAL;
1813        }
1814
1815        return 0;
1816}
1817
1818static int omap_ooblayout_ecc(struct mtd_info *mtd, int section,
1819                              struct mtd_oob_region *oobregion)
1820{
1821        struct omap_nand_info *info = mtd_to_omap(mtd);
1822        struct nand_chip *chip = &info->nand;
1823        int off = BADBLOCK_MARKER_LENGTH;
1824
1825        if (info->ecc_opt == OMAP_ECC_HAM1_CODE_HW &&
1826            !(chip->options & NAND_BUSWIDTH_16))
1827                off = 1;
1828
1829        if (section)
1830                return -ERANGE;
1831
1832        oobregion->offset = off;
1833        oobregion->length = chip->ecc.total;
1834
1835        return 0;
1836}
1837
1838static int omap_ooblayout_free(struct mtd_info *mtd, int section,
1839                               struct mtd_oob_region *oobregion)
1840{
1841        struct omap_nand_info *info = mtd_to_omap(mtd);
1842        struct nand_chip *chip = &info->nand;
1843        int off = BADBLOCK_MARKER_LENGTH;
1844
1845        if (info->ecc_opt == OMAP_ECC_HAM1_CODE_HW &&
1846            !(chip->options & NAND_BUSWIDTH_16))
1847                off = 1;
1848
1849        if (section)
1850                return -ERANGE;
1851
1852        off += chip->ecc.total;
1853        if (off >= mtd->oobsize)
1854                return -ERANGE;
1855
1856        oobregion->offset = off;
1857        oobregion->length = mtd->oobsize - off;
1858
1859        return 0;
1860}
1861
1862static const struct mtd_ooblayout_ops omap_ooblayout_ops = {
1863        .ecc = omap_ooblayout_ecc,
1864        .free = omap_ooblayout_free,
1865};
1866
1867static int omap_sw_ooblayout_ecc(struct mtd_info *mtd, int section,
1868                                 struct mtd_oob_region *oobregion)
1869{
1870        struct nand_device *nand = mtd_to_nanddev(mtd);
1871        const struct nand_ecc_sw_bch_conf *engine_conf = nand->ecc.ctx.priv;
1872        int off = BADBLOCK_MARKER_LENGTH;
1873
1874        if (section >= engine_conf->nsteps)
1875                return -ERANGE;
1876
1877        /*
1878         * When SW correction is employed, one OMAP specific marker byte is
1879         * reserved after each ECC step.
1880         */
1881        oobregion->offset = off + (section * (engine_conf->code_size + 1));
1882        oobregion->length = engine_conf->code_size;
1883
1884        return 0;
1885}
1886
1887static int omap_sw_ooblayout_free(struct mtd_info *mtd, int section,
1888                                  struct mtd_oob_region *oobregion)
1889{
1890        struct nand_device *nand = mtd_to_nanddev(mtd);
1891        const struct nand_ecc_sw_bch_conf *engine_conf = nand->ecc.ctx.priv;
1892        int off = BADBLOCK_MARKER_LENGTH;
1893
1894        if (section)
1895                return -ERANGE;
1896
1897        /*
1898         * When SW correction is employed, one OMAP specific marker byte is
1899         * reserved after each ECC step.
1900         */
1901        off += ((engine_conf->code_size + 1) * engine_conf->nsteps);
1902        if (off >= mtd->oobsize)
1903                return -ERANGE;
1904
1905        oobregion->offset = off;
1906        oobregion->length = mtd->oobsize - off;
1907
1908        return 0;
1909}
1910
1911static const struct mtd_ooblayout_ops omap_sw_ooblayout_ops = {
1912        .ecc = omap_sw_ooblayout_ecc,
1913        .free = omap_sw_ooblayout_free,
1914};
1915
1916static int omap_nand_attach_chip(struct nand_chip *chip)
1917{
1918        struct mtd_info *mtd = nand_to_mtd(chip);
1919        struct omap_nand_info *info = mtd_to_omap(mtd);
1920        struct device *dev = &info->pdev->dev;
1921        int min_oobbytes = BADBLOCK_MARKER_LENGTH;
1922        int oobbytes_per_step;
1923        dma_cap_mask_t mask;
1924        int err;
1925
1926        if (chip->bbt_options & NAND_BBT_USE_FLASH)
1927                chip->bbt_options |= NAND_BBT_NO_OOB;
1928        else
1929                chip->options |= NAND_SKIP_BBTSCAN;
1930
1931        /* Re-populate low-level callbacks based on xfer modes */
1932        switch (info->xfer_type) {
1933        case NAND_OMAP_PREFETCH_POLLED:
1934                chip->legacy.read_buf = omap_read_buf_pref;
1935                chip->legacy.write_buf = omap_write_buf_pref;
1936                break;
1937
1938        case NAND_OMAP_POLLED:
1939                /* Use nand_base defaults for {read,write}_buf */
1940                break;
1941
1942        case NAND_OMAP_PREFETCH_DMA:
1943                dma_cap_zero(mask);
1944                dma_cap_set(DMA_SLAVE, mask);
1945                info->dma = dma_request_chan(dev->parent, "rxtx");
1946
1947                if (IS_ERR(info->dma)) {
1948                        dev_err(dev, "DMA engine request failed\n");
1949                        return PTR_ERR(info->dma);
1950                } else {
1951                        struct dma_slave_config cfg;
1952
1953                        memset(&cfg, 0, sizeof(cfg));
1954                        cfg.src_addr = info->phys_base;
1955                        cfg.dst_addr = info->phys_base;
1956                        cfg.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
1957                        cfg.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
1958                        cfg.src_maxburst = 16;
1959                        cfg.dst_maxburst = 16;
1960                        err = dmaengine_slave_config(info->dma, &cfg);
1961                        if (err) {
1962                                dev_err(dev,
1963                                        "DMA engine slave config failed: %d\n",
1964                                        err);
1965                                return err;
1966                        }
1967                        chip->legacy.read_buf = omap_read_buf_dma_pref;
1968                        chip->legacy.write_buf = omap_write_buf_dma_pref;
1969                }
1970                break;
1971
1972        case NAND_OMAP_PREFETCH_IRQ:
1973                info->gpmc_irq_fifo = platform_get_irq(info->pdev, 0);
1974                if (info->gpmc_irq_fifo <= 0)
1975                        return -ENODEV;
1976                err = devm_request_irq(dev, info->gpmc_irq_fifo,
1977                                       omap_nand_irq, IRQF_SHARED,
1978                                       "gpmc-nand-fifo", info);
1979                if (err) {
1980                        dev_err(dev, "Requesting IRQ %d, error %d\n",
1981                                info->gpmc_irq_fifo, err);
1982                        info->gpmc_irq_fifo = 0;
1983                        return err;
1984                }
1985
1986                info->gpmc_irq_count = platform_get_irq(info->pdev, 1);
1987                if (info->gpmc_irq_count <= 0)
1988                        return -ENODEV;
1989                err = devm_request_irq(dev, info->gpmc_irq_count,
1990                                       omap_nand_irq, IRQF_SHARED,
1991                                       "gpmc-nand-count", info);
1992                if (err) {
1993                        dev_err(dev, "Requesting IRQ %d, error %d\n",
1994                                info->gpmc_irq_count, err);
1995                        info->gpmc_irq_count = 0;
1996                        return err;
1997                }
1998
1999                chip->legacy.read_buf = omap_read_buf_irq_pref;
2000                chip->legacy.write_buf = omap_write_buf_irq_pref;
2001
2002                break;
2003
2004        default:
2005                dev_err(dev, "xfer_type %d not supported!\n", info->xfer_type);
2006                return -EINVAL;
2007        }
2008
2009        if (!omap2_nand_ecc_check(info))
2010                return -EINVAL;
2011
2012        /*
2013         * Bail out earlier to let NAND_ECC_ENGINE_TYPE_SOFT code create its own
2014         * ooblayout instead of using ours.
2015         */
2016        if (info->ecc_opt == OMAP_ECC_HAM1_CODE_SW) {
2017                chip->ecc.engine_type = NAND_ECC_ENGINE_TYPE_SOFT;
2018                chip->ecc.algo = NAND_ECC_ALGO_HAMMING;
2019                return 0;
2020        }
2021
2022        /* Populate MTD interface based on ECC scheme */
2023        switch (info->ecc_opt) {
2024        case OMAP_ECC_HAM1_CODE_HW:
2025                dev_info(dev, "nand: using OMAP_ECC_HAM1_CODE_HW\n");
2026                chip->ecc.engine_type   = NAND_ECC_ENGINE_TYPE_ON_HOST;
2027                chip->ecc.bytes         = 3;
2028                chip->ecc.size          = 512;
2029                chip->ecc.strength      = 1;
2030                chip->ecc.calculate     = omap_calculate_ecc;
2031                chip->ecc.hwctl         = omap_enable_hwecc;
2032                chip->ecc.correct       = omap_correct_data;
2033                mtd_set_ooblayout(mtd, &omap_ooblayout_ops);
2034                oobbytes_per_step       = chip->ecc.bytes;
2035
2036                if (!(chip->options & NAND_BUSWIDTH_16))
2037                        min_oobbytes    = 1;
2038
2039                break;
2040
2041        case OMAP_ECC_BCH4_CODE_HW_DETECTION_SW:
2042                pr_info("nand: using OMAP_ECC_BCH4_CODE_HW_DETECTION_SW\n");
2043                chip->ecc.engine_type   = NAND_ECC_ENGINE_TYPE_ON_HOST;
2044                chip->ecc.size          = 512;
2045                chip->ecc.bytes         = 7;
2046                chip->ecc.strength      = 4;
2047                chip->ecc.hwctl         = omap_enable_hwecc_bch;
2048                chip->ecc.correct       = rawnand_sw_bch_correct;
2049                chip->ecc.calculate     = omap_calculate_ecc_bch_sw;
2050                mtd_set_ooblayout(mtd, &omap_sw_ooblayout_ops);
2051                /* Reserve one byte for the OMAP marker */
2052                oobbytes_per_step       = chip->ecc.bytes + 1;
2053                /* Software BCH library is used for locating errors */
2054                err = rawnand_sw_bch_init(chip);
2055                if (err) {
2056                        dev_err(dev, "Unable to use BCH library\n");
2057                        return err;
2058                }
2059                break;
2060
2061        case OMAP_ECC_BCH4_CODE_HW:
2062                pr_info("nand: using OMAP_ECC_BCH4_CODE_HW ECC scheme\n");
2063                chip->ecc.engine_type   = NAND_ECC_ENGINE_TYPE_ON_HOST;
2064                chip->ecc.size          = 512;
2065                /* 14th bit is kept reserved for ROM-code compatibility */
2066                chip->ecc.bytes         = 7 + 1;
2067                chip->ecc.strength      = 4;
2068                chip->ecc.hwctl         = omap_enable_hwecc_bch;
2069                chip->ecc.correct       = omap_elm_correct_data;
2070                chip->ecc.read_page     = omap_read_page_bch;
2071                chip->ecc.write_page    = omap_write_page_bch;
2072                chip->ecc.write_subpage = omap_write_subpage_bch;
2073                mtd_set_ooblayout(mtd, &omap_ooblayout_ops);
2074                oobbytes_per_step       = chip->ecc.bytes;
2075
2076                err = elm_config(info->elm_dev, BCH4_ECC,
2077                                 mtd->writesize / chip->ecc.size,
2078                                 chip->ecc.size, chip->ecc.bytes);
2079                if (err < 0)
2080                        return err;
2081                break;
2082
2083        case OMAP_ECC_BCH8_CODE_HW_DETECTION_SW:
2084                pr_info("nand: using OMAP_ECC_BCH8_CODE_HW_DETECTION_SW\n");
2085                chip->ecc.engine_type   = NAND_ECC_ENGINE_TYPE_ON_HOST;
2086                chip->ecc.size          = 512;
2087                chip->ecc.bytes         = 13;
2088                chip->ecc.strength      = 8;
2089                chip->ecc.hwctl         = omap_enable_hwecc_bch;
2090                chip->ecc.correct       = rawnand_sw_bch_correct;
2091                chip->ecc.calculate     = omap_calculate_ecc_bch_sw;
2092                mtd_set_ooblayout(mtd, &omap_sw_ooblayout_ops);
2093                /* Reserve one byte for the OMAP marker */
2094                oobbytes_per_step       = chip->ecc.bytes + 1;
2095                /* Software BCH library is used for locating errors */
2096                err = rawnand_sw_bch_init(chip);
2097                if (err) {
2098                        dev_err(dev, "unable to use BCH library\n");
2099                        return err;
2100                }
2101                break;
2102
2103        case OMAP_ECC_BCH8_CODE_HW:
2104                pr_info("nand: using OMAP_ECC_BCH8_CODE_HW ECC scheme\n");
2105                chip->ecc.engine_type   = NAND_ECC_ENGINE_TYPE_ON_HOST;
2106                chip->ecc.size          = 512;
2107                /* 14th bit is kept reserved for ROM-code compatibility */
2108                chip->ecc.bytes         = 13 + 1;
2109                chip->ecc.strength      = 8;
2110                chip->ecc.hwctl         = omap_enable_hwecc_bch;
2111                chip->ecc.correct       = omap_elm_correct_data;
2112                chip->ecc.read_page     = omap_read_page_bch;
2113                chip->ecc.write_page    = omap_write_page_bch;
2114                chip->ecc.write_subpage = omap_write_subpage_bch;
2115                mtd_set_ooblayout(mtd, &omap_ooblayout_ops);
2116                oobbytes_per_step       = chip->ecc.bytes;
2117
2118                err = elm_config(info->elm_dev, BCH8_ECC,
2119                                 mtd->writesize / chip->ecc.size,
2120                                 chip->ecc.size, chip->ecc.bytes);
2121                if (err < 0)
2122                        return err;
2123
2124                break;
2125
2126        case OMAP_ECC_BCH16_CODE_HW:
2127                pr_info("Using OMAP_ECC_BCH16_CODE_HW ECC scheme\n");
2128                chip->ecc.engine_type   = NAND_ECC_ENGINE_TYPE_ON_HOST;
2129                chip->ecc.size          = 512;
2130                chip->ecc.bytes         = 26;
2131                chip->ecc.strength      = 16;
2132                chip->ecc.hwctl         = omap_enable_hwecc_bch;
2133                chip->ecc.correct       = omap_elm_correct_data;
2134                chip->ecc.read_page     = omap_read_page_bch;
2135                chip->ecc.write_page    = omap_write_page_bch;
2136                chip->ecc.write_subpage = omap_write_subpage_bch;
2137                mtd_set_ooblayout(mtd, &omap_ooblayout_ops);
2138                oobbytes_per_step       = chip->ecc.bytes;
2139
2140                err = elm_config(info->elm_dev, BCH16_ECC,
2141                                 mtd->writesize / chip->ecc.size,
2142                                 chip->ecc.size, chip->ecc.bytes);
2143                if (err < 0)
2144                        return err;
2145
2146                break;
2147        default:
2148                dev_err(dev, "Invalid or unsupported ECC scheme\n");
2149                return -EINVAL;
2150        }
2151
2152        /* Check if NAND device's OOB is enough to store ECC signatures */
2153        min_oobbytes += (oobbytes_per_step *
2154                         (mtd->writesize / chip->ecc.size));
2155        if (mtd->oobsize < min_oobbytes) {
2156                dev_err(dev,
2157                        "Not enough OOB bytes: required = %d, available=%d\n",
2158                        min_oobbytes, mtd->oobsize);
2159                return -EINVAL;
2160        }
2161
2162        return 0;
2163}
2164
2165static const struct nand_controller_ops omap_nand_controller_ops = {
2166        .attach_chip = omap_nand_attach_chip,
2167};
2168
2169/* Shared among all NAND instances to synchronize access to the ECC Engine */
2170static struct nand_controller omap_gpmc_controller;
2171static bool omap_gpmc_controller_initialized;
2172
2173static int omap_nand_probe(struct platform_device *pdev)
2174{
2175        struct omap_nand_info           *info;
2176        struct mtd_info                 *mtd;
2177        struct nand_chip                *nand_chip;
2178        int                             err;
2179        struct resource                 *res;
2180        struct device                   *dev = &pdev->dev;
2181
2182        info = devm_kzalloc(&pdev->dev, sizeof(struct omap_nand_info),
2183                                GFP_KERNEL);
2184        if (!info)
2185                return -ENOMEM;
2186
2187        info->pdev = pdev;
2188
2189        err = omap_get_dt_info(dev, info);
2190        if (err)
2191                return err;
2192
2193        info->ops = gpmc_omap_get_nand_ops(&info->reg, info->gpmc_cs);
2194        if (!info->ops) {
2195                dev_err(&pdev->dev, "Failed to get GPMC->NAND interface\n");
2196                return -ENODEV;
2197        }
2198
2199        nand_chip               = &info->nand;
2200        mtd                     = nand_to_mtd(nand_chip);
2201        mtd->dev.parent         = &pdev->dev;
2202        nand_set_flash_node(nand_chip, dev->of_node);
2203
2204        if (!mtd->name) {
2205                mtd->name = devm_kasprintf(&pdev->dev, GFP_KERNEL,
2206                                           "omap2-nand.%d", info->gpmc_cs);
2207                if (!mtd->name) {
2208                        dev_err(&pdev->dev, "Failed to set MTD name\n");
2209                        return -ENOMEM;
2210                }
2211        }
2212
2213        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2214        nand_chip->legacy.IO_ADDR_R = devm_ioremap_resource(&pdev->dev, res);
2215        if (IS_ERR(nand_chip->legacy.IO_ADDR_R))
2216                return PTR_ERR(nand_chip->legacy.IO_ADDR_R);
2217
2218        info->phys_base = res->start;
2219
2220        if (!omap_gpmc_controller_initialized) {
2221                omap_gpmc_controller.ops = &omap_nand_controller_ops;
2222                nand_controller_init(&omap_gpmc_controller);
2223                omap_gpmc_controller_initialized = true;
2224        }
2225
2226        nand_chip->controller = &omap_gpmc_controller;
2227
2228        nand_chip->legacy.IO_ADDR_W = nand_chip->legacy.IO_ADDR_R;
2229        nand_chip->legacy.cmd_ctrl  = omap_hwcontrol;
2230
2231        info->ready_gpiod = devm_gpiod_get_optional(&pdev->dev, "rb",
2232                                                    GPIOD_IN);
2233        if (IS_ERR(info->ready_gpiod)) {
2234                dev_err(dev, "failed to get ready gpio\n");
2235                return PTR_ERR(info->ready_gpiod);
2236        }
2237
2238        /*
2239         * If RDY/BSY line is connected to OMAP then use the omap ready
2240         * function and the generic nand_wait function which reads the status
2241         * register after monitoring the RDY/BSY line. Otherwise use a standard
2242         * chip delay which is slightly more than tR (AC Timing) of the NAND
2243         * device and read status register until you get a failure or success
2244         */
2245        if (info->ready_gpiod) {
2246                nand_chip->legacy.dev_ready = omap_dev_ready;
2247                nand_chip->legacy.chip_delay = 0;
2248        } else {
2249                nand_chip->legacy.waitfunc = omap_wait;
2250                nand_chip->legacy.chip_delay = 50;
2251        }
2252
2253        if (info->flash_bbt)
2254                nand_chip->bbt_options |= NAND_BBT_USE_FLASH;
2255
2256        /* scan NAND device connected to chip controller */
2257        nand_chip->options |= info->devsize & NAND_BUSWIDTH_16;
2258
2259        err = nand_scan(nand_chip, 1);
2260        if (err)
2261                goto return_error;
2262
2263        err = mtd_device_register(mtd, NULL, 0);
2264        if (err)
2265                goto cleanup_nand;
2266
2267        platform_set_drvdata(pdev, mtd);
2268
2269        return 0;
2270
2271cleanup_nand:
2272        nand_cleanup(nand_chip);
2273
2274return_error:
2275        if (!IS_ERR_OR_NULL(info->dma))
2276                dma_release_channel(info->dma);
2277
2278        rawnand_sw_bch_cleanup(nand_chip);
2279
2280        return err;
2281}
2282
2283static int omap_nand_remove(struct platform_device *pdev)
2284{
2285        struct mtd_info *mtd = platform_get_drvdata(pdev);
2286        struct nand_chip *nand_chip = mtd_to_nand(mtd);
2287        struct omap_nand_info *info = mtd_to_omap(mtd);
2288        int ret;
2289
2290        rawnand_sw_bch_cleanup(nand_chip);
2291
2292        if (info->dma)
2293                dma_release_channel(info->dma);
2294        ret = mtd_device_unregister(mtd);
2295        WARN_ON(ret);
2296        nand_cleanup(nand_chip);
2297        return ret;
2298}
2299
2300static const struct of_device_id omap_nand_ids[] = {
2301        { .compatible = "ti,omap2-nand", },
2302        {},
2303};
2304MODULE_DEVICE_TABLE(of, omap_nand_ids);
2305
2306static struct platform_driver omap_nand_driver = {
2307        .probe          = omap_nand_probe,
2308        .remove         = omap_nand_remove,
2309        .driver         = {
2310                .name   = DRIVER_NAME,
2311                .of_match_table = of_match_ptr(omap_nand_ids),
2312        },
2313};
2314
2315module_platform_driver(omap_nand_driver);
2316
2317MODULE_ALIAS("platform:" DRIVER_NAME);
2318MODULE_LICENSE("GPL");
2319MODULE_DESCRIPTION("Glue layer for NAND flash on TI OMAP boards");
2320