On 3/28/22 18: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. > > Signed-off-by: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx> > --- > > 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 = { Nice! That's much better than the DT hacks, IMO, thank you. Reviewed-by: Dmitry Osipenko <dmitry.osipenko@xxxxxxxxxxxxx>