Index: include/urjtag/flash.h
===================================================================
--- include/urjtag/flash.h	(revision 1965)
+++ include/urjtag/flash.h	(working copy)
@@ -36,6 +36,7 @@
 
 #include <stdio.h>
 #include <stdint.h>
+#include "bus_driver.h"
 
 #include "types.h"
 
@@ -46,6 +47,13 @@
 
 typedef struct
 {
+    urj_flash_detect_func_t detect_func;
+    urj_bus_type_t allowable_bus_types[]; 
+}
+urj_flash_detector_t;
+
+typedef struct
+{
     const char *name;
     const char *description;
     unsigned int bus_width;     /* 1 for 8 bits, 2 for 16 bits, 4 for 32 bits, etc. */
Index: include/urjtag/bus_driver.h
===================================================================
--- include/urjtag/bus_driver.h	(revision 1965)
+++ include/urjtag/bus_driver.h	(working copy)
@@ -84,6 +84,15 @@
 }
 urj_bus_param_key_t;
 
+typedef enum URJ_BUS_TYPE
+{
+    URJ_BUS_TYPE_NONE = 0,
+    URJ_BUS_TYPE_PARALLEL,
+    URJ_BUS_TYPE_SPI,
+    URJ_BUS_TYPE_I2C,
+} 
+urj_bus_type_t;
+
 struct URJ_BUS_DRIVER
 {
     const char *name;
@@ -105,8 +114,12 @@
     /* @@@@ RFHH need to return status */
     uint32_t (*read) (urj_bus_t *bus, uint32_t adr);
     /* @@@@ RFHH need to return status */
+    int (*write_start) (urj_bus_t *bus, uint32_t adr);
     void (*write) (urj_bus_t *bus, uint32_t adr, uint32_t data);
     int (*init) (urj_bus_t *bus);
+    int (*enable) (urj_bus_t *bus);
+    int (*disable) (urj_bus_t *bus);
+    urj_bus_type_t bus_type;
 };
 
 struct URJ_BUS
@@ -115,6 +128,7 @@
     urj_part_t *part;
     void *params;
     int initialized;
+    int enabled;
     const urj_bus_driver_t *driver;
 };
 
@@ -126,9 +140,13 @@
 #define URJ_BUS_READ_NEXT(bus,adr)      (bus)->driver->read_next(bus,adr)
 #define URJ_BUS_READ_END(bus)           (bus)->driver->read_end(bus)
 #define URJ_BUS_READ(bus,adr)           (bus)->driver->read(bus,adr)
+#define URJ_BUS_WRITE_START(bus,adr)    (bus)->driver->write_start(bus,adr)
 #define URJ_BUS_WRITE(bus,adr,data)     (bus)->driver->write(bus,adr,data)
 #define URJ_BUS_FREE(bus)               (bus)->driver->free_bus(bus)
 #define URJ_BUS_INIT(bus)               (bus)->driver->init(bus)
