Exemple #1
0
static void meson_uart_config_port(struct uart_port *port, int flags)
{
	if (flags & UART_CONFIG_TYPE) {
		port->type = PORT_MESON;
		meson_uart_request_port(port);
	}
}
Exemple #2
0
static int meson_uart_probe(struct platform_device *pdev)
{
    struct resource *res_mem, *res_irq;
    struct uart_port *port;
    struct clk *clk;
    int ret = 0;

    if (pdev->dev.of_node)
        pdev->id = of_alias_get_id(pdev->dev.of_node, "serial");

    if (pdev->id < 0 || pdev->id >= AML_UART_PORT_NUM)
        return -EINVAL;

    res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
    if (!res_mem)
        return -ENODEV;

    res_irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
    if (!res_irq)
        return -ENODEV;

    if (meson_ports[pdev->id]) {
        dev_err(&pdev->dev, "port %d already allocated\n", pdev->id);
        return -EBUSY;
    }

    port = devm_kzalloc(&pdev->dev, sizeof(struct uart_port), GFP_KERNEL);
    if (!port)
        return -ENOMEM;

    clk = clk_get(&pdev->dev, NULL);
    if (IS_ERR(clk))
        return PTR_ERR(clk);

    port->uartclk = clk_get_rate(clk);
    port->iotype = UPIO_MEM;
    port->mapbase = res_mem->start;
    port->irq = res_irq->start;
    port->flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP | UPF_LOW_LATENCY;
    port->dev = &pdev->dev;
    port->line = pdev->id;
    port->type = PORT_MESON;
    port->x_char = 0;
    port->ops = &meson_uart_ops;
    port->fifosize = 64;

    meson_ports[pdev->id] = port;
    platform_set_drvdata(pdev, port);

    /* reset port before registering (and possibly registering console) */
    if (meson_uart_request_port(port) >= 0) {
        meson_uart_reset(port);
        meson_uart_release_port(port);
    }

    ret = uart_add_one_port(&meson_uart_driver, port);
    if (ret)
        meson_ports[pdev->id] = NULL;

    return ret;
}