Patchwork [4/4] Complete probing rewrite.

login
register
about
Submitter Carl-Daniel Hailfinger
Date 2014-06-20 01:31:26
Message ID <53A38EEE.3040503@gmx.net>
Download mbox | patch
Permalink /patch/4201/
State New
Headers show

Comments

Carl-Daniel Hailfinger - 2014-06-20 01:31:26
Am 16.06.2014 02:50 schrieb Stefan Tauner:
> Some important facts:
> - AT45 prober issues a 0xD7 opcode (without address) unconditionally.
> - No prober weights yet - any chip matched by a single prober is
>   presented to the user.
>
> Signed-off-by: Stefan Tauner <stefan.tauner@alumni.tuwien.ac.at>
> ---
>  82802ab.c     |   49 +-
>  Makefile      |    2 +-
>  at45db.c      |   48 +-
>  chipdrivers.h |   36 +-
>  cli_classic.c |  132 ++-
>  en29lv640b.c  |   27 +-
>  flash.h       |   54 +-
>  flashchips.c  | 3624 +++++++++++++++++++++++++++++++++------------------------
>  flashchips.h  |  888 +++++++-------

I tried to verify your conversion of flashchips.c by doing it myself.
Our results differ, though. The differences need to be verified against
the code and the datasheets. I do believe my versions are correct and I
checked most of them against the current code and/or a datasheet, but I
might have made some mistakes.

The differences between your flashchips.c conversion and my conversion are:

probe_spi_at25f is len=2 in my tree, len=3 in yours
probe_82802ab for ATMEL_AT49LH002 is len=2 in my tree, len=3 in yours
probe_jedec for EON_EN29F010 is len=3 in my tree, len=2 in yours
probe_jedec for EON_EN29F002T is len=4 in my tree, len=2 in yours
probe_m29f400bt for FUJITSU_MBM29F400BC is len=2 in my tree, len=3 in yours
probe_m29f400bt for FUJITSU_MBM29F400TC is len=2 in my tree, len=3 in yours
probe_m29f400bt for FUJITSU_MBM29LV160BE is len=2 in my tree, len=3 in yours
probe_m29f400bt for FUJITSU_MBM29LV160TE is len=2 in my tree, len=3 in yours
probe_82802ab for INTEL_28F002T has len=2 in my tree, len=3 in yours
probe_82802ab_* always has len=3 in your tree, and I believe this to be
a systematic error
probe_spi_rems for
SST_SST25VF512A_REMS/SST_SST25VF010_REMS/SST_SST25VF020_REMS/SST_SST25VF040_REMS/SST_SST25VF040B_REMS
is len=2 in my tree, len=3 in yours
probe_jedec for
SST_SST29EE010/SST_SST29LE010/SST_SST29EE020A/SST_SST29LE020 is len=2 in
my tree; len=3 in yours
probe_m29f400bt for ST_M29F400BB is len=2 in my tree, len=3 in yours
probe_jedec for WINBOND_W29C010 has len=2 in my tree, len=3 in yours
probe_jedec for WINBOND_W29C020/WINBOND_W29C040 has len=2 in my tree,
len=3 in yours

This patch has almost the same layout in flashchips.c as your end result
of the probe conversion, the only differences (besides the stuff
mentioned above) are:
Your patch has a struct field .probers, mine doesn't have it to make
sure only flash.h and flashchips.c have to change at the first step
while having virtually identical layout for the new flashchips.c contents.
Your patch has killed probe_timing, mine doesn't yet, that one needs to
die and/or be moved for chips where it is relevant.
Your patch removes all those generic chips, mine doesn't yet, those
things are abominations and need to die.
Your patch treats the at45 chips as two models per hardware to handle
the different sector/page sizes (good thing, I unfortunately didn't get
around to that yet).
I have left feature_bits untouched.
Whitespace has changed for ca. 5 lines as well.

This patch compiles, and although flashchips.c almost looks like your
variant, it needs no code changes outside flashchips.c and flash.h. The
idea behind such a conversion was to decouple layout changes from
semantic changes and do that with copious amounts of anonymous structs.
I did _not_ do this to discredit your work, I simply wanted an easy way
to almost recreate your flashchips.c for verification while not having
to touch any code outside it.

By the way, I'd like to propose a slight change to your struct prober:
Make the individual members of struct probe_res non-nested members of
struct prober, i.e. this
{probe_jedec, {2, {AMD_ID, AMD_AM29F002BB} } },
becomes this
{probe_jedec, 2, {AMD_ID, AMD_AM29F002BB} },
IMHO the second variant looks better.

Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>

Patch

Index: flashrom-proberewrite/flash.h
===================================================================
--- flashrom-proberewrite/flash.h	(Revision 1822)
+++ flashrom-proberewrite/flash.h	(Arbeitskopie)
@@ -150,14 +150,6 @@ 
 
 	enum chipbustype bustype;
 
-	/*
-	 * With 32bit manufacture_id and model_id we can cover IDs up to
-	 * (including) the 4th bank of JEDEC JEP106W Standard Manufacturer's
-	 * Identification code.
-	 */
-	uint32_t manufacture_id;
-	uint32_t model_id;
-
 	/* Total chip size in kilobytes */
 	unsigned int total_size;
 	/* Chip page size in bytes */
@@ -172,8 +164,23 @@ 
 		enum test_state write;
 	} tested;
 
-	int (*probe) (struct flashctx *flash);
+	struct {
+		int (*probe) (struct flashctx *flash);
+		struct {
+			uint8_t probe_res_len;
+			struct {
+				/*
+				 * With 32bit manufacture_id and model_id we can cover IDs up to
+				 * (including) the 4th bank of JEDEC JEP106W Standard Manufacturer's
+				 * Identification code.
+				 */
+				uint32_t manufacture_id;
+				uint32_t model_id;
+			};
+		};
+	};
 
+
 	/* Delay after "enter/exit ID mode" commands in microseconds.
 	 * NB: negative values have special meanings, see TIMING_* below.
 	 */
Index: flashrom-proberewrite/flashchips.c
===================================================================
--- flashrom-proberewrite/flashchips.c	(Revision 1822)
+++ flashrom-proberewrite/flashchips.c	(Arbeitskopie)
@@ -25,6 +25,7 @@ 
 #include "flash.h"
 #include "flashchips.h"
 #include "chipdrivers.h"