+#define URJ_BUS_ENABLE(bus)             (bus)->driver->enable(bus)
+#define URJ_BUS_DISABLE(bus)            (bus)->driver->disable(bus)
+#define URJ_BUS_TYPE(bus)               (bus)->driver->bus_type
 
 /**
  * API function to init a bus
Index: src/bus/fjmem.c
===================================================================
--- src/bus/fjmem.c	(revision 1965)
+++ src/bus/fjmem.c	(working copy)
@@ -741,8 +741,12 @@
     fjmem_bus_read_next,
     fjmem_bus_read_end,
     urj_bus_generic_read,
+    urj_bus_generic_write_start,
     fjmem_bus_write,
-    urj_bus_generic_no_init
+    urj_bus_generic_no_init,
+    urj_bus_generic_no_enable,
+    urj_bus_generic_no_disable,
+    URJ_BUS_TYPE_PARALLEL,
 };
 
 
Index: src/bus/ppc405ep.c
===================================================================
--- src/bus/ppc405ep.c	(revision 1965)
+++ src/bus/ppc405ep.c	(working copy)
@@ -274,6 +274,10 @@
     ppc405ep_bus_read_next,
     ppc405ep_bus_read_end,
     urj_bus_generic_read,
+    urj_bus_generic_write_start,
     ppc405ep_bus_write,
-    urj_bus_generic_no_init
+    urj_bus_generic_no_init,
+    urj_bus_generic_no_enable,
+    urj_bus_generic_no_disable,
+    URJ_BUS_TYPE_PARALLEL,
 };
Index: src/bus/sh7727.c
===================================================================
--- src/bus/sh7727.c	(revision 1965)
+++ src/bus/sh7727.c	(working copy)
@@ -354,6 +354,10 @@
     sh7727_bus_read_next,
     sh7727_bus_read_end,
     urj_bus_generic_read,
+    urj_bus_generic_write_start,
     sh7727_bus_write,
-    urj_bus_generic_no_init
+    urj_bus_generic_no_init,
+    urj_bus_generic_no_enable,
+    urj_bus_generic_no_disable,
+    URJ_BUS_TYPE_PARALLEL,
 };
Index: src/bus/bscoach.c
===================================================================
--- src/bus/bscoach.c	(revision 1965)
+++ src/bus/bscoach.c	(working copy)
@@ -385,6 +385,10 @@
     flashbscoach_bus_read_next,
     flashbscoach_bus_read_end,
     urj_bus_generic_read,
+    urj_bus_generic_write_start,
     flashbscoach_bus_write,
-    flashbscoach_bus_init
+    flashbscoach_bus_init,
+    urj_bus_generic_no_enable,
+    urj_bus_generic_no_disable,
+    URJ_BUS_TYPE_PARALLEL,
 };
Index: src/bus/prototype.c
===================================================================
--- src/bus/prototype.c	(revision 1965)
+++ src/bus/prototype.c	(working copy)
@@ -526,6 +526,10 @@
     prototype_bus_read_next,
     prototype_bus_read_end,
     urj_bus_generic_read,
+    urj_bus_generic_write_start,
     prototype_bus_write,
-    urj_bus_generic_no_init
+    urj_bus_generic_no_init,
+    urj_bus_generic_no_enable,
+    urj_bus_generic_no_disable,
+    URJ_BUS_TYPE_PARALLEL,
 };
Index: src/bus/sa1110.c
===================================================================
--- src/bus/sa1110.c	(revision 1965)
+++ src/bus/sa1110.c	(working copy)
@@ -314,6 +314,10 @@
     sa1110_bus_read_next,
     sa1110_bus_read_end,
     urj_bus_generic_read,
+    urj_bus_generic_write_start,
     sa1110_bus_write,
-    urj_bus_generic_no_init
+    urj_bus_generic_no_init,
+    urj_bus_generic_no_enable,
+    urj_bus_generic_no_disable,
+    URJ_BUS_TYPE_PARALLEL,
 };
Index: src/bus/mpc837x.c
===================================================================
--- src/bus/mpc837x.c	(revision 1965)
+++ src/bus/mpc837x.c	(working copy)
@@ -500,6 +500,10 @@
     mpc837x_bus_read_next,
     mpc837x_bus_read_end,
     urj_bus_generic_read,
+    urj_bus_generic_write_start,
     mpc837x_bus_write,
-    urj_bus_generic_no_init
+    urj_bus_generic_no_init,
+    urj_bus_generic_no_enable,
+    urj_bus_generic_no_disable,
+    URJ_BUS_TYPE_PARALLEL,
 };
Index: src/bus/ppc440gx_ebc8.c
===================================================================
--- src/bus/ppc440gx_ebc8.c	(revision 1965)
+++ src/bus/ppc440gx_ebc8.c	(working copy)
@@ -278,6 +278,10 @@
     ppc440gx_ebc8_bus_read_next,
     ppc440gx_ebc8_bus_read_end,
     urj_bus_generic_read,
+    urj_bus_generic_write_start,
     ppc440gx_ebc8_bus_write,
-    urj_bus_generic_no_init
+    urj_bus_generic_no_init,
+    urj_bus_generic_no_enable,
+    urj_bus_generic_no_disable,
+    URJ_BUS_TYPE_PARALLEL,
 };
Index: src/bus/ejtag_dma.c
===================================================================
--- src/bus/ejtag_dma.c	(revision 1965)
+++ src/bus/ejtag_dma.c	(working copy)
@@ -694,6 +694,10 @@
     ejtag_dma_bus_read_next,
     ejtag_dma_bus_read_end,
     ejtag_dma_bus_read,
+    urj_bus_generic_write_start,
     ejtag_dma_bus_write,
-    ejtag_dma_bus_init
+    ejtag_dma_bus_init,
+    urj_bus_generic_no_enable,
+    urj_bus_generic_no_disable,
+    URJ_BUS_TYPE_PARALLEL,
 };
Index: src/bus/sh7750r.c
===================================================================
--- src/bus/sh7750r.c	(revision 1965)
+++ src/bus/sh7750r.c	(working copy)
@@ -335,6 +335,10 @@
     sh7750r_bus_read_next,
     sh7750r_bus_read_end,
     urj_bus_generic_read,
+    urj_bus_generic_write_start,
     sh7750r_bus_write,
-    urj_bus_generic_no_init
+    urj_bus_generic_no_init,
+    urj_bus_generic_no_enable,
+    urj_bus_generic_no_disable,
+    URJ_BUS_TYPE_PARALLEL,
 };
Index: src/bus/tx4925.c
===================================================================
--- src/bus/tx4925.c	(revision 1965)
+++ src/bus/tx4925.c	(working copy)
@@ -318,6 +318,10 @@
     tx4925_bus_read_next,
     tx4925_bus_read_end,
     urj_bus_generic_read,
+    urj_bus_generic_write_start,
     tx4925_bus_write,
-    urj_bus_generic_no_init
+    urj_bus_generic_no_init,
+    urj_bus_generic_no_enable,
+    urj_bus_generic_no_disable,
+    URJ_BUS_TYPE_PARALLEL,
 };
Index: src/bus/pxa2x0.c
===================================================================
--- src/bus/pxa2x0.c	(revision 1965)
+++ src/bus/pxa2x0.c	(working copy)
@@ -768,8 +768,12 @@
     pxa2xx_bus_read_next,
     pxa2xx_bus_read_end,
     urj_bus_generic_read,
+    urj_bus_generic_write_start,
     pxa2xx_bus_write,
-    pxa2xx_bus_init
+    pxa2xx_bus_init,
+    urj_bus_generic_no_enable,
+    urj_bus_generic_no_disable,
+    URJ_BUS_TYPE_PARALLEL,
 };
 
 const urj_bus_driver_t urj_bus_pxa27x_bus = {
@@ -784,6 +788,10 @@
     pxa2xx_bus_read_next,
     pxa2xx_bus_read_end,
     urj_bus_generic_read,
+    urj_bus_generic_write_start,
     pxa2xx_bus_write,
-    pxa2xx_bus_init
+    pxa2xx_bus_init,
+    urj_bus_generic_no_enable,
+    urj_bus_generic_no_disable,
+    URJ_BUS_TYPE_PARALLEL,
 };
Index: src/bus/arm9tdmi.c
===================================================================
--- src/bus/arm9tdmi.c	(revision 1965)
+++ src/bus/arm9tdmi.c	(working copy)
@@ -562,7 +562,10 @@
     arm9tdmi_bus_read_next,
     arm9tdmi_bus_read_end,
     arm9tdmi_bus_read,
+    urj_bus_generic_write_start,
     arm9tdmi_bus_write,
-    arm9tdmi_bus_init
+    arm9tdmi_bus_init,
+    urj_bus_generic_no_enable,
+    urj_bus_generic_no_disable,
+    URJ_BUS_TYPE_PARALLEL,
 };
-
Index: src/bus/ixp425.c
===================================================================
--- src/bus/ixp425.c	(revision 1965)
+++ src/bus/ixp425.c	(working copy)
@@ -297,6 +297,10 @@
     ixp425_bus_read_next,
     ixp425_bus_read_end,
     urj_bus_generic_read,
+    urj_bus_generic_write_start,
     ixp425_bus_write,
-    urj_bus_generic_no_init
+    urj_bus_generic_no_init,
+    urj_bus_generic_no_enable,
+    urj_bus_generic_no_disable,
+    URJ_BUS_TYPE_PARALLEL,
 };
Index: src/bus/avr32.c
===================================================================
--- src/bus/avr32.c	(revision 1965)
+++ src/bus/avr32.c	(working copy)
@@ -820,6 +820,10 @@
     avr32_bus_read_next,
     avr32_bus_read_end,
     urj_bus_generic_read,
+    urj_bus_generic_write_start,
     avr32_bus_write,
-    urj_bus_generic_no_init
+    urj_bus_generic_no_init,
+    urj_bus_generic_no_enable,
+    urj_bus_generic_no_disable,
+    URJ_BUS_TYPE_PARALLEL,
 };
Index: src/bus/ixp465.c
===================================================================
--- src/bus/ixp465.c	(revision 1965)
+++ src/bus/ixp465.c	(working copy)
@@ -309,6 +309,10 @@
     ixp465_bus_read_next,
     ixp465_bus_read_end,
     urj_bus_generic_read,
+    urj_bus_generic_write_start,
     ixp465_bus_write,
-    urj_bus_generic_no_init
+    urj_bus_generic_no_init,
+    urj_bus_generic_no_enable,
+    urj_bus_generic_no_disable,
+    URJ_BUS_TYPE_PARALLEL,
 };
Index: src/bus/zefant-xs3.c
===================================================================
--- src/bus/zefant-xs3.c	(revision 1965)
+++ src/bus/zefant-xs3.c	(working copy)
@@ -995,8 +995,12 @@
     zefant_xs3_bus_read_next,
     zefant_xs3_bus_read_end,
     urj_bus_generic_read,
+    urj_bus_generic_write_start,
     zefant_xs3_bus_write,
-    zefant_xs3_bus_init
+    zefant_xs3_bus_init,
+    urj_bus_generic_no_enable,
+    urj_bus_generic_no_disable,
+    URJ_BUS_TYPE_PARALLEL,
 };
 
 
Index: src/bus/h7202.c
===================================================================
--- src/bus/h7202.c	(revision 1965)
+++ src/bus/h7202.c	(working copy)
@@ -303,6 +303,10 @@
     h7202_bus_read_next,
     h7202_bus_read_end,
     urj_bus_generic_read,
+    urj_bus_generic_write_start,
     h7202_bus_write,
-    urj_bus_generic_no_init
+    urj_bus_generic_no_init,
+    urj_bus_generic_no_enable,
+    urj_bus_generic_no_disable,
+    URJ_BUS_TYPE_PARALLEL,
 };
Index: src/bus/mpc824x.c
===================================================================
--- src/bus/mpc824x.c	(revision 1965)
+++ src/bus/mpc824x.c	(working copy)
@@ -590,6 +590,10 @@
     mpc824x_bus_read_next,
     mpc824x_bus_read_end,
     urj_bus_generic_read,
+    urj_bus_generic_write_start,
     mpc824x_bus_write,
-    urj_bus_generic_no_init
+    urj_bus_generic_no_init,
+    urj_bus_generic_no_enable,
+    urj_bus_generic_no_disable,
+    URJ_BUS_TYPE_PARALLEL,
 };
Index: src/bus/bcm1250.c
===================================================================
--- src/bus/bcm1250.c	(revision 1965)
+++ src/bus/bcm1250.c	(working copy)
@@ -536,6 +536,10 @@
 #else
     bcm1250_bus_read,
 #endif
+    urj_bus_generic_write_start,
     bcm1250_bus_write,
-    urj_bus_generic_no_init
+    urj_bus_generic_no_init,
+    urj_bus_generic_no_enable,
+    urj_bus_generic_no_disable,
+    URJ_BUS_TYPE_PARALLEL,
 };
Index: src/bus/sharc21065l.c
===================================================================
--- src/bus/sharc21065l.c	(revision 1965)
+++ src/bus/sharc21065l.c	(working copy)
@@ -323,6 +323,10 @@
     sharc_21065L_bus_read_next,
     sharc_21065L_bus_read_end,
     urj_bus_generic_read,
+    urj_bus_generic_write_start,
     sharc_21065L_bus_write,
-    urj_bus_generic_no_init
+    urj_bus_generic_no_init,
+    urj_bus_generic_no_enable,
+    urj_bus_generic_no_disable,
+    URJ_BUS_TYPE_PARALLEL,
 };
Index: src/bus/sharc21369_ezkit.c
===================================================================
--- src/bus/sharc21369_ezkit.c	(revision 1965)
+++ src/bus/sharc21369_ezkit.c	(working copy)
@@ -309,6 +309,10 @@
     sharc_21369_bus_read_next,
     sharc_21369_bus_read_end,
     urj_bus_generic_read,
+    urj_bus_generic_write_start,
     sharc_21369_bus_write,
-    urj_bus_generic_no_init
+    urj_bus_generic_no_init,
+    urj_bus_generic_no_enable,
+    urj_bus_generic_no_disable,
+    URJ_BUS_TYPE_PARALLEL,
 };
Index: src/bus/au1500.c
===================================================================
--- src/bus/au1500.c	(revision 1965)
+++ src/bus/au1500.c	(working copy)
@@ -308,6 +308,10 @@
     au1500_bus_read_next,
     au1500_bus_read_end,
     urj_bus_generic_read,
+    urj_bus_generic_write_start,
     au1500_bus_write,
-    urj_bus_generic_no_init
+    urj_bus_generic_no_init,
+    urj_bus_generic_no_enable,
+    urj_bus_generic_no_disable,
+    URJ_BUS_TYPE_PARALLEL,
 };
Index: src/bus/blackfin.h
===================================================================
--- src/bus/blackfin.h	(revision 1965)
+++ src/bus/blackfin.h	(working copy)
@@ -80,8 +80,12 @@
     bfin_bus_read_next, \
     bfin_bus_read_end, \
     urj_bus_generic_read, \
+    urj_bus_generic_write_start, \
     /*funcs##_bus_write,*/ bfin_bus_write, \
