[flashrom] Additional voltages

Stefan Tauner stefan.tauner at student.tuwien.ac.at
Sat Jul 16 16:57:51 CEST 2011


On Fri, 15 Jul 2011 23:26:23 -0400
Steven Zakulec <spzakulec at gmail.com> wrote:

> I believe I've adjusted the phrasings so there's one style for each comment
> type.

almost ;)

> The only issue I've come across is the Intel 28F002BC/BL/BV/BX-T.
> From my reading of the datasheets, the later two are compatible with each
> other voltage-wise, but the BC and BL versions are definitely not- they have
> non-overlapping ranges for reading.

i have looked at 29044901.pdf (28F002BL) and 29053105.pdf (28F002BV)
briefly, but could not see the issue. what is the problem exactly,
where should i look?


> Index: flashchips.c
> ===================================================================
> --- flashchips.c	(revision 1373)
> +++ flashchips.c	(working copy)
> @@ -86,92 +86,93 @@
>  
>  	{
>  		.vendor		= "AMD",
>  		.name		= "Am29F002(N)BB",
>  		.bustype	= CHIP_BUSTYPE_PARALLEL,
>  		.manufacture_id	= AMD_ID,
>  		.model_id	= AMD_AM29F002BB,
>  		.total_size	= 256,
>  		.page_size	= 256,
>  		.feature_bits	= FEATURE_SHORT_RESET | FEATURE_ADDR_2AA,
>  		.tested		= TEST_UNTESTED,
>  		.probe		= probe_jedec,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = {
>  					{16 * 1024, 1},
>  					{8 * 1024, 2},
>  					{32 * 1024, 1},
>  					{64 * 1024, 3},
>  				},
>  				.block_erase = erase_sector_jedec,
>  			}, {
>  				.eraseblocks = { {256 * 1024, 1} },
>  				.block_erase = erase_chip_block_jedec,
>  			},
>  		},
>  		.write		= write_jedec_1,
>  		.read		= read_memmapped,
> -		.voltage	= {4750, 5250}, /* -55 speed is +-5%, all others +-10% */
> +		.voltage	= {4750, 5250}, /* -55 speed is 4.75-5.25V, others 4.5-5.5V */
>  	},
>  
>  	{
>  		.vendor		= "AMD",
>  		.name		= "Am29F002(N)BT",
>  		.bustype	= CHIP_BUSTYPE_PARALLEL,
>  		.manufacture_id	= AMD_ID,
>  		.model_id	= AMD_AM29F002BT,
>  		.total_size	= 256,
>  		.page_size	= 256,
>  		.feature_bits	= FEATURE_EITHER_RESET | FEATURE_ADDR_2AA,
>  		.tested		= TEST_UNTESTED,
>  		.probe		= probe_jedec,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = {
>  					{64 * 1024, 3},
>  					{32 * 1024, 1},
>  					{8 * 1024, 2},
>  					{16 * 1024, 1},
>  				},
>  				.block_erase = erase_sector_jedec,
>  			}, {
>  				.eraseblocks = { {256 * 1024, 1} },
>  				.block_erase = erase_chip_block_jedec,
>  			},
>  		},
>  		.write		= write_jedec_1,
>  		.read		= read_memmapped,
> +		.voltage	= {4750, 5250}, /* -55 speed is 4.75-5.25V, others 4.5-5.5V */
>  	},
>  
>  	{
>  		.vendor		= "AMD",
>  		.name		= "Am29F016D",
>  		.bustype	= CHIP_BUSTYPE_PARALLEL,
>  		.manufacture_id	= AMD_ID,
>  		.model_id	= AMD_AM29F016D,
>  		.total_size	= 2 * 1024,
>  		.page_size	= 64 * 1024,
>  		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
>  		.tested		= TEST_UNTESTED,
>  		.probe		= probe_jedec,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { {64 * 1024, 32} },
>  				.block_erase = erase_sector_jedec,
>  			}, {
>  				.eraseblocks = { {2048 * 1024, 1} },
>  				.block_erase = erase_chip_block_jedec,
>  			},
>  		},
>  		.write		= write_jedec_1,
>  		.read		= read_memmapped,
>  		.voltage	= {4500, 5500},
>  	},
>  
>  	{
> @@ -229,330 +230,338 @@
>  	},
>  
>  	{
>  		.vendor		= "AMD",
>  		.name		= "Am29LV001BB",
>  		.bustype	= CHIP_BUSTYPE_PARALLEL,
>  		.manufacture_id	= AMD_ID,
>  		.model_id	= AMD_AM29LV001BB,
>  		.total_size	= 128,
>  		.page_size	= 64 * 1024, /* unused */
>  		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
>  		.tested		= TEST_OK_PREW,
>  		.probe		= probe_jedec,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = {
>  					{8 * 1024, 1},
>  					{4 * 1024, 2},
>  					{16 * 1024, 7},
>  				},
>  				.block_erase = erase_sector_jedec,
>  			}, {
>  				.eraseblocks = { {128 * 1024, 1} },
>  				.block_erase = erase_chip_block_jedec,
>  			},
>  		},
>  		.write		= write_jedec_1,
>  		.read		= read_memmapped,
> +		.voltage	= {3000, 3600}, /* -45R speed is 3.0-3.6V, others 2.7-3.6V */
>  	},
>  
>  	{
>  		.vendor		= "AMD",
>  		.name		= "Am29LV001BT",
>  		.bustype	= CHIP_BUSTYPE_PARALLEL,
>  		.manufacture_id	= AMD_ID,
>  		.model_id	= AMD_AM29LV001BT,
>  		.total_size	= 128,
>  		.page_size	= 64 * 1024, /* unused */
>  		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
>  		.tested		= TEST_UNTESTED,
>  		.probe		= probe_jedec,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = {
>  					{16 * 1024, 7},
>  					{4 * 1024, 2},
>  					{8 * 1024, 1},
>  				},
>  				.block_erase = erase_sector_jedec,
>  			}, {
>  				.eraseblocks = { {128 * 1024, 1} },
>  				.block_erase = erase_chip_block_jedec,
>  			},
>  		},
>  		.write		= write_jedec_1,
>  		.read		= read_memmapped,
> +		.voltage	= {3000, 3600}, /* -45R speed is 3.0-3.6V, others 2.7-3.6V */
>  	},
>  
>  	{
>  		.vendor		= "AMD",
>  		.name		= "Am29LV002BB",
>  		.bustype	= CHIP_BUSTYPE_PARALLEL,
>  		.manufacture_id	= AMD_ID,
>  		.model_id	= AMD_AM29LV002BB,
>  		.total_size	= 256,
>  		.page_size	= 64 * 1024, /* unused */
>  		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
>  		.tested		= TEST_UNTESTED,
>  		.probe		= probe_jedec,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = {
>  					{16 * 1024, 1},
>  					{8 * 1024, 2},
>  					{32 * 1024, 1},
>  					{64 * 1024, 3},
>  				},
>  				.block_erase = erase_sector_jedec,
>  			}, {
>  				.eraseblocks = { {256 * 1024, 1} },
>  				.block_erase = erase_chip_block_jedec,
>  			},
>  		},
>  		.write		= write_jedec_1,
>  		.read		= read_memmapped,
> +		.voltage	= {3000, 3600}, /* -55 speed is 3.0-3.6V, others 2.7-3.6V */
>  	},
>  
>  	{
>  		.vendor		= "AMD",
>  		.name		= "Am29LV002BT",
>  		.bustype	= CHIP_BUSTYPE_PARALLEL,
>  		.manufacture_id	= AMD_ID,
>  		.model_id	= AMD_AM29LV002BT,
>  		.total_size	= 256,
>  		.page_size	= 64 * 1024, /* unused */
>  		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
>  		.tested		= TEST_UNTESTED,
>  		.probe		= probe_jedec,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = {
>  					{64 * 1024, 3},
>  					{32 * 1024, 1},
>  					{8 * 1024, 2},
>  					{16 * 1024, 1},
>  				},
>  				.block_erase = erase_sector_jedec,
>  			}, {
>  				.eraseblocks = { {256 * 1024, 1} },
>  				.block_erase = erase_chip_block_jedec,
>  			},
>  		},
>  		.write		= write_jedec_1,
>  		.read		= read_memmapped,
> +		.voltage	= {3000, 3600}, /* -55 speed is 3.0-3.6V, others 2.7-3.6V */
>  	},
>  
>  	{
>  		.vendor		= "AMD",
>  		.name		= "Am29LV004BB",
>  		.bustype	= CHIP_BUSTYPE_PARALLEL,
>  		.manufacture_id	= AMD_ID,
>  		.model_id	= AMD_AM29LV004BB,
>  		.total_size	= 512,
>  		.page_size	= 64 * 1024, /* unused */
>  		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
>  		.tested		= TEST_UNTESTED,
>  		.probe		= probe_jedec,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = {
>  					{16 * 1024, 1},
>  					{8 * 1024, 2},
>  					{32 * 1024, 1},
>  					{64 * 1024, 7},
>  				},
>  				.block_erase = erase_sector_jedec,
>  			}, {
>  				.eraseblocks = { {512 * 1024, 1} },
>  				.block_erase = erase_chip_block_jedec,
>  			},
>  		},
>  		.write		= write_jedec_1,
>  		.read		= read_memmapped,
> +		.voltage	= {2700, 3600},
>  	},
>  
>  	{
>  		.vendor		= "AMD",
>  		.name		= "Am29LV004BT",
>  		.bustype	= CHIP_BUSTYPE_PARALLEL,
>  		.manufacture_id	= AMD_ID,
>  		.model_id	= AMD_AM29LV004BT,
>  		.total_size	= 512,
>  		.page_size	= 64 * 1024, /* unused */
>  		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
>  		.tested		= TEST_UNTESTED,
>  		.probe		= probe_jedec,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = {
>  					{64 * 1024, 7},
>  					{32 * 1024, 1},
>  					{8 * 1024, 2},
>  					{16 * 1024, 1},
>  				},
>  				.block_erase = erase_sector_jedec,
>  			}, {
>  				.eraseblocks = { {512 * 1024, 1} },
>  				.block_erase = erase_chip_block_jedec,
>  			},
>  		},
>  		.write		= write_jedec_1,
>  		.read		= read_memmapped,
> +		.voltage	= {2700, 3600},
>  	},
>  
>  	{
>  		.vendor		= "AMD",
>  		.name		= "Am29LV008BB",
>  		.bustype	= CHIP_BUSTYPE_PARALLEL,
>  		.manufacture_id	= AMD_ID,
>  		.model_id	= AMD_AM29LV008BB,
>  		.total_size	= 1024,
>  		.page_size	= 64 * 1024, /* unused */
>  		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
>  		.tested		= TEST_UNTESTED,
>  		.probe		= probe_jedec,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = {
>  					{16 * 1024, 1},
>  					{8 * 1024, 2},
>  					{32 * 1024, 1},
>  					{64 * 1024, 15},
>  				},
>  				.block_erase = erase_sector_jedec,
>  			}, {
>  				.eraseblocks = { {1024 * 1024, 1} },
>  				.block_erase = erase_chip_block_jedec,
>  			},
>  		},
>  		.write		= write_jedec_1,
>  		.read		= read_memmapped,
> +		.voltage	= {3000, 3600} /* -70R is 3.0-3.6V, others 2.7-3.6V */
before you have used this (note the additional word "speed"):
		.voltage	= {3000, 3600}, /* -55 speed is 3.0-3.6V, others 2.7-3.6V */>  	},

