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

title: LPDDR2 SDRAM compliant to JEDEC JESD209-2

maintainers:
  - Krzysztof Kozlowski <krzk@kernel.org>

allOf:
  - $ref: jedec,lpddr-props.yaml#

properties:
  compatible:
    oneOf:
      - items:
          - enum:
              - elpida,ECB240ABACN
              - elpida,B8132B2PB-6D-F
          - enum:
              - jedec,lpddr2-nvm
              - jedec,lpddr2-s2
              - jedec,lpddr2-s4
      - items:
          - pattern: "^lpddr2-[0-9a-f]{2},[0-9a-f]{4}$"
          - enum:
              - jedec,lpddr2-nvm
              - jedec,lpddr2-s2
              - jedec,lpddr2-s4

  revision-id1:
    $ref: /schemas/types.yaml#/definitions/uint32
    maximum: 255
    description: |
      Revision 1 value of SDRAM chip. Obtained from device datasheet.
      Property is deprecated, use revision-id instead.
    deprecated: true

  revision-id2:
    $ref: /schemas/types.yaml#/definitions/uint32
    maximum: 255
    description: |
      Revision 2 value of SDRAM chip. Obtained from device datasheet.
      Property is deprecated, use revision-id instead.
    deprecated: true

  tRRD-min-tck:
    $ref: /schemas/types.yaml#/definitions/uint32
    maximum: 16
    description: |
      Active bank a to active bank b in terms of number of clock cycles.
      Obtained from device datasheet.

  tWTR-min-tck:
    $ref: /schemas/types.yaml#/definitions/uint32
    maximum: 16
    description: |
      Internal WRITE-to-READ command delay in terms of number of clock cycles.
      Obtained from device datasheet.

  tXP-min-tck:
    $ref: /schemas/types.yaml#/definitions/uint32
    maximum: 16
    description: |
      Exit power-down to next valid command delay in terms of number of clock
      cycles. Obtained from device datasheet.

  tRTP-min-tck:
    $ref: /schemas/types.yaml#/definitions/uint32
    maximum: 16
    description: |
      Internal READ to PRECHARGE command delay in terms of number of clock
      cycles. Obtained from device datasheet.

  tCKE-min-tck:
    $ref: /schemas/types.yaml#/definitions/uint32
    maximum: 16
    description: |
      CKE minimum pulse width (HIGH and LOW pulse width) in terms of number
      of clock cycles. Obtained from device datasheet.

  tRPab-min-tck:
    $ref: /schemas/types.yaml#/definitions/uint32
    maximum: 16
    description: |
      Row precharge time (all banks) in terms of number of clock cycles.
      Obtained from device datasheet.

  tRCD-min-tck:
    $ref: /schemas/types.yaml#/definitions/uint32
    maximum: 16
    description: |
      RAS-to-CAS delay in terms of number of clock cycles. Obtained from
      device datasheet.

  tWR-min-tck:
    $ref: /schemas/types.yaml#/definitions/uint32
    maximum: 16
    description: |
      WRITE recovery time in terms of number of clock cycles. Obtained from
      device datasheet.

  tRASmin-min-tck:
    $ref: /schemas/types.yaml#/definitions/uint32
    maximum: 16
    description: |
      Row active time in terms of number of clock cycles. Obtained from device
      datasheet.

  tCKESR-min-tck:
    $ref: /schemas/types.yaml#/definitions/uint32
    maximum: 16
    description: |
      CKE minimum pulse width during SELF REFRESH (low pulse width during
      SELF REFRESH) in terms of number of clock cycles. Obtained from device
      datasheet.

  tFAW-min-tck:
    $ref: /schemas/types.yaml#/definitions/uint32
    maximum: 16
    description: |
      Four-bank activate window in terms of number of clock cycles. Obtained
      from device datasheet.

patternProperties:
  "^lpddr2-timings":
    $ref: jedec,lpddr2-timings.yaml
    description: |
      The lpddr2 node may have one or more child nodes of type "lpddr2-timings".
      "lpddr2-timings" provides AC timing parameters of the device for
      a given speed-bin. The user may provide the timings for as many
      speed-bins as is required.

required:
  - compatible
  - density
  - io-width

unevaluatedProperties: false

examples:
  - |
    elpida_ECB240ABACN: lpddr2 {
        compatible = "elpida,ECB240ABACN", "jedec,lpddr2-s4";
        density = <2048>;
        io-width = <32>;
        revision-id = <1 0>;

        tRPab-min-tck = <3>;
        tRCD-min-tck = <3>;
        tWR-min-tck = <3>;
        tRASmin-min-tck = <3>;
        tRRD-min-tck = <2>;
        tWTR-min-tck = <2>;
        tXP-min-tck = <2>;
        tRTP-min-tck = <2>;
        tCKE-min-tck = <3>;
        tCKESR-min-tck = <3>;
        tFAW-min-tck = <8>;

        timings_elpida_ECB240ABACN_400mhz: lpddr2-timings0 {
            compatible = "jedec,lpddr2-timings";
            min-freq = <10000000>;
            max-freq = <400000000>;
            tRPab = <21000>;
            tRCD = <18000>;
            tWR = <15000>;
            tRAS-min = <42000>;
            tRRD = <10000>;
            tWTR = <7500>;
            tXP = <7500>;
            tRTP = <7500>;
            tCKESR = <15000>;
            tDQSCK-max = <5500>;
            tFAW = <50000>;
            tZQCS = <90000>;
            tZQCL = <360000>;
            tZQinit = <1000000>;
            tRAS-max-ns = <70000>;
        };

        timings_elpida_ECB240ABACN_200mhz: lpddr2-timings1 {
            compatible = "jedec,lpddr2-timings";
            min-freq = <10000000>;
            max-freq = <200000000>;
            tRPab = <21000>;
            tRCD = <18000>;
            tWR = <15000>;
            tRAS-min = <42000>;
            tRRD = <10000>;
            tWTR = <10000>;
            tXP = <7500>;
            tRTP = <7500>;
            tCKESR = <15000>;
            tDQSCK-max = <5500>;
            tFAW = <50000>;
            tZQCS = <90000>;
            tZQCL = <360000>;
            tZQinit = <1000000>;
            tRAS-max-ns = <70000>;
        };
    };