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-20121219' of git://git.infradead.org/linux-mtd
Pull MTD updates from David Woodhouse:
- Various cleanups especially in NAND tests
- Add support for NAND flash on BCMA bus
- DT support for sh_flctl and denali NAND drivers
- Kill obsolete/superceded drivers (fortunet, nomadik_nand)
- Fix JFFS2 locking bug in ENOMEM failure path
- New SPI flash chips, as usual
- Support writing in 'reliable mode' for DiskOnChip G4
- Debugfs support in nandsim
* tag 'for-linus-20121219' of git://git.infradead.org/linux-mtd: (96 commits)
mtd: nand: typo in nand_id_has_period() comments
mtd: nand/gpio: use io{read,write}*_rep accessors
mtd: block2mtd: throttle writes by calling balance_dirty_pages_ratelimited.
mtd: nand: gpmi: reset BCH earlier, too, to avoid NAND startup problems
mtd: nand/docg4: fix and improve read of factory bbt
mtd: nand/docg4: reserve bb marker area in ecclayout
mtd: nand/docg4: add support for writing in reliable mode
mtd: mxc_nand: reorder part_probes to let cmdline override other sources
mtd: mxc_nand: fix unbalanced clk_disable() in error path
mtd: nandsim: Introduce debugfs infrastructure
mtd: physmap_of: error checking to prevent a NULL pointer dereference
mtg: docg3: potential divide by zero in doc_write_oob()
mtd: bcm47xxnflash: writing support
mtd: tests/read: initialize buffer for whole next page
mtd: at91: atmel_nand: return bit flips for the PMECC read_page()
mtd: fix recovery after failed write-buffer operation in cfi_cmdset_0002.c
mtd: nand: onfi need to be probed in 8 bits mode
mtd: nand: add NAND_BUSWIDTH_AUTO to autodetect bus width
mtd: nand: print flash size during detection
mted: nand_wait_ready timeout fix
...
This commit is contained in:
@@ -23,6 +23,9 @@ Recommended properties :
|
||||
- ti,davinci-nand-buswidth: buswidth 8 or 16
|
||||
- ti,davinci-nand-use-bbt: use flash based bad block table support.
|
||||
|
||||
nand device bindings may contain additional sub-nodes describing
|
||||
partitions of the address space. See partition.txt for more detail.
|
||||
|
||||
Example(da850 EVM ):
|
||||
nand_cs3@62000000 {
|
||||
compatible = "ti,davinci-nand";
|
||||
@@ -35,4 +38,9 @@ nand_cs3@62000000 {
|
||||
ti,davinci-ecc-mode = "hw";
|
||||
ti,davinci-ecc-bits = <4>;
|
||||
ti,davinci-nand-use-bbt;
|
||||
|
||||
partition@180000 {
|
||||
label = "ubifs";
|
||||
reg = <0x180000 0x7e80000>;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
* Denali NAND controller
|
||||
|
||||
Required properties:
|
||||
- compatible : should be "denali,denali-nand-dt"
|
||||
- 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.
|
||||
|
||||
Examples:
|
||||
|
||||
nand: nand@ff900000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "denali,denali-nand-dt";
|
||||
reg = <0xff900000 0x100000>, <0xffb80000 0x10000>;
|
||||
reg-names = "nand_data", "denali_reg";
|
||||
interrupts = <0 144 4>;
|
||||
dma-mask = <0xffffffff>;
|
||||
};
|
||||
@@ -0,0 +1,49 @@
|
||||
FLCTL NAND controller
|
||||
|
||||
Required properties:
|
||||
- compatible : "renesas,shmobile-flctl-sh7372"
|
||||
- reg : Address range of the FLCTL
|
||||
- interrupts : flste IRQ number
|
||||
- nand-bus-width : bus width to NAND chip
|
||||
|
||||
Optional properties:
|
||||
- dmas: DMA specifier(s)
|
||||
- dma-names: name for each DMA specifier. Valid names are
|
||||
"data_tx", "data_rx", "ecc_tx", "ecc_rx"
|
||||
|
||||
The DMA fields are not used yet in the driver but are listed here for
|
||||
completing the bindings.
|
||||
|
||||
The device tree may optionally contain sub-nodes describing partitions of the
|
||||
address space. See partition.txt for more detail.
|
||||
|
||||
Example:
|
||||
|
||||
flctl@e6a30000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "renesas,shmobile-flctl-sh7372";
|
||||
reg = <0xe6a30000 0x100>;
|
||||
interrupts = <0x0d80>;
|
||||
|
||||
nand-bus-width = <16>;
|
||||
|
||||
dmas = <&dmac 1 /* data_tx */
|
||||
&dmac 2;> /* data_rx */
|
||||
dma-names = "data_tx", "data_rx";
|
||||
|
||||
system@0 {
|
||||
label = "system";
|
||||
reg = <0x0 0x8000000>;
|
||||
};
|
||||
|
||||
userdata@8000000 {
|
||||
label = "userdata";
|
||||
reg = <0x8000000 0x10000000>;
|
||||
};
|
||||
|
||||
cache@18000000 {
|
||||
label = "cache";
|
||||
reg = <0x18000000 0x8000000>;
|
||||
};
|
||||
};
|
||||
@@ -3,9 +3,7 @@
|
||||
Required properties:
|
||||
- compatible : "st,spear600-fsmc-nand"
|
||||
- reg : Address range of the mtd chip
|
||||
- reg-names: Should contain the reg names "fsmc_regs" and "nand_data"
|
||||
- st,ale-off : Chip specific offset to ALE
|
||||
- st,cle-off : Chip specific offset to CLE
|
||||
- reg-names: Should contain the reg names "fsmc_regs", "nand_data", "nand_addr" and "nand_cmd"
|
||||
|
||||
Optional properties:
|
||||
- bank-width : Width (in bytes) of the device. If not present, the width
|
||||
@@ -19,10 +17,10 @@ Example:
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
reg = <0xd1800000 0x1000 /* FSMC Register */
|
||||
0xd2000000 0x4000>; /* NAND Base */
|
||||
reg-names = "fsmc_regs", "nand_data";
|
||||
st,ale-off = <0x20000>;
|
||||
st,cle-off = <0x10000>;
|
||||
0xd2000000 0x0010 /* NAND Base DATA */
|
||||
0xd2020000 0x0010 /* NAND Base ADDR */
|
||||
0xd2010000 0x0010>; /* NAND Base CMD */
|
||||
reg-names = "fsmc_regs", "nand_data", "nand_addr", "nand_cmd";
|
||||
|
||||
bank-width = <1>;
|
||||
nand-skip-bbtscan;
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
* MTD SPI driver for ST M25Pxx (and similar) serial flash chips
|
||||
|
||||
Required properties:
|
||||
- #address-cells, #size-cells : Must be present if the device has sub-nodes
|
||||
representing partitions.
|
||||
- compatible : Should be the manufacturer and the name of the chip. Bear in mind
|
||||
the DT binding is not Linux-only, but in case of Linux, see the
|
||||
"m25p_ids" table in drivers/mtd/devices/m25p80.c for the list of
|
||||
supported chips.
|
||||
- reg : Chip-Select number
|
||||
- spi-max-frequency : Maximum frequency of the SPI bus the chip can operate at
|
||||
|
||||
Optional properties:
|
||||
- m25p,fast-read : Use the "fast read" opcode to read data from the chip instead
|
||||
of the usual "read" opcode. This opcode is not supported by
|
||||
all chips and support for it can not be detected at runtime.
|
||||
Refer to your chips' datasheet to check if this is supported
|
||||
by your chip.
|
||||
|
||||
Example:
|
||||
|
||||
flash: m25p80@0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "spansion,m25p80";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <40000000>;
|
||||
m25p,fast-read;
|
||||
};
|
||||
@@ -23,6 +23,9 @@ file systems on embedded devices.
|
||||
unaligned accesses as implemented in the JFFS2 code via memcpy().
|
||||
By defining "no-unaligned-direct-access", the flash will not be
|
||||
exposed directly to the MTD users (e.g. JFFS2) any more.
|
||||
- linux,mtd-name: allow to specify the mtd name for retro capability with
|
||||
physmap-flash drivers as boot loader pass the mtd partition via the old
|
||||
device name physmap-flash.
|
||||
|
||||
For JEDEC compatible devices, the following additional properties
|
||||
are defined:
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
400000
|
||||
500000
|
||||
600000 >;
|
||||
status = "disable"
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
ahb {
|
||||
@@ -118,15 +118,15 @@
|
||||
compatible = "st,spear600-fsmc-nand";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
reg = <0xb0000000 0x1000 /* FSMC Register */
|
||||
0xb0800000 0x0010>; /* NAND Base */
|
||||
reg-names = "fsmc_regs", "nand_data";
|
||||
reg = <0xb0000000 0x1000 /* FSMC Register*/
|
||||
0xb0800000 0x0010 /* NAND Base DATA */
|
||||
0xb0820000 0x0010 /* NAND Base ADDR */
|
||||
0xb0810000 0x0010>; /* NAND Base CMD */
|
||||
reg-names = "fsmc_regs", "nand_data", "nand_addr", "nand_cmd";
|
||||
interrupts = <0 20 0x4
|
||||
0 21 0x4
|
||||
0 22 0x4
|
||||
0 23 0x4>;
|
||||
st,ale-off = <0x20000>;
|
||||
st,cle-off = <0x10000>;
|
||||
st,mode = <2>;
|
||||
status = "disabled";
|
||||
};
|
||||
@@ -144,7 +144,7 @@
|
||||
compatible = "st,pcm-audio";
|
||||
#address-cells = <0>;
|
||||
#size-cells = <0>;
|
||||
status = "disable"
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
smi: flash@ea000000 {
|
||||
|
||||
@@ -38,10 +38,10 @@
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
reg = <0x94000000 0x1000 /* FSMC Register */
|
||||
0x80000000 0x0010>; /* NAND Base */
|
||||
reg-names = "fsmc_regs", "nand_data";
|
||||
st,ale-off = <0x20000>;
|
||||
st,cle-off = <0x10000>;
|
||||
0x80000000 0x0010 /* NAND Base DATA */
|
||||
0x80020000 0x0010 /* NAND Base ADDR */
|
||||
0x80010000 0x0010>; /* NAND Base CMD */
|
||||
reg-names = "fsmc_regs", "nand_data", "nand_addr", "nand_cmd";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
||||
@@ -33,10 +33,10 @@
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
reg = <0x44000000 0x1000 /* FSMC Register */
|
||||
0x40000000 0x0010>; /* NAND Base */
|
||||
reg-names = "fsmc_regs", "nand_data";
|
||||
st,ale-off = <0x10000>;
|
||||
st,cle-off = <0x20000>;
|
||||
0x40000000 0x0010 /* NAND Base DATA */
|
||||
0x40020000 0x0010 /* NAND Base ADDR */
|
||||
0x40010000 0x0010>; /* NAND Base CMD */
|
||||
reg-names = "fsmc_regs", "nand_data", "nand_addr", "nand_cmd";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
||||
@@ -40,10 +40,10 @@
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
reg = <0x4c000000 0x1000 /* FSMC Register */
|
||||
0x50000000 0x0010>; /* NAND Base */
|
||||
reg-names = "fsmc_regs", "nand_data";
|
||||
st,ale-off = <0x20000>;
|
||||
st,cle-off = <0x10000>;
|
||||
0x50000000 0x0010 /* NAND Base DATA */
|
||||
0x50020000 0x0010 /* NAND Base ADDR */
|
||||
0x50010000 0x0010>; /* NAND Base CMD */
|
||||
reg-names = "fsmc_regs", "nand_data", "nand_addr", "nand_cmd";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
||||
@@ -76,10 +76,10 @@
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
reg = <0xd1800000 0x1000 /* FSMC Register */
|
||||
0xd2000000 0x4000>; /* NAND Base */
|
||||
reg-names = "fsmc_regs", "nand_data";
|
||||
st,ale-off = <0x20000>;
|
||||
st,cle-off = <0x10000>;
|
||||
0xd2000000 0x0010 /* NAND Base DATA */
|
||||
0xd2020000 0x0010 /* NAND Base ADDR */
|
||||
0xd2010000 0x0010>; /* NAND Base CMD */
|
||||
reg-names = "fsmc_regs", "nand_data", "nand_addr", "nand_cmd";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
||||
@@ -57,7 +57,7 @@ CONFIG_MTD_CHAR=y
|
||||
CONFIG_MTD_BLOCK=y
|
||||
CONFIG_MTD_NAND=y
|
||||
CONFIG_MTD_NAND_ECC_SMC=y
|
||||
CONFIG_MTD_NAND_NOMADIK=y
|
||||
CONFIG_MTD_NAND_FSMC=y
|
||||
CONFIG_MTD_ONENAND=y
|
||||
CONFIG_MTD_ONENAND_VERIFY_WRITE=y
|
||||
CONFIG_MTD_ONENAND_GENERIC=y
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/nand.h>
|
||||
#include <linux/mtd/fsmc.h>
|
||||
#include <linux/mtd/onenand.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/i2c.h>
|
||||
@@ -33,7 +34,6 @@
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/flash.h>
|
||||
#include <asm/mach/time.h>
|
||||
#include <mach/fsmc.h>
|
||||
#include <mach/irqs.h>
|
||||
|
||||
#include "cpu-8815.h"
|
||||
@@ -42,39 +42,34 @@
|
||||
#define SRC_CR_INIT_MASK 0x00007fff
|
||||
#define SRC_CR_INIT_VAL 0x2aaa8000
|
||||
|
||||
#define ALE_OFF 0x1000000
|
||||
#define CLE_OFF 0x800000
|
||||
|
||||
/* These addresses span 16MB, so use three individual pages */
|
||||
static struct resource nhk8815_nand_resources[] = {
|
||||
{
|
||||
.name = "nand_data",
|
||||
.start = 0x40000000,
|
||||
.end = 0x40000000 + SZ_16K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
}, {
|
||||
.name = "nand_addr",
|
||||
.start = NAND_IO_ADDR,
|
||||
.end = NAND_IO_ADDR + 0xfff,
|
||||
.start = 0x40000000 + ALE_OFF,
|
||||
.end = 0x40000000 +ALE_OFF + SZ_16K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
}, {
|
||||
.name = "nand_cmd",
|
||||
.start = NAND_IO_CMD,
|
||||
.end = NAND_IO_CMD + 0xfff,
|
||||
.start = 0x40000000 + CLE_OFF,
|
||||
.end = 0x40000000 + CLE_OFF + SZ_16K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
}, {
|
||||
.name = "nand_data",
|
||||
.start = NAND_IO_DATA,
|
||||
.end = NAND_IO_DATA + 0xfff,
|
||||
.name = "fsmc_regs",
|
||||
.start = NOMADIK_FSMC_BASE,
|
||||
.end = NOMADIK_FSMC_BASE + SZ_4K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
static int nhk8815_nand_init(void)
|
||||
{
|
||||
/* FSMC setup for nand chip select (8-bit nand in 8815NHK) */
|
||||
writel(0x0000000E, FSMC_PCR(0));
|
||||
writel(0x000D0A00, FSMC_PMEM(0));
|
||||
writel(0x00100A00, FSMC_PATT(0));
|
||||
|
||||
/* enable access to the chip select area */
|
||||
writel(readl(FSMC_PCR(0)) | 0x04, FSMC_PCR(0));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* These partitions are the same as those used in the 2.6.20 release
|
||||
* shipped by the vendor; the first two partitions are mandated
|
||||
@@ -108,20 +103,28 @@ static struct mtd_partition nhk8815_partitions[] = {
|
||||
}
|
||||
};
|
||||
|
||||
static struct nomadik_nand_platform_data nhk8815_nand_data = {
|
||||
.parts = nhk8815_partitions,
|
||||
.nparts = ARRAY_SIZE(nhk8815_partitions),
|
||||
.options = NAND_COPYBACK | NAND_CACHEPRG | NAND_NO_PADDING,
|
||||
.init = nhk8815_nand_init,
|
||||
static struct fsmc_nand_timings nhk8815_nand_timings = {
|
||||
.thiz = 0,
|
||||
.thold = 0x10,
|
||||
.twait = 0x0A,
|
||||
.tset = 0,
|
||||
};
|
||||
|
||||
static struct fsmc_nand_platform_data nhk8815_nand_platform_data = {
|
||||
.nand_timings = &nhk8815_nand_timings,
|
||||
.partitions = nhk8815_partitions,
|
||||
.nr_partitions = ARRAY_SIZE(nhk8815_partitions),
|
||||
.width = FSMC_NAND_BW8,
|
||||
};
|
||||
|
||||
static struct platform_device nhk8815_nand_device = {
|
||||
.name = "nomadik_nand",
|
||||
.dev = {
|
||||
.platform_data = &nhk8815_nand_data,
|
||||
.name = "fsmc-nand",
|
||||
.id = -1,
|
||||
.resource = nhk8815_nand_resources,
|
||||
.num_resources = ARRAY_SIZE(nhk8815_nand_resources),
|
||||
.dev = {
|
||||
.platform_data = &nhk8815_nand_platform_data,
|
||||
},
|
||||
.resource = nhk8815_nand_resources,
|
||||
.num_resources = ARRAY_SIZE(nhk8815_nand_resources),
|
||||
};
|
||||
|
||||
/* These are the partitions for the OneNand device, different from above */
|
||||
@@ -176,6 +179,10 @@ static struct platform_device nhk8815_onenand_device = {
|
||||
.num_resources = ARRAY_SIZE(nhk8815_onenand_resource),
|
||||
};
|
||||
|
||||
/* bus control reg. and bus timing reg. for CS0..CS3 */
|
||||
#define FSMC_BCR(x) (NOMADIK_FSMC_VA + (x << 3))
|
||||
#define FSMC_BTR(x) (NOMADIK_FSMC_VA + (x << 3) + 0x04)
|
||||
|
||||
static void __init nhk8815_onenand_init(void)
|
||||
{
|
||||
#ifdef CONFIG_MTD_ONENAND
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
|
||||
/* Definitions for the Nomadik FSMC "Flexible Static Memory controller" */
|
||||
|
||||
#ifndef __ASM_ARCH_FSMC_H
|
||||
#define __ASM_ARCH_FSMC_H
|
||||
|
||||
#include <mach/hardware.h>
|
||||
/*
|
||||
* Register list
|
||||
*/
|
||||
|
||||
/* bus control reg. and bus timing reg. for CS0..CS3 */
|
||||
#define FSMC_BCR(x) (NOMADIK_FSMC_VA + (x << 3))
|
||||
#define FSMC_BTR(x) (NOMADIK_FSMC_VA + (x << 3) + 0x04)
|
||||
|
||||
/* PC-card and NAND:
|
||||
* PCR = control register
|
||||
* PMEM = memory timing
|
||||
* PATT = attribute timing
|
||||
* PIO = I/O timing
|
||||
* PECCR = ECC result
|
||||
*/
|
||||
#define FSMC_PCR(x) (NOMADIK_FSMC_VA + ((2 + x) << 5) + 0x00)
|
||||
#define FSMC_PMEM(x) (NOMADIK_FSMC_VA + ((2 + x) << 5) + 0x08)
|
||||
#define FSMC_PATT(x) (NOMADIK_FSMC_VA + ((2 + x) << 5) + 0x0c)
|
||||
#define FSMC_PIO(x) (NOMADIK_FSMC_VA + ((2 + x) << 5) + 0x10)
|
||||
#define FSMC_PECCR(x) (NOMADIK_FSMC_VA + ((2 + x) << 5) + 0x14)
|
||||
|
||||
#endif /* __ASM_ARCH_FSMC_H */
|
||||
@@ -249,6 +249,18 @@ static struct resource rtc_resources[] = {
|
||||
* but these are not yet used by the driver.
|
||||
*/
|
||||
static struct resource fsmc_resources[] = {
|
||||
{
|
||||
.name = "nand_addr",
|
||||
.start = U300_NAND_CS0_PHYS_BASE + PLAT_NAND_ALE,
|
||||
.end = U300_NAND_CS0_PHYS_BASE + PLAT_NAND_ALE + SZ_16K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
.name = "nand_cmd",
|
||||
.start = U300_NAND_CS0_PHYS_BASE + PLAT_NAND_CLE,
|
||||
.end = U300_NAND_CS0_PHYS_BASE + PLAT_NAND_CLE + SZ_16K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
.name = "nand_data",
|
||||
.start = U300_NAND_CS0_PHYS_BASE,
|
||||
@@ -1492,8 +1504,6 @@ static struct fsmc_nand_platform_data nand_platform_data = {
|
||||
.nr_partitions = ARRAY_SIZE(u300_partitions),
|
||||
.options = NAND_SKIP_BBTSCAN,
|
||||
.width = FSMC_NAND_BW8,
|
||||
.ale_off = PLAT_NAND_ALE,
|
||||
.cle_off = PLAT_NAND_CLE,
|
||||
};
|
||||
|
||||
static struct platform_device nand_device = {
|
||||
|
||||
@@ -13,12 +13,13 @@
|
||||
#include <linux/export.h>
|
||||
#include <linux/bcma/bcma.h>
|
||||
|
||||
static u32 bcma_chipco_pll_read(struct bcma_drv_cc *cc, u32 offset)
|
||||
u32 bcma_chipco_pll_read(struct bcma_drv_cc *cc, u32 offset)
|
||||
{
|
||||
bcma_cc_write32(cc, BCMA_CC_PLLCTL_ADDR, offset);
|
||||
bcma_cc_read32(cc, BCMA_CC_PLLCTL_ADDR);
|
||||
return bcma_cc_read32(cc, BCMA_CC_PLLCTL_DATA);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(bcma_chipco_pll_read);
|
||||
|
||||
void bcma_chipco_pll_write(struct bcma_drv_cc *cc, u32 offset, u32 value)
|
||||
{
|
||||
|
||||
@@ -20,6 +20,7 @@ void __init nomadik_clk_init(void)
|
||||
clk_register_clkdev(clk, NULL, "gpio.2");
|
||||
clk_register_clkdev(clk, NULL, "gpio.3");
|
||||
clk_register_clkdev(clk, NULL, "rng");
|
||||
clk_register_clkdev(clk, NULL, "fsmc-nand");
|
||||
|
||||
/*
|
||||
* The 2.4 MHz TIMCLK reference clock is active at boot time, this is
|
||||
|
||||
@@ -26,19 +26,16 @@
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/magic.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include <uapi/linux/magic.h>
|
||||
|
||||
#define AR7_PARTS 4
|
||||
#define ROOT_OFFSET 0xe0000
|
||||
|
||||
#define LOADER_MAGIC1 le32_to_cpu(0xfeedfa42)
|
||||
#define LOADER_MAGIC2 le32_to_cpu(0xfeed1281)
|
||||
|
||||
#ifndef SQUASHFS_MAGIC
|
||||
#define SQUASHFS_MAGIC 0x73717368
|
||||
#endif
|
||||
|
||||
struct ar7_bin_rec {
|
||||
unsigned int checksum;
|
||||
unsigned int length;
|
||||
|
||||
+14
-18
@@ -37,8 +37,7 @@
|
||||
|
||||
#define BCM63XX_EXTENDED_SIZE 0xBFC00000 /* Extended flash address */
|
||||
|
||||
#define BCM63XX_MIN_CFE_SIZE 0x10000 /* always at least 64KiB */
|
||||
#define BCM63XX_MIN_NVRAM_SIZE 0x10000 /* always at least 64KiB */
|
||||
#define BCM63XX_CFE_BLOCK_SIZE 0x10000 /* always at least 64KiB */
|
||||
|
||||
#define BCM63XX_CFE_MAGIC_OFFSET 0x4e0
|
||||
|
||||
@@ -79,7 +78,7 @@ static int bcm63xx_parse_cfe_partitions(struct mtd_info *master,
|
||||
unsigned int rootfsaddr, kerneladdr, spareaddr;
|
||||
unsigned int rootfslen, kernellen, sparelen, totallen;
|
||||
unsigned int cfelen, nvramlen;
|
||||
int namelen = 0;
|
||||
unsigned int cfe_erasesize;
|
||||
int i;
|
||||
u32 computed_crc;
|
||||
bool rootfs_first = false;
|
||||
@@ -87,8 +86,11 @@ static int bcm63xx_parse_cfe_partitions(struct mtd_info *master,
|
||||
if (bcm63xx_detect_cfe(master))
|
||||
return -EINVAL;
|
||||
|
||||
cfelen = max_t(uint32_t, master->erasesize, BCM63XX_MIN_CFE_SIZE);
|
||||
nvramlen = max_t(uint32_t, master->erasesize, BCM63XX_MIN_NVRAM_SIZE);
|
||||
cfe_erasesize = max_t(uint32_t, master->erasesize,
|
||||
BCM63XX_CFE_BLOCK_SIZE);
|
||||
|
||||
cfelen = cfe_erasesize;
|
||||
nvramlen = cfe_erasesize;
|
||||
|
||||
/* Allocate memory for buffer */
|
||||
buf = vmalloc(sizeof(struct bcm_tag));
|
||||
@@ -121,7 +123,6 @@ static int bcm63xx_parse_cfe_partitions(struct mtd_info *master,
|
||||
kerneladdr = kerneladdr - BCM63XX_EXTENDED_SIZE;
|
||||
rootfsaddr = rootfsaddr - BCM63XX_EXTENDED_SIZE;
|
||||
spareaddr = roundup(totallen, master->erasesize) + cfelen;
|
||||
sparelen = master->size - spareaddr - nvramlen;
|
||||
|
||||
if (rootfsaddr < kerneladdr) {
|
||||
/* default Broadcom layout */
|
||||
@@ -139,19 +140,15 @@ static int bcm63xx_parse_cfe_partitions(struct mtd_info *master,
|
||||
rootfslen = 0;
|
||||
rootfsaddr = 0;
|
||||
spareaddr = cfelen;
|
||||
sparelen = master->size - cfelen - nvramlen;
|
||||
}
|
||||
sparelen = master->size - spareaddr - nvramlen;
|
||||
|
||||
/* Determine number of partitions */
|
||||
namelen = 8;
|
||||
if (rootfslen > 0) {
|
||||
if (rootfslen > 0)
|
||||
nrparts++;
|
||||
namelen += 6;
|
||||
}
|
||||
if (kernellen > 0) {
|
||||
|
||||
if (kernellen > 0)
|
||||
nrparts++;
|
||||
namelen += 6;
|
||||
}
|
||||
|
||||
/* Ask kernel for more memory */
|
||||
parts = kzalloc(sizeof(*parts) * nrparts + 10 * nrparts, GFP_KERNEL);
|
||||
@@ -193,17 +190,16 @@ static int bcm63xx_parse_cfe_partitions(struct mtd_info *master,
|
||||
parts[curpart].name = "nvram";
|
||||
parts[curpart].offset = master->size - nvramlen;
|
||||
parts[curpart].size = nvramlen;
|
||||
curpart++;
|
||||
|
||||
/* Global partition "linux" to make easy firmware upgrade */
|
||||
curpart++;
|
||||
parts[curpart].name = "linux";
|
||||
parts[curpart].offset = cfelen;
|
||||
parts[curpart].size = master->size - cfelen - nvramlen;
|
||||
|
||||
for (i = 0; i < nrparts; i++)
|
||||
pr_info("Partition %d is %s offset %lx and length %lx\n", i,
|
||||
parts[i].name, (long unsigned int)(parts[i].offset),
|
||||
(long unsigned int)(parts[i].size));
|
||||
pr_info("Partition %d is %s offset %llx and length %llx\n", i,
|
||||
parts[i].name, parts[i].offset, parts[i].size);
|
||||
|
||||
pr_info("Spare partition is offset %x and length %x\n", spareaddr,
|
||||
sparelen);
|
||||
|
||||
@@ -1536,8 +1536,20 @@ static int __xipram do_write_buffer(struct map_info *map, struct flchip *chip,
|
||||
UDELAY(map, chip, adr, 1);
|
||||
}
|
||||
|
||||
/* reset on all failures. */
|
||||
map_write( map, CMD(0xF0), chip->start );
|
||||
/*
|
||||
* Recovery from write-buffer programming failures requires
|
||||
* the write-to-buffer-reset sequence. Since the last part
|
||||
* of the sequence also works as a normal reset, we can run
|
||||
* the same commands regardless of why we are here.
|
||||
* See e.g.
|
||||
* http://www.spansion.com/Support/Application%20Notes/MirrorBit_Write_Buffer_Prog_Page_Buffer_Read_AN.pdf
|
||||
*/
|
||||
cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi,
|
||||
cfi->device_type, NULL);
|
||||
cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi,
|
||||
cfi->device_type, NULL);
|
||||
cfi_send_gen_cmd(0xF0, cfi->addr_unlock1, chip->start, map, cfi,
|
||||
cfi->device_type, NULL);
|
||||
xip_enable(map, chip, adr);
|
||||
/* FIXME - should have reset delay before continuing */
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user