please change all of those lines to:
		.voltage	= {3000, 3600}, /* 3.0-3.6V for type -55, others 2.7-3.6V */
etc.
>  
>  	{
>  		.vendor		= "AMD",
>  		.name		= "Am29LV008BT",
>  		.bustype	= CHIP_BUSTYPE_PARALLEL,
>  		.manufacture_id	= AMD_ID,
>  		.model_id	= AMD_AM29LV008BT,
>  		.total_size	= 1024,
>  		.page_size	= 64 * 1024, /* unused */
>  		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
>  		.tested		= TEST_UNTESTED,
>  		.probe		= probe_jedec,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = {
>  					{64 * 1024, 15},
>  					{32 * 1024, 1},
>  					{8 * 1024, 2},
>  					{16 * 1024, 1},
>  				},
>  				.block_erase = erase_sector_jedec,
>  			}, {
>  				.eraseblocks = { {1024 * 1024, 1} },
>  				.block_erase = erase_chip_block_jedec,
>  			},
>  		},
>  		.write		= write_jedec_1,
>  		.read		= read_memmapped,
> +		.voltage	= {3000, 3600} /* -70R is 3.0-3.6V, others 2.7-3.6V */
same here

>  	},
>  
>  	{
>  		.vendor		= "AMD",
>  		.name		= "Am29LV040B",
>  		.bustype	= CHIP_BUSTYPE_PARALLEL,
>  		.manufacture_id	= AMD_ID,
>  		.model_id	= AMD_AM29LV040B,
>  		.total_size	= 512,
>  		.page_size	= 64 * 1024,
>  		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
>  		.tested		= TEST_OK_PRE,
>  		.probe		= probe_jedec,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { {64 * 1024, 8} },
>  				.block_erase = erase_sector_jedec,
>  			}, {
>  				.eraseblocks = { {512 * 1024, 1} },
>  				.block_erase = erase_chip_block_jedec,
>  			},
>  		},
>  		.write		= write_jedec_1,
>  		.read		= read_memmapped,
> -		.voltage	= {2700, 3600},
> +		.voltage	= {3000, 3600}, /* -60R is 3.0-3.6V, others 2.7-3.6V*/
and here
>  	},
>  
>  	{
>  		.vendor		= "AMD",
>  		.name		= "Am29LV081B",
>  		.bustype	= CHIP_BUSTYPE_PARALLEL,
>  		.manufacture_id	= AMD_ID,
>  		.model_id	= AMD_AM29LV080B,
>  		.total_size	= 1024,
>  		.page_size	= 64 * 1024,
>  		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, /* datasheet specifies address as don't care */
>  		.tested		= TEST_UNTESTED,
>  		.probe		= probe_jedec,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { {64 * 1024, 16} },
>  				.block_erase = erase_sector_jedec,
>  			}, {
>  				.eraseblocks = { {1024 * 1024, 1} },
>  				.block_erase = erase_chip_block_jedec,
>  			},
>  		},
>  		.write		= write_jedec_1,
>  		.read		= read_memmapped,
> -		.voltage	= {2700, 3600},
> +		.voltage	= {3000, 3600}, /* -70R is 3.0-3.6V, others 2.7-3.6V */
and here

