Thread (17 messages) 17 messages, 4 authors, 2025-03-07

Re: [PATCH 2/7] clk: rockchip: add support for GRF gated clocks

From: Heiko Stuebner <heiko@sntech.de>
Date: 2025-03-05 22:21:38
Also in: linux-clk, linux-devicetree, linux-rockchip, linux-sound, lkml

Hey,

Am Mittwoch, 5. März 2025, 22:24:22 MEZ schrieb Nicolas Frattaroli:
Certain Rockchip SoCs, the RK3576 in particular, have some clocks that
are essentially gated behind an additional GRF write. Downstream uses an
additional entirely separate clock driver that maps over the same
address range as ioc_grf in the DT.

Instead, this implementation introduces a new gate type, GRF gates.
These gates function quite like regular gates. In effect, this means
they'll only be enabled if the clock is used, which I feel is a more
appropriate way to describe this compared to doing it in, say, pinctrl,
or even in the drivers of the respective clock consumers such as SAI.

It should be noted that RK3588 has similar GRF-gated clocks, but has
gotten away with not having to deal with any of this because the clocks
are ungated by the hardware's register reset value by default. The
RK3576 is not so lucky, and the hardware's reset value gates them
instead, which means we'll have to ungate them somewhere.

In order to facilitate the GRF gating on RK3576, we introduce the
concept of auxiliary GRFs. The RK3576 has several defined GRF nodes, and
so far it could get away with just using one for MUXGRF by reassigning
the clock provider's grf member.

However, with the IOC GRF gated clocks, we now also need access to the
IOC GRF, so we can't get away with this anymore. Instead, we add a
hashtable to the clock provider struct, keyed by a grf type enum. The
clock branches can then specify through the use of a new member of that
enum's type (with corresponding changes to relevant macros) which GRF
range they would like to use.

The SoC-specific clk_init can then populate the hashtable with the GRFs
that it needs. This way, GRF-dependent clock branches don't have to be
registered in a different step than everything else, as they would need
to be had I extended the branch struct to instead take a pointer to a
GRF, which isn't available at the time most of our branches are defined.

Signed-off-by: Nicolas Frattaroli <nicolas.frattaroli@collabora.com>
I only did a short look through the patch and didn't see anything
glaringly wrong, but this wants to be at least 3 patches:
- add the handling (hash-table etc) for multiple grfs
  (including adapting the grf-mux)
- adding the grf-gate clock-type
- adding the rk3576 grf-gates


Heiko


Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help