mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 22:21:40 +00:00
[PATCH] drivers/usb/input: convert to dynamic input_dev allocation
Input: convert drivers/iusb/input to dynamic input_dev allocation This is required for input_dev sysfs integration Signed-off-by: Dmitry Torokhov <dtor@mail.ru> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
3c42f0c3dd
commit
c5b7c7c395
@ -53,7 +53,7 @@ struct usb_acecad {
|
||||
char name[128];
|
||||
char phys[64];
|
||||
struct usb_device *usbdev;
|
||||
struct input_dev dev;
|
||||
struct input_dev *input;
|
||||
struct urb *irq;
|
||||
|
||||
signed char *data;
|
||||
@ -64,7 +64,7 @@ static void usb_acecad_irq(struct urb *urb, struct pt_regs *regs)
|
||||
{
|
||||
struct usb_acecad *acecad = urb->context;
|
||||
unsigned char *data = acecad->data;
|
||||
struct input_dev *dev = &acecad->dev;
|
||||
struct input_dev *dev = acecad->input;
|
||||
int prox, status;
|
||||
|
||||
switch (urb->status) {
|
||||
@ -135,8 +135,8 @@ static int usb_acecad_probe(struct usb_interface *intf, const struct usb_device_
|
||||
struct usb_host_interface *interface = intf->cur_altsetting;
|
||||
struct usb_endpoint_descriptor *endpoint;
|
||||
struct usb_acecad *acecad;
|
||||
struct input_dev *input_dev;
|
||||
int pipe, maxp;
|
||||
char path[64];
|
||||
|
||||
if (interface->desc.bNumEndpoints != 1)
|
||||
return -ENODEV;
|
||||
@ -153,8 +153,9 @@ static int usb_acecad_probe(struct usb_interface *intf, const struct usb_device_
|
||||
maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe));
|
||||
|
||||
acecad = kzalloc(sizeof(struct usb_acecad), GFP_KERNEL);
|
||||
if (!acecad)
|
||||
return -ENOMEM;
|
||||
input_dev = input_allocate_device();
|
||||
if (!acecad || !input_dev)
|
||||
goto fail1;
|
||||
|
||||
acecad->data = usb_buffer_alloc(dev, 8, SLAB_KERNEL, &acecad->data_dma);
|
||||
if (!acecad->data)
|
||||
@ -164,6 +165,9 @@ static int usb_acecad_probe(struct usb_interface *intf, const struct usb_device_
|
||||
if (!acecad->irq)
|
||||
goto fail2;
|
||||
|
||||
acecad->usbdev = dev;
|
||||
acecad->input = input_dev;
|
||||
|
||||
if (dev->manufacturer)
|
||||
strlcpy(acecad->name, dev->manufacturer, sizeof(acecad->name));
|
||||
|
||||
@ -173,48 +177,48 @@ static int usb_acecad_probe(struct usb_interface *intf, const struct usb_device_
|
||||
strlcat(acecad->name, dev->product, sizeof(acecad->name));
|
||||
}
|
||||
|
||||
usb_make_path(dev, path, sizeof(path));
|
||||
snprintf(acecad->phys, sizeof(acecad->phys), "%s/input0", path);
|
||||
usb_make_path(dev, acecad->phys, sizeof(acecad->phys));
|
||||
strlcat(acecad->phys, "/input0", sizeof(acecad->phys));
|
||||
|
||||
acecad->usbdev = dev;
|
||||
input_dev->name = acecad->name;
|
||||
input_dev->phys = acecad->phys;
|
||||
usb_to_input_id(dev, &input_dev->id);
|
||||
input_dev->cdev.dev = &intf->dev;
|
||||
input_dev->private = acecad;
|
||||
|
||||
acecad->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
|
||||
acecad->dev.absbit[0] = BIT(ABS_X) | BIT(ABS_Y) | BIT(ABS_PRESSURE);
|
||||
acecad->dev.keybit[LONG(BTN_LEFT)] = BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE);
|
||||
acecad->dev.keybit[LONG(BTN_DIGI)] = BIT(BTN_TOOL_PEN) |BIT(BTN_TOUCH) | BIT(BTN_STYLUS) | BIT(BTN_STYLUS2);
|
||||
input_dev->open = usb_acecad_open;
|
||||
input_dev->close = usb_acecad_close;
|
||||
|
||||
input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
|
||||
input_dev->absbit[0] = BIT(ABS_X) | BIT(ABS_Y) | BIT(ABS_PRESSURE);
|
||||
input_dev->keybit[LONG(BTN_LEFT)] = BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE);
|
||||
input_dev->keybit[LONG(BTN_DIGI)] = BIT(BTN_TOOL_PEN) |BIT(BTN_TOUCH) | BIT(BTN_STYLUS) | BIT(BTN_STYLUS2);
|
||||
|
||||
switch (id->driver_info) {
|
||||
case 0:
|
||||
acecad->dev.absmax[ABS_X] = 5000;
|
||||
acecad->dev.absmax[ABS_Y] = 3750;
|
||||
acecad->dev.absmax[ABS_PRESSURE] = 512;
|
||||
input_dev->absmax[ABS_X] = 5000;
|
||||
input_dev->absmax[ABS_Y] = 3750;
|
||||
input_dev->absmax[ABS_PRESSURE] = 512;
|
||||
if (!strlen(acecad->name))
|
||||
snprintf(acecad->name, sizeof(acecad->name),
|
||||
"USB Acecad Flair Tablet %04x:%04x",
|
||||
dev->descriptor.idVendor, dev->descriptor.idProduct);
|
||||
le16_to_cpu(dev->descriptor.idVendor),
|
||||
le16_to_cpu(dev->descriptor.idProduct));
|
||||
break;
|
||||
case 1:
|
||||
acecad->dev.absmax[ABS_X] = 3000;
|
||||
acecad->dev.absmax[ABS_Y] = 2250;
|
||||
acecad->dev.absmax[ABS_PRESSURE] = 1024;
|
||||
input_dev->absmax[ABS_X] = 3000;
|
||||
input_dev->absmax[ABS_Y] = 2250;
|
||||
input_dev->absmax[ABS_PRESSURE] = 1024;
|
||||
if (!strlen(acecad->name))
|
||||
snprintf(acecad->name, sizeof(acecad->name),
|
||||
"USB Acecad 302 Tablet %04x:%04x",
|
||||
dev->descriptor.idVendor, dev->descriptor.idProduct);
|
||||
le16_to_cpu(dev->descriptor.idVendor),
|
||||
le16_to_cpu(dev->descriptor.idProduct));
|
||||
break;
|
||||
}
|
||||
|
||||
acecad->dev.absfuzz[ABS_X] = 4;
|
||||
acecad->dev.absfuzz[ABS_Y] = 4;
|
||||
|
||||
acecad->dev.private = acecad;
|
||||
acecad->dev.open = usb_acecad_open;
|
||||
acecad->dev.close = usb_acecad_close;
|
||||
|
||||
acecad->dev.name = acecad->name;
|
||||
acecad->dev.phys = acecad->phys;
|
||||
usb_to_input_id(dev, &acecad->dev.id);
|
||||
acecad->dev.dev = &intf->dev;
|
||||
input_dev->absfuzz[ABS_X] = 4;
|
||||
input_dev->absfuzz[ABS_Y] = 4;
|
||||
|
||||
usb_fill_int_urb(acecad->irq, dev, pipe,
|
||||
acecad->data, maxp > 8 ? 8 : maxp,
|
||||
@ -222,17 +226,15 @@ static int usb_acecad_probe(struct usb_interface *intf, const struct usb_device_
|
||||
acecad->irq->transfer_dma = acecad->data_dma;
|
||||
acecad->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
|
||||
|
||||
input_register_device(&acecad->dev);
|
||||
|
||||
printk(KERN_INFO "input: %s with packet size %d on %s\n",
|
||||
acecad->name, maxp, path);
|
||||
input_register_device(acecad->input);
|
||||
|
||||
usb_set_intfdata(intf, acecad);
|
||||
|
||||
return 0;
|
||||
|
||||
fail2: usb_buffer_free(dev, 8, acecad->data, acecad->data_dma);
|
||||
fail1: kfree(acecad);
|
||||
fail1: input_free_device(input_dev);
|
||||
kfree(acecad);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
@ -243,7 +245,7 @@ static void usb_acecad_disconnect(struct usb_interface *intf)
|
||||
usb_set_intfdata(intf, NULL);
|
||||
if (acecad) {
|
||||
usb_kill_urb(acecad->irq);
|
||||
input_unregister_device(&acecad->dev);
|
||||
input_unregister_device(acecad->input);
|
||||
usb_free_urb(acecad->irq);
|
||||
usb_buffer_free(interface_to_usbdev(intf), 10, acecad->data, acecad->data_dma);
|
||||
kfree(acecad);
|
||||
|
@ -317,7 +317,7 @@ struct aiptek_settings {
|
||||
};
|
||||
|
||||
struct aiptek {
|
||||
struct input_dev inputdev; /* input device struct */
|
||||
struct input_dev *inputdev; /* input device struct */
|
||||
struct usb_device *usbdev; /* usb device struct */
|
||||
struct urb *urb; /* urb for incoming reports */
|
||||
dma_addr_t data_dma; /* our dma stuffage */
|
||||
@ -402,7 +402,7 @@ static void aiptek_irq(struct urb *urb, struct pt_regs *regs)
|
||||
{
|
||||
struct aiptek *aiptek = urb->context;
|
||||
unsigned char *data = aiptek->data;
|
||||
struct input_dev *inputdev = &aiptek->inputdev;
|
||||
struct input_dev *inputdev = aiptek->inputdev;
|
||||
int jitterable = 0;
|
||||
int retval, macro, x, y, z, left, right, middle, p, dv, tip, bs, pck;
|
||||
|
||||
@ -955,20 +955,20 @@ static int aiptek_program_tablet(struct aiptek *aiptek)
|
||||
/* Query getXextension */
|
||||
if ((ret = aiptek_query(aiptek, 0x01, 0x00)) < 0)
|
||||
return ret;
|
||||
aiptek->inputdev.absmin[ABS_X] = 0;
|
||||
aiptek->inputdev.absmax[ABS_X] = ret - 1;
|
||||
aiptek->inputdev->absmin[ABS_X] = 0;
|
||||
aiptek->inputdev->absmax[ABS_X] = ret - 1;
|
||||
|
||||
/* Query getYextension */
|
||||
if ((ret = aiptek_query(aiptek, 0x01, 0x01)) < 0)
|
||||
return ret;
|
||||
aiptek->inputdev.absmin[ABS_Y] = 0;
|
||||
aiptek->inputdev.absmax[ABS_Y] = ret - 1;
|
||||
aiptek->inputdev->absmin[ABS_Y] = 0;
|
||||
aiptek->inputdev->absmax[ABS_Y] = ret - 1;
|
||||
|
||||
/* Query getPressureLevels */
|
||||
if ((ret = aiptek_query(aiptek, 0x08, 0x00)) < 0)
|
||||
return ret;
|
||||
aiptek->inputdev.absmin[ABS_PRESSURE] = 0;
|
||||
aiptek->inputdev.absmax[ABS_PRESSURE] = ret - 1;
|
||||
aiptek->inputdev->absmin[ABS_PRESSURE] = 0;
|
||||
aiptek->inputdev->absmax[ABS_PRESSURE] = ret - 1;
|
||||
|
||||
/* Depending on whether we are in absolute or relative mode, we will
|
||||
* do a switchToTablet(absolute) or switchToMouse(relative) command.
|
||||
@ -1025,8 +1025,8 @@ static ssize_t show_tabletSize(struct device *dev, struct device_attribute *attr
|
||||
return 0;
|
||||
|
||||
return snprintf(buf, PAGE_SIZE, "%dx%d\n",
|
||||
aiptek->inputdev.absmax[ABS_X] + 1,
|
||||
aiptek->inputdev.absmax[ABS_Y] + 1);
|
||||
aiptek->inputdev->absmax[ABS_X] + 1,
|
||||
aiptek->inputdev->absmax[ABS_Y] + 1);
|
||||
}
|
||||
|
||||
/* These structs define the sysfs files, param #1 is the name of the
|
||||
@ -1048,7 +1048,7 @@ static ssize_t show_tabletProductId(struct device *dev, struct device_attribute
|
||||
return 0;
|
||||
|
||||
return snprintf(buf, PAGE_SIZE, "0x%04x\n",
|
||||
aiptek->inputdev.id.product);
|
||||
aiptek->inputdev->id.product);
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(product_id, S_IRUGO, show_tabletProductId, NULL);
|
||||
@ -1063,7 +1063,7 @@ static ssize_t show_tabletVendorId(struct device *dev, struct device_attribute *
|
||||
if (aiptek == NULL)
|
||||
return 0;
|
||||
|
||||
return snprintf(buf, PAGE_SIZE, "0x%04x\n", aiptek->inputdev.id.vendor);
|
||||
return snprintf(buf, PAGE_SIZE, "0x%04x\n", aiptek->inputdev->id.vendor);
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(vendor_id, S_IRUGO, show_tabletVendorId, NULL);
|
||||
@ -1977,7 +1977,6 @@ aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
struct input_dev *inputdev;
|
||||
struct input_handle *inputhandle;
|
||||
struct list_head *node, *next;
|
||||
char path[64 + 1];
|
||||
int i;
|
||||
int speeds[] = { 0,
|
||||
AIPTEK_PROGRAMMABLE_DELAY_50,
|
||||
@ -1996,24 +1995,26 @@ aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
*/
|
||||
speeds[0] = programmableDelay;
|
||||
|
||||
if ((aiptek = kmalloc(sizeof(struct aiptek), GFP_KERNEL)) == NULL)
|
||||
return -ENOMEM;
|
||||
memset(aiptek, 0, sizeof(struct aiptek));
|
||||
aiptek = kzalloc(sizeof(struct aiptek), GFP_KERNEL);
|
||||
inputdev = input_allocate_device();
|
||||
if (!aiptek || !inputdev)
|
||||
goto fail1;
|
||||
|
||||
aiptek->data = usb_buffer_alloc(usbdev, AIPTEK_PACKET_LENGTH,
|
||||
SLAB_ATOMIC, &aiptek->data_dma);
|
||||
if (aiptek->data == NULL) {
|
||||
kfree(aiptek);
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (!aiptek->data)
|
||||
goto fail1;
|
||||
|
||||
aiptek->urb = usb_alloc_urb(0, GFP_KERNEL);
|
||||
if (aiptek->urb == NULL) {
|
||||
usb_buffer_free(usbdev, AIPTEK_PACKET_LENGTH, aiptek->data,
|
||||
aiptek->data_dma);
|
||||
kfree(aiptek);
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (!aiptek->urb)
|
||||
goto fail2;
|
||||
|
||||
aiptek->inputdev = inputdev;
|
||||
aiptek->usbdev = usbdev;
|
||||
aiptek->ifnum = intf->altsetting[0].desc.bInterfaceNumber;
|
||||
aiptek->inDelay = 0;
|
||||
aiptek->endDelay = 0;
|
||||
aiptek->previousJitterable = 0;
|
||||
|
||||
/* Set up the curSettings struct. Said struct contains the current
|
||||
* programmable parameters. The newSetting struct contains changes
|
||||
@ -2036,31 +2037,48 @@ aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
|
||||
/* Both structs should have equivalent settings
|
||||
*/
|
||||
memcpy(&aiptek->newSetting, &aiptek->curSetting,
|
||||
sizeof(struct aiptek_settings));
|
||||
aiptek->newSetting = aiptek->curSetting;
|
||||
|
||||
/* Determine the usb devices' physical path.
|
||||
* Asketh not why we always pretend we're using "../input0",
|
||||
* but I suspect this will have to be refactored one
|
||||
* day if a single USB device can be a keyboard & a mouse
|
||||
* & a tablet, and the inputX number actually will tell
|
||||
* us something...
|
||||
*/
|
||||
usb_make_path(usbdev, aiptek->features.usbPath,
|
||||
sizeof(aiptek->features.usbPath));
|
||||
strlcat(aiptek->features.usbPath, "/input0",
|
||||
sizeof(aiptek->features.usbPath));
|
||||
|
||||
/* Set up client data, pointers to open and close routines
|
||||
* for the input device.
|
||||
*/
|
||||
inputdev->name = "Aiptek";
|
||||
inputdev->phys = aiptek->features.usbPath;
|
||||
usb_to_input_id(usbdev, &inputdev->id);
|
||||
inputdev->cdev.dev = &intf->dev;
|
||||
inputdev->private = aiptek;
|
||||
inputdev->open = aiptek_open;
|
||||
inputdev->close = aiptek_close;
|
||||
|
||||
/* Now program the capacities of the tablet, in terms of being
|
||||
* an input device.
|
||||
*/
|
||||
aiptek->inputdev.evbit[0] |= BIT(EV_KEY)
|
||||
inputdev->evbit[0] |= BIT(EV_KEY)
|
||||
| BIT(EV_ABS)
|
||||
| BIT(EV_REL)
|
||||
| BIT(EV_MSC);
|
||||
|
||||
aiptek->inputdev.absbit[0] |=
|
||||
(BIT(ABS_X) |
|
||||
BIT(ABS_Y) |
|
||||
BIT(ABS_PRESSURE) |
|
||||
BIT(ABS_TILT_X) |
|
||||
BIT(ABS_TILT_Y) | BIT(ABS_WHEEL) | BIT(ABS_MISC));
|
||||
inputdev->absbit[0] |= BIT(ABS_MISC);
|
||||
|
||||
aiptek->inputdev.relbit[0] |=
|
||||
inputdev->relbit[0] |=
|
||||
(BIT(REL_X) | BIT(REL_Y) | BIT(REL_WHEEL) | BIT(REL_MISC));
|
||||
|
||||
aiptek->inputdev.keybit[LONG(BTN_LEFT)] |=
|
||||
inputdev->keybit[LONG(BTN_LEFT)] |=
|
||||
(BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE));
|
||||
|
||||
aiptek->inputdev.keybit[LONG(BTN_DIGI)] |=
|
||||
inputdev->keybit[LONG(BTN_DIGI)] |=
|
||||
(BIT(BTN_TOOL_PEN) |
|
||||
BIT(BTN_TOOL_RUBBER) |
|
||||
BIT(BTN_TOOL_PENCIL) |
|
||||
@ -2070,70 +2088,26 @@ aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
BIT(BTN_TOOL_LENS) |
|
||||
BIT(BTN_TOUCH) | BIT(BTN_STYLUS) | BIT(BTN_STYLUS2));
|
||||
|
||||
aiptek->inputdev.mscbit[0] = BIT(MSC_SERIAL);
|
||||
inputdev->mscbit[0] = BIT(MSC_SERIAL);
|
||||
|
||||
/* Programming the tablet macro keys needs to be done with a for loop
|
||||
* as the keycodes are discontiguous.
|
||||
*/
|
||||
for (i = 0; i < sizeof(macroKeyEvents) / sizeof(macroKeyEvents[0]); ++i)
|
||||
set_bit(macroKeyEvents[i], aiptek->inputdev.keybit);
|
||||
set_bit(macroKeyEvents[i], inputdev->keybit);
|
||||
|
||||
/* Set up client data, pointers to open and close routines
|
||||
* for the input device.
|
||||
*/
|
||||
aiptek->inputdev.private = aiptek;
|
||||
aiptek->inputdev.open = aiptek_open;
|
||||
aiptek->inputdev.close = aiptek_close;
|
||||
|
||||
/* Determine the usb devices' physical path.
|
||||
* Asketh not why we always pretend we're using "../input0",
|
||||
* but I suspect this will have to be refactored one
|
||||
* day if a single USB device can be a keyboard & a mouse
|
||||
* & a tablet, and the inputX number actually will tell
|
||||
* us something...
|
||||
*/
|
||||
if (usb_make_path(usbdev, path, 64) > 0)
|
||||
sprintf(aiptek->features.usbPath, "%s/input0", path);
|
||||
|
||||
/* Program the input device coordinate capacities. We do not yet
|
||||
/*
|
||||
* Program the input device coordinate capacities. We do not yet
|
||||
* know what maximum X, Y, and Z values are, so we're putting fake
|
||||
* values in. Later, we'll ask the tablet to put in the correct
|
||||
* values.
|
||||
*/
|
||||
aiptek->inputdev.absmin[ABS_X] = 0;
|
||||
aiptek->inputdev.absmax[ABS_X] = 2999;
|
||||
aiptek->inputdev.absmin[ABS_Y] = 0;
|
||||
aiptek->inputdev.absmax[ABS_Y] = 2249;
|
||||
aiptek->inputdev.absmin[ABS_PRESSURE] = 0;
|
||||
aiptek->inputdev.absmax[ABS_PRESSURE] = 511;
|
||||
aiptek->inputdev.absmin[ABS_TILT_X] = AIPTEK_TILT_MIN;
|
||||
aiptek->inputdev.absmax[ABS_TILT_X] = AIPTEK_TILT_MAX;
|
||||
aiptek->inputdev.absmin[ABS_TILT_Y] = AIPTEK_TILT_MIN;
|
||||
aiptek->inputdev.absmax[ABS_TILT_Y] = AIPTEK_TILT_MAX;
|
||||
aiptek->inputdev.absmin[ABS_WHEEL] = AIPTEK_WHEEL_MIN;
|
||||
aiptek->inputdev.absmax[ABS_WHEEL] = AIPTEK_WHEEL_MAX - 1;
|
||||
aiptek->inputdev.absfuzz[ABS_X] = 0;
|
||||
aiptek->inputdev.absfuzz[ABS_Y] = 0;
|
||||
aiptek->inputdev.absfuzz[ABS_PRESSURE] = 0;
|
||||
aiptek->inputdev.absfuzz[ABS_TILT_X] = 0;
|
||||
aiptek->inputdev.absfuzz[ABS_TILT_Y] = 0;
|
||||
aiptek->inputdev.absfuzz[ABS_WHEEL] = 0;
|
||||
aiptek->inputdev.absflat[ABS_X] = 0;
|
||||
aiptek->inputdev.absflat[ABS_Y] = 0;
|
||||
aiptek->inputdev.absflat[ABS_PRESSURE] = 0;
|
||||
aiptek->inputdev.absflat[ABS_TILT_X] = 0;
|
||||
aiptek->inputdev.absflat[ABS_TILT_Y] = 0;
|
||||
aiptek->inputdev.absflat[ABS_WHEEL] = 0;
|
||||
aiptek->inputdev.name = "Aiptek";
|
||||
aiptek->inputdev.phys = aiptek->features.usbPath;
|
||||
usb_to_input_id(usbdev, &aiptek->inputdev.id);
|
||||
aiptek->inputdev.dev = &intf->dev;
|
||||
|
||||
aiptek->usbdev = usbdev;
|
||||
aiptek->ifnum = intf->altsetting[0].desc.bInterfaceNumber;
|
||||
aiptek->inDelay = 0;
|
||||
aiptek->endDelay = 0;
|
||||
aiptek->previousJitterable = 0;
|
||||
input_set_abs_params(inputdev, ABS_X, 0, 2999, 0, 0);
|
||||
input_set_abs_params(inputdev, ABS_X, 0, 2249, 0, 0);
|
||||
input_set_abs_params(inputdev, ABS_PRESSURE, 0, 511, 0, 0);
|
||||
input_set_abs_params(inputdev, ABS_TILT_X, AIPTEK_TILT_MIN, AIPTEK_TILT_MAX, 0, 0);
|
||||
input_set_abs_params(inputdev, ABS_TILT_Y, AIPTEK_TILT_MIN, AIPTEK_TILT_MAX, 0, 0);
|
||||
input_set_abs_params(inputdev, ABS_WHEEL, AIPTEK_WHEEL_MIN, AIPTEK_WHEEL_MAX - 1, 0, 0);
|
||||
|
||||
endpoint = &intf->altsetting[0].endpoint[0].desc;
|
||||
|
||||
@ -2150,28 +2124,6 @@ aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
aiptek->urb->transfer_dma = aiptek->data_dma;
|
||||
aiptek->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
|
||||
|
||||
/* Register the tablet as an Input Device
|
||||
*/
|
||||
input_register_device(&aiptek->inputdev);
|
||||
|
||||
/* We now will look for the evdev device which is mapped to
|
||||
* the tablet. The partial name is kept in the link list of
|
||||
* input_handles associated with this input device.
|
||||
* What identifies an evdev input_handler is that it begins
|
||||
* with 'event', continues with a digit, and that in turn
|
||||
* is mapped to /{devfs}/input/eventN.
|
||||
*/
|
||||
inputdev = &aiptek->inputdev;
|
||||
list_for_each_safe(node, next, &inputdev->h_list) {
|
||||
inputhandle = to_handle(node);
|
||||
if (strncmp(inputhandle->name, "event", 5) == 0) {
|
||||
strcpy(aiptek->features.inputPath, inputhandle->name);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
info("input: Aiptek on %s (%s)\n", path, aiptek->features.inputPath);
|
||||
|
||||
/* Program the tablet. This sets the tablet up in the mode
|
||||
* specified in newSetting, and also queries the tablet's
|
||||
* physical capacities.
|
||||
@ -2186,13 +2138,32 @@ aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
for (i = 0; i < sizeof(speeds) / sizeof(speeds[0]); ++i) {
|
||||
aiptek->curSetting.programmableDelay = speeds[i];
|
||||
(void)aiptek_program_tablet(aiptek);
|
||||
if (aiptek->inputdev.absmax[ABS_X] > 0) {
|
||||
if (aiptek->inputdev->absmax[ABS_X] > 0) {
|
||||
info("input: Aiptek using %d ms programming speed\n",
|
||||
aiptek->curSetting.programmableDelay);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Register the tablet as an Input Device
|
||||
*/
|
||||
input_register_device(aiptek->inputdev);
|
||||
|
||||
/* We now will look for the evdev device which is mapped to
|
||||
* the tablet. The partial name is kept in the link list of
|
||||
* input_handles associated with this input device.
|
||||
* What identifies an evdev input_handler is that it begins
|
||||
* with 'event', continues with a digit, and that in turn
|
||||
* is mapped to /{devfs}/input/eventN.
|
||||
*/
|
||||
list_for_each_safe(node, next, &inputdev->h_list) {
|
||||
inputhandle = to_handle(node);
|
||||
if (strncmp(inputhandle->name, "event", 5) == 0) {
|
||||
strcpy(aiptek->features.inputPath, inputhandle->name);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Associate this driver's struct with the usb interface.
|
||||
*/
|
||||
usb_set_intfdata(intf, aiptek);
|
||||
@ -2207,6 +2178,12 @@ aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
info("aiptek: error loading 'evdev' module");
|
||||
|
||||
return 0;
|
||||
|
||||
fail2: usb_buffer_free(usbdev, AIPTEK_PACKET_LENGTH, aiptek->data,
|
||||
aiptek->data_dma);
|
||||
fail1: input_free_device(inputdev);
|
||||
kfree(aiptek);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/* Forward declaration */
|
||||
@ -2234,7 +2211,7 @@ static void aiptek_disconnect(struct usb_interface *intf)
|
||||
/* Free & unhook everything from the system.
|
||||
*/
|
||||
usb_kill_urb(aiptek->urb);
|
||||
input_unregister_device(&aiptek->inputdev);
|
||||
input_unregister_device(aiptek->inputdev);
|
||||
aiptek_delete_files(&intf->dev);
|
||||
usb_free_urb(aiptek->urb);
|
||||
usb_buffer_free(interface_to_usbdev(intf),
|
||||
|
@ -39,7 +39,7 @@
|
||||
#define APPLE_VENDOR_ID 0x05AC
|
||||
|
||||
#define ATP_DEVICE(prod) \
|
||||
.match_flags = USB_DEVICE_ID_MATCH_DEVICE | \
|
||||
.match_flags = USB_DEVICE_ID_MATCH_DEVICE | \
|
||||
USB_DEVICE_ID_MATCH_INT_CLASS | \
|
||||
USB_DEVICE_ID_MATCH_INT_PROTOCOL, \
|
||||
.idVendor = APPLE_VENDOR_ID, \
|
||||
@ -78,9 +78,9 @@ MODULE_DEVICE_TABLE (usb, atp_table);
|
||||
* We try to keep the touchpad aspect ratio while still doing only simple
|
||||
* arithmetics.
|
||||
* The factors below give coordinates like:
|
||||
* 0 <= x < 960 on 12" and 15" Powerbooks
|
||||
* 0 <= x < 1600 on 17" Powerbooks
|
||||
* 0 <= y < 646
|
||||
* 0 <= x < 960 on 12" and 15" Powerbooks
|
||||
* 0 <= x < 1600 on 17" Powerbooks
|
||||
* 0 <= y < 646
|
||||
*/
|
||||
#define ATP_XFACT 64
|
||||
#define ATP_YFACT 43
|
||||
@ -93,11 +93,12 @@ MODULE_DEVICE_TABLE (usb, atp_table);
|
||||
|
||||
/* Structure to hold all of our device specific stuff */
|
||||
struct atp {
|
||||
char phys[64];
|
||||
struct usb_device * udev; /* usb device */
|
||||
struct urb * urb; /* usb request block */
|
||||
signed char * data; /* transferred data */
|
||||
int open; /* non-zero if opened */
|
||||
struct input_dev input; /* input dev */
|
||||
struct input_dev *input; /* input dev */
|
||||
int valid; /* are the sensors valid ? */
|
||||
int x_old; /* last reported x/y, */
|
||||
int y_old; /* used for smoothing */
|
||||
@ -114,11 +115,11 @@ struct atp {
|
||||
int i; \
|
||||
printk("appletouch: %s %lld", msg, (long long)jiffies); \
|
||||
for (i = 0; i < ATP_XSENSORS + ATP_YSENSORS; i++) \
|
||||
printk(" %02x", tab[i]); \
|
||||
printk("\n"); \
|
||||
printk(" %02x", tab[i]); \
|
||||
printk("\n"); \
|
||||
}
|
||||
|
||||
#define dprintk(format, a...) \
|
||||
#define dprintk(format, a...) \
|
||||
do { \
|
||||
if (debug) printk(format, ##a); \
|
||||
} while (0)
|
||||
@ -219,8 +220,8 @@ static void atp_complete(struct urb* urb, struct pt_regs* regs)
|
||||
for (i = 16; i < ATP_XSENSORS; i++)
|
||||
if (dev->xy_cur[i]) {
|
||||
printk("appletouch: 17\" model detected.\n");
|
||||
input_set_abs_params(&dev->input, ABS_X, 0,
|
||||
(ATP_XSENSORS - 1) *
|
||||
input_set_abs_params(dev->input, ABS_X, 0,
|
||||
(ATP_XSENSORS - 1) *
|
||||
ATP_XFACT - 1,
|
||||
ATP_FUZZ, 0);
|
||||
break;
|
||||
@ -260,12 +261,12 @@ static void atp_complete(struct urb* urb, struct pt_regs* regs)
|
||||
"Xz: %3d Yz: %3d\n",
|
||||
x, y, x_z, y_z);
|
||||
|
||||
input_report_key(&dev->input, BTN_TOUCH, 1);
|
||||
input_report_abs(&dev->input, ABS_X, x);
|
||||
input_report_abs(&dev->input, ABS_Y, y);
|
||||
input_report_abs(&dev->input, ABS_PRESSURE,
|
||||
input_report_key(dev->input, BTN_TOUCH, 1);
|
||||
input_report_abs(dev->input, ABS_X, x);
|
||||
input_report_abs(dev->input, ABS_Y, y);
|
||||
input_report_abs(dev->input, ABS_PRESSURE,
|
||||
min(ATP_PRESSURE, x_z + y_z));
|
||||
atp_report_fingers(&dev->input, max(x_f, y_f));
|
||||
atp_report_fingers(dev->input, max(x_f, y_f));
|
||||
}
|
||||
dev->x_old = x;
|
||||
dev->y_old = y;
|
||||
@ -273,17 +274,17 @@ static void atp_complete(struct urb* urb, struct pt_regs* regs)
|
||||
else if (!x && !y) {
|
||||
|
||||
dev->x_old = dev->y_old = -1;
|
||||
input_report_key(&dev->input, BTN_TOUCH, 0);
|
||||
input_report_abs(&dev->input, ABS_PRESSURE, 0);
|
||||
atp_report_fingers(&dev->input, 0);
|
||||
input_report_key(dev->input, BTN_TOUCH, 0);
|
||||
input_report_abs(dev->input, ABS_PRESSURE, 0);
|
||||
atp_report_fingers(dev->input, 0);
|
||||
|
||||
/* reset the accumulator on release */
|
||||
memset(dev->xy_acc, 0, sizeof(dev->xy_acc));
|
||||
}
|
||||
|
||||
input_report_key(&dev->input, BTN_LEFT, !!dev->data[80]);
|
||||
input_report_key(dev->input, BTN_LEFT, !!dev->data[80]);
|
||||
|
||||
input_sync(&dev->input);
|
||||
input_sync(dev->input);
|
||||
|
||||
exit:
|
||||
retval = usb_submit_urb(dev->urb, GFP_ATOMIC);
|
||||
@ -314,21 +315,14 @@ static void atp_close(struct input_dev *input)
|
||||
|
||||
static int atp_probe(struct usb_interface *iface, const struct usb_device_id *id)
|
||||
{
|
||||
struct atp *dev = NULL;
|
||||
struct atp *dev;
|
||||
struct input_dev *input_dev;
|
||||
struct usb_device *udev = interface_to_usbdev(iface);
|
||||
struct usb_host_interface *iface_desc;
|
||||
struct usb_endpoint_descriptor *endpoint;
|
||||
int int_in_endpointAddr = 0;
|
||||
int i, retval = -ENOMEM;
|
||||
|
||||
/* allocate memory for our device state and initialize it */
|
||||
dev = kmalloc(sizeof(struct atp), GFP_KERNEL);
|
||||
if (dev == NULL) {
|
||||
err("Out of memory");
|
||||
goto err_kmalloc;
|
||||
}
|
||||
memset(dev, 0, sizeof(struct atp));
|
||||
|
||||
dev->udev = interface_to_usbdev(iface);
|
||||
|
||||
/* set up the endpoint information */
|
||||
/* use only the first interrupt-in endpoint */
|
||||
@ -345,70 +339,82 @@ static int atp_probe(struct usb_interface *iface, const struct usb_device_id *id
|
||||
}
|
||||
}
|
||||
if (!int_in_endpointAddr) {
|
||||
retval = -EIO;
|
||||
err("Could not find int-in endpoint");
|
||||
goto err_endpoint;
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
/* save our data pointer in this interface device */
|
||||
usb_set_intfdata(iface, dev);
|
||||
/* allocate memory for our device state and initialize it */
|
||||
dev = kzalloc(sizeof(struct atp), GFP_KERNEL);
|
||||
input_dev = input_allocate_device();
|
||||
if (!dev || !input_dev) {
|
||||
err("Out of memory");
|
||||
goto err_free_devs;
|
||||
}
|
||||
|
||||
dev->udev = udev;
|
||||
dev->input = input_dev;
|
||||
|
||||
dev->urb = usb_alloc_urb(0, GFP_KERNEL);
|
||||
if (!dev->urb) {
|
||||
retval = -ENOMEM;
|
||||
goto err_usballoc;
|
||||
goto err_free_devs;
|
||||
}
|
||||
|
||||
dev->data = usb_buffer_alloc(dev->udev, ATP_DATASIZE, GFP_KERNEL,
|
||||
&dev->urb->transfer_dma);
|
||||
if (!dev->data) {
|
||||
retval = -ENOMEM;
|
||||
goto err_usbbufalloc;
|
||||
goto err_free_urb;
|
||||
}
|
||||
usb_fill_int_urb(dev->urb, dev->udev,
|
||||
usb_rcvintpipe(dev->udev, int_in_endpointAddr),
|
||||
|
||||
usb_fill_int_urb(dev->urb, udev,
|
||||
usb_rcvintpipe(udev, int_in_endpointAddr),
|
||||
dev->data, ATP_DATASIZE, atp_complete, dev, 1);
|
||||
|
||||
init_input_dev(&dev->input);
|
||||
dev->input.name = "appletouch";
|
||||
dev->input.dev = &iface->dev;
|
||||
dev->input.private = dev;
|
||||
dev->input.open = atp_open;
|
||||
dev->input.close = atp_close;
|
||||
usb_make_path(udev, dev->phys, sizeof(dev->phys));
|
||||
strlcat(dev->phys, "/input0", sizeof(dev->phys));
|
||||
|
||||
usb_to_input_id(dev->udev, &dev->input.id);
|
||||
input_dev->name = "appletouch";
|
||||
input_dev->phys = dev->phys;
|
||||
usb_to_input_id(dev->udev, &input_dev->id);
|
||||
input_dev->cdev.dev = &iface->dev;
|
||||
|
||||
set_bit(EV_ABS, dev->input.evbit);
|
||||
input_dev->private = dev;
|
||||
input_dev->open = atp_open;
|
||||
input_dev->close = atp_close;
|
||||
|
||||
set_bit(EV_ABS, input_dev->evbit);
|
||||
|
||||
/*
|
||||
* 12" and 15" Powerbooks only have 16 x sensors,
|
||||
* 17" models are detected later.
|
||||
*/
|
||||
input_set_abs_params(&dev->input, ABS_X, 0,
|
||||
input_set_abs_params(input_dev, ABS_X, 0,
|
||||
(16 - 1) * ATP_XFACT - 1, ATP_FUZZ, 0);
|
||||
input_set_abs_params(&dev->input, ABS_Y, 0,
|
||||
input_set_abs_params(input_dev, ABS_Y, 0,
|
||||
(ATP_YSENSORS - 1) * ATP_YFACT - 1, ATP_FUZZ, 0);
|
||||
input_set_abs_params(&dev->input, ABS_PRESSURE, 0, ATP_PRESSURE, 0, 0);
|
||||
input_set_abs_params(input_dev, ABS_PRESSURE, 0, ATP_PRESSURE, 0, 0);
|
||||
|
||||
set_bit(EV_KEY, dev->input.evbit);
|
||||
set_bit(BTN_TOUCH, dev->input.keybit);
|
||||
set_bit(BTN_TOOL_FINGER, dev->input.keybit);
|
||||
set_bit(BTN_TOOL_DOUBLETAP, dev->input.keybit);
|
||||
set_bit(BTN_TOOL_TRIPLETAP, dev->input.keybit);
|
||||
set_bit(BTN_LEFT, dev->input.keybit);
|
||||
set_bit(EV_KEY, input_dev->evbit);
|
||||
set_bit(BTN_TOUCH, input_dev->keybit);
|
||||
set_bit(BTN_TOOL_FINGER, input_dev->keybit);
|
||||
set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit);
|
||||
set_bit(BTN_TOOL_TRIPLETAP, input_dev->keybit);
|
||||
set_bit(BTN_LEFT, input_dev->keybit);
|
||||
|
||||
input_register_device(&dev->input);
|
||||
input_register_device(dev->input);
|
||||
|
||||
printk(KERN_INFO "input: appletouch connected\n");
|
||||
/* save our data pointer in this interface device */
|
||||
usb_set_intfdata(iface, dev);
|
||||
|
||||
return 0;
|
||||
|
||||
err_usbbufalloc:
|
||||
err_free_urb:
|
||||
usb_free_urb(dev->urb);
|
||||
err_usballoc:
|
||||
err_free_devs:
|
||||
usb_set_intfdata(iface, NULL);
|
||||
err_endpoint:
|
||||
kfree(dev);
|
||||
err_kmalloc:
|
||||
input_free_device(input_dev);
|
||||
return retval;
|
||||
}
|
||||
|
||||
@ -419,7 +425,7 @@ static void atp_disconnect(struct usb_interface *iface)
|
||||
usb_set_intfdata(iface, NULL);
|
||||
if (dev) {
|
||||
usb_kill_urb(dev->urb);
|
||||
input_unregister_device(&dev->input);
|
||||
input_unregister_device(dev->input);
|
||||
usb_free_urb(dev->urb);
|
||||
usb_buffer_free(dev->udev, ATP_DATASIZE,
|
||||
dev->data, dev->urb->transfer_dma);
|
||||
|
@ -112,7 +112,6 @@
|
||||
|
||||
#define NAME_BUFSIZE 80 /* size of product name, path buffers */
|
||||
#define DATA_BUFSIZE 63 /* size of URB data buffers */
|
||||
#define ATI_INPUTNUM 1 /* Which input device to register as */
|
||||
|
||||
static unsigned long channel_mask;
|
||||
module_param(channel_mask, ulong, 0444);
|
||||
@ -162,7 +161,7 @@ static char accel[] = { 1, 2, 4, 6, 9, 13, 20 };
|
||||
static DECLARE_MUTEX(disconnect_sem);
|
||||
|
||||
struct ati_remote {
|
||||
struct input_dev idev;
|
||||
struct input_dev *idev;
|
||||
struct usb_device *udev;
|
||||
struct usb_interface *interface;
|
||||
|
||||
@ -198,15 +197,13 @@ struct ati_remote {
|
||||
#define KIND_ACCEL 7 /* Directional keypad - left, right, up, down.*/
|
||||
|
||||
/* Translation table from hardware messages to input events. */
|
||||
static struct
|
||||
{
|
||||
static struct {
|
||||
short kind;
|
||||
unsigned char data1, data2;
|
||||
int type;
|
||||
unsigned int code;
|
||||
int value;
|
||||
} ati_remote_tbl[] =
|
||||
{
|
||||
} ati_remote_tbl[] = {
|
||||
/* Directional control pad axes */
|
||||
{KIND_ACCEL, 0x35, 0x70, EV_REL, REL_X, -1}, /* left */
|
||||
{KIND_ACCEL, 0x36, 0x71, EV_REL, REL_X, 1}, /* right */
|
||||
@ -286,7 +283,6 @@ static struct
|
||||
|
||||
/* Local function prototypes */
|
||||
static void ati_remote_dump (unsigned char *data, unsigned int actual_length);
|
||||
static void ati_remote_delete (struct ati_remote *dev);
|
||||
static int ati_remote_open (struct input_dev *inputdev);
|
||||
static void ati_remote_close (struct input_dev *inputdev);
|
||||
static int ati_remote_sendpacket (struct ati_remote *ati_remote, u16 cmd, unsigned char *data);
|
||||
@ -428,7 +424,7 @@ static void ati_remote_input_report(struct urb *urb, struct pt_regs *regs)
|
||||
{
|
||||
struct ati_remote *ati_remote = urb->context;
|
||||
unsigned char *data= ati_remote->inbuf;
|
||||
struct input_dev *dev = &ati_remote->idev;
|
||||
struct input_dev *dev = ati_remote->idev;
|
||||
int index, acc;
|
||||
int remote_num;
|
||||
|
||||
@ -587,17 +583,42 @@ static void ati_remote_irq_in(struct urb *urb, struct pt_regs *regs)
|
||||
}
|
||||
|
||||
/*
|
||||
* ati_remote_delete
|
||||
* ati_remote_alloc_buffers
|
||||
*/
|
||||
static void ati_remote_delete(struct ati_remote *ati_remote)
|
||||
static int ati_remote_alloc_buffers(struct usb_device *udev,
|
||||
struct ati_remote *ati_remote)
|
||||
{
|
||||
ati_remote->inbuf = usb_buffer_alloc(udev, DATA_BUFSIZE, SLAB_ATOMIC,
|
||||
&ati_remote->inbuf_dma);
|
||||
if (!ati_remote->inbuf)
|
||||
return -1;
|
||||
|
||||
ati_remote->outbuf = usb_buffer_alloc(udev, DATA_BUFSIZE, SLAB_ATOMIC,
|
||||
&ati_remote->outbuf_dma);
|
||||
if (!ati_remote->outbuf)
|
||||
return -1;
|
||||
|
||||
ati_remote->irq_urb = usb_alloc_urb(0, GFP_KERNEL);
|
||||
if (!ati_remote->irq_urb)
|
||||
return -1;
|
||||
|
||||
ati_remote->out_urb = usb_alloc_urb(0, GFP_KERNEL);
|
||||
if (!ati_remote->out_urb)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* ati_remote_free_buffers
|
||||
*/
|
||||
static void ati_remote_free_buffers(struct ati_remote *ati_remote)
|
||||
{
|
||||
if (ati_remote->irq_urb)
|
||||
usb_kill_urb(ati_remote->irq_urb);
|
||||
usb_free_urb(ati_remote->irq_urb);
|
||||
|
||||
if (ati_remote->out_urb)
|
||||
usb_kill_urb(ati_remote->out_urb);
|
||||
|
||||
input_unregister_device(&ati_remote->idev);
|
||||
usb_free_urb(ati_remote->out_urb);
|
||||
|
||||
if (ati_remote->inbuf)
|
||||
usb_buffer_free(ati_remote->udev, DATA_BUFSIZE,
|
||||
@ -605,20 +626,12 @@ static void ati_remote_delete(struct ati_remote *ati_remote)
|
||||
|
||||
if (ati_remote->outbuf)
|
||||
usb_buffer_free(ati_remote->udev, DATA_BUFSIZE,
|
||||
ati_remote->outbuf, ati_remote->outbuf_dma);
|
||||
|
||||
if (ati_remote->irq_urb)
|
||||
usb_free_urb(ati_remote->irq_urb);
|
||||
|
||||
if (ati_remote->out_urb)
|
||||
usb_free_urb(ati_remote->out_urb);
|
||||
|
||||
kfree(ati_remote);
|
||||
ati_remote->inbuf, ati_remote->outbuf_dma);
|
||||
}
|
||||
|
||||
static void ati_remote_input_init(struct ati_remote *ati_remote)
|
||||
{
|
||||
struct input_dev *idev = &(ati_remote->idev);
|
||||
struct input_dev *idev = ati_remote->idev;
|
||||
int i;
|
||||
|
||||
idev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL);
|
||||
@ -637,7 +650,7 @@ static void ati_remote_input_init(struct ati_remote *ati_remote)
|
||||
idev->phys = ati_remote->phys;
|
||||
|
||||
usb_to_input_id(ati_remote->udev, &idev->id);
|
||||
idev->dev = &ati_remote->udev->dev;
|
||||
idev->cdev.dev = &ati_remote->udev->dev;
|
||||
}
|
||||
|
||||
static int ati_remote_initialize(struct ati_remote *ati_remote)
|
||||
@ -674,7 +687,7 @@ static int ati_remote_initialize(struct ati_remote *ati_remote)
|
||||
(ati_remote_sendpacket(ati_remote, 0x8007, init2))) {
|
||||
dev_err(&ati_remote->interface->dev,
|
||||
"Initializing ati_remote hardware failed.\n");
|
||||
return 1;
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -686,95 +699,83 @@ static int ati_remote_initialize(struct ati_remote *ati_remote)
|
||||
static int ati_remote_probe(struct usb_interface *interface, const struct usb_device_id *id)
|
||||
{
|
||||
struct usb_device *udev = interface_to_usbdev(interface);
|
||||
struct ati_remote *ati_remote = NULL;
|
||||
struct usb_host_interface *iface_host;
|
||||
int retval = -ENOMEM;
|
||||
char path[64];
|
||||
struct usb_host_interface *iface_host = interface->cur_altsetting;
|
||||
struct usb_endpoint_descriptor *endpoint_in, *endpoint_out;
|
||||
struct ati_remote *ati_remote;
|
||||
struct input_dev *input_dev;
|
||||
int err = -ENOMEM;
|
||||
|
||||
/* Allocate and clear an ati_remote struct */
|
||||
if (!(ati_remote = kmalloc(sizeof (struct ati_remote), GFP_KERNEL)))
|
||||
return -ENOMEM;
|
||||
memset(ati_remote, 0x00, sizeof (struct ati_remote));
|
||||
|
||||
iface_host = interface->cur_altsetting;
|
||||
if (iface_host->desc.bNumEndpoints != 2) {
|
||||
err("%s: Unexpected desc.bNumEndpoints\n", __FUNCTION__);
|
||||
retval = -ENODEV;
|
||||
goto error;
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
ati_remote->endpoint_in = &(iface_host->endpoint[0].desc);
|
||||
ati_remote->endpoint_out = &(iface_host->endpoint[1].desc);
|
||||
ati_remote->udev = udev;
|
||||
ati_remote->interface = interface;
|
||||
endpoint_in = &iface_host->endpoint[0].desc;
|
||||
endpoint_out = &iface_host->endpoint[1].desc;
|
||||
|
||||
if (!(ati_remote->endpoint_in->bEndpointAddress & 0x80)) {
|
||||
if (!(endpoint_in->bEndpointAddress & USB_DIR_IN)) {
|
||||
err("%s: Unexpected endpoint_in->bEndpointAddress\n", __FUNCTION__);
|
||||
retval = -ENODEV;
|
||||
goto error;
|
||||
return -ENODEV;
|
||||
}
|
||||
if ((ati_remote->endpoint_in->bmAttributes & 3) != 3) {
|
||||
if ((endpoint_in->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_INT) {
|
||||
err("%s: Unexpected endpoint_in->bmAttributes\n", __FUNCTION__);
|
||||
retval = -ENODEV;
|
||||
goto error;
|
||||
return -ENODEV;
|
||||
}
|
||||
if (le16_to_cpu(ati_remote->endpoint_in->wMaxPacketSize) == 0) {
|
||||
if (le16_to_cpu(endpoint_in->wMaxPacketSize) == 0) {
|
||||
err("%s: endpoint_in message size==0? \n", __FUNCTION__);
|
||||
retval = -ENODEV;
|
||||
goto error;
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
ati_remote = kzalloc(sizeof (struct ati_remote), GFP_KERNEL);
|
||||
input_dev = input_allocate_device();
|
||||
if (!ati_remote || !input_dev)
|
||||
goto fail1;
|
||||
|
||||
/* Allocate URB buffers, URBs */
|
||||
ati_remote->inbuf = usb_buffer_alloc(udev, DATA_BUFSIZE, SLAB_ATOMIC,
|
||||
&ati_remote->inbuf_dma);
|
||||
if (!ati_remote->inbuf)
|
||||
goto error;
|
||||
if (ati_remote_alloc_buffers(udev, ati_remote))
|
||||
goto fail2;
|
||||
|
||||
ati_remote->outbuf = usb_buffer_alloc(udev, DATA_BUFSIZE, SLAB_ATOMIC,
|
||||
&ati_remote->outbuf_dma);
|
||||
if (!ati_remote->outbuf)
|
||||
goto error;
|
||||
ati_remote->endpoint_in = endpoint_in;
|
||||
ati_remote->endpoint_out = endpoint_out;
|
||||
ati_remote->udev = udev;
|
||||
ati_remote->idev = input_dev;
|
||||
ati_remote->interface = interface;
|
||||
|
||||
ati_remote->irq_urb = usb_alloc_urb(0, GFP_KERNEL);
|
||||
if (!ati_remote->irq_urb)
|
||||
goto error;
|
||||
usb_make_path(udev, ati_remote->phys, sizeof(ati_remote->phys));
|
||||
strlcpy(ati_remote->phys, "/input0", sizeof(ati_remote->phys));
|
||||
|
||||
ati_remote->out_urb = usb_alloc_urb(0, GFP_KERNEL);
|
||||
if (!ati_remote->out_urb)
|
||||
goto error;
|
||||
|
||||
usb_make_path(udev, path, NAME_BUFSIZE);
|
||||
sprintf(ati_remote->phys, "%s/input%d", path, ATI_INPUTNUM);
|
||||
if (udev->manufacturer)
|
||||
strcat(ati_remote->name, udev->manufacturer);
|
||||
strlcpy(ati_remote->name, udev->manufacturer, sizeof(ati_remote->name));
|
||||
|
||||
if (udev->product)
|
||||
sprintf(ati_remote->name, "%s %s", ati_remote->name, udev->product);
|
||||
snprintf(ati_remote->name, sizeof(ati_remote->name),
|
||||
"%s %s", ati_remote->name, udev->product);
|
||||
|
||||
if (!strlen(ati_remote->name))
|
||||
sprintf(ati_remote->name, DRIVER_DESC "(%04x,%04x)",
|
||||
snprintf(ati_remote->name, sizeof(ati_remote->name),
|
||||
DRIVER_DESC "(%04x,%04x)",
|
||||
le16_to_cpu(ati_remote->udev->descriptor.idVendor),
|
||||
le16_to_cpu(ati_remote->udev->descriptor.idProduct));
|
||||
|
||||
ati_remote_input_init(ati_remote);
|
||||
|
||||
/* Device Hardware Initialization - fills in ati_remote->idev from udev. */
|
||||
retval = ati_remote_initialize(ati_remote);
|
||||
if (retval)
|
||||
goto error;
|
||||
err = ati_remote_initialize(ati_remote);
|
||||
if (err)
|
||||
goto fail3;
|
||||
|
||||
/* Set up and register input device */
|
||||
ati_remote_input_init(ati_remote);
|
||||
input_register_device(&ati_remote->idev);
|
||||
|
||||
dev_info(&ati_remote->interface->dev, "Input registered: %s on %s\n",
|
||||
ati_remote->name, path);
|
||||
input_register_device(ati_remote->idev);
|
||||
|
||||
usb_set_intfdata(interface, ati_remote);
|
||||
return 0;
|
||||
|
||||
error:
|
||||
if (retval)
|
||||
ati_remote_delete(ati_remote);
|
||||
|
||||
return retval;
|
||||
fail3: usb_kill_urb(ati_remote->irq_urb);
|
||||
usb_kill_urb(ati_remote->out_urb);
|
||||
fail2: ati_remote_free_buffers(ati_remote);
|
||||
fail1: input_free_device(input_dev);
|
||||
kfree(ati_remote);
|
||||
return err;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -791,7 +792,11 @@ static void ati_remote_disconnect(struct usb_interface *interface)
|
||||
return;
|
||||
}
|
||||
|
||||
ati_remote_delete(ati_remote);
|
||||
usb_kill_urb(ati_remote->irq_urb);
|
||||
usb_kill_urb(ati_remote->out_urb);
|
||||
input_unregister_device(ati_remote->idev);
|
||||
ati_remote_free_buffers(ati_remote);
|
||||
kfree(ati_remote);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1619,8 +1619,8 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf)
|
||||
struct hid_descriptor *hdesc;
|
||||
struct hid_device *hid;
|
||||
unsigned quirks = 0, rsize = 0;
|
||||
char *buf, *rdesc;
|
||||
int n, insize = 0;
|
||||
char *rdesc;
|
||||
int n, len, insize = 0;
|
||||
|
||||
for (n = 0; hid_blacklist[n].idVendor; n++)
|
||||
if ((hid_blacklist[n].idVendor == le16_to_cpu(dev->descriptor.idVendor)) &&
|
||||
@ -1630,10 +1630,11 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf)
|
||||
if (quirks & HID_QUIRK_IGNORE)
|
||||
return NULL;
|
||||
|
||||
if (usb_get_extra_descriptor(interface, HID_DT_HID, &hdesc) && ((!interface->desc.bNumEndpoints) ||
|
||||
usb_get_extra_descriptor(&interface->endpoint[0], HID_DT_HID, &hdesc))) {
|
||||
dbg("class descriptor not present\n");
|
||||
return NULL;
|
||||
if (usb_get_extra_descriptor(interface, HID_DT_HID, &hdesc) &&
|
||||
(!interface->desc.bNumEndpoints ||
|
||||
usb_get_extra_descriptor(&interface->endpoint[0], HID_DT_HID, &hdesc))) {
|
||||
dbg("class descriptor not present\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for (n = 0; n < hdesc->bNumDescriptors; n++)
|
||||
@ -1749,32 +1750,34 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf)
|
||||
|
||||
hid->name[0] = 0;
|
||||
|
||||
if (!(buf = kmalloc(64, GFP_KERNEL)))
|
||||
goto fail;
|
||||
if (dev->manufacturer)
|
||||
strlcpy(hid->name, dev->manufacturer, sizeof(hid->name));
|
||||
|
||||
if (dev->manufacturer) {
|
||||
strcat(hid->name, dev->manufacturer);
|
||||
if (dev->product)
|
||||
snprintf(hid->name, 64, "%s %s", hid->name, dev->product);
|
||||
} else if (dev->product) {
|
||||
snprintf(hid->name, 128, "%s", dev->product);
|
||||
} else
|
||||
snprintf(hid->name, 128, "%04x:%04x",
|
||||
le16_to_cpu(dev->descriptor.idVendor),
|
||||
le16_to_cpu(dev->descriptor.idProduct));
|
||||
if (dev->product) {
|
||||
if (dev->manufacturer)
|
||||
strlcat(hid->name, " ", sizeof(hid->name));
|
||||
strlcat(hid->name, dev->product, sizeof(hid->name));
|
||||
}
|
||||
|
||||
usb_make_path(dev, buf, 64);
|
||||
snprintf(hid->phys, 64, "%s/input%d", buf,
|
||||
intf->altsetting[0].desc.bInterfaceNumber);
|
||||
if (!strlen(hid->name))
|
||||
snprintf(hid->name, sizeof(hid->name), "HID %04x:%04x",
|
||||
le16_to_cpu(dev->descriptor.idVendor),
|
||||
le16_to_cpu(dev->descriptor.idProduct));
|
||||
|
||||
usb_make_path(dev, hid->phys, sizeof(hid->phys));
|
||||
strlcat(hid->phys, "/input", sizeof(hid->phys));
|
||||
len = strlen(hid->phys);
|
||||
if (len < sizeof(hid->phys) - 1)
|
||||
snprintf(hid->phys + len, sizeof(hid->phys) - len,
|
||||
"%d", intf->altsetting[0].desc.bInterfaceNumber);
|
||||
|
||||
if (usb_string(dev, dev->descriptor.iSerialNumber, hid->uniq, 64) <= 0)
|
||||
hid->uniq[0] = 0;
|
||||
|
||||
kfree(buf);
|
||||
|
||||
hid->urbctrl = usb_alloc_urb(0, GFP_KERNEL);
|
||||
if (!hid->urbctrl)
|
||||
goto fail;
|
||||
|
||||
usb_fill_control_urb(hid->urbctrl, dev, 0, (void *) hid->cr,
|
||||
hid->ctrlbuf, 1, hid_ctrl, hid);
|
||||
hid->urbctrl->setup_dma = hid->cr_dma;
|
||||
|
@ -76,8 +76,8 @@ static struct {
|
||||
static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_field *field,
|
||||
struct hid_usage *usage)
|
||||
{
|
||||
struct input_dev *input = &hidinput->input;
|
||||
struct hid_device *device = hidinput->input.private;
|
||||
struct input_dev *input = hidinput->input;
|
||||
struct hid_device *device = input->private;
|
||||
int max = 0, code;
|
||||
unsigned long *bit = NULL;
|
||||
|
||||
@ -461,7 +461,8 @@ void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct
|
||||
|
||||
if (!field->hidinput)
|
||||
return;
|
||||
input = &field->hidinput->input;
|
||||
|
||||
input = field->hidinput->input;
|
||||
|
||||
input_regs(input, regs);
|
||||
|
||||
@ -533,13 +534,10 @@ void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct
|
||||
|
||||
void hidinput_report_event(struct hid_device *hid, struct hid_report *report)
|
||||
{
|
||||
struct list_head *lh;
|
||||
struct hid_input *hidinput;
|
||||
|
||||
list_for_each (lh, &hid->inputs) {
|
||||
hidinput = list_entry(lh, struct hid_input, list);
|
||||
input_sync(&hidinput->input);
|
||||
}
|
||||
list_for_each_entry(hidinput, &hid->inputs, list)
|
||||
input_sync(hidinput->input);
|
||||
}
|
||||
|
||||
static int hidinput_find_field(struct hid_device *hid, unsigned int type, unsigned int code, struct hid_field **field)
|
||||
@ -604,6 +602,7 @@ int hidinput_connect(struct hid_device *hid)
|
||||
struct usb_device *dev = hid->dev;
|
||||
struct hid_report *report;
|
||||
struct hid_input *hidinput = NULL;
|
||||
struct input_dev *input_dev;
|
||||
int i, j, k;
|
||||
|
||||
INIT_LIST_HEAD(&hid->inputs);
|
||||
@ -624,25 +623,28 @@ int hidinput_connect(struct hid_device *hid)
|
||||
continue;
|
||||
|
||||
if (!hidinput) {
|
||||
hidinput = kmalloc(sizeof(*hidinput), GFP_KERNEL);
|
||||
if (!hidinput) {
|
||||
hidinput = kzalloc(sizeof(*hidinput), GFP_KERNEL);
|
||||
input_dev = input_allocate_device();
|
||||
if (!hidinput || !input_dev) {
|
||||
kfree(hidinput);
|
||||
input_free_device(input_dev);
|
||||
err("Out of memory during hid input probe");
|
||||
return -1;
|
||||
}
|
||||
memset(hidinput, 0, sizeof(*hidinput));
|
||||
|
||||
input_dev->private = hid;
|
||||
input_dev->event = hidinput_input_event;
|
||||
input_dev->open = hidinput_open;
|
||||
input_dev->close = hidinput_close;
|
||||
|
||||
input_dev->name = hid->name;
|
||||
input_dev->phys = hid->phys;
|
||||
input_dev->uniq = hid->uniq;
|
||||
usb_to_input_id(dev, &input_dev->id);
|
||||
input_dev->cdev.dev = &hid->intf->dev;
|
||||
|
||||
hidinput->input = input_dev;
|
||||
list_add_tail(&hidinput->list, &hid->inputs);
|
||||
|
||||
hidinput->input.private = hid;
|
||||
hidinput->input.event = hidinput_input_event;
|
||||
hidinput->input.open = hidinput_open;
|
||||
hidinput->input.close = hidinput_close;
|
||||
|
||||
hidinput->input.name = hid->name;
|
||||
hidinput->input.phys = hid->phys;
|
||||
hidinput->input.uniq = hid->uniq;
|
||||
usb_to_input_id(dev, &hidinput->input.id);
|
||||
hidinput->input.dev = &hid->intf->dev;
|
||||
}
|
||||
|
||||
for (i = 0; i < report->maxfield; i++)
|
||||
@ -657,7 +659,7 @@ int hidinput_connect(struct hid_device *hid)
|
||||
* UGCI) cram a lot of unrelated inputs into the
|
||||
* same interface. */
|
||||
hidinput->report = report;
|
||||
input_register_device(&hidinput->input);
|
||||
input_register_device(hidinput->input);
|
||||
hidinput = NULL;
|
||||
}
|
||||
}
|
||||
@ -667,7 +669,7 @@ int hidinput_connect(struct hid_device *hid)
|
||||
* only useful in this case, and not for multi-input quirks. */
|
||||
if (hidinput) {
|
||||
hid_ff_init(hid);
|
||||
input_register_device(&hidinput->input);
|
||||
input_register_device(hidinput->input);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -675,13 +677,11 @@ int hidinput_connect(struct hid_device *hid)
|
||||
|
||||
void hidinput_disconnect(struct hid_device *hid)
|
||||
{
|
||||
struct list_head *lh, *next;
|
||||
struct hid_input *hidinput;
|
||||
struct hid_input *hidinput, *next;
|
||||
|
||||
list_for_each_safe(lh, next, &hid->inputs) {
|
||||
hidinput = list_entry(lh, struct hid_input, list);
|
||||
input_unregister_device(&hidinput->input);
|
||||
list_for_each_entry_safe(hidinput, next, &hid->inputs, list) {
|
||||
list_del(&hidinput->list);
|
||||
input_unregister_device(hidinput->input);
|
||||
kfree(hidinput);
|
||||
}
|
||||
}
|
||||
|
@ -255,22 +255,19 @@ static void hid_lgff_input_init(struct hid_device* hid)
|
||||
u16 idVendor = le16_to_cpu(hid->dev->descriptor.idVendor);
|
||||
u16 idProduct = le16_to_cpu(hid->dev->descriptor.idProduct);
|
||||
struct hid_input *hidinput = list_entry(hid->inputs.next, struct hid_input, list);
|
||||
struct input_dev *input_dev = hidinput->input;
|
||||
|
||||
while (dev->idVendor && (idVendor != dev->idVendor || idProduct != dev->idProduct))
|
||||
dev++;
|
||||
|
||||
ff = dev->ff;
|
||||
for (ff = dev->ff; *ff >= 0; ff++)
|
||||
set_bit(*ff, input_dev->ffbit);
|
||||
|
||||
while (*ff >= 0) {
|
||||
set_bit(*ff, hidinput->input.ffbit);
|
||||
++ff;
|
||||
}
|
||||
input_dev->upload_effect = hid_lgff_upload_effect;
|
||||
input_dev->flush = hid_lgff_flush;
|
||||
|
||||
hidinput->input.upload_effect = hid_lgff_upload_effect;
|
||||
hidinput->input.flush = hid_lgff_flush;
|
||||
|
||||
set_bit(EV_FF, hidinput->input.evbit);
|
||||
hidinput->input.ff_effects_max = LGFF_EFFECTS;
|
||||
set_bit(EV_FF, input_dev->evbit);
|
||||
input_dev->ff_effects_max = LGFF_EFFECTS;
|
||||
}
|
||||
|
||||
static void hid_lgff_exit(struct hid_device* hid)
|
||||
|
@ -111,6 +111,7 @@ int hid_tmff_init(struct hid_device *hid)
|
||||
struct tmff_device *private;
|
||||
struct list_head *pos;
|
||||
struct hid_input *hidinput = list_entry(hid->inputs.next, struct hid_input, list);
|
||||
struct input_dev *input_dev = hidinput->input;
|
||||
|
||||
private = kmalloc(sizeof(struct tmff_device), GFP_KERNEL);
|
||||
if (!private)
|
||||
@ -155,7 +156,7 @@ int hid_tmff_init(struct hid_device *hid)
|
||||
private->report = report;
|
||||
private->rumble = field;
|
||||
|
||||
set_bit(FF_RUMBLE, hidinput->input.ffbit);
|
||||
set_bit(FF_RUMBLE, input_dev->ffbit);
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -164,11 +165,11 @@ int hid_tmff_init(struct hid_device *hid)
|
||||
}
|
||||
|
||||
/* Fallthrough to here only when a valid usage is found */
|
||||
hidinput->input.upload_effect = hid_tmff_upload_effect;
|
||||
hidinput->input.flush = hid_tmff_flush;
|
||||
input_dev->upload_effect = hid_tmff_upload_effect;
|
||||
input_dev->flush = hid_tmff_flush;
|
||||
|
||||
set_bit(EV_FF, hidinput->input.evbit);
|
||||
hidinput->input.ff_effects_max = TMFF_EFFECTS;
|
||||
set_bit(EV_FF, input_dev->evbit);
|
||||
input_dev->ff_effects_max = TMFF_EFFECTS;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -371,7 +371,7 @@ struct hid_control_fifo {
|
||||
struct hid_input {
|
||||
struct list_head list;
|
||||
struct hid_report *report;
|
||||
struct input_dev input;
|
||||
struct input_dev *input;
|
||||
};
|
||||
|
||||
struct hid_device { /* device report descriptor */
|
||||
|
@ -73,7 +73,7 @@ MODULE_LICENSE( DRIVER_LICENSE );
|
||||
|
||||
struct itmtouch_dev {
|
||||
struct usb_device *usbdev; /* usb device */
|
||||
struct input_dev inputdev; /* input device */
|
||||
struct input_dev *inputdev; /* input device */
|
||||
struct urb *readurb; /* urb */
|
||||
char rbuf[ITM_BUFSIZE]; /* data */
|
||||
int users;
|
||||
@ -88,9 +88,9 @@ static struct usb_device_id itmtouch_ids [] = {
|
||||
|
||||
static void itmtouch_irq(struct urb *urb, struct pt_regs *regs)
|
||||
{
|
||||
struct itmtouch_dev * itmtouch = urb->context;
|
||||
struct itmtouch_dev *itmtouch = urb->context;
|
||||
unsigned char *data = urb->transfer_buffer;
|
||||
struct input_dev *dev = &itmtouch->inputdev;
|
||||
struct input_dev *dev = itmtouch->inputdev;
|
||||
int retval;
|
||||
|
||||
switch (urb->status) {
|
||||
@ -156,49 +156,62 @@ static void itmtouch_close(struct input_dev *input)
|
||||
static int itmtouch_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
{
|
||||
struct itmtouch_dev *itmtouch;
|
||||
struct input_dev *input_dev;
|
||||
struct usb_host_interface *interface;
|
||||
struct usb_endpoint_descriptor *endpoint;
|
||||
struct usb_device *udev = interface_to_usbdev(intf);
|
||||
unsigned int pipe;
|
||||
unsigned int maxp;
|
||||
char path[PATH_SIZE];
|
||||
|
||||
interface = intf->cur_altsetting;
|
||||
endpoint = &interface->endpoint[0].desc;
|
||||
|
||||
if (!(itmtouch = kzalloc(sizeof(struct itmtouch_dev), GFP_KERNEL))) {
|
||||
itmtouch = kzalloc(sizeof(struct itmtouch_dev), GFP_KERNEL);
|
||||
input_dev = input_allocate_device();
|
||||
if (!itmtouch || !input_dev) {
|
||||
err("%s - Out of memory.", __FUNCTION__);
|
||||
return -ENOMEM;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
itmtouch->usbdev = udev;
|
||||
itmtouch->inputdev = input_dev;
|
||||
|
||||
itmtouch->inputdev.private = itmtouch;
|
||||
itmtouch->inputdev.open = itmtouch_open;
|
||||
itmtouch->inputdev.close = itmtouch_close;
|
||||
if (udev->manufacturer)
|
||||
strlcpy(itmtouch->name, udev->manufacturer, sizeof(itmtouch->name));
|
||||
|
||||
usb_make_path(udev, path, PATH_SIZE);
|
||||
|
||||
itmtouch->inputdev.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
|
||||
itmtouch->inputdev.absbit[0] = BIT(ABS_X) | BIT(ABS_Y) | BIT(ABS_PRESSURE);
|
||||
itmtouch->inputdev.keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH);
|
||||
|
||||
itmtouch->inputdev.name = itmtouch->name;
|
||||
itmtouch->inputdev.phys = itmtouch->phys;
|
||||
usb_to_input_id(udev, &itmtouch->inputdev.id);
|
||||
itmtouch->inputdev.dev = &intf->dev;
|
||||
if (udev->product) {
|
||||
if (udev->manufacturer)
|
||||
strlcat(itmtouch->name, " ", sizeof(itmtouch->name));
|
||||
strlcat(itmtouch->name, udev->product, sizeof(itmtouch->name));
|
||||
}
|
||||
|
||||
if (!strlen(itmtouch->name))
|
||||
sprintf(itmtouch->name, "USB ITM touchscreen");
|
||||
|
||||
usb_make_path(udev, itmtouch->phys, sizeof(itmtouch->phys));
|
||||
strlcpy(itmtouch->phys, "/input0", sizeof(itmtouch->phys));
|
||||
|
||||
input_dev->name = itmtouch->name;
|
||||
input_dev->phys = itmtouch->phys;
|
||||
usb_to_input_id(udev, &input_dev->id);
|
||||
input_dev->cdev.dev = &intf->dev;
|
||||
input_dev->private = itmtouch;
|
||||
|
||||
input_dev->open = itmtouch_open;
|
||||
input_dev->close = itmtouch_close;
|
||||
|
||||
input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
|
||||
input_dev->absbit[0] = BIT(ABS_X) | BIT(ABS_Y) | BIT(ABS_PRESSURE);
|
||||
input_dev->keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH);
|
||||
|
||||
/* device limits */
|
||||
/* as specified by the ITM datasheet, X and Y are 12bit,
|
||||
* Z (pressure) is 8 bit. However, the fields are defined up
|
||||
* to 14 bits for future possible expansion.
|
||||
*/
|
||||
input_set_abs_params(&itmtouch->inputdev, ABS_X, 0, 0x0FFF, 2, 0);
|
||||
input_set_abs_params(&itmtouch->inputdev, ABS_Y, 0, 0x0FFF, 2, 0);
|
||||
input_set_abs_params(&itmtouch->inputdev, ABS_PRESSURE, 0, 0xFF, 2, 0);
|
||||
input_set_abs_params(input_dev, ABS_X, 0, 0x0FFF, 2, 0);
|
||||
input_set_abs_params(input_dev, ABS_Y, 0, 0x0FFF, 2, 0);
|
||||
input_set_abs_params(input_dev, ABS_PRESSURE, 0, 0xFF, 2, 0);
|
||||
|
||||
/* initialise the URB so we can read from the transport stream */
|
||||
pipe = usb_rcvintpipe(itmtouch->usbdev, endpoint->bEndpointAddress);
|
||||
@ -208,22 +221,23 @@ static int itmtouch_probe(struct usb_interface *intf, const struct usb_device_id
|
||||
maxp = ITM_BUFSIZE;
|
||||
|
||||
itmtouch->readurb = usb_alloc_urb(0, GFP_KERNEL);
|
||||
|
||||
if (!itmtouch->readurb) {
|
||||
dbg("%s - usb_alloc_urb failed: itmtouch->readurb", __FUNCTION__);
|
||||
kfree(itmtouch);
|
||||
return -ENOMEM;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
usb_fill_int_urb(itmtouch->readurb, itmtouch->usbdev, pipe, itmtouch->rbuf,
|
||||
maxp, itmtouch_irq, itmtouch, endpoint->bInterval);
|
||||
|
||||
input_register_device(&itmtouch->inputdev);
|
||||
input_register_device(itmtouch->inputdev);
|
||||
|
||||
printk(KERN_INFO "itmtouch: %s registered on %s\n", itmtouch->name, path);
|
||||
usb_set_intfdata(intf, itmtouch);
|
||||
|
||||
return 0;
|
||||
|
||||
fail: input_free_device(input_dev);
|
||||
kfree(itmtouch);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
static void itmtouch_disconnect(struct usb_interface *intf)
|
||||
@ -233,7 +247,7 @@ static void itmtouch_disconnect(struct usb_interface *intf)
|
||||
usb_set_intfdata(intf, NULL);
|
||||
|
||||
if (itmtouch) {
|
||||
input_unregister_device(&itmtouch->inputdev);
|
||||
input_unregister_device(itmtouch->inputdev);
|
||||
usb_kill_urb(itmtouch->readurb);
|
||||
usb_free_urb(itmtouch->readurb);
|
||||
kfree(itmtouch);
|
||||
|
@ -34,7 +34,7 @@ MODULE_PARM_DESC(kb_pressure_click, "pressure threshold for clicks");
|
||||
struct kbtab {
|
||||
signed char *data;
|
||||
dma_addr_t data_dma;
|
||||
struct input_dev dev;
|
||||
struct input_dev *dev;
|
||||
struct usb_device *usbdev;
|
||||
struct urb *irq;
|
||||
int x, y;
|
||||
@ -48,7 +48,7 @@ static void kbtab_irq(struct urb *urb, struct pt_regs *regs)
|
||||
{
|
||||
struct kbtab *kbtab = urb->context;
|
||||
unsigned char *data = kbtab->data;
|
||||
struct input_dev *dev = &kbtab->dev;
|
||||
struct input_dev *dev = kbtab->dev;
|
||||
int retval;
|
||||
|
||||
switch (urb->status) {
|
||||
@ -124,53 +124,43 @@ static int kbtab_probe(struct usb_interface *intf, const struct usb_device_id *i
|
||||
struct usb_device *dev = interface_to_usbdev(intf);
|
||||
struct usb_endpoint_descriptor *endpoint;
|
||||
struct kbtab *kbtab;
|
||||
char path[64];
|
||||
struct input_dev *input_dev;
|
||||
|
||||
if (!(kbtab = kmalloc(sizeof(struct kbtab), GFP_KERNEL)))
|
||||
return -ENOMEM;
|
||||
memset(kbtab, 0, sizeof(struct kbtab));
|
||||
kbtab = kzalloc(sizeof(struct kbtab), GFP_KERNEL);
|
||||
input_dev = input_allocate_device();
|
||||
if (!kbtab || !input_dev)
|
||||
goto fail1;
|
||||
|
||||
kbtab->data = usb_buffer_alloc(dev, 8, GFP_KERNEL, &kbtab->data_dma);
|
||||
if (!kbtab->data) {
|
||||
kfree(kbtab);
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (!kbtab->data)
|
||||
goto fail1;
|
||||
|
||||
kbtab->irq = usb_alloc_urb(0, GFP_KERNEL);
|
||||
if (!kbtab->irq) {
|
||||
usb_buffer_free(dev, 10, kbtab->data, kbtab->data_dma);
|
||||
kfree(kbtab);
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (!kbtab->irq)
|
||||
goto fail2;
|
||||
|
||||
kbtab->dev.evbit[0] |= BIT(EV_KEY) | BIT(EV_ABS) | BIT(EV_MSC);
|
||||
kbtab->dev.absbit[0] |= BIT(ABS_X) | BIT(ABS_Y) | BIT(ABS_PRESSURE);
|
||||
|
||||
kbtab->dev.keybit[LONG(BTN_LEFT)] |= BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE);
|
||||
|
||||
kbtab->dev.keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_PEN) | BIT(BTN_TOUCH);
|
||||
|
||||
kbtab->dev.mscbit[0] |= BIT(MSC_SERIAL);
|
||||
|
||||
kbtab->dev.absmax[ABS_X] = 0x2000;
|
||||
kbtab->dev.absmax[ABS_Y] = 0x1750;
|
||||
kbtab->dev.absmax[ABS_PRESSURE] = 0xff;
|
||||
|
||||
kbtab->dev.absfuzz[ABS_X] = 4;
|
||||
kbtab->dev.absfuzz[ABS_Y] = 4;
|
||||
|
||||
kbtab->dev.private = kbtab;
|
||||
kbtab->dev.open = kbtab_open;
|
||||
kbtab->dev.close = kbtab_close;
|
||||
|
||||
usb_make_path(dev, path, 64);
|
||||
sprintf(kbtab->phys, "%s/input0", path);
|
||||
|
||||
kbtab->dev.name = "KB Gear Tablet";
|
||||
kbtab->dev.phys = kbtab->phys;
|
||||
usb_to_input_id(dev, &kbtab->dev.id);
|
||||
kbtab->dev.dev = &intf->dev;
|
||||
kbtab->usbdev = dev;
|
||||
kbtab->dev = input_dev;
|
||||
|
||||
usb_make_path(dev, kbtab->phys, sizeof(kbtab->phys));
|
||||
strlcat(kbtab->phys, "/input0", sizeof(kbtab->phys));
|
||||
|
||||
input_dev->name = "KB Gear Tablet";
|
||||
input_dev->phys = kbtab->phys;
|
||||
usb_to_input_id(dev, &input_dev->id);
|
||||
input_dev->cdev.dev = &intf->dev;
|
||||
input_dev->private = kbtab;
|
||||
|
||||
input_dev->open = kbtab_open;
|
||||
input_dev->close = kbtab_close;
|
||||
|
||||
input_dev->evbit[0] |= BIT(EV_KEY) | BIT(EV_ABS) | BIT(EV_MSC);
|
||||
input_dev->keybit[LONG(BTN_LEFT)] |= BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE);
|
||||
input_dev->keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_PEN) | BIT(BTN_TOUCH);
|
||||
input_dev->mscbit[0] |= BIT(MSC_SERIAL);
|
||||
input_set_abs_params(input_dev, ABS_X, 0, 0x2000, 4, 0);
|
||||
input_set_abs_params(input_dev, ABS_X, 0, 0x1750, 4, 0);
|
||||
input_set_abs_params(input_dev, ABS_PRESSURE, 0, 0xff, 0, 0);
|
||||
|
||||
endpoint = &intf->cur_altsetting->endpoint[0].desc;
|
||||
|
||||
@ -181,23 +171,25 @@ static int kbtab_probe(struct usb_interface *intf, const struct usb_device_id *i
|
||||
kbtab->irq->transfer_dma = kbtab->data_dma;
|
||||
kbtab->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
|
||||
|
||||
input_register_device(&kbtab->dev);
|
||||
|
||||
printk(KERN_INFO "input: KB Gear Tablet on %s\n", path);
|
||||
input_register_device(kbtab->dev);
|
||||
|
||||
usb_set_intfdata(intf, kbtab);
|
||||
|
||||
return 0;
|
||||
|
||||
fail2: usb_buffer_free(dev, 10, kbtab->data, kbtab->data_dma);
|
||||
fail1: input_free_device(input_dev);
|
||||
kfree(kbtab);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
static void kbtab_disconnect(struct usb_interface *intf)
|
||||
{
|
||||
struct kbtab *kbtab = usb_get_intfdata (intf);
|
||||
struct kbtab *kbtab = usb_get_intfdata(intf);
|
||||
|
||||
usb_set_intfdata(intf, NULL);
|
||||
if (kbtab) {
|
||||
usb_kill_urb(kbtab->irq);
|
||||
input_unregister_device(&kbtab->dev);
|
||||
input_unregister_device(kbtab->dev);
|
||||
usb_free_urb(kbtab->irq);
|
||||
usb_buffer_free(interface_to_usbdev(intf), 10, kbtab->data, kbtab->data_dma);
|
||||
kfree(kbtab);
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include <linux/moduleparam.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/usb.h>
|
||||
#include <linux/usb_input.h>
|
||||
|
||||
#define DRIVER_VERSION "v0.1"
|
||||
#define DRIVER_AUTHOR "Michael Downey <downey@zymeta.com>"
|
||||
@ -75,7 +76,7 @@ struct usb_keyspan {
|
||||
char name[128];
|
||||
char phys[64];
|
||||
struct usb_device* udev;
|
||||
struct input_dev input;
|
||||
struct input_dev *input;
|
||||
struct usb_interface* interface;
|
||||
struct usb_endpoint_descriptor* in_endpoint;
|
||||
struct urb* irq_urb;
|
||||
@ -136,12 +137,11 @@ static struct usb_driver keyspan_driver;
|
||||
*/
|
||||
static void keyspan_print(struct usb_keyspan* dev) /*unsigned char* data)*/
|
||||
{
|
||||
char codes[4*RECV_SIZE];
|
||||
char codes[4 * RECV_SIZE];
|
||||
int i;
|
||||
|
||||
for (i = 0; i < RECV_SIZE; i++) {
|
||||
snprintf(codes+i*3, 4, "%02x ", dev->in_buffer[i]);
|
||||
}
|
||||
for (i = 0; i < RECV_SIZE; i++)
|
||||
snprintf(codes + i * 3, 4, "%02x ", dev->in_buffer[i]);
|
||||
|
||||
dev_info(&dev->udev->dev, "%s\n", codes);
|
||||
}
|
||||
@ -153,7 +153,7 @@ static void keyspan_print(struct usb_keyspan* dev) /*unsigned char* data)*/
|
||||
static int keyspan_load_tester(struct usb_keyspan* dev, int bits_needed)
|
||||
{
|
||||
if (dev->data.bits_left >= bits_needed)
|
||||
return(0);
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* Somehow we've missed the last message. The message will be repeated
|
||||
@ -162,7 +162,7 @@ static int keyspan_load_tester(struct usb_keyspan* dev, int bits_needed)
|
||||
if (dev->data.pos >= dev->data.len) {
|
||||
dev_dbg(&dev->udev, "%s - Error ran out of data. pos: %d, len: %d\n",
|
||||
__FUNCTION__, dev->data.pos, dev->data.len);
|
||||
return(-1);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Load as much as we can into the tester. */
|
||||
@ -172,7 +172,7 @@ static int keyspan_load_tester(struct usb_keyspan* dev, int bits_needed)
|
||||
dev->data.bits_left += 8;
|
||||
}
|
||||
|
||||
return(0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -311,10 +311,10 @@ static void keyspan_check_data(struct usb_keyspan *remote, struct pt_regs *regs)
|
||||
__FUNCTION__, message.system, message.button, message.toggle);
|
||||
|
||||
if (message.toggle != remote->toggle) {
|
||||
input_regs(&remote->input, regs);
|
||||
input_report_key(&remote->input, keyspan_key_table[message.button], 1);
|
||||
input_report_key(&remote->input, keyspan_key_table[message.button], 0);
|
||||
input_sync(&remote->input);
|
||||
input_regs(remote->input, regs);
|
||||
input_report_key(remote->input, keyspan_key_table[message.button], 1);
|
||||
input_report_key(remote->input, keyspan_key_table[message.button], 0);
|
||||
input_sync(remote->input);
|
||||
remote->toggle = message.toggle;
|
||||
}
|
||||
|
||||
@ -397,14 +397,9 @@ static int keyspan_open(struct input_dev *dev)
|
||||
{
|
||||
struct usb_keyspan *remote = dev->private;
|
||||
|
||||
if (remote->open++)
|
||||
return 0;
|
||||
|
||||
remote->irq_urb->dev = remote->udev;
|
||||
if (usb_submit_urb(remote->irq_urb, GFP_KERNEL)) {
|
||||
remote->open--;
|
||||
if (usb_submit_urb(remote->irq_urb, GFP_KERNEL))
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -413,8 +408,26 @@ static void keyspan_close(struct input_dev *dev)
|
||||
{
|
||||
struct usb_keyspan *remote = dev->private;
|
||||
|
||||
if (!--remote->open)
|
||||
usb_kill_urb(remote->irq_urb);
|
||||
usb_kill_urb(remote->irq_urb);
|
||||
}
|
||||
|
||||
static struct usb_endpoint_descriptor *keyspan_get_in_endpoint(struct usb_host_interface *iface)
|
||||
{
|
||||
|
||||
struct usb_endpoint_descriptor *endpoint;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < iface->desc.bNumEndpoints; ++i) {
|
||||
endpoint = &iface->endpoint[i].desc;
|
||||
|
||||
if ((endpoint->bEndpointAddress & USB_DIR_IN) &&
|
||||
((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT)) {
|
||||
/* we found our interrupt in endpoint */
|
||||
return endpoint;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -422,110 +435,78 @@ static void keyspan_close(struct input_dev *dev)
|
||||
*/
|
||||
static int keyspan_probe(struct usb_interface *interface, const struct usb_device_id *id)
|
||||
{
|
||||
int i;
|
||||
int retval = -ENOMEM;
|
||||
char path[64];
|
||||
char *buf;
|
||||
struct usb_keyspan *remote = NULL;
|
||||
struct usb_host_interface *iface_desc;
|
||||
struct usb_device *udev = interface_to_usbdev(interface);
|
||||
struct usb_endpoint_descriptor *endpoint;
|
||||
struct usb_device *udev = usb_get_dev(interface_to_usbdev(interface));
|
||||
struct usb_keyspan *remote;
|
||||
struct input_dev *input_dev;
|
||||
int i, retval;
|
||||
|
||||
/* allocate memory for our device state and initialize it */
|
||||
remote = kmalloc(sizeof(*remote), GFP_KERNEL);
|
||||
if (remote == NULL) {
|
||||
err("Out of memory\n");
|
||||
goto error;
|
||||
endpoint = keyspan_get_in_endpoint(interface->cur_altsetting);
|
||||
if (!endpoint)
|
||||
return -ENODEV;
|
||||
|
||||
remote = kzalloc(sizeof(*remote), GFP_KERNEL);
|
||||
input_dev = input_allocate_device();
|
||||
if (!remote || !input_dev) {
|
||||
retval = -ENOMEM;
|
||||
goto fail1;
|
||||
}
|
||||
memset(remote, 0x00, sizeof(*remote));
|
||||
|
||||
remote->udev = udev;
|
||||
remote->input = input_dev;
|
||||
remote->interface = interface;
|
||||
remote->in_endpoint = endpoint;
|
||||
remote->toggle = -1; /* Set to -1 so we will always not match the toggle from the first remote message. */
|
||||
|
||||
/* set up the endpoint information */
|
||||
/* use only the first in interrupt endpoint */
|
||||
iface_desc = interface->cur_altsetting;
|
||||
for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
|
||||
endpoint = &iface_desc->endpoint[i].desc;
|
||||
|
||||
if (!remote->in_endpoint &&
|
||||
(endpoint->bEndpointAddress & USB_DIR_IN) &&
|
||||
((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT)) {
|
||||
/* we found our interrupt in endpoint */
|
||||
remote->in_endpoint = endpoint;
|
||||
|
||||
remote->in_buffer = usb_buffer_alloc(remote->udev, RECV_SIZE, SLAB_ATOMIC, &remote->in_dma);
|
||||
if (!remote->in_buffer) {
|
||||
retval = -ENOMEM;
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!remote->in_endpoint) {
|
||||
err("Could not find interrupt input endpoint.\n");
|
||||
retval = -ENODEV;
|
||||
goto error;
|
||||
remote->in_buffer = usb_buffer_alloc(udev, RECV_SIZE, SLAB_ATOMIC, &remote->in_dma);
|
||||
if (!remote->in_buffer) {
|
||||
retval = -ENOMEM;
|
||||
goto fail1;
|
||||
}
|
||||
|
||||
remote->irq_urb = usb_alloc_urb(0, GFP_KERNEL);
|
||||
if (!remote->irq_urb) {
|
||||
err("Failed to allocate urb.\n");
|
||||
retval = -ENOMEM;
|
||||
goto error;
|
||||
goto fail2;
|
||||
}
|
||||
|
||||
retval = keyspan_setup(remote->udev);
|
||||
retval = keyspan_setup(udev);
|
||||
if (retval) {
|
||||
err("Failed to setup device.\n");
|
||||
retval = -ENODEV;
|
||||
goto error;
|
||||
goto fail3;
|
||||
}
|
||||
|
||||
/*
|
||||
* Setup the input system with the bits we are going to be reporting
|
||||
*/
|
||||
remote->input.evbit[0] = BIT(EV_KEY); /* We will only report KEY events. */
|
||||
for (i = 0; i < 32; ++i) {
|
||||
if (keyspan_key_table[i] != KEY_RESERVED) {
|
||||
set_bit(keyspan_key_table[i], remote->input.keybit);
|
||||
}
|
||||
if (udev->manufacturer)
|
||||
strlcpy(remote->name, udev->manufacturer, sizeof(remote->name));
|
||||
|
||||
if (udev->product) {
|
||||
if (udev->manufacturer)
|
||||
strlcat(remote->name, " ", sizeof(remote->name));
|
||||
strlcat(remote->name, udev->product, sizeof(remote->name));
|
||||
}
|
||||
|
||||
remote->input.private = remote;
|
||||
remote->input.open = keyspan_open;
|
||||
remote->input.close = keyspan_close;
|
||||
|
||||
usb_make_path(remote->udev, path, 64);
|
||||
sprintf(remote->phys, "%s/input0", path);
|
||||
|
||||
remote->input.name = remote->name;
|
||||
remote->input.phys = remote->phys;
|
||||
remote->input.id.bustype = BUS_USB;
|
||||
remote->input.id.vendor = le16_to_cpu(remote->udev->descriptor.idVendor);
|
||||
remote->input.id.product = le16_to_cpu(remote->udev->descriptor.idProduct);
|
||||
remote->input.id.version = le16_to_cpu(remote->udev->descriptor.bcdDevice);
|
||||
|
||||
if (!(buf = kmalloc(63, GFP_KERNEL))) {
|
||||
usb_buffer_free(remote->udev, RECV_SIZE, remote->in_buffer, remote->in_dma);
|
||||
kfree(remote);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
if (remote->udev->descriptor.iManufacturer &&
|
||||
usb_string(remote->udev, remote->udev->descriptor.iManufacturer, buf, 63) > 0)
|
||||
strcat(remote->name, buf);
|
||||
|
||||
if (remote->udev->descriptor.iProduct &&
|
||||
usb_string(remote->udev, remote->udev->descriptor.iProduct, buf, 63) > 0)
|
||||
sprintf(remote->name, "%s %s", remote->name, buf);
|
||||
|
||||
if (!strlen(remote->name))
|
||||
sprintf(remote->name, "USB Keyspan Remote %04x:%04x",
|
||||
remote->input.id.vendor, remote->input.id.product);
|
||||
snprintf(remote->name, sizeof(remote->name),
|
||||
"USB Keyspan Remote %04x:%04x",
|
||||
le16_to_cpu(udev->descriptor.idVendor),
|
||||
le16_to_cpu(udev->descriptor.idProduct));
|
||||
|
||||
kfree(buf);
|
||||
usb_make_path(udev, remote->phys, sizeof(remote->phys));
|
||||
strlcat(remote->phys, "/input0", sizeof(remote->phys));
|
||||
|
||||
input_dev->name = remote->name;
|
||||
input_dev->phys = remote->phys;
|
||||
usb_to_input_id(udev, &input_dev->id);
|
||||
input_dev->cdev.dev = &interface->dev;
|
||||
|
||||
input_dev->evbit[0] = BIT(EV_KEY); /* We will only report KEY events. */
|
||||
for (i = 0; i < ARRAY_SIZE(keyspan_key_table); i++)
|
||||
if (keyspan_key_table[i] != KEY_RESERVED)
|
||||
set_bit(keyspan_key_table[i], input_dev->keybit);
|
||||
|
||||
input_dev->private = remote;
|
||||
input_dev->open = keyspan_open;
|
||||
input_dev->close = keyspan_close;
|
||||
|
||||
/*
|
||||
* Initialize the URB to access the device. The urb gets sent to the device in keyspan_open()
|
||||
@ -538,27 +519,17 @@ static int keyspan_probe(struct usb_interface *interface, const struct usb_devic
|
||||
remote->irq_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
|
||||
|
||||
/* we can register the device now, as it is ready */
|
||||
input_register_device(&remote->input);
|
||||
input_register_device(remote->input);
|
||||
|
||||
/* save our data pointer in this interface device */
|
||||
usb_set_intfdata(interface, remote);
|
||||
|
||||
/* let the user know what node this device is now attached to */
|
||||
info("connected: %s on %s", remote->name, path);
|
||||
return 0;
|
||||
|
||||
error:
|
||||
/*
|
||||
* In case of error we need to clean up any allocated buffers
|
||||
*/
|
||||
if (remote->irq_urb)
|
||||
usb_free_urb(remote->irq_urb);
|
||||
|
||||
if (remote->in_buffer)
|
||||
usb_buffer_free(remote->udev, RECV_SIZE, remote->in_buffer, remote->in_dma);
|
||||
|
||||
if (remote)
|
||||
kfree(remote);
|
||||
fail3: usb_free_urb(remote->irq_urb);
|
||||
fail2: usb_buffer_free(udev, RECV_SIZE, remote->in_buffer, remote->in_dma);
|
||||
fail1: kfree(remote);
|
||||
input_free_device(input_dev);
|
||||
|
||||
return retval;
|
||||
}
|
||||
@ -570,23 +541,16 @@ static void keyspan_disconnect(struct usb_interface *interface)
|
||||
{
|
||||
struct usb_keyspan *remote;
|
||||
|
||||
/* prevent keyspan_open() from racing keyspan_disconnect() */
|
||||
lock_kernel();
|
||||
|
||||
remote = usb_get_intfdata(interface);
|
||||
usb_set_intfdata(interface, NULL);
|
||||
|
||||
if (remote) { /* We have a valid driver structure so clean up everything we allocated. */
|
||||
input_unregister_device(&remote->input);
|
||||
input_unregister_device(remote->input);
|
||||
usb_kill_urb(remote->irq_urb);
|
||||
usb_free_urb(remote->irq_urb);
|
||||
usb_buffer_free(interface_to_usbdev(interface), RECV_SIZE, remote->in_buffer, remote->in_dma);
|
||||
usb_buffer_free(remote->udev, RECV_SIZE, remote->in_buffer, remote->in_dma);
|
||||
kfree(remote);
|
||||
}
|
||||
|
||||
unlock_kernel();
|
||||
|
||||
info("USB Keyspan now disconnected");
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -98,7 +98,7 @@ struct mtouch_usb {
|
||||
dma_addr_t data_dma;
|
||||
struct urb *irq;
|
||||
struct usb_device *udev;
|
||||
struct input_dev input;
|
||||
struct input_dev *input;
|
||||
char name[128];
|
||||
char phys[64];
|
||||
};
|
||||
@ -135,14 +135,14 @@ static void mtouchusb_irq(struct urb *urb, struct pt_regs *regs)
|
||||
goto exit;
|
||||
}
|
||||
|
||||
input_regs(&mtouch->input, regs);
|
||||
input_report_key(&mtouch->input, BTN_TOUCH,
|
||||
input_regs(mtouch->input, regs);
|
||||
input_report_key(mtouch->input, BTN_TOUCH,
|
||||
MTOUCHUSB_GET_TOUCHED(mtouch->data));
|
||||
input_report_abs(&mtouch->input, ABS_X, MTOUCHUSB_GET_XC(mtouch->data));
|
||||
input_report_abs(&mtouch->input, ABS_Y,
|
||||
input_report_abs(mtouch->input, ABS_X, MTOUCHUSB_GET_XC(mtouch->data));
|
||||
input_report_abs(mtouch->input, ABS_Y,
|
||||
(raw_coordinates ? MTOUCHUSB_MAX_RAW_YC : MTOUCHUSB_MAX_CALIB_YC)
|
||||
- MTOUCHUSB_GET_YC(mtouch->data));
|
||||
input_sync(&mtouch->input);
|
||||
input_sync(mtouch->input);
|
||||
|
||||
exit:
|
||||
retval = usb_submit_urb(urb, GFP_ATOMIC);
|
||||
@ -195,10 +195,10 @@ static void mtouchusb_free_buffers(struct usb_device *udev, struct mtouch_usb *m
|
||||
static int mtouchusb_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
{
|
||||
struct mtouch_usb *mtouch;
|
||||
struct input_dev *input_dev;
|
||||
struct usb_host_interface *interface;
|
||||
struct usb_endpoint_descriptor *endpoint;
|
||||
struct usb_device *udev = interface_to_usbdev(intf);
|
||||
char path[64];
|
||||
int nRet;
|
||||
|
||||
dbg("%s - called", __FUNCTION__);
|
||||
@ -209,57 +209,55 @@ static int mtouchusb_probe(struct usb_interface *intf, const struct usb_device_i
|
||||
dbg("%s - setting endpoint", __FUNCTION__);
|
||||
endpoint = &interface->endpoint[0].desc;
|
||||
|
||||
if (!(mtouch = kmalloc(sizeof(struct mtouch_usb), GFP_KERNEL))) {
|
||||
mtouch = kzalloc(sizeof(struct mtouch_usb), GFP_KERNEL);
|
||||
input_dev = input_allocate_device();
|
||||
if (!mtouch || !input_dev) {
|
||||
err("%s - Out of memory.", __FUNCTION__);
|
||||
return -ENOMEM;
|
||||
goto fail1;
|
||||
}
|
||||
|
||||
memset(mtouch, 0, sizeof(struct mtouch_usb));
|
||||
mtouch->udev = udev;
|
||||
|
||||
dbg("%s - allocating buffers", __FUNCTION__);
|
||||
if (mtouchusb_alloc_buffers(udev, mtouch)) {
|
||||
mtouchusb_free_buffers(udev, mtouch);
|
||||
kfree(mtouch);
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (mtouchusb_alloc_buffers(udev, mtouch))
|
||||
goto fail2;
|
||||
|
||||
mtouch->input.private = mtouch;
|
||||
mtouch->input.open = mtouchusb_open;
|
||||
mtouch->input.close = mtouchusb_close;
|
||||
|
||||
usb_make_path(udev, path, 64);
|
||||
sprintf(mtouch->phys, "%s/input0", path);
|
||||
|
||||
mtouch->input.name = mtouch->name;
|
||||
mtouch->input.phys = mtouch->phys;
|
||||
usb_to_input_id(udev, &mtouch->input.id);
|
||||
mtouch->input.dev = &intf->dev;
|
||||
|
||||
mtouch->input.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
|
||||
mtouch->input.absbit[0] = BIT(ABS_X) | BIT(ABS_Y);
|
||||
mtouch->input.keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH);
|
||||
|
||||
/* Used to Scale Compensated Data and Flip Y */
|
||||
mtouch->input.absmin[ABS_X] = MTOUCHUSB_MIN_XC;
|
||||
mtouch->input.absmax[ABS_X] = raw_coordinates ?
|
||||
MTOUCHUSB_MAX_RAW_XC : MTOUCHUSB_MAX_CALIB_XC;
|
||||
mtouch->input.absfuzz[ABS_X] = MTOUCHUSB_XC_FUZZ;
|
||||
mtouch->input.absflat[ABS_X] = MTOUCHUSB_XC_FLAT;
|
||||
mtouch->input.absmin[ABS_Y] = MTOUCHUSB_MIN_YC;
|
||||
mtouch->input.absmax[ABS_Y] = raw_coordinates ?
|
||||
MTOUCHUSB_MAX_RAW_YC : MTOUCHUSB_MAX_CALIB_YC;
|
||||
mtouch->input.absfuzz[ABS_Y] = MTOUCHUSB_YC_FUZZ;
|
||||
mtouch->input.absflat[ABS_Y] = MTOUCHUSB_YC_FLAT;
|
||||
mtouch->udev = udev;
|
||||
mtouch->input = input_dev;
|
||||
|
||||
if (udev->manufacturer)
|
||||
strcat(mtouch->name, udev->manufacturer);
|
||||
if (udev->product)
|
||||
sprintf(mtouch->name, "%s %s", mtouch->name, udev->product);
|
||||
strlcpy(mtouch->name, udev->manufacturer, sizeof(mtouch->name));
|
||||
|
||||
if (udev->product) {
|
||||
if (udev->manufacturer)
|
||||
strlcat(mtouch->name, " ", sizeof(mtouch->name));
|
||||
strlcat(mtouch->name, udev->product, sizeof(mtouch->name));
|
||||
}
|
||||
|
||||
if (!strlen(mtouch->name))
|
||||
sprintf(mtouch->name, "USB Touchscreen %04x:%04x",
|
||||
mtouch->input.id.vendor, mtouch->input.id.product);
|
||||
snprintf(mtouch->name, sizeof(mtouch->name),
|
||||
"USB Touchscreen %04x:%04x",
|
||||
le16_to_cpu(udev->descriptor.idVendor),
|
||||
le16_to_cpu(udev->descriptor.idProduct));
|
||||
|
||||
usb_make_path(udev, mtouch->phys, sizeof(mtouch->phys));
|
||||
strlcpy(mtouch->phys, "/input0", sizeof(mtouch->phys));
|
||||
|
||||
input_dev->name = mtouch->name;
|
||||
input_dev->phys = mtouch->phys;
|
||||
usb_to_input_id(udev, &input_dev->id);
|
||||
input_dev->cdev.dev = &intf->dev;
|
||||
input_dev->private = mtouch;
|
||||
|
||||
input_dev->open = mtouchusb_open;
|
||||
input_dev->close = mtouchusb_close;
|
||||
|
||||
input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
|
||||
input_dev->keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH);
|
||||
input_set_abs_params(input_dev, ABS_X, MTOUCHUSB_MIN_XC,
|
||||
raw_coordinates ? MTOUCHUSB_MAX_RAW_XC : MTOUCHUSB_MAX_CALIB_XC,
|
||||
MTOUCHUSB_XC_FUZZ, MTOUCHUSB_XC_FLAT);
|
||||
input_set_abs_params(input_dev, ABS_Y, MTOUCHUSB_MIN_YC,
|
||||
raw_coordinates ? MTOUCHUSB_MAX_RAW_YC : MTOUCHUSB_MAX_CALIB_YC,
|
||||
MTOUCHUSB_YC_FUZZ, MTOUCHUSB_YC_FLAT);
|
||||
|
||||
nRet = usb_control_msg(mtouch->udev, usb_rcvctrlpipe(udev, 0),
|
||||
MTOUCHUSB_RESET,
|
||||
@ -272,9 +270,7 @@ static int mtouchusb_probe(struct usb_interface *intf, const struct usb_device_i
|
||||
mtouch->irq = usb_alloc_urb(0, GFP_KERNEL);
|
||||
if (!mtouch->irq) {
|
||||
dbg("%s - usb_alloc_urb failed: mtouch->irq", __FUNCTION__);
|
||||
mtouchusb_free_buffers(udev, mtouch);
|
||||
kfree(mtouch);
|
||||
return -ENOMEM;
|
||||
goto fail2;
|
||||
}
|
||||
|
||||
dbg("%s - usb_fill_int_urb", __FUNCTION__);
|
||||
@ -284,7 +280,7 @@ static int mtouchusb_probe(struct usb_interface *intf, const struct usb_device_i
|
||||
mtouchusb_irq, mtouch, endpoint->bInterval);
|
||||
|
||||
dbg("%s - input_register_device", __FUNCTION__);
|
||||
input_register_device(&mtouch->input);
|
||||
input_register_device(mtouch->input);
|
||||
|
||||
nRet = usb_control_msg(mtouch->udev, usb_rcvctrlpipe(udev, 0),
|
||||
MTOUCHUSB_ASYNC_REPORT,
|
||||
@ -293,10 +289,13 @@ static int mtouchusb_probe(struct usb_interface *intf, const struct usb_device_i
|
||||
dbg("%s - usb_control_msg - MTOUCHUSB_ASYNC_REPORT - bytes|err: %d",
|
||||
__FUNCTION__, nRet);
|
||||
|
||||
printk(KERN_INFO "input: %s on %s\n", mtouch->name, path);
|
||||
usb_set_intfdata(intf, mtouch);
|
||||
|
||||
return 0;
|
||||
|
||||
fail2: mtouchusb_free_buffers(udev, mtouch);
|
||||
fail1: input_free_device(input_dev);
|
||||
kfree(mtouch);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
static void mtouchusb_disconnect(struct usb_interface *intf)
|
||||
@ -308,7 +307,7 @@ static void mtouchusb_disconnect(struct usb_interface *intf)
|
||||
if (mtouch) {
|
||||
dbg("%s - mtouch is initialized, cleaning up", __FUNCTION__);
|
||||
usb_kill_urb(mtouch->irq);
|
||||
input_unregister_device(&mtouch->input);
|
||||
input_unregister_device(mtouch->input);
|
||||
usb_free_urb(mtouch->irq);
|
||||
mtouchusb_free_buffers(interface_to_usbdev(intf), mtouch);
|
||||
kfree(mtouch);
|
||||
|
@ -262,6 +262,7 @@ int hid_pid_init(struct hid_device *hid)
|
||||
{
|
||||
struct hid_ff_pid *private;
|
||||
struct hid_input *hidinput = list_entry(&hid->inputs, struct hid_input, list);
|
||||
struct input_dev *input_dev = hidinput->input;
|
||||
|
||||
private = hid->ff_private = kzalloc(sizeof(struct hid_ff_pid), GFP_KERNEL);
|
||||
if (!private)
|
||||
@ -281,11 +282,12 @@ int hid_pid_init(struct hid_device *hid)
|
||||
usb_fill_control_urb(private->urbffout, hid->dev, 0,
|
||||
(void *)&private->ffcr, private->ctrl_buffer, 8,
|
||||
hid_pid_ctrl_out, hid);
|
||||
hidinput->input.upload_effect = hid_pid_upload_effect;
|
||||
hidinput->input.flush = hid_pid_flush;
|
||||
hidinput->input.ff_effects_max = 8; // A random default
|
||||
set_bit(EV_FF, hidinput->input.evbit);
|
||||
set_bit(EV_FF_STATUS, hidinput->input.evbit);
|
||||
|
||||
input_dev->upload_effect = hid_pid_upload_effect;
|
||||
input_dev->flush = hid_pid_flush;
|
||||
input_dev->ff_effects_max = 8; // A random default
|
||||
set_bit(EV_FF, input_dev->evbit);
|
||||
set_bit(EV_FF_STATUS, input_dev->evbit);
|
||||
|
||||
spin_lock_init(&private->lock);
|
||||
|
||||
|
@ -68,7 +68,7 @@ struct powermate_device {
|
||||
struct usb_ctrlrequest *configcr;
|
||||
dma_addr_t configcr_dma;
|
||||
struct usb_device *udev;
|
||||
struct input_dev input;
|
||||
struct input_dev *input;
|
||||
spinlock_t lock;
|
||||
int static_brightness;
|
||||
int pulse_speed;
|
||||
@ -106,10 +106,10 @@ static void powermate_irq(struct urb *urb, struct pt_regs *regs)
|
||||
}
|
||||
|
||||
/* handle updates to device state */
|
||||
input_regs(&pm->input, regs);
|
||||
input_report_key(&pm->input, BTN_0, pm->data[0] & 0x01);
|
||||
input_report_rel(&pm->input, REL_DIAL, pm->data[1]);
|
||||
input_sync(&pm->input);
|
||||
input_regs(pm->input, regs);
|
||||
input_report_key(pm->input, BTN_0, pm->data[0] & 0x01);
|
||||
input_report_rel(pm->input, REL_DIAL, pm->data[1]);
|
||||
input_sync(pm->input);
|
||||
|
||||
exit:
|
||||
retval = usb_submit_urb (urb, GFP_ATOMIC);
|
||||
@ -153,10 +153,10 @@ static void powermate_sync_state(struct powermate_device *pm)
|
||||
|
||||
Only values of 'arg' quite close to 255 are particularly useful/spectacular.
|
||||
*/
|
||||
if (pm->pulse_speed < 255){
|
||||
if (pm->pulse_speed < 255) {
|
||||
op = 0; // divide
|
||||
arg = 255 - pm->pulse_speed;
|
||||
} else if (pm->pulse_speed > 255){
|
||||
} else if (pm->pulse_speed > 255) {
|
||||
op = 2; // multiply
|
||||
arg = pm->pulse_speed - 255;
|
||||
} else {
|
||||
@ -166,11 +166,11 @@ static void powermate_sync_state(struct powermate_device *pm)
|
||||
pm->configcr->wValue = cpu_to_le16( (pm->pulse_table << 8) | SET_PULSE_MODE );
|
||||
pm->configcr->wIndex = cpu_to_le16( (arg << 8) | op );
|
||||
pm->requires_update &= ~UPDATE_PULSE_MODE;
|
||||
}else if (pm->requires_update & UPDATE_STATIC_BRIGHTNESS){
|
||||
} else if (pm->requires_update & UPDATE_STATIC_BRIGHTNESS) {
|
||||
pm->configcr->wValue = cpu_to_le16( SET_STATIC_BRIGHTNESS );
|
||||
pm->configcr->wIndex = cpu_to_le16( pm->static_brightness );
|
||||
pm->requires_update &= ~UPDATE_STATIC_BRIGHTNESS;
|
||||
}else{
|
||||
} else {
|
||||
printk(KERN_ERR "powermate: unknown update required");
|
||||
pm->requires_update = 0; /* fudge the bug */
|
||||
return;
|
||||
@ -228,19 +228,19 @@ static void powermate_pulse_led(struct powermate_device *pm, int static_brightne
|
||||
spin_lock_irqsave(&pm->lock, flags);
|
||||
|
||||
/* mark state updates which are required */
|
||||
if (static_brightness != pm->static_brightness){
|
||||
if (static_brightness != pm->static_brightness) {
|
||||
pm->static_brightness = static_brightness;
|
||||
pm->requires_update |= UPDATE_STATIC_BRIGHTNESS;
|
||||
}
|
||||
if (pulse_asleep != pm->pulse_asleep){
|
||||
if (pulse_asleep != pm->pulse_asleep) {
|
||||
pm->pulse_asleep = pulse_asleep;
|
||||
pm->requires_update |= (UPDATE_PULSE_ASLEEP | UPDATE_STATIC_BRIGHTNESS);
|
||||
}
|
||||
if (pulse_awake != pm->pulse_awake){
|
||||
if (pulse_awake != pm->pulse_awake) {
|
||||
pm->pulse_awake = pulse_awake;
|
||||
pm->requires_update |= (UPDATE_PULSE_AWAKE | UPDATE_STATIC_BRIGHTNESS);
|
||||
}
|
||||
if (pulse_speed != pm->pulse_speed || pulse_table != pm->pulse_table){
|
||||
if (pulse_speed != pm->pulse_speed || pulse_table != pm->pulse_table) {
|
||||
pm->pulse_speed = pulse_speed;
|
||||
pm->pulse_table = pulse_table;
|
||||
pm->requires_update |= UPDATE_PULSE_MODE;
|
||||
@ -283,6 +283,7 @@ static int powermate_alloc_buffers(struct usb_device *udev, struct powermate_dev
|
||||
SLAB_ATOMIC, &pm->data_dma);
|
||||
if (!pm->data)
|
||||
return -1;
|
||||
|
||||
pm->configcr = usb_buffer_alloc(udev, sizeof(*(pm->configcr)),
|
||||
SLAB_ATOMIC, &pm->configcr_dma);
|
||||
if (!pm->configcr)
|
||||
@ -308,8 +309,9 @@ static int powermate_probe(struct usb_interface *intf, const struct usb_device_i
|
||||
struct usb_host_interface *interface;
|
||||
struct usb_endpoint_descriptor *endpoint;
|
||||
struct powermate_device *pm;
|
||||
struct input_dev *input_dev;
|
||||
int pipe, maxp;
|
||||
char path[64];
|
||||
int err = -ENOMEM;
|
||||
|
||||
interface = intf->cur_altsetting;
|
||||
endpoint = &interface->endpoint[0].desc;
|
||||
@ -323,42 +325,61 @@ static int powermate_probe(struct usb_interface *intf, const struct usb_device_i
|
||||
0, interface->desc.bInterfaceNumber, NULL, 0,
|
||||
USB_CTRL_SET_TIMEOUT);
|
||||
|
||||
if (!(pm = kmalloc(sizeof(struct powermate_device), GFP_KERNEL)))
|
||||
return -ENOMEM;
|
||||
pm = kzalloc(sizeof(struct powermate_device), GFP_KERNEL);
|
||||
input_dev = input_allocate_device();
|
||||
if (!pm || !input_dev)
|
||||
goto fail1;
|
||||
|
||||
memset(pm, 0, sizeof(struct powermate_device));
|
||||
pm->udev = udev;
|
||||
|
||||
if (powermate_alloc_buffers(udev, pm)) {
|
||||
powermate_free_buffers(udev, pm);
|
||||
kfree(pm);
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (powermate_alloc_buffers(udev, pm))
|
||||
goto fail2;
|
||||
|
||||
pm->irq = usb_alloc_urb(0, GFP_KERNEL);
|
||||
if (!pm->irq) {
|
||||
powermate_free_buffers(udev, pm);
|
||||
kfree(pm);
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (!pm->irq)
|
||||
goto fail2;
|
||||
|
||||
pm->config = usb_alloc_urb(0, GFP_KERNEL);
|
||||
if (!pm->config) {
|
||||
usb_free_urb(pm->irq);
|
||||
powermate_free_buffers(udev, pm);
|
||||
kfree(pm);
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (!pm->config)
|
||||
goto fail3;
|
||||
|
||||
pm->udev = udev;
|
||||
pm->input = input_dev;
|
||||
|
||||
usb_make_path(udev, pm->phys, sizeof(pm->phys));
|
||||
strlcpy(pm->phys, "/input0", sizeof(pm->phys));
|
||||
|
||||
spin_lock_init(&pm->lock);
|
||||
init_input_dev(&pm->input);
|
||||
|
||||
switch (le16_to_cpu(udev->descriptor.idProduct)) {
|
||||
case POWERMATE_PRODUCT_NEW:
|
||||
input_dev->name = pm_name_powermate;
|
||||
break;
|
||||
case POWERMATE_PRODUCT_OLD:
|
||||
input_dev->name = pm_name_soundknob;
|
||||
break;
|
||||
default:
|
||||
input_dev->name = pm_name_soundknob;
|
||||
printk(KERN_WARNING "powermate: unknown product id %04x\n",
|
||||
le16_to_cpu(udev->descriptor.idProduct));
|
||||
}
|
||||
|
||||
input_dev->phys = pm->phys;
|
||||
usb_to_input_id(udev, &input_dev->id);
|
||||
input_dev->cdev.dev = &intf->dev;
|
||||
input_dev->private = pm;
|
||||
|
||||
input_dev->event = powermate_input_event;
|
||||
|
||||
input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL) | BIT(EV_MSC);
|
||||
input_dev->keybit[LONG(BTN_0)] = BIT(BTN_0);
|
||||
input_dev->relbit[LONG(REL_DIAL)] = BIT(REL_DIAL);
|
||||
input_dev->mscbit[LONG(MSC_PULSELED)] = BIT(MSC_PULSELED);
|
||||
|
||||
/* get a handle to the interrupt data pipe */
|
||||
pipe = usb_rcvintpipe(udev, endpoint->bEndpointAddress);
|
||||
maxp = usb_maxpacket(udev, pipe, usb_pipeout(pipe));
|
||||
|
||||
if(maxp < POWERMATE_PAYLOAD_SIZE_MIN || maxp > POWERMATE_PAYLOAD_SIZE_MAX){
|
||||
printk("powermate: Expected payload of %d--%d bytes, found %d bytes!\n",
|
||||
if (maxp < POWERMATE_PAYLOAD_SIZE_MIN || maxp > POWERMATE_PAYLOAD_SIZE_MAX) {
|
||||
printk(KERN_WARNING "powermate: Expected payload of %d--%d bytes, found %d bytes!\n",
|
||||
POWERMATE_PAYLOAD_SIZE_MIN, POWERMATE_PAYLOAD_SIZE_MAX, maxp);
|
||||
maxp = POWERMATE_PAYLOAD_SIZE_MAX;
|
||||
}
|
||||
@ -371,35 +392,11 @@ static int powermate_probe(struct usb_interface *intf, const struct usb_device_i
|
||||
|
||||
/* register our interrupt URB with the USB system */
|
||||
if (usb_submit_urb(pm->irq, GFP_KERNEL)) {
|
||||
powermate_free_buffers(udev, pm);
|
||||
kfree(pm);
|
||||
return -EIO; /* failure */
|
||||
err = -EIO;
|
||||
goto fail4;
|
||||
}
|
||||
|
||||
switch (le16_to_cpu(udev->descriptor.idProduct)) {
|
||||
case POWERMATE_PRODUCT_NEW: pm->input.name = pm_name_powermate; break;
|
||||
case POWERMATE_PRODUCT_OLD: pm->input.name = pm_name_soundknob; break;
|
||||
default:
|
||||
pm->input.name = pm_name_soundknob;
|
||||
printk(KERN_WARNING "powermate: unknown product id %04x\n",
|
||||
le16_to_cpu(udev->descriptor.idProduct));
|
||||
}
|
||||
|
||||
pm->input.private = pm;
|
||||
pm->input.evbit[0] = BIT(EV_KEY) | BIT(EV_REL) | BIT(EV_MSC);
|
||||
pm->input.keybit[LONG(BTN_0)] = BIT(BTN_0);
|
||||
pm->input.relbit[LONG(REL_DIAL)] = BIT(REL_DIAL);
|
||||
pm->input.mscbit[LONG(MSC_PULSELED)] = BIT(MSC_PULSELED);
|
||||
usb_to_input_id(udev, &pm->input.id);
|
||||
pm->input.event = powermate_input_event;
|
||||
pm->input.dev = &intf->dev;
|
||||
pm->input.phys = pm->phys;
|
||||
|
||||
input_register_device(&pm->input);
|
||||
|
||||
usb_make_path(udev, path, 64);
|
||||
snprintf(pm->phys, 64, "%s/input0", path);
|
||||
printk(KERN_INFO "input: %s on %s\n", pm->input.name, pm->input.phys);
|
||||
input_register_device(pm->input);
|
||||
|
||||
/* force an update of everything */
|
||||
pm->requires_update = UPDATE_PULSE_ASLEEP | UPDATE_PULSE_AWAKE | UPDATE_PULSE_MODE | UPDATE_STATIC_BRIGHTNESS;
|
||||
@ -407,6 +404,13 @@ static int powermate_probe(struct usb_interface *intf, const struct usb_device_i
|
||||
|
||||
usb_set_intfdata(intf, pm);
|
||||
return 0;
|
||||
|
||||
fail4: usb_free_urb(pm->config);
|
||||
fail3: usb_free_urb(pm->irq);
|
||||
fail2: powermate_free_buffers(udev, pm);
|
||||
fail1: input_free_device(input_dev);
|
||||
kfree(pm);
|
||||
return err;
|
||||
}
|
||||
|
||||
/* Called when a USB device we've accepted ownership of is removed */
|
||||
@ -418,7 +422,7 @@ static void powermate_disconnect(struct usb_interface *intf)
|
||||
if (pm) {
|
||||
pm->requires_update = 0;
|
||||
usb_kill_urb(pm->irq);
|
||||
input_unregister_device(&pm->input);
|
||||
input_unregister_device(pm->input);
|
||||
usb_free_urb(pm->irq);
|
||||
usb_free_urb(pm->config);
|
||||
powermate_free_buffers(interface_to_usbdev(intf), pm);
|
||||
|
@ -68,7 +68,7 @@ struct touchkit_usb {
|
||||
dma_addr_t data_dma;
|
||||
struct urb *irq;
|
||||
struct usb_device *udev;
|
||||
struct input_dev input;
|
||||
struct input_dev *input;
|
||||
char name[128];
|
||||
char phys[64];
|
||||
};
|
||||
@ -115,12 +115,12 @@ static void touchkit_irq(struct urb *urb, struct pt_regs *regs)
|
||||
y = TOUCHKIT_GET_Y(touchkit->data);
|
||||
}
|
||||
|
||||
input_regs(&touchkit->input, regs);
|
||||
input_report_key(&touchkit->input, BTN_TOUCH,
|
||||
input_regs(touchkit->input, regs);
|
||||
input_report_key(touchkit->input, BTN_TOUCH,
|
||||
TOUCHKIT_GET_TOUCHED(touchkit->data));
|
||||
input_report_abs(&touchkit->input, ABS_X, x);
|
||||
input_report_abs(&touchkit->input, ABS_Y, y);
|
||||
input_sync(&touchkit->input);
|
||||
input_report_abs(touchkit->input, ABS_X, x);
|
||||
input_report_abs(touchkit->input, ABS_Y, y);
|
||||
input_sync(touchkit->input);
|
||||
|
||||
exit:
|
||||
retval = usb_submit_urb(urb, GFP_ATOMIC);
|
||||
@ -171,87 +171,81 @@ static void touchkit_free_buffers(struct usb_device *udev,
|
||||
static int touchkit_probe(struct usb_interface *intf,
|
||||
const struct usb_device_id *id)
|
||||
{
|
||||
int ret;
|
||||
struct touchkit_usb *touchkit;
|
||||
struct input_dev *input_dev;
|
||||
struct usb_host_interface *interface;
|
||||
struct usb_endpoint_descriptor *endpoint;
|
||||
struct usb_device *udev = interface_to_usbdev(intf);
|
||||
char path[64];
|
||||
|
||||
interface = intf->cur_altsetting;
|
||||
endpoint = &interface->endpoint[0].desc;
|
||||
|
||||
touchkit = kmalloc(sizeof(struct touchkit_usb), GFP_KERNEL);
|
||||
if (!touchkit)
|
||||
return -ENOMEM;
|
||||
|
||||
memset(touchkit, 0, sizeof(struct touchkit_usb));
|
||||
touchkit->udev = udev;
|
||||
|
||||
if (touchkit_alloc_buffers(udev, touchkit)) {
|
||||
ret = -ENOMEM;
|
||||
touchkit = kzalloc(sizeof(struct touchkit_usb), GFP_KERNEL);
|
||||
input_dev = input_allocate_device();
|
||||
if (!touchkit || !input_dev)
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
touchkit->input.private = touchkit;
|
||||
touchkit->input.open = touchkit_open;
|
||||
touchkit->input.close = touchkit_close;
|
||||
|
||||
usb_make_path(udev, path, 64);
|
||||
sprintf(touchkit->phys, "%s/input0", path);
|
||||
|
||||
touchkit->input.name = touchkit->name;
|
||||
touchkit->input.phys = touchkit->phys;
|
||||
usb_to_input_id(udev, &touchkit->input.id);
|
||||
touchkit->input.dev = &intf->dev;
|
||||
|
||||
touchkit->input.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
|
||||
touchkit->input.absbit[0] = BIT(ABS_X) | BIT(ABS_Y);
|
||||
touchkit->input.keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH);
|
||||
|
||||
/* Used to Scale Compensated Data */
|
||||
touchkit->input.absmin[ABS_X] = TOUCHKIT_MIN_XC;
|
||||
touchkit->input.absmax[ABS_X] = TOUCHKIT_MAX_XC;
|
||||
touchkit->input.absfuzz[ABS_X] = TOUCHKIT_XC_FUZZ;
|
||||
touchkit->input.absflat[ABS_X] = TOUCHKIT_XC_FLAT;
|
||||
touchkit->input.absmin[ABS_Y] = TOUCHKIT_MIN_YC;
|
||||
touchkit->input.absmax[ABS_Y] = TOUCHKIT_MAX_YC;
|
||||
touchkit->input.absfuzz[ABS_Y] = TOUCHKIT_YC_FUZZ;
|
||||
touchkit->input.absflat[ABS_Y] = TOUCHKIT_YC_FLAT;
|
||||
|
||||
if (udev->manufacturer)
|
||||
strcat(touchkit->name, udev->manufacturer);
|
||||
if (udev->product)
|
||||
sprintf(touchkit->name, "%s %s", touchkit->name, udev->product);
|
||||
|
||||
if (!strlen(touchkit->name))
|
||||
sprintf(touchkit->name, "USB Touchscreen %04x:%04x",
|
||||
touchkit->input.id.vendor, touchkit->input.id.product);
|
||||
if (touchkit_alloc_buffers(udev, touchkit))
|
||||
goto out_free;
|
||||
|
||||
touchkit->irq = usb_alloc_urb(0, GFP_KERNEL);
|
||||
if (!touchkit->irq) {
|
||||
dbg("%s - usb_alloc_urb failed: touchkit->irq", __FUNCTION__);
|
||||
ret = -ENOMEM;
|
||||
goto out_free_buffers;
|
||||
}
|
||||
|
||||
touchkit->udev = udev;
|
||||
touchkit->input = input_dev;
|
||||
|
||||
if (udev->manufacturer)
|
||||
strlcpy(touchkit->name, udev->manufacturer, sizeof(touchkit->name));
|
||||
|
||||
if (udev->product) {
|
||||
if (udev->manufacturer)
|
||||
strlcat(touchkit->name, " ", sizeof(touchkit->name));
|
||||
strlcat(touchkit->name, udev->product, sizeof(touchkit->name));
|
||||
}
|
||||
|
||||
if (!strlen(touchkit->name))
|
||||
snprintf(touchkit->name, sizeof(touchkit->name),
|
||||
"USB Touchscreen %04x:%04x",
|
||||
le16_to_cpu(udev->descriptor.idVendor),
|
||||
le16_to_cpu(udev->descriptor.idProduct));
|
||||
|
||||
usb_make_path(udev, touchkit->phys, sizeof(touchkit->phys));
|
||||
strlcpy(touchkit->phys, "/input0", sizeof(touchkit->phys));
|
||||
|
||||
input_dev->name = touchkit->name;
|
||||
input_dev->phys = touchkit->phys;
|
||||
usb_to_input_id(udev, &input_dev->id);
|
||||
input_dev->cdev.dev = &intf->dev;
|
||||
input_dev->private = touchkit;
|
||||
input_dev->open = touchkit_open;
|
||||
input_dev->close = touchkit_close;
|
||||
|
||||
input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
|
||||
input_dev->keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH);
|
||||
input_set_abs_params(input_dev, ABS_X, TOUCHKIT_MIN_XC, TOUCHKIT_MAX_XC,
|
||||
TOUCHKIT_XC_FUZZ, TOUCHKIT_XC_FLAT);
|
||||
input_set_abs_params(input_dev, ABS_Y, TOUCHKIT_MIN_YC, TOUCHKIT_MAX_YC,
|
||||
TOUCHKIT_YC_FUZZ, TOUCHKIT_YC_FLAT);
|
||||
|
||||
usb_fill_int_urb(touchkit->irq, touchkit->udev,
|
||||
usb_rcvintpipe(touchkit->udev, 0x81),
|
||||
touchkit->data, TOUCHKIT_REPORT_DATA_SIZE,
|
||||
touchkit_irq, touchkit, endpoint->bInterval);
|
||||
usb_rcvintpipe(touchkit->udev, 0x81),
|
||||
touchkit->data, TOUCHKIT_REPORT_DATA_SIZE,
|
||||
touchkit_irq, touchkit, endpoint->bInterval);
|
||||
|
||||
input_register_device(&touchkit->input);
|
||||
input_register_device(touchkit->input);
|
||||
|
||||
printk(KERN_INFO "input: %s on %s\n", touchkit->name, path);
|
||||
usb_set_intfdata(intf, touchkit);
|
||||
|
||||
return 0;
|
||||
|
||||
out_free_buffers:
|
||||
touchkit_free_buffers(udev, touchkit);
|
||||
out_free:
|
||||
input_free_device(input_dev);
|
||||
kfree(touchkit);
|
||||
return ret;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
static void touchkit_disconnect(struct usb_interface *intf)
|
||||
@ -265,8 +259,8 @@ static void touchkit_disconnect(struct usb_interface *intf)
|
||||
|
||||
dbg("%s - touchkit is initialized, cleaning up", __FUNCTION__);
|
||||
usb_set_intfdata(intf, NULL);
|
||||
input_unregister_device(&touchkit->input);
|
||||
usb_kill_urb(touchkit->irq);
|
||||
input_unregister_device(touchkit->input);
|
||||
usb_free_urb(touchkit->irq);
|
||||
touchkit_free_buffers(interface_to_usbdev(intf), touchkit);
|
||||
kfree(touchkit);
|
||||
|
@ -66,7 +66,7 @@ static unsigned char usb_kbd_keycode[256] = {
|
||||
};
|
||||
|
||||
struct usb_kbd {
|
||||
struct input_dev dev;
|
||||
struct input_dev *dev;
|
||||
struct usb_device *usbdev;
|
||||
unsigned char old[8];
|
||||
struct urb *irq, *led;
|
||||
@ -99,29 +99,29 @@ static void usb_kbd_irq(struct urb *urb, struct pt_regs *regs)
|
||||
goto resubmit;
|
||||
}
|
||||
|
||||
input_regs(&kbd->dev, regs);
|
||||
input_regs(kbd->dev, regs);
|
||||
|
||||
for (i = 0; i < 8; i++)
|
||||
input_report_key(&kbd->dev, usb_kbd_keycode[i + 224], (kbd->new[0] >> i) & 1);
|
||||
input_report_key(kbd->dev, usb_kbd_keycode[i + 224], (kbd->new[0] >> i) & 1);
|
||||
|
||||
for (i = 2; i < 8; i++) {
|
||||
|
||||
if (kbd->old[i] > 3 && memscan(kbd->new + 2, kbd->old[i], 6) == kbd->new + 8) {
|
||||
if (usb_kbd_keycode[kbd->old[i]])
|
||||
input_report_key(&kbd->dev, usb_kbd_keycode[kbd->old[i]], 0);
|
||||
input_report_key(kbd->dev, usb_kbd_keycode[kbd->old[i]], 0);
|
||||
else
|
||||
info("Unknown key (scancode %#x) released.", kbd->old[i]);
|
||||
}
|
||||
|
||||
if (kbd->new[i] > 3 && memscan(kbd->old + 2, kbd->new[i], 6) == kbd->old + 8) {
|
||||
if (usb_kbd_keycode[kbd->new[i]])
|
||||
input_report_key(&kbd->dev, usb_kbd_keycode[kbd->new[i]], 1);
|
||||
input_report_key(kbd->dev, usb_kbd_keycode[kbd->new[i]], 1);
|
||||
else
|
||||
info("Unknown key (scancode %#x) pressed.", kbd->new[i]);
|
||||
}
|
||||
}
|
||||
|
||||
input_sync(&kbd->dev);
|
||||
input_sync(kbd->dev);
|
||||
|
||||
memcpy(kbd->old, kbd->new, 8);
|
||||
|
||||
@ -227,12 +227,12 @@ static void usb_kbd_free_mem(struct usb_device *dev, struct usb_kbd *kbd)
|
||||
static int usb_kbd_probe(struct usb_interface *iface,
|
||||
const struct usb_device_id *id)
|
||||
{
|
||||
struct usb_device * dev = interface_to_usbdev(iface);
|
||||
struct usb_device *dev = interface_to_usbdev(iface);
|
||||
struct usb_host_interface *interface;
|
||||
struct usb_endpoint_descriptor *endpoint;
|
||||
struct usb_kbd *kbd;
|
||||
struct input_dev *input_dev;
|
||||
int i, pipe, maxp;
|
||||
char path[64];
|
||||
|
||||
interface = iface->cur_altsetting;
|
||||
|
||||
@ -240,37 +240,59 @@ static int usb_kbd_probe(struct usb_interface *iface,
|
||||
return -ENODEV;
|
||||
|
||||
endpoint = &interface->endpoint[0].desc;
|
||||
if (!(endpoint->bEndpointAddress & 0x80))
|
||||
if (!(endpoint->bEndpointAddress & USB_DIR_IN))
|
||||
return -ENODEV;
|
||||
if ((endpoint->bmAttributes & 3) != 3)
|
||||
if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_INT)
|
||||
return -ENODEV;
|
||||
|
||||
pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress);
|
||||
maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe));
|
||||
|
||||
if (!(kbd = kmalloc(sizeof(struct usb_kbd), GFP_KERNEL)))
|
||||
return -ENOMEM;
|
||||
memset(kbd, 0, sizeof(struct usb_kbd));
|
||||
kbd = kzalloc(sizeof(struct usb_kbd), GFP_KERNEL);
|
||||
input_dev = input_allocate_device();
|
||||
if (!kbd || !input_dev)
|
||||
goto fail1;
|
||||
|
||||
if (usb_kbd_alloc_mem(dev, kbd)) {
|
||||
usb_kbd_free_mem(dev, kbd);
|
||||
kfree(kbd);
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (usb_kbd_alloc_mem(dev, kbd))
|
||||
goto fail2;
|
||||
|
||||
kbd->usbdev = dev;
|
||||
kbd->dev = input_dev;
|
||||
|
||||
kbd->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_LED) | BIT(EV_REP);
|
||||
kbd->dev.ledbit[0] = BIT(LED_NUML) | BIT(LED_CAPSL) | BIT(LED_SCROLLL) | BIT(LED_COMPOSE) | BIT(LED_KANA);
|
||||
if (dev->manufacturer)
|
||||
strlcpy(kbd->name, dev->manufacturer, sizeof(kbd->name));
|
||||
|
||||
if (dev->product) {
|
||||
if (dev->manufacturer)
|
||||
strlcat(kbd->name, " ", sizeof(kbd->name));
|
||||
strlcat(kbd->name, dev->product, sizeof(kbd->name));
|
||||
}
|
||||
|
||||
if (!strlen(kbd->name))
|
||||
snprintf(kbd->name, sizeof(kbd->name),
|
||||
"USB HIDBP Keyboard %04x:%04x",
|
||||
le16_to_cpu(dev->descriptor.idVendor),
|
||||
le16_to_cpu(dev->descriptor.idProduct));
|
||||
|
||||
usb_make_path(dev, kbd->phys, sizeof(kbd->phys));
|
||||
strlcpy(kbd->phys, "/input0", sizeof(kbd->phys));
|
||||
|
||||
input_dev->name = kbd->name;
|
||||
input_dev->phys = kbd->phys;
|
||||
usb_to_input_id(dev, &input_dev->id);
|
||||
input_dev->cdev.dev = &iface->dev;
|
||||
input_dev->private = kbd;
|
||||
|
||||
input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_LED) | BIT(EV_REP);
|
||||
input_dev->ledbit[0] = BIT(LED_NUML) | BIT(LED_CAPSL) | BIT(LED_SCROLLL) | BIT(LED_COMPOSE) | BIT(LED_KANA);
|
||||
|
||||
for (i = 0; i < 255; i++)
|
||||
set_bit(usb_kbd_keycode[i], kbd->dev.keybit);
|
||||
clear_bit(0, kbd->dev.keybit);
|
||||
set_bit(usb_kbd_keycode[i], input_dev->keybit);
|
||||
clear_bit(0, input_dev->keybit);
|
||||
|
||||
kbd->dev.private = kbd;
|
||||
kbd->dev.event = usb_kbd_event;
|
||||
kbd->dev.open = usb_kbd_open;
|
||||
kbd->dev.close = usb_kbd_close;
|
||||
input_dev->event = usb_kbd_event;
|
||||
input_dev->open = usb_kbd_open;
|
||||
input_dev->close = usb_kbd_close;
|
||||
|
||||
usb_fill_int_urb(kbd->irq, dev, pipe,
|
||||
kbd->new, (maxp > 8 ? 8 : maxp),
|
||||
@ -284,37 +306,22 @@ static int usb_kbd_probe(struct usb_interface *iface,
|
||||
kbd->cr->wIndex = cpu_to_le16(interface->desc.bInterfaceNumber);
|
||||
kbd->cr->wLength = cpu_to_le16(1);
|
||||
|
||||
usb_make_path(dev, path, 64);
|
||||
sprintf(kbd->phys, "%s/input0", path);
|
||||
|
||||
kbd->dev.name = kbd->name;
|
||||
kbd->dev.phys = kbd->phys;
|
||||
usb_to_input_id(dev, &kbd->dev.id);
|
||||
kbd->dev.dev = &iface->dev;
|
||||
|
||||
if (dev->manufacturer)
|
||||
strcat(kbd->name, dev->manufacturer);
|
||||
if (dev->product)
|
||||
sprintf(kbd->name, "%s %s", kbd->name, dev->product);
|
||||
|
||||
if (!strlen(kbd->name))
|
||||
sprintf(kbd->name, "USB HIDBP Keyboard %04x:%04x",
|
||||
kbd->dev.id.vendor, kbd->dev.id.product);
|
||||
|
||||
usb_fill_control_urb(kbd->led, dev, usb_sndctrlpipe(dev, 0),
|
||||
(void *) kbd->cr, kbd->leds, 1,
|
||||
usb_kbd_led, kbd);
|
||||
kbd->led->setup_dma = kbd->cr_dma;
|
||||
kbd->led->transfer_dma = kbd->leds_dma;
|
||||
kbd->led->transfer_flags |= (URB_NO_TRANSFER_DMA_MAP
|
||||
| URB_NO_SETUP_DMA_MAP);
|
||||
kbd->led->transfer_flags |= (URB_NO_TRANSFER_DMA_MAP | URB_NO_SETUP_DMA_MAP);
|
||||
|
||||
input_register_device(&kbd->dev);
|
||||
|
||||
printk(KERN_INFO "input: %s on %s\n", kbd->name, path);
|
||||
input_register_device(kbd->dev);
|
||||
|
||||
usb_set_intfdata(iface, kbd);
|
||||
return 0;
|
||||
|
||||
fail2: usb_kbd_free_mem(dev, kbd);
|
||||
fail1: input_free_device(input_dev);
|
||||
kfree(kbd);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
static void usb_kbd_disconnect(struct usb_interface *intf)
|
||||
@ -324,7 +331,7 @@ static void usb_kbd_disconnect(struct usb_interface *intf)
|
||||
usb_set_intfdata(intf, NULL);
|
||||
if (kbd) {
|
||||
usb_kill_urb(kbd->irq);
|
||||
input_unregister_device(&kbd->dev);
|
||||
input_unregister_device(kbd->dev);
|
||||
usb_kbd_free_mem(interface_to_usbdev(intf), kbd);
|
||||
kfree(kbd);
|
||||
}
|
||||
|
@ -50,7 +50,7 @@ struct usb_mouse {
|
||||
char name[128];
|
||||
char phys[64];
|
||||
struct usb_device *usbdev;
|
||||
struct input_dev dev;
|
||||
struct input_dev *dev;
|
||||
struct urb *irq;
|
||||
|
||||
signed char *data;
|
||||
@ -61,7 +61,7 @@ static void usb_mouse_irq(struct urb *urb, struct pt_regs *regs)
|
||||
{
|
||||
struct usb_mouse *mouse = urb->context;
|
||||
signed char *data = mouse->data;
|
||||
struct input_dev *dev = &mouse->dev;
|
||||
struct input_dev *dev = mouse->dev;
|
||||
int status;
|
||||
|
||||
switch (urb->status) {
|
||||
@ -115,14 +115,14 @@ static void usb_mouse_close(struct input_dev *dev)
|
||||
usb_kill_urb(mouse->irq);
|
||||
}
|
||||
|
||||
static int usb_mouse_probe(struct usb_interface * intf, const struct usb_device_id * id)
|
||||
static int usb_mouse_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
{
|
||||
struct usb_device * dev = interface_to_usbdev(intf);
|
||||
struct usb_device *dev = interface_to_usbdev(intf);
|
||||
struct usb_host_interface *interface;
|
||||
struct usb_endpoint_descriptor *endpoint;
|
||||
struct usb_mouse *mouse;
|
||||
struct input_dev *input_dev;
|
||||
int pipe, maxp;
|
||||
char path[64];
|
||||
|
||||
interface = intf->cur_altsetting;
|
||||
|
||||
@ -130,59 +130,62 @@ static int usb_mouse_probe(struct usb_interface * intf, const struct usb_device_
|
||||
return -ENODEV;
|
||||
|
||||
endpoint = &interface->endpoint[0].desc;
|
||||
if (!(endpoint->bEndpointAddress & 0x80))
|
||||
if (!(endpoint->bEndpointAddress & USB_DIR_IN))
|
||||
return -ENODEV;
|
||||
if ((endpoint->bmAttributes & 3) != 3)
|
||||
if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_INT)
|
||||
return -ENODEV;
|
||||
|
||||
pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress);
|
||||
maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe));
|
||||
|
||||
if (!(mouse = kmalloc(sizeof(struct usb_mouse), GFP_KERNEL)))
|
||||
return -ENOMEM;
|
||||
memset(mouse, 0, sizeof(struct usb_mouse));
|
||||
mouse = kzalloc(sizeof(struct usb_mouse), GFP_KERNEL);
|
||||
input_dev = input_allocate_device();
|
||||
if (!mouse || !input_dev)
|
||||
goto fail1;
|
||||
|
||||
mouse->data = usb_buffer_alloc(dev, 8, SLAB_ATOMIC, &mouse->data_dma);
|
||||
if (!mouse->data) {
|
||||
kfree(mouse);
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (!mouse->data)
|
||||
goto fail1;
|
||||
|
||||
mouse->irq = usb_alloc_urb(0, GFP_KERNEL);
|
||||
if (!mouse->irq) {
|
||||
usb_buffer_free(dev, 8, mouse->data, mouse->data_dma);
|
||||
kfree(mouse);
|
||||
return -ENODEV;
|
||||
}
|
||||
if (!mouse->irq)
|
||||
goto fail2;
|
||||
|
||||
mouse->usbdev = dev;
|
||||
|
||||
mouse->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_REL);
|
||||
mouse->dev.keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE);
|
||||
mouse->dev.relbit[0] = BIT(REL_X) | BIT(REL_Y);
|
||||
mouse->dev.keybit[LONG(BTN_MOUSE)] |= BIT(BTN_SIDE) | BIT(BTN_EXTRA);
|
||||
mouse->dev.relbit[0] |= BIT(REL_WHEEL);
|
||||
|
||||
mouse->dev.private = mouse;
|
||||
mouse->dev.open = usb_mouse_open;
|
||||
mouse->dev.close = usb_mouse_close;
|
||||
|
||||
usb_make_path(dev, path, 64);
|
||||
sprintf(mouse->phys, "%s/input0", path);
|
||||
|
||||
mouse->dev.name = mouse->name;
|
||||
mouse->dev.phys = mouse->phys;
|
||||
usb_to_input_id(dev, &mouse->dev.id);
|
||||
mouse->dev.dev = &intf->dev;
|
||||
mouse->dev = input_dev;
|
||||
|
||||
if (dev->manufacturer)
|
||||
strcat(mouse->name, dev->manufacturer);
|
||||
if (dev->product)
|
||||
sprintf(mouse->name, "%s %s", mouse->name, dev->product);
|
||||
strlcpy(mouse->name, dev->manufacturer, sizeof(mouse->name));
|
||||
|
||||
if (dev->product) {
|
||||
if (dev->manufacturer)
|
||||
strlcat(mouse->name, " ", sizeof(mouse->name));
|
||||
strlcat(mouse->name, dev->product, sizeof(mouse->name));
|
||||
}
|
||||
|
||||
if (!strlen(mouse->name))
|
||||
sprintf(mouse->name, "USB HIDBP Mouse %04x:%04x",
|
||||
mouse->dev.id.vendor, mouse->dev.id.product);
|
||||
snprintf(mouse->name, sizeof(mouse->name),
|
||||
"USB HIDBP Mouse %04x:%04x",
|
||||
le16_to_cpu(dev->descriptor.idVendor),
|
||||
le16_to_cpu(dev->descriptor.idProduct));
|
||||
|
||||
usb_make_path(dev, mouse->phys, sizeof(mouse->phys));
|
||||
strlcat(mouse->phys, "/input0", sizeof(mouse->phys));
|
||||
|
||||
input_dev->name = mouse->name;
|
||||
input_dev->phys = mouse->phys;
|
||||
usb_to_input_id(dev, &input_dev->id);
|
||||
input_dev->cdev.dev = &intf->dev;
|
||||
|
||||
input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL);
|
||||
input_dev->keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE);
|
||||
input_dev->relbit[0] = BIT(REL_X) | BIT(REL_Y);
|
||||
input_dev->keybit[LONG(BTN_MOUSE)] |= BIT(BTN_SIDE) | BIT(BTN_EXTRA);
|
||||
input_dev->relbit[0] |= BIT(REL_WHEEL);
|
||||
|
||||
input_dev->private = mouse;
|
||||
input_dev->open = usb_mouse_open;
|
||||
input_dev->close = usb_mouse_close;
|
||||
|
||||
usb_fill_int_urb(mouse->irq, dev, pipe, mouse->data,
|
||||
(maxp > 8 ? 8 : maxp),
|
||||
@ -190,11 +193,15 @@ static int usb_mouse_probe(struct usb_interface * intf, const struct usb_device_
|
||||
mouse->irq->transfer_dma = mouse->data_dma;
|
||||
mouse->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
|
||||
|
||||
input_register_device(&mouse->dev);
|
||||
printk(KERN_INFO "input: %s on %s\n", mouse->name, path);
|
||||
input_register_device(mouse->dev);
|
||||
|
||||
usb_set_intfdata(intf, mouse);
|
||||
return 0;
|
||||
|
||||
fail2: usb_buffer_free(dev, 8, mouse->data, mouse->data_dma);
|
||||
fail1: input_free_device(input_dev);
|
||||
kfree(mouse);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
static void usb_mouse_disconnect(struct usb_interface *intf)
|
||||
@ -204,7 +211,7 @@ static void usb_mouse_disconnect(struct usb_interface *intf)
|
||||
usb_set_intfdata(intf, NULL);
|
||||
if (mouse) {
|
||||
usb_kill_urb(mouse->irq);
|
||||
input_unregister_device(&mouse->dev);
|
||||
input_unregister_device(mouse->dev);
|
||||
usb_free_urb(mouse->irq);
|
||||
usb_buffer_free(interface_to_usbdev(intf), 8, mouse->data, mouse->data_dma);
|
||||
kfree(mouse);
|
||||
|
@ -111,7 +111,7 @@ struct wacom_features {
|
||||
struct wacom {
|
||||
signed char *data;
|
||||
dma_addr_t data_dma;
|
||||
struct input_dev dev;
|
||||
struct input_dev *dev;
|
||||
struct usb_device *usbdev;
|
||||
struct urb *irq;
|
||||
struct wacom_features *features;
|
||||
@ -135,7 +135,7 @@ static void wacom_pl_irq(struct urb *urb, struct pt_regs *regs)
|
||||
{
|
||||
struct wacom *wacom = urb->context;
|
||||
unsigned char *data = wacom->data;
|
||||
struct input_dev *dev = &wacom->dev;
|
||||
struct input_dev *dev = wacom->dev;
|
||||
int prox, pressure;
|
||||
int retval;
|
||||
|
||||
@ -225,7 +225,7 @@ static void wacom_ptu_irq(struct urb *urb, struct pt_regs *regs)
|
||||
{
|
||||
struct wacom *wacom = urb->context;
|
||||
unsigned char *data = wacom->data;
|
||||
struct input_dev *dev = &wacom->dev;
|
||||
struct input_dev *dev = wacom->dev;
|
||||
int retval;
|
||||
|
||||
switch (urb->status) {
|
||||
@ -275,7 +275,7 @@ static void wacom_penpartner_irq(struct urb *urb, struct pt_regs *regs)
|
||||
{
|
||||
struct wacom *wacom = urb->context;
|
||||
unsigned char *data = wacom->data;
|
||||
struct input_dev *dev = &wacom->dev;
|
||||
struct input_dev *dev = wacom->dev;
|
||||
int retval;
|
||||
|
||||
switch (urb->status) {
|
||||
@ -318,7 +318,7 @@ static void wacom_graphire_irq(struct urb *urb, struct pt_regs *regs)
|
||||
{
|
||||
struct wacom *wacom = urb->context;
|
||||
unsigned char *data = wacom->data;
|
||||
struct input_dev *dev = &wacom->dev;
|
||||
struct input_dev *dev = wacom->dev;
|
||||
int x, y;
|
||||
int retval;
|
||||
|
||||
@ -397,7 +397,7 @@ static int wacom_intuos_inout(struct urb *urb)
|
||||
{
|
||||
struct wacom *wacom = urb->context;
|
||||
unsigned char *data = wacom->data;
|
||||
struct input_dev *dev = &wacom->dev;
|
||||
struct input_dev *dev = wacom->dev;
|
||||
int idx;
|
||||
|
||||
/* tool number */
|
||||
@ -479,7 +479,7 @@ static void wacom_intuos_general(struct urb *urb)
|
||||
{
|
||||
struct wacom *wacom = urb->context;
|
||||
unsigned char *data = wacom->data;
|
||||
struct input_dev *dev = &wacom->dev;
|
||||
struct input_dev *dev = wacom->dev;
|
||||
unsigned int t;
|
||||
|
||||
/* general pen packet */
|
||||
@ -509,7 +509,7 @@ static void wacom_intuos_irq(struct urb *urb, struct pt_regs *regs)
|
||||
{
|
||||
struct wacom *wacom = urb->context;
|
||||
unsigned char *data = wacom->data;
|
||||
struct input_dev *dev = &wacom->dev;
|
||||
struct input_dev *dev = wacom->dev;
|
||||
unsigned int t;
|
||||
int idx;
|
||||
int retval;
|
||||
@ -738,95 +738,83 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
|
||||
{
|
||||
struct usb_device *dev = interface_to_usbdev(intf);
|
||||
struct usb_endpoint_descriptor *endpoint;
|
||||
char rep_data[2] = {0x02, 0x02};
|
||||
struct wacom *wacom;
|
||||
char path[64];
|
||||
struct input_dev *input_dev;
|
||||
char rep_data[2] = {0x02, 0x02};
|
||||
|
||||
if (!(wacom = kmalloc(sizeof(struct wacom), GFP_KERNEL)))
|
||||
return -ENOMEM;
|
||||
memset(wacom, 0, sizeof(struct wacom));
|
||||
wacom = kzalloc(sizeof(struct wacom), GFP_KERNEL);
|
||||
input_dev = input_allocate_device();
|
||||
if (!wacom || !input_dev)
|
||||
goto fail1;
|
||||
|
||||
wacom->data = usb_buffer_alloc(dev, 10, GFP_KERNEL, &wacom->data_dma);
|
||||
if (!wacom->data) {
|
||||
kfree(wacom);
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (!wacom->data)
|
||||
goto fail1;
|
||||
|
||||
wacom->irq = usb_alloc_urb(0, GFP_KERNEL);
|
||||
if (!wacom->irq) {
|
||||
usb_buffer_free(dev, 10, wacom->data, wacom->data_dma);
|
||||
kfree(wacom);
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (!wacom->irq)
|
||||
goto fail2;
|
||||
|
||||
wacom->usbdev = dev;
|
||||
wacom->dev = input_dev;
|
||||
usb_make_path(dev, wacom->phys, sizeof(wacom->phys));
|
||||
strlcat(wacom->phys, "/input0", sizeof(wacom->phys));
|
||||
|
||||
wacom->features = wacom_features + (id - wacom_ids);
|
||||
if (wacom->features->pktlen > 10)
|
||||
BUG();
|
||||
|
||||
wacom->dev.evbit[0] |= BIT(EV_KEY) | BIT(EV_ABS);
|
||||
wacom->dev.absbit[0] |= BIT(ABS_X) | BIT(ABS_Y) | BIT(ABS_PRESSURE);
|
||||
wacom->dev.keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_PEN) | BIT(BTN_TOUCH) | BIT(BTN_STYLUS);
|
||||
input_dev->name = wacom->features->name;
|
||||
usb_to_input_id(dev, &input_dev->id);
|
||||
|
||||
input_dev->cdev.dev = &intf->dev;
|
||||
input_dev->private = wacom;
|
||||
input_dev->open = wacom_open;
|
||||
input_dev->close = wacom_close;
|
||||
|
||||
input_dev->evbit[0] |= BIT(EV_KEY) | BIT(EV_ABS);
|
||||
input_dev->keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_PEN) | BIT(BTN_TOUCH) | BIT(BTN_STYLUS);
|
||||
input_set_abs_params(input_dev, ABS_X, 0, wacom->features->y_max, 4, 0);
|
||||
input_set_abs_params(input_dev, ABS_Y, 0, wacom->features->y_max, 4, 0);
|
||||
input_set_abs_params(input_dev, ABS_PRESSURE, 0, wacom->features->pressure_max, 0, 0);
|
||||
|
||||
switch (wacom->features->type) {
|
||||
case GRAPHIRE:
|
||||
wacom->dev.evbit[0] |= BIT(EV_REL);
|
||||
wacom->dev.relbit[0] |= BIT(REL_WHEEL);
|
||||
wacom->dev.absbit[0] |= BIT(ABS_DISTANCE);
|
||||
wacom->dev.keybit[LONG(BTN_LEFT)] |= BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE);
|
||||
wacom->dev.keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_RUBBER) | BIT(BTN_TOOL_MOUSE) | BIT(BTN_STYLUS2);
|
||||
input_dev->evbit[0] |= BIT(EV_REL);
|
||||
input_dev->relbit[0] |= BIT(REL_WHEEL);
|
||||
input_dev->keybit[LONG(BTN_LEFT)] |= BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE);
|
||||
input_dev->keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_RUBBER) | BIT(BTN_TOOL_MOUSE) | BIT(BTN_STYLUS2);
|
||||
input_set_abs_params(input_dev, ABS_DISTANCE, 0, wacom->features->distance_max, 0, 0);
|
||||
break;
|
||||
|
||||
case INTUOS3:
|
||||
case CINTIQ:
|
||||
wacom->dev.keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_FINGER);
|
||||
wacom->dev.keybit[LONG(BTN_LEFT)] |= BIT(BTN_0) | BIT(BTN_1) | BIT(BTN_2) | BIT(BTN_3) | BIT(BTN_4) | BIT(BTN_5) | BIT(BTN_6) | BIT(BTN_7);
|
||||
wacom->dev.absbit[0] |= BIT(ABS_RX) | BIT(ABS_RY);
|
||||
input_dev->keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_FINGER);
|
||||
input_dev->keybit[LONG(BTN_LEFT)] |= BIT(BTN_0) | BIT(BTN_1) | BIT(BTN_2) | BIT(BTN_3) | BIT(BTN_4) | BIT(BTN_5) | BIT(BTN_6) | BIT(BTN_7);
|
||||
input_set_abs_params(input_dev, ABS_RX, 0, 4097, 0, 0);
|
||||
input_set_abs_params(input_dev, ABS_RY, 0, 4097, 0, 0);
|
||||
/* fall through */
|
||||
|
||||
case INTUOS:
|
||||
wacom->dev.evbit[0] |= BIT(EV_MSC) | BIT(EV_REL);
|
||||
wacom->dev.mscbit[0] |= BIT(MSC_SERIAL);
|
||||
wacom->dev.relbit[0] |= BIT(REL_WHEEL);
|
||||
wacom->dev.keybit[LONG(BTN_LEFT)] |= BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE) | BIT(BTN_SIDE) | BIT(BTN_EXTRA);
|
||||
wacom->dev.keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_RUBBER) | BIT(BTN_TOOL_MOUSE) | BIT(BTN_TOOL_BRUSH)
|
||||
input_dev->evbit[0] |= BIT(EV_MSC) | BIT(EV_REL);
|
||||
input_dev->mscbit[0] |= BIT(MSC_SERIAL);
|
||||
input_dev->relbit[0] |= BIT(REL_WHEEL);
|
||||
input_dev->keybit[LONG(BTN_LEFT)] |= BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE) | BIT(BTN_SIDE) | BIT(BTN_EXTRA);
|
||||
input_dev->keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_RUBBER) | BIT(BTN_TOOL_MOUSE) | BIT(BTN_TOOL_BRUSH)
|
||||
| BIT(BTN_TOOL_PENCIL) | BIT(BTN_TOOL_AIRBRUSH) | BIT(BTN_TOOL_LENS) | BIT(BTN_STYLUS2);
|
||||
wacom->dev.absbit[0] |= BIT(ABS_DISTANCE) | BIT(ABS_WHEEL) | BIT(ABS_TILT_X) | BIT(ABS_TILT_Y) | BIT(ABS_RZ) | BIT(ABS_THROTTLE);
|
||||
input_set_abs_params(input_dev, ABS_DISTANCE, 0, wacom->features->distance_max, 0, 0);
|
||||
input_set_abs_params(input_dev, ABS_WHEEL, 0, 1023, 0, 0);
|
||||
input_set_abs_params(input_dev, ABS_TILT_X, 0, 127, 0, 0);
|
||||
input_set_abs_params(input_dev, ABS_TILT_Y, 0, 127, 0, 0);
|
||||
input_set_abs_params(input_dev, ABS_RZ, -900, 899, 0, 0);
|
||||
input_set_abs_params(input_dev, ABS_THROTTLE, -1023, 1023, 0, 0);
|
||||
break;
|
||||
|
||||
case PL:
|
||||
wacom->dev.keybit[LONG(BTN_DIGI)] |= BIT(BTN_STYLUS2) | BIT(BTN_TOOL_RUBBER);
|
||||
input_dev->keybit[LONG(BTN_DIGI)] |= BIT(BTN_STYLUS2) | BIT(BTN_TOOL_RUBBER);
|
||||
break;
|
||||
}
|
||||
|
||||
wacom->dev.absmax[ABS_X] = wacom->features->x_max;
|
||||
wacom->dev.absmax[ABS_Y] = wacom->features->y_max;
|
||||
wacom->dev.absmax[ABS_PRESSURE] = wacom->features->pressure_max;
|
||||
wacom->dev.absmax[ABS_DISTANCE] = wacom->features->distance_max;
|
||||
wacom->dev.absmax[ABS_TILT_X] = 127;
|
||||
wacom->dev.absmax[ABS_TILT_Y] = 127;
|
||||
wacom->dev.absmax[ABS_WHEEL] = 1023;
|
||||
|
||||
wacom->dev.absmax[ABS_RX] = 4097;
|
||||
wacom->dev.absmax[ABS_RY] = 4097;
|
||||
wacom->dev.absmin[ABS_RZ] = -900;
|
||||
wacom->dev.absmax[ABS_RZ] = 899;
|
||||
wacom->dev.absmin[ABS_THROTTLE] = -1023;
|
||||
wacom->dev.absmax[ABS_THROTTLE] = 1023;
|
||||
|
||||
wacom->dev.absfuzz[ABS_X] = 4;
|
||||
wacom->dev.absfuzz[ABS_Y] = 4;
|
||||
|
||||
wacom->dev.private = wacom;
|
||||
wacom->dev.open = wacom_open;
|
||||
wacom->dev.close = wacom_close;
|
||||
|
||||
usb_make_path(dev, path, 64);
|
||||
sprintf(wacom->phys, "%s/input0", path);
|
||||
|
||||
wacom->dev.name = wacom->features->name;
|
||||
wacom->dev.phys = wacom->phys;
|
||||
usb_to_input_id(dev, &wacom->dev.id);
|
||||
wacom->dev.dev = &intf->dev;
|
||||
wacom->usbdev = dev;
|
||||
|
||||
endpoint = &intf->cur_altsetting->endpoint[0].desc;
|
||||
|
||||
if (wacom->features->pktlen > 10)
|
||||
@ -839,18 +827,20 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
|
||||
wacom->irq->transfer_dma = wacom->data_dma;
|
||||
wacom->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
|
||||
|
||||
input_register_device(&wacom->dev);
|
||||
input_register_device(wacom->dev);
|
||||
|
||||
/* ask the tablet to report tablet data */
|
||||
usb_set_report(intf, 3, 2, rep_data, 2);
|
||||
/* repeat once (not sure why the first call often fails) */
|
||||
usb_set_report(intf, 3, 2, rep_data, 2);
|
||||
|
||||
printk(KERN_INFO "input: %s on %s\n", wacom->features->name, path);
|
||||
|
||||
usb_set_intfdata(intf, wacom);
|
||||
|
||||
return 0;
|
||||
|
||||
fail2: usb_buffer_free(dev, 10, wacom->data, wacom->data_dma);
|
||||
fail1: input_free_device(input_dev);
|
||||
kfree(wacom);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
static void wacom_disconnect(struct usb_interface *intf)
|
||||
@ -860,7 +850,7 @@ static void wacom_disconnect(struct usb_interface *intf)
|
||||
usb_set_intfdata(intf, NULL);
|
||||
if (wacom) {
|
||||
usb_kill_urb(wacom->irq);
|
||||
input_unregister_device(&wacom->dev);
|
||||
input_unregister_device(wacom->dev);
|
||||
usb_free_urb(wacom->irq);
|
||||
usb_buffer_free(interface_to_usbdev(intf), 10, wacom->data, wacom->data_dma);
|
||||
kfree(wacom);
|
||||
|
@ -103,7 +103,7 @@ static struct usb_device_id xpad_table [] = {
|
||||
MODULE_DEVICE_TABLE (usb, xpad_table);
|
||||
|
||||
struct usb_xpad {
|
||||
struct input_dev dev; /* input device interface */
|
||||
struct input_dev *dev; /* input device interface */
|
||||
struct usb_device *udev; /* usb device */
|
||||
|
||||
struct urb *irq_in; /* urb for interrupt in report */
|
||||
@ -125,7 +125,7 @@ struct usb_xpad {
|
||||
|
||||
static void xpad_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char *data, struct pt_regs *regs)
|
||||
{
|
||||
struct input_dev *dev = &xpad->dev;
|
||||
struct input_dev *dev = xpad->dev;
|
||||
|
||||
input_regs(dev, regs);
|
||||
|
||||
@ -214,9 +214,9 @@ static void xpad_close (struct input_dev *dev)
|
||||
static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
{
|
||||
struct usb_device *udev = interface_to_usbdev (intf);
|
||||
struct usb_xpad *xpad = NULL;
|
||||
struct usb_xpad *xpad;
|
||||
struct input_dev *input_dev;
|
||||
struct usb_endpoint_descriptor *ep_irq_in;
|
||||
char path[64];
|
||||
int i;
|
||||
|
||||
for (i = 0; xpad_device[i].idVendor; i++) {
|
||||
@ -225,29 +225,63 @@ static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id
|
||||
break;
|
||||
}
|
||||
|
||||
if ((xpad = kmalloc (sizeof(struct usb_xpad), GFP_KERNEL)) == NULL) {
|
||||
err("cannot allocate memory for new pad");
|
||||
return -ENOMEM;
|
||||
}
|
||||
memset(xpad, 0, sizeof(struct usb_xpad));
|
||||
xpad = kzalloc(sizeof(struct usb_xpad), GFP_KERNEL);
|
||||
input_dev = input_allocate_device();
|
||||
if (!xpad || !input_dev)
|
||||
goto fail1;
|
||||
|
||||
xpad->idata = usb_buffer_alloc(udev, XPAD_PKT_LEN,
|
||||
SLAB_ATOMIC, &xpad->idata_dma);
|
||||
if (!xpad->idata) {
|
||||
kfree(xpad);
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (!xpad->idata)
|
||||
goto fail1;
|
||||
|
||||
xpad->irq_in = usb_alloc_urb(0, GFP_KERNEL);
|
||||
if (!xpad->irq_in) {
|
||||
err("cannot allocate memory for new pad irq urb");
|
||||
usb_buffer_free(udev, XPAD_PKT_LEN, xpad->idata, xpad->idata_dma);
|
||||
kfree(xpad);
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (!xpad->irq_in)
|
||||
goto fail2;
|
||||
|
||||
xpad->udev = udev;
|
||||
xpad->dev = input_dev;
|
||||
usb_make_path(udev, xpad->phys, sizeof(xpad->phys));
|
||||
strlcat(xpad->phys, "/input0", sizeof(xpad->phys));
|
||||
|
||||
input_dev->name = xpad_device[i].name;
|
||||
input_dev->phys = xpad->phys;
|
||||
usb_to_input_id(udev, &input_dev->id);
|
||||
input_dev->cdev.dev = &intf->dev;
|
||||
input_dev->private = xpad;
|
||||
input_dev->open = xpad_open;
|
||||
input_dev->close = xpad_close;
|
||||
|
||||
input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
|
||||
|
||||
for (i = 0; xpad_btn[i] >= 0; i++)
|
||||
set_bit(xpad_btn[i], input_dev->keybit);
|
||||
|
||||
for (i = 0; xpad_abs[i] >= 0; i++) {
|
||||
|
||||
signed short t = xpad_abs[i];
|
||||
|
||||
set_bit(t, input_dev->absbit);
|
||||
|
||||
switch (t) {
|
||||
case ABS_X:
|
||||
case ABS_Y:
|
||||
case ABS_RX:
|
||||
case ABS_RY: /* the two sticks */
|
||||
input_set_abs_params(input_dev, t, -32768, 32767, 16, 128);
|
||||
break;
|
||||
case ABS_Z:
|
||||
case ABS_RZ: /* the triggers */
|
||||
input_set_abs_params(input_dev, t, 0, 255, 0, 0);
|
||||
break;
|
||||
case ABS_HAT0X:
|
||||
case ABS_HAT0Y: /* the d-pad */
|
||||
input_set_abs_params(input_dev, t, -1, 1, 0, 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ep_irq_in = &intf->cur_altsetting->endpoint[0].desc;
|
||||
|
||||
usb_fill_int_urb(xpad->irq_in, udev,
|
||||
usb_rcvintpipe(udev, ep_irq_in->bEndpointAddress),
|
||||
xpad->idata, XPAD_PKT_LEN, xpad_irq_in,
|
||||
@ -255,59 +289,16 @@ static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id
|
||||
xpad->irq_in->transfer_dma = xpad->idata_dma;
|
||||
xpad->irq_in->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
|
||||
|
||||
xpad->udev = udev;
|
||||
|
||||
usb_to_input_id(udev, &xpad->dev.id);
|
||||
xpad->dev.dev = &intf->dev;
|
||||
xpad->dev.private = xpad;
|
||||
xpad->dev.name = xpad_device[i].name;
|
||||
xpad->dev.phys = xpad->phys;
|
||||
xpad->dev.open = xpad_open;
|
||||
xpad->dev.close = xpad_close;
|
||||
|
||||
usb_make_path(udev, path, 64);
|
||||
snprintf(xpad->phys, 64, "%s/input0", path);
|
||||
|
||||
xpad->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
|
||||
|
||||
for (i = 0; xpad_btn[i] >= 0; i++)
|
||||
set_bit(xpad_btn[i], xpad->dev.keybit);
|
||||
|
||||
for (i = 0; xpad_abs[i] >= 0; i++) {
|
||||
|
||||
signed short t = xpad_abs[i];
|
||||
|
||||
set_bit(t, xpad->dev.absbit);
|
||||
|
||||
switch (t) {
|
||||
case ABS_X:
|
||||
case ABS_Y:
|
||||
case ABS_RX:
|
||||
case ABS_RY: /* the two sticks */
|
||||
xpad->dev.absmax[t] = 32767;
|
||||
xpad->dev.absmin[t] = -32768;
|
||||
xpad->dev.absflat[t] = 128;
|
||||
xpad->dev.absfuzz[t] = 16;
|
||||
break;
|
||||
case ABS_Z:
|
||||
case ABS_RZ: /* the triggers */
|
||||
xpad->dev.absmax[t] = 255;
|
||||
xpad->dev.absmin[t] = 0;
|
||||
break;
|
||||
case ABS_HAT0X:
|
||||
case ABS_HAT0Y: /* the d-pad */
|
||||
xpad->dev.absmax[t] = 1;
|
||||
xpad->dev.absmin[t] = -1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
input_register_device(&xpad->dev);
|
||||
|
||||
printk(KERN_INFO "input: %s on %s", xpad->dev.name, path);
|
||||
input_register_device(xpad->dev);
|
||||
|
||||
usb_set_intfdata(intf, xpad);
|
||||
return 0;
|
||||
|
||||
fail2: usb_buffer_free(udev, XPAD_PKT_LEN, xpad->idata, xpad->idata_dma);
|
||||
fail1: input_free_device(input_dev);
|
||||
kfree(xpad);
|
||||
return -ENOMEM;
|
||||
|
||||
}
|
||||
|
||||
static void xpad_disconnect(struct usb_interface *intf)
|
||||
@ -317,7 +308,7 @@ static void xpad_disconnect(struct usb_interface *intf)
|
||||
usb_set_intfdata(intf, NULL);
|
||||
if (xpad) {
|
||||
usb_kill_urb(xpad->irq_in);
|
||||
input_unregister_device(&xpad->dev);
|
||||
input_unregister_device(xpad->dev);
|
||||
usb_free_urb(xpad->irq_in);
|
||||
usb_buffer_free(interface_to_usbdev(intf), XPAD_PKT_LEN, xpad->idata, xpad->idata_dma);
|
||||
kfree(xpad);
|
||||
|
@ -54,6 +54,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/rwsem.h>
|
||||
#include <linux/usb.h>
|
||||
#include <linux/usb_input.h>
|
||||
|
||||
#include "map_to_7segment.h"
|
||||
#include "yealink.h"
|
||||
@ -101,12 +102,12 @@ static const struct lcd_segment_map {
|
||||
};
|
||||
|
||||
struct yealink_dev {
|
||||
struct input_dev idev; /* input device */
|
||||
struct input_dev *idev; /* input device */
|
||||
struct usb_device *udev; /* usb device */
|
||||
|
||||
/* irq input channel */
|
||||
struct yld_ctl_packet *irq_data;
|
||||
dma_addr_t irq_dma;
|
||||
dma_addr_t irq_dma;
|
||||
struct urb *urb_irq;
|
||||
|
||||
/* control output channel */
|
||||
@ -237,7 +238,7 @@ static int map_p1k_to_key(int scancode)
|
||||
*/
|
||||
static void report_key(struct yealink_dev *yld, int key, struct pt_regs *regs)
|
||||
{
|
||||
struct input_dev *idev = &yld->idev;
|
||||
struct input_dev *idev = yld->idev;
|
||||
|
||||
input_regs(idev, regs);
|
||||
if (yld->key_code >= 0) {
|
||||
@ -809,8 +810,12 @@ static int usb_cleanup(struct yealink_dev *yld, int err)
|
||||
}
|
||||
if (yld->urb_ctl)
|
||||
usb_free_urb(yld->urb_ctl);
|
||||
if (yld->idev.dev)
|
||||
input_unregister_device(&yld->idev);
|
||||
if (yld->idev) {
|
||||
if (err)
|
||||
input_free_device(yld->idev);
|
||||
else
|
||||
input_unregister_device(yld->idev);
|
||||
}
|
||||
if (yld->ctl_req)
|
||||
usb_buffer_free(yld->udev, sizeof(*(yld->ctl_req)),
|
||||
yld->ctl_req, yld->ctl_req_dma);
|
||||
@ -857,7 +862,7 @@ static int usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
struct usb_host_interface *interface;
|
||||
struct usb_endpoint_descriptor *endpoint;
|
||||
struct yealink_dev *yld;
|
||||
char path[64];
|
||||
struct input_dev *input_dev;
|
||||
int ret, pipe, i;
|
||||
|
||||
i = usb_match(udev);
|
||||
@ -866,17 +871,21 @@ static int usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
|
||||
interface = intf->cur_altsetting;
|
||||
endpoint = &interface->endpoint[0].desc;
|
||||
if (!(endpoint->bEndpointAddress & 0x80))
|
||||
if (!(endpoint->bEndpointAddress & USB_DIR_IN))
|
||||
return -EIO;
|
||||
if ((endpoint->bmAttributes & 3) != 3)
|
||||
if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_INT)
|
||||
return -EIO;
|
||||
|
||||
if ((yld = kmalloc(sizeof(struct yealink_dev), GFP_KERNEL)) == NULL)
|
||||
yld = kzalloc(sizeof(struct yealink_dev), GFP_KERNEL);
|
||||
if (!yld)
|
||||
return -ENOMEM;
|
||||
|
||||
memset(yld, 0, sizeof(*yld));
|
||||
yld->udev = udev;
|
||||
|
||||
yld->idev = input_dev = input_allocate_device();
|
||||
if (!input_dev)
|
||||
return usb_cleanup(yld, -ENOMEM);
|
||||
|
||||
/* allocate usb buffers */
|
||||
yld->irq_data = usb_buffer_alloc(udev, USB_PKT_LEN,
|
||||
SLAB_ATOMIC, &yld->irq_dma);
|
||||
@ -935,42 +944,37 @@ static int usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
yld->urb_ctl->dev = udev;
|
||||
|
||||
/* find out the physical bus location */
|
||||
if (usb_make_path(udev, path, sizeof(path)) > 0)
|
||||
snprintf(yld->phys, sizeof(yld->phys)-1, "%s/input0", path);
|
||||
usb_make_path(udev, yld->phys, sizeof(yld->phys));
|
||||
strlcat(yld->phys, "/input0", sizeof(yld->phys));
|
||||
|
||||
/* register settings for the input device */
|
||||
init_input_dev(&yld->idev);
|
||||
yld->idev.private = yld;
|
||||
yld->idev.id.bustype = BUS_USB;
|
||||
yld->idev.id.vendor = le16_to_cpu(udev->descriptor.idVendor);
|
||||
yld->idev.id.product = le16_to_cpu(udev->descriptor.idProduct);
|
||||
yld->idev.id.version = le16_to_cpu(udev->descriptor.bcdDevice);
|
||||
yld->idev.dev = &intf->dev;
|
||||
yld->idev.name = yld_device[i].name;
|
||||
yld->idev.phys = yld->phys;
|
||||
/* yld->idev.event = input_ev; TODO */
|
||||
yld->idev.open = input_open;
|
||||
yld->idev.close = input_close;
|
||||
input_dev->name = yld_device[i].name;
|
||||
input_dev->phys = yld->phys;
|
||||
usb_to_input_id(udev, &input_dev->id);
|
||||
input_dev->cdev.dev = &intf->dev;
|
||||
|
||||
input_dev->private = yld;
|
||||
input_dev->open = input_open;
|
||||
input_dev->close = input_close;
|
||||
/* input_dev->event = input_ev; TODO */
|
||||
|
||||
/* register available key events */
|
||||
yld->idev.evbit[0] = BIT(EV_KEY);
|
||||
input_dev->evbit[0] = BIT(EV_KEY);
|
||||
for (i = 0; i < 256; i++) {
|
||||
int k = map_p1k_to_key(i);
|
||||
if (k >= 0) {
|
||||
set_bit(k & 0xff, yld->idev.keybit);
|
||||
set_bit(k & 0xff, input_dev->keybit);
|
||||
if (k >> 8)
|
||||
set_bit(k >> 8, yld->idev.keybit);
|
||||
set_bit(k >> 8, input_dev->keybit);
|
||||
}
|
||||
}
|
||||
|
||||
printk(KERN_INFO "input: %s on %s\n", yld->idev.name, path);
|
||||
|
||||
input_register_device(&yld->idev);
|
||||
input_register_device(yld->idev);
|
||||
|
||||
usb_set_intfdata(intf, yld);
|
||||
|
||||
/* clear visible elements */
|
||||
for (i=0; i<ARRAY_SIZE(lcdMap); i++)
|
||||
for (i = 0; i < ARRAY_SIZE(lcdMap); i++)
|
||||
setChar(yld, i, ' ');
|
||||
|
||||
/* display driver version on LCD line 3 */
|
||||
|
Loading…
Reference in New Issue
Block a user