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