# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
%YAML 1.2
---
$id: http://devicetree.org/schemas/clock/brcm,iproc-clocks.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#

title: Broadcom iProc Family Clocks

maintainers:
  - Ray Jui <rjui@broadcom.com>
  - Scott Branden <sbranden@broadcom.com>

description: |
  The iProc clock controller manages clocks that are common to the iProc family.
  An SoC from the iProc family may have several PLLs, e.g., ARMPLL, GENPLL,
  LCPLL0, MIPIPLL, and etc., all derived from an onboard crystal. Each PLL
  comprises of several leaf clocks

  ASIU clocks are a special case. These clocks are derived directly from the
  reference clock of the onboard crystal.

properties:
  compatible:
    enum:
      - brcm,bcm63138-armpll
      - brcm,cygnus-armpll
      - brcm,cygnus-genpll
      - brcm,cygnus-lcpll0
      - brcm,cygnus-mipipll
      - brcm,cygnus-asiu-clk
      - brcm,cygnus-audiopll
      - brcm,hr2-armpll
      - brcm,nsp-armpll
      - brcm,nsp-genpll
      - brcm,nsp-lcpll0
      - brcm,ns2-genpll-scr
      - brcm,ns2-genpll-sw
      - brcm,ns2-lcpll-ddr
      - brcm,ns2-lcpll-ports
      - brcm,sr-genpll0
      - brcm,sr-genpll1
      - brcm,sr-genpll2
      - brcm,sr-genpll3
      - brcm,sr-genpll4
      - brcm,sr-genpll5
      - brcm,sr-genpll6
      - brcm,sr-lcpll0
      - brcm,sr-lcpll1
      - brcm,sr-lcpll-pcie

  reg:
    minItems: 1
    items:
      - description: base register
      - description: power register
      - description: ASIU or split status register

  clocks:
    description: The input parent clock phandle for the PLL / ASIU clock. For
      most iProc PLLs, this is an onboard crystal with a fixed rate.
    maxItems: 1

  '#clock-cells':
    true

  clock-output-names:
    minItems: 1
    maxItems: 45

