Index: include/urjtag/bus_driver.h
===================================================================
--- include/urjtag/bus_driver.h	(revision 1958)
+++ include/urjtag/bus_driver.h	(working copy)
@@ -46,6 +46,11 @@
     uint32_t start;
     uint64_t length;
     unsigned int width;
+    enum {
+        urj_bus_cls_parallel,
+        urj_bus_cls_spi,
+        urj_bus_cls_i2c,
+    } cls;
 }
 urj_bus_area_t;
 
@@ -105,8 +110,11 @@
     /* @@@@ 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);
 };
 
 struct URJ_BUS
@@ -115,6 +123,7 @@
     urj_part_t *part;
     void *params;
     int initialized;
+    int enabled;
     const urj_bus_driver_t *driver;
 };
 
@@ -126,9 +135,12 @@
 #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)
 
 /**
  * API function to init a bus
Index: src/bus/fjmem.c
===================================================================
--- src/bus/fjmem.c	(revision 1958)
+++ src/bus/fjmem.c	(working copy)
@@ -512,6 +512,7 @@
             area->start = bl->start;
             area->length = bl->end - bl->start + 1;
             area->width = bl->data_width;
+            area->cls = urj_bus_cls_parallel;
             *bl_match = bl;
             prev_start = area->start;
         }
@@ -524,6 +525,7 @@
                 prev_start >
                 0 ? prev_start - (bl->end + 1) : UINT64_C (0x100000000);
             area->width = 0;
+            area->cls = urj_bus_cls_parallel;
             *bl_match = NULL;
             prev_start = area->start;
         }
@@ -741,8 +743,11 @@
     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
 };
 
 
Index: src/bus/ppc405ep.c
===================================================================
--- src/bus/ppc405ep.c	(revision 1958)
+++ src/bus/ppc405ep.c	(working copy)
@@ -125,6 +125,7 @@
     area->start = UINT32_C (0x00000000);
     area->length = UINT64_C (0x100000000);
     area->width = 16;
+    area->cls = urj_bus_cls_parallel;
 
     return URJ_STATUS_OK;
 }
@@ -274,6 +275,9 @@
     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
 };
Index: src/bus/sh7727.c
===================================================================
--- src/bus/sh7727.c	(revision 1958)
+++ src/bus/sh7727.c	(working copy)
@@ -148,6 +148,7 @@
     area->description = NULL;
     area->start = UINT32_C (0x00000000);
     area->length = UINT64_C (0x100000000);
+    area->cls = urj_bus_cls_parallel;
 
     switch (urj_part_get_signal (p, MD4) << 1 | urj_part_get_signal (p, MD3))
     {
@@ -354,6 +355,9 @@
     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
 };
Index: src/bus/bscoach.c
===================================================================
--- src/bus/bscoach.c	(revision 1958)
+++ src/bus/bscoach.c	(working copy)
@@ -205,6 +205,7 @@
     area->start = UINT32_C (0x00000000);
     area->length = UINT64_C (0x00100000000);
     area->width = 8;
+    area->cls = urj_bus_cls_parallel;
 //      area->width = urj_part_get_signal( bus->part, urj_part_find_signal( bus->part, "ROMSIZ" ) ) ? 16 : 32;
 
 
@@ -385,6 +386,9 @@
     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
 };
Index: src/bus/prototype.c
===================================================================
--- src/bus/prototype.c	(revision 1958)
+++ src/bus/prototype.c	(working copy)
@@ -373,6 +373,7 @@
     area->start = UINT32_C (0x00000000);
     area->length = UINT64_C (0x100000000);
     area->width = DW;
+    area->cls = urj_bus_cls_parallel;
 
     return URJ_STATUS_OK;
 }
@@ -526,6 +527,9 @@
     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
 };
Index: src/bus/sa1110.c
===================================================================
--- src/bus/sa1110.c	(revision 1958)
+++ src/bus/sa1110.c	(working copy)
@@ -139,6 +139,7 @@
         urj_part_get_signal (bus->part,
                              urj_part_find_signal (bus->part,
                                                    "ROM_SEL")) ? 32 : 16;
+    area->cls = urj_bus_cls_parallel;
 
     return URJ_STATUS_OK;
 }
@@ -314,6 +315,9 @@
     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
 };
Index: src/bus/mpc837x.c
===================================================================
--- src/bus/mpc837x.c	(revision 1958)
+++ src/bus/mpc837x.c	(working copy)
@@ -229,6 +229,7 @@
     area->start = UINT32_C(0x00000000);
     area->length = UINT64_C(0x100000000);
     area->width = bp->lbc_num_d;
+    area->cls = urj_bus_cls_parallel;
     return URJ_STATUS_OK;
 }
 
@@ -500,6 +501,9 @@
     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
 };
Index: src/bus/ppc440gx_ebc8.c
===================================================================
--- src/bus/ppc440gx_ebc8.c	(revision 1958)
+++ src/bus/ppc440gx_ebc8.c	(working copy)
@@ -125,6 +125,7 @@
     area->start = UINT32_C (0x00000000);
     area->length = UINT64_C (0x100000000);      /* ??????????? */
     area->width = PPC440GX_DATA_LINES;
