wacom_sys.c 49.9 KB
Newer Older
1
/*
2
 * drivers/input/tablet/wacom_sys.c
3
 *
4
 *  USB Wacom tablet support - system specific code
5 6 7 8 9 10 11 12 13 14
 */

/*
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 */

#include "wacom_wac.h"
15
#include "wacom.h"
16
#include <linux/input/mt.h>
17

18
#define WAC_MSG_RETRIES		5
19

20
#define WAC_CMD_WL_LED_CONTROL	0x03
21 22 23
#define WAC_CMD_LED_CONTROL	0x20
#define WAC_CMD_ICON_START	0x21
#define WAC_CMD_ICON_XFER	0x23
24
#define WAC_CMD_ICON_BT_XFER	0x26
25
#define WAC_CMD_RETRIES		10
26 27 28
#define WAC_CMD_DELETE_PAIRING	0x20
#define WAC_CMD_UNPAIR_ALL	0xFF
#define WAC_REMOTE_SERIAL_MAX_STRLEN	9
29

30 31
#define DEV_ATTR_RW_PERM (S_IRUGO | S_IWUSR | S_IWGRP)
#define DEV_ATTR_WO_PERM (S_IWUSR | S_IWGRP)
32
#define DEV_ATTR_RO_PERM (S_IRUSR | S_IRGRP)
33

34 35
static int wacom_get_report(struct hid_device *hdev, u8 type, u8 *buf,
			    size_t size, unsigned int retries)
36
{
37 38 39
	int retval;

	do {
40
		retval = hid_hw_raw_request(hdev, buf[0], buf, size, type,
41
				HID_REQ_GET_REPORT);
42 43 44 45 46
	} while ((retval == -ETIMEDOUT || retval == -EAGAIN) && --retries);

	if (retval < 0)
		hid_err(hdev, "wacom_get_report: ran out of retries "
			"(last error = %d)\n", retval);
47 48

	return retval;
49 50
}

51 52
static int wacom_set_report(struct hid_device *hdev, u8 type, u8 *buf,
			    size_t size, unsigned int retries)
53
{
54 55 56
	int retval;

	do {
57
		retval = hid_hw_raw_request(hdev, buf[0], buf, size, type,
58
				HID_REQ_SET_REPORT);
59 60 61 62 63
	} while ((retval == -ETIMEDOUT || retval == -EAGAIN) && --retries);

	if (retval < 0)
		hid_err(hdev, "wacom_set_report: ran out of retries "
			"(last error = %d)\n", retval);
64 65

	return retval;
66 67
}

68 69
static int wacom_raw_event(struct hid_device *hdev, struct hid_report *report,
		u8 *raw_data, int size)
70
{
71
	struct wacom *wacom = hid_get_drvdata(hdev);
72

73 74
	if (size > WACOM_PKGLEN_MAX)
		return 1;
75

76
	memcpy(wacom->wacom_wac.data, raw_data, size);
77

78 79 80
	wacom_wac_irq(&wacom->wacom_wac, size);

	return 0;
81 82 83 84
}

static int wacom_open(struct input_dev *dev)
{
85
	struct wacom *wacom = input_get_drvdata(dev);
86

87
	return hid_hw_open(wacom->hdev);
88 89 90 91
}

static void wacom_close(struct input_dev *dev)
{
92
	struct wacom *wacom = input_get_drvdata(dev);
93

94
	hid_hw_close(wacom->hdev);
95 96
}

97
/*
98
 * Calculate the resolution of the X or Y axis using hidinput_calc_abs_res.
99 100
 */
static int wacom_calc_hid_res(int logical_extents, int physical_extents,
101
			       unsigned unit, int exponent)
102
{
103 104 105 106 107 108 109 110
	struct hid_field field = {
		.logical_maximum = logical_extents,
		.physical_maximum = physical_extents,
		.unit = unit,
		.unit_exponent = exponent,
	};

	return hidinput_calc_abs_res(&field, ABS_X);
111 112
}

113 114
static void wacom_feature_mapping(struct hid_device *hdev,
		struct hid_field *field, struct hid_usage *usage)
115
{
116 117
	struct wacom *wacom = hid_get_drvdata(hdev);
	struct wacom_features *features = &wacom->wacom_wac.features;
118
	struct hid_data *hid_data = &wacom->wacom_wac.hid_data;
119 120
	u8 *data;
	int ret;
121

122 123 124
	switch (usage->hid) {
	case HID_DG_CONTACTMAX:
		/* leave touch_max as is if predefined */
125 126 127 128 129 130 131
		if (!features->touch_max) {
			/* read manually */
			data = kzalloc(2, GFP_KERNEL);
			if (!data)
				break;
			data[0] = field->report->id;
			ret = wacom_get_report(hdev, HID_FEATURE_REPORT,
132 133
						data, 2, WAC_CMD_RETRIES);
			if (ret == 2) {
134
				features->touch_max = data[1];
135 136 137 138 139 140 141
			} else {
				features->touch_max = 16;
				hid_warn(hdev, "wacom_feature_mapping: "
					 "could not get HID_DG_CONTACTMAX, "
					 "defaulting to %d\n",
					  features->touch_max);
			}
142 143
			kfree(data);
		}
144
		break;
145 146 147 148 149 150 151 152 153 154
	case HID_DG_INPUTMODE:
		/* Ignore if value index is out of bounds. */
		if (usage->usage_index >= field->report_count) {
			dev_err(&hdev->dev, "HID_DG_INPUTMODE out of range\n");
			break;
		}

		hid_data->inputmode = field->report->id;
		hid_data->inputmode_index = usage->usage_index;
		break;
155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173

	case HID_UP_DIGITIZER:
		if (field->report->id == 0x0B &&
		    (field->application == WACOM_G9_DIGITIZER ||
		     field->application == WACOM_G11_DIGITIZER)) {
			wacom->wacom_wac.mode_report = field->report->id;
			wacom->wacom_wac.mode_value = 0;
		}
		break;

	case WACOM_G9_PAGE:
	case WACOM_G11_PAGE:
		if (field->report->id == 0x03 &&
		    (field->application == WACOM_G9_TOUCHSCREEN ||
		     field->application == WACOM_G11_TOUCHSCREEN)) {
			wacom->wacom_wac.mode_report = field->report->id;
			wacom->wacom_wac.mode_value = 0;
		}
		break;
174 175 176
	}
}

177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
/*
 * Interface Descriptor of wacom devices can be incomplete and
 * inconsistent so wacom_features table is used to store stylus
 * device's packet lengths, various maximum values, and tablet
 * resolution based on product ID's.
 *
 * For devices that contain 2 interfaces, wacom_features table is
 * inaccurate for the touch interface.  Since the Interface Descriptor
 * for touch interfaces has pretty complete data, this function exists
 * to query tablet for this missing information instead of hard coding in
 * an additional table.
 *
 * A typical Interface Descriptor for a stylus will contain a
 * boot mouse application collection that is not of interest and this
 * function will ignore it.
 *
 * It also contains a digitizer application collection that also is not
 * of interest since any information it contains would be duplicate
 * of what is in wacom_features. Usually it defines a report of an array
 * of bytes that could be used as max length of the stylus packet returned.
 * If it happens to define a Digitizer-Stylus Physical Collection then
 * the X and Y logical values contain valid data but it is ignored.
 *
 * A typical Interface Descriptor for a touch interface will contain a
 * Digitizer-Finger Physical Collection which will define both logical
 * X/Y maximum as well as the physical size of tablet. Since touch
 * interfaces haven't supported pressure or distance, this is enough
 * information to override invalid values in the wacom_features table.
205
 *
206 207
 * Intuos5 touch interface and 3rd gen Bamboo Touch do not contain useful
 * data. We deal with them after returning from this function.
208
 */
209 210
static void wacom_usage_mapping(struct hid_device *hdev,
		struct hid_field *field, struct hid_usage *usage)
211
{
212 213
	struct wacom *wacom = hid_get_drvdata(hdev);
	struct wacom_features *features = &wacom->wacom_wac.features;
214 215
	bool finger = WACOM_FINGER_FIELD(field);
	bool pen = WACOM_PEN_FIELD(field);
216

217 218 219 220 221
	/*
	* Requiring Stylus Usage will ignore boot mouse
	* X/Y values and some cases of invalid Digitizer X/Y
	* values commonly reported.
	*/
222
	if (pen)
223
		features->device_type |= WACOM_DEVICETYPE_PEN;
224
	else if (finger)
225
		features->device_type |= WACOM_DEVICETYPE_TOUCH;
226
	else
227 228
		return;

229 230 231 232
	/*
	 * Bamboo models do not support HID_DG_CONTACTMAX.
	 * And, Bamboo Pen only descriptor contains touch.
	 */
233
	if (features->type > BAMBOO_PT) {
234 235 236 237
		/* ISDv4 touch devices at least supports one touch point */
		if (finger && !features->touch_max)
			features->touch_max = 1;
	}
238 239 240 241 242 243

	switch (usage->hid) {
	case HID_GD_X:
		features->x_max = field->logical_maximum;
		if (finger) {
			features->x_phy = field->physical_maximum;
244 245
			if ((features->type != BAMBOO_PT) &&
			    (features->type != BAMBOO_TOUCH)) {
246 247
				features->unit = field->unit;
				features->unitExpo = field->unit_exponent;
248
			}
249 250 251 252 253 254
		}
		break;
	case HID_GD_Y:
		features->y_max = field->logical_maximum;
		if (finger) {
			features->y_phy = field->physical_maximum;
255 256
			if ((features->type != BAMBOO_PT) &&
			    (features->type != BAMBOO_TOUCH)) {
257 258 259 260 261 262 263 264 265 266
				features->unit = field->unit;
				features->unitExpo = field->unit_exponent;
			}
		}
		break;
	case HID_DG_TIPPRESSURE:
		if (pen)
			features->pressure_max = field->logical_maximum;
		break;
	}
267 268 269

	if (features->type == HID_GENERIC)
		wacom_wac_usage_mapping(hdev, field, usage);
270
}
271

