summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHuang Shijie <b32955@freescale.com>2010-11-01 10:12:52 +0800
committerScott Sweeny <scott.sweeny@timesys.com>2011-01-19 11:50:18 -0500
commitea9c6bf81ca58ed13d2c1f5c4b7f67b3d1afba9f (patch)
treea5a3d4a0af88e6e8d203608741231da232dbe81e
parent31cb3dae9de68df57cd753e0cea4ff0934b5f3a7 (diff)
ENGR00133178-1 NAND : add set_parent()/set_rate() for GPMI
The ONFI nand need the PLL1 clock, so add the two function to change the bypass clock. add some comments for GPMI clocks too. Signed-off-by: Huang Shijie <b32955@freescale.com>
-rw-r--r--arch/arm/mach-mx5/clock_mx50.c48
-rw-r--r--arch/arm/mach-mx5/crm_regs.h2
2 files changed, 46 insertions, 4 deletions
diff --git a/arch/arm/mach-mx5/clock_mx50.c b/arch/arm/mach-mx5/clock_mx50.c
index f06231ab2a45..d33a42e5db9f 100644
--- a/arch/arm/mach-mx5/clock_mx50.c
+++ b/arch/arm/mach-mx5/clock_mx50.c
@@ -2448,16 +2448,56 @@ static void bch_clk_disable(struct clk *clk)
_clk_disable(clk);
}
+static int gpmi_set_parent(struct clk *clk, struct clk *parent)
+{
+ /* Setting for ONFI nand which need PLL1(800MHZ) */
+ if (parent == &pll1_main_clk) {
+ u32 reg = __raw_readl(MXC_CCM_CLKSEQ_BYPASS);
+
+ reg = (reg & ~MXC_CCM_CLKSEQ_BYPASS_BYPASS_GPMI_CLK_SEL_MASK) |
+ (0x2 << MXC_CCM_CLKSEQ_BYPASS_BYPASS_GPMI_CLK_SEL_OFFSET);
+
+ __raw_writel(reg, MXC_CCM_CLKSEQ_BYPASS);
+
+ /* change to the new Parent */
+ clk->parent = parent;
+ } else
+ printk(KERN_WARNING "You should not call the %s\n", __func__);
+ return 0;
+}
+
+static int gpmi_set_rate(struct clk *clk, unsigned long rate)
+{
+ /* Setting for ONFI nand which in different mode */
+ if (clk->parent == &pll1_main_clk) {
+ u32 value;
+ u32 reg;
+
+ value = clk_get_rate(clk->parent);
+ value /= rate;
+ value /= 2; /* HW_GPMI_CTRL1's GPMI_CLK_DIV2_EN will be set */
+
+ reg = __raw_readl(MXC_CCM_GPMI);
+ reg = (reg & ~MXC_CCM_GPMI_CLK_DIV_MASK) | value;
+
+ __raw_writel(reg, MXC_CCM_GPMI);
+ } else
+ printk(KERN_WARNING "You should not call the %s\n", __func__);
+ return 0;
+}
+
static struct clk gpmi_nfc_clk[] = {
- {
+ { /* gpmi_io_clk */
.parent = &osc_clk,
.secondary = &gpmi_nfc_clk[1],
+ .set_parent = gpmi_set_parent,
+ .set_rate = gpmi_set_rate,
.enable = gpmi_clk_enable,
.enable_reg = MXC_CCM_CCGR7,
.enable_shift = MXC_CCM_CCGRx_CG9_OFFSET,
.disable = gpmi_clk_disable,
},
- {
+ { /* gpmi_apb_clk */
.parent = &ahb_clk,
.secondary = &gpmi_nfc_clk[2],
.enable = _clk_enable,
@@ -2465,7 +2505,7 @@ static struct clk gpmi_nfc_clk[] = {
.enable_shift = MXC_CCM_CCGRx_CG8_OFFSET,
.disable = _clk_disable,
},
- {
+ { /* bch_clk */
.parent = &osc_clk,
.secondary = &gpmi_nfc_clk[3],
.enable = bch_clk_enable,
@@ -2473,7 +2513,7 @@ static struct clk gpmi_nfc_clk[] = {
.enable_shift = MXC_CCM_CCGRx_CG0_OFFSET,
.disable = bch_clk_disable,
},
- {
+ { /* bch_apb_clk */
.parent = &ahb_clk,
.enable = _clk_enable,
.enable_reg = MXC_CCM_CCGR7,
diff --git a/arch/arm/mach-mx5/crm_regs.h b/arch/arm/mach-mx5/crm_regs.h
index 16adf5f0b118..73c4e224c9cb 100644
--- a/arch/arm/mach-mx5/crm_regs.h
+++ b/arch/arm/mach-mx5/crm_regs.h
@@ -681,6 +681,8 @@
#define MXC_CCM_CLKSEQ_BYPASS_BYPASS_ELCDIF_PIX_CLK_SEL_MASK (0x3 << 14)
#define MXC_CCM_CLKSEQ_BYPASS_BYPASS_EPDC_PIX_CLK_SEL_OFFSET 12
#define MXC_CCM_CLKSEQ_BYPASS_BYPASS_EPDC_PIX_CLK_SEL_MASK (0x3 << 12)
+#define MXC_CCM_CLKSEQ_BYPASS_BYPASS_GPMI_CLK_SEL_OFFSET 6
+#define MXC_CCM_CLKSEQ_BYPASS_BYPASS_GPMI_CLK_SEL_MASK (0x3 << 6)
#define MXC_CCM_CLKSEQ_BYPASS_BYPASS_EPDC_AXI_CLK_SEL_OFFSET 4
#define MXC_CCM_CLKSEQ_BYPASS_BYPASS_EPDC_AXI_CLK_SEL_MASK (0x3 << 4)
#define MXC_CCM_CLKSEQ_BYPASS_BYPASS_DISPLAY_AXI_CLK_SEL_OFFSET 2