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

View File

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