xref: /linux/Documentation/devicetree/bindings/clock/mediatek,mt8196-sys-clock.yaml (revision 522ba450b56fff29f868b1552bdc2965f55de7ed)
1*dd240e95SLaura Nao# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
2*dd240e95SLaura Nao%YAML 1.2
3*dd240e95SLaura Nao---
4*dd240e95SLaura Nao$id: http://devicetree.org/schemas/clock/mediatek,mt8196-sys-clock.yaml#
5*dd240e95SLaura Nao$schema: http://devicetree.org/meta-schemas/core.yaml#
6*dd240e95SLaura Nao
7*dd240e95SLaura Naotitle: MediaTek System Clock Controller for MT8196
8*dd240e95SLaura Nao
9*dd240e95SLaura Naomaintainers:
10*dd240e95SLaura Nao  - Guangjie Song <guangjie.song@mediatek.com>
11*dd240e95SLaura Nao  - Laura Nao <laura.nao@collabora.com>
12*dd240e95SLaura Nao
13*dd240e95SLaura Naodescription: |
14*dd240e95SLaura Nao  The clock architecture in MediaTek SoCs is structured like below:
15*dd240e95SLaura Nao  PLLs -->
16*dd240e95SLaura Nao          dividers -->
17*dd240e95SLaura Nao                      muxes
18*dd240e95SLaura Nao                           -->
19*dd240e95SLaura Nao                              clock gate
20*dd240e95SLaura Nao
21*dd240e95SLaura Nao  The apmixedsys, apmixedsys_gp2, vlpckgen, armpll, ccipll, mfgpll and ptppll
22*dd240e95SLaura Nao  provide most of the PLLs which are generated from the SoC's 26MHZ crystal oscillator.
23*dd240e95SLaura Nao  The topckgen, topckgen_gp2 and vlpckgen provide dividers and muxes which
24*dd240e95SLaura Nao  provide the clock source to other IP blocks.
25*dd240e95SLaura Nao
26*dd240e95SLaura Naoproperties:
27*dd240e95SLaura Nao  compatible:
28*dd240e95SLaura Nao    items:
29*dd240e95SLaura Nao      - enum:
30*dd240e95SLaura Nao          - mediatek,mt8196-apmixedsys
31*dd240e95SLaura Nao          - mediatek,mt8196-armpll-b-pll-ctrl
32*dd240e95SLaura Nao          - mediatek,mt8196-armpll-bl-pll-ctrl
33*dd240e95SLaura Nao          - mediatek,mt8196-armpll-ll-pll-ctrl
34*dd240e95SLaura Nao          - mediatek,mt8196-apmixedsys-gp2
35*dd240e95SLaura Nao          - mediatek,mt8196-ccipll-pll-ctrl
36*dd240e95SLaura Nao          - mediatek,mt8196-mfgpll-pll-ctrl
37*dd240e95SLaura Nao          - mediatek,mt8196-mfgpll-sc0-pll-ctrl
38*dd240e95SLaura Nao          - mediatek,mt8196-mfgpll-sc1-pll-ctrl
39*dd240e95SLaura Nao          - mediatek,mt8196-ptppll-pll-ctrl
40*dd240e95SLaura Nao          - mediatek,mt8196-topckgen
41*dd240e95SLaura Nao          - mediatek,mt8196-topckgen-gp2
42*dd240e95SLaura Nao          - mediatek,mt8196-vlpckgen
43*dd240e95SLaura Nao      - const: syscon
44*dd240e95SLaura Nao
45*dd240e95SLaura Nao  reg:
46*dd240e95SLaura Nao    maxItems: 1
47*dd240e95SLaura Nao
48*dd240e95SLaura Nao  '#clock-cells':
49*dd240e95SLaura Nao    const: 1
50*dd240e95SLaura Nao
51*dd240e95SLaura Nao  mediatek,hardware-voter:
52*dd240e95SLaura Nao    $ref: /schemas/types.yaml#/definitions/phandle
53*dd240e95SLaura Nao    description: |
54*dd240e95SLaura Nao      Phandle to the "Hardware Voter" (HWV), as named in the vendor
55*dd240e95SLaura Nao      documentation for MT8196/MT6991.
56*dd240e95SLaura Nao
57*dd240e95SLaura Nao      The HWV is a SoC-internal fixed-function MCU used to collect votes from
58*dd240e95SLaura Nao      both the Application Processor and other remote processors within the SoC.
59*dd240e95SLaura Nao      It is intended to transparently enable or disable hardware resources (such
60*dd240e95SLaura Nao      as power domains or clocks) based on internal vote aggregation handled by
61*dd240e95SLaura Nao      the MCU's internal state machine.
62*dd240e95SLaura Nao
63*dd240e95SLaura Nao      However, in practice, this design is incomplete. While the HWV performs
64*dd240e95SLaura Nao      some internal vote aggregation,software is still required to
65*dd240e95SLaura Nao      - Manually enable power supplies externally, if present and if required
66*dd240e95SLaura Nao      - Manually enable parent clocks via direct MMIO writes to clock controllers
67*dd240e95SLaura Nao      - Enable the FENC after the clock has been ungated via direct MMIO
68*dd240e95SLaura Nao      writes to clock controllers
69*dd240e95SLaura Nao
70*dd240e95SLaura Nao      As such, the HWV behaves more like a hardware-managed clock reference
71*dd240e95SLaura Nao      counter than a true voter. Furthermore, it is not a separate
72*dd240e95SLaura Nao      controller. It merely serves as an alternative interface to the same
73*dd240e95SLaura Nao      underlying clock or power controller. Actual control still requires
74*dd240e95SLaura Nao      direct access to the controller's own MMIO register space, in
75*dd240e95SLaura Nao      addition to writing to the HWV's MMIO region.
76*dd240e95SLaura Nao
77*dd240e95SLaura Nao      For this reason, a custom phandle is used here - drivers need to directly
78*dd240e95SLaura Nao      access the HWV MMIO region in a syscon-like fashion, due to how the
79*dd240e95SLaura Nao      hardware is wired. This differs from true hardware voting systems, which
80*dd240e95SLaura Nao      typically do not require custom phandles and rely instead on generic APIs
81*dd240e95SLaura Nao      (clocks, power domains, interconnects).
82*dd240e95SLaura Nao
83*dd240e95SLaura Nao      The name "hardware-voter" is retained to match vendor documentation, but
84*dd240e95SLaura Nao      this should not be reused or misunderstood as a proper voting mechanism.
85*dd240e95SLaura Nao
86*dd240e95SLaura Naorequired:
87*dd240e95SLaura Nao  - compatible
88*dd240e95SLaura Nao  - reg
89*dd240e95SLaura Nao  - '#clock-cells'
90*dd240e95SLaura Nao
91*dd240e95SLaura NaoadditionalProperties: false
92*dd240e95SLaura Nao
93*dd240e95SLaura Naoexamples:
94*dd240e95SLaura Nao  - |
95*dd240e95SLaura Nao    apmixedsys_clk: syscon@10000800 {
96*dd240e95SLaura Nao        compatible = "mediatek,mt8196-apmixedsys", "syscon";
97*dd240e95SLaura Nao        reg = <0x10000800 0x1000>;
98*dd240e95SLaura Nao        #clock-cells = <1>;
99*dd240e95SLaura Nao    };
100*dd240e95SLaura Nao  - |
101*dd240e95SLaura Nao    topckgen: syscon@10000000 {
102*dd240e95SLaura Nao        compatible = "mediatek,mt8196-topckgen", "syscon";
103*dd240e95SLaura Nao        reg = <0x10000000 0x800>;
104*dd240e95SLaura Nao        mediatek,hardware-voter = <&scp_hwv>;
105*dd240e95SLaura Nao        #clock-cells = <1>;
106*dd240e95SLaura Nao    };
107*dd240e95SLaura Nao
108