struct idxd_device_driver {
        const char *name;
+       enum idxd_dev_type *type;
        int (*probe)(struct idxd_dev *idxd_dev);
        void (*remove)(struct idxd_dev *idxd_dev);
        struct device_driver drv;
 
 {
        struct device_driver *drv = &idxd_drv->drv;
 
+       if (!idxd_drv->type) {
+               pr_debug("driver type not set (%ps)\n", __builtin_return_address(0));
+               return -EINVAL;
+       }
+
        drv->name = idxd_drv->name;
        drv->bus = &dsa_bus_type;
        drv->owner = owner;
 
 static int idxd_config_bus_match(struct device *dev,
                                 struct device_driver *drv)
 {
+       struct idxd_device_driver *idxd_drv =
+               container_of(drv, struct idxd_device_driver, drv);
        struct idxd_dev *idxd_dev = confdev_to_idxd_dev(dev);
+       int i = 0;
+
+       while (idxd_drv->type[i] != IDXD_DEV_NONE) {
+               if (idxd_dev->type == idxd_drv->type[i])
+                       return 1;
+               i++;
+       }
 
-       return (is_idxd_dev(idxd_dev) || is_idxd_wq_dev(idxd_dev));
+       return 0;
 }
 
 static int idxd_config_bus_probe(struct device *dev)
        }
 }
 
+static enum idxd_dev_type dev_types[] = {
+       IDXD_DEV_NONE,
+};
+
 struct idxd_device_driver dsa_drv = {
        .name = "dsa",
        .probe = idxd_dsa_drv_probe,
        .remove = idxd_dsa_drv_remove,
+       .type = dev_types,
 };
 
 /* IDXD engine attributes */