272 273 274 275 276 277 278 279 280
static void wacom_post_parse_hid(struct hid_device *hdev,
				 struct wacom_features *features)
{
	struct wacom *wacom = hid_get_drvdata(hdev);
	struct wacom_wac *wacom_wac = &wacom->wacom_wac;

	if (features->type == HID_GENERIC) {
		/* Any last-minute generic device setup */
		if (features->touch_max > 1) {
281
			input_mt_init_slots(wacom_wac->touch_input, wacom_wac->features.touch_max,
282 283 284 285 286
				    INPUT_MT_DIRECT);
		}
	}
}

287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304
static void wacom_parse_hid(struct hid_device *hdev,
			   struct wacom_features *features)
{
	struct hid_report_enum *rep_enum;
	struct hid_report *hreport;
	int i, j;

	/* check features first */
	rep_enum = &hdev->report_enum[HID_FEATURE_REPORT];
	list_for_each_entry(hreport, &rep_enum->report_list, list) {
		for (i = 0; i < hreport->maxfield; i++) {
			/* Ignore if report count is out of bounds. */
			if (hreport->field[i]->report_count < 1)
				continue;

			for (j = 0; j < hreport->field[i]->maxusage; j++) {
				wacom_feature_mapping(hdev, hreport->field[i],
						hreport->field[i]->usage + j);
305
			}
306 307 308
		}
	}

309 310 311 312 313 314 315 316 317 318 319 320
	/* now check the input usages */
	rep_enum = &hdev->report_enum[HID_INPUT_REPORT];
	list_for_each_entry(hreport, &rep_enum->report_list, list) {

		if (!hreport->maxfield)
			continue;

		for (i = 0; i < hreport->maxfield; i++)
			for (j = 0; j < hreport->field[i]->maxusage; j++)
				wacom_usage_mapping(hdev, hreport->field[i],
						hreport->field[i]->usage + j);
	}
321 322

	wacom_post_parse_hid(hdev, features);
323 324
}

325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343
static int wacom_hid_set_device_mode(struct hid_device *hdev)
{
	struct wacom *wacom = hid_get_drvdata(hdev);
	struct hid_data *hid_data = &wacom->wacom_wac.hid_data;
	struct hid_report *r;
	struct hid_report_enum *re;

	if (hid_data->inputmode < 0)
		return 0;

	re = &(hdev->report_enum[HID_FEATURE_REPORT]);
	r = re->report_id_hash[hid_data->inputmode];
	if (r) {
		r->field[0]->value[hid_data->inputmode_index] = 2;
		hid_hw_request(hdev, r, HID_REQ_SET_REPORT);
	}
	return 0;
}

344 345
static int wacom_set_device_mode(struct hid_device *hdev,
				 struct wacom_wac *wacom_wac)
346
{
347 348 349 350
	u8 *rep_data;
	struct hid_report *r;
	struct hid_report_enum *re;
	int length;
351
	int error = -ENOMEM, limit = 0;
352

353 354 355 356 357 358 359 360 361
	if (wacom_wac->mode_report < 0)
		return 0;

	re = &(hdev->report_enum[HID_FEATURE_REPORT]);
	r = re->report_id_hash[wacom_wac->mode_report];
	if (!r)
		return -EINVAL;

	rep_data = hid_alloc_report_buf(r, GFP_KERNEL);
362
	if (!rep_data)
363 364 365
		return -ENOMEM;

	length = hid_report_len(r);
366

367
	do {
368 369
		rep_data[0] = wacom_wac->mode_report;
		rep_data[1] = wacom_wac->mode_value;
370

371 372
		error = wacom_set_report(hdev, HID_FEATURE_REPORT, rep_data,
					 length, 1);
373
		if (error >= 0)
374
			error = wacom_get_report(hdev, HID_FEATURE_REPORT,
375
			                         rep_data, length, 1);
376 377 378
	} while (error >= 0 &&
		 rep_data[1] != wacom_wac->mode_report &&
		 limit++ < WAC_MSG_RETRIES);
379 380 381 382 383 384

	kfree(rep_data);

	return error < 0 ? error : 0;
}

385 386 387
static int wacom_bt_query_tablet_data(struct hid_device *hdev, u8 speed,
		struct wacom_features *features)
{
388 389 390 391 392 393 394 395
	struct wacom *wacom = hid_get_drvdata(hdev);
	int ret;
	u8 rep_data[2];

	switch (features->type) {
	case GRAPHIRE_BT:
		rep_data[0] = 0x03;
		rep_data[1] = 0x00;
396 397
		ret = wacom_set_report(hdev, HID_FEATURE_REPORT, rep_data, 2,
					3);
398 399 400 401 402 403

		if (ret >= 0) {
			rep_data[0] = speed == 0 ? 0x05 : 0x06;
			rep_data[1] = 0x00;

			ret = wacom_set_report(hdev, HID_FEATURE_REPORT,
404
						rep_data, 2, 3);
405 406 407 408 409 410 411 412 413 414 415 416 417 418

			if (ret >= 0) {
				wacom->wacom_wac.bt_high_speed = speed;
				return 0;
			}
		}

		/*
		 * Note that if the raw queries fail, it's not a hard failure
		 * and it is safe to continue
		 */
		hid_warn(hdev, "failed to poke device, command %d, err %d\n",
			 rep_data[0], ret);
		break;
419 420 421 422 423 424 425 426 427
	case INTUOS4WL:
		if (speed == 1)
			wacom->wacom_wac.bt_features &= ~0x20;
		else
			wacom->wacom_wac.bt_features |= 0x20;

		rep_data[0] = 0x03;
		rep_data[1] = wacom->wacom_wac.bt_features;

428 429
		ret = wacom_set_report(hdev, HID_FEATURE_REPORT, rep_data, 2,
					1);
430 431 432
		if (ret >= 0)
			wacom->wacom_wac.bt_high_speed = speed;
		break;
433 434
	}

435 436 437
	return 0;
}

438 439 440 441 442 443 444
/*
 * Switch the tablet into its most-capable mode. Wacom tablets are
 * typically configured to power-up in a mode which sends mouse-like
 * reports to the OS. To get absolute position, pressure data, etc.
 * from the tablet, it is necessary to switch the tablet out of this
 * mode and into one which sends the full range of tablet data.
 */
445 446
static int wacom_query_tablet_data(struct hid_device *hdev,
		struct wacom_features *features)
447
{
448 449 450
	struct wacom *wacom = hid_get_drvdata(hdev);
	struct wacom_wac *wacom_wac = &wacom->wacom_wac;

451 452 453
	if (hdev->bus == BUS_BLUETOOTH)
		return wacom_bt_query_tablet_data(hdev, 1, features);

454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474
	if (features->type != HID_GENERIC) {
		if (features->device_type & WACOM_DEVICETYPE_TOUCH) {
			if (features->type > TABLETPC) {
				/* MT Tablet PC touch */
				wacom_wac->mode_report = 3;
				wacom_wac->mode_value = 4;
			} else if (features->type == WACOM_24HDT) {
				wacom_wac->mode_report = 18;
				wacom_wac->mode_value = 2;
			} else if (features->type == WACOM_27QHDT) {
				wacom_wac->mode_report = 131;
				wacom_wac->mode_value = 2;
			} else if (features->type == BAMBOO_PAD) {
				wacom_wac->mode_report = 2;
				wacom_wac->mode_value = 2;
			}
		} else if (features->device_type & WACOM_DEVICETYPE_PEN) {
			if (features->type <= BAMBOO_PT) {
				wacom_wac->mode_report = 2;
				wacom_wac->mode_value = 2;
			}
475
		}
476
	}
477

478 479 480 481 482
	wacom_set_device_mode(hdev, wacom_wac);

	if (features->type == HID_GENERIC)
		return wacom_hid_set_device_mode(hdev);

483
	return 0;
484 485
}

486
static void wacom_retrieve_hid_descriptor(struct hid_device *hdev,
487
					 struct wacom_features *features)
488
{
489 490
	struct wacom *wacom = hid_get_drvdata(hdev);
	struct usb_interface *intf = wacom->intf;
491

492 493 494 495
	/* default features */
	features->x_fuzz = 4;
	features->y_fuzz = 4;
	features->pressure_fuzz = 0;
496 497
	features->distance_fuzz = 1;
	features->tilt_fuzz = 1;
498

499 500 501 502 503 504 505
	/*
	 * The wireless device HID is basic and layout conflicts with
	 * other tablets (monitor and touch interface can look like pen).
	 * Skip the query for this type and modify defaults based on
	 * interface number.
	 */
	if (features->type == WIRELESS) {
506
		if (intf->cur_altsetting->desc.bInterfaceNumber == 0)
507
			features->device_type = WACOM_DEVICETYPE_WL_MONITOR;
508
		else
509
			features->device_type = WACOM_DEVICETYPE_NONE;
510
		return;
511 512
	}

513
	wacom_parse_hid(hdev, features);
514 515
}

