diff options
| author | Cyrille Pitchen <cyrille.pitchen@atmel.com> | 2016-02-05 13:45:13 +0100 | 
|---|---|---|
| committer | Herbert Xu <herbert@gondor.apana.org.au> | 2016-02-06 15:23:56 +0800 | 
| commit | c033042aa8f69894df37dabcaa0231594834a4e4 (patch) | |
| tree | d1539b2c8ddd462ce08fee3003e8d38c84e30a73 | |
| parent | d961436c11482e974b702c8324426208f00cd7c4 (diff) | |
| download | linux-c033042aa8f69894df37dabcaa0231594834a4e4.tar.bz2 | |
crypto: atmel-sha - remove calls of clk_prepare() from atomic contexts
clk_prepare()/clk_unprepare() must not be called within atomic context.
This patch calls clk_prepare() once for all from atmel_sha_probe() and
clk_unprepare() from atmel_sha_remove().
Then calls of clk_prepare_enable()/clk_disable_unprepare() were replaced
by calls of clk_enable()/clk_disable().
Cc: stable@vger.kernel.org
Signed-off-by: Cyrille Pitchen <cyrille.pitchen@atmel.com>
Reported-by: Matthias Mayr <matthias.mayr@student.kit.edu>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
| -rw-r--r-- | drivers/crypto/atmel-sha.c | 18 | 
1 files changed, 13 insertions, 5 deletions
diff --git a/drivers/crypto/atmel-sha.c b/drivers/crypto/atmel-sha.c index b5ab7400008d..8bf9914d4d15 100644 --- a/drivers/crypto/atmel-sha.c +++ b/drivers/crypto/atmel-sha.c @@ -782,7 +782,7 @@ static void atmel_sha_finish_req(struct ahash_request *req, int err)  	dd->flags &= ~(SHA_FLAGS_BUSY | SHA_FLAGS_FINAL | SHA_FLAGS_CPU |  			SHA_FLAGS_DMA_READY | SHA_FLAGS_OUTPUT_READY); -	clk_disable_unprepare(dd->iclk); +	clk_disable(dd->iclk);  	if (req->base.complete)  		req->base.complete(&req->base, err); @@ -795,7 +795,7 @@ static int atmel_sha_hw_init(struct atmel_sha_dev *dd)  {  	int err; -	err = clk_prepare_enable(dd->iclk); +	err = clk_enable(dd->iclk);  	if (err)  		return err; @@ -822,7 +822,7 @@ static void atmel_sha_hw_version_init(struct atmel_sha_dev *dd)  	dev_info(dd->dev,  			"version: 0x%x\n", dd->hw_version); -	clk_disable_unprepare(dd->iclk); +	clk_disable(dd->iclk);  }  static int atmel_sha_handle_queue(struct atmel_sha_dev *dd, @@ -1410,6 +1410,10 @@ static int atmel_sha_probe(struct platform_device *pdev)  		goto res_err;  	} +	err = clk_prepare(sha_dd->iclk); +	if (err) +		goto res_err; +  	atmel_sha_hw_version_init(sha_dd);  	atmel_sha_get_cap(sha_dd); @@ -1421,12 +1425,12 @@ static int atmel_sha_probe(struct platform_device *pdev)  			if (IS_ERR(pdata)) {  				dev_err(&pdev->dev, "platform data not available\n");  				err = PTR_ERR(pdata); -				goto res_err; +				goto iclk_unprepare;  			}  		}  		if (!pdata->dma_slave) {  			err = -ENXIO; -			goto res_err; +			goto iclk_unprepare;  		}  		err = atmel_sha_dma_init(sha_dd, pdata);  		if (err) @@ -1457,6 +1461,8 @@ err_algs:  	if (sha_dd->caps.has_dma)  		atmel_sha_dma_cleanup(sha_dd);  err_sha_dma: +iclk_unprepare: +	clk_unprepare(sha_dd->iclk);  res_err:  	tasklet_kill(&sha_dd->done_task);  sha_dd_err: @@ -1483,6 +1489,8 @@ static int atmel_sha_remove(struct platform_device *pdev)  	if (sha_dd->caps.has_dma)  		atmel_sha_dma_cleanup(sha_dd); +	clk_unprepare(sha_dd->iclk); +  	return 0;  }  |