Merge branch 'master' of git://git.denx.de/u-boot-cfi-flash

This commit is contained in:
Wolfgang Denk 2010-02-03 20:15:46 +01:00
commit 08254a1a97
1 changed files with 18 additions and 17 deletions

View File

@ -161,8 +161,8 @@ static int cfi_mtd_set_erasesize(struct mtd_info *mtd, flash_info_t *fi)
int sect;
int regions = 0;
int numblocks = 0;
ulong offset = 0;
ulong base_addr = fi->start[0];
ulong offset;
ulong base_addr;
/*
* First detect the number of eraseregions so that we can allocate
@ -174,29 +174,35 @@ static int cfi_mtd_set_erasesize(struct mtd_info *mtd, flash_info_t *fi)
sect_size_old = flash_sector_size(fi, sect);
}
switch (regions) {
case 0:
return 1;
case 1: /* flash has uniform erase size */
mtd->numeraseregions = 0;
mtd->erasesize = sect_size_old;
return 0;
}
mtd->numeraseregions = regions;
mtd->eraseregions = malloc(sizeof(struct mtd_erase_region_info) * regions);
/*
* Now detect the largest sector and fill the eraseregions
*/
sect_size_old = 0;
regions = 0;
base_addr = offset = fi->start[0];
sect_size_old = flash_sector_size(fi, 0);
for (sect = 0; sect < fi->sector_count; sect++) {
if ((sect_size_old != flash_sector_size(fi, sect)) &&
(sect_size_old != 0)) {
if (sect_size_old != flash_sector_size(fi, sect)) {
mtd->eraseregions[regions].offset = offset - base_addr;
mtd->eraseregions[regions].erasesize = sect_size_old;
mtd->eraseregions[regions].numblocks = numblocks;
/* Now start counting the next eraseregions */
numblocks = 0;
regions++;
} else {
numblocks++;
}
if (sect_size_old != flash_sector_size(fi, sect))
offset = fi->start[sect];
}
numblocks++;
/*
* Select the largest sector size as erasesize (e.g. for UBI)
@ -212,12 +218,7 @@ static int cfi_mtd_set_erasesize(struct mtd_info *mtd, flash_info_t *fi)
*/
mtd->eraseregions[regions].offset = offset - base_addr;
mtd->eraseregions[regions].erasesize = sect_size_old;
mtd->eraseregions[regions].numblocks = numblocks + 1;
if (regions)
mtd->numeraseregions = regions + 1;
else
mtd->numeraseregions = 0;
mtd->eraseregions[regions].numblocks = numblocks;
mtd->erasesize = sect_size;