[RFC] serial: bcm63xx_uart: allow probing through Device Tree

Jonas Gorski jonas.gorski at gmail.com
Sun Nov 11 23:50:46 EST 2012


Add support for probing the serial ports through Device Tree.

Signed-off-by: Jonas Gorski <jonas.gorski at gmail.com>
---
 .../bindings/tty/serial/bcm63xx-uart.txt           |   17 +++++++++
 drivers/tty/serial/bcm63xx_uart.c                  |   35 ++++++++++++++------
 2 files changed, 42 insertions(+), 10 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/tty/serial/bcm63xx-uart.txt

diff --git a/Documentation/devicetree/bindings/tty/serial/bcm63xx-uart.txt b/Documentation/devicetree/bindings/tty/serial/bcm63xx-uart.txt
new file mode 100644
index 0000000..7623604
--- /dev/null
+++ b/Documentation/devicetree/bindings/tty/serial/bcm63xx-uart.txt
@@ -0,0 +1,17 @@
+* Broadcom BCM63XX UART
+
+Required properties:
+- compatible: "brcm,bcm63xx-uart"
+  Compatible with all BCM63XX SoCs.
+
+- reg: address and length of the register block.
+
+- interrupts: the uart's interrupt number.
+
+Example:
+
+	uart0: serial at 100 {
+		compatible = "brcm,bcm63xx";
+		reg = <0x100 0x18>;
+		interrupts = <2>;
+	};
diff --git a/drivers/tty/serial/bcm63xx_uart.c b/drivers/tty/serial/bcm63xx_uart.c
index 0187aff..4521a52 100644
--- a/drivers/tty/serial/bcm63xx_uart.c
+++ b/drivers/tty/serial/bcm63xx_uart.c
@@ -802,23 +802,32 @@ static struct uart_driver bcm_uart_driver = {
  */
 static int __devinit bcm_uart_probe(struct platform_device *pdev)
 {
-	struct resource *res_mem, *res_irq;
+	struct resource *res_mem;
 	struct uart_port *port;
 	struct clk *clk;
-	int ret;
+	int ret, irq;
 
-	if (pdev->id < 0 || pdev->id >= BCM63XX_NR_UARTS)
-		return -EINVAL;
+	res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	if (!res_mem)
+		return -ENODEV;
+
+	if (pdev->id < 0)  {
+		void __iomem *membase;
+
+		membase = ioremap(res_mem->start, resource_size(res_mem));
+		if (membase == (void *)bcm63xx_regset_address(RSET_UART0))
+			pdev->id = 0;
+		else
+			pdev->id = 1;
+		iounmap(membase);
+	}
 
 	if (ports[pdev->id].membase)
 		return -EBUSY;
 
-	res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-	if (!res_mem)
-		return -ENODEV;
 
-	res_irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
-	if (!res_irq)
+	irq = platform_get_irq(pdev, 0);
+	if (!irq)
 		return -ENODEV;
 
 	clk = clk_get(&pdev->dev, "periph");
@@ -829,7 +838,7 @@ static int __devinit bcm_uart_probe(struct platform_device *pdev)
 	memset(port, 0, sizeof(*port));
 	port->iotype = UPIO_MEM;
 	port->mapbase = res_mem->start;
-	port->irq = res_irq->start;
+	port->irq = irq;
 	port->ops = &bcm_uart_ops;
 	port->flags = UPF_BOOT_AUTOCONF;
 	port->dev = &pdev->dev;
@@ -862,12 +871,18 @@ static int __devexit bcm_uart_remove(struct platform_device *pdev)
 /*
  * platform driver stuff
  */
+static const struct of_device_id bcm_uart_match[] = {
+	{ .compatible = "brcm,bcm63xx-uart" },
+	{ },
+};
+
 static struct platform_driver bcm_uart_platform_driver = {
 	.probe	= bcm_uart_probe,
 	.remove	= __devexit_p(bcm_uart_remove),
 	.driver	= {
 		.owner = THIS_MODULE,
 		.name  = "bcm63xx_uart",
+		.of_match_table = bcm_uart_match,
 	},
 };
 
-- 
1.7.2.5



More information about the devicetree-discuss mailing list