Lines Matching +full:sc9836 +full:- +full:uart
1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) 2012-2015 Spreadtrum Communications Inc.
119 return readl_relaxed(port->membase + offset); in serial_in()
124 writel_relaxed(value, port->membase + offset); in serial_out()
199 port->icount.brk++; in handle_lsr_errors()
204 port->icount.parity++; in handle_lsr_errors()
206 port->icount.frame++; in handle_lsr_errors()
208 port->icount.overrun++; in handle_lsr_errors()
211 *lsr &= port->read_status_mask; in handle_lsr_errors()
224 struct tty_port *tty = &port->state->port; in sprd_rx()
227 while ((serial_in(port, SPRD_STS1) & 0x00ff) && max_count--) { in sprd_rx()
231 port->icount.rx++; in sprd_rx()
248 struct circ_buf *xmit = &port->state->xmit; in sprd_tx()
251 if (port->x_char) { in sprd_tx()
252 serial_out(port, SPRD_TXD, port->x_char); in sprd_tx()
253 port->icount.tx++; in sprd_tx()
254 port->x_char = 0; in sprd_tx()
265 serial_out(port, SPRD_TXD, xmit->buf[xmit->tail]); in sprd_tx()
266 xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); in sprd_tx()
267 port->icount.tx++; in sprd_tx()
270 } while (--count > 0); in sprd_tx()
285 spin_lock(&port->lock); in sprd_handle_irq()
290 spin_unlock(&port->lock); in sprd_handle_irq()
304 spin_unlock(&port->lock); in sprd_handle_irq()
321 while (timeout-- && serial_in(port, SPRD_STS1) & 0x00ff) in sprd_startup()
326 while (timeout-- && serial_in(port, SPRD_STS1) & 0xff00) in sprd_startup()
335 snprintf(sp->name, sizeof(sp->name), "sprd_serial%d", port->line); in sprd_startup()
336 ret = devm_request_irq(port->dev, port->irq, sprd_handle_irq, in sprd_startup()
337 IRQF_SHARED, sp->name, port); in sprd_startup()
339 dev_err(port->dev, "fail to request serial irq %d, ret=%d\n", in sprd_startup()
340 port->irq, ret); in sprd_startup()
348 spin_lock_irqsave(&port->lock, flags); in sprd_startup()
352 spin_unlock_irqrestore(&port->lock, flags); in sprd_startup()
361 devm_free_irq(port->dev, port->irq, port); in sprd_shutdown()
375 quot = (unsigned int)((port->uartclk + baud / 2) / baud); in sprd_set_termios()
378 switch (termios->c_cflag & CSIZE) { in sprd_set_termios()
396 if (termios->c_cflag & CSTOPB) in sprd_set_termios()
403 termios->c_cflag &= ~CMSPAR; /* no support mark/space */ in sprd_set_termios()
404 if (termios->c_cflag & PARENB) { in sprd_set_termios()
406 if (termios->c_cflag & PARODD) in sprd_set_termios()
412 spin_lock_irqsave(&port->lock, flags); in sprd_set_termios()
414 /* update the per-port timeout */ in sprd_set_termios()
415 uart_update_timeout(port, termios->c_cflag, baud); in sprd_set_termios()
417 port->read_status_mask = SPRD_LSR_OE; in sprd_set_termios()
418 if (termios->c_iflag & INPCK) in sprd_set_termios()
419 port->read_status_mask |= SPRD_LSR_FE | SPRD_LSR_PE; in sprd_set_termios()
420 if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK)) in sprd_set_termios()
421 port->read_status_mask |= SPRD_LSR_BI; in sprd_set_termios()
424 port->ignore_status_mask = 0; in sprd_set_termios()
425 if (termios->c_iflag & IGNPAR) in sprd_set_termios()
426 port->ignore_status_mask |= SPRD_LSR_PE | SPRD_LSR_FE; in sprd_set_termios()
427 if (termios->c_iflag & IGNBRK) { in sprd_set_termios()
428 port->ignore_status_mask |= SPRD_LSR_BI; in sprd_set_termios()
433 if (termios->c_iflag & IGNPAR) in sprd_set_termios()
434 port->ignore_status_mask |= SPRD_LSR_OE; in sprd_set_termios()
440 if (termios->c_cflag & CRTSCTS) { in sprd_set_termios()
455 spin_unlock_irqrestore(&port->lock, flags); in sprd_set_termios()
480 port->type = PORT_SPRD; in sprd_config_port()
486 if (ser->type != PORT_SPRD) in sprd_verify_port()
487 return -EINVAL; in sprd_verify_port()
488 if (port->irq != ser->irq) in sprd_verify_port()
489 return -EINVAL; in sprd_verify_port()
490 if (port->iotype != ser->io_type) in sprd_verify_port()
491 return -EINVAL; in sprd_verify_port()
521 if (--tmout == 0) in wait_for_xmitr()
536 struct uart_port *port = &sprd_port[co->index]->port; in sprd_console_write()
540 if (port->sysrq) in sprd_console_write()
543 locked = spin_trylock_irqsave(&port->lock, flags); in sprd_console_write()
545 spin_lock_irqsave(&port->lock, flags); in sprd_console_write()
553 spin_unlock_irqrestore(&port->lock, flags); in sprd_console_write()
564 if (co->index >= UART_NR_MAX || co->index < 0) in sprd_console_setup()
565 co->index = 0; in sprd_console_setup()
567 port = &sprd_port[co->index]->port; in sprd_console_setup()
569 pr_info("serial port %d not yet initialized\n", co->index); in sprd_console_setup()
570 return -ENODEV; in sprd_console_setup()
585 .index = -1,
596 while (timeout-- && in sprd_putc()
597 !(readl(port->membase + SPRD_LSR) & SPRD_LSR_TX_OVER)) in sprd_putc()
600 writeb(c, port->membase + SPRD_TXD); in sprd_putc()
606 struct earlycon_device *dev = con->data; in sprd_early_write()
608 uart_console_write(&dev->port, s, n, sprd_putc); in sprd_early_write()
615 if (!device->port.membase) in sprd_early_console_setup()
616 return -ENODEV; in sprd_early_console_setup()
618 device->con->write = sprd_early_write; in sprd_early_console_setup()
621 OF_EARLYCON_DECLARE(sprd_serial, "sprd,sc9836-uart",
646 np = dev->of_node; in sprd_probe_dt_alias()
666 uart_remove_one_port(&sprd_uart_driver, &sup->port); in sprd_remove()
667 sprd_port[sup->port.line] = NULL; in sprd_remove()
668 sprd_ports_num--; in sprd_remove()
691 return -EBUSY; in sprd_probe()
693 index = sprd_probe_dt_alias(index, &pdev->dev); in sprd_probe()
695 sprd_port[index] = devm_kzalloc(&pdev->dev, in sprd_probe()
698 return -ENOMEM; in sprd_probe()
700 up = &sprd_port[index]->port; in sprd_probe()
701 up->dev = &pdev->dev; in sprd_probe()
702 up->line = index; in sprd_probe()
703 up->type = PORT_SPRD; in sprd_probe()
704 up->iotype = UPIO_MEM; in sprd_probe()
705 up->uartclk = SPRD_DEF_RATE; in sprd_probe()
706 up->fifosize = SPRD_FIFO_SIZE; in sprd_probe()
707 up->ops = &serial_sprd_ops; in sprd_probe()
708 up->flags = UPF_BOOT_AUTOCONF; in sprd_probe()
710 clk = devm_clk_get(&pdev->dev, NULL); in sprd_probe()
712 up->uartclk = clk_get_rate(clk); in sprd_probe()
716 dev_err(&pdev->dev, "not provide mem resource\n"); in sprd_probe()
717 return -ENODEV; in sprd_probe()
719 up->mapbase = res->start; in sprd_probe()
720 up->membase = devm_ioremap_resource(&pdev->dev, res); in sprd_probe()
721 if (IS_ERR(up->membase)) in sprd_probe()
722 return PTR_ERR(up->membase); in sprd_probe()
726 dev_err(&pdev->dev, "not provide irq resource: %d\n", irq); in sprd_probe()
729 up->irq = irq; in sprd_probe()
734 pr_err("Failed to register SPRD-UART driver\n"); in sprd_probe()
756 uart_suspend_port(&sprd_uart_driver, &sup->port); in sprd_suspend()
765 uart_resume_port(&sprd_uart_driver, &sup->port); in sprd_resume()
774 {.compatible = "sprd,sc9836-uart",},