>  	},
>  
>  	{
>  		.vendor		= "AMIC",
>  		.name		= "A25L05PT",
>  		.bustype	= CHIP_BUSTYPE_SPI,
>  		.manufacture_id	= AMIC_ID,
>  		.model_id	= AMIC_A25L05PT,
>  		.total_size	= 64,
>  		.page_size	= 256,
>  		.tested		= TEST_UNTESTED,
>  		.probe		= probe_spi_rdid4,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = {
>  					{32 * 1024, 1},
>  					{16 * 1024, 1},
>  					{8 * 1024, 1},
>  					{4 * 1024, 2},
>  				},
>  				.block_erase = spi_block_erase_d8,
>  			}, {
>  				.eraseblocks = { {64 * 1024, 1} },
>  				.block_erase = spi_block_erase_c7,
>  			}
>  		},
>  		.printlock	= spi_prettyprint_status_register_amic_a25l05p,
>  		.unlock		= spi_disable_blockprotect,
> @@ -564,60 +573,61 @@
>  	{
>  		.vendor		= "AMIC",
>  		.name		= "A25L05PU",
>  		.bustype	= CHIP_BUSTYPE_SPI,
>  		.manufacture_id	= AMIC_ID,
>  		.model_id	= AMIC_A25L05PU,
>  		.total_size	= 64,
>  		.page_size	= 256,
>  		.tested		= TEST_UNTESTED,
>  		.probe		= probe_spi_rdid4,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = {
>  					{4 * 1024, 2},
>  					{8 * 1024, 1},
>  					{16 * 1024, 1},
>  					{32 * 1024, 1},
>  				},
>  				.block_erase = spi_block_erase_d8,
>  			}, {
>  				.eraseblocks = { {64 * 1024, 1} },
>  				.block_erase = spi_block_erase_c7,
>  			}
>  		},
>  		.printlock	= spi_prettyprint_status_register_amic_a25l05p,
>  		.unlock		= spi_disable_blockprotect,
>  		.write		= spi_chip_write_256,
>  		.read		= spi_chip_read,
> +		.voltage	= {2700, 3600},
>  	},
>  
>  	{
>  		.vendor		= "AMIC",
>  		.name		= "A25L10PT",
>  		.bustype	= CHIP_BUSTYPE_SPI,
>  		.manufacture_id	= AMIC_ID,
>  		.model_id	= AMIC_A25L10PT,
>  		.total_size	= 128,
>  		.page_size	= 256,
>  		.tested		= TEST_UNTESTED,
>  		.probe		= probe_spi_rdid4,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = {
>  					{64 * 1024, 1},
>  					{32 * 1024, 1},
>  					{16 * 1024, 1},
>  					{8 * 1024, 1},
>  					{4 * 1024, 2},
>  				},
>  				.block_erase = spi_block_erase_d8,
>  			}, {
>  				.eraseblocks = { {128 * 1024, 1} },
>  				.block_erase = spi_block_erase_c7,
>  			}
>  		},
>  		.printlock	= spi_prettyprint_status_register_amic_a25l05p,
> @@ -1305,99 +1315,99 @@
>  		.model_id	= ATMEL_AT25DF021,
>  		.total_size	= 256,
>  		.page_size	= 256,
>  		.feature_bits	= FEATURE_WRSR_WREN,
>  		.tested		= TEST_UNTESTED,
>  		.probe		= probe_spi_rdid,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { {4 * 1024, 64} },
>  				.block_erase = spi_block_erase_20,
>  			}, {
>  				.eraseblocks = { {32 * 1024, 8} },
>  				.block_erase = spi_block_erase_52,
>  			}, {
>  				.eraseblocks = { {64 * 1024, 4} },
>  				.block_erase = spi_block_erase_d8,
>  			}, {
>  				.eraseblocks = { {256 * 1024, 1} },
>  				.block_erase = spi_block_erase_60,
>  			}, {
>  				.eraseblocks = { {256 * 1024, 1} },
>  				.block_erase = spi_block_erase_c7,
>  			}
>  		},
>  		.printlock	= spi_prettyprint_status_register_at25df,
>  		.unlock		= spi_disable_blockprotect_at25df,
>  		.write		= spi_chip_write_256,
>  		.read		= spi_chip_read,
> -		.voltage	= {2300, 3600}, /* Datasheet says 2.3-3.6V or 2.7-3.6V */
> +		.voltage	= {2700, 3600}, /* Datasheet says there's a 2.3-3.6V & 2.7-3.6V model */
		.voltage	= {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
would be terser, but it is ok as it is too. if you change it, please change all occurrences alike.

>  	},
>  
>  	{
>  		.vendor		= "Atmel",
>  		.name		= "AT25DF041A",
>  		.bustype	= CHIP_BUSTYPE_SPI,
>  		.manufacture_id	= ATMEL_ID,
>  		.model_id	= ATMEL_AT25DF041A,
>  		.total_size	= 512,
>  		.page_size	= 256,
>  		.feature_bits	= FEATURE_WRSR_WREN,
>  		.tested		= TEST_UNTESTED,
>  		.probe		= probe_spi_rdid,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { {4 * 1024, 128} },
>  				.block_erase = spi_block_erase_20,
>  			}, {
>  				.eraseblocks = { {32 * 1024, 16} },
>  				.block_erase = spi_block_erase_52,
>  			}, {
>  				.eraseblocks = { {64 * 1024, 8} },
>  				.block_erase = spi_block_erase_d8,
>  			}, {
>  				.eraseblocks = { {512 * 1024, 1} },
>  				.block_erase = spi_block_erase_60,
>  			}, {
>  				.eraseblocks = { {512 * 1024, 1} },
>  				.block_erase = spi_block_erase_c7,
>  			}
>  		},
>  		.printlock	= spi_prettyprint_status_register_at25df,
>  		.unlock		= spi_disable_blockprotect_at25df,
>  		.write		= spi_chip_write_256,
>  		.read		= spi_chip_read,
> -		.voltage	= {2300, 3600}, /* Datasheet says 2.3-3.6V or 2.7-3.6V */
> +		.voltage	= {2700, 3600}, /* Datasheet says there's a 2.3-3.6V & 2.7-3.6V model */
>  	},
>  
>  	{
>  		.vendor		= "Atmel",
>  		.name		= "AT25DF081",
>  		.bustype	= CHIP_BUSTYPE_SPI,
>  		.manufacture_id	= ATMEL_ID,
>  		.model_id	= ATMEL_AT25DF081,
>  		.total_size	= 1024,
>  		.page_size	= 256,
>  		.feature_bits	= FEATURE_WRSR_WREN,
>  		.tested		= TEST_UNTESTED,
>  		.probe		= probe_spi_rdid,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { {4 * 1024, 256} },
>  				.block_erase = spi_block_erase_20,
>  			}, {
>  				.eraseblocks = { {32 * 1024, 32} },
>  				.block_erase = spi_block_erase_52,
>  			}, {
>  				.eraseblocks = { {64 * 1024, 16} },
>  				.block_erase = spi_block_erase_d8,
>  			}, {
>  				.eraseblocks = { {1024 * 1024, 1} },
>  				.block_erase = spi_block_erase_60,
>  			}, {
>  				.eraseblocks = { {1024 * 1024, 1} },
> @@ -1419,60 +1429,61 @@
>  		.model_id	= ATMEL_AT25DF081A,
>  		.total_size	= 1024,
>  		.page_size	= 256,
>  		.feature_bits	= FEATURE_WRSR_WREN,
>  		.tested		= TEST_UNTESTED,
>  		.probe		= probe_spi_rdid,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { {4 * 1024, 256} },
>  				.block_erase = spi_block_erase_20,
>  			}, {
>  				.eraseblocks = { {32 * 1024, 32} },
>  				.block_erase = spi_block_erase_52,
>  			}, {
>  				.eraseblocks = { {64 * 1024, 16} },
>  				.block_erase = spi_block_erase_d8,
>  			}, {
>  				.eraseblocks = { {1024 * 1024, 1} },
>  				.block_erase = spi_block_erase_60,
>  			}, {
>  				.eraseblocks = { {1024 * 1024, 1} },
>  				.block_erase = spi_block_erase_c7,
>  			}
>  		},
>  		.printlock	= spi_prettyprint_status_register_at25df_sec,
>  		.unlock		= spi_disable_blockprotect_at25df_sec,
>  		.write		= spi_chip_write_256,
>  		.read		= spi_chip_read,
> +		.voltage	= {2700, 3600},
>  	},
>  
>  	{
>  		.vendor		= "Atmel",
>  		.name		= "AT25DF161",
>  		.bustype	= CHIP_BUSTYPE_SPI,
>  		.manufacture_id	= ATMEL_ID,
>  		.model_id	= ATMEL_AT25DF161,
>  		.total_size	= 2048,
>  		.page_size	= 256,
>  		.feature_bits	= FEATURE_WRSR_WREN,
>  		.tested		= TEST_UNTESTED,
>  		.probe		= probe_spi_rdid,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { {4 * 1024, 512} },
>  				.block_erase = spi_block_erase_20,
>  			}, {
>  				.eraseblocks = { {32 * 1024, 64} },
>  				.block_erase = spi_block_erase_52,
>  			}, {
>  				.eraseblocks = { {64 * 1024, 32} },
>  				.block_erase = spi_block_erase_d8,
>  			}, {
>  				.eraseblocks = { {2 * 1024 * 1024, 1} },
>  				.block_erase = spi_block_erase_60,
>  			}, {
>  				.eraseblocks = { {2 * 1024 * 1024, 1} },
> @@ -1746,61 +1757,61 @@
>  				.block_erase = spi_block_erase_c7,
>  			}
>  		},
>  		.printlock	= spi_prettyprint_status_register_at25fs040,
>  		.unlock		= spi_disable_blockprotect_at25fs040,
>  		.write		= spi_chip_write_256,
>  		.read		= spi_chip_read,
>  		.voltage	= {2700, 3600},
>  	},
>  
>  	{
>  		.vendor		= "Atmel",
>  		.name		= "AT26DF041",
>  		.bustype	= CHIP_BUSTYPE_SPI,
>  		.manufacture_id	= ATMEL_ID,
>  		.model_id	= ATMEL_AT26DF041,
>  		.total_size	= 512,
>  		.page_size	= 256,
>  		.tested		= TEST_UNTESTED,
>  		.probe		= probe_spi_rdid,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { {4 * 1024, 128} },
>  				.block_erase = spi_block_erase_20,
>  			}
>  		},
>  		.write		= NULL /* Incompatible Page write */,
>  		.read		= spi_chip_read,
> -		.voltage	= {2700, 3600}, /* Datasheet says 3.0-3.6 V or 2.7-3.6 V */
> +		.voltage	= {2700, 3600}, /* 3.0-3.6V for higher speed, 2.7-3.6V normal */
>  	},
>  
>  	{
>  		.vendor		= "Atmel",
>  		.name		= "AT26DF081A",
>  		.bustype	= CHIP_BUSTYPE_SPI,
>  		.manufacture_id	= ATMEL_ID,
>  		.model_id	= ATMEL_AT26DF081A,
>  		.total_size	= 1024,
>  		.page_size	= 256,
>  		.feature_bits	= FEATURE_WRSR_WREN,
>  		.tested		= TEST_OK_PREW,
>  		.probe		= probe_spi_rdid,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { {4 * 1024, 256} },
>  				.block_erase = spi_block_erase_20,
>  			}, {
>  				.eraseblocks = { {32 * 1024, 32} },
>  				.block_erase = spi_block_erase_52,
>  			}, {
>  				.eraseblocks = { {64 * 1024, 16} },
>  				.block_erase = spi_block_erase_d8,
>  			}, {
>  				.eraseblocks = { {1024 * 1024, 1} },
>  				.block_erase = spi_block_erase_60,
>  			}, {
>  				.eraseblocks = { {1024 * 1024, 1} },
> @@ -2087,77 +2098,77 @@
>  
>  	{
>  		.vendor		= "Atmel",
>  		.name		= "AT45DB041D",
>  		.bustype	= CHIP_BUSTYPE_SPI,
>  		.manufacture_id	= ATMEL_ID,
>  		.model_id	= ATMEL_AT45DB041D,
>  		.total_size	= 512 /* Size can only be determined from status register */,
>  		.page_size	= 256 /* Size can only be determined from status register */,
>  		.tested		= TEST_BAD_READ,
>  		.probe		= probe_spi_rdid,
>  		.probe_timing	= TIMING_ZERO,
>  		.write		= NULL,
>  		.read		= NULL,
>  		.voltage	= {2500, 3600}, /* Datasheet says 2.5-3.6 V or 2.7-3.6 V */

what about this one btw?

>  	},
>  
>  	{
>  		.vendor		= "Atmel",
>  		.name		= "AT45DB081D",
>  		.bustype	= CHIP_BUSTYPE_SPI,
>  		.manufacture_id	= ATMEL_ID,
>  		.model_id	= ATMEL_AT45DB081D,
>  		.total_size	= 1024 /* Size can only be determined from status register */,
>  		.page_size	= 256 /* Size can only be determined from status register */,
>  		.tested		= TEST_BAD_READ,
>  		.probe		= probe_spi_rdid,
>  		.probe_timing	= TIMING_ZERO,
>  		.write		= NULL,
>  		.read		= NULL,
> -		.voltage	= {2500, 3600}, /* Datasheet says 2.5-3.6 V or 2.7-3.6 V */
> +		.voltage	= {2700, 3600}, /* Datasheet says there's a 2.5-3.6V & 2.7-3.6V model */
>
>  	},
>  
>  	{
>  		.vendor		= "Atmel",
>  		.name		= "AT45DB161D",
>  		.bustype	= CHIP_BUSTYPE_SPI,
>  		.manufacture_id	= ATMEL_ID,
>  		.model_id	= ATMEL_AT45DB161D,
>  		.total_size	= 2048 /* Size can only be determined from status register */,
>  		.page_size	= 512 /* Size can only be determined from status register */,
>  		.tested		= TEST_BAD_READ,
>  		.probe		= probe_spi_rdid,
>  		.probe_timing	= TIMING_ZERO,
>  		.write		= NULL,
>  		.read		= NULL,
> -		.voltage	= {2500, 3600}, /* Datasheet says 2.5-3.6 V or 2.7-3.6 V */
> +		.voltage	= {2700, 3600}, /* Datasheet says there's a 2.5-3.6V & 2.7-3.6V model */
>  	},
>  
>  	{
>  		.vendor		= "Atmel",
>  		.name		= "AT45DB321C",
>  		.bustype	= CHIP_BUSTYPE_SPI,
>  		.manufacture_id	= ATMEL_ID,
>  		.model_id	= ATMEL_AT45DB321C,
>  		.total_size	= 4224 /* No power of two sizes */,
>  		.page_size	= 528 /* No power of two sizes */,
>  		.tested		= TEST_BAD_READ,
>  		.probe		= probe_spi_rdid,
>  		.probe_timing	= TIMING_ZERO,
>  		.write		= NULL,
>  		.read		= NULL /* Incompatible read */,
>  		.voltage	= {2700, 3600},
>  	},
>  
>  	{
>  		.vendor		= "Atmel",
>  		.name		= "AT45DB321D",
>  		.bustype	= CHIP_BUSTYPE_SPI,
>  		.manufacture_id	= ATMEL_ID,
>  		.model_id	= ATMEL_AT45DB321D,
>  		.total_size	= 4096 /* Size can only be determined from status register */,
>  		.page_size	= 512 /* Size can only be determined from status register */,
>  		.tested		= TEST_BAD_READ,
>  		.probe		= probe_spi_rdid,
>  		.probe_timing	= TIMING_ZERO,
>  		.write		= NULL,
> @@ -2290,60 +2301,61 @@
>  		},
>  		.write		= write_jedec_1,
>  		.read		= read_memmapped,
>  		.voltage	= {4500, 5500},
>  	},
>  
>  	{
>  		.vendor		= "Bright",
>  		.name		= "BM29F040",
>  		.bustype	= CHIP_BUSTYPE_PARALLEL,
>  		.manufacture_id	= BRIGHT_ID,
>  		.model_id	= BRIGHT_BM29F040,
>  		.total_size	= 512,
>  		.page_size	= 64 * 1024,
>  		.feature_bits	= FEATURE_EITHER_RESET,
>  		.tested		= TEST_OK_PR,
>  		.probe		= probe_jedec,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { {64 * 1024, 8} },
>  				.block_erase = erase_sector_jedec,
>  			}, {
>  				.eraseblocks = { {512 * 1024, 1} },
>  				.block_erase = erase_chip_block_jedec,
>  			},
>  		},
>  		.write		= write_jedec_1,
>  		.read		= read_memmapped,
> +		.voltage	= {4500, 5500},
>  	},
>  
>  	{
>  		.vendor		= "EMST",
>  		.name		= "F49B002UA",
>  		.bustype	= CHIP_BUSTYPE_PARALLEL,
>  		.manufacture_id	= EMST_ID,
>  		.model_id	= EMST_F49B002UA,
>  		.total_size	= 256,
>  		.page_size	= 4096,
>  		.feature_bits	= FEATURE_EITHER_RESET,
>  		.tested		= TEST_UNTESTED,
>  		.probe		= probe_jedec,
>  		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { 
>  					{128 * 1024, 1},
>  					{96 * 1024, 1},
>  					{8 * 1024, 2},
>  					{16 * 1024, 1},
>  				},
>  				.block_erase = erase_sector_jedec,
>  			}, {
>  				.eraseblocks = { {256 * 1024, 1} },
>  				.block_erase = erase_chip_block_jedec,
>  			}
>  		},
>  		.write		= write_jedec_1,
> @@ -3415,119 +3427,120 @@
>  
>  	{
>  		.vendor		= "Hyundai",
>  		.name		= "HY29F002T",
>  		.bustype	= CHIP_BUSTYPE_PARALLEL,
>  		.manufacture_id	= HYUNDAI_ID,
>  		.model_id	= HYUNDAI_HY29F002T,
>  		.total_size	= 256,
>  		.page_size	= 256 * 1024,
>  		.feature_bits	= FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
>  		.tested		= TEST_OK_PRE,
>  		.probe		= probe_jedec,
>  		.probe_timing	= TIMING_ZERO, /* Datasheet has no timing info specified */
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = {
>  					{64 * 1024, 3},
>  					{32 * 1024, 1},
>  					{8 * 1024, 2},
>  					{16 * 1024, 1},
>  				},
>  				.block_erase = erase_sector_jedec,
>  			}, {
>  				.eraseblocks = { {256 * 1024, 1} },
>  				.block_erase = erase_chip_block_jedec,
>  			},
>  		},
>  		.write		= write_jedec_1,
>  		.read		= read_memmapped,
> -		.voltage	= {4750, 5250}, /* 5.0V +-5% for -45 model, +-10% for rest */
> +		.voltage	= {4750, 5250}, /* -45 speed is 4.75-5.25V, others 4.5-5.5V */
please change to:
		.voltage	= {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */

>  	},
>  
>  	{
>  		.vendor		= "Hyundai",
>  		.name		= "HY29F002B",
>  		.bustype	= CHIP_BUSTYPE_PARALLEL,
>  		.manufacture_id	= HYUNDAI_ID,
>  		.model_id	= HYUNDAI_HY29F002B,
>  		.total_size	= 256,
>  		.page_size	= 256 * 1024,
>  		.feature_bits	= FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
>  		.tested		= TEST_UNTESTED,
>  		.probe		= probe_jedec,
>  		.probe_timing	= TIMING_ZERO, /* Datasheet has no timing info specified */
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = {
>  					{16 * 1024, 1},
>  					{8 * 1024, 2},
>  					{32 * 1024, 1},
>  					{64 * 1024, 3},
>  				},
>  				.block_erase = erase_sector_jedec,
>  			}, {
>  				.eraseblocks = { {256 * 1024, 1} },
>  				.block_erase = erase_chip_block_jedec,
>  			},
>  		},
>  		.write		= write_jedec_1,
>  		.read		= read_memmapped,
> -		.voltage	= {4750, 5250}, /* 5.0V +-5% for -45 model, +-10% for rest */
> +		.voltage	= {4750, 5250}, /* -45 speed is 4.75-5.25V, others 4.5-5.5V */
same here