-    urj_bus_generic_no_init \
+    urj_bus_generic_no_init, \
+    urj_bus_generic_no_enable, \
+    urj_bus_generic_no_disable, \
+    URJ_BUS_TYPE_PARALLEL, \
 }
 #define BFIN_BUS_DECLARE(board, desc) _BFIN_BUS_DECLARE(board, board, desc)
 
Index: src/bus/lh7a400.c
===================================================================
--- src/bus/lh7a400.c	(revision 1965)
+++ src/bus/lh7a400.c	(working copy)
@@ -334,6 +334,10 @@
     lh7a400_bus_read_next,
     lh7a400_bus_read_end,
     urj_bus_generic_read,
+    urj_bus_generic_write_start,
     lh7a400_bus_write,
-    urj_bus_generic_no_init
+    urj_bus_generic_no_init,
+    urj_bus_generic_no_enable,
+    urj_bus_generic_no_disable,
+    URJ_BUS_TYPE_PARALLEL,
 };
Index: src/bus/sh7751r.c
===================================================================
--- src/bus/sh7751r.c	(revision 1965)
+++ src/bus/sh7751r.c	(working copy)
@@ -323,6 +323,10 @@
     sh7751r_bus_read_next,
     sh7751r_bus_read_end,
     urj_bus_generic_read,
