Thread (8 messages) 8 messages, 3 authors, 2014-08-12

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-devicetree, 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.c
diff --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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help