+    area->cls = urj_bus_cls_parallel;
 
     return URJ_STATUS_OK;
 }
@@ -278,6 +279,9 @@
     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
 };
Index: src/bus/ejtag_dma.c
===================================================================
--- src/bus/ejtag_dma.c	(revision 1958)
+++ src/bus/ejtag_dma.c	(working copy)
@@ -549,6 +549,7 @@
         area->start = UINT32_C (0x00000000);
         area->length = UINT64_C (0x1E000000);
         area->width = 32;
+        area->cls = urj_bus_cls_parallel;
     }
     else if (adr < UINT32_C (0x20000000))
     {
@@ -556,6 +557,7 @@
         area->start = UINT32_C (0x1E000000);
         area->length = UINT64_C (0x2000000);
         area->width = 16;
+        area->cls = urj_bus_cls_parallel;
     }
     else if (adr < UINT32_C (0x80000000))
     {
@@ -563,6 +565,7 @@
         area->start = UINT32_C (0x20000000);
         area->length = UINT64_C (0x60000000);
         area->width = 32;
+        area->cls = urj_bus_cls_parallel;
     }
     else if (adr < UINT32_C (0xA0000000))
     {
@@ -570,6 +573,7 @@
         area->start = UINT32_C (0x80000000);
         area->length = UINT64_C (0x20000000);
         area->width = 32;
+        area->cls = urj_bus_cls_parallel;
     }
     else if (adr < UINT32_C (0xC0000000))
     {
@@ -577,6 +581,7 @@
         area->start = UINT32_C (0xA0000000);
         area->length = UINT64_C (0x20000000);
         area->width = 32;
+        area->cls = urj_bus_cls_parallel;
     }
     else if (adr < UINT32_C (0xE0000000))
     {
@@ -584,6 +589,7 @@
         area->start = UINT32_C (0xC0000000);
         area->length = UINT64_C (0x20000000);
         area->width = 32;
+        area->cls = urj_bus_cls_parallel;
     }
     else
     {
@@ -591,6 +597,7 @@
         area->start = UINT32_C (0xE0000000);
         area->length = UINT64_C (0x20000000);
         area->width = 32;
+        area->cls = urj_bus_cls_parallel;
     }
     return URJ_STATUS_OK;
 }
@@ -694,6 +701,9 @@
     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
 };
Index: src/bus/sh7750r.c
===================================================================
--- src/bus/sh7750r.c	(revision 1958)
+++ src/bus/sh7750r.c	(working copy)
@@ -145,6 +145,7 @@
     area->start = UINT32_C (0x00000000);
     area->length = UINT64_C (0x100000000);
     area->width = 32;
+    area->cls = urj_bus_cls_parallel;
 
     return URJ_STATUS_OK;
 }
@@ -335,6 +336,9 @@
     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
 };
Index: src/bus/tx4925.c
===================================================================
--- src/bus/tx4925.c	(revision 1958)
+++ src/bus/tx4925.c	(working copy)
@@ -149,6 +149,7 @@
     area->start = UINT32_C (0x00000000);
     area->length = UINT64_C (0x100000000);
     area->width = 16;
+    area->cls = urj_bus_cls_parallel;
 
     return URJ_STATUS_OK;
 }
@@ -318,6 +319,9 @@
     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
 };
