Ejemplo n.º 1
0
static irqreturn_t mctrl_gpio_irq_handle(int irq, void *context)
{
    struct mctrl_gpios *gpios = context;
    struct uart_port *port = gpios->port;
    u32 mctrl = gpios->mctrl_prev;
    u32 mctrl_diff;

    mctrl_gpio_get(gpios, &mctrl);

    mctrl_diff = mctrl ^ gpios->mctrl_prev;
    gpios->mctrl_prev = mctrl;

    if (mctrl_diff & MCTRL_ANY_DELTA && port->state != NULL) {
        if ((mctrl_diff & mctrl) & TIOCM_RI)
            port->icount.rng++;

        if ((mctrl_diff & mctrl) & TIOCM_DSR)
            port->icount.dsr++;

        if (mctrl_diff & TIOCM_CD)
            uart_handle_dcd_change(port, mctrl & TIOCM_CD);

        if (mctrl_diff & TIOCM_CTS)
            uart_handle_cts_change(port, mctrl & TIOCM_CTS);

        wake_up_interruptible(&port->state->port.delta_msr_wait);
    }

    return IRQ_HANDLED;
}
Ejemplo n.º 2
0
static unsigned int etraxfs_uart_get_mctrl(struct uart_port *port)
{
	struct uart_cris_port *up = (struct uart_cris_port *)port;
	unsigned int ret;

	ret = 0;
	if (crisv32_serial_get_rts(up))
		ret |= TIOCM_RTS;
	if (crisv32_serial_get_cts(up))
		ret |= TIOCM_CTS;
	return mctrl_gpio_get(up->gpios, &ret);
}
Ejemplo n.º 3
0
void mctrl_gpio_enable_ms(struct mctrl_gpios *gpios)
{
    enum mctrl_gpio_idx i;

    /* .enable_ms may be called multiple times */
    if (gpios->mctrl_on)
        return;

    gpios->mctrl_on = true;

    /* get initial status of modem lines GPIOs */
    mctrl_gpio_get(gpios, &gpios->mctrl_prev);

    for (i = 0; i < UART_GPIO_MAX; ++i) {
        if (!gpios->irq[i])
            continue;

        enable_irq(gpios->irq[i]);
    }
}