.. | .. |
---|
12 | 12 | |
---|
13 | 13 | #include "8250.h" |
---|
14 | 14 | |
---|
15 | | -/* Most (but not all) of UniPhier UART devices have 64-depth FIFO. */ |
---|
16 | | -#define UNIPHIER_UART_DEFAULT_FIFO_SIZE 64 |
---|
17 | | - |
---|
18 | 15 | /* |
---|
19 | 16 | * This hardware is similar to 8250, but its register map is a bit different: |
---|
20 | 17 | * - MMIO32 (regshift = 2) |
---|
.. | .. |
---|
78 | 75 | break; |
---|
79 | 76 | case UART_LCR: |
---|
80 | 77 | valshift = 8; |
---|
81 | | - /* fall through */ |
---|
| 78 | + fallthrough; |
---|
82 | 79 | case UART_MCR: |
---|
83 | 80 | offset = UNIPHIER_UART_LCR_MCR; |
---|
84 | 81 | break; |
---|
.. | .. |
---|
104 | 101 | case UART_SCR: |
---|
105 | 102 | /* No SCR for this hardware. Use CHAR as a scratch register */ |
---|
106 | 103 | valshift = 8; |
---|
107 | | - /* fall through */ |
---|
| 104 | + fallthrough; |
---|
108 | 105 | case UART_FCR: |
---|
109 | 106 | offset = UNIPHIER_UART_CHAR_FCR; |
---|
110 | 107 | break; |
---|
.. | .. |
---|
112 | 109 | valshift = 8; |
---|
113 | 110 | /* Divisor latch access bit does not exist. */ |
---|
114 | 111 | value &= ~UART_LCR_DLAB; |
---|
115 | | - /* fall through */ |
---|
| 112 | + fallthrough; |
---|
116 | 113 | case UART_MCR: |
---|
117 | 114 | offset = UNIPHIER_UART_LCR_MCR; |
---|
118 | 115 | break; |
---|
.. | .. |
---|
158 | 155 | writel(value, up->port.membase + UNIPHIER_UART_DLR); |
---|
159 | 156 | } |
---|
160 | 157 | |
---|
161 | | -static int uniphier_of_serial_setup(struct device *dev, struct uart_port *port, |
---|
162 | | - struct uniphier8250_priv *priv) |
---|
163 | | -{ |
---|
164 | | - int ret; |
---|
165 | | - u32 prop; |
---|
166 | | - struct device_node *np = dev->of_node; |
---|
167 | | - |
---|
168 | | - ret = of_alias_get_id(np, "serial"); |
---|
169 | | - if (ret < 0) { |
---|
170 | | - dev_err(dev, "failed to get alias id\n"); |
---|
171 | | - return ret; |
---|
172 | | - } |
---|
173 | | - port->line = ret; |
---|
174 | | - |
---|
175 | | - /* Get clk rate through clk driver */ |
---|
176 | | - priv->clk = devm_clk_get(dev, NULL); |
---|
177 | | - if (IS_ERR(priv->clk)) { |
---|
178 | | - dev_err(dev, "failed to get clock\n"); |
---|
179 | | - return PTR_ERR(priv->clk); |
---|
180 | | - } |
---|
181 | | - |
---|
182 | | - ret = clk_prepare_enable(priv->clk); |
---|
183 | | - if (ret < 0) |
---|
184 | | - return ret; |
---|
185 | | - |
---|
186 | | - port->uartclk = clk_get_rate(priv->clk); |
---|
187 | | - |
---|
188 | | - /* Check for fifo size */ |
---|
189 | | - if (of_property_read_u32(np, "fifo-size", &prop) == 0) |
---|
190 | | - port->fifosize = prop; |
---|
191 | | - else |
---|
192 | | - port->fifosize = UNIPHIER_UART_DEFAULT_FIFO_SIZE; |
---|
193 | | - |
---|
194 | | - return 0; |
---|
195 | | -} |
---|
196 | | - |
---|
197 | 158 | static int uniphier_uart_probe(struct platform_device *pdev) |
---|
198 | 159 | { |
---|
199 | 160 | struct device *dev = &pdev->dev; |
---|
.. | .. |
---|
215 | 176 | return -ENOMEM; |
---|
216 | 177 | |
---|
217 | 178 | irq = platform_get_irq(pdev, 0); |
---|
218 | | - if (irq < 0) { |
---|
219 | | - dev_err(dev, "failed to get IRQ number\n"); |
---|
| 179 | + if (irq < 0) |
---|
220 | 180 | return irq; |
---|
221 | | - } |
---|
222 | 181 | |
---|
223 | 182 | priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); |
---|
224 | 183 | if (!priv) |
---|
.. | .. |
---|
226 | 185 | |
---|
227 | 186 | memset(&up, 0, sizeof(up)); |
---|
228 | 187 | |
---|
229 | | - ret = uniphier_of_serial_setup(dev, &up.port, priv); |
---|
230 | | - if (ret < 0) |
---|
| 188 | + ret = of_alias_get_id(dev->of_node, "serial"); |
---|
| 189 | + if (ret < 0) { |
---|
| 190 | + dev_err(dev, "failed to get alias id\n"); |
---|
231 | 191 | return ret; |
---|
| 192 | + } |
---|
| 193 | + up.port.line = ret; |
---|
| 194 | + |
---|
| 195 | + priv->clk = devm_clk_get(dev, NULL); |
---|
| 196 | + if (IS_ERR(priv->clk)) { |
---|
| 197 | + dev_err(dev, "failed to get clock\n"); |
---|
| 198 | + return PTR_ERR(priv->clk); |
---|
| 199 | + } |
---|
| 200 | + |
---|
| 201 | + ret = clk_prepare_enable(priv->clk); |
---|
| 202 | + if (ret) |
---|
| 203 | + return ret; |
---|
| 204 | + |
---|
| 205 | + up.port.uartclk = clk_get_rate(priv->clk); |
---|
232 | 206 | |
---|
233 | 207 | spin_lock_init(&priv->atomic_write_lock); |
---|
234 | 208 | |
---|
.. | .. |
---|
241 | 215 | |
---|
242 | 216 | up.port.type = PORT_16550A; |
---|
243 | 217 | up.port.iotype = UPIO_MEM32; |
---|
| 218 | + up.port.fifosize = 64; |
---|
244 | 219 | up.port.regshift = UNIPHIER_UART_REGSHIFT; |
---|
245 | 220 | up.port.flags = UPF_FIXED_PORT | UPF_FIXED_TYPE; |
---|
246 | 221 | up.capabilities = UART_CAP_FIFO; |
---|
247 | 222 | |
---|
| 223 | + if (of_property_read_bool(dev->of_node, "auto-flow-control")) |
---|
| 224 | + up.capabilities |= UART_CAP_AFE; |
---|
| 225 | + |
---|
248 | 226 | up.port.serial_in = uniphier_serial_in; |
---|
249 | 227 | up.port.serial_out = uniphier_serial_out; |
---|
250 | 228 | up.dl_read = uniphier_serial_dl_read; |
---|