Merge tag 'keys-next-fixes-20150114' of git://git.kernel.org/pub/scm/linux/kernel...
[firefly-linux-kernel-4.4.55.git] / drivers / tty / serial / bcm63xx_uart.c
index 231519022b73d095f670eacc76a34a2b7d6bc3b1..01d83df08e3d394f7a028ca1e37fa2429eab2644 100644 (file)
@@ -588,20 +588,7 @@ static void bcm_uart_set_termios(struct uart_port *port,
  */
 static int bcm_uart_request_port(struct uart_port *port)
 {
-       unsigned int size;
-
-       size = UART_REG_SIZE;
-       if (!request_mem_region(port->mapbase, size, "bcm63xx")) {
-               dev_err(port->dev, "Memory region busy\n");
-               return -EBUSY;
-       }
-
-       port->membase = ioremap(port->mapbase, size);
-       if (!port->membase) {
-               dev_err(port->dev, "Unable to map registers\n");
-               release_mem_region(port->mapbase, size);
-               return -EBUSY;
-       }
+       /* UARTs always present */
        return 0;
 }
 
@@ -610,8 +597,7 @@ static int bcm_uart_request_port(struct uart_port *port)
  */
 static void bcm_uart_release_port(struct uart_port *port)
 {
-       release_mem_region(port->mapbase, UART_REG_SIZE);
-       iounmap(port->membase);
+       /* Nothing to release ... */
 }
 
 /*
@@ -782,6 +768,26 @@ static int __init bcm63xx_console_init(void)
 
 console_initcall(bcm63xx_console_init);
 
+static void bcm_early_write(struct console *con, const char *s, unsigned n)
+{
+       struct earlycon_device *dev = con->data;
+
+       uart_console_write(&dev->port, s, n, bcm_console_putchar);
+       wait_for_xmitr(&dev->port);
+}
+
+static int __init bcm_early_console_setup(struct earlycon_device *device,
+                                         const char *opt)
+{
+       if (!device->port.membase)
+               return -ENODEV;
+
+       device->con->write = bcm_early_write;
+       return 0;
+}
+
+OF_EARLYCON_DECLARE(bcm63xx_uart, "brcm,bcm6345-uart", bcm_early_console_setup);
+
 #define BCM63XX_CONSOLE        (&bcm63xx_console)
 #else
 #define BCM63XX_CONSOLE        NULL
@@ -813,25 +819,30 @@ static int bcm_uart_probe(struct platform_device *pdev)
        if (pdev->id < 0 || pdev->id >= BCM63XX_NR_UARTS)
                return -EINVAL;
 
-       if (ports[pdev->id].membase)
+       port = &ports[pdev->id];
+       if (port->membase)
                return -EBUSY;
+       memset(port, 0, sizeof(*port));
 
        res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (!res_mem)
                return -ENODEV;
 
+       port->mapbase = res_mem->start;
+       port->membase = devm_ioremap_resource(&pdev->dev, res_mem);
+       if (IS_ERR(port->membase))
+               return PTR_ERR(port->membase);
+
        res_irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
        if (!res_irq)
                return -ENODEV;
 
-       clk = clk_get(&pdev->dev, "periph");
+       clk = pdev->dev.of_node ? of_clk_get(pdev->dev.of_node, 0) :
+                                 clk_get(&pdev->dev, "periph");
        if (IS_ERR(clk))
                return -ENODEV;
 
-       port = &ports[pdev->id];
-       memset(port, 0, sizeof(*port));
        port->iotype = UPIO_MEM;
-       port->mapbase = res_mem->start;
        port->irq = res_irq->start;
        port->ops = &bcm_uart_ops;
        port->flags = UPF_BOOT_AUTOCONF;
@@ -874,7 +885,6 @@ static struct platform_driver bcm_uart_platform_driver = {
        .probe  = bcm_uart_probe,
        .remove = bcm_uart_remove,
        .driver = {
-               .owner = THIS_MODULE,
                .name  = "bcm63xx_uart",
                .of_match_table = bcm63xx_of_match,
        },
@@ -905,5 +915,5 @@ module_init(bcm_uart_init);
 module_exit(bcm_uart_exit);
 
 MODULE_AUTHOR("Maxime Bizon <mbizon@freebox.fr>");
-MODULE_DESCRIPTION("Broadcom 63<xx integrated uart driver");
+MODULE_DESCRIPTION("Broadcom 63xx integrated uart driver");
 MODULE_LICENSE("GPL");