ARM: Orion: NAND: Add support for clk, if there is one.
[deliverable/linux.git] / drivers / mtd / nand / orion_nand.c
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.027058 seconds and 5 git commands to generate.