+#define FIXME 0
 
 /**
  * List of supported flash chips.
@@ -61,13 +62,11 @@ 
 		.vendor		= "AMD",
 		.name		= "Am29F010A/B",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= AMD_ID,
-		.model_id	= AMD_AM29F010B,	/* Same as Am29F010A */
 		.total_size	= 128,
 		.page_size	= 16 * 1024,
 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
 		.tested		= TEST_OK_PRE,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {AMD_ID, AMD_AM29F010B	/* Same as Am29F010A */} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -88,13 +87,11 @@ 
 		.vendor		= "AMD",
 		.name		= "Am29F002(N)BB",
 		.bustype	= BUS_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_jedec, {2, {AMD_ID, AMD_AM29F002BB} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -120,13 +117,11 @@ 
 		.vendor		= "AMD",
 		.name		= "Am29F002(N)BT",
 		.bustype	= BUS_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_jedec, {2, {AMD_ID, AMD_AM29F002BT} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -152,13 +147,11 @@ 
 		.vendor		= "AMD",
 		.name		= "Am29F016D",
 		.bustype	= BUS_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_jedec, {2, {AMD_ID, AMD_AM29F016D} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -179,13 +172,11 @@ 
 		.vendor		= "AMD",
 		.name		= "Am29F040B",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= AMD_ID,
-		.model_id	= AMD_AM29F040B,
 		.total_size	= 512,
 		.page_size	= 64 * 1024,
 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {AMD_ID, AMD_AM29F040B} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -206,13 +197,11 @@ 
 		.vendor		= "AMD",
 		.name		= "Am29F080B",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= AMD_ID,
-		.model_id	= AMD_AM29F080B,
 		.total_size	= 1024,
 		.page_size	= 64 * 1024,
 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {AMD_ID, AMD_AM29F080B} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -233,13 +222,11 @@ 
 		.vendor		= "AMD",
 		.name		= "Am29LV001BB",
 		.bustype	= BUS_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_jedec, {2, {AMD_ID, AMD_AM29LV001BB} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -264,13 +251,11 @@ 
 		.vendor		= "AMD",
 		.name		= "Am29LV001BT",
 		.bustype	= BUS_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_jedec, {2, {AMD_ID, AMD_AM29LV001BT} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -295,13 +280,11 @@ 
 		.vendor		= "AMD",
 		.name		= "Am29LV002BB",
 		.bustype	= BUS_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_jedec, {2, {AMD_ID, AMD_AM29LV002BB} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -327,13 +310,11 @@ 
 		.vendor		= "AMD",
 		.name		= "Am29LV002BT",
 		.bustype	= BUS_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_jedec, {2, {AMD_ID, AMD_AM29LV002BT} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -359,13 +340,11 @@ 
 		.vendor		= "AMD",
 		.name		= "Am29LV004BB",
 		.bustype	= BUS_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_jedec, {2, {AMD_ID, AMD_AM29LV004BB} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -391,13 +370,11 @@ 
 		.vendor		= "AMD",
 		.name		= "Am29LV004BT",
 		.bustype	= BUS_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_jedec, {2, {AMD_ID, AMD_AM29LV004BT} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -423,13 +400,11 @@ 
 		.vendor		= "AMD",
 		.name		= "Am29LV008BB",
 		.bustype	= BUS_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_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {AMD_ID, AMD_AM29LV008BB} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -455,13 +430,11 @@ 
 		.vendor		= "AMD",
 		.name		= "Am29LV008BT",
 		.bustype	= BUS_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_jedec, {2, {AMD_ID, AMD_AM29LV008BT} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -487,13 +460,11 @@ 
 		.vendor		= "AMD",
 		.name		= "Am29LV040B",
 		.bustype	= BUS_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_jedec, {2, {AMD_ID, AMD_AM29LV040B} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -514,13 +485,11 @@ 
 		.vendor		= "AMD",
 		.name		= "Am29LV081B",
 		.bustype	= BUS_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_jedec, {2, {AMD_ID, AMD_AM29LV080B} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -541,13 +510,11 @@ 
 		.vendor		= "AMIC",
 		.name		= "A25L05PT",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= AMIC_ID,
-		.model_id	= AMIC_A25L05PT,
 		.total_size	= 64,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid4,
+			{probe_spi_rdid4, {4, {AMIC_ID, AMIC_A25L05PT} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -575,13 +542,11 @@ 
 		.vendor		= "AMIC",
 		.name		= "A25L05PU",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= AMIC_ID,
-		.model_id	= AMIC_A25L05PU,
 		.total_size	= 64,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid4,
+			{probe_spi_rdid4, {4, {AMIC_ID, AMIC_A25L05PU} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -609,13 +574,11 @@ 
 		.vendor		= "AMIC",
 		.name		= "A25L10PT",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= AMIC_ID,
-		.model_id	= AMIC_A25L10PT,
 		.total_size	= 128,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid4,
+			{probe_spi_rdid4, {4, {AMIC_ID, AMIC_A25L10PT} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -644,13 +607,11 @@ 
 		.vendor		= "AMIC",
 		.name		= "A25L10PU",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= AMIC_ID,
-		.model_id	= AMIC_A25L10PU,
 		.total_size	= 128,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid4,
+			{probe_spi_rdid4, {4, {AMIC_ID, AMIC_A25L10PU} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -679,13 +640,11 @@ 
 		.vendor		= "AMIC",
 		.name		= "A25L20PT",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= AMIC_ID,
-		.model_id	= AMIC_A25L20PT,
 		.total_size	= 256,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid4,
+			{probe_spi_rdid4, {4, {AMIC_ID, AMIC_A25L20PT} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -714,13 +673,11 @@ 
 		.vendor		= "AMIC",
 		.name		= "A25L20PU",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= AMIC_ID,
-		.model_id	= AMIC_A25L20PU,
 		.total_size	= 256,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid4,
+			{probe_spi_rdid4, {4, {AMIC_ID, AMIC_A25L20PU} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -754,13 +711,11 @@ 
 		.vendor		= "AMIC",
 		.name		= "A25L40PT",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= AMIC_ID,
-		.model_id	= AMIC_A25L40PT,
 		.total_size	= 512,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PR,
-		.probe		= probe_spi_rdid4,
+			{probe_spi_rdid4, {4, {AMIC_ID, AMIC_A25L40PT} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -789,13 +744,11 @@ 
 		.vendor		= "AMIC",
 		.name		= "A25L40PU",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= AMIC_ID,
-		.model_id	= AMIC_A25L40PU,
 		.total_size	= 512,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PR,
-		.probe		= probe_spi_rdid4,
+			{probe_spi_rdid4, {4, {AMIC_ID, AMIC_A25L40PU} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -824,13 +777,11 @@ 
 		.vendor		= "AMIC",
 		.name		= "A25L80P",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= AMIC_ID,
-		.model_id	= AMIC_A25L80P,
 		.total_size	= 1024,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PRE,
-		.probe		= probe_spi_rdid4,
+			{probe_spi_rdid4, {4, {AMIC_ID, AMIC_A25L80P} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -859,13 +810,11 @@ 
 		.vendor		= "AMIC",
 		.name		= "A25L16PT",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= AMIC_ID,
-		.model_id	= AMIC_A25L16PT,
 		.total_size	= 2048,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid4,
+			{probe_spi_rdid4, {4, {AMIC_ID, AMIC_A25L16PT} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -897,13 +846,11 @@ 
 		.vendor		= "AMIC",
 		.name		= "A25L16PU",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= AMIC_ID,
-		.model_id	= AMIC_A25L16PU,
 		.total_size	= 2048,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PR,
-		.probe		= probe_spi_rdid4,
+			{probe_spi_rdid4, {4, {AMIC_ID, AMIC_A25L16PU} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -935,13 +882,11 @@ 
 		.vendor		= "AMIC",
 		.name		= "A25L512",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= AMIC_ID_NOPREFIX,
-		.model_id	= AMIC_A25L512,
 		.total_size	= 64,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {AMIC_ID_NOPREFIX, AMIC_A25L512} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -967,13 +912,11 @@ 
 		.vendor		= "AMIC",
 		.name		= "A25L010",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= AMIC_ID_NOPREFIX,
-		.model_id	= AMIC_A25L010,
 		.total_size	= 128,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {AMIC_ID_NOPREFIX, AMIC_A25L010} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -999,13 +942,11 @@ 
 		.vendor		= "AMIC",
 		.name		= "A25L020",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= AMIC_ID_NOPREFIX,
-		.model_id	= AMIC_A25L020,
 		.total_size	= 256,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {AMIC_ID_NOPREFIX, AMIC_A25L020} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -1031,13 +972,11 @@ 
 		.vendor		= "AMIC",
 		.name		= "A25L040",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= AMIC_ID_NOPREFIX,
-		.model_id	= AMIC_A25L040,
 		.total_size	= 512,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {AMIC_ID_NOPREFIX, AMIC_A25L040} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -1063,13 +1002,11 @@ 
 		.vendor		= "AMIC",
 		.name		= "A25L080",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= AMIC_ID_NOPREFIX,
-		.model_id	= AMIC_A25L080,
 		.total_size	= 1024,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {AMIC_ID_NOPREFIX, AMIC_A25L080} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -1095,13 +1032,11 @@ 
 		.vendor		= "AMIC",
 		.name		= "A25L016",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= AMIC_ID_NOPREFIX,
-		.model_id	= AMIC_A25L016,
 		.total_size	= 2048,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {AMIC_ID_NOPREFIX, AMIC_A25L016} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -1127,14 +1062,12 @@ 
 		.vendor		= "AMIC",
 		.name		= "A25L032",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= AMIC_ID_NOPREFIX,
-		.model_id	= AMIC_A25L032,
 		.total_size	= 4096,
 		.page_size	= 256,
 		/* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {AMIC_ID_NOPREFIX, AMIC_A25L032} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -1166,15 +1099,13 @@ 
 		.vendor		= "AMIC",
 		.name		= "A25LQ16",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= AMIC_ID_NOPREFIX,
-		.model_id	= AMIC_A25LQ16,
 		.total_size	= 2048,
 		.page_size	= 256,
 		/* supports SFDP */
 		/* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {AMIC_ID_NOPREFIX, AMIC_A25LQ16} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	= {
 			{
@@ -1205,15 +1136,13 @@ 
 		.vendor		= "AMIC",
 		.name		= "A25LQ032/A25LQ32A",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= AMIC_ID_NOPREFIX,
-		.model_id	= AMIC_A25LQ032,
 		.total_size	= 4096,
 		.page_size	= 256,
 		/* A25LQ32A supports SFDP */
 		/* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {AMIC_ID_NOPREFIX, AMIC_A25LQ032} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -1245,8 +1174,6 @@ 
 		.vendor		= "AMIC",
 		.name		= "A25LQ64",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= AMIC_ID_NOPREFIX,
-		.model_id	= AMIC_A25LQ032,
 		.total_size	= 8192,
 		.page_size	= 256,
 		/* supports SFDP */
@@ -1254,7 +1181,7 @@ 
 		/* QPI enable 0x35, disable 0xF5 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {AMIC_ID_NOPREFIX, AMIC_A25LQ032} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -1286,13 +1213,11 @@ 
 		.vendor		= "AMIC",
 		.name		= "A29002B",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= AMIC_ID_NOPREFIX,
-		.model_id	= AMIC_A29002B,
 		.total_size	= 256,
 		.page_size	= 64 * 1024,
 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {AMIC_ID_NOPREFIX, AMIC_A29002B} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -1318,13 +1243,11 @@ 
 		.vendor		= "AMIC",
 		.name		= "A29002T",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= AMIC_ID_NOPREFIX,
-		.model_id	= AMIC_A29002T,
 		.total_size	= 256,
 		.page_size	= 64 * 1024,
 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {AMIC_ID_NOPREFIX, AMIC_A29002T} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -1350,13 +1273,11 @@ 
 		.vendor		= "AMIC",
 		.name		= "A29040B",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= AMIC_ID_NOPREFIX,
-		.model_id	= AMIC_A29040B,
 		.total_size	= 512,
 		.page_size	= 64 * 1024,
 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {AMIC_ID_NOPREFIX, AMIC_A29040B} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -1377,13 +1298,11 @@ 
 		.vendor		= "AMIC",
 		.name		= "A49LF040A",
 		.bustype	= BUS_LPC,
-		.manufacture_id	= AMIC_ID_NOPREFIX,
-		.model_id	= AMIC_A49LF040A,
 		.total_size	= 512,
 		.page_size	= 64 * 1024,
 		.feature_bits	= FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {AMIC_ID_NOPREFIX, AMIC_A49LF040A} } },
 		.probe_timing	= TIMING_ZERO,	/* routine is wrapper to probe_jedec (pm49fl00x.c) */
 		.block_erasers	=
 		{
@@ -1405,14 +1324,12 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT25DF021",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT25DF021,
 		.total_size	= 256,
 		.page_size	= 256,
 		/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ATMEL_ID, ATMEL_AT25DF021} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -1444,13 +1361,11 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT25DF041A",
 		.bustype	= BUS_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_spi_rdid, {3, {ATMEL_ID, ATMEL_AT25DF041A} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -1482,13 +1397,11 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT25DF081",
 		.bustype	= BUS_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_spi_rdid, {3, {ATMEL_ID, ATMEL_AT25DF081} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -1520,13 +1433,11 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT25DF081A",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT25DF081A,
 		.total_size	= 1024,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ATMEL_ID, ATMEL_AT25DF081A} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -1558,13 +1469,11 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT25DF161",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT25DF161,
 		.total_size	= 2048,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PROBE,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ATMEL_ID, ATMEL_AT25DF161} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -1596,13 +1505,11 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT25DF321",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT25DF321,
 		.total_size	= 4096,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ATMEL_ID, ATMEL_AT25DF321} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -1634,14 +1541,12 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT25DF321A",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT25DF321A,
 		.total_size	= 4096,
 		.page_size	= 256,
 		/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ATMEL_ID, ATMEL_AT25DF321A} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -1673,13 +1578,11 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT25DF641(A)",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT25DF641,
 		.total_size	= 8192,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ATMEL_ID, ATMEL_AT25DF641} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -1711,14 +1614,12 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT25DL081",
 		.bustype	= BUS_SPI,
-		.manufacture_id = ATMEL_ID,
-		.model_id	= ATMEL_AT25DF081,
 		.total_size	= 1024,
 		.page_size	= 256,
 		/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ATMEL_ID, ATMEL_AT25DF081} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -1750,14 +1651,12 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT25DL161",
 		.bustype	= BUS_SPI,
-		.manufacture_id = ATMEL_ID,
-		.model_id	= ATMEL_AT25DL161,
 		.total_size	= 2048,
 		.page_size	= 256,
 		/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ATMEL_ID, ATMEL_AT25DL161} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -1789,14 +1688,12 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT25DQ161",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT25DQ161,
 		.total_size	= 2048,
 		.page_size	= 256,
 		/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ATMEL_ID, ATMEL_AT25DQ161} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -1828,13 +1725,11 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT25F512",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT25F512,
 		.total_size	= 64,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_at25f,
+			{probe_spi_at25f, {2, {ATMEL_ID, ATMEL_AT25F512} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -1857,13 +1752,11 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT25F512A",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT25F512A,
 		.total_size	= 64,
 		.page_size	= 128,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_at25f,
+			{probe_spi_at25f, {2, {ATMEL_ID, ATMEL_AT25F512A} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -1887,14 +1780,12 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT25F512B",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT25F512B,
 		.total_size	= 64,
 		.page_size	= 256,
 		/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ATMEL_ID, ATMEL_AT25F512B} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -1931,13 +1822,11 @@ 
 		 * All other properties seem to be the same.*/
 		.name		= "AT25F1024(A)",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT25F1024,
 		.total_size	= 128,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_at25f,
+			{probe_spi_at25f, {2, {ATMEL_ID, ATMEL_AT25F1024} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -1960,13 +1849,11 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT25F2048",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT25F2048,
 		.total_size	= 256,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_at25f,
+			{probe_spi_at25f, {2, {ATMEL_ID, ATMEL_AT25F2048} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -1989,13 +1876,11 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT25F4096",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT25F4096,
 		.total_size	= 512,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_at25f,
+			{probe_spi_at25f, {2, {ATMEL_ID, ATMEL_AT25F4096} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -2019,13 +1904,11 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT25FS010",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT25FS010,
 		.total_size	= 128,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ATMEL_ID, ATMEL_AT25FS010} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -2060,13 +1943,11 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT25FS040",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT25FS040,
 		.total_size	= 512,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ATMEL_ID, ATMEL_AT25FS040} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -2098,13 +1979,11 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT26DF041",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT26DF041,
 		.total_size	= 512,
 		.page_size	= 256,
 		/* does not support EWSR nor WREN and has no writable status register bits whatsoever */
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ATMEL_ID, ATMEL_AT26DF041} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -2130,13 +2009,11 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT26DF081A",
 		.bustype	= BUS_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_spi_rdid, {3, {ATMEL_ID, ATMEL_AT26DF081A} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -2168,13 +2045,11 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT26DF161",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT26DF161,
 		.total_size	= 2048,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PR,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ATMEL_ID, ATMEL_AT26DF161} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -2206,13 +2081,11 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT26DF161A",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT26DF161A,
 		.total_size	= 2048,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ATMEL_ID, ATMEL_AT26DF161A} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -2245,13 +2118,11 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT26DF321",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT26DF321,
 		.total_size	= 4096,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ATMEL_ID, ATMEL_AT26DF321} } },
 		.probe_timing	= TIMING_ZERO,
 		.printlock	= spi_prettyprint_status_register_at26df081a,
 		.unlock		= spi_disable_blockprotect,
@@ -2263,13 +2134,11 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT26F004",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT26F004,
 		.total_size	= 512,
 		.page_size	= 256,
-		.tested		= {.probe = NT, .read = NT, .erase = NT, .write = BAD },
 		.feature_bits	= FEATURE_WRSR_WREN,
-		.probe		= probe_spi_rdid,
+		.tested		= {.probe = NT, .read = NT, .erase = NT, .write = BAD },
+			{probe_spi_rdid, {3, {ATMEL_ID, ATMEL_AT26F004} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -2300,13 +2169,11 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT29C512",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT29C512,
 		.total_size	= 64,
 		.page_size	= 128,
 		.feature_bits	= FEATURE_LONG_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {ATMEL_ID, ATMEL_AT29C512} } },
 		.probe_timing	= 10000, /* 10mS, Enter=Exec */
 		.block_erasers	=
 		{
@@ -2324,13 +2191,11 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT29C010A",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT29C010A,
 		.total_size	= 128,
 		.page_size	= 128,
 		.feature_bits	= FEATURE_LONG_RESET,
 		.tested		= TEST_OK_PRE,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {ATMEL_ID, ATMEL_AT29C010A} } },
 		.probe_timing	= 10000, /* 10mS, Enter=Exec */
 		.block_erasers	=
 		{
@@ -2348,13 +2213,11 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT29C020",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT29C020,
 		.total_size	= 256,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_LONG_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {ATMEL_ID, ATMEL_AT29C020} } },
 		.probe_timing	= 10000,			/* 10ms */
 		.block_erasers	=
 		{
@@ -2372,13 +2235,11 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT29C040A",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT29C040A,
 		.total_size	= 512,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_LONG_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {ATMEL_ID, ATMEL_AT29C040A} } },
 		.probe_timing	= 10000,			/* 10 ms */
 		.block_erasers	=
 		{
@@ -2396,15 +2257,13 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT45CS1282",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT45CS1282,
 		.total_size	= 16896 /* No power of two sizes */,
 		.page_size	= 1056 /* No power of two sizes */,
 		/* does not support EWSR nor WREN and has no writable status register bits whatsoever */
 		/* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */
 		.feature_bits	= FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ATMEL_ID, ATMEL_AT45CS1282} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -2428,15 +2287,13 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT45DB011D",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT45DB011D,
 		.total_size	= 128 /* or 132, determined from status register */,
 		.page_size	= 256 /* or 264, determined from status register */,
 		/* does not support EWSR nor WREN and has no writable status register bits whatsoever */
 		/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
 		.feature_bits	= FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_at45db,
+			{probe_spi_at45db, {FIXME, {ATMEL_ID, ATMEL_AT45DB011D} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -2470,15 +2327,13 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT45DB021D",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT45DB021D,
 		.total_size	= 256 /* or 264, determined from status register */,
 		.page_size	= 256 /* or 264, determined from status register */,
 		/* does not support EWSR nor WREN and has no writable status register bits whatsoever */
 		/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
 		.feature_bits	= FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_at45db,
+			{probe_spi_at45db, {FIXME, {ATMEL_ID, ATMEL_AT45DB021D} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -2512,15 +2367,13 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT45DB041D",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT45DB041D,
 		.total_size	= 512 /* or 528, determined from status register */,
 		.page_size	= 256 /* or 264, determined from status register */,
 		/* does not support EWSR nor WREN and has no writable status register bits whatsoever */
 		/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
 		.feature_bits	= FEATURE_OTP,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_at45db,
+			{probe_spi_at45db, {FIXME, {ATMEL_ID, ATMEL_AT45DB041D} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -2554,15 +2407,13 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT45DB081D",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT45DB081D,
 		.total_size	= 1024 /* or 1056, determined from status register */,
 		.page_size	= 256 /* or 264, determined from status register */,
 		/* does not support EWSR nor WREN and has no writable status register bits whatsoever */
 		/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
 		.feature_bits	= FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_at45db,
+			{probe_spi_at45db, {FIXME, {ATMEL_ID, ATMEL_AT45DB081D} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -2596,15 +2447,13 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT45DB161D",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT45DB161D,
 		.total_size	= 2048 /* or 2112, determined from status register */,
 		.page_size	= 512 /* or 528, determined from status register */,
 		/* does not support EWSR nor WREN and has no writable status register bits whatsoever */
 		/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
 		.feature_bits	= FEATURE_OTP,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_at45db,
+			{probe_spi_at45db, {FIXME, {ATMEL_ID, ATMEL_AT45DB161D} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -2638,15 +2487,13 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT45DB321C",
 		.bustype	= BUS_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 */,
 		/* does not support EWSR nor WREN and has no writable status register bits whatsoever */
 		/* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */
 		.feature_bits	= FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ATMEL_ID, ATMEL_AT45DB321C} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -2681,15 +2528,13 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT45DB321D",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT45DB321D,
 		.total_size	= 4096 /* or 4224, determined from status register */,
 		.page_size	= 512 /* or 528, determined from status register */,
 		/* does not support EWSR nor WREN and has no writable status register bits whatsoever */
 		/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
 		.feature_bits	= FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_at45db,
+			{probe_spi_at45db, {FIXME, {ATMEL_ID, ATMEL_AT45DB321D} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -2723,15 +2568,13 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT45DB321E",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT45DB321C,
 		.total_size	= 4096 /* or 4224, determined from status register */,
 		.page_size	= 512 /* or 528, determined from status register */,
 		/* does not support EWSR nor WREN and has no writable status register bits whatsoever */
 		/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
 		.feature_bits	= FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_at45db,
+			{probe_spi_at45db, {FIXME, {ATMEL_ID, ATMEL_AT45DB321C} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -2765,15 +2608,13 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT45DB642D",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT45DB642D,
 		.total_size	= 8192 /* or 8448, determined from status register */,
 		.page_size	= 1024 /* or 1056, determined from status register */,
 		/* does not support EWSR nor WREN and has no writable status register bits whatsoever */
 		/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
 		.feature_bits	= FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_at45db,
+			{probe_spi_at45db, {FIXME, {ATMEL_ID, ATMEL_AT45DB642D} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -2807,13 +2648,11 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT49BV512",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT49BV512,
 		.total_size	= 64,
 		.page_size	= 64,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {ATMEL_ID, ATMEL_AT49BV512} } },
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -2831,13 +2670,11 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT49F002(N)",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT49F002N,
 		.total_size	= 256,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {ATMEL_ID, ATMEL_AT49F002N} } },
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -2863,13 +2700,11 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT49F002(N)T",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT49F002NT,
 		.total_size	= 256,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_OK_PR,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {ATMEL_ID, ATMEL_AT49F002NT} } },
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -2895,13 +2730,11 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT49(H)F010",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT49F010,
 		.total_size	= 128,
 		.page_size	= 0, /* unused */
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {ATMEL_ID, ATMEL_AT49F010} } },
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -2920,13 +2753,11 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT49F020",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT49F020,
 		.total_size	= 256,
 		.page_size	= 0, /* unused */
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_OK_PRE,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {ATMEL_ID, ATMEL_AT49F020} } },
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -2951,13 +2782,11 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT49F040",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT49F040,
 		.total_size	= 512,
 		.page_size	= 0, /* unused */
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {ATMEL_ID, ATMEL_AT49F040} } },
 		.probe_timing	= TIMING_ZERO,  /* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -2982,13 +2811,11 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT49F080",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT49F080,
 		.total_size	= 1024,
 		.page_size	= 0, /* unused */
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {ATMEL_ID, ATMEL_AT49F080} } },
 		.probe_timing	= TIMING_ZERO,  /* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -3014,13 +2841,11 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT49F080T",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT49F080T,
 		.total_size	= 1024,
 		.page_size	= 0, /* unused */
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {ATMEL_ID, ATMEL_AT49F080T} } },
 		.probe_timing	= TIMING_ZERO,  /* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -3045,13 +2870,11 @@ 
 		.vendor		= "Atmel",
 		.name		= "AT49LH002",
 		.bustype	= BUS_LPC | BUS_FWH, /* A/A Mux */
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= ATMEL_AT49LH002,
 		.total_size	= 256,
 		.page_size	= 0, /* unused */
 		.feature_bits	= FEATURE_REGISTERMAP, /* TODO: LPC OK too? */
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_82802ab, /* TODO: 0xff cmd not documented? */
+			{probe_82802ab, {2, {ATMEL_ID, ATMEL_AT49LH002} } }, /* TODO: 0xff cmd not documented? */
 		.probe_timing	= TIMING_FIXME,
 		.block_erasers	=
 		{
@@ -3081,13 +2904,11 @@ 
 		.vendor		= "Catalyst",
 		.name		= "CAT28F512",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= CATALYST_ID,
-		.model_id	= CATALYST_CAT28F512,
 		.total_size	= 64,
 		.page_size	= 0, /* unused */
 		.feature_bits	= 0,
 		.tested		= TEST_OK_PR,
-		.probe		= probe_jedec, /* FIXME! */
+			{probe_jedec, {2, {CATALYST_ID, CATALYST_CAT28F512} } }, /* FIXME! */
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -3105,13 +2926,11 @@ 
 		.vendor		= "Bright",
 		.name		= "BM29F040",
 		.bustype	= BUS_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_jedec, {2, {BRIGHT_ID, BRIGHT_BM29F040} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -3132,13 +2951,11 @@ 
 		.vendor		= "ESMT",
 		.name		= "F49B002UA",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= ESMT_ID,
-		.model_id	= ESMT_F49B002UA,
 		.total_size	= 256,
 		.page_size	= 4096,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {ESMT_ID, ESMT_F49B002UA} } },
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -3164,13 +2981,11 @@ 
 		.vendor		= "ESMT",
 		.name		= "F25L008A",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ESMT_ID,
-		.model_id	= ESMT_F25L008A,
 		.total_size	= 1024,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_EITHER,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ESMT_ID, ESMT_F25L008A} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -3199,13 +3014,11 @@ 
 		.vendor		= "ESMT",
 		.name		= "F25L32PA",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ESMT_ID,
-		.model_id	= ESMT_F25L32PA,
 		.total_size	= 4096,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_EITHER | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ESMT_ID, ESMT_F25L32PA} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -3234,13 +3047,11 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25B05",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25B05,
 		.total_size	= 64,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25B05} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -3268,13 +3079,11 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25B05T",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25B05,
 		.total_size	= 64,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25B05} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -3302,13 +3111,11 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25B10",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25B10,
 		.total_size	= 128,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25B10} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -3336,13 +3143,11 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25B10T",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25B10,
 		.total_size	= 128,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25B10} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -3370,13 +3175,11 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25B20",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25B20,
 		.total_size	= 256,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25B20} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -3405,13 +3208,11 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25B20T",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25B20,
 		.total_size	= 256,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25B20} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -3440,13 +3241,11 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25B40",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25B40,
 		.total_size	= 512,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25B40} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -3475,13 +3274,11 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25B40T",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25B40,
 		.total_size	= 512,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25B40} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -3510,13 +3307,11 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25B80",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25B80,
 		.total_size	= 1024,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25B80} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -3545,13 +3340,11 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25B80T",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25B80,
 		.total_size	= 1024,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25B80} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -3580,13 +3373,11 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25B16",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25B16,
 		.total_size	= 2048,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25B16} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -3615,13 +3406,11 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25B16T",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25B16,
 		.total_size	= 2048,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25B16} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -3650,13 +3439,11 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25B32",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25B32,
 		.total_size	= 4096,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25B32} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -3685,13 +3472,11 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25B32T",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25B32,
 		.total_size	= 4096,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25B32} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -3720,13 +3505,11 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25B64",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25B64,
 		.total_size	= 8192,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25B64} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -3755,13 +3538,11 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25B64T",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25B64,
 		.total_size	= 8192,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25B64} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -3790,13 +3571,11 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25F05",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25F05,
 		.total_size	= 64,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25F05} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -3828,13 +3607,11 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25F10",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25F10,
 		.total_size	= 128,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25F10} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -3866,13 +3643,11 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25F20",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25F20,
 		.total_size	= 256,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25F20} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -3904,13 +3679,11 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25F40",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25F40,
 		.total_size	= 512,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PROBE,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25F40} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -3939,13 +3712,11 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25F80",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25F80,
 		.total_size	= 1024,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25F80} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -3974,13 +3745,11 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25F16",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25F16,
 		.total_size	= 2048,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25F16} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -4009,13 +3778,11 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25F32",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25F32,
 		.total_size	= 4096,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25F32} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -4044,13 +3811,11 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25F64",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25F64,
 		.total_size	= 8192,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25F64} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -4079,14 +3844,12 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25Q40",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25Q40,
 		.total_size	= 512,
 		.page_size	= 256,
 		/* OTP: 256B total; enter 0x3A */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25Q40} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -4115,14 +3878,12 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25Q80(A)",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25Q80,
 		.total_size	= 1024,
 		.page_size	= 256,
 		/* OTP: 256B total; enter 0x3A */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25Q80} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -4153,14 +3914,12 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25Q16",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25Q16,
 		.total_size	= 2048,
 		.page_size	= 256,
 		/* OTP: D16 512B/Q16 128B total; enter 0x3A */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25Q16} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -4193,14 +3952,12 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25Q32(A/B)",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25Q32,
 		.total_size	= 4096,
 		.page_size	= 256,
 		/* OTP: 512B total; enter 0x3A */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25Q32} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -4229,14 +3986,12 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25Q64",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25Q64,
 		.total_size	= 8192,
 		.page_size	= 256,
 		/* OTP: 512B total; enter 0x3A */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25Q64} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -4265,14 +4020,12 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25Q128",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25Q128,
 		.total_size	= 16384,
 		.page_size	= 256,
 		/* OTP: 512B total; enter 0x3A */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25Q128} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -4300,8 +4053,6 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25QH16",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25QH16,
 		.total_size	= 2048,
 		.page_size	= 256,
 		/* supports SFDP */
