Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932788AbdIHWAu (ORCPT ); Fri, 8 Sep 2017 18:00:50 -0400 Received: from mail.ispras.ru ([83.149.199.45]:39500 "EHLO mail.ispras.ru" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757210AbdIHWAs (ORCPT ); Fri, 8 Sep 2017 18:00:48 -0400 From: Alexey Khoroshilov To: Boris Brezillon , Brian Norris , Neil Armstrong Cc: Alexey Khoroshilov , linux-mtd@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-oxnas@lists.tuxfamily.org, linux-kernel@vger.kernel.org, ldv-project@linuxtesting.org Subject: [PATCH] mtd: oxnas_nand: Fix error handling in oxnas_nand_probe() Date: Sat, 9 Sep 2017 01:00:38 +0300 Message-Id: <1504908038-26285-1-git-send-email-khoroshilov@ispras.ru> X-Mailer: git-send-email 2.7.4 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1542 Lines: 57 oxnas_nand_probe() does not disable clock on error paths. The patch adds disabling using devm interface. Found by Linux Driver Verification project (linuxtesting.org). Signed-off-by: Alexey Khoroshilov --- drivers/mtd/nand/oxnas_nand.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/drivers/mtd/nand/oxnas_nand.c b/drivers/mtd/nand/oxnas_nand.c index 1b207aac840c..8abc69a285dd 100644 --- a/drivers/mtd/nand/oxnas_nand.c +++ b/drivers/mtd/nand/oxnas_nand.c @@ -103,16 +103,26 @@ static int oxnas_nand_probe(struct platform_device *pdev) if (IS_ERR(oxnas->io_base)) return PTR_ERR(oxnas->io_base); - oxnas->clk = devm_clk_get(&pdev->dev, NULL); - if (IS_ERR(oxnas->clk)) - oxnas->clk = NULL; - /* Only a single chip node is supported */ count = of_get_child_count(np); if (count > 1) return -EINVAL; - clk_prepare_enable(oxnas->clk); + oxnas->clk = devm_clk_get(&pdev->dev, NULL); + if (IS_ERR(oxnas->clk)) { + oxnas->clk = NULL; + } else { + err = clk_prepare_enable(oxnas->clk); + if (err) + return err; + + err = devm_add_action_or_reset(&pdev->dev, + (void(*)(void *))clk_disable_unprepare, + oxnas->clk); + if (err) + return err; + } + device_reset_optional(&pdev->dev); for_each_child_of_node(np, nand_np) { @@ -167,8 +177,6 @@ static int oxnas_nand_remove(struct platform_device *pdev) if (oxnas->chips[0]) nand_release(nand_to_mtd(oxnas->chips[0])); - clk_disable_unprepare(oxnas->clk); - return 0; } -- 2.7.4