516
struct wacom_hdev_data {
517 518
	struct list_head list;
	struct kref kref;
519
	struct hid_device *dev;
520 521 522 523 524 525
	struct wacom_shared shared;
};

static LIST_HEAD(wacom_udev_list);
static DEFINE_MUTEX(wacom_udev_list_lock);

526 527
static bool wacom_are_sibling(struct hid_device *hdev,
		struct hid_device *sibling)
528
{
529 530 531 532 533 534 535 536 537 538
	struct wacom *wacom = hid_get_drvdata(hdev);
	struct wacom_features *features = &wacom->wacom_wac.features;
	int vid = features->oVid;
	int pid = features->oPid;
	int n1,n2;

	if (vid == 0 && pid == 0) {
		vid = hdev->vendor;
		pid = hdev->product;
	}
539

540 541
	if (vid != sibling->vendor || pid != sibling->product)
		return false;
542

543 544 545 546 547
	/* Compare the physical path. */
	n1 = strrchr(hdev->phys, '.') - hdev->phys;
	n2 = strrchr(sibling->phys, '.') - sibling->phys;
	if (n1 != n2 || n1 <= 0 || n2 <= 0)
		return false;
548

549
	return !strncmp(hdev->phys, sibling->phys, n1);
550 551
}

552
static struct wacom_hdev_data *wacom_get_hdev_data(struct hid_device *hdev)
553
{
554
	struct wacom_hdev_data *data;
555 556

	list_for_each_entry(data, &wacom_udev_list, list) {
557
		if (wacom_are_sibling(hdev, data->dev)) {
558 559 560 561 562 563 564 565
			kref_get(&data->kref);
			return data;
		}
	}

	return NULL;
}

566
static int wacom_add_shared_data(struct hid_device *hdev)
567
{
568 569 570
	struct wacom *wacom = hid_get_drvdata(hdev);
	struct wacom_wac *wacom_wac = &wacom->wacom_wac;
	struct wacom_hdev_data *data;
571 572 573 574
	int retval = 0;

	mutex_lock(&wacom_udev_list_lock);

575
	data = wacom_get_hdev_data(hdev);
576
	if (!data) {
577
		data = kzalloc(sizeof(struct wacom_hdev_data), GFP_KERNEL);
578 579 580 581 582 583
		if (!data) {
			retval = -ENOMEM;
			goto out;
		}

		kref_init(&data->kref);
584
		data->dev = hdev;
585 586 587
		list_add_tail(&data->list, &wacom_udev_list);
	}

588
	wacom_wac->shared = &data->shared;
589

590
	if (wacom_wac->features.device_type & WACOM_DEVICETYPE_TOUCH)
591
		wacom_wac->shared->touch = hdev;
592
	else if (wacom_wac->features.device_type & WACOM_DEVICETYPE_PEN)
593 594
		wacom_wac->shared->pen = hdev;

595 596 597 598 599 600 601
out:
	mutex_unlock(&wacom_udev_list_lock);
	return retval;
}

static void wacom_release_shared_data(struct kref *kref)
{
602 603
	struct wacom_hdev_data *data =
		container_of(kref, struct wacom_hdev_data, kref);
604 605 606 607 608 609 610 611

	mutex_lock(&wacom_udev_list_lock);
	list_del(&data->list);
	mutex_unlock(&wacom_udev_list_lock);

	kfree(data);
}

612
static void wacom_remove_shared_data(struct wacom *wacom)
613
{
614
	struct wacom_hdev_data *data;
615 616 617 618 619 620 621 622 623 624
	struct wacom_wac *wacom_wac = &wacom->wacom_wac;

	if (wacom_wac->shared) {
		data = container_of(wacom_wac->shared, struct wacom_hdev_data,
				    shared);

		if (wacom_wac->shared->touch == wacom->hdev)
			wacom_wac->shared->touch = NULL;
		else if (wacom_wac->shared->pen == wacom->hdev)
			wacom_wac->shared->pen = NULL;
625 626

		kref_put(&data->kref, wacom_release_shared_data);
627
		wacom_wac->shared = NULL;
628 629 630
	}
}

631 632 633
static int wacom_led_control(struct wacom *wacom)
{
	unsigned char *buf;
634
	int retval;
635 636
	unsigned char report_id = WAC_CMD_LED_CONTROL;
	int buf_size = 9;
637

638 639 640 641 642
	if (wacom->wacom_wac.pid) { /* wireless connected */
		report_id = WAC_CMD_WL_LED_CONTROL;
		buf_size = 13;
	}
	buf = kzalloc(buf_size, GFP_KERNEL);
643 644 645
	if (!buf)
		return -ENOMEM;

646
	if (wacom->wacom_wac.features.type >= INTUOS5S &&
647
	    wacom->wacom_wac.features.type <= INTUOSPL) {
648 649 650 651 652 653 654 655
		/*
		 * Touch Ring and crop mark LED luminance may take on
		 * one of four values:
		 *    0 = Low; 1 = Medium; 2 = High; 3 = Off
		 */
		int ring_led = wacom->led.select[0] & 0x03;
		int ring_lum = (((wacom->led.llv & 0x60) >> 5) - 1) & 0x03;
		int crop_lum = 0;
656 657 658 659 660 661 662 663 664 665
		unsigned char led_bits = (crop_lum << 4) | (ring_lum << 2) | (ring_led);

		buf[0] = report_id;
		if (wacom->wacom_wac.pid) {
			wacom_get_report(wacom->hdev, HID_FEATURE_REPORT,
					 buf, buf_size, WAC_CMD_RETRIES);
			buf[0] = report_id;
			buf[4] = led_bits;
		} else
			buf[1] = led_bits;
666 667 668 669 670 671 672 673
	}
	else {
		int led = wacom->led.select[0] | 0x4;

		if (wacom->wacom_wac.features.type == WACOM_21UX2 ||
		    wacom->wacom_wac.features.type == WACOM_24HD)
			led |= (wacom->led.select[1] << 4) | 0x40;

674
		buf[0] = report_id;
675 676 677 678 679
		buf[1] = led;
		buf[2] = wacom->led.llv;
		buf[3] = wacom->led.hlv;
		buf[4] = wacom->led.img_lum;
	}
680

681
	retval = wacom_set_report(wacom->hdev, HID_FEATURE_REPORT, buf, buf_size,
682
				  WAC_CMD_RETRIES);
683 684 685 686 687
	kfree(buf);

	return retval;
}

688 689
static int wacom_led_putimage(struct wacom *wacom, int button_id, u8 xfer_id,
		const unsigned len, const void *img)
690 691 692
{
	unsigned char *buf;
	int i, retval;
693
	const unsigned chunk_len = len / 4; /* 4 chunks are needed to be sent */
694

695
	buf = kzalloc(chunk_len + 3 , GFP_KERNEL);
696 697 698 699 700 701
	if (!buf)
		return -ENOMEM;

	/* Send 'start' command */
	buf[0] = WAC_CMD_ICON_START;
	buf[1] = 1;
702 703
	retval = wacom_set_report(wacom->hdev, HID_FEATURE_REPORT, buf, 2,
				  WAC_CMD_RETRIES);
704 705 706
	if (retval < 0)
		goto out;

707
	buf[0] = xfer_id;
708 709 710
	buf[1] = button_id & 0x07;
	for (i = 0; i < 4; i++) {
		buf[2] = i;
711
		memcpy(buf + 3, img + i * chunk_len, chunk_len);
712

713
		retval = wacom_set_report(wacom->hdev, HID_FEATURE_REPORT,
714
					  buf, chunk_len + 3, WAC_CMD_RETRIES);
715 716 717 718 719 720 721
		if (retval < 0)
			break;
	}

	/* Send 'stop' */
	buf[0] = WAC_CMD_ICON_START;
	buf[1] = 0;
722 723
	wacom_set_report(wacom->hdev, HID_FEATURE_REPORT, buf, 2,
			 WAC_CMD_RETRIES);
724 725 726 727 728 729

out:
	kfree(buf);
	return retval;
}

730
static ssize_t wacom_led_select_store(struct device *dev, int set_id,
731 732
				      const char *buf, size_t count)
{
G
Geliang Tang 已提交
733
	struct hid_device *hdev = to_hid_device(dev);
734
	struct wacom *wacom = hid_get_drvdata(hdev);
735 736 737 738 739 740 741 742 743
	unsigned int id;
	int err;

	err = kstrtouint(buf, 10, &id);
	if (err)
		return err;

	mutex_lock(&wacom->lock);

744
	wacom->led.select[set_id] = id & 0x3;
745 746 747 748 749 750 751
	err = wacom_led_control(wacom);

	mutex_unlock(&wacom->lock);

	return err < 0 ? err : count;
}

