diff options
author | Fabio Estevam <fabio.estevam@freescale.com> | 2012-06-18 09:06:09 -0400 |
---|---|---|
committer | Shawn Guo <shawn.guo@linaro.org> | 2012-07-03 01:22:35 -0400 |
commit | 1ea6607d4cdc917987e7e6cfaafc4a630d97a297 (patch) | |
tree | bbb1bc41125fc8dfe071ee7e5fbd44204f33baec | |
parent | a217c46c2ed65d4cde5c7c72290deebc2303116e (diff) |
serial: mxs-auart: Allow device tree probing
Allow device tree probing.
Cc: Grant Likely <grant.likely@secretlab.ca>
Cc: Rob Herring <rob.herring@calxeda.com>
Cc: Alan Cox <alan@linux.intel.com>
Cc: <linux-serial@vger.kernel.org>
Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
Signed-off-by: Subodh Nijsure <snijsure@grid-net.com>
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Shawn Guo <shawn.guo@linaro.org>
-rw-r--r-- | Documentation/devicetree/bindings/tty/serial/fsl-mxs-auart.txt | 27 | ||||
-rw-r--r-- | drivers/tty/serial/mxs-auart.c | 42 |
2 files changed, 67 insertions, 2 deletions
diff --git a/Documentation/devicetree/bindings/tty/serial/fsl-mxs-auart.txt b/Documentation/devicetree/bindings/tty/serial/fsl-mxs-auart.txt new file mode 100644 index 000000000000..2ee903fad25c --- /dev/null +++ b/Documentation/devicetree/bindings/tty/serial/fsl-mxs-auart.txt | |||
@@ -0,0 +1,27 @@ | |||
1 | * Freescale MXS Application UART (AUART) | ||
2 | |||
3 | Required properties: | ||
4 | - compatible : Should be "fsl,<soc>-auart". The supported SoCs include | ||
5 | imx23 and imx28. | ||
6 | - reg : Address and length of the register set for the device | ||
7 | - interrupts : Should contain the auart interrupt numbers | ||
8 | |||
9 | Example: | ||
10 | auart0: serial@8006a000 { | ||
11 | compatible = "fsl,imx28-auart", "fsl,imx23-auart"; | ||
12 | reg = <0x8006a000 0x2000>; | ||
13 | interrupts = <112 70 71>; | ||
14 | }; | ||
15 | |||
16 | Note: Each auart port should have an alias correctly numbered in "aliases" | ||
17 | node. | ||
18 | |||
19 | Example: | ||
20 | |||
21 | aliases { | ||
22 | serial0 = &auart0; | ||
23 | serial1 = &auart1; | ||
24 | serial2 = &auart2; | ||
25 | serial3 = &auart3; | ||
26 | serial4 = &auart4; | ||
27 | }; | ||
diff --git a/drivers/tty/serial/mxs-auart.c b/drivers/tty/serial/mxs-auart.c index ec56d8397aae..2e341b81ff89 100644 --- a/drivers/tty/serial/mxs-auart.c +++ b/drivers/tty/serial/mxs-auart.c | |||
@@ -33,6 +33,7 @@ | |||
33 | #include <linux/delay.h> | 33 | #include <linux/delay.h> |
34 | #include <linux/io.h> | 34 | #include <linux/io.h> |
35 | #include <linux/pinctrl/consumer.h> | 35 | #include <linux/pinctrl/consumer.h> |
36 | #include <linux/of_device.h> | ||
36 | 37 | ||
37 | #include <asm/cacheflush.h> | 38 | #include <asm/cacheflush.h> |
38 | 39 | ||
@@ -675,6 +676,30 @@ static struct uart_driver auart_driver = { | |||
675 | #endif | 676 | #endif |
676 | }; | 677 | }; |
677 | 678 | ||
679 | /* | ||
680 | * This function returns 1 if pdev isn't a device instatiated by dt, 0 if it | ||
681 | * could successfully get all information from dt or a negative errno. | ||
682 | */ | ||
683 | static int serial_mxs_probe_dt(struct mxs_auart_port *s, | ||
684 | struct platform_device *pdev) | ||
685 | { | ||
686 | struct device_node *np = pdev->dev.of_node; | ||
687 | int ret; | ||
688 | |||
689 | if (!np) | ||
690 | /* no device tree device */ | ||
691 | return 1; | ||
692 | |||
693 | ret = of_alias_get_id(np, "serial"); | ||
694 | if (ret < 0) { | ||
695 | dev_err(&pdev->dev, "failed to get alias id: %d\n", ret); | ||
696 | return ret; | ||
697 | } | ||
698 | s->port.line = ret; | ||
699 | |||
700 | return 0; | ||
701 | } | ||
702 | |||
678 | static int __devinit mxs_auart_probe(struct platform_device *pdev) | 703 | static int __devinit mxs_auart_probe(struct platform_device *pdev) |
679 | { | 704 | { |
680 | struct mxs_auart_port *s; | 705 | struct mxs_auart_port *s; |
@@ -689,6 +714,12 @@ static int __devinit mxs_auart_probe(struct platform_device *pdev) | |||
689 | goto out; | 714 | goto out; |
690 | } | 715 | } |
691 | 716 | ||
717 | ret = serial_mxs_probe_dt(s, pdev); | ||
718 | if (ret > 0) | ||
719 | s->port.line = pdev->id < 0 ? 0 : pdev->id; | ||
720 | else if (ret < 0) | ||
721 | goto out_free; | ||
722 | |||
692 | pinctrl = devm_pinctrl_get_select_default(&pdev->dev); | 723 | pinctrl = devm_pinctrl_get_select_default(&pdev->dev); |
693 | if (IS_ERR(pinctrl)) { | 724 | if (IS_ERR(pinctrl)) { |
694 | ret = PTR_ERR(pinctrl); | 725 | ret = PTR_ERR(pinctrl); |
@@ -711,7 +742,6 @@ static int __devinit mxs_auart_probe(struct platform_device *pdev) | |||
711 | s->port.membase = ioremap(r->start, resource_size(r)); | 742 | s->port.membase = ioremap(r->start, resource_size(r)); |
712 | s->port.ops = &mxs_auart_ops; | 743 | s->port.ops = &mxs_auart_ops; |
713 | s->port.iotype = UPIO_MEM; | 744 | s->port.iotype = UPIO_MEM; |
714 | s->port.line = pdev->id < 0 ? 0 : pdev->id; | ||
715 | s->port.fifosize = 16; | 745 | s->port.fifosize = 16; |
716 | s->port.uartclk = clk_get_rate(s->clk); | 746 | s->port.uartclk = clk_get_rate(s->clk); |
717 | s->port.type = PORT_IMX; | 747 | s->port.type = PORT_IMX; |
@@ -728,7 +758,7 @@ static int __devinit mxs_auart_probe(struct platform_device *pdev) | |||
728 | 758 | ||
729 | platform_set_drvdata(pdev, s); | 759 | platform_set_drvdata(pdev, s); |
730 | 760 | ||
731 | auart_port[pdev->id] = s; | 761 | auart_port[s->port.line] = s; |
732 | 762 | ||
733 | mxs_auart_reset(&s->port); | 763 | mxs_auart_reset(&s->port); |
734 | 764 | ||
@@ -769,12 +799,19 @@ static int __devexit mxs_auart_remove(struct platform_device *pdev) | |||
769 | return 0; | 799 | return 0; |
770 | } | 800 | } |
771 | 801 | ||
802 | static struct of_device_id mxs_auart_dt_ids[] = { | ||
803 | { .compatible = "fsl,imx23-auart", }, | ||
804 | { /* sentinel */ } | ||
805 | }; | ||
806 | MODULE_DEVICE_TABLE(of, mxs_auart_dt_ids); | ||
807 | |||
772 | static struct platform_driver mxs_auart_driver = { | 808 | static struct platform_driver mxs_auart_driver = { |
773 | .probe = mxs_auart_probe, | 809 | .probe = mxs_auart_probe, |
774 | .remove = __devexit_p(mxs_auart_remove), | 810 | .remove = __devexit_p(mxs_auart_remove), |
775 | .driver = { | 811 | .driver = { |
776 | .name = "mxs-auart", | 812 | .name = "mxs-auart", |
777 | .owner = THIS_MODULE, | 813 | .owner = THIS_MODULE, |
814 | .of_match_table = mxs_auart_dt_ids, | ||
778 | }, | 815 | }, |
779 | }; | 816 | }; |
780 | 817 | ||
@@ -807,3 +844,4 @@ module_init(mxs_auart_init); | |||
807 | module_exit(mxs_auart_exit); | 844 | module_exit(mxs_auart_exit); |
808 | MODULE_LICENSE("GPL"); | 845 | MODULE_LICENSE("GPL"); |
809 | MODULE_DESCRIPTION("Freescale MXS application uart driver"); | 846 | MODULE_DESCRIPTION("Freescale MXS application uart driver"); |
847 | MODULE_ALIAS("platform:mxs-auart"); | ||