+    urj_bus_generic_write_start,
     sh7751r_bus_write,
-    urj_bus_generic_no_init
+    urj_bus_generic_no_init,
+    urj_bus_generic_no_enable,
+    urj_bus_generic_no_disable,
+    URJ_BUS_TYPE_PARALLEL,
 };
Index: src/bus/generic_bus.c
===================================================================
--- src/bus/generic_bus.c	(revision 1965)
+++ src/bus/generic_bus.c	(working copy)
@@ -101,6 +101,30 @@
 }
 
 /**
+ * bus->driver->(*enable)
+ *
+ */
+int
+urj_bus_generic_no_enable (urj_bus_t *bus)
+{
+    bus->enabled = 1;
+
+    return URJ_STATUS_OK;
+}
+
+/**
+ * bus->driver->(*disable)
+ *
+ */
+int
+urj_bus_generic_no_disable (urj_bus_t *bus)
+{
+    bus->enabled = 0;
+
+    return URJ_STATUS_OK;
+}
+
+/**
  * bus->driver->(*prepare)
  *
  */
@@ -115,6 +139,16 @@
 }
 
 /**
+ * bus->driver->(*write_start)
+ *
+ */
+int
+urj_bus_generic_write_start (urj_bus_t *bus, uint32_t adr)
+{
+    return 0;
+}
+
+/**
  * bus->driver->(*read)
  *
  */