752 753 754 755 756 757
#define DEVICE_LED_SELECT_ATTR(SET_ID)					\
static ssize_t wacom_led##SET_ID##_select_store(struct device *dev,	\
	struct device_attribute *attr, const char *buf, size_t count)	\
{									\
	return wacom_led_select_store(dev, SET_ID, buf, count);		\
}									\
758 759 760
static ssize_t wacom_led##SET_ID##_select_show(struct device *dev,	\
	struct device_attribute *attr, char *buf)			\
{									\
G
Geliang Tang 已提交
761
	struct hid_device *hdev = to_hid_device(dev);\
762
	struct wacom *wacom = hid_get_drvdata(hdev);			\
P
Ping Cheng 已提交
763 764
	return scnprintf(buf, PAGE_SIZE, "%d\n",			\
			 wacom->led.select[SET_ID]);			\
765
}									\
766
static DEVICE_ATTR(status_led##SET_ID##_select, DEV_ATTR_RW_PERM,	\
767
		    wacom_led##SET_ID##_select_show,			\
768 769 770 771
		    wacom_led##SET_ID##_select_store)

DEVICE_LED_SELECT_ATTR(0);
DEVICE_LED_SELECT_ATTR(1);
772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796

static ssize_t wacom_luminance_store(struct wacom *wacom, u8 *dest,
				     const char *buf, size_t count)
{
	unsigned int value;
	int err;

	err = kstrtouint(buf, 10, &value);
	if (err)
		return err;

	mutex_lock(&wacom->lock);

	*dest = value & 0x7f;
	err = wacom_led_control(wacom);

	mutex_unlock(&wacom->lock);

	return err < 0 ? err : count;
}

#define DEVICE_LUMINANCE_ATTR(name, field)				\
static ssize_t wacom_##name##_luminance_store(struct device *dev,	\
	struct device_attribute *attr, const char *buf, size_t count)	\
{									\
G
Geliang Tang 已提交
797
	struct hid_device *hdev = to_hid_device(dev);\
798
	struct wacom *wacom = hid_get_drvdata(hdev);			\
799 800 801 802
									\
	return wacom_luminance_store(wacom, &wacom->led.field,		\
				     buf, count);			\
}									\
P
Ping Cheng 已提交
803 804 805 806 807 808
static ssize_t wacom_##name##_luminance_show(struct device *dev,	\
	struct device_attribute *attr, char *buf)			\
{									\
	struct wacom *wacom = dev_get_drvdata(dev);			\
	return scnprintf(buf, PAGE_SIZE, "%d\n", wacom->led.field);	\
}									\
809
static DEVICE_ATTR(name##_luminance, DEV_ATTR_RW_PERM,			\
P
Ping Cheng 已提交
810 811
		   wacom_##name##_luminance_show,			\
		   wacom_##name##_luminance_store)
812 813 814 815 816 817 818 819

DEVICE_LUMINANCE_ATTR(status0, llv);
DEVICE_LUMINANCE_ATTR(status1, hlv);
DEVICE_LUMINANCE_ATTR(buttons, img_lum);

static ssize_t wacom_button_image_store(struct device *dev, int button_id,
					const char *buf, size_t count)
{
G
Geliang Tang 已提交
820
	struct hid_device *hdev = to_hid_device(dev);
821
	struct wacom *wacom = hid_get_drvdata(hdev);
822
	int err;
823 824 825 826 827 828 829 830 831 832
	unsigned len;
	u8 xfer_id;

	if (hdev->bus == BUS_BLUETOOTH) {
		len = 256;
		xfer_id = WAC_CMD_ICON_BT_XFER;
	} else {
		len = 1024;
		xfer_id = WAC_CMD_ICON_XFER;
	}
833

834
	if (count != len)
835 836 837 838
		return -EINVAL;

	mutex_lock(&wacom->lock);

839
	err = wacom_led_putimage(wacom, button_id, xfer_id, len, buf);
840 841 842 843 844 845 846 847 848 849 850 851

	mutex_unlock(&wacom->lock);

	return err < 0 ? err : count;
}

#define DEVICE_BTNIMG_ATTR(BUTTON_ID)					\
static ssize_t wacom_btnimg##BUTTON_ID##_store(struct device *dev,	\
	struct device_attribute *attr, const char *buf, size_t count)	\
{									\
	return wacom_button_image_store(dev, BUTTON_ID, buf, count);	\
}									\
852
static DEVICE_ATTR(button##BUTTON_ID##_rawimg, DEV_ATTR_WO_PERM,	\
853 854 855 856 857 858 859 860 861 862 863
		   NULL, wacom_btnimg##BUTTON_ID##_store)

DEVICE_BTNIMG_ATTR(0);
DEVICE_BTNIMG_ATTR(1);
DEVICE_BTNIMG_ATTR(2);
DEVICE_BTNIMG_ATTR(3);
DEVICE_BTNIMG_ATTR(4);
DEVICE_BTNIMG_ATTR(5);
DEVICE_BTNIMG_ATTR(6);
DEVICE_BTNIMG_ATTR(7);

864 865 866 867 868 869 870 871 872 873 874 875
static struct attribute *cintiq_led_attrs[] = {
	&dev_attr_status_led0_select.attr,
	&dev_attr_status_led1_select.attr,
	NULL
};

static struct attribute_group cintiq_led_attr_group = {
	.name = "wacom_led",
	.attrs = cintiq_led_attrs,
};

static struct attribute *intuos4_led_attrs[] = {
876 877
	&dev_attr_status0_luminance.attr,
	&dev_attr_status1_luminance.attr,
878
	&dev_attr_status_led0_select.attr,
879 880 881 882 883 884 885 886 887 888 889 890
	&dev_attr_buttons_luminance.attr,
	&dev_attr_button0_rawimg.attr,
	&dev_attr_button1_rawimg.attr,
	&dev_attr_button2_rawimg.attr,
	&dev_attr_button3_rawimg.attr,
	&dev_attr_button4_rawimg.attr,
	&dev_attr_button5_rawimg.attr,
	&dev_attr_button6_rawimg.attr,
	&dev_attr_button7_rawimg.attr,
	NULL
};

891
static struct attribute_group intuos4_led_attr_group = {
892
	.name = "wacom_led",
893
	.attrs = intuos4_led_attrs,
894 895
};

896 897 898 899 900 901 902 903 904 905 906
static struct attribute *intuos5_led_attrs[] = {
	&dev_attr_status0_luminance.attr,
	&dev_attr_status_led0_select.attr,
	NULL
};

static struct attribute_group intuos5_led_attr_group = {
	.name = "wacom_led",
	.attrs = intuos5_led_attrs,
};

907 908 909 910
static int wacom_initialize_leds(struct wacom *wacom)
{
	int error;

911 912 913
	if (!(wacom->wacom_wac.features.device_type & WACOM_DEVICETYPE_PAD))
		return 0;

914 915
	/* Initialize default values */
	switch (wacom->wacom_wac.features.type) {
916
	case INTUOS4S:
917
	case INTUOS4:
918
	case INTUOS4WL:
919 920 921
	case INTUOS4L:
		wacom->led.select[0] = 0;
		wacom->led.select[1] = 0;
922
		wacom->led.llv = 10;
923 924
		wacom->led.hlv = 20;
		wacom->led.img_lum = 10;
925
		error = sysfs_create_group(&wacom->hdev->dev.kobj,
926 927 928
					   &intuos4_led_attr_group);
		break;

929
	case WACOM_24HD:
930 931 932 933 934 935
	case WACOM_21UX2:
		wacom->led.select[0] = 0;
		wacom->led.select[1] = 0;
		wacom->led.llv = 0;
		wacom->led.hlv = 0;
		wacom->led.img_lum = 0;
936

937
		error = sysfs_create_group(&wacom->hdev->dev.kobj,
938 939 940
					   &cintiq_led_attr_group);
		break;

941 942 943
	case INTUOS5S:
	case INTUOS5:
	case INTUOS5L:
944 945 946
	case INTUOSPS:
	case INTUOSPM:
	case INTUOSPL:
947 948 949 950 951 952 953 954
		wacom->led.select[0] = 0;
		wacom->led.select[1] = 0;
		wacom->led.llv = 32;
		wacom->led.hlv = 0;
		wacom->led.img_lum = 0;

		error = sysfs_create_group(&wacom->hdev->dev.kobj,
					  &intuos5_led_attr_group);
955 956
		break;

957 958
	default:
		return 0;
959 960
	}

961
	if (error) {
962
		hid_err(wacom->hdev,
963 964 965 966
			"cannot create sysfs group err: %d\n", error);
		return error;
	}
	wacom_led_control(wacom);
967
	wacom->led_initialized = true;
968

969 970 971 972 973
	return 0;
}

static void wacom_destroy_leds(struct wacom *wacom)
{
974 975 976
	if (!wacom->led_initialized)
		return;

977 978 979
	if (!(wacom->wacom_wac.features.device_type & WACOM_DEVICETYPE_PAD))
		return;

980 981
	wacom->led_initialized = false;

982
	switch (wacom->wacom_wac.features.type) {
983
	case INTUOS4S:
984
	case INTUOS4:
985
	case INTUOS4WL:
986
	case INTUOS4L:
987
		sysfs_remove_group(&wacom->hdev->dev.kobj,
988 989 990
				   &intuos4_led_attr_group);
		break;

991
	case WACOM_24HD:
992
	case WACOM_21UX2:
993
		sysfs_remove_group(&wacom->hdev->dev.kobj,
994 995
				   &cintiq_led_attr_group);
		break;
996 997 998 999

	case INTUOS5S:
	case INTUOS5:
	case INTUOS5L:
1000 1001 1002
	case INTUOSPS:
	case INTUOSPM:
	case INTUOSPL:
1003 1004
		sysfs_remove_group(&wacom->hdev->dev.kobj,
				   &intuos5_led_attr_group);
1005
		break;
1006 1007 1008
	}
}

1009
static enum power_supply_property wacom_battery_props[] = {
1010
	POWER_SUPPLY_PROP_PRESENT,
1011
	POWER_SUPPLY_PROP_STATUS,
1012
	POWER_SUPPLY_PROP_SCOPE,
1013 1014 1015
	POWER_SUPPLY_PROP_CAPACITY
};

1016 1017 1018 1019 1020 1021
static enum power_supply_property wacom_ac_props[] = {
	POWER_SUPPLY_PROP_PRESENT,
	POWER_SUPPLY_PROP_ONLINE,
	POWER_SUPPLY_PROP_SCOPE,
};

1022 1023 1024 1025
static int wacom_battery_get_property(struct power_supply *psy,
				      enum power_supply_property psp,
				      union power_supply_propval *val)
{
1026
	struct wacom *wacom = power_supply_get_drvdata(psy);
1027 1028 1029
	int ret = 0;

	switch (psp) {
1030 1031 1032
		case POWER_SUPPLY_PROP_PRESENT:
			val->intval = wacom->wacom_wac.bat_connected;
			break;
1033 1034 1035
		case POWER_SUPPLY_PROP_SCOPE:
			val->intval = POWER_SUPPLY_SCOPE_DEVICE;
			break;
1036 1037
		case POWER_SUPPLY_PROP_CAPACITY:
			val->intval =
1038 1039 1040 1041 1042 1043 1044 1045
				wacom->wacom_wac.battery_capacity;
			break;
		case POWER_SUPPLY_PROP_STATUS:
			if (wacom->wacom_wac.bat_charging)
				val->intval = POWER_SUPPLY_STATUS_CHARGING;
			else if (wacom->wacom_wac.battery_capacity == 100 &&
				    wacom->wacom_wac.ps_connected)
				val->intval = POWER_SUPPLY_STATUS_FULL;
1046 1047
			else if (wacom->wacom_wac.ps_connected)
				val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
1048 1049
			else
				val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
1050 1051 1052 1053 1054 1055 1056 1057 1058
			break;
		default:
			ret = -EINVAL;
			break;
	}

	return ret;
}

1059 1060 1061 1062
static int wacom_ac_get_property(struct power_supply *psy,
				enum power_supply_property psp,
				union power_supply_propval *val)
{
1063
	struct wacom *wacom = power_supply_get_drvdata(psy);
1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081
	int ret = 0;

	switch (psp) {
	case POWER_SUPPLY_PROP_PRESENT:
		/* fall through */
	case POWER_SUPPLY_PROP_ONLINE:
		val->intval = wacom->wacom_wac.ps_connected;
		break;
	case POWER_SUPPLY_PROP_SCOPE:
		val->intval = POWER_SUPPLY_SCOPE_DEVICE;
		break;
	default:
		ret = -EINVAL;
		break;
	}
	return ret;
}

1082 1083
static int wacom_initialize_battery(struct wacom *wacom)
{
1084
	static atomic_t battery_no = ATOMIC_INIT(0);
1085
	struct power_supply_config psy_cfg = { .drv_data = wacom, };
1086
	unsigned long n;
1087

1088
	if (wacom->wacom_wac.features.quirks & WACOM_QUIRK_BATTERY) {
1089 1090
		struct power_supply_desc *bat_desc = &wacom->battery_desc;
		struct power_supply_desc *ac_desc = &wacom->ac_desc;
1091
		n = atomic_inc_return(&battery_no) - 1;
1092

1093 1094 1095
		bat_desc->properties = wacom_battery_props;
		bat_desc->num_properties = ARRAY_SIZE(wacom_battery_props);
		bat_desc->get_property = wacom_battery_get_property;
1096
		sprintf(wacom->wacom_wac.bat_name, "wacom_battery_%ld", n);
1097 1098 1099
		bat_desc->name = wacom->wacom_wac.bat_name;
		bat_desc->type = POWER_SUPPLY_TYPE_BATTERY;
		bat_desc->use_for_apm = 0;
1100

1101 1102 1103
		ac_desc->properties = wacom_ac_props;
		ac_desc->num_properties = ARRAY_SIZE(wacom_ac_props);
		ac_desc->get_property = wacom_ac_get_property;
1104
		sprintf(wacom->wacom_wac.ac_name, "wacom_ac_%ld", n);
1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121
		ac_desc->name = wacom->wacom_wac.ac_name;
		ac_desc->type = POWER_SUPPLY_TYPE_MAINS;
		ac_desc->use_for_apm = 0;

		wacom->battery = power_supply_register(&wacom->hdev->dev,
					      &wacom->battery_desc, &psy_cfg);
		if (IS_ERR(wacom->battery))
			return PTR_ERR(wacom->battery);

		power_supply_powers(wacom->battery, &wacom->hdev->dev);

		wacom->ac = power_supply_register(&wacom->hdev->dev,
						  &wacom->ac_desc,
						  &psy_cfg);
		if (IS_ERR(wacom->ac)) {
			power_supply_unregister(wacom->battery);
			return PTR_ERR(wacom->ac);
1122 1123
		}

1124
		power_supply_powers(wacom->ac, &wacom->hdev->dev);
1125 1126
	}

1127
	return 0;
1128 1129 1130 1131
}

static void wacom_destroy_battery(struct wacom *wacom)
{
1132
	if (wacom->battery) {
1133 1134 1135 1136
		power_supply_unregister(wacom->battery);
		wacom->battery = NULL;
		power_supply_unregister(wacom->ac);
		wacom->ac = NULL;
1137
	}
1138 1139
}

1140 1141 1142 1143
static ssize_t wacom_show_speed(struct device *dev,
				struct device_attribute
				*attr, char *buf)
{
G
Geliang Tang 已提交
1144
	struct hid_device *hdev = to_hid_device(dev);
1145 1146 1147 1148 1149 1150 1151 1152 1153
	struct wacom *wacom = hid_get_drvdata(hdev);

	return snprintf(buf, PAGE_SIZE, "%i\n", wacom->wacom_wac.bt_high_speed);
}

static ssize_t wacom_store_speed(struct device *dev,
				struct device_attribute *attr,
				const char *buf, size_t count)
{
G
Geliang Tang 已提交
1154
	struct hid_device *hdev = to_hid_device(dev);
1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168
	struct wacom *wacom = hid_get_drvdata(hdev);
	u8 new_speed;

	if (kstrtou8(buf, 0, &new_speed))
		return -EINVAL;

	if (new_speed != 0 && new_speed != 1)
		return -EINVAL;

	wacom_bt_query_tablet_data(hdev, new_speed, &wacom->wacom_wac.features);

	return count;
}

1169
static DEVICE_ATTR(speed, DEV_ATTR_RW_PERM,
1170 1171
		wacom_show_speed, wacom_store_speed);

1172 1173 1174 1175 1176

static ssize_t wacom_show_remote_mode(struct kobject *kobj,
				      struct kobj_attribute *kattr,
				      char *buf, int index)
{
G
Geliang Tang 已提交
1177
	struct device *dev = kobj_to_dev(kobj->parent);
G
Geliang Tang 已提交
1178
	struct hid_device *hdev = to_hid_device(dev);
1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287
	struct wacom *wacom = hid_get_drvdata(hdev);
	u8 mode;

	mode = wacom->led.select[index];
	if (mode >= 0 && mode < 3)
		return snprintf(buf, PAGE_SIZE, "%d\n", mode);
	else
		return snprintf(buf, PAGE_SIZE, "%d\n", -1);
}

#define DEVICE_EKR_ATTR_GROUP(SET_ID)					\
static ssize_t wacom_show_remote##SET_ID##_mode(struct kobject *kobj,	\
			       struct kobj_attribute *kattr, char *buf)	\
{									\
	return wacom_show_remote_mode(kobj, kattr, buf, SET_ID);	\
}									\
static struct kobj_attribute remote##SET_ID##_mode_attr = {		\
	.attr = {.name = "remote_mode",					\
		.mode = DEV_ATTR_RO_PERM},				\
	.show = wacom_show_remote##SET_ID##_mode,			\
};									\
static struct attribute *remote##SET_ID##_serial_attrs[] = {		\
	&remote##SET_ID##_mode_attr.attr,				\
	NULL								\
};									\
static struct attribute_group remote##SET_ID##_serial_group = {		\
	.name = NULL,							\
	.attrs = remote##SET_ID##_serial_attrs,				\
}

