From bab53fbf549f19cd40d1a0f243845d069b0e694b Mon Sep 17 00:00:00 2001 From: Huang Shijie Date: Thu, 11 Oct 2012 09:50:13 +0800 Subject: 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 --- drivers/dma/mxs-dma.c | 2 ++ drivers/mtd/nand/gpmi-nand/gpmi-lib.c | 2 +- drivers/mtd/nand/gpmi-nand/gpmi-nand.c | 6 ++++++ drivers/mtd/nand/gpmi-nand/gpmi-nand.h | 2 ++ 4 files changed, 11 insertions(+), 1 deletion(-) (limited to 'drivers') 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 -- cgit v1.2.3