Re: [PATCH v9 01/23] clk: rk3568: Mark hclk_vo as critical

Robin Murphy
2022-04-06T11:15:42Z

On 2022-03-28 16:10, Sascha Hauer wrote:
> Whenever pclk_vo is enabled hclk_vo must be enabled as well. This is
> described in the Reference Manual as:
>
> | 2.8.6 NIU Clock gating reliance
> |
> | A part of niu clocks have a dependence on another niu clock in order to
> | sharing the internal bus. When these clocks are in use, another niu
> | clock must be opened, and cannot be gated. These clocks and the special
> | clock on which they are relied are as following:
> |
> | Clocks which have dependency The clock which can not be gated
> | -----------------------------------------------------------------
> | ...
> | pclk_vo_niu, hclk_vo_s_niu hclk_vo_niu
> | ...
>
> The clock framework doesn't offer a way to enable clock B whenever clock A is
> enabled, at least not when B is not an ancestor of A. Workaround this by
> marking hclk_vo as critical so it is never disabled. This is suboptimal in
> terms of power consumption, but a stop gap solution until the clock framework
> has a way to deal with this.
>
> We have this clock tree:
>
> | aclk_vo 2 2 0 300000000 0 0 50000 Y
> | aclk_hdcp 0 0 0 300000000 0 0 50000 N
> | pclk_vo 2 3 0 75000000 0 0 50000 Y
> | pclk_edp_ctrl 0 0 0 75000000 0 0 50000 N
> | pclk_dsitx_1 0 0 0 75000000 0 0 50000 N
> | pclk_dsitx_0 1 2 0 75000000 0 0 50000 Y
> | pclk_hdmi_host 1 2 0 75000000 0 0 50000 Y
> | pclk_hdcp 0 0 0 75000000 0 0 50000 N
> | hclk_vo 2 5 0 150000000 0 0 50000 Y
> | hclk_hdcp 0 0 0 150000000 0 0 50000 N
> | hclk_vop 0 2 0 150000000 0 0 50000 N
>
> Without this patch the edp, dsitx, hdmi and hdcp driver would enable their
> clocks which then enables pclk_vo, but hclk_vo stays disabled and register
> accesses just hang. hclk_vo is enabled by the VOP2 driver, so reproducibility
> of this issue depends on the probe order.

FWIW,

Reviewed-by: Robin Murphy <robin.murphy@arm.com>

> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
> ---
>
> Notes:
> Changes since v8:
> - new patch
>
> drivers/clk/rockchip/clk-rk3568.c | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/drivers/clk/rockchip/clk-rk3568.c b/drivers/clk/rockchip/clk-rk3568.c
> index 63dfbeeeb06d9..62694d95173ab 100644
> --- a/drivers/clk/rockchip/clk-rk3568.c
> +++ b/drivers/clk/rockchip/clk-rk3568.c
> @@ -1591,6 +1591,7 @@ static const char *const rk3568_cru_critical_clocks[] __initconst = {
> "hclk_php",
> "pclk_php",
> "hclk_usb",
> + "hclk_vo",
> };
>
> static const char *const rk3568_pmucru_critical_clocks[] __initconst = {