diff options
Diffstat (limited to 'drivers/tty/serial/serial_core.c')
| -rw-r--r-- | drivers/tty/serial/serial_core.c | 39 | 
1 files changed, 21 insertions, 18 deletions
diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c index f26834d262b3..b68550d95a40 100644 --- a/drivers/tty/serial/serial_core.c +++ b/drivers/tty/serial/serial_core.c @@ -137,6 +137,11 @@ static int uart_port_startup(struct tty_struct *tty, struct uart_state *state,  		return 1;  	/* +	 * Make sure the device is in D0 state. +	 */ +	uart_change_pm(state, UART_PM_STATE_ON); + +	/*  	 * Initialise and allocate the transmit and temporary  	 * buffer.  	 */ @@ -825,25 +830,29 @@ static int uart_set_info(struct tty_struct *tty, struct tty_port *port,  		 * If we fail to request resources for the  		 * new port, try to restore the old settings.  		 */ -		if (retval && old_type != PORT_UNKNOWN) { +		if (retval) {  			uport->iobase = old_iobase;  			uport->type = old_type;  			uport->hub6 = old_hub6;  			uport->iotype = old_iotype;  			uport->regshift = old_shift;  			uport->mapbase = old_mapbase; -			retval = uport->ops->request_port(uport); -			/* -			 * If we failed to restore the old settings, -			 * we fail like this. -			 */ -			if (retval) -				uport->type = PORT_UNKNOWN; -			/* -			 * We failed anyway. -			 */ -			retval = -EBUSY; +			if (old_type != PORT_UNKNOWN) { +				retval = uport->ops->request_port(uport); +				/* +				 * If we failed to restore the old settings, +				 * we fail like this. +				 */ +				if (retval) +					uport->type = PORT_UNKNOWN; + +				/* +				 * We failed anyway. +				 */ +				retval = -EBUSY; +			} +  			/* Added to return the correct error -Ram Gupta */  			goto exit;  		} @@ -1571,12 +1580,6 @@ static int uart_open(struct tty_struct *tty, struct file *filp)  	}  	/* -	 * Make sure the device is in D0 state. -	 */ -	if (port->count == 1) -		uart_change_pm(state, UART_PM_STATE_ON); - -	/*  	 * Start up the serial port.  	 */  	retval = uart_startup(tty, state, 0);  | 
