* [RFC] mxc nand controller updates
@ 2009-10-21 14:13 Sascha Hauer
2009-10-21 14:13 ` [PATCH 01/19] Revert "mtd: mxc_nand: fix 2KiB pagesize NAND on i.MX27" Sascha Hauer
` (2 more replies)
0 siblings, 3 replies; 38+ messages in thread
From: Sascha Hauer @ 2009-10-21 14:13 UTC (permalink / raw)
To: linux-mtd; +Cc: Vladimir Barinov, mathieu.berland, jbe, Eric Benard, sha
Hi all,
Here are several patches for the mxc nand controller. At the end
of this series we are able to use this driver with the i.MX25/35
SoCs. Please review and test if you do not want to see your boards
break ;)
Sascha
The following changes since commit 012abeea669ea49636cf952d13298bb68654146a:
Linus Torvalds (1):
Linux 2.6.32-rc5
are available in the git repository at:
git://git.pengutronix.de/git/imx/linux-2.6.git mxc-nand
Sascha Hauer (19):
Revert "mtd: mxc_nand: fix 2KiB pagesize NAND on i.MX27"
mxc_nand: cleanup eccoob descriptions
mxc_nand: cleanup initialization
mxc_nand: merge send_read_page and send_prog_page
mxc_nand: introduce mxc_do_addr_cycle
mxc nand: remove debug param
mxc nand: remove dead code
mxc nand: use resource_size()
mxc nand: use buffers
mxc nand: simplify command processing
mxc nand: modify send_page to send all pages, not only one
mxc_nand: remove unused defines
mxc_nand: Make main/spare areas runtime configurable
mxc_nand: Get rid of pagesize_2k flag
mxc_nand: Add NFC V2 support
mxc_nand: disable sp_en bit only once
mxc_nand: Allow flash based bbt
mxc_nand: remove TROP_US_DELAY
mxc_nand: use DRIVER_NAME where appropriate
arch/arm/plat-mxc/include/mach/mxc_nand.h | 3 +-
drivers/mtd/nand/mxc_nand.c | 781 +++++++++++------------------
2 files changed, 297 insertions(+), 487 deletions(-)
^ permalink raw reply [flat|nested] 38+ messages in thread
* [PATCH 01/19] Revert "mtd: mxc_nand: fix 2KiB pagesize NAND on i.MX27"
2009-10-21 14:13 [RFC] mxc nand controller updates Sascha Hauer
@ 2009-10-21 14:13 ` Sascha Hauer
2009-10-21 14:13 ` [PATCH 02/19] mxc_nand: cleanup eccoob descriptions Sascha Hauer
2009-10-31 18:38 ` [RFC] mxc nand controller updates alfred steele
2009-11-11 7:49 ` Artem Bityutskiy
2 siblings, 1 reply; 38+ messages in thread
From: Sascha Hauer @ 2009-10-21 14:13 UTC (permalink / raw)
To: linux-mtd
Cc: Sascha Hauer, Eric Benard, Vladimir Barinov, mathieu.berland, jbe,
sha
This reverts commit 71b7d0d90d536ae4e70929cc59a1a9f6ba457c6c.
---
drivers/mtd/nand/mxc_nand.c | 16 +---------------
1 files changed, 1 insertions(+), 15 deletions(-)
diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c
index 65b26d5..76beea4 100644
--- a/drivers/mtd/nand/mxc_nand.c
+++ b/drivers/mtd/nand/mxc_nand.c
@@ -857,17 +857,6 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command,
}
}
-/* Define some generic bad / good block scan pattern which are used
- * while scanning a device for factory marked good / bad blocks. */
-static uint8_t scan_ff_pattern[] = { 0xff, 0xff };
-
-static struct nand_bbt_descr smallpage_memorybased = {
- .options = NAND_BBT_SCAN2NDPAGE,
- .offs = 5,
- .len = 1,
- .pattern = scan_ff_pattern
-};
-
static int __init mxcnd_probe(struct platform_device *pdev)
{
struct nand_chip *this;
@@ -984,10 +973,7 @@ static int __init mxcnd_probe(struct platform_device *pdev)
goto escan;
}
- if (mtd->writesize == 2048) {
- host->pagesize_2k = 1;
- this->badblock_pattern = &smallpage_memorybased;
- }
+ host->pagesize_2k = (mtd->writesize == 2048) ? 1 : 0;
if (this->ecc.mode == NAND_ECC_HW) {
switch (mtd->oobsize) {
--
1.6.5
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 02/19] mxc_nand: cleanup eccoob descriptions
2009-10-21 14:13 ` [PATCH 01/19] Revert "mtd: mxc_nand: fix 2KiB pagesize NAND on i.MX27" Sascha Hauer
@ 2009-10-21 14:13 ` Sascha Hauer
2009-10-21 14:13 ` [PATCH 03/19] mxc_nand: cleanup initialization Sascha Hauer
0 siblings, 1 reply; 38+ messages in thread
From: Sascha Hauer @ 2009-10-21 14:13 UTC (permalink / raw)
To: linux-mtd
Cc: Sascha Hauer, Eric Benard, Vladimir Barinov, mathieu.berland, jbe,
sha
The original Freescale driver used to have eccoob descriptions like
this:
static struct nand_ecclayout nand_hw_eccoob_8 = {
.eccbytes = 5,
.eccpos = {6, 7, 8, 9, 10},
.oobfree = {{0, 5}, {11, 5}}
};
static struct nand_ecclayout nand_hw_eccoob_16 = {
.eccbytes = 5,
.eccpos = {6, 7, 8, 9, 10},
.oobfree = {{0, 6}, {12, 4}}
};
The former was used for 8bit flashes and the latter for 16bit flashes.
They honored the fact that the bad block marker on 8bit flashes is on byte 5
while on 16bit flashes it is on byte 11.
In the Kernel driver this was copied wrong and we ended up with two identical
descriptions.
Change it so that we have only one description which leaves byte 5 and byte
11 unspecified so that it won't be used by others.
Also, rename the descriptions to nand_hw_eccoob_smallpage and
nand_hw_eccoob_largepage so that it can't be confused with Nand chip bus
widths (what actually happened in this driver)
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
drivers/mtd/nand/mxc_nand.c | 24 +++++++++---------------
1 files changed, 9 insertions(+), 15 deletions(-)
diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c
index 76beea4..7a34679 100644
--- a/drivers/mtd/nand/mxc_nand.c
+++ b/drivers/mtd/nand/mxc_nand.c
@@ -129,19 +129,13 @@ struct mxc_nand_host {
#define SPARE_SINGLEBIT_ERROR 0x1
/* OOB placement block for use with hardware ecc generation */
-static struct nand_ecclayout nand_hw_eccoob_8 = {
+static struct nand_ecclayout nand_hw_eccoob_smallpage = {
.eccbytes = 5,
.eccpos = {6, 7, 8, 9, 10},
- .oobfree = {{0, 5}, {11, 5}, }
+ .oobfree = {{0, 5}, {12, 4}, }
};
-static struct nand_ecclayout nand_hw_eccoob_16 = {
- .eccbytes = 5,
- .eccpos = {6, 7, 8, 9, 10},
- .oobfree = {{0, 5}, {11, 5}, }
-};
-
-static struct nand_ecclayout nand_hw_eccoob_64 = {
+static struct nand_ecclayout nand_hw_eccoob_largepage = {
.eccbytes = 20,
.eccpos = {6, 7, 8, 9, 10, 22, 23, 24, 25, 26,
38, 39, 40, 41, 42, 54, 55, 56, 57, 58},
@@ -940,7 +934,7 @@ static int __init mxcnd_probe(struct platform_device *pdev)
} else {
this->ecc.size = 512;
this->ecc.bytes = 3;
- this->ecc.layout = &nand_hw_eccoob_8;
+ this->ecc.layout = &nand_hw_eccoob_smallpage;
this->ecc.mode = NAND_ECC_SOFT;
tmp = readw(host->regs + NFC_CONFIG1);
tmp &= ~NFC_ECC_EN;
@@ -964,7 +958,7 @@ static int __init mxcnd_probe(struct platform_device *pdev)
/* NAND bus width determines access funtions used by upper layer */
if (pdata->width == 2) {
this->options |= NAND_BUSWIDTH_16;
- this->ecc.layout = &nand_hw_eccoob_16;
+ this->ecc.layout = &nand_hw_eccoob_smallpage;
}
/* first scan to find the device and get the page size */
@@ -978,20 +972,20 @@ static int __init mxcnd_probe(struct platform_device *pdev)
if (this->ecc.mode == NAND_ECC_HW) {
switch (mtd->oobsize) {
case 8:
- this->ecc.layout = &nand_hw_eccoob_8;
+ this->ecc.layout = &nand_hw_eccoob_smallpage;
break;
case 16:
- this->ecc.layout = &nand_hw_eccoob_16;
+ this->ecc.layout = &nand_hw_eccoob_smallpage;
break;
case 64:
- this->ecc.layout = &nand_hw_eccoob_64;
+ this->ecc.layout = &nand_hw_eccoob_largepage;
break;
default:
/* page size not handled by HW ECC */
/* switching back to soft ECC */
this->ecc.size = 512;
this->ecc.bytes = 3;
- this->ecc.layout = &nand_hw_eccoob_8;
+ this->ecc.layout = &nand_hw_eccoob_smallpage;
this->ecc.mode = NAND_ECC_SOFT;
this->ecc.calculate = NULL;
this->ecc.correct = NULL;
--
1.6.5
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 03/19] mxc_nand: cleanup initialization
2009-10-21 14:13 ` [PATCH 02/19] mxc_nand: cleanup eccoob descriptions Sascha Hauer
@ 2009-10-21 14:13 ` Sascha Hauer
2009-10-21 14:13 ` [PATCH 04/19] mxc_nand: merge send_read_page and send_prog_page Sascha Hauer
0 siblings, 1 reply; 38+ messages in thread
From: Sascha Hauer @ 2009-10-21 14:13 UTC (permalink / raw)
To: linux-mtd
Cc: Sascha Hauer, Eric Benard, Vladimir Barinov, mathieu.berland, jbe,
sha
The oob layout was initialized several times. Instead, use
a smallpage layout by default and switch to a largepage
afterwards if necessary.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
drivers/mtd/nand/mxc_nand.c | 72 +++++++++++++-----------------------------
1 files changed, 22 insertions(+), 50 deletions(-)
diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c
index 7a34679..b28e5f9 100644
--- a/drivers/mtd/nand/mxc_nand.c
+++ b/drivers/mtd/nand/mxc_nand.c
@@ -921,45 +921,42 @@ static int __init mxcnd_probe(struct platform_device *pdev)
if (err)
goto eirq;
+ /* Reset NAND */
+ this->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
+
+ /* preset operation */
+ /* Unlock the internal RAM Buffer */
+ writew(0x2, host->regs + NFC_CONFIG);
+
+ /* Blocks to be unlocked */
+ writew(0x0, host->regs + NFC_UNLOCKSTART_BLKADDR);
+ writew(0x4000, host->regs + NFC_UNLOCKEND_BLKADDR);
+
+ /* Unlock Block Command for given address range */
+ writew(0x4, host->regs + NFC_WRPROT);
+
+ this->ecc.size = 512;
+ this->ecc.bytes = 3;
+ this->ecc.layout = &nand_hw_eccoob_smallpage;
+
if (pdata->hw_ecc) {
this->ecc.calculate = mxc_nand_calculate_ecc;
this->ecc.hwctl = mxc_nand_enable_hwecc;
this->ecc.correct = mxc_nand_correct_data;
this->ecc.mode = NAND_ECC_HW;
- this->ecc.size = 512;
- this->ecc.bytes = 3;
tmp = readw(host->regs + NFC_CONFIG1);
tmp |= NFC_ECC_EN;
writew(tmp, host->regs + NFC_CONFIG1);
} else {
- this->ecc.size = 512;
- this->ecc.bytes = 3;
- this->ecc.layout = &nand_hw_eccoob_smallpage;
this->ecc.mode = NAND_ECC_SOFT;
tmp = readw(host->regs + NFC_CONFIG1);
tmp &= ~NFC_ECC_EN;
writew(tmp, host->regs + NFC_CONFIG1);
}
- /* Reset NAND */
- this->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
-
- /* preset operation */
- /* Unlock the internal RAM Buffer */
- writew(0x2, host->regs + NFC_CONFIG);
-
- /* Blocks to be unlocked */
- writew(0x0, host->regs + NFC_UNLOCKSTART_BLKADDR);
- writew(0x4000, host->regs + NFC_UNLOCKEND_BLKADDR);
-
- /* Unlock Block Command for given address range */
- writew(0x4, host->regs + NFC_WRPROT);
-
/* NAND bus width determines access funtions used by upper layer */
- if (pdata->width == 2) {
+ if (pdata->width == 2)
this->options |= NAND_BUSWIDTH_16;
- this->ecc.layout = &nand_hw_eccoob_smallpage;
- }
/* first scan to find the device and get the page size */
if (nand_scan_ident(mtd, 1)) {
@@ -967,34 +964,9 @@ static int __init mxcnd_probe(struct platform_device *pdev)
goto escan;
}
- host->pagesize_2k = (mtd->writesize == 2048) ? 1 : 0;
-
- if (this->ecc.mode == NAND_ECC_HW) {
- switch (mtd->oobsize) {
- case 8:
- this->ecc.layout = &nand_hw_eccoob_smallpage;
- break;
- case 16:
- this->ecc.layout = &nand_hw_eccoob_smallpage;
- break;
- case 64:
- this->ecc.layout = &nand_hw_eccoob_largepage;
- break;
- default:
- /* page size not handled by HW ECC */
- /* switching back to soft ECC */
- this->ecc.size = 512;
- this->ecc.bytes = 3;
- this->ecc.layout = &nand_hw_eccoob_smallpage;
- this->ecc.mode = NAND_ECC_SOFT;
- this->ecc.calculate = NULL;
- this->ecc.correct = NULL;
- this->ecc.hwctl = NULL;
- tmp = readw(host->regs + NFC_CONFIG1);
- tmp &= ~NFC_ECC_EN;
- writew(tmp, host->regs + NFC_CONFIG1);
- break;
- }
+ if (mtd->writesize == 2048) {
+ host->pagesize_2k = 1;
+ this->ecc.layout = &nand_hw_eccoob_largepage;
}
/* second phase scan */
--
1.6.5
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 04/19] mxc_nand: merge send_read_page and send_prog_page
2009-10-21 14:13 ` [PATCH 03/19] mxc_nand: cleanup initialization Sascha Hauer
@ 2009-10-21 14:13 ` Sascha Hauer
2009-10-21 14:13 ` [PATCH 05/19] mxc_nand: introduce mxc_do_addr_cycle Sascha Hauer
0 siblings, 1 reply; 38+ messages in thread
From: Sascha Hauer @ 2009-10-21 14:13 UTC (permalink / raw)
To: linux-mtd
Cc: Sascha Hauer, Eric Benard, Vladimir Barinov, mathieu.berland, jbe,
sha
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
drivers/mtd/nand/mxc_nand.c | 54 ++++++++++--------------------------------
1 files changed, 13 insertions(+), 41 deletions(-)
diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c
index b28e5f9..56db5ac 100644
--- a/drivers/mtd/nand/mxc_nand.c
+++ b/drivers/mtd/nand/mxc_nand.c
@@ -226,12 +226,10 @@ static void send_addr(struct mxc_nand_host *host, uint16_t addr, int islast)
wait_op_done(host, TROP_US_DELAY, addr, islast);
}
-/* This function requests the NANDFC to initate the transfer
- * of data currently in the NANDFC RAM buffer to the NAND device. */
-static void send_prog_page(struct mxc_nand_host *host, uint8_t buf_id,
- int spare_only)
+static void send_page(struct mxc_nand_host *host, uint8_t buf_id,
+ int spare_only, unsigned int ops)
{
- DEBUG(MTD_DEBUG_LEVEL3, "send_prog_page (%d)\n", spare_only);
+ DEBUG(MTD_DEBUG_LEVEL3, "send_page (%d)\n", spare_only);
/* NANDFC buffer 0 is used for page read/write */
writew(buf_id, host->regs + NFC_BUF_ADDR);
@@ -246,33 +244,7 @@ static void send_prog_page(struct mxc_nand_host *host, uint8_t buf_id,
writew(config1, host->regs + NFC_CONFIG1);
}
- writew(NFC_INPUT, host->regs + NFC_CONFIG2);
-
- /* Wait for operation to complete */
- wait_op_done(host, TROP_US_DELAY, spare_only, true);
-}
-
-/* Requests NANDFC to initated the transfer of data from the
- * NAND device into in the NANDFC ram buffer. */
-static void send_read_page(struct mxc_nand_host *host, uint8_t buf_id,
- int spare_only)
-{
- DEBUG(MTD_DEBUG_LEVEL3, "send_read_page (%d)\n", spare_only);
-
- /* NANDFC buffer 0 is used for page read/write */
- writew(buf_id, host->regs + NFC_BUF_ADDR);
-
- /* Configure spare or page+spare access */
- if (!host->pagesize_2k) {
- uint32_t config1 = readw(host->regs + NFC_CONFIG1);
- if (spare_only)
- config1 |= NFC_SP_EN;
- else
- config1 &= ~NFC_SP_EN;
- writew(config1, host->regs + NFC_CONFIG1);
- }
-
- writew(NFC_OUTPUT, host->regs + NFC_CONFIG2);
+ writew(ops, host->regs + NFC_CONFIG2);
/* Wait for operation to complete */
wait_op_done(host, TROP_US_DELAY, spare_only, true);
@@ -756,13 +728,13 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command,
break;
case NAND_CMD_PAGEPROG:
- send_prog_page(host, 0, host->spare_only);
+ send_page(host, 0, host->spare_only, NFC_INPUT);
if (host->pagesize_2k) {
/* data in 4 areas datas */
- send_prog_page(host, 1, host->spare_only);
- send_prog_page(host, 2, host->spare_only);
- send_prog_page(host, 3, host->spare_only);
+ send_page(host, 1, host->spare_only, NFC_INPUT);
+ send_page(host, 2, host->spare_only, NFC_INPUT);
+ send_page(host, 3, host->spare_only, NFC_INPUT);
}
break;
@@ -827,12 +799,12 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command,
/* send read confirm command */
send_cmd(host, NAND_CMD_READSTART, true);
/* read for each AREA */
- send_read_page(host, 0, host->spare_only);
- send_read_page(host, 1, host->spare_only);
- send_read_page(host, 2, host->spare_only);
- send_read_page(host, 3, host->spare_only);
+ send_page(host, 0, host->spare_only, NFC_OUTPUT);
+ send_page(host, 1, host->spare_only, NFC_OUTPUT);
+ send_page(host, 2, host->spare_only, NFC_OUTPUT);
+ send_page(host, 3, host->spare_only, NFC_OUTPUT);
} else
- send_read_page(host, 0, host->spare_only);
+ send_page(host, 0, host->spare_only, NFC_OUTPUT);
break;
case NAND_CMD_READID:
--
1.6.5
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 05/19] mxc_nand: introduce mxc_do_addr_cycle
2009-10-21 14:13 ` [PATCH 04/19] mxc_nand: merge send_read_page and send_prog_page Sascha Hauer
@ 2009-10-21 14:13 ` Sascha Hauer
2009-10-21 14:13 ` [PATCH 06/19] mxc nand: remove debug param Sascha Hauer
0 siblings, 1 reply; 38+ messages in thread
From: Sascha Hauer @ 2009-10-21 14:13 UTC (permalink / raw)
To: linux-mtd
Cc: Sascha Hauer, Eric Benard, Vladimir Barinov, mathieu.berland, jbe,
sha
This factors the address cycle to a seperate function. This
becomes useful in a later patch where we can simplify the
command processing by making use of this function.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
drivers/mtd/nand/mxc_nand.c | 87 +++++++++++++++++++++++--------------------
1 files changed, 47 insertions(+), 40 deletions(-)
diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c
index 56db5ac..325c5be 100644
--- a/drivers/mtd/nand/mxc_nand.c
+++ b/drivers/mtd/nand/mxc_nand.c
@@ -658,6 +658,52 @@ static void mxc_nand_select_chip(struct mtd_info *mtd, int chip)
}
}
+static void mxc_do_addr_cycle(struct mtd_info *mtd, int column, int page_addr)
+{
+ struct nand_chip *nand_chip = mtd->priv;
+ struct mxc_nand_host *host = nand_chip->priv;
+
+ /* Write out column address, if necessary */
+ if (column != -1) {
+ /*
+ * MXC NANDFC can only perform full page+spare or
+ * spare-only read/write. When the upper layers
+ * layers perform a read/write buf operation,
+ * we will used the saved column adress to index into
+ * the full page.
+ */
+ send_addr(host, 0, page_addr == -1);
+ if (host->pagesize_2k)
+ /* another col addr cycle for 2k page */
+ send_addr(host, 0, false);
+ }
+
+ /* Write out page address, if necessary */
+ if (page_addr != -1) {
+ /* paddr_0 - p_addr_7 */
+ send_addr(host, (page_addr & 0xff), false);
+
+ if (host->pagesize_2k) {
+ if (mtd->size >= 0x10000000) {
+ /* paddr_8 - paddr_15 */
+ send_addr(host, (page_addr >> 8) & 0xff, false);
+ send_addr(host, (page_addr >> 16) & 0xff, true);
+ } else
+ /* paddr_8 - paddr_15 */
+ send_addr(host, (page_addr >> 8) & 0xff, true);
+ } else {
+ /* One more address cycle for higher density devices */
+ if (mtd->size >= 0x4000000) {
+ /* paddr_8 - paddr_15 */
+ send_addr(host, (page_addr >> 8) & 0xff, false);
+ send_addr(host, (page_addr >> 16) & 0xff, true);
+ } else
+ /* paddr_8 - paddr_15 */
+ send_addr(host, (page_addr >> 8) & 0xff, true);
+ }
+ }
+}
+
/* Used by the upper layer to write command to NAND Flash for
* different operations to be carried out on NAND Flash */
static void mxc_nand_command(struct mtd_info *mtd, unsigned command,
@@ -746,46 +792,7 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command,
/* Write out the command to the device. */
send_cmd(host, command, useirq);
-
- /* Write out column address, if necessary */
- if (column != -1) {
- /*
- * MXC NANDFC can only perform full page+spare or
- * spare-only read/write. When the upper layers
- * layers perform a read/write buf operation,
- * we will used the saved column adress to index into
- * the full page.
- */
- send_addr(host, 0, page_addr == -1);
- if (host->pagesize_2k)
- /* another col addr cycle for 2k page */
- send_addr(host, 0, false);
- }
-
- /* Write out page address, if necessary */
- if (page_addr != -1) {
- /* paddr_0 - p_addr_7 */
- send_addr(host, (page_addr & 0xff), false);
-
- if (host->pagesize_2k) {
- if (mtd->size >= 0x10000000) {
- /* paddr_8 - paddr_15 */
- send_addr(host, (page_addr >> 8) & 0xff, false);
- send_addr(host, (page_addr >> 16) & 0xff, true);
- } else
- /* paddr_8 - paddr_15 */
- send_addr(host, (page_addr >> 8) & 0xff, true);
- } else {
- /* One more address cycle for higher density devices */
- if (mtd->size >= 0x4000000) {
- /* paddr_8 - paddr_15 */
- send_addr(host, (page_addr >> 8) & 0xff, false);
- send_addr(host, (page_addr >> 16) & 0xff, true);
- } else
- /* paddr_8 - paddr_15 */
- send_addr(host, (page_addr >> 8) & 0xff, true);
- }
- }
+ mxc_do_addr_cycle(mtd, column, page_addr);
/* Command post-processing step */
switch (command) {
--
1.6.5
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 06/19] mxc nand: remove debug param
2009-10-21 14:13 ` [PATCH 05/19] mxc_nand: introduce mxc_do_addr_cycle Sascha Hauer
@ 2009-10-21 14:13 ` Sascha Hauer
2009-10-21 14:13 ` [PATCH 07/19] mxc nand: remove dead code Sascha Hauer
0 siblings, 1 reply; 38+ messages in thread
From: Sascha Hauer @ 2009-10-21 14:13 UTC (permalink / raw)
To: linux-mtd
Cc: Sascha Hauer, Eric Benard, Vladimir Barinov, mathieu.berland, jbe,
sha
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
drivers/mtd/nand/mxc_nand.c | 16 ++++++++--------
1 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c
index 325c5be..cd09196 100644
--- a/drivers/mtd/nand/mxc_nand.c
+++ b/drivers/mtd/nand/mxc_nand.c
@@ -165,7 +165,7 @@ static irqreturn_t mxc_nfc_irq(int irq, void *dev_id)
* complete by checking the INT bit of config2 register.
*/
static void wait_op_done(struct mxc_nand_host *host, int max_retries,
- uint16_t param, int useirq)
+ int useirq)
{
uint32_t tmp;
@@ -194,8 +194,8 @@ static void wait_op_done(struct mxc_nand_host *host, int max_retries,
udelay(1);
}
if (max_retries < 0)
- DEBUG(MTD_DEBUG_LEVEL0, "%s(%d): INT not set\n",
- __func__, param);
+ DEBUG(MTD_DEBUG_LEVEL0, "%s: INT not set\n",
+ __func__);
}
}
@@ -209,7 +209,7 @@ static void send_cmd(struct mxc_nand_host *host, uint16_t cmd, int useirq)
writew(NFC_CMD, host->regs + NFC_CONFIG2);
/* Wait for operation to complete */
- wait_op_done(host, TROP_US_DELAY, cmd, useirq);
+ wait_op_done(host, TROP_US_DELAY, useirq);
}
/* This function sends an address (or partial address) to the
@@ -223,7 +223,7 @@ static void send_addr(struct mxc_nand_host *host, uint16_t addr, int islast)
writew(NFC_ADDR, host->regs + NFC_CONFIG2);
/* Wait for operation to complete */
- wait_op_done(host, TROP_US_DELAY, addr, islast);
+ wait_op_done(host, TROP_US_DELAY, islast);
}
static void send_page(struct mxc_nand_host *host, uint8_t buf_id,
@@ -247,7 +247,7 @@ static void send_page(struct mxc_nand_host *host, uint8_t buf_id,
writew(ops, host->regs + NFC_CONFIG2);
/* Wait for operation to complete */
- wait_op_done(host, TROP_US_DELAY, spare_only, true);
+ wait_op_done(host, TROP_US_DELAY, true);
}
/* Request the NANDFC to perform a read of the NAND device ID. */
@@ -267,7 +267,7 @@ static void send_read_id(struct mxc_nand_host *host)
writew(NFC_ID, host->regs + NFC_CONFIG2);
/* Wait for operation to complete */
- wait_op_done(host, TROP_US_DELAY, 0, true);
+ wait_op_done(host, TROP_US_DELAY, true);
if (this->options & NAND_BUSWIDTH_16) {
void __iomem *main_buf = host->regs + MAIN_AREA0;
@@ -303,7 +303,7 @@ static uint16_t get_dev_status(struct mxc_nand_host *host)
writew(NFC_STATUS, host->regs + NFC_CONFIG2);
/* Wait for operation to complete */
- wait_op_done(host, TROP_US_DELAY, 0, true);
+ wait_op_done(host, TROP_US_DELAY, true);
/* Status is placed in first word of main buffer */
/* get status, then recovery area 1 data */
--
1.6.5
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 07/19] mxc nand: remove dead code
2009-10-21 14:13 ` [PATCH 06/19] mxc nand: remove debug param Sascha Hauer
@ 2009-10-21 14:13 ` Sascha Hauer
2009-10-21 14:13 ` [PATCH 08/19] mxc nand: use resource_size() Sascha Hauer
0 siblings, 1 reply; 38+ messages in thread
From: Sascha Hauer @ 2009-10-21 14:13 UTC (permalink / raw)
To: linux-mtd
Cc: Sascha Hauer, Eric Benard, Vladimir Barinov, mathieu.berland, jbe,
sha
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
drivers/mtd/nand/mxc_nand.c | 17 -----------------
1 files changed, 0 insertions(+), 17 deletions(-)
diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c
index cd09196..74c5dbc 100644
--- a/drivers/mtd/nand/mxc_nand.c
+++ b/drivers/mtd/nand/mxc_nand.c
@@ -620,23 +620,6 @@ static void mxc_nand_select_chip(struct mtd_info *mtd, int chip)
struct nand_chip *nand_chip = mtd->priv;
struct mxc_nand_host *host = nand_chip->priv;
-#ifdef CONFIG_MTD_NAND_MXC_FORCE_CE
- if (chip > 0) {
- DEBUG(MTD_DEBUG_LEVEL0,
- "ERROR: Illegal chip select (chip = %d)\n", chip);
- return;
- }
-
- if (chip == -1) {
- writew(readw(host->regs + NFC_CONFIG1) & ~NFC_CE,
- host->regs + NFC_CONFIG1);
- return;
- }
-
- writew(readw(host->regs + NFC_CONFIG1) | NFC_CE,
- host->regs + NFC_CONFIG1);
-#endif
-
switch (chip) {
case -1:
/* Disable the NFC clock */
--
1.6.5
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 08/19] mxc nand: use resource_size()
2009-10-21 14:13 ` [PATCH 07/19] mxc nand: remove dead code Sascha Hauer
@ 2009-10-21 14:13 ` Sascha Hauer
2009-10-21 14:13 ` [PATCH 09/19] mxc nand: use buffers Sascha Hauer
0 siblings, 1 reply; 38+ messages in thread
From: Sascha Hauer @ 2009-10-21 14:13 UTC (permalink / raw)
To: linux-mtd
Cc: Sascha Hauer, Eric Benard, Vladimir Barinov, mathieu.berland, jbe,
sha
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
drivers/mtd/nand/mxc_nand.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c
index 74c5dbc..127e0b7 100644
--- a/drivers/mtd/nand/mxc_nand.c
+++ b/drivers/mtd/nand/mxc_nand.c
@@ -865,7 +865,7 @@ static int __init mxcnd_probe(struct platform_device *pdev)
goto eres;
}
- host->regs = ioremap(res->start, res->end - res->start + 1);
+ host->regs = ioremap(res->start, resource_size(res));
if (!host->regs) {
err = -ENOMEM;
goto eres;
--
1.6.5
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 09/19] mxc nand: use buffers
2009-10-21 14:13 ` [PATCH 08/19] mxc nand: use resource_size() Sascha Hauer
@ 2009-10-21 14:13 ` Sascha Hauer
2009-10-21 14:13 ` [PATCH 10/19] mxc nand: simplify command processing Sascha Hauer
0 siblings, 1 reply; 38+ messages in thread
From: Sascha Hauer @ 2009-10-21 14:13 UTC (permalink / raw)
To: linux-mtd
Cc: Sascha Hauer, Eric Benard, Vladimir Barinov, mathieu.berland, jbe,
sha
The NAND controller has some limitations how to access the
internal buffers. It only allows 32 bit accesses. The driver
used to work around this by having special alignment aware
copy routines.
We now copy the whole page to a buffer in memory and let the
access functions use this buffer. This simplifies the driver.
A bonnie++ test showed that this has no negative performance
impact on the driver.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
drivers/mtd/nand/mxc_nand.c | 310 +++++++++++--------------------------------
1 files changed, 77 insertions(+), 233 deletions(-)
diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c
index 127e0b7..4c338ae 100644
--- a/drivers/mtd/nand/mxc_nand.c
+++ b/drivers/mtd/nand/mxc_nand.c
@@ -107,15 +107,17 @@ struct mxc_nand_host {
struct device *dev;
void __iomem *regs;
- int spare_only;
int status_request;
int pagesize_2k;
- uint16_t col_addr;
struct clk *clk;
int clk_act;
int irq;
wait_queue_head_t irq_waitq;
+
+ uint8_t *data_buf;
+ unsigned int buf_start;
+ int spare_len;
};
/* Define delays in microsec for NAND device operations */
@@ -227,23 +229,11 @@ static void send_addr(struct mxc_nand_host *host, uint16_t addr, int islast)
}
static void send_page(struct mxc_nand_host *host, uint8_t buf_id,
- int spare_only, unsigned int ops)
+ unsigned int ops)
{
- DEBUG(MTD_DEBUG_LEVEL3, "send_page (%d)\n", spare_only);
-
/* NANDFC buffer 0 is used for page read/write */
writew(buf_id, host->regs + NFC_BUF_ADDR);
- /* Configure spare or page+spare access */
- if (!host->pagesize_2k) {
- uint16_t config1 = readw(host->regs + NFC_CONFIG1);
- if (spare_only)
- config1 |= NFC_SP_EN;
- else
- config1 &= ~(NFC_SP_EN);
- writew(config1, host->regs + NFC_CONFIG1);
- }
-
writew(ops, host->regs + NFC_CONFIG2);
/* Wait for operation to complete */
@@ -278,6 +268,7 @@ static void send_read_id(struct mxc_nand_host *host)
writeb(readb(main_buf + 8), main_buf + 4);
writeb(readb(main_buf + 10), main_buf + 5);
}
+ memcpy(host->data_buf, host->regs + MAIN_AREA0, 16);
}
/* This function requests the NANDFC to perform a read of the
@@ -363,32 +354,14 @@ static u_char mxc_nand_read_byte(struct mtd_info *mtd)
{
struct nand_chip *nand_chip = mtd->priv;
struct mxc_nand_host *host = nand_chip->priv;
- uint8_t ret = 0;
- uint16_t col, rd_word;
- uint16_t __iomem *main_buf = host->regs + MAIN_AREA0;
- uint16_t __iomem *spare_buf = host->regs + SPARE_AREA0;
+ uint8_t ret;
/* Check for status request */
if (host->status_request)
return get_dev_status(host) & 0xFF;
- /* Get column for 16-bit access */
- col = host->col_addr >> 1;
-
- /* If we are accessing the spare region */
- if (host->spare_only)
- rd_word = readw(&spare_buf[col]);
- else
- rd_word = readw(&main_buf[col]);
-
- /* Pick upper/lower byte of word from RAM buffer */
- if (host->col_addr & 0x1)
- ret = (rd_word >> 8) & 0xFF;
- else
- ret = rd_word & 0xFF;
-
- /* Update saved column address */
- host->col_addr++;
+ ret = *(uint8_t *)(host->data_buf + host->buf_start);
+ host->buf_start++;
return ret;
}
@@ -397,33 +370,10 @@ static uint16_t mxc_nand_read_word(struct mtd_info *mtd)
{
struct nand_chip *nand_chip = mtd->priv;
struct mxc_nand_host *host = nand_chip->priv;
- uint16_t col, rd_word, ret;
- uint16_t __iomem *p;
+ uint16_t ret;
- DEBUG(MTD_DEBUG_LEVEL3,
- "mxc_nand_read_word(col = %d)\n", host->col_addr);
-
- col = host->col_addr;
- /* Adjust saved column address */
- if (col < mtd->writesize && host->spare_only)
- col += mtd->writesize;
-
- if (col < mtd->writesize)
- p = (host->regs + MAIN_AREA0) + (col >> 1);
- else
- p = (host->regs + SPARE_AREA0) + ((col - mtd->writesize) >> 1);
-
- if (col & 1) {
- rd_word = readw(p);
- ret = (rd_word >> 8) & 0xff;
- rd_word = readw(&p[1]);
- ret |= (rd_word << 8) & 0xff00;
-
- } else
- ret = readw(p);
-
- /* Update saved column address */
- host->col_addr = col + 2;
+ ret = *(uint16_t *)(host->data_buf + host->buf_start);
+ host->buf_start += 2;
return ret;
}
@@ -436,94 +386,14 @@ static void mxc_nand_write_buf(struct mtd_info *mtd,
{
struct nand_chip *nand_chip = mtd->priv;
struct mxc_nand_host *host = nand_chip->priv;
- int n, col, i = 0;
-
- DEBUG(MTD_DEBUG_LEVEL3,
- "mxc_nand_write_buf(col = %d, len = %d)\n", host->col_addr,
- len);
-
- col = host->col_addr;
-
- /* Adjust saved column address */
- if (col < mtd->writesize && host->spare_only)
- col += mtd->writesize;
-
- n = mtd->writesize + mtd->oobsize - col;
- n = min(len, n);
-
- DEBUG(MTD_DEBUG_LEVEL3,
- "%s:%d: col = %d, n = %d\n", __func__, __LINE__, col, n);
-
- while (n) {
- void __iomem *p;
-
- if (col < mtd->writesize)
- p = host->regs + MAIN_AREA0 + (col & ~3);
- else
- p = host->regs + SPARE_AREA0 -
- mtd->writesize + (col & ~3);
-
- DEBUG(MTD_DEBUG_LEVEL3, "%s:%d: p = %p\n", __func__,
- __LINE__, p);
-
- if (((col | (int)&buf[i]) & 3) || n < 16) {
- uint32_t data = 0;
-
- if (col & 3 || n < 4)
- data = readl(p);
-
- switch (col & 3) {
- case 0:
- if (n) {
- data = (data & 0xffffff00) |
- (buf[i++] << 0);
- n--;
- col++;
- }
- case 1:
- if (n) {
- data = (data & 0xffff00ff) |
- (buf[i++] << 8);
- n--;
- col++;
- }
- case 2:
- if (n) {
- data = (data & 0xff00ffff) |
- (buf[i++] << 16);
- n--;
- col++;
- }
- case 3:
- if (n) {
- data = (data & 0x00ffffff) |
- (buf[i++] << 24);
- n--;
- col++;
- }
- }
-
- writel(data, p);
- } else {
- int m = mtd->writesize - col;
+ u16 col = host->buf_start;
+ int n = mtd->oobsize + mtd->writesize - col;
- if (col >= mtd->writesize)
- m += mtd->oobsize;
+ n = min(n, len);
- m = min(n, m) & ~3;
+ memcpy(host->data_buf + col, buf, n);
- DEBUG(MTD_DEBUG_LEVEL3,
- "%s:%d: n = %d, m = %d, i = %d, col = %d\n",
- __func__, __LINE__, n, m, i, col);
-
- memcpy(p, &buf[i], m);
- col += m;
- i += m;
- n -= m;
- }
- }
- /* Update saved column address */
- host->col_addr = col;
+ host->buf_start += n;
}
/* Read the data buffer from the NAND Flash. To read the data from NAND
@@ -534,75 +404,14 @@ static void mxc_nand_read_buf(struct mtd_info *mtd, u_char *buf, int len)
{
struct nand_chip *nand_chip = mtd->priv;
struct mxc_nand_host *host = nand_chip->priv;
- int n, col, i = 0;
+ u16 col = host->buf_start;
+ int n = mtd->oobsize + mtd->writesize - col;
- DEBUG(MTD_DEBUG_LEVEL3,
- "mxc_nand_read_buf(col = %d, len = %d)\n", host->col_addr, len);
-
- col = host->col_addr;
-
- /* Adjust saved column address */
- if (col < mtd->writesize && host->spare_only)
- col += mtd->writesize;
-
- n = mtd->writesize + mtd->oobsize - col;
- n = min(len, n);
-
- while (n) {
- void __iomem *p;
-
- if (col < mtd->writesize)
- p = host->regs + MAIN_AREA0 + (col & ~3);
- else
- p = host->regs + SPARE_AREA0 -
- mtd->writesize + (col & ~3);
-
- if (((col | (int)&buf[i]) & 3) || n < 16) {
- uint32_t data;
-
- data = readl(p);
- switch (col & 3) {
- case 0:
- if (n) {
- buf[i++] = (uint8_t) (data);
- n--;
- col++;
- }
- case 1:
- if (n) {
- buf[i++] = (uint8_t) (data >> 8);
- n--;
- col++;
- }
- case 2:
- if (n) {
- buf[i++] = (uint8_t) (data >> 16);
- n--;
- col++;
- }
- case 3:
- if (n) {
- buf[i++] = (uint8_t) (data >> 24);
- n--;
- col++;
- }
- }
- } else {
- int m = mtd->writesize - col;
+ n = min(n, len);
- if (col >= mtd->writesize)
- m += mtd->oobsize;
-
- m = min(n, m) & ~3;
- memcpy(&buf[i], p, m);
- col += m;
- i += m;
- n -= m;
- }
- }
- /* Update saved column address */
- host->col_addr = col;
+ memcpy(buf, host->data_buf + col, len);
+ host->buf_start += len;
}
/* Used by the upper layer to verify the data in NAND Flash
@@ -641,6 +450,36 @@ static void mxc_nand_select_chip(struct mtd_info *mtd, int chip)
}
}
+/*
+ * Function to transfer data to/from spare area.
+ */
+static void copy_spare(struct mtd_info *mtd, bool bfrom)
+{
+ struct nand_chip *this = mtd->priv;
+ struct mxc_nand_host *host = this->priv;
+ u16 i, j;
+ u16 n = mtd->writesize >> 9;
+ u8 *d = host->data_buf + mtd->writesize;
+ u8 *s = host->regs + SPARE_AREA0;
+ u16 t = host->spare_len;
+
+ j = (mtd->oobsize / n >> 1) << 1;
+
+ if (bfrom) {
+ for (i = 0; i < n - 1; i++)
+ memcpy(d + i * j, s + i * t, j);
+
+ /* the last section */
+ memcpy(d + i * j, s + i * t, mtd->oobsize - i * j);
+ } else {
+ for (i = 0; i < n - 1; i++)
+ memcpy(&s[i * t], &d[i * j], j);
+
+ /* the last section */
+ memcpy(&s[i * t], &d[i * j], mtd->oobsize - i * j);
+ }
+}
+
static void mxc_do_addr_cycle(struct mtd_info *mtd, int column, int page_addr)
{
struct nand_chip *nand_chip = mtd->priv;
@@ -707,19 +546,18 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command,
switch (command) {
case NAND_CMD_STATUS:
- host->col_addr = 0;
+ host->buf_start = 0;
host->status_request = true;
break;
case NAND_CMD_READ0:
- host->col_addr = column;
- host->spare_only = false;
+ host->buf_start = column;
useirq = false;
break;
case NAND_CMD_READOOB:
- host->col_addr = column;
- host->spare_only = true;
+ host->buf_start = column + mtd->writesize;
+
useirq = false;
if (host->pagesize_2k)
command = NAND_CMD_READ0; /* only READ0 is valid */
@@ -739,15 +577,13 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command,
mxc_nand_command(mtd, NAND_CMD_READ0, 0,
page_addr);
- host->col_addr = column - mtd->writesize;
- host->spare_only = true;
+ host->buf_start = column;
/* Set program pointer to spare region */
if (!host->pagesize_2k)
send_cmd(host, NAND_CMD_READOOB, false);
} else {
- host->spare_only = false;
- host->col_addr = column;
+ host->buf_start = column;
/* Set program pointer to page start */
if (!host->pagesize_2k)
@@ -757,13 +593,15 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command,
break;
case NAND_CMD_PAGEPROG:
- send_page(host, 0, host->spare_only, NFC_INPUT);
+ memcpy(host->regs + MAIN_AREA0, host->data_buf, mtd->writesize);
+ copy_spare(mtd, false);
+ send_page(host, 0, NFC_INPUT);
if (host->pagesize_2k) {
/* data in 4 areas datas */
- send_page(host, 1, host->spare_only, NFC_INPUT);
- send_page(host, 2, host->spare_only, NFC_INPUT);
- send_page(host, 3, host->spare_only, NFC_INPUT);
+ send_page(host, 1, NFC_INPUT);
+ send_page(host, 2, NFC_INPUT);
+ send_page(host, 3, NFC_INPUT);
}
break;
@@ -789,16 +627,18 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command,
/* send read confirm command */
send_cmd(host, NAND_CMD_READSTART, true);
/* read for each AREA */
- send_page(host, 0, host->spare_only, NFC_OUTPUT);
- send_page(host, 1, host->spare_only, NFC_OUTPUT);
- send_page(host, 2, host->spare_only, NFC_OUTPUT);
- send_page(host, 3, host->spare_only, NFC_OUTPUT);
+ send_page(host, 0, NFC_OUTPUT);
+ send_page(host, 1, NFC_OUTPUT);
+ send_page(host, 2, NFC_OUTPUT);
+ send_page(host, 3, NFC_OUTPUT);
} else
- send_page(host, 0, host->spare_only, NFC_OUTPUT);
+ send_page(host, 0, NFC_OUTPUT);
+
+ memcpy(host->data_buf, host->regs + MAIN_AREA0, mtd->writesize);
+ copy_spare(mtd, true);
break;
case NAND_CMD_READID:
- host->col_addr = 0;
send_read_id(host);
break;
@@ -824,10 +664,14 @@ static int __init mxcnd_probe(struct platform_device *pdev)
int err = 0, nr_parts = 0;
/* Allocate memory for MTD device structure and private data */
- host = kzalloc(sizeof(struct mxc_nand_host), GFP_KERNEL);
+ host = kzalloc(sizeof(struct mxc_nand_host) + NAND_MAX_PAGESIZE +
+ NAND_MAX_OOBSIZE, GFP_KERNEL);
if (!host)
return -ENOMEM;
+ host->data_buf = (uint8_t *)(host + 1);
+ host->spare_len = 16;
+
host->dev = &pdev->dev;
/* structures must be linked */
this = &host->nand;
--
1.6.5
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 10/19] mxc nand: simplify command processing
2009-10-21 14:13 ` [PATCH 09/19] mxc nand: use buffers Sascha Hauer
@ 2009-10-21 14:13 ` Sascha Hauer
2009-10-21 14:13 ` [PATCH 11/19] mxc nand: modify send_page to send all pages, not only one Sascha Hauer
0 siblings, 1 reply; 38+ messages in thread
From: Sascha Hauer @ 2009-10-21 14:13 UTC (permalink / raw)
To: linux-mtd
Cc: Sascha Hauer, Eric Benard, Vladimir Barinov, mathieu.berland, jbe,
sha
Instead of having two switch/case with other operations
in between, use only one switch/case
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
drivers/mtd/nand/mxc_nand.c | 81 ++++++++++++++++++------------------------
1 files changed, 35 insertions(+), 46 deletions(-)
diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c
index 4c338ae..e5de71a 100644
--- a/drivers/mtd/nand/mxc_nand.c
+++ b/drivers/mtd/nand/mxc_nand.c
@@ -533,7 +533,6 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command,
{
struct nand_chip *nand_chip = mtd->priv;
struct mxc_nand_host *host = nand_chip->priv;
- int useirq = true;
DEBUG(MTD_DEBUG_LEVEL3,
"mxc_nand_command (cmd = 0x%x, col = 0x%x, page = 0x%x)\n",
@@ -548,19 +547,37 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command,
case NAND_CMD_STATUS:
host->buf_start = 0;
host->status_request = true;
- break;
- case NAND_CMD_READ0:
- host->buf_start = column;
- useirq = false;
+ send_cmd(host, command, true);
+ mxc_do_addr_cycle(mtd, column, page_addr);
break;
+ case NAND_CMD_READ0:
case NAND_CMD_READOOB:
- host->buf_start = column + mtd->writesize;
+ if (command == NAND_CMD_READ0)
+ host->buf_start = column;
+ else
+ host->buf_start = column + mtd->writesize;
- useirq = false;
if (host->pagesize_2k)
command = NAND_CMD_READ0; /* only READ0 is valid */
+
+ send_cmd(host, command, false);
+ mxc_do_addr_cycle(mtd, column, page_addr);
+
+ if (host->pagesize_2k) {
+ /* send read confirm command */
+ send_cmd(host, NAND_CMD_READSTART, true);
+ /* read for each AREA */
+ send_page(host, 0, NFC_OUTPUT);
+ send_page(host, 1, NFC_OUTPUT);
+ send_page(host, 2, NFC_OUTPUT);
+ send_page(host, 3, NFC_OUTPUT);
+ } else
+ send_page(host, 0, NFC_OUTPUT);
+
+ memcpy(host->data_buf, host->regs + MAIN_AREA0, mtd->writesize);
+ copy_spare(mtd, true);
break;
case NAND_CMD_SEQIN:
@@ -589,7 +606,9 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command,
if (!host->pagesize_2k)
send_cmd(host, NAND_CMD_READ0, false);
}
- useirq = false;
+
+ send_cmd(host, command, false);
+ mxc_do_addr_cycle(mtd, column, page_addr);
break;
case NAND_CMD_PAGEPROG:
@@ -604,51 +623,21 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command,
send_page(host, 3, NFC_INPUT);
}
- break;
-
- case NAND_CMD_ERASE1:
- useirq = false;
- break;
- }
-
- /* Write out the command to the device. */
- send_cmd(host, command, useirq);
- mxc_do_addr_cycle(mtd, column, page_addr);
-
- /* Command post-processing step */
- switch (command) {
-
- case NAND_CMD_RESET:
- break;
-
- case NAND_CMD_READOOB:
- case NAND_CMD_READ0:
- if (host->pagesize_2k) {
- /* send read confirm command */
- send_cmd(host, NAND_CMD_READSTART, true);
- /* read for each AREA */
- send_page(host, 0, NFC_OUTPUT);
- send_page(host, 1, NFC_OUTPUT);
- send_page(host, 2, NFC_OUTPUT);
- send_page(host, 3, NFC_OUTPUT);
- } else
- send_page(host, 0, NFC_OUTPUT);
-
- memcpy(host->data_buf, host->regs + MAIN_AREA0, mtd->writesize);
- copy_spare(mtd, true);
+ send_cmd(host, command, true);
+ mxc_do_addr_cycle(mtd, column, page_addr);
break;
case NAND_CMD_READID:
+ send_cmd(host, command, true);
+ mxc_do_addr_cycle(mtd, column, page_addr);
send_read_id(host);
break;
- case NAND_CMD_PAGEPROG:
- break;
-
- case NAND_CMD_STATUS:
- break;
-
+ case NAND_CMD_ERASE1:
case NAND_CMD_ERASE2:
+ send_cmd(host, command, false);
+ mxc_do_addr_cycle(mtd, column, page_addr);
+
break;
}
}
--
1.6.5
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 11/19] mxc nand: modify send_page to send all pages, not only one
2009-10-21 14:13 ` [PATCH 10/19] mxc nand: simplify command processing Sascha Hauer
@ 2009-10-21 14:13 ` Sascha Hauer
2009-10-21 14:13 ` [PATCH 12/19] mxc_nand: remove unused defines Sascha Hauer
0 siblings, 1 reply; 38+ messages in thread
From: Sascha Hauer @ 2009-10-21 14:13 UTC (permalink / raw)
To: linux-mtd
Cc: Sascha Hauer, Eric Benard, Vladimir Barinov, mathieu.berland, jbe,
sha
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
drivers/mtd/nand/mxc_nand.c | 45 +++++++++++++++++++-----------------------
1 files changed, 20 insertions(+), 25 deletions(-)
diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c
index e5de71a..04b2bf2 100644
--- a/drivers/mtd/nand/mxc_nand.c
+++ b/drivers/mtd/nand/mxc_nand.c
@@ -228,16 +228,25 @@ static void send_addr(struct mxc_nand_host *host, uint16_t addr, int islast)
wait_op_done(host, TROP_US_DELAY, islast);
}
-static void send_page(struct mxc_nand_host *host, uint8_t buf_id,
- unsigned int ops)
+static void send_page(struct mxc_nand_host *host, unsigned int ops)
{
- /* NANDFC buffer 0 is used for page read/write */
- writew(buf_id, host->regs + NFC_BUF_ADDR);
+ int bufs, i;
- writew(ops, host->regs + NFC_CONFIG2);
+ if (host->pagesize_2k)
+ bufs = 4;
+ else
+ bufs = 1;
- /* Wait for operation to complete */
- wait_op_done(host, TROP_US_DELAY, true);
+ for (i = 0; i < bufs; i++) {
+
+ /* NANDFC buffer 0 is used for page read/write */
+ writew(i, host->regs + NFC_BUF_ADDR);
+
+ writew(ops, host->regs + NFC_CONFIG2);
+
+ /* Wait for operation to complete */
+ wait_op_done(host, TROP_US_DELAY, true);
+ }
}
/* Request the NANDFC to perform a read of the NAND device ID. */
@@ -565,16 +574,10 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command,
send_cmd(host, command, false);
mxc_do_addr_cycle(mtd, column, page_addr);
- if (host->pagesize_2k) {
- /* send read confirm command */
+ if (host->pagesize_2k)
send_cmd(host, NAND_CMD_READSTART, true);
- /* read for each AREA */
- send_page(host, 0, NFC_OUTPUT);
- send_page(host, 1, NFC_OUTPUT);
- send_page(host, 2, NFC_OUTPUT);
- send_page(host, 3, NFC_OUTPUT);
- } else
- send_page(host, 0, NFC_OUTPUT);
+
+ send_page(host, NFC_OUTPUT);
memcpy(host->data_buf, host->regs + MAIN_AREA0, mtd->writesize);
copy_spare(mtd, true);
@@ -614,15 +617,7 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command,
case NAND_CMD_PAGEPROG:
memcpy(host->regs + MAIN_AREA0, host->data_buf, mtd->writesize);
copy_spare(mtd, false);
- send_page(host, 0, NFC_INPUT);
-
- if (host->pagesize_2k) {
- /* data in 4 areas datas */
- send_page(host, 1, NFC_INPUT);
- send_page(host, 2, NFC_INPUT);
- send_page(host, 3, NFC_INPUT);
- }
-
+ send_page(host, NFC_INPUT);
send_cmd(host, command, true);
mxc_do_addr_cycle(mtd, column, page_addr);
break;
--
1.6.5
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 12/19] mxc_nand: remove unused defines
2009-10-21 14:13 ` [PATCH 11/19] mxc nand: modify send_page to send all pages, not only one Sascha Hauer
@ 2009-10-21 14:13 ` Sascha Hauer
2009-10-21 14:13 ` [PATCH 13/19] mxc_nand: Make main/spare areas runtime configurable Sascha Hauer
0 siblings, 1 reply; 38+ messages in thread
From: Sascha Hauer @ 2009-10-21 14:13 UTC (permalink / raw)
To: linux-mtd
Cc: Sascha Hauer, Eric Benard, Vladimir Barinov, mathieu.berland, jbe,
sha
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
drivers/mtd/nand/mxc_nand.c | 7 -------
1 files changed, 0 insertions(+), 7 deletions(-)
diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c
index 04b2bf2..2988f1d 100644
--- a/drivers/mtd/nand/mxc_nand.c
+++ b/drivers/mtd/nand/mxc_nand.c
@@ -122,13 +122,6 @@ struct mxc_nand_host {
/* Define delays in microsec for NAND device operations */
#define TROP_US_DELAY 2000
-/* Macros to get byte and bit positions of ECC */
-#define COLPOS(x) ((x) >> 3)
-#define BITPOS(x) ((x) & 0xf)
-
-/* Define single bit Error positions in Main & Spare area */
-#define MAIN_SINGLEBIT_ERROR 0x4
-#define SPARE_SINGLEBIT_ERROR 0x1
/* OOB placement block for use with hardware ecc generation */
static struct nand_ecclayout nand_hw_eccoob_smallpage = {
--
1.6.5
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 13/19] mxc_nand: Make main/spare areas runtime configurable
2009-10-21 14:13 ` [PATCH 12/19] mxc_nand: remove unused defines Sascha Hauer
@ 2009-10-21 14:13 ` Sascha Hauer
2009-10-21 14:13 ` [PATCH 14/19] mxc_nand: Get rid of pagesize_2k flag Sascha Hauer
0 siblings, 1 reply; 38+ messages in thread
From: Sascha Hauer @ 2009-10-21 14:13 UTC (permalink / raw)
To: linux-mtd
Cc: Sascha Hauer, Eric Benard, Vladimir Barinov, mathieu.berland, jbe,
sha
The main/spare areas are on different addresses on later versions
of the controller, so make them configurable.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
drivers/mtd/nand/mxc_nand.c | 42 ++++++++++++++++++++----------------------
1 files changed, 20 insertions(+), 22 deletions(-)
diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c
index 2988f1d..450db4e 100644
--- a/drivers/mtd/nand/mxc_nand.c
+++ b/drivers/mtd/nand/mxc_nand.c
@@ -52,18 +52,6 @@
#define NFC_CONFIG1 0xE1A
#define NFC_CONFIG2 0xE1C
-/* Addresses for NFC RAM BUFFER Main area 0 */
-#define MAIN_AREA0 0x000
-#define MAIN_AREA1 0x200
-#define MAIN_AREA2 0x400
-#define MAIN_AREA3 0x600
-
-/* Addresses for NFC SPARE BUFFER Spare area 0 */
-#define SPARE_AREA0 0x800
-#define SPARE_AREA1 0x810
-#define SPARE_AREA2 0x820
-#define SPARE_AREA3 0x830
-
/* Set INT to 0, FCMD to 1, rest to 0 in NFC_CONFIG2 Register
* for Command operation */
#define NFC_CMD 0x1
@@ -106,6 +94,11 @@ struct mxc_nand_host {
struct mtd_partition *parts;
struct device *dev;
+ void *spare0;
+ void *main_area0;
+ void *main_area1;
+
+ void __iomem *base;
void __iomem *regs;
int status_request;
int pagesize_2k;
@@ -262,7 +255,7 @@ static void send_read_id(struct mxc_nand_host *host)
wait_op_done(host, TROP_US_DELAY, true);
if (this->options & NAND_BUSWIDTH_16) {
- void __iomem *main_buf = host->regs + MAIN_AREA0;
+ void __iomem *main_buf = host->main_area0;
/* compress the ID info */
writeb(readb(main_buf + 2), main_buf + 1);
writeb(readb(main_buf + 4), main_buf + 2);
@@ -270,14 +263,14 @@ static void send_read_id(struct mxc_nand_host *host)
writeb(readb(main_buf + 8), main_buf + 4);
writeb(readb(main_buf + 10), main_buf + 5);
}
- memcpy(host->data_buf, host->regs + MAIN_AREA0, 16);
+ memcpy(host->data_buf, host->main_area0, 16);
}
/* This function requests the NANDFC to perform a read of the
* NAND device status and returns the current status. */
static uint16_t get_dev_status(struct mxc_nand_host *host)
{
- void __iomem *main_buf = host->regs + MAIN_AREA1;
+ void __iomem *main_buf = host->main_area1;
uint32_t store;
uint16_t ret, tmp;
/* Issue status request to NAND device */
@@ -462,7 +455,7 @@ static void copy_spare(struct mtd_info *mtd, bool bfrom)
u16 i, j;
u16 n = mtd->writesize >> 9;
u8 *d = host->data_buf + mtd->writesize;
- u8 *s = host->regs + SPARE_AREA0;
+ u8 *s = host->spare0;
u16 t = host->spare_len;
j = (mtd->oobsize / n >> 1) << 1;
@@ -572,7 +565,7 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command,
send_page(host, NFC_OUTPUT);
- memcpy(host->data_buf, host->regs + MAIN_AREA0, mtd->writesize);
+ memcpy(host->data_buf, host->main_area0, mtd->writesize);
copy_spare(mtd, true);
break;
@@ -608,7 +601,7 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command,
break;
case NAND_CMD_PAGEPROG:
- memcpy(host->regs + MAIN_AREA0, host->data_buf, mtd->writesize);
+ memcpy(host->main_area0, host->data_buf, mtd->writesize);
copy_spare(mtd, false);
send_page(host, NFC_INPUT);
send_cmd(host, command, true);
@@ -686,12 +679,17 @@ static int __init mxcnd_probe(struct platform_device *pdev)
goto eres;
}
- host->regs = ioremap(res->start, resource_size(res));
- if (!host->regs) {
+ host->base = ioremap(res->start, resource_size(res));
+ if (!host->base) {
err = -ENOMEM;
goto eres;
}
+ host->regs = host->base;
+ host->main_area0 = host->base;
+ host->main_area1 = host->base + 0x200;
+ host->spare0 = host->base + 0x800;
+
tmp = readw(host->regs + NFC_CONFIG1);
tmp |= NFC_INT_MSK;
writew(tmp, host->regs + NFC_CONFIG1);
@@ -778,7 +776,7 @@ static int __init mxcnd_probe(struct platform_device *pdev)
escan:
free_irq(host->irq, host);
eirq:
- iounmap(host->regs);
+ iounmap(host->base);
eres:
clk_put(host->clk);
eclk:
@@ -797,7 +795,7 @@ static int __devexit mxcnd_remove(struct platform_device *pdev)
nand_release(&host->mtd);
free_irq(host->irq, host);
- iounmap(host->regs);
+ iounmap(host->base);
kfree(host);
return 0;
--
1.6.5
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 14/19] mxc_nand: Get rid of pagesize_2k flag
2009-10-21 14:13 ` [PATCH 13/19] mxc_nand: Make main/spare areas runtime configurable Sascha Hauer
@ 2009-10-21 14:13 ` Sascha Hauer
2009-10-21 14:13 ` [PATCH 15/19] mxc_nand: Add NFC V2 support Sascha Hauer
0 siblings, 1 reply; 38+ messages in thread
From: Sascha Hauer @ 2009-10-21 14:13 UTC (permalink / raw)
To: linux-mtd
Cc: Sascha Hauer, Eric Benard, Vladimir Barinov, mathieu.berland, jbe,
sha
Later versions of this controller also allow 4k pagesize,
so use mtd->writesize instead of a flag.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
drivers/mtd/nand/mxc_nand.c | 29 ++++++++++++++---------------
1 files changed, 14 insertions(+), 15 deletions(-)
diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c
index 450db4e..6525d0f 100644
--- a/drivers/mtd/nand/mxc_nand.c
+++ b/drivers/mtd/nand/mxc_nand.c
@@ -101,7 +101,6 @@ struct mxc_nand_host {
void __iomem *base;
void __iomem *regs;
int status_request;
- int pagesize_2k;
struct clk *clk;
int clk_act;
int irq;
@@ -214,11 +213,13 @@ static void send_addr(struct mxc_nand_host *host, uint16_t addr, int islast)
wait_op_done(host, TROP_US_DELAY, islast);
}
-static void send_page(struct mxc_nand_host *host, unsigned int ops)
+static void send_page(struct mtd_info *mtd, unsigned int ops)
{
+ struct nand_chip *nand_chip = mtd->priv;
+ struct mxc_nand_host *host = nand_chip->priv;
int bufs, i;
- if (host->pagesize_2k)
+ if (mtd->writesize > 512)
bufs = 4;
else
bufs = 1;
@@ -490,7 +491,7 @@ static void mxc_do_addr_cycle(struct mtd_info *mtd, int column, int page_addr)
* the full page.
*/
send_addr(host, 0, page_addr == -1);
- if (host->pagesize_2k)
+ if (mtd->writesize > 512)
/* another col addr cycle for 2k page */
send_addr(host, 0, false);
}
@@ -500,7 +501,7 @@ static void mxc_do_addr_cycle(struct mtd_info *mtd, int column, int page_addr)
/* paddr_0 - p_addr_7 */
send_addr(host, (page_addr & 0xff), false);
- if (host->pagesize_2k) {
+ if (mtd->writesize > 512) {
if (mtd->size >= 0x10000000) {
/* paddr_8 - paddr_15 */
send_addr(host, (page_addr >> 8) & 0xff, false);
@@ -554,16 +555,16 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command,
else
host->buf_start = column + mtd->writesize;
- if (host->pagesize_2k)
+ if (mtd->writesize > 512)
command = NAND_CMD_READ0; /* only READ0 is valid */
send_cmd(host, command, false);
mxc_do_addr_cycle(mtd, column, page_addr);
- if (host->pagesize_2k)
+ if (mtd->writesize > 512)
send_cmd(host, NAND_CMD_READSTART, true);
- send_page(host, NFC_OUTPUT);
+ send_page(mtd, NFC_OUTPUT);
memcpy(host->data_buf, host->main_area0, mtd->writesize);
copy_spare(mtd, true);
@@ -578,7 +579,7 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command,
* pointer to spare area, we must write the whole page
* including OOB together.
*/
- if (host->pagesize_2k)
+ if (mtd->writesize > 512)
/* call ourself to read a page */
mxc_nand_command(mtd, NAND_CMD_READ0, 0,
page_addr);
@@ -586,13 +587,13 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command,
host->buf_start = column;
/* Set program pointer to spare region */
- if (!host->pagesize_2k)
+ if (mtd->writesize == 512)
send_cmd(host, NAND_CMD_READOOB, false);
} else {
host->buf_start = column;
/* Set program pointer to page start */
- if (!host->pagesize_2k)
+ if (mtd->writesize == 512)
send_cmd(host, NAND_CMD_READ0, false);
}
@@ -603,7 +604,7 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command,
case NAND_CMD_PAGEPROG:
memcpy(host->main_area0, host->data_buf, mtd->writesize);
copy_spare(mtd, false);
- send_page(host, NFC_INPUT);
+ send_page(mtd, NFC_INPUT);
send_cmd(host, command, true);
mxc_do_addr_cycle(mtd, column, page_addr);
break;
@@ -745,10 +746,8 @@ static int __init mxcnd_probe(struct platform_device *pdev)
goto escan;
}
- if (mtd->writesize == 2048) {
- host->pagesize_2k = 1;
+ if (mtd->writesize == 2048)
this->ecc.layout = &nand_hw_eccoob_largepage;
- }
/* second phase scan */
if (nand_scan_tail(mtd)) {
--
1.6.5
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 15/19] mxc_nand: Add NFC V2 support
2009-10-21 14:13 ` [PATCH 14/19] mxc_nand: Get rid of pagesize_2k flag Sascha Hauer
@ 2009-10-21 14:13 ` Sascha Hauer
2009-10-21 14:13 ` [PATCH 16/19] mxc_nand: disable sp_en bit only once Sascha Hauer
0 siblings, 1 reply; 38+ messages in thread
From: Sascha Hauer @ 2009-10-21 14:13 UTC (permalink / raw)
To: linux-mtd
Cc: Sascha Hauer, Eric Benard, Vladimir Barinov, mathieu.berland, jbe,
sha
The v2 version of this controller is used on i.MX35/25 SoCs.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
drivers/mtd/nand/mxc_nand.c | 81 ++++++++++++++++++++++++++++++++++++-------
1 files changed, 68 insertions(+), 13 deletions(-)
diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c
index 6525d0f..f2297eb 100644
--- a/drivers/mtd/nand/mxc_nand.c
+++ b/drivers/mtd/nand/mxc_nand.c
@@ -33,9 +33,13 @@
#include <asm/mach/flash.h>
#include <mach/mxc_nand.h>
+#include <mach/hardware.h>
#define DRIVER_NAME "mxc_nand"
+#define nfc_is_v21() (cpu_is_mx25() || cpu_is_mx35())
+#define nfc_is_v1() (cpu_is_mx31() || cpu_is_mx27())
+
/* Addresses for NFC registers */
#define NFC_BUF_SIZE 0xE00
#define NFC_BUF_ADDR 0xE04
@@ -46,8 +50,10 @@
#define NFC_RSLTMAIN_AREA 0xE0E
#define NFC_RSLTSPARE_AREA 0xE10
#define NFC_WRPROT 0xE12
-#define NFC_UNLOCKSTART_BLKADDR 0xE14
-#define NFC_UNLOCKEND_BLKADDR 0xE16
+#define NFC_V1_UNLOCKSTART_BLKADDR 0xe14
+#define NFC_V1_UNLOCKEND_BLKADDR 0xe16
+#define NFC_V21_UNLOCKSTART_BLKADDR 0xe20
+#define NFC_V21_UNLOCKEND_BLKADDR 0xe22
#define NFC_NF_WRPRST 0xE18
#define NFC_CONFIG1 0xE1A
#define NFC_CONFIG2 0xE1C
@@ -116,19 +122,47 @@ struct mxc_nand_host {
#define TROP_US_DELAY 2000
/* OOB placement block for use with hardware ecc generation */
-static struct nand_ecclayout nand_hw_eccoob_smallpage = {
+static struct nand_ecclayout nandv1_hw_eccoob_smallpage = {
.eccbytes = 5,
.eccpos = {6, 7, 8, 9, 10},
.oobfree = {{0, 5}, {12, 4}, }
};
-static struct nand_ecclayout nand_hw_eccoob_largepage = {
+static struct nand_ecclayout nandv1_hw_eccoob_largepage = {
.eccbytes = 20,
.eccpos = {6, 7, 8, 9, 10, 22, 23, 24, 25, 26,
38, 39, 40, 41, 42, 54, 55, 56, 57, 58},
.oobfree = {{2, 4}, {11, 10}, {27, 10}, {43, 10}, {59, 5}, }
};
+/* OOB description for 512 byte pages with 16 byte OOB */
+static struct nand_ecclayout nandv2_hw_eccoob_smallpage = {
+ .eccbytes = 1 * 9,
+ .eccpos = {
+ 7, 8, 9, 10, 11, 12, 13, 14, 15
+ },
+ .oobfree = {
+ {.offset = 0, .length = 5}
+ }
+};
+
+/* OOB description for 2048 byte pages with 64 byte OOB */
+static struct nand_ecclayout nandv2_hw_eccoob_largepage = {
+ .eccbytes = 4 * 9,
+ .eccpos = {
+ 7, 8, 9, 10, 11, 12, 13, 14, 15,
+ 23, 24, 25, 26, 27, 28, 29, 30, 31,
+ 39, 40, 41, 42, 43, 44, 45, 46, 47,
+ 55, 56, 57, 58, 59, 60, 61, 62, 63
+ },
+ .oobfree = {
+ {.offset = 2, .length = 4},
+ {.offset = 16, .length = 7},
+ {.offset = 32, .length = 7},
+ {.offset = 48, .length = 7}
+ }
+};
+
#ifdef CONFIG_MTD_PARTITIONS
static const char *part_probes[] = { "RedBoot", "cmdlinepart", NULL };
#endif
@@ -219,7 +253,7 @@ static void send_page(struct mtd_info *mtd, unsigned int ops)
struct mxc_nand_host *host = nand_chip->priv;
int bufs, i;
- if (mtd->writesize > 512)
+ if (nfc_is_v1() && mtd->writesize > 512)
bufs = 4;
else
bufs = 1;
@@ -613,6 +647,7 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command,
send_cmd(host, command, true);
mxc_do_addr_cycle(mtd, column, page_addr);
send_read_id(host);
+ host->buf_start = column;
break;
case NAND_CMD_ERASE1:
@@ -633,6 +668,7 @@ static int __init mxcnd_probe(struct platform_device *pdev)
struct resource *res;
uint16_t tmp;
int err = 0, nr_parts = 0;
+ struct nand_ecclayout *oob_smallpage, *oob_largepage;
/* Allocate memory for MTD device structure and private data */
host = kzalloc(sizeof(struct mxc_nand_host) + NAND_MAX_PAGESIZE +
@@ -641,7 +677,6 @@ static int __init mxcnd_probe(struct platform_device *pdev)
return -ENOMEM;
host->data_buf = (uint8_t *)(host + 1);
- host->spare_len = 16;
host->dev = &pdev->dev;
/* structures must be linked */
@@ -686,10 +721,23 @@ static int __init mxcnd_probe(struct platform_device *pdev)
goto eres;
}
- host->regs = host->base;
host->main_area0 = host->base;
host->main_area1 = host->base + 0x200;
- host->spare0 = host->base + 0x800;
+
+ if (nfc_is_v21()) {
+ host->regs = host->base + 0x1000;
+ host->spare0 = host->base + 0x1000;
+ host->spare_len = 64;
+ oob_smallpage = &nandv2_hw_eccoob_smallpage;
+ oob_largepage = &nandv2_hw_eccoob_largepage;
+ } else if (nfc_is_v1()) {
+ host->regs = host->base;
+ host->spare0 = host->base + 0x800;
+ host->spare_len = 16;
+ oob_smallpage = &nandv1_hw_eccoob_smallpage;
+ oob_largepage = &nandv1_hw_eccoob_largepage;
+ } else
+ BUG();
tmp = readw(host->regs + NFC_CONFIG1);
tmp |= NFC_INT_MSK;
@@ -711,15 +759,22 @@ static int __init mxcnd_probe(struct platform_device *pdev)
writew(0x2, host->regs + NFC_CONFIG);
/* Blocks to be unlocked */
- writew(0x0, host->regs + NFC_UNLOCKSTART_BLKADDR);
- writew(0x4000, host->regs + NFC_UNLOCKEND_BLKADDR);
+ if (nfc_is_v21()) {
+ writew(0x0, host->regs + NFC_V21_UNLOCKSTART_BLKADDR);
+ writew(0xffff, host->regs + NFC_V21_UNLOCKEND_BLKADDR);
+ this->ecc.bytes = 9;
+ } else if (nfc_is_v1()) {
+ writew(0x0, host->regs + NFC_V1_UNLOCKSTART_BLKADDR);
+ writew(0x4000, host->regs + NFC_V1_UNLOCKEND_BLKADDR);
+ this->ecc.bytes = 3;
+ } else
+ BUG();
/* Unlock Block Command for given address range */
writew(0x4, host->regs + NFC_WRPROT);
this->ecc.size = 512;
- this->ecc.bytes = 3;
- this->ecc.layout = &nand_hw_eccoob_smallpage;
+ this->ecc.layout = oob_smallpage;
if (pdata->hw_ecc) {
this->ecc.calculate = mxc_nand_calculate_ecc;
@@ -747,7 +802,7 @@ static int __init mxcnd_probe(struct platform_device *pdev)
}
if (mtd->writesize == 2048)
- this->ecc.layout = &nand_hw_eccoob_largepage;
+ this->ecc.layout = oob_largepage;
/* second phase scan */
if (nand_scan_tail(mtd)) {
--
1.6.5
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 16/19] mxc_nand: disable sp_en bit only once
2009-10-21 14:13 ` [PATCH 15/19] mxc_nand: Add NFC V2 support Sascha Hauer
@ 2009-10-21 14:13 ` Sascha Hauer
2009-10-21 14:13 ` [PATCH 17/19] mxc_nand: Allow flash based bbt Sascha Hauer
0 siblings, 1 reply; 38+ messages in thread
From: Sascha Hauer @ 2009-10-21 14:13 UTC (permalink / raw)
To: linux-mtd
Cc: Sascha Hauer, Eric Benard, Vladimir Barinov, mathieu.berland, jbe,
sha
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
drivers/mtd/nand/mxc_nand.c | 15 +++------------
1 files changed, 3 insertions(+), 12 deletions(-)
diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c
index f2297eb..199a5f2 100644
--- a/drivers/mtd/nand/mxc_nand.c
+++ b/drivers/mtd/nand/mxc_nand.c
@@ -274,16 +274,10 @@ static void send_page(struct mtd_info *mtd, unsigned int ops)
static void send_read_id(struct mxc_nand_host *host)
{
struct nand_chip *this = &host->nand;
- uint16_t tmp;
/* NANDFC buffer 0 is used for device ID output */
writew(0x0, host->regs + NFC_BUF_ADDR);
- /* Read ID into main buffer */
- tmp = readw(host->regs + NFC_CONFIG1);
- tmp &= ~NFC_SP_EN;
- writew(tmp, host->regs + NFC_CONFIG1);
-
writew(NFC_ID, host->regs + NFC_CONFIG2);
/* Wait for operation to complete */
@@ -307,7 +301,7 @@ static uint16_t get_dev_status(struct mxc_nand_host *host)
{
void __iomem *main_buf = host->main_area1;
uint32_t store;
- uint16_t ret, tmp;
+ uint16_t ret;
/* Issue status request to NAND device */
/* store the main area1 first word, later do recovery */
@@ -316,11 +310,6 @@ static uint16_t get_dev_status(struct mxc_nand_host *host)
* corruption of read/write buffer on status requests. */
writew(1, host->regs + NFC_BUF_ADDR);
- /* Read status into main buffer */
- tmp = readw(host->regs + NFC_CONFIG1);
- tmp &= ~NFC_SP_EN;
- writew(tmp, host->regs + NFC_CONFIG1);
-
writew(NFC_STATUS, host->regs + NFC_CONFIG2);
/* Wait for operation to complete */
@@ -739,8 +728,10 @@ static int __init mxcnd_probe(struct platform_device *pdev)
} else
BUG();
+ /* disable interrupt and spare enable */
tmp = readw(host->regs + NFC_CONFIG1);
tmp |= NFC_INT_MSK;
+ tmp &= ~NFC_SP_EN;
writew(tmp, host->regs + NFC_CONFIG1);
init_waitqueue_head(&host->irq_waitq);
--
1.6.5
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 17/19] mxc_nand: Allow flash based bbt
2009-10-21 14:13 ` [PATCH 16/19] mxc_nand: disable sp_en bit only once Sascha Hauer
@ 2009-10-21 14:13 ` Sascha Hauer
2009-10-21 14:13 ` [PATCH 18/19] mxc_nand: remove TROP_US_DELAY Sascha Hauer
0 siblings, 1 reply; 38+ messages in thread
From: Sascha Hauer @ 2009-10-21 14:13 UTC (permalink / raw)
To: linux-mtd
Cc: Sascha Hauer, Eric Benard, Vladimir Barinov, mathieu.berland, jbe,
sha
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
arch/arm/plat-mxc/include/mach/mxc_nand.h | 3 +-
drivers/mtd/nand/mxc_nand.c | 34 +++++++++++++++++++++++++++++
2 files changed, 36 insertions(+), 1 deletions(-)
diff --git a/arch/arm/plat-mxc/include/mach/mxc_nand.h b/arch/arm/plat-mxc/include/mach/mxc_nand.h
index 2b972df..5d2d21d 100644
--- a/arch/arm/plat-mxc/include/mach/mxc_nand.h
+++ b/arch/arm/plat-mxc/include/mach/mxc_nand.h
@@ -22,6 +22,7 @@
struct mxc_nand_platform_data {
int width; /* data bus width in bytes */
- int hw_ecc; /* 0 if supress hardware ECC */
+ int hw_ecc:1; /* 0 if supress hardware ECC */
+ int flash_bbt:1; /* set to 1 to use a flash based bbt */
};
#endif /* __ASM_ARCH_NAND_H */
diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c
index 199a5f2..3fdc172 100644
--- a/drivers/mtd/nand/mxc_nand.c
+++ b/drivers/mtd/nand/mxc_nand.c
@@ -648,6 +648,33 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command,
}
}
+/*
+ * The generic flash bbt decriptors overlap with our ecc
+ * hardware, so define some i.MX specific ones.
+ */
+static uint8_t bbt_pattern[] = { 'B', 'b', 't', '0' };
+static uint8_t mirror_pattern[] = { '1', 't', 'b', 'B' };
+
+static struct nand_bbt_descr bbt_main_descr = {
+ .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE
+ | NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP,
+ .offs = 0,
+ .len = 4,
+ .veroffs = 4,
+ .maxblocks = 4,
+ .pattern = bbt_pattern,
+};
+
+static struct nand_bbt_descr bbt_mirror_descr = {
+ .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE
+ | NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP,
+ .offs = 0,
+ .len = 4,
+ .veroffs = 4,
+ .maxblocks = 4,
+ .pattern = mirror_pattern,
+};
+
static int __init mxcnd_probe(struct platform_device *pdev)
{
struct nand_chip *this;
@@ -786,6 +813,13 @@ static int __init mxcnd_probe(struct platform_device *pdev)
if (pdata->width == 2)
this->options |= NAND_BUSWIDTH_16;
+ if (pdata->flash_bbt) {
+ this->bbt_td = &bbt_main_descr;
+ this->bbt_md = &bbt_mirror_descr;
+ /* update flash based bbt */
+ this->options |= NAND_USE_FLASH_BBT;
+ }
+
/* first scan to find the device and get the page size */
if (nand_scan_ident(mtd, 1)) {
err = -ENXIO;
--
1.6.5
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 18/19] mxc_nand: remove TROP_US_DELAY
2009-10-21 14:13 ` [PATCH 17/19] mxc_nand: Allow flash based bbt Sascha Hauer
@ 2009-10-21 14:13 ` Sascha Hauer
2009-10-21 14:13 ` [PATCH 19/19] mxc_nand: use DRIVER_NAME where appropriate Sascha Hauer
0 siblings, 1 reply; 38+ messages in thread
From: Sascha Hauer @ 2009-10-21 14:13 UTC (permalink / raw)
To: linux-mtd
Cc: Sascha Hauer, Eric Benard, Vladimir Barinov, mathieu.berland, jbe,
sha
wait_op_done is only called with the same timeout, so
code the timeout into the function itself.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
drivers/mtd/nand/mxc_nand.c | 17 +++++++----------
1 files changed, 7 insertions(+), 10 deletions(-)
diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c
index 3fdc172..dd80e88 100644
--- a/drivers/mtd/nand/mxc_nand.c
+++ b/drivers/mtd/nand/mxc_nand.c
@@ -118,9 +118,6 @@ struct mxc_nand_host {
int spare_len;
};
-/* Define delays in microsec for NAND device operations */
-#define TROP_US_DELAY 2000
-
/* OOB placement block for use with hardware ecc generation */
static struct nand_ecclayout nandv1_hw_eccoob_smallpage = {
.eccbytes = 5,
@@ -185,10 +182,10 @@ static irqreturn_t mxc_nfc_irq(int irq, void *dev_id)
/* This function polls the NANDFC to wait for the basic operation to
* complete by checking the INT bit of config2 register.
*/
-static void wait_op_done(struct mxc_nand_host *host, int max_retries,
- int useirq)
+static void wait_op_done(struct mxc_nand_host *host, int useirq)
{
uint32_t tmp;
+ int max_retries = 2000;
if (useirq) {
if ((readw(host->regs + NFC_CONFIG2) & NFC_INT) == 0) {
@@ -230,7 +227,7 @@ static void send_cmd(struct mxc_nand_host *host, uint16_t cmd, int useirq)
writew(NFC_CMD, host->regs + NFC_CONFIG2);
/* Wait for operation to complete */
- wait_op_done(host, TROP_US_DELAY, useirq);
+ wait_op_done(host, useirq);
}
/* This function sends an address (or partial address) to the
@@ -244,7 +241,7 @@ static void send_addr(struct mxc_nand_host *host, uint16_t addr, int islast)
writew(NFC_ADDR, host->regs + NFC_CONFIG2);
/* Wait for operation to complete */
- wait_op_done(host, TROP_US_DELAY, islast);
+ wait_op_done(host, islast);
}
static void send_page(struct mtd_info *mtd, unsigned int ops)
@@ -266,7 +263,7 @@ static void send_page(struct mtd_info *mtd, unsigned int ops)
writew(ops, host->regs + NFC_CONFIG2);
/* Wait for operation to complete */
- wait_op_done(host, TROP_US_DELAY, true);
+ wait_op_done(host, true);
}
}
@@ -281,7 +278,7 @@ static void send_read_id(struct mxc_nand_host *host)
writew(NFC_ID, host->regs + NFC_CONFIG2);
/* Wait for operation to complete */
- wait_op_done(host, TROP_US_DELAY, true);
+ wait_op_done(host, true);
if (this->options & NAND_BUSWIDTH_16) {
void __iomem *main_buf = host->main_area0;
@@ -313,7 +310,7 @@ static uint16_t get_dev_status(struct mxc_nand_host *host)
writew(NFC_STATUS, host->regs + NFC_CONFIG2);
/* Wait for operation to complete */
- wait_op_done(host, TROP_US_DELAY, true);
+ wait_op_done(host, true);
/* Status is placed in first word of main buffer */
/* get status, then recovery area 1 data */
--
1.6.5
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 19/19] mxc_nand: use DRIVER_NAME where appropriate
2009-10-21 14:13 ` [PATCH 18/19] mxc_nand: remove TROP_US_DELAY Sascha Hauer
@ 2009-10-21 14:13 ` Sascha Hauer
0 siblings, 0 replies; 38+ messages in thread
From: Sascha Hauer @ 2009-10-21 14:13 UTC (permalink / raw)
To: linux-mtd
Cc: Sascha Hauer, Eric Benard, Vladimir Barinov, mathieu.berland, jbe,
sha
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
drivers/mtd/nand/mxc_nand.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c
index dd80e88..d5445cd 100644
--- a/drivers/mtd/nand/mxc_nand.c
+++ b/drivers/mtd/nand/mxc_nand.c
@@ -698,7 +698,7 @@ static int __init mxcnd_probe(struct platform_device *pdev)
mtd->priv = this;
mtd->owner = THIS_MODULE;
mtd->dev.parent = &pdev->dev;
- mtd->name = "mxc_nand";
+ mtd->name = DRIVER_NAME;
/* 50 us command delay time */
this->chip_delay = 5;
@@ -762,7 +762,7 @@ static int __init mxcnd_probe(struct platform_device *pdev)
host->irq = platform_get_irq(pdev, 0);
- err = request_irq(host->irq, mxc_nfc_irq, 0, "mxc_nd", host);
+ err = request_irq(host->irq, mxc_nfc_irq, 0, DRIVER_NAME, host);
if (err)
goto eirq;
--
1.6.5
^ permalink raw reply related [flat|nested] 38+ messages in thread
* Re: [RFC] mxc nand controller updates
2009-10-21 14:13 [RFC] mxc nand controller updates Sascha Hauer
2009-10-21 14:13 ` [PATCH 01/19] Revert "mtd: mxc_nand: fix 2KiB pagesize NAND on i.MX27" Sascha Hauer
@ 2009-10-31 18:38 ` alfred steele
2009-10-31 20:11 ` Robert Schwebel
2009-11-11 7:49 ` Artem Bityutskiy
2 siblings, 1 reply; 38+ messages in thread
From: alfred steele @ 2009-10-31 18:38 UTC (permalink / raw)
To: Sascha Hauer
Cc: Eric Benard, Vladimir Barinov, mathieu.berland, jbe, linux-mtd,
sha
Hi Sascha,
> Here are several patches for the mxc nand controller. At the end
> of this series we are able to use this driver with the i.MX25/35
> SoCs. Please review and test if you do not want to see your boards
> break ;)
Are these changes ported to u-boot yet.
Would this be able to support 4k page size NAND flash. I took the
latest snapshot from the U-boot GIT and trying to boot out of a 4K
NAND on this but haven't been succesful as of now.
I believe we used have a separate mxc_nand_load.S assembly code in
earlier u-boot v2.0 which would load the first 4k from the NAND to the
NFC SRAM and then the rest of the uboot is loaded after SDRAM /DDR is
initialized. But with the lates code you have in uboot GIT, looks like
all this is done in C after a minimal stack is setup.
Please help me understand this better.
-Alfred.
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [RFC] mxc nand controller updates
2009-10-31 18:38 ` [RFC] mxc nand controller updates alfred steele
@ 2009-10-31 20:11 ` Robert Schwebel
2009-10-31 23:08 ` alfred steele
0 siblings, 1 reply; 38+ messages in thread
From: Robert Schwebel @ 2009-10-31 20:11 UTC (permalink / raw)
To: alfred steele
Cc: Sascha Hauer, Eric Benard, Vladimir Barinov, mathieu.berland, jbe,
linux-mtd, sha
On Sat, Oct 31, 2009 at 01:38:39PM -0500, alfred steele wrote:
> Are these changes ported to u-boot yet.
> Would this be able to support 4k page size NAND flash. I took the
> latest snapshot from the U-boot GIT and trying to boot out of a 4K
> NAND on this but haven't been succesful as of now.
> I believe we used have a separate mxc_nand_load.S assembly code in
> earlier u-boot v2.0 which would load the first 4k from the NAND to the
> NFC SRAM and then the rest of the uboot is loaded after SDRAM /DDR is
> initialized. But with the lates code you have in uboot GIT, looks like
> all this is done in C after a minimal stack is setup.
Did you try the latest u-boot-v2 snapshots?
rsc
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [RFC] mxc nand controller updates
2009-10-31 20:11 ` Robert Schwebel
@ 2009-10-31 23:08 ` alfred steele
0 siblings, 0 replies; 38+ messages in thread
From: alfred steele @ 2009-10-31 23:08 UTC (permalink / raw)
To: Robert Schwebel
Cc: Sascha Hauer, Eric Benard, Vladimir Barinov, mathieu.berland, jbe,
linux-mtd, sha
> Did you try the latest u-boot-v2 snapshots?
Yes i did after Sascha posted the patches . HAve you tried a 4k NAND
flash with it yet. I am confident it works on a 2K page size though.
Thanks,
Alfred
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [RFC] mxc nand controller updates
2009-10-21 14:13 [RFC] mxc nand controller updates Sascha Hauer
2009-10-21 14:13 ` [PATCH 01/19] Revert "mtd: mxc_nand: fix 2KiB pagesize NAND on i.MX27" Sascha Hauer
2009-10-31 18:38 ` [RFC] mxc nand controller updates alfred steele
@ 2009-11-11 7:49 ` Artem Bityutskiy
2009-11-12 7:36 ` Sascha Hauer
2 siblings, 1 reply; 38+ messages in thread
From: Artem Bityutskiy @ 2009-11-11 7:49 UTC (permalink / raw)
To: Sascha Hauer
Cc: Eric Benard, Vladimir Barinov, mathieu.berland, jbe, linux-mtd,
sha
On Wed, 2009-10-21 at 16:13 +0200, Sascha Hauer wrote:
> Hi all,
>
> Here are several patches for the mxc nand controller. At the end
> of this series we are able to use this driver with the i.MX25/35
> SoCs. Please review and test if you do not want to see your boards
> break ;)
Just tried to pull your tree, but could not - there were confilicts.
Could you please provide a branch/patches against the mtd-2.6 tree?
--
Best Regards,
Artem Bityutskiy (Артём Битюцкий)
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [RFC] mxc nand controller updates
2009-11-11 7:49 ` Artem Bityutskiy
@ 2009-11-12 7:36 ` Sascha Hauer
2009-11-13 8:32 ` Artem Bityutskiy
0 siblings, 1 reply; 38+ messages in thread
From: Sascha Hauer @ 2009-11-12 7:36 UTC (permalink / raw)
To: Artem Bityutskiy
Cc: Vladimir Barinov, mathieu.berland, jbe, linux-mtd, Eric Benard
Hi Artem,
On Wed, Nov 11, 2009 at 09:49:52AM +0200, Artem Bityutskiy wrote:
> On Wed, 2009-10-21 at 16:13 +0200, Sascha Hauer wrote:
> > Hi all,
> >
> > Here are several patches for the mxc nand controller. At the end
> > of this series we are able to use this driver with the i.MX25/35
> > SoCs. Please review and test if you do not want to see your boards
> > break ;)
>
> Just tried to pull your tree, but could not - there were confilicts.
> Could you please provide a branch/patches against the mtd-2.6 tree?
I updated the tree, the branch is still the same.
Thanks
Sascha
The following changes since commit
8ce110ac19bc88b82e3feacfbb3a2ee08a07fe22:
H Hartley Sweeten (1):
mtd: Fix compile failure and error path in physmap.c
are available in the git repository at:
git://git.pengutronix.de/git/imx/linux-2.6.git mxc-nand
Sascha Hauer (18):
mxc_nand: cleanup eccoob descriptions
mxc_nand: cleanup initialization
mxc_nand: merge send_read_page and send_prog_page
mxc_nand: introduce mxc_do_addr_cycle
mxc nand: remove debug param
mxc nand: remove dead code
mxc nand: use resource_size()
mxc nand: use buffers
mxc nand: simplify command processing
mxc nand: modify send_page to send all pages, not only one
mxc_nand: remove unused defines
mxc_nand: Make main/spare areas runtime configurable
mxc_nand: Get rid of pagesize_2k flag
mxc_nand: Add NFC V2 support
mxc_nand: disable sp_en bit only once
mxc_nand: Allow flash based bbt
mxc_nand: remove TROP_US_DELAY
mxc_nand: use DRIVER_NAME where appropriate
arch/arm/plat-mxc/include/mach/mxc_nand.h | 3 +-
drivers/mtd/nand/mxc_nand.c | 773 +++++++++++------------------
2 files changed, 300 insertions(+), 476 deletions(-)
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [RFC] mxc nand controller updates
2009-11-12 7:36 ` Sascha Hauer
@ 2009-11-13 8:32 ` Artem Bityutskiy
2009-11-30 11:20 ` David Woodhouse
0 siblings, 1 reply; 38+ messages in thread
From: Artem Bityutskiy @ 2009-11-13 8:32 UTC (permalink / raw)
To: Sascha Hauer
Cc: Vladimir Barinov, mathieu.berland, jbe, linux-mtd, Eric Benard
On Thu, 2009-11-12 at 08:36 +0100, Sascha Hauer wrote:
> Hi Artem,
>
> On Wed, Nov 11, 2009 at 09:49:52AM +0200, Artem Bityutskiy wrote:
> > On Wed, 2009-10-21 at 16:13 +0200, Sascha Hauer wrote:
> > > Hi all,
> > >
> > > Here are several patches for the mxc nand controller. At the end
> > > of this series we are able to use this driver with the i.MX25/35
> > > SoCs. Please review and test if you do not want to see your boards
> > > break ;)
> >
> > Just tried to pull your tree, but could not - there were confilicts.
> > Could you please provide a branch/patches against the mtd-2.6 tree?
>
> I updated the tree, the branch is still the same.
>
> Thanks
> Sascha
I've pulled your stuff to my l2-mtd-2.6 tree to the dunno branch, so
there are less chances your pull request will be missed.
--
Best Regards,
Artem Bityutskiy (Артём Битюцкий)
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [RFC] mxc nand controller updates
2009-11-13 8:32 ` Artem Bityutskiy
@ 2009-11-30 11:20 ` David Woodhouse
2009-11-30 11:41 ` Artem Bityutskiy
2009-11-30 12:29 ` Sascha Hauer
0 siblings, 2 replies; 38+ messages in thread
From: David Woodhouse @ 2009-11-30 11:20 UTC (permalink / raw)
To: dedekind1
Cc: Sascha Hauer, Eric Benard, Vladimir Barinov, mathieu.berland, jbe,
linux-mtd
On Fri, 2009-11-13 at 10:32 +0200, Artem Bityutskiy wrote:
>
> I've pulled your stuff to my l2-mtd-2.6 tree to the dunno branch, so
> there are less chances your pull request will be missed.
Was there a pull request? I only see the [RFC].
Please could you fix up the commit message for the reversion. It should
contain the subject of the original commit as well as its commit-id, and
it should say _why_.
--
David Woodhouse Open Source Technology Centre
David.Woodhouse@intel.com Intel Corporation
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [RFC] mxc nand controller updates
2009-11-30 11:20 ` David Woodhouse
@ 2009-11-30 11:41 ` Artem Bityutskiy
2009-11-30 12:29 ` Sascha Hauer
1 sibling, 0 replies; 38+ messages in thread
From: Artem Bityutskiy @ 2009-11-30 11:41 UTC (permalink / raw)
To: David Woodhouse
Cc: Sascha Hauer, Eric Benard, Vladimir Barinov, mathieu.berland, jbe,
linux-mtd
On Mon, 2009-11-30 at 11:20 +0000, David Woodhouse wrote:
> On Fri, 2009-11-13 at 10:32 +0200, Artem Bityutskiy wrote:
> >
> > I've pulled your stuff to my l2-mtd-2.6 tree to the dunno branch, so
> > there are less chances your pull request will be missed.
>
> Was there a pull request? I only see the [RFC].
Right, only RFC.
> Please could you fix up the commit message for the reversion. It should
> contain the subject of the original commit as well as its commit-id, and
> it should say _why_.
Yeah.
--
Best Regards,
Artem Bityutskiy (Артём Битюцкий)
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [RFC] mxc nand controller updates
2009-11-30 11:20 ` David Woodhouse
2009-11-30 11:41 ` Artem Bityutskiy
@ 2009-11-30 12:29 ` Sascha Hauer
2009-12-05 10:43 ` Eric Bénard
1 sibling, 1 reply; 38+ messages in thread
From: Sascha Hauer @ 2009-11-30 12:29 UTC (permalink / raw)
To: David Woodhouse
Cc: dedekind1, Eric Benard, Vladimir Barinov, mathieu.berland, jbe,
linux-mtd
On Mon, Nov 30, 2009 at 11:20:31AM +0000, David Woodhouse wrote:
> On Fri, 2009-11-13 at 10:32 +0200, Artem Bityutskiy wrote:
> >
> > I've pulled your stuff to my l2-mtd-2.6 tree to the dunno branch, so
> > there are less chances your pull request will be missed.
>
> Was there a pull request? I only see the [RFC].
I should have sent a pull request afterwards, sorry.
>
> Please could you fix up the commit message for the reversion. It should
> contain the subject of the original commit as well as its commit-id, and
> it should say _why_.
This revert is already in the mtd master tree as
1cc523999e0acd0c21f83bf89b7a44b4ab6f7bd8 along with a correct commit
message, so this patch got dropped when I rebased my tree onto mtd
master.
So please pull from the following address if you haven't done already
from Artems branch.
Sascha
The following changes since commit
8ce110ac19bc88b82e3feacfbb3a2ee08a07fe22:
H Hartley Sweeten (1):
mtd: Fix compile failure and error path in physmap.c
are available in the git repository at:
git://git.pengutronix.de/git/imx/linux-2.6.git mxc-nand
Sascha Hauer (18):
mxc_nand: cleanup eccoob descriptions
mxc_nand: cleanup initialization
mxc_nand: merge send_read_page and send_prog_page
mxc_nand: introduce mxc_do_addr_cycle
mxc nand: remove debug param
mxc nand: remove dead code
mxc nand: use resource_size()
mxc nand: use buffers
mxc nand: simplify command processing
mxc nand: modify send_page to send all pages, not only one
mxc_nand: remove unused defines
mxc_nand: Make main/spare areas runtime configurable
mxc_nand: Get rid of pagesize_2k flag
mxc_nand: Add NFC V2 support
mxc_nand: disable sp_en bit only once
mxc_nand: Allow flash based bbt
mxc_nand: remove TROP_US_DELAY
mxc_nand: use DRIVER_NAME where appropriate
arch/arm/plat-mxc/include/mach/mxc_nand.h | 3 +-
drivers/mtd/nand/mxc_nand.c | 773 +++++++++++------------------
2 files changed, 300 insertions(+), 476 deletions(-)
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [RFC] mxc nand controller updates
2009-11-30 12:29 ` Sascha Hauer
@ 2009-12-05 10:43 ` Eric Bénard
2009-12-07 22:02 ` [PATCH] mxc_nand : add RESET command support Eric Bénard
2009-12-08 12:07 ` [RFC] mxc nand controller updates Artem Bityutskiy
0 siblings, 2 replies; 38+ messages in thread
From: Eric Bénard @ 2009-12-05 10:43 UTC (permalink / raw)
To: Sascha Hauer; +Cc: mathieu.berland, linux-mtd
Hi Sascha,
Sascha Hauer a écrit :
> git://git.pengutronix.de/git/imx/linux-2.6.git mxc-nand
>
> Sascha Hauer (18):
> mxc_nand: cleanup eccoob descriptions
> mxc_nand: cleanup initialization
> mxc_nand: merge send_read_page and send_prog_page
> mxc_nand: introduce mxc_do_addr_cycle
> mxc nand: remove debug param
> mxc nand: remove dead code
> mxc nand: use resource_size()
> mxc nand: use buffers
> mxc nand: simplify command processing
> mxc nand: modify send_page to send all pages, not only one
> mxc_nand: remove unused defines
> mxc_nand: Make main/spare areas runtime configurable
> mxc_nand: Get rid of pagesize_2k flag
> mxc_nand: Add NFC V2 support
> mxc_nand: disable sp_en bit only once
> mxc_nand: Allow flash based bbt
> mxc_nand: remove TROP_US_DELAY
> mxc_nand: use DRIVER_NAME where appropriate
>
Tested-by: Eric Benard <eric@eukrea.com>
it's a bit late but I can confirm this works fine on our i.MX27 platform
using : NAND device: Manufacturer ID: 0x2c, Chip ID: 0xac (Micron NAND
512MiB 1,8V 8-bit) (2k page size) with hw ecc & flash bbt.
Eric
^ permalink raw reply [flat|nested] 38+ messages in thread
* [PATCH] mxc_nand : add RESET command support
2009-12-05 10:43 ` Eric Bénard
@ 2009-12-07 22:02 ` Eric Bénard
2009-12-09 8:25 ` Artem Bityutskiy
2010-01-21 20:46 ` [PATCH] " Eric Bénard
2009-12-08 12:07 ` [RFC] mxc nand controller updates Artem Bityutskiy
1 sibling, 2 replies; 38+ messages in thread
From: Eric Bénard @ 2009-12-07 22:02 UTC (permalink / raw)
To: linux-mtd; +Cc: Sascha Hauer
mxc_nand driver must support the RESET Command in order to support
Micron NAND which need a reset before any other command.
Signed-off-by: Eric Benard <eric@eukrea.com>
--
diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c
index d5445cd..0207525 100644
--- a/drivers/mtd/nand/mxc_nand.c
+++ b/drivers/mtd/nand/mxc_nand.c
@@ -638,6 +638,7 @@ static void mxc_nand_command(struct mtd_info *mtd,
unsigned command
case NAND_CMD_ERASE1:
case NAND_CMD_ERASE2:
+ case NAND_CMD_RESET:
send_cmd(host, command, false);
mxc_do_addr_cycle(mtd, column, page_addr);
^ permalink raw reply related [flat|nested] 38+ messages in thread
* Re: [RFC] mxc nand controller updates
2009-12-05 10:43 ` Eric Bénard
2009-12-07 22:02 ` [PATCH] mxc_nand : add RESET command support Eric Bénard
@ 2009-12-08 12:07 ` Artem Bityutskiy
1 sibling, 0 replies; 38+ messages in thread
From: Artem Bityutskiy @ 2009-12-08 12:07 UTC (permalink / raw)
To: Eric Bénard; +Cc: mathieu.berland, Sascha Hauer, linux-mtd
On Sat, 2009-12-05 at 11:43 +0100, Eric Bénard wrote:
> Hi Sascha,
>
> Sascha Hauer a écrit :
> > git://git.pengutronix.de/git/imx/linux-2.6.git mxc-nand
> >
> > Sascha Hauer (18):
> > mxc_nand: cleanup eccoob descriptions
> > mxc_nand: cleanup initialization
> > mxc_nand: merge send_read_page and send_prog_page
> > mxc_nand: introduce mxc_do_addr_cycle
> > mxc nand: remove debug param
> > mxc nand: remove dead code
> > mxc nand: use resource_size()
> > mxc nand: use buffers
> > mxc nand: simplify command processing
> > mxc nand: modify send_page to send all pages, not only one
> > mxc_nand: remove unused defines
> > mxc_nand: Make main/spare areas runtime configurable
> > mxc_nand: Get rid of pagesize_2k flag
> > mxc_nand: Add NFC V2 support
> > mxc_nand: disable sp_en bit only once
> > mxc_nand: Allow flash based bbt
> > mxc_nand: remove TROP_US_DELAY
> > mxc_nand: use DRIVER_NAME where appropriate
> >
> Tested-by: Eric Benard <eric@eukrea.com>
>
> it's a bit late but I can confirm this works fine on our i.MX27 platform
> using : NAND device: Manufacturer ID: 0x2c, Chip ID: 0xac (Micron NAND
> 512MiB 1,8V 8-bit) (2k page size) with hw ecc & flash bbt.
This was already pulled.
--
Best Regards,
Artem Bityutskiy (Артём Битюцкий)
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH] mxc_nand : add RESET command support
2009-12-07 22:02 ` [PATCH] mxc_nand : add RESET command support Eric Bénard
@ 2009-12-09 8:25 ` Artem Bityutskiy
2009-12-09 11:12 ` [PATCH 1/1] " Eric Benard
2010-01-21 20:46 ` [PATCH] " Eric Bénard
1 sibling, 1 reply; 38+ messages in thread
From: Artem Bityutskiy @ 2009-12-09 8:25 UTC (permalink / raw)
To: Eric Bénard; +Cc: Sascha Hauer, linux-mtd
On Mon, 2009-12-07 at 23:02 +0100, Eric Bénard wrote:
> mxc_nand driver must support the RESET Command in order to support
> Micron NAND which need a reset before any other command.
>
> Signed-off-by: Eric Benard <eric@eukrea.com>
> --
> diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c
> index d5445cd..0207525 100644
> --- a/drivers/mtd/nand/mxc_nand.c
> +++ b/drivers/mtd/nand/mxc_nand.c
> @@ -638,6 +638,7 @@ static void mxc_nand_command(struct mtd_info *mtd,
> unsigned command
>
> case NAND_CMD_ERASE1:
> case NAND_CMD_ERASE2:
> + case NAND_CMD_RESET:
> send_cmd(host, command, false);
> mxc_do_addr_cycle(mtd, column, page_addr);
Please, send a non-line-wrapped patch.
--
Best Regards,
Artem Bityutskiy (Артём Битюцкий)
^ permalink raw reply [flat|nested] 38+ messages in thread
* [PATCH 1/1] mxc_nand : add RESET command support
2009-12-09 8:25 ` Artem Bityutskiy
@ 2009-12-09 11:12 ` Eric Benard
2009-12-11 12:40 ` Sascha Hauer
2010-01-22 8:12 ` Sascha Hauer
0 siblings, 2 replies; 38+ messages in thread
From: Eric Benard @ 2009-12-09 11:12 UTC (permalink / raw)
To: linux-mtd; +Cc: s.hauer, dedekind1
mxc_nand driver must support the RESET Command in order to support
Micron NAND which need a reset before any other command.
Signed-off-by: Eric Benard <eric@eukrea.com>
---
drivers/mtd/nand/mxc_nand.c | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c
index d5445cd..0207525 100644
--- a/drivers/mtd/nand/mxc_nand.c
+++ b/drivers/mtd/nand/mxc_nand.c
@@ -638,6 +638,7 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command,
case NAND_CMD_ERASE1:
case NAND_CMD_ERASE2:
+ case NAND_CMD_RESET:
send_cmd(host, command, false);
mxc_do_addr_cycle(mtd, column, page_addr);
--
1.6.3.3
^ permalink raw reply related [flat|nested] 38+ messages in thread
* Re: [PATCH 1/1] mxc_nand : add RESET command support
2009-12-09 11:12 ` [PATCH 1/1] " Eric Benard
@ 2009-12-11 12:40 ` Sascha Hauer
2010-01-22 8:12 ` Sascha Hauer
1 sibling, 0 replies; 38+ messages in thread
From: Sascha Hauer @ 2009-12-11 12:40 UTC (permalink / raw)
To: Eric Benard; +Cc: linux-mtd, dedekind1
On Wed, Dec 09, 2009 at 12:12:43PM +0100, Eric Benard wrote:
> mxc_nand driver must support the RESET Command in order to support
> Micron NAND which need a reset before any other command.
>
> Signed-off-by: Eric Benard <eric@eukrea.com>
Acked-by: Sascha Hauer <s.hauer@pengutronix.de>
> ---
> drivers/mtd/nand/mxc_nand.c | 1 +
> 1 files changed, 1 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c
> index d5445cd..0207525 100644
> --- a/drivers/mtd/nand/mxc_nand.c
> +++ b/drivers/mtd/nand/mxc_nand.c
> @@ -638,6 +638,7 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command,
>
> case NAND_CMD_ERASE1:
> case NAND_CMD_ERASE2:
> + case NAND_CMD_RESET:
> send_cmd(host, command, false);
> mxc_do_addr_cycle(mtd, column, page_addr);
>
> --
> 1.6.3.3
>
>
>
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH] mxc_nand : add RESET command support
2009-12-07 22:02 ` [PATCH] mxc_nand : add RESET command support Eric Bénard
2009-12-09 8:25 ` Artem Bityutskiy
@ 2010-01-21 20:46 ` Eric Bénard
1 sibling, 0 replies; 38+ messages in thread
From: Eric Bénard @ 2010-01-21 20:46 UTC (permalink / raw)
To: Sascha Hauer; +Cc: linux-mtd
Hi Sascha,
is it possible to get this patch merged to fix the RESET command on
mxc_nand ?
Thanks,
Eric
Le 07/12/2009 23:02, Eric Bénard a écrit :
> mxc_nand driver must support the RESET Command in order to support
> Micron NAND which need a reset before any other command.
>
> Signed-off-by: Eric Benard <eric@eukrea.com>
> --
> diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c
> index d5445cd..0207525 100644
> --- a/drivers/mtd/nand/mxc_nand.c
> +++ b/drivers/mtd/nand/mxc_nand.c
> @@ -638,6 +638,7 @@ static void mxc_nand_command(struct mtd_info *mtd,
> unsigned command
>
> case NAND_CMD_ERASE1:
> case NAND_CMD_ERASE2:
> + case NAND_CMD_RESET:
> send_cmd(host, command, false);
> mxc_do_addr_cycle(mtd, column, page_addr);
>
>
> ______________________________________________________
> Linux MTD discussion mailing list
> http://lists.infradead.org/mailman/listinfo/linux-mtd/
>
>
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH 1/1] mxc_nand : add RESET command support
2009-12-09 11:12 ` [PATCH 1/1] " Eric Benard
2009-12-11 12:40 ` Sascha Hauer
@ 2010-01-22 8:12 ` Sascha Hauer
2010-02-03 16:02 ` Artem Bityutskiy
1 sibling, 1 reply; 38+ messages in thread
From: Sascha Hauer @ 2010-01-22 8:12 UTC (permalink / raw)
To: Eric Benard; +Cc: linux-mtd, dedekind1
Artem, can you take this patch, please?
If your ok with it, I could take patches only affecting the mxc_nand
driver also via my i.MX tree.
Sascha
On Wed, Dec 09, 2009 at 12:12:43PM +0100, Eric Benard wrote:
> mxc_nand driver must support the RESET Command in order to support
> Micron NAND which need a reset before any other command.
>
> Signed-off-by: Eric Benard <eric@eukrea.com>
Acked-by: Sascha Hauer <s.hauer@pengutronix.de>
> ---
> drivers/mtd/nand/mxc_nand.c | 1 +
> 1 files changed, 1 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c
> index d5445cd..0207525 100644
> --- a/drivers/mtd/nand/mxc_nand.c
> +++ b/drivers/mtd/nand/mxc_nand.c
> @@ -638,6 +638,7 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command,
>
> case NAND_CMD_ERASE1:
> case NAND_CMD_ERASE2:
> + case NAND_CMD_RESET:
> send_cmd(host, command, false);
> mxc_do_addr_cycle(mtd, column, page_addr);
>
> --
> 1.6.3.3
>
>
>
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH 1/1] mxc_nand : add RESET command support
2010-01-22 8:12 ` Sascha Hauer
@ 2010-02-03 16:02 ` Artem Bityutskiy
0 siblings, 0 replies; 38+ messages in thread
From: Artem Bityutskiy @ 2010-02-03 16:02 UTC (permalink / raw)
To: Sascha Hauer; +Cc: linux-mtd
On Fri, 2010-01-22 at 09:12 +0100, Sascha Hauer wrote:
> Artem, can you take this patch, please?
>
> If your ok with it, I could take patches only affecting the mxc_nand
> driver also via my i.MX tree.
Yeah, it is sitting in my l2-mtd-2.6 / dunno
--
Best Regards,
Artem Bityutskiy (Артём Битюцкий)
^ permalink raw reply [flat|nested] 38+ messages in thread
end of thread, other threads:[~2010-02-03 16:04 UTC | newest]
Thread overview: 38+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-10-21 14:13 [RFC] mxc nand controller updates Sascha Hauer
2009-10-21 14:13 ` [PATCH 01/19] Revert "mtd: mxc_nand: fix 2KiB pagesize NAND on i.MX27" Sascha Hauer
2009-10-21 14:13 ` [PATCH 02/19] mxc_nand: cleanup eccoob descriptions Sascha Hauer
2009-10-21 14:13 ` [PATCH 03/19] mxc_nand: cleanup initialization Sascha Hauer
2009-10-21 14:13 ` [PATCH 04/19] mxc_nand: merge send_read_page and send_prog_page Sascha Hauer
2009-10-21 14:13 ` [PATCH 05/19] mxc_nand: introduce mxc_do_addr_cycle Sascha Hauer
2009-10-21 14:13 ` [PATCH 06/19] mxc nand: remove debug param Sascha Hauer
2009-10-21 14:13 ` [PATCH 07/19] mxc nand: remove dead code Sascha Hauer
2009-10-21 14:13 ` [PATCH 08/19] mxc nand: use resource_size() Sascha Hauer
2009-10-21 14:13 ` [PATCH 09/19] mxc nand: use buffers Sascha Hauer
2009-10-21 14:13 ` [PATCH 10/19] mxc nand: simplify command processing Sascha Hauer
2009-10-21 14:13 ` [PATCH 11/19] mxc nand: modify send_page to send all pages, not only one Sascha Hauer
2009-10-21 14:13 ` [PATCH 12/19] mxc_nand: remove unused defines Sascha Hauer
2009-10-21 14:13 ` [PATCH 13/19] mxc_nand: Make main/spare areas runtime configurable Sascha Hauer
2009-10-21 14:13 ` [PATCH 14/19] mxc_nand: Get rid of pagesize_2k flag Sascha Hauer
2009-10-21 14:13 ` [PATCH 15/19] mxc_nand: Add NFC V2 support Sascha Hauer
2009-10-21 14:13 ` [PATCH 16/19] mxc_nand: disable sp_en bit only once Sascha Hauer
2009-10-21 14:13 ` [PATCH 17/19] mxc_nand: Allow flash based bbt Sascha Hauer
2009-10-21 14:13 ` [PATCH 18/19] mxc_nand: remove TROP_US_DELAY Sascha Hauer
2009-10-21 14:13 ` [PATCH 19/19] mxc_nand: use DRIVER_NAME where appropriate Sascha Hauer
2009-10-31 18:38 ` [RFC] mxc nand controller updates alfred steele
2009-10-31 20:11 ` Robert Schwebel
2009-10-31 23:08 ` alfred steele
2009-11-11 7:49 ` Artem Bityutskiy
2009-11-12 7:36 ` Sascha Hauer
2009-11-13 8:32 ` Artem Bityutskiy
2009-11-30 11:20 ` David Woodhouse
2009-11-30 11:41 ` Artem Bityutskiy
2009-11-30 12:29 ` Sascha Hauer
2009-12-05 10:43 ` Eric Bénard
2009-12-07 22:02 ` [PATCH] mxc_nand : add RESET command support Eric Bénard
2009-12-09 8:25 ` Artem Bityutskiy
2009-12-09 11:12 ` [PATCH 1/1] " Eric Benard
2009-12-11 12:40 ` Sascha Hauer
2010-01-22 8:12 ` Sascha Hauer
2010-02-03 16:02 ` Artem Bityutskiy
2010-01-21 20:46 ` [PATCH] " Eric Bénard
2009-12-08 12:07 ` [RFC] mxc nand controller updates Artem Bityutskiy
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox