|
@@ -431,6 +431,14 @@ static void sci_port_disable(struct sci_port *sci_port)
|
|
if (!sci_port->port.dev)
|
|
if (!sci_port->port.dev)
|
|
return;
|
|
return;
|
|
|
|
|
|
|
|
+ /* Cancel the break timer to ensure that the timer handler will not try
|
|
|
|
+ * to access the hardware with clocks and power disabled. Reset the
|
|
|
|
+ * break flag to make the break debouncing state machine ready for the
|
|
|
|
+ * next break.
|
|
|
|
+ */
|
|
|
|
+ del_timer_sync(&sci_port->break_timer);
|
|
|
|
+ sci_port->break_flag = 0;
|
|
|
|
+
|
|
clk_disable(sci_port->fclk);
|
|
clk_disable(sci_port->fclk);
|
|
clk_disable(sci_port->iclk);
|
|
clk_disable(sci_port->iclk);
|
|
|
|
|
|
@@ -733,8 +741,6 @@ static void sci_break_timer(unsigned long data)
|
|
{
|
|
{
|
|
struct sci_port *port = (struct sci_port *)data;
|
|
struct sci_port *port = (struct sci_port *)data;
|
|
|
|
|
|
- sci_port_enable(port);
|
|
|
|
-
|
|
|
|
if (sci_rxd_in(&port->port) == 0) {
|
|
if (sci_rxd_in(&port->port) == 0) {
|
|
port->break_flag = 1;
|
|
port->break_flag = 1;
|
|
sci_schedule_break_timer(port);
|
|
sci_schedule_break_timer(port);
|
|
@@ -744,8 +750,6 @@ static void sci_break_timer(unsigned long data)
|
|
sci_schedule_break_timer(port);
|
|
sci_schedule_break_timer(port);
|
|
} else
|
|
} else
|
|
port->break_flag = 0;
|
|
port->break_flag = 0;
|
|
-
|
|
|
|
- sci_port_disable(port);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
static int sci_handle_errors(struct uart_port *port)
|
|
static int sci_handle_errors(struct uart_port *port)
|