int mxs_serial_init(void) { /* Reset AURT */ mxs_auart_reset(); /* Mask interrupts */ REG_WR(MXS_UARTAPP_BASE, HW_UARTAPP_INTR, 0); /* Set default baudrate */ mxs_serial_setbrg(); /* * Disable RTS/CTS, enable Rx, Tx, UART */ REG_WR(MXS_UARTAPP_BASE, HW_UARTAPP_CTRL2_CLR, BM_UARTAPP_CTRL2_RTSEN | BM_UARTAPP_CTRL2_CTSEN | BM_UARTAPP_CTRL2_USE_LCR2); REG_WR(MXS_UARTAPP_BASE, HW_UARTAPP_CTRL2_SET, BM_UARTAPP_CTRL2_RXE | BM_UARTAPP_CTRL2_TXE | BM_UARTAPP_CTRL2_UARTEN); return 0; }
static int __devinit mxs_auart_probe(struct platform_device *pdev) { struct mxs_auart_port *s; u32 version; int ret = 0; struct resource *r; s = kzalloc(sizeof(struct mxs_auart_port), GFP_KERNEL); if (!s) { ret = -ENOMEM; goto out; } s->clk = clk_get(&pdev->dev, NULL); if (IS_ERR(s->clk)) { ret = PTR_ERR(s->clk); goto out_free; } r = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!r) { ret = -ENXIO; goto out_free_clk; } s->port.mapbase = r->start; s->port.membase = ioremap(r->start, resource_size(r)); s->port.ops = &mxs_auart_ops; s->port.iotype = UPIO_MEM; s->port.line = pdev->id < 0 ? 0 : pdev->id; s->port.fifosize = 16; s->port.uartclk = clk_get_rate(s->clk); s->port.type = PORT_IMX; s->port.dev = s->dev = get_device(&pdev->dev); s->flags = 0; s->ctrl = 0; s->irq = platform_get_irq(pdev, 0); s->port.irq = s->irq; ret = request_irq(s->irq, mxs_auart_irq_handle, 0, dev_name(&pdev->dev), s); if (ret) goto out_free_clk; platform_set_drvdata(pdev, s); auart_port[pdev->id] = s; mxs_auart_reset(&s->port); ret = uart_add_one_port(&auart_driver, &s->port); if (ret) goto out_free_irq; version = readl(s->port.membase + AUART_VERSION); dev_info(&pdev->dev, "Found APPUART %d.%d.%d\n", (version >> 24) & 0xff, (version >> 16) & 0xff, version & 0xffff); return 0; out_free_irq: auart_port[pdev->id] = NULL; free_irq(s->irq, s); out_free_clk: clk_put(s->clk); out_free: kfree(s); out: return ret; }