[linux-oxnas] [PATCH 2/6] mtd: oxnas_nand: Handle clk_prepare_enable/clk_disable_unprepare. |
[ Thread Index |
Date Index
| More lists.tuxfamily.org/linux-oxnas Archives
]
- To: boris.brezillon@xxxxxxxxxxxxxxxxxx, richard@xxxxxx, dwmw2@xxxxxxxxxxxxx, computersforpeace@xxxxxxxxx, marek.vasut@xxxxxxxxx, cyrille.pitchen@xxxxxxxxxx, narmstrong@xxxxxxxxxxxx
- Subject: [linux-oxnas] [PATCH 2/6] mtd: oxnas_nand: Handle clk_prepare_enable/clk_disable_unprepare.
- From: Arvind Yadav <arvind.yadav.cs@xxxxxxxxx>
- Date: Tue, 1 Aug 2017 17:07:27 +0530
- Cc: linux-mtd@xxxxxxxxxxxxxxxxxxx, linux-kernel@xxxxxxxxxxxxxxx, linux-arm-kernel@xxxxxxxxxxxxxxxxxxx, linux-oxnas@xxxxxxxxxxxxxxxxxxx
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=PlQ06jv62DP7EVbqZA+ibm+7cgWtq1ERX3fqE2Dq5nA=; b=P8vN15RSyxyyXyvSZ5rlLn+851lTkCEUm63I+24icvOOns4k5iRZsvPMRd+TyA7Opk HOP/jXvmqfxkXj/356GtikvZh5TbKIxncaNJVkVDAUsUJjGjzGqvm62KuWjCOr50q9K6 lEyR8Bk4lkjaVtcyARy+NlJ2sPMrxyteQOmlHjf3/3xirZ7cgJahUX3+gNNqYA9dPdhn YoECalCCO4HQ1VcONK7sx2GQwFfc1pNHOkgxfA7nGrG3xpk2bSD9X4fbBzC0DkU5UQrM HxgHb19vdJ2y52DuFa0ibG+C6KaG8Ut0ViJa8FwZodBNLcETiVRCvO3BQGmfFwTRXz7/ IQmQ==
- clk_prepare_enable() can fail here and we must check its return value.
- oxnas_nand_probe() can fail here and we must disable clock.
Signed-off-by: Arvind Yadav <arvind.yadav.cs@xxxxxxxxx>
---
drivers/mtd/nand/oxnas_nand.c | 25 ++++++++++++++++++-------
1 file changed, 18 insertions(+), 7 deletions(-)
diff --git a/drivers/mtd/nand/oxnas_nand.c b/drivers/mtd/nand/oxnas_nand.c
index 1b207aa..7061bb2 100644
--- a/drivers/mtd/nand/oxnas_nand.c
+++ b/drivers/mtd/nand/oxnas_nand.c
@@ -112,14 +112,19 @@ static int oxnas_nand_probe(struct platform_device *pdev)
if (count > 1)
return -EINVAL;
- clk_prepare_enable(oxnas->clk);
+ err = clk_prepare_enable(oxnas->clk);
+ if (err)
+ return err;
+
device_reset_optional(&pdev->dev);
for_each_child_of_node(np, nand_np) {
chip = devm_kzalloc(&pdev->dev, sizeof(struct nand_chip),
GFP_KERNEL);
- if (!chip)
- return -ENOMEM;
+ if (!chip) {
+ err = -ENOMEM;
+ goto err_clk_unprepare;
+ }
chip->controller = &oxnas->base;
@@ -139,12 +144,12 @@ static int oxnas_nand_probe(struct platform_device *pdev)
/* Scan to find existence of the device */
err = nand_scan(mtd, 1);
if (err)
- return err;
+ goto err_clk_unprepare;
err = mtd_device_register(mtd, NULL, 0);
if (err) {
nand_release(mtd);
- return err;
+ goto err_clk_unprepare;
}
oxnas->chips[nchips] = chip;
@@ -152,12 +157,18 @@ static int oxnas_nand_probe(struct platform_device *pdev)
}
/* Exit if no chips found */
- if (!nchips)
- return -ENODEV;
+ if (!nchips) {
+ err = -ENODEV;
+ goto err_clk_unprepare;
+ }
platform_set_drvdata(pdev, oxnas);
return 0;
+
+err_clk_unprepare:
+ clk_disable_unprepare(oxnas->clk);
+ return err;
}
static int oxnas_nand_remove(struct platform_device *pdev)
--
1.9.1