lkml.org 
[lkml]   [2015]   [Sep]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 1/6] mtd: nand: gpmi: add gpmi dsm supend/resume support
    Date
    From: Huang Shijie <b32955@freescale.com>

    i.MX6SX supports deep sleep mode(DSM) that may turn off GPMI/BCH power
    during suspend, add gpmi nand suspend/resume function to release DMA
    channel in suspend function and re-init GPMI/BCH controller during
    resume function.

    Although it is not necessary to restore GPMI/BCH registers value for
    i.MX6QDL, the code doesn't distinguish different platforms to keep the
    code simple.

    Signed-off-by: Huang Shijie <b32955@freescale.com>
    Signed-off-by: Han Xu <han.xu@freescale.com>
    ---
    drivers/mtd/nand/gpmi-nand/gpmi-nand.c | 45 +++++++++++++++++++++++++++++++++-
    1 file changed, 44 insertions(+), 1 deletion(-)

    diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c
    index 1b8f350..dfd0ba1 100644
    --- a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c
    +++ b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c
    @@ -1,7 +1,7 @@
    /*
    * Freescale GPMI NAND Flash Driver
    *
    - * Copyright (C) 2010-2011 Freescale Semiconductor, Inc.
    + * Copyright (C) 2010-2015 Freescale Semiconductor, Inc.
    * Copyright (C) 2008 Embedded Alley Solutions, Inc.
    *
    * This program is free software; you can redistribute it and/or modify
    @@ -2036,9 +2036,52 @@ static int gpmi_nand_remove(struct platform_device *pdev)
    return 0;
    }

    +static int gpmi_pm_suspend(struct device *dev)
    +{
    + struct gpmi_nand_data *this = dev_get_drvdata(dev);
    +
    + release_dma_channels(this);
    + return 0;
    +}
    +
    +static int gpmi_pm_resume(struct device *dev)
    +{
    + struct gpmi_nand_data *this = dev_get_drvdata(dev);
    + int ret;
    +
    + ret = acquire_dma_channels(this);
    + if (ret < 0)
    + return ret;
    +
    + /* re-init the GPMI registers */
    + this->flags &= ~GPMI_TIMING_INIT_OK;
    + ret = gpmi_init(this);
    + if (ret) {
    + dev_err(this->dev, "Error setting GPMI : %d\n", ret);
    + return ret;
    + }
    +
    + /* re-init the BCH registers */
    + ret = bch_set_geometry(this);
    + if (ret) {
    + dev_err(this->dev, "Error setting BCH : %d\n", ret);
    + return ret;
    + }
    +
    + /* re-init others */
    + gpmi_extra_init(this);
    +
    + return 0;
    +}
    +
    +static const struct dev_pm_ops gpmi_pm_ops = {
    + SET_SYSTEM_SLEEP_PM_OPS(gpmi_pm_suspend, gpmi_pm_resume)
    +};
    +
    static struct platform_driver gpmi_nand_driver = {
    .driver = {
    .name = "gpmi-nand",
    + .pm = &gpmi_pm_ops,
    .of_match_table = gpmi_nand_id_table,
    },
    .probe = gpmi_nand_probe,
    --
    1.9.1


    \
     
     \ /
      Last update: 2015-09-10 01:01    [W:3.452 / U:0.100 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site