DEVICE_EKR_ATTR_GROUP(0);
DEVICE_EKR_ATTR_GROUP(1);
DEVICE_EKR_ATTR_GROUP(2);
DEVICE_EKR_ATTR_GROUP(3);
DEVICE_EKR_ATTR_GROUP(4);

int wacom_remote_create_attr_group(struct wacom *wacom, __u32 serial, int index)
{
	int error = 0;
	char *buf;
	struct wacom_wac *wacom_wac = &wacom->wacom_wac;

	wacom_wac->serial[index] = serial;

	buf = kzalloc(WAC_REMOTE_SERIAL_MAX_STRLEN, GFP_KERNEL);
	if (!buf)
		return -ENOMEM;
	snprintf(buf, WAC_REMOTE_SERIAL_MAX_STRLEN, "%d", serial);
	wacom->remote_group[index].name = buf;

	error = sysfs_create_group(wacom->remote_dir,
				   &wacom->remote_group[index]);
	if (error) {
		hid_err(wacom->hdev,
			"cannot create sysfs group err: %d\n", error);
		kobject_put(wacom->remote_dir);
		return error;
	}

	return 0;
}

void wacom_remote_destroy_attr_group(struct wacom *wacom, __u32 serial)
{
	struct wacom_wac *wacom_wac = &wacom->wacom_wac;
	int i;

	if (!serial)
		return;

	for (i = 0; i < WACOM_MAX_REMOTES; i++) {
		if (wacom_wac->serial[i] == serial) {
			wacom_wac->serial[i] = 0;
			wacom->led.select[i] = WACOM_STATUS_UNKNOWN;
			if (wacom->remote_group[i].name) {
				sysfs_remove_group(wacom->remote_dir,
						   &wacom->remote_group[i]);
				kfree(wacom->remote_group[i].name);
				wacom->remote_group[i].name = NULL;
			}
		}
	}
}

