diff options
author | Choi jonghwan <jhbird.choi@samsung.com> | 2010-10-14 03:26:44 -0700 |
---|---|---|
committer | Arve Hjønnevåg <arve@android.com> | 2011-11-17 17:49:59 -0800 |
commit | ec6efecf53d9be78a7e6aeef9fa7fb59d8ea49f8 (patch) | |
tree | ebb90b3e910cfca8d2ac5ec0db13e9f89f1dedc2 /drivers/mtd | |
parent | 5660c4185922321a39be3a7efc2dbe80fe964e33 (diff) | |
download | kernel_samsung_aries-ec6efecf53d9be78a7e6aeef9fa7fb59d8ea49f8.zip kernel_samsung_aries-ec6efecf53d9be78a7e6aeef9fa7fb59d8ea49f8.tar.gz kernel_samsung_aries-ec6efecf53d9be78a7e6aeef9fa7fb59d8ea49f8.tar.bz2 |
SP5C11X: ONENAND: Add onenand clock gating.
Add onenand clock gating.
Change-Id: I0149ad95d4ebfd4293821abe1fe594505e74eb9c
Signed-off-by: Choi jonghwan <jhbird.choi@samsung.com>
Diffstat (limited to 'drivers/mtd')
-rw-r--r-- | drivers/mtd/onenand/onenand_base.c | 6 | ||||
-rw-r--r-- | drivers/mtd/onenand/samsung.c | 18 |
2 files changed, 23 insertions, 1 deletions
diff --git a/drivers/mtd/onenand/onenand_base.c b/drivers/mtd/onenand/onenand_base.c index ac9e959..3aa99af 100644 --- a/drivers/mtd/onenand/onenand_base.c +++ b/drivers/mtd/onenand/onenand_base.c @@ -32,6 +32,7 @@ #include <linux/mtd/mtd.h> #include <linux/mtd/onenand.h> #include <linux/mtd/partitions.h> +#include <linux/clk.h> #include <asm/io.h> @@ -991,7 +992,8 @@ static int onenand_get_device(struct mtd_info *mtd, int new_state) schedule(); remove_wait_queue(&this->wq, &wait); } - + if (this->clk) + clk_enable(this->clk); return 0; } @@ -1012,6 +1014,8 @@ static void onenand_release_device(struct mtd_info *mtd) this->state = FL_READY; wake_up(&this->wq); spin_unlock(&this->chip_lock); + if (this->clk) + clk_disable(this->clk); } /** diff --git a/drivers/mtd/onenand/samsung.c b/drivers/mtd/onenand/samsung.c index 3bd5988..7ed1051 100644 --- a/drivers/mtd/onenand/samsung.c +++ b/drivers/mtd/onenand/samsung.c @@ -23,6 +23,7 @@ #include <linux/mtd/partitions.h> #include <linux/dma-mapping.h> #include <linux/interrupt.h> +#include <linux/clk.h> #include <asm/mach/flash.h> #include <plat/regs-onenand.h> @@ -1008,6 +1009,17 @@ static int s3c_onenand_probe(struct platform_device *pdev) err = -EFAULT; goto ioremap_failed; } + + this->clk = clk_get(&pdev->dev, "onenand"); + + if (IS_ERR(this->clk)) { + dev_err(&pdev->dev, "cannot get clock\n"); + err = PTR_ERR(this->clk); + goto clk_failed; + } + + clk_enable(this->clk); + /* Set onenand_chip also */ this->base = onenand->base; @@ -1141,6 +1153,7 @@ static int s3c_onenand_probe(struct platform_device *pdev) platform_set_drvdata(pdev, mtd); + clk_disable(this->clk); return 0; scan_failed: @@ -1163,6 +1176,9 @@ ahb_ioremap_failed: dma_resource_failed: ahb_resource_failed: iounmap(onenand->base); + clk_disable(this->clk); + clk_put(this->clk); +clk_failed: ioremap_failed: if (onenand->base_res) release_mem_region(onenand->base_res->start, @@ -1177,6 +1193,7 @@ onenand_fail: static int __devexit s3c_onenand_remove(struct platform_device *pdev) { struct mtd_info *mtd = platform_get_drvdata(pdev); + struct onenand_chip *this = mtd->priv; onenand_release(mtd); if (onenand->ahb_addr) @@ -1197,6 +1214,7 @@ static int __devexit s3c_onenand_remove(struct platform_device *pdev) platform_set_drvdata(pdev, NULL); kfree(onenand->oob_buf); kfree(onenand->page_buf); + clk_put(this->clk); kfree(onenand); kfree(mtd); return 0; |