edev->dev.type = &edev->extcon_dev_type;
        }
 
-       ret = device_register(&edev->dev);
-       if (ret) {
-               put_device(&edev->dev);
-               goto err_dev;
-       }
-
        spin_lock_init(&edev->lock);
-       edev->nh = devm_kcalloc(&edev->dev, edev->max_supported,
-                               sizeof(*edev->nh), GFP_KERNEL);
-       if (!edev->nh) {
-               ret = -ENOMEM;
-               device_unregister(&edev->dev);
-               goto err_dev;
+       if (edev->max_supported) {
+               edev->nh = kcalloc(edev->max_supported, sizeof(*edev->nh),
+                               GFP_KERNEL);
+               if (!edev->nh) {
+                       ret = -ENOMEM;
+                       goto err_alloc_nh;
+               }
        }
 
        for (index = 0; index < edev->max_supported; index++)
        dev_set_drvdata(&edev->dev, edev);
        edev->state = 0;
 
+       ret = device_register(&edev->dev);
+       if (ret) {
+               put_device(&edev->dev);
+               goto err_dev;
+       }
+
        mutex_lock(&extcon_dev_list_lock);
        list_add(&edev->entry, &extcon_dev_list);
        mutex_unlock(&extcon_dev_list_lock);
        return 0;
 
 err_dev:
+       if (edev->max_supported)
+               kfree(edev->nh);
+err_alloc_nh:
        if (edev->max_supported)
                kfree(edev->extcon_dev_type.groups);
 err_alloc_groups:
        if (edev->max_supported) {
                kfree(edev->extcon_dev_type.groups);
                kfree(edev->cables);
+               kfree(edev->nh);
        }
 
        put_device(&edev->dev);