mtd: nand: orion: improve handling of optional clock
authorSimon Baatz <gmbnomis@gmail.com>
Mon, 27 Mar 2017 18:02:08 +0000 (20:02 +0200)
committerBoris Brezillon <boris.brezillon@free-electrons.com>
Wed, 29 Mar 2017 15:05:37 +0000 (17:05 +0200)
The clock gate used by orion_nand is not available on all platforms.
When getting this optional clock gate, the code masked all errors.
Let's be more precise here and actually only allow ENOENT.

EPROBE_DEFER is handled like any other error code since probe deferral
is not supported by drivers using module_platform_driver_probe().

Signed-off-by: Simon Baatz <gmbnomis@gmail.com>
Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
drivers/mtd/nand/orion_nand.c

index 3acdc20485f1a5ec71f5595d6e70f77416bd1bb8..f8e463a97b9ee479028dd9c282ff74436d885389 100644 (file)
@@ -156,8 +156,17 @@ static int __init orion_nand_probe(struct platform_device *pdev)
        /* Not all platforms can gate the clock, so it is not
           an error if the clock does not exists. */
        info->clk = devm_clk_get(&pdev->dev, NULL);
-       if (!IS_ERR(info->clk))
-               clk_prepare_enable(info->clk);
+       if (IS_ERR(info->clk)) {
+               ret = PTR_ERR(info->clk);
+               if (ret == -ENOENT) {
+                       info->clk = NULL;
+               } else {
+                       dev_err(&pdev->dev, "failed to get clock!\n");
+                       return ret;
+               }
+       }
+
+       clk_prepare_enable(info->clk);
 
        ret = nand_scan(mtd, 1);
        if (ret)
@@ -173,9 +182,7 @@ static int __init orion_nand_probe(struct platform_device *pdev)
        return 0;
 
 no_dev:
-       if (!IS_ERR(info->clk))
-               clk_disable_unprepare(info->clk);
-
+       clk_disable_unprepare(info->clk);
        return ret;
 }
 
@@ -187,8 +194,7 @@ static int orion_nand_remove(struct platform_device *pdev)
 
        nand_release(mtd);
 
-       if (!IS_ERR(info->clk))
-               clk_disable_unprepare(info->clk);
+       clk_disable_unprepare(info->clk);
 
        return 0;
 }