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

mtd: cfi: Support early CFI fixups

Some CFI devices need fixups that affect the number of chips detected,
but the current fixup infrastructure (struct cfi_fixup and cfi_fixup())
does not cover this situation.

Introduce struct cfi_early_fixup and cfi_early_fixup() to fill the void.

Signed-off-by: Aaron Sierra <asierra@xes-inc.com>
Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>

authored by

Aaron Sierra and committed by
Boris Brezillon
b1c97e23 051529d0

+30
+30
drivers/mtd/chips/cfi_probe.c
··· 63 63 64 64 #endif 65 65 66 + /* 67 + * This fixup occurs immediately after reading the CFI structure and can affect 68 + * the number of chips detected, unlike cfi_fixup, which occurs after an 69 + * mtd_info structure has been created for the chip. 70 + */ 71 + struct cfi_early_fixup { 72 + uint16_t mfr; 73 + uint16_t id; 74 + void (*fixup)(struct cfi_private *cfi); 75 + }; 76 + 77 + static void cfi_early_fixup(struct cfi_private *cfi, 78 + const struct cfi_early_fixup *fixups) 79 + { 80 + const struct cfi_early_fixup *f; 81 + 82 + for (f = fixups; f->fixup; f++) { 83 + if (((f->mfr == CFI_MFR_ANY) || (f->mfr == cfi->mfr)) && 84 + ((f->id == CFI_ID_ANY) || (f->id == cfi->id))) { 85 + f->fixup(cfi); 86 + } 87 + } 88 + } 89 + 66 90 /* check for QRY. 67 91 in: interleave,type,mode 68 92 ret: table index, <0 for error ··· 175 151 return 1; 176 152 } 177 153 154 + static const struct cfi_early_fixup cfi_early_fixup_table[] = { 155 + { }, 156 + }; 157 + 178 158 static int __xipram cfi_chip_setup(struct map_info *map, 179 159 struct cfi_private *cfi) 180 160 { ··· 262 234 /* Put it back into Read Mode */ 263 235 cfi_qry_mode_off(base, map, cfi); 264 236 xip_allowed(base, map); 237 + 238 + cfi_early_fixup(cfi, cfi_early_fixup_table); 265 239 266 240 printk(KERN_INFO "%s: Found %d x%d devices at 0x%x in %d-bit bank. Manufacturer ID %#08x Chip ID %#08x\n", 267 241 map->name, cfi->interleave, cfi->device_type*8, base,