Patchwork Add preliminary support for AMIC chips with uniform 4kB sectors

login
register
about
Submitter Daniel Lenski
Date 2010-07-23 22:26:46
Message ID <1279924006.27628.16.camel@basashi>
Download mbox | patch
Permalink /patch/1674/
State Superseded
Headers show

Comments

Daniel Lenski - 2010-07-23 22:26:46
This patch should enable read/write/erase support for these
chips, but does *not* implement unlock functionality for them yet,
because they have more complex protection features than simply
BPx block-protect bits.

Datasheets:
http://www.amictechnology.com/pdf/A25L512.pdf
http://www.amictechnology.com/pdf/A25L010.pdf
http://www.amictechnology.com/pdf/A25L020.pdf
http://www.amictechnology.com/pdf/A25L040.pdf
http://www.amictechnology.com/pdf/A25L080.pdf
http://www.amictechnology.com/pdf/A25L016.pdf
http://www.amictechnology.com/pdf/A25L032.pdf
http://www.amictechnology.com/pdf/A25LQ032.pdf

IDs:
0x37 0x3010 is A25L512 (uniform 4k sectors)
0x37 0x3011 is A25L010 (uniform 4k sectors)
0x37 0x3012 is A25L020 (uniform 4k sectors)
0x37 0x3013 is A25L040 (uniform 4k sectors)
0x37 0x3014 is A25L080 (uniform 4k sectors)
0x37 0x3015 is A25L016 (uniform 4k sectors)
0x37 0x3016 is A25L032 (uniform 4k sectors)
0x37 0x4016 is A25LQ032 (uniform 4k sectors, has quad-rate read)

Please note that the IDs of the newer chips all use AMIC_ID_NOPREFIX
instead of AMIC_ID, and that means they use probe_spi_rdid instead of
probe_spi_rdid4.

Signed-off-by: Dan Lenski <dlenski@gmail.com>
Carl-Daniel Hailfinger - 2010-07-24 08:16:57
On 24.07.2010 00:26, Daniel Lenski wrote:
> This patch should enable read/write/erase support for these
> chips, but does *not* implement unlock functionality for them yet,
> because they have more complex protection features than simply
> BPx block-protect bits.
>
> Datasheets:
> http://www.amictechnology.com/pdf/A25L512.pdf
> http://www.amictechnology.com/pdf/A25L010.pdf
> http://www.amictechnology.com/pdf/A25L020.pdf
> http://www.amictechnology.com/pdf/A25L040.pdf
> http://www.amictechnology.com/pdf/A25L080.pdf
> http://www.amictechnology.com/pdf/A25L016.pdf
> http://www.amictechnology.com/pdf/A25L032.pdf
> http://www.amictechnology.com/pdf/A25LQ032.pdf
>
> IDs:
> 0x37 0x3010 is A25L512 (uniform 4k sectors)
> 0x37 0x3011 is A25L010 (uniform 4k sectors)
> 0x37 0x3012 is A25L020 (uniform 4k sectors)
> 0x37 0x3013 is A25L040 (uniform 4k sectors)
> 0x37 0x3014 is A25L080 (uniform 4k sectors)
> 0x37 0x3015 is A25L016 (uniform 4k sectors)
> 0x37 0x3016 is A25L032 (uniform 4k sectors)
> 0x37 0x4016 is A25LQ032 (uniform 4k sectors, has quad-rate read)
>
> Please note that the IDs of the newer chips all use AMIC_ID_NOPREFIX
> instead of AMIC_ID, and that means they use probe_spi_rdid instead of
> probe_spi_rdid4.
>
> Signed-off-by: Dan Lenski <dlenski@gmail.com>
>   

Thanks for your patch! Review follows.

General remark: Can you order the eraseblock definitions by eraseblock
size (smallest one first)? This allows us to use a better reflashing
granularity in the first write/erase attempt, and reserves bigger
granularities for the case where smaller granularities fail.