@@ -4309,7 +4060,7 @@ 
 		/* QPI enable 0x38, disable 0xFF */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
 		.tested		= TEST_OK_PR,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25QH16} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -4338,8 +4089,6 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25QH32",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25QH32,
 		.total_size	= 4096,
 		.page_size	= 256,
 		/* supports SFDP */
@@ -4347,7 +4096,7 @@ 
 		/* QPI enable 0x38, disable 0xFF */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25QH32} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -4376,8 +4125,6 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25QH64",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25QH64,
 		.total_size	= 8192,
 		.page_size	= 256,
 		/* supports SFDP */
@@ -4385,7 +4132,7 @@ 
 		/* QPI enable 0x38, disable 0xFF */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
 		.tested		= TEST_OK_PR,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25QH64} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	= {
 			{
@@ -4413,8 +4160,6 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25QH128",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25QH128,
 		.total_size	= 16384,
 		.page_size	= 256,
 		/* supports SFDP */
@@ -4422,7 +4167,7 @@ 
 		/* QPI enable 0x38, disable 0xFF */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25QH128} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	= {
 			{
@@ -4450,14 +4195,12 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25S10",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25S10,
 		.total_size	= 128,
 		.page_size	= 256,
 		/* OTP: 256B total; enter 0x3A */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25S10} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	= {
 			{
@@ -4485,14 +4228,12 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25S20",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25S20,
 		.total_size	= 256,
 		.page_size	= 256,
 		/* OTP: 256B total; enter 0x3A */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25S20} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	= {
 			{
@@ -4520,14 +4261,12 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25S40",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25S40,
 		.total_size	= 512,
 		.page_size	= 256,
 		/* OTP: 256B total; enter 0x3A */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25S40} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	= {
 			{
@@ -4555,14 +4294,12 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25S80",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25S80,
 		.total_size	= 1024,
 		.page_size	= 256,
 		/* OTP: 256B total; enter 0x3A */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25S80} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	= {
 			{
@@ -4590,14 +4327,12 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25S16",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25S16,
 		.total_size	= 2048,
 		.page_size	= 256,
 		/* OTP: 512B total; enter 0x3A */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25S16} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	= {
 			{
@@ -4628,14 +4363,12 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25S32",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25S32,
 		.total_size	= 4096,
 		.page_size	= 256,
 		/* OTP: 512B total; enter 0x3A */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25S32} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	= {
 			{
@@ -4666,14 +4399,12 @@ 
 		.vendor		= "Eon",
 		.name		= "EN25S64",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= EON_EN25S64,
 		.total_size	= 8192,
 		.page_size	= 256,
 		/* OTP: 512B total; enter 0x3A */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, EON_EN25S64} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	= {
 			{
@@ -4701,13 +4432,11 @@ 
 		.vendor		= "Eon",
 		.name		= "EN29F010",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= EON_ID,
-		.model_id	= EON_EN29F010,
 		.total_size	= 128,
 		.page_size	= 128,
 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
 		.tested		= TEST_OK_PRE,
-		.probe		= probe_jedec,
+			{probe_jedec, {3, {EON_ID, EON_EN29F010} } },
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -4729,13 +4458,11 @@ 
 		.vendor		= "Eon",
 		.name		= "EN29F002(A)(N)B",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= EON_ID,
-		.model_id	= EON_EN29F002B,
 		.total_size	= 256,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
 		.tested		= TEST_OK_PR,
-		.probe		= probe_jedec,
+			{probe_jedec, {4, {EON_ID, EON_EN29F002B} } },
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -4761,13 +4488,11 @@ 
 		.vendor		= "Eon",
 		.name		= "EN29F002(A)(N)T",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= EON_ID,
-		.model_id	= EON_EN29F002T,
 		.total_size	= 256,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {4, {EON_ID, EON_EN29F002T} } },
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -4793,13 +4518,11 @@ 
 		.vendor		= "Eon",
 		.name		= "EN29LV640B",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= EON_ID,
-		.model_id	= EON_EN29LV640B,
 		.total_size	= 8192,
 		.page_size	= 8192,
 		.feature_bits	= 0,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_en29lv640b,
+			{probe_en29lv640b, {3, {EON_ID, EON_EN29LV640B} } },
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -4823,13 +4546,11 @@ 
 		.vendor		= "Fujitsu",
 		.name		= "MBM29F004BC",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= FUJITSU_ID,
-		.model_id	= FUJITSU_MBM29F004BC,
 		.total_size	= 512,
 		.page_size	= 64 * 1024,
 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {FUJITSU_ID, FUJITSU_MBM29F004BC} } },
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -4855,13 +4576,11 @@ 
 		.vendor		= "Fujitsu",
 		.name		= "MBM29F004TC",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= FUJITSU_ID,
-		.model_id	= FUJITSU_MBM29F004TC,
 		.total_size	= 512,
 		.page_size	= 64 * 1024,
 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {FUJITSU_ID, FUJITSU_MBM29F004TC} } },
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -4888,13 +4607,11 @@ 
 		.vendor		= "Fujitsu",
 		.name		= "MBM29F400BC",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= FUJITSU_ID,
-		.model_id	= FUJITSU_MBM29F400BC,
 		.total_size	= 512,
 		.page_size	= 64 * 1024,
 		.feature_bits	= FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_m29f400bt,
+			{probe_m29f400bt, {2, {FUJITSU_ID, FUJITSU_MBM29F400BC} } },
 		.probe_timing	= TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
 		.block_erasers	=
 		{
@@ -4920,13 +4637,11 @@ 
 		.vendor		= "Fujitsu",
 		.name		= "MBM29F400TC",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= FUJITSU_ID,
-		.model_id	= FUJITSU_MBM29F400TC,
 		.total_size	= 512,
 		.page_size	= 64 * 1024,
 		.feature_bits	= FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_m29f400bt,
+			{probe_m29f400bt, {2, {FUJITSU_ID, FUJITSU_MBM29F400TC} } },
 		.probe_timing	= TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
 		.block_erasers	=
 		{
@@ -4952,13 +4667,11 @@ 
 		.vendor		= "Fujitsu",
 		.name		= "MBM29LV160BE",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= FUJITSU_ID,
-		.model_id	= FUJITSU_MBM29LV160BE,
 		.total_size	= 2 * 1024,
 		.page_size	= 0,
 		.feature_bits	= FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_m29f400bt,
+			{probe_m29f400bt, {2, {FUJITSU_ID, FUJITSU_MBM29LV160BE} } },
 		.probe_timing	= TIMING_IGNORED,
 		.block_erasers	=
 		{
@@ -4984,13 +4697,11 @@ 
 		.vendor		= "Fujitsu",
 		.name		= "MBM29LV160TE",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= FUJITSU_ID,
-		.model_id	= FUJITSU_MBM29LV160TE,
 		.total_size	= 2 * 1024,
 		.page_size	= 0,
 		.feature_bits	= FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_m29f400bt,
+			{probe_m29f400bt, {2, {FUJITSU_ID, FUJITSU_MBM29LV160TE} } },
 		.probe_timing	= TIMING_IGNORED,
 		.block_erasers	=
 		{
@@ -5016,14 +4727,12 @@ 
 		.vendor		= "GigaDevice",
 		.name		= "GD25LQ32",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= GIGADEVICE_ID,
-		.model_id	= GIGADEVICE_GD25LQ32,
 		.total_size	= 4096,
 		.page_size	= 256,
 		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {GIGADEVICE_ID, GIGADEVICE_GD25LQ32} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -5055,13 +4764,11 @@ 
 		.vendor		= "GigaDevice",
 		.name		= "GD25Q512",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= GIGADEVICE_ID,
-		.model_id	= GIGADEVICE_GD25Q512,
 		.total_size	= 64,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {GIGADEVICE_ID, GIGADEVICE_GD25Q512} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	= {
 			{
@@ -5089,13 +4796,11 @@ 
 		.vendor		= "GigaDevice",
 		.name		= "GD25Q10",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= GIGADEVICE_ID,
-		.model_id	= GIGADEVICE_GD25Q10,
 		.total_size	= 128,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {GIGADEVICE_ID, GIGADEVICE_GD25Q10} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	= {
 			{
@@ -5126,13 +4831,11 @@ 
 		.vendor		= "GigaDevice",
 		.name		= "GD25Q20(B)",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= GIGADEVICE_ID,
-		.model_id	= GIGADEVICE_GD25Q20,
 		.total_size	= 256,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {GIGADEVICE_ID, GIGADEVICE_GD25Q20} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -5164,13 +4867,11 @@ 
 		.vendor		= "GigaDevice",
 		.name		= "GD25Q40(B)",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= GIGADEVICE_ID,
-		.model_id	= GIGADEVICE_GD25Q40,
 		.total_size	= 512,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {GIGADEVICE_ID, GIGADEVICE_GD25Q40} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -5202,14 +4903,12 @@ 
 		.vendor		= "GigaDevice",
 		.name		= "GD25Q80(B)",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= GIGADEVICE_ID,
-		.model_id	= GIGADEVICE_GD25Q80,
 		.total_size	= 1024,
 		.page_size	= 256,
 		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {GIGADEVICE_ID, GIGADEVICE_GD25Q80} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -5241,14 +4940,12 @@ 
 		.vendor		= "GigaDevice",
 		.name		= "GD25Q16(B)",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= GIGADEVICE_ID,
-		.model_id	= GIGADEVICE_GD25Q16,
 		.total_size	= 2048,
 		.page_size	= 256,
 		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {GIGADEVICE_ID, GIGADEVICE_GD25Q16} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -5280,14 +4977,12 @@ 
 		.vendor		= "GigaDevice",
 		.name		= "GD25Q32(B)",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= GIGADEVICE_ID,
-		.model_id	= GIGADEVICE_GD25Q32,
 		.total_size	= 4096,
 		.page_size	= 256,
 		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {GIGADEVICE_ID, GIGADEVICE_GD25Q32} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -5319,14 +5014,12 @@ 
 		.vendor		= "GigaDevice",
 		.name		= "GD25Q64(B)",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= GIGADEVICE_ID,
-		.model_id	= GIGADEVICE_GD25Q64,
 		.total_size	= 8192,
 		.page_size	= 256,
 		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {GIGADEVICE_ID, GIGADEVICE_GD25Q64} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -5358,14 +5051,12 @@ 
 		.vendor		= "GigaDevice",
 		.name		= "GD25Q128B",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= GIGADEVICE_ID,
-		.model_id	= GIGADEVICE_GD25Q128,
 		.total_size	= 16384,
 		.page_size	= 256,
 		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {GIGADEVICE_ID, GIGADEVICE_GD25Q128} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -5397,14 +5088,12 @@ 
 		.vendor		= "GigaDevice",
 		.name		= "GD25T80",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= GIGADEVICE_ID,
-		.model_id	= GIGADEVICE_GD25T80,
 		.total_size	= 1024,
 		.page_size	= 256,
 		/* OTP: 256B total; enter 0x3A */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {GIGADEVICE_ID, GIGADEVICE_GD25T80} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	= {
 			{
@@ -5435,13 +5124,11 @@ 
 		.vendor		= "Hyundai",
 		.name		= "HY29F002T",
 		.bustype	= BUS_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_jedec, {2, {HYUNDAI_ID, HYUNDAI_HY29F002T} } },
 		.probe_timing	= TIMING_ZERO, /* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -5467,13 +5154,11 @@ 
 		.vendor		= "Hyundai",
 		.name		= "HY29F002B",
 		.bustype	= BUS_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_jedec, {2, {HYUNDAI_ID, HYUNDAI_HY29F002B} } },
 		.probe_timing	= TIMING_ZERO, /* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -5499,13 +5184,11 @@ 
 		.vendor		= "Hyundai",
 		.name		= "HY29F040A",
 		.bustype	= BUS_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_jedec, {2, {HYUNDAI_ID, HYUNDAI_HY29F040A} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -5526,14 +5209,12 @@ 
 		.vendor		= "Intel",
 		.name		= "25F160S33B8",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= INTEL_ID,
-		.model_id	= INTEL_25F160S33B8,
 		.total_size	= 2048,
 		.page_size	= 256,
 		/* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {INTEL_ID, INTEL_25F160S33B8} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -5565,14 +5246,12 @@ 
 		.vendor		= "Intel",
 		.name		= "25F160S33T8",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= INTEL_ID,
-		.model_id	= INTEL_25F160S33T8,
 		.total_size	= 2048,
 		.page_size	= 256,
 		/* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {INTEL_ID, INTEL_25F160S33T8} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -5604,14 +5283,12 @@ 
 		.vendor		= "Intel",
 		.name		= "25F320S33B8",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= INTEL_ID,
-		.model_id	= INTEL_25F320S33B8,
 		.total_size	= 4096,
 		.page_size	= 256,
 		/* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {INTEL_ID, INTEL_25F320S33B8} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -5643,14 +5320,12 @@ 
 		.vendor		= "Intel",
 		.name		= "25F320S33T8",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= INTEL_ID,
-		.model_id	= INTEL_25F320S33T8,
 		.total_size	= 4096,
 		.page_size	= 256,
 		/* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {INTEL_ID, INTEL_25F320S33T8} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -5682,14 +5357,12 @@ 
 		.vendor		= "Intel",
 		.name		= "25F640S33B8",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= INTEL_ID,
-		.model_id	= INTEL_25F640S33B8,
 		.total_size	= 8192,
 		.page_size	= 256,
 		/* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {INTEL_ID, INTEL_25F640S33B8} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -5721,14 +5394,12 @@ 
 		.vendor		= "Intel",
 		.name		= "25F640S33T8",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= INTEL_ID,
-		.model_id	= INTEL_25F640S33T8,
 		.total_size	= 8192,
 		.page_size	= 256,
 		/* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {INTEL_ID, INTEL_25F640S33T8} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -5760,12 +5431,11 @@ 
 		.vendor		= "Intel",
 		.name		= "28F001BN/BX-B",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= INTEL_ID,
-		.model_id	= INTEL_28F001B,
 		.total_size	= 128,
 		.page_size	= 128 * 1024, /* 8k + 2x4k + 112k */
+		.feature_bits	= 0,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {INTEL_ID, INTEL_28F001B} } },
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -5787,12 +5457,11 @@ 
 		.vendor		= "Intel",
 		.name		= "28F001BN/BX-T",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= INTEL_ID,
-		.model_id	= INTEL_28F001T,
 		.total_size	= 128,
 		.page_size	= 128 * 1024, /* 112k + 2x4k + 8k */
+		.feature_bits	= 0,
 		.tested		= TEST_OK_PR,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {INTEL_ID, INTEL_28F001T} } },
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -5814,12 +5483,11 @@ 
 		.vendor		= "Intel",
 		.name		= "28F002BC/BL/BV/BX-T",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= INTEL_ID,
-		.model_id	= INTEL_28F002T,
 		.total_size	= 256,
 		.page_size	= 256 * 1024,
+		.feature_bits	= 0,
 		.tested		= TEST_OK_PRE,
-		.probe		= probe_82802ab,
+			{probe_82802ab, {2, {INTEL_ID, INTEL_28F002T} } },
 		.probe_timing	= TIMING_ZERO, /* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -5841,12 +5509,11 @@ 
 		.vendor		= "Intel",
 		.name		= "28F008S3/S5/SC",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= INTEL_ID,
-		.model_id	= INTEL_28F004S3,
 		.total_size	= 512,
 		.page_size	= 256,
+		.feature_bits	= 0,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_82802ab,
+			{probe_82802ab, {2, {INTEL_ID, INTEL_28F004S3} } },
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -5864,12 +5531,11 @@ 
 		.vendor		= "Intel",
 		.name		= "28F004B5/BE/BV/BX-B",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= INTEL_ID,
-		.model_id	= INTEL_28F004B,
 		.total_size	= 512,
 		.page_size	= 128 * 1024, /* maximal block size */
+		.feature_bits	= 0,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_82802ab,
+			{probe_82802ab, {2, {INTEL_ID, INTEL_28F004B} } },
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -5891,12 +5557,11 @@ 
 		.vendor		= "Intel",
 		.name		= "28F004B5/BE/BV/BX-T",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= INTEL_ID,
-		.model_id	= INTEL_28F004T,
 		.total_size	= 512,
 		.page_size	= 128 * 1024, /* maximal block size */
+		.feature_bits	= 0,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_82802ab,
+			{probe_82802ab, {2, {INTEL_ID, INTEL_28F004T} } },
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -5918,13 +5583,11 @@ 
 		.vendor		= "Intel",
 		.name		= "28F400BV/BX/CE/CV-B",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= INTEL_ID,
-		.model_id	= INTEL_28F400B,
 		.total_size	= 512,
 		.page_size	= 128 * 1024, /* maximal block size */
 		.feature_bits	= FEATURE_ADDR_SHIFTED,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_82802ab,
+			{probe_82802ab, {2, {INTEL_ID, INTEL_28F400B} } },
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -5946,13 +5609,11 @@ 
 		.vendor		= "Intel",
 		.name		= "28F400BV/BX/CE/CV-T",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= INTEL_ID,
-		.model_id	= INTEL_28F400T,
 		.total_size	= 512,
 		.page_size	= 128 * 1024, /* maximal block size */
 		.feature_bits	= FEATURE_ADDR_SHIFTED,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_82802ab,
+			{probe_82802ab, {2, {INTEL_ID, INTEL_28F400T} } },
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -5974,13 +5635,11 @@ 
 		.vendor		= "Intel",
 		.name		= "82802AB",
 		.bustype	= BUS_FWH,
-		.manufacture_id	= INTEL_ID,
-		.model_id	= INTEL_82802AB,
 		.total_size	= 512,
 		.page_size	= 64 * 1024,
 		.feature_bits	= FEATURE_REGISTERMAP,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_82802ab,
+			{probe_82802ab, {2, {INTEL_ID, INTEL_82802AB} } },
 		.probe_timing	= TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
 		.block_erasers	=
 		{
@@ -5999,13 +5658,11 @@ 
 		.vendor		= "Intel",
 		.name		= "82802AC",
 		.bustype	= BUS_FWH,
-		.manufacture_id	= INTEL_ID,
-		.model_id	= INTEL_82802AC,
 		.total_size	= 1024,
 		.page_size	= 64 * 1024,
 		.feature_bits	= FEATURE_REGISTERMAP,
 		.tested		= TEST_OK_PR,
-		.probe		= probe_82802ab,
+			{probe_82802ab, {2, {INTEL_ID, INTEL_82802AC} } },
 		.probe_timing	= TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
 		.block_erasers	=
 		{
@@ -6024,12 +5681,11 @@ 
 		.vendor		= "Macronix",
 		.name		= "MX23L3254",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= MACRONIX_ID,
-		.model_id	= MACRONIX_MX23L3254,
 		.total_size	= 4096,
 		.page_size	= 256,
+		.feature_bits	= 0,
 		.tested		= {.probe = OK, .read = OK, .erase = NA, .write = NA},
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {MACRONIX_ID, MACRONIX_MX23L3254} } },
 		.probe_timing	= TIMING_ZERO,
 		.write		= NULL, /* MX23L3254 is a mask ROM, so it is read-only */
 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
@@ -6040,14 +5696,12 @@ 
 		.vendor		= "Macronix",
 		.name		= "MX25L512(E)/MX25V512(C)",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= MACRONIX_ID,
-		.model_id	= MACRONIX_MX25L512,
 		.total_size	= 64,
 		.page_size	= 256,
 		/* MX25L512E supports SFDP */
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {MACRONIX_ID, MACRONIX_MX25L512} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -6079,14 +5733,12 @@ 
 		.vendor		= "Macronix",
 		.name		= "MX25L1005(C)/MX25L1006E",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= MACRONIX_ID,
-		.model_id	= MACRONIX_MX25L1005,
 		.total_size	= 128,
 		.page_size	= 256,
 		/* MX25L1006E supports SFDP */
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {MACRONIX_ID, MACRONIX_MX25L1005} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -6115,13 +5767,11 @@ 
 		.vendor		= "Macronix",
 		.name		= "MX25L2005(C)",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= MACRONIX_ID,
-		.model_id	= MACRONIX_MX25L2005,
 		.total_size	= 256,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {MACRONIX_ID, MACRONIX_MX25L2005} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -6153,13 +5803,11 @@ 
 		.vendor		= "Macronix",
 		.name		= "MX25L4005(A/C)",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= MACRONIX_ID,
-		.model_id	= MACRONIX_MX25L4005,
 		.total_size	= 512,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {MACRONIX_ID, MACRONIX_MX25L4005} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -6191,13 +5839,11 @@ 
 		.vendor		= "Macronix",
 		.name		= "MX25L8005/MX25V8005",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= MACRONIX_ID,
-		.model_id	= MACRONIX_MX25L8005,
 		.total_size	= 1024,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {MACRONIX_ID, MACRONIX_MX25L8005} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -6229,13 +5875,11 @@ 
 		.vendor		= "Macronix",
 		.name		= "MX25L1605",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= MACRONIX_ID,
-		.model_id	= MACRONIX_MX25L1605,
 		.total_size	= 2048,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {MACRONIX_ID, MACRONIX_MX25L1605} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -6264,14 +5908,12 @@ 
 		.vendor		= "Macronix",
 		.name		= "MX25L1605A/MX25L1606E",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= MACRONIX_ID,
-		.model_id	= MACRONIX_MX25L1605,
 		.total_size	= 2048,
 		.page_size	= 256,
 		/* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L1606E only) */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {MACRONIX_ID, MACRONIX_MX25L1605} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -6303,13 +5945,11 @@ 
 		.vendor		= "Macronix",
 		.name		= "MX25L1605D/MX25L1608D/MX25L1673E",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= MACRONIX_ID,
-		.model_id	= MACRONIX_MX25L1605,
 		.total_size	= 2048,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {MACRONIX_ID, MACRONIX_MX25L1605} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -6338,14 +5978,12 @@ 
 		.vendor		= "Macronix",
 		.name		= "MX25L1635D",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= MACRONIX_ID,
-		.model_id	= MACRONIX_MX25L1635D,
 		.total_size	= 2048,
 		.page_size	= 256,
 		/* OTP: 64B total; enter 0xB1, exit 0xC1 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {MACRONIX_ID, MACRONIX_MX25L1635D} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -6374,14 +6012,12 @@ 
 		.vendor		= "Macronix",
 		.name		= "MX25L1635E",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= MACRONIX_ID,
-		.model_id	= MACRONIX_MX25L1635E,
 		.total_size	= 2048,
 		.page_size	= 256,
 		/* OTP: 64B total; enter 0xB1, exit 0xC1 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {MACRONIX_ID, MACRONIX_MX25L1635E} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -6410,13 +6046,11 @@ 
 		.vendor		= "Macronix",
 		.name		= "MX25L3205(A)",
 		.bustype	= BUS_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_spi_rdid, {3, {MACRONIX_ID, MACRONIX_MX25L3205} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -6445,14 +6079,12 @@ 
 		.vendor		= "Macronix",
 		.name		= "MX25L3205D/MX25L3208D",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= MACRONIX_ID,
-		.model_id	= MACRONIX_MX25L3205,
 		.total_size	= 4096,
 		.page_size	= 256,
 		/* OTP: 64B total; enter 0xB1, exit 0xC1 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {MACRONIX_ID, MACRONIX_MX25L3205} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -6481,14 +6113,12 @@ 
 		.vendor		= "Macronix",
 		.name		= "MX25L3206E",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= MACRONIX_ID,
-		.model_id	= MACRONIX_MX25L3205,
 		.total_size	= 4096,
 		.page_size	= 256,
 		/* OTP: 64B total; enter 0xB1, exit 0xC1 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {MACRONIX_ID, MACRONIX_MX25L3205} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -6520,14 +6150,12 @@ 
 		.vendor		= "Macronix",
 		.name		= "MX25L3273E",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= MACRONIX_ID,
-		.model_id	= MACRONIX_MX25L3205,
 		.total_size	= 4096,
 		.page_size	= 256,
 		/* OTP: 64B total; enter 0xB1, exit 0xC1 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {MACRONIX_ID, MACRONIX_MX25L3205} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -6559,14 +6187,12 @@ 
 		.vendor		= "Macronix",
 		.name		= "MX25L3235D",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= MACRONIX_ID,
-		.model_id	= MACRONIX_MX25L3235D,
 		.total_size	= 4096,
 		.page_size	= 256,
 		/* OTP: 256B total; enter 0xB1, exit 0xC1 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {MACRONIX_ID, MACRONIX_MX25L3235D} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -6595,14 +6221,12 @@ 
 		.vendor		= "Macronix",
 		.name		= "MX25L6405(D)",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= MACRONIX_ID,
-		.model_id	= MACRONIX_MX25L6405,
 		.total_size	= 8192,
 		.page_size	= 256,
 		/* MX25L6405D has 64B of OTP; enter 0xB1, exit 0xC1 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {MACRONIX_ID, MACRONIX_MX25L6405} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -6631,14 +6255,12 @@ 
 		.vendor		= "Macronix",
 		.name		= "MX25L6406E/MX25L6436E",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= MACRONIX_ID,
-		.model_id	= MACRONIX_MX25L6405,
 		.total_size	= 8192,
 		.page_size	= 256,
 		/* OTP: 06E 64B/36E 512B total; enter 0xB1, exit 0xC1 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {MACRONIX_ID, MACRONIX_MX25L6405} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -6667,15 +6289,13 @@ 
 		.vendor		= "Macronix",
 		.name		= "MX25L6445E/MX25L6473E",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= MACRONIX_ID,
-		.model_id	= MACRONIX_MX25L6405,
 		.total_size	= 8192,
 		.page_size	= 256,
 		/* supports SFDP */
 		/* OTP: 512B total; enter 0xB1, exit 0xC1 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {MACRONIX_ID, MACRONIX_MX25L6405} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -6707,14 +6327,12 @@ 
 		.vendor		= "Macronix",
 		.name		= "MX25L12805(D)",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= MACRONIX_ID,
-		.model_id	= MACRONIX_MX25L12805,
 		.total_size	= 16384,
 		.page_size	= 256,
 		/* MX25L12805D has 64B of OTP; enter 0xB1, exit 0xC1 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {MACRONIX_ID, MACRONIX_MX25L12805} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -6743,15 +6361,13 @@ 
 		.vendor		= "Macronix",
 		.name		= "MX25U1635E",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= MACRONIX_ID,
-		.model_id	= MACRONIX_MX25U1635E,
 		.total_size	= 2048,
 		.page_size	= 256,
 		/* OTP: 512B total; enter 0xB1, exit 0xC1 */
 		/* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {MACRONIX_ID, MACRONIX_MX25U1635E} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -6784,8 +6400,6 @@ 
 		.vendor		= "Macronix",
 		.name		= "MX25U3235E/F",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= MACRONIX_ID,
-		.model_id	= MACRONIX_MX25U3235E,
 		.total_size	= 4096,
 		.page_size	= 256,
 		/* F model supports SFDP */
@@ -6793,7 +6407,7 @@ 
 		/* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {MACRONIX_ID, MACRONIX_MX25U3235E} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -6826,8 +6440,6 @@ 
 		.vendor		= "Macronix",
 		.name		= "MX25U6435E/F",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= MACRONIX_ID,
-		.model_id	= MACRONIX_MX25U6435E,
 		.total_size	= 8192,
 		.page_size	= 256,
 		/* F model supports SFDP */
@@ -6835,7 +6447,7 @@ 
 		/* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {MACRONIX_ID, MACRONIX_MX25U6435E} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -6868,13 +6480,11 @@ 
 		.vendor		= "Macronix",
 		.name		= "MX29F001B",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= MACRONIX_ID,
-		.model_id	= MACRONIX_MX29F001B,
 		.total_size	= 128,
 		.page_size	= 32 * 1024,
 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {MACRONIX_ID, MACRONIX_MX29F001B} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -6901,13 +6511,11 @@ 
 		.vendor		= "Macronix",
 		.name		= "MX29F001T",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= MACRONIX_ID,
-		.model_id	= MACRONIX_MX29F001T,
 		.total_size	= 128,
 		.page_size	= 32 * 1024,
 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {MACRONIX_ID, MACRONIX_MX29F001T} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -6934,13 +6542,11 @@ 
 		.vendor		= "Macronix",
 		.name		= "MX29F002(N)B",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= MACRONIX_ID,
-		.model_id	= MACRONIX_MX29F002B,
 		.total_size	= 256,
 		.page_size	= 64 * 1024,
 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {MACRONIX_ID, MACRONIX_MX29F002B} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -6966,13 +6572,11 @@ 
 		.vendor		= "Macronix",
 		.name		= "MX29F002(N)T",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= MACRONIX_ID,
-		.model_id	= MACRONIX_MX29F002T,
 		.total_size	= 256,
 		.page_size	= 64 * 1024,
 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {MACRONIX_ID, MACRONIX_MX29F002T} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -6998,13 +6602,11 @@ 
 		.vendor		= "Macronix",
 		.name		= "MX29F040",
 		.bustype	= BUS_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_jedec, {2, {MACRONIX_ID, MACRONIX_MX29F040} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -7025,13 +6627,11 @@ 
 		.vendor		= "Macronix",
 		.name		= "MX29LV040",
 		.bustype	= BUS_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_jedec, {2, {MACRONIX_ID, MACRONIX_MX29LV040} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -7052,13 +6652,11 @@ 
 		.vendor		= "Micron/Numonyx/ST",
 		.name		= "M25P05-A",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_M25P05A,
 		.total_size	= 64,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ST_ID, ST_M25P05A} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -7086,13 +6684,11 @@ 
 		.vendor		= "Micron/Numonyx/ST",
 		.name		= "M25P05",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= 0, /* Not used. */
-		.model_id	= ST_M25P05_RES,
 		.total_size	= 64,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_res1,
+			{probe_spi_res1, {1, {ST_M25P05_RES} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -7115,13 +6711,11 @@ 
 		.vendor		= "Micron/Numonyx/ST",
 		.name		= "M25P10-A",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_M25P10A,
 		.total_size	= 128,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PRE,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ST_ID, ST_M25P10A} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -7145,13 +6739,11 @@ 
 		.vendor		= "Micron/Numonyx/ST",
 		.name		= "M25P10",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= 0, /* Not used. */
-		.model_id	= ST_M25P10_RES,
 		.total_size	= 128,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_res1,
+			{probe_spi_res1, {1, {ST_M25P10_RES} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -7174,13 +6766,11 @@ 
 		.vendor		= "Micron/Numonyx/ST", /* Numonyx */
 		.name		= "M25P20",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_M25P20,
 		.total_size	= 256,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ST_ID, ST_M25P20} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -7203,13 +6793,11 @@ 
 		.vendor		= "Micron/Numonyx/ST",
 		.name		= "M25P20-old",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= 0, /* Not used. */
-		.model_id	= ST_M25P20_RES,
 		.total_size	= 256,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_res1,
+			{probe_spi_res1, {1, {ST_M25P20_RES} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -7232,13 +6820,11 @@ 
 		.vendor		= "Micron/Numonyx/ST", /* Numonyx */
 		.name		= "M25P40",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_M25P40,
 		.total_size	= 512,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ST_ID, ST_M25P40} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -7261,13 +6847,11 @@ 
 		.vendor		= "Micron/Numonyx/ST",
 		.name		= "M25P40-old",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= 0, /* Not used. */
-		.model_id	= ST_M25P40_RES,
 		.total_size	= 512,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_res1,
+			{probe_spi_res1, {1, {ST_M25P40_RES} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -7289,13 +6873,11 @@ 
 		.vendor		= "Micron/Numonyx/ST",
 		.name		= "M25P80",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_M25P80,
 		.total_size	= 1024,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ST_ID, ST_M25P80} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -7318,13 +6900,11 @@ 
 		.vendor		= "Micron/Numonyx/ST",
 		.name		= "M25P16",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_M25P16,
 		.total_size	= 2048,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ST_ID, ST_M25P16} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -7347,13 +6927,11 @@ 
 		.vendor		= "Micron/Numonyx/ST",
 		.name		= "M25P32",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_M25P32,
 		.total_size	= 4096,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ST_ID, ST_M25P32} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -7376,13 +6954,11 @@ 
 		.vendor		= "Micron/Numonyx/ST",
 		.name		= "M25P64",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_M25P64,
 		.total_size	= 8192,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ST_ID, ST_M25P64} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -7405,13 +6981,11 @@ 
 		.vendor		= "Micron/Numonyx/ST",
 		.name		= "M25P128",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_M25P128,
 		.total_size	= 16384,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ST_ID, ST_M25P128} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -7434,13 +7008,11 @@ 
 		.vendor		= "Micron/Numonyx/ST",
 		.name		= "M25PE10",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_M25PE10,
 		.total_size	= 128,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ST_ID, ST_M25PE10} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -7466,13 +7038,11 @@ 
 		.vendor		= "Micron/Numonyx/ST",
 		.name		= "M25PE20",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_M25PE20,
 		.total_size	= 256,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ST_ID, ST_M25PE20} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -7498,13 +7068,11 @@ 
 		.vendor		= "Micron/Numonyx/ST",
 		.name		= "M25PE40",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_M25PE40,
 		.total_size	= 512,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ST_ID, ST_M25PE40} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -7530,13 +7098,11 @@ 
 		.vendor		= "Micron/Numonyx/ST",
 		.name		= "M25PE80",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_M25PE80,
 		.total_size	= 1024,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ST_ID, ST_M25PE80} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -7562,13 +7128,11 @@ 
 		.vendor		= "Micron/Numonyx/ST",
 		.name		= "M25PE16",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_M25PE16,
 		.total_size	= 2048,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ST_ID, ST_M25PE16} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -7594,14 +7158,12 @@ 
 		.vendor		= "Micron/Numonyx/ST",
 		.name		= "M25PX80",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_M25PX80,
 		.total_size	= 1024,
 		.page_size	= 256,
 		/* OTP: 64B total; read 0x4B, write 0x42 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ST_ID, ST_M25PX80} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	= {
 			{
@@ -7626,14 +7188,12 @@ 
 		.vendor		= "Micron/Numonyx/ST",
 		.name		= "M25PX16",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_M25PX16,
 		.total_size	= 2048,
 		.page_size	= 256,
 		/* OTP: 64B total; read 0x4B; write 0x42 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ST_ID, ST_M25PX16} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -7659,14 +7219,12 @@ 
 		.vendor		= "Micron/Numonyx/ST",
 		.name		= "M25PX32",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_M25PX32,
 		.total_size	= 4096,
 		.page_size	= 256,
 		/* OTP: 64B total; read 0x4B; write 0x42 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_OK_PRE,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ST_ID, ST_M25PX32} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -7692,14 +7250,12 @@ 
 		.vendor		= "Micron/Numonyx/ST",
 		.name		= "M25PX64",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_M25PX64,
 		.total_size	= 8192,
 		.page_size	= 256,
 		/* OTP: 64B total; read 0x4B; write 0x42 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ST_ID, ST_M25PX64} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -7725,12 +7281,11 @@ 
 		.vendor		= "Micron/Numonyx/ST",
 		.name		= "M45PE10",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_M45PE10,
 		.total_size	= 128,
 		.page_size	= 256,
+		.feature_bits	= 0,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ST_ID, ST_M45PE10} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	= {
 			{
@@ -7752,12 +7307,11 @@ 
 		.vendor		= "Micron/Numonyx/ST",
 		.name		= "M45PE20",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_M45PE20,
 		.total_size	= 256,
 		.page_size	= 256,
+		.feature_bits	= 0,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ST_ID, ST_M45PE20} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	= {
 			{
@@ -7779,12 +7333,11 @@ 
 		.vendor		= "Micron/Numonyx/ST",
 		.name		= "M45PE40",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_M45PE40,
 		.total_size	= 512,
 		.page_size	= 256,
+		.feature_bits	= 0,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ST_ID, ST_M45PE40} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	= {
 			{
@@ -7806,12 +7359,11 @@ 
 		.vendor		= "Micron/Numonyx/ST",
 		.name		= "M45PE80",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_M45PE80,
 		.total_size	= 1024,
 		.page_size	= 256,
+		.feature_bits	= 0,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ST_ID, ST_M45PE80} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	= {
 			{
@@ -7833,12 +7385,11 @@ 
 		.vendor		= "Micron/Numonyx/ST",
 		.name		= "M45PE16",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_M45PE16,
 		.total_size	= 2048,
 		.page_size	= 256,
+		.feature_bits	= 0,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ST_ID, ST_M45PE16} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	= {
 			{
@@ -7860,15 +7411,13 @@ 
 		.vendor		= "Micron/Numonyx/ST",
 		.name		= "N25Q016",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_N25Q016__1E,
 		.total_size	= 2048,
 		.page_size	= 256,
 		/* supports SFDP */
 		/* OTP: 64B total; read 0x4B, write 0x42 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ST_ID, ST_N25Q016__1E} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -7897,15 +7446,13 @@ 
 		.vendor		= "Micron/Numonyx/ST",
 		.name		= "N25Q032..1E",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_N25Q032__1E,
 		.total_size	= 4096,
 		.page_size	= 256,
 		/* supports SFDP */
 		/* OTP: 64B total; read 0x4B, write 0x42 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ST_ID, ST_N25Q032__1E} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -7931,15 +7478,13 @@ 
 		.vendor		= "Micron/Numonyx/ST",
 		.name		= "N25Q032..3E",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_N25Q032__3E,
 		.total_size	= 4096,
 		.page_size	= 256,
 		/* supports SFDP */
 		/* OTP: 64B total; read 0x4B, write 0x42 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ST_ID, ST_N25Q032__3E} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -7965,15 +7510,13 @@ 
 		.vendor		= "Micron/Numonyx/ST",
 		.name		= "N25Q064..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_N25Q064__1E,
 		.total_size	= 8192,
 		.page_size	= 256,
 		/* supports SFDP */
 		/* OTP: 64B total; read 0x4B, write 0x42 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ST_ID, ST_N25Q064__1E} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -7999,15 +7542,13 @@ 
 		.vendor		= "Micron/Numonyx/ST",
 		.name		= "N25Q064..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
 		.bustype	= BUS_SPI,
-		.manufacture_id = ST_ID,
-		.model_id	= ST_N25Q064__3E,
 		.total_size	= 8192,
 		.page_size	= 256,
 		/* supports SFDP */
 		/* OTP: 64B total; read 0x4B, write 0x42 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ST_ID, ST_N25Q064__3E} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -8033,15 +7574,13 @@ 
 		.vendor		= "Micron/Numonyx/ST",
 		.name		= "N25Q128..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
 		.bustype	= BUS_SPI,
-		.manufacture_id = ST_ID,
-		.model_id	= ST_N25Q128__1E,
 		.total_size	= 16384,
 		.page_size	= 256,
 		/* supports SFDP */
 		/* OTP: 64B total; read 0x4B, write 0x42 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ST_ID, ST_N25Q128__1E} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	= {
 			{
@@ -8066,15 +7605,13 @@ 
 		.vendor		= "Micron/Numonyx/ST",
 		.name		= "N25Q128..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
 		.bustype	= BUS_SPI,
-		.manufacture_id = ST_ID,
-		.model_id	= ST_N25Q128__3E,
 		.total_size	= 16384,
 		.page_size	= 256,
 		/* supports SFDP */
 		/* OTP: 64B total; read 0x4B, write 0x42 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ST_ID, ST_N25Q128__3E} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	= {
 			{
@@ -8099,13 +7636,11 @@ 
 		.vendor		= "MoselVitelic",
 		.name		= "V29C51000B",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= SYNCMOS_MVC_ID,
-		.model_id	= MVC_V29C51000B,
 		.total_size	= 64,
 		.page_size	= 512,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {SYNCMOS_MVC_ID, MVC_V29C51000B} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -8126,13 +7661,11 @@ 
 		.vendor		= "MoselVitelic",
 		.name		= "V29C51000T",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= SYNCMOS_MVC_ID,
-		.model_id	= MVC_V29C51000T,
 		.total_size	= 64,
 		.page_size	= 512,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {SYNCMOS_MVC_ID, MVC_V29C51000T} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -8153,13 +7686,11 @@ 
 		.vendor		= "MoselVitelic",
 		.name		= "V29C51400B",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= SYNCMOS_MVC_ID,
-		.model_id	= MVC_V29C51400B,
 		.total_size	= 512,
 		.page_size	= 1024,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {SYNCMOS_MVC_ID, MVC_V29C51400B} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -8180,13 +7711,11 @@ 
 		.vendor		= "MoselVitelic",
 		.name		= "V29C51400T",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= SYNCMOS_MVC_ID,
-		.model_id	= MVC_V29C51400T,
 		.total_size	= 512,
 		.page_size	= 1024,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {SYNCMOS_MVC_ID, MVC_V29C51400T} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -8207,13 +7736,11 @@ 
 		.vendor		= "MoselVitelic",
 		.name		= "V29LC51000",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= SYNCMOS_MVC_ID,
-		.model_id	= MVC_V29LC51000,
 		.total_size	= 64,
 		.page_size	= 512,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {SYNCMOS_MVC_ID, MVC_V29LC51000} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -8234,13 +7761,11 @@ 
 		.vendor		= "MoselVitelic",
 		.name		= "V29LC51001",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= SYNCMOS_MVC_ID,
-		.model_id	= MVC_V29LC51001,
 		.total_size	= 128,
 		.page_size	= 512,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {SYNCMOS_MVC_ID, MVC_V29LC51001} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -8261,13 +7786,11 @@ 
 		.vendor		= "MoselVitelic",
 		.name		= "V29LC51002",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= SYNCMOS_MVC_ID,
-		.model_id	= MVC_V29LC51002,
 		.total_size	= 256,
 		.page_size	= 512,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {SYNCMOS_MVC_ID, MVC_V29LC51002} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -8288,13 +7811,11 @@ 
 		.vendor		= "Nantronics",
 		.name		= "N25S10",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= NANTRONICS_ID_NOPREFIX,
-		.model_id	= NANTRONICS_N25S10,
 		.total_size	= 128,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {NANTRONICS_ID_NOPREFIX, NANTRONICS_N25S10} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -8329,13 +7850,11 @@ 
 		.vendor		= "Nantronics",
 		.name		= "N25S20",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= NANTRONICS_ID_NOPREFIX,
-		.model_id	= NANTRONICS_N25S20,
 		.total_size	= 256,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {NANTRONICS_ID_NOPREFIX, NANTRONICS_N25S20} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -8370,13 +7889,11 @@ 
 		.vendor		= "Nantronics",
 		.name		= "N25S40",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= NANTRONICS_ID_NOPREFIX,
-		.model_id	= NANTRONICS_N25S40,
 		.total_size	= 512,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {NANTRONICS_ID_NOPREFIX, NANTRONICS_N25S40} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -8411,13 +7928,11 @@ 
 		.vendor		= "Nantronics",
 		.name		= "N25S80",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= NANTRONICS_ID_NOPREFIX,
-		.model_id	= NANTRONICS_N25S80,
 		.total_size	= 1024,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {NANTRONICS_ID_NOPREFIX, NANTRONICS_N25S80} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -8449,13 +7964,11 @@ 
 		.vendor		= "Nantronics",
 		.name		= "N25S16",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= NANTRONICS_ID_NOPREFIX,
-		.model_id	= NANTRONICS_N25S16,
 		.total_size	= 2048,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {NANTRONICS_ID_NOPREFIX, NANTRONICS_N25S16} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -8484,13 +7997,11 @@ 
 		.vendor		= "PMC",
 		.name		= "Pm25LD256C",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= PMC_ID,
-		.model_id	= PMC_PM25LD256C,
 		.total_size	= 32,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {PMC_ID, PMC_PM25LD256C} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -8521,13 +8032,11 @@ 
 		.vendor		= "PMC",
 		.name		= "Pm25LD512(C)",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= PMC_ID,
-		.model_id	= PMC_PM25LD512,
 		.total_size	= 64,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {PMC_ID, PMC_PM25LD512} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -8559,13 +8068,11 @@ 
 		.vendor		= "PMC",
 		.name		= "Pm25LD010(C)",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= PMC_ID,
-		.model_id	= PMC_PM25LD010,
 		.total_size	= 128,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {PMC_ID, PMC_PM25LD010} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -8597,13 +8104,11 @@ 
 		.vendor		= "PMC",
 		.name		= "Pm25LD020(C)",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= PMC_ID,
-		.model_id	= PMC_PM25LD020,
 		.total_size	= 256,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {PMC_ID, PMC_PM25LD020} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -8635,13 +8140,11 @@ 
 		.vendor		= "PMC",
 		.name		= "Pm25LD040(C)",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= PMC_ID,
-		.model_id	= PMC_PM25LV040,
 		.total_size	= 512,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {PMC_ID, PMC_PM25LV040} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -8673,13 +8176,11 @@ 
 		.vendor		= "PMC",
 		.name		= "Pm25LV512(A)",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= PMC_ID_NOPREFIX,
-		.model_id	= PMC_PM25LV512,
 		.total_size	= 64,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_res2, /* The continuation code is transferred as the 3rd byte m( */
+			{probe_spi_res2, {2, {PMC_ID_NOPREFIX, PMC_PM25LV512} } }, /* The continuation code is transferred as the 3rd byte m( */
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -8705,13 +8206,11 @@ 
 		.vendor		= "PMC",
 		.name		= "Pm25LV010",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= PMC_ID_NOPREFIX,
-		.model_id	= PMC_PM25LV010,
 		.total_size	= 128,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_res2, /* The continuation code is transferred as the 3rd byte m( */
+			{probe_spi_res2, {2, {PMC_ID_NOPREFIX, PMC_PM25LV010} } }, /* The continuation code is transferred as the 3rd byte m( */
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -8737,13 +8236,11 @@ 
 		.vendor		= "PMC",
 		.name		= "Pm25LV010A",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= PMC_ID,
-		.model_id	= PMC_PM25LV010,
 		.total_size	= 128,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {PMC_ID, PMC_PM25LV010} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -8769,13 +8266,11 @@ 
 		.vendor		= "PMC",
 		.name		= "Pm25LV020",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= PMC_ID,
-		.model_id	= PMC_PM25LV020,
 		.total_size	= 256,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {PMC_ID, PMC_PM25LV020} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -8801,13 +8296,11 @@ 
 		.vendor		= "PMC",
 		.name		= "Pm25LV040",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= PMC_ID,
-		.model_id	= PMC_PM25LV040,
 		.total_size	= 512,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {PMC_ID, PMC_PM25LV040} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -8833,13 +8326,11 @@ 
 		.vendor		= "PMC",
 		.name		= "Pm25LV080B",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= PMC_ID,
-		.model_id	= PMC_PM25LV080B,
 		.total_size	= 1024,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {PMC_ID, PMC_PM25LV080B} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -8871,13 +8362,11 @@ 
 		.vendor		= "PMC",
 		.name		= "Pm25LV016B",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= PMC_ID,
-		.model_id	= PMC_PM25LV016B,
 		.total_size	= 2048,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {PMC_ID, PMC_PM25LV016B} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -8909,13 +8398,11 @@ 
 		.vendor		= "PMC",
 		.name		= "Pm29F002T",
 		.bustype	= BUS_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_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {PMC_ID_NOPREFIX, PMC_PM29F002T} } },
 		.probe_timing	= TIMING_FIXME,
 		.block_erasers	=
 		{
@@ -8941,13 +8428,11 @@ 
 		.vendor		= "PMC",
 		.name		= "Pm29F002B",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= PMC_ID_NOPREFIX,
-		.model_id	= PMC_PM29F002B,
 		.total_size	= 256,
 		.page_size	= 8 * 1024,
 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {PMC_ID_NOPREFIX, PMC_PM29F002B} } },
 		.probe_timing	= TIMING_FIXME,
 		.block_erasers	=
 		{
@@ -8973,13 +8458,11 @@ 
 		.vendor		= "PMC",
 		.name		= "Pm39LV010",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= PMC_ID_NOPREFIX,
-		.model_id	= PMC_PM39F010,	/* Pm39LV010 and Pm39F010 have identical IDs but different voltage */
 		.total_size	= 128,
 		.page_size	= 4096,
 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {PMC_ID_NOPREFIX, PMC_PM39F010	/* Pm39LV010 and Pm39F010 have identical IDs but different voltage */} } },
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -9003,13 +8486,11 @@ 
 		.vendor		= "PMC",
 		.name		= "Pm39LV020",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= PMC_ID_NOPREFIX,
-		.model_id	= PMC_PM39LV020,
 		.total_size	= 256,
 		.page_size	= 4096,
 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {PMC_ID_NOPREFIX, PMC_PM39LV020} } },
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers =
 		{
@@ -9033,13 +8514,11 @@ 
 		.vendor		= "PMC",
 		.name		= "Pm39LV040",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= PMC_ID_NOPREFIX,
-		.model_id	= PMC_PM39LV040,
 		.total_size	= 512,
 		.page_size	= 4096,
 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
 		.tested		= TEST_OK_PR,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {PMC_ID_NOPREFIX, PMC_PM39LV040} } },
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers =
 		{
@@ -9063,13 +8542,11 @@ 
 		.vendor		= "PMC",
 		.name		= "Pm39LV512",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= PMC_ID_NOPREFIX,
-		.model_id	= PMC_PM39LV512,
 		.total_size	= 64,
 		.page_size	= 4096,
 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {PMC_ID_NOPREFIX, PMC_PM39LV512} } },
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -9093,13 +8570,11 @@ 
 		.vendor		= "PMC",
 		.name		= "Pm49FL002",
 		.bustype	= BUS_LPC | BUS_FWH, /* A/A Mux */