static int wacom_cmd_unpair_remote(struct wacom *wacom, unsigned char selector)
{
	const size_t buf_size = 2;
	unsigned char *buf;
	int retval;

	buf = kzalloc(buf_size, GFP_KERNEL);
	if (!buf)
		return -ENOMEM;

	buf[0] = WAC_CMD_DELETE_PAIRING;
	buf[1] = selector;

	retval = wacom_set_report(wacom->hdev, HID_OUTPUT_REPORT, buf,
				  buf_size, WAC_CMD_RETRIES);
	kfree(buf);

	return retval;
}

static ssize_t wacom_store_unpair_remote(struct kobject *kobj,
					 struct kobj_attribute *attr,
					 const char *buf, size_t count)
{
	unsigned char selector = 0;
G
Geliang Tang 已提交
1288
	struct device *dev = kobj_to_dev(kobj->parent);
G
Geliang Tang 已提交
1289
	struct hid_device *hdev = to_hid_device(dev);
1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354
	struct wacom *wacom = hid_get_drvdata(hdev);
	int err;

	if (!strncmp(buf, "*\n", 2)) {
		selector = WAC_CMD_UNPAIR_ALL;
	} else {
		hid_info(wacom->hdev, "remote: unrecognized unpair code: %s\n",
			 buf);
		return -1;
	}

	mutex_lock(&wacom->lock);

	err = wacom_cmd_unpair_remote(wacom, selector);
	mutex_unlock(&wacom->lock);

	return err < 0 ? err : count;
}

static struct kobj_attribute unpair_remote_attr = {
	.attr = {.name = "unpair_remote", .mode = 0200},
	.store = wacom_store_unpair_remote,
};

static const struct attribute *remote_unpair_attrs[] = {
	&unpair_remote_attr.attr,
	NULL
};

static int wacom_initialize_remote(struct wacom *wacom)
{
	int error = 0;
	struct wacom_wac *wacom_wac = &(wacom->wacom_wac);
	int i;

	if (wacom->wacom_wac.features.type != REMOTE)
		return 0;

	wacom->remote_group[0] = remote0_serial_group;
	wacom->remote_group[1] = remote1_serial_group;
	wacom->remote_group[2] = remote2_serial_group;
	wacom->remote_group[3] = remote3_serial_group;
	wacom->remote_group[4] = remote4_serial_group;

	wacom->remote_dir = kobject_create_and_add("wacom_remote",
						   &wacom->hdev->dev.kobj);
	if (!wacom->remote_dir)
		return -ENOMEM;

	error = sysfs_create_files(wacom->remote_dir, remote_unpair_attrs);

	if (error) {
		hid_err(wacom->hdev,
			"cannot create sysfs group err: %d\n", error);
		return error;
	}

	for (i = 0; i < WACOM_MAX_REMOTES; i++) {
		wacom->led.select[i] = WACOM_STATUS_UNKNOWN;
		wacom_wac->serial[i] = 0;
	}

	return 0;
}

1355
static struct input_dev *wacom_allocate_input(struct wacom *wacom)
1356 1357
{
	struct input_dev *input_dev;
1358
	struct hid_device *hdev = wacom->hdev;
1359 1360 1361
	struct wacom_wac *wacom_wac = &(wacom->wacom_wac);

	input_dev = input_allocate_device();
1362 1363
	if (!input_dev)
		return NULL;
1364

1365
	input_dev->name = wacom_wac->features.name;
1366 1367
	input_dev->phys = hdev->phys;
	input_dev->dev.parent = &hdev->dev;
1368 1369
	input_dev->open = wacom_open;
	input_dev->close = wacom_close;
1370 1371 1372
	input_dev->uniq = hdev->uniq;
	input_dev->id.bustype = hdev->bus;
	input_dev->id.vendor  = hdev->vendor;
1373
	input_dev->id.product = wacom_wac->pid ? wacom_wac->pid : hdev->product;
1374
	input_dev->id.version = hdev->version;
1375 1376
	input_set_drvdata(input_dev, wacom);

1377 1378 1379
	return input_dev;
}

1380 1381
static void wacom_clean_inputs(struct wacom *wacom)
{
1382 1383 1384
	if (wacom->wacom_wac.pen_input) {
		if (wacom->wacom_wac.pen_registered)
			input_unregister_device(wacom->wacom_wac.pen_input);
1385
		else
1386 1387 1388 1389 1390 1391 1392
			input_free_device(wacom->wacom_wac.pen_input);
	}
	if (wacom->wacom_wac.touch_input) {
		if (wacom->wacom_wac.touch_registered)
			input_unregister_device(wacom->wacom_wac.touch_input);
		else
			input_free_device(wacom->wacom_wac.touch_input);
1393 1394
	}
	if (wacom->wacom_wac.pad_input) {
1395
		if (wacom->wacom_wac.pad_registered)
1396 1397 1398 1399
			input_unregister_device(wacom->wacom_wac.pad_input);
		else
			input_free_device(wacom->wacom_wac.pad_input);
	}
1400 1401
	wacom->wacom_wac.pen_input = NULL;
	wacom->wacom_wac.touch_input = NULL;
1402
	wacom->wacom_wac.pad_input = NULL;
1403 1404 1405
	wacom->wacom_wac.pen_registered = false;
	wacom->wacom_wac.touch_registered = false;
	wacom->wacom_wac.pad_registered = false;
1406 1407 1408
	wacom_destroy_leds(wacom);
}

1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420
static int wacom_allocate_inputs(struct wacom *wacom)
{
	struct wacom_wac *wacom_wac = &(wacom->wacom_wac);

	wacom_wac->pen_input = wacom_allocate_input(wacom);
	wacom_wac->touch_input = wacom_allocate_input(wacom);
	wacom_wac->pad_input = wacom_allocate_input(wacom);
	if (!wacom_wac->pen_input || !wacom_wac->touch_input || !wacom_wac->pad_input) {
		wacom_clean_inputs(wacom);
		return -ENOMEM;
	}

1421
	wacom_wac->pen_input->name = wacom_wac->pen_name;
1422 1423 1424 1425 1426 1427
	wacom_wac->touch_input->name = wacom_wac->touch_name;
	wacom_wac->pad_input->name = wacom_wac->pad_name;

	return 0;
}

1428 1429
static int wacom_register_inputs(struct wacom *wacom)
{
1430
	struct input_dev *pen_input_dev, *touch_input_dev, *pad_input_dev;
1431
	struct wacom_wac *wacom_wac = &(wacom->wacom_wac);
1432
	int error = 0;
1433

1434 1435
	pen_input_dev = wacom_wac->pen_input;
	touch_input_dev = wacom_wac->touch_input;
1436 1437
	pad_input_dev = wacom_wac->pad_input;

1438
	if (!pen_input_dev || !touch_input_dev || !pad_input_dev)
1439 1440
		return -EINVAL;

1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461
	error = wacom_setup_pen_input_capabilities(pen_input_dev, wacom_wac);
	if (error) {
		/* no pen in use on this interface */
		input_free_device(pen_input_dev);
		wacom_wac->pen_input = NULL;
		pen_input_dev = NULL;
	} else {
		error = input_register_device(pen_input_dev);
		if (error)
			goto fail_register_pen_input;
		wacom_wac->pen_registered = true;
	}

	error = wacom_setup_touch_input_capabilities(touch_input_dev, wacom_wac);
	if (error) {
		/* no touch in use on this interface */
		input_free_device(touch_input_dev);
		wacom_wac->touch_input = NULL;
		touch_input_dev = NULL;
	} else {
		error = input_register_device(touch_input_dev);
1462
		if (error)
1463 1464
			goto fail_register_touch_input;
		wacom_wac->touch_registered = true;
1465
	}
1466

1467 1468 1469 1470 1471 1472 1473 1474 1475
	error = wacom_setup_pad_input_capabilities(pad_input_dev, wacom_wac);
	if (error) {
		/* no pad in use on this interface */
		input_free_device(pad_input_dev);
		wacom_wac->pad_input = NULL;
		pad_input_dev = NULL;
	} else {
		error = input_register_device(pad_input_dev);
		if (error)
1476
			goto fail_register_pad_input;
1477
		wacom_wac->pad_registered = true;
1478 1479 1480

		error = wacom_initialize_leds(wacom);
		if (error)
1481
			goto fail_leds;
1482 1483
	}

1484
	return 0;
1485

1486
fail_leds:
1487 1488
	input_unregister_device(pad_input_dev);
	pad_input_dev = NULL;
1489
	wacom_wac->pad_registered = false;
1490
fail_register_pad_input:
1491 1492
	if (touch_input_dev)
		input_unregister_device(touch_input_dev);
1493 1494 1495
	wacom_wac->touch_input = NULL;
	wacom_wac->touch_registered = false;
fail_register_touch_input:
1496 1497
	if (pen_input_dev)
		input_unregister_device(pen_input_dev);
1498 1499 1500
	wacom_wac->pen_input = NULL;
	wacom_wac->pen_registered = false;
fail_register_pen_input:
1501 1502 1503
	return error;
}

