ARM: Orion: NAND: Add support for clk, if there is one.
authorAndrew Lunn <andrew@lunn.ch>
Sun, 19 Feb 2012 10:01:22 +0000 (11:01 +0100)
committerMike Turquette <mturquette@linaro.org>
Tue, 8 May 2012 23:33:59 +0000 (16:33 -0700)
Not all orion platforms can gate the clock, but if it does exist,
enable/disable it as appropriate.

v2: Fix the name of the clkdev entry.

Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Tested-by: Jamie Lentin <jm@lentin.co.uk>
Signed-off-by: Mike Turquette <mturquette@linaro.org>
arch/arm/mach-kirkwood/common.c
drivers/mtd/nand/orion_nand.c

index b0f20c0c7d54dd0d46587428c84a72d74ef835fe..99adebce707394488a98f6fe303b2543aed044da 100644 (file)
@@ -116,6 +116,7 @@ void __init kirkwood_clk_init(void)
        orion_clkdev_add("0", "sata_mv.0", sata0);
        orion_clkdev_add("1", "sata_mv.0", sata1);
        orion_clkdev_add(NULL, "orion-ehci.0", usb0);
+       orion_clkdev_add(NULL, "orion_nand", runit);
 }
 
 /*****************************************************************************
index 1d3bfb26080cc27c4ef322271c409b49a58ee70d..fdc4786ea3e57e8c421c58cd531516c451e65cd9 100644 (file)
@@ -16,6 +16,8 @@
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/nand.h>
 #include <linux/mtd/partitions.h>
+#include <linux/clk.h>
+#include <linux/err.h>
 #include <asm/io.h>
 #include <asm/sizes.h>
 #include <mach/hardware.h>
@@ -77,6 +79,7 @@ static int __init orion_nand_probe(struct platform_device *pdev)
        struct nand_chip *nc;
        struct orion_nand_data *board;
        struct resource *res;
+       struct clk *clk;
        void __iomem *io_base;
        int ret = 0;
 
@@ -123,6 +126,14 @@ static int __init orion_nand_probe(struct platform_device *pdev)
 
        platform_set_drvdata(pdev, mtd);
 
+       /* Not all platforms can gate the clock, so it is not
+          an error if the clock does not exists. */
+       clk = clk_get(&pdev->dev, NULL);
+       if (!IS_ERR(clk)) {
+               clk_prepare_enable(clk);
+               clk_put(clk);
+       }
+
        if (nand_scan(mtd, 1)) {
                ret = -ENXIO;
                goto no_dev;
@@ -151,6 +162,7 @@ static int __devexit orion_nand_remove(struct platform_device *pdev)
 {
        struct mtd_info *mtd = platform_get_drvdata(pdev);
        struct nand_chip *nc = mtd->priv;
+       struct clk *clk;
 
        nand_release(mtd);
 
@@ -158,6 +170,12 @@ static int __devexit orion_nand_remove(struct platform_device *pdev)
 
        kfree(nc);
 
+       clk = clk_get(&pdev->dev, NULL);
+       if (!IS_ERR(clk)) {
+               clk_disable_unprepare(clk);
+               clk_put(clk);
+       }
+
        return 0;
 }
 
This page took 0.027548 seconds and 5 git commands to generate.