forked from Minki/linux
8f28472a73
Here is the big USB patchset for 4.12-rc1. Lots of good stuff here, after many many many attempts, the kernel finally has a working typeC interface, many thanks to the Heikki and Guenter and others who have taken the time to get this merged. It wasn't an easy path for them at all. There's also a staging driver that uses this new api, which is why it's coming in through this tree. Along with that, there's the usual huge number of changes for gadget drivers, xhci, and other stuff. Johan also finally refactored pretty much every driver that was looking at USB endpoints to do it in a common way, which will help prevent any "badly-formed" devices from causing problems in drivers. That too wasn't a simple task. All of these have been in linux-next for a while with no reported issues. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- iG0EABECAC0WIQT0tgzFv3jCIUoxPcsxR9QN2y37KQUCWQvEIQ8cZ3JlZ0Brcm9h aC5jb20ACgkQMUfUDdst+yny4gCePCXxnrQdMWE+IMXf1H1hMubLkVkAn0ZWgQkq BspgO7ZmGb+9Fpf6YvNz =nwAu -----END PGP SIGNATURE----- Merge tag 'usb-4.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb Pull USB updates from Greg KH: "Here is the big USB patchset for 4.12-rc1. Lots of good stuff here, after many many many attempts, the kernel finally has a working typeC interface, many thanks to Heikki and Guenter and others who have taken the time to get this merged. It wasn't an easy path for them at all. There's also a staging driver that uses this new api, which is why it's coming in through this tree. Along with that, there's the usual huge number of changes for gadget drivers, xhci, and other stuff. Johan also finally refactored pretty much every driver that was looking at USB endpoints to do it in a common way, which will help prevent any "badly-formed" devices from causing problems in drivers. That too wasn't a simple task. All of these have been in linux-next for a while with no reported issues" * tag 'usb-4.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: (263 commits) staging: typec: Fairchild FUSB302 Type-c chip driver staging: typec: Type-C Port Controller Interface driver (tcpci) staging: typec: USB Type-C Port Manager (tcpm) usb: host: xhci: remove #ifdef around PM functions usb: musb: don't mark of_dev_auxdata as initdata usb: misc: legousbtower: Fix buffers on stack USB: Revert "cdc-wdm: fix "out-of-sync" due to missing notifications" usb: Make sure usb/phy/of gets built-in USB: storage: e-mail update in drivers/usb/storage/unusual_devs.h usb: host: xhci: print correct command ring address usb: host: xhci: delete sp_dma_buffers for scratchpad usb: host: xhci: using correct specification chapter reference for DCBAAP xhci: switch to pci_alloc_irq_vectors usb: host: xhci-plat: set resume_quirk() for R-Car controllers usb: host: xhci-plat: add resume_quirk() usb: host: xhci-plat: enable clk in resume timing usb: host: plat: Enable xHCI plat runtime PM USB: serial: ftdi_sio: add device ID for Microsemi/Arrow SF2PLUS Dev Kit USB: serial: constify static arrays usb: fix some references for /proc/bus/usb ...
102 lines
2.3 KiB
C
102 lines
2.3 KiB
C
/*
|
|
* USB Debug cable driver
|
|
*
|
|
* Copyright (C) 2006 Greg Kroah-Hartman <greg@kroah.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License version
|
|
* 2 as published by the Free Software Foundation.
|
|
*/
|
|
|
|
#include <linux/gfp.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/tty.h>
|
|
#include <linux/module.h>
|
|
#include <linux/usb.h>
|
|
#include <linux/usb/serial.h>
|
|
|
|
#define USB_DEBUG_MAX_PACKET_SIZE 8
|
|
#define USB_DEBUG_BRK_SIZE 8
|
|
static const char USB_DEBUG_BRK[USB_DEBUG_BRK_SIZE] = {
|
|
0x00,
|
|
0xff,
|
|
0x01,
|
|
0xfe,
|
|
0x00,
|
|
0xfe,
|
|
0x01,
|
|
0xff,
|
|
};
|
|
|
|
static const struct usb_device_id id_table[] = {
|
|
{ USB_DEVICE(0x0525, 0x127a) },
|
|
{ },
|
|
};
|
|
|
|
static const struct usb_device_id dbc_id_table[] = {
|
|
{ USB_DEVICE(0x1d6b, 0x0004) },
|
|
{ },
|
|
};
|
|
|
|
static const struct usb_device_id id_table_combined[] = {
|
|
{ USB_DEVICE(0x0525, 0x127a) },
|
|
{ USB_DEVICE(0x1d6b, 0x0004) },
|
|
{ },
|
|
};
|
|
MODULE_DEVICE_TABLE(usb, id_table_combined);
|
|
|
|
/* This HW really does not support a serial break, so one will be
|
|
* emulated when ever the break state is set to true.
|
|
*/
|
|
static void usb_debug_break_ctl(struct tty_struct *tty, int break_state)
|
|
{
|
|
struct usb_serial_port *port = tty->driver_data;
|
|
if (!break_state)
|
|
return;
|
|
usb_serial_generic_write(tty, port, USB_DEBUG_BRK, USB_DEBUG_BRK_SIZE);
|
|
}
|
|
|
|
static void usb_debug_process_read_urb(struct urb *urb)
|
|
{
|
|
struct usb_serial_port *port = urb->context;
|
|
|
|
if (urb->actual_length == USB_DEBUG_BRK_SIZE &&
|
|
memcmp(urb->transfer_buffer, USB_DEBUG_BRK,
|
|
USB_DEBUG_BRK_SIZE) == 0) {
|
|
usb_serial_handle_break(port);
|
|
return;
|
|
}
|
|
|
|
usb_serial_generic_process_read_urb(urb);
|
|
}
|
|
|
|
static struct usb_serial_driver debug_device = {
|
|
.driver = {
|
|
.owner = THIS_MODULE,
|
|
.name = "debug",
|
|
},
|
|
.id_table = id_table,
|
|
.num_ports = 1,
|
|
.bulk_out_size = USB_DEBUG_MAX_PACKET_SIZE,
|
|
.break_ctl = usb_debug_break_ctl,
|
|
.process_read_urb = usb_debug_process_read_urb,
|
|
};
|
|
|
|
static struct usb_serial_driver dbc_device = {
|
|
.driver = {
|
|
.owner = THIS_MODULE,
|
|
.name = "xhci_dbc",
|
|
},
|
|
.id_table = dbc_id_table,
|
|
.num_ports = 1,
|
|
.break_ctl = usb_debug_break_ctl,
|
|
.process_read_urb = usb_debug_process_read_urb,
|
|
};
|
|
|
|
static struct usb_serial_driver * const serial_drivers[] = {
|
|
&debug_device, &dbc_device, NULL
|
|
};
|
|
|
|
module_usb_serial_driver(serial_drivers, id_table_combined);
|
|
MODULE_LICENSE("GPL");
|