Hi Sascha,

On Wed, Feb 23, 2011 at 08:50:36AM +0100, Sascha Hauer wrote:
> On Tue, Feb 22, 2011 at 06:13:23PM +0800, Richard Zhu wrote:
> > Signed-off-by: Richard Zhao <richard.z...@freescale.com>
> > ---
> >  arch/arm/mach-mx5/clock-mx51-mx53.c |  100 
> > ++++++++++++++++++++++++++++++++++-
> >  arch/arm/mach-mx5/crm_regs.h        |    7 +++
> >  2 files changed, 106 insertions(+), 1 deletions(-)
> > 
> > diff --git a/arch/arm/mach-mx5/clock-mx51-mx53.c 
> > b/arch/arm/mach-mx5/clock-mx51-mx53.c
> > index 8164b1d..2ca97de 100644
> > --- a/arch/arm/mach-mx5/clock-mx51-mx53.c
> > +++ b/arch/arm/mach-mx5/clock-mx51-mx53.c
> > @@ -42,6 +42,9 @@ static struct clk usboh3_clk;
> >  static struct clk emi_fast_clk;
> >  static struct clk ipu_clk;
> >  static struct clk mipi_hsc1_clk;
> > +static struct clk esdhc1_clk;
> > +static struct clk esdhc2_clk;
> > +static struct clk esdhc3_mx53_clk;
> >  
> >  #define MAX_DPLL_WAIT_TRIES        1000 /* 1000 * udelay(1) = 1ms */
> >  
> > @@ -1138,15 +1141,45 @@ static struct clk ecspi_main_clk = {
> >     .set_parent = clk_ecspi_set_parent,
> >  };
> >  
> > +#define SDHC_SET_PARENT_SHORT(name, parent2, bitsname)                     
> > \
> > +static int clk_##name##_set_parent(struct clk *clk, struct clk *parent)    
> > \
> > +{                                                                  \
> > +   u32 reg;                                                        \
> > +                                                                   \
> > +   reg = __raw_readl(MXC_CCM_CSCMR1);                              \
> > +   if (parent == &esdhc1_clk)                                      \
> > +           reg &= ~MXC_CCM_CSCMR1_##bitsname##_CLK_SEL;            \
> > +   else if (parent == &parent2)                                    \
> > +           reg |= MXC_CCM_CSCMR1_##bitsname##_CLK_SEL;             \
> > +   else                                                            \
> > +           return -EINVAL;                                         \
> > +   __raw_writel(reg, MXC_CCM_CSCMR1);                              \
> > +                                                                   \
> > +   return 0;                                                       \
> > +}
> 
> Please don't do this. I should have rejected this kind of stuff for the
> i.MX23/28. This ## stuff looks short in the source code but expands to
> duplicated binary code.
The macro way is widely used in this file. Happy that it'll get re-structure.
> Also it's hard to make changes in such code.
Yes, and not that readable.
> 
> To answer your question about cleaning up the i.MX clock code you asked
> few days ago: Yes, I definitely want to proceed on this once Jeremys
> patches are ready. Then this can become a clock multiplexer consuming
> not much space in both binary and source code.
Looking for that.
> 
> For now I suggest that you just duplicate the code in real functions
> without macro voodoo.
ok. I'll re-send the patch.

