aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/tty
diff options
context:
space:
mode:
authorRajendra Nayak <rnayak@ti.com>2011-12-14 06:55:45 -0500
committerTony Lindgren <tony@atomide.com>2011-12-16 17:11:06 -0500
commitd92b0dfc5078aeec869d58372dbda5e16739b8de (patch)
tree2f8d3c57855e0c567e533286ad7653e873ec2af9 /drivers/tty
parent8fe789dc375a1929bf64a9b982140cf394c8bce5 (diff)
omap-serial: Add minimal device tree support
Adapt the driver to device tree and pass minimal platform data from device tree needed for console boot. No power management features will be suppported for now since it requires more tweaks around OCP settings to toggle forceidle/noidle/smartidle bits and handling remote wakeup and dynamic muxing. Signed-off-by: Rajendra Nayak <rnayak@ti.com> Reviewed-by: Rob Herring <rob.herring@calxeda.com> Signed-off-by: Tony Lindgren <tony@atomide.com>
Diffstat (limited to 'drivers/tty')
-rw-r--r--drivers/tty/serial/omap-serial.c45
1 files changed, 42 insertions, 3 deletions
diff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c
index c5b545f19a16..ca24ab37d11c 100644
--- a/drivers/tty/serial/omap-serial.c
+++ b/drivers/tty/serial/omap-serial.c
@@ -38,6 +38,7 @@
38#include <linux/serial_core.h> 38#include <linux/serial_core.h>
39#include <linux/irq.h> 39#include <linux/irq.h>
40#include <linux/pm_runtime.h> 40#include <linux/pm_runtime.h>
41#include <linux/of.h>
41 42
42#include <plat/dma.h> 43#include <plat/dma.h>
43#include <plat/dmtimer.h> 44#include <plat/dmtimer.h>
@@ -1325,6 +1326,19 @@ static void uart_tx_dma_callback(int lch, u16 ch_status, void *data)
1325 return; 1326 return;
1326} 1327}
1327 1328
1329static struct omap_uart_port_info *of_get_uart_port_info(struct device *dev)
1330{
1331 struct omap_uart_port_info *omap_up_info;
1332
1333 omap_up_info = devm_kzalloc(dev, sizeof(*omap_up_info), GFP_KERNEL);
1334 if (!omap_up_info)
1335 return NULL; /* out of memory */
1336
1337 of_property_read_u32(dev->of_node, "clock-frequency",
1338 &omap_up_info->uartclk);
1339 return omap_up_info;
1340}
1341
1328static int serial_omap_probe(struct platform_device *pdev) 1342static int serial_omap_probe(struct platform_device *pdev)
1329{ 1343{
1330 struct uart_omap_port *up; 1344 struct uart_omap_port *up;
@@ -1332,6 +1346,9 @@ static int serial_omap_probe(struct platform_device *pdev)
1332 struct omap_uart_port_info *omap_up_info = pdev->dev.platform_data; 1346 struct omap_uart_port_info *omap_up_info = pdev->dev.platform_data;
1333 int ret = -ENOSPC; 1347 int ret = -ENOSPC;
1334 1348
1349 if (pdev->dev.of_node)
1350 omap_up_info = of_get_uart_port_info(&pdev->dev);
1351
1335 mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); 1352 mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1336 if (!mem) { 1353 if (!mem) {
1337 dev_err(&pdev->dev, "no mem resource?\n"); 1354 dev_err(&pdev->dev, "no mem resource?\n");
@@ -1376,9 +1393,20 @@ static int serial_omap_probe(struct platform_device *pdev)
1376 up->port.regshift = 2; 1393 up->port.regshift = 2;
1377 up->port.fifosize = 64; 1394 up->port.fifosize = 64;
1378 up->port.ops = &serial_omap_pops; 1395 up->port.ops = &serial_omap_pops;
1379 up->port.line = pdev->id;
1380 sprintf(up->name, "OMAP UART%d", up->port.line);
1381 1396
1397 if (pdev->dev.of_node)
1398 up->port.line = of_alias_get_id(pdev->dev.of_node, "serial");
1399 else
1400 up->port.line = pdev->id;
1401
1402 if (up->port.line < 0) {
1403 dev_err(&pdev->dev, "failed to get alias/pdev id, errno %d\n",
1404 up->port.line);
1405 ret = -ENODEV;
1406 goto err;
1407 }
1408
1409 sprintf(up->name, "OMAP UART%d", up->port.line);
1382 up->port.mapbase = mem->start; 1410 up->port.mapbase = mem->start;
1383 up->port.membase = ioremap(mem->start, resource_size(mem)); 1411 up->port.membase = ioremap(mem->start, resource_size(mem));
1384 if (!up->port.membase) { 1412 if (!up->port.membase) {
@@ -1531,7 +1559,7 @@ static int serial_omap_runtime_suspend(struct device *dev)
1531 if (!up) 1559 if (!up)
1532 return -EINVAL; 1560 return -EINVAL;
1533 1561
1534 if (!pdata->enable_wakeup) 1562 if (!pdata || !pdata->enable_wakeup)
1535 return 0; 1563 return 0;
1536 1564
1537 if (pdata->get_context_loss_count) 1565 if (pdata->get_context_loss_count)
@@ -1592,12 +1620,23 @@ static const struct dev_pm_ops serial_omap_dev_pm_ops = {
1592 serial_omap_runtime_resume, NULL) 1620 serial_omap_runtime_resume, NULL)
1593}; 1621};
1594 1622
1623#if defined(CONFIG_OF)
1624static const struct of_device_id omap_serial_of_match[] = {
1625 { .compatible = "ti,omap2-uart" },
1626 { .compatible = "ti,omap3-uart" },
1627 { .compatible = "ti,omap4-uart" },
1628 {},
1629};
1630MODULE_DEVICE_TABLE(of, omap_serial_of_match);
1631#endif
1632
1595static struct platform_driver serial_omap_driver = { 1633static struct platform_driver serial_omap_driver = {
1596 .probe = serial_omap_probe, 1634 .probe = serial_omap_probe,
1597 .remove = serial_omap_remove, 1635 .remove = serial_omap_remove,
1598 .driver = { 1636 .driver = {
1599 .name = DRIVER_NAME, 1637 .name = DRIVER_NAME,
1600 .pm = &serial_omap_dev_pm_ops, 1638 .pm = &serial_omap_dev_pm_ops,
1639 .of_match_table = of_match_ptr(omap_serial_of_match),
1601 }, 1640 },
1602}; 1641};
1603 1642