crypto: inside-secure - fix clock resource by adding a register clock

On Armada 7K/8K we need to explicitly enable the register clock. This
clock is optional because not all the SoCs using this IP need it but at
least for Armada 7K/8K it is actually mandatory.

The binding documentation is updated accordingly.

Signed-off-by: Gregory CLEMENT <gregory.clement@bootlin.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
Gregory CLEMENT 2018-03-13 17:48:42 +01:00 committed by Herbert Xu
parent 5b37689653
commit 1d17cbfbb5
3 changed files with 31 additions and 10 deletions

View File

@ -8,7 +8,11 @@ Required properties:
- interrupt-names: Should be "ring0", "ring1", "ring2", "ring3", "eip", "mem". - interrupt-names: Should be "ring0", "ring1", "ring2", "ring3", "eip", "mem".
Optional properties: Optional properties:
- clocks: Reference to the crypto engine clock. - clocks: Reference to the crypto engine clocks, the second clock is
needed for the Armada 7K/8K SoCs.
- clock-names: mandatory if there is a second clock, in this case the
name must be "core" for the first clock and "reg" for
the second one.
Example: Example:

View File

@ -895,16 +895,30 @@ static int safexcel_probe(struct platform_device *pdev)
} }
} }
priv->reg_clk = devm_clk_get(&pdev->dev, "reg");
ret = PTR_ERR_OR_ZERO(priv->reg_clk);
/* The clock isn't mandatory */
if (ret != -ENOENT) {
if (ret)
goto err_core_clk;
ret = clk_prepare_enable(priv->reg_clk);
if (ret) {
dev_err(dev, "unable to enable reg clk (%d)\n", ret);
goto err_core_clk;
}
}
ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(64)); ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(64));
if (ret) if (ret)
goto err_clk; goto err_reg_clk;
priv->context_pool = dmam_pool_create("safexcel-context", dev, priv->context_pool = dmam_pool_create("safexcel-context", dev,
sizeof(struct safexcel_context_record), sizeof(struct safexcel_context_record),
1, 0); 1, 0);
if (!priv->context_pool) { if (!priv->context_pool) {
ret = -ENOMEM; ret = -ENOMEM;
goto err_clk; goto err_reg_clk;
} }
safexcel_configure(priv); safexcel_configure(priv);
@ -919,12 +933,12 @@ static int safexcel_probe(struct platform_device *pdev)
&priv->ring[i].cdr, &priv->ring[i].cdr,
&priv->ring[i].rdr); &priv->ring[i].rdr);
if (ret) if (ret)
goto err_clk; goto err_reg_clk;
ring_irq = devm_kzalloc(dev, sizeof(*ring_irq), GFP_KERNEL); ring_irq = devm_kzalloc(dev, sizeof(*ring_irq), GFP_KERNEL);
if (!ring_irq) { if (!ring_irq) {
ret = -ENOMEM; ret = -ENOMEM;
goto err_clk; goto err_reg_clk;
} }
ring_irq->priv = priv; ring_irq->priv = priv;
@ -936,7 +950,7 @@ static int safexcel_probe(struct platform_device *pdev)
ring_irq); ring_irq);
if (irq < 0) { if (irq < 0) {
ret = irq; ret = irq;
goto err_clk; goto err_reg_clk;
} }
priv->ring[i].work_data.priv = priv; priv->ring[i].work_data.priv = priv;
@ -947,7 +961,7 @@ static int safexcel_probe(struct platform_device *pdev)
priv->ring[i].workqueue = create_singlethread_workqueue(wq_name); priv->ring[i].workqueue = create_singlethread_workqueue(wq_name);
if (!priv->ring[i].workqueue) { if (!priv->ring[i].workqueue) {
ret = -ENOMEM; ret = -ENOMEM;
goto err_clk; goto err_reg_clk;
} }
priv->ring[i].requests = 0; priv->ring[i].requests = 0;
@ -968,18 +982,20 @@ static int safexcel_probe(struct platform_device *pdev)
ret = safexcel_hw_init(priv); ret = safexcel_hw_init(priv);
if (ret) { if (ret) {
dev_err(dev, "EIP h/w init failed (%d)\n", ret); dev_err(dev, "EIP h/w init failed (%d)\n", ret);
goto err_clk; goto err_reg_clk;
} }
ret = safexcel_register_algorithms(priv); ret = safexcel_register_algorithms(priv);
if (ret) { if (ret) {
dev_err(dev, "Failed to register algorithms (%d)\n", ret); dev_err(dev, "Failed to register algorithms (%d)\n", ret);
goto err_clk; goto err_reg_clk;
} }
return 0; return 0;
err_clk: err_reg_clk:
clk_disable_unprepare(priv->reg_clk);
err_core_clk:
clk_disable_unprepare(priv->clk); clk_disable_unprepare(priv->clk);
return ret; return ret;
} }

View File

@ -525,6 +525,7 @@ struct safexcel_crypto_priv {
void __iomem *base; void __iomem *base;
struct device *dev; struct device *dev;
struct clk *clk; struct clk *clk;
struct clk *reg_clk;
struct safexcel_config config; struct safexcel_config config;
enum safexcel_eip_version version; enum safexcel_eip_version version;