* @generic_bulk_ctrl_endpoint_response: bulk control endpoint number for
  *  receive
  * @generic_bulk_ctrl_delay: delay between bulk control sent and receive message
+ * @probe: like probe on driver model
+ * @disconnect: like disconnect on driver model
  * @identify_state: called to determine the firmware state (cold or warm) and
  *  return possible firmware file name to be loaded
  * @firmware: name of the firmware file to be loaded
        u8 generic_bulk_ctrl_endpoint_response;
        unsigned int generic_bulk_ctrl_delay;
 
+       int (*probe)(struct dvb_usb_device *);
+       void (*disconnect)(struct dvb_usb_device *);
 #define WARM                  0
 #define COLD                  1
        int (*identify_state) (struct dvb_usb_device *, const char **);
 
        dvb_usbv2_remote_exit(d);
        dvb_usbv2_adapter_exit(d);
        dvb_usbv2_i2c_exit(d);
-       kfree(d->priv);
-       kfree(d);
 
        return 0;
 }
        if (intf->cur_altsetting->desc.bInterfaceNumber !=
                        d->props->bInterfaceNumber) {
                ret = -ENODEV;
-               goto err_free_all;
+               goto err_kfree_d;
        }
 
        mutex_init(&d->usb_mutex);
                        dev_err(&d->udev->dev, "%s: kzalloc() failed\n",
                                        KBUILD_MODNAME);
                        ret = -ENOMEM;
-                       goto err_free_all;
+                       goto err_kfree_d;
                }
        }
 
+       if (d->props->probe) {
+               ret = d->props->probe(d);
+               if (ret)
+                       goto err_kfree_priv;
+       }
+
        if (d->props->identify_state) {
                const char *name = NULL;
                ret = d->props->identify_state(d, &name);
        return 0;
 err_free_all:
        dvb_usbv2_exit(d);
+       if (d->props->disconnect)
+               d->props->disconnect(d);
+err_kfree_priv:
+       kfree(d->priv);
+err_kfree_d:
+       kfree(d);
 err:
        dev_dbg(&udev->dev, "%s: failed=%d\n", __func__, ret);
        return ret;
 
        dvb_usbv2_exit(d);
 
+       if (d->props->disconnect)
+               d->props->disconnect(d);
+
+       kfree(d->priv);
+       kfree(d);
+
        pr_info("%s: '%s:%s' successfully deinitialized and disconnected\n",
                KBUILD_MODNAME, drvname, devname);
        kfree(devname);