return ret;
 }
 
-static int caam_jr_remove(struct platform_device *pdev)
+static void caam_jr_remove(struct platform_device *pdev)
 {
        int ret;
        struct device *jrdev;
                caam_rng_exit(jrdev->parent);
 
        /*
-        * Return EBUSY if job ring already allocated.
+        * If a job ring is still allocated there is trouble ahead. Once
+        * caam_jr_remove() returned, jrpriv will be freed and the registers
+        * will get unmapped. So any user of such a job ring will probably
+        * crash.
         */
        if (atomic_read(&jrpriv->tfm_count)) {
-               dev_err(jrdev, "Device is busy\n");
-               return -EBUSY;
+               dev_alert(jrdev, "Device is busy; consumers might start to crash\n");
+               return;
        }
 
        /* Unregister JR-based RNG & crypto algorithms */
        ret = caam_jr_shutdown(jrdev);
        if (ret)
                dev_err(jrdev, "Failed to shut down job ring\n");
-
-       return ret;
-}
-
-static void caam_jr_platform_shutdown(struct platform_device *pdev)
-{
-       caam_jr_remove(pdev);
 }
 
 /* Main per-ring interrupt handler */
                .pm = pm_ptr(&caam_jr_pm_ops),
        },
        .probe       = caam_jr_probe,
-       .remove      = caam_jr_remove,
-       .shutdown    = caam_jr_platform_shutdown,
+       .remove_new  = caam_jr_remove,
+       .shutdown    = caam_jr_remove,
 };
 
 static int __init jr_driver_init(void)