>  	},
>  
>  	{
>  		.vendor		= "Hyundai",
>  		.name		= "HY29F040A",
>  		.bustype	= CHIP_BUSTYPE_PARALLEL,
>  		.manufacture_id	= HYUNDAI_ID,
>  		.model_id	= HYUNDAI_HY29F040A,
>  		.total_size	= 512,
>  		.page_size	= 64 * 1024,
>  		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
>  		.tested		= TEST_UNTESTED,
>  		.probe		= probe_jedec,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { {64 * 1024, 8} },
>  				.block_erase = erase_sector_jedec,
>  			}, {
>  				.eraseblocks = { {512 * 1024, 1} },
>  				.block_erase = erase_chip_block_jedec,
>  			},
>  		},
>  		.write		= write_jedec_1,
>  		.read		= read_memmapped,
> +		.voltage	= {4500, 5500},
>  	},
>  
>  	{
>  		.vendor		= "Intel",
>  		.name		= "28F001BN/BX-B",
>  		.bustype	= CHIP_BUSTYPE_PARALLEL,
>  		.manufacture_id	= INTEL_ID,
>  		.model_id	= INTEL_28F001B,
>  		.total_size	= 128,
>  		.page_size	= 128 * 1024, /* 8k + 2x4k + 112k */
>  		.tested		= TEST_UNTESTED,
>  		.probe		= probe_jedec,
>  		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { 
>  					{8 * 1024, 1},
>  					{4 * 1024, 2},
>  					{112 * 1024, 1},
>  				},
>  				.block_erase = erase_block_82802ab,
>  			},
>  		},
>  		.write		= write_82802ab,
>  		.read		= read_memmapped,
>  		.voltage	= {4500, 5500},
>  	},
>  
>  	{
> @@ -3555,61 +3568,61 @@
>  		.write		= write_82802ab,
>  		.read		= read_memmapped,
>  		.voltage	= {4500, 5500},
>  	},
>  
>  	{
>  		.vendor		= "Intel",
>  		.name		= "28F002BC/BL/BV/BX-T",
>  		.bustype	= CHIP_BUSTYPE_PARALLEL,
>  		.manufacture_id	= INTEL_ID,
>  		.model_id	= INTEL_28F002T,
>  		.total_size	= 256,
>  		.page_size	= 256 * 1024,
>  		.tested		= TEST_OK_PRE,
>  		.probe		= probe_82802ab,
>  		.probe_timing	= TIMING_ZERO, /* Datasheet has no timing info specified */
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = {
>  					{128 * 1024, 1},
>  					{96 * 1024, 1},
>  					{8 * 1024, 2},
>  					{16 * 1024, 1},
>  				},
>  				.block_erase = erase_block_82802ab,
>  			},
>  		},
>  		.write		= write_82802ab,
>  		.read		= read_memmapped,
> -		.voltage	= {4500, 5500}, /* 5.0V +-10% read, 12V fast program & erase- +-5% standard, +-10% option */
> +		.voltage	= {4500, 5500}, /* 5.0V +-10% read, 12V fast program & erase- +-5% standard, +-10% option- differing read voltages */
please discuss this with me on irc (or mail). you can also just leave
this change out for now and we will commit the rest.