-		.manufacture_id	= PMC_ID_NOPREFIX,
-		.model_id	= PMC_PM49FL002,
 		.total_size	= 256,
 		.page_size	= 16 * 1024,
 		.feature_bits	= FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {PMC_ID_NOPREFIX, PMC_PM49FL002} } },
 		.probe_timing	= TIMING_ZERO,	/* routine is wrapper to probe_jedec (pm49fl00x.c) */
 		.block_erasers	=
 		{
@@ -9124,13 +8599,11 @@ 
 		.vendor		= "PMC",
 		.name		= "Pm49FL004",
 		.bustype	= BUS_LPC | BUS_FWH, /* A/A Mux */
-		.manufacture_id	= PMC_ID_NOPREFIX,
-		.model_id	= PMC_PM49FL004,
 		.total_size	= 512,
 		.page_size	= 64 * 1024,
 		.feature_bits	= FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {PMC_ID_NOPREFIX, PMC_PM49FL004} } },
 		.probe_timing	= TIMING_ZERO,	/* routine is wrapper to probe_jedec (pm49fl00x.c) */
 		.block_erasers	=
 		{
@@ -9155,13 +8628,11 @@ 
 		.vendor		= "Sanyo",
 		.name		= "LE25FW106",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= SANYO_ID,
-		.model_id	= SANYO_LE25FW106,
 		.total_size	= 128,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_res2,
+			{probe_spi_res2, {2, {SANYO_ID, SANYO_LE25FW106} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	= {
 			{
@@ -9186,13 +8657,11 @@ 
 		.vendor		= "Sanyo",
 		.name		= "LE25FW406A",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= SANYO_ID,
-		.model_id	= SANYO_LE25FW406A,
 		.total_size	= 512,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_res2,
+			{probe_spi_res2, {2, {SANYO_ID, SANYO_LE25FW406A} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	= {
 			{
@@ -9217,13 +8686,11 @@ 
 		.vendor		= "Sanyo",
 		.name		= "LE25FU406B",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= SANYO_ID,
-		.model_id	= SANYO_LE25FU406B,
 		.total_size	= 512,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_res2,
+			{probe_spi_res2, {2, {SANYO_ID, SANYO_LE25FU406B} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	= {
 			{
@@ -9248,12 +8715,11 @@ 
 		.vendor		= "Sanyo",
 		.name		= "LE25FW203A",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= SANYO_ID,
-		.model_id	= SANYO_LE25FW203A,
 		.total_size	= 256,
 		.page_size	= 256,
+		.feature_bits	= 0,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {SANYO_ID, SANYO_LE25FW203A} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -9279,12 +8745,11 @@ 
 		.vendor		= "Sanyo",
 		.name		= "LE25FW403A",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= SANYO_ID,
-		.model_id	= SANYO_LE25FW403A,
 		.total_size	= 512,
 		.page_size	= 256,
+		.feature_bits	= 0,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {SANYO_ID, SANYO_LE25FW403A} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	= {
 			{
@@ -9309,13 +8774,11 @@ 
 		.vendor		= "Sanyo",
 		.name		= "LE25FW418A",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= SANYO_ID,
-		.model_id	= SANYO_LE25FW418A,
 		.total_size	= 512,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_res2,
+			{probe_spi_res2, {2, {SANYO_ID, SANYO_LE25FW418A} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	= {
 			{
@@ -9340,13 +8803,11 @@ 
 		.vendor		= "Sanyo",
 		.name		= "LE25FW806",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= SANYO_ID,
-		.model_id	= SANYO_LE25FW806,
 		.total_size	= 1024,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_res2,
+			{probe_spi_res2, {2, {SANYO_ID, SANYO_LE25FW806} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	= {
 			{
@@ -9374,13 +8835,11 @@ 
 		.vendor		= "Sanyo",
 		.name		= "LE25FW808",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= SANYO_ID,
-		.model_id	= SANYO_LE25FW808,
 		.total_size	= 1024,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_res2,
+			{probe_spi_res2, {2, {SANYO_ID, SANYO_LE25FW808} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	= {
 			{
@@ -9405,12 +8864,11 @@ 
 		.vendor		= "Sharp",
 		.name		= "LH28F008BJT-BTLZ1",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= SHARP_ID,
-		.model_id	= SHARP_LH28F008BJ__PB,
 		.total_size	= 1024,
 		.page_size	= 64 * 1024,
+		.feature_bits	= 0,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_82802ab,
+			{probe_82802ab, {2, {SHARP_ID, SHARP_LH28F008BJ__PB} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -9435,13 +8893,11 @@ 
 		.vendor		= "Sharp",
 		.name		= "LHF00L04",
 		.bustype	= BUS_FWH, /* A/A Mux */
-		.manufacture_id	= SHARP_ID,
-		.model_id	= SHARP_LHF00L04,
 		.total_size	= 1024,
 		.page_size	= 64 * 1024,
 		.feature_bits	= FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_82802ab,
+			{probe_82802ab, {2, {SHARP_ID, SHARP_LHF00L04} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -9468,13 +8924,11 @@ 
 		.vendor		= "Spansion",
 		.name		= "S25FL004A",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= SPANSION_ID,
-		.model_id	= SPANSION_S25FL004A,
 		.total_size	= 512,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {SPANSION_ID, SPANSION_S25FL004A} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -9497,13 +8951,11 @@ 
 		.vendor		= "Spansion",
 		.name		= "S25FL008A",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= SPANSION_ID,
-		.model_id	= SPANSION_S25FL008A,
 		.total_size	= 1024,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PRE,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {SPANSION_ID, SPANSION_S25FL008A} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -9526,13 +8978,11 @@ 
 		.vendor		= "Spansion",
 		.name		= "S25FL016A",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= SPANSION_ID,
-		.model_id	= SPANSION_S25FL016A,
 		.total_size	= 2048,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PR,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {SPANSION_ID, SPANSION_S25FL016A} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -9555,13 +9005,11 @@ 
 		.vendor		= "Spansion",
 		.name		= "S25FL032A/P",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= SPANSION_ID,
-		.model_id	= SPANSION_S25FL032A,
 		.total_size	= 4096,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {SPANSION_ID, SPANSION_S25FL032A} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -9584,13 +9032,11 @@ 
 		.vendor		= "Spansion",
 		.name		= "S25FL064A/P",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= SPANSION_ID,
-		.model_id	= SPANSION_S25FL064A,
 		.total_size	= 8192,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {SPANSION_ID, SPANSION_S25FL064A} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -9613,13 +9059,11 @@ 
 		.vendor		= "Spansion",
 		.name		= "S25FL204K",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= SPANSION_ID,
-		.model_id	= SPANSION_S25FL204,
 		.total_size	= 512,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {SPANSION_ID, SPANSION_S25FL204} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	= {
 			{
@@ -9647,13 +9091,11 @@ 
 		.vendor		= "Spansion",
 		.name		= "S25FL208K",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= SPANSION_ID,
-		.model_id	= SPANSION_S25FL208,
 		.total_size	= 1024,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {SPANSION_ID, SPANSION_S25FL208} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	= {
 			{
@@ -9681,14 +9123,12 @@ 
 		.vendor		= "Spansion",
 		.name		= "S25FL116K/S25FL216K",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= SPANSION_ID,
-		.model_id	= SPANSION_S25FL216,
 		.total_size	= 2048,
 		.page_size	= 256,
 		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (S25FL116K only) */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {SPANSION_ID, SPANSION_S25FL216} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	= {
 			{
@@ -9716,14 +9156,12 @@ 
 		.vendor		= "Spansion",
 		.name		= "S25FL132K",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= SPANSION_ID,
-		.model_id	= SPANSION_S25FL132K,
 		.total_size	= 4096,
 		.page_size	= 256,
 		/* OTP: 768B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {SPANSION_ID, SPANSION_S25FL132K} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	= {
 			{
@@ -9751,14 +9189,12 @@ 
 		.vendor		= "Spansion",
 		.name		= "S25FL164K",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= SPANSION_ID,
-		.model_id	= SPANSION_S25FL164K,
 		.total_size	= 8192,
 		.page_size	= 256,
 		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {SPANSION_ID, SPANSION_S25FL164K} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	= {
 			{
@@ -9786,15 +9222,13 @@ 
 		.vendor		= "Spansion",
 		.name		= "S25FL128S......0", /* uniform 256kB sectors */
 		.bustype	= BUS_SPI,
-		.manufacture_id	= SPANSION_ID,
-		.model_id	= SPANSION_S25FL128,
 		.total_size	= 16384,
 		.page_size	= 256,
 		/* supports 4B addressing */
 		/* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {SPANSION_ID, SPANSION_S25FL128} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	= {
 			{
@@ -9822,13 +9256,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST25LF020A",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST25VF020_REMS,
 		.total_size	= 256,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_EWSR,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rems,
+			{probe_spi_rems, {2, {SST_ID, SST_SST25VF020_REMS} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -9854,13 +9286,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST25LF040A",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST25VF040_REMS,
 		.total_size	= 512,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_EWSR,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_res2,
+			{probe_spi_res2, {2, {SST_ID, SST_SST25VF040_REMS} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -9886,13 +9316,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST25LF080(A)",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST25VF080_REMS,
 		.total_size	= 1024,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_EITHER,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_res2,
+			{probe_spi_res2, {2, {SST_ID, SST_SST25VF080_REMS} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -9918,13 +9346,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST25VF512A",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST25VF512A_REMS,
 		.total_size	= 64,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_EWSR,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rems,
+			{probe_spi_rems, {2, {SST_ID, SST_SST25VF512A_REMS} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -9956,13 +9382,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST25VF010",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST25VF010_REMS,
 		.total_size	= 128,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_EWSR,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rems,
+			{probe_spi_rems, {2, {SST_ID, SST_SST25VF010_REMS} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -9994,13 +9418,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST25VF020",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST25VF020_REMS,
 		.total_size	= 256,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_EWSR,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rems,
+			{probe_spi_rems, {2, {SST_ID, SST_SST25VF020_REMS} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -10026,13 +9448,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST25VF020B",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST25VF020B,
 		.total_size	= 256,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_EWSR,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {SST_ID, SST_SST25VF020B} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -10064,13 +9484,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST25VF040",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST25VF040_REMS,
 		.total_size	= 512,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_EWSR,
 		.tested		= TEST_OK_PR,
-		.probe		= probe_spi_rems,
+			{probe_spi_rems, {2, {SST_ID, SST_SST25VF040_REMS} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -10096,13 +9514,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST25VF040B",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST25VF040B,
 		.total_size	= 512,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_EWSR,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {SST_ID, SST_SST25VF040B} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -10134,13 +9550,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST25VF040B.REMS",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST25VF040B_REMS,
 		.total_size	= 512,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_EWSR,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rems,
+			{probe_spi_rems, {2, {SST_ID, SST_SST25VF040B_REMS} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -10172,13 +9586,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST25VF080B",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST25VF080B,
 		.total_size	= 1024,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_EWSR,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {SST_ID, SST_SST25VF080B} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -10210,13 +9622,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST25VF016B",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST25VF016B,
 		.total_size	= 2048,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_EITHER,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {SST_ID, SST_SST25VF016B} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -10248,13 +9658,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST25VF032B",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST25VF032B,
 		.total_size	= 4096,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_EWSR,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {SST_ID, SST_SST25VF032B} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -10286,13 +9694,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST25VF064C",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST25VF064C,
 		.total_size	= 8192,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_EWSR,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {SST_ID, SST_SST25VF064C} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -10324,13 +9730,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST25WF512",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST25WF512,
 		.total_size	= 64,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_EITHER,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {SST_ID, SST_SST25WF512} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -10359,13 +9763,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST25WF010",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST25WF010,
 		.total_size	= 128,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_EITHER,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {SST_ID, SST_SST25WF010} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -10394,13 +9796,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST25WF020",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST25WF020,
 		.total_size	= 256,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_EITHER,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {SST_ID, SST_SST25WF020} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -10432,13 +9832,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST25WF040",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST25WF040,
 		.total_size	= 512,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_EITHER,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {SST_ID, SST_SST25WF040} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -10470,13 +9868,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST25WF080",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST25WF080,
 		.total_size	= 1024,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_EITHER,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {SST_ID, SST_SST25WF080} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -10508,13 +9904,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST28SF040A",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST28SF040,
 		.total_size	= 512,
 		.page_size	= 256,
 		.feature_bits	= 0,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_82802ab,
+			{probe_82802ab, {2, {SST_ID, SST_SST28SF040} } },
 		.probe_timing	= TIMING_IGNORED, /* routine doesn't use probe_timing (sst28sf040.c) */
 		.block_erasers	=
 		{
@@ -10536,13 +9930,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST29EE010",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST29EE010,
 		.total_size	= 128,
 		.page_size	= 128,
 		.feature_bits	= FEATURE_LONG_RESET,
 		.tested		= TEST_OK_PR,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {SST_ID, SST_SST29EE010} } },
 		.probe_timing	= 10,
 		.block_erasers	=
 		{
@@ -10560,13 +9952,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST29LE010",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST29LE010,
 		.total_size	= 128,
 		.page_size	= 128,
 		.feature_bits	= FEATURE_LONG_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {SST_ID, SST_SST29LE010} } },
 		.probe_timing	= 10,
 		.block_erasers	=
 		{
@@ -10584,13 +9974,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST29EE020A",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST29EE020A,
 		.total_size	= 256,
 		.page_size	= 128,
 		.feature_bits	= FEATURE_LONG_RESET,
 		.tested		= TEST_OK_PRE,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {SST_ID, SST_SST29EE020A} } },
 		.probe_timing	= 10,
 		.block_erasers	=
 		{
@@ -10608,13 +9996,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST29LE020",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST29LE020,
 		.total_size	= 256,
 		.page_size	= 128,
 		.feature_bits	= FEATURE_LONG_RESET,
 		.tested		= TEST_OK_PRE,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {SST_ID, SST_SST29LE020} } },
 		.probe_timing	= 10,
 		.block_erasers	=
 		{
@@ -10632,13 +10018,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST39SF512",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST39SF512,
 		.total_size	= 64,
 		.page_size	= 4096,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {SST_ID, SST_SST39SF512} } },
 		.probe_timing	= 1,			/* 150 ns */
 		.block_erasers	=
 		{
@@ -10659,13 +10043,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST39SF010A",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST39SF010,
 		.total_size	= 128,
 		.page_size	= 4096,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {SST_ID, SST_SST39SF010} } },
 		.probe_timing	= 1,			/* 150 ns */
 		.block_erasers	=
 		{
@@ -10686,13 +10068,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST39SF020A",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST39SF020,
 		.total_size	= 256,
 		.page_size	= 4096,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {SST_ID, SST_SST39SF020} } },
 		.probe_timing	= 1,			/* 150 ns */
 		.block_erasers	=
 		{
@@ -10713,13 +10093,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST39SF040",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST39SF040,
 		.total_size	= 512,
 		.page_size	= 4096,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {SST_ID, SST_SST39SF040} } },
 		.probe_timing	= 1,			/* 150 ns */
 		.block_erasers	=
 		{
@@ -10740,13 +10118,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST39VF512",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST39VF512,
 		.total_size	= 64,
 		.page_size	= 4096,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {SST_ID, SST_SST39VF512} } },
 		.probe_timing	= 1,			/* 150 ns */
 		.block_erasers	=
 		{
@@ -10767,13 +10143,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST39VF010",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST39VF010,
 		.total_size	= 128,
 		.page_size	= 4096,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {SST_ID, SST_SST39VF010} } },
 		.probe_timing	= 1,			/* 150 ns */
 		.block_erasers	=
 		{
@@ -10794,13 +10168,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST39VF020",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST39VF020,
 		.total_size	= 256,
 		.page_size	= 4096,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {SST_ID, SST_SST39VF020} } },
 		.probe_timing	= 1,			/* 150 ns */
 		.block_erasers	=
 		{
@@ -10821,13 +10193,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST39VF040",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST39VF040,
 		.total_size	= 512,
 		.page_size	= 4096,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {SST_ID, SST_SST39VF040} } },
 		.probe_timing	= 1,			/* 150 ns */
 		.block_erasers	=
 		{
@@ -10848,13 +10218,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST39VF080",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST39VF080,
 		.total_size	= 1024,
 		.page_size	= 4096,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {SST_ID, SST_SST39VF080} } },
 		.probe_timing	= 1,			/* 150 ns */
 		.block_erasers	=
 		{
@@ -10878,13 +10246,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST49LF002A/B",
 		.bustype	= BUS_FWH, /* A/A Mux */
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST49LF002A,
 		.total_size	= 256,
 		.page_size	= 16 * 1024,
 		.feature_bits	= FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {SST_ID, SST_SST49LF002A} } },
 		.probe_timing	= 1,		/* 150 ns */
 		.block_erasers	=
 		{
@@ -10910,13 +10276,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST49LF003A/B",
 		.bustype	= BUS_FWH, /* A/A Mux */
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST49LF003A,
 		.total_size	= 384,
 		.page_size	= 64 * 1024,
 		.feature_bits	= FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {SST_ID, SST_SST49LF003A} } },
 		.probe_timing	= 1,		/* 150 ns */
 		.block_erasers	=
 		{
@@ -10945,13 +10309,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST49LF004A/B",
 		.bustype	= BUS_FWH, /* A/A Mux */
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST49LF004A,
 		.total_size	= 512,
 		.page_size	= 64 * 1024,
 		.feature_bits	= FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {SST_ID, SST_SST49LF004A} } },
 		.probe_timing	= 1,		/* 150 ns */
 		.block_erasers	=
 		{
@@ -10977,13 +10339,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST49LF004C",
 		.bustype	= BUS_FWH,
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST49LF004C,
 		.total_size	= 512,
 		.page_size	= 4 * 1024,
 		.feature_bits	= FEATURE_REGISTERMAP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_82802ab,
+			{probe_82802ab, {2, {SST_ID, SST_SST49LF004C} } },
 		.probe_timing	= TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
 		.block_erasers	=
 		{
@@ -11010,13 +10370,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST49LF008A",
 		.bustype	= BUS_FWH, /* A/A Mux */
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST49LF008A,
 		.total_size	= 1024,
 		.page_size	= 64 * 1024,
 		.feature_bits	= FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {SST_ID, SST_SST49LF008A} } },
 		.probe_timing	= 1,		/* 150 ns */
 		.block_erasers	=
 		{
@@ -11042,13 +10400,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST49LF008C",
 		.bustype	= BUS_FWH,
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST49LF008C,
 		.total_size	= 1024,
 		.page_size	= 4 * 1024,
 		.feature_bits	= FEATURE_REGISTERMAP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_82802ab,
+			{probe_82802ab, {2, {SST_ID, SST_SST49LF008C} } },
 		.probe_timing	= TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
 		.block_erasers	=
 		{
@@ -11075,13 +10431,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST49LF016C",
 		.bustype	= BUS_FWH,
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST49LF016C,
 		.total_size	= 2048,
 		.page_size	= 4 * 1024,
 		.feature_bits	= FEATURE_REGISTERMAP,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_82802ab,
+			{probe_82802ab, {2, {SST_ID, SST_SST49LF016C} } },
 		.probe_timing	= TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
 		.block_erasers	=
 		{
@@ -11108,13 +10462,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST49LF020",
 		.bustype	= BUS_LPC,
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST49LF020,
 		.total_size	= 256,
 		.page_size	= 16 * 1024,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {SST_ID, SST_SST49LF020} } },
 		.probe_timing	= 1,			/* 150 ns */
 		.block_erasers	=
 		{
@@ -11138,13 +10490,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST49LF020A",
 		.bustype	= BUS_LPC,
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST49LF020A,
 		.total_size	= 256,
 		.page_size	= 4 * 1024,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_OK_PRE,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {SST_ID, SST_SST49LF020A} } },
 		.probe_timing	= 1,			/* 150 ns */
 		.block_erasers	=
 		{
@@ -11168,13 +10518,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST49LF040",
 		.bustype	= BUS_LPC,
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST49LF040,
 		.total_size	= 512,
 		.page_size	= 4096,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {SST_ID, SST_SST49LF040} } },
 		.probe_timing	= 1,			/* 150 ns */
 		.block_erasers	=
 		{
@@ -11198,13 +10546,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST49LF040B",
 		.bustype	= BUS_LPC, /* A/A Mux */
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST49LF040B,
 		.total_size	= 512,
 		.page_size	= 64 * 1024,
 		.feature_bits	= FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {SST_ID, SST_SST49LF040B} } },
 		.probe_timing	= 1,		/* 150ns */
 		.block_erasers	=
 		{
@@ -11229,13 +10575,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST49LF080A",
 		.bustype	= BUS_LPC, /* A/A Mux */
-		.manufacture_id	= SST_ID,
- 		.model_id	= SST_SST49LF080A,
 		.total_size	= 1024,
 		.page_size	= 4096,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {SST_ID, SST_SST49LF080A} } },
 		.probe_timing	= TIMING_FIXME,
 		.block_erasers	=
 		{
@@ -11259,13 +10603,11 @@ 
 		.vendor		= "SST",
 		.name		= "SST49LF160C",
 		.bustype	= BUS_LPC,
-		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST49LF160C,
 		.total_size	= 2048,
 		.page_size	= 4 * 1024,
 		.feature_bits	= FEATURE_REGISTERMAP,
 		.tested		= TEST_OK_PRE,
-		.probe		= probe_82802ab,
+			{probe_82802ab, {2, {SST_ID, SST_SST49LF160C} } },
 		.probe_timing	= TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
 		.block_erasers	=
 		{
@@ -11292,13 +10634,11 @@ 
 		.vendor		= "ST",
 		.name		= "M29F002B",
 		.bustype	= BUS_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_jedec, {2, {ST_ID, ST_M29F002B} } },
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -11324,13 +10664,11 @@ 
 		.vendor		= "ST",
 		.name		= "M29F002T/NT",
 		.bustype	= BUS_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_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {ST_ID, ST_M29F002T} } },
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -11356,13 +10694,11 @@ 
 		.vendor		= "ST",
 		.name		= "M29F040B",
 		.bustype	= BUS_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_jedec, {2, {ST_ID, ST_M29F040B} } },
 		.probe_timing	= TIMING_ZERO, /* datasheet specifies no timing */
 		.block_erasers	=
 		{
@@ -11384,13 +10720,11 @@ 
 		.vendor		= "ST",
 		.name		= "M29F400BB",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_M29F400BB,
 		.total_size	= 512,
 		.page_size	= 64 * 1024,
 		.feature_bits	= FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_m29f400bt,
+			{probe_m29f400bt, {2, {ST_ID, ST_M29F400BB} } },
 		.probe_timing	= TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
 		.block_erasers	=
 		{
@@ -11416,13 +10750,11 @@ 
 		.vendor		= "ST",
 		.name		= "M29F400BT",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_M29F400BT,
 		.total_size	= 512,
 		.page_size	= 64 * 1024,
 		.feature_bits	= FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_m29f400bt,
+			{probe_m29f400bt, {2, {ST_ID, ST_M29F400BT} } },
 		.probe_timing	= TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
 		.block_erasers	=
 		{
@@ -11448,13 +10780,11 @@ 
 		.vendor		= "ST",
 		.name		= "M29W010B",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_M29W010B,
 		.total_size	= 128,
 		.page_size	= 16 * 1024,
 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {ST_ID, ST_M29W010B} } },
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -11475,13 +10805,11 @@ 
 		.vendor		= "ST",
 		.name		= "M29W040B",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_M29W040B,
 		.total_size	= 512,
 		.page_size	= 64 * 1024,
 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {ST_ID, ST_M29W040B} } },
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -11502,13 +10830,11 @@ 
 		.vendor		= "ST",
 		.name		= "M29W512B",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id = ST_ID,
-		.model_id	= ST_M29W512B,
 		.total_size	= 64,
 		.page_size	= 64 * 1024,
 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {ST_ID, ST_M29W512B} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -11526,13 +10852,11 @@ 
 		.vendor		= "ST",
 		.name		= "M50FLW040A",
 		.bustype	= BUS_FWH | BUS_LPC, /* A/A Mux */
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_M50FLW040A,
 		.total_size	= 512,
 		.page_size	= 0,
 		.feature_bits	= FEATURE_REGISTERMAP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_82802ab,
+			{probe_82802ab, {2, {ST_ID, ST_M50FLW040A} } },
 		.probe_timing	= TIMING_FIXME,
 		.block_erasers	=
 		{
@@ -11559,13 +10883,11 @@ 
 		.vendor		= "ST",
 		.name		= "M50FLW040B",
 		.bustype	= BUS_FWH | BUS_LPC, /* A/A Mux */
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_M50FLW040B,
 		.total_size	= 512,
 		.page_size	= 0,
 		.feature_bits	= FEATURE_REGISTERMAP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_82802ab,
+			{probe_82802ab, {2, {ST_ID, ST_M50FLW040B} } },
 		.probe_timing	= TIMING_FIXME,
 		.block_erasers	=
 		{
@@ -11592,13 +10914,11 @@ 
 		.vendor		= "ST",
 		.name		= "M50FLW080A",
 		.bustype	= BUS_FWH | BUS_LPC, /* A/A Mux */
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_M50FLW080A,
 		.total_size	= 1024,
 		.page_size	= 0,
 		.feature_bits	= FEATURE_REGISTERMAP,
 		.tested		= TEST_OK_PRE,
-		.probe		= probe_82802ab,
+			{probe_82802ab, {2, {ST_ID, ST_M50FLW080A} } },
 		.probe_timing	= TIMING_FIXME,
 		.block_erasers	=
 		{
@@ -11625,13 +10945,11 @@ 
 		.vendor		= "ST",
 		.name		= "M50FLW080B",
 		.bustype	= BUS_FWH | BUS_LPC, /* A/A Mux */
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_M50FLW080B,
 		.total_size	= 1024,
 		.page_size	= 0,
 		.feature_bits	= FEATURE_REGISTERMAP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_82802ab,
+			{probe_82802ab, {2, {ST_ID, ST_M50FLW080B} } },
 		.probe_timing	= TIMING_FIXME,
 		.block_erasers	=
 		{
@@ -11658,13 +10976,11 @@ 
 		.vendor		= "ST",
 		.name		= "M50FW002",
 		.bustype	= BUS_FWH, /* A/A Mux */
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_M50FW002,
 		.total_size	= 256,
 		.page_size	= 0,
 		.feature_bits	= FEATURE_REGISTERMAP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_82802ab,
+			{probe_82802ab, {2, {ST_ID, ST_M50FW002} } },
 		.probe_timing	= TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
 		.block_erasers	=
 		{
@@ -11688,13 +11004,11 @@ 
 		.vendor		= "ST",
 		.name		= "M50FW016",
 		.bustype	= BUS_FWH, /* A/A Mux */
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_M50FW016,
 		.total_size	= 2048,
 		.page_size	= 0,
 		.feature_bits	= FEATURE_REGISTERMAP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_82802ab,
+			{probe_82802ab, {2, {ST_ID, ST_M50FW016} } },
 		.probe_timing	= TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
 		.block_erasers	=
 		{
@@ -11713,13 +11027,11 @@ 
 		.vendor		= "ST",
 		.name		= "M50FW040",
 		.bustype	= BUS_FWH, /* A/A Mux */
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_M50FW040,
 		.total_size	= 512,
 		.page_size	= 0,
 		.feature_bits	= FEATURE_REGISTERMAP,
 		.tested		= TEST_OK_PR,
-		.probe		= probe_82802ab,
+			{probe_82802ab, {2, {ST_ID, ST_M50FW040} } },
 		.probe_timing	= TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
 		.block_erasers	=
 		{
@@ -11738,13 +11050,11 @@ 
 		.vendor		= "ST",
 		.name		= "M50FW080",
 		.bustype	= BUS_FWH, /* A/A Mux */
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_M50FW080,
 		.total_size	= 1024,
 		.page_size	= 0,
 		.feature_bits	= FEATURE_REGISTERMAP,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_82802ab,
+			{probe_82802ab, {2, {ST_ID, ST_M50FW080} } },
 		.probe_timing	= TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
 		.block_erasers	=
 		{
@@ -11763,13 +11073,11 @@ 
 		.vendor		= "ST",
 		.name		= "M50LPW080",
 		.bustype	= BUS_LPC, /* A/A Mux */
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_M50LPW080,
 		.total_size	= 1024,
 		.page_size	= 0,
 		.feature_bits	= FEATURE_REGISTERMAP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_82802ab,
+			{probe_82802ab, {2, {ST_ID, ST_M50LPW080} } },
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -11788,13 +11096,11 @@ 
 		.vendor		= "ST",
 		.name		= "M50LPW116",
 		.bustype	= BUS_LPC, /* A/A Mux */
-		.manufacture_id	= ST_ID,
-		.model_id	= ST_M50LPW116,
 		.total_size	= 2048,
 		.page_size	= 0,
 		.feature_bits	= FEATURE_REGISTERMAP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_82802ab,
+			{probe_82802ab, {2, {ST_ID, ST_M50LPW116} } },
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -11819,13 +11125,11 @@ 
 		.vendor		= "SyncMOS/MoselVitelic",
 		.name		= "{F,S,V}29C51001B",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= SYNCMOS_MVC_ID,
-		.model_id	= SM_MVC_29C51001B,
 		.total_size	= 128,
 		.page_size	= 512,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {SYNCMOS_MVC_ID, SM_MVC_29C51001B} } },
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -11846,13 +11150,11 @@ 
 		.vendor		= "SyncMOS/MoselVitelic",
 		.name		= "{F,S,V}29C51001T",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= SYNCMOS_MVC_ID,
-		.model_id	= SM_MVC_29C51001T,
 		.total_size	= 128,
 		.page_size	= 512,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {SYNCMOS_MVC_ID, SM_MVC_29C51001T} } },
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -11873,13 +11175,11 @@ 
 		.vendor		= "SyncMOS/MoselVitelic",
 		.name		= "{F,S,V}29C51002B",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= SYNCMOS_MVC_ID,
-		.model_id	= SM_MVC_29C51002B,
 		.total_size	= 256,
 		.page_size	= 512,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {SYNCMOS_MVC_ID, SM_MVC_29C51002B} } },
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -11899,13 +11199,11 @@ 
 		.vendor		= "SyncMOS/MoselVitelic",
 		.name		= "{F,S,V}29C51002T",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= SYNCMOS_MVC_ID,
-		.model_id	= SM_MVC_29C51002T,
 		.total_size	= 256,
 		.page_size	= 512,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {SYNCMOS_MVC_ID, SM_MVC_29C51002T} } },
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -11925,13 +11223,11 @@ 
 		.vendor		= "SyncMOS/MoselVitelic",
 		.name		= "{F,S,V}29C51004B",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= SYNCMOS_MVC_ID,
-		.model_id	= SM_MVC_29C51004B,
 		.total_size	= 512,
 		.page_size	= 1024,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {SYNCMOS_MVC_ID, SM_MVC_29C51004B} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -11952,13 +11248,11 @@ 
 		.vendor		= "SyncMOS/MoselVitelic",
 		.name		= "{F,S,V}29C51004T",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= SYNCMOS_MVC_ID,
-		.model_id	= SM_MVC_29C51004T,
 		.total_size	= 512,
 		.page_size	= 1024,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {SYNCMOS_MVC_ID, SM_MVC_29C51004T} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -11979,13 +11273,11 @@ 
 		.vendor		= "SyncMOS/MoselVitelic",
 		.name		= "{S,V}29C31004B",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= SYNCMOS_MVC_ID,
-		.model_id	= SM_MVC_29C31004B,
 		.total_size	= 512,
 		.page_size	= 1024,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {SYNCMOS_MVC_ID, SM_MVC_29C31004B} } },
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -12006,13 +11298,11 @@ 
 		.vendor		= "SyncMOS/MoselVitelic",
 		.name		= "{S,V}29C31004T",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= SYNCMOS_MVC_ID,
-		.model_id	= SM_MVC_29C31004T,
 		.total_size	= 512,
 		.page_size	= 1024,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {SYNCMOS_MVC_ID, SM_MVC_29C31004T} } },
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -12033,13 +11323,11 @@ 
 		.vendor		= "TI",
 		.name		= "TMS29F002RB",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= TI_OLD_ID,
-		.model_id	= TI_TMS29F002RB,
 		.total_size	= 256,
 		.page_size	= 16384, /* Non-uniform sectors */
 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {TI_OLD_ID, TI_TMS29F002RB} } },
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -12065,13 +11353,11 @@ 
 		.vendor		= "TI",
 		.name		= "TMS29F002RT",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= TI_OLD_ID,
-		.model_id	= TI_TMS29F002RT,
 		.total_size	= 256,
 		.page_size	= 16384, /* Non-uniform sectors */
 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {TI_OLD_ID, TI_TMS29F002RT} } },
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers	=
 		{
@@ -12097,15 +11383,13 @@ 
 		.vendor		= "Winbond",
 		.name		= "W25Q80.V",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= WINBOND_NEX_ID,
-		.model_id	= WINBOND_NEX_W25Q80_V,
 		.total_size	= 1024,
 		.page_size	= 256,
 		/* supports SFDP */
 		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {WINBOND_NEX_ID, WINBOND_NEX_W25Q80_V} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -12137,15 +11421,13 @@ 
 		.vendor		= "Winbond",
 		.name		= "W25Q16.V",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= WINBOND_NEX_ID,
-		.model_id	= WINBOND_NEX_W25Q16_V,
 		.total_size	= 2048,
 		.page_size	= 256,
 		/* supports SFDP */
 		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {WINBOND_NEX_ID, WINBOND_NEX_W25Q16_V} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -12177,15 +11459,13 @@ 
 		.vendor		= "Winbond",
 		.name		= "W25Q32.V",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= WINBOND_NEX_ID,
-		.model_id	= WINBOND_NEX_W25Q32_V,
 		.total_size	= 4096,
 		.page_size	= 256,
 		/* supports SFDP */
 		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {WINBOND_NEX_ID, WINBOND_NEX_W25Q32_V} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -12217,15 +11497,13 @@ 
 		.vendor		= "Winbond",
 		.name		= "W25Q64.V",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= WINBOND_NEX_ID,
-		.model_id	= WINBOND_NEX_W25Q64_V,
 		.total_size	= 8192,
 		.page_size	= 256,
 		/* supports SFDP */
 		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {WINBOND_NEX_ID, WINBOND_NEX_W25Q64_V} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -12257,15 +11535,13 @@ 
 		.vendor		= "Winbond",
 		.name		= "W25Q128.V",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= WINBOND_NEX_ID,
-		.model_id	= WINBOND_NEX_W25Q128_V,
 		.total_size	= 16384,
 		.page_size	= 256,
 		/* supports SFDP */
 		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {WINBOND_NEX_ID, WINBOND_NEX_W25Q128_V} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -12297,14 +11573,12 @@ 
 		.vendor		= "Winbond",
 		.name		= "W25Q20.W",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= WINBOND_NEX_ID,
-		.model_id	= WINBOND_NEX_W25Q20_W,
 		.total_size	= 256,
 		.page_size	= 256,
 		/* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {WINBOND_NEX_ID, WINBOND_NEX_W25Q20_W} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -12336,14 +11610,12 @@ 
 		.vendor		= "Winbond",
 		.name		= "W25Q40.W",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= WINBOND_NEX_ID,
-		.model_id	= WINBOND_NEX_W25Q40_W,
 		.total_size	= 512,
 		.page_size	= 256,
 		/* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {WINBOND_NEX_ID, WINBOND_NEX_W25Q40_W} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -12375,14 +11647,12 @@ 
 		.vendor		= "Winbond",
 		.name		= "W25Q80.W",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= WINBOND_NEX_ID,
-		.model_id	= WINBOND_NEX_W25Q80_W,
 		.total_size	= 1024,
 		.page_size	= 256,
 		/* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {WINBOND_NEX_ID, WINBOND_NEX_W25Q80_W} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -12414,15 +11684,13 @@ 
 		.vendor		= "Winbond",
 		.name		= "W25Q16.W",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= WINBOND_NEX_ID,
-		.model_id	= WINBOND_NEX_W25Q16_W,
 		.total_size	= 2048,
 		.page_size	= 256,
 		/* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
 		/* QPI enable 0x38, disable 0xFF */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {WINBOND_NEX_ID, WINBOND_NEX_W25Q16_W} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -12454,15 +11722,13 @@ 
 		.vendor		= "Winbond",
 		.name		= "W25Q32.W",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= WINBOND_NEX_ID,
-		.model_id	= WINBOND_NEX_W25Q32_W,
 		.total_size	= 4096,
 		.page_size	= 256,
 		/* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
 		/* QPI enable 0x38, disable 0xFF */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {WINBOND_NEX_ID, WINBOND_NEX_W25Q32_W} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -12494,15 +11760,13 @@ 
 		.vendor		= "Winbond",
 		.name		= "W25Q64.W",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= WINBOND_NEX_ID,
-		.model_id	= WINBOND_NEX_W25Q64_W,
 		.total_size	= 8192,
 		.page_size	= 256,
 		/* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
 		/* QPI enable 0x38, disable 0xFF */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {WINBOND_NEX_ID, WINBOND_NEX_W25Q64_W} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -12534,13 +11798,11 @@ 
 		.vendor		= "Winbond",
 		.name		= "W25X10",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= WINBOND_NEX_ID,
-		.model_id	= WINBOND_NEX_W25X10,
 		.total_size	= 128,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {WINBOND_NEX_ID, WINBOND_NEX_W25X10} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -12566,13 +11828,11 @@ 
 		.vendor		= "Winbond",
 		.name		= "W25X20",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= WINBOND_NEX_ID,
-		.model_id	= WINBOND_NEX_W25X20,
 		.total_size	= 256,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {WINBOND_NEX_ID, WINBOND_NEX_W25X20} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -12598,13 +11858,11 @@ 
 		.vendor		= "Winbond",
 		.name		= "W25X40",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= WINBOND_NEX_ID,
-		.model_id	= WINBOND_NEX_W25X40,
 		.total_size	= 512,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {WINBOND_NEX_ID, WINBOND_NEX_W25X40} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -12630,13 +11888,11 @@ 
 		.vendor		= "Winbond",
 		.name		= "W25X80",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= WINBOND_NEX_ID,
-		.model_id	= WINBOND_NEX_W25X80,
 		.total_size	= 1024,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {WINBOND_NEX_ID, WINBOND_NEX_W25X80} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -12662,13 +11918,11 @@ 
 		.vendor		= "Winbond",
 		.name		= "W25X16",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= WINBOND_NEX_ID,
-		.model_id	= WINBOND_NEX_W25X16,
 		.total_size	= 2048,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {WINBOND_NEX_ID, WINBOND_NEX_W25X16} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -12700,13 +11954,11 @@ 
 		.vendor		= "Winbond",
 		.name		= "W25X32",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= WINBOND_NEX_ID,
-		.model_id	= WINBOND_NEX_W25X32,
 		.total_size	= 4096,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {WINBOND_NEX_ID, WINBOND_NEX_W25X32} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -12738,13 +11990,11 @@ 
 		.vendor		= "Winbond",
 		.name		= "W25X64",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= WINBOND_NEX_ID,
-		.model_id	= WINBOND_NEX_W25X64,
 		.total_size	= 8192,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PROBE,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {WINBOND_NEX_ID, WINBOND_NEX_W25X64} } },
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -12776,13 +12026,11 @@ 
 		.vendor		= "Winbond",
 		.name		= "W29C010(M)/W29C011A/W29EE011/W29EE012-old",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= WINBOND_ID,
-		.model_id	= WINBOND_W29C010,
 		.total_size	= 128,
 		.page_size	= 128,
 		.feature_bits	= FEATURE_LONG_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_w29ee011,
+			{probe_w29ee011, {2, {WINBOND_ID, WINBOND_W29C010} } },
 		.probe_timing	= TIMING_IGNORED, /* routine doesn't use probe_timing (w29ee011.c) */
 		.block_erasers	=
 		{
@@ -12799,13 +12047,11 @@ 
 		.vendor		= "Winbond",
 		.name		= "W29C010(M)/W29C011A/W29EE011/W29EE012",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= WINBOND_ID,
-		.model_id	= WINBOND_W29C010,
 		.total_size	= 128,
 		.page_size	= 128,
 		.feature_bits	= FEATURE_LONG_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {WINBOND_ID, WINBOND_W29C010} } },
 		.probe_timing	= 10,		/* used datasheet for the W29C011A */
 		.block_erasers	=
 		{
@@ -12822,13 +12068,11 @@ 
 		.vendor		= "Winbond",
 		.name		= "W29C020(C)/W29C022",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= WINBOND_ID,
-		.model_id	= WINBOND_W29C020,
 		.total_size	= 256,
 		.page_size	= 128,
 		.feature_bits	= FEATURE_LONG_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {WINBOND_ID, WINBOND_W29C020} } },
 		.probe_timing	= 10,
 		.block_erasers	=
 		{
@@ -12846,13 +12090,11 @@ 
 		.vendor		= "Winbond",
 		.name		= "W29C040/P",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= WINBOND_ID,
-		.model_id	= WINBOND_W29C040,
 		.total_size	= 512,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_LONG_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {WINBOND_ID, WINBOND_W29C040} } },
 		.probe_timing	= 10,
 		.block_erasers	=
 		{
@@ -12870,13 +12112,11 @@ 
 		.vendor		= "Winbond",
 		.name		= "W39F010",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= WINBOND_ID,
-		.model_id	= WINBOND_W39F010,
 		.total_size	= 128,
 		.page_size	= 4 * 1024,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {WINBOND_ID, WINBOND_W39F010} } },
 		.probe_timing	= 10,
 		.block_erasers	=
 		{
@@ -12898,13 +12138,11 @@ 
 		.vendor		= "Winbond",
 		.name		= "W39L010",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= WINBOND_ID,
-		.model_id	= WINBOND_W39L010,
 		.total_size	= 128,
 		.page_size	= 4 * 1024,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {WINBOND_ID, WINBOND_W39L010} } },
 		.probe_timing	= 10,
 		.block_erasers	=
 		{
@@ -12926,13 +12164,11 @@ 
 		.vendor		= "Winbond",
 		.name		= "W39L020",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= WINBOND_ID,
-		.model_id	= WINBOND_W39L020,
 		.total_size	= 256,
 		.page_size	= 4 * 1024,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {WINBOND_ID, WINBOND_W39L020} } },
 		.probe_timing	= 10,
 		.block_erasers	=
 		{
@@ -12957,13 +12193,11 @@ 
 		.vendor		= "Winbond",
 		.name		= "W39L040",
 		.bustype	= BUS_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_jedec, {2, {WINBOND_ID, WINBOND_W39L040} } },
 		.probe_timing	= 10,
 		.block_erasers	=
 		{
@@ -12988,13 +12222,11 @@ 
 		.vendor		= "Winbond",
 		.name		= "W39V040A",
 		.bustype	= BUS_LPC,
-		.manufacture_id	= WINBOND_ID,
-		.model_id	= WINBOND_W39V040A,
 		.total_size	= 512,
 		.page_size	= 64 * 1024,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {WINBOND_ID, WINBOND_W39V040A} } },
 		.probe_timing	= 10,
 		.block_erasers	=
 		{
@@ -13016,13 +12248,11 @@ 
 		.vendor		= "Winbond",
 		.name		= "W39V040B",
 		.bustype	= BUS_LPC,
-		.manufacture_id	= WINBOND_ID,
-		.model_id	= WINBOND_W39V040B,
 		.total_size	= 512,
 		.page_size	= 64 * 1024,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {WINBOND_ID, WINBOND_W39V040B} } },
 		.probe_timing	= 10,
 		.block_erasers	=
 		{
@@ -13044,13 +12274,11 @@ 
 		.vendor		= "Winbond",
 		.name		= "W39V040C",
 		.bustype	= BUS_LPC,
-		.manufacture_id	= WINBOND_ID,
-		.model_id	= WINBOND_W39V040C,
 		.total_size	= 512,
 		.page_size	= 64 * 1024,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {WINBOND_ID, WINBOND_W39V040C} } },
 		.probe_timing	= 10,
 		.block_erasers	=
 		{
@@ -13072,13 +12300,11 @@ 
 		.vendor		= "Winbond",
 		.name		= "W39V040FA",
 		.bustype	= BUS_FWH,
-		.manufacture_id	= WINBOND_ID,
-		.model_id	= WINBOND_W39V040FA,
 		.total_size	= 512,
 		.page_size	= 64 * 1024,
 		.feature_bits	= FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {WINBOND_ID, WINBOND_W39V040FA} } },
 		.probe_timing	= 10,
 		.block_erasers	=
 		{
@@ -13104,13 +12330,11 @@ 
 		.vendor		= "Winbond",
 		.name		= "W39V040FB",
 		.bustype	= BUS_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_jedec, {2, {WINBOND_ID, WINBOND_W39V040B} } },
 		.probe_timing	= 10,
 		.block_erasers	=
 		{
@@ -13133,13 +12357,11 @@ 
 		.vendor		= "Winbond",
 		.name		= "W39V040FC",
 		.bustype	= BUS_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_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {WINBOND_ID, WINBOND_W39V040C} } },
 		.probe_timing	= 10,
 		.block_erasers	=
 		{
@@ -13161,13 +12383,11 @@ 
 		.vendor		= "Winbond",
 		.name		= "W39V080A",
 		.bustype	= BUS_LPC,
-		.manufacture_id	= WINBOND_ID,
-		.model_id	= WINBOND_W39V080A,
 		.total_size	= 1024,
 		.page_size	= 64 * 1024,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {WINBOND_ID, WINBOND_W39V080A} } },
 		.probe_timing	= 10,
 		.block_erasers	=
 		{
@@ -13189,13 +12409,11 @@ 
 		.vendor		= "Winbond",
 		.name		= "W49F002U/N",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= WINBOND_ID,
-		.model_id	= WINBOND_W49F002U,
 		.total_size	= 256,
 		.page_size	= 128,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {WINBOND_ID, WINBOND_W49F002U} } },
 		.probe_timing	= 10,
 		.block_erasers	=
 		{
@@ -13221,13 +12439,11 @@ 
 		.vendor		= "Winbond",
 		.name		= "W49F020",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= WINBOND_ID,
-		.model_id	= WINBOND_W49F020,
 		.total_size	= 256,
 		.page_size	= 128,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_OK_PROBE,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {WINBOND_ID, WINBOND_W49F020} } },
 		.probe_timing	= 10,
 		.block_erasers	=
 		{
@@ -13245,13 +12461,11 @@ 
 		.vendor		= "Winbond",
 		.name		= "W49V002A",
 		.bustype	= BUS_LPC,
-		.manufacture_id	= WINBOND_ID,
-		.model_id	= WINBOND_W49V002A,
 		.total_size	= 256,
 		.page_size	= 128,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {WINBOND_ID, WINBOND_W49V002A} } },
 		.probe_timing	= 10,
 		.block_erasers	=
 		{
@@ -13277,13 +12491,11 @@ 
 		.vendor		= "Winbond",
 		.name		= "W49V002FA",
 		.bustype	= BUS_FWH,
-		.manufacture_id	= WINBOND_ID,
-		.model_id	= WINBOND_W49V002FA,
 		.total_size	= 256,
 		.page_size	= 128,
 		.feature_bits	= FEATURE_EITHER_RESET,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {WINBOND_ID, WINBOND_W49V002FA} } },
 		.probe_timing	= 10,
 		.block_erasers	=
 		{
@@ -13309,13 +12521,11 @@ 
 		.vendor		= "Winbond",
 		.name		= "W39V080FA",
 		.bustype	= BUS_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_PREW,
-		.probe		= probe_jedec,
+			{probe_jedec, {2, {WINBOND_ID, WINBOND_W39V080FA} } },
 		.probe_timing	= 10,
 		.block_erasers	=
 		{
@@ -13338,13 +12548,11 @@ 
 		.vendor		= "Winbond",
 		.name		= "W39V080FA (dual mode)",
 		.bustype	= BUS_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_jedec, {2, {WINBOND_ID, WINBOND_W39V080FA_DM} } },
 		.probe_timing	= 10,
 		.block_erasers	=
 		{
@@ -13366,13 +12574,11 @@ 
 		.vendor		= "Unknown",
 		.name		= "SFDP-capable chip",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= GENERIC_MANUF_ID,
-		.model_id	= SFDP_DEVICE_ID,
 		/* We present our own "report this" text hence we do not
 		 * want the default "This flash part has status UNTESTED..."
 		 * text to be printed. */
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_sfdp,
+			{probe_spi_sfdp, {FIXME, {GENERIC_MANUF_ID, SFDP_DEVICE_ID} } },
 		.unlock		= spi_disable_blockprotect, /* is this safe? */
 		.read		= spi_chip_read,
 		/* FIXME: some vendor extensions define this */
@@ -13389,13 +12595,11 @@ 
 		.vendor		= "Programmer",
 		.name		= "Opaque flash chip",
 		.bustype	= BUS_PROG,
-		.manufacture_id	= PROGMANUF_ID,
-		.model_id	= PROGDEV_ID,
 		.total_size	= 0,
 		.page_size	= 256,
 		/* probe is assumed to work, rest will be filled in by probe */
 		.tested		= TEST_OK_PROBE,
-		.probe		= probe_opaque,
+			{probe_opaque, {FIXME, {PROGMANUF_ID, PROGDEV_ID} } },
 		/* eraseblock sizes will be set by the probing function */
 		.block_erasers	=
 		{
@@ -13411,12 +12615,11 @@ 
 		.vendor		= "AMIC",
 		.name		= "unknown AMIC SPI chip",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= AMIC_ID,
-		.model_id	= GENERIC_DEVICE_ID,
 		.total_size	= 0,
 		.page_size	= 256,
+		.feature_bits	= 0,
 		.tested		= TEST_BAD_PREW,
-		.probe		= probe_spi_rdid4,
+			{probe_spi_rdid4, {4, {AMIC_ID, GENERIC_DEVICE_ID} } },
 		.probe_timing	= TIMING_ZERO,
 		.write		= NULL,
 		.read		= NULL,
@@ -13426,12 +12629,11 @@ 
 		.vendor		= "Atmel",
 		.name		= "unknown Atmel SPI chip",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ATMEL_ID,
-		.model_id	= GENERIC_DEVICE_ID,
 		.total_size	= 0,
 		.page_size	= 256,
+		.feature_bits	= 0,
 		.tested		= TEST_BAD_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ATMEL_ID, GENERIC_DEVICE_ID} } },
 		.probe_timing	= TIMING_ZERO,
 		.write		= NULL,
 		.read		= NULL,
