Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mtd: cfi_cmdset_0002: add CFI detection for SST 38VF640x chips

Add support for SST38VF640x chips in CFI mode.

Signed-off-by: Guillaume LECERF <glecerf@gmail.com>
Signed-off-by: yidong zhang <zhangyd6@gmail.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>

authored by

Guillaume LECERF and committed by
David Woodhouse
9fc05fca fc61015f

+26
+26
drivers/mtd/chips/cfi_cmdset_0002.c
··· 293 293 cfi->addr_unlock2 = 0x2AA; 294 294 } 295 295 296 + static void fixup_sst38vf640x_sectorsize(struct mtd_info *mtd, void *param) 297 + { 298 + struct map_info *map = mtd->priv; 299 + struct cfi_private *cfi = map->fldrv_priv; 300 + 301 + fixup_sst39vf_rev_b(mtd, param); 302 + 303 + /* 304 + * CFI reports 1024 sectors (0x03ff+1) of 64KBytes (0x0100*256) where 305 + * it should report a size of 8KBytes (0x0020*256). 306 + */ 307 + cfi->cfiq->EraseRegionInfo[0] = 0x002003ff; 308 + pr_warning("%s: Bad 38VF640x CFI data; adjusting sector size from 64 to 8KiB\n", mtd->name); 309 + } 310 + 296 311 static void fixup_s29gl064n_sectors(struct mtd_info *mtd, void *param) 297 312 { 298 313 struct map_info *map = mtd->priv; ··· 359 344 { CFI_MFR_AMD, 0x1301, fixup_s29gl064n_sectors, NULL, }, 360 345 { CFI_MFR_AMD, 0x1a00, fixup_s29gl032n_sectors, NULL, }, 361 346 { CFI_MFR_AMD, 0x1a01, fixup_s29gl032n_sectors, NULL, }, 347 + { CFI_MFR_SST, 0x536A, fixup_sst38vf640x_sectorsize, NULL, }, /* SST38VF6402 */ 348 + { CFI_MFR_SST, 0x536B, fixup_sst38vf640x_sectorsize, NULL, }, /* SST38VF6401 */ 349 + { CFI_MFR_SST, 0x536C, fixup_sst38vf640x_sectorsize, NULL, }, /* SST38VF6404 */ 350 + { CFI_MFR_SST, 0x536D, fixup_sst38vf640x_sectorsize, NULL, }, /* SST38VF6403 */ 362 351 #if !FORCE_WORD_WRITE 363 352 { CFI_MFR_ANY, CFI_ID_ANY, fixup_use_write_buffers, NULL, }, 364 353 #endif ··· 393 374 if (cfi->mfr == CFI_MFR_SAMSUNG && cfi->id == 0x257e && 394 375 extp->MajorVersion == '0') 395 376 extp->MajorVersion = '1'; 377 + /* 378 + * SST 38VF640x chips report major=0xFF / minor=0xFF. 379 + */ 380 + if (cfi->mfr == CFI_MFR_SST && (cfi->id >> 4) == 0x0536) { 381 + extp->MajorVersion = '1'; 382 + extp->MinorVersion = '0'; 383 + } 396 384 } 397 385 398 386 struct mtd_info *cfi_cmdset_0002(struct map_info *map, int primary)