Thanks
Richard
> 
> Sascha
> 
> > +
> >  /* eSDHC */
> >  CLK_GET_RATE(esdhc1, 1, ESDHC1_MSHC1)
> >  CLK_SET_PARENT(esdhc1, 1, ESDHC1_MSHC1)
> >  CLK_SET_RATE(esdhc1, 1, ESDHC1_MSHC1)
> >  
> > +/* mx51 specific */
> >  CLK_GET_RATE(esdhc2, 1, ESDHC2_MSHC2)
> >  CLK_SET_PARENT(esdhc2, 1, ESDHC2_MSHC2)
> >  CLK_SET_RATE(esdhc2, 1, ESDHC2_MSHC2)
> >  
> > +SDHC_SET_PARENT_SHORT(esdhc3, esdhc2_clk, ESDHC3)
> > +SDHC_SET_PARENT_SHORT(esdhc4, esdhc2_clk, ESDHC4)
> > +
> > +/* mx53 specific */
> > +SDHC_SET_PARENT_SHORT(esdhc2_mx53, esdhc3_mx53_clk, ESDHC2_MSHC2_MX53)
> > +
> > +CLK_GET_RATE(esdhc3_mx53, 1, ESDHC3_MX53)
> > +CLK_SET_PARENT(esdhc3_mx53, 1, ESDHC3_MX53)
> > +CLK_SET_RATE(esdhc3_mx53, 1, ESDHC3_MX53)
> > +
> > +SDHC_SET_PARENT_SHORT(esdhc4_mx53, esdhc3_mx53_clk, ESDHC4)
> > +
> >  #define DEFINE_CLOCK_FULL(name, i, er, es, gr, sr, e, d, p, s)             
> > \
> >     static struct clk name = {                                      \
> >             .id             = i,                                    \
> > @@ -1251,9 +1284,62 @@ DEFINE_CLOCK_MAX(esdhc1_clk, 0, MXC_CCM_CCGR3, 
> > MXC_CCM_CCGRx_CG1_OFFSET,
> >     clk_esdhc1, &pll2_sw_clk, &esdhc1_ipg_clk);
> >  DEFINE_CLOCK_FULL(esdhc2_ipg_clk, 1, MXC_CCM_CCGR3, 
> > MXC_CCM_CCGRx_CG2_OFFSET,
> >     NULL,  NULL, _clk_max_enable, _clk_max_disable, &ipg_clk, NULL);
> > +DEFINE_CLOCK_FULL(esdhc3_ipg_clk, 2, MXC_CCM_CCGR3, 
> > MXC_CCM_CCGRx_CG4_OFFSET,
> > +   NULL,  NULL, _clk_max_enable, _clk_max_disable, &ipg_clk, NULL);
> > +DEFINE_CLOCK_FULL(esdhc4_ipg_clk, 3, MXC_CCM_CCGR3, 
> > MXC_CCM_CCGRx_CG6_OFFSET,
> > +   NULL,  NULL, _clk_max_enable, _clk_max_disable, &ipg_clk, NULL);
> > +
> > +/* mx51 specific */
> >  DEFINE_CLOCK_MAX(esdhc2_clk, 1, MXC_CCM_CCGR3, MXC_CCM_CCGRx_CG3_OFFSET,
> >     clk_esdhc2, &pll2_sw_clk, &esdhc2_ipg_clk);
> >  
> > +static struct clk esdhc3_clk = {
> > +   .id = 2,
> > +   .parent = &esdhc1_clk,
> > +   .set_parent = clk_esdhc3_set_parent,
> > +   .enable_reg = MXC_CCM_CCGR3,
> > +   .enable_shift = MXC_CCM_CCGRx_CG5_OFFSET,
> > +   .enable  = _clk_max_enable,
> > +   .disable = _clk_max_disable,
> > +   .secondary = &esdhc3_ipg_clk,
> > +};
> > +static struct clk esdhc4_clk = {
> > +   .id = 3,
> > +   .parent = &esdhc1_clk,
> > +   .set_parent = clk_esdhc4_set_parent,
> > +   .enable_reg = MXC_CCM_CCGR3,
> > +   .enable_shift = MXC_CCM_CCGRx_CG7_OFFSET,
> > +   .enable  = _clk_max_enable,
> > +   .disable = _clk_max_disable,
> > +   .secondary = &esdhc4_ipg_clk,
> > +};
> > +
> > +/* mx53 specific */
> > +static struct clk esdhc2_mx53_clk = {
> > +   .id = 2,
> > +   .parent = &esdhc1_clk,
> > +   .set_parent = clk_esdhc2_mx53_set_parent,
> > +   .enable_reg = MXC_CCM_CCGR3,
> > +   .enable_shift = MXC_CCM_CCGRx_CG3_OFFSET,
> > +   .enable  = _clk_max_enable,
> > +   .disable = _clk_max_disable,
> > +   .secondary = &esdhc3_ipg_clk,
> > +};
> > +
> > +DEFINE_CLOCK_MAX(esdhc3_mx53_clk, 2, MXC_CCM_CCGR3, 
> > MXC_CCM_CCGRx_CG5_OFFSET,
> > +   clk_esdhc3_mx53, &pll2_sw_clk, &esdhc2_ipg_clk);
> > +
> > +static struct clk esdhc4_mx53_clk = {
> > +   .id = 3,
> > +   .parent = &esdhc1_clk,
> > +   .set_parent = clk_esdhc4_mx53_set_parent,
> > +   .enable_reg = MXC_CCM_CCGR3,
> > +   .enable_shift = MXC_CCM_CCGRx_CG7_OFFSET,
> > +   .enable  = _clk_max_enable,
> > +   .disable = _clk_max_disable,
> > +   .secondary = &esdhc4_ipg_clk,
> > +};
> > +
> >  DEFINE_CLOCK(mipi_esc_clk, 0, MXC_CCM_CCGR4, MXC_CCM_CCGRx_CG5_OFFSET, 
> > NULL, NULL, NULL, &pll2_sw_clk);
> >  DEFINE_CLOCK(mipi_hsc2_clk, 0, MXC_CCM_CCGR4, MXC_CCM_CCGRx_CG4_OFFSET, 
> > NULL, NULL, &mipi_esc_clk, &pll2_sw_clk);
> >  DEFINE_CLOCK(mipi_hsc1_clk, 0, MXC_CCM_CCGR4, MXC_CCM_CCGRx_CG3_OFFSET, 
> > NULL, NULL, &mipi_hsc2_clk, &pll2_sw_clk);
> > @@ -1312,6 +1398,8 @@ static struct clk_lookup mx51_lookups[] = {
> >     _REGISTER_CLOCK("imx51-cspi.0", NULL, cspi_clk)
> >     _REGISTER_CLOCK("sdhci-esdhc-imx.0", NULL, esdhc1_clk)
> >     _REGISTER_CLOCK("sdhci-esdhc-imx.1", NULL, esdhc2_clk)
> > +   _REGISTER_CLOCK("sdhci-esdhc-imx.2", NULL, esdhc3_clk)
> > +   _REGISTER_CLOCK("sdhci-esdhc-imx.3", NULL, esdhc4_clk)
> >     _REGISTER_CLOCK(NULL, "cpu_clk", cpu_clk)
> >     _REGISTER_CLOCK(NULL, "iim_clk", iim_clk)
> >     _REGISTER_CLOCK("imx2-wdt.0", NULL, dummy_clk)
> > @@ -1332,7 +1420,9 @@ static struct clk_lookup mx53_lookups[] = {
> >     _REGISTER_CLOCK("imx-i2c.0", NULL, i2c1_clk)
> >     _REGISTER_CLOCK("imx-i2c.1", NULL, i2c2_clk)
> >     _REGISTER_CLOCK("sdhci-esdhc-imx.0", NULL, esdhc1_clk)
> > -   _REGISTER_CLOCK("sdhci-esdhc-imx.1", NULL, esdhc2_clk)
> > +   _REGISTER_CLOCK("sdhci-esdhc-imx.1", NULL, esdhc2_mx53_clk)
> > +   _REGISTER_CLOCK("sdhci-esdhc-imx.2", NULL, esdhc3_mx53_clk)
> > +   _REGISTER_CLOCK("sdhci-esdhc-imx.3", NULL, esdhc4_mx53_clk)
> >     _REGISTER_CLOCK("imx53-ecspi.0", NULL, ecspi1_clk)
> >     _REGISTER_CLOCK("imx53-ecspi.1", NULL, ecspi2_clk)
> >     _REGISTER_CLOCK("imx53-cspi.0", NULL, cspi_clk)
> > @@ -1425,6 +1515,14 @@ int __init mx53_clocks_init(unsigned long ckil, 
> > unsigned long osc,
> >     mx53_revision();
> >     clk_disable(&iim_clk);
> >  
> > +   /* Set SDHC parents to be PLL2 */
> > +   clk_set_parent(&esdhc1_clk, &pll2_sw_clk);
> > +   clk_set_parent(&esdhc3_mx53_clk, &pll2_sw_clk);
> > +
> > +   /* set SDHC root clock as 200MHZ*/
> > +   clk_set_rate(&esdhc1_clk, 200000000);
> > +   clk_set_rate(&esdhc3_mx53_clk, 200000000);
> > +
> >     /* System timer */
> >     mxc_timer_init(&gpt_clk, MX53_IO_ADDRESS(MX53_GPT1_BASE_ADDR),
> >             MX53_INT_GPT);
> > diff --git a/arch/arm/mach-mx5/crm_regs.h b/arch/arm/mach-mx5/crm_regs.h
> > index b462c22..87c0c58 100644
> > --- a/arch/arm/mach-mx5/crm_regs.h
> > +++ b/arch/arm/mach-mx5/crm_regs.h
> > @@ -217,9 +217,12 @@
> >  #define MXC_CCM_CSCMR1_ESDHC1_MSHC1_CLK_SEL_OFFSET (20)
> >  #define MXC_CCM_CSCMR1_ESDHC1_MSHC1_CLK_SEL_MASK   (0x3 << 20)
> >  #define MXC_CCM_CSCMR1_ESDHC3_CLK_SEL                      (0x1 << 19)
> > +#define MXC_CCM_CSCMR1_ESDHC2_MSHC2_MX53_CLK_SEL   (0x1 << 19)
> >  #define MXC_CCM_CSCMR1_ESDHC4_CLK_SEL                      (0x1 << 18)
> >  #define MXC_CCM_CSCMR1_ESDHC2_MSHC2_CLK_SEL_OFFSET (16)
> >  #define MXC_CCM_CSCMR1_ESDHC2_MSHC2_CLK_SEL_MASK   (0x3 << 16)
> > +#define MXC_CCM_CSCMR1_ESDHC3_MX53_CLK_SEL_OFFSET  (16)
> > +#define MXC_CCM_CSCMR1_ESDHC3_MX53_CLK_SEL_MASK            (0x3 << 16)
> >  #define MXC_CCM_CSCMR1_SSI1_CLK_SEL_OFFSET         (14)
> >  #define MXC_CCM_CSCMR1_SSI1_CLK_SEL_MASK           (0x3 << 14)
> >  #define MXC_CCM_CSCMR1_SSI2_CLK_SEL_OFFSET         (12)
> > @@ -271,6 +274,10 @@
> >  #define MXC_CCM_CSCDR1_ESDHC2_MSHC2_CLK_PRED_MASK  (0x7 << 22)
> >  #define MXC_CCM_CSCDR1_ESDHC2_MSHC2_CLK_PODF_OFFSET        (19)
> >  #define MXC_CCM_CSCDR1_ESDHC2_MSHC2_CLK_PODF_MASK  (0x7 << 19)
> > +#define MXC_CCM_CSCDR1_ESDHC3_MX53_CLK_PRED_OFFSET (22)
> > +#define MXC_CCM_CSCDR1_ESDHC3_MX53_CLK_PRED_MASK   (0x7 << 22)
> > +#define MXC_CCM_CSCDR1_ESDHC3_MX53_CLK_PODF_OFFSET (19)
> > +#define MXC_CCM_CSCDR1_ESDHC3_MX53_CLK_PODF_MASK   (0x7 << 19)
> >  #define MXC_CCM_CSCDR1_ESDHC1_MSHC1_CLK_PRED_OFFSET        (16)
> >  #define MXC_CCM_CSCDR1_ESDHC1_MSHC1_CLK_PRED_MASK  (0x7 << 16)
> >  #define MXC_CCM_CSCDR1_PGC_CLK_PODF_OFFSET         (14)
> > -- 
> > 1.7.1
> > 
> > 
> > 
> 
> -- 
> Pengutronix e.K.                           |                             |
> Industrial Linux Solutions                 | http://www.pengutronix.de/  |
> Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
> Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |
--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to