@@ -13441,12 +12643,11 @@ 
 		.vendor		= "Eon",
 		.name		= "unknown Eon SPI chip",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EON_ID_NOPREFIX,
-		.model_id	= GENERIC_DEVICE_ID,
 		.total_size	= 0,
 		.page_size	= 256,
+		.feature_bits	= 0,
 		.tested		= TEST_BAD_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {EON_ID_NOPREFIX, GENERIC_DEVICE_ID} } },
 		.probe_timing	= TIMING_ZERO,
 		.write		= NULL,
 		.read		= NULL,
@@ -13456,12 +12657,11 @@ 
 		.vendor		= "Macronix",
 		.name		= "unknown Macronix SPI chip",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= MACRONIX_ID,
-		.model_id	= GENERIC_DEVICE_ID,
 		.total_size	= 0,
 		.page_size	= 256,
+		.feature_bits	= 0,
 		.tested		= TEST_BAD_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {MACRONIX_ID, GENERIC_DEVICE_ID} } },
 		.probe_timing	= TIMING_ZERO,
 		.write		= NULL,
 		.read		= NULL,
@@ -13471,12 +12671,11 @@ 
 		.vendor		= "PMC",
 		.name		= "unknown PMC SPI chip",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= PMC_ID,
-		.model_id	= GENERIC_DEVICE_ID,
 		.total_size	= 0,
 		.page_size	= 256,
