static bool request_mem_succeeded = false;
 static u64 mem_flags = EFI_MEMORY_WC | EFI_MEMORY_UC;
 
+static struct pci_dev *efifb_pci_dev;  /* dev with BAR covering the efifb */
+
 static struct fb_var_screeninfo efifb_defined = {
        .activate               = FB_ACTIVATE_NOW,
        .height                 = -1,
 
 static void efifb_destroy(struct fb_info *info)
 {
+       if (efifb_pci_dev)
+               pm_runtime_put(&efifb_pci_dev->dev);
+
        if (info->screen_base) {
                if (mem_flags & (EFI_MEMORY_UC | EFI_MEMORY_WC))
                        iounmap(info->screen_base);
 
 static bool pci_dev_disabled;  /* FB base matches BAR of a disabled device */
 
-static struct pci_dev *efifb_pci_dev;  /* dev with BAR covering the efifb */
 static struct resource *bar_resource;
 static u64 bar_offset;
 
                pr_err("efifb: cannot allocate colormap\n");
                goto err_groups;
        }
+
+       if (efifb_pci_dev)
+               WARN_ON(pm_runtime_get_sync(&efifb_pci_dev->dev) < 0);
+
        err = register_framebuffer(info);
        if (err < 0) {
                pr_err("efifb: cannot register framebuffer\n");
-               goto err_fb_dealoc;
+               goto err_put_rpm_ref;
        }
        fb_info(info, "%s frame buffer device\n", info->fix.id);
-       if (efifb_pci_dev)
-               pm_runtime_get_sync(&efifb_pci_dev->dev);
        return 0;
 
-err_fb_dealoc:
+err_put_rpm_ref:
+       if (efifb_pci_dev)
+               pm_runtime_put(&efifb_pci_dev->dev);
+
        fb_dealloc_cmap(&info->cmap);
 err_groups:
        sysfs_remove_groups(&dev->dev.kobj, efifb_groups);
        unregister_framebuffer(info);
        sysfs_remove_groups(&pdev->dev.kobj, efifb_groups);
        framebuffer_release(info);
-       if (efifb_pci_dev)
-               pm_runtime_put(&efifb_pci_dev->dev);
 
        return 0;
 }