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

title: Mobileye EyeQ SoC system controller

maintainers:
  - Grégory Clement <gregory.clement@bootlin.com>
  - Théo Lebrun <theo.lebrun@bootlin.com>
  - Vladimir Kondratiev <vladimir.kondratiev@mobileye.com>

description:
  OLB ("Other Logic Block") is a hardware block grouping smaller blocks. Clocks,
  resets, pinctrl are being handled from here. EyeQ5 and EyeQ6L host a single
  instance. EyeQ6H hosts seven instances.

properties:
  compatible:
    items:
      - enum:
          - mobileye,eyeq5-olb
          - mobileye,eyeq6l-olb
          - mobileye,eyeq6h-acc-olb
          - mobileye,eyeq6h-central-olb
          - mobileye,eyeq6h-east-olb
          - mobileye,eyeq6h-west-olb
          - mobileye,eyeq6h-south-olb
          - mobileye,eyeq6h-ddr0-olb
          - mobileye,eyeq6h-ddr1-olb
      - const: syscon

  reg:
    maxItems: 1

  '#reset-cells':
    description:
      First cell is domain and optional if compatible has a single reset domain.
      Second cell is reset index inside that domain.
    enum: [ 1, 2 ]

  '#clock-cells':
    description:
      Cell is clock index. Optional if compatible has a single clock.
    enum: [ 0, 1 ]

  clocks:
    maxItems: 1
    description:
      Input parent clock to all PLLs. Expected to be the main crystal.

  clock-names:
    const: ref

patternProperties:
  '-pins?$':
    type: object
    description: Pin muxing configuration.
    $ref: /schemas/pinctrl/pinmux-node.yaml#
    additionalProperties: false
    properties:
      pins: true
      function:
        enum: [gpio,
               # Bank A
               timer0, timer1, timer2, timer5, uart0, uart1, can0, can1, spi0,
               spi1, refclk0,
               # Bank B
               timer3, timer4, timer6, uart2, can2, spi2, spi3, mclk0]
      bias-disable: true
      bias-pull-down: true
      bias-pull-up: true
      drive-strength: true
    required:
      - pins
      - function
    allOf:
      - if:
          properties:
            function:
              const: gpio
        then:
          properties:
            pins:
              items: # PA0 - PA28, PB0 - PB22
                pattern: '^(P(A|B)1?[0-9]|PA2[0-8]|PB2[0-2])$'
      - if:
          properties:
            function:
              const: timer0
        then:
          properties:
            pins:
              items:
                enum: [PA0, PA1]
      - if:
          properties:
            function:
              const: timer1
        then:
          properties:
            pins:
              items:
                enum: [PA2, PA3]
      - if:
          properties:
            function:
              const: timer2
        then:
          properties:
            pins:
              items:
                enum: [PA4, PA5]
      - if:
          properties:
            function:
              const: timer5
        then:
          properties:
            pins:
              items:
                enum: [PA6, PA7, PA8, PA9]
      - if:
          properties:
            function:
              const: uart0
        then:
          properties:
            pins:
              items:
                enum: [PA10, PA11]
      - if:
          properties:
            function:
              const: uart1
        then:
          properties:
            pins:
              items:
                enum: [PA12, PA13]
      - if:
          properties:
            function:
              const: can0
        then:
          properties:
            pins:
              items:
                enum: [PA14, PA15]
      - if:
          properties:
            function:
              const: can1
        then:
          properties:
            pins:
              items:
                enum: [PA16, PA17]
      - if:
          properties:
            function:
              const: spi0
        then:
          properties:
            pins:
              items:
                enum: [PA18, PA19, PA20, PA21, PA22]
      - if:
          properties:
            function:
              const: spi1
        then:
          properties:
            pins:
              items:
                enum: [PA23, PA24, PA25, PA26, PA27]
      - if:
          properties:
            function:
              const: refclk0
        then:
          properties:
            pins:
              items:
                enum: [PA28]
      - if:
          properties:
            function:
              const: timer3
        then:
          properties:
            pins:
              items:
                enum: [PB0, PB1]
      - if:
          properties:
            function:
              const: timer4
        then:
          properties:
            pins:
              items:
                enum: [PB2, PB3]
      - if:
          properties:
            function:
              const: timer6
        then:
          properties:
            pins:
              items:
                enum: [PB4, PB5, PB6, PB7]
      - if:
          properties:
            function:
              const: uart2
        then:
          properties:
            pins:
              items:
                enum: [PB8, PB9]
      - if:
          properties:
            function:
              const: can2
        then:
          properties:
            pins:
              items:
                enum: [PB10, PB11]
      - if:
          properties:
            function:
              const: spi2
        then:
          properties:
            pins:
              items:
                enum: [PB12, PB13, PB14, PB15, PB16]
      - if:
          properties:
            function:
              const: spi3
        then:
          properties:
            pins:
              items:
                enum: [PB17, PB18, PB19, PB20, PB21]
      - if:
          properties:
            function:
              const: mclk0
        then:
          properties:
            pins:
              items:
                enum: [PB22]

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

additionalProperties: false

allOf:
    # Compatibles exposing a single reset domain.
  - if:
      properties:
        compatible:
          contains:
            enum:
              - mobileye,eyeq6h-acc-olb
              - mobileye,eyeq6h-east-olb
              - mobileye,eyeq6h-west-olb
    then:
      properties:
        '#reset-cells':
          const: 1
      required:
        - '#reset-cells'

    # Compatibles exposing two reset domains.
  - if:
      properties:
        compatible:
          contains:
            enum:
              - mobileye,eyeq5-olb
              - mobileye,eyeq6l-olb
    then:
      properties:
        '#reset-cells':
          const: 2
      required:
        - '#reset-cells'

    # Compatibles not exposing resets.
  - if:
      properties:
        compatible:
          contains:
            enum:
              - mobileye,eyeq6h-central-olb
              - mobileye,eyeq6h-south-olb
              - mobileye,eyeq6h-ddr0-olb
              - mobileye,eyeq6h-ddr1-olb
    then:
      properties:
        '#reset-cells': false

    # Compatibles exposing a single clock.
  - if:
      properties:
        compatible:
          contains:
            enum:
              - mobileye,eyeq6h-central-olb
              - mobileye,eyeq6h-east-olb
              - mobileye,eyeq6h-west-olb
              - mobileye,eyeq6h-ddr0-olb
              - mobileye,eyeq6h-ddr1-olb
    then:
      properties:
        '#clock-cells':
          const: 0
    else:
      properties:
        '#clock-cells':
          const: 1

    # Only EyeQ5 has pinctrl in OLB.
  - if:
      not:
        properties:
          compatible:
            contains:
              const: mobileye,eyeq5-olb
    then:
      patternProperties:
        '-pins?$': false

examples:
  - |
    soc {
      #address-cells = <2>;
      #size-cells = <2>;

      system-controller@e00000 {
        compatible = "mobileye,eyeq5-olb", "syscon";
        reg = <0 0xe00000 0x0 0x400>;
        #reset-cells = <2>;
        #clock-cells = <1>;
        clocks = <&xtal>;
        clock-names = "ref";
      };
    };
  - |
    soc {
      #address-cells = <2>;
      #size-cells = <2>;

      system-controller@d2003000 {
        compatible = "mobileye,eyeq6h-acc-olb", "syscon";
        reg = <0x0 0xd2003000 0x0 0x1000>;
        #reset-cells = <1>;
        #clock-cells = <1>;
        clocks = <&xtal>;
        clock-names = "ref";
      };
    };
