On Mon, Jul 07, 2008 at 11:22:56AM +0900, Kyungmin Park wrote:
> +static int part_validate_onenand(struct mtdids *id, struct part_info *part)
> +{
> +#if defined(CONFIG_CMD_ONENAND)
> +     /* info for OneNAND chips */
> +     struct mtd_info *mtd;
> +
> +     mtd = &onenand_mtd;
> +
> +     if ((unsigned long)(part->offset) % mtd->erasesize) {
> +             printf("%s%d: partition (%s) start offset"
> +                     "alignment incorrect\n",
> +                             MTD_DEV_TYPE(id->type), id->num, part->name);
> +             return 1;
> +     }
> +
> +     if (part->size % mtd->erasesize) {
> +             printf("%s%d: partition (%s) size alignment incorrect\n",
> +                             MTD_DEV_TYPE(id->type), id->num, part->name);
> +             return 1;
> +     }
> +
> +     return 0;
> +#else
> +     return 1;
> +#endif
> +}

This looks like a duplicate of part_validate_nand (note that nand_info_t
is just an obfuscatory alias of struct mtd_info).

> +static int read_onenand_cached(u32 off, u32 size, u_char *buf)
> +{
> +     u32 bytes_read = 0;
> +     size_t retlen;
> +     int cpy_bytes;
> +
> +     while (bytes_read < size) {
> +             if ((off + bytes_read < onenand_cache_off) ||
> +                 (off + bytes_read >= onenand_cache_off + 
> ONENAND_CACHE_SIZE)) {
> +                     onenand_cache_off = (off + bytes_read) & 
> ONENAND_PAGE_MASK;
> +                     if (!onenand_cache) {
> +                             /* This memory never gets freed but 'cause
> +                                it's a bootloader, nobody cares */
> +                             onenand_cache = malloc(ONENAND_CACHE_SIZE);
> +                             if (!onenand_cache) {
> +                                     printf("read_onenand_cached: can't 
> alloc cache size %d bytes\n",
> +                                            ONENAND_CACHE_SIZE);
> +                                     return -1;
> +                             }
> +                     }
> +
> +                     retlen = ONENAND_CACHE_SIZE;
> +                     if (onenand_read(&onenand_mtd, onenand_cache_off, 
> retlen,
> +                                             &retlen, onenand_cache) != 0 ||
> +                                     retlen != ONENAND_CACHE_SIZE) {
> +                             printf("read_onenand_cached: error reading nand 
> off %#x size %d bytes\n",
> +                                     onenand_cache_off, ONENAND_CACHE_SIZE);
> +                             return -1;
> +                     }
> +             }
> +             cpy_bytes = onenand_cache_off + ONENAND_CACHE_SIZE - (off + 
> bytes_read);
> +             if (cpy_bytes > size - bytes_read)
> +                     cpy_bytes = size - bytes_read;
> +             memcpy(buf + bytes_read,
> +                    onenand_cache + off + bytes_read - onenand_cache_off,
> +                    cpy_bytes);
> +             bytes_read += cpy_bytes;
> +     }
> +     return bytes_read;
> +}

I really would rather not duplicate all of this, which looks extremely
similar to regular NAND.  Is there reason why we don't use the mtd_info
function pointer interface?

-Scott

-------------------------------------------------------------------------
Sponsored by: SourceForge.net Community Choice Awards: VOTE NOW!
Studies have shown that voting for your favorite open source project,
along with a healthy diet, reduces your potential for chronic lameness
and boredom. Vote Now at http://www.sourceforge.net/community/cca08
_______________________________________________
U-Boot-Users mailing list
U-Boot-Users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/u-boot-users

Reply via email to