• Home
  • Raw
  • Download

Lines Matching +full:clkdiv +full:- +full:-

1 // SPDX-License-Identifier: GPL-2.0
15 #include <linux/platform_data/efm32-uart.h>
17 #define DRIVER_NAME "efm32-uart"
26 #define UARTn_FRAME_DATABITS(n) ((n) - 3)
86 dev_dbg(efm_port->port.dev, format, ##arg)
91 writel_relaxed(value, efm_port->port.membase + offset); in efm32_uart_write32()
97 return readl_relaxed(efm_port->port.membase + offset); in efm32_uart_read32()
134 struct uart_port *port = &efm_port->port; in efm32_uart_tx_chars()
135 struct circ_buf *xmit = &port->state->xmit; in efm32_uart_tx_chars()
139 if (port->x_char) { in efm32_uart_tx_chars()
140 port->icount.tx++; in efm32_uart_tx_chars()
141 efm32_uart_write32(efm_port, port->x_char, in efm32_uart_tx_chars()
143 port->x_char = 0; in efm32_uart_tx_chars()
147 port->icount.tx++; in efm32_uart_tx_chars()
148 efm32_uart_write32(efm_port, xmit->buf[xmit->tail], in efm32_uart_tx_chars()
150 xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); in efm32_uart_tx_chars()
158 if (!port->x_char && uart_circ_empty(xmit) && in efm32_uart_tx_chars()
193 struct uart_port *port = &efm_port->port; in efm32_uart_rx_chars()
208 port->icount.rx++; in efm32_uart_rx_chars()
213 port->icount.brk++; in efm32_uart_rx_chars()
217 port->icount.parity++; in efm32_uart_rx_chars()
219 port->icount.frame++; in efm32_uart_rx_chars()
221 rxdata &= port->read_status_mask; in efm32_uart_rx_chars()
233 if ((rxdata & port->ignore_status_mask) == 0) in efm32_uart_rx_chars()
234 tty_insert_flip_char(&port->state->port, in efm32_uart_rx_chars()
244 struct uart_port *port = &efm_port->port; in efm32_uart_rxirq()
245 struct tty_port *tport = &port->state->port; in efm32_uart_rxirq()
247 spin_lock(&port->lock); in efm32_uart_rxirq()
258 port->icount.overrun++; in efm32_uart_rxirq()
264 spin_unlock(&port->lock); in efm32_uart_rxirq()
292 ret = clk_enable(efm_port->clk); in efm32_uart_startup()
297 port->uartclk = clk_get_rate(efm_port->clk); in efm32_uart_startup()
301 UARTn_ROUTE_LOCATION(efm_port->pdata.location) | in efm32_uart_startup()
305 ret = request_irq(port->irq, efm32_uart_rxirq, 0, in efm32_uart_startup()
315 ret = request_irq(efm_port->txirq, efm32_uart_txirq, 0, in efm32_uart_startup()
319 free_irq(port->irq, efm_port); in efm32_uart_startup()
322 clk_disable(efm_port->clk); in efm32_uart_startup()
338 free_irq(port->irq, efm_port); in efm32_uart_shutdown()
340 clk_disable(efm_port->clk); in efm32_uart_shutdown()
349 u32 clkdiv; in efm32_uart_set_termios() local
353 new->c_cflag &= ~(CRTSCTS | CMSPAR); in efm32_uart_set_termios()
356 DIV_ROUND_CLOSEST(port->uartclk, 16 * 8192), in efm32_uart_set_termios()
357 DIV_ROUND_CLOSEST(port->uartclk, 16)); in efm32_uart_set_termios()
359 switch (new->c_cflag & CSIZE) { in efm32_uart_set_termios()
374 if (new->c_cflag & CSTOPB) in efm32_uart_set_termios()
380 if (new->c_cflag & PARENB) { in efm32_uart_set_termios()
381 if (new->c_cflag & PARODD) in efm32_uart_set_termios()
389 * the 6 lowest bits of CLKDIV are dc, bit 6 has value 0.25. in efm32_uart_set_termios()
390 * port->uartclk <= 14e6, so 4 * port->uartclk doesn't overflow. in efm32_uart_set_termios()
392 clkdiv = (DIV_ROUND_CLOSEST(4 * port->uartclk, 16 * baud) - 4) << 6; in efm32_uart_set_termios()
394 spin_lock_irqsave(&port->lock, flags); in efm32_uart_set_termios()
399 port->read_status_mask = UARTn_RXDATAX_RXDATA__MASK; in efm32_uart_set_termios()
400 if (new->c_iflag & INPCK) in efm32_uart_set_termios()
401 port->read_status_mask |= in efm32_uart_set_termios()
403 if (new->c_iflag & (IGNBRK | BRKINT | PARMRK)) in efm32_uart_set_termios()
404 port->read_status_mask |= SW_UARTn_RXDATAX_BERR; in efm32_uart_set_termios()
406 port->ignore_status_mask = 0; in efm32_uart_set_termios()
407 if (new->c_iflag & IGNPAR) in efm32_uart_set_termios()
408 port->ignore_status_mask |= in efm32_uart_set_termios()
410 if (new->c_iflag & IGNBRK) in efm32_uart_set_termios()
411 port->ignore_status_mask |= SW_UARTn_RXDATAX_BERR; in efm32_uart_set_termios()
413 uart_update_timeout(port, new->c_cflag, baud); in efm32_uart_set_termios()
417 efm32_uart_write32(efm_port, clkdiv, UARTn_CLKDIV); in efm32_uart_set_termios()
422 spin_unlock_irqrestore(&port->lock, flags); in efm32_uart_set_termios()
427 return port->type == PORT_EFMUART ? "efm32-uart" : NULL; in efm32_uart_type()
434 clk_unprepare(efm_port->clk); in efm32_uart_release_port()
435 clk_put(efm_port->clk); in efm32_uart_release_port()
436 iounmap(port->membase); in efm32_uart_release_port()
444 port->membase = ioremap(port->mapbase, 60); in efm32_uart_request_port()
445 if (!efm_port->port.membase) { in efm32_uart_request_port()
446 ret = -ENOMEM; in efm32_uart_request_port()
451 efm_port->clk = clk_get(port->dev, NULL); in efm32_uart_request_port()
452 if (IS_ERR(efm_port->clk)) { in efm32_uart_request_port()
453 ret = PTR_ERR(efm_port->clk); in efm32_uart_request_port()
458 ret = clk_prepare(efm_port->clk); in efm32_uart_request_port()
460 clk_put(efm_port->clk); in efm32_uart_request_port()
463 iounmap(port->membase); in efm32_uart_request_port()
474 port->type = PORT_EFMUART; in efm32_uart_config_port()
482 if (serinfo->type != PORT_UNKNOWN && serinfo->type != PORT_EFMUART) in efm32_uart_verify_port()
483 ret = -EINVAL; in efm32_uart_verify_port()
520 if (!timeout--) in efm32_uart_console_putchar()
529 struct efm32_uart_port *efm_port = efm32_uart_ports[co->index]; in efm32_uart_console_write()
536 uart_console_write(&efm_port->port, s, count, in efm32_uart_console_write()
544 if (!timeout--) in efm32_uart_console_write()
556 u32 route, clkdiv, frame; in efm32_uart_console_get_options() local
567 clkdiv = efm32_uart_read32(efm_port, UARTn_CLKDIV); in efm32_uart_console_get_options()
569 *baud = DIV_ROUND_CLOSEST(4 * efm_port->port.uartclk, in efm32_uart_console_get_options()
570 16 * (4 + (clkdiv >> 6))); in efm32_uart_console_get_options()
584 *bits = (frame & UARTn_FRAME_DATABITS__MASK) - in efm32_uart_console_get_options()
600 if (co->index < 0 || co->index >= ARRAY_SIZE(efm32_uart_ports)) { in efm32_uart_console_setup()
604 pr_warn("efm32-console: fall back to console index %u (from %hhi)\n", in efm32_uart_console_setup()
605 i, co->index); in efm32_uart_console_setup()
606 co->index = i; in efm32_uart_console_setup()
612 efm_port = efm32_uart_ports[co->index]; in efm32_uart_console_setup()
614 pr_warn("efm32-console: No port at %d\n", co->index); in efm32_uart_console_setup()
615 return -ENODEV; in efm32_uart_console_setup()
618 ret = clk_prepare(efm_port->clk); in efm32_uart_console_setup()
620 dev_warn(efm_port->port.dev, in efm32_uart_console_setup()
625 efm_port->port.uartclk = clk_get_rate(efm_port->clk); in efm32_uart_console_setup()
633 return uart_set_options(&efm_port->port, co, baud, parity, bits, flow); in efm32_uart_console_setup()
644 .index = -1,
663 struct device_node *np = pdev->dev.of_node; in efm32_uart_probe_dt()
682 dev_err(&pdev->dev, "invalid location\n"); in efm32_uart_probe_dt()
683 return -EINVAL; in efm32_uart_probe_dt()
686 efm_port->pdata.location = location; in efm32_uart_probe_dt()
693 dev_err(&pdev->dev, "failed to get alias id: %d\n", ret); in efm32_uart_probe_dt()
696 efm_port->port.line = ret; in efm32_uart_probe_dt()
711 dev_dbg(&pdev->dev, "failed to allocate private data\n"); in efm32_uart_probe()
712 return -ENOMEM; in efm32_uart_probe()
717 ret = -ENODEV; in efm32_uart_probe()
718 dev_dbg(&pdev->dev, "failed to determine base address\n"); in efm32_uart_probe()
723 ret = -EINVAL; in efm32_uart_probe()
724 dev_dbg(&pdev->dev, "memory resource too small\n"); in efm32_uart_probe()
730 dev_dbg(&pdev->dev, "failed to get rx irq\n"); in efm32_uart_probe()
734 efm_port->port.irq = ret; in efm32_uart_probe()
738 ret = efm_port->port.irq + 1; in efm32_uart_probe()
740 efm_port->txirq = ret; in efm32_uart_probe()
742 efm_port->port.dev = &pdev->dev; in efm32_uart_probe()
743 efm_port->port.mapbase = res->start; in efm32_uart_probe()
744 efm_port->port.type = PORT_EFMUART; in efm32_uart_probe()
745 efm_port->port.iotype = UPIO_MEM32; in efm32_uart_probe()
746 efm_port->port.fifosize = 2; in efm32_uart_probe()
747 efm_port->port.has_sysrq = IS_ENABLED(CONFIG_SERIAL_EFM32_UART_CONSOLE); in efm32_uart_probe()
748 efm_port->port.ops = &efm32_uart_pops; in efm32_uart_probe()
749 efm_port->port.flags = UPF_BOOT_AUTOCONF; in efm32_uart_probe()
754 const struct efm32_uart_pdata *pdata = dev_get_platdata(&pdev->dev); in efm32_uart_probe()
756 efm_port->port.line = pdev->id; in efm32_uart_probe()
759 efm_port->pdata = *pdata; in efm32_uart_probe()
763 line = efm_port->port.line; in efm32_uart_probe()
768 ret = uart_add_one_port(&efm32_uart_reg, &efm_port->port); in efm32_uart_probe()
770 dev_dbg(&pdev->dev, "failed to add port: %d\n", ret); in efm32_uart_probe()
781 dev_dbg(&pdev->dev, "\\o/\n"); in efm32_uart_probe()
790 unsigned int line = efm_port->port.line; in efm32_uart_remove()
792 uart_remove_one_port(&efm32_uart_reg, &efm_port->port); in efm32_uart_remove()
804 .compatible = "energymicro,efm32-uart",
849 MODULE_AUTHOR("Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de>");