you have dropped percentage indication in favor of absolute voltages
elsewhere. OTOH this line is already way too long... maybe make it a
multiline comment above the field, depending on what needs to be added
after we have discussed the issues you have discovered.

>  	},
>  
>  	{
>  		.vendor		= "Intel",
>  		.name		= "28F008S3/S5/SC",
>  		.bustype	= CHIP_BUSTYPE_PARALLEL,
>  		.manufacture_id	= INTEL_ID,
>  		.model_id	= INTEL_28F004S3,
>  		.total_size	= 512,
>  		.page_size	= 256,
>  		.tested		= TEST_UNTESTED,
>  		.probe		= probe_82802ab,
>  		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { {64 * 1024, 8} },
>  				.block_erase = erase_block_82802ab,
>  			},
>  		},
>  		.unlock		= unlock_28f004s5,
>  		.write		= write_82802ab,
>  		.read		= read_memmapped,
>  	},
>  
>  	{
>  		.vendor		= "Intel",
>  		.name		= "28F004B5/BE/BV/BX-B",
>  		.bustype	= CHIP_BUSTYPE_PARALLEL,
>  		.manufacture_id	= INTEL_ID,
> @@ -4025,60 +4038,61 @@
>  		.vendor		= "Macronix",
>  		.name		= "MX25L1635E",
>  		.bustype	= CHIP_BUSTYPE_SPI,
>  		.manufacture_id	= MACRONIX_ID,
>  		.model_id	= MACRONIX_MX25L1635E,
>  		.total_size	= 2048,
>  		.page_size	= 256,
>  		.feature_bits	= FEATURE_WRSR_WREN,
>  		.tested		= TEST_UNTESTED,
>  		.probe		= probe_spi_rdid,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { {4 * 1024, 512} },
>  				.block_erase = spi_block_erase_20,
>  			}, {
>  				.eraseblocks = { {64 * 1024, 32} },
>  				.block_erase = spi_block_erase_d8,
>  			}, {
>  				.eraseblocks = { {2 * 1024 * 1024, 1} },
>  				.block_erase = spi_block_erase_60,
>  			}, {
>  				.eraseblocks = { {2 * 1024 * 1024, 1} },
>  				.block_erase = spi_block_erase_c7,
>  			}
>  		},
>  		.unlock		= spi_disable_blockprotect,
>  		.write		= spi_chip_write_256,
>  		.read		= spi_chip_read,
> +		.voltage	= {2700, 3600},
>  	},
>  
>  	{
>  		.vendor		= "Macronix",
>  		.name		= "MX25L3205",
>  		.bustype	= CHIP_BUSTYPE_SPI,
>  		.manufacture_id	= MACRONIX_ID,
>  		.model_id	= MACRONIX_MX25L3205,
>  		.total_size	= 4096,
>  		.page_size	= 256,
>  		.feature_bits	= FEATURE_WRSR_WREN,
>  		.tested		= TEST_OK_PREW,
>  		.probe		= probe_spi_rdid,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { {4 * 1024, 1024} },
>  				.block_erase = spi_block_erase_20,
>  			}, {
>  				.eraseblocks = { {4 * 1024, 1024} },
>  				.block_erase = spi_block_erase_d8,
>  			}, {
>  				.eraseblocks = { {4 * 1024 * 1024, 1} },
>  				.block_erase = spi_block_erase_60,
>  			}, {
>  				.eraseblocks = { {4 * 1024 * 1024, 1} },
>  				.block_erase = spi_block_erase_c7,
>  			},
>  		},
> @@ -4317,60 +4331,61 @@
>  		},
>  		.write		= write_jedec_1,
>  		.read		= read_memmapped,
>  		.voltage	= {4500, 5500},
>  	},
>  
>  	{
>  		.vendor		= "Macronix",
>  		.name		= "MX29F040",
>  		.bustype	= CHIP_BUSTYPE_PARALLEL,
>  		.manufacture_id	= MACRONIX_ID,
>  		.model_id	= MACRONIX_MX29F040,
>  		.total_size	= 512,
>  		.page_size	= 64 * 1024,
>  		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
>  		.tested		= TEST_UNTESTED,
>  		.probe		= probe_jedec,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { {64 * 1024, 8} },
>  				.block_erase = erase_sector_jedec,
>  			}, {
>  				.eraseblocks = { {512 * 1024, 1} },
>  				.block_erase = erase_chip_block_jedec,
>  			},
>  		},
>  		.write		= write_jedec_1,
>  		.read		= read_memmapped,
> +		.voltage	= {4500, 5500},
>  	},
>  
>  	{
>  		.vendor		= "Macronix",
>  		.name		= "MX29LV040",
>  		.bustype	= CHIP_BUSTYPE_PARALLEL,
>  		.manufacture_id	= MACRONIX_ID,
>  		.model_id	= MACRONIX_MX29LV040,
>  		.total_size	= 512,
>  		.page_size	= 64 * 1024,
>  		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
>  		.tested		= TEST_UNTESTED,
>  		.probe		= probe_jedec,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { {64 * 1024, 8}, },
>  				.block_erase = erase_sector_jedec,
>  			}, {
>  				.eraseblocks = { {512 * 1024, 1} },
>  				.block_erase = erase_chip_block_jedec,
>  			},
>  		},
>  		.write		= write_jedec_1,
>  		.read		= read_memmapped,
>  		.voltage	= {2700, 3600},
>  	},
>  
>  	{
> @@ -4748,60 +4763,61 @@
>  		.bustype	= CHIP_BUSTYPE_SPI,
>  		.manufacture_id	= PMC_ID,
>  		.model_id	= PMC_PM25LV016B,
>  		.total_size	= 2048,
>  		.page_size	= 256,
>  		.tested		= TEST_UNTESTED,
>  		.probe		= probe_spi_rdid,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { {4 * 1024, 512} },
>  				.block_erase = spi_block_erase_d7,
>  			}, {
>  				.eraseblocks = { {4 * 1024, 512} },
>  				.block_erase = spi_block_erase_20,
>  			}, {
>  				.eraseblocks = { {64 * 1024, 32} },
>  				.block_erase = spi_block_erase_d8,
>  			}, {
>  				.eraseblocks = { {2 * 1024 * 1024, 1} },
>  				.block_erase = spi_block_erase_60,
>  			}, {
>  				.eraseblocks = { {2 * 1024 * 1024, 1} },
>  				.block_erase = spi_block_erase_c7,
>  			}
>  		},
>  		.unlock		= spi_disable_blockprotect,
>  		.write		= spi_chip_write_256,
>  		.read		= spi_chip_read,
> +		.voltage	= {2700, 3600},
>  	},
>  
>  	{
>  		.vendor		= "PMC",
>  		.name		= "Pm25LV020",
>  		.bustype	= CHIP_BUSTYPE_SPI,
>  		.manufacture_id	= PMC_ID,
>  		.model_id	= PMC_PM25LV020,
>  		.total_size	= 256,
>  		.page_size	= 256,
>  		.tested		= TEST_UNTESTED,
>  		.probe		= probe_spi_rdid,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { {4 * 1024, 64} },
>  				.block_erase = spi_block_erase_d7,
>  			}, {
>  				.eraseblocks = { {64 * 1024, 4} },
>  				.block_erase = spi_block_erase_d8,
>  			}, {
>  				.eraseblocks = { {256 * 1024, 1} },
>  				.block_erase = spi_block_erase_c7,
>  			}
>  		},
>  		.unlock		= spi_disable_blockprotect,
>  		.write		= spi_chip_write_256,
>  		.read		= spi_chip_read,
>  		.voltage	= {2700, 3600},
> @@ -4873,60 +4889,61 @@
>  		.voltage	= {2700, 3600},
>  	},
>  
>  	{
>  		.vendor		= "PMC",
>  		.name		= "Pm25LV512",
>  		.bustype	= CHIP_BUSTYPE_SPI,
>  		.manufacture_id	= PMC_ID,
>  		.model_id	= PMC_PM25LV512,
>  		.total_size	= 64,
>  		.page_size	= 256,
>  		.tested		= TEST_UNTESTED,
>  		.probe		= probe_spi_rdid,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { {4 * 1024, 16} },
>  				.block_erase = spi_block_erase_d7,
>  			}, {
>  				.eraseblocks = { {32 * 1024, 2} },
>  				.block_erase = spi_block_erase_d8,
>  			}, {
>  				.eraseblocks = { {64 * 1024, 1} },
>  				.block_erase = spi_block_erase_c7,
>  			}
>  		},
>  		.unlock		= spi_disable_blockprotect,
>  		.write		= spi_chip_write_256,
>  		.read		= spi_chip_read,
> +		.voltage	= {2700, 3600},
>  	},
>  
>  	{
>  		.vendor		= "PMC",
>  		.name		= "Pm29F002T",
>  		.bustype	= CHIP_BUSTYPE_PARALLEL,
>  		.manufacture_id	= PMC_ID_NOPREFIX,
>  		.model_id	= PMC_PM29F002T,
>  		.total_size	= 256,
>  		.page_size	= 8 * 1024,
>  		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
>  		.tested		= TEST_OK_PRE,
>  		.probe		= probe_jedec,
>  		.probe_timing	= TIMING_FIXME, 
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = {
>  					{128 * 1024, 1},
>  					{96 * 1024, 1},
>  					{8 * 1024, 2},
>  					{16 * 1024, 1},
>  				},
>  				.block_erase = erase_sector_jedec,
>  			}, {
>  				.eraseblocks = { {256 * 1024, 1} },
>  				.block_erase = erase_chip_block_jedec,
>  			},
>  		},
>  		.write		= write_jedec_1,
> @@ -5174,60 +5191,61 @@
>  		.unlock		= unlock_82802ab,
>  		.write		= write_82802ab,
>  		.read		= read_memmapped,
>  		.voltage	= {3000, 3600},
>  	},
>  
>  	{
>  		.vendor		= "Spansion",
>  		.name		= "S25FL004A",
>  		.bustype	= CHIP_BUSTYPE_SPI,
>  		.manufacture_id	= SPANSION_ID,
>  		.model_id	= SPANSION_S25FL004A,
>  		.total_size	= 512,
>  		.page_size	= 256,
>  		.tested		= TEST_UNTESTED,
>  		.probe		= probe_spi_rdid,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { {64 * 1024, 8} },
>  				.block_erase = spi_block_erase_d8,
>  			}, {
>  				.eraseblocks = { {512 * 1024, 1} },
>  				.block_erase = spi_block_erase_c7,
>  			}
>  		},
>  		.unlock		= spi_disable_blockprotect,
>  		.write		= spi_chip_write_256,
>  		.read		= spi_chip_read,
> +		.voltage	= {2700, 3600},
>  	},
>  
>  	{
>  		.vendor		= "Spansion",
>  		.name		= "S25FL008A",
>  		.bustype	= CHIP_BUSTYPE_SPI,
>  		.manufacture_id	= SPANSION_ID,
>  		.model_id	= SPANSION_S25FL008A,
>  		.total_size	= 1024,
>  		.page_size	= 256,
>  		.tested		= TEST_OK_PRE,
>  		.probe		= probe_spi_rdid,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { {64 * 1024, 16} },
>  				.block_erase = spi_block_erase_d8,
>  			}, {
>  				.eraseblocks = { {1024 * 1024, 1} },
>  				.block_erase = spi_block_erase_c7,
>  			}
>  		},
>  		.unlock		= spi_disable_blockprotect,
>  		.write		= spi_chip_write_256,
>  		.read		= spi_chip_read,
>  		.voltage	= {2700, 3600},
>  	},
>  
>  	{
> @@ -5254,115 +5272,118 @@
>  		.unlock		= spi_disable_blockprotect,
>  		.write		= spi_chip_write_256,
>  		.read		= spi_chip_read,
>  		.voltage	= {2700, 3600},
>  	},
>  
>  	{
>  		.vendor		= "Spansion",
>  		.name		= "S25FL032A",
>  		.bustype	= CHIP_BUSTYPE_SPI,
>  		.manufacture_id	= SPANSION_ID,
>  		.model_id	= SPANSION_S25FL032A,
>  		.total_size	= 4096,
>  		.page_size	= 256,
>  		.tested		= TEST_UNTESTED,
>  		.probe		= probe_spi_rdid,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { {64 * 1024, 64} },
>  				.block_erase = spi_block_erase_d8,
>  			}, {
>  				.eraseblocks = { {4 * 1024 * 1024, 1} },
>  				.block_erase = spi_block_erase_c7,
>  			}
>  		},
>  		.unlock		= spi_disable_blockprotect,
>  		.write		= spi_chip_write_256,
>  		.read		= spi_chip_read,
> +		.voltage	= {2700, 3600},
>  	},
>  
>  	{
>  		.vendor		= "Spansion",
>  		.name		= "S25FL064A",
>  		.bustype	= CHIP_BUSTYPE_SPI,
>  		.manufacture_id	= SPANSION_ID,
>  		.model_id	= SPANSION_S25FL064A,
>  		.total_size	= 8192,
>  		.page_size	= 256,
>  		.tested		= TEST_OK_PREW,
>  		.probe		= probe_spi_rdid,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { {64 * 1024, 128} },
>  				.block_erase = spi_block_erase_d8,
>  			}, {
>  				.eraseblocks = { {8 * 1024 * 1024, 1} },
>  				.block_erase = spi_block_erase_c7,
>  			}
>  		},
>  		.unlock		= spi_disable_blockprotect,
>  		.write		= spi_chip_write_256,
>  		.read		= spi_chip_read,
> +		.voltage	= {2700, 3600},
>  	},
>  
>  	{
>  		.vendor		= "SST",
>  		.name		= "SST25VF010.REMS",
>  		.bustype	= CHIP_BUSTYPE_SPI,
>  		.manufacture_id	= SST_ID,
>  		.model_id	= SST_SST25VF010_REMS,
>  		.total_size	= 128,
>  		.page_size	= 256,
>  		.tested		= TEST_OK_PREW,
>  		.probe		= probe_spi_rems,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { {4 * 1024, 32} },
>  				.block_erase = spi_block_erase_20,
>  			}, {
>  				.eraseblocks = { {32 * 1024, 4} },
>  				.block_erase = spi_block_erase_52,
>  			}, {
>  				.eraseblocks = { {128 * 1024, 1} },
>  				.block_erase = spi_block_erase_60,
>  			},
>  		},
>  		.unlock		= spi_disable_blockprotect,
>  		.write		= spi_chip_write_1,
>  		.read		= spi_chip_read,
> +		.voltage	= {2700, 3600},
>  	},
>  
>  	{
>  		.vendor		= "SST",
>  		.name		= "SST25VF016B",
>  		.bustype	= CHIP_BUSTYPE_SPI,
>  		.manufacture_id	= SST_ID,
>  		.model_id	= SST_SST25VF016B,
>  		.total_size	= 2048,
>  		.page_size	= 256,
>  		.tested		= TEST_OK_PREW,
>  		.probe		= probe_spi_rdid,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { {4 * 1024, 512} },
>  				.block_erase = spi_block_erase_20,
>  			}, {
>  				.eraseblocks = { {32 * 1024, 64} },
>  				.block_erase = spi_block_erase_52,
>  			}, {
>  				.eraseblocks = { {64 * 1024, 32} },
>  				.block_erase = spi_block_erase_d8,
>  			}, {
>  				.eraseblocks = { {2 * 1024 * 1024, 1} },
>  				.block_erase = spi_block_erase_60,
>  			}, {
>  				.eraseblocks = { {2 * 1024 * 1024, 1} },
>  				.block_erase = spi_block_erase_c7,
> @@ -5446,60 +5467,61 @@
>  		.voltage	= {2700, 3600},
>  	},
>  
>  	{
>  		.vendor		= "SST",
>  		.name		= "SST25VF040.REMS",
>  		.bustype	= CHIP_BUSTYPE_SPI,
>  		.manufacture_id	= SST_ID,
>  		.model_id	= SST_SST25VF040_REMS,
>  		.total_size	= 512,
>  		.page_size	= 256,
>  		.tested		= TEST_OK_PR,
>  		.probe		= probe_spi_rems,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { {4 * 1024, 128} },
>  				.block_erase = spi_block_erase_20,
>  			}, {
>  				.eraseblocks = { {32 * 1024, 16} },
>  				.block_erase = spi_block_erase_52,
>  			}, {
>  				.eraseblocks = { {512 * 1024, 1} },
>  				.block_erase = spi_block_erase_60,
>  			},
>  		},
>  		.unlock		= spi_disable_blockprotect,
>  		.write		= spi_chip_write_1,
>  		.read		= spi_chip_read,
> +		.voltage	= {2700, 3600},
>  	},
>  
>  	{
>  		.vendor		= "SST",
>  		.name		= "SST25VF040B",
>  		.bustype	= CHIP_BUSTYPE_SPI,
>  		.manufacture_id	= SST_ID,
>  		.model_id	= SST_SST25VF040B,
>  		.total_size	= 512,
>  		.page_size	= 256,
>  		.tested		= TEST_UNTESTED,
>  		.probe		= probe_spi_rdid,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { {4 * 1024, 128} },
>  				.block_erase = spi_block_erase_20,
>  			}, {
>  				.eraseblocks = { {32 * 1024, 16} },
>  				.block_erase = spi_block_erase_52,
>  			}, {
>  				.eraseblocks = { {64 * 1024, 8} },
>  				.block_erase = spi_block_erase_d8,
>  			}, {
>  				.eraseblocks = { {512 * 1024, 1} },
>  				.block_erase = spi_block_erase_60,
>  			}, {
>  				.eraseblocks = { {512 * 1024, 1} },
>  				.block_erase = spi_block_erase_c7,
> @@ -5511,95 +5533,97 @@
>  		.voltage	= {2700, 3600},
>  	},
>  
>  	{
>  		.vendor		= "SST",
>  		.name		= "SST25LF040A.RES",
>  		.bustype	= CHIP_BUSTYPE_SPI,
>  		.manufacture_id	= SST_ID,
>  		.model_id	= SST_SST25VF040_REMS,
>  		.total_size	= 512,
>  		.page_size	= 256,
>  		.tested		= TEST_OK_PROBE,
>  		.probe		= probe_spi_res2,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { {4 * 1024, 128} },
>  				.block_erase = spi_block_erase_20,
>  			}, {
>  				.eraseblocks = { {32 * 1024, 16} },
>  				.block_erase = spi_block_erase_52,
>  			}, {
>  				.eraseblocks = { {512 * 1024, 1} },
>  				.block_erase = spi_block_erase_60,
>  			},
>  		},
>  		.unlock		= spi_disable_blockprotect,
>  		.write		= spi_chip_write_1,
>  		.read		= spi_chip_read,
> +		.voltage	= {3000, 3600},
>  	},
>  
>  	{
>  		.vendor		= "SST",
>  		.name		= "SST25VF040B.REMS",
>  		.bustype	= CHIP_BUSTYPE_SPI,
>  		.manufacture_id	= SST_ID,
>  		.model_id	= SST_SST25VF040B_REMS,
>  		.total_size	= 512,
>  		.page_size	= 256,
>  		.tested		= TEST_OK_PR,
>  		.probe		= probe_spi_rems,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { {4 * 1024, 128} },
>  				.block_erase = spi_block_erase_20,
>  			}, {
>  				.eraseblocks = { {32 * 1024, 16} },
>  				.block_erase = spi_block_erase_52,
>  			}, {
>  				.eraseblocks = { {64 * 1024, 8} },
>  				.block_erase = spi_block_erase_d8,
>  			}, {
>  				.eraseblocks = { {512 * 1024, 1} },
>  				.block_erase = spi_block_erase_60,
>  			}, {
>  				.eraseblocks = { {512 * 1024, 1} },
>  				.block_erase = spi_block_erase_c7,
>  			},
>  		},
>  		.unlock		= spi_disable_blockprotect,
>  		.write		= spi_chip_write_1,
>  		.read		= spi_chip_read,
> +		.voltage	= {2700, 3600},
>  	},
>  
>  	{
>  		.vendor		= "SST",
>  		.name		= "SST25VF080B",
>  		.bustype	= CHIP_BUSTYPE_SPI,
>  		.manufacture_id	= SST_ID,
>  		.model_id	= SST_SST25VF080B,
>  		.total_size	= 1024,
>  		.page_size	= 256,
>  		.tested		= TEST_OK_PREW,
>  		.probe		= probe_spi_rdid,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { {4 * 1024, 256} },
>  				.block_erase = spi_block_erase_20,
>  			}, {
>  				.eraseblocks = { {32 * 1024, 32} },
>  				.block_erase = spi_block_erase_52,
>  			}, {
>  				.eraseblocks = { {64 * 1024, 16} },
>  				.block_erase = spi_block_erase_d8,
>  			}, {
>  				.eraseblocks = { {1024 * 1024, 1} },
>  				.block_erase = spi_block_erase_60,
>  			}, {
>  				.eraseblocks = { {1024 * 1024, 1} },
>  				.block_erase = spi_block_erase_c7,
> @@ -6753,153 +6777,154 @@
>  		.read		= spi_chip_read,
>  	},
>  
>  	{
>  		.vendor		= "ST",
>  		.name		= "M25PX32",
>  		.bustype	= CHIP_BUSTYPE_SPI,
>  		.manufacture_id	= ST_ID,
>  		.model_id	= ST_M25PX32,
>  		.total_size	= 4096,
>  		.page_size	= 256,
>  		.tested		= TEST_OK_PRE,
>  		.probe		= probe_spi_rdid,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { { 4 * 1024, 1024 } },
>  				.block_erase = spi_block_erase_20,
>  			}, {
>  				.eraseblocks = { {64 * 1024, 64} },
>  				.block_erase = spi_block_erase_d8,
>  			}, {
>  				.eraseblocks = { {4 * 1024 * 1024, 1} },
>  				.block_erase = spi_block_erase_c7,
>  			}
>  		},
>  		.unlock		= spi_disable_blockprotect,
>  		.write		= spi_chip_write_256,
>  		.read		= spi_chip_read,
> +		.voltage	= {2700, 3600},
>  	},
>  
>  	{
>  		.vendor		= "ST",
>  		.name		= "M25PX64",
>  		.bustype	= CHIP_BUSTYPE_SPI,
>  		.manufacture_id	= ST_ID,
>  		.model_id	= ST_M25PX64,
>  		.total_size	= 8192,
>  		.page_size	= 256,
>  		.tested		= TEST_OK_PRE,
>  		.probe		= probe_spi_rdid,
>  		.probe_timing	= TIMING_ZERO,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { { 4 * 1024, 2048 } },
>  				.block_erase = spi_block_erase_20,
>  			}, {
>  				.eraseblocks = { {64 * 1024, 128} },
>  				.block_erase = spi_block_erase_d8,
>  			}, {
>  				.eraseblocks = { {8 * 1024 * 1024, 1} },
>  				.block_erase = spi_block_erase_c7,
>  			}
>  		},
>  		.unlock		= spi_disable_blockprotect,
>  		.write		= spi_chip_write_256,
>  		.read		= spi_chip_read,
>  	},
>  
>  	{
>  		.vendor		= "ST",
>  		.name		= "M29F002B",
>  		.bustype	= CHIP_BUSTYPE_PARALLEL,
>  		.manufacture_id	= ST_ID,
>  		.model_id	= ST_M29F002B,
>  		.total_size	= 256,
>  		.page_size	= 64 * 1024,
>  		.feature_bits	= FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
>  		.tested		= TEST_UNTESTED,
>  		.probe		= probe_jedec,
>  		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = {
>  					{16 * 1024, 1},
>  					{8 * 1024, 2},
>  					{32 * 1024, 1},
>  					{64 * 1024, 3},
>  				},
>  				.block_erase = erase_sector_jedec,
>  			}, {
>  				.eraseblocks = { {256 * 1024, 1} },
>  				.block_erase = erase_chip_block_jedec,
>  			}
>  		},
>  		.write		= write_jedec_1,
>  		.read		= read_memmapped,
> -		.voltage	= {4750, 5250}, /* Datasheet says some are only 4.75-5.25 V */
> +		.voltage	= {4750, 5250}, /* -X model is 4.75-5.25V, others 4.5-5.5V */ 

