const struct usb_device_id *id)
 {
        struct kvaser_usb *dev;
+       struct devlink *devlink;
        int err;
        int i;
        const struct kvaser_usb_driver_info *driver_info;
        if (!driver_info)
                return -ENODEV;
 
-       dev = devm_kzalloc(&intf->dev, sizeof(*dev), GFP_KERNEL);
-       if (!dev)
+       devlink = devlink_alloc(&kvaser_usb_devlink_ops, sizeof(*dev), &intf->dev);
+       if (!devlink)
                return -ENOMEM;
 
+       dev = devlink_priv(devlink);
        dev->intf = intf;
        dev->driver_info = driver_info;
        ops = driver_info->ops;
 
        err = ops->dev_setup_endpoints(dev);
-       if (err)
-               return dev_err_probe(&intf->dev, err, "Cannot get usb endpoint(s)");
+       if (err) {
+               dev_err_probe(&intf->dev, err, "Cannot get usb endpoint(s)");
+               goto free_devlink;
+       }
 
        dev->udev = interface_to_usbdev(intf);
 
        dev->card_data.ctrlmode_supported = 0;
        dev->card_data.capabilities = 0;
        err = ops->dev_init_card(dev);
-       if (err)
-               return dev_err_probe(&intf->dev, err,
-                                    "Failed to initialize card\n");
+       if (err) {
+               dev_err_probe(&intf->dev, err,
+                             "Failed to initialize card\n");
+               goto free_devlink;
+       }
 
        err = ops->dev_get_software_info(dev);
-       if (err)
-               return dev_err_probe(&intf->dev, err,
-                                    "Cannot get software info\n");
+       if (err) {
+               dev_err_probe(&intf->dev, err,
+                             "Cannot get software info\n");
+               goto free_devlink;
+       }
 
        if (ops->dev_get_software_details) {
                err = ops->dev_get_software_details(dev);
-               if (err)
-                       return dev_err_probe(&intf->dev, err,
-                                            "Cannot get software details\n");
+               if (err) {
+                       dev_err_probe(&intf->dev, err,
+                                     "Cannot get software details\n");
+                       goto free_devlink;
+               }
        }
 
-       if (WARN_ON(!dev->cfg))
-               return -ENODEV;
+       if (WARN_ON(!dev->cfg)) {
+               err = -ENODEV;
+               goto free_devlink;
+       }
 
        dev_dbg(&intf->dev, "Max outstanding tx = %d URBs\n", dev->max_tx_urbs);
 
        err = ops->dev_get_card_info(dev);
-       if (err)
-               return dev_err_probe(&intf->dev, err,
-                                    "Cannot get card info\n");
+       if (err) {
+               dev_err_probe(&intf->dev, err,
+                             "Cannot get card info\n");
+               goto free_devlink;
+       }
 
        if (ops->dev_get_capabilities) {
                err = ops->dev_get_capabilities(dev);
                if (err) {
-                       kvaser_usb_remove_interfaces(dev);
-                       return dev_err_probe(&intf->dev, err,
-                                            "Cannot get capabilities\n");
+                       dev_err_probe(&intf->dev, err,
+                                     "Cannot get capabilities\n");
+                       goto remove_interfaces;
                }
        }
 
        for (i = 0; i < dev->nchannels; i++) {
                err = kvaser_usb_init_one(dev, i);
-               if (err) {
-                       kvaser_usb_remove_interfaces(dev);
-                       return err;
-               }
+               if (err)
+                       goto remove_interfaces;
        }
+       devlink_register(devlink);
 
        return 0;
+
+remove_interfaces:
+       kvaser_usb_remove_interfaces(dev);
+free_devlink:
+       devlink_free(devlink);
+
+       return err;
 }
 
 static void kvaser_usb_disconnect(struct usb_interface *intf)
                return;
 
        kvaser_usb_remove_interfaces(dev);
+       devlink_unregister(priv_to_devlink(dev));
+       devlink_free(priv_to_devlink(dev));
 }
 
 static struct usb_driver kvaser_usb_driver = {