Index: src/bus/pxa2x0.c
===================================================================
--- src/bus/pxa2x0.c	(revision 1958)
+++ src/bus/pxa2x0.c	(working copy)
@@ -327,6 +327,7 @@
         area->description = N_("Static Chip Select 0");
         area->start = UINT32_C (0x00000000);
         area->length = UINT64_C (0x04000000);
+        area->cls = urj_bus_cls_parallel;
 
         if (NCS_MAP[0].bus_width > 0)
         {
@@ -768,6 +769,7 @@
     pxa2xx_bus_read_next,
     pxa2xx_bus_read_end,
     urj_bus_generic_read,
+    urj_bus_generic_write_start,
     pxa2xx_bus_write,
     pxa2xx_bus_init
 };
@@ -784,6 +786,9 @@
     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
 };
Index: src/bus/arm9tdmi.c
===================================================================
--- src/bus/arm9tdmi.c	(revision 1958)
+++ src/bus/arm9tdmi.c	(working copy)
@@ -465,6 +465,7 @@
         area->start = UINT32_C (0x00000000);
         area->length = UINT64_C (0xF0000000);
         area->width = 32;
+        area->cls = urj_bus_cls_parallel;
     }
     else
     {
@@ -472,6 +473,7 @@
         area->start = UINT32_C (0xF0000000);
         area->length = UINT64_C (0x10000000);
         area->width = 16;
+        area->cls = urj_bus_cls_parallel;
     }
     return URJ_STATUS_OK;
 }
@@ -562,7 +564,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
 };
 
Index: src/bus/ixp425.c
===================================================================
--- src/bus/ixp425.c	(revision 1958)
+++ src/bus/ixp425.c	(working copy)
@@ -129,6 +129,7 @@
     area->start = UINT32_C (0x00000000);
     area->length = UINT64_C (0x100000000);
     area->width = 16;
+    area->cls = urj_bus_cls_parallel;
 
     return URJ_STATUS_OK;
 }
@@ -297,6 +298,9 @@
     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
 };
Index: src/bus/avr32.c
===================================================================
--- src/bus/avr32.c	(revision 1958)
+++ src/bus/avr32.c	(working copy)
@@ -638,30 +638,35 @@
         area->start = UINT32_C (0x00000000);
         area->length = SAB_HSB_AREA_SIZE;
         area->width = 32;
+        area->cls = urj_bus_cls_parallel;
         break;
     case BUS_MODE_HSBU:
         area->description = "HSB memory space, uncached";
         area->start = UINT32_C (0x00000000);
         area->length = SAB_HSB_AREA_SIZE;
         area->width = 32;
+        area->cls = urj_bus_cls_parallel;
         break;
     case BUS_MODE_x8:
         area->description = "HSB memory space, uncached";
         area->start = UINT32_C (0x00000000);
         area->length = SAB_HSB_AREA_SIZE;
         area->width = 8;
+        area->cls = urj_bus_cls_parallel;
         break;
     case BUS_MODE_x16:
         area->description = "HSB memory space, uncached";
         area->start = UINT32_C (0x00000000);
         area->length = SAB_HSB_AREA_SIZE;
         area->width = 16;
+        area->cls = urj_bus_cls_parallel;
         break;
     case BUS_MODE_x32:
         area->description = "HSB memory space, uncached";
         area->start = UINT32_C (0x00000000);
         area->length = SAB_HSB_AREA_SIZE;
         area->width = 32;
+        area->cls = urj_bus_cls_parallel;
         break;
     case BUS_MODE_OCD:
         if (addr < SAB_OCD_AREA_SIZE)
@@ -670,6 +675,7 @@
             area->start = UINT32_C (0x00000000);
             area->length = SAB_OCD_AREA_SIZE;
             area->width = 32;
+            area->cls = urj_bus_cls_parallel;
             break;
         }
         /* fallthrough */
@@ -677,6 +683,7 @@
         area->description = NULL;
         area->length = UINT64_C (0x100000000);
         area->width = 0;
+        area->cls = urj_bus_cls_parallel;
         break;
     }
 
@@ -820,6 +827,9 @@
     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
 };
Index: src/bus/ixp465.c
===================================================================
--- src/bus/ixp465.c	(revision 1958)
+++ src/bus/ixp465.c	(working copy)
@@ -142,6 +142,7 @@
     area->start = UINT32_C (0x00000000);
     area->length = UINT64_C (0x100000000);
     area->width = 16;
