On 12:53 Mon 24 Mar     , Scott Wood wrote:
> This is a driver for the Flash Control Machine of the enhanched Local Bus
> Controller found on some Freescale chips (such as the mpc8313 and the
> mpc8379).
> 
> Signed-off-by: Scott Wood <[EMAIL PROTECTED]>
> ---
> This patch applies to the mtd-2.6.22.1 branch of the nand tree.
> 
>  drivers/mtd/nand/Makefile        |    1 +
>  drivers/mtd/nand/fsl_elbc_nand.c |  764 
> ++++++++++++++++++++++++++++++++++++++
>  2 files changed, 765 insertions(+), 0 deletions(-)
>  create mode 100644 drivers/mtd/nand/fsl_elbc_nand.c
> 
> diff --git a/drivers/mtd/nand/Makefile b/drivers/mtd/nand/Makefile
> index 244fa09..470f63f 100644
> --- a/drivers/mtd/nand/Makefile
> +++ b/drivers/mtd/nand/Makefile
> @@ -32,6 +32,7 @@ COBJS-y += nand_ecc.o
>  COBJS-y += nand_bbt.o
>  COBJS-y += nand_util.o
>  
> +COBJS-y += fsl_elbc_nand.o
>  COBJS-y += fsl_upm.o
>  
>  COBJS        := $(COBJS-y)
> diff --git a/drivers/mtd/nand/fsl_elbc_nand.c 
> b/drivers/mtd/nand/fsl_elbc_nand.c
> new file mode 100644
> index 0000000..ceb3529
> --- /dev/null
> +++ b/drivers/mtd/nand/fsl_elbc_nand.c
> @@ -0,0 +1,764 @@
> +/* Freescale Enhanced Local Bus Controller FCM NAND driver
> + *
> + * Copyright (c) 2006-2008 Freescale Semiconductor
> + *
> + * Authors: Nick Spence <[EMAIL PROTECTED]>,
> + *          Scott Wood <[EMAIL PROTECTED]>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
> + */
> +
> +#include <common.h>
> +
> +#if defined(CONFIG_CMD_NAND) && defined(CONFIG_NAND_FSL_ELBC)
Please move to the Makefile
> +
> +#include <malloc.h>
> +
> +#include <linux/mtd/mtd.h>
> +#include <linux/mtd/nand.h>
> +#include <linux/mtd/nand_ecc.h>
> +
> +#include <asm/io.h>
> +#include <asm/errno.h>
> +
....
> +             ctrl->read_bytes = mtd->writesize + mtd->oobsize;
> +             ctrl->index += column;
> +
> +             fsl_elbc_do_read(chip, 0);
> +             fsl_elbc_run_command(mtd);
> +             return;
> +
> +     /* READOOB reads only the OOB because no ECC is performed. */
> +     case NAND_CMD_READOOB:
> +             vdbg("fsl_elbc_cmdfunc: NAND_CMD_READOOB, page_addr:"
> +                  " 0x%x, column: 0x%x.\n", page_addr, column);
> +
> +             out_be32(&lbc->fbcr, mtd->oobsize - column);
> +             set_addr(mtd, column, page_addr, 1);
> +
> +             ctrl->read_bytes = mtd->writesize + mtd->oobsize;
> +
> +             fsl_elbc_do_read(chip, 1);
> +             fsl_elbc_run_command(mtd);
> +             
   ^^^^^^^^^^^^^
