Lines Matching +full:irq +full:- +full:mirror

1 // SPDX-License-Identifier: GPL-2.0+
3 * altera_uart.c -- Altera UART driver
5 * Based on mcf.c -- Freescale ColdFire UART driver
7 * (C) Copyright 2003-2007, Greg Ungerer <gerg@snapgear.com>
53 #define ALTERA_UART_STATUS_DCTS_MSK 0x0400 /* CTS logic-level change */
74 * Local per-uart structure.
80 unsigned short imr; /* Local IMR mirror */
85 return readl(port->membase + (reg << port->regshift));
90 writel(dat, port->membase + (reg << port->regshift));
106 sigs |= (pp->sigs & TIOCM_RTS);
113 unsigned short imr = pp->imr;
116 * If the device doesn't have an irq, ensure that the irq bits are
117 * masked out to keep the irq line inactive.
119 if (!pp->port.irq)
122 altera_uart_writel(&pp->port, imr, ALTERA_UART_CONTROL_REG);
129 pp->sigs = sigs;
131 pp->imr |= ALTERA_UART_CONTROL_RTS_MSK;
133 pp->imr &= ~ALTERA_UART_CONTROL_RTS_MSK;
141 pp->imr |= ALTERA_UART_CONTROL_TRDY_MSK;
149 pp->imr &= ~ALTERA_UART_CONTROL_TRDY_MSK;
157 pp->imr &= ~ALTERA_UART_CONTROL_RRDY_MSK;
167 if (break_state == -1)
168 pp->imr |= ALTERA_UART_CONTROL_TRBK_MSK;
170 pp->imr &= ~ALTERA_UART_CONTROL_TRBK_MSK;
183 baudclk = port->uartclk / baud;
190 uart_update_timeout(port, termios->c_cflag, baud);
195 * FIXME: port->read_status_mask and port->ignore_status_mask
210 port->icount.rx++;
217 port->icount.brk++;
221 port->icount.parity++;
223 port->icount.overrun++;
225 port->icount.frame++;
228 status &= port->read_status_mask;
244 tty_flip_buffer_push(&port->state->port);
257 static irqreturn_t altera_uart_interrupt(int irq, void *data)
264 isr = altera_uart_readl(port, ALTERA_UART_STATUS_REG) & pp->imr;
279 struct uart_port *port = &pp->port;
282 mod_timer(&pp->tmr, jiffies + uart_poll_timeout(port));
287 port->type = PORT_ALTERA_UART;
300 if (!port->irq) {
301 timer_setup(&pp->tmr, altera_uart_timer, 0);
302 mod_timer(&pp->tmr, jiffies + uart_poll_timeout(port));
306 ret = request_irq(port->irq, altera_uart_interrupt, 0,
307 dev_name(port->dev), port);
309 dev_err(port->dev, "unable to attach Altera UART %d interrupt vector=%d\n",
310 port->line, port->irq);
318 pp->imr = ALTERA_UART_CONTROL_RRDY_MSK;
334 pp->imr = 0;
339 if (port->irq)
340 free_irq(port->irq, port);
342 del_timer_sync(&pp->tmr);
347 return (port->type == PORT_ALTERA_UART) ? "Altera UART" : NULL;
364 if ((ser->type != PORT_UNKNOWN) && (ser->type != PORT_ALTERA_UART))
365 return -EINVAL;
430 struct uart_port *port = &(altera_uart_ports + co->index)->port;
443 if (co->index < 0 || co->index >= CONFIG_SERIAL_ALTERA_UART_MAXPORTS)
444 return -EINVAL;
445 port = &altera_uart_ports[co->index].port;
446 if (!port->membase)
447 return -ENODEV;
463 .index = -1,
480 struct earlycon_device *dev = co->data;
482 uart_console_write(&dev->port, s, count, altera_uart_console_putc);
488 struct uart_port *port = &dev->port;
490 if (!port->membase)
491 return -ENODEV;
497 if (dev->baud) {
498 unsigned int baudclk = port->uartclk / dev->baud;
503 dev->con->write = altera_uart_earlycon_write;
507 OF_EARLYCON_DECLARE(uart, "altr,uart-1.0", altera_uart_earlycon_setup);
530 struct altera_uart_platform_uart *platp = dev_get_platdata(&pdev->dev);
533 int i = pdev->id;
536 /* if id is -1 scan for a free id and use that one */
537 if (i == -1) {
544 return -EINVAL;
550 port->mapbase = res_mem->start;
552 port->mapbase = platp->mapbase;
554 return -EINVAL;
557 if (ret < 0 && ret != -ENXIO)
560 port->irq = ret;
562 port->irq = platp->irq;
566 port->uartclk = platp->uartclk;
568 ret = of_property_read_u32(pdev->dev.of_node, "clock-frequency",
569 &port->uartclk);
574 port->membase = ioremap(port->mapbase, ALTERA_UART_SIZE);
575 if (!port->membase)
576 return -ENOMEM;
579 port->regshift = platp->bus_shift;
581 port->regshift = 0;
583 port->line = i;
584 port->type = PORT_ALTERA_UART;
585 port->iotype = SERIAL_IO_MEM;
586 port->ops = &altera_uart_ops;
587 port->flags = UPF_BOOT_AUTOCONF;
588 port->dev = &pdev->dev;
603 port->mapbase = 0;
604 iounmap(port->membase);
610 { .compatible = "ALTR,uart-1.0", },
611 { .compatible = "altr,uart-1.0", },