#include "vme.h"
 #include "vme_bridge.h"
 
-/* Bitmask and mutex to keep track of bridge numbers */
+/* Bitmask and list of registered buses both protected by common mutex */
 static unsigned int vme_bus_numbers;
-static DEFINE_MUTEX(vme_bus_num_mtx);
+static LIST_HEAD(vme_bus_list);
+static DEFINE_MUTEX(vme_buses_lock);
 
 static void __exit vme_exit(void);
 static int __init vme_init(void);
 
 /* - Bridge Registration --------------------------------------------------- */
 
-static int vme_alloc_bus_num(void)
+static int vme_add_bus(struct vme_bridge *bridge)
 {
        int i;
+       int ret = -1;
 
-       mutex_lock(&vme_bus_num_mtx);
+       mutex_lock(&vme_buses_lock);
        for (i = 0; i < sizeof(vme_bus_numbers) * 8; i++) {
-               if (((vme_bus_numbers >> i) & 0x1) == 0) {
-                       vme_bus_numbers |= (0x1 << i);
+               if ((vme_bus_numbers & (1 << i)) == 0) {
+                       vme_bus_numbers |= (1 << i);
+                       bridge->num = i;
+                       list_add_tail(&bridge->bus_list, &vme_bus_list);
+                       ret = 0;
                        break;
                }
        }
-       mutex_unlock(&vme_bus_num_mtx);
+       mutex_unlock(&vme_buses_lock);
 
-       return i;
+       return ret;
 }
 
-static void vme_free_bus_num(int bus)
+static void vme_remove_bus(struct vme_bridge *bridge)
 {
-       mutex_lock(&vme_bus_num_mtx);
-       vme_bus_numbers &= ~(0x1 << bus);
-       mutex_unlock(&vme_bus_num_mtx);
+       mutex_lock(&vme_buses_lock);
+       vme_bus_numbers &= ~(1 << bridge->num);
+       list_del(&bridge->bus_list);
+       mutex_unlock(&vme_buses_lock);
 }
 
 int vme_register_bridge(struct vme_bridge *bridge)
        int retval;
        int i;
 
-       bridge->num = vme_alloc_bus_num();
+       retval = vme_add_bus(bridge);
+       if (retval)
+               return retval;
 
        /* This creates 32 vme "slot" devices. This equates to a slot for each
         * ID available in a system conforming to the ANSI/VITA 1-1994
                dev = &bridge->dev[i];
                device_unregister(dev);
        }
-       vme_free_bus_num(bridge->num);
+       vme_remove_bus(bridge);
        return retval;
 }
 EXPORT_SYMBOL(vme_register_bridge);
                dev = &bridge->dev[i];
                device_unregister(dev);
        }
-       vme_free_bus_num(bridge->num);
+       vme_remove_bus(bridge);
 }
 EXPORT_SYMBOL(vme_unregister_bridge);