162306a36Sopenharmony_ci# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
262306a36Sopenharmony_ci%YAML 1.2
362306a36Sopenharmony_ci---
462306a36Sopenharmony_ci$id: http://devicetree.org/schemas/serial/nvidia,tegra20-hsuart.yaml#
562306a36Sopenharmony_ci$schema: http://devicetree.org/meta-schemas/core.yaml#
662306a36Sopenharmony_ci
762306a36Sopenharmony_cititle: NVIDIA Tegra20/Tegra30 high speed (DMA based) UART controller driver
862306a36Sopenharmony_ci
962306a36Sopenharmony_cimaintainers:
1062306a36Sopenharmony_ci  - Thierry Reding <thierry.reding@gmail.com>
1162306a36Sopenharmony_ci  - Jon Hunter <jonathanh@nvidia.com>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ciproperties:
1462306a36Sopenharmony_ci  compatible:
1562306a36Sopenharmony_ci    oneOf:
1662306a36Sopenharmony_ci      - enum:
1762306a36Sopenharmony_ci          - nvidia,tegra20-hsuart
1862306a36Sopenharmony_ci          - nvidia,tegra30-hsuart
1962306a36Sopenharmony_ci          - nvidia,tegra186-hsuart
2062306a36Sopenharmony_ci          - nvidia,tegra194-hsuart
2162306a36Sopenharmony_ci      - items:
2262306a36Sopenharmony_ci          - const: nvidia,tegra124-hsuart
2362306a36Sopenharmony_ci          - const: nvidia,tegra30-hsuart
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci  reg:
2662306a36Sopenharmony_ci    maxItems: 1
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci  interrupts:
2962306a36Sopenharmony_ci    maxItems: 1
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci  clocks:
3262306a36Sopenharmony_ci    items:
3362306a36Sopenharmony_ci      - description: module clock
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci  resets:
3662306a36Sopenharmony_ci    items:
3762306a36Sopenharmony_ci      - description: module reset
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci  reset-names:
4062306a36Sopenharmony_ci    items:
4162306a36Sopenharmony_ci      - const: serial
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci  dmas:
4462306a36Sopenharmony_ci    items:
4562306a36Sopenharmony_ci      - description: DMA channel used for reception
4662306a36Sopenharmony_ci      - description: DMA channel used for transmission
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci  dma-names:
4962306a36Sopenharmony_ci    items:
5062306a36Sopenharmony_ci      - const: rx
5162306a36Sopenharmony_ci      - const: tx
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci  nvidia,enable-modem-interrupt:
5462306a36Sopenharmony_ci    $ref: /schemas/types.yaml#/definitions/flag
5562306a36Sopenharmony_ci    description: Enable modem interrupts. Should be enable only if all 8 lines of UART controller
5662306a36Sopenharmony_ci      are pinmuxed.
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci  nvidia,adjust-baud-rates:
5962306a36Sopenharmony_ci    $ref: /schemas/types.yaml#/definitions/uint32-matrix
6062306a36Sopenharmony_ci    description: |
6162306a36Sopenharmony_ci      List of entries providing percentage of baud rate adjustment within a range. Each entry
6262306a36Sopenharmony_ci      contains a set of 3 values: range low/high and adjusted rate. When the baud rate set on the
6362306a36Sopenharmony_ci      controller falls within the range mentioned in this field, the baud rate will be adjusted by
6462306a36Sopenharmony_ci      percentage mentioned here.
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci      Example: <9600 115200 200>
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci      Increase baud rate by 2% when set baud rate falls within range 9600 to 115200.
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci      Standard UART devices are expected to have tolerance for baud rate error by -4 to +4 %. All
7162306a36Sopenharmony_ci      Tegra devices till Tegra210 had this support. However, Tegra186 chip has a known hardware
7262306a36Sopenharmony_ci      issue. UART RX baud rate tolerance level is 0% to +4% in 1-stop config. Otherwise, the
7362306a36Sopenharmony_ci      received data will have corruption/invalid framing errors. Parker errata suggests adjusting
7462306a36Sopenharmony_ci      baud rate to be higher than the deviations observed in TX.
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci      TX deviation of connected device can be captured over scope (or noted from its spec) for
7762306a36Sopenharmony_ci      valid range and Tegra baud rate has to be set above actual TX baud rate observed. To do this
7862306a36Sopenharmony_ci      we use nvidia,adjust-baud-rates.
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci      As an example, consider there is deviation observed in TX for baud rates as listed below. 0
8162306a36Sopenharmony_ci      to 9600 has 1% deviation 9600 to 115200 2% deviation. This slight deviation is expcted and
8262306a36Sopenharmony_ci      Tegra UART is expected to handle it. Due to the issue stated above, baud rate on Tegra UART
8362306a36Sopenharmony_ci      should be set equal to or above deviation observed for avoiding frame errors. Property
8462306a36Sopenharmony_ci      should be set like this:
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci        nvidia,adjust-baud-rates = <0 9600 100>,
8762306a36Sopenharmony_ci                                   <9600 115200 200>;
8862306a36Sopenharmony_ci    items:
8962306a36Sopenharmony_ci      items:
9062306a36Sopenharmony_ci        - description: range lower bound
9162306a36Sopenharmony_ci        - description: range upper bound
9262306a36Sopenharmony_ci        - description: adjustment (in permyriad, i.e. 0.01%)
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ciallOf:
9562306a36Sopenharmony_ci  - $ref: serial.yaml
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ciunevaluatedProperties: false
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_cirequired:
10062306a36Sopenharmony_ci  - compatible
10162306a36Sopenharmony_ci  - reg
10262306a36Sopenharmony_ci  - interrupts
10362306a36Sopenharmony_ci  - clocks
10462306a36Sopenharmony_ci  - resets
10562306a36Sopenharmony_ci  - reset-names
10662306a36Sopenharmony_ci  - dmas
10762306a36Sopenharmony_ci  - dma-names
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ciexamples:
11062306a36Sopenharmony_ci  - |
11162306a36Sopenharmony_ci    #include <dt-bindings/clock/tegra30-car.h>
11262306a36Sopenharmony_ci    #include <dt-bindings/interrupt-controller/arm-gic.h>
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ci    serial@70006000 {
11562306a36Sopenharmony_ci        compatible = "nvidia,tegra30-hsuart";
11662306a36Sopenharmony_ci        reg = <0x70006000 0x40>;
11762306a36Sopenharmony_ci        interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
11862306a36Sopenharmony_ci        nvidia,enable-modem-interrupt;
11962306a36Sopenharmony_ci        clocks = <&tegra_car TEGRA30_CLK_UARTA>;
12062306a36Sopenharmony_ci        resets = <&tegra_car 6>;
12162306a36Sopenharmony_ci        reset-names = "serial";
12262306a36Sopenharmony_ci        dmas = <&apbdma 8>, <&apbdma 8>;
12362306a36Sopenharmony_ci        dma-names = "rx", "tx";
12462306a36Sopenharmony_ci        nvidia,adjust-baud-rates = <1000000 4000000 136>; /* 1.36% shift */
12562306a36Sopenharmony_ci    };
126