+    area->cls = urj_bus_cls_parallel;
 
     return URJ_STATUS_OK;
 }
@@ -309,6 +310,9 @@
     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
 };
Index: src/bus/zefant-xs3.c
===================================================================
--- src/bus/zefant-xs3.c	(revision 1958)
+++ src/bus/zefant-xs3.c	(working copy)
@@ -630,6 +630,7 @@
         area->start = FLASH_START;
         area->length = FLASH_LENGTH;
         area->width = FLASH_DATA_WIDTH;
+        area->cls = urj_bus_cls_parallel;
         *comp = COMP_FLASH;
     }
     else if (adr < RAM1_START)
@@ -638,6 +639,7 @@
         area->start = RAM0_START;
         area->length = RAM_LENGTH;
         area->width = RAM_DATA_WIDTH;
+        area->cls = urj_bus_cls_parallel;
         *comp = COMP_RAM0;
     }
     else if (adr < EEPROM_START)
@@ -646,6 +648,7 @@
         area->start = RAM1_START;
         area->length = RAM_LENGTH;
         area->width = RAM_DATA_WIDTH;
+        area->cls = urj_bus_cls_parallel;
         *comp = COMP_RAM1;
     }
     else if (adr < EEPROM_STATUS_START)
@@ -654,6 +657,7 @@
         area->start = EEPROM_START;
         area->length = EEPROM_LENGTH;
         area->width = EEPROM_DATA_WIDTH;
+        area->cls = urj_bus_cls_parallel;
         *comp = COMP_EEPROM;
     }
     else if (adr < EEPROM_STATUS_START + EEPROM_STATUS)
@@ -662,6 +666,7 @@
         area->start = EEPROM_STATUS_START;
         area->length = EEPROM_LENGTH;
         area->width = EEPROM_DATA_WIDTH;
+        area->cls = urj_bus_cls_parallel;
         *comp = COMP_EEPROM_STATUS;
     }
     else
@@ -670,6 +675,7 @@
         area->start = FLASH_LENGTH + 2 * RAM_LENGTH + 2 * EEPROM_LENGTH;
         area->length = UINT64_C (0x100000000);
         area->width = 0;
+        area->cls = urj_bus_cls_parallel;
         *comp = NULL;
     }
 
@@ -995,8 +1001,11 @@
     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
 };
 
 
Index: src/bus/h7202.c
===================================================================
--- src/bus/h7202.c	(revision 1958)
+++ src/bus/h7202.c	(working copy)
@@ -132,6 +132,7 @@
     area->start = UINT32_C (0x00000000);
     area->length = UINT64_C (0x100000000);
     area->width = 16;           //urj_part_get_signal( bus->part, urj_part_find_signal( bus->part, "ROM_SEL" ) ) ? 32 : 16;
+    area->cls = urj_bus_cls_parallel;
 
     return URJ_STATUS_OK;
 }
@@ -303,6 +304,9 @@
     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
 };
Index: src/bus/mpc824x.c
===================================================================
--- src/bus/mpc824x.c	(revision 1958)
+++ src/bus/mpc824x.c	(working copy)
@@ -265,6 +265,7 @@
         area->start = UINT32_C (0x00000000);
         area->length = UINT64_C (0xFF000000);
         area->width = 0;
+        area->cls = urj_bus_cls_parallel;
 
         return URJ_STATUS_OK;
     }
@@ -275,6 +276,7 @@
         area->start = UINT32_C (0xFF000000);
         area->length = UINT64_C (0x00800000);
         area->width = 0;
+        area->cls = urj_bus_cls_parallel;
 
         return URJ_STATUS_OK;
     }
@@ -285,6 +287,7 @@
         area->start = UINT32_C (0xFF800000);
         area->length = UINT64_C (0x00800000);
         area->width = BUS_WIDTH;
+        area->cls = urj_bus_cls_parallel;
 
         return URJ_STATUS_OK;
     }
@@ -296,6 +299,7 @@
         area->start = UINT32_C (0xFF800000);
         area->length = UINT64_C (0x00400000);
         area->width = BUS_WIDTH;
+        area->cls = urj_bus_cls_parallel;
 
         return URJ_STATUS_OK;
     }
