/* Private sub-storage for a single JobR */
 struct caam_drv_private_jr {
        struct device *parentdev;       /* points back to controller dev */
+       struct platform_device *jr_pdev;/* points to platform device for JR */
        int ridx;
        struct caam_job_ring __iomem *rregs;    /* JobR's register space */
        struct tasklet_struct irqtask;
 
        dma_free_coherent(dev, sizeof(struct jr_outentry) * JOBR_DEPTH,
                          jrp->outring, outbusaddr);
        kfree(jrp->entinfo);
+       of_device_unregister(jrp->jr_pdev);
 
        return ret;
 }
                kfree(jrpriv);
                return -EINVAL;
        }
+
+       jrpriv->jr_pdev = jr_pdev;
        jrdev = &jr_pdev->dev;
        dev_set_drvdata(jrdev, jrpriv);
        ctrlpriv->jrdev[ring] = jrdev;
        /* Now do the platform independent part */
        error = caam_jr_init(jrdev); /* now turn on hardware */
        if (error) {
+               of_device_unregister(jr_pdev);
                kfree(jrpriv);
                return error;
        }