1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536
/*
 * Not all devices report physical dimensions from HID.
 * Compute the default from hardcoded logical dimension
 * and resolution before driver overwrites them.
 */
static void wacom_set_default_phy(struct wacom_features *features)
{
	if (features->x_resolution) {
		features->x_phy = (features->x_max * 100) /
					features->x_resolution;
		features->y_phy = (features->y_max * 100) /
					features->y_resolution;
	}
}

static void wacom_calculate_res(struct wacom_features *features)
{
	/* set unit to "100th of a mm" for devices not reported by HID */
	if (!features->unit) {
		features->unit = 0x11;
		features->unitExpo = -3;
	}

	features->x_resolution = wacom_calc_hid_res(features->x_max,
						    features->x_phy,
						    features->unit,
						    features->unitExpo);
	features->y_resolution = wacom_calc_hid_res(features->y_max,
						    features->y_phy,
						    features->unit,
						    features->unitExpo);
}

1537 1538 1539 1540 1541
void wacom_battery_work(struct work_struct *work)
{
	struct wacom *wacom = container_of(work, struct wacom, work);

	if ((wacom->wacom_wac.features.quirks & WACOM_QUIRK_BATTERY) &&
1542
	     !wacom->battery) {
1543 1544 1545
		wacom_initialize_battery(wacom);
	}
	else if (!(wacom->wacom_wac.features.quirks & WACOM_QUIRK_BATTERY) &&
1546
		 wacom->battery) {
1547 1548 1549 1550
		wacom_destroy_battery(wacom);
	}
}

1551 1552 1553 1554 1555 1556 1557 1558 1559
static size_t wacom_compute_pktlen(struct hid_device *hdev)
{
	struct hid_report_enum *report_enum;
	struct hid_report *report;
	size_t size = 0;

	report_enum = hdev->report_enum + HID_INPUT_REPORT;

	list_for_each_entry(report, &report_enum->report_list, list) {
1560
		size_t report_size = hid_report_len(report);
1561 1562 1563 1564 1565 1566 1567
		if (report_size > size)
			size = report_size;
	}

	return size;
}

1568
static void wacom_update_name(struct wacom *wacom, const char *suffix)
1569 1570 1571
{
	struct wacom_wac *wacom_wac = &wacom->wacom_wac;
	struct wacom_features *features = &wacom_wac->features;
1572
	char name[WACOM_NAME_MAX];
1573 1574 1575 1576 1577 1578 1579

	/* Generic devices name unspecified */
	if ((features->type == HID_GENERIC) && !strcmp("Wacom HID", features->name)) {
		if (strstr(wacom->hdev->name, "Wacom") ||
		    strstr(wacom->hdev->name, "wacom") ||
		    strstr(wacom->hdev->name, "WACOM")) {
			/* name is in HID descriptor, use it */
1580
			strlcpy(name, wacom->hdev->name, sizeof(name));
1581 1582 1583

			/* strip out excess whitespaces */
			while (1) {
1584
				char *gap = strstr(name, "  ");
1585 1586 1587 1588 1589 1590
				if (gap == NULL)
					break;
				/* shift everything including the terminator */
				memmove(gap, gap+1, strlen(gap));
			}
			/* get rid of trailing whitespace */
1591 1592
			if (name[strlen(name)-1] == ' ')
				name[strlen(name)-1] = '\0';
1593 1594
		} else {
			/* no meaningful name retrieved. use product ID */
1595
			snprintf(name, sizeof(name),
1596 1597 1598
				 "%s %X", features->name, wacom->hdev->product);
		}
	} else {
1599
		strlcpy(name, features->name, sizeof(name));
1600 1601 1602
	}

	/* Append the device type to the name */
1603
	snprintf(wacom_wac->pen_name, sizeof(wacom_wac->pen_name),
1604
		"%s%s Pen", name, suffix);
1605
	snprintf(wacom_wac->touch_name, sizeof(wacom_wac->touch_name),
1606
		"%s%s Finger", name, suffix);
1607
	snprintf(wacom_wac->pad_name, sizeof(wacom_wac->pad_name),
1608
		"%s%s Pad", name, suffix);
1609 1610
}

1611
static int wacom_parse_and_register(struct wacom *wacom, bool wireless)
1612
{
1613 1614 1615
	struct wacom_wac *wacom_wac = &wacom->wacom_wac;
	struct wacom_features *features = &wacom_wac->features;
	struct hid_device *hdev = wacom->hdev;
1616
	int error;
1617
	unsigned int connect_mask = HID_CONNECT_HIDRAW;
1618

1619
	features->pktlen = wacom_compute_pktlen(hdev);
1620 1621
	if (features->pktlen > WACOM_PKGLEN_MAX)
		return -EINVAL;
1622

1623 1624
	error = wacom_allocate_inputs(wacom);
	if (error)
1625
		return error;
1626

1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637
	/*
	 * Bamboo Pad has a generic hid handling for the Pen, and we switch it
	 * into debug mode for the touch part.
	 * We ignore the other interfaces.
	 */
	if (features->type == BAMBOO_PAD) {
		if (features->pktlen == WACOM_PKGLEN_PENABLED) {
			features->type = HID_GENERIC;
		} else if ((features->pktlen != WACOM_PKGLEN_BPAD_TOUCH) &&
			   (features->pktlen != WACOM_PKGLEN_BPAD_TOUCH_USB)) {
			error = -ENODEV;
1638
			goto fail_allocate_inputs;
1639 1640 1641
		}
	}

1642 1643 1644
	/* set the default size in case we do not get them from hid */
	wacom_set_default_phy(features);

1645
	/* Retrieve the physical and logical size for touch devices */
1646
	wacom_retrieve_hid_descriptor(hdev, features);
1647
	wacom_setup_device_quirks(wacom);
1648

1649 1650
	if (features->device_type == WACOM_DEVICETYPE_NONE &&
	    features->type != WIRELESS) {
1651 1652
		error = features->type == HID_GENERIC ? -ENODEV : 0;

1653
		dev_warn(&hdev->dev, "Unknown device_type for '%s'. %s.",
1654 1655 1656 1657
			 hdev->name,
			 error ? "Ignoring" : "Assuming pen");

		if (error)
1658
			goto fail_parsed;
1659

1660
		features->device_type |= WACOM_DEVICETYPE_PEN;
1661 1662
	}

1663 1664
	wacom_calculate_res(features);

1665
	wacom_update_name(wacom, wireless ? " (WL)" : "");
1666

1667 1668 1669
	error = wacom_add_shared_data(hdev);
	if (error)
		goto fail_shared_data;
1670

1671
	if (!(features->device_type & WACOM_DEVICETYPE_WL_MONITOR) &&
1672 1673 1674
	     (features->quirks & WACOM_QUIRK_BATTERY)) {
		error = wacom_initialize_battery(wacom);
		if (error)
1675
			goto fail_battery;
1676 1677
	}

1678 1679 1680
	error = wacom_register_inputs(wacom);
	if (error)
		goto fail_register_inputs;
1681

1682 1683 1684 1685 1686 1687
	if (wacom->wacom_wac.features.device_type & WACOM_DEVICETYPE_PAD) {
		error = wacom_initialize_remote(wacom);
		if (error)
			goto fail_remote;
	}

1688 1689 1690
	if (features->type == HID_GENERIC)
		connect_mask |= HID_CONNECT_DRIVER;

1691
	/* Regular HID work starts now */
1692
	error = hid_hw_start(hdev, connect_mask);
1693 1694
	if (error) {
		hid_err(hdev, "hw start failed\n");
1695
		goto fail_hw_start;
1696
	}
1697

1698 1699 1700 1701
	if (!wireless) {
		/* Note that if query fails it is not a hard failure */
		wacom_query_tablet_data(hdev, features);
	}
1702 1703 1704 1705 1706

	/* touch only Bamboo doesn't support pen */
	if ((features->type == BAMBOO_TOUCH) &&
	    (features->device_type & WACOM_DEVICETYPE_PEN)) {
		error = -ENODEV;
1707
		goto fail_quirks;
1708 1709 1710 1711 1712 1713 1714
	}

	/* pen only Bamboo neither support touch nor pad */
	if ((features->type == BAMBOO_PEN) &&
	    ((features->device_type & WACOM_DEVICETYPE_TOUCH) ||
	    (features->device_type & WACOM_DEVICETYPE_PAD))) {
		error = -ENODEV;
1715
		goto fail_quirks;
1716 1717
	}

1718
	if (features->device_type & WACOM_DEVICETYPE_WL_MONITOR)
1719 1720
		error = hid_hw_open(hdev);

1721
	if ((wacom_wac->features.type == INTUOSHT ||
1722
	     wacom_wac->features.type == INTUOSHT2) &&
1723
	    (wacom_wac->features.device_type & WACOM_DEVICETYPE_TOUCH)) {
1724 1725
		wacom_wac->shared->type = wacom_wac->features.type;
		wacom_wac->shared->touch_input = wacom_wac->touch_input;
1726 1727
	}

1728 1729
	return 0;

1730
fail_quirks:
1731
	hid_hw_stop(hdev);
1732 1733 1734
fail_hw_start:
	kobject_put(wacom->remote_dir);
fail_remote:
1735
	wacom_clean_inputs(wacom);
1736
fail_register_inputs:
1737 1738
	wacom_destroy_battery(wacom);
fail_battery:
1739
	wacom_remove_shared_data(wacom);
1740
fail_shared_data:
1741
fail_parsed:
1742
fail_allocate_inputs:
1743 1744 1745 1746
	wacom_clean_inputs(wacom);
	return error;
}

