linux/drivers/mtd/nand
Archit Taneja c76b78d8ec mtd: nand: Qualcomm NAND controller driver
The Qualcomm NAND controller is found in SoCs like IPQ806x, MSM7xx,
MDM9x15 series.

It exists as a sub block inside the IPs EBI2 (External Bus Interface 2)
and QPIC (Qualcomm Parallel Interface Controller). These IPs provide a
broader interface for external slow peripheral devices such as LCD and
NAND/NOR flash memory or SRAM like interfaces.

We add support for the NAND controller found within EBI2. For the SoCs
of our interest, we only use the NAND controller within EBI2. Therefore,
it's safe for us to assume that the NAND controller is a standalone block
within the SoC.

The controller supports 512B, 2kB, 4kB and 8kB page 8-bit and 16-bit NAND
flash devices. It contains a HW ECC block that supports BCH ECC (4, 8 and
16 bit correction/step) and RS ECC(4 bit correction/step) that covers main
and spare data. The controller contains an internal 512 byte page buffer
to which we read/write via DMA. The EBI2 type NAND controller uses ADM DMA
for register read/write and data transfers. The controller performs page
reads and writes at a codeword/step level of 512 bytes. It can support up
to 2 external chips of different configurations.

The driver prepares register read and write configuration descriptors for
each codeword, followed by data descriptors to read or write data from the
controller's internal buffer. It uses a single ADM DMA channel that we get
via dmaengine API. The controller requires 2 ADM CRCIs for command and
data flow control. These are passed via DT.

The ecc layout used by the controller is syndrome like, but we can't use
the standard syndrome ecc ops because of several reasons. First, the amount
of data bytes covered by ecc isn't same in each step. Second, writing to
free oob space requires us writing to the entire step in which the oob
lies. This forces us to create our own ecc ops.

One more difference is how the controller accesses the bad block marker.
The controller ignores reading the marker when ECC is enabled. ECC needs
to be explicity disabled to read or write to the bad block marker. The
nand_bbt helpers library hence can't access BBMs for the controller.
For now, we skip the creation of BBT and populate chip->block_bad and
chip->block_markbad helpers instead.