Index: src/bus/mpc5200.c
===================================================================
--- src/bus/mpc5200.c	(revision 1965)
+++ src/bus/mpc5200.c	(working copy)
@@ -408,6 +408,10 @@
     mpc5200_bus_read_next,
     mpc5200_bus_read_end,
     urj_bus_generic_read,
+    urj_bus_generic_write_start,
     mpc5200_bus_write,
-    urj_bus_generic_no_init
+    urj_bus_generic_no_init,
+    urj_bus_generic_no_enable,
+    urj_bus_generic_no_disable,
+    URJ_BUS_TYPE_PARALLEL,
 };
Index: src/bus/jopcyc.c
===================================================================
--- src/bus/jopcyc.c	(revision 1965)
+++ src/bus/jopcyc.c	(working copy)
@@ -701,8 +701,12 @@
     jopcyc_bus_read_next,
     jopcyc_bus_read_end,
     urj_bus_generic_read,
+    urj_bus_generic_write_start,
     jopcyc_bus_write,
-    jopcyc_bus_init
+    jopcyc_bus_init,
+    urj_bus_generic_no_enable,
+    urj_bus_generic_no_disable,
+    URJ_BUS_TYPE_PARALLEL,
 };
 
 
Index: src/bus/slsup3.c
===================================================================
--- src/bus/slsup3.c	(revision 1965)
+++ src/bus/slsup3.c	(working copy)
@@ -447,6 +447,10 @@
     slsup3_bus_read_next,
     slsup3_bus_read_end,
     urj_bus_generic_read,
