synusb
input_report_key(input_dev, BTN_MIDDLE, synusb->data[1] & 0x02);
static void synusb_report_stick(struct synusb *synusb)
struct input_dev *input_dev = synusb->input;
pressure = synusb->data[6];
x = (s16)(be16_to_cpup((__be16 *)&synusb->data[2]) << 3) >> 7;
y = (s16)(be16_to_cpup((__be16 *)&synusb->data[4]) << 3) >> 7;
synusb_report_buttons(synusb);
static void synusb_report_touchpad(struct synusb *synusb)
struct input_dev *input_dev = synusb->input;
pressure = synusb->data[6];
x = be16_to_cpup((__be16 *)&synusb->data[2]);
y = be16_to_cpup((__be16 *)&synusb->data[4]);
w = synusb->data[0] & 0x0f;
synusb_report_buttons(synusb);
if (synusb->flags & SYNUSB_AUXDISPLAY)
input_report_key(input_dev, BTN_MIDDLE, synusb->data[1] & 0x08);
struct synusb *synusb = urb->context;
usb_mark_last_busy(synusb->udev);
if (synusb->flags & SYNUSB_STICK)
synusb_report_stick(synusb);
synusb_report_touchpad(synusb);
dev_err(&synusb->intf->dev,
struct synusb *synusb = input_get_drvdata(dev);
retval = usb_autopm_get_interface(synusb->intf);
dev_err(&synusb->intf->dev,
mutex_lock(&synusb->pm_mutex);
retval = usb_submit_urb(synusb->urb, GFP_KERNEL);
dev_err(&synusb->intf->dev,
synusb->intf->needs_remote_wakeup = 1;
synusb->is_open = true;
mutex_unlock(&synusb->pm_mutex);
usb_autopm_put_interface(synusb->intf);
struct synusb *synusb = input_get_drvdata(dev);
autopm_error = usb_autopm_get_interface(synusb->intf);
mutex_lock(&synusb->pm_mutex);
usb_kill_urb(synusb->urb);
synusb->intf->needs_remote_wakeup = 0;
synusb->is_open = false;
mutex_unlock(&synusb->pm_mutex);
usb_autopm_put_interface(synusb->intf);
struct synusb *synusb;
synusb = kzalloc_obj(*synusb);
if (!synusb || !input_dev) {
synusb->udev = udev;
synusb->intf = intf;
synusb->input = input_dev;
mutex_init(&synusb->pm_mutex);
synusb->flags = id->driver_info;
if (synusb->flags & SYNUSB_COMBO) {
synusb->flags |= intf_num == 1 ?
synusb->urb = usb_alloc_urb(0, GFP_KERNEL);
if (!synusb->urb) {
synusb->data = usb_alloc_coherent(udev, SYNUSB_RECV_SIZE, GFP_KERNEL,
&synusb->urb->transfer_dma);
if (!synusb->data) {
usb_fill_int_urb(synusb->urb, udev,
synusb->data, SYNUSB_RECV_SIZE,
synusb_irq, synusb,
synusb->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
strscpy(synusb->name, udev->manufacturer,
sizeof(synusb->name));
strlcat(synusb->name, " ", sizeof(synusb->name));
strlcat(synusb->name, udev->product, sizeof(synusb->name));
if (!strlen(synusb->name))
snprintf(synusb->name, sizeof(synusb->name),
if (synusb->flags & SYNUSB_STICK)
strlcat(synusb->name, " (Stick)", sizeof(synusb->name));
usb_make_path(udev, synusb->phys, sizeof(synusb->phys));
strlcat(synusb->phys, "/input0", sizeof(synusb->phys));
input_dev->name = synusb->name;
input_dev->phys = synusb->phys;
input_dev->dev.parent = &synusb->intf->dev;
if (!(synusb->flags & SYNUSB_IO_ALWAYS)) {
input_set_drvdata(input_dev, synusb);
if (synusb->flags & SYNUSB_STICK) {
if (synusb->flags & SYNUSB_TOUCHSCREEN)
usb_set_intfdata(intf, synusb);
if (synusb->flags & SYNUSB_IO_ALWAYS) {
if (synusb->flags & SYNUSB_IO_ALWAYS)
synusb_close(synusb->input);
usb_free_coherent(udev, SYNUSB_RECV_SIZE, synusb->data,
synusb->urb->transfer_dma);
usb_free_urb(synusb->urb);
kfree(synusb);
struct synusb *synusb = usb_get_intfdata(intf);
if (synusb->flags & SYNUSB_IO_ALWAYS)
synusb_close(synusb->input);
input_unregister_device(synusb->input);
usb_free_coherent(udev, SYNUSB_RECV_SIZE, synusb->data,
synusb->urb->transfer_dma);
usb_free_urb(synusb->urb);
kfree(synusb);
struct synusb *synusb = usb_get_intfdata(intf);
mutex_lock(&synusb->pm_mutex);
usb_kill_urb(synusb->urb);
mutex_unlock(&synusb->pm_mutex);
struct synusb *synusb = usb_get_intfdata(intf);
mutex_lock(&synusb->pm_mutex);
if ((synusb->is_open || (synusb->flags & SYNUSB_IO_ALWAYS)) &&
usb_submit_urb(synusb->urb, GFP_NOIO) < 0) {
mutex_unlock(&synusb->pm_mutex);
struct synusb *synusb = usb_get_intfdata(intf);
mutex_lock(&synusb->pm_mutex);
usb_kill_urb(synusb->urb);
struct synusb *synusb = usb_get_intfdata(intf);
if ((synusb->is_open || (synusb->flags & SYNUSB_IO_ALWAYS)) &&
usb_submit_urb(synusb->urb, GFP_NOIO) < 0) {
mutex_unlock(&synusb->pm_mutex);
static void synusb_report_buttons(struct synusb *synusb)
struct input_dev *input_dev = synusb->input;
input_report_key(input_dev, BTN_LEFT, synusb->data[1] & 0x04);
input_report_key(input_dev, BTN_RIGHT, synusb->data[1] & 0x01);