@@ -304,6 +308,7 @@
     area->start = UINT32_C (0xFFC00000);
     area->length = UINT64_C (0x00400000);
     area->width = BUS_WIDTH;
+    area->cls = urj_bus_cls_parallel;
 
     return URJ_STATUS_OK;
 }
@@ -590,6 +595,9 @@
     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
 };
Index: src/bus/blackfin.c
===================================================================
--- src/bus/blackfin.c	(revision 1958)
+++ src/bus/blackfin.c	(working copy)
@@ -113,6 +113,7 @@
         area->start = params->async_base;
         area->length = params->async_size;
         area->width = 16;
+        area->cls = urj_bus_cls_parallel;
     }
     else
     {
Index: src/bus/bcm1250.c
===================================================================
--- src/bus/bcm1250.c	(revision 1958)
+++ src/bus/bcm1250.c	(working copy)
@@ -127,6 +127,7 @@
     area->start = UINT32_C (0x00000000);
     area->length = UINT64_C (0x100000000);
     area->width = 8;
+    area->cls = urj_bus_cls_parallel;
 
     return URJ_STATUS_OK;
 }
@@ -536,6 +537,9 @@
 #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
 };
Index: src/bus/sharc21065l.c
===================================================================
--- src/bus/sharc21065l.c	(revision 1958)
+++ src/bus/sharc21065l.c	(working copy)
@@ -136,6 +136,7 @@
         area->start = UINT32_C (0x000000);
         area->length = UINT64_C (0x080000);
         area->width = 8;
+        area->cls = urj_bus_cls_parallel;
 
         return URJ_STATUS_OK;
     }
@@ -144,6 +145,7 @@
     area->start = UINT32_C (0xffffffff);
     area->length = UINT64_C (0x080000);
     area->width = 0;
+    area->cls = urj_bus_cls_parallel;
     return URJ_STATUS_OK;
 }
 
@@ -323,6 +325,9 @@
     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
 };
Index: src/bus/sharc21369_ezkit.c
===================================================================
--- src/bus/sharc21369_ezkit.c	(revision 1958)
+++ src/bus/sharc21369_ezkit.c	(working copy)
@@ -136,6 +136,7 @@
         area->start = UINT32_C(0x200000);
         area->length = UINT64_C(0x080000);
         area->width = 8;
+        area->cls = urj_bus_cls_parallel;
 
         urj_part_set_signal( p, MS0, 1, 1);
         urj_part_set_signal( p, MS1, 1, 0);
@@ -147,6 +148,7 @@
         area->start = UINT32_C(0xffffffff);
         area->length = UINT64_C(0x080000);
         area->width = 0;
+        area->cls = urj_bus_cls_parallel;
 
         urj_part_set_signal(p, MS0, 1, 1);
         urj_part_set_signal(p, MS1, 1, 1);
@@ -309,6 +311,9 @@
     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
 };
Index: src/bus/au1500.c
===================================================================
--- src/bus/au1500.c	(revision 1958)
+++ src/bus/au1500.c	(working copy)
@@ -140,6 +140,7 @@
         urj_part_get_signal (bus->part,
                              urj_part_find_signal (bus->part,
                                                    "ROMSIZ")) ? 16 : 32;
+    area->cls = urj_bus_cls_parallel;
 
 
     return URJ_STATUS_OK;
@@ -308,6 +309,9 @@
     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
 };
Index: src/bus/blackfin.h
===================================================================
--- src/bus/blackfin.h	(revision 1958)
+++ src/bus/blackfin.h	(working copy)
@@ -80,8 +80,11 @@
     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 \
 }
 #define BFIN_BUS_DECLARE(board, desc) _BFIN_BUS_DECLARE(board, board, desc)
 
Index: src/bus/lh7a400.c
===================================================================
--- src/bus/lh7a400.c	(revision 1958)
+++ src/bus/lh7a400.c	(working copy)
@@ -153,6 +153,7 @@
     area->start = UINT32_C (0x00000000);
     area->length = UINT64_C (0x10000000);
     area->width = -1;   // some gcc versions detect uninitialised use
+    area->cls = urj_bus_cls_parallel;
 
     /* we determine the size of the flash that was booted from [1] table 3.1 */
     width =
@@ -334,6 +335,9 @@
     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
 };