1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799
static void wacom_wireless_work(struct work_struct *work)
{
	struct wacom *wacom = container_of(work, struct wacom, work);
	struct usb_device *usbdev = wacom->usbdev;
	struct wacom_wac *wacom_wac = &wacom->wacom_wac;
	struct hid_device *hdev1, *hdev2;
	struct wacom *wacom1, *wacom2;
	struct wacom_wac *wacom_wac1, *wacom_wac2;
	int error;

	/*
	 * Regardless if this is a disconnect or a new tablet,
	 * remove any existing input and battery devices.
	 */

	wacom_destroy_battery(wacom);

	/* Stylus interface */
	hdev1 = usb_get_intfdata(usbdev->config->interface[1]);
	wacom1 = hid_get_drvdata(hdev1);
	wacom_wac1 = &(wacom1->wacom_wac);
	wacom_clean_inputs(wacom1);

	/* Touch interface */
	hdev2 = usb_get_intfdata(usbdev->config->interface[2]);
	wacom2 = hid_get_drvdata(hdev2);
	wacom_wac2 = &(wacom2->wacom_wac);
	wacom_clean_inputs(wacom2);

	if (wacom_wac->pid == 0) {
		hid_info(wacom->hdev, "wireless tablet disconnected\n");
		wacom_wac1->shared->type = 0;
	} else {
		const struct hid_device_id *id = wacom_ids;

		hid_info(wacom->hdev, "wireless tablet connected with PID %x\n",
			 wacom_wac->pid);

		while (id->bus) {
			if (id->vendor == USB_VENDOR_ID_WACOM &&
			    id->product == wacom_wac->pid)
				break;
			id++;
		}

		if (!id->bus) {
			hid_info(wacom->hdev, "ignoring unknown PID.\n");
			return;
		}

		/* Stylus interface */
		wacom_wac1->features =
			*((struct wacom_features *)id->driver_data);
1800

1801
		wacom_wac1->pid = wacom_wac->pid;
1802 1803
		hid_hw_stop(hdev1);
		error = wacom_parse_and_register(wacom1, true);
1804 1805 1806 1807 1808 1809 1810 1811 1812 1813
		if (error)
			goto fail;

		/* Touch interface */
		if (wacom_wac1->features.touch_max ||
		    (wacom_wac1->features.type >= INTUOSHT &&
		    wacom_wac1->features.type <= BAMBOO_PT)) {
			wacom_wac2->features =
				*((struct wacom_features *)id->driver_data);
			wacom_wac2->pid = wacom_wac->pid;
1814 1815
			hid_hw_stop(hdev2);
			error = wacom_parse_and_register(wacom2, true);
1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832
			if (error)
				goto fail;
		}

		error = wacom_initialize_battery(wacom);
		if (error)
			goto fail;
	}

	return;

fail:
	wacom_clean_inputs(wacom1);
	wacom_clean_inputs(wacom2);
	return;
}

1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866
static int wacom_probe(struct hid_device *hdev,
		const struct hid_device_id *id)
{
	struct usb_interface *intf = to_usb_interface(hdev->dev.parent);
	struct usb_device *dev = interface_to_usbdev(intf);
	struct wacom *wacom;
	struct wacom_wac *wacom_wac;
	struct wacom_features *features;
	int error;

	if (!id->driver_data)
		return -EINVAL;

	hdev->quirks |= HID_QUIRK_NO_INIT_REPORTS;

	/* hid-core sets this quirk for the boot interface */
	hdev->quirks &= ~HID_QUIRK_NOGET;

	wacom = kzalloc(sizeof(struct wacom), GFP_KERNEL);
	if (!wacom)
		return -ENOMEM;

	hid_set_drvdata(hdev, wacom);
	wacom->hdev = hdev;

	wacom_wac = &wacom->wacom_wac;
	wacom_wac->features = *((struct wacom_features *)id->driver_data);
	features = &wacom_wac->features;

	if (features->check_for_hid_type && features->hid_type != hdev->type) {
		error = -ENODEV;
		goto fail_type;
	}

1867
	wacom_wac->hid_data.inputmode = -1;
1868
	wacom_wac->mode_report = -1;
1869

1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881
	wacom->usbdev = dev;
	wacom->intf = intf;
	mutex_init(&wacom->lock);
	INIT_WORK(&wacom->work, wacom_wireless_work);

	/* ask for the report descriptor to be loaded by HID */
	error = hid_parse(hdev);
	if (error) {
		hid_err(hdev, "parse failed\n");
		goto fail_parse;
	}

1882
	error = wacom_parse_and_register(wacom, false);
1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895
	if (error)
		goto fail_parse;

	if (hdev->bus == BUS_BLUETOOTH) {
		error = device_create_file(&hdev->dev, &dev_attr_speed);
		if (error)
			hid_warn(hdev,
				 "can't create sysfs speed attribute err: %d\n",
				 error);
	}

	return 0;

1896 1897 1898
fail_type:
fail_parse:
	kfree(wacom);
1899
	hid_set_drvdata(hdev, NULL);
1900
	return error;
1901 1902
}

1903
static void wacom_remove(struct hid_device *hdev)
1904
{
1905
	struct wacom *wacom = hid_get_drvdata(hdev);
1906 1907 1908 1909 1910
	struct wacom_wac *wacom_wac = &wacom->wacom_wac;
	struct wacom_features *features = &wacom_wac->features;

	if (features->device_type & WACOM_DEVICETYPE_WL_MONITOR)
		hid_hw_close(hdev);
1911

1912
	hid_hw_stop(hdev);
1913

1914
	cancel_work_sync(&wacom->work);
1915
	kobject_put(wacom->remote_dir);
1916
	wacom_clean_inputs(wacom);
1917 1918
	if (hdev->bus == BUS_BLUETOOTH)
		device_remove_file(&hdev->dev, &dev_attr_speed);
1919
	wacom_destroy_battery(wacom);
1920
	wacom_remove_shared_data(wacom);
1921

1922 1923
	hid_set_drvdata(hdev, NULL);
	kfree(wacom);
1924 1925
}

1926
#ifdef CONFIG_PM
1927
static int wacom_resume(struct hid_device *hdev)
1928
{
1929
	struct wacom *wacom = hid_get_drvdata(hdev);
1930
	struct wacom_features *features = &wacom->wacom_wac.features;
1931 1932

	mutex_lock(&wacom->lock);
1933 1934

	/* switch to wacom mode first */
1935
	wacom_query_tablet_data(hdev, features);
1936
	wacom_led_control(wacom);
1937

1938 1939
	mutex_unlock(&wacom->lock);

1940
	return 0;
1941 1942
}

1943
static int wacom_reset_resume(struct hid_device *hdev)
1944
{
1945
	return wacom_resume(hdev);
1946
}
1947
#endif /* CONFIG_PM */
1948

1949
static struct hid_driver wacom_driver = {
1950
	.name =		"wacom",
1951
	.id_table =	wacom_ids,
1952
	.probe =	wacom_probe,
1953
	.remove =	wacom_remove,
1954
	.report =	wacom_wac_report,
1955
#ifdef CONFIG_PM
1956 1957
	.resume =	wacom_resume,
	.reset_resume =	wacom_reset_resume,
1958 1959
#endif
	.raw_event =	wacom_raw_event,
1960
};
1961
module_hid_driver(wacom_driver);
1962 1963 1964 1965 1966

MODULE_VERSION(DRIVER_VERSION);
MODULE_AUTHOR(DRIVER_AUTHOR);
MODULE_DESCRIPTION(DRIVER_DESC);
MODULE_LICENSE(DRIVER_LICENSE);