WhiteSpace please remove
> +             return;
> +
> +     /* READID must read all 5 possible bytes while CEB is active */
> +     case NAND_CMD_READID:
> +             vdbg("fsl_elbc_cmdfunc: NAND_CMD_READID.\n");
> +
> +             out_be32(&lbc->fir, (FIR_OP_CW0 << FIR_OP0_SHIFT) |
> +                                 (FIR_OP_UA  << FIR_OP1_SHIFT) |
> +                                 (FIR_OP_RBW << FIR_OP2_SHIFT));
> +             out_be32(&lbc->fcr, NAND_CMD_READID << FCR_CMD0_SHIFT);
> +             /* 5 bytes for manuf, device and exts */
> +             out_be32(&lbc->fbcr, 5);
> +             ctrl->read_bytes = 5;
> +             ctrl->use_mdr = 1;
> +             ctrl->mdr = 0;
> +
> +             set_addr(mtd, 0, 0, 0);
> +             fsl_elbc_run_command(mtd);
> +             return;
> +
....
> +             printf("fsl_elbc_cmdfunc: error, unsupported command 0x%x.\n",
> +                     command);
> +     }
> +}
> +
> +static void fsl_elbc_select_chip(struct mtd_info *mtd, int chip)
> +{
> +     /* The hardware does not seem to support multiple
> +      * chips per bank.
> +      */
please use this comment style
/*
 * ...
 * ....
 */
> +}
> +
> +/*
> + * Write buf to the FCM Controller Data Buffer
> + */
> +static void fsl_elbc_write_buf(struct mtd_info *mtd, const u8 *buf, int len)
> +{
> +     struct nand_chip *chip = mtd->priv;
> +     struct fsl_elbc_mtd *priv = chip->priv;
> +     struct fsl_elbc_ctrl *ctrl = priv->ctrl;
> +     unsigned int bufsize = mtd->writesize + mtd->oobsize;
> +
....
> +
> +     for (i = 0; i < len; i++)
> +             if (in_8(&ctrl->addr[ctrl->index + i]) != buf[i])
> +                     break;
> +
> +     ctrl->index += len;
> +     return i == len && ctrl->status == LTESR_CC ? 0 : -EIO;
please use something like that to help the reading
        return ((i==len) && (ctrl->status==LTESR_CC))? 0 : -EIO;
> +}
> +
> +/* This function is called after Program and Erase Operations to
> + * check for success or failure.
> + */
Comment same as before
> +static int fsl_elbc_wait(struct mtd_info *mtd, struct nand_chip *chip)
> +{
> +     struct fsl_elbc_mtd *priv = chip->priv;
> +     struct fsl_elbc_ctrl *ctrl = priv->ctrl;
> +     lbus83xx_t *lbc = ctrl->regs;
> +
> +     if (ctrl->status != LTESR_CC)
> +             return NAND_STATUS_FAIL;
> +
> +     /* Use READ_STATUS command, but wait for the device to be ready */
> +     ctrl->use_mdr = 0;
> +     out_be32(&lbc->fir,
> +              (FIR_OP_CW0 << FIR_OP0_SHIFT) |
> +              (FIR_OP_RBW << FIR_OP1_SHIFT));
> +     out_be32(&lbc->fcr, NAND_CMD_STATUS << FCR_CMD0_SHIFT);
> +     out_be32(&lbc->fbcr, 1);
> +     set_addr(mtd, 0, 0, 0);
> +     ctrl->read_bytes = 1;
> +
> +     fsl_elbc_run_command(mtd);
> +
> +     if (ctrl->status != LTESR_CC)
> +             return NAND_STATUS_FAIL;
> +
> +     /* The chip always seems to report that it is
> +      * write-protected, even when it is not.
> +      */
> +     out_8(ctrl->addr, in_8(ctrl->addr) | NAND_STATUS_WP);
> +     return fsl_elbc_read_byte(mtd);
> +}
> +
> +static int fsl_elbc_read_page(struct mtd_info *mtd,
> +                              struct nand_chip *chip,
> +                              uint8_t *buf)
> +{
> +     fsl_elbc_read_buf(mtd, buf, mtd->writesize);
> +     fsl_elbc_read_buf(mtd, chip->oob_poi, mtd->oobsize);
> +
> +     if (fsl_elbc_wait(mtd, chip) & NAND_STATUS_FAIL)
> +             mtd->ecc_stats.failed++;
> +
> +     return 0;
> +}
> +
> +/* ECC will be calculated automatically, and errors will be detected in
> + * waitfunc.
> + */
Comment same as before
> +static void fsl_elbc_write_page(struct mtd_info *mtd,
> +                                struct nand_chip *chip,
> +                                const uint8_t *buf)
> +{
> +     struct fsl_elbc_mtd *priv = chip->priv;
> +     struct fsl_elbc_ctrl *ctrl = priv->ctrl;
> +
> +     fsl_elbc_write_buf(mtd, buf, mtd->writesize);
> +     fsl_elbc_write_buf(mtd, chip->oob_poi, mtd->oobsize);
> +
> +     ctrl->oob_poi = chip->oob_poi;
> +}
> +
> +static struct fsl_elbc_ctrl *elbc_ctrl;
> +
> +     if (!priv)
> +             return -ENOMEM;
> +
> +     priv->ctrl = elbc_ctrl;
> +     priv->vbase = nand->IO_ADDR_R;
> +
> +     /* Find which chip select it is connected to.  It'd be nice
> +      * if we could pass more than one datum to the NAND driver...
> +      */
Comment same as before
> +     for (priv->bank = 0; priv->bank < MAX_BANKS; priv->bank++) {
> +             br = in_be32(&elbc_ctrl->regs->bank[priv->bank].br);
> +             or = in_be32(&elbc_ctrl->regs->bank[priv->bank].or);
> +
> +             if ((br & BR_V) && (br & BR_MSEL) == BR_MS_FCM &&
> +                 (br & or & BR_BA) == (phys_addr_t)nand->IO_ADDR_R)
> +                     break;
> +     }
> +
> +     if (priv->bank >= MAX_BANKS) {
> +             printf("fsl_elbc_nand: address did not match any "
> +                    "chip selects\n");
> +             return -ENODEV;
> +     }
> +
> +     elbc_ctrl->chips[priv->bank] = priv;
> +
Please check all comments.

Best Regards,
J.

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
U-Boot-Users mailing list
U-Boot-Users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/u-boot-users

Reply via email to