diff options
Diffstat (limited to 'drivers/input')
| -rw-r--r-- | drivers/input/tablet/wacom.h | 2 | ||||
| -rw-r--r-- | drivers/input/tablet/wacom_sys.c | 63 | ||||
| -rw-r--r-- | drivers/input/tablet/wacom_wac.c | 27 | ||||
| -rw-r--r-- | drivers/input/tablet/wacom_wac.h | 2 |
4 files changed, 85 insertions, 9 deletions
diff --git a/drivers/input/tablet/wacom.h b/drivers/input/tablet/wacom.h index 9ebf0ed3b3b3..caa59cab2c5f 100644 --- a/drivers/input/tablet/wacom.h +++ b/drivers/input/tablet/wacom.h | |||
| @@ -136,4 +136,6 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len); | |||
| 136 | void wacom_setup_device_quirks(struct wacom_features *features); | 136 | void wacom_setup_device_quirks(struct wacom_features *features); |
| 137 | int wacom_setup_input_capabilities(struct input_dev *input_dev, | 137 | int wacom_setup_input_capabilities(struct input_dev *input_dev, |
| 138 | struct wacom_wac *wacom_wac); | 138 | struct wacom_wac *wacom_wac); |
| 139 | int wacom_setup_pad_input_capabilities(struct input_dev *input_dev, | ||
| 140 | struct wacom_wac *wacom_wac); | ||
| 139 | #endif | 141 | #endif |
diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c index 7cd0886cddd2..b25848581fc1 100644 --- a/drivers/input/tablet/wacom_sys.c +++ b/drivers/input/tablet/wacom_sys.c | |||
| @@ -135,6 +135,9 @@ static int wacom_open(struct input_dev *dev) | |||
| 135 | 135 | ||
| 136 | mutex_lock(&wacom->lock); | 136 | mutex_lock(&wacom->lock); |
| 137 | 137 | ||
| 138 | if (wacom->open) | ||
| 139 | goto out; | ||
| 140 | |||
| 138 | if (usb_submit_urb(wacom->irq, GFP_KERNEL)) { | 141 | if (usb_submit_urb(wacom->irq, GFP_KERNEL)) { |
| 139 | retval = -EIO; | 142 | retval = -EIO; |
| 140 | goto out; | 143 | goto out; |
| @@ -157,9 +160,14 @@ static void wacom_close(struct input_dev *dev) | |||
| 157 | autopm_error = usb_autopm_get_interface(wacom->intf); | 160 | autopm_error = usb_autopm_get_interface(wacom->intf); |
| 158 | 161 | ||
| 159 | mutex_lock(&wacom->lock); | 162 | mutex_lock(&wacom->lock); |
| 163 | if (!wacom->open) | ||
| 164 | goto out; | ||
| 165 | |||
| 160 | usb_kill_urb(wacom->irq); | 166 | usb_kill_urb(wacom->irq); |
| 161 | wacom->open = false; | 167 | wacom->open = false; |
| 162 | wacom->intf->needs_remote_wakeup = 0; | 168 | wacom->intf->needs_remote_wakeup = 0; |
| 169 | |||
| 170 | out: | ||
| 163 | mutex_unlock(&wacom->lock); | 171 | mutex_unlock(&wacom->lock); |
| 164 | 172 | ||
| 165 | if (!autopm_error) | 173 | if (!autopm_error) |
| @@ -1112,19 +1120,16 @@ static void wacom_destroy_battery(struct wacom *wacom) | |||
| 1112 | } | 1120 | } |
| 1113 | } | 1121 | } |
| 1114 | 1122 | ||
| 1115 | static int wacom_register_input(struct wacom *wacom) | 1123 | static struct input_dev *wacom_allocate_input(struct wacom *wacom) |
| 1116 | { | 1124 | { |
| 1117 | struct input_dev *input_dev; | 1125 | struct input_dev *input_dev; |
| 1118 | struct usb_interface *intf = wacom->intf; | 1126 | struct usb_interface *intf = wacom->intf; |
| 1119 | struct usb_device *dev = interface_to_usbdev(intf); | 1127 | struct usb_device *dev = interface_to_usbdev(intf); |
| 1120 | struct wacom_wac *wacom_wac = &(wacom->wacom_wac); | 1128 | struct wacom_wac *wacom_wac = &(wacom->wacom_wac); |
| 1121 | int error; | ||
| 1122 | 1129 | ||
| 1123 | input_dev = input_allocate_device(); | 1130 | input_dev = input_allocate_device(); |
| 1124 | if (!input_dev) { | 1131 | if (!input_dev) |
| 1125 | error = -ENOMEM; | 1132 | return NULL; |
| 1126 | goto fail1; | ||
| 1127 | } | ||
| 1128 | 1133 | ||
| 1129 | input_dev->name = wacom_wac->name; | 1134 | input_dev->name = wacom_wac->name; |
| 1130 | input_dev->phys = wacom->phys; | 1135 | input_dev->phys = wacom->phys; |
| @@ -1134,21 +1139,59 @@ static int wacom_register_input(struct wacom *wacom) | |||
| 1134 | usb_to_input_id(dev, &input_dev->id); | 1139 | usb_to_input_id(dev, &input_dev->id); |
| 1135 | input_set_drvdata(input_dev, wacom); | 1140 | input_set_drvdata(input_dev, wacom); |
| 1136 | 1141 | ||
| 1142 | return input_dev; | ||
| 1143 | } | ||
| 1144 | |||
| 1145 | static int wacom_register_input(struct wacom *wacom) | ||
| 1146 | { | ||
| 1147 | struct input_dev *input_dev, *pad_input_dev; | ||
| 1148 | struct wacom_wac *wacom_wac = &(wacom->wacom_wac); | ||
| 1149 | int error; | ||
| 1150 | |||
| 1151 | input_dev = wacom_allocate_input(wacom); | ||
| 1152 | pad_input_dev = wacom_allocate_input(wacom); | ||
| 1153 | if (!input_dev || !pad_input_dev) { | ||
| 1154 | error = -ENOMEM; | ||
| 1155 | goto fail1; | ||
| 1156 | } | ||
| 1157 | |||
| 1137 | wacom_wac->input = input_dev; | 1158 | wacom_wac->input = input_dev; |
| 1159 | wacom_wac->pad_input = pad_input_dev; | ||
| 1160 | wacom_wac->pad_input->name = wacom_wac->pad_name; | ||
| 1161 | |||
| 1138 | error = wacom_setup_input_capabilities(input_dev, wacom_wac); | 1162 | error = wacom_setup_input_capabilities(input_dev, wacom_wac); |
| 1139 | if (error) | 1163 | if (error) |
| 1140 | goto fail1; | 1164 | goto fail2; |
| 1141 | 1165 | ||
| 1142 | error = input_register_device(input_dev); | 1166 | error = input_register_device(input_dev); |
| 1143 | if (error) | 1167 | if (error) |
| 1144 | goto fail2; | 1168 | goto fail2; |
| 1145 | 1169 | ||
| 1170 | error = wacom_setup_pad_input_capabilities(pad_input_dev, wacom_wac); | ||
| 1171 | if (error) { | ||
| 1172 | /* no pad in use on this interface */ | ||
| 1173 | input_free_device(pad_input_dev); | ||
| 1174 | wacom_wac->pad_input = NULL; | ||
| 1175 | pad_input_dev = NULL; | ||
| 1176 | } else { | ||
| 1177 | error = input_register_device(pad_input_dev); | ||
| 1178 | if (error) | ||
| 1179 | goto fail3; | ||
| 1180 | } | ||
| 1181 | |||
| 1146 | return 0; | 1182 | return 0; |
| 1147 | 1183 | ||
| 1184 | fail3: | ||
| 1185 | input_unregister_device(input_dev); | ||
| 1186 | input_dev = NULL; | ||
| 1148 | fail2: | 1187 | fail2: |
| 1149 | input_free_device(input_dev); | ||
| 1150 | wacom_wac->input = NULL; | 1188 | wacom_wac->input = NULL; |
| 1189 | wacom_wac->pad_input = NULL; | ||
| 1151 | fail1: | 1190 | fail1: |
| 1191 | if (input_dev) | ||
| 1192 | input_free_device(input_dev); | ||
| 1193 | if (pad_input_dev) | ||
| 1194 | input_free_device(pad_input_dev); | ||
| 1152 | return error; | 1195 | return error; |
| 1153 | } | 1196 | } |
| 1154 | 1197 | ||
| @@ -1367,6 +1410,8 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i | |||
| 1367 | wacom_calculate_res(features); | 1410 | wacom_calculate_res(features); |
| 1368 | 1411 | ||
| 1369 | strlcpy(wacom_wac->name, features->name, sizeof(wacom_wac->name)); | 1412 | strlcpy(wacom_wac->name, features->name, sizeof(wacom_wac->name)); |
| 1413 | snprintf(wacom_wac->pad_name, sizeof(wacom_wac->pad_name), | ||
| 1414 | "%s Pad", features->name); | ||
| 1370 | 1415 | ||
| 1371 | if (features->quirks & WACOM_QUIRK_MULTI_INPUT) { | 1416 | if (features->quirks & WACOM_QUIRK_MULTI_INPUT) { |
| 1372 | struct usb_device *other_dev; | 1417 | struct usb_device *other_dev; |
| @@ -1441,6 +1486,8 @@ static void wacom_disconnect(struct usb_interface *intf) | |||
| 1441 | cancel_work_sync(&wacom->work); | 1486 | cancel_work_sync(&wacom->work); |
| 1442 | if (wacom->wacom_wac.input) | 1487 | if (wacom->wacom_wac.input) |
| 1443 | input_unregister_device(wacom->wacom_wac.input); | 1488 | input_unregister_device(wacom->wacom_wac.input); |
| 1489 | if (wacom->wacom_wac.pad_input) | ||
| 1490 | input_unregister_device(wacom->wacom_wac.pad_input); | ||
| 1444 | wacom_destroy_battery(wacom); | 1491 | wacom_destroy_battery(wacom); |
| 1445 | wacom_destroy_leds(wacom); | 1492 | wacom_destroy_leds(wacom); |
| 1446 | usb_free_urb(wacom->irq); | 1493 | usb_free_urb(wacom->irq); |
diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c index 977d05cd9e2e..4b16a34c95fb 100644 --- a/drivers/input/tablet/wacom_wac.c +++ b/drivers/input/tablet/wacom_wac.c | |||
| @@ -1489,8 +1489,11 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len) | |||
| 1489 | break; | 1489 | break; |
| 1490 | } | 1490 | } |
| 1491 | 1491 | ||
| 1492 | if (sync) | 1492 | if (sync) { |
| 1493 | input_sync(wacom_wac->input); | 1493 | input_sync(wacom_wac->input); |
| 1494 | if (wacom_wac->pad_input) | ||
| 1495 | input_sync(wacom_wac->pad_input); | ||
| 1496 | } | ||
| 1494 | } | 1497 | } |
| 1495 | 1498 | ||
| 1496 | static void wacom_setup_cintiq(struct wacom_wac *wacom_wac) | 1499 | static void wacom_setup_cintiq(struct wacom_wac *wacom_wac) |
| @@ -1939,6 +1942,28 @@ int wacom_setup_input_capabilities(struct input_dev *input_dev, | |||
| 1939 | return 0; | 1942 | return 0; |
| 1940 | } | 1943 | } |
| 1941 | 1944 | ||
| 1945 | int wacom_setup_pad_input_capabilities(struct input_dev *input_dev, | ||
| 1946 | struct wacom_wac *wacom_wac) | ||
| 1947 | { | ||
| 1948 | struct wacom_features *features = &wacom_wac->features; | ||
| 1949 | |||
| 1950 | input_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); | ||
| 1951 | |||
| 1952 | /* kept for making legacy xf86-input-wacom working with the wheels */ | ||
| 1953 | __set_bit(ABS_MISC, input_dev->absbit); | ||
| 1954 | |||
| 1955 | /* kept for making legacy xf86-input-wacom accepting the pad */ | ||
| 1956 | input_set_abs_params(input_dev, ABS_X, 0, 1, 0, 0); | ||
| 1957 | input_set_abs_params(input_dev, ABS_Y, 0, 1, 0, 0); | ||
| 1958 | |||
| 1959 | switch (features->type) { | ||
| 1960 | default: | ||
| 1961 | /* no pad supported */ | ||
| 1962 | return 1; | ||
| 1963 | } | ||
| 1964 | return 0; | ||
| 1965 | } | ||
| 1966 | |||
| 1942 | static const struct wacom_features wacom_features_0x00 = | 1967 | static const struct wacom_features wacom_features_0x00 = |
| 1943 | { "Wacom Penpartner", WACOM_PKGLEN_PENPRTN, 5040, 3780, 255, | 1968 | { "Wacom Penpartner", WACOM_PKGLEN_PENPRTN, 5040, 3780, 255, |
| 1944 | 0, PENPARTNER, WACOM_PENPRTN_RES, WACOM_PENPRTN_RES }; | 1969 | 0, PENPARTNER, WACOM_PENPRTN_RES, WACOM_PENPRTN_RES }; |
diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h index b2c9a9c1b551..f48164c780f4 100644 --- a/drivers/input/tablet/wacom_wac.h +++ b/drivers/input/tablet/wacom_wac.h | |||
| @@ -150,6 +150,7 @@ struct wacom_shared { | |||
| 150 | 150 | ||
| 151 | struct wacom_wac { | 151 | struct wacom_wac { |
| 152 | char name[WACOM_NAME_MAX]; | 152 | char name[WACOM_NAME_MAX]; |
| 153 | char pad_name[WACOM_NAME_MAX]; | ||
| 153 | unsigned char *data; | 154 | unsigned char *data; |
| 154 | int tool[2]; | 155 | int tool[2]; |
| 155 | int id[2]; | 156 | int id[2]; |
| @@ -157,6 +158,7 @@ struct wacom_wac { | |||
| 157 | struct wacom_features features; | 158 | struct wacom_features features; |
| 158 | struct wacom_shared *shared; | 159 | struct wacom_shared *shared; |
| 159 | struct input_dev *input; | 160 | struct input_dev *input; |
| 161 | struct input_dev *pad_input; | ||
| 160 | int pid; | 162 | int pid; |
| 161 | int battery_capacity; | 163 | int battery_capacity; |
| 162 | int num_contacts_left; | 164 | int num_contacts_left; |
