clk: rockchip: add critical clock for rk3368
diff mbox

Message ID 5267432.TORlj1Iv40@diego
State New
Headers show

Commit Message

Heiko Stübner Sept. 13, 2015, 11:20 a.m. UTC
Again a result of the gpio-clock-liberation the rk3368 needs the
pclk_pd_pmu marked as critical, to boot successfully.

Reported-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
---
should go on top of clk-fixes. Sorry only finding these piece
by piece :-) .

 drivers/clk/rockchip/clk-rk3368.c | 6 ++++++
 1 file changed, 6 insertions(+)

Comments

Mark Rutland Sept. 14, 2015, 2:19 p.m. UTC | #1
On Sun, Sep 13, 2015 at 12:20:36PM +0100, Heiko Stübner wrote:
> Again a result of the gpio-clock-liberation the rk3368 needs the
> pclk_pd_pmu marked as critical, to boot successfully.
> 
> Reported-by: Mark Rutland <mark.rutland@arm.com>
> Signed-off-by: Heiko Stuebner <heiko@sntech.de>

FWIW: Tested-by: Mark Rutland <mark.rutland@arm.com>

I'm surprised that we don't describe these as critical in the DT, given
that this isn't really an internal property of the clock controller, but
rather what happens to be attached to it. That ship appears to have
sailed, however.

Thanks,
Mark.