+		.feature_bits	= 0,
 		.tested		= TEST_BAD_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {PMC_ID, GENERIC_DEVICE_ID} } },
 		.probe_timing	= TIMING_ZERO,
 		.write		= NULL,
 		.read		= NULL,
@@ -13486,12 +12685,11 @@ 
 		.vendor		= "SST",
 		.name		= "unknown SST SPI chip",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= SST_ID,
-		.model_id	= GENERIC_DEVICE_ID,
 		.total_size	= 0,
 		.page_size	= 256,
+		.feature_bits	= 0,
 		.tested		= TEST_BAD_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {SST_ID, GENERIC_DEVICE_ID} } },
 		.probe_timing	= TIMING_ZERO,
 		.write		= NULL,
 		.read		= NULL,
@@ -13501,12 +12699,11 @@ 
 		.vendor		= "ST",
 		.name		= "unknown ST SPI chip",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= ST_ID,
-		.model_id	= GENERIC_DEVICE_ID,
 		.total_size	= 0,
 		.page_size	= 256,
+		.feature_bits	= 0,
 		.tested		= TEST_BAD_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {ST_ID, GENERIC_DEVICE_ID} } },
 		.probe_timing	= TIMING_ZERO,
 		.write		= NULL,
 		.read		= NULL,
@@ -13516,12 +12713,11 @@ 
 		.vendor		= "Sanyo",
 		.name		= "unknown Sanyo SPI chip",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= SANYO_ID,