Index: src/bus/sh7751r.c
===================================================================
--- src/bus/sh7751r.c	(revision 1958)
+++ src/bus/sh7751r.c	(working copy)
@@ -139,6 +139,7 @@
     area->start = UINT32_C (0x00000000);
     area->length = UINT64_C (0x100000000);
     area->width = 16;
+    area->cls = urj_bus_cls_parallel;
 
     return URJ_STATUS_OK;
 }
@@ -323,6 +324,9 @@
     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
 };
Index: src/bus/generic_bus.c
===================================================================
--- src/bus/generic_bus.c	(revision 1958)
+++ 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 1958)
+++ src/bus/mpc5200.c	(working copy)
@@ -173,6 +173,7 @@
         area->start = UINT32_C (0x00000000);
         area->length = LPC_ADDR_SIZE;
         area->width = bp->lpc_num_d;
+        area->cls = urj_bus_cls_parallel;
         return URJ_STATUS_OK;
     }
 
@@ -180,6 +181,7 @@
     area->start = LPC_ADDR_SIZE;
     area->length = UINT64_C (0x100000000) - LPC_ADDR_SIZE;
     area->width = 0;
+    area->cls = urj_bus_cls_parallel;
     return URJ_STATUS_OK;
 }
 
@@ -408,6 +410,9 @@
     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
 };
Index: src/bus/jopcyc.c
===================================================================
--- src/bus/jopcyc.c	(revision 1958)
+++ src/bus/jopcyc.c	(working copy)
@@ -497,6 +497,7 @@
         area->start = RAMA_START;
         area->length = RAM_LENGTH;
         area->width = RAM_DATA_WIDTH;
+        area->cls = urj_bus_cls_parallel;
         *comp = COMP_RAMA;
     }
     else if (adr < FLASH_START)
@@ -505,6 +506,7 @@
         area->start = RAMB_START;
         area->length = RAM_LENGTH;
         area->width = RAM_DATA_WIDTH;
+        area->cls = urj_bus_cls_parallel;
         *comp = COMP_RAMB;
     }
     else if (adr < FLASH_START + FLASH_LENGTH)
@@ -513,6 +515,7 @@
         area->start = FLASH_START;
         area->length = FLASH_LENGTH;
         area->width = FLASH_DATA_WIDTH;
+        area->cls = urj_bus_cls_parallel;
         *comp = COMP_FLASH;
     }
     else
@@ -521,6 +524,7 @@
         area->start = 2 * RAM_LENGTH + FLASH_LENGTH;
         area->length = UINT64_C (0x100000000);
         area->width = 0;
+        area->cls = urj_bus_cls_parallel;
         *comp = NULL;
     }
 
@@ -701,8 +705,11 @@
     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
 };
 
 
Index: src/bus/slsup3.c
===================================================================
--- src/bus/slsup3.c	(revision 1958)
+++ src/bus/slsup3.c	(working copy)
@@ -182,6 +182,7 @@
         area->start = FLASHSTART;
         area->length = FLASHSIZE;
         area->width = 8;        /* 16 */
+        area->cls = urj_bus_cls_parallel;
 
         return URJ_STATUS_OK;
     }
@@ -192,6 +193,7 @@
         area->start = SRAMSTART;
         area->length = SRAMSIZE;
         area->width = 16;
+        area->cls = urj_bus_cls_parallel;
 
         return URJ_STATUS_OK;
     }
@@ -202,6 +204,7 @@
         area->start = LCDSTART;
         area->length = LCDSIZE;
         area->width = 8;
+        area->cls = urj_bus_cls_parallel;
 
         return URJ_STATUS_OK;
     }
@@ -210,6 +213,7 @@
     area->start = UINT32_C (0x0400000);
     area->length = UINT64_C (0xFFC00000);
     area->width = 0;
+    area->cls = urj_bus_cls_parallel;
 
     return URJ_STATUS_OK;
 }
@@ -447,6 +451,9 @@
     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
 };
Index: src/bus/generic_bus.h
===================================================================
--- src/bus/generic_bus.h	(revision 1958)
+++ 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 1958)
+++ src/bus/ejtag.c	(working copy)
@@ -597,6 +597,7 @@
         area->start = UINT32_C (0x00000000);
         area->length = UINT64_C (0x20000000);
         area->width = 8;
