]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blobdiff - drivers/crypto/caam/ctrl.c
brcm: adds support for BCM43341 wifi
[mirror_ubuntu-zesty-kernel.git] / drivers / crypto / caam / ctrl.c
index e483b78c6343fd745f83e52b317edbb3ccb23e92..6092252ce6caf89e023e3fdc31681df12af6c22f 100644 (file)
@@ -282,7 +282,8 @@ static int deinstantiate_rng(struct device *ctrldev, int state_handle_mask)
                        /* Try to run it through DECO0 */
                        ret = run_descriptor_deco0(ctrldev, desc, &status);
 
-                       if (ret || status) {
+                       if (ret ||
+                           (status && status != JRSTA_SSRC_JUMP_HALT_CC)) {
                                dev_err(ctrldev,
                                        "Failed to deinstantiate RNG4 SH%d\n",
                                        sh_idx);
@@ -330,8 +331,8 @@ static int caam_remove(struct platform_device *pdev)
        clk_disable_unprepare(ctrlpriv->caam_ipg);
        clk_disable_unprepare(ctrlpriv->caam_mem);
        clk_disable_unprepare(ctrlpriv->caam_aclk);
-       clk_disable_unprepare(ctrlpriv->caam_emi_slow);
-
+       if (ctrlpriv->caam_emi_slow)
+               clk_disable_unprepare(ctrlpriv->caam_emi_slow);
        return 0;
 }
 
@@ -365,11 +366,8 @@ static void kick_trng(struct platform_device *pdev, int ent_delay)
         */
        val = (rd_reg32(&r4tst->rtsdctl) & RTSDCTL_ENT_DLY_MASK)
              >> RTSDCTL_ENT_DLY_SHIFT;
-       if (ent_delay <= val) {
-               /* put RNG4 into run mode */
-               clrsetbits_32(&r4tst->rtmctl, RTMCTL_PRGM, 0);
-               return;
-       }
+       if (ent_delay <= val)
+               goto start_rng;
 
        val = rd_reg32(&r4tst->rtsdctl);
        val = (val & ~RTSDCTL_ENT_DLY_MASK) |
@@ -381,15 +379,12 @@ static void kick_trng(struct platform_device *pdev, int ent_delay)
        wr_reg32(&r4tst->rtfrqmax, RTFRQMAX_DISABLE);
        /* read the control register */
        val = rd_reg32(&r4tst->rtmctl);
+start_rng:
        /*
         * select raw sampling in both entropy shifter
-        * and statistical checker
+        * and statistical checker; ; put RNG4 into run mode
         */
-       clrsetbits_32(&val, 0, RTMCTL_SAMP_MODE_RAW_ES_SC);
-       /* put RNG4 into run mode */
-       clrsetbits_32(&val, RTMCTL_PRGM, 0);
-       /* write back the control register */
-       wr_reg32(&r4tst->rtmctl, val);
+       clrsetbits_32(&r4tst->rtmctl, RTMCTL_PRGM, RTMCTL_SAMP_MODE_RAW_ES_SC);
 }
 
 /**
@@ -482,14 +477,16 @@ static int caam_probe(struct platform_device *pdev)
        }
        ctrlpriv->caam_aclk = clk;
 
-       clk = caam_drv_identify_clk(&pdev->dev, "emi_slow");
-       if (IS_ERR(clk)) {
-               ret = PTR_ERR(clk);
-               dev_err(&pdev->dev,
-                       "can't identify CAAM emi_slow clk: %d\n", ret);
-               return ret;
+       if (!of_machine_is_compatible("fsl,imx6ul")) {
+               clk = caam_drv_identify_clk(&pdev->dev, "emi_slow");
+               if (IS_ERR(clk)) {
+                       ret = PTR_ERR(clk);
+                       dev_err(&pdev->dev,
+                               "can't identify CAAM emi_slow clk: %d\n", ret);
+                       return ret;
+               }
+               ctrlpriv->caam_emi_slow = clk;
        }
-       ctrlpriv->caam_emi_slow = clk;
 
        ret = clk_prepare_enable(ctrlpriv->caam_ipg);
        if (ret < 0) {
@@ -510,11 +507,13 @@ static int caam_probe(struct platform_device *pdev)
                goto disable_caam_mem;
        }
 
-       ret = clk_prepare_enable(ctrlpriv->caam_emi_slow);
-       if (ret < 0) {
-               dev_err(&pdev->dev, "can't enable CAAM emi slow clock: %d\n",
-                       ret);
-               goto disable_caam_aclk;
+       if (ctrlpriv->caam_emi_slow) {
+               ret = clk_prepare_enable(ctrlpriv->caam_emi_slow);
+               if (ret < 0) {
+                       dev_err(&pdev->dev, "can't enable CAAM emi slow clock: %d\n",
+                               ret);
+                       goto disable_caam_aclk;
+               }
        }
 
        /* Get configuration properties from device tree */
