diff options
| -rw-r--r-- | drivers/hid/wacom_sys.c | 96 | ||||
| -rw-r--r-- | drivers/hid/wacom_wac.h | 1 |
2 files changed, 64 insertions, 33 deletions
diff --git a/drivers/hid/wacom_sys.c b/drivers/hid/wacom_sys.c index 97e1feffc6e4..62f3c899ab98 100644 --- a/drivers/hid/wacom_sys.c +++ b/drivers/hid/wacom_sys.c | |||
| @@ -1054,41 +1054,75 @@ static struct input_dev *wacom_allocate_input(struct wacom *wacom) | |||
| 1054 | return input_dev; | 1054 | return input_dev; |
| 1055 | } | 1055 | } |
| 1056 | 1056 | ||
| 1057 | static void wacom_unregister_inputs(struct wacom *wacom) | 1057 | static void wacom_free_inputs(struct wacom *wacom) |
| 1058 | { | 1058 | { |
| 1059 | if (wacom->wacom_wac.input) | 1059 | struct wacom_wac *wacom_wac = &(wacom->wacom_wac); |
| 1060 | input_unregister_device(wacom->wacom_wac.input); | 1060 | |
| 1061 | if (wacom->wacom_wac.pad_input) | 1061 | if (wacom_wac->input) |
| 1062 | input_unregister_device(wacom->wacom_wac.pad_input); | 1062 | input_free_device(wacom_wac->input); |
| 1063 | wacom->wacom_wac.input = NULL; | 1063 | if (wacom_wac->pad_input) |
| 1064 | wacom->wacom_wac.pad_input = NULL; | 1064 | input_free_device(wacom_wac->pad_input); |
| 1065 | wacom_destroy_leds(wacom); | 1065 | wacom_wac->input = NULL; |
| 1066 | wacom_wac->pad_input = NULL; | ||
| 1066 | } | 1067 | } |
| 1067 | 1068 | ||
| 1068 | static int wacom_register_inputs(struct wacom *wacom) | 1069 | static int wacom_allocate_inputs(struct wacom *wacom) |
| 1069 | { | 1070 | { |
| 1070 | struct input_dev *input_dev, *pad_input_dev; | 1071 | struct input_dev *input_dev, *pad_input_dev; |
| 1071 | struct wacom_wac *wacom_wac = &(wacom->wacom_wac); | 1072 | struct wacom_wac *wacom_wac = &(wacom->wacom_wac); |
| 1072 | int error; | ||
| 1073 | 1073 | ||
| 1074 | input_dev = wacom_allocate_input(wacom); | 1074 | input_dev = wacom_allocate_input(wacom); |
| 1075 | pad_input_dev = wacom_allocate_input(wacom); | 1075 | pad_input_dev = wacom_allocate_input(wacom); |
| 1076 | if (!input_dev || !pad_input_dev) { | 1076 | if (!input_dev || !pad_input_dev) { |
| 1077 | error = -ENOMEM; | 1077 | wacom_free_inputs(wacom); |
| 1078 | goto fail_allocate_input; | 1078 | return -ENOMEM; |
| 1079 | } | 1079 | } |
| 1080 | 1080 | ||
| 1081 | wacom_wac->input = input_dev; | 1081 | wacom_wac->input = input_dev; |
| 1082 | wacom_wac->pad_input = pad_input_dev; | 1082 | wacom_wac->pad_input = pad_input_dev; |
| 1083 | wacom_wac->pad_input->name = wacom_wac->pad_name; | 1083 | wacom_wac->pad_input->name = wacom_wac->pad_name; |
| 1084 | 1084 | ||
| 1085 | return 0; | ||
| 1086 | } | ||
| 1087 | |||
| 1088 | static void wacom_clean_inputs(struct wacom *wacom) | ||
| 1089 | { | ||
| 1090 | if (wacom->wacom_wac.input) { | ||
| 1091 | if (wacom->wacom_wac.input_registered) | ||
| 1092 | input_unregister_device(wacom->wacom_wac.input); | ||
| 1093 | else | ||
| 1094 | input_free_device(wacom->wacom_wac.input); | ||
| 1095 | } | ||
| 1096 | if (wacom->wacom_wac.pad_input) { | ||
| 1097 | if (wacom->wacom_wac.input_registered) | ||
| 1098 | input_unregister_device(wacom->wacom_wac.pad_input); | ||
| 1099 | else | ||
| 1100 | input_free_device(wacom->wacom_wac.pad_input); | ||
| 1101 | } | ||
| 1102 | wacom->wacom_wac.input = NULL; | ||
| 1103 | wacom->wacom_wac.pad_input = NULL; | ||
| 1104 | wacom_destroy_leds(wacom); | ||
| 1105 | } | ||
| 1106 | |||
| 1107 | static int wacom_register_inputs(struct wacom *wacom) | ||
| 1108 | { | ||
| 1109 | struct input_dev *input_dev, *pad_input_dev; | ||
| 1110 | struct wacom_wac *wacom_wac = &(wacom->wacom_wac); | ||
| 1111 | int error; | ||
| 1112 | |||
| 1113 | input_dev = wacom_wac->input; | ||
| 1114 | pad_input_dev = wacom_wac->pad_input; | ||
| 1115 | |||
| 1116 | if (!input_dev || !pad_input_dev) | ||
| 1117 | return -EINVAL; | ||
| 1118 | |||
| 1085 | error = wacom_setup_input_capabilities(input_dev, wacom_wac); | 1119 | error = wacom_setup_input_capabilities(input_dev, wacom_wac); |
| 1086 | if (error) | 1120 | if (error) |
| 1087 | goto fail_input_cap; | 1121 | return error; |
| 1088 | 1122 | ||
| 1089 | error = input_register_device(input_dev); | 1123 | error = input_register_device(input_dev); |
| 1090 | if (error) | 1124 | if (error) |
| 1091 | goto fail_register_input; | 1125 | return error; |
| 1092 | 1126 | ||
| 1093 | error = wacom_setup_pad_input_capabilities(pad_input_dev, wacom_wac); | 1127 | error = wacom_setup_pad_input_capabilities(pad_input_dev, wacom_wac); |
| 1094 | if (error) { | 1128 | if (error) { |
| @@ -1106,6 +1140,8 @@ static int wacom_register_inputs(struct wacom *wacom) | |||
| 1106 | goto fail_leds; | 1140 | goto fail_leds; |
| 1107 | } | 1141 | } |
| 1108 | 1142 | ||
| 1143 | wacom_wac->input_registered = true; | ||
| 1144 | |||
| 1109 | return 0; | 1145 | return 0; |
| 1110 | 1146 | ||
| 1111 | fail_leds: | 1147 | fail_leds: |
| @@ -1113,16 +1149,7 @@ fail_leds: | |||
| 1113 | pad_input_dev = NULL; | 1149 | pad_input_dev = NULL; |
| 1114 | fail_register_pad_input: | 1150 | fail_register_pad_input: |
| 1115 | input_unregister_device(input_dev); | 1151 | input_unregister_device(input_dev); |
| 1116 | input_dev = NULL; | ||
| 1117 | fail_register_input: | ||
| 1118 | fail_input_cap: | ||
| 1119 | wacom_wac->input = NULL; | 1152 | wacom_wac->input = NULL; |
| 1120 | wacom_wac->pad_input = NULL; | ||
| 1121 | fail_allocate_input: | ||
| 1122 | if (input_dev) | ||
| 1123 | input_free_device(input_dev); | ||
| 1124 | if (pad_input_dev) | ||
| 1125 | input_free_device(pad_input_dev); | ||
| 1126 | return error; | 1153 | return error; |
| 1127 | } | 1154 | } |
| 1128 | 1155 | ||
| @@ -1147,13 +1174,13 @@ static void wacom_wireless_work(struct work_struct *work) | |||
| 1147 | hdev1 = usb_get_intfdata(usbdev->config->interface[1]); | 1174 | hdev1 = usb_get_intfdata(usbdev->config->interface[1]); |
| 1148 | wacom1 = hid_get_drvdata(hdev1); | 1175 | wacom1 = hid_get_drvdata(hdev1); |
| 1149 | wacom_wac1 = &(wacom1->wacom_wac); | 1176 | wacom_wac1 = &(wacom1->wacom_wac); |
| 1150 | wacom_unregister_inputs(wacom1); | 1177 | wacom_clean_inputs(wacom1); |
| 1151 | 1178 | ||
| 1152 | /* Touch interface */ | 1179 | /* Touch interface */ |
| 1153 | hdev2 = usb_get_intfdata(usbdev->config->interface[2]); | 1180 | hdev2 = usb_get_intfdata(usbdev->config->interface[2]); |
| 1154 | wacom2 = hid_get_drvdata(hdev2); | 1181 | wacom2 = hid_get_drvdata(hdev2); |
| 1155 | wacom_wac2 = &(wacom2->wacom_wac); | 1182 | wacom_wac2 = &(wacom2->wacom_wac); |
| 1156 | wacom_unregister_inputs(wacom2); | 1183 | wacom_clean_inputs(wacom2); |
| 1157 | 1184 | ||
| 1158 | if (wacom_wac->pid == 0) { | 1185 | if (wacom_wac->pid == 0) { |
| 1159 | hid_info(wacom->hdev, "wireless tablet disconnected\n"); | 1186 | hid_info(wacom->hdev, "wireless tablet disconnected\n"); |
| @@ -1187,7 +1214,8 @@ static void wacom_wireless_work(struct work_struct *work) | |||
| 1187 | wacom_wac1->shared->touch_max = wacom_wac1->features.touch_max; | 1214 | wacom_wac1->shared->touch_max = wacom_wac1->features.touch_max; |
| 1188 | wacom_wac1->shared->type = wacom_wac1->features.type; | 1215 | wacom_wac1->shared->type = wacom_wac1->features.type; |
| 1189 | wacom_wac1->pid = wacom_wac->pid; | 1216 | wacom_wac1->pid = wacom_wac->pid; |
| 1190 | error = wacom_register_inputs(wacom1); | 1217 | error = wacom_allocate_inputs(wacom1) || |
| 1218 | wacom_register_inputs(wacom1); | ||
| 1191 | if (error) | 1219 | if (error) |
| 1192 | goto fail; | 1220 | goto fail; |
| 1193 | 1221 | ||
| @@ -1208,7 +1236,8 @@ static void wacom_wireless_work(struct work_struct *work) | |||
| 1208 | snprintf(wacom_wac2->pad_name, WACOM_NAME_MAX, | 1236 | snprintf(wacom_wac2->pad_name, WACOM_NAME_MAX, |
| 1209 | "%s (WL) Pad", wacom_wac2->features.name); | 1237 | "%s (WL) Pad", wacom_wac2->features.name); |
| 1210 | wacom_wac2->pid = wacom_wac->pid; | 1238 | wacom_wac2->pid = wacom_wac->pid; |
| 1211 | error = wacom_register_inputs(wacom2); | 1239 | error = wacom_allocate_inputs(wacom2) || |
| 1240 | wacom_register_inputs(wacom2); | ||
| 1212 | if (error) | 1241 | if (error) |
| 1213 | goto fail; | 1242 | goto fail; |
| 1214 | 1243 | ||
| @@ -1225,8 +1254,8 @@ static void wacom_wireless_work(struct work_struct *work) | |||
| 1225 | return; | 1254 | return; |
| 1226 | 1255 | ||
| 1227 | fail: | 1256 | fail: |
| 1228 | wacom_unregister_inputs(wacom1); | 1257 | wacom_clean_inputs(wacom1); |
| 1229 | wacom_unregister_inputs(wacom2); | 1258 | wacom_clean_inputs(wacom2); |
| 1230 | return; | 1259 | return; |
| 1231 | } | 1260 | } |
| 1232 | 1261 | ||
| @@ -1400,7 +1429,8 @@ static int wacom_probe(struct hid_device *hdev, | |||
| 1400 | } | 1429 | } |
| 1401 | 1430 | ||
| 1402 | if (!(features->quirks & WACOM_QUIRK_NO_INPUT)) { | 1431 | if (!(features->quirks & WACOM_QUIRK_NO_INPUT)) { |
| 1403 | error = wacom_register_inputs(wacom); | 1432 | error = wacom_allocate_inputs(wacom) || |
| 1433 | wacom_register_inputs(wacom); | ||
| 1404 | if (error) | 1434 | if (error) |
| 1405 | goto fail_register_inputs; | 1435 | goto fail_register_inputs; |
| 1406 | } | 1436 | } |
| @@ -1434,11 +1464,11 @@ static int wacom_probe(struct hid_device *hdev, | |||
| 1434 | return 0; | 1464 | return 0; |
| 1435 | 1465 | ||
| 1436 | fail_hw_start: | 1466 | fail_hw_start: |
| 1437 | wacom_unregister_inputs(wacom); | 1467 | wacom_clean_inputs(wacom); |
| 1438 | if (hdev->bus == BUS_BLUETOOTH) | 1468 | if (hdev->bus == BUS_BLUETOOTH) |
| 1439 | device_remove_file(&hdev->dev, &dev_attr_speed); | 1469 | device_remove_file(&hdev->dev, &dev_attr_speed); |
| 1440 | fail_register_inputs: | 1470 | fail_register_inputs: |
| 1441 | wacom_unregister_inputs(wacom); | 1471 | wacom_clean_inputs(wacom); |
| 1442 | wacom_destroy_battery(wacom); | 1472 | wacom_destroy_battery(wacom); |
| 1443 | fail_battery: | 1473 | fail_battery: |
| 1444 | wacom_remove_shared_data(wacom_wac); | 1474 | wacom_remove_shared_data(wacom_wac); |
| @@ -1458,7 +1488,7 @@ static void wacom_remove(struct hid_device *hdev) | |||
| 1458 | hid_hw_stop(hdev); | 1488 | hid_hw_stop(hdev); |
| 1459 | 1489 | ||
| 1460 | cancel_work_sync(&wacom->work); | 1490 | cancel_work_sync(&wacom->work); |
| 1461 | wacom_unregister_inputs(wacom); | 1491 | wacom_clean_inputs(wacom); |
| 1462 | if (hdev->bus == BUS_BLUETOOTH) | 1492 | if (hdev->bus == BUS_BLUETOOTH) |
| 1463 | device_remove_file(&hdev->dev, &dev_attr_speed); | 1493 | device_remove_file(&hdev->dev, &dev_attr_speed); |
| 1464 | wacom_destroy_battery(wacom); | 1494 | wacom_destroy_battery(wacom); |
diff --git a/drivers/hid/wacom_wac.h b/drivers/hid/wacom_wac.h index 339ab5d81a2d..72f9ca8e5cd4 100644 --- a/drivers/hid/wacom_wac.h +++ b/drivers/hid/wacom_wac.h | |||
| @@ -167,6 +167,7 @@ struct wacom_wac { | |||
| 167 | struct wacom_shared *shared; | 167 | struct wacom_shared *shared; |
| 168 | struct input_dev *input; | 168 | struct input_dev *input; |
| 169 | struct input_dev *pad_input; | 169 | struct input_dev *pad_input; |
| 170 | bool input_registered; | ||
| 170 | int pid; | 171 | int pid; |
| 171 | int battery_capacity; | 172 | int battery_capacity; |
| 172 | int num_contacts_left; | 173 | int num_contacts_left; |
