[PATCH 2/7] mtd: OneNAND: add enable / disable methods to onenand_chip
Kyungmin Park
kyungmin.park at samsung.com
Mon Dec 13 19:17:54 EST 2010
Hi,
Now I'm used the clock gating for OneNAND instead of regulator.
so I think the mechanism is similar.
On Mon, Dec 13, 2010 at 9:20 PM, Adrian Hunter <adrian.hunter at nokia.com> wrote:
> From 16b760999cb79f9cf71728c9253f1399717be63a Mon Sep 17 00:00:00 2001
> From: Adrian Hunter <adrian.hunter at nokia.com>
> Date: Fri, 19 Feb 2010 15:39:52 +0100
> Subject: [PATCH 2/7] mtd: OneNAND: add enable / disable methods to onenand_chip
>
> Add enable / disable methods called from get_device() / release_device().
> These can be used, for example, to allow the driver to prevent the voltage
> regulator from being put to sleep while OneNAND is in use.
>
> Signed-off-by: Adrian Hunter <adrian.hunter at nokia.com>
> ---
> drivers/mtd/onenand/onenand_base.c | 4 ++++
> include/linux/mtd/onenand.h | 2 ++
> 2 files changed, 6 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/mtd/onenand/onenand_base.c b/drivers/mtd/onenand/onenand_base.c
> index c38bf9c..bde274f 100644
> --- a/drivers/mtd/onenand/onenand_base.c
> +++ b/drivers/mtd/onenand/onenand_base.c
> @@ -948,6 +948,8 @@ static int onenand_get_device(struct mtd_info *mtd, int new_state)
> if (this->state == FL_READY) {
> this->state = new_state;
> spin_unlock(&this->chip_lock);
> + if (this->enable)
> + this->enable(mtd);
> break;
> }
> if (new_state == FL_PM_SUSPENDED) {
I put the code the end of function like:
static int onenand_get_device(struct mtd_info *mtd, int new_state)
{
struct onenand_chip *this = mtd->priv;
DECLARE_WAITQUEUE(wait, current);
/*
* Grab the lock and see if the device is available
*/
while (1) {
spin_lock(&this->chip_lock);
if (this->state == FL_READY) {
this->state = new_state;
spin_unlock(&this->chip_lock);
break;
}
if (new_state == FL_PM_SUSPENDED) {
spin_unlock(&this->chip_lock);
return (this->state == FL_PM_SUSPENDED) ? 0 : -EAGAIN;
}
set_current_state(TASK_UNINTERRUPTIBLE);
add_wait_queue(&this->wq, &wait);
spin_unlock(&this->chip_lock);
schedule();
remove_wait_queue(&this->wq, &wait);
}
if (this->clk)
clk_enable(this->clk);
return 0;
}
> @@ -974,6 +976,8 @@ static void onenand_release_device(struct mtd_info *mtd)
> {
> struct onenand_chip *this = mtd->priv;
>
> + if (this->state != FL_PM_SUSPENDED && this->disable)
> + this->disable(mtd);
Need to check the SUSPENDED at here? when enter the suspend get_device
is called.
release device is called when resume. so no need to check
FL_PM_SUSPENDED in my case.
> /* Release the chip */
> spin_lock(&this->chip_lock);
> this->state = FL_READY;
and put the same as like:
static void onenand_release_device(struct mtd_info *mtd)
{
struct onenand_chip *this = mtd->priv;
/* Release the chip */
spin_lock(&this->chip_lock);
this->state = FL_READY;
wake_up(&this->wq);
spin_unlock(&this->chip_lock);
if (this->clk)
clk_disable(this->clk);
}
Thank you,
Kyungmin Park
> diff --git a/include/linux/mtd/onenand.h b/include/linux/mtd/onenand.h
> index 6da3fe3..ae418e4 100644
> --- a/include/linux/mtd/onenand.h
> +++ b/include/linux/mtd/onenand.h
> @@ -118,6 +118,8 @@ struct onenand_chip {
> int (*chip_probe)(struct mtd_info *mtd);
> int (*block_markbad)(struct mtd_info *mtd, loff_t ofs);
> int (*scan_bbt)(struct mtd_info *mtd);
> + int (*enable)(struct mtd_info *mtd);
> + int (*disable)(struct mtd_info *mtd);
>
> struct completion complete;
> int irq;
> --
> 1.7.0.4
>
>
> ______________________________________________________
> Linux MTD discussion mailing list
> http://lists.infradead.org/mailman/listinfo/linux-mtd/
>
More information about the linux-mtd
mailing list