"model" instead of "speed"/nothing above, please use:
		.voltage	= {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */

>  	},
>  
>  	{
>  		.vendor		= "ST",
>  		.name		= "M29F002T/NT",
>  		.bustype	= CHIP_BUSTYPE_PARALLEL,
>  		.manufacture_id	= ST_ID,
>  		.model_id	= ST_M29F002T,
>  		.total_size	= 256,
>  		.page_size	= 64 * 1024,
>  		.feature_bits	= FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
>  		.tested		= TEST_UNTESTED,
>  		.probe		= probe_jedec,
>  		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = {
>  					{64 * 1024, 3},
>  					{32 * 1024, 1},
>  					{8 * 1024, 2},
>  					{16 * 1024, 1},
>  				},
>  				.block_erase = erase_sector_jedec,
>  			}, {
>  				.eraseblocks = { {256 * 1024, 1} },
>  				.block_erase = erase_chip_block_jedec,
>  			}
>  		},
>  		.write		= write_jedec_1,
>  		.read		= read_memmapped,
> -		.voltage	= {4750, 5250}, /* Datasheet says some are only 4.75-5.25 V */
> +		.voltage	= {4750, 5250}, /* -X model is 4.75-5.25V, others 4.5-5.5V */

see above

>  	},
>  
>  	{
>  		.vendor		= "ST",
>  		.name		= "M29F040B",
>  		.bustype	= CHIP_BUSTYPE_PARALLEL,
>  		.manufacture_id	= ST_ID,
>  		.model_id	= ST_M29F040B,
>  		.total_size	= 512,
>  		.page_size	= 64 * 1024,
>  		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
>  		.tested		= TEST_UNTESTED,
>  		.probe		= probe_jedec,
>  		.probe_timing	= TIMING_ZERO, /* datasheet specifies no timing */
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { {64 * 1024, 8}, },
>  				.block_erase = erase_sector_jedec,
>  			}, {
>  				.eraseblocks = { {512 * 1024, 1} },
>  				.block_erase = erase_chip_block_jedec,
>  			}
>  		},
>  		.write		= write_jedec_1,
>  		.read		= read_memmapped,
>  		.voltage	= {4500, 5500},
>  	},
>  
>  	{
> @@ -8104,60 +8129,61 @@
>  	},
>  
>  	{
>  		.vendor		= "Winbond",
>  		.name		= "W39L040",
>  		.bustype	= CHIP_BUSTYPE_PARALLEL,
>  		.manufacture_id	= WINBOND_ID,
>  		.model_id	= WINBOND_W39L040,
>  		.total_size	= 512,
>  		.page_size	= 64 * 1024,
>  		.feature_bits	= FEATURE_EITHER_RESET,
>  		.tested		= TEST_OK_PR,
>  		.probe		= probe_jedec,
>  		.probe_timing	= 10,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { {4 * 1024, 128} },
>  				.block_erase = erase_block_jedec,
>  			}, {
>  				.eraseblocks = { {64 * 1024, 8} },
>  				.block_erase = erase_sector_jedec,
>  			}, {
>  				.eraseblocks = { {512 * 1024, 1} },
>  				.block_erase = erase_chip_block_jedec,
>  			}
>  		},
>  		.printlock	= printlock_w39l040,
>  		.write		= write_jedec_1,
>  		.read		= read_memmapped,
> +		.voltage	= {3000, 3600},
>  	},
>  
>  	{
>  		.vendor		= "Winbond",
>  		.name		= "W39V040A",
>  		.bustype	= CHIP_BUSTYPE_LPC,
>  		.manufacture_id	= WINBOND_ID,
>  		.model_id	= WINBOND_W39V040A,
>  		.total_size	= 512,
>  		.page_size	= 64 * 1024,
>  		.feature_bits	= FEATURE_EITHER_RESET,
>  		.tested		= TEST_OK_PR,
>  		.probe		= probe_jedec,
>  		.probe_timing	= 10, 
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { {64 * 1024, 8} },
>  				.block_erase = erase_sector_jedec,
>  			}, {
>  				.eraseblocks = { {512 * 1024, 1} },
>  				.block_erase = erase_chip_block_jedec,
>  			}
>  		},
>  		.printlock	= printlock_w39v040a,
>  		.write		= write_jedec_1,
>  		.read		= read_memmapped,
>  		.voltage	= {3000, 3600},
>  	},
>  
> @@ -8248,87 +8274,89 @@
>  		.read		= read_memmapped,
>  		.voltage	= {3000, 3600},
>  	},
>  
>  	{
>  		.vendor		= "Winbond",
>  		.name		= "W39V040FB",
>  		.bustype	= CHIP_BUSTYPE_FWH,
>  		.manufacture_id	= WINBOND_ID,
>  		.model_id	= WINBOND_W39V040B,
>  		.total_size	= 512,
>  		.page_size	= 64 * 1024,
>  		.feature_bits	= FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
>  		.tested		= TEST_OK_PREW,
>  		.probe		= probe_jedec,
>  		.probe_timing	= 10, 
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { {64 * 1024, 8} },
>  				.block_erase = erase_sector_jedec,
>  			}, {
>  				.eraseblocks = { {512 * 1024, 1} },
>  				.block_erase = erase_chip_block_jedec,
>  			}
>  		},
>  		.printlock	= printlock_w39v040fb,
>  		.unlock		= unlock_w39v040fb,
>  		.write		= write_jedec_1,
>  		.read		= read_memmapped,
> +		.voltage	= {3000, 3600}, /* Also has 12V fast program */
>  	},
>  
>  	{
>  		.vendor		= "Winbond",
>  		.name		= "W39V040FC",
>  		.bustype	= CHIP_BUSTYPE_FWH,
>  		.manufacture_id	= WINBOND_ID,
>  		.model_id	= WINBOND_W39V040C,
>  		.total_size	= 512,
>  		.page_size	= 64 * 1024,
>  		.feature_bits	= FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
>  		.tested		= TEST_UNTESTED,
>  		.probe		= probe_jedec,
>  		.probe_timing	= 10,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { {64 * 1024, 8} },
>  				.block_erase = erase_sector_jedec,
>  			}, {
>  				.eraseblocks = { {512 * 1024, 1} },
>  				.block_erase = erase_chip_block_jedec,
>  			}
>  		},
>  		.printlock	= printlock_w39v040fc,
>  		.write		= write_jedec_1,
>  		.read		= read_memmapped,
> +		.voltage	= {3000, 3600}, /* Also has 12V fast program */
>  	},
>  
>  	{
>  		.vendor		= "Winbond",
>  		.name		= "W39V080A",
>  		.bustype	= CHIP_BUSTYPE_LPC,
>  		.manufacture_id	= WINBOND_ID,
>  		.model_id	= WINBOND_W39V080A,
>  		.total_size	= 1024,
>  		.page_size	= 64 * 1024,
>  		.feature_bits	= FEATURE_EITHER_RESET,
>  		.tested		= TEST_UNTESTED,
>  		.probe		= probe_jedec,
>  		.probe_timing	= 10, 
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { {64 * 1024, 16} },
>  				.block_erase = erase_sector_jedec,
>  			}, {
>  				.eraseblocks = { {1024 * 1024, 1} },
>  				.block_erase = erase_chip_block_jedec,
>  			}
>  		},
>  		.printlock	= printlock_w39v080a,
>  		.write		= write_jedec_1,
>  		.read		= read_memmapped,
>  		.voltage	= {3000, 3600},
>  	},
>  
> @@ -8451,88 +8479,89 @@
>  		.read		= read_memmapped,
>  		.voltage	= {3000, 3600},
>  	},
>  
>  	{
>  		.vendor		= "Winbond",
>  		.name		= "W39V080FA",
>  		.bustype	= CHIP_BUSTYPE_FWH,
>  		.manufacture_id	= WINBOND_ID,
>  		.model_id	= WINBOND_W39V080FA,
>  		.total_size	= 1024,
>  		.page_size	= 64 * 1024,
>  		.feature_bits	= FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
>  		.tested		= TEST_OK_PRE,
>  		.probe		= probe_jedec,
>  		.probe_timing	= 10,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { {64 * 1024, 16}, },
>  				.block_erase = erase_sector_jedec,
>  			}, {
>  				.eraseblocks = { {1024 * 1024, 1} },
>  				.block_erase = erase_chip_block_jedec,
>  			}
>  		},
>  		.printlock	= printlock_w39v080fa,
>  		.unlock		= unlock_w39v080fa,
>  		.write		= write_jedec_1,
>  		.read		= read_memmapped,
> -		.voltage	= {3000, 3600}, /* 12 V fast program mode */
> +		.voltage	= {3000, 3600}, /* Also has 12V fast program*/

