On 10/4/20 9:34 PM, Luc Michel wrote: > On 16:42 Fri 02 Oct , Philippe Mathieu-Daudé wrote: >> On 9/25/20 12:17 PM, Luc Michel wrote: >>> The clock multiplexers are the last clock stage in the cprman. Each mux >>> outputs one clock signal that goes out of the cprman to the SoC >>> peripherals. >>> >>> Each mux has at most 10 sources. The sources 0 to 3 are common to all >>> muxes. They are: >>> 0. ground (no clock signal) >>> 1. the main oscillator (xosc) >>> 2. "test debug 0" clock >>> 3. "test debug 1" clock >>> >>> Test debug 0 and 1 are actual clock muxes that can be used as sources to >>> other muxes (for debug purpose). >>> >>> Sources 4 to 9 are mux specific and can be unpopulated (grounded). Those >>> sources are fed by the PLL channels outputs. >>> >>> One corner case exists for DSI0E and DSI0P muxes. They have their source >>> number 4 connected to an intermediate multiplexer that can select >>> between PLLA-DSI0 and PLLD-DSI0 channel. This multiplexer is called >>> DSI0HSCK and is not a clock mux as such. It is really a simple mux from >>> the hardware point of view (see https://elinux.org/The_Undocumented_Pi). >>> This mux is not implemented in this commit. >>> >>> Note that there is some muxes for which sources are unknown (because of >>> a lack of documentation). For those cases all the sources are connected >>> to ground in this implementation. >>> >>> Each clock mux output is exported by the cprman at the qdev level, >>> adding the suffix '-out' to the mux name to form the output clock name. >>> (E.g. the 'uart' mux sees its output exported as 'uart-out' at the >>> cprman level.) >>> >>> Signed-off-by: Luc Michel <l...@lmichel.fr> >>> --- >>> include/hw/misc/bcm2835_cprman.h | 84 ++++ >>> include/hw/misc/bcm2835_cprman_internals.h | 421 +++++++++++++++++++++ >>> hw/misc/bcm2835_cprman.c | 151 ++++++++ >>> 3 files changed, 656 insertions(+) >>> >>> diff --git a/include/hw/misc/bcm2835_cprman.h >>> b/include/hw/misc/bcm2835_cprman.h >>> index aaf15fb20c..c2a89e8e90 100644 >>> --- a/include/hw/misc/bcm2835_cprman.h >>> +++ b/include/hw/misc/bcm2835_cprman.h >>> @@ -52,12 +52,73 @@ typedef enum CprmanPLLChannel { >>> CPRMAN_PLLH_CHANNEL_PIX, >>> >>> CPRMAN_PLLB_CHANNEL_ARM, >>> >>> CPRMAN_NUM_PLL_CHANNEL, >>> + >>> + /* Special values used when connecting clock sources to clocks */ >>> + CPRMAN_CLOCK_SRC_NORMAL = -1, >>> + CPRMAN_CLOCK_SRC_FORCE_GROUND = -2, >>> + CPRMAN_CLOCK_SRC_DSI0HSCK = -3, >> >> Why not use CPRMAN_NORMAL_CHANNEL, >> CPRMAN_FORCED_GROUND_CHANNEL and CPRMAN_DSI0HSCK_CHANNEL? > Well, those are special values used when connecting the clock sources to > the muxes in connect_mux_sources(). They are not channels hence the > name. To keep the code simple, I reused the CprmanPLLChannel type for > mux sources (it is used in bcm2835_cprman_internals.h to describe what > source connects to what mux input). > > Ideally this type should be named something like ClockMuxSources (and > CprmanPLLChannel should be a sub-set of this type). But doing so > complicates the code quite a bit so I chose to simply have those three > constants here instead.
Understood, OK.