Lines Matching +full:up +full:- +full:to

1 // SPDX-License-Identifier: GPL-2.0+
16 * This hardware is similar to 8250, but its register map is a bit different:
17 * - MMIO32 (regshift = 2)
18 * - FCR is not at 2, but 3
19 * - LCR and MCR are not at 3 and 4, they share 4
20 * - No SCR (Instead, CHAR can be used as a scratch register)
21 * - Divisor latch at 9, no divisor latch access bit
43 if (!device->port.membase) in uniphier_early_console_setup()
44 return -ENODEV; in uniphier_early_console_setup()
47 device->port.iotype = UPIO_MEM32; in uniphier_early_console_setup()
48 device->port.regshift = UNIPHIER_UART_REGSHIFT; in uniphier_early_console_setup()
54 device->baud = 0; in uniphier_early_console_setup()
58 OF_EARLYCON_DECLARE(uniphier, "socionext,uniphier-uart",
64 * IO callbacks must be overridden for correct access to FCR, LCR, MCR and SCR.
89 * share the same offset that must be accessed by 32-bit write/read. in uniphier_serial_in()
90 * 8 or 16 bit access to this hardware result in unexpected behavior. in uniphier_serial_in()
92 return (readl(p->membase + offset) >> valshift) & 0xff; in uniphier_serial_in()
123 writel(value, p->membase + offset); in uniphier_serial_out()
127 * must be 32-bit accessed. As this is not longer atomic safe, in uniphier_serial_out()
130 struct uniphier8250_priv *priv = p->private_data; in uniphier_serial_out()
134 spin_lock_irqsave(&priv->atomic_write_lock, flags); in uniphier_serial_out()
135 tmp = readl(p->membase + offset); in uniphier_serial_out()
138 writel(tmp, p->membase + offset); in uniphier_serial_out()
139 spin_unlock_irqrestore(&priv->atomic_write_lock, flags); in uniphier_serial_out()
148 static u32 uniphier_serial_dl_read(struct uart_8250_port *up) in uniphier_serial_dl_read() argument
150 return readl(up->port.membase + UNIPHIER_UART_DLR); in uniphier_serial_dl_read()
153 static void uniphier_serial_dl_write(struct uart_8250_port *up, u32 value) in uniphier_serial_dl_write() argument
155 writel(value, up->port.membase + UNIPHIER_UART_DLR); in uniphier_serial_dl_write()
160 struct device *dev = &pdev->dev; in uniphier_uart_probe()
161 struct uart_8250_port up; in uniphier_uart_probe() local
169 dev_err(dev, "failed to get memory resource\n"); in uniphier_uart_probe()
170 return -EINVAL; in uniphier_uart_probe()
173 membase = devm_ioremap(dev, regs->start, resource_size(regs)); in uniphier_uart_probe()
175 return -ENOMEM; in uniphier_uart_probe()
179 return -ENOMEM; in uniphier_uart_probe()
181 memset(&up, 0, sizeof(up)); in uniphier_uart_probe()
183 priv->clk = devm_clk_get(dev, NULL); in uniphier_uart_probe()
184 if (IS_ERR(priv->clk)) { in uniphier_uart_probe()
185 dev_err(dev, "failed to get clock\n"); in uniphier_uart_probe()
186 return PTR_ERR(priv->clk); in uniphier_uart_probe()
189 ret = clk_prepare_enable(priv->clk); in uniphier_uart_probe()
193 up.port.uartclk = clk_get_rate(priv->clk); in uniphier_uart_probe()
195 spin_lock_init(&priv->atomic_write_lock); in uniphier_uart_probe()
197 up.port.dev = dev; in uniphier_uart_probe()
198 up.port.private_data = priv; in uniphier_uart_probe()
199 up.port.mapbase = regs->start; in uniphier_uart_probe()
200 up.port.mapsize = resource_size(regs); in uniphier_uart_probe()
201 up.port.membase = membase; in uniphier_uart_probe()
203 ret = uart_read_port_properties(&up.port); in uniphier_uart_probe()
207 up.port.type = PORT_16550A; in uniphier_uart_probe()
208 up.port.iotype = UPIO_MEM32; in uniphier_uart_probe()
209 up.port.fifosize = 64; in uniphier_uart_probe()
210 up.port.regshift = UNIPHIER_UART_REGSHIFT; in uniphier_uart_probe()
211 up.port.flags = UPF_FIXED_PORT | UPF_FIXED_TYPE; in uniphier_uart_probe()
212 up.capabilities = UART_CAP_FIFO; in uniphier_uart_probe()
214 if (of_property_read_bool(dev->of_node, "auto-flow-control")) in uniphier_uart_probe()
215 up.capabilities |= UART_CAP_AFE; in uniphier_uart_probe()
217 up.port.serial_in = uniphier_serial_in; in uniphier_uart_probe()
218 up.port.serial_out = uniphier_serial_out; in uniphier_uart_probe()
219 up.dl_read = uniphier_serial_dl_read; in uniphier_uart_probe()
220 up.dl_write = uniphier_serial_dl_write; in uniphier_uart_probe()
222 ret = serial8250_register_8250_port(&up); in uniphier_uart_probe()
224 dev_err(dev, "failed to register 8250 port\n"); in uniphier_uart_probe()
225 clk_disable_unprepare(priv->clk); in uniphier_uart_probe()
228 priv->line = ret; in uniphier_uart_probe()
239 serial8250_unregister_port(priv->line); in uniphier_uart_remove()
240 clk_disable_unprepare(priv->clk); in uniphier_uart_remove()
246 struct uart_8250_port *up = serial8250_get_port(priv->line); in uniphier_uart_suspend() local
248 serial8250_suspend_port(priv->line); in uniphier_uart_suspend()
250 if (!uart_console(&up->port) || console_suspend_enabled) in uniphier_uart_suspend()
251 clk_disable_unprepare(priv->clk); in uniphier_uart_suspend()
259 struct uart_8250_port *up = serial8250_get_port(priv->line); in uniphier_uart_resume() local
262 if (!uart_console(&up->port) || console_suspend_enabled) { in uniphier_uart_resume()
263 ret = clk_prepare_enable(priv->clk); in uniphier_uart_resume()
268 serial8250_resume_port(priv->line); in uniphier_uart_resume()
278 { .compatible = "socionext,uniphier-uart" },
287 .name = "uniphier-uart",