diff options
author | Johan Hovold <jhovold@gmail.com> | 2012-10-29 05:56:24 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-10-30 16:19:30 -0400 |
commit | a4afff6b323a20ddf51d08dec0e2ef4fe8f228ee (patch) | |
tree | e79e7ca434f0f0aed53b4330b685e35277072fc6 /drivers | |
parent | 2c2ee545071c10873b057b04a19d3d2aed04b9cf (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.c | 38 |
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 | ||
2333 | static 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 | */ | ||
2339 | static 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]); | ||
2394 | out: | ||
2395 | kfree(buf); | ||
2396 | |||
2397 | return ret; | ||
2398 | } | ||
2399 | |||
2400 | static 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; |
2383 | out: | 2416 | |
2384 | kfree(buf); | ||
2385 | return ret; | 2417 | return ret; |
2386 | } | 2418 | } |
2387 | 2419 | ||