> diff --git a/flashchips.c b/flashchips.c
> index c6d265e..29dad48 100644
> --- a/flashchips.c
> +++ b/flashchips.c
> @@ -1532,6 +1532,292 @@ struct flashchip flashchips[] = {
>  
>  	{
>  		.vendor		= "AMIC",
> +		.name		= "A25L512",
> +		.bustype	= CHIP_BUSTYPE_SPI,
> +		.manufacture_id	= AMIC_ID_NOPREFIX,
> +		.model_id	= AMIC_A25L512,
> +		.total_size	= 64,
> +		.page_size	= 256,
> +		.tested		= TEST_UNTESTED,
> +		.probe		= probe_spi_rdid,
> +		.probe_timing	= TIMING_ZERO,
> +		.block_erasers	=
> +		{
> +			{
> +				.eraseblocks = { { 64 * 1024, 1 } },
> +				.block_erase = spi_block_erase_d8,
> +			}, {
> +				.eraseblocks = { { 64 * 1024, 1 } },
> +				.block_erase = spi_block_erase_52,
>   

I can't find the 52h SPI opcode in the datasheet.


> +			}, {
> +				.eraseblocks = { { 4 * 1024, 16 } },
> +				.block_erase = spi_block_erase_20,
> +			}, {
> +				.eraseblocks = { { 64 * 1024, 1} },
> +				.block_erase = spi_block_erase_60,
>   

I can't find the 60h SPI opcode in the datasheet.


> +			}, {
> +				.eraseblocks = { { 64 * 1024, 1} },
> +				.block_erase = spi_block_erase_c7,
> +			}
> +		},
> +		.unlock		= NULL,
>   

Can you add a comment so it looks like this:

		.unlock		= NULL, /* Two-byte status reg */



> +		.write		= spi_chip_write_256,
> +		.read		= spi_chip_read,
> +	},
> +
> +
> +	{
> +		.vendor		= "AMIC",
> +		.name		= "A25L010",
> +		.bustype	= CHIP_BUSTYPE_SPI,
> +		.manufacture_id	= AMIC_ID_NOPREFIX,
> +		.model_id	= AMIC_A25L010,
> +		.total_size	= 128,
> +		.page_size	= 256,
> +		.tested		= TEST_UNTESTED,
> +		.probe		= probe_spi_rdid,
> +		.probe_timing	= TIMING_ZERO,
> +		.block_erasers	=
> +		{
> +			{
> +				.eraseblocks = { { 64 * 1024, 2 } },
> +				.block_erase = spi_block_erase_d8,
> +			}, {
> +				.eraseblocks = { { 64 * 1024, 2 } },
> +				.block_erase = spi_block_erase_52,
>   

I can't find 52h.


> +			}, {
> +				.eraseblocks = { { 4 * 1024, 32 } },
> +				.block_erase = spi_block_erase_20,
> +			}, {
> +				.eraseblocks = { { 128 * 1024, 1} },
> +				.block_erase = spi_block_erase_60,
>   

I can't find 60h.


> +			}, {
> +				.eraseblocks = { { 128 * 1024, 1} },
> +				.block_erase = spi_block_erase_c7,
> +			}
> +		},
> +		.unlock		= NULL,
> +		.write		= spi_chip_write_256,
> +		.read		= spi_chip_read,
> +	},
> +
> +
> +	{
> +		.vendor		= "AMIC",
> +		.name		= "A25L020",
> +		.bustype	= CHIP_BUSTYPE_SPI,
> +		.manufacture_id	= AMIC_ID_NOPREFIX,
> +		.model_id	= AMIC_A25L020,
> +		.total_size	= 256,
> +		.page_size	= 256,
> +		.tested		= TEST_UNTESTED,
> +		.probe		= probe_spi_rdid,
> +		.probe_timing	= TIMING_ZERO,
> +		.block_erasers	=
> +		{
> +			{
> +				.eraseblocks = { { 64 * 1024, 4 } },
> +				.block_erase = spi_block_erase_d8,
> +			}, {
> +				.eraseblocks = { { 64 * 1024, 4 } },
> +				.block_erase = spi_block_erase_52,
>   

I can't find 52h.


> +			}, {
> +				.eraseblocks = { { 4 * 1024, 64 } },
> +				.block_erase = spi_block_erase_20,
> +			}, {
> +				.eraseblocks = { { 256 * 1024, 1} },
> +				.block_erase = spi_block_erase_60,
>   

I can't find 60h.


> +			}, {
> +				.eraseblocks = { { 256 * 1024, 1} },
> +				.block_erase = spi_block_erase_c7,
> +			}
> +		},
> +		.unlock		= NULL,
> +		.write		= spi_chip_write_256,
> +		.read		= spi_chip_read,
> +	},
> +
> +
> +	{
> +		.vendor		= "AMIC",
> +		.name		= "A25L040",
> +		.bustype	= CHIP_BUSTYPE_SPI,
> +		.manufacture_id	= AMIC_ID_NOPREFIX,
> +		.model_id	= AMIC_A25L040,
> +		.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 = { { 64 * 1024, 8 } },
> +				.block_erase = spi_block_erase_52,
>   

I can't find 52h.


> +			}, {
> +				.eraseblocks = { { 4 * 1024, 128 } },
> +				.block_erase = spi_block_erase_20,
> +			}, {
> +				.eraseblocks = { { 512 * 1024, 1} },
> +				.block_erase = spi_block_erase_60,
>   

I can't find 60h.


> +			}, {
> +				.eraseblocks = { { 512 * 1024, 1} },
> +				.block_erase = spi_block_erase_c7,
> +			}
> +		},
> +		.unlock		= NULL,
> +		.write		= spi_chip_write_256,
> +		.read		= spi_chip_read,
> +	},
> +
> +
> +	{
> +		.vendor		= "AMIC",
> +		.name		= "A25L080",
> +		.bustype	= CHIP_BUSTYPE_SPI,
> +		.manufacture_id	= AMIC_ID_NOPREFIX,
> +		.model_id	= AMIC_A25L080,
> +		.total_size	= 1024,
> +		.page_size	= 256,
> +		.tested		= TEST_UNTESTED,
> +		.probe		= probe_spi_rdid,
> +		.probe_timing	= TIMING_ZERO,
> +		.block_erasers	=
> +		{
> +			{
> +				.eraseblocks = { { 64 * 1024, 16 } },
> +				.block_erase = spi_block_erase_d8,
> +			}, {
> +				.eraseblocks = { { 64 * 1024, 16 } },
> +				.block_erase = spi_block_erase_52,
>   

I can't find 52h.


> +			}, {
> +				.eraseblocks = { { 4 * 1024, 256 } },
> +				.block_erase = spi_block_erase_20,
> +			}, {
> +				.eraseblocks = { { 1024 * 1024, 1} },
> +				.block_erase = spi_block_erase_60,
>   

I can't find 60h.


> +			}, {
> +				.eraseblocks = { { 1024 * 1024, 1} },
> +				.block_erase = spi_block_erase_c7,
> +			}
> +		},
> +		.unlock		= NULL,
> +		.write		= spi_chip_write_256,
> +		.read		= spi_chip_read,
> +	},
> +
> +
> +	{
> +		.vendor		= "AMIC",
> +		.name		= "A25L016",
> +		.bustype	= CHIP_BUSTYPE_SPI,
> +		.manufacture_id	= AMIC_ID_NOPREFIX,
> +		.model_id	= AMIC_A25L016,
> +		.total_size	= 2048,
> +		.page_size	= 256,
> +		.tested		= TEST_UNTESTED,
> +		.probe		= probe_spi_rdid,
> +		.probe_timing	= TIMING_ZERO,
> +		.block_erasers	=
> +		{
> +			{
> +				.eraseblocks = { { 64 * 1024, 32 } },
> +				.block_erase = spi_block_erase_d8,
> +			}, {
> +				.eraseblocks = { { 64 * 1024, 32 } },
> +				.block_erase = spi_block_erase_52,
>   

I can't find 52h.


> +			}, {
> +				.eraseblocks = { { 4 * 1024, 512 } },
> +				.block_erase = spi_block_erase_20,
> +			}, {
> +				.eraseblocks = { { 2048 * 1024, 1} },
> +				.block_erase = spi_block_erase_60,
>   

I can't find 60h.


> +			}, {
> +				.eraseblocks = { { 2048 * 1024, 1} },
> +				.block_erase = spi_block_erase_c7,
> +			}
> +		},
> +		.unlock		= NULL,
> +		.write		= spi_chip_write_256,
> +		.read		= spi_chip_read,
> +	},
> +
> +
> +	{
> +		.vendor		= "AMIC",
> +		.name		= "A25L032",
> +		.bustype	= CHIP_BUSTYPE_SPI,
> +		.manufacture_id	= AMIC_ID_NOPREFIX,
> +		.model_id	= AMIC_A25L032,
> +		.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 = { { 64 * 1024, 64 } },
> +				.block_erase = spi_block_erase_52,
> +			}, {
> +				.eraseblocks = { { 4 * 1024, 1024 } },
> +				.block_erase = spi_block_erase_20,
> +			}, {
> +				.eraseblocks = { { 4096 * 1024, 1} },
> +				.block_erase = spi_block_erase_60,
> +			}, {
> +				.eraseblocks = { { 4096 * 1024, 1} },
> +				.block_erase = spi_block_erase_c7,
>   

Can you use the order 20, 52, d8, 60, c7 here?


> +			}
> +		},
> +		.unlock		= NULL,
> +		.write		= spi_chip_write_256,
> +		.read		= spi_chip_read,
> +	},
> +
> +	{
> +		.vendor		= "AMIC",
> +		.name		= "A25LQ032",
> +		.bustype	= CHIP_BUSTYPE_SPI,
> +		.manufacture_id	= AMIC_ID_NOPREFIX,
> +		.model_id	= AMIC_A25LQ032,
> +		.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 = { { 64 * 1024, 64 } },
> +				.block_erase = spi_block_erase_52,
> +			}, {
> +				.eraseblocks = { { 4 * 1024, 1024 } },
> +				.block_erase = spi_block_erase_20,
> +			}, {
> +				.eraseblocks = { { 4096 * 1024, 1} },
> +				.block_erase = spi_block_erase_60,
> +			}, {
> +				.eraseblocks = { { 4096 * 1024, 1} },
> +				.block_erase = spi_block_erase_c7,
>   

Can you use the order 20, 52, d8, 60, c7 here?


> +			}
> +		},
> +		.unlock		= NULL,
> +		.write		= spi_chip_write_256,
> +		.read		= spi_chip_read,
> +	},
> +
> +	{
> +		.vendor		= "AMIC",
>  		.name		= "A29002B",
>  		.bustype	= CHIP_BUSTYPE_PARALLEL,
>  		.manufacture_id	= AMIC_ID_NOPREFIX,
> diff --git a/flashchips.h b/flashchips.h
> index 3e2befa..0b16e3b 100644
> --- a/flashchips.h
> +++ b/flashchips.h
> @@ -88,6 +88,14 @@
>  #define AMIC_A25L80P		0x2014	/* Seems that no A25L80PT exists */
>  #define AMIC_A25L16PT		0x2025
>  #define AMIC_A25L16PU		0x2015
> +#define AMIC_A25L512		0x3010
> +#define AMIC_A25L010		0x3011
> +#define AMIC_A25L020		0x3012
> +#define AMIC_A25L040		0x3013
> +#define AMIC_A25L080		0x3014
> +#define AMIC_A25L016		0x3015
> +#define AMIC_A25L032		0x3016
> +#define AMIC_A25LQ032		0x4016
>  #define AMIC_A29002B		0x0d
>  #define AMIC_A29002T		0x8C	/* Same as A290021T */
>  #define AMIC_A29040B		0x86
>   

Looks good otherwise.

Regards,
Carl-Daniel

Patch

diff --git a/flashchips.c b/flashchips.c
index c6d265e..29dad48 100644
--- a/flashchips.c
+++ b/flashchips.c
@@ -1532,6 +1532,292 @@  struct flashchip flashchips[] = {
 
 	{
 		.vendor		= "AMIC",
+		.name		= "A25L512",
+		.bustype	= CHIP_BUSTYPE_SPI,
+		.manufacture_id	= AMIC_ID_NOPREFIX,
+		.model_id	= AMIC_A25L512,
+		.total_size	= 64,
+		.page_size	= 256,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	=
+		{
+			{
+				.eraseblocks = { { 64 * 1024, 1 } },
+				.block_erase = spi_block_erase_d8,
+			}, {
+				.eraseblocks = { { 64 * 1024, 1 } },
+				.block_erase = spi_block_erase_52,
+			}, {
+				.eraseblocks = { { 4 * 1024, 16 } },
+				.block_erase = spi_block_erase_20,
+			}, {
+				.eraseblocks = { { 64 * 1024, 1} },
+				.block_erase = spi_block_erase_60,
+			}, {
+				.eraseblocks = { { 64 * 1024, 1} },
+				.block_erase = spi_block_erase_c7,
+			}
+		},
+		.unlock		= NULL,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+	},
+
+
+	{
+		.vendor		= "AMIC",
+		.name		= "A25L010",
+		.bustype	= CHIP_BUSTYPE_SPI,
+		.manufacture_id	= AMIC_ID_NOPREFIX,
+		.model_id	= AMIC_A25L010,
+		.total_size	= 128,
+		.page_size	= 256,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	=
+		{
+			{
+				.eraseblocks = { { 64 * 1024, 2 } },
+				.block_erase = spi_block_erase_d8,
+			}, {
+				.eraseblocks = { { 64 * 1024, 2 } },
+				.block_erase = spi_block_erase_52,
+			}, {
+				.eraseblocks = { { 4 * 1024, 32 } },
+				.block_erase = spi_block_erase_20,
+			}, {
+				.eraseblocks = { { 128 * 1024, 1} },
+				.block_erase = spi_block_erase_60,
+			}, {
+				.eraseblocks = { { 128 * 1024, 1} },
+				.block_erase = spi_block_erase_c7,
+			}
+		},
+		.unlock		= NULL,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+	},
+
+
+	{
+		.vendor		= "AMIC",
+		.name		= "A25L020",
+		.bustype	= CHIP_BUSTYPE_SPI,
+		.manufacture_id	= AMIC_ID_NOPREFIX,
+		.model_id	= AMIC_A25L020,
+		.total_size	= 256,
+		.page_size	= 256,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	=
+		{
+			{
+				.eraseblocks = { { 64 * 1024, 4 } },
+				.block_erase = spi_block_erase_d8,
+			}, {
+				.eraseblocks = { { 64 * 1024, 4 } },
+				.block_erase = spi_block_erase_52,
+			}, {
+				.eraseblocks = { { 4 * 1024, 64 } },
+				.block_erase = spi_block_erase_20,
+			}, {
+				.eraseblocks = { { 256 * 1024, 1} },
+				.block_erase = spi_block_erase_60,
+			}, {
+				.eraseblocks = { { 256 * 1024, 1} },
+				.block_erase = spi_block_erase_c7,
+			}
+		},
+		.unlock		= NULL,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+	},
+
+
+	{
+		.vendor		= "AMIC",
+		.name		= "A25L040",
+		.bustype	= CHIP_BUSTYPE_SPI,
+		.manufacture_id	= AMIC_ID_NOPREFIX,
+		.model_id	= AMIC_A25L040,
+		.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 = { { 64 * 1024, 8 } },
+				.block_erase = spi_block_erase_52,
+			}, {
+				.eraseblocks = { { 4 * 1024, 128 } },
+				.block_erase = spi_block_erase_20,
+			}, {
+				.eraseblocks = { { 512 * 1024, 1} },
+				.block_erase = spi_block_erase_60,
+			}, {
+				.eraseblocks = { { 512 * 1024, 1} },
+				.block_erase = spi_block_erase_c7,
+			}
+		},
+		.unlock		= NULL,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+	},
+
+
+	{
+		.vendor		= "AMIC",
+		.name		= "A25L080",
+		.bustype	= CHIP_BUSTYPE_SPI,
+		.manufacture_id	= AMIC_ID_NOPREFIX,
+		.model_id	= AMIC_A25L080,
+		.total_size	= 1024,
+		.page_size	= 256,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	=
+		{
+			{
+				.eraseblocks = { { 64 * 1024, 16 } },
+				.block_erase = spi_block_erase_d8,
+			}, {
+				.eraseblocks = { { 64 * 1024, 16 } },
+				.block_erase = spi_block_erase_52,
+			}, {
+				.eraseblocks = { { 4 * 1024, 256 } },
+				.block_erase = spi_block_erase_20,
+			}, {
+				.eraseblocks = { { 1024 * 1024, 1} },
+				.block_erase = spi_block_erase_60,
+			}, {
+				.eraseblocks = { { 1024 * 1024, 1} },
+				.block_erase = spi_block_erase_c7,
+			}
+		},
+		.unlock		= NULL,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+	},
+
+
+	{
+		.vendor		= "AMIC",
+		.name		= "A25L016",
+		.bustype	= CHIP_BUSTYPE_SPI,
+		.manufacture_id	= AMIC_ID_NOPREFIX,
+		.model_id	= AMIC_A25L016,
+		.total_size	= 2048,
+		.page_size	= 256,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	=
+		{
+			{
+				.eraseblocks = { { 64 * 1024, 32 } },
+				.block_erase = spi_block_erase_d8,
+			}, {
+				.eraseblocks = { { 64 * 1024, 32 } },
+				.block_erase = spi_block_erase_52,
+			}, {
+				.eraseblocks = { { 4 * 1024, 512 } },
+				.block_erase = spi_block_erase_20,
+			}, {
+				.eraseblocks = { { 2048 * 1024, 1} },
+				.block_erase = spi_block_erase_60,
+			}, {
+				.eraseblocks = { { 2048 * 1024, 1} },
+				.block_erase = spi_block_erase_c7,
+			}
+		},
+		.unlock		= NULL,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+	},
+
+
+	{
+		.vendor		= "AMIC",
+		.name		= "A25L032",
+		.bustype	= CHIP_BUSTYPE_SPI,
+		.manufacture_id	= AMIC_ID_NOPREFIX,
+		.model_id	= AMIC_A25L032,
+		.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 = { { 64 * 1024, 64 } },
+				.block_erase = spi_block_erase_52,
+			}, {
+				.eraseblocks = { { 4 * 1024, 1024 } },
+				.block_erase = spi_block_erase_20,
+			}, {
+				.eraseblocks = { { 4096 * 1024, 1} },
+				.block_erase = spi_block_erase_60,
+			}, {
+				.eraseblocks = { { 4096 * 1024, 1} },
+				.block_erase = spi_block_erase_c7,
+			}
+		},
+		.unlock		= NULL,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+	},
+
+	{
+		.vendor		= "AMIC",
+		.name		= "A25LQ032",
+		.bustype	= CHIP_BUSTYPE_SPI,
+		.manufacture_id	= AMIC_ID_NOPREFIX,
+		.model_id	= AMIC_A25LQ032,
+		.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 = { { 64 * 1024, 64 } },
+				.block_erase = spi_block_erase_52,
+			}, {
+				.eraseblocks = { { 4 * 1024, 1024 } },
+				.block_erase = spi_block_erase_20,
+			}, {
+				.eraseblocks = { { 4096 * 1024, 1} },
+				.block_erase = spi_block_erase_60,
+			}, {
+				.eraseblocks = { { 4096 * 1024, 1} },
+				.block_erase = spi_block_erase_c7,
+			}
+		},
+		.unlock		= NULL,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+	},
+
+	{
+		.vendor		= "AMIC",
 		.name		= "A29002B",
 		.bustype	= CHIP_BUSTYPE_PARALLEL,
 		.manufacture_id	= AMIC_ID_NOPREFIX,
diff --git a/flashchips.h b/flashchips.h
index 3e2befa..0b16e3b 100644
--- a/flashchips.h
+++ b/flashchips.h
@@ -88,6 +88,14 @@ 
 #define AMIC_A25L80P		0x2014	/* Seems that no A25L80PT exists */
 #define AMIC_A25L16PT		0x2025
 #define AMIC_A25L16PU		0x2015
+#define AMIC_A25L512		0x3010
+#define AMIC_A25L010		0x3011
+#define AMIC_A25L020		0x3012
+#define AMIC_A25L040		0x3013
+#define AMIC_A25L080		0x3014
+#define AMIC_A25L016		0x3015
+#define AMIC_A25L032		0x3016
+#define AMIC_A25LQ032		0x4016
 #define AMIC_A29002B		0x0d
 #define AMIC_A29002T		0x8C	/* Same as A290021T */
 #define AMIC_A29040B		0x86