You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge tag 'for-linus-20170510' of git://git.infradead.org/linux-mtd
Pull MTD updates from Brian Norris:
"NAND, from Boris:
- some minor fixes/improvements on existing drivers (fsmc, gpio, ifc,
davinci, brcmnand, omap)
- a huge cleanup/rework of the denali driver accompanied with core
fixes/improvements to simplify the driver code
- a complete rewrite of the atmel driver to support new DT bindings
make future evolution easier
- the addition of per-vendor detection/initialization steps to avoid
extending the nand_ids table with more extended-id entries
SPI NOR, from Cyrille:
- fixes in the hisi, intel and Mediatek SPI controller drivers
- fixes to some SPI flash memories not supporting the Chip Erase
command.
- add support to some new memory parts (Winbond, Macronix, Micron,
ESMT).
- add new driver for the STM32 QSPI controller
And a few fixes for Gemini and Versatile platforms on physmap-of"
* tag 'for-linus-20170510' of git://git.infradead.org/linux-mtd: (100 commits)
MAINTAINERS: Update NAND subsystem git repositories
mtd: nand: gpio: update binding
mtd: nand: add ooblayout for old hamming layout
mtd: oxnas_nand: Allocating more than necessary in probe()
dt-bindings: mtd: Document the STM32 QSPI bindings
mtd: mtk-nor: set controller's address width according to nor flash
mtd: spi-nor: add driver for STM32 quad spi flash controller
mtd: nand: brcmnand: Check flash #WP pin status before nand erase/program
mtd: nand: davinci: add comment on NAND subpage write status on keystone
mtd: nand: omap2: Fix partition creation via cmdline mtdparts
mtd: nand: NULL terminate a of_device_id table
mtd: nand: Fix a couple error codes
mtd: nand: allow drivers to request minimum alignment for passed buffer
mtd: nand: allocate aligned buffers if NAND_OWN_BUFFERS is unset
mtd: nand: denali: allow to override revision number
mtd: nand: denali_dt: use pdev instead of ofdev for platform_device
mtd: nand: denali_dt: remove dma-mask DT property
mtd: nand: denali: support 64bit capable DMA engine
mtd: nand: denali_dt: enable HW_ECC_FIXUP for Altera SOCFPGA variant
mtd: nand: denali: support HW_ECC_FIXUP capability
...
This commit is contained in:
@@ -1,4 +1,109 @@
|
||||
Atmel NAND flash
|
||||
Atmel NAND flash controller bindings
|
||||
|
||||
The NAND flash controller node should be defined under the EBI bus (see
|
||||
Documentation/devicetree/bindings/memory-controllers/atmel,ebi.txt).
|
||||
One or several NAND devices can be defined under this NAND controller.
|
||||
The NAND controller might be connected to an ECC engine.
|
||||
|
||||
* NAND controller bindings:
|
||||
|
||||
Required properties:
|
||||
- compatible: should be one of the following
|
||||
"atmel,at91rm9200-nand-controller"
|
||||
"atmel,at91sam9260-nand-controller"
|
||||
"atmel,at91sam9261-nand-controller"
|
||||
"atmel,at91sam9g45-nand-controller"
|
||||
"atmel,sama5d3-nand-controller"
|
||||
- ranges: empty ranges property to forward EBI ranges definitions.
|
||||
- #address-cells: should be set to 2.
|
||||
- #size-cells: should be set to 1.
|
||||
- atmel,nfc-io: phandle to the NFC IO block. Only required for sama5d3
|
||||
controllers.
|
||||
- atmel,nfc-sram: phandle to the NFC SRAM block. Only required for sama5d3
|
||||
controllers.
|
||||
|
||||
Optional properties:
|
||||
- ecc-engine: phandle to the PMECC block. Only meaningful if the SoC embeds
|
||||
a PMECC engine.
|
||||
|
||||
* NAND device/chip bindings:
|
||||
|
||||
Required properties:
|
||||
- reg: describes the CS lines assigned to the NAND device. If the NAND device
|
||||
exposes multiple CS lines (multi-dies chips), your reg property will
|
||||
contain X tuples of 3 entries.
|
||||
1st entry: the CS line this NAND chip is connected to
|
||||
2nd entry: the base offset of the memory region assigned to this
|
||||
device (always 0)
|
||||
3rd entry: the memory region size (always 0x800000)
|
||||
|
||||
Optional properties:
|
||||
- rb-gpios: the GPIO(s) used to check the Ready/Busy status of the NAND.
|
||||
- cs-gpios: the GPIO(s) used to control the CS line.
|
||||
- det-gpios: the GPIO used to detect if a Smartmedia Card is present.
|
||||
- atmel,rb: an integer identifying the native Ready/Busy pin. Only meaningful
|
||||
on sama5 SoCs.
|
||||
|
||||
All generic properties described in
|
||||
Documentation/devicetree/bindings/mtd/{common,nand}.txt also apply to the NAND
|
||||
device node, and NAND partitions should be defined under the NAND node as
|
||||
described in Documentation/devicetree/bindings/mtd/partition.txt.
|
||||
|
||||
* ECC engine (PMECC) bindings:
|
||||
|
||||
Required properties:
|
||||
- compatible: should be one of the following
|
||||
"atmel,at91sam9g45-pmecc"
|
||||
"atmel,sama5d4-pmecc"
|
||||
"atmel,sama5d2-pmecc"
|
||||
- reg: should contain 2 register ranges. The first one is pointing to the PMECC
|
||||
block, and the second one to the PMECC_ERRLOC block.
|
||||
|
||||
Example:
|
||||
|
||||
pmecc: ecc-engine@ffffc070 {
|
||||
compatible = "atmel,at91sam9g45-pmecc";
|
||||
reg = <0xffffc070 0x490>,
|
||||
<0xffffc500 0x100>;
|
||||
};
|
||||
|
||||
ebi: ebi@10000000 {
|
||||
compatible = "atmel,sama5d3-ebi";
|
||||
#address-cells = <2>;
|
||||
#size-cells = <1>;
|
||||
atmel,smc = <&hsmc>;
|
||||
reg = <0x10000000 0x10000000
|
||||
0x40000000 0x30000000>;
|
||||
ranges = <0x0 0x0 0x10000000 0x10000000
|
||||
0x1 0x0 0x40000000 0x10000000
|
||||
0x2 0x0 0x50000000 0x10000000
|
||||
0x3 0x0 0x60000000 0x10000000>;
|
||||
clocks = <&mck>;
|
||||
|
||||
nand_controller: nand-controller {
|
||||
compatible = "atmel,sama5d3-nand-controller";
|
||||
atmel,nfc-sram = <&nfc_sram>;
|
||||
atmel,nfc-io = <&nfc_io>;
|
||||
ecc-engine = <&pmecc>;
|
||||
#address-cells = <2>;
|
||||
#size-cells = <1>;
|
||||
ranges;
|
||||
|
||||
nand@3 {
|
||||
reg = <0x3 0x0 0x800000>;
|
||||
atmel,rb = <0>;
|
||||
|
||||
/*
|
||||
* Put generic NAND/MTD properties and
|
||||
* subnodes here.
|
||||
*/
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
Deprecated bindings (should not be used in new device trees):
|
||||
|
||||
Required properties:
|
||||
- compatible: The possible values are:
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
* Denali NAND controller
|
||||
|
||||
Required properties:
|
||||
- compatible : should be "denali,denali-nand-dt"
|
||||
- compatible : should be one of the following:
|
||||
"altr,socfpga-denali-nand" - for Altera SOCFPGA
|
||||
- reg : should contain registers location and length for data and reg.
|
||||
- reg-names: Should contain the reg names "nand_data" and "denali_reg"
|
||||
- interrupts : The interrupt number.
|
||||
- dm-mask : DMA bit mask
|
||||
|
||||
The device tree may optionally contain sub-nodes describing partitions of the
|
||||
address space. See partition.txt for more detail.
|
||||
@@ -15,9 +15,8 @@ Examples:
|
||||
nand: nand@ff900000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "denali,denali-nand-dt";
|
||||
compatible = "altr,socfpga-denali-nand";
|
||||
reg = <0xff900000 0x100000>, <0xffb80000 0x10000>;
|
||||
reg-names = "nand_data", "denali_reg";
|
||||
interrupts = <0 144 4>;
|
||||
dma-mask = <0xffffffff>;
|
||||
};
|
||||
|
||||
@@ -12,7 +12,7 @@ Required properties:
|
||||
- #address-cells, #size-cells : Must be present if the device has sub-nodes
|
||||
representing partitions.
|
||||
- gpios : Specifies the GPIO pins to control the NAND device. The order of
|
||||
GPIO references is: RDY, nCE, ALE, CLE, and an optional nWP.
|
||||
GPIO references is: RDY, nCE, ALE, CLE, and nWP. nCE and nWP are optional.
|
||||
|
||||
Optional properties:
|
||||
- bank-width : Width (in bytes) of the device. If not present, the width
|
||||
@@ -36,7 +36,7 @@ gpio-nand@1,0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
gpios = <&banka 1 0>, /* RDY */
|
||||
<&banka 2 0>, /* nCE */
|
||||
<0>, /* nCE */
|
||||
<&banka 3 0>, /* ALE */
|
||||
<&banka 4 0>, /* CLE */
|
||||
<0>; /* nWP */
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
* STMicroelectronics Quad Serial Peripheral Interface(QuadSPI)
|
||||
|
||||
Required properties:
|
||||
- compatible: should be "st,stm32f469-qspi"
|
||||
- reg: the first contains the register location and length.
|
||||
the second contains the memory mapping address and length
|
||||
- reg-names: should contain the reg names "qspi" "qspi_mm"
|
||||
- interrupts: should contain the interrupt for the device
|
||||
- clocks: the phandle of the clock needed by the QSPI controller
|
||||
- A pinctrl must be defined to set pins in mode of operation for QSPI transfer
|
||||
|
||||
Optional properties:
|
||||
- resets: must contain the phandle to the reset controller.
|
||||
|
||||
A spi flash must be a child of the nor_flash node and could have some
|
||||
properties. Also see jedec,spi-nor.txt.
|
||||
|
||||
Required properties:
|
||||
- reg: chip-Select number (QSPI controller may connect 2 nor flashes)
|
||||
- spi-max-frequency: max frequency of spi bus
|
||||
|
||||
Optional property:
|
||||
- spi-rx-bus-width: see ../spi/spi-bus.txt for the description
|
||||
|
||||
Example:
|
||||
|
||||
qspi: spi@a0001000 {
|
||||
compatible = "st,stm32f469-qspi";
|
||||
reg = <0xa0001000 0x1000>, <0x90000000 0x10000000>;
|
||||
reg-names = "qspi", "qspi_mm";
|
||||
interrupts = <91>;
|
||||
resets = <&rcc STM32F4_AHB3_RESET(QSPI)>;
|
||||
clocks = <&rcc 0 STM32F4_AHB3_CLOCK(QSPI)>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_qspi0>;
|
||||
|
||||
flash@0 {
|
||||
reg = <0>;
|
||||
spi-rx-bus-width = <4>;
|
||||
spi-max-frequency = <108000000>;
|
||||
...
|
||||
};
|
||||
};
|
||||
+7
-6
@@ -2274,7 +2274,7 @@ M: Wenyou Yang <wenyou.yang@atmel.com>
|
||||
M: Josh Wu <rainyfeeling@outlook.com>
|
||||
L: linux-mtd@lists.infradead.org
|
||||
S: Supported
|
||||
F: drivers/mtd/nand/atmel_nand*
|
||||
F: drivers/mtd/nand/atmel/*
|
||||
|
||||
ATMEL SDMMC DRIVER
|
||||
M: Ludovic Desroches <ludovic.desroches@microchip.com>
|
||||
@@ -8376,12 +8376,12 @@ M: Brian Norris <computersforpeace@gmail.com>
|
||||
M: Boris Brezillon <boris.brezillon@free-electrons.com>
|
||||
M: Marek Vasut <marek.vasut@gmail.com>
|
||||
M: Richard Weinberger <richard@nod.at>
|
||||
M: Cyrille Pitchen <cyrille.pitchen@atmel.com>
|
||||
M: Cyrille Pitchen <cyrille.pitchen@wedev4u.fr>
|
||||
L: linux-mtd@lists.infradead.org
|
||||
W: http://www.linux-mtd.infradead.org/
|
||||
Q: http://patchwork.ozlabs.org/project/linux-mtd/list/
|
||||
T: git git://git.infradead.org/linux-mtd.git
|
||||
T: git git://git.infradead.org/l2-mtd.git
|
||||
T: git git://git.infradead.org/linux-mtd.git master
|
||||
T: git git://git.infradead.org/l2-mtd.git master
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/mtd/
|
||||
F: drivers/mtd/
|
||||
@@ -8756,7 +8756,8 @@ R: Richard Weinberger <richard@nod.at>
|
||||
L: linux-mtd@lists.infradead.org
|
||||
W: http://www.linux-mtd.infradead.org/
|
||||
Q: http://patchwork.ozlabs.org/project/linux-mtd/list/
|
||||
T: git git://github.com/linux-nand/linux.git
|
||||
T: git git://git.infradead.org/linux-mtd.git nand/fixes
|
||||
T: git git://git.infradead.org/l2-mtd.git nand/next
|
||||
S: Maintained
|
||||
F: drivers/mtd/nand/
|
||||
F: include/linux/mtd/nand*.h
|
||||
@@ -12113,7 +12114,7 @@ S: Maintained
|
||||
F: drivers/clk/spear/
|
||||
|
||||
SPI NOR SUBSYSTEM
|
||||
M: Cyrille Pitchen <cyrille.pitchen@atmel.com>
|
||||
M: Cyrille Pitchen <cyrille.pitchen@wedev4u.fr>
|
||||
M: Marek Vasut <marek.vasut@gmail.com>
|
||||
L: linux-mtd@lists.infradead.org
|
||||
W: http://www.linux-mtd.infradead.org/
|
||||
|
||||
@@ -136,7 +136,6 @@ config ETRAX_NANDFLASH
|
||||
bool "NAND flash support"
|
||||
depends on ETRAX_ARCH_V32
|
||||
select MTD_NAND
|
||||
select MTD_NAND_IDS
|
||||
help
|
||||
This option enables MTD mapping of NAND flash devices. Needed to use
|
||||
NAND flash memories. If unsure, say Y.
|
||||
|
||||
@@ -116,7 +116,7 @@ config FSL_CORENET_CF
|
||||
|
||||
config FSL_IFC
|
||||
bool
|
||||
depends on FSL_SOC || ARCH_LAYERSCAPE
|
||||
depends on FSL_SOC || ARCH_LAYERSCAPE || SOC_LS1021A
|
||||
|
||||
config JZ4780_NEMC
|
||||
bool "Ingenic JZ4780 SoC NEMC driver"
|
||||
|
||||
@@ -323,7 +323,8 @@ static void fixup_sst38vf640x_sectorsize(struct mtd_info *mtd)
|
||||
* it should report a size of 8KBytes (0x0020*256).
|
||||
*/
|
||||
cfi->cfiq->EraseRegionInfo[0] = 0x002003ff;
|
||||
pr_warning("%s: Bad 38VF640x CFI data; adjusting sector size from 64 to 8KiB\n", mtd->name);
|
||||
pr_warn("%s: Bad 38VF640x CFI data; adjusting sector size from 64 to 8KiB\n",
|
||||
mtd->name);
|
||||
}
|
||||
|
||||
static void fixup_s29gl064n_sectors(struct mtd_info *mtd)
|
||||
@@ -333,7 +334,8 @@ static void fixup_s29gl064n_sectors(struct mtd_info *mtd)
|
||||
|
||||
if ((cfi->cfiq->EraseRegionInfo[0] & 0xffff) == 0x003f) {
|
||||
cfi->cfiq->EraseRegionInfo[0] |= 0x0040;
|
||||
pr_warning("%s: Bad S29GL064N CFI data; adjust from 64 to 128 sectors\n", mtd->name);
|
||||
pr_warn("%s: Bad S29GL064N CFI data; adjust from 64 to 128 sectors\n",
|
||||
mtd->name);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -344,7 +346,8 @@ static void fixup_s29gl032n_sectors(struct mtd_info *mtd)
|
||||
|
||||
if ((cfi->cfiq->EraseRegionInfo[1] & 0xffff) == 0x007e) {
|
||||
cfi->cfiq->EraseRegionInfo[1] &= ~0x0040;
|
||||
pr_warning("%s: Bad S29GL032N CFI data; adjust from 127 to 63 sectors\n", mtd->name);
|
||||
pr_warn("%s: Bad S29GL032N CFI data; adjust from 127 to 63 sectors\n",
|
||||
mtd->name);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -358,7 +361,8 @@ static void fixup_s29ns512p_sectors(struct mtd_info *mtd)
|
||||
* which is not permitted by CFI.
|
||||
*/
|
||||
cfi->cfiq->EraseRegionInfo[0] = 0x020001ff;
|
||||
pr_warning("%s: Bad S29NS512P CFI data; adjust to 512 sectors\n", mtd->name);
|
||||
pr_warn("%s: Bad S29NS512P CFI data; adjust to 512 sectors\n",
|
||||
mtd->name);
|
||||
}
|
||||
|
||||
/* Used to fix CFI-Tables of chips without Extended Query Tables */
|
||||
|
||||
@@ -17,12 +17,10 @@ obj-$(CONFIG_MTD_CK804XROM) += ck804xrom.o
|
||||
obj-$(CONFIG_MTD_TSUNAMI) += tsunami_flash.o
|
||||
obj-$(CONFIG_MTD_PXA2XX) += pxa2xx-flash.o
|
||||
obj-$(CONFIG_MTD_PHYSMAP) += physmap.o
|
||||
ifdef CONFIG_MTD_PHYSMAP_OF_VERSATILE
|
||||
physmap_of-objs += physmap_of_versatile.o
|
||||
endif
|
||||
ifdef CONFIG_MTD_PHYSMAP_OF_GEMINI
|
||||
physmap_of-objs += physmap_of_gemini.o
|
||||
endif
|
||||
physmap_of-objs-y += physmap_of_core.o
|
||||
physmap_of-objs-$(CONFIG_MTD_PHYSMAP_OF_VERSATILE) += physmap_of_versatile.o
|
||||
physmap_of-objs-$(CONFIG_MTD_PHYSMAP_OF_GEMINI) += physmap_of_gemini.o
|
||||
physmap_of-objs := $(physmap_of-objs-y)
|
||||
obj-$(CONFIG_MTD_PHYSMAP_OF) += physmap_of.o
|
||||
obj-$(CONFIG_MTD_PISMO) += pismo.o
|
||||
obj-$(CONFIG_MTD_PMC_MSP_EVM) += pmcmsp-flash.o
|
||||
|
||||
@@ -116,32 +116,22 @@ static const char * const part_probe_types_def[] = {
|
||||
|
||||
static const char * const *of_get_probes(struct device_node *dp)
|
||||
{
|
||||
const char *cp;
|
||||
int cplen;
|
||||
unsigned int l;
|
||||
unsigned int count;
|
||||
const char **res;
|
||||
int count;
|
||||
|
||||
cp = of_get_property(dp, "linux,part-probe", &cplen);
|
||||
if (cp == NULL)
|
||||
count = of_property_count_strings(dp, "linux,part-probe");
|
||||
if (count < 0)
|
||||
return part_probe_types_def;
|
||||
|
||||
count = 0;
|
||||
for (l = 0; l != cplen; l++)
|
||||
if (cp[l] == 0)
|
||||
count++;
|
||||
|
||||
res = kzalloc((count + 1)*sizeof(*res), GFP_KERNEL);
|
||||
res = kzalloc((count + 1) * sizeof(*res), GFP_KERNEL);
|
||||
if (!res)
|
||||
return NULL;
|
||||
count = 0;
|
||||
while (cplen > 0) {
|
||||
res[count] = cp;
|
||||
l = strlen(cp) + 1;
|
||||
cp += l;
|
||||
cplen -= l;
|
||||
count++;
|
||||
}
|
||||
|
||||
count = of_property_read_string_array(dp, "linux,part-probe", res,
|
||||
count);
|
||||
if (count < 0)
|
||||
return NULL;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
@@ -1235,10 +1235,8 @@ static int mtdswap_show(struct seq_file *s, void *data)
|
||||
|
||||
if (root->rb_node) {
|
||||
count[i] = d->trees[i].count;
|
||||
min[i] = rb_entry(rb_first(root), struct swap_eb,
|
||||
rb)->erase_count;
|
||||
max[i] = rb_entry(rb_last(root), struct swap_eb,
|
||||
rb)->erase_count;
|
||||
min[i] = MTDSWAP_ECNT_MIN(root);
|
||||
max[i] = MTDSWAP_ECNT_MAX(root);
|
||||
} else
|
||||
count[i] = 0;
|
||||
}
|
||||
|
||||
@@ -13,7 +13,6 @@ config MTD_NAND_ECC_SMC
|
||||
menuconfig MTD_NAND
|
||||
tristate "NAND Device Support"
|
||||
depends on MTD
|
||||
select MTD_NAND_IDS
|
||||
select MTD_NAND_ECC
|
||||
help
|
||||
This enables support for accessing all type of NAND flash
|
||||
@@ -60,17 +59,6 @@ config MTD_NAND_DENALI_DT
|
||||
Enable the driver for NAND flash on platforms using a Denali NAND
|
||||
controller as a DT device.
|
||||
|
||||
config MTD_NAND_DENALI_SCRATCH_REG_ADDR
|
||||
hex "Denali NAND size scratch register address"
|
||||
default "0xFF108018"
|
||||
depends on MTD_NAND_DENALI_PCI
|
||||
help
|
||||
Some platforms place the NAND chip size in a scratch register
|
||||
because (some versions of) the driver aren't able to automatically
|
||||
determine the size of certain chips. Set the address of the
|
||||
scratch register here to enable this feature. On Intel Moorestown
|
||||
boards, the scratch register is at 0xFF108018.
|
||||
|
||||
config MTD_NAND_GPIO
|
||||
tristate "GPIO assisted NAND Flash driver"
|
||||
depends on GPIOLIB || COMPILE_TEST
|
||||
@@ -109,9 +97,6 @@ config MTD_NAND_OMAP_BCH
|
||||
config MTD_NAND_OMAP_BCH_BUILD
|
||||
def_tristate MTD_NAND_OMAP2 && MTD_NAND_OMAP_BCH
|
||||
|
||||
config MTD_NAND_IDS
|
||||
tristate
|
||||
|
||||
config MTD_NAND_RICOH
|
||||
tristate "Ricoh xD card reader"
|
||||
default n
|
||||
@@ -321,11 +306,11 @@ config MTD_NAND_CS553X
|
||||
If you say "m", the module will be called cs553x_nand.
|
||||
|
||||
config MTD_NAND_ATMEL
|
||||
tristate "Support for NAND Flash / SmartMedia on AT91 and AVR32"
|
||||
depends on ARCH_AT91 || AVR32
|
||||
tristate "Support for NAND Flash / SmartMedia on AT91"
|
||||
depends on ARCH_AT91
|
||||
help
|
||||
Enables support for NAND Flash / Smart Media Card interface
|
||||
on Atmel AT91 and AVR32 processors.
|
||||
on Atmel AT91 processors.
|
||||
|
||||
config MTD_NAND_PXA3xx
|
||||
tristate "NAND support on PXA3xx and Armada 370/XP"
|
||||
@@ -443,7 +428,7 @@ config MTD_NAND_FSL_ELBC
|
||||
|
||||
config MTD_NAND_FSL_IFC
|
||||
tristate "NAND support for Freescale IFC controller"
|
||||
depends on FSL_SOC || ARCH_LAYERSCAPE
|
||||
depends on FSL_SOC || ARCH_LAYERSCAPE || SOC_LS1021A
|
||||
select FSL_IFC
|
||||
select MEMORY
|
||||
help
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
obj-$(CONFIG_MTD_NAND) += nand.o
|
||||
obj-$(CONFIG_MTD_NAND_ECC) += nand_ecc.o
|
||||
obj-$(CONFIG_MTD_NAND_BCH) += nand_bch.o
|
||||
obj-$(CONFIG_MTD_NAND_IDS) += nand_ids.o
|
||||
obj-$(CONFIG_MTD_SM_COMMON) += sm_common.o
|
||||
|
||||
obj-$(CONFIG_MTD_NAND_CAFE) += cafe_nand.o
|
||||
@@ -25,7 +24,7 @@ obj-$(CONFIG_MTD_NAND_SHARPSL) += sharpsl.o
|
||||
obj-$(CONFIG_MTD_NAND_NANDSIM) += nandsim.o
|
||||
obj-$(CONFIG_MTD_NAND_CS553X) += cs553x_nand.o
|
||||
obj-$(CONFIG_MTD_NAND_NDFC) += ndfc.o
|
||||
obj-$(CONFIG_MTD_NAND_ATMEL) += atmel_nand.o
|
||||
obj-$(CONFIG_MTD_NAND_ATMEL) += atmel/
|
||||
obj-$(CONFIG_MTD_NAND_GPIO) += gpio.o
|
||||
omap2_nand-objs := omap2.o
|
||||
obj-$(CONFIG_MTD_NAND_OMAP2) += omap2_nand.o
|
||||
@@ -61,4 +60,10 @@ obj-$(CONFIG_MTD_NAND_BRCMNAND) += brcmnand/
|
||||
obj-$(CONFIG_MTD_NAND_QCOM) += qcom_nandc.o
|
||||
obj-$(CONFIG_MTD_NAND_MTK) += mtk_nand.o mtk_ecc.o
|
||||
|
||||
nand-objs := nand_base.o nand_bbt.o nand_timings.o
|
||||
nand-objs := nand_base.o nand_bbt.o nand_timings.o nand_ids.o
|
||||
nand-objs += nand_amd.o
|
||||
nand-objs += nand_hynix.o
|
||||
nand-objs += nand_macronix.o
|
||||
nand-objs += nand_micron.o
|
||||
nand-objs += nand_samsung.o
|
||||
nand-objs += nand_toshiba.o
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
obj-$(CONFIG_MTD_NAND_ATMEL) += atmel-nand-controller.o atmel-pmecc.o
|
||||
|
||||
atmel-nand-controller-objs := nand-controller.o
|
||||
atmel-pmecc-objs := pmecc.o
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,73 @@
|
||||
/*
|
||||
* © Copyright 2016 ATMEL
|
||||
* © Copyright 2016 Free Electrons
|
||||
*
|
||||
* Author: Boris Brezillon <boris.brezillon@free-electrons.com>
|
||||
*
|
||||
* Derived from the atmel_nand.c driver which contained the following
|
||||
* copyrights:
|
||||
*
|
||||
* Copyright © 2003 Rick Bronson
|
||||
*
|
||||
* Derived from drivers/mtd/nand/autcpu12.c
|
||||
* Copyright © 2001 Thomas Gleixner (gleixner@autronix.de)
|
||||
*
|
||||
* Derived from drivers/mtd/spia.c
|
||||
* Copyright © 2000 Steven J. Hill (sjhill@cotw.com)
|
||||
*
|
||||
*
|
||||
* Add Hardware ECC support for AT91SAM9260 / AT91SAM9263
|
||||
* Richard Genoud (richard.genoud@gmail.com), Adeneo Copyright © 2007
|
||||
*
|
||||
* Derived from Das U-Boot source code
|
||||
* (u-boot-1.1.5/board/atmel/at91sam9263ek/nand.c)
|
||||
* © Copyright 2006 ATMEL Rousset, Lacressonniere Nicolas
|
||||
*
|
||||
* Add Programmable Multibit ECC support for various AT91 SoC
|
||||
* © Copyright 2012 ATMEL, Hong Xu
|
||||
*
|
||||
* Add Nand Flash Controller support for SAMA5 SoC
|
||||
* © Copyright 2013 ATMEL, Josh Wu (josh.wu@atmel.com)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef ATMEL_PMECC_H
|
||||
#define ATMEL_PMECC_H
|
||||
|
||||
#define ATMEL_PMECC_MAXIMIZE_ECC_STRENGTH 0
|
||||
#define ATMEL_PMECC_SECTOR_SIZE_AUTO 0
|
||||
#define ATMEL_PMECC_OOBOFFSET_AUTO -1
|
||||
|
||||
struct atmel_pmecc_user_req {
|
||||
int pagesize;
|
||||
int oobsize;
|
||||
struct {
|
||||
int strength;
|
||||
int bytes;
|
||||
int sectorsize;
|
||||
int nsectors;
|
||||
int ooboffset;
|
||||
} ecc;
|
||||
};
|
||||
|
||||
struct atmel_pmecc *devm_atmel_pmecc_get(struct device *dev);
|
||||
|
||||
struct atmel_pmecc_user *
|
||||
atmel_pmecc_create_user(struct atmel_pmecc *pmecc,
|
||||
struct atmel_pmecc_user_req *req);
|
||||
void atmel_pmecc_destroy_user(struct atmel_pmecc_user *user);
|
||||
|
||||
int atmel_pmecc_enable(struct atmel_pmecc_user *user, int op);
|
||||
void atmel_pmecc_disable(struct atmel_pmecc_user *user);
|
||||
int atmel_pmecc_wait_rdy(struct atmel_pmecc_user *user);
|
||||
int atmel_pmecc_correct_sector(struct atmel_pmecc_user *user, int sector,
|
||||
void *data, void *ecc);
|
||||
bool atmel_pmecc_correct_erased_chunks(struct atmel_pmecc_user *user);
|
||||
void atmel_pmecc_get_generated_eccbytes(struct atmel_pmecc_user *user,
|
||||
int sector, void *ecc);
|
||||
|
||||
#endif /* ATMEL_PMECC_H */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,163 +0,0 @@
|
||||
/*
|
||||
* Error Corrected Code Controller (ECC) - System peripherals regsters.
|
||||
* Based on AT91SAM9260 datasheet revision B.
|
||||
*
|
||||
* Copyright (C) 2007 Andrew Victor
|
||||
* Copyright (C) 2007 - 2012 Atmel Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*/
|
||||
|
||||
#ifndef ATMEL_NAND_ECC_H
|
||||
#define ATMEL_NAND_ECC_H
|
||||
|
||||
#define ATMEL_ECC_CR 0x00 /* Control register */
|
||||
#define ATMEL_ECC_RST (1 << 0) /* Reset parity */
|
||||
|
||||
#define ATMEL_ECC_MR 0x04 /* Mode register */
|
||||
#define ATMEL_ECC_PAGESIZE (3 << 0) /* Page Size */
|
||||
#define ATMEL_ECC_PAGESIZE_528 (0)
|
||||
#define ATMEL_ECC_PAGESIZE_1056 (1)
|
||||
#define ATMEL_ECC_PAGESIZE_2112 (2)
|
||||
#define ATMEL_ECC_PAGESIZE_4224 (3)
|
||||
|
||||
#define ATMEL_ECC_SR 0x08 /* Status register */
|
||||
#define ATMEL_ECC_RECERR (1 << 0) /* Recoverable Error */
|
||||
#define ATMEL_ECC_ECCERR (1 << 1) /* ECC Single Bit Error */
|
||||
#define ATMEL_ECC_MULERR (1 << 2) /* Multiple Errors */
|
||||
|
||||
#define ATMEL_ECC_PR 0x0c /* Parity register */
|
||||
#define ATMEL_ECC_BITADDR (0xf << 0) /* Bit Error Address */
|
||||
#define ATMEL_ECC_WORDADDR (0xfff << 4) /* Word Error Address */
|
||||
|
||||
#define ATMEL_ECC_NPR 0x10 /* NParity register */
|
||||
#define ATMEL_ECC_NPARITY (0xffff << 0) /* NParity */
|
||||
|
||||
/* PMECC Register Definitions */
|
||||
#define ATMEL_PMECC_CFG 0x000 /* Configuration Register */
|
||||
#define PMECC_CFG_BCH_ERR2 (0 << 0)
|
||||
#define PMECC_CFG_BCH_ERR4 (1 << 0)
|
||||
#define PMECC_CFG_BCH_ERR8 (2 << 0)
|
||||
#define PMECC_CFG_BCH_ERR12 (3 << 0)
|
||||
#define PMECC_CFG_BCH_ERR24 (4 << 0)
|
||||
#define PMECC_CFG_BCH_ERR32 (5 << 0)
|
||||
|
||||
#define PMECC_CFG_SECTOR512 (0 << 4)
|
||||
#define PMECC_CFG_SECTOR1024 (1 << 4)
|
||||
|
||||
#define PMECC_CFG_PAGE_1SECTOR (0 << 8)
|
||||
#define PMECC_CFG_PAGE_2SECTORS (1 << 8)
|
||||
#define PMECC_CFG_PAGE_4SECTORS (2 << 8)
|
||||
#define PMECC_CFG_PAGE_8SECTORS (3 << 8)
|
||||
|
||||
#define PMECC_CFG_READ_OP (0 << 12)
|
||||
#define PMECC_CFG_WRITE_OP (1 << 12)
|
||||
|
||||
#define PMECC_CFG_SPARE_ENABLE (1 << 16)
|
||||
#define PMECC_CFG_SPARE_DISABLE (0 << 16)
|
||||
|
||||
#define PMECC_CFG_AUTO_ENABLE (1 << 20)
|
||||
#define PMECC_CFG_AUTO_DISABLE (0 << 20)
|
||||
|
||||
#define ATMEL_PMECC_SAREA 0x004 /* Spare area size */
|
||||
#define ATMEL_PMECC_SADDR 0x008 /* PMECC starting address */
|
||||
#define ATMEL_PMECC_EADDR 0x00c /* PMECC ending address */
|
||||
#define ATMEL_PMECC_CLK 0x010 /* PMECC clock control */
|
||||
#define PMECC_CLK_133MHZ (2 << 0)
|
||||
|
||||
#define ATMEL_PMECC_CTRL 0x014 /* PMECC control register */
|
||||
#define PMECC_CTRL_RST (1 << 0)
|
||||
#define PMECC_CTRL_DATA (1 << 1)
|
||||
#define PMECC_CTRL_USER (1 << 2)
|
||||
#define PMECC_CTRL_ENABLE (1 << 4)
|
||||
#define PMECC_CTRL_DISABLE (1 << 5)
|
||||
|
||||
#define ATMEL_PMECC_SR 0x018 /* PMECC status register */
|
||||
#define PMECC_SR_BUSY (1 << 0)
|
||||
#define PMECC_SR_ENABLE (1 << 4)
|
||||
|
||||
#define ATMEL_PMECC_IER 0x01c /* PMECC interrupt enable */
|
||||
#define PMECC_IER_ENABLE (1 << 0)
|
||||
#define ATMEL_PMECC_IDR 0x020 /* PMECC interrupt disable */
|
||||
#define PMECC_IER_DISABLE (1 << 0)
|
||||
#define ATMEL_PMECC_IMR 0x024 /* PMECC interrupt mask */
|
||||
#define PMECC_IER_MASK (1 << 0)
|
||||
#define ATMEL_PMECC_ISR 0x028 /* PMECC interrupt status */
|
||||
#define ATMEL_PMECC_ECCx 0x040 /* PMECC ECC x */
|
||||
#define ATMEL_PMECC_REMx 0x240 /* PMECC REM x */
|
||||
|
||||
/* PMERRLOC Register Definitions */
|
||||
#define ATMEL_PMERRLOC_ELCFG 0x000 /* Error location config */
|
||||
#define PMERRLOC_ELCFG_SECTOR_512 (0 << 0)
|
||||
#define PMERRLOC_ELCFG_SECTOR_1024 (1 << 0)
|
||||
#define PMERRLOC_ELCFG_NUM_ERRORS(n) ((n) << 16)
|
||||
|
||||
#define ATMEL_PMERRLOC_ELPRIM 0x004 /* Error location primitive */
|
||||
#define ATMEL_PMERRLOC_ELEN 0x008 /* Error location enable */
|
||||
#define ATMEL_PMERRLOC_ELDIS 0x00c /* Error location disable */
|
||||
#define PMERRLOC_DISABLE (1 << 0)
|
||||
|
||||
#define ATMEL_PMERRLOC_ELSR 0x010 /* Error location status */
|
||||
#define PMERRLOC_ELSR_BUSY (1 << 0)
|
||||
#define ATMEL_PMERRLOC_ELIER 0x014 /* Error location int enable */
|
||||
#define ATMEL_PMERRLOC_ELIDR 0x018 /* Error location int disable */
|
||||
#define ATMEL_PMERRLOC_ELIMR 0x01c /* Error location int mask */
|
||||
#define ATMEL_PMERRLOC_ELISR 0x020 /* Error location int status */
|
||||
#define PMERRLOC_ERR_NUM_MASK (0x1f << 8)
|
||||
#define PMERRLOC_CALC_DONE (1 << 0)
|
||||
#define ATMEL_PMERRLOC_SIGMAx 0x028 /* Error location SIGMA x */
|
||||
|
||||
/*
|
||||
* The ATMEL_PMERRLOC_ELx register location depends from the number of
|
||||
* bits corrected by the PMECC controller. Do not use it.
|
||||
*/
|
||||
|
||||
/* Register access macros for PMECC */
|
||||
#define pmecc_readl_relaxed(addr, reg) \
|
||||
readl_relaxed((addr) + ATMEL_PMECC_##reg)
|
||||
|
||||
#define pmecc_writel(addr, reg, value) \
|
||||
writel((value), (addr) + ATMEL_PMECC_##reg)
|
||||
|
||||
#define pmecc_readb_ecc_relaxed(addr, sector, n) \
|
||||
readb_relaxed((addr) + ATMEL_PMECC_ECCx + ((sector) * 0x40) + (n))
|
||||
|
||||
#define pmecc_readl_rem_relaxed(addr, sector, n) \
|
||||
readl_relaxed((addr) + ATMEL_PMECC_REMx + ((sector) * 0x40) + ((n) * 4))
|
||||
|
||||
#define pmerrloc_readl_relaxed(addr, reg) \
|
||||
readl_relaxed((addr) + ATMEL_PMERRLOC_##reg)
|
||||
|
||||
#define pmerrloc_writel(addr, reg, value) \
|
||||
writel((value), (addr) + ATMEL_PMERRLOC_##reg)
|
||||
|
||||
#define pmerrloc_writel_sigma_relaxed(addr, n, value) \
|
||||
writel_relaxed((value), (addr) + ATMEL_PMERRLOC_SIGMAx + ((n) * 4))
|
||||
|
||||
#define pmerrloc_readl_sigma_relaxed(addr, n) \
|
||||
readl_relaxed((addr) + ATMEL_PMERRLOC_SIGMAx + ((n) * 4))
|
||||
|
||||
#define pmerrloc_readl_el_relaxed(addr, n) \
|
||||
readl_relaxed((addr) + ((n) * 4))
|
||||
|
||||
/* Galois field dimension */
|
||||
#define PMECC_GF_DIMENSION_13 13
|
||||
#define PMECC_GF_DIMENSION_14 14
|
||||
|
||||
/* Primitive Polynomial used by PMECC */
|
||||
#define PMECC_GF_13_PRIMITIVE_POLY 0x201b
|
||||
#define PMECC_GF_14_PRIMITIVE_POLY 0x4443
|
||||
|
||||
#define PMECC_LOOKUP_TABLE_SIZE_512 0x2000
|
||||
#define PMECC_LOOKUP_TABLE_SIZE_1024 0x4000
|
||||
|
||||
/* Time out value for reading PMECC status register */
|
||||
#define PMECC_MAX_TIMEOUT_MS 100
|
||||
|
||||
/* Reserved bytes in oob area */
|
||||
#define PMECC_OOB_RESERVED_BYTES 2
|
||||
|
||||
#endif
|
||||
@@ -1,103 +0,0 @@
|
||||
/*
|
||||
* Atmel Nand Flash Controller (NFC) - System peripherals regsters.
|
||||
* Based on SAMA5D3 datasheet.
|
||||
*
|
||||
* © Copyright 2013 Atmel Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*/
|
||||
|
||||
#ifndef ATMEL_NAND_NFC_H
|
||||
#define ATMEL_NAND_NFC_H
|
||||
|
||||
/*
|
||||
* HSMC NFC registers
|
||||
*/
|
||||
#define ATMEL_HSMC_NFC_CFG 0x00 /* NFC Configuration Register */
|
||||
#define NFC_CFG_PAGESIZE (7 << 0)
|
||||
#define NFC_CFG_PAGESIZE_512 (0 << 0)
|
||||
#define NFC_CFG_PAGESIZE_1024 (1 << 0)
|
||||
#define NFC_CFG_PAGESIZE_2048 (2 << 0)
|
||||
#define NFC_CFG_PAGESIZE_4096 (3 << 0)
|
||||
#define NFC_CFG_PAGESIZE_8192 (4 << 0)
|
||||
#define NFC_CFG_WSPARE (1 << 8)
|
||||
#define NFC_CFG_RSPARE (1 << 9)
|
||||
#define NFC_CFG_NFC_DTOCYC (0xf << 16)
|
||||
#define NFC_CFG_NFC_DTOMUL (0x7 << 20)
|
||||
#define NFC_CFG_NFC_SPARESIZE (0x7f << 24)
|
||||
#define NFC_CFG_NFC_SPARESIZE_BIT_POS 24
|
||||
|
||||
#define ATMEL_HSMC_NFC_CTRL 0x04 /* NFC Control Register */
|
||||
#define NFC_CTRL_ENABLE (1 << 0)
|
||||
#define NFC_CTRL_DISABLE (1 << 1)
|
||||
|
||||
#define ATMEL_HSMC_NFC_SR 0x08 /* NFC Status Register */
|
||||
#define NFC_SR_BUSY (1 << 8)
|
||||
#define NFC_SR_XFR_DONE (1 << 16)
|
||||
#define NFC_SR_CMD_DONE (1 << 17)
|
||||
#define NFC_SR_DTOE (1 << 20)
|
||||
#define NFC_SR_UNDEF (1 << 21)
|
||||
#define NFC_SR_AWB (1 << 22)
|
||||
#define NFC_SR_ASE (1 << 23)
|
||||
#define NFC_SR_RB_EDGE (1 << 24)
|
||||
|
||||
#define ATMEL_HSMC_NFC_IER 0x0c
|
||||
#define ATMEL_HSMC_NFC_IDR 0x10
|
||||
#define ATMEL_HSMC_NFC_IMR 0x14
|
||||
#define ATMEL_HSMC_NFC_CYCLE0 0x18 /* NFC Address Cycle Zero */
|
||||
#define ATMEL_HSMC_NFC_ADDR_CYCLE0 (0xff)
|
||||
|
||||
#define ATMEL_HSMC_NFC_BANK 0x1c /* NFC Bank Register */
|
||||
#define ATMEL_HSMC_NFC_BANK0 (0 << 0)
|
||||
#define ATMEL_HSMC_NFC_BANK1 (1 << 0)
|
||||
|
||||
#define nfc_writel(addr, reg, value) \
|
||||
writel((value), (addr) + ATMEL_HSMC_NFC_##reg)
|
||||
|
||||
#define nfc_readl(addr, reg) \
|
||||
readl_relaxed((addr) + ATMEL_HSMC_NFC_##reg)
|
||||
|
||||
/*
|
||||
* NFC Address Command definitions
|
||||
*/
|
||||
#define NFCADDR_CMD_CMD1 (0xff << 2) /* Command for Cycle 1 */
|
||||
#define NFCADDR_CMD_CMD1_BIT_POS 2
|
||||
#define NFCADDR_CMD_CMD2 (0xff << 10) /* Command for Cycle 2 */
|
||||
#define NFCADDR_CMD_CMD2_BIT_POS 10
|
||||
#define NFCADDR_CMD_VCMD2 (0x1 << 18) /* Valid Cycle 2 Command */
|
||||
#define NFCADDR_CMD_ACYCLE (0x7 << 19) /* Number of Address required */
|
||||
#define NFCADDR_CMD_ACYCLE_NONE (0x0 << 19)
|
||||
#define NFCADDR_CMD_ACYCLE_1 (0x1 << 19)
|
||||
#define NFCADDR_CMD_ACYCLE_2 (0x2 << 19)
|
||||
#define NFCADDR_CMD_ACYCLE_3 (0x3 << 19)
|
||||
#define NFCADDR_CMD_ACYCLE_4 (0x4 << 19)
|
||||
#define NFCADDR_CMD_ACYCLE_5 (0x5 << 19)
|
||||
#define NFCADDR_CMD_ACYCLE_BIT_POS 19
|
||||
#define NFCADDR_CMD_CSID (0x7 << 22) /* Chip Select Identifier */
|
||||
#define NFCADDR_CMD_CSID_0 (0x0 << 22)
|
||||
#define NFCADDR_CMD_CSID_1 (0x1 << 22)
|
||||
#define NFCADDR_CMD_CSID_2 (0x2 << 22)
|
||||
#define NFCADDR_CMD_CSID_3 (0x3 << 22)
|
||||
#define NFCADDR_CMD_CSID_4 (0x4 << 22)
|
||||
#define NFCADDR_CMD_CSID_5 (0x5 << 22)
|
||||
#define NFCADDR_CMD_CSID_6 (0x6 << 22)
|
||||
#define NFCADDR_CMD_CSID_7 (0x7 << 22)
|
||||
#define NFCADDR_CMD_DATAEN (0x1 << 25) /* Data Transfer Enable */
|
||||
#define NFCADDR_CMD_DATADIS (0x0 << 25) /* Data Transfer Disable */
|
||||
#define NFCADDR_CMD_NFCRD (0x0 << 26) /* NFC Read Enable */
|
||||
#define NFCADDR_CMD_NFCWR (0x1 << 26) /* NFC Write Enable */
|
||||
#define NFCADDR_CMD_NFCBUSY (0x1 << 27) /* NFC Busy */
|
||||
|
||||
#define nfc_cmd_addr1234_writel(cmd, addr1234, nfc_base) \
|
||||
writel((addr1234), (cmd) + nfc_base)
|
||||
|
||||
#define nfc_cmd_readl(bitstatus, nfc_base) \
|
||||
readl_relaxed((bitstatus) + nfc_base)
|
||||
|
||||
#define NFC_TIME_OUT_MS 100
|
||||
#define NFC_SRAM_BANK1_OFFSET 0x1200
|
||||
|
||||
#endif
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user