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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
|
/*
* Copyright (c) 2016 Zodiac Inflight Innovation
* Author: Andrey Smirnov <andrew.smirnov@gmail.com>
*
* Based on code found in Linux kernel and U-Boot.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
#ifndef __lpuart32_H__
#define __lpuart32_H__
/* 32-bit register definition */
#define LPUART32_UARTBAUD 0x00
#define LPUART32_UARTSTAT 0x04
#define LPUART32_UARTCTRL 0x08
#define LPUART32_UARTDATA 0x0C
#define LPUART32_UARTMATCH 0x10
#define LPUART32_UARTMODIR 0x14
#define LPUART32_UARTFIFO 0x18
#define LPUART32_UARTWATER 0x1c
#define LPUART32_UARTBAUD_MAEN1 0x80000000
#define LPUART32_UARTBAUD_MAEN2 0x40000000
#define LPUART32_UARTBAUD_M10 0x20000000
#define LPUART32_UARTBAUD_TDMAE 0x00800000
#define LPUART32_UARTBAUD_RDMAE 0x00200000
#define LPUART32_UARTBAUD_MATCFG 0x00400000
#define LPUART32_UARTBAUD_BOTHEDGE 0x00020000
#define LPUART32_UARTBAUD_RESYNCDIS 0x00010000
#define LPUART32_UARTBAUD_LBKDIE 0x00008000
#define LPUART32_UARTBAUD_RXEDGIE 0x00004000
#define LPUART32_UARTBAUD_SBNS 0x00002000
#define LPUART32_UARTBAUD_SBR 0x00000000
#define LPUART32_UARTBAUD_SBR_MASK 0x1fff
#define LPUART32_UARTBAUD_OSR_MASK 0x1f
#define LPUART32_UARTBAUD_OSR_SHIFT 24
#define LPUART32_UARTSTAT_LBKDIF 0x80000000
#define LPUART32_UARTSTAT_RXEDGIF 0x40000000
#define LPUART32_UARTSTAT_MSBF 0x20000000
#define LPUART32_UARTSTAT_RXINV 0x10000000
#define LPUART32_UARTSTAT_RWUID 0x08000000
#define LPUART32_UARTSTAT_BRK13 0x04000000
#define LPUART32_UARTSTAT_LBKDE 0x02000000
#define LPUART32_UARTSTAT_RAF 0x01000000
#define LPUART32_UARTSTAT_TDRE 0x00800000
#define LPUART32_UARTSTAT_TC 0x00400000
#define LPUART32_UARTSTAT_RDRF 0x00200000
#define LPUART32_UARTSTAT_IDLE 0x00100000
#define LPUART32_UARTSTAT_OR 0x00080000
#define LPUART32_UARTSTAT_NF 0x00040000
#define LPUART32_UARTSTAT_FE 0x00020000
#define LPUART32_UARTSTAT_PE 0x00010000
#define LPUART32_UARTSTAT_MA1F 0x00008000
#define LPUART32_UARTSTAT_M21F 0x00004000
#define LPUART32_UARTCTRL_R8T9 0x80000000
#define LPUART32_UARTCTRL_R9T8 0x40000000
#define LPUART32_UARTCTRL_TXDIR 0x20000000
#define LPUART32_UARTCTRL_TXINV 0x10000000
#define LPUART32_UARTCTRL_ORIE 0x08000000
#define LPUART32_UARTCTRL_NEIE 0x04000000
#define LPUART32_UARTCTRL_FEIE 0x02000000
#define LPUART32_UARTCTRL_PEIE 0x01000000
#define LPUART32_UARTCTRL_TIE 0x00800000
#define LPUART32_UARTCTRL_TCIE 0x00400000
#define LPUART32_UARTCTRL_RIE 0x00200000
#define LPUART32_UARTCTRL_ILIE 0x00100000
#define LPUART32_UARTCTRL_TE 0x00080000
#define LPUART32_UARTCTRL_RE 0x00040000
#define LPUART32_UARTCTRL_RWU 0x00020000
#define LPUART32_UARTCTRL_SBK 0x00010000
#define LPUART32_UARTCTRL_MA1IE 0x00008000
#define LPUART32_UARTCTRL_MA2IE 0x00004000
#define LPUART32_UARTCTRL_IDLECFG GENMASK(10, 8)
#define LPUART32_UARTCTRL_LOOPS 0x00000080
#define LPUART32_UARTCTRL_DOZEEN 0x00000040
#define LPUART32_UARTCTRL_RSRC 0x00000020
#define LPUART32_UARTCTRL_M 0x00000010
#define LPUART32_UARTCTRL_WAKE 0x00000008
#define LPUART32_UARTCTRL_ILT 0x00000004
#define LPUART32_UARTCTRL_PE 0x00000002
#define LPUART32_UARTCTRL_PT 0x00000001
#define LPUART32_UARTDATA_NOISY 0x00008000
#define LPUART32_UARTDATA_PARITYE 0x00004000
#define LPUART32_UARTDATA_FRETSC 0x00002000
#define LPUART32_UARTDATA_RXEMPT 0x00001000
#define LPUART32_UARTDATA_IDLINE 0x00000800
#define LPUART32_UARTDATA_MASK 0x3ff
#define LPUART32_UARTMODIR_IREN 0x00020000
#define LPUART32_UARTMODIR_RTSWATER GENMASK(10, 8)
#define LPUART32_UARTMODIR_TXCTSSRC 0x00000020
#define LPUART32_UARTMODIR_TXCTSC 0x00000010
#define LPUART32_UARTMODIR_RXRTSE 0x00000008
#define LPUART32_UARTMODIR_TXRTSPOL 0x00000004
#define LPUART32_UARTMODIR_TXRTSE 0x00000002
#define LPUART32_UARTMODIR_TXCTSE 0x00000001
#define LPUART32_UARTFIFO_TXEMPT 0x00800000
#define LPUART32_UARTFIFO_RXEMPT 0x00400000
#define LPUART32_UARTFIFO_TXOF 0x00020000
#define LPUART32_UARTFIFO_RXUF 0x00010000
#define LPUART32_UARTFIFO_TXFLUSH 0x00008000
#define LPUART32_UARTFIFO_RXFLUSH 0x00004000
#define LPUART32_UARTFIFO_RXIDEN GENMASK(12, 10)
#define LPUART32_UARTFIFO_TXOFE 0x00000200
#define LPUART32_UARTFIFO_RXUFE 0x00000100
#define LPUART32_UARTFIFO_TXFE 0x00000080
#define LPUART32_UARTFIFO_FIFOSIZE_MASK 0x7
#define LPUART32_UARTFIFO_TXSIZE_OFF 4
#define LPUART32_UARTFIFO_RXFE 0x00000008
#define LPUART32_UARTFIFO_RXSIZE_OFF 0
#define LPUART32_UARTFIFO_DEPTH(x) (0x1 << ((x) ? ((x) + 1) : 0))
#define LPUART32_UARTWATER_COUNT_MASK 0xff
#define LPUART32_UARTWATER_TXCNT_OFF 8
#define LPUART32_UARTWATER_RXCNT_OFF 24
#define LPUART32_UARTWATER_WATER_MASK 0xff
#define LPUART32_UARTWATER_TXWATER_OFF 0
#define LPUART32_UARTWATER_RXWATER_OFF 16
static inline void lpuart32_setbrg(void __iomem *base,
unsigned int refclock,
unsigned int baudrate)
{
u32 sbr;
sbr = (refclock / (16 * baudrate));
writel(sbr, base + LPUART32_UARTBAUD);
}
static inline void lpuart32_setup(void __iomem *base,
unsigned int refclock)
{
lpuart32_setbrg(base, refclock, CONFIG_BAUDRATE);
writel(LPUART32_UARTCTRL_TE | LPUART32_UARTCTRL_RE, base + LPUART32_UARTCTRL);
}
static inline void lpuart32_putc(void __iomem *base, int c)
{
while (!(readl(base + LPUART32_UARTSTAT) & LPUART32_UARTSTAT_TDRE));
writel(c, base + LPUART32_UARTDATA);
}
static inline void imx9_uart_setup(void __iomem *uartbase)
{
/*
* On i.MX9 the registers start at offset 0x10
*/
BUG_ON((unsigned long)uartbase & 0x10);
lpuart32_setup(uartbase + 0x10, 24000000);
}
#endif
|