Lines Matching +full:serial +full:- +full:id
1 // SPDX-License-Identifier: GPL-2.0
6 * Copyright (C) 1999 - 2004
7 * Greg Kroah-Hartman (greg@kroah.com)
9 * See Documentation/usb/usb-serial.rst for more information on using this
25 #include <linux/usb/serial.h>
32 #define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com>"
38 static int visor_probe(struct usb_serial *serial,
39 const struct usb_device_id *id);
40 static int visor_calc_num_ports(struct usb_serial *serial,
42 static int clie_5_calc_num_ports(struct usb_serial *serial,
45 static int clie_3_5_startup(struct usb_serial *serial);
46 static int palm_os_3_probe(struct usb_serial *serial,
47 const struct usb_device_id *id);
48 static int palm_os_4_probe(struct usb_serial *serial,
49 const struct usb_device_id *id);
228 if (!port->read_urb) { in visor_open()
230 dev_err(&port->dev, "Device lied about number of ports, please use a lower one.\n"); in visor_open()
231 return -ENODEV; in visor_open()
239 if (port->interrupt_in_urb) { in visor_open()
240 dev_dbg(&port->dev, "adding interrupt input for treo\n"); in visor_open()
241 result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL); in visor_open()
243 dev_err(&port->dev, in visor_open()
244 "%s - failed submitting interrupt urb, error %d\n", in visor_open()
257 usb_kill_urb(port->interrupt_in_urb); in visor_close()
262 usb_control_msg(port->serial->dev, in visor_close()
263 usb_rcvctrlpipe(port->serial->dev, 0), in visor_close()
272 struct usb_serial_port *port = urb->context; in visor_read_int_callback()
273 int status = urb->status; in visor_read_int_callback()
280 case -ECONNRESET: in visor_read_int_callback()
281 case -ENOENT: in visor_read_int_callback()
282 case -ESHUTDOWN: in visor_read_int_callback()
284 dev_dbg(&port->dev, "%s - urb shutting down with status: %d\n", in visor_read_int_callback()
288 dev_dbg(&port->dev, "%s - nonzero urb status received: %d\n", in visor_read_int_callback()
300 usb_serial_debug_data(&port->dev, __func__, urb->actual_length, in visor_read_int_callback()
301 urb->transfer_buffer); in visor_read_int_callback()
306 dev_err(&urb->dev->dev, in visor_read_int_callback()
307 "%s - Error %d submitting interrupt urb\n", in visor_read_int_callback()
311 static int palm_os_3_probe(struct usb_serial *serial, in palm_os_3_probe() argument
312 const struct usb_device_id *id) in palm_os_3_probe() argument
314 struct device *dev = &serial->dev->dev; in palm_os_3_probe()
324 return -ENOMEM; in palm_os_3_probe()
327 retval = usb_control_msg(serial->dev, in palm_os_3_probe()
328 usb_rcvctrlpipe(serial->dev, 0), in palm_os_3_probe()
333 dev_err(dev, "%s - error %d getting connection information\n", in palm_os_3_probe()
340 retval = -ENODEV; in palm_os_3_probe()
346 num_ports = le16_to_cpu(connection_info->num_ports); in palm_os_3_probe()
351 serial->type->description); in palm_os_3_probe()
356 switch (connection_info->connections[i].port_function_id) { in palm_os_3_probe()
377 serial->type->description, in palm_os_3_probe()
378 connection_info->connections[i].port, string); in palm_os_3_probe()
380 dev_info(dev, "%s: Number of ports: %d\n", serial->type->description, in palm_os_3_probe()
387 usb_set_serial_data(serial, (void *)(long)num_ports); in palm_os_3_probe()
391 retval = usb_control_msg(serial->dev, in palm_os_3_probe()
392 usb_rcvctrlpipe(serial->dev, 0), in palm_os_3_probe()
397 dev_err(dev, "%s - error %d getting bytes available request\n", in palm_os_3_probe()
407 static int palm_os_4_probe(struct usb_serial *serial, in palm_os_4_probe() argument
408 const struct usb_device_id *id) in palm_os_4_probe() argument
410 struct device *dev = &serial->dev->dev; in palm_os_4_probe()
417 return -ENOMEM; in palm_os_4_probe()
419 retval = usb_control_msg(serial->dev, in palm_os_4_probe()
420 usb_rcvctrlpipe(serial->dev, 0), in palm_os_4_probe()
425 dev_err(dev, "%s - error %d getting connection info\n", in palm_os_4_probe()
435 static int visor_probe(struct usb_serial *serial, in visor_probe() argument
436 const struct usb_device_id *id) in visor_probe() argument
439 int (*startup)(struct usb_serial *serial, in visor_probe()
440 const struct usb_device_id *id); in visor_probe()
443 * some Samsung Android phones in modem mode have the same ID in visor_probe()
444 * as SPH-I500, but they are ACM devices, so dont bind to them in visor_probe()
446 if (id->idVendor == SAMSUNG_VENDOR_ID && in visor_probe()
447 id->idProduct == SAMSUNG_SPH_I500_ID && in visor_probe()
448 serial->dev->descriptor.bDeviceClass == USB_CLASS_COMM && in visor_probe()
449 serial->dev->descriptor.bDeviceSubClass == in visor_probe()
451 return -ENODEV; in visor_probe()
453 if (serial->dev->actconfig->desc.bConfigurationValue != 1) { in visor_probe()
454 dev_err(&serial->dev->dev, "active config #%d != 1 ??\n", in visor_probe()
455 serial->dev->actconfig->desc.bConfigurationValue); in visor_probe()
456 return -ENODEV; in visor_probe()
459 if (id->driver_info) { in visor_probe()
460 startup = (void *)id->driver_info; in visor_probe()
461 retval = startup(serial, id); in visor_probe()
467 static int visor_calc_num_ports(struct usb_serial *serial, in visor_calc_num_ports() argument
470 unsigned int vid = le16_to_cpu(serial->dev->descriptor.idVendor); in visor_calc_num_ports()
471 int num_ports = (int)(long)(usb_get_serial_data(serial)); in visor_calc_num_ports()
474 usb_set_serial_data(serial, NULL); in visor_calc_num_ports()
481 epds->num_interrupt_in == 0) in visor_calc_num_ports()
484 if (epds->num_bulk_in < 2 || epds->num_interrupt_in < 2) { in visor_calc_num_ports()
485 dev_err(&serial->interface->dev, "missing endpoints\n"); in visor_calc_num_ports()
486 return -ENODEV; in visor_calc_num_ports()
496 swap(epds->bulk_in[0], epds->bulk_in[1]); in visor_calc_num_ports()
497 swap(epds->interrupt_in[0], epds->interrupt_in[1]); in visor_calc_num_ports()
502 static int clie_5_calc_num_ports(struct usb_serial *serial, in clie_5_calc_num_ports() argument
507 * Communication in from the UX50/TH55 uses the first bulk-in in clie_5_calc_num_ports()
509 * bulk-out endpoint. in clie_5_calc_num_ports()
514 * bulk-out endpoint for both ports? in clie_5_calc_num_ports()
516 epds->bulk_out[0] = epds->bulk_out[1]; in clie_5_calc_num_ports()
518 return serial->type->num_ports; in clie_5_calc_num_ports()
521 static int clie_3_5_startup(struct usb_serial *serial) in clie_3_5_startup() argument
523 struct device *dev = &serial->dev->dev; in clie_3_5_startup()
529 return -ENOMEM; in clie_3_5_startup()
532 * Note that PEG-300 series devices expect the following two calls. in clie_3_5_startup()
536 result = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), in clie_3_5_startup()
547 result = -EIO; in clie_3_5_startup()
552 result = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), in clie_3_5_startup()
565 result = -EIO; in clie_3_5_startup()