From e806922fc527112e859c09aa066e1139556bc633 Mon Sep 17 00:00:00 2001 From: Rajendra Nayak Date: Wed, 14 Dec 2011 17:25:45 +0530 Subject: [PATCH] --- yaml --- r: 281919 b: refs/heads/master c: d92b0dfc5078aeec869d58372dbda5e16739b8de h: refs/heads/master i: 281917: 377a82b77d9a34b513286db4e937355c42e91fc1 281915: a748515ce5f8c76bc32c20218c3a9911d0f71781 281911: 178c3d2840da37566b8a812e86eeaf0d62921996 281903: 5c34195be29f5153968965d805482467cf707691 281887: 6b1f98a9d42369ab2253b10f275a42eaa7c316a3 281855: 96046defd95756488f9ee7f54a6aa8959a4ab95a v: v3 --- [refs] | 2 +- .../bindings/serial/omap_serial.txt | 10 +++++ trunk/drivers/tty/serial/omap-serial.c | 45 +++++++++++++++++-- 3 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 trunk/Documentation/devicetree/bindings/serial/omap_serial.txt diff --git a/[refs] b/[refs] index 95094c58183c..9c72ce6e0461 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 8fe789dc375a1929bf64a9b982140cf394c8bce5 +refs/heads/master: d92b0dfc5078aeec869d58372dbda5e16739b8de diff --git a/trunk/Documentation/devicetree/bindings/serial/omap_serial.txt b/trunk/Documentation/devicetree/bindings/serial/omap_serial.txt new file mode 100644 index 000000000000..342eedd10050 --- /dev/null +++ b/trunk/Documentation/devicetree/bindings/serial/omap_serial.txt @@ -0,0 +1,10 @@ +OMAP UART controller + +Required properties: +- compatible : should be "ti,omap2-uart" for OMAP2 controllers +- compatible : should be "ti,omap3-uart" for OMAP3 controllers +- compatible : should be "ti,omap4-uart" for OMAP4 controllers +- ti,hwmods : Must be "uart", n being the instance number (1-based) + +Optional properties: +- clock-frequency : frequency of the clock input to the UART diff --git a/trunk/drivers/tty/serial/omap-serial.c b/trunk/drivers/tty/serial/omap-serial.c index c5b545f19a16..ca24ab37d11c 100644 --- a/trunk/drivers/tty/serial/omap-serial.c +++ b/trunk/drivers/tty/serial/omap-serial.c @@ -38,6 +38,7 @@ #include #include #include +#include #include #include @@ -1325,6 +1326,19 @@ static void uart_tx_dma_callback(int lch, u16 ch_status, void *data) return; } +static struct omap_uart_port_info *of_get_uart_port_info(struct device *dev) +{ + struct omap_uart_port_info *omap_up_info; + + omap_up_info = devm_kzalloc(dev, sizeof(*omap_up_info), GFP_KERNEL); + if (!omap_up_info) + return NULL; /* out of memory */ + + of_property_read_u32(dev->of_node, "clock-frequency", + &omap_up_info->uartclk); + return omap_up_info; +} + static int serial_omap_probe(struct platform_device *pdev) { struct uart_omap_port *up; @@ -1332,6 +1346,9 @@ static int serial_omap_probe(struct platform_device *pdev) struct omap_uart_port_info *omap_up_info = pdev->dev.platform_data; int ret = -ENOSPC; + if (pdev->dev.of_node) + omap_up_info = of_get_uart_port_info(&pdev->dev); + mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!mem) { dev_err(&pdev->dev, "no mem resource?\n"); @@ -1376,9 +1393,20 @@ static int serial_omap_probe(struct platform_device *pdev) up->port.regshift = 2; up->port.fifosize = 64; up->port.ops = &serial_omap_pops; - up->port.line = pdev->id; - sprintf(up->name, "OMAP UART%d", up->port.line); + if (pdev->dev.of_node) + up->port.line = of_alias_get_id(pdev->dev.of_node, "serial"); + else + up->port.line = pdev->id; + + if (up->port.line < 0) { + dev_err(&pdev->dev, "failed to get alias/pdev id, errno %d\n", + up->port.line); + ret = -ENODEV; + goto err; + } + + sprintf(up->name, "OMAP UART%d", up->port.line); up->port.mapbase = mem->start; up->port.membase = ioremap(mem->start, resource_size(mem)); if (!up->port.membase) { @@ -1531,7 +1559,7 @@ static int serial_omap_runtime_suspend(struct device *dev) if (!up) return -EINVAL; - if (!pdata->enable_wakeup) + if (!pdata || !pdata->enable_wakeup) return 0; if (pdata->get_context_loss_count) @@ -1592,12 +1620,23 @@ static const struct dev_pm_ops serial_omap_dev_pm_ops = { serial_omap_runtime_resume, NULL) }; +#if defined(CONFIG_OF) +static const struct of_device_id omap_serial_of_match[] = { + { .compatible = "ti,omap2-uart" }, + { .compatible = "ti,omap3-uart" }, + { .compatible = "ti,omap4-uart" }, + {}, +}; +MODULE_DEVICE_TABLE(of, omap_serial_of_match); +#endif + static struct platform_driver serial_omap_driver = { .probe = serial_omap_probe, .remove = serial_omap_remove, .driver = { .name = DRIVER_NAME, .pm = &serial_omap_dev_pm_ops, + .of_match_table = of_match_ptr(omap_serial_of_match), }, };