> ---
> should go on top of clk-fixes. Sorry only finding these piece
> by piece :-) .
> 
>  drivers/clk/rockchip/clk-rk3368.c | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/drivers/clk/rockchip/clk-rk3368.c b/drivers/clk/rockchip/clk-rk3368.c
> index 9c5d61e..7e6b783 100644
> --- a/drivers/clk/rockchip/clk-rk3368.c
> +++ b/drivers/clk/rockchip/clk-rk3368.c
> @@ -818,6 +818,10 @@ static struct rockchip_clk_branch rk3368_clk_branches[] __initdata = {
>  	GATE(0, "sclk_timer00", "xin24m", CLK_IGNORE_UNUSED, RK3368_CLKGATE_CON(24), 0, GFLAGS),
>  };
>  
> +static const char *const rk3368_critical_clocks[] __initconst = {
> +	"pclk_pd_pmu",
> +};
> +
>  static void __init rk3368_clk_init(struct device_node *np)
>  {
>  	void __iomem *reg_base;
> @@ -862,6 +866,8 @@ static void __init rk3368_clk_init(struct device_node *np)
>  				   RK3368_GRF_SOC_STATUS0);
>  	rockchip_clk_register_branches(rk3368_clk_branches,
>  				  ARRAY_SIZE(rk3368_clk_branches));
> +	rockchip_clk_protect_critical(rk3368_critical_clocks,
> +				      ARRAY_SIZE(rk3368_critical_clocks));
>  
>  	rockchip_clk_register_armclk(ARMCLKB, "armclkb",
>  			mux_armclkb_p, ARRAY_SIZE(mux_armclkb_p),
> -- 
> 2.5.1
> 
>
Heiko Stübner Sept. 14, 2015, 3:06 p.m. UTC | #2
Am Montag, 14. September 2015, 15:19:21 schrieb Mark Rutland:
> On Sun, Sep 13, 2015 at 12:20:36PM +0100, Heiko Stübner wrote:
> > Again a result of the gpio-clock-liberation the rk3368 needs the
> > pclk_pd_pmu marked as critical, to boot successfully.
> > 
> > Reported-by: Mark Rutland <mark.rutland@arm.com>
> > Signed-off-by: Heiko Stuebner <heiko@sntech.de>
> 
> FWIW: Tested-by: Mark Rutland <mark.rutland@arm.com>
> 
> I'm surprised that we don't describe these as critical in the DT, given
> that this isn't really an internal property of the clock controller, but
> rather what happens to be attached to it. That ship appears to have
> sailed, however.

I wouldn't necessarily think so ... what is called critical only means "don't 
turn off when walking the clock-tree upwards".

The pclk_pd_pmu for example simply supplies some more clocks we don't handle 
at all currently (pclk_pmu_noc, ...). That we currently choose to ignore those 
[because we don't have any code nor dt-bindings to handle the components 
supplied] sounds very much like an implementation-specific detail, not 
something about the hardware.

I really like the concept of critical clock handling Mike is working on, which 
implements some sort of hand-off and keeps so marked clocks on until a real 
components picks them up.
Mark Rutland Sept. 14, 2015, 3:19 p.m. UTC | #3
On Mon, Sep 14, 2015 at 04:06:05PM +0100, Heiko Stübner wrote:
> Am Montag, 14. September 2015, 15:19:21 schrieb Mark Rutland:
> > On Sun, Sep 13, 2015 at 12:20:36PM +0100, Heiko Stübner wrote:
> > > Again a result of the gpio-clock-liberation the rk3368 needs the
> > > pclk_pd_pmu marked as critical, to boot successfully.
> > > 
> > > Reported-by: Mark Rutland <mark.rutland@arm.com>
> > > Signed-off-by: Heiko Stuebner <heiko@sntech.de>
> > 
> > FWIW: Tested-by: Mark Rutland <mark.rutland@arm.com>
> > 
> > I'm surprised that we don't describe these as critical in the DT, given
> > that this isn't really an internal property of the clock controller, but
> > rather what happens to be attached to it. That ship appears to have
> > sailed, however.
> 
> I wouldn't necessarily think so ... what is called critical only means "don't 
> turn off when walking the clock-tree upwards".
> 
> The pclk_pd_pmu for example simply supplies some more clocks we don't handle 
> at all currently (pclk_pmu_noc, ...). That we currently choose to ignore those 
> [because we don't have any code nor dt-bindings to handle the components 
> supplied] sounds very much like an implementation-specific detail, not 
> something about the hardware.

Sure, but the specific case that lead to this report was the fact that
this clock (directly?) feeds the pinctrl programming interface, and that
fact is neither described in the DT nor handled by the driver. Surely
that should be described and handled?

Thanks,
Mark.
Heiko Stübner Sept. 14, 2015, 3:24 p.m. UTC | #4
Am Montag, 14. September 2015, 16:19:42 schrieb Mark Rutland:
> On Mon, Sep 14, 2015 at 04:06:05PM +0100, Heiko Stübner wrote:
> > Am Montag, 14. September 2015, 15:19:21 schrieb Mark Rutland:
> > > On Sun, Sep 13, 2015 at 12:20:36PM +0100, Heiko Stübner wrote:
> > > > Again a result of the gpio-clock-liberation the rk3368 needs the
> > > > pclk_pd_pmu marked as critical, to boot successfully.
> > > > 
> > > > Reported-by: Mark Rutland <mark.rutland@arm.com>
> > > > Signed-off-by: Heiko Stuebner <heiko@sntech.de>
> > > 
> > > FWIW: Tested-by: Mark Rutland <mark.rutland@arm.com>
> > > 
> > > I'm surprised that we don't describe these as critical in the DT, given
> > > that this isn't really an internal property of the clock controller, but
> > > rather what happens to be attached to it. That ship appears to have
> > > sailed, however.
> > 
> > I wouldn't necessarily think so ... what is called critical only means
> > "don't turn off when walking the clock-tree upwards".
> > 
> > The pclk_pd_pmu for example simply supplies some more clocks we don't
> > handle at all currently (pclk_pmu_noc, ...). That we currently choose to
> > ignore those [because we don't have any code nor dt-bindings to handle
> > the components supplied] sounds very much like an implementation-specific
> > detail, not something about the hardware.
> 
> Sure, but the specific case that lead to this report was the fact that
> this clock (directly?) feeds the pinctrl programming interface, and that
> fact is neither described in the DT nor handled by the driver. Surely
> that should be described and handled?

nope it doesn't :-) pclk_pd_pmu feeds pclk_gpio0.

Before the pinctrl patch, pclk_gpio0 was just statically on all the time, now 
it gets turned off when bank0 is not in use (between reads/writes and if no 
interrupts are enabled). This in turn makes the clock framework turn off 
pclk_pd_pmu (and thus its other unhandled child-clocks).
Stephen Boyd Sept. 14, 2015, 7:49 p.m. UTC | #5
On 09/13, Heiko Stübner wrote:
> Again a result of the gpio-clock-liberation the rk3368 needs the
> pclk_pd_pmu marked as critical, to boot successfully.
> 
> Reported-by: Mark Rutland <mark.rutland@arm.com>
> Signed-off-by: Heiko Stuebner <heiko@sntech.de>
> ---

Applied to clk-fixes

Patch
diff mbox

diff --git a/drivers/clk/rockchip/clk-rk3368.c b/drivers/clk/rockchip/clk-rk3368.c
index 9c5d61e..7e6b783 100644
--- a/drivers/clk/rockchip/clk-rk3368.c
+++ b/drivers/clk/rockchip/clk-rk3368.c
@@ -818,6 +818,10 @@  static struct rockchip_clk_branch rk3368_clk_branches[] __initdata = {
 	GATE(0, "sclk_timer00", "xin24m", CLK_IGNORE_UNUSED, RK3368_CLKGATE_CON(24), 0, GFLAGS),
 };
 
+static const char *const rk3368_critical_clocks[] __initconst = {
+	"pclk_pd_pmu",
+};
+
 static void __init rk3368_clk_init(struct device_node *np)
 {
 	void __iomem *reg_base;
@@ -862,6 +866,8 @@  static void __init rk3368_clk_init(struct device_node *np)
 				   RK3368_GRF_SOC_STATUS0);
 	rockchip_clk_register_branches(rk3368_clk_branches,
 				  ARRAY_SIZE(rk3368_clk_branches));
+	rockchip_clk_protect_critical(rk3368_critical_clocks,
+				      ARRAY_SIZE(rk3368_critical_clocks));
 
 	rockchip_clk_register_armclk(ARMCLKB, "armclkb",
 			mux_armclkb_p, ARRAY_SIZE(mux_armclkb_p),