xref: /openbmc/linux/drivers/tty/serial/liteuart.c (revision 29e5c442)
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 
liteuart_update_irq_reg(struct uart_port * port,bool set,u8 mask)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 
liteuart_stop_tx(struct uart_port * port)84 static void liteuart_stop_tx(struct uart_port *port)
85 {
86 	liteuart_update_irq_reg(port, false, EV_TX);
87 }
88 
liteuart_start_tx(struct uart_port * port)89 static void liteuart_start_tx(struct uart_port *port)
90 {
91 	liteuart_update_irq_reg(port, true, EV_TX);
92 }
93 
liteuart_stop_rx(struct uart_port * port)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 
liteuart_rx_chars(struct uart_port * port)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 
liteuart_tx_chars(struct uart_port * port)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 
liteuart_interrupt(int irq,void * data)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 	spin_lock_irqsave(&port->lock, 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 	spin_unlock_irqrestore(&port->lock, flags);
149 
150 	return IRQ_RETVAL(isr);
151 }
152 
liteuart_timer(struct timer_list * t)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 
liteuart_tx_empty(struct uart_port * port)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 
liteuart_set_mctrl(struct uart_port * port,unsigned int mctrl)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 
liteuart_get_mctrl(struct uart_port * port)176 static unsigned int liteuart_get_mctrl(struct uart_port *port)
177 {
178 	return TIOCM_CTS | TIOCM_DSR | TIOCM_CAR;
179 }
180 
liteuart_startup(struct uart_port * port)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 	spin_lock_irqsave(&port->lock, flags);
199 	/* only enabling rx irqs during startup */
200 	liteuart_update_irq_reg(port, true, EV_RX);
201 	spin_unlock_irqrestore(&port->lock, 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 
liteuart_shutdown(struct uart_port * port)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 	spin_lock_irqsave(&port->lock, flags);
217 	liteuart_update_irq_reg(port, false, EV_RX | EV_TX);
218 	spin_unlock_irqrestore(&port->lock, flags);
219 
220 	if (port->irq)
221 		free_irq(port->irq, port);
222 	else
223 		del_timer_sync(&uart->timer);
224 }
225 
liteuart_set_termios(struct uart_port * port,struct ktermios * new,const struct ktermios * old)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 	spin_lock_irqsave(&port->lock, 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 	spin_unlock_irqrestore(&port->lock, flags);
239 }
240 
liteuart_type(struct uart_port * port)241 static const char *liteuart_type(struct uart_port *port)
242 {
243 	return "liteuart";
244 }
245 
liteuart_config_port(struct uart_port * port,int flags)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 
liteuart_verify_port(struct uart_port * port,struct serial_struct * ser)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 
liteuart_probe(struct platform_device * pdev)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 
liteuart_remove(struct platform_device * pdev)339 static int 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 	return 0;
348 }
349 
350 static const struct of_device_id liteuart_of_match[] = {
351 	{ .compatible = "litex,liteuart" },
352 	{}
353 };
354 MODULE_DEVICE_TABLE(of, liteuart_of_match);
355 
356 static struct platform_driver liteuart_platform_driver = {
357 	.probe = liteuart_probe,
358 	.remove = liteuart_remove,
359 	.driver = {
360 		.name = KBUILD_MODNAME,
361 		.of_match_table = liteuart_of_match,
362 	},
363 };
364 
365 #ifdef CONFIG_SERIAL_LITEUART_CONSOLE
366 
liteuart_putchar(struct uart_port * port,unsigned char ch)367 static void liteuart_putchar(struct uart_port *port, unsigned char ch)
368 {
369 	while (litex_read8(port->membase + OFF_TXFULL))
370 		cpu_relax();
371 
372 	litex_write8(port->membase + OFF_RXTX, ch);
373 }
374 
liteuart_console_write(struct console * co,const char * s,unsigned int count)375 static void liteuart_console_write(struct console *co, const char *s,
376 	unsigned int count)
377 {
378 	struct liteuart_port *uart;
379 	struct uart_port *port;
380 	unsigned long flags;
381 
382 	uart = (struct liteuart_port *)xa_load(&liteuart_array, co->index);
383 	port = &uart->port;
384 
385 	spin_lock_irqsave(&port->lock, flags);
386 	uart_console_write(port, s, count, liteuart_putchar);
387 	spin_unlock_irqrestore(&port->lock, flags);
388 }
389 
liteuart_console_setup(struct console * co,char * options)390 static int liteuart_console_setup(struct console *co, char *options)
391 {
392 	struct liteuart_port *uart;
393 	struct uart_port *port;
394 	int baud = 115200;
395 	int bits = 8;
396 	int parity = 'n';
397 	int flow = 'n';
398 
399 	uart = (struct liteuart_port *)xa_load(&liteuart_array, co->index);
400 	if (!uart)
401 		return -ENODEV;
402 
403 	port = &uart->port;
404 	if (!port->membase)
405 		return -ENODEV;
406 
407 	if (options)
408 		uart_parse_options(options, &baud, &parity, &bits, &flow);
409 
410 	return uart_set_options(port, co, baud, parity, bits, flow);
411 }
412 
413 static struct console liteuart_console = {
414 	.name = KBUILD_MODNAME,
415 	.write = liteuart_console_write,
416 	.device = uart_console_device,
417 	.setup = liteuart_console_setup,
418 	.flags = CON_PRINTBUFFER,
419 	.index = -1,
420 	.data = &liteuart_driver,
421 };
422 
liteuart_console_init(void)423 static int __init liteuart_console_init(void)
424 {
425 	register_console(&liteuart_console);
426 
427 	return 0;
428 }
429 console_initcall(liteuart_console_init);
430 
early_liteuart_write(struct console * console,const char * s,unsigned int count)431 static void early_liteuart_write(struct console *console, const char *s,
432 				    unsigned int count)
433 {
434 	struct earlycon_device *device = console->data;
435 	struct uart_port *port = &device->port;
436 
437 	uart_console_write(port, s, count, liteuart_putchar);
438 }
439 
early_liteuart_setup(struct earlycon_device * device,const char * options)440 static int __init early_liteuart_setup(struct earlycon_device *device,
441 				       const char *options)
442 {
443 	if (!device->port.membase)
444 		return -ENODEV;
445 
446 	device->con->write = early_liteuart_write;
447 	return 0;
448 }
449 
450 OF_EARLYCON_DECLARE(liteuart, "litex,liteuart", early_liteuart_setup);
451 #endif /* CONFIG_SERIAL_LITEUART_CONSOLE */
452 
liteuart_init(void)453 static int __init liteuart_init(void)
454 {
455 	int res;
456 
457 	res = uart_register_driver(&liteuart_driver);
458 	if (res)
459 		return res;
460 
461 	res = platform_driver_register(&liteuart_platform_driver);
462 	if (res)
463 		uart_unregister_driver(&liteuart_driver);
464 
465 	return res;
466 }
467 
liteuart_exit(void)468 static void __exit liteuart_exit(void)
469 {
470 	platform_driver_unregister(&liteuart_platform_driver);
471 	uart_unregister_driver(&liteuart_driver);
472 }
473 
474 module_init(liteuart_init);
475 module_exit(liteuart_exit);
476 
477 MODULE_AUTHOR("Antmicro <www.antmicro.com>");
478 MODULE_DESCRIPTION("LiteUART serial driver");
479 MODULE_LICENSE("GPL v2");
480 MODULE_ALIAS("platform:liteuart");
481