From: Chris Spencer <christopher.spencer@xxxxxxxxx> There are no clocks that the CAAM driver needs to initialise on the i.MX8. Signed-off-by: Chris Spencer <christopher.spencer@xxxxxxxxx> --- drivers/crypto/caam/ctrl.c | 180 +++++++++++++++++++---------------- drivers/crypto/caam/intern.h | 1 + 2 files changed, 99 insertions(+), 82 deletions(-) diff --git a/drivers/crypto/caam/ctrl.c b/drivers/crypto/caam/ctrl.c index 22cb7106133a..1f841f37ce3c 100644 --- a/drivers/crypto/caam/ctrl.c +++ b/drivers/crypto/caam/ctrl.c @@ -472,6 +472,91 @@ static int caam_get_era(struct caam_ctrl __iomem *ctrl) return caam_get_era_from_hw(ctrl); } +static int init_clocks(struct caam_drv_private *ctrlpriv) +{ + struct clk *clk; + struct device *dev = ctrlpriv->dev; + int ret = 0; + + /* Enable clocking */ + clk = caam_drv_identify_clk(dev, "ipg"); + if (IS_ERR(clk)) { + ret = PTR_ERR(clk); + dev_err(dev, "can't identify CAAM ipg clk: %d\n", ret); + goto exit; + } + ctrlpriv->caam_ipg = clk; + + ret = clk_prepare_enable(ctrlpriv->caam_ipg); + if (ret < 0) { + dev_err(dev, "can't enable CAAM ipg clock: %d\n", ret); + goto exit; + } + + clk = caam_drv_identify_clk(dev, "aclk"); + if (IS_ERR(clk)) { + ret = PTR_ERR(clk); + dev_err(dev, "can't identify CAAM aclk clk: %d\n", ret); + goto disable_caam_ipg; + } + ctrlpriv->caam_aclk = clk; + + ret = clk_prepare_enable(ctrlpriv->caam_aclk); + if (ret < 0) { + dev_err(dev, "can't enable CAAM aclk clock: %d\n", ret); + goto disable_caam_ipg; + } + + if (!of_machine_is_compatible("fsl,imx7d") && + !of_machine_is_compatible("fsl,imx7s")) { + clk = caam_drv_identify_clk(dev, "mem"); + if (IS_ERR(clk)) { + ret = PTR_ERR(clk); + dev_err(dev, "can't identify CAAM mem clk: %d\n", ret); + goto disable_caam_aclk; + } + ctrlpriv->caam_mem = clk; + + ret = clk_prepare_enable(ctrlpriv->caam_mem); + if (ret < 0) { + dev_err(dev, "can't enable CAAM secure mem clock: %d\n", + ret); + goto disable_caam_aclk; + } + + if (!of_machine_is_compatible("fsl,imx6ul")) { + clk = caam_drv_identify_clk(dev, "emi_slow"); + if (IS_ERR(clk)) { + ret = PTR_ERR(clk); + dev_err(dev, + "can't identify CAAM emi_slow clk: %d\n", + ret); + goto disable_caam_mem; + } + ctrlpriv->caam_emi_slow = clk; + + ret = clk_prepare_enable(ctrlpriv->caam_emi_slow); + if (ret < 0) { + dev_err(dev, + "can't enable CAAM emi slow clock: %d\n", + ret); + goto disable_caam_mem; + } + } + } + + goto exit; + +disable_caam_mem: + clk_disable_unprepare(ctrlpriv->caam_mem); +disable_caam_aclk: + clk_disable_unprepare(ctrlpriv->caam_aclk); +disable_caam_ipg: + clk_disable_unprepare(ctrlpriv->caam_ipg); +exit: + return ret; +} + static const struct of_device_id caam_match[] = { { .compatible = "fsl,sec-v4.0", @@ -496,7 +581,6 @@ static int caam_probe(struct platform_device *pdev) struct device_node *nprop, *np; struct caam_ctrl __iomem *ctrl; struct caam_drv_private *ctrlpriv; - struct clk *clk; #ifdef CONFIG_DEBUG_FS struct caam_perfmon *perfmon; #endif @@ -511,83 +595,16 @@ static int caam_probe(struct platform_device *pdev) dev = &pdev->dev; dev_set_drvdata(dev, ctrlpriv); + ctrlpriv->dev = dev; nprop = pdev->dev.of_node; caam_imx = soc_device_match(imx_soc) || of_machine_is_compatible("fsl,imx8mq"); - /* Enable clocking */ - clk = caam_drv_identify_clk(&pdev->dev, "ipg"); - if (IS_ERR(clk)) { - ret = PTR_ERR(clk); - dev_err(&pdev->dev, - "can't identify CAAM ipg clk: %d\n", ret); - return ret; - } - ctrlpriv->caam_ipg = clk; - - if (!of_machine_is_compatible("fsl,imx7d") && - !of_machine_is_compatible("fsl,imx7s")) { - clk = caam_drv_identify_clk(&pdev->dev, "mem"); - if (IS_ERR(clk)) { - ret = PTR_ERR(clk); - dev_err(&pdev->dev, - "can't identify CAAM mem clk: %d\n", ret); - return ret; - } - ctrlpriv->caam_mem = clk; - } - - clk = caam_drv_identify_clk(&pdev->dev, "aclk"); - if (IS_ERR(clk)) { - ret = PTR_ERR(clk); - dev_err(&pdev->dev, - "can't identify CAAM aclk clk: %d\n", ret); - return ret; - } - ctrlpriv->caam_aclk = clk; - - if (!of_machine_is_compatible("fsl,imx6ul") && - !of_machine_is_compatible("fsl,imx7d") && - !of_machine_is_compatible("fsl,imx7s")) { - 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; - } - - ret = clk_prepare_enable(ctrlpriv->caam_ipg); - if (ret < 0) { - dev_err(&pdev->dev, "can't enable CAAM ipg clock: %d\n", ret); - return ret; - } - - if (ctrlpriv->caam_mem) { - ret = clk_prepare_enable(ctrlpriv->caam_mem); - if (ret < 0) { - dev_err(&pdev->dev, "can't enable CAAM secure mem clock: %d\n", - ret); - goto disable_caam_ipg; - } - } - - ret = clk_prepare_enable(ctrlpriv->caam_aclk); - if (ret < 0) { - dev_err(&pdev->dev, "can't enable CAAM aclk clock: %d\n", ret); - goto disable_caam_mem; - } - - 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; - } + if (!of_machine_is_compatible("fsl,imx8mq")) { + ret = init_clocks(ctrlpriv); + if (ret) + goto exit; } /* Get configuration properties from device tree */ @@ -596,7 +613,7 @@ static int caam_probe(struct platform_device *pdev) if (ctrl == NULL) { dev_err(dev, "caam: of_iomap() failed\n"); ret = -ENOMEM; - goto disable_caam_emi_slow; + goto disable_clocks; } caam_little_end = !(bool)(rd_reg32(&ctrl->perfmon.status) & @@ -894,16 +911,15 @@ static int caam_probe(struct platform_device *pdev) iounmap_ctrl: iounmap(ctrl); -disable_caam_emi_slow: - if (ctrlpriv->caam_emi_slow) +disable_clocks: + if (!of_machine_is_compatible("fsl,imx8mq")) { clk_disable_unprepare(ctrlpriv->caam_emi_slow); -disable_caam_aclk: - clk_disable_unprepare(ctrlpriv->caam_aclk); -disable_caam_mem: - if (ctrlpriv->caam_mem) + clk_disable_unprepare(ctrlpriv->caam_aclk); clk_disable_unprepare(ctrlpriv->caam_mem); -disable_caam_ipg: - clk_disable_unprepare(ctrlpriv->caam_ipg); + clk_disable_unprepare(ctrlpriv->caam_ipg); + } + +exit: return ret; } diff --git a/drivers/crypto/caam/intern.h b/drivers/crypto/caam/intern.h index babc78abd155..a4baa6a3d2f1 100644 --- a/drivers/crypto/caam/intern.h +++ b/drivers/crypto/caam/intern.h @@ -68,6 +68,7 @@ struct caam_drv_private { #ifdef CONFIG_CAAM_QI struct device *qidev; #endif + struct device *dev; /* Physical-presence section */ struct caam_ctrl __iomem *ctrl; /* controller region */ -- 2.17.1