aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorJohan Hovold <jhovold@gmail.com>2012-10-29 05:56:24 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-10-30 16:19:30 -0400
commita4afff6b323a20ddf51d08dec0e2ef4fe8f228ee (patch)
treee79e7ca434f0f0aed53b4330b685e35277072fc6 /drivers
parent2c2ee545071c10873b057b04a19d3d2aed04b9cf (diff)
USB: ftdi_sio: refactor modem-control status retrieval
Refactor modem-control status retrieval. Signed-off-by: Johan Hovold <jhovold@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/usb/serial/ftdi_sio.c38
1 files changed, 35 insertions, 3 deletions
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
index 987cc2cafa3b..06b5d75dffc6 100644
--- a/drivers/usb/serial/ftdi_sio.c
+++ b/drivers/usb/serial/ftdi_sio.c
@@ -2330,7 +2330,14 @@ no_c_cflag_changes:
2330 } 2330 }
2331} 2331}
2332 2332
2333static int ftdi_tiocmget(struct tty_struct *tty) 2333/*
2334 * Get modem-control status.
2335 *
2336 * Returns the number of status bytes retrieved (device dependant), or
2337 * negative error code.
2338 */
2339static int ftdi_get_modem_status(struct tty_struct *tty,
2340 unsigned char status[2])
2334{ 2341{
2335 struct usb_serial_port *port = tty->driver_data; 2342 struct usb_serial_port *port = tty->driver_data;
2336 struct ftdi_private *priv = usb_get_serial_port_data(port); 2343 struct ftdi_private *priv = usb_get_serial_port_data(port);
@@ -2371,17 +2378,42 @@ static int ftdi_tiocmget(struct tty_struct *tty)
2371 0, priv->interface, 2378 0, priv->interface,
2372 buf, len, WDR_TIMEOUT); 2379 buf, len, WDR_TIMEOUT);
2373 if (ret < 0) { 2380 if (ret < 0) {
2381 dev_err(&port->dev, "failed to get modem status: %d\n", ret);
2374 ret = usb_translate_errors(ret); 2382 ret = usb_translate_errors(ret);
2375 goto out; 2383 goto out;
2376 } 2384 }
2377 2385
2386 status[0] = buf[0];
2387 if (ret > 1)
2388 status[1] = buf[1];
2389 else
2390 status[1] = 0;
2391
2392 dev_dbg(&port->dev, "%s - 0x%02x%02x\n", __func__, status[0],
2393 status[1]);
2394out:
2395 kfree(buf);
2396
2397 return ret;
2398}
2399
2400static int ftdi_tiocmget(struct tty_struct *tty)
2401{
2402 struct usb_serial_port *port = tty->driver_data;
2403 struct ftdi_private *priv = usb_get_serial_port_data(port);
2404 unsigned char buf[2];
2405 int ret;
2406
2407 ret = ftdi_get_modem_status(tty, buf);
2408 if (ret < 0)
2409 return ret;
2410
2378 ret = (buf[0] & FTDI_SIO_DSR_MASK ? TIOCM_DSR : 0) | 2411 ret = (buf[0] & FTDI_SIO_DSR_MASK ? TIOCM_DSR : 0) |
2379 (buf[0] & FTDI_SIO_CTS_MASK ? TIOCM_CTS : 0) | 2412 (buf[0] & FTDI_SIO_CTS_MASK ? TIOCM_CTS : 0) |
2380 (buf[0] & FTDI_SIO_RI_MASK ? TIOCM_RI : 0) | 2413 (buf[0] & FTDI_SIO_RI_MASK ? TIOCM_RI : 0) |
2381 (buf[0] & FTDI_SIO_RLSD_MASK ? TIOCM_CD : 0) | 2414 (buf[0] & FTDI_SIO_RLSD_MASK ? TIOCM_CD : 0) |
2382 priv->last_dtr_rts; 2415 priv->last_dtr_rts;
2383out: 2416
2384 kfree(buf);
2385 return ret; 2417 return ret;
2386} 2418}
2387 2419