mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6.git
synced 2026-04-23 05:56:14 -04:00
Input: wacom - use per-device instance of wacom_features
Since we mangle data in wacom_features when dealing with certain devices let's use a private (per-device) instance of wacom_features in wacom_wac. This way same product ID can support more than one type of device, such as pen and touch, and not interfere with each other. Signed-off-by: Jason Childs <oblivian@users.sourceforge.net> Signed-off-by: Ping Cheng <pingc@wacom.com> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
This commit is contained in:
committed by
Dmitry Torokhov
parent
4e45ad5e89
commit
e33da8a548
@@ -211,7 +211,8 @@ void input_dev_g(struct input_dev *input_dev, struct wacom_wac *wacom_wac)
|
||||
input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_RUBBER) |
|
||||
BIT_MASK(BTN_TOOL_PEN) | BIT_MASK(BTN_STYLUS) |
|
||||
BIT_MASK(BTN_TOOL_MOUSE) | BIT_MASK(BTN_STYLUS2);
|
||||
input_set_abs_params(input_dev, ABS_DISTANCE, 0, wacom_wac->features->distance_max, 0, 0);
|
||||
input_set_abs_params(input_dev, ABS_DISTANCE,
|
||||
0, wacom_wac->features.distance_max, 0, 0);
|
||||
}
|
||||
|
||||
void input_dev_i3s(struct input_dev *input_dev, struct wacom_wac *wacom_wac)
|
||||
@@ -261,7 +262,8 @@ void input_dev_i(struct input_dev *input_dev, struct wacom_wac *wacom_wac)
|
||||
BIT_MASK(BTN_TOOL_MOUSE) | BIT_MASK(BTN_TOOL_BRUSH) |
|
||||
BIT_MASK(BTN_TOOL_PENCIL) | BIT_MASK(BTN_TOOL_AIRBRUSH) |
|
||||
BIT_MASK(BTN_TOOL_LENS) | BIT_MASK(BTN_STYLUS2);
|
||||
input_set_abs_params(input_dev, ABS_DISTANCE, 0, wacom_wac->features->distance_max, 0, 0);
|
||||
input_set_abs_params(input_dev, ABS_DISTANCE,
|
||||
0, wacom_wac->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);
|
||||
@@ -282,17 +284,19 @@ void input_dev_pt(struct input_dev *input_dev, struct wacom_wac *wacom_wac)
|
||||
|
||||
void input_dev_tpc(struct input_dev *input_dev, struct wacom_wac *wacom_wac)
|
||||
{
|
||||
if (wacom_wac->features->device_type == BTN_TOOL_DOUBLETAP ||
|
||||
wacom_wac->features->device_type == BTN_TOOL_TRIPLETAP) {
|
||||
input_set_abs_params(input_dev, ABS_RX, 0, wacom_wac->features->x_phy, 0, 0);
|
||||
input_set_abs_params(input_dev, ABS_RY, 0, wacom_wac->features->y_phy, 0, 0);
|
||||
input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_DOUBLETAP);
|
||||
struct wacom_features *features = &wacom_wac->features;
|
||||
|
||||
if (features->device_type == BTN_TOOL_DOUBLETAP ||
|
||||
features->device_type == BTN_TOOL_TRIPLETAP) {
|
||||
input_set_abs_params(input_dev, ABS_RX, 0, features->x_phy, 0, 0);
|
||||
input_set_abs_params(input_dev, ABS_RY, 0, features->y_phy, 0, 0);
|
||||
__set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit);
|
||||
}
|
||||
}
|
||||
|
||||
void input_dev_tpc2fg(struct input_dev *input_dev, struct wacom_wac *wacom_wac)
|
||||
{
|
||||
if (wacom_wac->features->device_type == BTN_TOOL_TRIPLETAP) {
|
||||
if (wacom_wac->features.device_type == BTN_TOOL_TRIPLETAP) {
|
||||
input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_TRIPLETAP);
|
||||
input_dev->evbit[0] |= BIT_MASK(EV_MSC);
|
||||
input_dev->mscbit[0] |= BIT_MASK(MSC_SERIAL);
|
||||
@@ -530,26 +534,40 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
|
||||
struct usb_endpoint_descriptor *endpoint;
|
||||
struct wacom *wacom;
|
||||
struct wacom_wac *wacom_wac;
|
||||
struct wacom_features *features = (void *)id->driver_info;
|
||||
struct wacom_features *features;
|
||||
struct input_dev *input_dev;
|
||||
int error = -ENOMEM;
|
||||
int error;
|
||||
|
||||
if (!features)
|
||||
if (!id->driver_info)
|
||||
return -EINVAL;
|
||||
|
||||
wacom = kzalloc(sizeof(struct wacom), GFP_KERNEL);
|
||||
wacom_wac = kzalloc(sizeof(struct wacom_wac), GFP_KERNEL);
|
||||
input_dev = input_allocate_device();
|
||||
if (!wacom || !input_dev || !wacom_wac)
|
||||
if (!wacom || !input_dev || !wacom_wac) {
|
||||
error = -ENOMEM;
|
||||
goto fail1;
|
||||
}
|
||||
|
||||
wacom_wac->data = usb_buffer_alloc(dev, WACOM_PKGLEN_MAX, GFP_KERNEL, &wacom->data_dma);
|
||||
if (!wacom_wac->data)
|
||||
wacom_wac->features = *((struct wacom_features *)id->driver_info);
|
||||
features = &wacom_wac->features;
|
||||
if (features->pktlen > WACOM_PKGLEN_MAX) {
|
||||
error = -EINVAL;
|
||||
goto fail1;
|
||||
}
|
||||
|
||||
wacom_wac->data = usb_buffer_alloc(dev, WACOM_PKGLEN_MAX,
|
||||
GFP_KERNEL, &wacom->data_dma);
|
||||
if (!wacom_wac->data) {
|
||||
error = -ENOMEM;
|
||||
goto fail1;
|
||||
}
|
||||
|
||||
wacom->irq = usb_alloc_urb(0, GFP_KERNEL);
|
||||
if (!wacom->irq)
|
||||
if (!wacom->irq) {
|
||||
error = -ENOMEM;
|
||||
goto fail2;
|
||||
}
|
||||
|
||||
wacom->usbdev = dev;
|
||||
wacom->dev = input_dev;
|
||||
@@ -558,11 +576,6 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
|
||||
usb_make_path(dev, wacom->phys, sizeof(wacom->phys));
|
||||
strlcat(wacom->phys, "/input0", sizeof(wacom->phys));
|
||||
|
||||
wacom_wac->features = features;
|
||||
BUG_ON(features->pktlen > WACOM_PKGLEN_MAX);
|
||||
|
||||
input_dev->name = wacom_wac->features->name;
|
||||
wacom->wacom_wac = wacom_wac;
|
||||
usb_to_input_id(dev, &input_dev->id);
|
||||
|
||||
input_dev->dev.parent = &intf->dev;
|
||||
@@ -579,6 +592,9 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
|
||||
if (error)
|
||||
goto fail2;
|
||||
|
||||
input_dev->name = features->name;
|
||||
wacom->wacom_wac = wacom_wac;
|
||||
|
||||
input_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
|
||||
input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOUCH);
|
||||
|
||||
@@ -643,7 +659,7 @@ static int wacom_suspend(struct usb_interface *intf, pm_message_t message)
|
||||
static int wacom_resume(struct usb_interface *intf)
|
||||
{
|
||||
struct wacom *wacom = usb_get_intfdata(intf);
|
||||
struct wacom_features *features = wacom->wacom_wac->features;
|
||||
struct wacom_features *features = &wacom->wacom_wac->features;
|
||||
int rv;
|
||||
|
||||
mutex_lock(&wacom->lock);
|
||||
|
||||
Reference in New Issue
Block a user