Lines Matching +full:- +full:uart
1 // SPDX-License-Identifier: GPL-2.0
3 * timbuart.c timberdale FPGA UART driver
8 * Timberdale FPGA UART
42 u32 ier = ioread32(port->membase + TIMBUART_IER) & ~RXFLAGS; in timbuart_stop_rx()
43 iowrite32(ier, port->membase + TIMBUART_IER); in timbuart_stop_rx()
49 u32 ier = ioread32(port->membase + TIMBUART_IER) & ~TXBAE; in timbuart_stop_tx()
50 iowrite32(ier, port->membase + TIMBUART_IER); in timbuart_stop_tx()
55 struct timbuart_port *uart = in timbuart_start_tx() local
58 /* do not transfer anything here -> fire off the tasklet */ in timbuart_start_tx()
59 tasklet_schedule(&uart->tasklet); in timbuart_start_tx()
64 u32 isr = ioread32(port->membase + TIMBUART_ISR); in timbuart_tx_empty()
72 u8 ctl = ioread8(port->membase + TIMBUART_CTRL) | in timbuart_flush_buffer()
75 iowrite8(ctl, port->membase + TIMBUART_CTRL); in timbuart_flush_buffer()
76 iowrite32(TXBF, port->membase + TIMBUART_ISR); in timbuart_flush_buffer()
82 struct tty_port *tport = &port->state->port; in timbuart_rx_chars()
84 while (ioread32(port->membase + TIMBUART_ISR) & RXDP) { in timbuart_rx_chars()
85 u8 ch = ioread8(port->membase + TIMBUART_RXFIFO); in timbuart_rx_chars()
86 port->icount.rx++; in timbuart_rx_chars()
92 dev_dbg(port->dev, "%s - total read %d bytes\n", in timbuart_rx_chars()
93 __func__, port->icount.rx); in timbuart_rx_chars()
98 struct circ_buf *xmit = &port->state->xmit; in timbuart_tx_chars()
100 while (!(ioread32(port->membase + TIMBUART_ISR) & TXBF) && in timbuart_tx_chars()
102 iowrite8(xmit->buf[xmit->tail], in timbuart_tx_chars()
103 port->membase + TIMBUART_TXFIFO); in timbuart_tx_chars()
107 dev_dbg(port->dev, in timbuart_tx_chars()
108 "%s - total written %d bytes, CTL: %x, RTS: %x, baud: %x\n", in timbuart_tx_chars()
110 port->icount.tx, in timbuart_tx_chars()
111 ioread8(port->membase + TIMBUART_CTRL), in timbuart_tx_chars()
112 port->mctrl & TIOCM_RTS, in timbuart_tx_chars()
113 ioread8(port->membase + TIMBUART_BAUDRATE)); in timbuart_tx_chars()
118 struct timbuart_port *uart = in timbuart_handle_tx_port() local
120 struct circ_buf *xmit = &port->state->xmit; in timbuart_handle_tx_port()
125 if (port->x_char) in timbuart_handle_tx_port()
131 iowrite32(TXFLAGS, port->membase + TIMBUART_ISR); in timbuart_handle_tx_port()
136 /* Re-enable any tx interrupt */ in timbuart_handle_tx_port()
137 *ier |= uart->last_ier & TXFLAGS; in timbuart_handle_tx_port()
147 dev_dbg(port->dev, "%s - leaving\n", __func__); in timbuart_handle_tx_port()
155 u8 ctl = ioread8(port->membase + TIMBUART_CTRL) | in timbuart_handle_rx_port()
157 iowrite8(ctl, port->membase + TIMBUART_CTRL); in timbuart_handle_rx_port()
158 port->icount.overrun++; in timbuart_handle_rx_port()
163 iowrite32(RXFLAGS, port->membase + TIMBUART_ISR); in timbuart_handle_rx_port()
169 dev_dbg(port->dev, "%s - leaving\n", __func__); in timbuart_handle_rx_port()
174 struct timbuart_port *uart = from_tasklet(uart, t, tasklet); in timbuart_tasklet() local
177 spin_lock(&uart->port.lock); in timbuart_tasklet()
179 isr = ioread32(uart->port.membase + TIMBUART_ISR); in timbuart_tasklet()
180 dev_dbg(uart->port.dev, "%s ISR: %x\n", __func__, isr); in timbuart_tasklet()
182 if (!uart->usedma) in timbuart_tasklet()
183 timbuart_handle_tx_port(&uart->port, isr, &ier); in timbuart_tasklet()
185 timbuart_mctrl_check(&uart->port, isr, &ier); in timbuart_tasklet()
187 if (!uart->usedma) in timbuart_tasklet()
188 timbuart_handle_rx_port(&uart->port, isr, &ier); in timbuart_tasklet()
190 iowrite32(ier, uart->port.membase + TIMBUART_IER); in timbuart_tasklet()
192 spin_unlock(&uart->port.lock); in timbuart_tasklet()
193 dev_dbg(uart->port.dev, "%s leaving\n", __func__); in timbuart_tasklet()
198 u8 cts = ioread8(port->membase + TIMBUART_CTRL); in timbuart_get_mctrl()
199 dev_dbg(port->dev, "%s - cts %x\n", __func__, cts); in timbuart_get_mctrl()
209 dev_dbg(port->dev, "%s - %x\n", __func__, mctrl); in timbuart_set_mctrl()
212 iowrite8(TIMBUART_CTRL_RTS, port->membase + TIMBUART_CTRL); in timbuart_set_mctrl()
214 iowrite8(0, port->membase + TIMBUART_CTRL); in timbuart_set_mctrl()
223 iowrite32(CTS_DELTA, port->membase + TIMBUART_ISR); in timbuart_mctrl_check()
226 wake_up_interruptible(&port->state->port.delta_msr_wait); in timbuart_mctrl_check()
239 struct timbuart_port *uart = in timbuart_startup() local
242 dev_dbg(port->dev, "%s\n", __func__); in timbuart_startup()
244 iowrite8(TIMBUART_CTRL_FLSHRX, port->membase + TIMBUART_CTRL); in timbuart_startup()
245 iowrite32(0x1ff, port->membase + TIMBUART_ISR); in timbuart_startup()
248 port->membase + TIMBUART_IER); in timbuart_startup()
250 return request_irq(port->irq, timbuart_handleinterrupt, IRQF_SHARED, in timbuart_startup()
251 "timb-uart", uart); in timbuart_startup()
256 struct timbuart_port *uart = in timbuart_shutdown() local
258 dev_dbg(port->dev, "%s\n", __func__); in timbuart_shutdown()
259 free_irq(port->irq, uart); in timbuart_shutdown()
260 iowrite32(0, port->membase + TIMBUART_IER); in timbuart_shutdown()
273 return -1; in get_bindex()
284 baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk / 16); in timbuart_set_termios()
286 dev_dbg(port->dev, "%s - bindex %d\n", __func__, bindex); in timbuart_set_termios()
298 spin_lock_irqsave(&port->lock, flags); in timbuart_set_termios()
299 iowrite8((u8)bindex, port->membase + TIMBUART_BAUDRATE); in timbuart_set_termios()
300 uart_update_timeout(port, termios->c_cflag, baud); in timbuart_set_termios()
301 spin_unlock_irqrestore(&port->lock, flags); in timbuart_set_termios()
306 return port->type == PORT_UNKNOWN ? "timbuart" : NULL; in timbuart_type()
314 struct platform_device *pdev = to_platform_device(port->dev); in timbuart_release_port()
318 if (port->flags & UPF_IOREMAP) { in timbuart_release_port()
319 iounmap(port->membase); in timbuart_release_port()
320 port->membase = NULL; in timbuart_release_port()
323 release_mem_region(port->mapbase, size); in timbuart_release_port()
328 struct platform_device *pdev = to_platform_device(port->dev); in timbuart_request_port()
332 if (!request_mem_region(port->mapbase, size, "timb-uart")) in timbuart_request_port()
333 return -EBUSY; in timbuart_request_port()
335 if (port->flags & UPF_IOREMAP) { in timbuart_request_port()
336 port->membase = ioremap(port->mapbase, size); in timbuart_request_port()
337 if (port->membase == NULL) { in timbuart_request_port()
338 release_mem_region(port->mapbase, size); in timbuart_request_port()
339 return -ENOMEM; in timbuart_request_port()
348 struct timbuart_port *uart = (struct timbuart_port *)devid; in timbuart_handleinterrupt() local
350 if (ioread8(uart->port.membase + TIMBUART_IPR)) { in timbuart_handleinterrupt()
351 uart->last_ier = ioread32(uart->port.membase + TIMBUART_IER); in timbuart_handleinterrupt()
354 iowrite32(0, uart->port.membase + TIMBUART_IER); in timbuart_handleinterrupt()
357 tasklet_schedule(&uart->tasklet); in timbuart_handleinterrupt()
370 port->type = PORT_TIMBUART; in timbuart_config_port()
379 return -EINVAL; in timbuart_verify_port()
413 struct timbuart_port *uart; in timbuart_probe() local
416 dev_dbg(&dev->dev, "%s\n", __func__); in timbuart_probe()
418 uart = kzalloc(sizeof(*uart), GFP_KERNEL); in timbuart_probe()
419 if (!uart) { in timbuart_probe()
420 err = -EINVAL; in timbuart_probe()
424 uart->usedma = 0; in timbuart_probe()
426 uart->port.uartclk = 3250000 * 16; in timbuart_probe()
427 uart->port.fifosize = TIMBUART_FIFO_SIZE; in timbuart_probe()
428 uart->port.regshift = 2; in timbuart_probe()
429 uart->port.iotype = UPIO_MEM; in timbuart_probe()
430 uart->port.ops = &timbuart_ops; in timbuart_probe()
431 uart->port.irq = 0; in timbuart_probe()
432 uart->port.flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP; in timbuart_probe()
433 uart->port.line = 0; in timbuart_probe()
434 uart->port.dev = &dev->dev; in timbuart_probe()
438 err = -ENOMEM; in timbuart_probe()
441 uart->port.mapbase = iomem->start; in timbuart_probe()
442 uart->port.membase = NULL; in timbuart_probe()
446 err = -EINVAL; in timbuart_probe()
449 uart->port.irq = irq; in timbuart_probe()
451 tasklet_setup(&uart->tasklet, timbuart_tasklet); in timbuart_probe()
457 err = uart_add_one_port(&timbuart_driver, &uart->port); in timbuart_probe()
461 platform_set_drvdata(dev, uart); in timbuart_probe()
468 kfree(uart); in timbuart_probe()
470 printk(KERN_ERR "timberdale: Failed to register Timberdale UART: %d\n", in timbuart_probe()
478 struct timbuart_port *uart = platform_get_drvdata(dev); in timbuart_remove() local
480 tasklet_kill(&uart->tasklet); in timbuart_remove()
481 uart_remove_one_port(&timbuart_driver, &uart->port); in timbuart_remove()
483 kfree(uart); in timbuart_remove()
490 .name = "timb-uart",
498 MODULE_DESCRIPTION("Timberdale UART driver");
500 MODULE_ALIAS("platform:timb-uart");