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#if defined(CONFIG_SERIAL_ARC_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
28#define SUPPORT_SYSRQ
29#endif
30
31#include <linux/module.h>
32#include <linux/serial.h>
33#include <linux/console.h>
34#include <linux/sysrq.h>
35#include <linux/platform_device.h>
36#include <linux/tty.h>
37#include <linux/tty_flip.h>
38#include <linux/serial_core.h>
39#include <linux/io.h>
40#include <linux/of_irq.h>
41#include <linux/of_address.h>
42
43
44
45
46#define ARC_UART_TX_FIFO_SIZE 1
47
48
49
50
51
52#define R_ID0 0
53#define R_ID1 4
54#define R_ID2 8
55#define R_ID3 12
56#define R_DATA 16
57#define R_STS 20
58#define R_BAUDL 24
59#define R_BAUDH 28
60
61
62#define RXIENB 0x04
63#define TXIENB 0x40
64
65#define RXEMPTY 0x20
66#define TXEMPTY 0x80
67
68#define RXFULL 0x08
69#define RXFULL1 0x10
70
71#define RXFERR 0x01
72#define RXOERR 0x02
73
74
75#define RBASE(port, reg) (port->membase + reg)
76#define UART_REG_SET(u, r, v) writeb((v), RBASE(u, r))
77#define UART_REG_GET(u, r) readb(RBASE(u, r))
78
79#define UART_REG_OR(u, r, v) UART_REG_SET(u, r, UART_REG_GET(u, r) | (v))
80#define UART_REG_CLR(u, r, v) UART_REG_SET(u, r, UART_REG_GET(u, r) & ~(v))
81
82
83#define UART_SET_DATA(uart, val) UART_REG_SET(uart, R_DATA, val)
84#define UART_GET_DATA(uart) UART_REG_GET(uart, R_DATA)
85
86#define UART_SET_BAUDH(uart, val) UART_REG_SET(uart, R_BAUDH, val)
87#define UART_SET_BAUDL(uart, val) UART_REG_SET(uart, R_BAUDL, val)
88
89#define UART_CLR_STATUS(uart, val) UART_REG_CLR(uart, R_STS, val)
90#define UART_GET_STATUS(uart) UART_REG_GET(uart, R_STS)
91
92#define UART_ALL_IRQ_DISABLE(uart) UART_REG_CLR(uart, R_STS, RXIENB|TXIENB)
93#define UART_RX_IRQ_DISABLE(uart) UART_REG_CLR(uart, R_STS, RXIENB)
94#define UART_TX_IRQ_DISABLE(uart) UART_REG_CLR(uart, R_STS, TXIENB)
95
96#define UART_ALL_IRQ_ENABLE(uart) UART_REG_OR(uart, R_STS, RXIENB|TXIENB)
97#define UART_RX_IRQ_ENABLE(uart) UART_REG_OR(uart, R_STS, RXIENB)
98#define UART_TX_IRQ_ENABLE(uart) UART_REG_OR(uart, R_STS, TXIENB)
99
100#define ARC_SERIAL_DEV_NAME "ttyARC"
101
102struct arc_uart_port {
103 struct uart_port port;
104 unsigned long baud;
105};
106
107#define to_arc_port(uport) container_of(uport, struct arc_uart_port, port)
108
109static struct arc_uart_port arc_uart_ports[CONFIG_SERIAL_ARC_NR_PORTS];
110
111#ifdef CONFIG_SERIAL_ARC_CONSOLE
112static struct console arc_console;
113#endif
114
115#define DRIVER_NAME "arc-uart"
116
117static struct uart_driver arc_uart_driver = {
118 .owner = THIS_MODULE,
119 .driver_name = DRIVER_NAME,
120 .dev_name = ARC_SERIAL_DEV_NAME,
121 .major = 0,
122 .minor = 0,
123 .nr = CONFIG_SERIAL_ARC_NR_PORTS,
124#ifdef CONFIG_SERIAL_ARC_CONSOLE
125 .cons = &arc_console,
126#endif
127};
128
129static void arc_serial_stop_rx(struct uart_port *port)
130{
131 UART_RX_IRQ_DISABLE(port);
132}
133
134static void arc_serial_stop_tx(struct uart_port *port)
135{
136 while (!(UART_GET_STATUS(port) & TXEMPTY))
137 cpu_relax();
138
139 UART_TX_IRQ_DISABLE(port);
140}
141
142
143
144
145static unsigned int arc_serial_tx_empty(struct uart_port *port)
146{
147 unsigned int stat;
148
149 stat = UART_GET_STATUS(port);
150 if (stat & TXEMPTY)
151 return TIOCSER_TEMT;
152
153 return 0;
154}
155
156
157
158
159
160
161
162
163static void arc_serial_tx_chars(struct uart_port *port)
164{
165 struct circ_buf *xmit = &port->state->xmit;
166 int sent = 0;
167 unsigned char ch;
168
169 if (unlikely(port->x_char)) {
170 UART_SET_DATA(port, port->x_char);
171 port->icount.tx++;
172 port->x_char = 0;
173 sent = 1;
174 } else if (!uart_circ_empty(xmit)) {
175 ch = xmit->buf[xmit->tail];
176 xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
177 port->icount.tx++;
178 while (!(UART_GET_STATUS(port) & TXEMPTY))
179 cpu_relax();
180 UART_SET_DATA(port, ch);
181 sent = 1;
182 }
183
184
185
186
187
188 if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
189 uart_write_wakeup(port);
190
191 if (sent)
192 UART_TX_IRQ_ENABLE(port);
193}
194
195
196
197
198
199static void arc_serial_start_tx(struct uart_port *port)
200{
201 arc_serial_tx_chars(port);
202}
203
204static void arc_serial_rx_chars(struct uart_port *port, unsigned int status)
205{
206 unsigned int ch, flg = 0;
207
208
209
210
211
212
213
214
215
216
217 do {
218
219
220
221
222 if (unlikely(status & (RXOERR | RXFERR))) {
223 if (status & RXOERR) {
224 port->icount.overrun++;
225 flg = TTY_OVERRUN;
226 UART_CLR_STATUS(port, RXOERR);
227 }
228
229 if (status & RXFERR) {
230 port->icount.frame++;
231 flg = TTY_FRAME;
232 UART_CLR_STATUS(port, RXFERR);
233 }
234 } else
235 flg = TTY_NORMAL;
236
237 if (status & RXEMPTY)
238 continue;
239
240 ch = UART_GET_DATA(port);
241 port->icount.rx++;
242
243 if (!(uart_handle_sysrq_char(port, ch)))
244 uart_insert_char(port, status, RXOERR, ch, flg);
245
246 spin_unlock(&port->lock);
247 tty_flip_buffer_push(&port->state->port);
248 spin_lock(&port->lock);
249 } while (!((status = UART_GET_STATUS(port)) & RXEMPTY));
250}
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280static irqreturn_t arc_serial_isr(int irq, void *dev_id)
281{
282 struct uart_port *port = dev_id;
283 unsigned int status;
284
285 status = UART_GET_STATUS(port);
286
287
288
289
290
291
292 if (status & RXIENB) {
293
294
295 spin_lock(&port->lock);
296 arc_serial_rx_chars(port, status);
297 spin_unlock(&port->lock);
298 }
299
300 if ((status & TXIENB) && (status & TXEMPTY)) {
301
302
303
304
305 UART_TX_IRQ_DISABLE(port);
306
307 spin_lock(&port->lock);
308
309 if (!uart_tx_stopped(port))
310 arc_serial_tx_chars(port);
311
312 spin_unlock(&port->lock);
313 }
314
315 return IRQ_HANDLED;
316}
317
318static unsigned int arc_serial_get_mctrl(struct uart_port *port)
319{
320
321
322
323
324
325
326
327 return TIOCM_CTS | TIOCM_DSR | TIOCM_CAR;
328}
329
330static void arc_serial_set_mctrl(struct uart_port *port, unsigned int mctrl)
331{
332
333}
334
335static void arc_serial_break_ctl(struct uart_port *port, int break_state)
336{
337
338}
339
340static int arc_serial_startup(struct uart_port *port)
341{
342
343 UART_ALL_IRQ_DISABLE(port);
344
345 if (request_irq(port->irq, arc_serial_isr, 0, "arc uart rx-tx", port)) {
346 dev_warn(port->dev, "Unable to attach ARC UART intr\n");
347 return -EBUSY;
348 }
349
350 UART_RX_IRQ_ENABLE(port);
351
352 return 0;
353}
354
355
356static void arc_serial_shutdown(struct uart_port *port)
357{
358 free_irq(port->irq, port);
359}
360
361static void
362arc_serial_set_termios(struct uart_port *port, struct ktermios *new,
363 struct ktermios *old)
364{
365 struct arc_uart_port *uart = to_arc_port(port);
366 unsigned int baud, uartl, uarth, hw_val;
367 unsigned long flags;
368
369
370
371
372
373
374
375
376 baud = uart_get_baud_rate(port, new, old, 0, 460800);
377
378 hw_val = port->uartclk / (uart->baud * 4) - 1;
379 uartl = hw_val & 0xFF;
380 uarth = (hw_val >> 8) & 0xFF;
381
382 spin_lock_irqsave(&port->lock, flags);
383
384 UART_ALL_IRQ_DISABLE(port);
385
386 UART_SET_BAUDL(port, uartl);
387 UART_SET_BAUDH(port, uarth);
388
389 UART_RX_IRQ_ENABLE(port);
390
391
392
393
394
395 new->c_cflag &= ~(CMSPAR|CRTSCTS|CSIZE);
396 new->c_cflag |= CS8;
397
398 if (old)
399 tty_termios_copy_hw(new, old);
400
401
402 if (tty_termios_baud_rate(new))
403 tty_termios_encode_baud_rate(new, baud, baud);
404
405 uart_update_timeout(port, new->c_cflag, baud);
406
407 spin_unlock_irqrestore(&port->lock, flags);
408}
409
410static const char *arc_serial_type(struct uart_port *port)
411{
412 return port->type == PORT_ARC ? DRIVER_NAME : NULL;
413}
414
415static void arc_serial_release_port(struct uart_port *port)
416{
417}
418
419static int arc_serial_request_port(struct uart_port *port)
420{
421 return 0;
422}
423
424
425
426
427static int
428arc_serial_verify_port(struct uart_port *port, struct serial_struct *ser)
429{
430 if (port->type != PORT_UNKNOWN && ser->type != PORT_ARC)
431 return -EINVAL;
432
433 return 0;
434}
435
436
437
438
439static void arc_serial_config_port(struct uart_port *port, int flags)
440{
441 if (flags & UART_CONFIG_TYPE)
442 port->type = PORT_ARC;
443}
444
445#ifdef CONFIG_CONSOLE_POLL
446
447static void arc_serial_poll_putchar(struct uart_port *port, unsigned char chr)
448{
449 while (!(UART_GET_STATUS(port) & TXEMPTY))
450 cpu_relax();
451
452 UART_SET_DATA(port, chr);
453}
454
455static int arc_serial_poll_getchar(struct uart_port *port)
456{
457 unsigned char chr;
458
459 while (!(UART_GET_STATUS(port) & RXEMPTY))
460 cpu_relax();
461
462 chr = UART_GET_DATA(port);
463 return chr;
464}
465#endif
466
467static struct uart_ops arc_serial_pops = {
468 .tx_empty = arc_serial_tx_empty,
469 .set_mctrl = arc_serial_set_mctrl,
470 .get_mctrl = arc_serial_get_mctrl,
471 .stop_tx = arc_serial_stop_tx,
472 .start_tx = arc_serial_start_tx,
473 .stop_rx = arc_serial_stop_rx,
474 .break_ctl = arc_serial_break_ctl,
475 .startup = arc_serial_startup,
476 .shutdown = arc_serial_shutdown,
477 .set_termios = arc_serial_set_termios,
478 .type = arc_serial_type,
479 .release_port = arc_serial_release_port,
480 .request_port = arc_serial_request_port,
481 .config_port = arc_serial_config_port,
482 .verify_port = arc_serial_verify_port,
483#ifdef CONFIG_CONSOLE_POLL
484 .poll_put_char = arc_serial_poll_putchar,
485 .poll_get_char = arc_serial_poll_getchar,
486#endif
487};
488
489#ifdef CONFIG_SERIAL_ARC_CONSOLE
490
491static int arc_serial_console_setup(struct console *co, char *options)
492{
493 struct uart_port *port;
494 int baud = 115200;
495 int bits = 8;
496 int parity = 'n';
497 int flow = 'n';
498
499 if (co->index < 0 || co->index >= CONFIG_SERIAL_ARC_NR_PORTS)
500 return -ENODEV;
501
502
503
504
505
506 port = &arc_uart_ports[co->index].port;
507 if (!port->membase)
508 return -ENODEV;
509
510 if (options)
511 uart_parse_options(options, &baud, &parity, &bits, &flow);
512
513
514
515
516
517 return uart_set_options(port, co, baud, parity, bits, flow);
518}
519
520static void arc_serial_console_putchar(struct uart_port *port, int ch)
521{
522 while (!(UART_GET_STATUS(port) & TXEMPTY))
523 cpu_relax();
524
525 UART_SET_DATA(port, (unsigned char)ch);
526}
527
528
529
530
531static void arc_serial_console_write(struct console *co, const char *s,
532 unsigned int count)
533{
534 struct uart_port *port = &arc_uart_ports[co->index].port;
535 unsigned long flags;
536
537 spin_lock_irqsave(&port->lock, flags);
538 uart_console_write(port, s, count, arc_serial_console_putchar);
539 spin_unlock_irqrestore(&port->lock, flags);
540}
541
542static struct console arc_console = {
543 .name = ARC_SERIAL_DEV_NAME,
544 .write = arc_serial_console_write,
545 .device = uart_console_device,
546 .setup = arc_serial_console_setup,
547 .flags = CON_PRINTBUFFER,
548 .index = -1,
549 .data = &arc_uart_driver
550};
551
552static __init void arc_early_serial_write(struct console *con, const char *s,
553 unsigned int n)
554{
555 struct earlycon_device *dev = con->data;
556
557 uart_console_write(&dev->port, s, n, arc_serial_console_putchar);
558}
559
560static int __init arc_early_console_setup(struct earlycon_device *dev,
561 const char *opt)
562{
563 struct uart_port *port = &dev->port;
564 unsigned int l, h, hw_val;
565
566 if (!dev->port.membase)
567 return -ENODEV;
568
569 hw_val = port->uartclk / (dev->baud * 4) - 1;
570 l = hw_val & 0xFF;
571 h = (hw_val >> 8) & 0xFF;
572
573 UART_SET_BAUDL(port, l);
574 UART_SET_BAUDH(port, h);
575
576 dev->con->write = arc_early_serial_write;
577 return 0;
578}
579OF_EARLYCON_DECLARE(arc_uart, "snps,arc-uart", arc_early_console_setup);
580
581#endif
582
583static int arc_serial_probe(struct platform_device *pdev)
584{
585 struct device_node *np = pdev->dev.of_node;
586 struct arc_uart_port *uart;
587 struct uart_port *port;
588 int dev_id;
589 u32 val;
590
591
592 if (!np)
593 return -ENODEV;
594
595 dev_id = of_alias_get_id(np, "serial");
596 if (dev_id < 0)
597 dev_id = 0;
598
599 uart = &arc_uart_ports[dev_id];
600 port = &uart->port;
601
602 if (of_property_read_u32(np, "clock-frequency", &val)) {
603 dev_err(&pdev->dev, "clock-frequency property NOTset\n");
604 return -EINVAL;
605 }
606 port->uartclk = val;
607
608 if (of_property_read_u32(np, "current-speed", &val)) {
609 dev_err(&pdev->dev, "current-speed property NOT set\n");
610 return -EINVAL;
611 }
612 uart->baud = val;
613
614 port->membase = of_iomap(np, 0);
615 if (!port->membase)
616
617 return -ENXIO;
618
619 port->irq = irq_of_parse_and_map(np, 0);
620
621 port->dev = &pdev->dev;
622 port->iotype = UPIO_MEM;
623 port->flags = UPF_BOOT_AUTOCONF;
624 port->line = dev_id;
625 port->ops = &arc_serial_pops;
626
627 port->fifosize = ARC_UART_TX_FIFO_SIZE;
628
629
630
631
632
633 port->ignore_status_mask = 0;
634
635 return uart_add_one_port(&arc_uart_driver, &arc_uart_ports[dev_id].port);
636}
637
638static int arc_serial_remove(struct platform_device *pdev)
639{
640
641 return 0;
642}
643
644static const struct of_device_id arc_uart_dt_ids[] = {
645 { .compatible = "snps,arc-uart" },
646 { }
647};
648MODULE_DEVICE_TABLE(of, arc_uart_dt_ids);
649
650static struct platform_driver arc_platform_driver = {
651 .probe = arc_serial_probe,
652 .remove = arc_serial_remove,
653 .driver = {
654 .name = DRIVER_NAME,
655 .of_match_table = arc_uart_dt_ids,
656 },
657};
658
659static int __init arc_serial_init(void)
660{
661 int ret;
662
663 ret = uart_register_driver(&arc_uart_driver);
664 if (ret)
665 return ret;
666
667 ret = platform_driver_register(&arc_platform_driver);
668 if (ret)
669 uart_unregister_driver(&arc_uart_driver);
670
671 return ret;
672}
673
674static void __exit arc_serial_exit(void)
675{
676 platform_driver_unregister(&arc_platform_driver);
677 uart_unregister_driver(&arc_uart_driver);
678}
679
680module_init(arc_serial_init);
681module_exit(arc_serial_exit);
682
683MODULE_LICENSE("GPL");
684MODULE_ALIAS("platform:" DRIVER_NAME);
685MODULE_AUTHOR("Vineet Gupta");
686MODULE_DESCRIPTION("ARC(Synopsys) On-Chip(fpga) serial driver");
687