Exemplo n.º 1
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);
	}

	return 0;
}
Exemplo n.º 2
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;
}
Exemplo n.º 3
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;
}