-		.model_id	= GENERIC_DEVICE_ID,
 		.total_size	= 0,
 		.page_size	= 256,
+		.feature_bits	= 0,
 		.tested		= TEST_BAD_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {SANYO_ID, GENERIC_DEVICE_ID} } },
 		.probe_timing	= TIMING_ZERO,
 		.write		= NULL,
 		.read		= NULL,
@@ -13531,12 +12727,11 @@ 
 		.vendor		= "Winbond",
 		.name		= "unknown Winbond (ex Nexcom) SPI chip",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= WINBOND_NEX_ID,
-		.model_id	= GENERIC_DEVICE_ID,
 		.total_size	= 0,
 		.page_size	= 256,
+		.feature_bits	= 0,
 		.tested		= TEST_BAD_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {WINBOND_NEX_ID, GENERIC_DEVICE_ID} } },
 		.probe_timing	= TIMING_ZERO,
 		.write		= NULL,
 		.read		= NULL,
@@ -13546,12 +12741,11 @@ 
 		.vendor		= "Generic",
 		.name		= "unknown SPI chip (RDID)",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= GENERIC_MANUF_ID,
-		.model_id	= GENERIC_DEVICE_ID,
 		.total_size	= 0,
 		.page_size	= 256,
+		.feature_bits	= 0,
 		.tested		= TEST_BAD_PREW,
-		.probe		= probe_spi_rdid,
+			{probe_spi_rdid, {3, {GENERIC_MANUF_ID, GENERIC_DEVICE_ID} } },
 		.write		= NULL,
 	},
 
@@ -13559,12 +12753,11 @@ 
 		.vendor		= "Generic",
 		.name		= "unknown SPI chip (REMS)",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= GENERIC_MANUF_ID,
-		.model_id	= GENERIC_DEVICE_ID,
 		.total_size	= 0,
 		.page_size	= 256,
+		.feature_bits	= 0,
 		.tested		= TEST_BAD_PREW,
-		.probe		= probe_spi_rems,
+			{probe_spi_rems, {2, {GENERIC_MANUF_ID, GENERIC_DEVICE_ID} } },
 		.write		= NULL,
 	},