+    urj_bus_generic_write_start,
     slsup3_bus_write,
-    urj_bus_generic_no_init
+    urj_bus_generic_no_init,
+    urj_bus_generic_no_enable,
+    urj_bus_generic_no_disable,
+    URJ_BUS_TYPE_PARALLEL,
 };
Index: src/bus/generic_bus.h
===================================================================
--- src/bus/generic_bus.h	(revision 1965)
+++ src/bus/generic_bus.h	(working copy)
@@ -37,7 +37,10 @@
                                 size_t param_size);
 void urj_bus_generic_free (urj_bus_t *bus);
 int urj_bus_generic_no_init (urj_bus_t *bus);
+int urj_bus_generic_no_enable (urj_bus_t *bus);
+int urj_bus_generic_no_disable (urj_bus_t *bus);
 void urj_bus_generic_prepare_extest (urj_bus_t *bus);
+int urj_bus_generic_write_start(urj_bus_t *bus, uint32_t adr);
 uint32_t urj_bus_generic_read (urj_bus_t *bus, uint32_t adr);
 
 #endif /* URJ_BUS_GENERIC_BUS_H */
Index: src/bus/ejtag.c
===================================================================
--- src/bus/ejtag.c	(revision 1965)
+++ src/bus/ejtag.c	(working copy)
@@ -773,6 +773,10 @@
     ejtag_bus_read_next,
     ejtag_bus_read_end,
     urj_bus_generic_read,
