Lines Matching +full:usb +full:- +full:port +full:- +full:id
1 // SPDX-License-Identifier: GPL-2.0
3 * USB HandSpring Visor, Palm m50x, and Sony Clie driver
4 * (supports all of the Palm OS USB devices)
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
24 #include <linux/usb.h>
25 #include <linux/usb/serial.h>
26 #include <linux/usb/cdc.h>
32 #define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com>"
33 #define DRIVER_DESC "USB HandSpring Visor / Palm OS driver"
36 static int visor_open(struct tty_struct *tty, struct usb_serial_port *port);
37 static void visor_close(struct usb_serial_port *port);
39 const struct usb_device_id *id);
47 const struct usb_device_id *id);
49 const struct usb_device_id *id);
158 MODULE_DEVICE_TABLE(usb, id_table_combined);
224 static int visor_open(struct tty_struct *tty, struct usb_serial_port *port) in visor_open() argument
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()
235 result = usb_serial_generic_open(tty, port); 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()
252 static void visor_close(struct usb_serial_port *port) in visor_close() argument
256 usb_serial_generic_close(port); in visor_close()
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() local
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()
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()
376 dev_info(dev, "%s: port %d, is for %s use\n", 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()
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()
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()
436 const struct usb_device_id *id) in visor_probe() argument
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()
470 unsigned int vid = le16_to_cpu(serial->dev->descriptor.idVendor); 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()
494 * apps that want to communicate on the second port. 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()
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()
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()