&priv->ring[i].rdr);
                if (ret) {
                        dev_err(dev, "Failed to initialize rings\n");
-                       return ret;
+                       goto err_cleanup_rings;
                }
 
                priv->ring[i].rdr_req = devm_kcalloc(dev,
                        EIP197_DEFAULT_RING_SIZE,
                        sizeof(*priv->ring[i].rdr_req),
                        GFP_KERNEL);
-               if (!priv->ring[i].rdr_req)
-                       return -ENOMEM;
+               if (!priv->ring[i].rdr_req) {
+                       ret = -ENOMEM;
+                       goto err_cleanup_rings;
+               }
 
                ring_irq = devm_kzalloc(dev, sizeof(*ring_irq), GFP_KERNEL);
-               if (!ring_irq)
-                       return -ENOMEM;
+               if (!ring_irq) {
+                       ret = -ENOMEM;
+                       goto err_cleanup_rings;
+               }
 
                ring_irq->priv = priv;
                ring_irq->ring = i;
                                                ring_irq);
                if (irq < 0) {
                        dev_err(dev, "Failed to get IRQ ID for ring %d\n", i);
-                       return irq;
+                       ret = irq;
+                       goto err_cleanup_rings;
                }
 
                priv->ring[i].irq = irq;
                snprintf(wq_name, 9, "wq_ring%d", i);
                priv->ring[i].workqueue =
                        create_singlethread_workqueue(wq_name);
-               if (!priv->ring[i].workqueue)
-                       return -ENOMEM;
+               if (!priv->ring[i].workqueue) {
+                       ret = -ENOMEM;
+                       goto err_cleanup_rings;
+               }
 
                priv->ring[i].requests = 0;
                priv->ring[i].busy = false;
        ret = safexcel_hw_init(priv);
        if (ret) {
                dev_err(dev, "HW init failed (%d)\n", ret);
-               return ret;
+               goto err_cleanup_rings;
        }
 
        ret = safexcel_register_algorithms(priv);
        if (ret) {
                dev_err(dev, "Failed to register algorithms (%d)\n", ret);
-               return ret;
+               goto err_cleanup_rings;
        }
 
        return 0;
+
+err_cleanup_rings:
+       for (i = 0; i < priv->config.rings; i++) {
+               if (priv->ring[i].irq)
+                       irq_set_affinity_hint(priv->ring[i].irq, NULL);
+               if (priv->ring[i].workqueue)
+                       destroy_workqueue(priv->ring[i].workqueue);
+       }
+
+       return ret;
 }
 
 static void safexcel_hw_reset_rings(struct safexcel_crypto_priv *priv)