[U-Boot] [PATCH v2 10/17] SPEAr : FSMC driver support added

Vipin KUMAR vipin.kumar at st.com
Tue May 4 10:08:50 CEST 2010


>> + * Vipin Kumar, ST Micoelectronics, vipin.kumar at st.com.
>> + *
>> + * See file CREDITS for list of people who contributed to this
>> + * project.
>> + *
>> + * 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>
>> +#include <nand.h>
>> +#include <asm/io.h>
>> +#include <linux/bitops.h>
>> +#include <linux/err.h>
>> +#include <linux/mtd/nand_ecc.h>
>> +#include <linux/mtd/fsmc_nand.h>
>> +#include <asm/arch/hardware.h>
>> +
>> +static u32 fsmc_version;
>> +static struct fsmc_regs *const fsmc_regs_p =
>> +    (struct fsmc_regs *)CONFIG_SYS_FSMC_BASE;
>> +
> 
> CONFIG_SYS_FSMC_BASE is not defined until 11/17
> This make this change non-bisectable.
> Fix.

Since this driver is implemented independent of the spear platform, and it 
becomes the responsibility of the platform using this driver to #define 
this macro before using it.
Should I do it some other way ?

>> +    i = 0;
>> +    while (num_err--) {
>> +        change_bit(0, &err_idx[i]);
>> +        change_bit(1, &err_idx[i]);
>> +
>> +        if (err_idx[i] <= 512 * 8) {
>> +            change_bit(err_idx[i], dat);
>> +            i++;
>> +        }
>> +    }
>> +    return i;
>> +}
>> +
>> +static int fsmc_read_hwecc(struct mtd_info *mtd,
>> +                const u_char *data, u_char *ecc)
>> +{
>> +    u_int ecc_tmp;
>> +
>> +    switch (fsmc_version) {
>> +    case FSMC_VER8:
>> +        while (!(readl(&fsmc_regs_p->sts) & FSMC_CODE_RDY))
>> +            ;
> 
> Add a comment that this is a busy wait.

OK.

>> +    uint16_t ecc_oob[7];
>> +
>> +    for (i = 0, s = 0; s < eccsteps; s++, i += eccbytes, p += eccsize) {
>> +
>> +        chip->cmdfunc(mtd, NAND_CMD_READ0, s * eccsize, page);
>> +        chip->ecc.hwctl(mtd, NAND_ECC_READ);
>> +        chip->read_buf(mtd, p, eccsize);
>> +
>> +        for (j = 0; j < eccbytes;) {
>> +            off = fsmc_eccpl.eccplace[s].offset;
>> +            len = fsmc_eccpl.eccplace[s].length;
>> +
>> +            /*
>> +             * length is intentionally kept a higher multiple of 2
>> +             * to read at least 13 bytes even in case of 16 bit NAND
>> +             * devices
>> +             */
>> +            len = roundup(len, 2);
>> +            chip->cmdfunc(mtd, NAND_CMD_READOOB, off, page);
>> +            chip->read_buf(mtd, (uint8_t *)&ecc_oob[j], len);
>> +            j += len;
>> +        }
>> +
>> +        memcpy(&ecc_code[i], ecc_oob, 13);
>> +        chip->ecc.calculate(mtd, p, &ecc_calc[i]);
>> +
>> +        stat = chip->ecc.correct(mtd, p, &ecc_code[i], &ecc_calc[i]);
>> +        if (stat < 0)
>> +            mtd->ecc_stats.failed++;
>> +        else
>> +            mtd->ecc_stats.corrected += stat;
>> +    }
>> +
>> +    return 0;
>> +}
>> +
>> +int fsmc_nand_init(struct nand_chip *nand)
>> +{
>> +    u32 peripid2 = readl(&fsmc_regs_p->peripid2);
>> +
>> +    fsmc_version = (peripid2 >> FSMC_REVISION_SHFT) &
>> +               FSMC_REVISION_MSK;
>> +#if defined(CONFIG_SYS_FSMC_NAND_16BIT)
> 
> 16BIT is never defined
> This is dead code
> Remove

Since this is a generic driver, any platform using fsmc peripheral can enable 
this feature by #defining CONFIG_SYS_FSMC_NAND_16BIT in respective 
include/configs/xxx.h


All other comments are accepted and would be fixed in v3

Thanks and Regards
Vipin


More information about the U-Boot mailing list