allOf:
  - if:
      properties:
        compatible:
          contains:
            enum:
              - brcm,cygnus-armpll
              - brcm,nsp-armpll
    then:
      properties:
        '#clock-cells':
          const: 0
    else:
      properties:
        '#clock-cells':
          const: 1
      required:
        - clock-output-names
  - if:
      properties:
        compatible:
          contains:
            enum:
              - brcm,cygnus-armpll
              - brcm,cygnus-genpll
              - brcm,cygnus-lcpll0
              - brcm,cygnus-mipipll
              - brcm,cygnus-asiu-clk
              - brcm,cygnus-audiopll
    then:
      properties:
        clock-output-names:
          description: |
            The following table defines the set of PLL/clock index and ID for Cygnus.
            These clock IDs are defined in:
                "include/dt-bindings/clock/bcm-cygnus.h"

            Clock      	Source (Parent)	Index	ID
            -----	---------------	-----	--
            crystal	N/A		N/A	N/A

            armpll	crystal		N/A	N/A

            keypad	crystal (ASIU)	0	BCM_CYGNUS_ASIU_KEYPAD_CLK
            adc/tsc	crystal (ASIU)	1	BCM_CYGNUS_ASIU_ADC_CLK
            pwm	crystal (ASIU)		2	BCM_CYGNUS_ASIU_PWM_CLK

            genpll	crystal		0	BCM_CYGNUS_GENPLL
            axi21	genpll		1	BCM_CYGNUS_GENPLL_AXI21_CLK
            250mhz	genpll		2	BCM_CYGNUS_GENPLL_250MHZ_CLK
            ihost_sys	genpll		3	BCM_CYGNUS_GENPLL_IHOST_SYS_CLK
            enet_sw	genpll		4	BCM_CYGNUS_GENPLL_ENET_SW_CLK
            audio_125	genpll		5	BCM_CYGNUS_GENPLL_AUDIO_125_CLK
            can		genpll		6	BCM_CYGNUS_GENPLL_CAN_CLK

            lcpll0	crystal		0	BCM_CYGNUS_LCPLL0
            pcie_phy	lcpll0		1	BCM_CYGNUS_LCPLL0_PCIE_PHY_REF_CLK
            ddr_phy	lcpll0		2	BCM_CYGNUS_LCPLL0_DDR_PHY_CLK
            sdio	lcpll0		3	BCM_CYGNUS_LCPLL0_SDIO_CLK
            usb_phy	lcpll0		4	BCM_CYGNUS_LCPLL0_USB_PHY_REF_CLK
            smart_card	lcpll0		5	BCM_CYGNUS_LCPLL0_SMART_CARD_CLK
            ch5_unused	lcpll0		6	BCM_CYGNUS_LCPLL0_CH5_UNUSED

            mipipll	crystal		0	BCM_CYGNUS_MIPIPLL
            ch0_unused	mipipll		1	BCM_CYGNUS_MIPIPLL_CH0_UNUSED
            ch1_lcd	mipipll		2	BCM_CYGNUS_MIPIPLL_CH1_LCD
            ch2_v3d	mipipll		3	BCM_CYGNUS_MIPIPLL_CH2_V3D
            ch3_unused	mipipll		4	BCM_CYGNUS_MIPIPLL_CH3_UNUSED
            ch4_unused	mipipll		5	BCM_CYGNUS_MIPIPLL_CH4_UNUSED
            ch5_unused	mipipll		6	BCM_CYGNUS_MIPIPLL_CH5_UNUSED

            audiopll	crystal		0	BCM_CYGNUS_AUDIOPLL
            ch0_audio	audiopll	1	BCM_CYGNUS_AUDIOPLL_CH0
            ch1_audio	audiopll	2	BCM_CYGNUS_AUDIOPLL_CH1
            ch2_audio	audiopll	3	BCM_CYGNUS_AUDIOPLL_CH2
  - if:
      properties:
        compatible:
          contains:
            enum:
              - brcm,hr2-armpll
    then:
      properties:
        clock-output-names:
          description: |
            The following table defines the set of PLL/clock for Hurricane 2:

            Clock	Source		Index	ID
            -----	------		-----	--
            crystal	N/A		N/A	N/A

            armpll	crystal		N/A	N/A
  - if:
      properties:
        compatible:
          contains:
            enum:
              - brcm,nsp-armpll
              - brcm,nsp-genpll
              - brcm,nsp-lcpll0
    then:
      properties:
        clock-output-names:
          description: |
            The following table defines the set of PLL/clock index and ID for Northstar and
            Northstar Plus.  These clock IDs are defined in:
                "include/dt-bindings/clock/bcm-nsp.h"

            Clock	Source		Index	ID
            -----	------		-----	--
            crystal	N/A		N/A	N/A

            armpll	crystal		N/A	N/A

            genpll	crystal		0	BCM_NSP_GENPLL
            phy		genpll		1	BCM_NSP_GENPLL_PHY_CLK
            ethernetclk	genpll		2	BCM_NSP_GENPLL_ENET_SW_CLK
            usbclk	genpll		3	BCM_NSP_GENPLL_USB_PHY_REF_CLK
            iprocfast	genpll		4	BCM_NSP_GENPLL_IPROCFAST_CLK
            sata1	genpll		5	BCM_NSP_GENPLL_SATA1_CLK
            sata2	genpll		6	BCM_NSP_GENPLL_SATA2_CLK

            lcpll0	crystal		0	BCM_NSP_LCPLL0
            pcie_phy	lcpll0		1	BCM_NSP_LCPLL0_PCIE_PHY_REF_CLK
            sdio	lcpll0		2	BCM_NSP_LCPLL0_SDIO_CLK
            ddr_phy	lcpll0		3	BCM_NSP_LCPLL0_DDR_PHY_CLK
  - if:
      properties:
        compatible:
          contains:
            enum:
              - brcm,ns2-genpll-scr
              - brcm,ns2-genpll-sw
              - brcm,ns2-lcpll-ddr
              - brcm,ns2-lcpll-ports
    then:
      properties:
        clock-output-names:
          description: |
            The following table defines the set of PLL/clock index and ID for Northstar 2.
            These clock IDs are defined in:
                "include/dt-bindings/clock/bcm-ns2.h"

            Clock	Source		Index	ID
            -----	------		-----	--
            crystal	N/A		N/A	N/A

            genpll_scr	crystal		0	BCM_NS2_GENPLL_SCR
            scr		genpll_scr	1	BCM_NS2_GENPLL_SCR_SCR_CLK
            fs		genpll_scr	2	BCM_NS2_GENPLL_SCR_FS_CLK
            audio_ref	genpll_scr	3	BCM_NS2_GENPLL_SCR_AUDIO_CLK
            ch3_unused	genpll_scr	4	BCM_NS2_GENPLL_SCR_CH3_UNUSED
            ch4_unused	genpll_scr	5	BCM_NS2_GENPLL_SCR_CH4_UNUSED
            ch5_unused	genpll_scr	6	BCM_NS2_GENPLL_SCR_CH5_UNUSED

            genpll_sw	crystal		0	BCM_NS2_GENPLL_SW
            rpe		genpll_sw	1	BCM_NS2_GENPLL_SW_RPE_CLK
            250		genpll_sw	2	BCM_NS2_GENPLL_SW_250_CLK
            nic		genpll_sw	3	BCM_NS2_GENPLL_SW_NIC_CLK
            chimp	genpll_sw	4	BCM_NS2_GENPLL_SW_CHIMP_CLK
            port	genpll_sw	5	BCM_NS2_GENPLL_SW_PORT_CLK
            sdio	genpll_sw	6	BCM_NS2_GENPLL_SW_SDIO_CLK

            lcpll_ddr	crystal		0	BCM_NS2_LCPLL_DDR
            pcie_sata_usb lcpll_ddr	1	BCM_NS2_LCPLL_DDR_PCIE_SATA_USB_CLK
            ddr		lcpll_ddr	2	BCM_NS2_LCPLL_DDR_DDR_CLK
            ch2_unused	lcpll_ddr	3	BCM_NS2_LCPLL_DDR_CH2_UNUSED
            ch3_unused	lcpll_ddr	4	BCM_NS2_LCPLL_DDR_CH3_UNUSED
            ch4_unused	lcpll_ddr	5	BCM_NS2_LCPLL_DDR_CH4_UNUSED
            ch5_unused	lcpll_ddr	6	BCM_NS2_LCPLL_DDR_CH5_UNUSED

            lcpll_ports	crystal		0	BCM_NS2_LCPLL_PORTS
            wan		lcpll_ports	1	BCM_NS2_LCPLL_PORTS_WAN_CLK
            rgmii	lcpll_ports	2	BCM_NS2_LCPLL_PORTS_RGMII_CLK
            ch2_unused	lcpll_ports	3	BCM_NS2_LCPLL_PORTS_CH2_UNUSED
            ch3_unused	lcpll_ports	4	BCM_NS2_LCPLL_PORTS_CH3_UNUSED
            ch4_unused	lcpll_ports	5	BCM_NS2_LCPLL_PORTS_CH4_UNUSED
            ch5_unused	lcpll_ports	6	BCM_NS2_LCPLL_PORTS_CH5_UNUSED
  - if:
      properties:
        compatible:
          contains:
            enum:
              - brcm,sr-genpll0
              - brcm,sr-genpll1
              - brcm,sr-genpll2
              - brcm,sr-genpll3
              - brcm,sr-genpll4
              - brcm,sr-genpll5
              - brcm,sr-genpll6
              - brcm,sr-lcpll0
              - brcm,sr-lcpll1
              - brcm,sr-lcpll-pcie
    then:
      properties:
        clock-output-names:
          description: |
            The following table defines the set of PLL/clock index and ID for Stingray.
            These clock IDs are defined in:
                "include/dt-bindings/clock/bcm-sr.h"

            Clock		Source		Index	ID
            -----		------		-----	--
            crystal		N/A		N/A	N/A
            crmu_ref25m		crystal		N/A	N/A

            genpll0		crystal		0	BCM_SR_GENPLL0
            clk_125m		genpll0		1	BCM_SR_GENPLL0_125M_CLK
            clk_scr		genpll0		2	BCM_SR_GENPLL0_SCR_CLK
            clk_250		genpll0		3	BCM_SR_GENPLL0_250M_CLK
            clk_pcie_axi	genpll0		4	BCM_SR_GENPLL0_PCIE_AXI_CLK
            clk_paxc_axi_x2	genpll0		5	BCM_SR_GENPLL0_PAXC_AXI_X2_CLK
            clk_paxc_axi	genpll0		6	BCM_SR_GENPLL0_PAXC_AXI_CLK

            genpll1		crystal		0	BCM_SR_GENPLL1
            clk_pcie_tl		genpll1		1	BCM_SR_GENPLL1_PCIE_TL_CLK
            clk_mhb_apb		genpll1		2	BCM_SR_GENPLL1_MHB_APB_CLK

            genpll2		crystal		0	BCM_SR_GENPLL2
            clk_nic		genpll2		1	BCM_SR_GENPLL2_NIC_CLK
            clk_ts_500_ref	genpll2		2	BCM_SR_GENPLL2_TS_500_REF_CLK
            clk_125_nitro	genpll2		3	BCM_SR_GENPLL2_125_NITRO_CLK
            clk_chimp		genpll2		4	BCM_SR_GENPLL2_CHIMP_CLK
            clk_nic_flash	genpll2		5	BCM_SR_GENPLL2_NIC_FLASH_CLK
            clk_fs		genpll2		6	BCM_SR_GENPLL2_FS_CLK

            genpll3		crystal		0	BCM_SR_GENPLL3
            clk_hsls		genpll3		1	BCM_SR_GENPLL3_HSLS_CLK
            clk_sdio		genpll3		2	BCM_SR_GENPLL3_SDIO_CLK

            genpll4		crystal		0	BCM_SR_GENPLL4
            clk_ccn		genpll4		1	BCM_SR_GENPLL4_CCN_CLK
            clk_tpiu_pll	genpll4		2	BCM_SR_GENPLL4_TPIU_PLL_CLK
            clk_noc		genpll4		3	BCM_SR_GENPLL4_NOC_CLK
            clk_chclk_fs4	genpll4		4	BCM_SR_GENPLL4_CHCLK_FS4_CLK
            clk_bridge_fscpu	genpll4		5	BCM_SR_GENPLL4_BRIDGE_FSCPU_CLK

            genpll5		crystal		0	BCM_SR_GENPLL5
            clk_fs4_hf		genpll5		1	BCM_SR_GENPLL5_FS4_HF_CLK
            clk_crypto_ae	genpll5		2	BCM_SR_GENPLL5_CRYPTO_AE_CLK
            clk_raid_ae		genpll5		3	BCM_SR_GENPLL5_RAID_AE_CLK

            genpll6		crystal		0	BCM_SR_GENPLL6
            clk_48_usb		genpll6		1	BCM_SR_GENPLL6_48_USB_CLK

            lcpll0		crystal		0	BCM_SR_LCPLL0
            clk_sata_refp 	lcpll0		1	BCM_SR_LCPLL0_SATA_REFP_CLK
            clk_sata_refn	lcpll0		2	BCM_SR_LCPLL0_SATA_REFN_CLK
            clk_sata_350	lcpll0		3	BCM_SR_LCPLL0_SATA_350_CLK
            clk_sata_500	lcpll0		4	BCM_SR_LCPLL0_SATA_500_CLK

            lcpll1		crystal		0	BCM_SR_LCPLL1
            clk_wan		lcpll1		1	BCM_SR_LCPLL1_WAN_CLK
            clk_usb_ref		lcpll1		2	BCM_SR_LCPLL1_USB_REF_CLK
            clk_crmu_ts		lcpll1		3	BCM_SR_LCPLL1_CRMU_TS_CLK

            lcpll_pcie		crystal		0	BCM_SR_LCPLL_PCIE
            clk_pcie_phy_ref	lcpll1		1	BCM_SR_LCPLL_PCIE_PHY_REF_CLK
  - if:
      properties:
        compatible:
          contains:
            const: brcm,cygnus-genpll
    then:
      properties:
        clock-output-names:
          items:
            - const: genpll
            - const: axi21
            - const: 250mhz
            - const: ihost_sys
            - const: enet_sw
            - const: audio_125
            - const: can
  - if:
      properties:
        compatible:
          contains:
            const: brcm,nsp-lcpll0
    then:
      properties:
        clock-output-names:
          items:
            - const: lcpll0
            - const: pcie_phy
            - const: sdio
            - const: ddr_phy
  - if:
      properties:
        compatible:
          contains:
            const: brcm,nsp-genpll
    then:
      properties:
        clock-output-names:
          items:
            - const: genpll
            - const: phy
            - const: ethernetclk
            - const: usbclk
            - const: iprocfast
            - const: sata1
            - const: sata2

required:
  - reg
  - clocks
  - '#clock-cells'

additionalProperties: false

examples:
  - |
    osc1: oscillator {
        #clock-cells = <0>;
        compatible = "fixed-clock";
        clock-frequency = <25000000>;
    };

    genpll@301d000 {
        #clock-cells = <1>;
        compatible = "brcm,cygnus-genpll";
        reg = <0x301d000 0x2c>, <0x301c020 0x4>;
        clocks = <&os1c>;
        clock-output-names = "genpll", "axi21", "250mhz", "ihost_sys",
                     "enet_sw", "audio_125", "can";
    };
  - |
    osc2: oscillator {
        #clock-cells = <0>;
        compatible = "fixed-clock";
        clock-frequency = <25000000>;
    };

    asiu_clks@301d048 {
        #clock-cells = <1>;
        compatible = "brcm,cygnus-asiu-clk";
        reg = <0x301d048 0xc>, <0x180aa024 0x4>;
        clocks = <&osc2>;
        clock-output-names = "keypad", "adc/touch", "pwm";
    };
  - |
    arm_clk@0 {
        #clock-cells = <0>;
        compatible = "brcm,nsp-armpll";
        clocks = <&osc>;
        reg = <0x0 0x1000>;
    };