Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * LiteUART serial controller (LiteX) Driver
4 *
5 * Copyright (C) 2019-2020 Antmicro <www.antmicro.com>
6 */
7
8#include <linux/bits.h>
9#include <linux/console.h>
10#include <linux/interrupt.h>
11#include <linux/litex.h>
12#include <linux/module.h>
13#include <linux/of.h>
14#include <linux/of_address.h>
15#include <linux/of_platform.h>
16#include <linux/serial.h>
17#include <linux/serial_core.h>
18#include <linux/slab.h>
19#include <linux/timer.h>
20#include <linux/tty_flip.h>
21#include <linux/xarray.h>
22
23/*
24 * CSRs definitions (base address offsets + width)
25 *
26 * The definitions below are true for LiteX SoC configured for 8-bit CSR Bus,
27 * 32-bit aligned.
28 *
29 * Supporting other configurations might require new definitions or a more
30 * generic way of indexing the LiteX CSRs.
31 *
32 * For more details on how CSRs are defined and handled in LiteX, see comments
33 * in the LiteX SoC Driver: drivers/soc/litex/litex_soc_ctrl.c
34 */
35#define OFF_RXTX 0x00
36#define OFF_TXFULL 0x04
37#define OFF_RXEMPTY 0x08
38#define OFF_EV_STATUS 0x0c
39#define OFF_EV_PENDING 0x10
40#define OFF_EV_ENABLE 0x14
41
42/* events */
43#define EV_TX BIT(0)
44#define EV_RX BIT(1)
45
46struct liteuart_port {
47 struct uart_port port;
48 struct timer_list timer;
49 u8 irq_reg;
50};
51
52#define to_liteuart_port(port) container_of(port, struct liteuart_port, port)
53
54static DEFINE_XARRAY_FLAGS(liteuart_array, XA_FLAGS_ALLOC);
55
56#ifdef CONFIG_SERIAL_LITEUART_CONSOLE
57static struct console liteuart_console;
58#endif
59
60static struct uart_driver liteuart_driver = {
61 .owner = THIS_MODULE,
62 .driver_name = KBUILD_MODNAME,
63 .dev_name = "ttyLXU",
64 .major = 0,
65 .minor = 0,
66 .nr = CONFIG_SERIAL_LITEUART_MAX_PORTS,
67#ifdef CONFIG_SERIAL_LITEUART_CONSOLE
68 .cons = &liteuart_console,
69#endif
70};
71
72static void liteuart_update_irq_reg(struct uart_port *port, bool set, u8 mask)
73{
74 struct liteuart_port *uart = to_liteuart_port(port);
75
76 if (set)
77 uart->irq_reg |= mask;
78 else
79 uart->irq_reg &= ~mask;
80
81 if (port->irq)
82 litex_write8(port->membase + OFF_EV_ENABLE, uart->irq_reg);
83}
84
85static void liteuart_stop_tx(struct uart_port *port)
86{
87 liteuart_update_irq_reg(port, false, EV_TX);
88}
89
90static void liteuart_start_tx(struct uart_port *port)
91{
92 liteuart_update_irq_reg(port, true, EV_TX);
93}
94
95static void liteuart_stop_rx(struct uart_port *port)
96{
97 struct liteuart_port *uart = to_liteuart_port(port);
98
99 /* just delete timer */
100 del_timer(&uart->timer);
101}
102
103static void liteuart_rx_chars(struct uart_port *port)
104{
105 unsigned char __iomem *membase = port->membase;
106 u8 ch;
107
108 while (!litex_read8(membase + OFF_RXEMPTY)) {
109 ch = litex_read8(membase + OFF_RXTX);
110 port->icount.rx++;
111
112 /* necessary for RXEMPTY to refresh its value */
113 litex_write8(membase + OFF_EV_PENDING, EV_RX);
114
115 /* no overflow bits in status */
116 if (!(uart_handle_sysrq_char(port, ch)))
117 uart_insert_char(port, 1, 0, ch, TTY_NORMAL);
118 }
119
120 tty_flip_buffer_push(&port->state->port);
121}
122
123static void liteuart_tx_chars(struct uart_port *port)
124{
125 u8 ch;
126
127 uart_port_tx(port, ch,
128 !litex_read8(port->membase + OFF_TXFULL),
129 litex_write8(port->membase + OFF_RXTX, ch));
130}
131
132static irqreturn_t liteuart_interrupt(int irq, void *data)
133{
134 struct liteuart_port *uart = data;
135 struct uart_port *port = &uart->port;
136 unsigned long flags;
137 u8 isr;
138
139 /*
140 * if polling, the context would be "in_serving_softirq", so use
141 * irq[save|restore] spin_lock variants to cover all possibilities
142 */
143 spin_lock_irqsave(&port->lock, flags);
144 isr = litex_read8(port->membase + OFF_EV_PENDING) & uart->irq_reg;
145 if (isr & EV_RX)
146 liteuart_rx_chars(port);
147 if (isr & EV_TX)
148 liteuart_tx_chars(port);
149 spin_unlock_irqrestore(&port->lock, flags);
150
151 return IRQ_RETVAL(isr);
152}
153
154static void liteuart_timer(struct timer_list *t)
155{
156 struct liteuart_port *uart = from_timer(uart, t, timer);
157 struct uart_port *port = &uart->port;
158
159 liteuart_interrupt(0, port);
160 mod_timer(&uart->timer, jiffies + uart_poll_timeout(port));
161}
162
163static unsigned int liteuart_tx_empty(struct uart_port *port)
164{
165 /* not really tx empty, just checking if tx is not full */
166 if (!litex_read8(port->membase + OFF_TXFULL))
167 return TIOCSER_TEMT;
168
169 return 0;
170}
171
172static void liteuart_set_mctrl(struct uart_port *port, unsigned int mctrl)
173{
174 /* modem control register is not present in LiteUART */
175}
176
177static unsigned int liteuart_get_mctrl(struct uart_port *port)
178{
179 return TIOCM_CTS | TIOCM_DSR | TIOCM_CAR;
180}
181
182static int liteuart_startup(struct uart_port *port)
183{
184 struct liteuart_port *uart = to_liteuart_port(port);
185 unsigned long flags;
186 int ret;
187
188 if (port->irq) {
189 ret = request_irq(port->irq, liteuart_interrupt, 0,
190 KBUILD_MODNAME, uart);
191 if (ret) {
192 dev_warn(port->dev,
193 "line %d irq %d failed: switch to polling\n",
194 port->line, port->irq);
195 port->irq = 0;
196 }
197 }
198
199 spin_lock_irqsave(&port->lock, flags);
200 /* only enabling rx irqs during startup */
201 liteuart_update_irq_reg(port, true, EV_RX);
202 spin_unlock_irqrestore(&port->lock, flags);
203
204 if (!port->irq) {
205 timer_setup(&uart->timer, liteuart_timer, 0);
206 mod_timer(&uart->timer, jiffies + uart_poll_timeout(port));
207 }
208
209 return 0;
210}
211
212static void liteuart_shutdown(struct uart_port *port)
213{
214 struct liteuart_port *uart = to_liteuart_port(port);
215 unsigned long flags;
216
217 spin_lock_irqsave(&port->lock, flags);
218 liteuart_update_irq_reg(port, false, EV_RX | EV_TX);
219 spin_unlock_irqrestore(&port->lock, flags);
220
221 if (port->irq)
222 free_irq(port->irq, port);
223 else
224 del_timer_sync(&uart->timer);
225}
226
227static void liteuart_set_termios(struct uart_port *port, struct ktermios *new,
228 const struct ktermios *old)
229{
230 unsigned int baud;
231 unsigned long flags;
232
233 spin_lock_irqsave(&port->lock, flags);
234
235 /* update baudrate */
236 baud = uart_get_baud_rate(port, new, old, 0, 460800);
237 uart_update_timeout(port, new->c_cflag, baud);
238
239 spin_unlock_irqrestore(&port->lock, flags);
240}
241
242static const char *liteuart_type(struct uart_port *port)
243{
244 return "liteuart";
245}
246
247static void liteuart_config_port(struct uart_port *port, int flags)
248{
249 /*
250 * Driver core for serial ports forces a non-zero value for port type.
251 * Write an arbitrary value here to accommodate the serial core driver,
252 * as ID part of UAPI is redundant.
253 */
254 port->type = 1;
255}
256
257static int liteuart_verify_port(struct uart_port *port,
258 struct serial_struct *ser)
259{
260 if (port->type != PORT_UNKNOWN && ser->type != 1)
261 return -EINVAL;
262
263 return 0;
264}
265
266static const struct uart_ops liteuart_ops = {
267 .tx_empty = liteuart_tx_empty,
268 .set_mctrl = liteuart_set_mctrl,
269 .get_mctrl = liteuart_get_mctrl,
270 .stop_tx = liteuart_stop_tx,
271 .start_tx = liteuart_start_tx,
272 .stop_rx = liteuart_stop_rx,
273 .startup = liteuart_startup,
274 .shutdown = liteuart_shutdown,
275 .set_termios = liteuart_set_termios,
276 .type = liteuart_type,
277 .config_port = liteuart_config_port,
278 .verify_port = liteuart_verify_port,
279};
280
281static int liteuart_probe(struct platform_device *pdev)
282{
283 struct liteuart_port *uart;
284 struct uart_port *port;
285 struct xa_limit limit;
286 int dev_id, ret;
287
288 uart = devm_kzalloc(&pdev->dev, sizeof(struct liteuart_port), GFP_KERNEL);
289 if (!uart)
290 return -ENOMEM;
291
292 port = &uart->port;
293
294 /* get membase */
295 port->membase = devm_platform_get_and_ioremap_resource(pdev, 0, NULL);
296 if (IS_ERR(port->membase))
297 return PTR_ERR(port->membase);
298
299 ret = platform_get_irq_optional(pdev, 0);
300 if (ret < 0 && ret != -ENXIO)
301 return ret;
302 if (ret > 0)
303 port->irq = ret;
304
305 /* look for aliases; auto-enumerate for free index if not found */
306 dev_id = of_alias_get_id(pdev->dev.of_node, "serial");
307 if (dev_id < 0)
308 limit = XA_LIMIT(0, CONFIG_SERIAL_LITEUART_MAX_PORTS);
309 else
310 limit = XA_LIMIT(dev_id, dev_id);
311
312 ret = xa_alloc(&liteuart_array, &dev_id, uart, limit, GFP_KERNEL);
313 if (ret)
314 return ret;
315
316 /* values not from device tree */
317 port->dev = &pdev->dev;
318 port->iotype = UPIO_MEM;
319 port->flags = UPF_BOOT_AUTOCONF;
320 port->ops = &liteuart_ops;
321 port->fifosize = 16;
322 port->type = PORT_UNKNOWN;
323 port->line = dev_id;
324 spin_lock_init(&port->lock);
325
326 platform_set_drvdata(pdev, port);
327
328 ret = uart_add_one_port(&liteuart_driver, &uart->port);
329 if (ret)
330 goto err_erase_id;
331
332 return 0;
333
334err_erase_id:
335 xa_erase(&liteuart_array, dev_id);
336
337 return ret;
338}
339
340static int liteuart_remove(struct platform_device *pdev)
341{
342 struct uart_port *port = platform_get_drvdata(pdev);
343 unsigned int line = port->line;
344
345 uart_remove_one_port(&liteuart_driver, port);
346 xa_erase(&liteuart_array, line);
347
348 return 0;
349}
350
351static const struct of_device_id liteuart_of_match[] = {
352 { .compatible = "litex,liteuart" },
353 {}
354};
355MODULE_DEVICE_TABLE(of, liteuart_of_match);
356
357static struct platform_driver liteuart_platform_driver = {
358 .probe = liteuart_probe,
359 .remove = liteuart_remove,
360 .driver = {
361 .name = KBUILD_MODNAME,
362 .of_match_table = liteuart_of_match,
363 },
364};
365
366#ifdef CONFIG_SERIAL_LITEUART_CONSOLE
367
368static void liteuart_putchar(struct uart_port *port, unsigned char ch)
369{
370 while (litex_read8(port->membase + OFF_TXFULL))
371 cpu_relax();
372
373 litex_write8(port->membase + OFF_RXTX, ch);
374}
375
376static void liteuart_console_write(struct console *co, const char *s,
377 unsigned int count)
378{
379 struct liteuart_port *uart;
380 struct uart_port *port;
381 unsigned long flags;
382
383 uart = (struct liteuart_port *)xa_load(&liteuart_array, co->index);
384 port = &uart->port;
385
386 spin_lock_irqsave(&port->lock, flags);
387 uart_console_write(port, s, count, liteuart_putchar);
388 spin_unlock_irqrestore(&port->lock, flags);
389}
390
391static int liteuart_console_setup(struct console *co, char *options)
392{
393 struct liteuart_port *uart;
394 struct uart_port *port;
395 int baud = 115200;
396 int bits = 8;
397 int parity = 'n';
398 int flow = 'n';
399
400 uart = (struct liteuart_port *)xa_load(&liteuart_array, co->index);
401 if (!uart)
402 return -ENODEV;
403
404 port = &uart->port;
405 if (!port->membase)
406 return -ENODEV;
407
408 if (options)
409 uart_parse_options(options, &baud, &parity, &bits, &flow);
410
411 return uart_set_options(port, co, baud, parity, bits, flow);
412}
413
414static struct console liteuart_console = {
415 .name = KBUILD_MODNAME,
416 .write = liteuart_console_write,
417 .device = uart_console_device,
418 .setup = liteuart_console_setup,
419 .flags = CON_PRINTBUFFER,
420 .index = -1,
421 .data = &liteuart_driver,
422};
423
424static int __init liteuart_console_init(void)
425{
426 register_console(&liteuart_console);
427
428 return 0;
429}
430console_initcall(liteuart_console_init);
431
432static void early_liteuart_write(struct console *console, const char *s,
433 unsigned int count)
434{
435 struct earlycon_device *device = console->data;
436 struct uart_port *port = &device->port;
437
438 uart_console_write(port, s, count, liteuart_putchar);
439}
440
441static int __init early_liteuart_setup(struct earlycon_device *device,
442 const char *options)
443{
444 if (!device->port.membase)
445 return -ENODEV;
446
447 device->con->write = early_liteuart_write;
448 return 0;
449}
450
451OF_EARLYCON_DECLARE(liteuart, "litex,liteuart", early_liteuart_setup);
452#endif /* CONFIG_SERIAL_LITEUART_CONSOLE */
453
454static int __init liteuart_init(void)
455{
456 int res;
457
458 res = uart_register_driver(&liteuart_driver);
459 if (res)
460 return res;
461
462 res = platform_driver_register(&liteuart_platform_driver);
463 if (res)
464 uart_unregister_driver(&liteuart_driver);
465
466 return res;
467}
468
469static void __exit liteuart_exit(void)
470{
471 platform_driver_unregister(&liteuart_platform_driver);
472 uart_unregister_driver(&liteuart_driver);
473}
474
475module_init(liteuart_init);
476module_exit(liteuart_exit);
477
478MODULE_AUTHOR("Antmicro <www.antmicro.com>");
479MODULE_DESCRIPTION("LiteUART serial driver");
480MODULE_LICENSE("GPL v2");
481MODULE_ALIAS("platform:liteuart");