static int imapx200_serial_resume(struct platform_device *dev) { struct uart_port *port = imapx200_dev_to_port(&dev->dev); struct imapx200_uart_port *ourport = to_ourport(port); if (port) { clk_enable(ourport->clk); imapx200_serial_resetport(port, imapx200_port_to_cfg(port)); clk_disable(ourport->clk); uart_resume_port(&imapx200_uart_drv, port); } return 0; }
static int imapx200_serial_resume(struct platform_device *dev) { struct uart_port *port = imapx200_dev_to_port(&dev->dev); struct imapx200_uart_port *ourport = to_ourport(port); if (port) { clk_enable(ourport->clk); imapx200_serial_resetport(port, imapx200_port_to_cfg(port)); clk_disable(ourport->clk); uart_resume_port(&imapx200_uart_drv, port); } if(port->irq == IRQ_UART3) { printk(KERN_ERR "resume port3: mdelay.\n"); mdelay(20); } return 0; }
/* *********************************************************************** * -Function: * imapx200_serial_init_port( INPUT1 * pInput1, INPUT2 *pInput2, OUTPUT1 *pOutput1) * * -Description: * This function implement special features. The process is, * 1. Initialise a single serial port from the platform device given * * -Input Param * *info : struct imapx200_uart_info * *platdev : struct platform_device * * -Output Param * *ourport : struct imapx200_uart_port * * -Return * 0 : correct * others : error * * -Others * None. *********************************************************************** */ static int imapx200_serial_init_port(struct imapx200_uart_port *ourport, struct imapx200_uart_info *info, struct platform_device *platdev) { struct uart_port *port = &ourport->port; struct imapx200_uartcfg *cfg; struct resource *res; int ret; dbg("imapx200_serial_init_port: port=%p, platdev=%p\n", port, platdev); if (platdev == NULL) return -ENODEV; cfg = imapx200_dev_to_cfg(&platdev->dev); if (port->mapbase != 0) return 0; if (cfg->hwport > 3) return -EINVAL; /* setup info for port */ port->dev = &platdev->dev; ourport->info = info; /* copy the info in from provided structure */ ourport->port.fifosize = info->fifosize; dbg("imapx200_serial_init_port: %p (hw %d)...\n", port, cfg->hwport); port->uartclk = 1; if (cfg->uart_flags & UPF_CONS_FLOW) { dbg("imapx200_serial_init_port: enabling flow control\n"); port->flags |= UPF_CONS_FLOW; } /* sort our the physical and virtual addresses for each UART */ res = platform_get_resource(platdev, IORESOURCE_MEM, 0); if (res == NULL) { printk(KERN_ERR "failed to find memory resource for uart\n"); return -EINVAL; } dbg("resource %p (%lx..%lx)\n", res, res->start, res->end); port->mapbase = res->start; port->membase = IMAP_VA_UART + (res->start - IMAPX200_PA_UART0); ret = platform_get_irq(platdev, 0); #if 0 if (ret < 0) port->irq = 0; else port->irq = ret; #endif if (ret < 0) port->irq = 0; else { port->irq = ret; ourport->rx_irq = ret; ourport->tx_irq = ret + 1; } ret = platform_get_irq(platdev, 1); if (ret > 0) ourport->tx_irq = ret; #if 1 ourport->clk = clk_get(&platdev->dev, "UART0"); dbg("port: map=%08x, mem=%08x, irq=%d (%d,%d), clock=%ld\n", port->mapbase, port->membase, port->irq, ourport->rx_irq, ourport->tx_irq, port->uartclk); #endif /* reset the fifos (and setup the uart) */ imapx200_serial_resetport(port, cfg); return 0; }