+    urj_bus_generic_write_start,
     ejtag_bus_write,
-    ejtag_bus_init
+    ejtag_bus_init,
+    urj_bus_generic_no_enable,
+    urj_bus_generic_no_disable,
+    URJ_BUS_TYPE_PARALLEL,
 };
Index: src/bus/s3c4510x.c
===================================================================
--- src/bus/s3c4510x.c	(revision 1965)
+++ src/bus/s3c4510x.c	(working copy)
@@ -434,6 +434,10 @@
     s3c4510_bus_read_next,
     s3c4510_bus_read_end,
     urj_bus_generic_read,
+    urj_bus_generic_write_start,
     s3c4510_bus_write,
-    s3c4510_bus_init
+    s3c4510_bus_init,
+    urj_bus_generic_no_enable,
+    urj_bus_generic_no_disable,
+    URJ_BUS_TYPE_PARALLEL,
 };
Index: src/bus/ixp435.c
===================================================================
--- src/bus/ixp435.c	(revision 1965)
+++ src/bus/ixp435.c	(working copy)
@@ -285,6 +285,10 @@
     ixp435_bus_read_next,
     ixp435_bus_read_end,
     urj_bus_generic_read,
+    urj_bus_generic_write_start,
     ixp435_bus_write,
-    urj_bus_generic_no_init
+    urj_bus_generic_no_init,
+    urj_bus_generic_no_enable,
+    urj_bus_generic_no_disable,
+    URJ_BUS_TYPE_PARALLEL,
 };
Index: src/flash/cfi.c
===================================================================
--- src/flash/cfi.c	(revision 1965)
+++ src/flash/cfi.c	(working copy)
@@ -494,3 +494,8 @@
 
     return URJ_STATUS_OK;
 }
+
+const urj_flash_detector_t urj_flash_cfi_flash_detector = {
+    &urj_flash_cfi_detect,
+    {URJ_BUS_TYPE_PARALLEL, 0},
+};
Index: src/flash/amd.h
===================================================================
--- src/flash/amd.h	(revision 1965)
+++ src/flash/amd.h	(working copy)
@@ -37,6 +37,8 @@
 #include <urjtag/types.h>
 #include <urjtag/flash.h>
 
+const urj_flash_detector_t urj_flash_amd_flash_detector;
+
 int urj_flash_amd_detect (urj_bus_t *bus, uint32_t adr,
                           urj_flash_cfi_array_t **urj_flash_cfi_array);
 
Index: src/flash/cfi.h
===================================================================
--- src/flash/cfi.h	(revision 1965)
+++ src/flash/cfi.h	(working copy)
@@ -228,6 +228,8 @@
 /** @return URJ_STATUS_OK on success; URJ_STATUS_FAIL on error */
 int urj_flash_cfi_detect (urj_bus_t *bus, uint32_t adr,
                           urj_flash_cfi_array_t **cfi_array);
+const urj_flash_detector_t urj_flash_cfi_flash_detector;
+
 #endif /* __ASSEMBLY__ */
 
 #endif /* FLASH_CFI_H */
Index: src/flash/jedec.c
===================================================================
--- src/flash/jedec.c	(revision 1965)
+++ src/flash/jedec.c	(working copy)
@@ -608,3 +608,8 @@
 
     return URJ_STATUS_OK;
 }
+
+const urj_flash_detector_t urj_flash_jedec_flash_detector = {
+    &urj_flash_jedec_detect,
+    {URJ_BUS_TYPE_PARALLEL, 0},
+};
Index: src/flash/amd_flash.c
===================================================================
--- src/flash/amd_flash.c	(revision 1965)
+++ src/flash/amd_flash.c	(working copy)
@@ -410,6 +410,11 @@
 }
 
 
