162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright © 2000-2010 David Woodhouse <dwmw2@infradead.org> et al. 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#ifndef __MTD_CFI_H__ 762306a36Sopenharmony_ci#define __MTD_CFI_H__ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/delay.h> 1062306a36Sopenharmony_ci#include <linux/types.h> 1162306a36Sopenharmony_ci#include <linux/bug.h> 1262306a36Sopenharmony_ci#include <linux/interrupt.h> 1362306a36Sopenharmony_ci#include <linux/mtd/flashchip.h> 1462306a36Sopenharmony_ci#include <linux/mtd/map.h> 1562306a36Sopenharmony_ci#include <linux/mtd/cfi_endian.h> 1662306a36Sopenharmony_ci#include <linux/mtd/xip.h> 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#ifdef CONFIG_MTD_CFI_I1 1962306a36Sopenharmony_ci#define cfi_interleave(cfi) 1 2062306a36Sopenharmony_ci#define cfi_interleave_is_1(cfi) (cfi_interleave(cfi) == 1) 2162306a36Sopenharmony_ci#else 2262306a36Sopenharmony_ci#define cfi_interleave_is_1(cfi) (0) 2362306a36Sopenharmony_ci#endif 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci#ifdef CONFIG_MTD_CFI_I2 2662306a36Sopenharmony_ci# ifdef cfi_interleave 2762306a36Sopenharmony_ci# undef cfi_interleave 2862306a36Sopenharmony_ci# define cfi_interleave(cfi) ((cfi)->interleave) 2962306a36Sopenharmony_ci# else 3062306a36Sopenharmony_ci# define cfi_interleave(cfi) 2 3162306a36Sopenharmony_ci# endif 3262306a36Sopenharmony_ci#define cfi_interleave_is_2(cfi) (cfi_interleave(cfi) == 2) 3362306a36Sopenharmony_ci#else 3462306a36Sopenharmony_ci#define cfi_interleave_is_2(cfi) (0) 3562306a36Sopenharmony_ci#endif 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci#ifdef CONFIG_MTD_CFI_I4 3862306a36Sopenharmony_ci# ifdef cfi_interleave 3962306a36Sopenharmony_ci# undef cfi_interleave 4062306a36Sopenharmony_ci# define cfi_interleave(cfi) ((cfi)->interleave) 4162306a36Sopenharmony_ci# else 4262306a36Sopenharmony_ci# define cfi_interleave(cfi) 4 4362306a36Sopenharmony_ci# endif 4462306a36Sopenharmony_ci#define cfi_interleave_is_4(cfi) (cfi_interleave(cfi) == 4) 4562306a36Sopenharmony_ci#else 4662306a36Sopenharmony_ci#define cfi_interleave_is_4(cfi) (0) 4762306a36Sopenharmony_ci#endif 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci#ifdef CONFIG_MTD_CFI_I8 5062306a36Sopenharmony_ci# ifdef cfi_interleave 5162306a36Sopenharmony_ci# undef cfi_interleave 5262306a36Sopenharmony_ci# define cfi_interleave(cfi) ((cfi)->interleave) 5362306a36Sopenharmony_ci# else 5462306a36Sopenharmony_ci# define cfi_interleave(cfi) 8 5562306a36Sopenharmony_ci# endif 5662306a36Sopenharmony_ci#define cfi_interleave_is_8(cfi) (cfi_interleave(cfi) == 8) 5762306a36Sopenharmony_ci#else 5862306a36Sopenharmony_ci#define cfi_interleave_is_8(cfi) (0) 5962306a36Sopenharmony_ci#endif 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci#ifndef cfi_interleave 6262306a36Sopenharmony_ci#warning No CONFIG_MTD_CFI_Ix selected. No NOR chip support can work. 6362306a36Sopenharmony_cistatic inline int cfi_interleave(void *cfi) 6462306a36Sopenharmony_ci{ 6562306a36Sopenharmony_ci BUG(); 6662306a36Sopenharmony_ci return 0; 6762306a36Sopenharmony_ci} 6862306a36Sopenharmony_ci#endif 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_cistatic inline int cfi_interleave_supported(int i) 7162306a36Sopenharmony_ci{ 7262306a36Sopenharmony_ci switch (i) { 7362306a36Sopenharmony_ci#ifdef CONFIG_MTD_CFI_I1 7462306a36Sopenharmony_ci case 1: 7562306a36Sopenharmony_ci#endif 7662306a36Sopenharmony_ci#ifdef CONFIG_MTD_CFI_I2 7762306a36Sopenharmony_ci case 2: 7862306a36Sopenharmony_ci#endif 7962306a36Sopenharmony_ci#ifdef CONFIG_MTD_CFI_I4 8062306a36Sopenharmony_ci case 4: 8162306a36Sopenharmony_ci#endif 8262306a36Sopenharmony_ci#ifdef CONFIG_MTD_CFI_I8 8362306a36Sopenharmony_ci case 8: 8462306a36Sopenharmony_ci#endif 8562306a36Sopenharmony_ci return 1; 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci default: 8862306a36Sopenharmony_ci return 0; 8962306a36Sopenharmony_ci } 9062306a36Sopenharmony_ci} 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci/* NB: these values must represents the number of bytes needed to meet the 9462306a36Sopenharmony_ci * device type (x8, x16, x32). Eg. a 32 bit device is 4 x 8 bytes. 9562306a36Sopenharmony_ci * These numbers are used in calculations. 9662306a36Sopenharmony_ci */ 9762306a36Sopenharmony_ci#define CFI_DEVICETYPE_X8 (8 / 8) 9862306a36Sopenharmony_ci#define CFI_DEVICETYPE_X16 (16 / 8) 9962306a36Sopenharmony_ci#define CFI_DEVICETYPE_X32 (32 / 8) 10062306a36Sopenharmony_ci#define CFI_DEVICETYPE_X64 (64 / 8) 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci/* Device Interface Code Assignments from the "Common Flash Memory Interface 10462306a36Sopenharmony_ci * Publication 100" dated December 1, 2001. 10562306a36Sopenharmony_ci */ 10662306a36Sopenharmony_ci#define CFI_INTERFACE_X8_ASYNC 0x0000 10762306a36Sopenharmony_ci#define CFI_INTERFACE_X16_ASYNC 0x0001 10862306a36Sopenharmony_ci#define CFI_INTERFACE_X8_BY_X16_ASYNC 0x0002 10962306a36Sopenharmony_ci#define CFI_INTERFACE_X32_ASYNC 0x0003 11062306a36Sopenharmony_ci#define CFI_INTERFACE_X16_BY_X32_ASYNC 0x0005 11162306a36Sopenharmony_ci#define CFI_INTERFACE_NOT_ALLOWED 0xffff 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci/* NB: We keep these structures in memory in HOST byteorder, except 11562306a36Sopenharmony_ci * where individually noted. 11662306a36Sopenharmony_ci */ 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci/* Basic Query Structure */ 11962306a36Sopenharmony_cistruct cfi_ident { 12062306a36Sopenharmony_ci uint8_t qry[3]; 12162306a36Sopenharmony_ci uint16_t P_ID; 12262306a36Sopenharmony_ci uint16_t P_ADR; 12362306a36Sopenharmony_ci uint16_t A_ID; 12462306a36Sopenharmony_ci uint16_t A_ADR; 12562306a36Sopenharmony_ci uint8_t VccMin; 12662306a36Sopenharmony_ci uint8_t VccMax; 12762306a36Sopenharmony_ci uint8_t VppMin; 12862306a36Sopenharmony_ci uint8_t VppMax; 12962306a36Sopenharmony_ci uint8_t WordWriteTimeoutTyp; 13062306a36Sopenharmony_ci uint8_t BufWriteTimeoutTyp; 13162306a36Sopenharmony_ci uint8_t BlockEraseTimeoutTyp; 13262306a36Sopenharmony_ci uint8_t ChipEraseTimeoutTyp; 13362306a36Sopenharmony_ci uint8_t WordWriteTimeoutMax; 13462306a36Sopenharmony_ci uint8_t BufWriteTimeoutMax; 13562306a36Sopenharmony_ci uint8_t BlockEraseTimeoutMax; 13662306a36Sopenharmony_ci uint8_t ChipEraseTimeoutMax; 13762306a36Sopenharmony_ci uint8_t DevSize; 13862306a36Sopenharmony_ci uint16_t InterfaceDesc; 13962306a36Sopenharmony_ci uint16_t MaxBufWriteSize; 14062306a36Sopenharmony_ci uint8_t NumEraseRegions; 14162306a36Sopenharmony_ci uint32_t EraseRegionInfo[]; /* Not host ordered */ 14262306a36Sopenharmony_ci} __packed; 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci/* Extended Query Structure for both PRI and ALT */ 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_cistruct cfi_extquery { 14762306a36Sopenharmony_ci uint8_t pri[3]; 14862306a36Sopenharmony_ci uint8_t MajorVersion; 14962306a36Sopenharmony_ci uint8_t MinorVersion; 15062306a36Sopenharmony_ci} __packed; 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_ci/* Vendor-Specific PRI for Intel/Sharp Extended Command Set (0x0001) */ 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_cistruct cfi_pri_intelext { 15562306a36Sopenharmony_ci uint8_t pri[3]; 15662306a36Sopenharmony_ci uint8_t MajorVersion; 15762306a36Sopenharmony_ci uint8_t MinorVersion; 15862306a36Sopenharmony_ci uint32_t FeatureSupport; /* if bit 31 is set then an additional uint32_t feature 15962306a36Sopenharmony_ci block follows - FIXME - not currently supported */ 16062306a36Sopenharmony_ci uint8_t SuspendCmdSupport; 16162306a36Sopenharmony_ci uint16_t BlkStatusRegMask; 16262306a36Sopenharmony_ci uint8_t VccOptimal; 16362306a36Sopenharmony_ci uint8_t VppOptimal; 16462306a36Sopenharmony_ci uint8_t NumProtectionFields; 16562306a36Sopenharmony_ci uint16_t ProtRegAddr; 16662306a36Sopenharmony_ci uint8_t FactProtRegSize; 16762306a36Sopenharmony_ci uint8_t UserProtRegSize; 16862306a36Sopenharmony_ci uint8_t extra[]; 16962306a36Sopenharmony_ci} __packed; 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_cistruct cfi_intelext_otpinfo { 17262306a36Sopenharmony_ci uint32_t ProtRegAddr; 17362306a36Sopenharmony_ci uint16_t FactGroups; 17462306a36Sopenharmony_ci uint8_t FactProtRegSize; 17562306a36Sopenharmony_ci uint16_t UserGroups; 17662306a36Sopenharmony_ci uint8_t UserProtRegSize; 17762306a36Sopenharmony_ci} __packed; 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_cistruct cfi_intelext_blockinfo { 18062306a36Sopenharmony_ci uint16_t NumIdentBlocks; 18162306a36Sopenharmony_ci uint16_t BlockSize; 18262306a36Sopenharmony_ci uint16_t MinBlockEraseCycles; 18362306a36Sopenharmony_ci uint8_t BitsPerCell; 18462306a36Sopenharmony_ci uint8_t BlockCap; 18562306a36Sopenharmony_ci} __packed; 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_cistruct cfi_intelext_regioninfo { 18862306a36Sopenharmony_ci uint16_t NumIdentPartitions; 18962306a36Sopenharmony_ci uint8_t NumOpAllowed; 19062306a36Sopenharmony_ci uint8_t NumOpAllowedSimProgMode; 19162306a36Sopenharmony_ci uint8_t NumOpAllowedSimEraMode; 19262306a36Sopenharmony_ci uint8_t NumBlockTypes; 19362306a36Sopenharmony_ci struct cfi_intelext_blockinfo BlockTypes[1]; 19462306a36Sopenharmony_ci} __packed; 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_cistruct cfi_intelext_programming_regioninfo { 19762306a36Sopenharmony_ci uint8_t ProgRegShift; 19862306a36Sopenharmony_ci uint8_t Reserved1; 19962306a36Sopenharmony_ci uint8_t ControlValid; 20062306a36Sopenharmony_ci uint8_t Reserved2; 20162306a36Sopenharmony_ci uint8_t ControlInvalid; 20262306a36Sopenharmony_ci uint8_t Reserved3; 20362306a36Sopenharmony_ci} __packed; 20462306a36Sopenharmony_ci 20562306a36Sopenharmony_ci/* Vendor-Specific PRI for AMD/Fujitsu Extended Command Set (0x0002) */ 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_cistruct cfi_pri_amdstd { 20862306a36Sopenharmony_ci uint8_t pri[3]; 20962306a36Sopenharmony_ci uint8_t MajorVersion; 21062306a36Sopenharmony_ci uint8_t MinorVersion; 21162306a36Sopenharmony_ci uint8_t SiliconRevision; /* bits 1-0: Address Sensitive Unlock */ 21262306a36Sopenharmony_ci uint8_t EraseSuspend; 21362306a36Sopenharmony_ci uint8_t BlkProt; 21462306a36Sopenharmony_ci uint8_t TmpBlkUnprotect; 21562306a36Sopenharmony_ci uint8_t BlkProtUnprot; 21662306a36Sopenharmony_ci uint8_t SimultaneousOps; 21762306a36Sopenharmony_ci uint8_t BurstMode; 21862306a36Sopenharmony_ci uint8_t PageMode; 21962306a36Sopenharmony_ci uint8_t VppMin; 22062306a36Sopenharmony_ci uint8_t VppMax; 22162306a36Sopenharmony_ci uint8_t TopBottom; 22262306a36Sopenharmony_ci /* Below field are added from version 1.5 */ 22362306a36Sopenharmony_ci uint8_t ProgramSuspend; 22462306a36Sopenharmony_ci uint8_t UnlockBypass; 22562306a36Sopenharmony_ci uint8_t SecureSiliconSector; 22662306a36Sopenharmony_ci uint8_t SoftwareFeatures; 22762306a36Sopenharmony_ci#define CFI_POLL_STATUS_REG BIT(0) 22862306a36Sopenharmony_ci#define CFI_POLL_DQ BIT(1) 22962306a36Sopenharmony_ci} __packed; 23062306a36Sopenharmony_ci 23162306a36Sopenharmony_ci/* Vendor-Specific PRI for Atmel chips (command set 0x0002) */ 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_cistruct cfi_pri_atmel { 23462306a36Sopenharmony_ci uint8_t pri[3]; 23562306a36Sopenharmony_ci uint8_t MajorVersion; 23662306a36Sopenharmony_ci uint8_t MinorVersion; 23762306a36Sopenharmony_ci uint8_t Features; 23862306a36Sopenharmony_ci uint8_t BottomBoot; 23962306a36Sopenharmony_ci uint8_t BurstMode; 24062306a36Sopenharmony_ci uint8_t PageMode; 24162306a36Sopenharmony_ci} __packed; 24262306a36Sopenharmony_ci 24362306a36Sopenharmony_cistruct cfi_pri_query { 24462306a36Sopenharmony_ci uint8_t NumFields; 24562306a36Sopenharmony_ci uint32_t ProtField[1]; /* Not host ordered */ 24662306a36Sopenharmony_ci} __packed; 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_cistruct cfi_bri_query { 24962306a36Sopenharmony_ci uint8_t PageModeReadCap; 25062306a36Sopenharmony_ci uint8_t NumFields; 25162306a36Sopenharmony_ci uint32_t ConfField[1]; /* Not host ordered */ 25262306a36Sopenharmony_ci} __packed; 25362306a36Sopenharmony_ci 25462306a36Sopenharmony_ci#define P_ID_NONE 0x0000 25562306a36Sopenharmony_ci#define P_ID_INTEL_EXT 0x0001 25662306a36Sopenharmony_ci#define P_ID_AMD_STD 0x0002 25762306a36Sopenharmony_ci#define P_ID_INTEL_STD 0x0003 25862306a36Sopenharmony_ci#define P_ID_AMD_EXT 0x0004 25962306a36Sopenharmony_ci#define P_ID_WINBOND 0x0006 26062306a36Sopenharmony_ci#define P_ID_ST_ADV 0x0020 26162306a36Sopenharmony_ci#define P_ID_MITSUBISHI_STD 0x0100 26262306a36Sopenharmony_ci#define P_ID_MITSUBISHI_EXT 0x0101 26362306a36Sopenharmony_ci#define P_ID_SST_PAGE 0x0102 26462306a36Sopenharmony_ci#define P_ID_SST_OLD 0x0701 26562306a36Sopenharmony_ci#define P_ID_INTEL_PERFORMANCE 0x0200 26662306a36Sopenharmony_ci#define P_ID_INTEL_DATA 0x0210 26762306a36Sopenharmony_ci#define P_ID_RESERVED 0xffff 26862306a36Sopenharmony_ci 26962306a36Sopenharmony_ci 27062306a36Sopenharmony_ci#define CFI_MODE_CFI 1 27162306a36Sopenharmony_ci#define CFI_MODE_JEDEC 0 27262306a36Sopenharmony_ci 27362306a36Sopenharmony_cistruct cfi_private { 27462306a36Sopenharmony_ci uint16_t cmdset; 27562306a36Sopenharmony_ci void *cmdset_priv; 27662306a36Sopenharmony_ci int interleave; 27762306a36Sopenharmony_ci int device_type; 27862306a36Sopenharmony_ci int cfi_mode; /* Are we a JEDEC device pretending to be CFI? */ 27962306a36Sopenharmony_ci int addr_unlock1; 28062306a36Sopenharmony_ci int addr_unlock2; 28162306a36Sopenharmony_ci struct mtd_info *(*cmdset_setup)(struct map_info *); 28262306a36Sopenharmony_ci struct cfi_ident *cfiq; /* For now only one. We insist that all devs 28362306a36Sopenharmony_ci must be of the same type. */ 28462306a36Sopenharmony_ci int mfr, id; 28562306a36Sopenharmony_ci int numchips; 28662306a36Sopenharmony_ci map_word sector_erase_cmd; 28762306a36Sopenharmony_ci unsigned long chipshift; /* Because they're of the same type */ 28862306a36Sopenharmony_ci const char *im_name; /* inter_module name for cmdset_setup */ 28962306a36Sopenharmony_ci unsigned long quirks; 29062306a36Sopenharmony_ci struct flchip chips[]; /* per-chip data structure for each chip */ 29162306a36Sopenharmony_ci}; 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_ciuint32_t cfi_build_cmd_addr(uint32_t cmd_ofs, 29462306a36Sopenharmony_ci struct map_info *map, struct cfi_private *cfi); 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_cimap_word cfi_build_cmd(u_long cmd, struct map_info *map, struct cfi_private *cfi); 29762306a36Sopenharmony_ci#define CMD(x) cfi_build_cmd((x), map, cfi) 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_ciunsigned long cfi_merge_status(map_word val, struct map_info *map, 30062306a36Sopenharmony_ci struct cfi_private *cfi); 30162306a36Sopenharmony_ci#define MERGESTATUS(x) cfi_merge_status((x), map, cfi) 30262306a36Sopenharmony_ci 30362306a36Sopenharmony_ciuint32_t cfi_send_gen_cmd(u_char cmd, uint32_t cmd_addr, uint32_t base, 30462306a36Sopenharmony_ci struct map_info *map, struct cfi_private *cfi, 30562306a36Sopenharmony_ci int type, map_word *prev_val); 30662306a36Sopenharmony_ci 30762306a36Sopenharmony_cistatic inline uint8_t cfi_read_query(struct map_info *map, uint32_t addr) 30862306a36Sopenharmony_ci{ 30962306a36Sopenharmony_ci map_word val = map_read(map, addr); 31062306a36Sopenharmony_ci 31162306a36Sopenharmony_ci if (map_bankwidth_is_1(map)) { 31262306a36Sopenharmony_ci return val.x[0]; 31362306a36Sopenharmony_ci } else if (map_bankwidth_is_2(map)) { 31462306a36Sopenharmony_ci return cfi16_to_cpu(map, val.x[0]); 31562306a36Sopenharmony_ci } else { 31662306a36Sopenharmony_ci /* No point in a 64-bit byteswap since that would just be 31762306a36Sopenharmony_ci swapping the responses from different chips, and we are 31862306a36Sopenharmony_ci only interested in one chip (a representative sample) */ 31962306a36Sopenharmony_ci return cfi32_to_cpu(map, val.x[0]); 32062306a36Sopenharmony_ci } 32162306a36Sopenharmony_ci} 32262306a36Sopenharmony_ci 32362306a36Sopenharmony_cistatic inline uint16_t cfi_read_query16(struct map_info *map, uint32_t addr) 32462306a36Sopenharmony_ci{ 32562306a36Sopenharmony_ci map_word val = map_read(map, addr); 32662306a36Sopenharmony_ci 32762306a36Sopenharmony_ci if (map_bankwidth_is_1(map)) { 32862306a36Sopenharmony_ci return val.x[0] & 0xff; 32962306a36Sopenharmony_ci } else if (map_bankwidth_is_2(map)) { 33062306a36Sopenharmony_ci return cfi16_to_cpu(map, val.x[0]); 33162306a36Sopenharmony_ci } else { 33262306a36Sopenharmony_ci /* No point in a 64-bit byteswap since that would just be 33362306a36Sopenharmony_ci swapping the responses from different chips, and we are 33462306a36Sopenharmony_ci only interested in one chip (a representative sample) */ 33562306a36Sopenharmony_ci return cfi32_to_cpu(map, val.x[0]); 33662306a36Sopenharmony_ci } 33762306a36Sopenharmony_ci} 33862306a36Sopenharmony_ci 33962306a36Sopenharmony_civoid cfi_udelay(int us); 34062306a36Sopenharmony_ci 34162306a36Sopenharmony_ciint __xipram cfi_qry_present(struct map_info *map, __u32 base, 34262306a36Sopenharmony_ci struct cfi_private *cfi); 34362306a36Sopenharmony_ciint __xipram cfi_qry_mode_on(uint32_t base, struct map_info *map, 34462306a36Sopenharmony_ci struct cfi_private *cfi); 34562306a36Sopenharmony_civoid __xipram cfi_qry_mode_off(uint32_t base, struct map_info *map, 34662306a36Sopenharmony_ci struct cfi_private *cfi); 34762306a36Sopenharmony_ci 34862306a36Sopenharmony_cistruct cfi_extquery *cfi_read_pri(struct map_info *map, uint16_t adr, uint16_t size, 34962306a36Sopenharmony_ci const char* name); 35062306a36Sopenharmony_cistruct cfi_fixup { 35162306a36Sopenharmony_ci uint16_t mfr; 35262306a36Sopenharmony_ci uint16_t id; 35362306a36Sopenharmony_ci void (*fixup)(struct mtd_info *mtd); 35462306a36Sopenharmony_ci}; 35562306a36Sopenharmony_ci 35662306a36Sopenharmony_ci#define CFI_MFR_ANY 0xFFFF 35762306a36Sopenharmony_ci#define CFI_ID_ANY 0xFFFF 35862306a36Sopenharmony_ci#define CFI_MFR_CONTINUATION 0x007F 35962306a36Sopenharmony_ci 36062306a36Sopenharmony_ci#define CFI_MFR_AMD 0x0001 36162306a36Sopenharmony_ci#define CFI_MFR_AMIC 0x0037 36262306a36Sopenharmony_ci#define CFI_MFR_ATMEL 0x001F 36362306a36Sopenharmony_ci#define CFI_MFR_EON 0x001C 36462306a36Sopenharmony_ci#define CFI_MFR_FUJITSU 0x0004 36562306a36Sopenharmony_ci#define CFI_MFR_HYUNDAI 0x00AD 36662306a36Sopenharmony_ci#define CFI_MFR_INTEL 0x0089 36762306a36Sopenharmony_ci#define CFI_MFR_MACRONIX 0x00C2 36862306a36Sopenharmony_ci#define CFI_MFR_NEC 0x0010 36962306a36Sopenharmony_ci#define CFI_MFR_PMC 0x009D 37062306a36Sopenharmony_ci#define CFI_MFR_SAMSUNG 0x00EC 37162306a36Sopenharmony_ci#define CFI_MFR_SHARP 0x00B0 37262306a36Sopenharmony_ci#define CFI_MFR_SST 0x00BF 37362306a36Sopenharmony_ci#define CFI_MFR_ST 0x0020 /* STMicroelectronics */ 37462306a36Sopenharmony_ci#define CFI_MFR_MICRON 0x002C /* Micron */ 37562306a36Sopenharmony_ci#define CFI_MFR_TOSHIBA 0x0098 37662306a36Sopenharmony_ci#define CFI_MFR_WINBOND 0x00DA 37762306a36Sopenharmony_ci 37862306a36Sopenharmony_civoid cfi_fixup(struct mtd_info *mtd, struct cfi_fixup* fixups); 37962306a36Sopenharmony_ci 38062306a36Sopenharmony_citypedef int (*varsize_frob_t)(struct map_info *map, struct flchip *chip, 38162306a36Sopenharmony_ci unsigned long adr, int len, void *thunk); 38262306a36Sopenharmony_ci 38362306a36Sopenharmony_ciint cfi_varsize_frob(struct mtd_info *mtd, varsize_frob_t frob, 38462306a36Sopenharmony_ci loff_t ofs, size_t len, void *thunk); 38562306a36Sopenharmony_ci 38662306a36Sopenharmony_ci 38762306a36Sopenharmony_ci#endif /* __MTD_CFI_H__ */ 388