2010/7/22 Nori, Sekhar <nsek...@ti.com>

> Hi Raffaele,
>
> On Wed, Jul 21, 2010 at 16:21:49, Raffaele Recalcati wrote:
> > From: Davide Bonfanti <davide.bonfa...@bticino.it>
> >
> >     Clockout2 is added as a child of pll1_sysclk9, because they have
> >     the same pll divisor.
> >     Added dm365_clkout2_set_rate to properly set clockout2 frequency.
>
> >     Modified the davinci_set_sysclk_rate function in order
> >     to get the right ancestor.
>
> This change should be carved into a separate patch since
> it is not directly related to adding clockout2 support.
>

ok, it will be done


>
> In the new patch please describe how the existing code isn't
> getting the right ancestor.
>

now it is not more needed.
there was a mistake in the call.


>
> Also, that patch should note below the '---' that it depends
> on this patch submitted to the mailing list:
>
> https://patchwork.kernel.org/patch/112994/
>
> This helps maintainer derive the correct order in which patches
> need to be applied.
>

> >
> >     This patch has been developed against the
> >
> http://git.kernel.org/pub/scm/linux/kernel/git/khilman/linux-davinci.git
>
> As, mentioned before, this is implied when submitting to
> davinci-linux-open-source@linux.davincidsp.com and so can
> be removed. If you want to note it, please note below the
> '---' in the patch so it wont make it to the commit log.
>

ok,thx


> >     git tree and tested on bmx board.
> >
> > Signed-off-by: Davide Bonfanti <davide.bonfa...@bticino.it>
> > Signed-off-by: Raffaele Recalcati <raffaele.recalc...@bticino.it>
> > ---
> >  arch/arm/mach-davinci/clock.c              |   32 ++++++++++++----
> >  arch/arm/mach-davinci/clock.h              |    5 ++
> >  arch/arm/mach-davinci/dm365.c              |   57
> ++++++++++++++++++++++++++++
> >  arch/arm/mach-davinci/include/mach/dm365.h |    1 +
> >  4 files changed, 87 insertions(+), 8 deletions(-)
> >
> > diff --git a/arch/arm/mach-davinci/clock.c
> b/arch/arm/mach-davinci/clock.c
> > index f29a526..6e45808 100644
> > --- a/arch/arm/mach-davinci/clock.c
> > +++ b/arch/arm/mach-davinci/clock.c
> > @@ -254,7 +254,15 @@ static unsigned long clk_sysclk_recalc(struct clk
> *clk)
> >       u32 v, plldiv;
> >       struct pll_data *pll;
> >       unsigned long rate = clk->rate;
> > +     struct clk *parent = clk;
> >
> > +     if (clk == NULL || IS_ERR(clk))
> > +             return -EINVAL;
> > +     while (parent->parent->parent)
> > +             parent = parent->parent;
> > +
> > +     if (parent == clk)
> > +             return -EPERM;
>
> It is not clear to me why this change in needed. It is not
> described in the patch description as well. Most likely this
> needs to be carved into a separate patch as well describing
> what is wrong with the existing clk_sysclk_recalc() routine.
>


now, whith the last check, we don't need that modifications, but only

        /* Otherwise, the parent must be a PLL */
-       if (WARN_ON(!parent->pll_data))
+       if (!clk->parent->pll_data)

clkout2 is a sub-divider and so its parent is not a pll.


>
> [...]
>
> > @@ -293,26 +301,33 @@ int davinci_set_sysclk_rate(struct clk *clk,
> unsigned long rate)
> >       struct pll_data *pll;
> >       unsigned long input;
> >       unsigned ratio = 0;
> > +     struct clk *parent = clk;
> > +
> > +     /* searching the right ancestor (pll1_clk or pll2_clk) */
> > +     while (parent->parent->parent)
> > +             parent = parent->parent;
> > +     if (parent == clk)
> > +             return -EPERM;
>
> As noted above, please carve into separate patch.
>

ok


>
> [...]
>
> > diff --git a/arch/arm/mach-davinci/clock.h
> b/arch/arm/mach-davinci/clock.h
> > index a717d98..df36d73 100644
> > --- a/arch/arm/mach-davinci/clock.h
> > +++ b/arch/arm/mach-davinci/clock.h
> > @@ -50,6 +50,11 @@
> >  #define PLLDIV_EN       BIT(15)
> >  #define PLLDIV_RATIO_MASK 0x1f
> >
> > +#define PERI_CLKCTL  0x48
> > +#define CLOCKOUT2EN  2
> > +#define CLOCKOUT1EN  1
> > +#define CLOCKOUT0EN  0
> > +
> >  /*
> >   * OMAP-L138 system reference guide recommends a wait for 4 OSCIN/CLKIN
> >   * cycles to ensure that the PLLC has switched to bypass mode. Delay of
> 1us
> > diff --git a/arch/arm/mach-davinci/dm365.c
> b/arch/arm/mach-davinci/dm365.c
> > index 42fd4a4..902e9a0 100644
> > --- a/arch/arm/mach-davinci/dm365.c
> > +++ b/arch/arm/mach-davinci/dm365.c
> > @@ -40,6 +40,11 @@
> >  #include "mux.h"
> >
> >  #define DM365_REF_FREQ               24000000        /* 24 MHz on the
> DM365 EVM */
> > +#define PINMUX0              0x00
> > +#define PINMUX1              0x04
> > +#define PINMUX2              0x08
> > +#define PINMUX3              0x0c
> > +#define PINMUX4              0x10
>
> Why are PINMUX defines added here? You don't seem to use
> these elsewhere in the patch.
>

