lkml.org 
[lkml]   [2009]   [Nov]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 11/11] sdio_uart: add modem functionality
    Date
    Add the POSIX block for carrier

    Linux TIOCMIWAIT functionality is still lacking from the driver.

    Signed-off-by: Alan Cox <alan@linux.intel.com>
    ---

    drivers/mmc/card/sdio_uart.c | 33 ++++++++++++++++++++++++++++++++-
    1 files changed, 32 insertions(+), 1 deletions(-)


    diff --git a/drivers/mmc/card/sdio_uart.c b/drivers/mmc/card/sdio_uart.c
    index 0a3acfb..e72e2f2 100644
    --- a/drivers/mmc/card/sdio_uart.c
    +++ b/drivers/mmc/card/sdio_uart.c
    @@ -29,6 +29,7 @@
    #include <linux/module.h>
    #include <linux/init.h>
    #include <linux/kernel.h>
    +#include <linux/sched.h>
    #include <linux/mutex.h>
    #include <linux/seq_file.h>
    #include <linux/serial_reg.h>
    @@ -214,6 +216,8 @@ static unsigned int sdio_uart_get_mctrl(struct sdio_uart_port *port)
    unsigned char status;
    unsigned int ret;

    + /* FIXME: What stops this losing the delta bits and breaking
    + sdio_uart_check_modem_status ? */
    status = sdio_in(port, UART_MSR);

    ret = 0;
    @@ -495,8 +499,20 @@ static void sdio_uart_check_modem_status(struct sdio_uart_port *port)
    port->icount.rng++;
    if (status & UART_MSR_DDSR)
    port->icount.dsr++;
    - if (status & UART_MSR_DDCD)
    + if (status & UART_MSR_DDCD) {
    port->icount.dcd++;
    + /* DCD raise - wake for open */
    + if (status & UART_MSR_DCD)
    + wake_up_interruptible(&port->port.open_wait);
    + else {
    + /* DCD drop - hang up if tty attached */
    + tty = tty_port_tty_get(&port->port);
    + if (tty) {
    + tty_hangup(tty);
    + tty_kref_put(tty);
    + }
    + }
    + }
    if (status & UART_MSR_DCTS) {
    port->icount.cts++;
    tty = tty_port_tty_get(&port->port);
    @@ -552,6 +568,20 @@ static void sdio_uart_irq(struct sdio_func *func)
    port->in_sdio_uart_irq = NULL;
    }

    +static int uart_carrier_raised(struct tty_port *tport)
    +{
    + struct sdio_uart_port *port =
    + container_of(tport, struct sdio_uart_port, port);
    + unsigned int ret = sdio_uart_claim_func(port);
    + if (ret) /* Missing hardware shoudn't block for carrier */
    + return 1;
    + ret = sdio_uart_get_mctrl(port);
    + sdio_uart_release_func(port);
    + if (ret & TIOCM_CAR)
    + return 1;
    + return 0;
    +}
    +
    /**
    * uart_dtr_rts - port helper to set uart signals
    * @tport: tty port to be updated
    @@ -1011,6 +1041,7 @@ static const struct file_operations sdio_uart_proc_fops = {

    static const struct tty_port_operations sdio_uart_port_ops = {
    .dtr_rts = uart_dtr_rts,
    + .carrier_raised = uart_carrier_raised,
    .shutdown = sdio_uart_shutdown,
    .activate = sdio_uart_activate,
    };


    \
     
     \ /
      Last update: 2009-11-03 15:37    [W:0.031 / U:0.044 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site