Reviewed-by: Andy Gross <agross@codeaurora.org>
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
Signed-off-by: Archit Taneja <architt@codeaurora.org>
Reviewed-by: Boris Brezillon <boris.brezillon@free-electrons.com>
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
2016-03-10 11:02:17 -08:00
..
bcm47xxnflash mtd: nand: make use of nand_set/get_controller_data() helpers 2016-01-07 10:23:41 -08:00
brcmnand mtd: kill the ecclayout->oobavail field 2016-03-07 16:23:09 -08:00
gpmi-nand mtd: nand: gpmi: may use minimum required ecc for 744 oobsize NAND 2016-01-23 14:45:57 -08:00
ams-delta.c mtd: nand: make use of nand_set/get_controller_data() helpers 2016-01-07 10:23:41 -08:00
atmel_nand_ecc.h mtd: atmel_nand: Support 32-bit ECC strength 2016-02-12 10:27:48 -08:00
atmel_nand_nfc.h mtd: atmel_nand: Support variable RB_EDGE interrupts 2016-02-12 10:27:46 -08:00
atmel_nand.c mtd: atmel_nand: Support 32-bit ECC strength 2016-02-12 10:27:48 -08:00
au1550nd.c mtd: nand: remove useless mtd->priv = chip assignments 2015-12-18 13:21:40 -08:00
bf5xx_nand.c mtd: nand: make use of nand_set/get_controller_data() helpers 2016-01-07 10:23:41 -08:00
cafe_nand.c mtd: nand: don't select chip in nand_chip's block_bad op 2016-03-10 10:52:21 -08:00
cmx270_nand.c mtd: nand: remove useless mtd->priv = chip assignments 2015-12-18 13:21:40 -08:00
cs553x_nand.c mtd: nand: remove useless mtd->priv = chip assignments 2015-12-18 13:21:40 -08:00
davinci_nand.c mtd: nand: davinci: remove custom 'erased check' implementation 2016-01-06 18:53:46 -08:00
denali_dt.c mtd: nand: drop owner assignment from platform_drivers 2014-10-20 16:20:58 +02:00
denali_pci.c mtd: denali_pci: switch to dev_err() 2015-08-18 17:21:37 -07:00
denali.c mtd: nand: remove useless mtd->priv = chip assignments 2015-12-18 13:21:40 -08:00
denali.h mtd: nand: denali: use the mtd instance embedded in struct nand_chip 2015-12-18 13:13:50 -08:00
diskonchip.c mtd: nand: don't select chip in nand_chip's block_bad op 2016-03-10 10:52:21 -08:00
docg4.c mtd: nand: don't select chip in nand_chip's block_bad op 2016-03-10 10:52:21 -08:00
fsl_elbc_nand.c mtd: nand: make use of nand_set/get_controller_data() helpers 2016-01-07 10:23:41 -08:00
fsl_ifc_nand.c mtd: nand: make use of nand_set/get_controller_data() helpers 2016-01-07 10:23:41 -08:00
fsl_upm.c mtd: nand: remove useless mtd->priv = chip assignments 2015-12-18 13:21:40 -08:00
fsmc_nand.c mtd: nand: make use of nand_set/get_controller_data() helpers 2016-01-07 10:23:41 -08:00
gpio.c mtd: nand: remove useless mtd->priv = chip assignments 2015-12-18 13:21:40 -08:00
hisi504_nand.c mtd: kill the ecclayout->oobavail field 2016-03-07 16:23:09 -08:00
jz4740_nand.c mtd: nand: jz4740: kill the ->ecc_layout field 2016-01-26 10:27:35 -08:00
jz4780_bch.c mtd: nand: jz4780: Update ecc correction error codes 2016-01-08 09:44:30 -08:00
jz4780_bch.h mtd: nand: jz4780: driver for NAND devices on JZ4780 SoCs 2016-01-07 09:35:11 -08:00
jz4780_nand.c mtd: jz4780_nand: replace if/else blocks with switch/case 2016-01-08 09:49:03 -08:00
Kconfig mtd: nand: Qualcomm NAND controller driver 2016-03-10 11:02:17 -08:00
lpc32xx_mlc.c mtd: nand: lpc32xx_mlc: fix ecc.size 2016-01-26 10:27:37 -08:00
lpc32xx_slc.c mtd: nand: make use of nand_set/get_controller_data() helpers 2016-01-07 10:23:41 -08:00
Makefile mtd: nand: Qualcomm NAND controller driver 2016-03-10 11:02:17 -08:00
mpc5121_nfc.c mtd: nand: mpc5121: use 'of_machine_is_compatible' to simplify code 2016-01-22 16:35:25 -08:00
mxc_nand.c mtd: nand: make use of nand_set/get_controller_data() helpers 2016-01-07 10:23:41 -08:00
nand_base.c mtd: nand: don't select chip in nand_chip's block_bad op 2016-03-10 10:52:21 -08:00
nand_bbt.c mtd: nand: remove EXPORT_SYMBOL of nand_scan_bbt() 2016-01-23 14:00:14 -08:00
nand_bch.c mtd: nand: simplify nand_bch_init() usage 2016-03-07 16:23:09 -08:00
nand_ecc.c mtd: nand: return consistent error codes in ecc.correct() implementations 2016-01-06 18:45:46 -08:00
nand_ids.c mtd: nand: add NAND_NEED_SCRAMBLING flag to the H27UCG8T2ATR-BC definition 2016-01-22 16:36:54 -08:00
nand_timings.c mtd: nand: Use ULL-suffix for big u64 constant 2014-08-19 11:53:09 -07:00
nandsim.c mtd: nandsim: use nand_get_controller_data() 2016-01-07 12:25:58 -08:00
ndfc.c mtd: nand: make use of nand_set/get_controller_data() helpers 2016-01-07 10:23:41 -08:00
nuc900_nand.c mtd: nuc900_nand: read correct SMISR register 2016-01-15 10:02:09 -08:00
omap2.c mtd: nand: simplify nand_bch_init() usage 2016-03-07 16:23:09 -08:00
omap_elm.c mtd: omap_elm: print interrupt resource using %pr 2015-12-18 10:16:17 -08:00
orion_nand.c mtd: nand: make use of nand_set/get_controller_data() helpers 2016-01-07 10:23:41 -08:00
pasemi_nand.c mtd: nand: remove useless mtd->priv = chip assignments 2015-12-18 13:21:40 -08:00
plat_nand.c mtd: nand: kill unused ->ecclayout field in platform_nand_chip struct 2016-01-26 10:27:36 -08:00
pxa3xx_nand.c mtd: nand: pxa3xx_nand: kill unused field 'drcmr_cmd' 2016-03-07 12:49:22 -08:00
qcom_nandc.c mtd: nand: Qualcomm NAND controller driver 2016-03-10 11:02:17 -08:00
r852.c mtd: nand: make use of nand_set/get_controller_data() helpers 2016-01-07 10:23:41 -08:00
r852.h mtd: nand: r852: use the mtd instance embedded in struct nand_chip 2015-12-18 10:54:41 -08:00
s3c2410.c mtd: nand: s3c2410: kill the ->ecc_layout field 2016-01-26 10:27:35 -08:00
sh_flctl.c mtd: sh_flctl: pass FIFO as physical address 2015-12-18 18:27:13 -08:00
sharpsl.c mtd: nand: remove useless mtd->priv = chip assignments 2015-12-18 13:21:40 -08:00
sm_common.c mtd: nand: make use of mtd_to_nand() in NAND drivers 2015-12-08 12:24:36 -08:00
sm_common.h mtd: use __packed shorthand 2014-08-19 11:53:08 -07:00
socrates_nand.c mtd: nand: make use of nand_set/get_controller_data() helpers 2016-01-07 10:23:41 -08:00
sunxi_nand.c mtd: nand: sunxi: remove direct mtd->priv accesses 2016-03-04 16:17:20 -08:00
tmio_nand.c mtd: nand: remove useless mtd->priv = chip assignments 2015-12-18 13:21:40 -08:00
txx9ndfmc.c mtd: nand: make use of nand_set/get_controller_data() helpers 2016-01-07 10:23:41 -08:00
vf610_nfc.c mtd: nand: vf610: remove useless mtd->ecclayout assignment 2016-01-26 10:27:38 -08:00
xway_nand.c mtd: nand: make use of mtd_to_nand() in NAND drivers 2015-12-08 12:24:36 -08:00