Re: [PATCH] ARM: SAMSUNG: s3c_set_clksrc returns for single parent clock.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Jan 18, 2010 at 01:46:30AM +0000, Ben Dooks wrote:
> On Mon, Jan 18, 2010 at 10:34:29AM +0900, Thomas Abraham wrote:
> > Hi Ben,
> > 
> > On Mon, Jan 18, 2010 at 10:10 AM, Ben Dooks <ben-linux@xxxxxxxxx> wrote:
> > > On Mon, Jan 18, 2010 at 09:38:17AM +0900, Thomas Abraham wrote:
> > >> The function s3c_set_clksrc should return if the clksrc_clk clock has
> > >> only one possible parent clock.
> > >
> > > Does this actually relate to a real bug or is this something that you've
> > > come across whilst reading the code?
> > 
> > This is required in cases where a clock has a divider but no mux. In
> > s3c_register_clksrc function, after the default set of clock
> > operations are assigned, the parent clock set function s3c_set_clksrc
> > is called. For clocks that do not have mux, the call to s3c_set_clksrc
> > is incorrect.
> 
> If you have a look at s3c_set_clksrc() , you will find it already
> checks to see if clk->reg_src.reg is set. It also doesn't call the
> setparent directly either, as it only needs to set clk->clk.parent
> field before exiting.
> 
>    132          u32 clksrc = 0;
>    133  
>    134          if (clk->reg_src.reg)
>    135                  clksrc = __raw_readl(clk->reg_src.reg);
>    136  
>    137          clksrc &= mask;
>    138          clksrc >>= clk->reg_src.shift;
>    139  
>    140          if (clksrc > srcs->nr_sources || !srcs->sources[clksrc]) {
>    141                  printk(KERN_ERR "%s: bad source %d\n",
>    142                         clk->clk.name, clksrc);
>    143                  return;
>    144          }
>    145  
>    146          clk->clk.parent = srcs->sources[clksrc];
> 
> This allows us to do some basic verification that the clksrc's sources
> data is valud (such that srcs->nr_sources at least contains one source
> and that it is not NULL).

>From IRL conversation, it seems the problem is that if we do not
have reg_src.reg set at line 134 then we assume that the clksrc has
a srcs array to check. We should change the regs_src.reg code to
check whether the clk->clk.parent is already set and either return
or print a warnign if it is not set.
  
> > >
> > > From arch/arm/plat-samnsung/clock-clksrc.c:
> > >
> > >   181                          if (!clksrc->reg_div.reg)
> > >   182                                  clksrc->clk.ops = &clksrc_ops_nodiv;
> > >   183                          else if (!clksrc->reg_src.reg)
> > >   184                                  clksrc->clk.ops = &clksrc_ops_nosrc;
> > >   185                          else
> > >   186                                  clksrc->clk.ops = &clksrc_ops;
> > >
> > > So we change the ops dependant on which register(s) we have availalbe.
> > >
> > >> Signed-of-by:  Thomas Abraham <thomas.ab@xxxxxxxxxxx>
> > >> ---
> > >>  arch/arm/plat-samsung/clock-clksrc.c |    5 +++--
> > >>  1 files changed, 3 insertions(+), 2 deletions(-)
> > >>
> > >> diff --git a/arch/arm/plat-samsung/clock-clksrc.c b/arch/arm/plat-samsung/clock-clksrc.c
> > >> index 33c633a..80da4c4 100644
> > >> --- a/arch/arm/plat-samsung/clock-clksrc.c
> > >> +++ b/arch/arm/plat-samsung/clock-clksrc.c
> > >> @@ -131,9 +131,10 @@ void __init_or_cpufreq s3c_set_clksrc(struct clksrc_clk *clk, bool announce)
> > >>       u32 mask = bit_mask(clk->reg_src.shift, clk->reg_src.size);
> > >>       u32 clksrc = 0;
> > >>
> > >> -     if (clk->reg_src.reg)
> > >> -             clksrc = __raw_readl(clk->reg_src.reg);
> > >> +     if (!clk->reg_src.reg)
> > >> +             return;
> > >>
> > >> +     clksrc = __raw_readl(clk->reg_src.reg);
> > >>       clksrc &= mask;
> > >>       clksrc >>= clk->reg_src.shift;
> > >>
> > >> --
> > >> 1.6.3.3
> > >>
> > >
> > > --
> > > --
> > > Ben
> > >
> > > Q:      What's a light-year?
> > > A:      One-third less calories than a regular year.
> > >
> > > --
> > > To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in
> > > the body of a message to majordomo@xxxxxxxxxxxxxxx
> > > More majordomo info at  http://vger.kernel.org/majordomo-info.html
> > >
> > 
> > 
> > Thanks,
> > Thomas.
> > --
> > To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in
> > the body of a message to majordomo@xxxxxxxxxxxxxxx
> > More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
> -- 
> -- 
> Ben
> 
> Q:      What's a light-year?
> A:      One-third less calories than a regular year.
> 

-- 
-- 
Ben

Q:      What's a light-year?
A:      One-third less calories than a regular year.

--
To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux SoC Development]     [Linux Rockchip Development]     [Linux USB Development]     [Video for Linux]     [Linux Audio Users]     [Linux SCSI]     [Yosemite News]

  Powered by Linux