+        area->cls = urj_bus_cls_parallel;
     }
     else if (adr < UINT32_C (0x40000000))
     {
@@ -604,6 +605,7 @@
         area->start = UINT32_C (0x20000000);
         area->length = UINT64_C (0x20000000);
         area->width = 16;
+        area->cls = urj_bus_cls_parallel;
     }
     else if (adr < UINT32_C (0x60000000))
     {
@@ -611,6 +613,7 @@
         area->start = UINT32_C (0x40000000);
         area->length = UINT64_C (0x20000000);
         area->width = 32;
+        area->cls = urj_bus_cls_parallel;
     }
     else
     {
@@ -618,6 +621,7 @@
         area->start = UINT32_C (0x60000000);
         area->length = UINT64_C (0xa0000000);
         area->width = 0;
+        area->cls = urj_bus_cls_parallel;
     }
     return URJ_STATUS_OK;
 }
@@ -773,6 +777,9 @@
     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
 };
Index: src/bus/s3c4510x.c
===================================================================
--- src/bus/s3c4510x.c	(revision 1958)
+++ src/bus/s3c4510x.c	(working copy)
@@ -220,6 +220,7 @@
     area->description = NULL;
     area->start = UINT32_C (0x00000000);
     area->length = UINT64_C (0x100000000);
+    area->cls = urj_bus_cls_parallel;
 
     // endian = urj_part_get_signal( bus->part, urj_part_find_signal( bus->part, "LITTLE" ));
     b0size0 = urj_part_get_signal (bus->part,
@@ -434,6 +435,9 @@
     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
 };
Index: src/bus/ixp435.c
===================================================================
--- src/bus/ixp435.c	(revision 1958)
+++ src/bus/ixp435.c	(working copy)
@@ -125,6 +125,7 @@
     area->start = UINT32_C(0x00000000);
     area->length = UINT64_C(0x100000000);
     area->width = 16;
+    area->cls = urj_bus_cls_parallel;
 
     return URJ_STATUS_OK;
 }
@@ -285,6 +286,9 @@
     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
 };
Index: src/flash/cfi.c
===================================================================
--- src/flash/cfi.c	(revision 1958)
+++ src/flash/cfi.c	(working copy)
@@ -100,6 +100,8 @@
     if (URJ_BUS_AREA (bus, adr, &area) != URJ_STATUS_OK)
         // retain error state
         return URJ_STATUS_FAIL;
+	if (area.cls != urj_bus_cls_parallel)
+        return URJ_STATUS_FAIL;
     bw = area.width;
     if (bw != 8 && bw != 16 && bw != 32)
     {
Index: src/flash/jedec.c
===================================================================
--- src/flash/jedec.c	(revision 1958)
+++ src/flash/jedec.c	(working copy)
@@ -447,6 +447,8 @@
     if (URJ_BUS_AREA (bus, adr, &area) != URJ_STATUS_OK)
         // retain error state
         return URJ_STATUS_FAIL;
+	if (area.cls != urj_bus_cls_parallel)
+        return URJ_STATUS_FAIL;
     bw = area.width;
     if (bw != 8 && bw != 16 && bw != 32)
     {
Index: src/flash/amd_flash.c
===================================================================
--- src/flash/amd_flash.c	(revision 1958)
+++ src/flash/amd_flash.c	(working copy)
@@ -106,7 +106,8 @@
     if (URJ_BUS_AREA (bus, adr, &area) != URJ_STATUS_OK)
         // retain error state
         return URJ_STATUS_FAIL;
-
+	if (area.cls != urj_bus_cls_parallel)
+        return URJ_STATUS_FAIL;
     URJ_BUS_WRITE (bus, adr + 0x0, 0xf0);
     URJ_BUS_WRITE (bus, adr + 0x555, 0xaa);
     URJ_BUS_WRITE (bus, adr + 0x2AA, 0x55);
Index: src/flash/jedec_exp.c
===================================================================
--- src/flash/jedec_exp.c	(revision 1958)
+++ src/flash/jedec_exp.c	(working copy)
@@ -88,6 +88,8 @@
     if (URJ_BUS_AREA (bus, adr, &area) != URJ_STATUS_OK)
         // retain error state
         return URJ_STATUS_FAIL;
+	if (area->cls != urj_bus_cls_parallel)
+        return URJ_STATUS_FAIL;
     bw = area.width;
 
     if (bw == 0)
