diff options
author | David Ward <david.ward@ll.mit.edu> | 2015-09-16 12:27:57 -0400 |
---|---|---|
committer | Johan Hovold <johan@kernel.org> | 2015-10-09 06:42:40 -0400 |
commit | 669e729f9fb4e05ff02dfa01cbb8606549c6cb7c (patch) | |
tree | d7edd05b71e03caa3af530da3b79c83ff9306f55 /drivers/usb/serial/option.c | |
parent | bd8869e86b8a1e5e5b29fad766b2676bb74e5395 (diff) |
USB: usb_wwan/option: generalize option_send_setup for other drivers
Only the option driver implements the send_setup callback; it uses the
SET_CONTROL_LINE_STATE request in CDC ACM to generate DTR/RTS signals
on the port. This is not driver-specific though and is needed by other
drivers, so move the function to the usb_wwan driver (with formatting
tweaks), and replace the callback pointer with a flag that enables the
request.
Suggested-by: Bjørn Mork <bjorn@mork.no>
Suggested-by: Johan Hovold <johan@kernel.org>
Signed-off-by: David Ward <david.ward@ll.mit.edu>
Signed-off-by: Johan Hovold <johan@kernel.org>
Diffstat (limited to 'drivers/usb/serial/option.c')
-rw-r--r-- | drivers/usb/serial/option.c | 36 |
1 files changed, 1 insertions, 35 deletions
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 4d16c9744f54..edfaec19e1ae 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
@@ -48,7 +48,6 @@ static int option_probe(struct usb_serial *serial, | |||
48 | const struct usb_device_id *id); | 48 | const struct usb_device_id *id); |
49 | static int option_attach(struct usb_serial *serial); | 49 | static int option_attach(struct usb_serial *serial); |
50 | static void option_release(struct usb_serial *serial); | 50 | static void option_release(struct usb_serial *serial); |
51 | static int option_send_setup(struct usb_serial_port *port); | ||
52 | static void option_instat_callback(struct urb *urb); | 51 | static void option_instat_callback(struct urb *urb); |
53 | 52 | ||
54 | /* Vendor and product IDs */ | 53 | /* Vendor and product IDs */ |
@@ -1890,7 +1889,7 @@ static int option_attach(struct usb_serial *serial) | |||
1890 | 1889 | ||
1891 | if (!blacklist || !test_bit(iface_desc->bInterfaceNumber, | 1890 | if (!blacklist || !test_bit(iface_desc->bInterfaceNumber, |
1892 | &blacklist->sendsetup)) { | 1891 | &blacklist->sendsetup)) { |
1893 | data->send_setup = option_send_setup; | 1892 | data->use_send_setup = 1; |
1894 | } | 1893 | } |
1895 | spin_lock_init(&data->susp_lock); | 1894 | spin_lock_init(&data->susp_lock); |
1896 | 1895 | ||
@@ -1961,39 +1960,6 @@ static void option_instat_callback(struct urb *urb) | |||
1961 | } | 1960 | } |
1962 | } | 1961 | } |
1963 | 1962 | ||
1964 | /** send RTS/DTR state to the port. | ||
1965 | * | ||
1966 | * This is exactly the same as SET_CONTROL_LINE_STATE from the PSTN | ||
1967 | * CDC. | ||
1968 | */ | ||
1969 | static int option_send_setup(struct usb_serial_port *port) | ||
1970 | { | ||
1971 | struct usb_serial *serial = port->serial; | ||
1972 | struct usb_wwan_port_private *portdata; | ||
1973 | int ifNum = serial->interface->cur_altsetting->desc.bInterfaceNumber; | ||
1974 | int val = 0; | ||
1975 | int res; | ||
1976 | |||
1977 | portdata = usb_get_serial_port_data(port); | ||
1978 | |||
1979 | if (portdata->dtr_state) | ||
1980 | val |= 0x01; | ||
1981 | if (portdata->rts_state) | ||
1982 | val |= 0x02; | ||
1983 | |||
1984 | res = usb_autopm_get_interface(serial->interface); | ||
1985 | if (res) | ||
1986 | return res; | ||
1987 | |||
1988 | res = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), | ||
1989 | 0x22, 0x21, val, ifNum, NULL, | ||
1990 | 0, USB_CTRL_SET_TIMEOUT); | ||
1991 | |||
1992 | usb_autopm_put_interface(serial->interface); | ||
1993 | |||
1994 | return res; | ||
1995 | } | ||
1996 | |||
1997 | MODULE_AUTHOR(DRIVER_AUTHOR); | 1963 | MODULE_AUTHOR(DRIVER_AUTHOR); |
1998 | MODULE_DESCRIPTION(DRIVER_DESC); | 1964 | MODULE_DESCRIPTION(DRIVER_DESC); |
1999 | MODULE_LICENSE("GPL"); | 1965 | MODULE_LICENSE("GPL"); |