1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/serial/nvidia,tegra20-hsuart.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: NVIDIA Tegra20/Tegra30 high speed (DMA based) UART controller driver
maintainers:
- Thierry Reding <thierry.reding@gmail.com>
- Jon Hunter <jonathanh@nvidia.com>
properties:
compatible:
oneOf:
- enum:
- nvidia,tegra20-hsuart
- nvidia,tegra30-hsuart
- nvidia,tegra186-hsuart
- nvidia,tegra194-hsuart
- items:
- const: nvidia,tegra124-hsuart
- const: nvidia,tegra30-hsuart
reg:
maxItems: 1
interrupts:
maxItems: 1
clocks:
items:
- description: module clock
resets:
items:
- description: module reset
reset-names:
items:
- const: serial
dmas:
items:
- description: DMA channel used for reception
- description: DMA channel used for transmission
dma-names:
items:
- const: rx
- const: tx
nvidia,enable-modem-interrupt:
$ref: /schemas/types.yaml#/definitions/flag
description: Enable modem interrupts. Should be enable only if all 8 lines of UART controller
are pinmuxed.
nvidia,adjust-baud-rates:
$ref: /schemas/types.yaml#/definitions/uint32-matrix
description: |
List of entries providing percentage of baud rate adjustment within a range. Each entry
contains a set of 3 values: range low/high and adjusted rate. When the baud rate set on the
controller falls within the range mentioned in this field, the baud rate will be adjusted by
percentage mentioned here.
Example: <9600 115200 200>
Increase baud rate by 2% when set baud rate falls within range 9600 to 115200.
Standard UART devices are expected to have tolerance for baud rate error by -4 to +4 %. All
Tegra devices till Tegra210 had this support. However, Tegra186 chip has a known hardware
issue. UART RX baud rate tolerance level is 0% to +4% in 1-stop config. Otherwise, the
received data will have corruption/invalid framing errors. Parker errata suggests adjusting
baud rate to be higher than the deviations observed in TX.
TX deviation of connected device can be captured over scope (or noted from its spec) for
valid range and Tegra baud rate has to be set above actual TX baud rate observed. To do this
we use nvidia,adjust-baud-rates.
As an example, consider there is deviation observed in TX for baud rates as listed below. 0
to 9600 has 1% deviation 9600 to 115200 2% deviation. This slight deviation is expcted and
Tegra UART is expected to handle it. Due to the issue stated above, baud rate on Tegra UART
should be set equal to or above deviation observed for avoiding frame errors. Property
should be set like this:
nvidia,adjust-baud-rates = <0 9600 100>,
<9600 115200 200>;
items:
items:
- description: range lower bound
- description: range upper bound
- description: adjustment (in permyriad, i.e. 0.01%)
allOf:
- $ref: serial.yaml
unevaluatedProperties: false
required:
- compatible
- reg
- interrupts
- clocks
- resets
- reset-names
- dmas
- dma-names
examples:
- |
#include <dt-bindings/clock/tegra30-car.h>
#include <dt-bindings/interrupt-controller/arm-gic.h>
serial@70006000 {
compatible = "nvidia,tegra30-hsuart";
reg = <0x70006000 0x40>;
interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
nvidia,enable-modem-interrupt;
clocks = <&tegra_car TEGRA30_CLK_UARTA>;
resets = <&tegra_car 6>;
reset-names = "serial";
dmas = <&apbdma 8>, <&apbdma 8>;
dma-names = "rx", "tx";
nvidia,adjust-baud-rates = <1000000 4000000 136>; /* 1.36% shift */
};
|