diff options
Diffstat (limited to 'drivers/crypto/omap-sham.c')
| -rw-r--r-- | drivers/crypto/omap-sham.c | 34 | 
1 files changed, 24 insertions, 10 deletions
diff --git a/drivers/crypto/omap-sham.c b/drivers/crypto/omap-sham.c index 8bdde57f6bb..710d8638696 100644 --- a/drivers/crypto/omap-sham.c +++ b/drivers/crypto/omap-sham.c @@ -636,11 +636,17 @@ static size_t omap_sham_append_buffer(struct omap_sham_reqctx *ctx,  static size_t omap_sham_append_sg(struct omap_sham_reqctx *ctx)  {  	size_t count; +	const u8 *vaddr;  	while (ctx->sg) { +		vaddr = kmap_atomic(sg_page(ctx->sg)); +  		count = omap_sham_append_buffer(ctx, -				sg_virt(ctx->sg) + ctx->offset, +				vaddr + ctx->offset,  				ctx->sg->length - ctx->offset); + +		kunmap_atomic((void *)vaddr); +  		if (!count)  			break;  		ctx->offset += count; @@ -789,10 +795,13 @@ static int omap_sham_update_cpu(struct omap_sham_dev *dd)  	dev_dbg(dd->dev, "cpu: bufcnt: %u, digcnt: %d, final: %d\n",  		ctx->bufcnt, ctx->digcnt, final); -	bufcnt = ctx->bufcnt; -	ctx->bufcnt = 0; +	if (final || (ctx->bufcnt == ctx->buflen && ctx->total)) { +		bufcnt = ctx->bufcnt; +		ctx->bufcnt = 0; +		return omap_sham_xmit_cpu(dd, ctx->buffer, bufcnt, final); +	} -	return omap_sham_xmit_cpu(dd, ctx->buffer, bufcnt, final); +	return 0;  }  static int omap_sham_update_dma_stop(struct omap_sham_dev *dd) @@ -1103,6 +1112,9 @@ static int omap_sham_update(struct ahash_request *req)  		return 0;  	} +	if (dd->polling_mode) +		ctx->flags |= BIT(FLAGS_CPU); +  	return omap_sham_enqueue(req, OP_UPDATE);  } @@ -1818,7 +1830,7 @@ static int omap_sham_get_res_of(struct omap_sham_dev *dd,  		goto err;  	} -	dd->irq = of_irq_to_resource(node, 0, NULL); +	dd->irq = irq_of_parse_and_map(node, 0);  	if (!dd->irq) {  		dev_err(dev, "can't translate OF irq value\n");  		err = -EINVAL; @@ -1970,7 +1982,8 @@ err_algs:  			crypto_unregister_ahash(  					&dd->pdata->algs_info[i].algs_list[j]);  	pm_runtime_disable(dev); -	dma_release_channel(dd->dma_lch); +	if (dd->dma_lch) +		dma_release_channel(dd->dma_lch);  data_err:  	dev_err(dev, "initialization failed.\n"); @@ -1994,7 +2007,9 @@ static int omap_sham_remove(struct platform_device *pdev)  					&dd->pdata->algs_info[i].algs_list[j]);  	tasklet_kill(&dd->done_task);  	pm_runtime_disable(&pdev->dev); -	dma_release_channel(dd->dma_lch); + +	if (dd->dma_lch) +		dma_release_channel(dd->dma_lch);  	return 0;  } @@ -2013,9 +2028,7 @@ static int omap_sham_resume(struct device *dev)  }  #endif -static const struct dev_pm_ops omap_sham_pm_ops = { -	SET_SYSTEM_SLEEP_PM_OPS(omap_sham_suspend, omap_sham_resume) -}; +static SIMPLE_DEV_PM_OPS(omap_sham_pm_ops, omap_sham_suspend, omap_sham_resume);  static struct platform_driver omap_sham_driver = {  	.probe	= omap_sham_probe, @@ -2033,3 +2046,4 @@ module_platform_driver(omap_sham_driver);  MODULE_DESCRIPTION("OMAP SHA1/MD5 hw acceleration support.");  MODULE_LICENSE("GPL v2");  MODULE_AUTHOR("Dmitry Kasatkin"); +MODULE_ALIAS("platform:omap-sham");  | 
