xref: /linux/Documentation/devicetree/bindings/clock/mediatek,mt8196-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-clock.yaml#
5*dd240e95SLaura Nao$schema: http://devicetree.org/meta-schemas/core.yaml#
6*dd240e95SLaura Nao
7*dd240e95SLaura Naotitle: MediaTek Functional 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 device nodes provide clock gate control in different IP blocks.
22*dd240e95SLaura Nao
23*dd240e95SLaura Naoproperties:
24*dd240e95SLaura Nao  compatible:
25*dd240e95SLaura Nao    items:
26*dd240e95SLaura Nao      - enum:
27*dd240e95SLaura Nao          - mediatek,mt8196-imp-iic-wrap-c
28*dd240e95SLaura Nao          - mediatek,mt8196-imp-iic-wrap-e
29*dd240e95SLaura Nao          - mediatek,mt8196-imp-iic-wrap-n
30*dd240e95SLaura Nao          - mediatek,mt8196-imp-iic-wrap-w
31*dd240e95SLaura Nao          - mediatek,mt8196-mdpsys0
32*dd240e95SLaura Nao          - mediatek,mt8196-mdpsys1
33*dd240e95SLaura Nao          - mediatek,mt8196-pericfg-ao
34*dd240e95SLaura Nao          - mediatek,mt8196-pextp0cfg-ao
35*dd240e95SLaura Nao          - mediatek,mt8196-pextp1cfg-ao
36*dd240e95SLaura Nao          - mediatek,mt8196-ufscfg-ao
37*dd240e95SLaura Nao          - mediatek,mt8196-vencsys
38*dd240e95SLaura Nao          - mediatek,mt8196-vencsys-c1
39*dd240e95SLaura Nao          - mediatek,mt8196-vencsys-c2
40*dd240e95SLaura Nao          - mediatek,mt8196-vdecsys
41*dd240e95SLaura Nao          - mediatek,mt8196-vdecsys-soc
42*dd240e95SLaura Nao          - mediatek,mt8196-vdisp-ao
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  '#reset-cells':
52*dd240e95SLaura Nao    const: 1
53*dd240e95SLaura Nao    description:
54*dd240e95SLaura Nao      Reset lines for PEXTP0/1 and UFS blocks.
55*dd240e95SLaura Nao
56*dd240e95SLaura Nao  mediatek,hardware-voter:
57*dd240e95SLaura Nao    $ref: /schemas/types.yaml#/definitions/phandle
58*dd240e95SLaura Nao    description: |
59*dd240e95SLaura Nao      Phandle to the "Hardware Voter" (HWV), as named in the vendor
60*dd240e95SLaura Nao      documentation for MT8196/MT6991.
61*dd240e95SLaura Nao
62*dd240e95SLaura Nao      The HWV is a SoC-internal fixed-function MCU used to collect votes from
63*dd240e95SLaura Nao      both the Application Processor and other remote processors within the SoC.
64*dd240e95SLaura Nao      It is intended to transparently enable or disable hardware resources (such
65*dd240e95SLaura Nao      as power domains or clocks) based on internal vote aggregation handled by
66*dd240e95SLaura Nao      the MCU's internal state machine.
67*dd240e95SLaura Nao
68*dd240e95SLaura Nao      However, in practice, this design is incomplete. While the HWV performs
69*dd240e95SLaura Nao      some internal vote aggregation,software is still required to
70*dd240e95SLaura Nao      - Manually enable power supplies externally, if present and if required
71*dd240e95SLaura Nao      - Manually enable parent clocks via direct MMIO writes to clock controllers
72*dd240e95SLaura Nao      - Enable the FENC after the clock has been ungated via direct MMIO
73*dd240e95SLaura Nao      writes to clock controllers
74*dd240e95SLaura Nao
75*dd240e95SLaura Nao      As such, the HWV behaves more like a hardware-managed clock reference
76*dd240e95SLaura Nao      counter than a true voter. Furthermore, it is not a separate
77*dd240e95SLaura Nao      controller. It merely serves as an alternative interface to the same
78*dd240e95SLaura Nao      underlying clock or power controller. Actual control still requires
79*dd240e95SLaura Nao      direct access to the controller's own MMIO register space, in
80*dd240e95SLaura Nao      addition to writing to the HWV's MMIO region.
81*dd240e95SLaura Nao
82*dd240e95SLaura Nao      For this reason, a custom phandle is used here - drivers need to directly
83*dd240e95SLaura Nao      access the HWV MMIO region in a syscon-like fashion, due to how the
84*dd240e95SLaura Nao      hardware is wired. This differs from true hardware voting systems, which
85*dd240e95SLaura Nao      typically do not require custom phandles and rely instead on generic APIs
86*dd240e95SLaura Nao      (clocks, power domains, interconnects).
87*dd240e95SLaura Nao
88*dd240e95SLaura Nao      The name "hardware-voter" is retained to match vendor documentation, but
89*dd240e95SLaura Nao      this should not be reused or misunderstood as a proper voting mechanism.
90*dd240e95SLaura Nao
91*dd240e95SLaura Naorequired:
92*dd240e95SLaura Nao  - compatible
93*dd240e95SLaura Nao  - reg
94*dd240e95SLaura Nao  - '#clock-cells'
95*dd240e95SLaura Nao
96*dd240e95SLaura NaoadditionalProperties: false
97*dd240e95SLaura Nao
98*dd240e95SLaura Naoexamples:
99*dd240e95SLaura Nao  - |
100*dd240e95SLaura Nao    pericfg_ao: clock-controller@16640000 {
101*dd240e95SLaura Nao        compatible = "mediatek,mt8196-pericfg-ao", "syscon";
102*dd240e95SLaura Nao        reg = <0x16640000 0x1000>;
103*dd240e95SLaura Nao        mediatek,hardware-voter = <&scp_hwv>;
104*dd240e95SLaura Nao        #clock-cells = <1>;
105*dd240e95SLaura Nao    };
106*dd240e95SLaura Nao  - |
107*dd240e95SLaura Nao    pextp0cfg_ao: clock-controller@169b0000 {
108*dd240e95SLaura Nao        compatible = "mediatek,mt8196-pextp0cfg-ao", "syscon";
109*dd240e95SLaura Nao        reg = <0x169b0000 0x1000>;
110*dd240e95SLaura Nao        #clock-cells = <1>;
111*dd240e95SLaura Nao        #reset-cells = <1>;
112*dd240e95SLaura Nao    };
113