struct mca_device *mca_dev = to_mca_device (dev);
        struct mca_driver *mca_drv = to_mca_driver (drv);
        const unsigned short *mca_ids = mca_drv->id_table;
-       int i;
-
-       if (!mca_ids)
-               return 0;
-
-       for(i = 0; mca_ids[i]; i++) {
-               if (mca_ids[i] == mca_dev->pos_id) {
-                       mca_dev->index = i;
-                       return 1;
+       int i = 0;
+
+       if (mca_ids) {
+               for(i = 0; mca_ids[i]; i++) {
+                       if (mca_ids[i] == mca_dev->pos_id) {
+                               mca_dev->index = i;
+                               return 1;
+                       }
                }
        }
-
+       /* If the integrated id is present, treat it as though it were an
+        * additional id in the id_table (it can't be because by definition,
+        * integrated id's overflow a short */
+       if (mca_drv->integrated_id && mca_dev->pos_id ==
+           mca_drv->integrated_id) {
+               mca_dev->index = i;
+               return 1;
+       }
        return 0;
 }
 
 
                mca_drv->driver.bus = &mca_bus_type;
                if ((r = driver_register(&mca_drv->driver)) < 0)
                        return r;
+               mca_drv->integrated_id = 0;
        }
 
        return 0;
 }
 EXPORT_SYMBOL(mca_register_driver);
 
+int mca_register_driver_integrated(struct mca_driver *mca_driver,
+                                  int integrated_id)
+{
+       int r = mca_register_driver(mca_driver);
+
+       if (!r)
+               mca_driver->integrated_id = integrated_id;
+
+       return r;
+}
+EXPORT_SYMBOL(mca_register_driver_integrated);
+
 void mca_unregister_driver(struct mca_driver *mca_drv)
 {
        if (MCA_bus)
 
 struct mca_driver {
        const short             *id_table;
        void                    *driver_data;
+       int                     integrated_id;
        struct device_driver    driver;
 };
 #define to_mca_driver(mdriver) container_of(mdriver, struct mca_driver, driver)
 extern struct bus_type mca_bus_type;
 
 extern int mca_register_driver(struct mca_driver *drv);
+extern int mca_register_driver_integrated(struct mca_driver *, int);
 extern void mca_unregister_driver(struct mca_driver *drv);
 
 /* WARNING: only called by the boot time device setup */