@@ -541,13 +540,13 @@ static int caam_probe(struct platform_device *pdev)
        else
                BLOCK_OFFSET = PG_SIZE_64K;
 
-       ctrlpriv->ctrl = (struct caam_ctrl __force *)ctrl;
-       ctrlpriv->assure = (struct caam_assurance __force *)
-                          ((uint8_t *)ctrl +
+       ctrlpriv->ctrl = (struct caam_ctrl __iomem __force *)ctrl;
+       ctrlpriv->assure = (struct caam_assurance __iomem __force *)
+                          ((__force uint8_t *)ctrl +
                            BLOCK_OFFSET * ASSURE_BLOCK_NUMBER
                           );
-       ctrlpriv->deco = (struct caam_deco __force *)
-                        ((uint8_t *)ctrl +
+       ctrlpriv->deco = (struct caam_deco __iomem __force *)
+                        ((__force uint8_t *)ctrl +
                         BLOCK_OFFSET * DECO_BLOCK_NUMBER
                         );
 
@@ -627,8 +626,8 @@ static int caam_probe(struct platform_device *pdev)
                                        ring);
                                continue;
                        }
-                       ctrlpriv->jr[ring] = (struct caam_job_ring __force *)
-                                            ((uint8_t *)ctrl +
+                       ctrlpriv->jr[ring] = (struct caam_job_ring __iomem __force *)
+                                            ((__force uint8_t *)ctrl +
                                             (ring + JR_BLOCK_NUMBER) *
                                              BLOCK_OFFSET
                                             );
@@ -641,8 +640,8 @@ static int caam_probe(struct platform_device *pdev)
                        !!(rd_reg32(&ctrl->perfmon.comp_parms_ms) &
                           CTPR_MS_QI_MASK);
        if (ctrlpriv->qi_present) {
-               ctrlpriv->qi = (struct caam_queue_if __force *)
-                              ((uint8_t *)ctrl +
+               ctrlpriv->qi = (struct caam_queue_if __iomem __force *)
+                              ((__force uint8_t *)ctrl +
                                 BLOCK_OFFSET * QI_BLOCK_NUMBER
                               );
                /* This is all that's required to physically enable QI */
@@ -800,7 +799,7 @@ static int caam_probe(struct platform_device *pdev)
                                    &caam_fops_u32_ro);
 
        /* Internal covering keys (useful in non-secure mode only) */
-       ctrlpriv->ctl_kek_wrap.data = &ctrlpriv->ctrl->kek[0];
+       ctrlpriv->ctl_kek_wrap.data = (__force void *)&ctrlpriv->ctrl->kek[0];
        ctrlpriv->ctl_kek_wrap.size = KEK_KEY_SIZE * sizeof(u32);
        ctrlpriv->ctl_kek = debugfs_create_blob("kek",
                                                S_IRUSR |
@@ -808,7 +807,7 @@ static int caam_probe(struct platform_device *pdev)
                                                ctrlpriv->ctl,
                                                &ctrlpriv->ctl_kek_wrap);
 
-       ctrlpriv->ctl_tkek_wrap.data = &ctrlpriv->ctrl->tkek[0];
+       ctrlpriv->ctl_tkek_wrap.data = (__force void *)&ctrlpriv->ctrl->tkek[0];
        ctrlpriv->ctl_tkek_wrap.size = KEK_KEY_SIZE * sizeof(u32);
        ctrlpriv->ctl_tkek = debugfs_create_blob("tkek",
                                                 S_IRUSR |
@@ -816,7 +815,7 @@ static int caam_probe(struct platform_device *pdev)
                                                 ctrlpriv->ctl,
                                                 &ctrlpriv->ctl_tkek_wrap);
 
-       ctrlpriv->ctl_tdsk_wrap.data = &ctrlpriv->ctrl->tdsk[0];
+       ctrlpriv->ctl_tdsk_wrap.data = (__force void *)&ctrlpriv->ctrl->tdsk[0];
        ctrlpriv->ctl_tdsk_wrap.size = KEK_KEY_SIZE * sizeof(u32);
        ctrlpriv->ctl_tdsk = debugfs_create_blob("tdsk",
                                                 S_IRUSR |
@@ -833,7 +832,8 @@ caam_remove:
 iounmap_ctrl:
        iounmap(ctrl);
 disable_caam_emi_slow:
-       clk_disable_unprepare(ctrlpriv->caam_emi_slow);
+       if (ctrlpriv->caam_emi_slow)
+               clk_disable_unprepare(ctrlpriv->caam_emi_slow);
 disable_caam_aclk:
        clk_disable_unprepare(ctrlpriv->caam_aclk);
 disable_caam_mem: