|
@@ -732,6 +732,55 @@ static void imx_dma_rxint(struct imx_port *sport)
|
|
spin_unlock_irqrestore(&sport->port.lock, flags);
|
|
spin_unlock_irqrestore(&sport->port.lock, flags);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * We have a modem side uart, so the meanings of RTS and CTS are inverted.
|
|
|
|
+ */
|
|
|
|
+static unsigned int imx_get_hwmctrl(struct imx_port *sport)
|
|
|
|
+{
|
|
|
|
+ unsigned int tmp = TIOCM_DSR;
|
|
|
|
+ unsigned usr1 = readl(sport->port.membase + USR1);
|
|
|
|
+
|
|
|
|
+ if (usr1 & USR1_RTSS)
|
|
|
|
+ tmp |= TIOCM_CTS;
|
|
|
|
+
|
|
|
|
+ /* in DCE mode DCDIN is always 0 */
|
|
|
|
+ if (!(usr1 & USR2_DCDIN))
|
|
|
|
+ tmp |= TIOCM_CAR;
|
|
|
|
+
|
|
|
|
+ if (sport->dte_mode)
|
|
|
|
+ if (!(readl(sport->port.membase + USR2) & USR2_RIIN))
|
|
|
|
+ tmp |= TIOCM_RI;
|
|
|
|
+
|
|
|
|
+ return tmp;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Handle any change of modem status signal since we were last called.
|
|
|
|
+ */
|
|
|
|
+static void imx_mctrl_check(struct imx_port *sport)
|
|
|
|
+{
|
|
|
|
+ unsigned int status, changed;
|
|
|
|
+
|
|
|
|
+ status = imx_get_hwmctrl(sport);
|
|
|
|
+ changed = status ^ sport->old_status;
|
|
|
|
+
|
|
|
|
+ if (changed == 0)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ sport->old_status = status;
|
|
|
|
+
|
|
|
|
+ if (changed & TIOCM_RI && status & TIOCM_RI)
|
|
|
|
+ sport->port.icount.rng++;
|
|
|
|
+ if (changed & TIOCM_DSR)
|
|
|
|
+ sport->port.icount.dsr++;
|
|
|
|
+ if (changed & TIOCM_CAR)
|
|
|
|
+ uart_handle_dcd_change(&sport->port, status & TIOCM_CAR);
|
|
|
|
+ if (changed & TIOCM_CTS)
|
|
|
|
+ uart_handle_cts_change(&sport->port, status & TIOCM_CTS);
|
|
|
|
+
|
|
|
|
+ wake_up_interruptible(&sport->port.state->port.delta_msr_wait);
|
|
|
|
+}
|
|
|
|
+
|
|
static irqreturn_t imx_int(int irq, void *dev_id)
|
|
static irqreturn_t imx_int(int irq, void *dev_id)
|
|
{
|
|
{
|
|
struct imx_port *sport = dev_id;
|
|
struct imx_port *sport = dev_id;
|
|
@@ -794,28 +843,6 @@ static unsigned int imx_tx_empty(struct uart_port *port)
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
-/*
|
|
|
|
- * We have a modem side uart, so the meanings of RTS and CTS are inverted.
|
|
|
|
- */
|
|
|
|
-static unsigned int imx_get_hwmctrl(struct imx_port *sport)
|
|
|
|
-{
|
|
|
|
- unsigned int tmp = TIOCM_DSR;
|
|
|
|
- unsigned usr1 = readl(sport->port.membase + USR1);
|
|
|
|
-
|
|
|
|
- if (usr1 & USR1_RTSS)
|
|
|
|
- tmp |= TIOCM_CTS;
|
|
|
|
-
|
|
|
|
- /* in DCE mode DCDIN is always 0 */
|
|
|
|
- if (!(usr1 & USR2_DCDIN))
|
|
|
|
- tmp |= TIOCM_CAR;
|
|
|
|
-
|
|
|
|
- if (sport->dte_mode)
|
|
|
|
- if (!(readl(sport->port.membase + USR2) & USR2_RIIN))
|
|
|
|
- tmp |= TIOCM_RI;
|
|
|
|
-
|
|
|
|
- return tmp;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
static unsigned int imx_get_mctrl(struct uart_port *port)
|
|
static unsigned int imx_get_mctrl(struct uart_port *port)
|
|
{
|
|
{
|
|
struct imx_port *sport = (struct imx_port *)port;
|
|
struct imx_port *sport = (struct imx_port *)port;
|
|
@@ -872,33 +899,6 @@ static void imx_break_ctl(struct uart_port *port, int break_state)
|
|
spin_unlock_irqrestore(&sport->port.lock, flags);
|
|
spin_unlock_irqrestore(&sport->port.lock, flags);
|
|
}
|
|
}
|
|
|
|
|
|
-/*
|
|
|
|
- * Handle any change of modem status signal since we were last called.
|
|
|
|
- */
|
|
|
|
-static void imx_mctrl_check(struct imx_port *sport)
|
|
|
|
-{
|
|
|
|
- unsigned int status, changed;
|
|
|
|
-
|
|
|
|
- status = imx_get_hwmctrl(sport);
|
|
|
|
- changed = status ^ sport->old_status;
|
|
|
|
-
|
|
|
|
- if (changed == 0)
|
|
|
|
- return;
|
|
|
|
-
|
|
|
|
- sport->old_status = status;
|
|
|
|
-
|
|
|
|
- if (changed & TIOCM_RI && status & TIOCM_RI)
|
|
|
|
- sport->port.icount.rng++;
|
|
|
|
- if (changed & TIOCM_DSR)
|
|
|
|
- sport->port.icount.dsr++;
|
|
|
|
- if (changed & TIOCM_CAR)
|
|
|
|
- uart_handle_dcd_change(&sport->port, status & TIOCM_CAR);
|
|
|
|
- if (changed & TIOCM_CTS)
|
|
|
|
- uart_handle_cts_change(&sport->port, status & TIOCM_CTS);
|
|
|
|
-
|
|
|
|
- wake_up_interruptible(&sport->port.state->port.delta_msr_wait);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
/*
|
|
/*
|
|
* This is our per-port timeout handler, for checking the
|
|
* This is our per-port timeout handler, for checking the
|
|
* modem status signals.
|
|
* modem status signals.
|