/* Need pdev */
        pdev = to_pci_dev(ca91cx42_bridge->parent);
 
-       INIT_LIST_HEAD(&ca91cx42_bridge->vme_error_handlers);
-
-       mutex_init(&ca91cx42_bridge->irq_mtx);
-
        /* Disable interrupts from PCI to VME */
        iowrite32(0, bridge->base + VINT_EN);
 
                retval = -ENOMEM;
                goto err_struct;
        }
+       vme_init_bridge(ca91cx42_bridge);
 
        ca91cx42_device = kzalloc(sizeof(struct ca91cx42_driver), GFP_KERNEL);
 
        }
 
        /* Add master windows to list */
-       INIT_LIST_HEAD(&ca91cx42_bridge->master_resources);
        for (i = 0; i < CA91C142_MAX_MASTER; i++) {
                master_image = kmalloc(sizeof(struct vme_master_resource),
                        GFP_KERNEL);
        }
 
        /* Add slave windows to list */
-       INIT_LIST_HEAD(&ca91cx42_bridge->slave_resources);
        for (i = 0; i < CA91C142_MAX_SLAVE; i++) {
                slave_image = kmalloc(sizeof(struct vme_slave_resource),
                        GFP_KERNEL);
        }
 
        /* Add dma engines to list */
-       INIT_LIST_HEAD(&ca91cx42_bridge->dma_resources);
        for (i = 0; i < CA91C142_MAX_DMA; i++) {
                dma_ctrlr = kmalloc(sizeof(struct vme_dma_resource),
                        GFP_KERNEL);
        }
 
        /* Add location monitor to list */
-       INIT_LIST_HEAD(&ca91cx42_bridge->lm_resources);
        lm = kmalloc(sizeof(struct vme_lm_resource), GFP_KERNEL);
        if (lm == NULL) {
                dev_err(&pdev->dev, "Failed to allocate memory for "
 
 
        bridge = tsi148_bridge->driver_priv;
 
-       INIT_LIST_HEAD(&tsi148_bridge->vme_error_handlers);
-
-       mutex_init(&tsi148_bridge->irq_mtx);
-
        result = request_irq(pdev->irq,
                             tsi148_irqhandler,
                             IRQF_SHARED,
                retval = -ENOMEM;
                goto err_struct;
        }
+       vme_init_bridge(tsi148_bridge);
 
        tsi148_device = kzalloc(sizeof(struct tsi148_driver), GFP_KERNEL);
        if (tsi148_device == NULL) {
        }
 
        /* Add master windows to list */
-       INIT_LIST_HEAD(&tsi148_bridge->master_resources);
        for (i = 0; i < master_num; i++) {
                master_image = kmalloc(sizeof(struct vme_master_resource),
                        GFP_KERNEL);
        }
 
        /* Add slave windows to list */
-       INIT_LIST_HEAD(&tsi148_bridge->slave_resources);
        for (i = 0; i < TSI148_MAX_SLAVE; i++) {
                slave_image = kmalloc(sizeof(struct vme_slave_resource),
                        GFP_KERNEL);
        }
 
        /* Add dma engines to list */
-       INIT_LIST_HEAD(&tsi148_bridge->dma_resources);
        for (i = 0; i < TSI148_MAX_DMA; i++) {
                dma_ctrlr = kmalloc(sizeof(struct vme_dma_resource),
                        GFP_KERNEL);
        }
 
        /* Add location monitor to list */
-       INIT_LIST_HEAD(&tsi148_bridge->lm_resources);
        lm = kmalloc(sizeof(struct vme_lm_resource), GFP_KERNEL);
        if (lm == NULL) {
                dev_err(&pdev->dev, "Failed to allocate memory for "
 
        kfree(dev_to_vme_dev(dev));
 }
 
+/* Common bridge initialization */
+struct vme_bridge *vme_init_bridge(struct vme_bridge *bridge)
+{
+       INIT_LIST_HEAD(&bridge->vme_error_handlers);
+       INIT_LIST_HEAD(&bridge->master_resources);
+       INIT_LIST_HEAD(&bridge->slave_resources);
+       INIT_LIST_HEAD(&bridge->dma_resources);
+       INIT_LIST_HEAD(&bridge->lm_resources);
+       mutex_init(&bridge->irq_mtx);
+
+       return bridge;
+}
+EXPORT_SYMBOL(vme_init_bridge);
+
 int vme_register_bridge(struct vme_bridge *bridge)
 {
        int i;
 
                           unsigned long long address, int am);
 void vme_irq_handler(struct vme_bridge *, int, int);
 
+struct vme_bridge *vme_init_bridge(struct vme_bridge *);
 int vme_register_bridge(struct vme_bridge *);
 void vme_unregister_bridge(struct vme_bridge *);
 struct vme_error_handler *vme_register_error_handler(