summaryrefslogtreecommitdiffstats
path: root/drivers/nand
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2009-10-05 10:02:03 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2009-10-05 10:13:39 +0200
commit762ba0dac53300e97cdfaa3819f570771b62c962 (patch)
treebf49230d909baaa1dc644c516eac036a704c59ed /drivers/nand
parentcfc0e32d25e0f265976c21fdbf8db5f5a8c73f05 (diff)
downloadbarebox-762ba0dac53300e97cdfaa3819f570771b62c962.tar.gz
barebox-762ba0dac53300e97cdfaa3819f570771b62c962.tar.xz
nand_imx_v2: Use a two staged scan process
With the in between initialised writesize values we can further initialise our nand controller. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/nand')
-rw-r--r--drivers/nand/nand_imx_v2.c39
1 files changed, 22 insertions, 17 deletions
diff --git a/drivers/nand/nand_imx_v2.c b/drivers/nand/nand_imx_v2.c
index 2f70389456..6d85ae8d0c 100644
--- a/drivers/nand/nand_imx_v2.c
+++ b/drivers/nand/nand_imx_v2.c
@@ -828,22 +828,6 @@ static void __bare_init mxc_nand_set_datawidth(struct mtd_info *mtd, int datawid
static int mxc_nand_scan_bbt(struct mtd_info *mtd)
{
struct nand_chip *nand_chip = mtd->priv;
- struct imx_nand_host *host = nand_chip->priv;
-
- if (mtd->writesize == 2048) {
- mxc_nand_set_writesize(mtd, 2048);
- raw_write(((raw_read(NFC_SPAS) & 0xff00) | NFC_SPAS_64), NFC_SPAS);
- raw_write((raw_read(NFC_CONFIG1) | NFC_ECC_MODE_4), NFC_CONFIG1);
- nand_chip->ecc.layout = &nand_hw_eccoob_2k;
- } else if (mtd->writesize == 4096) {
- mxc_nand_set_writesize(mtd, 4096);
- raw_write(((raw_read(NFC_SPAS) & 0xff00) | NFC_SPAS_128), NFC_SPAS);
- raw_write((raw_read(NFC_CONFIG1) | NFC_ECC_MODE_4), NFC_CONFIG1);
- nand_chip->ecc.layout = &nand_hw_eccoob_4k;
- } else {
- mxc_nand_set_writesize(mtd, 512);
- nand_chip->ecc.layout = &nand_hw_eccoob_512;
- }
/* propagate ecc.layout to mtd_info */
mtd->ecclayout = nand_chip->ecc.layout;
@@ -961,7 +945,28 @@ static int __init imxnd_probe(struct device_d *dev)
this->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
/* Scan to find existence of the device */
- if (nand_scan(mtd, 1)) {
+ if (nand_scan_ident(mtd, 1)) {
+ err = -ENXIO;
+ dev_err(dev, "Unable to find any NAND device\n");
+ goto err_out;
+ }
+
+ if (mtd->writesize == 2048) {
+ mxc_nand_set_writesize(mtd, 2048);
+ raw_write(((raw_read(NFC_SPAS) & 0xff00) | NFC_SPAS_64), NFC_SPAS);
+ raw_write((raw_read(NFC_CONFIG1) | NFC_ECC_MODE_4), NFC_CONFIG1);
+ this->ecc.layout = &nand_hw_eccoob_2k;
+ } else if (mtd->writesize == 4096) {
+ mxc_nand_set_writesize(mtd, 4096);
+ raw_write(((raw_read(NFC_SPAS) & 0xff00) | NFC_SPAS_128), NFC_SPAS);
+ raw_write((raw_read(NFC_CONFIG1) | NFC_ECC_MODE_4), NFC_CONFIG1);
+ this->ecc.layout = &nand_hw_eccoob_4k;
+ } else {
+ mxc_nand_set_writesize(mtd, 512);
+ this->ecc.layout = &nand_hw_eccoob_512;
+ }
+
+ if (nand_scan_tail(mtd)) {
dev_err(dev, "Unable to find any NAND device.\n");
err = -ENXIO;
goto err_out;