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