# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/silabs,si5341.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#

title: Silicon Labs Si5340/1/2/4/5 programmable i2c clock generator

maintainers:
  - Mike Looijmans <mike.looijmans@topic.nl>

description: >
  Silicon Labs Si5340, Si5341 Si5342, Si5344 and Si5345 programmable i2c clock
  generator.

  Reference
  [1] Si5341 Data Sheet
      https://www.silabs.com/documents/public/data-sheets/Si5341-40-D-DataSheet.pdf
  [2] Si5341 Reference Manual
      https://www.silabs.com/documents/public/reference-manuals/Si5341-40-D-RM.pdf
  [3] Si5345 Reference Manual
      https://www.silabs.com/documents/public/reference-manuals/Si5345-44-42-D-RM.pdf

  The Si5341 and Si5340 are programmable i2c clock generators with up to 10 output
  clocks. The chip contains a PLL that sources 5 (or 4) multisynth clocks, which
  in turn can be directed to any of the 10 (or 4) outputs through a divider.
  The internal structure of the clock generators can be found in [2].
  The Si5345 is similar to the Si5341 with the addition of fractional input
  dividers and automatic input selection, as described in [3].
  The Si5342 and Si5344 are smaller versions of the Si5345, with 2 or 4 outputs.

  The driver can be used in "as is" mode, reading the current settings from the
  chip at boot, in case you have a (pre-)programmed device. If the PLL is not
  configured when the driver probes, it assumes the driver must fully initialize
  it.

  The device type, speed grade and revision are determined runtime by probing.

properties:
  compatible:
    enum:
      - silabs,si5340
      - silabs,si5341
      - silabs,si5342
      - silabs,si5344
      - silabs,si5345

  reg:
    maxItems: 1

  "#clock-cells":
    const: 2
    description: >
      The first value is "0" for outputs, "1" for synthesizers.

      The second value is the output or synthesizer index.

  "#address-cells":
    const: 1

  "#size-cells":
    const: 0

  clocks:
    minItems: 1
    maxItems: 4

  clock-names:
    minItems: 1
    items:
      - const: xtal
      - const: in0
      - const: in1
      - const: in2

  clock-output-names: true

  interrupts:
    maxItems: 1
    description: Interrupt for INTRb pin

  vdd-supply:
    description: Regulator node for VDD

  vdda-supply:
    description: Regulator node for VDDA

  vdds-supply:
    description: Regulator node for VDDS

  silabs,pll-m-num:
    description:
      Numerator for PLL feedback divider. Must be such that the PLL output is in
      the valid range. For example, to create 14GHz from a 48MHz xtal, use
      m-num=14000 and m-den=48. Only the fraction matters, using 3500 and 12
      will deliver the exact same result. If these are not specified, and the
      PLL is not yet programmed when the driver probes, the PLL will be set to
      14GHz.
    $ref: /schemas/types.yaml#/definitions/uint32

  silabs,pll-m-den:
    description: Denominator for PLL feedback divider
    $ref: /schemas/types.yaml#/definitions/uint32

  silabs,reprogram:
    description: Always perform soft-reset and reinitialize PLL
    type: boolean

  silabs,xaxb-ext-clk:
    description: Use XA/XB pins as external reference clock
    type: boolean

  silabs,iovdd-33:
    description: I2C lines use 3.3V thresholds
    type: boolean

patternProperties:
  "^vddo[0-9]-supply$": true

  "^out@[0-9]$":
    description: >
      Output-specific override nodes

      Each of the clock outputs can be overwritten individually by using a child
      node. If a child node for a clock output is not set, the configuration
      remains unchanged.
    type: object
    additionalProperties: false

    properties:
      reg:
        description: Number of clock output
        maximum: 9

      always-on:
        description: Set to keep the clock output always running
        type: boolean

      silabs,format:
        description: Output format
        $ref: /schemas/types.yaml#/definitions/uint32
        enum: [1, 2, 4]

      silabs,common-mode:
        description: Override output common mode
        $ref: /schemas/types.yaml#/definitions/uint32

      silabs,amplitude:
        description: Override output amplitude
        $ref: /schemas/types.yaml#/definitions/uint32

      silabs,synth-master:
        description: Allow dynamic multisynth rate control
        type: boolean

      silabs,disable-high:
        description: Drive output HIGH when disabled
        type: boolean

    required:
      - reg

required:
  - compatible
  - reg
  - "#clock-cells"
  - "#address-cells"
  - "#size-cells"
  - clocks
  - clock-names

additionalProperties: false

examples:
  - |
    i2c {
        #address-cells = <1>;
        #size-cells = <0>;

        clock-generator@74 {
            reg = <0x74>;
            compatible = "silabs,si5341";
            #clock-cells = <2>;
            #address-cells = <1>;
            #size-cells = <0>;
            clocks = <&ref48>;
            clock-names = "xtal";

            silabs,pll-m-num = <14000>; /* PLL at 14.0 GHz */
            silabs,pll-m-den = <48>;
            silabs,reprogram; /* Chips are not programmed, always reset */

            out@0 {
                reg = <0>;
                silabs,format = <1>; /* LVDS 3v3 */
                silabs,common-mode = <3>;
                silabs,amplitude = <3>;
                silabs,synth-master;
            };

            /*
              * Output 6 configuration:
              *  LVDS 1v8
              */
            out@6 {
                reg = <6>;
                silabs,format = <1>; /* LVDS 1v8 */
                silabs,common-mode = <13>;
                silabs,amplitude = <3>;
            };

            /*
              * Output 8 configuration:
              *  HCSL 3v3
              */
            out@8 {
                reg = <8>;
                silabs,format = <2>;
                silabs,common-mode = <11>;
                silabs,amplitude = <3>;
            };
        };
    };
