--- zzzz-none-000/linux-4.4.271/drivers/staging/mt29f_spinand/mt29f_spinand.h 2021-06-03 06:22:09.000000000 +0000 +++ hawkeye-5590-750/linux-4.4.271/drivers/staging/mt29f_spinand/mt29f_spinand.h 2023-04-19 10:22:29.000000000 +0000 @@ -36,6 +36,7 @@ #define CMD_RESET 0xff #define CMD_READ_REG 0x0f #define CMD_WRITE_REG 0x1f +#define CMD_DIE_SELECT 0xC2 /* feature/ status reg */ #define REG_BLOCK_LOCK 0xa0 @@ -58,11 +59,24 @@ #define STATUS_ECC_ERROR BIT(5) #define STATUS_ECC_RESERVED (BIT(5) | BIT(4)) +#define STATUS_ECC_MASK_GIGA 0x70 +#define STATUS_ECC_ERROR_GIGA 0x70 +#define STATUS_ECC_BF_THRESHOLD_GIGA 0x40 +#define STATUS_ECC_MASK_MACRONIX 0x30 +#define STATUS_ECC_ERROR_MACRONIX 0x20 +#define STATUS_ECC_MASK_TOSHIBA 0x30 +#define STATUS_ECC_ERROR_TOSHIBA 0x20 +#define STATUS_ECC_BF_THRESHOLD_TOSHIBA 0x30 +#define SPINAND_ECC_ERROR 0x1 +#define SPINAND_ECC_CORRECTED 0x2 + /*ECC enable defines*/ #define OTP_ECC_MASK 0x10 #define OTP_ECC_OFF 0 #define OTP_ECC_ON 1 +#define OTP_WINBOND_BUFFERMODE 0x08 + #define ECC_DISABLED #define ECC_IN_NAND #define ECC_SOFT @@ -77,10 +91,43 @@ #define BL_1_64_LOCKED 0x08 #define BL_ALL_UNLOCKED 0 +struct spinand_cmd { + u8 cmd; + u32 n_addr; /* Number of address */ + u8 addr[3]; /* Reg Offset */ + u32 n_dummy; /* Dummy use */ + u32 n_tx; /* Number of tx bytes */ + u8 *tx_buf; /* Tx buf */ + u32 n_rx; /* Number of rx bytes */ + u8 *rx_buf; /* Rx buf */ +}; + +struct spinand_ops { + u8 maf_id; + u8 no_of_dies; + u16 dev_id; + int prev_die_id; + u64 pages_per_die; + void (*spinand_set_defaults)(struct spi_device *spi_nand); + void (*spinand_read_cmd)(struct spinand_cmd *cmd, u32 page_id); + void (*spinand_read_data)(struct spinand_cmd *cmd, u16 column, + u32 page_id); + void (*spinand_write_cmd)(struct spinand_cmd *cmd, u32 page_id); + void (*spinand_write_data)(struct spinand_cmd *cmd, u16 column, + u32 page_id); + void (*spinand_erase_blk)(struct spinand_cmd *cmd, u32 page_id); + int (*spinand_parse_id)(struct spi_device *spi_nand, + struct spinand_ops *ops, u8 *nand_id, u8 *id); + int (*spinand_verify_ecc)(u8 status); + int (*spinand_die_select)(struct spi_device *spi_nand, + struct spinand_ops *dev_ops, u8 die_id); +}; + struct spinand_info { struct nand_ecclayout *ecclayout; struct spi_device *spi; void *priv; + struct spinand_ops *dev_ops; }; struct spinand_state { @@ -90,17 +137,6 @@ u8 *buf; }; -struct spinand_cmd { - u8 cmd; - u32 n_addr; /* Number of address */ - u8 addr[3]; /* Reg Offset */ - u32 n_dummy; /* Dummy use */ - u32 n_tx; /* Number of tx bytes */ - u8 *tx_buf; /* Tx buf */ - u32 n_rx; /* Number of rx bytes */ - u8 *rx_buf; /* Rx buf */ -}; - int spinand_mtd(struct mtd_info *mtd); void spinand_mtd_release(struct mtd_info *mtd);