summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorHuang Shijie <b32955@freescale.com>2012-10-11 09:50:13 +0800
committerHuang Shijie <b32955@freescale.com>2012-10-12 09:40:07 +0800
commitbab53fbf549f19cd40d1a0f243845d069b0e694b (patch)
treed5c762b3c98b7d22c487b0cfe77eb57357a82f68 /drivers
parentb0b1cfbdee2165f811f9dc680aae133a89c1f8e4 (diff)
ENGR00227835 imx6q: gpmi: fix the warning when no NAND chip exits
If there is no nand chip in the board, the kernel will prints out the following warning message: ------------[ cut here ]------------ WARNING: at arch/arm/plat-mxc/clock.c:63 clk_disable+0x48/0x90() clock enable/disable mismatch! clk apbh_dma_clk Modules linked in: [<80044f48>] (unwind_backtrace+0x0/0xfc) from [<80070ac0>] (warn_slowpath_common+0x4c/0x64) [<80070ac0>] (warn_slowpath_common+0x4c/0x64) from [<80070b6c>] (warn_slowpath_fmt+0x30/0x40) [<80070b6c>] (warn_slowpath_fmt+0x30/0x40) from [<8005ee60>] (clk_disable+0x48/0x90) [<8005ee60>] (clk_disable+0x48/0x90) from [<80255e48>] (dma_chan_put+0x4c/0x50) [<80255e48>] (dma_chan_put+0x4c/0x50) from [<80255f18>] (dma_release_channel+0x24/0x94) [<80255f18>] (dma_release_channel+0x24/0x94) from [<802ad8ec>] (release_resources+0x58/0x6c) [<802ad8ec>] (release_resources+0x58/0x6c) from [<80445964>] (gpmi_nand_probe+0x44c/0x4ec) [<80445964>] (gpmi_nand_probe+0x44c/0x4ec) from [<80281868>] (platform_drv_probe+0x18/0x1c) [<80281868>] (platform_drv_probe+0x18/0x1c) from [<80280590>] (driver_probe_device+0x98/0x1a4) [<80280590>] (driver_probe_device+0x98/0x1a4) from [<80280728>] (__driver_attach+0x8c/0x90) [<80280728>] (__driver_attach+0x8c/0x90) from [<8027fdd0>] (bus_for_each_dev+0x60/0x8c) [<8027fdd0>] (bus_for_each_dev+0x60/0x8c) from [<8027f75c>] (bus_add_driver+0x184/0x25c) [<8027f75c>] (bus_add_driver+0x184/0x25c) from [<80280d1c>] (driver_register+0x78/0x13c) [<80280d1c>] (driver_register+0x78/0x13c) from [<80022d80>] (gpmi_nand_init+0xc/0x3c) [<80022d80>] (gpmi_nand_init+0xc/0x3c) from [<80039478>] (do_one_initcall+0x30/0x16c) [<80039478>] (do_one_initcall+0x30/0x16c) from [<80008410>] (kernel_init+0x98/0x144) [<80008410>] (kernel_init+0x98/0x144) from [<8003ffb4>] (kernel_thread_exit+0x0/0x8) ---[ end trace c28d32057fe33a29 ]--- This mxs_dma_clk's usecount is not correctly changed which causes the kernel shows this warning. This patch adds proper clk_disable_unprepare/clk_prepare_enable in the mxs-dma driver to balance the mxs_dma_clk's usecount. Also put the mxs_dma_clk when the gpmi exits. Signed-off-by: Huang Shijie <b32955@freescale.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/dma/mxs-dma.c2
-rw-r--r--drivers/mtd/nand/gpmi-nand/gpmi-lib.c2
-rw-r--r--drivers/mtd/nand/gpmi-nand/gpmi-nand.c6
-rw-r--r--drivers/mtd/nand/gpmi-nand/gpmi-nand.h2
4 files changed, 11 insertions, 1 deletions
diff --git a/drivers/dma/mxs-dma.c b/drivers/dma/mxs-dma.c
index 162e6c3eb64d..e604cd7ae384 100644
--- a/drivers/dma/mxs-dma.c
+++ b/drivers/dma/mxs-dma.c
@@ -323,6 +323,7 @@ static int mxs_dma_alloc_chan_resources(struct dma_chan *chan)
/* the descriptor is ready */
async_tx_ack(&mxs_chan->desc);
+ clk_disable_unprepare(mxs_dma->clk);
return 0;
err_clk:
@@ -339,6 +340,7 @@ static void mxs_dma_free_chan_resources(struct dma_chan *chan)
struct mxs_dma_chan *mxs_chan = to_mxs_dma_chan(chan);
struct mxs_dma_engine *mxs_dma = mxs_chan->mxs_dma;
+ clk_prepare_enable(mxs_dma->clk);
mxs_dma_disable_chan(mxs_chan);
free_irq(mxs_chan->chan_irq, mxs_dma);
diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-lib.c b/drivers/mtd/nand/gpmi-nand/gpmi-lib.c
index 01c81faffa4a..2138dcb4f8a4 100644
--- a/drivers/mtd/nand/gpmi-nand/gpmi-lib.c
+++ b/drivers/mtd/nand/gpmi-nand/gpmi-lib.c
@@ -44,7 +44,7 @@ struct timing_threshod timing_default_threshold = {
.max_dll_delay_in_ns = 16,
};
-static struct clk *mxs_dma_clk;
+struct clk *mxs_dma_clk;
static void setup_ddr_timing_onfi(struct gpmi_nand_data *this)
{
diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c
index cc353ce5ae7e..9bd09fc490e5 100644
--- a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c
+++ b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c
@@ -439,6 +439,12 @@ static bool gpmi_dma_filter(struct dma_chan *chan, void *param)
static void release_dma_channels(struct gpmi_nand_data *this)
{
unsigned int i;
+
+ if (mxs_dma_clk) {
+ clk_put(mxs_dma_clk);
+ mxs_dma_clk = NULL;
+ }
+
for (i = 0; i < DMA_CHANS; i++)
if (this->dma_chans[i]) {
dma_release_channel(this->dma_chans[i]);
diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-nand.h b/drivers/mtd/nand/gpmi-nand/gpmi-nand.h
index 21e1f6569211..77d0d273a297 100644
--- a/drivers/mtd/nand/gpmi-nand/gpmi-nand.h
+++ b/drivers/mtd/nand/gpmi-nand/gpmi-nand.h
@@ -290,4 +290,6 @@ extern int gpmi_read_page(struct gpmi_nand_data *,
#define GPMI_IS_MX23(x) ((x)->pdev->id_entry->driver_data == IS_MX23)
#define GPMI_IS_MX28(x) ((x)->pdev->id_entry->driver_data == IS_MX28)
#define GPMI_IS_MX6Q(x) ((x)->pdev->id_entry->driver_data == IS_MX6Q)
+
+extern struct clk *mxs_dma_clk;
#endif