Skip to content

Commit

Permalink
tty: ar933x_uart: add device tree support and binding documentation
Browse files Browse the repository at this point in the history
Modify the probe routine to get the port line number
from device tree if the 'of_node' is populated in the
platform device. The driver can be built as module,
thus add an OF specific module device table as well
to support module auto loading.

This makes it possible to use the driver for AR9330
UART devices specified in device tree.

Cc: devicetree@vger.kernel.org
Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Gabor Juhos authored and Greg Kroah-Hartman committed Aug 30, 2013
1 parent 284301e commit dd910d9
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 3 deletions.
34 changes: 34 additions & 0 deletions Documentation/devicetree/bindings/tty/serial/qca,ar9330-uart.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
* Qualcomm Atheros AR9330 High-Speed UART

Required properties:

- compatible: Must be "qca,ar9330-uart"

- reg: Specifies the physical base address of the controller and
the length of the memory mapped region.

- interrupt-parent: The phandle for the interrupt controller that
services interrupts for this device.

- interrupts: Specifies the interrupt source of the parent interrupt
controller. The format of the interrupt specifier depends on the
parent interrupt controller.

Additional requirements:

Each UART port must have an alias correctly numbered in "aliases"
node.

Example:

aliases {
serial0 = &uart0;
};

uart0: uart@18020000 {
compatible = "qca,ar9330-uart";
reg = <0x18020000 0x14>;

interrupt-parent = <&intc>;
interrupts = <3>;
};
28 changes: 25 additions & 3 deletions drivers/tty/serial/ar933x_uart.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
#include <linux/sysrq.h>
#include <linux/delay.h>
#include <linux/platform_device.h>
#include <linux/of.h>
#include <linux/of_platform.h>
#include <linux/tty.h>
#include <linux/tty_flip.h>
#include <linux/serial_core.h>
Expand Down Expand Up @@ -623,13 +625,24 @@ static int ar933x_uart_probe(struct platform_device *pdev)
struct uart_port *port;
struct resource *mem_res;
struct resource *irq_res;
struct device_node *np;
unsigned int baud;
int id;
int ret;

id = pdev->id;
if (id == -1)
id = 0;
np = pdev->dev.of_node;
if (config_enabled(CONFIG_OF) && np) {
id = of_alias_get_id(np, "serial");
if (id < 0) {
dev_err(&pdev->dev, "unable to get alias id, err=%d\n",
id);
return id;
}
} else {
id = pdev->id;
if (id == -1)
id = 0;
}

if (id > CONFIG_SERIAL_AR933X_NR_UARTS)
return -EINVAL;
Expand Down Expand Up @@ -713,12 +726,21 @@ static int ar933x_uart_remove(struct platform_device *pdev)
return 0;
}

#ifdef CONFIG_OF
static const struct of_device_id ar933x_uart_of_ids[] = {
{ .compatible = "qca,ar9330-uart" },
{},
};
MODULE_DEVICE_TABLE(of, ar933x_uart_of_ids);
#endif

static struct platform_driver ar933x_uart_platform_driver = {
.probe = ar933x_uart_probe,
.remove = ar933x_uart_remove,
.driver = {
.name = DRIVER_NAME,
.owner = THIS_MODULE,
.of_match_table = of_match_ptr(ar933x_uart_of_ids),
},
};

Expand Down

0 comments on commit dd910d9

Please sign in to comment.