deleting ...


>
> >
> >  static struct pll_data pll1_data = {
> >       .num            = 1,
> > @@ -124,6 +129,7 @@ static struct clk pll1_sysclk6 = {
> >       .parent         = &pll1_clk,
> >       .flags          = CLK_PLL,
> >       .div_reg        = PLLDIV6,
> > +     .set_rate       = davinci_set_sysclk_rate,
> >  };
> >
> >  static struct clk pll1_sysclk7 = {
> > @@ -145,6 +151,14 @@ static struct clk pll1_sysclk9 = {
> >       .parent         = &pll1_clk,
> >       .flags          = CLK_PLL,
> >       .div_reg        = PLLDIV9,
> > +     .set_rate       = davinci_set_sysclk_rate,
> > +};
> > +
> > +static struct clk clkout2_clk = {
> > +     .name           = "clkout2",
> > +     .parent         = &pll1_sysclk9,
> > +     .flags          = CLK_PLL,
> > +     .set_rate       = dm365_clkout2_set_rate,
> >  };
> >
> >  static struct clk pll2_clk = {
> > @@ -421,6 +435,7 @@ static struct clk_lookup dm365_clks[] = {
> >       CLK(NULL, "pll1_sysclk7", &pll1_sysclk7),
> >       CLK(NULL, "pll1_sysclk8", &pll1_sysclk8),
> >       CLK(NULL, "pll1_sysclk9", &pll1_sysclk9),
> > +     CLK(NULL, "clkout2", &clkout2_clk),
> >       CLK(NULL, "pll2", &pll2_clk),
> >       CLK(NULL, "pll2_aux", &pll2_aux_clk),
> >       CLK(NULL, "clkout1", &clkout1_clk),
> > @@ -657,6 +672,48 @@ static struct resource dm365_spi0_resources[] = {
> >       },
> >  };
> >
> > +int dm365_clkout2_set_rate(unsigned long rate)
>
> Is clockout2 specific to DM365? DM355/DM6446 manuals mention
> clkout signal as well. If this routine can cater to more SoCs
> with simple modifications, you can attempt to generalize it.
>

we check in dm355 and clkout2 is really a different clock.
it seems difficult to integrate.
we'd prefer not to do it.


>
> > +{
> > +     int ret = -EINVAL;
> > +     int i, err, min_err, i_min_err;
> > +     u32 regval;
> > +     struct clk *clk;
> > +     static void __iomem *system_module_base;
> > +
> > +     clk = &clkout2_clk;
> > +     system_module_base = ioremap(DAVINCI_SYSTEM_MODULE_BASE, SZ_4K);
> > +     regval = __raw_readl(system_module_base + PERI_CLKCTL);
>
> This part of the code would make it specific to DM365. May be
> the div_reg present in clock structure can be used to pass this
> register address from platform file? It will then be a matter of
> seeing whether the register bit definitions line up across
> platforms.
>
> You don't have to necessarily test on all platforms as long as
> the code is written generically enough.
>

yes,
but again we have not so a deep davinci knowledge to write code without
testing it.


>
> > +
> > +     /* check all possibilities to get best fitting for the required
> freq */
> > +     i_min_err = min_err = INT_MAX;
> > +     for (i = 0x0F; i > 0; i--) {
> > +             if (clk->parent->set_rate) {
> > +                     ret = clk_set_rate(clk->parent, rate * i) ;
> > +                     err = clk_get_rate(clk->parent) - rate * i;
> > +                     if (min_err > abs(err)) {
> > +                             min_err = abs(err);
> > +                             i_min_err = i;
> > +                     }
> > +             }
> > +     }
>
> Why should the child touch the parent's clock output? Users of the
> clock framework should be able to set these rates independently.
>

right.
we tried.
the problem is that the clkout2 is used for uda1345 system clock.
without chenig the parent we can't get close.
the sound is really too fast.


>
> Can you please check if there is a need to do this even with the
> latest patch I posted? In that patch, if the 'maxrate' the sysclk
> can support is known, the sysclk rate set code using DIV_ROUND_CLOSEST()
> which should give the least error already.
>

yes.
in our application we need to change pll1_sysclk9.
we can't find another possibility.
an idea should be to "occupy", if possible, the pll1_sysclk9 only for our
goal,
so other drivers can't discover a wrong clock after our call.



>
> Thanks,
> Sekhar
>
>

Tomorrow, if you agree, I'll send you 2 patches:
-patch1:  clkout2
-patch2:  removing warn from sysclk recalc

Please let me know how to proceed.
Raffaele
_______________________________________________
Davinci-linux-open-source mailing list
Davinci-linux-open-source@linux.davincidsp.com
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source

Reply via email to