Re: [PATCH v3 1/2] tty: serial: 8250: Add Mediatek UART driver
From: Tobias Klauser <tklauser@distanz.ch>
Date: 2014-08-12 13:57:40
Also in:
linux-serial, lkml
On 2014-08-12 at 15:31:51 +0200, Matthias Brugger [off-list ref] wrote:
2014-08-08 14:28 GMT+02:00 Tobias Klauser [off-list ref]:quoted
On 2014-08-08 at 13:32:03 +0200, Matthias Brugger [off-list ref] wrote:quoted
This patch adds support for the UART block found on Mediatek SoCs. The device has a highspeed register which influences the calcualtion of the divisor. The chip lacks support for some baudrates. When requested, we set the divisor to the next smaller baudrate and adjust the c_cflag accordingly. Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com> --- drivers/tty/serial/8250/8250_mtk.c | 296 ++++++++++++++++++++++++++++++++++++ drivers/tty/serial/8250/Kconfig | 7 + drivers/tty/serial/8250/Makefile | 1 + 3 files changed, 304 insertions(+) create mode 100644 drivers/tty/serial/8250/8250_mtk.cdiff --git a/drivers/tty/serial/8250/8250_mtk.c b/drivers/tty/serial/8250/8250_mtk.c new file mode 100644 index 0000000..d63080b --- /dev/null +++ b/drivers/tty/serial/8250/8250_mtk.c@@ -0,0 +1,296 @@[...]quoted
+static int mtk8250_probe(struct platform_device *pdev) +{ + struct uart_8250_port uart = {}; + struct resource *regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); + struct resource *irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0); + struct mtk8250_data *data; + int err; + + if (!regs || !irq) { + dev_err(&pdev->dev, "no registers/irq defined\n"); + return -EINVAL; + } + + spin_lock_init(&uart.port.lock); + uart.port.mapbase = regs->start; + uart.port.irq = irq->start; + uart.port.pm = mtk8250_do_pm; + uart.port.type = PORT_16550; + uart.port.flags = UPF_BOOT_AUTOCONF | UPF_FIXED_PORT; + uart.port.dev = &pdev->dev; + + uart.port.membase = devm_ioremap(&pdev->dev, regs->start, + resource_size(regs)); + if (!uart.port.membase) + return -ENOMEM;You can use devm_ioremap_resource here and get rid of the check for !regs above, since devm_ioremap_resource already does that. regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); ... uart.port.membase = devm_ioremap_resource(&pdev->dev, regs); if (IS_ERR(uart.port.membase)) return PTR_ERR(uart.port.membase);devm_ioremap_resource creates a busy resource region in the iomem_resource. This leads the UART to silently fail. I suppose that's why 8250_dw.c uses devm_ioremap instead of devm_ioremap_resource. The 8250_dw has the same issue.
Ah yes, of course. Sorry about that. Thanks Tobias