+const urj_flash_detector_t urj_flash_amd_flash_detector = {
+    &urj_flash_amd_detect,
+    {URJ_BUS_TYPE_PARALLEL, 0},
+};
+
 const urj_flash_driver_t urj_flash_amd_29xx040_flash_driver = {
     N_("AMD Standard Command Set"),
     N_("supported: AMD 29LV040B, 29C040B, 1x8 Bit"),
Index: src/flash/jedec.h
===================================================================
--- src/flash/jedec.h	(revision 1965)
+++ src/flash/jedec.h	(working copy)
@@ -30,9 +30,12 @@
 
 int urj_flash_jedec_detect (urj_bus_t *bus, uint32_t adr,
                             urj_flash_cfi_array_t **urj_flash_cfi_array);
+const urj_flash_detector_t urj_flash_jedec_flash_detector;
+
 #ifdef JEDEC_EXP
 int urj_flash_jedec_exp_detect (urj_bus_t *bus, uint32_t adr,
                                 urj_flash_cfi_array_t **urj_flash_cfi_array);
+const urj_flash_detector_t urj_flash_jedec_exp_flash_detector;
 #endif
 
 #endif /* ndef URJ_FLASH_JEDEC_H */
Index: src/flash/detectflash.c
===================================================================
--- src/flash/detectflash.c	(revision 1965)
+++ src/flash/detectflash.c	(working copy)
@@ -47,14 +47,16 @@
 
 urj_flash_cfi_array_t *urj_flash_cfi_array = NULL;
 
-static const urj_flash_detect_func_t urj_flash_detect_funcs[] = {
-    &urj_flash_cfi_detect,
-    &urj_flash_jedec_detect,
-    &urj_flash_amd_detect,
+static const urj_flash_detector_t * const urj_flash_detectors[] = {
+    &urj_flash_cfi_flash_detector,
+    &urj_flash_jedec_flash_detector,
+    &urj_flash_amd_flash_detector,
 #ifdef JEDEC_EXP
-    &urj_flash_jedec_exp_detect,
+    &urj_flash_jedec_exp_flash_detector,
 #endif
 };
+#define URJ_FLASH_TYPES(i, j)   urj_flash_detectors[i]->allowable_bus_types[j]
+#define URJ_FLASH_DETECT(i)     urj_flash_detectors[i]->detect_func
 
 void
 urj_flash_cleanup (void)
@@ -68,7 +70,7 @@
 {
     urj_flash_cfi_query_structure_t *cfi;
     const char *s;
-    int i, ret;
+    int i, types, found, ret;
 
     if (!bus)
     {
@@ -82,12 +84,22 @@
 
     URJ_BUS_PREPARE (bus);
 
-    for (i = 0; i < ARRAY_SIZE (urj_flash_detect_funcs); ++i)
+    found = 0;
+    for (i = 0; i < ARRAY_SIZE (urj_flash_detectors) && !found; ++i)
     {
-        ret = urj_flash_detect_funcs[i] (bus, adr, &urj_flash_cfi_array);
-        if (ret == URJ_STATUS_OK)
-            break;
-        urj_flash_cleanup ();
+        for (types = 0; URJ_FLASH_TYPES (i, types) != URJ_BUS_TYPE_NONE; types++)
+        {
+            if (URJ_BUS_TYPE (bus) == URJ_FLASH_TYPES (i, types))
+            {
+                ret = URJ_FLASH_DETECT(i) (bus, adr, &urj_flash_cfi_array);
+                if (ret == URJ_STATUS_OK)
+                {
+                    found = 1;
+                    break;
+                }
+                urj_flash_cleanup ();
+            }
+        }
     }
 
     if (urj_flash_cfi_array == NULL)
Index: src/flash/jedec_exp.c
===================================================================
--- src/flash/jedec_exp.c	(revision 1965)
+++ src/flash/jedec_exp.c	(working copy)
@@ -164,3 +164,8 @@
 
     return URJ_STATUS_OK;
 }
+
+const urj_flash_detector_t urj_flash_jedec_exp_flash_detector = {
+    &urj_flash_jedec_exp_detect,
+    {URJ_BUS_TYPE_PARALLEL, 0},
+};
