| From: Chuhong Yuan <hslester96@gmail.com> |
| Date: Tue, 10 Dec 2019 00:21:44 +0800 |
| Subject: crypto: picoxcell - adjust the position of tasklet_init and fix |
| missed tasklet_kill |
| |
| commit 7f8c36fe9be46862c4f3c5302f769378028a34fa upstream. |
| |
| Since tasklet is needed to be initialized before registering IRQ |
| handler, adjust the position of tasklet_init to fix the wrong order. |
| |
| Besides, to fix the missed tasklet_kill, this patch adds a helper |
| function and uses devm_add_action to kill the tasklet automatically. |
| |
| Fixes: ce92136843cb ("crypto: picoxcell - add support for the picoxcell crypto engines") |
| Signed-off-by: Chuhong Yuan <hslester96@gmail.com> |
| Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| drivers/crypto/picoxcell_crypto.c | 15 +++++++++++++-- |
| 1 file changed, 13 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/crypto/picoxcell_crypto.c |
| +++ b/drivers/crypto/picoxcell_crypto.c |
| @@ -1690,6 +1690,11 @@ static bool spacc_is_compatible(struct p |
| return false; |
| } |
| |
| +static void spacc_tasklet_kill(void *data) |
| +{ |
| + tasklet_kill(data); |
| +} |
| + |
| static int spacc_probe(struct platform_device *pdev) |
| { |
| int i, err, ret = -EINVAL; |
| @@ -1730,6 +1735,14 @@ static int spacc_probe(struct platform_d |
| return -ENXIO; |
| } |
| |
| + tasklet_init(&engine->complete, spacc_spacc_complete, |
| + (unsigned long)engine); |
| + |
| + ret = devm_add_action(&pdev->dev, spacc_tasklet_kill, |
| + &engine->complete); |
| + if (ret) |
| + return ret; |
| + |
| if (devm_request_irq(&pdev->dev, irq->start, spacc_spacc_irq, 0, |
| engine->name, engine)) { |
| dev_err(engine->dev, "failed to request IRQ\n"); |
| @@ -1792,8 +1805,6 @@ static int spacc_probe(struct platform_d |
| INIT_LIST_HEAD(&engine->completed); |
| INIT_LIST_HEAD(&engine->in_progress); |
| engine->in_flight = 0; |
| - tasklet_init(&engine->complete, spacc_spacc_complete, |
| - (unsigned long)engine); |
| |
| platform_set_drvdata(pdev, engine); |
| |