Message ID | 20170521215958.19743-11-jbrunet@baylibre.com (mailing list archive) |
---|---|
State | Not Applicable |
Headers | show |
On Mon, May 22, 2017 at 12:59 AM, Jerome Brunet <jbrunet@baylibre.com> wrote: > Using clock rate protection, we can now enforce CLK_SET_RATE_GATE along the > clock tree > > Signed-off-by: Jerome Brunet <jbrunet@baylibre.com> > --- > drivers/clk/clk.c | 14 +++++++++++--- > 1 file changed, 11 insertions(+), 3 deletions(-) > > diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c > index 01306191133c..6ee5fc59cf1f 100644 > --- a/drivers/clk/clk.c > +++ b/drivers/clk/clk.c > @@ -491,6 +491,9 @@ static void clk_core_unprepare(struct clk_core *core) > if (WARN_ON(core->prepare_count == 1 && core->flags & CLK_IS_CRITICAL)) > return; > > + if (core->flags & CLK_SET_RATE_GATE) > + clk_core_rate_unprotect(core); ^ function call before declaration (unless i missed something when applying), gets fixed in following patch, but makes this one not compile standalone. drivers/clk/clk.c: In function 'clk_core_unprepare': drivers/clk/clk.c:495:3: error: implicit declaration of function 'clk_core_rate_unprotect' [-Werror=implicit-function-declaration] clk_core_rate_unprotect(core); > + > if (--core->prepare_count > 0) > return; > > @@ -561,6 +564,14 @@ static int clk_core_prepare(struct clk_core *core) > > core->prepare_count++; > > + /* > + * CLK_SET_RATE_GATE is a special case of clock protection > + * Instead of a consumer protection, the provider is protecting > + * itself when prepared > + */ > + if (core->flags & CLK_SET_RATE_GATE) > + clk_core_rate_protect(core); ^ same here; Note: maybe have a quick check that each patch compiles individually (if you haven't already), I did not check them all. > + > return 0; > } > > @@ -1738,9 +1749,6 @@ static int clk_core_set_rate_nolock(struct clk_core *core, > if (clk_core_rate_is_protected(core)) > return -EBUSY; > > - if ((core->flags & CLK_SET_RATE_GATE) && core->prepare_count) > - return -EBUSY; > - > /* calculate new rates and get the topmost changed clock */ > top = clk_calc_new_rates(core, req_rate); > if (!top) > -- > 2.9.4 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-clk" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html
On Tue, 2017-05-23 at 16:42 +0300, Adriana Reus wrote: > On Mon, May 22, 2017 at 12:59 AM, Jerome Brunet <jbrunet@baylibre.com> wrote: > > Using clock rate protection, we can now enforce CLK_SET_RATE_GATE along the > > clock tree > > > > Signed-off-by: Jerome Brunet <jbrunet@baylibre.com> > > --- > > drivers/clk/clk.c | 14 +++++++++++--- > > 1 file changed, 11 insertions(+), 3 deletions(-) > > > > diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c > > index 01306191133c..6ee5fc59cf1f 100644 > > --- a/drivers/clk/clk.c > > +++ b/drivers/clk/clk.c > > @@ -491,6 +491,9 @@ static void clk_core_unprepare(struct clk_core *core) > > if (WARN_ON(core->prepare_count == 1 && core->flags & > > CLK_IS_CRITICAL)) > > return; > > > > + if (core->flags & CLK_SET_RATE_GATE) > > + clk_core_rate_unprotect(core); > > ^ function call before declaration (unless i missed something when applying), > gets fixed in following patch, but makes this one not compile standalone. > You didn't miss anything, I did. It is now fixed > drivers/clk/clk.c: In function 'clk_core_unprepare': > drivers/clk/clk.c:495:3: error: implicit declaration of function > 'clk_core_rate_unprotect' [-Werror=implicit-function-declaration] > clk_core_rate_unprotect(core); > > > + > > if (--core->prepare_count > 0) > > return; > > > > @@ -561,6 +564,14 @@ static int clk_core_prepare(struct clk_core *core) > > > > core->prepare_count++; > > > > + /* > > + * CLK_SET_RATE_GATE is a special case of clock protection > > + * Instead of a consumer protection, the provider is protecting > > + * itself when prepared > > + */ > > + if (core->flags & CLK_SET_RATE_GATE) > > + clk_core_rate_protect(core); > > ^ same here; > Note: maybe have a quick check that each patch compiles individually > (if you haven't already), I did not check them all. I should have. Now it is done and it is OK (with our remarks fixed, of course) Thanks a lot for pointing this out. > > + > > return 0; > > } > > > > @@ -1738,9 +1749,6 @@ static int clk_core_set_rate_nolock(struct clk_core > > *core, > > if (clk_core_rate_is_protected(core)) > > return -EBUSY; > > > > - if ((core->flags & CLK_SET_RATE_GATE) && core->prepare_count) > > - return -EBUSY; > > - > > /* calculate new rates and get the topmost changed clock */ > > top = clk_calc_new_rates(core, req_rate); > > if (!top) > > -- > > 2.9.4 > > > > -- > > To unsubscribe from this list: send the line "unsubscribe linux-clk" in > > the body of a message to majordomo@vger.kernel.org > > More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index 01306191133c..6ee5fc59cf1f 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c @@ -491,6 +491,9 @@ static void clk_core_unprepare(struct clk_core *core) if (WARN_ON(core->prepare_count == 1 && core->flags & CLK_IS_CRITICAL)) return; + if (core->flags & CLK_SET_RATE_GATE) + clk_core_rate_unprotect(core); + if (--core->prepare_count > 0) return; @@ -561,6 +564,14 @@ static int clk_core_prepare(struct clk_core *core) core->prepare_count++; + /* + * CLK_SET_RATE_GATE is a special case of clock protection + * Instead of a consumer protection, the provider is protecting + * itself when prepared + */ + if (core->flags & CLK_SET_RATE_GATE) + clk_core_rate_protect(core); + return 0; } @@ -1738,9 +1749,6 @@ static int clk_core_set_rate_nolock(struct clk_core *core, if (clk_core_rate_is_protected(core)) return -EBUSY; - if ((core->flags & CLK_SET_RATE_GATE) && core->prepare_count) - return -EBUSY; - /* calculate new rates and get the topmost changed clock */ top = clk_calc_new_rates(core, req_rate); if (!top)
Using clock rate protection, we can now enforce CLK_SET_RATE_GATE along the clock tree Signed-off-by: Jerome Brunet <jbrunet@baylibre.com> --- drivers/clk/clk.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-)