missing space at the end

>  	},
>  
>  	{
>  		.vendor		= "Winbond",
>  		.name		= "W39V080FA (dual mode)",
>  		.bustype	= CHIP_BUSTYPE_FWH,
>  		.manufacture_id	= WINBOND_ID,
>  		.model_id	= WINBOND_W39V080FA_DM,
>  		.total_size	= 512,
>  		.page_size	= 64 * 1024,
>  		.feature_bits	= FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
>  		.tested		= TEST_UNTESTED,
>  		.probe		= probe_jedec,
>  		.probe_timing	= 10,
>  		.block_erasers	=
>  		{
>  			{
>  				.eraseblocks = { {64 * 1024, 8}, },
>  				.block_erase = erase_sector_jedec,
>  			}, {
>  				.eraseblocks = { {512 * 1024, 1} },
>  				.block_erase = erase_chip_block_jedec,
>  			}
>  		},
>  		.printlock	= printlock_w39v080fa_dual,
>  		.write		= write_jedec_1,
>  		.read		= read_memmapped,
> +		.voltage	= {3000, 3600}, /* Also has 12V fast program */
>  	},
>  
>  	{
>  		.vendor		= "AMIC",
>  		.name		= "unknown AMIC SPI chip",
>  		.bustype	= CHIP_BUSTYPE_SPI,
>  		.manufacture_id	= AMIC_ID,
>  		.model_id	= GENERIC_DEVICE_ID,
>  		.total_size	= 0,
>  		.page_size	= 256,
>  		.tested		= TEST_BAD_PREW,
>  		.probe		= probe_spi_rdid4,
>  		.probe_timing	= TIMING_ZERO,
>  		.write		= NULL,
>  		.read		= NULL,
>  	},
>  
>  	{
>  		.vendor		= "Atmel",
>  		.name		= "unknown Atmel SPI chip",
>  		.bustype	= CHIP_BUSTYPE_SPI,
>  		.manufacture_id	= ATMEL_ID,
>  		.model_id	= GENERIC_DEVICE_ID,
>  		.total_size	= 0,
>  		.page_size	= 256,
>  		.tested		= TEST_BAD_PREW,
>  		.probe		= probe_spi_rdid,
>  		.probe_timing	= TIMING_ZERO,
>  		.write		= NULL,
>  		.read		= NULL,

i think the next iteration will be committable.

i have not looked how many chips are still missing voltage fields, but
one could use my voltage printing patches to see that easily... (by
using flashrom -V -L)
http://patchwork.coreboot.org/patch/3215/
http://patchwork.coreboot.org/patch/3216/
dunno if they still apply cleanly, but shouldnt be hard to rebase.
-- 
Kind regards/Mit freundlichen Grüßen, Stefan Tauner




More information about the flashrom mailing list