lkml.org 
[lkml]   [2011]   [Feb]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATHV v2] tty: serial: altera_uart: Add devicetree support
    Date
    With the recent switch of the (currently still out-of-tree) Nios2 Linux
    port to devicetree we want to be able to retreive the resources and
    properties from dts.

    The old method to retreive resources and properties from platform data
    is still supported.

    Cc: Grant Likely <grant.likely@secretlab.ca>
    Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
    ---
    Thanks to Grant Likely for the review.

    changes in v2:
    - fall back to uartclk from platform data if the device tree property
    is not available.
    - Only include MODULE_DEVICE_TABLE if CONFIG_OF is set so we don't
    advertise device tree support if CONFIG_OF isn't active.
    - change vendor prefix in match table to be uppercase for consistency
    with documentation

    .../devicetree/bindings/serial/altera_uart.txt | 7 +++
    drivers/tty/serial/altera_uart.c | 50 ++++++++++++++++++--
    2 files changed, 53 insertions(+), 4 deletions(-)
    create mode 100644 Documentation/devicetree/bindings/serial/altera_uart.txt

    diff --git a/Documentation/devicetree/bindings/serial/altera_uart.txt b/Documentation/devicetree/bindings/serial/altera_uart.txt
    new file mode 100644
    index 0000000..71cae3f
    --- /dev/null
    +++ b/Documentation/devicetree/bindings/serial/altera_uart.txt
    @@ -0,0 +1,7 @@
    +Altera UART
    +
    +Required properties:
    +- compatible : should be "ALTR,uart-1.0"
    +
    +Optional properties:
    +- clock-frequency : frequency of the clock input to the UART
    diff --git a/drivers/tty/serial/altera_uart.c b/drivers/tty/serial/altera_uart.c
    index 5e80977..4f0898c 100644
    --- a/drivers/tty/serial/altera_uart.c
    +++ b/drivers/tty/serial/altera_uart.c
    @@ -24,6 +24,7 @@
    #include <linux/serial.h>
    #include <linux/serial_core.h>
    #include <linux/platform_device.h>
    +#include <linux/of.h>
    #include <linux/io.h>
    #include <linux/altera_uart.h>

    @@ -484,6 +485,29 @@ static struct uart_driver altera_uart_driver = {
    .cons = ALTERA_UART_CONSOLE,
    };

    +#ifdef CONFIG_OF
    +static int altera_uart_get_of_uartclk(struct platform_device *pdev,
    + struct uart_port *port)
    +{
    + int len;
    + const __be32 *clk;
    +
    + clk = of_get_property(pdev->dev.of_node, "clock-frequency", &len);
    + if (!clk || len < sizeof(__be32))
    + return -ENODEV;
    +
    + port->uartclk = be32_to_cpup(clk);
    +
    + return 0;
    +}
    +#else
    +static int altera_uart_get_of_uartclk(struct platform_device *pdev,
    + struct uart_port *port)
    +{
    + return -ENODEV;
    +}
    +#endif /* CONFIG_OF */
    +
    static int __devinit altera_uart_probe(struct platform_device *pdev)
    {
    struct altera_uart_platform_uart *platp = pdev->dev.platform_data;
    @@ -491,6 +515,7 @@ static int __devinit altera_uart_probe(struct platform_device *pdev)
    struct resource *res_mem;
    struct resource *res_irq;
    int i = pdev->id;
    + int ret;

    /* -1 emphasizes that the platform must have one port, no .N suffix */
    if (i == -1)
    @@ -515,6 +540,14 @@ static int __devinit altera_uart_probe(struct platform_device *pdev)
    else if (platp->irq)
    port->irq = platp->irq;

    + /* Try to get the uartclk from devicetree, fall back to platform data
    + * otherwise */
    + ret = altera_uart_get_of_uartclk(pdev, port);
    + if (ret && platp)
    + port->uartclk = platp->uartclk;
    + else if (ret)
    + return ret;
    +
    port->membase = ioremap(port->mapbase, ALTERA_UART_SIZE);
    if (!port->membase)
    return -ENOMEM;
    @@ -527,7 +560,6 @@ static int __devinit altera_uart_probe(struct platform_device *pdev)
    port->line = i;
    port->type = PORT_ALTERA_UART;
    port->iotype = SERIAL_IO_MEM;
    - port->uartclk = platp->uartclk;
    port->ops = &altera_uart_ops;
    port->flags = UPF_BOOT_AUTOCONF;

    @@ -550,13 +582,23 @@ static int __devexit altera_uart_remove(struct platform_device *pdev)
    return 0;
    }

    +#ifdef CONFIG_OF
    +static struct of_device_id altera_uart_match[] = {
    + { .compatible = "ALTR,uart-1.0", },
    + {},
    +};
    +MODULE_DEVICE_TABLE(of, altera_uart_match);
    +#else
    +#define altera_uart_match NULL
    +#endif /* CONFIG_OF */
    +
    static struct platform_driver altera_uart_platform_driver = {
    .probe = altera_uart_probe,
    .remove = __devexit_p(altera_uart_remove),
    .driver = {
    - .name = DRV_NAME,
    - .owner = THIS_MODULE,
    - .pm = NULL,
    + .name = DRV_NAME,
    + .owner = THIS_MODULE,
    + .of_match_table = altera_uart_match,
    },
    };

    --
    1.7.0.4


    \
     
     \ /
      Last update: 2011-02-16 17:15    [W:2.157 / U:0.360 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site