/* * Copyright (c) Hunan Goke,Chengdu Goke,Shandong Goke. 2021. All rights reserved. */ #include #include #include #include #include #include "../../fmc_spi_ids.h" #include "nfc_common.h" #include "fmc100.h" /*****************************************************************************/ set_read_std(1, INFINITE, 24); set_read_std(1, INFINITE, 108); //@@@@ set_read_fast(1, INFINITE, 60); set_read_fast(1, INFINITE, 80); set_read_fast(1, INFINITE, 100); set_read_fast(1, INFINITE, 104); set_read_fast(1, INFINITE, 108); set_read_fast(1, INFINITE, 120); set_read_fast(1, INFINITE, 133); set_read_dual(1, INFINITE, 60); set_read_dual(1, INFINITE, 80); set_read_dual(1, INFINITE, 100); set_read_dual(1, INFINITE, 104); set_read_dual(1, INFINITE, 108); set_read_dual(1, INFINITE, 120); set_read_dual(1, INFINITE, 133); set_read_dual_addr(1, INFINITE, 40); set_read_dual_addr(1, INFINITE, 60); set_read_dual_addr(1, INFINITE, 80); set_read_dual_addr(2, INFINITE, 80); set_read_dual_addr(2, INFINITE, 104); set_read_dual_addr(1, INFINITE, 100); set_read_dual_addr(1, INFINITE, 104); set_read_dual_addr(1, INFINITE, 108); set_read_dual_addr(1, INFINITE, 120); set_read_quad(1, INFINITE, 60); set_read_quad(1, INFINITE, 80); set_read_quad(1, INFINITE, 100); set_read_quad(1, INFINITE, 104); set_read_quad(1, INFINITE, 108); set_read_quad(1, INFINITE, 120); set_read_quad(1, INFINITE, 133); set_read_quad_addr(2, INFINITE, 40); set_read_quad_addr(1, INFINITE, 60); set_read_quad_addr(1, INFINITE, 80); set_read_quad_addr(2, INFINITE, 80); set_read_quad_addr(4, INFINITE, 80); set_read_quad_addr(4, INFINITE, 104); set_read_quad_addr(1, INFINITE, 100); set_read_quad_addr(1, INFINITE, 104); set_read_quad_addr(2, INFINITE, 104); set_read_quad_addr(1, INFINITE, 108); set_read_quad_addr(1, INFINITE, 120); /*****************************************************************************/ set_write_std(0, 256, 24); set_write_std(0, 256, 75); set_write_std(0, 256, 80); set_write_std(0, 256, 100); set_write_std(0, 256, 104); set_write_std(0, 256, 108); //@@@@ set_write_std(0, 256, 133); set_write_quad(0, 256, 80); set_write_quad(0, 256, 100); set_write_quad(0, 256, 104); set_write_quad(0, 256, 108); set_write_quad(0, 256, 120); set_write_quad(0, 256, 133); /*****************************************************************************/ set_erase_sector_128k(0, _128K, 24); set_erase_sector_128k(0, _128K, 75); set_erase_sector_128k(0, _128K, 80); set_erase_sector_128k(0, _128K, 104); set_erase_sector_128k(0, _128K, 108); //@@@@ set_erase_sector_128k(0, _128K, 133); set_erase_sector_256k(0, _256K, 24); set_erase_sector_256k(0, _256K, 75); set_erase_sector_256k(0, _256K, 80); set_erase_sector_256k(0, _256K, 100); set_erase_sector_256k(0, _256K, 104); set_erase_sector_256k(0, _256K, 108); //@@@@ set_erase_sector_256k(0, _256K, 133); /*****************************************************************************/ #include "fmc100_spi_general.c" static struct spi_drv spi_driver_general = { .wait_ready = spi_general_wait_ready, .write_enable = spi_general_write_enable, .qe_enable = spi_general_qe_enable, }; static struct spi_drv spi_driver_no_qe = { .wait_ready = spi_general_wait_ready, .write_enable = spi_general_write_enable, .qe_enable = spi_do_not_qe_enable, }; /*****************************************************************************/ #define SPI_NAND_ID_TAB_VER "2.7" /* ****** SPI Nand ID Table *************************************************** * Version Manufacturer Chip Name Size Operation * 1.0 ESMT F50L512M41A 64MB Add 5 chip * GD 5F1GQ4UAYIG 128MB * GD 5F2GQ4UAYIG 256MB * GD GD5F2GQ5UEYIG 256MB * GD 5F4GQ4UAYIG 512MB * GD 5F4GQ4UBYIG 512MB * GD 5F1GQ4RB9IG 128MB * GD 5F1GQ4UEYIHY 128MB * 1.1 ESMT F50L1G41A 128MB Add 2 chip * Winbond W25N01GV 128MB * Winbond W25N02JWZEIF 256MB 1.8V * 1.2 GD 5F1GQ4UBYIG 128MB Add 2 chip * GD 5F2GQ4U9IGR/BYIG 256MB * 1.3 ATO ATO25D1GA 128MB Add 1 chip * 1.4 MXIC MX35LF1GE4AB 128MB Add 2 chip * MXIC MX35LF2GE4AB 256MB (SOP-16Pin) * 1.5 Paragon PN26G01A 128MB Add 1 chip * 1.6 All-flash AFS1GQ4UAC 128MB Add 1 chip * 1.7 TOSHIBA TC58CVG0S3H 128MB Add 2 chip * TOSHIBA TC58CVG2S0H 512MB * 1.8 ALL-flash AFS2GQ4UAD 256MB Add 2 chip * Paragon PN26G02A 256MB * 1.9 TOSHIBA TC58CVG1S3H 256MB Add 1 chip * 2.0 HeYangTek HYF1GQ4UAACAE 128MB Add 3 chip * HeYangTek HYF2GQ4UAACAE 256MB * HeYangTek HYF4GQ4UAACBE 512MB * 2.1 Micron MT29F1G01ABA 128MB Add 5 chip * TOSHIBA 1.8V TC58CYG0S3H 128MB * TOSHIBA 1.8V TC58CYG1S3H 256MB * TOSHIBA 1.8V TC58CYG2S0H 512MB * Winbond 1.8V W25N01GWZEIG 128MB * 2.2 Micron MT29F2G01ABA 256MB Add 1 chip * 2.3 MXIC MX35LF2G14AC 256MB Add 1 chip * 2.4 GD 1.8V 5F4GQ4RAYIG 512MB Add 1 chip * 2.5 GD 1.8V 5F2GQ4RB9IGR 256MB Add 1 chip * GD 1.8V 5F4GQ6RE9IG 512MB * 2.6 MXIC 1.8V MX35UF1G14AC 128MB Add 4 chip * MXIC 1.8V MX35UF2G14AC 256MB * Micron 1.8V MT29F1G01ABB 128MB * Micron 1.8V MT29F2G01ABB 256MB * 2.7 Dosilicon DS35Q1GA-IB 128MB Add 2 chip * Dosilicon DS35Q2GA-IB 256MB * GD 5F1GQ4RB9IGR 128MB * Micron MT29F4G01ADAG 512MB Add 1 chip * GD 1.8V 5F4GQ4RBYIG 512MB Add 1 chip * Etron 1.8V EM78D044VCF-H 256MB * Etron 3.3V EM73C044VCC-H 128MB * XTX 3.3V XT26G01B 1Gbit 128MB * Micron 1.8V MT29F4G01ABBFDW 512MB Add 1 chip * FM FM25S01-DND-A-G 128MB 3.3V * HUAHONG FM25S01A 128MB 3.3V *****************************************************************************/ struct spi_nand_info fmc_spi_nand_flash_table[] = { /* Micron MT29F1G01ABA 1GBit */ { .name = "MT29F1G01ABA", .id = {0x2C, 0x14}, .id_len = _2B, .chipsize = _128M, .erasesize = _128K, .pagesize = _2K, .oobsize = _128B, .badblock_pos = BBP_FIRST_PAGE, .read = { /* dummy clock:1 byte, read size:INFINITE bytes, * clock frq:24MHz */ &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 80), /* 80MHz */ &read_dual(1, INFINITE, 80), /* 80MHz */ &read_dual_addr(1, INFINITE, 80), /* 80MHz */ &read_quad(1, INFINITE, 80), /* 80MHz */ &read_quad_addr(2, INFINITE, 80), /* 80MHz */ 0 }, .write = { /* dummy clock:0byte, erase size:64K, * clock frq:80MHz */ &write_std(0, 256, 80), /* 80MHz */ &write_quad(0, 256, 80), /* 80MHz */ 0 }, .erase = { /* dummy clock:0byte, erase size:128K, clock frq:80MHz */ &erase_sector_128k(0, _128K, 80), /* 80MHz */ 0 }, .driver = &spi_driver_no_qe, }, /* Micron MT29F1G01ABB 1GBit 1.8V */ { .name = "MT29F1G01ABB", .id = {0x2C, 0x15}, .id_len = _2B, .chipsize = _128M, .erasesize = _128K, .pagesize = _2K, .oobsize = _128B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 80), /* 80MHz */ &read_dual(1, INFINITE, 80), /* 80MHz */ &read_dual_addr(1, INFINITE, 80), /* 80MHz */ &read_quad(1, INFINITE, 80), /* 80MHz */ &read_quad_addr(2, INFINITE, 80), /* 80MHz */ 0 }, .write = { &write_std(0, 256, 80), /* 80MHz */ &write_quad(0, 256, 80), /* 80MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 80), /* 80MHz */ 0 }, .driver = &spi_driver_no_qe, }, /* Micron MT29F2G01ABA 2GBit */ { .name = "MT29F2G01ABA", .id = {0x2C, 0x24}, .id_len = _2B, .chipsize = _256M, .erasesize = _128K, .pagesize = _2K, .oobsize = _128B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 108), /* 108MHz */ &read_dual(1, INFINITE, 108), /* 108MHz */ &read_dual_addr(1, INFINITE, 108), /* 108MHz */ &read_quad(1, INFINITE, 108), /* 108MHz */ &read_quad_addr(2, INFINITE, 104), /* 104MHz */ 0 }, .write = { &write_std(0, 256, 80), /* 80MHz */ &write_quad(0, 256, 108), /* 108MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 80), /* 80MHz */ 0 }, .driver = &spi_driver_no_qe, }, /* Micron MT29F2G01ABB 2GBit 1.8V */ { .name = "MT29F2G01ABB", .id = {0x2C, 0x25}, .id_len = _2B, .chipsize = _256M, .erasesize = _128K, .pagesize = _2K, .oobsize = _128B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 80), /* 80MHz */ &read_dual(1, INFINITE, 80), /* 80MHz */ &read_dual_addr(1, INFINITE, 80), /* 80MHz */ &read_quad(1, INFINITE, 80), /* 80MHz */ &read_quad_addr(2, INFINITE, 80), /* 80MHz */ 0 }, .write = { &write_std(0, 256, 80), /* 80MHz */ &write_quad(0, 256, 80), /* 80MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 80), /* 80MHz */ 0 }, .driver = &spi_driver_no_qe, }, /* Micron MT29F4G01ADAG 4GBit 3.3V */ { .name = "MT29F4G01ADAG", .id = {0x2C, 0x36}, .id_len = _2B, .chipsize = _512M, .erasesize = _128K, .pagesize = _2K, .oobsize = _128B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 80), /* 80MHz */ &read_dual(1, INFINITE, 80), /* 80MHz */ &read_dual_addr(1, INFINITE, 80), /* 80MHz */ &read_quad(1, INFINITE, 80), /* 80MHz */ &read_quad_addr(2, INFINITE, 80), /* 80MHz */ 0 }, .write = { &write_std(0, 256, 80), /* 80MHz */ &write_quad(0, 256, 80), /* 80MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 80), /* 80MHz */ 0 }, .driver = &spi_driver_no_qe, }, /* Micron MT29F4G01ABBFDWB 4GBit 1.8V */ { .name = "MT29F4G01ABBFDWB", .id = {0x2C, 0x35}, .id_len = _2B, .chipsize = _512M, .erasesize = _256K, .pagesize = _4K, .oobsize = _256B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 80), /* 80MHz */ &read_dual(1, INFINITE, 80), /* 80MHz */ &read_quad(1, INFINITE, 80), /* 80MHz */ 0 }, .write = { &write_std(0, 256, 80), /* 80MHz */ &write_quad(0, 256, 80), /* 80MHz */ 0 }, .erase = { &erase_sector_256k(0, _256K, 80), /* 80MHz */ 0 }, .driver = &spi_driver_no_qe, }, /* ESMT F50L512M41A 512Mbit */ { .name = "F50L512M41A", .id = {0xC8, 0x20}, .id_len = _2B, .chipsize = _64M, .erasesize = _128K, .pagesize = _2K, .oobsize = _64B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 104), /* 104MHz */ &read_dual(1, INFINITE, 104), /* 104MHz */ &read_quad(1, INFINITE, 104), /* 104MHz */ 0 }, .write = { &write_std(0, 256, 24), /* 24MHz */ &write_quad(0, 256, 104), /* 104MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 24), /* 24MHz */ 0 }, .driver = &spi_driver_no_qe, }, /* ESMT F50L1G41A 1Gbit */ { .name = "F50L1G41A", .id = {0xC8, 0x21}, .id_len = _2B, .chipsize = _128M, .erasesize = _128K, .pagesize = _2K, .oobsize = _64B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 104), /* 104MHz */ &read_dual(1, INFINITE, 104), /* 104MHz */ &read_quad(1, INFINITE, 104), /* 104MHz */ 0 }, .write = { &write_std(0, 256, 24), /* 24MHz */ &write_quad(0, 256, 104), /* 104MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 24), /* 24MHz */ 0 }, .driver = &spi_driver_no_qe, }, /* GD 3.3v GD5F1GQ4UAYIG 1Gbit */ { .name = "GD5F1GQ4UAYIG", .id = {0xc8, 0xf1}, .id_len = _2B, .chipsize = _128M, .erasesize = _128K, .pagesize = _2K, .oobsize = _64B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 120), /* 120MHz */ &read_dual(1, INFINITE, 120), /* 120MHz */ &read_dual_addr(1, INFINITE, 120), /* 120MHz */ &read_quad(1, INFINITE, 120), /* 120MHz */ &read_quad_addr(1, INFINITE, 120), /* 120MHz */ 0 }, .write = { &write_std(0, 256, 24), /* 24MHz */ &write_quad(0, 256, 120), /* 120MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 24), /* 24MHz */ 0 }, .driver = &spi_driver_general, }, /* GD 1.8v GD5F1GQ4RB9IG 1Gbit */ { .name = "GD5F1GQ4RB9IG", .id = {0xc8, 0xc1}, .id_len = _2B, .chipsize = _128M, .erasesize = _128K, .pagesize = _2K, .oobsize = _128B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 120), /* 120MHz */ &read_dual(1, INFINITE, 120), /* 120MHz */ &read_dual_addr(1, INFINITE, 120), /* 120MHz */ &read_quad(1, INFINITE, 120), /* 120MHz */ &read_quad_addr(1, INFINITE, 120), /* 120MHz */ 0 }, .write = { &write_std(0, 256, 24), /* 24MHz */ &write_quad(0, 256, 120), /* 120MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 24), /* 24MHz */ 0 }, .driver = &spi_driver_general, }, /* GD 3.3v GD5F1GQ4UBYIG 1Gbit */ { .name = "GD5F1GQ4UBYIG", .id = {0xc8, 0xd1}, .id_len = _2B, .chipsize = _128M, .erasesize = _128K, .pagesize = _2K, .oobsize = _128B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 120), /* 120MHz */ &read_dual(1, INFINITE, 120), /* 120MHz */ &read_dual_addr(1, INFINITE, 120), /* 120MHz */ &read_quad(1, INFINITE, 120), /* 120MHz */ &read_quad_addr(1, INFINITE, 120), /* 120MHz */ 0 }, .write = { &write_std(0, 256, 24), /* 24MHz */ &write_quad(0, 256, 120), /* 120MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 24), /* 24MHz */ 0 }, .driver = &spi_driver_general, }, /* GD 3.3v GD5F2GQ4UAYIG 2Gbit */ { .name = "GD5F2GQ4UAYIG", .id = {0xc8, 0xf2}, .id_len = _2B, .chipsize = _256M, .erasesize = _128K, .pagesize = _2K, .oobsize = _64B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 120), /* 120MHz */ &read_dual(1, INFINITE, 120), /* 120MHz */ &read_dual_addr(1, INFINITE, 120), /* 120MHz */ &read_quad(1, INFINITE, 120), /* 120MHz */ &read_quad_addr(1, INFINITE, 120), /* 120MHz */ 0 }, .write = { &write_std(0, 256, 24), /* 24MHz */ &write_quad(0, 256, 120), /* 120MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 24), /* 24MHz */ 0 }, .driver = &spi_driver_general, }, /* GD 3.3v GD5F2GQ4U9IGR/BYIG 2Gbit */ { .name = "GD5F2GQ4U9IGR/BYIG", .id = {0xc8, 0xd2}, .id_len = _2B, .chipsize = _256M, .erasesize = _128K, .pagesize = _2K, .oobsize = _128B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 120), /* 120MHz */ &read_dual(1, INFINITE, 120), /* 120MHz */ &read_dual_addr(1, INFINITE, 120), /* 120MHz */ &read_quad(1, INFINITE, 120), /* 120MHz */ &read_quad_addr(1, INFINITE, 120), /* 120MHz */ 0 }, .write = { &write_std(0, 256, 24), /* 24MHz */ &write_quad(0, 256, 120), /* 120MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 24), /* 24MHz */ 0 }, .driver = &spi_driver_general, }, /* GD 3.3v GD5F4GQ4UAYIG 4Gbit */ { .name = "GD5F4GQ4UAYIG", .id = {0xc8, 0xf4}, .id_len = _2B, .chipsize = _512M, .erasesize = _128K, .pagesize = _2K, .oobsize = _64B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 120), /* 120MHz */ &read_dual(1, INFINITE, 120), /* 120MHz */ &read_dual_addr(1, INFINITE, 120), /* 120MHz */ &read_quad(1, INFINITE, 120), /* 120MHz */ &read_quad_addr(1, INFINITE, 120), /* 120MHz */ 0 }, .write = { &write_std(0, 256, 24), /* 24MHz */ &write_quad(0, 256, 120), /* 120MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 24), /* 24MHz */ 0 }, .driver = &spi_driver_general, }, /* GD 3.3v GD5F4GQ6UEYIG 4Gbit */ { .name = "GD5F4GQ6UEYIG", .id = {0xc8, 0x55}, .id_len = _2B, .chipsize = _512M, .erasesize = _128K, .pagesize = _2K, .oobsize = _128B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 104), /* 104MHz */ &read_dual(1, INFINITE, 104), /* 104MHz */ &read_dual_addr(2, INFINITE, 104), /* 104MHz */ &read_quad(1, INFINITE, 104), /* 104MHz */ &read_quad_addr(4, INFINITE, 104), /* 104MHz */ 0 }, .write = { &write_std(0, 256, 24), /* 24MHz */ &write_quad(0, 256, 104), /* 104MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 104), /* 104MHz */ 0 }, .driver = &spi_driver_general, }, /* GD 3.3v GD5F4GQ4UBYIG 4Gbit */ { .name = "GD5F4GQ4UBYIG", .id = {0xc8, 0xd4}, .id_len = _2B, .chipsize = _512M, .erasesize = _256K, .pagesize = _4K, .oobsize = _256B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 120), /* 120MHz */ &read_dual(1, INFINITE, 120), /* 120MHz */ &read_dual_addr(1, INFINITE, 120), /* 120MHz */ &read_quad(1, INFINITE, 120), /* 120MHz */ &read_quad_addr(1, INFINITE, 120), /* 120MHz */ 0 }, .write = { &write_std(0, 256, 24), /* 24MHz */ &write_quad(0, 256, 120), /* 120MHz */ 0 }, .erase = { &erase_sector_256k(0, _256K, 24), /* 24MHz */ 0 }, .driver = &spi_driver_general, }, /* GD 3.3v GD5F1GQ4UEYIHY 1Gbit */ { .name = "GD5F1GQ4UEYIHY", .id = {0xc8, 0xd9}, .id_len = _2B, .chipsize = _128M, .erasesize = _128K, .pagesize = _2K, .oobsize = _64B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 120), /* 120MHz */ &read_dual(1, INFINITE, 120), /* 120MHz */ &read_dual_addr(1, INFINITE, 120), /* 120MHz */ &read_quad(1, INFINITE, 120), /* 120MHz */ &read_quad_addr(1, INFINITE, 120), /* 120MHz */ 0 }, .write = { &write_std(0, 256, 104), /* 104MHz */ &write_quad(0, 256, 120), /* 120MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 104), /* 104MHz */ 0 }, .driver = &spi_driver_general, }, /* GD 3.3v GD5F1GQ5UEYIGY/GD5F1GQ5UEYIGR 1Gbit */ { .name = "GD5F1GQ5UEYIG", .id = {0xc8, 0x51}, .id_len = _2B, .chipsize = _128M, .erasesize = _128K, .pagesize = _2K, .oobsize = _128B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 133), /* 133MHz */ &read_dual(1, INFINITE, 133), /* 133MHz */ &read_quad(1, INFINITE, 133), /* 133MHz */ 0 }, .write = { &write_std(0, 256, 133), /* 133MHz */ &write_quad(0, 256, 133), /* 133MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 133), /* 133MHz */ 0 }, .driver = &spi_driver_general, }, /* GD 3.3v GD5F2GQ5UEYIG 2Gbit */ { .name = "GD5F2GQ5UEYIG", .id = {0xc8, 0x52}, .id_len = _2B, .chipsize = _256M, .erasesize = _128K, .pagesize = _2K, .oobsize = _128B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 104), /* 104MHz */ &read_dual(1, INFINITE, 104), /* 104MHz */ &read_dual_addr(2, INFINITE, 104), /* 104MHz */ &read_quad(1, INFINITE, 104), /* 104MHz */ &read_quad_addr(4, INFINITE, 104), /* 104MHz */ 0 }, .write = { &write_std(0, 256, 104), /* 104MHz */ &write_quad(0, 256, 104), /* 104MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 104), /* 104MHz */ 0 }, .driver = &spi_driver_general, }, /* GD 1.8V GD5F1GQ4RB9IGR 1Gbit */ { .name = "GD5F1GQ4RB9IGR", .id = {0xc8, 0xc1}, .id_len = _2B, .chipsize = _128M, .erasesize = _128K, .pagesize = _2K, .oobsize = _128B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 104), /* 104MHz */ &read_dual(1, INFINITE, 104), /* 104MHz */ &read_dual_addr(1, INFINITE, 104), &read_quad(1, INFINITE, 104), /* 104MHz */ &read_quad_addr(1, INFINITE, 104), 0 }, .write = { &write_std(0, 256, 24), /* 24MHz */ &write_quad(0, 256, 104), /* 104MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 24), /* 24MHz */ 0 }, .driver = &spi_driver_general, }, /* GD 1.8V GD5F2GQ4RB9IGR 2Gbit */ { .name = "GD5F2GQ4RB9IGR", .id = {0xc8, 0xc2}, .id_len = _2B, .chipsize = _256M, .erasesize = _128K, .pagesize = _2K, .oobsize = _128B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 104), /* 104MHz */ &read_dual(1, INFINITE, 104), /* 104MHz */ &read_dual_addr(1, INFINITE, 104), &read_quad(1, INFINITE, 104), /* 104MHz */ &read_quad_addr(1, INFINITE, 104), 0 }, .write = { &write_std(0, 256, 24), /* 24MHz */ &write_quad(0, 256, 104), /* 104MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 24), /* 24MHz */ 0 }, .driver = &spi_driver_general, }, /* GD 1.8V 5F4GQ6RE9IG 4Gbit */ { .name = "GD5F4GQ6RE9IG", .id = {0xc8, 0x45}, .id_len = 2, .chipsize = _512M, .erasesize = _128K, .pagesize = _2K, .oobsize = _128B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), &read_fast(1, INFINITE, 80), &read_dual(1, INFINITE, 80), &read_dual_addr(2, INFINITE, 80), &read_quad(1, INFINITE, 80), &read_quad_addr(4, INFINITE, 80), 0 }, .write = { &write_std(0, 256, 80), &write_quad(0, 256, 80), 0 }, .erase = { &erase_sector_128k(0, _128K, 80), 0 }, .driver = &spi_driver_general, }, /* GD 1.8V GD5F4GQ4RAYIG 4Gbit */ { .name = "GD5F4GQ4RAYIG", .id = {0xc8, 0xe4}, .id_len = _2B, .chipsize = _512M, .erasesize = _256K, .pagesize = _4K, .oobsize = _256B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 104), /* 104MHz */ &read_dual(1, INFINITE, 104), /* 104MHz */ &read_dual_addr(1, INFINITE, 104), &read_quad(1, INFINITE, 104), /* 104MHz */ &read_quad_addr(1, INFINITE, 104), 0 }, .write = { &write_std(0, 256, 24), /* 24MHz */ &write_quad(0, 256, 104), /* 104MHz */ 0 }, .erase = { &erase_sector_256k(0, _256K, 24), /* 24MHz */ 0 }, .driver = &spi_driver_general, }, /* GD 1.8V GD5F4GQ4RBYIG 4Gbit */ { .name = "GD5F4GQ4RBYIG", .id = {0xc8, 0xc4}, .id_len = _2B, .chipsize = _512M, .erasesize = _256K, .pagesize = _4K, .oobsize = _256B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 120), /* 120MHz */ &read_dual(1, INFINITE, 120), /* 120MHz */ &read_dual_addr(1, INFINITE, 120), /* 120MHz */ &read_quad(1, INFINITE, 120), /* 120MHz */ &read_quad_addr(1, INFINITE, 120), /* 120MHz */ 0 }, .write = { &write_std(0, 256, 24), /* 24MHz */ &write_quad(0, 256, 120), /* 120MHz */ 0 }, .erase = { &erase_sector_256k(0, _256K, 24), /* 24MHz */ 0 }, .driver = &spi_driver_general, }, /* Winbond 1.8V W25N02JWZEIF 2Gbit */ { .name = "W25N02JWZEIF", .id = {0xef, 0xbf, 0x22}, .id_len = _3B, .chipsize = _256M, .erasesize = _128K, .pagesize = _2K, .oobsize = _64B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 120), /* 120MHz */ &read_dual(1, INFINITE, 120), /* 120MHz */ &read_dual_addr(1, INFINITE, 120), /* 120MHz */ &read_quad(1, INFINITE, 120), /* 120MHz */ &read_quad_addr(2, INFINITE, 104), /* 104MHz */ 0 }, .write = { &write_std(0, 256, 104), /* 104MHz */ &write_quad(0, 256, 104), /* 104MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 104), /* 104MHz */ 0 }, .driver = &spi_driver_general, }, /* Winbond W25N01GV 1Gbit 3.3V */ { .name = "W25N01GV", .id = {0xef, 0xaa, 0x21}, .id_len = _3B, .chipsize = _128M, .erasesize = _128K, .pagesize = _2K, .oobsize = _64B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 104), /* 104MHz */ &read_dual(1, INFINITE, 104), /* 104MHz */ &read_dual_addr(1, INFINITE, 104), &read_quad(1, INFINITE, 104), /* 104MHz */ &read_quad_addr(2, INFINITE, 104), /* 104MHz */ 0 }, .write = { &write_std(0, 256, 24), /* 24MHz */ &write_quad(0, 256, 104), /* 104MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 24), /* 24MHz */ 0 }, .driver = &spi_driver_no_qe, }, /* Winbond W25N01GWZEIG 1Gbit 1.8V */ { .name = "W25N01GWZEIG", .id = {0xef, 0xba, 0x21}, .id_len = _3B, .chipsize = _128M, .erasesize = _128K, .pagesize = _2K, .oobsize = _64B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 104), /* 104MHz */ &read_dual(1, INFINITE, 104), /* 104MHz */ &read_dual_addr(1, INFINITE, 104), &read_quad(1, INFINITE, 104), /* 104MHz */ &read_quad_addr(2, INFINITE, 104), /* 104MHz */ 0 }, .write = { &write_std(0, 256, 24), /* 24MHz */ &write_quad(0, 256, 80), /* 80MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 24), /* 24MHz */ 0 }, .driver = &spi_driver_no_qe, }, /* ATO ATO25D1GA 1Gbit */ { .name = "ATO25D1GA", .id = {0x9b, 0x12}, .id_len = _2B, .chipsize = _128M, .erasesize = _128K, .pagesize = _2K, .oobsize = _64B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 104), /* 104MHz */ &read_quad(1, INFINITE, 104), /* 104MHz */ 0 }, .write = { &write_std(0, 256, 24), /* 24MHz */ &write_quad(0, 256, 104), /* 104MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 24), /* 24MHz */ 0 }, .driver = &spi_driver_general, }, /* MXIC MX35LF1GE4AB 1Gbit */ { .name = "MX35LF1GE4AB", .id = {0xc2, 0x12}, .id_len = _2B, .chipsize = _128M, .erasesize = _128K, .pagesize = _2K, .oobsize = _64B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 104), /* 104MHz */ &read_quad(1, INFINITE, 104), /* 104MHz */ 0 }, .write = { &write_std(0, 256, 24), /* 24MHz */ &write_quad(0, 256, 104), /* 104MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 24), /* 24MHz */ 0 }, .driver = &spi_driver_general, }, /* MXIC MX35UF1G14AC 1Gbit 1.8V */ { .name = "MX35UF1G14AC", .id = {0xc2, 0x90}, .id_len = _2B, .chipsize = _128M, .erasesize = _128K, .pagesize = _2K, .oobsize = _64B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 104), /* 104MHz */ &read_quad(1, INFINITE, 104), /* 104MHz */ 0 }, .write = { &write_std(0, 256, 24), /* 24MHz */ &write_quad(0, 256, 104), /* 104MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 104), /* 104MHz */ 0 }, .driver = &spi_driver_general, }, /* MXIC MX35LF2GE4AB 2Gbit SOP-16Pin */ { .name = "MX35LF2GE4AB", .id = {0xc2, 0x22}, .id_len = _2B, .chipsize = _256M, .erasesize = _128K, .pagesize = _2K, .oobsize = _64B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 104), /* 104MHz */ &read_quad(1, INFINITE, 104), /* 104MHz */ 0 }, .write = { &write_std(0, 256, 24), /* 24MHz */ &write_quad(0, 256, 104), /* 104MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 24), /* 24MHz */ 0 }, .driver = &spi_driver_general, }, /* MXIC MX35LF2G14AC 2GBit */ { .name = "MX35LF2G14AC", .id = {0xc2, 0x20}, .id_len = _2B, .chipsize = _256M, .erasesize = _128K, .pagesize = _2K, .oobsize = _64B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 104), /* 104MHz */ &read_quad(1, INFINITE, 104), /* 104MHz */ 0 }, .write = { &write_std(0, 256, 24), /* 24MHz */ &write_quad(0, 256, 104), /* 104MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 24), /* 24MHz */ 0 }, .driver = &spi_driver_general, }, /* MXIC MX35UF2G14AC 2Gbit 1.8V */ { .name = "MX35UF2G14AC", .id = {0xc2, 0xa0}, .id_len = _2B, .chipsize = _256M, .erasesize = _128K, .pagesize = _2K, .oobsize = _64B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 104), /* 104MHz */ &read_quad(1, INFINITE, 104), /* 104MHz */ 0 }, .write = { &write_std(0, 256, 24), /* 24MHz */ &write_quad(0, 256, 104), /* 104MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 104), /* 104MHz */ 0 }, .driver = &spi_driver_general, }, /* Paragon PN26G01A 1Gbit */ { .name = "PN26G01A", .id = {0xa1, 0xe1}, .id_len = _2B, .chipsize = _128M, .erasesize = _128K, .pagesize = _2K, .oobsize = _128B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 108), /* 108MHz */ &read_dual(1, INFINITE, 108), /* 108MHz */ &read_dual_addr(1, INFINITE, 108), /* 108MHz */ &read_quad(1, INFINITE, 108), /* 108MHz */ &read_quad_addr(1, INFINITE, 108), /* 108MHz */ 0 }, .write = { &write_std(0, 256, 24), /* 24MHz */ &write_quad(0, 256, 108), /* 108MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 24), /* 24MHz */ 0 }, .driver = &spi_driver_general, }, /* Paragon PN26G02A 2Gbit */ { .name = "PN26G02A", .id = {0xa1, 0xe2}, .id_len = _2B, .chipsize = _256M, .erasesize = _128K, .pagesize = _2K, .oobsize = _128B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 108), /* 108MHz */ &read_dual(1, INFINITE, 108), /* 108MHz */ &read_dual_addr(1, INFINITE, 108), /* 108MHz */ &read_quad(1, INFINITE, 108), /* 108MHz */ &read_quad_addr(1, INFINITE, 108), /* 108MHz */ 0 }, .write = { &write_std(0, 256, 24), /* 24MHz */ &write_quad(0, 256, 108), /* 108MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 24), /* 24MHz */ 0 }, .driver = &spi_driver_general, }, /* All-flash AFS1GQ4UAC 1Gbit */ { .name = "AFS1GQ4UAC", .id = {0xc1, 0x51}, .id_len = _2B, .chipsize = _128M, .erasesize = _128K, .pagesize = _2K, .oobsize = _128B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 80), /* 80MHz */ &read_dual(1, INFINITE, 80), /* 80MHz */ &read_dual_addr(1, INFINITE, 80), /* 80MHz */ &read_quad(1, INFINITE, 80), /* 80MHz */ &read_quad_addr(1, INFINITE, 80), /* 80MHz */ 0 }, .write = { &write_std(0, 256, 24), /* 24MHz */ &write_quad(0, 256, 80), /* 80MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 24), /* 24MHz */ 0 }, .driver = &spi_driver_general, }, /* All-flash AFS2GQ4UAD 2Gbit */ { .name = "AFS2GQ4UAD", .id = {0xc1, 0x52}, .id_len = _2B, .chipsize = _256M, .erasesize = _128K, .pagesize = _2K, .oobsize = _128B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 80), /* 80MHz */ &read_dual(1, INFINITE, 80), /* 80MHz */ &read_dual_addr(1, INFINITE, 80), /* 80MHz */ &read_quad(1, INFINITE, 80), /* 80MHz */ &read_quad_addr(1, INFINITE, 80), /* 80MHz */ 0 }, .write = { &write_std(0, 256, 24), /* 24MHz */ &write_quad(0, 256, 80), /* 80MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 24), /* 24MHz */ 0 }, .driver = &spi_driver_general, }, /* TOSHIBA TC58CVG0S3H 1Gbit */ { .name = "TC58CVG0S3H", .id = {0x98, 0xc2}, .id_len = _2B, .chipsize = _128M, .erasesize = _128K, .pagesize = _2K, .oobsize = _128B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 104), /* 104MHz */ &read_dual(1, INFINITE, 104), /* 104MHz */ &read_quad(1, INFINITE, 104), /* 104MHz */ 0 }, .write = { &write_std(0, 256, 104), /* 104MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 104), /* 104MHz */ 0 }, .driver = &spi_driver_no_qe, }, /* TOSHIBA TC58CYG0S3H 1.8V 1Gbit */ { .name = "TC58CYG0S3H", .id = {0x98, 0xb2}, .id_len = _2B, .chipsize = _128M, .erasesize = _128K, .pagesize = _2K, .oobsize = _128B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 104), /* 104MHz */ &read_dual(1, INFINITE, 104), /* 104MHz */ &read_quad(1, INFINITE, 104), /* 104MHz */ 0 }, .write = { &write_std(0, 256, 104), /* 104MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 104), /* 104MHz */ 0 }, .driver = &spi_driver_no_qe, }, /* TOSHIBA TC58CYG0S3HRAIJ 1.8V 1Gbit */ { .name = "TC58CYG0S3HRAIJ", .id = {0x98, 0xD2, 0x40}, .id_len = _3B, .chipsize = _128M, .erasesize = _128K, .pagesize = _2K, .oobsize = _128B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 133), /* 133MHz */ &read_dual(1, INFINITE, 133), /* 133MHz */ &read_quad(1, INFINITE, 133), /* 133MHz */ 0 }, .write = { &write_std(0, 256, 133), /* 133MHz */ &write_quad(0, 256, 133), /* 133MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 133), /* 133MHz */ 0 }, .driver = &spi_driver_no_qe, }, /* TOSHIBA TC58CVG1S3H 2Gbit */ { .name = "TC58CVG1S3H", .id = {0x98, 0xcb}, .id_len = _2B, .chipsize = _256M, .erasesize = _128K, .pagesize = _2K, .oobsize = _128B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 104), /* 104MHz */ &read_dual(1, INFINITE, 104), /* 104MHz */ &read_quad(1, INFINITE, 104), /* 104MHz */ 0 }, .write = { &write_std(0, 256, 104), /* 104MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 104), /* 104MHz */ 0 }, .driver = &spi_driver_no_qe, }, /* TOSHIBA TC58CYG1S3H 1.8V 2Gbit */ { .name = "TC58CYG1S3H", .id = {0x98, 0xbb}, .id_len = _2B, .chipsize = _256M, .erasesize = _128K, .pagesize = _2K, .oobsize = _128B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 104), /* 104MHz */ &read_dual(1, INFINITE, 104), /* 104MHz */ &read_quad(1, INFINITE, 104), /* 104MHz */ 0 }, .write = { &write_std(0, 256, 75), /* 75MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 75), /* 75MHz */ 0 }, .driver = &spi_driver_no_qe, }, /* TOSHIBA TC58CVG1S3HRAIJ 3.3V 2Gbit */ { .name = "TC58CVG1S3HRAIJ", .id = {0x98, 0xeb, 0x40}, .id_len = _3B, .chipsize = _256M, .erasesize = _128K, .pagesize = _2K, .oobsize = _128B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 133), /* 133MHz */ &read_dual(1, INFINITE, 133), /* 133MHz */ &read_quad(1, INFINITE, 133), /* 133MHz */ 0 }, .write = { &write_std(0, 256, 133), /* 133MHz */ &write_quad(0, 256, 133), /* 133MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 133), /* 133MHz */ 0 }, .driver = &spi_driver_no_qe, }, /* TOSHIBA TC58CVG2S0H 4Gbit */ { .name = "TC58CVG2S0H", .id = {0x98, 0xcd}, .id_len = _2B, .chipsize = _512M, .erasesize = _256K, .pagesize = _4K, .oobsize = _256B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 104), /* 104MHz */ &read_dual(1, INFINITE, 104), /* 104MHz */ &read_quad(1, INFINITE, 104), /* 104MHz */ 0 }, .write = { &write_std(0, 256, 104), /* 104MHz */ 0 }, .erase = { &erase_sector_256k(0, _256K, 104), /* 104MHz */ 0 }, .driver = &spi_driver_no_qe, }, /* TOSHIBA TC58CYG2S0H 1.8V 4Gbit */ { .name = "TC58CYG2S0H", .id = {0x98, 0xbd}, .id_len = _2B, .chipsize = _512M, .erasesize = _256K, .pagesize = _4K, .oobsize = _256B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 104), /* 104MHz */ &read_dual(1, INFINITE, 104), /* 104MHz */ &read_quad(1, INFINITE, 104), /* 104MHz */ 0 }, .write = { &write_std(0, 256, 75), /* 75MHz */ 0 }, .erase = { &erase_sector_256k(0, _256K, 75), /* 75MHz */ 0 }, .driver = &spi_driver_no_qe, }, /* KIOXIA TC58CYG2S0HRAIJ 1.8V 4Gbit */ { .name = "TC58CYG2S0HRAIJ", .id = {0x98, 0xdd, 0x51}, .id_len = _3B, .chipsize = _512M, .erasesize = _256K, .pagesize = _4K, .oobsize = _256B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 133), /* 133MHz */ &read_dual(1, INFINITE, 133), /* 133MHz */ &read_quad(1, INFINITE, 133), /* 133MHz */ 0 }, .write = { &write_std(0, 256, 133), /* 133MHz */ &write_quad(0, 256, 133), /* 133MHz */ 0 }, .erase = { &erase_sector_256k(0, _256K, 133), /* 133MHz */ 0 }, .driver = &spi_driver_no_qe, }, /* KIOXIA TH58CYG3S0H 1.8V 8Gbit */ { .name = "TH58CYG3S0H", .id = {0x98, 0xd4, 0x51}, .id_len = _3B, .chipsize = _1G, .erasesize = _256K, .pagesize = _4K, .oobsize = _256B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 133), /* 133MHz */ &read_dual(1, INFINITE, 133), /* 133MHz */ &read_quad(1, INFINITE, 133), /* 133MHz */ 0 }, .write = { &write_std(0, 256, 133), /* 133MHz */ &write_quad(0, 256, 133), /* 133MHz */ 0 }, .erase = { &erase_sector_256k(0, _256K, 133), /* 133MHz */ 0 }, .driver = &spi_driver_no_qe, }, /* HeYangTek HYF1GQ4UAACAE 1Gbit */ { .name = "HYF1GQ4UAACAE", .id = {0xc9, 0x51}, .id_len = _2B, .chipsize = _128M, .erasesize = _128K, .pagesize = _2K, .oobsize = _128B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 60), /* 60MHz */ &read_dual(1, INFINITE, 60), /* 60MHz */ &read_dual_addr(1, INFINITE, 60), /* 60MHz */ &read_quad(1, INFINITE, 60), /* 60MHz */ &read_quad_addr(1, INFINITE, 60), /* 60MHz */ 0 }, .write = { &write_std(0, 256, 80), /* 80MHz */ &write_quad(0, 256, 80), /* 80MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 80), /* 80MHz */ 0 }, .driver = &spi_driver_general, }, /* HeYangTek HYF2GQ4UAACAE 2Gbit */ { .name = "HYF2GQ4UAACAE", .id = {0xc9, 0x52}, .id_len = _2B, .chipsize = _256M, .erasesize = _128K, .pagesize = _2K, .oobsize = _128B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 60), /* 60MHz */ &read_dual(1, INFINITE, 60), /* 60MHz */ &read_dual_addr(1, INFINITE, 60), /* 60MHz */ &read_quad(1, INFINITE, 60), /* 60MHz */ &read_quad_addr(1, INFINITE, 60), /* 60MHz */ 0 }, .write = { &write_std(0, 256, 80), /* 80MHz */ &write_quad(0, 256, 80), /* 80MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 80), /* 80MHz */ 0 }, .driver = &spi_driver_general, }, /* HeYangTek HYF4GQ4UAACBE 4Gbit */ { .name = "HYF4GQ4UAACBE", .id = {0xc9, 0xd4}, .id_len = _2B, .chipsize = _512M, .erasesize = _256K, .pagesize = _4K, .oobsize = _256B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 60), /* 60MHz */ &read_dual(1, INFINITE, 60), /* 60MHz */ &read_dual_addr(1, INFINITE, 60), /* 60MHz */ &read_quad(1, INFINITE, 60), /* 60MHz */ &read_quad_addr(1, INFINITE, 60), /* 60MHz */ 0 }, .write = { &write_std(0, 256, 80), /* 80MHz */ &write_quad(0, 256, 80), /* 80MHz */ 0 }, .erase = { &erase_sector_256k(0, _256K, 80), /* 80MHz */ 0 }, .driver = &spi_driver_general, }, /* Dosilicon 3.3V DS35Q1GA-IB 1Gbit */ { .name = "DS35Q1GA-IB", .id = {0xe5, 0x71}, .id_len = _2B, .chipsize = _128M, .erasesize = _128K, .pagesize = _2K, .oobsize = _64B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 104), /* 104MHz */ &read_dual(1, INFINITE, 104), /* 104MHz */ &read_quad(1, INFINITE, 104), /* 104MHz */ 0 }, .write = { &write_std(0, 256, 80), /* 80MHz */ &write_quad(0, 256, 104), /* 104MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 104), /* 104MHz */ 0 }, .driver = &spi_driver_general, }, /* XTX 3.3V XT26G01B 1Gbit */ { .name = "XT26G01B", .id = {0x0B, 0xF1}, .id_len = _2B, .chipsize = _128M, .erasesize = _128K, .pagesize = _2K, .oobsize = _64B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 80), /* 80MHz */ &read_dual(1, INFINITE, 80), /* 80MHz */ &read_dual_addr(1, INFINITE, 80), /* 80MHz */ &read_quad(1, INFINITE, 80), /* 80MHz */ &read_quad_addr(1, INFINITE, 80), /* 80MHz */ 0 }, .write = { &write_std(0, 256, 80), /* 80MHz */ &write_quad(0, 256, 80), /* 80MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 80), /* 80MHz */ 0 }, .driver = &spi_driver_general, }, /* Etron 1.8V EM78F044VCA-H 8Gbit */ { .name = "EM78F044VCA-H", .id = {0xD5, 0x8D}, .id_len = _2B, .chipsize = _1G, .erasesize = _256K, .pagesize = _4K, .oobsize = _256B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 100), /* 100MHz */ &read_dual(1, INFINITE, 100), /* 100MHz */ &read_dual_addr(1, INFINITE, 100), /* 100MHz */ &read_quad(1, INFINITE, 100), /* 100MHz */ &read_quad_addr(1, INFINITE, 100), /* 100MHz */ 0 }, .write = { &write_std(0, 256, 100), /* 100MHz */ &write_quad(0, 256, 100), /* 100MHz */ 0 }, .erase = { &erase_sector_256k(0, _256K, 100), /* 100MHz */ 0 }, .driver = &spi_driver_general, }, /* Etron 1.8V EM78E044VCA-H 4Gbit */ { .name = "EM78E044VCA-H", .id = {0xD5, 0x8C}, .id_len = _2B, .chipsize = _512M, .erasesize = _256K, .pagesize = _4K, .oobsize = _256B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 100), /* 100MHz */ &read_dual(1, INFINITE, 100), /* 100MHz */ &read_dual_addr(1, INFINITE, 100), /* 100MHz */ &read_quad(1, INFINITE, 100), /* 100MHz */ &read_quad_addr(1, INFINITE, 100), /* 100MHz */ 0 }, .write = { &write_std(0, 256, 100), /* 100MHz */ &write_quad(0, 256, 100), /* 100MHz */ 0 }, .erase = { &erase_sector_256k(0, _256K, 100), /* 100MHz */ 0 }, .driver = &spi_driver_general, }, /* Etron 1.8V EM78D044VCF-H 2Gbit */ { .name = "EM78D044VCF-H", .id = {0xd5, 0x81}, .id_len = _2B, .chipsize = _256M, .erasesize = _128K, .pagesize = _2K, .oobsize = _64B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 104), /* 104MHz */ &read_dual(1, INFINITE, 104), /* 104MHz */ &read_dual_addr(1, INFINITE, 104), &read_quad(1, INFINITE, 104), /* 104MHz */ &read_quad_addr(1, INFINITE, 104), 0 }, .write = { &write_std(0, 256, 80), /* 80MHz */ &write_quad(0, 256, 104), /* 104MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 104), /* 104MHz */ 0 }, .driver = &spi_driver_general, }, /* Etron 3.3V EM73C044VCC-H 1Gbit */ { .name = "EM73C044VCC-H", .id = {0xd5, 0x22}, .id_len = _2B, .chipsize = _128M, .erasesize = _128K, .pagesize = _2K, .oobsize = _64B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), &read_fast(1, INFINITE, 120), &read_dual(1, INFINITE, 120), &read_dual_addr(1, INFINITE, 120), &read_quad(1, INFINITE, 120), &read_quad_addr(1, INFINITE, 120), 0 }, .write = { &write_std(0, 256, 104), &write_quad(0, 256, 120), 0 }, .erase = { &erase_sector_128k(0, _128K, 104), 0 }, .driver = &spi_driver_general, }, /* Dosilicon 3.3V DS35Q2GA-IB 1Gb */ { .name = "DS35Q2GA-IB", .id = {0xe5, 0x72}, .id_len = _2B, .chipsize = _256M, .erasesize = _128K, .pagesize = _2K, .oobsize = _64B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 104), /* 104MHz */ &read_dual(1, INFINITE, 104), /* 104MHz */ &read_quad(1, INFINITE, 104), /* 104MHz */ 0 }, .write = { &write_std(0, 256, 80), /* 80MHz */ &write_quad(0, 256, 104), /* 104MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 104), /* 104MHz */ 0 }, .driver = &spi_driver_general, }, /* FM 3.3V FM25S01-DND-A-G 1Gb */ { .name = "FM25S01-DND-A-G", .id = {0xa1, 0xa1}, .id_len = _2B, .chipsize = _128M, .erasesize = _128K, .pagesize = _2K, .oobsize = _128B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 104), /* 104MHz */ &read_dual(1, INFINITE, 104), /* 104MHz */ &read_dual_addr(1, INFINITE, 40), /* 40MHz */ &read_quad(1, INFINITE, 104), /* 104MHz */ &read_quad_addr(2, INFINITE, 40), /* 40MHz */ 0 }, .write = { &write_std(0, 256, 104), /* 104MHz */ &write_quad(0, 256, 104), /* 104MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 104), /* 104MHz */ 0 }, .driver = &spi_driver_no_qe, }, /* FM 3.3V FM25S01A 1Gb */ { .name = "FM25S01A", .id = {0xa1, 0xe4}, .id_len = _2B, .chipsize = _128M, .erasesize = _128K, .pagesize = _2K, .oobsize = _64B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 104), /* 104MHz */ &read_dual(1, INFINITE, 104), /* 104MHz */ &read_dual_addr(1, INFINITE, 40), /* 40MHz */ &read_quad(1, INFINITE, 104), /* 104MHz */ &read_quad_addr(2, INFINITE, 40), /* 40MHz */ 0 }, .write = { &write_std(0, 256, 104), /* 104MHz */ &write_quad(0, 256, 104), /* 104MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 104), /* 104MHz */ 0 }, .driver = &spi_driver_no_qe, }, /* HSESDFDSW2G 3.3V 2G-BIT */ { .name = "HSESDFDSW2G", .id = {0x3C, 0xD2}, .id_len = _2B, .chipsize = _256M, .erasesize = _128K, .pagesize = _2K, .oobsize = _64B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 80), /* 80MHz */ &read_dual(1, INFINITE, 80), /* 80MHz */ &read_dual_addr(1, INFINITE, 80), /* 80MHz */ &read_quad(1, INFINITE, 80), /* 80MHz */ &read_quad_addr(1, INFINITE, 80), /* 80MHz */ 0 }, .write = { &write_std(0, 256, 80), /* 80MHz */ &write_quad(0, 256, 80), /* 80MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 80), /* 104MHz */ 0 }, .driver = &spi_driver_general, }, /* Winbond 3.3V W25N02KV 2Gbit */ { .name = "W25N02KV", .id = {0xef, 0xaa, 0x22}, .id_len = _3B, .chipsize = _256M, .erasesize = _128K, .pagesize = _2K, .oobsize = _64B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 104), /* 104MHz */ &read_dual(1, INFINITE, 104), /* 104MHz */ &read_dual_addr(1, INFINITE, 104), /* 104MHz */ &read_quad(1, INFINITE, 104), /* 104MHz */ &read_quad_addr(2, INFINITE, 104), /* 104MHz */ 0 }, .write = { &write_std(0, 256, 24), /* 24MHz */ &write_quad(0, 256, 104), /* 104MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 24), /* 24MHz */ 0 }, .driver = &spi_driver_no_qe, }, /* HSESDFDSW4G 3.3V 4G-BIT 20250805 */ { .name = "HSESDFDSW4G_V2", .id = {0x3C, 0xD4, 0xD4}, .id_len = _3B, .chipsize = _512M, .erasesize = _128K, .pagesize = _2K, .oobsize = _64B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 104), /* 104MHz */ &read_dual(1, INFINITE, 104), /* 104MHz */ &read_dual_addr(1, INFINITE, 104), /* 104MHz */ &read_quad(1, INFINITE, 104), /* 104MHz */ &read_quad_addr(2, INFINITE, 104), /* 104MHz */ 0 }, .write = { &write_std(0, 256, 104), /* 108MHz */ &write_quad(0, 256, 104), /* 108MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 104), /* 108MHz */ 0 }, .driver = &spi_driver_no_qe, // spi_driver_general }, /* HSESDFDSW4G 3.3V 4G-BIT */ { .name = "HSESDFDSW4G", .id = {0x3C, 0xD4}, .id_len = _2B, .chipsize = _512M, .erasesize = _128K, .pagesize = _2K, .oobsize = _64B, .badblock_pos = BBP_FIRST_PAGE, .read = { &read_std(1, INFINITE, 24), /* 24MHz */ &read_fast(1, INFINITE, 80), /* 80MHz */ &read_dual(1, INFINITE, 80), /* 80MHz */ &read_dual_addr(1, INFINITE, 80), /* 80MHz */ &read_quad(1, INFINITE, 80), /* 80MHz */ &read_quad_addr(1, INFINITE, 80), /* 80MHz */ 0 }, .write = { &write_std(0, 256, 80), /* 80MHz */ &write_quad(0, 256, 80), /* 80MHz */ 0 }, .erase = { &erase_sector_128k(0, _128K, 80), /* 104MHz */ 0 }, .driver = &spi_driver_general, }, { .id_len = 0, }, }; /*****************************************************************************/ static void fmc100_spi_nand_search_rw(struct spi_nand_info *spiinfo, struct spi_op *spiop_rw, u_int iftype, u_int max_dummy, int rw_type) { int ix = 0; struct spi_op **spiop = NULL; struct spi_op **fitspiop = NULL; for (fitspiop = spiop = (rw_type ? spiinfo->write : spiinfo->read); (*spiop) && ix < MAX_SPI_OP; spiop++, ix++) if (((*spiop)->iftype & iftype) && ((*spiop)->dummy <= max_dummy) && ((*fitspiop)->iftype < (*spiop)->iftype)) fitspiop = spiop; memcpy(spiop_rw, (*fitspiop), sizeof(struct spi_op)); } /*****************************************************************************/ static void fmc100_spi_nand_get_erase(struct spi_nand_info *spiinfo, struct spi_op *spiop_erase) { int ix; spiop_erase->size = 0; for (ix = 0; ix < MAX_SPI_OP; ix++) { if (spiinfo->erase[ix] == NULL) break; if (spiinfo->erasesize == spiinfo->erase[ix]->size) { memcpy(&spiop_erase[ix], spiinfo->erase[ix], sizeof(struct spi_op)); break; } } } /*****************************************************************************/ static void fmc100_map_spi_op(struct fmc_spi *spi) { unsigned char ix = 0; const int iftype_read[] = { SPI_IF_READ_STD, IF_TYPE_STD, SPI_IF_READ_FAST, IF_TYPE_STD, SPI_IF_READ_DUAL, IF_TYPE_DUAL, SPI_IF_READ_DUAL_ADDR, IF_TYPE_DIO, SPI_IF_READ_QUAD, IF_TYPE_QUAD, SPI_IF_READ_QUAD_ADDR, IF_TYPE_QIO, 0, 0, }; const int iftype_write[] = { SPI_IF_WRITE_STD, IF_TYPE_STD, SPI_IF_WRITE_QUAD, IF_TYPE_QUAD, 0, 0, }; const char *if_str[] = {"STD", "DUAL", "DIO", "QUAD", "QIO"}; fmc_pr(BT_DBG, "\t||*-Start Get SPI operation iftype & clock\n"); /* the element with an even number of arrays, so increase is 2 */ for (ix = 0; iftype_write[ix]; ix += 2) { if (spi->write->iftype == iftype_write[ix]) { spi->write->iftype = iftype_write[ix + 1]; break; } } fmc_get_fmc_best_2x_clock(&spi->write->clock); fmc_pr(BT_DBG, "\t|||-Get best write iftype: %s clock type: %d\n", if_str[spi->write->iftype], get_fmc_clk_type(spi->write->clock)); /* the element with an even number of arrays, so increase is 2 */ for (ix = 0; iftype_read[ix]; ix += 2) { if (spi->read->iftype == iftype_read[ix]) { spi->read->iftype = iftype_read[ix + 1]; break; } } fmc_get_fmc_best_2x_clock(&spi->read->clock); fmc_pr(BT_DBG, "\t|||-Get best read iftype: %s clock type: %d\n", if_str[spi->read->iftype], get_fmc_clk_type(spi->read->clock)); fmc_get_fmc_best_2x_clock(&spi->erase->clock); spi->erase->iftype = IF_TYPE_STD; fmc_pr(BT_DBG, "\t|||-Get best erase iftype: %s clock type: %d\n", if_str[spi->erase->iftype], get_fmc_clk_type(spi->erase->clock)); fmc_pr(BT_DBG, "\t||*-End Get SPI operation iftype & clock\n"); } /*****************************************************************************/ static void fmc100_spi_ids_probe(struct fmc_host *host, struct spi_nand_info *spi_dev) { unsigned int reg; struct fmc_spi *spi = host->spi; unsigned char *fmc_cs = get_cs_number(host->cmd_op.cs); fmc_pr(BT_DBG, "\t|*-Start match SPI operation & chip init\n"); spi->host = host; spi->name = spi_dev->name; spi->driver = spi_dev->driver; fmc100_spi_nand_search_rw(spi_dev, spi->read, FMC_SPI_NAND_SUPPORT_READ, FMC_SPI_NAND_SUPPORT_MAX_DUMMY, RW_OP_READ); fmc_pr(BT_DBG, "\t||-Save spi->read op cmd:%#x\n", spi->read->cmd); fmc100_spi_nand_search_rw(spi_dev, spi->write, FMC_SPI_NAND_SUPPORT_WRITE, FMC_SPI_NAND_SUPPORT_MAX_DUMMY, RW_OP_WRITE); fmc_pr(BT_DBG, "\t||-Save spi->write op cmd:%#x\n", spi->write->cmd); fmc100_spi_nand_get_erase(spi_dev, spi->erase); fmc_pr(BT_DBG, "\t||-Save spi->erase op cmd:%#x\n", spi->erase->cmd); fmc100_map_spi_op(spi); spi->driver->qe_enable(spi); /* Disable write protection */ reg = spi_nand_feature_op(spi, GET_OP, PROTECT_ADDR, 0); fmc_pr(BT_DBG, "\t||-Get protect status[%#x]: %#x\n", PROTECT_ADDR, reg); if (any_bp_enable(reg)) { reg &= ~ALL_BP_MASK; spi_nand_feature_op(spi, SET_OP, PROTECT_ADDR, reg); fmc_pr(BT_DBG, "\t||-Set [%#x]FT %#x\n", PROTECT_ADDR, reg); spi->driver->wait_ready(spi); reg = spi_nand_feature_op(spi, GET_OP, PROTECT_ADDR, 0); fmc_pr(BT_DBG, "\t||-Check BP disable result: %#x\n", reg); if (any_bp_enable(reg)) db_msg("Error: Write protection disable failed!\n"); } /* Disable chip internal ECC */ reg = spi_nand_feature_op(spi, GET_OP, FEATURE_ADDR, 0); fmc_pr(BT_DBG, "\t||-Get feature status[%#x]: %#x\n", FEATURE_ADDR, reg); if (reg & FEATURE_ECC_ENABLE) { reg &= ~FEATURE_ECC_ENABLE; spi_nand_feature_op(spi, SET_OP, FEATURE_ADDR, reg); fmc_pr(BT_DBG, "\t||-Set [%#x]FT: %#x\n", FEATURE_ADDR, reg); spi->driver->wait_ready(spi); reg = spi_nand_feature_op(spi, GET_OP, FEATURE_ADDR, 0); fmc_pr(BT_DBG, "\t||-Check internal ECC disable result: %#x\n", reg); if (reg & FEATURE_ECC_ENABLE) db_msg("Error: Chip internal ECC disable failed!\n"); } (*fmc_cs)++; fmc_pr(BT_DBG, "\t|*-End match SPI operation & chip init\n"); } static struct nand_flash_dev spi_nand_dev; /*****************************************************************************/ static struct nand_flash_dev *spi_nand_get_flash_info(struct mtd_info *mtd, struct nand_chip *chip, unsigned char *id) { unsigned char ix; unsigned char len; char buffer[TMP_BUF_LEN]; struct fmc_host *host = chip->priv; struct spi_nand_info *spi_dev = fmc_spi_nand_flash_table; struct nand_flash_dev *type = &spi_nand_dev; fmc_pr(BT_DBG, "\t*-Start find SPI Nand flash\n"); len = sprintf(buffer, "SPI Nand(cs %d) ID: %#x %#x", host->cmd_op.cs, id[0], id[1]); for (; spi_dev->id_len; spi_dev++) { if (memcmp(id, spi_dev->id, spi_dev->id_len)) continue; /* element with an even number of arrays, so increase is 2 */ for (ix = 2; ix < spi_dev->id_len; ix++) len += sprintf(buffer + len, " %#x", id[ix]); printf("%s Name:\"%s\"\n", buffer, spi_dev->name); fmc_pr(BT_DBG, "\t||-CS(%d) found SPI Nand: %s\n", host->cmd_op.cs, spi_dev->name); type->name = spi_dev->name; memcpy(type->id, spi_dev->id, spi_dev->id_len); type->pagesize = spi_dev->pagesize; type->chipsize = byte_to_mb(spi_dev->chipsize); type->erasesize = spi_dev->erasesize; type->id_len = spi_dev->id_len; type->oobsize = spi_dev->oobsize; type->options = chip->options; fmc_pr(BT_DBG, "\t|-Save struct spi_nand_info info\n"); mtd->size = spi_dev->chipsize; fmc100_spi_ids_probe(host, spi_dev); fmc_pr(BT_DBG, "\t*-Found SPI nand: %s\n", spi_dev->name); return type; } fmc_pr(BT_DBG, "\t*-Not found SPI nand flash, ID: %s\n", buffer); return NULL; } /*****************************************************************************/ void fmc_spi_nand_ids_register(void) { #ifndef CONFIG_SYS_NAND_QUIET_TEST printf("SPI Nand ID Table Version %s\n", SPI_NAND_ID_TAB_VER); #endif get_flash_type = spi_nand_get_flash_info; }