wacom_sys.c 44.1 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 26
#define WAC_CMD_RETRIES		10

27 28 29
#define DEV_ATTR_RW_PERM (S_IRUGO | S_IWUSR | S_IWGRP)
#define DEV_ATTR_WO_PERM (S_IWUSR | S_IWGRP)

30 31
static int wacom_get_report(struct hid_device *hdev, u8 type, u8 *buf,
			    size_t size, unsigned int retries)
32
{
33 34 35
	int retval;

	do {
36
		retval = hid_hw_raw_request(hdev, buf[0], buf, size, type,
37
				HID_REQ_GET_REPORT);
38 39 40 41 42
	} while ((retval == -ETIMEDOUT || retval == -EAGAIN) && --retries);

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

	return retval;
45 46
}

47 48
static int wacom_set_report(struct hid_device *hdev, u8 type, u8 *buf,
			    size_t size, unsigned int retries)
49
{
50 51 52
	int retval;

	do {
53
		retval = hid_hw_raw_request(hdev, buf[0], buf, size, type,
54
				HID_REQ_SET_REPORT);
55 56 57 58 59
	} while ((retval == -ETIMEDOUT || retval == -EAGAIN) && --retries);

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

	return retval;
62 63
}

64 65
static int wacom_raw_event(struct hid_device *hdev, struct hid_report *report,
		u8 *raw_data, int size)
66
{
67
	struct wacom *wacom = hid_get_drvdata(hdev);
68

69 70
	if (size > WACOM_PKGLEN_MAX)
		return 1;
71

72
	memcpy(wacom->wacom_wac.data, raw_data, size);
73

74 75 76
	wacom_wac_irq(&wacom->wacom_wac, size);

	return 0;
77 78 79 80
}

static int wacom_open(struct input_dev *dev)
{
81
	struct wacom *wacom = input_get_drvdata(dev);
82

83
	return hid_hw_open(wacom->hdev);
84 85 86 87
}

static void wacom_close(struct input_dev *dev)
{
88
	struct wacom *wacom = input_get_drvdata(dev);
89

90
	hid_hw_close(wacom->hdev);
91 92
}

93
/*
94
 * Calculate the resolution of the X or Y axis using hidinput_calc_abs_res.
95 96
 */
static int wacom_calc_hid_res(int logical_extents, int physical_extents,
97
			       unsigned unit, int exponent)
98
{
99 100 101 102 103 104 105 106
	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);
107 108
}

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

118 119 120
	switch (usage->hid) {
	case HID_DG_CONTACTMAX:
		/* leave touch_max as is if predefined */
121 122 123 124 125 126 127
		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,
128 129
						data, 2, WAC_CMD_RETRIES);
			if (ret == 2) {
130
				features->touch_max = data[1];
131 132 133 134 135 136 137
			} else {
				features->touch_max = 16;
				hid_warn(hdev, "wacom_feature_mapping: "
					 "could not get HID_DG_CONTACTMAX, "
					 "defaulting to %d\n",
					  features->touch_max);
			}
138 139
			kfree(data);
		}
140
		break;
141 142 143 144 145 146 147 148 149 150
	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;
151 152 153
	}
}

154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
/*
 * 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.
182
 *
183 184
 * Intuos5 touch interface and 3rd gen Bamboo Touch do not contain useful
 * data. We deal with them after returning from this function.
185
 */
186 187
static void wacom_usage_mapping(struct hid_device *hdev,
		struct hid_field *field, struct hid_usage *usage)
188
{
189 190
	struct wacom *wacom = hid_get_drvdata(hdev);
	struct wacom_features *features = &wacom->wacom_wac.features;
191 192
	bool finger = WACOM_FINGER_FIELD(field);
	bool pen = WACOM_PEN_FIELD(field);
193

194 195 196 197 198
	/*
	* Requiring Stylus Usage will ignore boot mouse
	* X/Y values and some cases of invalid Digitizer X/Y
	* values commonly reported.
	*/
199
	if (pen)
200
		features->device_type |= WACOM_DEVICETYPE_PEN;
201
	else if (finger)
202
		features->device_type |= WACOM_DEVICETYPE_TOUCH;
203
	else
204 205
		return;

206 207 208 209 210 211 212 213 214
	/*
	 * Bamboo models do not support HID_DG_CONTACTMAX.
	 * And, Bamboo Pen only descriptor contains touch.
	 */
	if (features->type != BAMBOO_PT) {
		/* ISDv4 touch devices at least supports one touch point */
		if (finger && !features->touch_max)
			features->touch_max = 1;
	}
215 216 217 218 219 220 221 222 223

	switch (usage->hid) {
	case HID_GD_X:
		features->x_max = field->logical_maximum;
		if (finger) {
			features->x_phy = field->physical_maximum;
			if (features->type != BAMBOO_PT) {
				features->unit = field->unit;
				features->unitExpo = field->unit_exponent;
224
			}
225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241
		}
		break;
	case HID_GD_Y:
		features->y_max = field->logical_maximum;
		if (finger) {
			features->y_phy = field->physical_maximum;
			if (features->type != BAMBOO_PT) {
				features->unit = field->unit;
				features->unitExpo = field->unit_exponent;
			}
		}
		break;
	case HID_DG_TIPPRESSURE:
		if (pen)
			features->pressure_max = field->logical_maximum;
		break;
	}
242 243 244

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

247 248 249 250 251 252 253 254 255
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) {
256
			input_mt_init_slots(wacom_wac->touch_input, wacom_wac->features.touch_max,
257 258 259 260 261
				    INPUT_MT_DIRECT);
		}
	}
}

262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279
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);
280
			}
281 282 283
		}
	}

284 285 286 287 288 289 290 291 292 293 294 295
	/* 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);
	}
296 297

	wacom_post_parse_hid(hdev, features);
298 299
}

300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318
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;
}

319 320
static int wacom_set_device_mode(struct hid_device *hdev, int report_id,
		int length, int mode)
321 322
{
	unsigned char *rep_data;
323
	int error = -ENOMEM, limit = 0;
324

325
	rep_data = kzalloc(length, GFP_KERNEL);
326
	if (!rep_data)
327 328
		return error;

329
	do {
330 331 332
		rep_data[0] = report_id;
		rep_data[1] = mode;

333 334
		error = wacom_set_report(hdev, HID_FEATURE_REPORT, rep_data,
					 length, 1);
335
		if (error >= 0)
336
			error = wacom_get_report(hdev, HID_FEATURE_REPORT,
337
			                         rep_data, length, 1);
338 339 340 341 342 343 344
	} while ((error < 0 || rep_data[1] != mode) && limit++ < WAC_MSG_RETRIES);

	kfree(rep_data);

	return error < 0 ? error : 0;
}

345 346 347
static int wacom_bt_query_tablet_data(struct hid_device *hdev, u8 speed,
		struct wacom_features *features)
{
348 349 350 351 352 353 354 355
	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;
356 357
		ret = wacom_set_report(hdev, HID_FEATURE_REPORT, rep_data, 2,
					3);
358 359 360 361 362 363

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

			ret = wacom_set_report(hdev, HID_FEATURE_REPORT,
364
						rep_data, 2, 3);
365 366 367 368 369 370 371 372 373 374 375 376 377 378

			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;
379 380 381 382 383 384 385 386 387
	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;

388 389
		ret = wacom_set_report(hdev, HID_FEATURE_REPORT, rep_data, 2,
					1);
390 391 392
		if (ret >= 0)
			wacom->wacom_wac.bt_high_speed = speed;
		break;
393 394
	}

395 396 397
	return 0;
}

398 399 400 401 402 403 404
/*
 * 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.
 */
405 406
static int wacom_query_tablet_data(struct hid_device *hdev,
		struct wacom_features *features)
407
{
408 409 410
	if (hdev->bus == BUS_BLUETOOTH)
		return wacom_bt_query_tablet_data(hdev, 1, features);

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

414
	if (features->device_type & WACOM_DEVICETYPE_TOUCH) {
P
Ping Cheng 已提交
415
		if (features->type > TABLETPC) {
416
			/* MT Tablet PC touch */
417
			return wacom_set_device_mode(hdev, 3, 4, 4);
418
		}
419
		else if (features->type == WACOM_24HDT || features->type == CINTIQ_HYBRID) {
420
			return wacom_set_device_mode(hdev, 18, 3, 2);
421
		}
422 423 424
		else if (features->type == WACOM_27QHDT) {
			return wacom_set_device_mode(hdev, 131, 3, 2);
		}
425 426 427
		else if (features->type == BAMBOO_PAD) {
			return wacom_set_device_mode(hdev, 2, 2, 2);
		}
428
	} else if (features->device_type & WACOM_DEVICETYPE_PEN) {
429
		if (features->type <= BAMBOO_PT && features->type != WIRELESS) {
430
			return wacom_set_device_mode(hdev, 2, 2, 2);
431
		}
432
	}
433

434
	return 0;
435 436
}

437
static void wacom_retrieve_hid_descriptor(struct hid_device *hdev,
438
					 struct wacom_features *features)
439
{
440 441
	struct wacom *wacom = hid_get_drvdata(hdev);
	struct usb_interface *intf = wacom->intf;
442

443 444 445 446 447
	/* default features */
	features->x_fuzz = 4;
	features->y_fuzz = 4;
	features->pressure_fuzz = 0;
	features->distance_fuzz = 0;
448

449 450 451 452 453 454 455 456
	/*
	 * 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) {
		if (intf->cur_altsetting->desc.bInterfaceNumber == 0) {
457
			features->device_type = WACOM_DEVICETYPE_WL_MONITOR;
458
		} else if (intf->cur_altsetting->desc.bInterfaceNumber == 2) {
459
			features->device_type |= WACOM_DEVICETYPE_TOUCH;
460 461 462
		}
	}

463
	wacom_parse_hid(hdev, features);
464 465
}

466
struct wacom_hdev_data {
467 468
	struct list_head list;
	struct kref kref;
469
	struct hid_device *dev;
470 471 472 473 474 475
	struct wacom_shared shared;
};

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

476 477
static bool wacom_are_sibling(struct hid_device *hdev,
		struct hid_device *sibling)
478
{
479 480 481 482 483 484 485 486 487 488
	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;
	}
489

490 491
	if (vid != sibling->vendor || pid != sibling->product)
		return false;
492

493 494 495 496 497
	/* 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;
498

499
	return !strncmp(hdev->phys, sibling->phys, n1);
500 501
}

502
static struct wacom_hdev_data *wacom_get_hdev_data(struct hid_device *hdev)
503
{
504
	struct wacom_hdev_data *data;
505 506

	list_for_each_entry(data, &wacom_udev_list, list) {
507
		if (wacom_are_sibling(hdev, data->dev)) {
508 509 510 511 512 513 514 515
			kref_get(&data->kref);
			return data;
		}
	}

	return NULL;
}

516
static int wacom_add_shared_data(struct hid_device *hdev)
517
{
518 519 520
	struct wacom *wacom = hid_get_drvdata(hdev);
	struct wacom_wac *wacom_wac = &wacom->wacom_wac;
	struct wacom_hdev_data *data;
521 522 523 524
	int retval = 0;

	mutex_lock(&wacom_udev_list_lock);

525
	data = wacom_get_hdev_data(hdev);
526
	if (!data) {
527
		data = kzalloc(sizeof(struct wacom_hdev_data), GFP_KERNEL);
528 529 530 531 532 533
		if (!data) {
			retval = -ENOMEM;
			goto out;
		}

		kref_init(&data->kref);
534
		data->dev = hdev;
535 536 537
		list_add_tail(&data->list, &wacom_udev_list);
	}

538
	wacom_wac->shared = &data->shared;
539

540
	if (wacom_wac->features.device_type & WACOM_DEVICETYPE_TOUCH)
541
		wacom_wac->shared->touch = hdev;
542
	else if (wacom_wac->features.device_type & WACOM_DEVICETYPE_PEN)
543 544
		wacom_wac->shared->pen = hdev;

545 546 547 548 549 550 551
out:
	mutex_unlock(&wacom_udev_list_lock);
	return retval;
}

static void wacom_release_shared_data(struct kref *kref)
{
552 553
	struct wacom_hdev_data *data =
		container_of(kref, struct wacom_hdev_data, kref);
554 555 556 557 558 559 560 561

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

	kfree(data);
}

562
static void wacom_remove_shared_data(struct wacom *wacom)
563
{
564
	struct wacom_hdev_data *data;
565 566 567 568 569 570 571 572 573 574
	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;
575 576

		kref_put(&data->kref, wacom_release_shared_data);
577
		wacom_wac->shared = NULL;
578 579 580
	}
}

581 582 583
static int wacom_led_control(struct wacom *wacom)
{
	unsigned char *buf;
584
	int retval;
585 586
	unsigned char report_id = WAC_CMD_LED_CONTROL;
	int buf_size = 9;
587

588 589 590 591 592
	if (wacom->wacom_wac.pid) { /* wireless connected */
		report_id = WAC_CMD_WL_LED_CONTROL;
		buf_size = 13;
	}
	buf = kzalloc(buf_size, GFP_KERNEL);
593 594 595
	if (!buf)
		return -ENOMEM;

596
	if (wacom->wacom_wac.features.type >= INTUOS5S &&
597
	    wacom->wacom_wac.features.type <= INTUOSPL) {
598 599 600 601 602 603 604 605
		/*
		 * 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;
606 607 608 609 610 611 612 613 614 615
		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;
616 617 618 619 620 621 622 623
	}
	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;

624
		buf[0] = report_id;
625 626 627 628 629
		buf[1] = led;
		buf[2] = wacom->led.llv;
		buf[3] = wacom->led.hlv;
		buf[4] = wacom->led.img_lum;
	}
630

631
	retval = wacom_set_report(wacom->hdev, HID_FEATURE_REPORT, buf, buf_size,
632
				  WAC_CMD_RETRIES);
633 634 635 636 637
	kfree(buf);

	return retval;
}

638 639
static int wacom_led_putimage(struct wacom *wacom, int button_id, u8 xfer_id,
		const unsigned len, const void *img)
640 641 642
{
	unsigned char *buf;
	int i, retval;
643
	const unsigned chunk_len = len / 4; /* 4 chunks are needed to be sent */
644

645
	buf = kzalloc(chunk_len + 3 , GFP_KERNEL);
646 647 648 649 650 651
	if (!buf)
		return -ENOMEM;

	/* Send 'start' command */
	buf[0] = WAC_CMD_ICON_START;
	buf[1] = 1;
652 653
	retval = wacom_set_report(wacom->hdev, HID_FEATURE_REPORT, buf, 2,
				  WAC_CMD_RETRIES);
654 655 656
	if (retval < 0)
		goto out;

657
	buf[0] = xfer_id;
658 659 660
	buf[1] = button_id & 0x07;
	for (i = 0; i < 4; i++) {
		buf[2] = i;
661
		memcpy(buf + 3, img + i * chunk_len, chunk_len);
662

663
		retval = wacom_set_report(wacom->hdev, HID_FEATURE_REPORT,
664
					  buf, chunk_len + 3, WAC_CMD_RETRIES);
665 666 667 668 669 670 671
		if (retval < 0)
			break;
	}

	/* Send 'stop' */
	buf[0] = WAC_CMD_ICON_START;
	buf[1] = 0;
672 673
	wacom_set_report(wacom->hdev, HID_FEATURE_REPORT, buf, 2,
			 WAC_CMD_RETRIES);
674 675 676 677 678 679

out:
	kfree(buf);
	return retval;
}

680
static ssize_t wacom_led_select_store(struct device *dev, int set_id,
681 682
				      const char *buf, size_t count)
{
683
	struct hid_device *hdev = container_of(dev, struct hid_device, dev);
684
	struct wacom *wacom = hid_get_drvdata(hdev);
685 686 687 688 689 690 691 692 693
	unsigned int id;
	int err;

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

	mutex_lock(&wacom->lock);

694
	wacom->led.select[set_id] = id & 0x3;
695 696 697 698 699 700 701
	err = wacom_led_control(wacom);

	mutex_unlock(&wacom->lock);

	return err < 0 ? err : count;
}

702 703 704 705 706 707
#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);		\
}									\
708 709 710
static ssize_t wacom_led##SET_ID##_select_show(struct device *dev,	\
	struct device_attribute *attr, char *buf)			\
{									\
711
	struct hid_device *hdev = container_of(dev, struct hid_device, dev);\
712
	struct wacom *wacom = hid_get_drvdata(hdev);			\
P
Ping Cheng 已提交
713 714
	return scnprintf(buf, PAGE_SIZE, "%d\n",			\
			 wacom->led.select[SET_ID]);			\
715
}									\
716
static DEVICE_ATTR(status_led##SET_ID##_select, DEV_ATTR_RW_PERM,	\
717
		    wacom_led##SET_ID##_select_show,			\
718 719 720 721
		    wacom_led##SET_ID##_select_store)

DEVICE_LED_SELECT_ATTR(0);
DEVICE_LED_SELECT_ATTR(1);
722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746

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)	\
{									\
747
	struct hid_device *hdev = container_of(dev, struct hid_device, dev);\
748
	struct wacom *wacom = hid_get_drvdata(hdev);			\
749 750 751 752
									\
	return wacom_luminance_store(wacom, &wacom->led.field,		\
				     buf, count);			\
}									\
P
Ping Cheng 已提交
753 754 755 756 757 758
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);	\
}									\
759
static DEVICE_ATTR(name##_luminance, DEV_ATTR_RW_PERM,			\
P
Ping Cheng 已提交
760 761
		   wacom_##name##_luminance_show,			\
		   wacom_##name##_luminance_store)
762 763 764 765 766 767 768 769

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)
{
770
	struct hid_device *hdev = container_of(dev, struct hid_device, dev);
771
	struct wacom *wacom = hid_get_drvdata(hdev);
772
	int err;
773 774 775 776 777 778 779 780 781 782
	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;
	}
783

784
	if (count != len)
785 786 787 788
		return -EINVAL;

	mutex_lock(&wacom->lock);

789
	err = wacom_led_putimage(wacom, button_id, xfer_id, len, buf);
790 791 792 793 794 795 796 797 798 799 800 801

	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);	\
}									\
802
static DEVICE_ATTR(button##BUTTON_ID##_rawimg, DEV_ATTR_WO_PERM,	\
803 804 805 806 807 808 809 810 811 812 813
		   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);

814 815 816 817 818 819 820 821 822 823 824 825
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[] = {
826 827
	&dev_attr_status0_luminance.attr,
	&dev_attr_status1_luminance.attr,
828
	&dev_attr_status_led0_select.attr,
829 830 831 832 833 834 835 836 837 838 839 840
	&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
};

841
static struct attribute_group intuos4_led_attr_group = {
842
	.name = "wacom_led",
843
	.attrs = intuos4_led_attrs,
844 845
};

846 847 848 849 850 851 852 853 854 855 856
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,
};

857 858 859 860
static int wacom_initialize_leds(struct wacom *wacom)
{
	int error;

861 862 863
	if (!(wacom->wacom_wac.features.device_type & WACOM_DEVICETYPE_PAD))
		return 0;

864 865
	/* Initialize default values */
	switch (wacom->wacom_wac.features.type) {
866
	case INTUOS4S:
867
	case INTUOS4:
868
	case INTUOS4WL:
869 870 871
	case INTUOS4L:
		wacom->led.select[0] = 0;
		wacom->led.select[1] = 0;
872
		wacom->led.llv = 10;
873 874
		wacom->led.hlv = 20;
		wacom->led.img_lum = 10;
875
		error = sysfs_create_group(&wacom->hdev->dev.kobj,
876 877 878
					   &intuos4_led_attr_group);
		break;

879
	case WACOM_24HD:
880 881 882 883 884 885
	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;
886

887
		error = sysfs_create_group(&wacom->hdev->dev.kobj,
888 889 890
					   &cintiq_led_attr_group);
		break;

891 892 893
	case INTUOS5S:
	case INTUOS5:
	case INTUOS5L:
894 895 896
	case INTUOSPS:
	case INTUOSPM:
	case INTUOSPL:
897 898 899 900 901 902 903 904
		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);
905 906
		break;

907 908
	default:
		return 0;
909 910
	}

911
	if (error) {
912
		hid_err(wacom->hdev,
913 914 915 916
			"cannot create sysfs group err: %d\n", error);
		return error;
	}
	wacom_led_control(wacom);
917
	wacom->led_initialized = true;
918

919 920 921 922 923
	return 0;
}

static void wacom_destroy_leds(struct wacom *wacom)
{
924 925 926
	if (!wacom->led_initialized)
		return;

927 928 929
	if (!(wacom->wacom_wac.features.device_type & WACOM_DEVICETYPE_PAD))
		return;

930 931
	wacom->led_initialized = false;

932
	switch (wacom->wacom_wac.features.type) {
933
	case INTUOS4S:
934
	case INTUOS4:
935
	case INTUOS4WL:
936
	case INTUOS4L:
937
		sysfs_remove_group(&wacom->hdev->dev.kobj,
938 939 940
				   &intuos4_led_attr_group);
		break;

941
	case WACOM_24HD:
942
	case WACOM_21UX2:
943
		sysfs_remove_group(&wacom->hdev->dev.kobj,
944 945
				   &cintiq_led_attr_group);
		break;
946 947 948 949

	case INTUOS5S:
	case INTUOS5:
	case INTUOS5L:
950 951 952
	case INTUOSPS:
	case INTUOSPM:
	case INTUOSPL:
953 954
		sysfs_remove_group(&wacom->hdev->dev.kobj,
				   &intuos5_led_attr_group);
955
		break;
956 957 958
	}
}

959
static enum power_supply_property wacom_battery_props[] = {
960
	POWER_SUPPLY_PROP_PRESENT,
961
	POWER_SUPPLY_PROP_STATUS,
962
	POWER_SUPPLY_PROP_SCOPE,
963 964 965
	POWER_SUPPLY_PROP_CAPACITY
};

966 967 968 969 970 971
static enum power_supply_property wacom_ac_props[] = {
	POWER_SUPPLY_PROP_PRESENT,
	POWER_SUPPLY_PROP_ONLINE,
	POWER_SUPPLY_PROP_SCOPE,
};

972 973 974 975
static int wacom_battery_get_property(struct power_supply *psy,
				      enum power_supply_property psp,
				      union power_supply_propval *val)
{
976
	struct wacom *wacom = power_supply_get_drvdata(psy);
977 978 979
	int ret = 0;

	switch (psp) {
980 981 982
		case POWER_SUPPLY_PROP_PRESENT:
			val->intval = wacom->wacom_wac.bat_connected;
			break;
983 984 985
		case POWER_SUPPLY_PROP_SCOPE:
			val->intval = POWER_SUPPLY_SCOPE_DEVICE;
			break;
986 987
		case POWER_SUPPLY_PROP_CAPACITY:
			val->intval =
988 989 990 991 992 993 994 995
				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;
996 997
			else if (wacom->wacom_wac.ps_connected)
				val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
998 999
			else
				val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
1000 1001 1002 1003 1004 1005 1006 1007 1008
			break;
		default:
			ret = -EINVAL;
			break;
	}

	return ret;
}

1009 1010 1011 1012
static int wacom_ac_get_property(struct power_supply *psy,
				enum power_supply_property psp,
				union power_supply_propval *val)
{
1013
	struct wacom *wacom = power_supply_get_drvdata(psy);
1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031
	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;
}

1032 1033
static int wacom_initialize_battery(struct wacom *wacom)
{
1034
	static atomic_t battery_no = ATOMIC_INIT(0);
1035
	struct power_supply_config psy_cfg = { .drv_data = wacom, };
1036
	unsigned long n;
1037

1038
	if (wacom->wacom_wac.features.quirks & WACOM_QUIRK_BATTERY) {
1039 1040
		struct power_supply_desc *bat_desc = &wacom->battery_desc;
		struct power_supply_desc *ac_desc = &wacom->ac_desc;
1041
		n = atomic_inc_return(&battery_no) - 1;
1042

1043 1044 1045
		bat_desc->properties = wacom_battery_props;
		bat_desc->num_properties = ARRAY_SIZE(wacom_battery_props);
		bat_desc->get_property = wacom_battery_get_property;
1046
		sprintf(wacom->wacom_wac.bat_name, "wacom_battery_%ld", n);
1047 1048 1049
		bat_desc->name = wacom->wacom_wac.bat_name;
		bat_desc->type = POWER_SUPPLY_TYPE_BATTERY;
		bat_desc->use_for_apm = 0;
1050

1051 1052 1053
		ac_desc->properties = wacom_ac_props;
		ac_desc->num_properties = ARRAY_SIZE(wacom_ac_props);
		ac_desc->get_property = wacom_ac_get_property;
1054
		sprintf(wacom->wacom_wac.ac_name, "wacom_ac_%ld", n);
1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071
		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);
1072 1073
		}

1074
		power_supply_powers(wacom->ac, &wacom->hdev->dev);
1075 1076
	}

1077
	return 0;
1078 1079 1080 1081
}

static void wacom_destroy_battery(struct wacom *wacom)
{
1082
	if (wacom->battery) {
1083 1084 1085 1086
		power_supply_unregister(wacom->battery);
		wacom->battery = NULL;
		power_supply_unregister(wacom->ac);
		wacom->ac = NULL;
1087
	}
1088 1089
}

1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118
static ssize_t wacom_show_speed(struct device *dev,
				struct device_attribute
				*attr, char *buf)
{
	struct hid_device *hdev = container_of(dev, struct hid_device, dev);
	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)
{
	struct hid_device *hdev = container_of(dev, struct hid_device, dev);
	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;
}

1119
static DEVICE_ATTR(speed, DEV_ATTR_RW_PERM,
1120 1121
		wacom_show_speed, wacom_store_speed);

1122
static struct input_dev *wacom_allocate_input(struct wacom *wacom)
1123 1124
{
	struct input_dev *input_dev;
1125
	struct hid_device *hdev = wacom->hdev;
1126 1127 1128
	struct wacom_wac *wacom_wac = &(wacom->wacom_wac);

	input_dev = input_allocate_device();
1129 1130
	if (!input_dev)
		return NULL;
1131

1132
	input_dev->name = wacom_wac->features.name;
1133 1134
	input_dev->phys = hdev->phys;
	input_dev->dev.parent = &hdev->dev;
1135 1136
	input_dev->open = wacom_open;
	input_dev->close = wacom_close;
1137 1138 1139
	input_dev->uniq = hdev->uniq;
	input_dev->id.bustype = hdev->bus;
	input_dev->id.vendor  = hdev->vendor;
1140
	input_dev->id.product = wacom_wac->pid ? wacom_wac->pid : hdev->product;
1141
	input_dev->id.version = hdev->version;
1142 1143
	input_set_drvdata(input_dev, wacom);

1144 1145 1146
	return input_dev;
}

1147 1148
static void wacom_clean_inputs(struct wacom *wacom)
{
1149 1150 1151
	if (wacom->wacom_wac.pen_input) {
		if (wacom->wacom_wac.pen_registered)
			input_unregister_device(wacom->wacom_wac.pen_input);
1152
		else
1153 1154 1155 1156 1157 1158 1159
			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);
1160 1161
	}
	if (wacom->wacom_wac.pad_input) {
1162
		if (wacom->wacom_wac.pad_registered)
1163 1164 1165 1166
			input_unregister_device(wacom->wacom_wac.pad_input);
		else
			input_free_device(wacom->wacom_wac.pad_input);
	}
1167 1168
	wacom->wacom_wac.pen_input = NULL;
	wacom->wacom_wac.touch_input = NULL;
1169 1170 1171 1172
	wacom->wacom_wac.pad_input = NULL;
	wacom_destroy_leds(wacom);
}

1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184
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;
	}

1185
	wacom_wac->pen_input->name = wacom_wac->pen_name;
1186 1187 1188 1189 1190 1191
	wacom_wac->touch_input->name = wacom_wac->touch_name;
	wacom_wac->pad_input->name = wacom_wac->pad_name;

	return 0;
}

1192 1193
static int wacom_register_inputs(struct wacom *wacom)
{
1194
	struct input_dev *pen_input_dev, *touch_input_dev, *pad_input_dev;
1195
	struct wacom_wac *wacom_wac = &(wacom->wacom_wac);
1196
	int error = 0;
1197

1198 1199
	pen_input_dev = wacom_wac->pen_input;
	touch_input_dev = wacom_wac->touch_input;
1200 1201
	pad_input_dev = wacom_wac->pad_input;

1202
	if (!pen_input_dev || !touch_input_dev || !pad_input_dev)
1203 1204
		return -EINVAL;

1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225
	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);
1226
		if (error)
1227 1228
			goto fail_register_touch_input;
		wacom_wac->touch_registered = true;
1229
	}
1230

1231 1232 1233 1234 1235 1236 1237 1238 1239
	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)
1240
			goto fail_register_pad_input;
1241
		wacom_wac->pad_registered = true;
1242 1243 1244

		error = wacom_initialize_leds(wacom);
		if (error)
1245
			goto fail_leds;
1246 1247
	}

1248
	return 0;
1249

1250
fail_leds:
1251 1252
	input_unregister_device(pad_input_dev);
	pad_input_dev = NULL;
1253
	wacom_wac->pad_registered = false;
1254
fail_register_pad_input:
1255 1256 1257 1258 1259 1260 1261 1262
	input_unregister_device(touch_input_dev);
	wacom_wac->touch_input = NULL;
	wacom_wac->touch_registered = false;
fail_register_touch_input:
	input_unregister_device(pen_input_dev);
	wacom_wac->pen_input = NULL;
	wacom_wac->pen_registered = false;
fail_register_pen_input:
1263 1264 1265
	return error;
}

1266 1267 1268 1269 1270
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;
1271
	struct hid_device *hdev1, *hdev2;
1272 1273 1274
	struct wacom *wacom1, *wacom2;
	struct wacom_wac *wacom_wac1, *wacom_wac2;
	int error;
1275 1276 1277

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

1281 1282
	wacom_destroy_battery(wacom);

1283
	/* Stylus interface */
1284 1285
	hdev1 = usb_get_intfdata(usbdev->config->interface[1]);
	wacom1 = hid_get_drvdata(hdev1);
1286
	wacom_wac1 = &(wacom1->wacom_wac);
1287
	wacom_clean_inputs(wacom1);
1288 1289

	/* Touch interface */
1290 1291
	hdev2 = usb_get_intfdata(usbdev->config->interface[2]);
	wacom2 = hid_get_drvdata(hdev2);
1292
	wacom_wac2 = &(wacom2->wacom_wac);
1293
	wacom_clean_inputs(wacom2);
1294 1295

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

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

1304 1305 1306
		while (id->bus) {
			if (id->vendor == USB_VENDOR_ID_WACOM &&
			    id->product == wacom_wac->pid)
1307 1308 1309 1310
				break;
			id++;
		}

1311
		if (!id->bus) {
1312
			hid_info(wacom->hdev, "ignoring unknown PID.\n");
1313 1314 1315 1316
			return;
		}

		/* Stylus interface */
1317
		wacom_wac1->features =
1318
			*((struct wacom_features *)id->driver_data);
1319
		wacom_wac1->features.device_type |= WACOM_DEVICETYPE_PEN;
1320 1321 1322
		if (wacom_wac1->features.type != INTUOSHT &&
		    wacom_wac1->features.type != BAMBOO_PT)
			wacom_wac1->features.device_type |= WACOM_DEVICETYPE_PAD;
1323
		snprintf(wacom_wac1->pen_name, WACOM_NAME_MAX, "%s (WL) Pen",
1324
			 wacom_wac1->features.name);
1325 1326
		snprintf(wacom_wac1->pad_name, WACOM_NAME_MAX, "%s (WL) Pad",
			 wacom_wac1->features.name);
1327 1328
		wacom_wac1->shared->touch_max = wacom_wac1->features.touch_max;
		wacom_wac1->shared->type = wacom_wac1->features.type;
1329
		wacom_wac1->pid = wacom_wac->pid;
1330 1331
		error = wacom_allocate_inputs(wacom1) ||
			wacom_register_inputs(wacom1);
1332
		if (error)
1333
			goto fail;
1334 1335

		/* Touch interface */
1336 1337
		if (wacom_wac1->features.touch_max ||
		    wacom_wac1->features.type == INTUOSHT) {
1338
			wacom_wac2->features =
1339
				*((struct wacom_features *)id->driver_data);
1340 1341
			wacom_wac2->features.pktlen = WACOM_PKGLEN_BBTOUCH3;
			wacom_wac2->features.x_max = wacom_wac2->features.y_max = 4096;
1342
			snprintf(wacom_wac2->touch_name, WACOM_NAME_MAX,
1343
				 "%s (WL) Finger",wacom_wac2->features.name);
1344
			snprintf(wacom_wac2->pad_name, WACOM_NAME_MAX,
1345 1346 1347 1348 1349 1350
				 "%s (WL) Pad",wacom_wac2->features.name);
			if (wacom_wac1->features.touch_max)
				wacom_wac2->features.device_type |= WACOM_DEVICETYPE_TOUCH;
			if (wacom_wac1->features.type == INTUOSHT ||
			    wacom_wac1->features.type == BAMBOO_PT)
				wacom_wac2->features.device_type |= WACOM_DEVICETYPE_PAD;
1351
			wacom_wac2->pid = wacom_wac->pid;
1352 1353
			error = wacom_allocate_inputs(wacom2) ||
				wacom_register_inputs(wacom2);
1354 1355
			if (error)
				goto fail;
1356 1357 1358

			if (wacom_wac1->features.type == INTUOSHT &&
			    wacom_wac1->features.touch_max)
1359
				wacom_wac->shared->touch_input = wacom_wac2->touch_input;
1360
		}
1361 1362 1363

		error = wacom_initialize_battery(wacom);
		if (error)
1364
			goto fail;
1365
	}
1366 1367 1368

	return;

1369
fail:
1370 1371
	wacom_clean_inputs(wacom1);
	wacom_clean_inputs(wacom2);
1372
	return;
1373 1374
}

1375 1376 1377 1378 1379
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) &&
1380
	     !wacom->battery) {
1381 1382 1383
		wacom_initialize_battery(wacom);
	}
	else if (!(wacom->wacom_wac.features.quirks & WACOM_QUIRK_BATTERY) &&
1384
		 wacom->battery) {
1385 1386 1387 1388
		wacom_destroy_battery(wacom);
	}
}

1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405
/*
 * 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)
{
1406 1407 1408 1409 1410 1411
	/* set unit to "100th of a mm" for devices not reported by HID */
	if (!features->unit) {
		features->unit = 0x11;
		features->unitExpo = -3;
	}

1412 1413 1414 1415 1416 1417 1418 1419 1420 1421
	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);
}

1422 1423 1424 1425 1426 1427 1428 1429 1430
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) {
1431
		size_t report_size = hid_report_len(report);
1432 1433 1434 1435 1436 1437 1438
		if (report_size > size)
			size = report_size;
	}

	return size;
}

1439 1440 1441 1442
static void wacom_update_name(struct wacom *wacom)
{
	struct wacom_wac *wacom_wac = &wacom->wacom_wac;
	struct wacom_features *features = &wacom_wac->features;
1443
	char name[WACOM_NAME_MAX];
1444 1445 1446 1447 1448 1449 1450

	/* 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 */
1451
			strlcpy(name, wacom->hdev->name, sizeof(name));
1452 1453 1454

			/* strip out excess whitespaces */
			while (1) {
1455
				char *gap = strstr(name, "  ");
1456 1457 1458 1459 1460 1461
				if (gap == NULL)
					break;
				/* shift everything including the terminator */
				memmove(gap, gap+1, strlen(gap));
			}
			/* get rid of trailing whitespace */
1462 1463
			if (name[strlen(name)-1] == ' ')
				name[strlen(name)-1] = '\0';
1464 1465
		} else {
			/* no meaningful name retrieved. use product ID */
1466
			snprintf(name, sizeof(name),
1467 1468 1469
				 "%s %X", features->name, wacom->hdev->product);
		}
	} else {
1470
		strlcpy(name, features->name, sizeof(name));
1471 1472 1473
	}

	/* Append the device type to the name */
1474 1475 1476 1477
	snprintf(wacom_wac->pen_name, sizeof(wacom_wac->pen_name),
		"%s Pen", name);
	snprintf(wacom_wac->touch_name, sizeof(wacom_wac->touch_name),
		"%s Finger", name);
1478
	snprintf(wacom_wac->pad_name, sizeof(wacom_wac->pad_name),
1479
		"%s Pad", name);
1480 1481
}

1482 1483
static int wacom_probe(struct hid_device *hdev,
		const struct hid_device_id *id)
1484
{
1485
	struct usb_interface *intf = to_usb_interface(hdev->dev.parent);
1486 1487 1488
	struct usb_device *dev = interface_to_usbdev(intf);
	struct wacom *wacom;
	struct wacom_wac *wacom_wac;
1489 1490
	struct wacom_features *features;
	int error;
1491
	unsigned int connect_mask = HID_CONNECT_HIDRAW;
1492

1493
	if (!id->driver_data)
1494 1495
		return -EINVAL;

1496 1497
	hdev->quirks |= HID_QUIRK_NO_INIT_REPORTS;

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

1501
	wacom = kzalloc(sizeof(struct wacom), GFP_KERNEL);
1502 1503
	if (!wacom)
		return -ENOMEM;
1504

1505 1506 1507
	hid_set_drvdata(hdev, wacom);
	wacom->hdev = hdev;

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

1515
	wacom_wac = &wacom->wacom_wac;
1516
	wacom_wac->features = *((struct wacom_features *)id->driver_data);
1517
	features = &wacom_wac->features;
1518
	features->pktlen = wacom_compute_pktlen(hdev);
1519 1520
	if (features->pktlen > WACOM_PKGLEN_MAX) {
		error = -EINVAL;
1521
		goto fail_pktlen;
1522
	}
1523

1524 1525
	if (features->check_for_hid_type && features->hid_type != hdev->type) {
		error = -ENODEV;
1526
		goto fail_type;
1527
	}
1528 1529

	wacom->usbdev = dev;
1530 1531
	wacom->intf = intf;
	mutex_init(&wacom->lock);
1532
	INIT_WORK(&wacom->work, wacom_wireless_work);
1533

1534 1535 1536 1537 1538 1539
	if (!(features->quirks & WACOM_QUIRK_NO_INPUT)) {
		error = wacom_allocate_inputs(wacom);
		if (error)
			goto fail_allocate_inputs;
	}

1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554
	/*
	 * 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;
			goto fail_shared_data;
		}
	}

1555 1556 1557
	/* set the default size in case we do not get them from hid */
	wacom_set_default_phy(features);

1558
	/* Retrieve the physical and logical size for touch devices */
1559
	wacom_retrieve_hid_descriptor(hdev, features);
1560
	wacom_setup_device_quirks(wacom);
1561

1562 1563
	if (features->device_type == WACOM_DEVICETYPE_NONE &&
	    features->type != WIRELESS) {
1564 1565
		error = features->type == HID_GENERIC ? -ENODEV : 0;

1566
		dev_warn(&hdev->dev, "Unknown device_type for '%s'. %s.",
1567 1568 1569 1570 1571
			 hdev->name,
			 error ? "Ignoring" : "Assuming pen");

		if (error)
			goto fail_shared_data;
1572

1573
		features->device_type |= WACOM_DEVICETYPE_PEN;
1574 1575
	}

1576 1577
	wacom_calculate_res(features);

1578
	wacom_update_name(wacom);
1579

1580 1581 1582
	error = wacom_add_shared_data(hdev);
	if (error)
		goto fail_shared_data;
1583

1584
	if (!(features->device_type & WACOM_DEVICETYPE_WL_MONITOR) &&
1585 1586 1587
	     (features->quirks & WACOM_QUIRK_BATTERY)) {
		error = wacom_initialize_battery(wacom);
		if (error)
1588
			goto fail_battery;
1589 1590
	}

1591
	if (!(features->quirks & WACOM_QUIRK_NO_INPUT)) {
1592
		error = wacom_register_inputs(wacom);
1593
		if (error)
1594
			goto fail_register_inputs;
1595 1596 1597 1598 1599 1600 1601 1602
	}

	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);
1603
	}
1604

1605 1606 1607
	if (features->type == HID_GENERIC)
		connect_mask |= HID_CONNECT_DRIVER;

1608
	/* Regular HID work starts now */
1609
	error = hid_hw_start(hdev, connect_mask);
1610 1611
	if (error) {
		hid_err(hdev, "hw start failed\n");
1612
		goto fail_hw_start;
1613
	}
1614

1615 1616 1617
	/* Note that if query fails it is not a hard failure */
	wacom_query_tablet_data(hdev, features);

1618
	if (features->device_type & WACOM_DEVICETYPE_WL_MONITOR)
1619 1620
		error = hid_hw_open(hdev);

1621 1622
	if (wacom_wac->features.type == INTUOSHT && 
	    wacom_wac->features.device_type & WACOM_DEVICETYPE_TOUCH) {
1623
			wacom_wac->shared->touch_input = wacom_wac->touch_input;
1624 1625
	}

1626 1627
	return 0;

1628 1629
fail_hw_start:
	if (hdev->bus == BUS_BLUETOOTH)
1630
		device_remove_file(&hdev->dev, &dev_attr_speed);
1631
fail_register_inputs:
1632
	wacom_clean_inputs(wacom);
1633 1634
	wacom_destroy_battery(wacom);
fail_battery:
1635
	wacom_remove_shared_data(wacom);
1636
fail_shared_data:
1637 1638
	wacom_clean_inputs(wacom);
fail_allocate_inputs:
1639 1640 1641 1642
fail_type:
fail_pktlen:
fail_parse:
	kfree(wacom);
1643
	hid_set_drvdata(hdev, NULL);
1644
	return error;
1645 1646
}

1647
static void wacom_remove(struct hid_device *hdev)
1648
{
1649
	struct wacom *wacom = hid_get_drvdata(hdev);
1650

1651
	hid_hw_stop(hdev);
1652

1653
	cancel_work_sync(&wacom->work);
1654
	wacom_clean_inputs(wacom);
1655 1656
	if (hdev->bus == BUS_BLUETOOTH)
		device_remove_file(&hdev->dev, &dev_attr_speed);
1657
	wacom_destroy_battery(wacom);
1658
	wacom_remove_shared_data(wacom);
1659

1660 1661
	hid_set_drvdata(hdev, NULL);
	kfree(wacom);
1662 1663
}

1664
#ifdef CONFIG_PM
1665
static int wacom_resume(struct hid_device *hdev)
1666
{
1667
	struct wacom *wacom = hid_get_drvdata(hdev);
1668
	struct wacom_features *features = &wacom->wacom_wac.features;
1669 1670

	mutex_lock(&wacom->lock);
1671 1672

	/* switch to wacom mode first */
1673
	wacom_query_tablet_data(hdev, features);
1674
	wacom_led_control(wacom);
1675

1676 1677
	mutex_unlock(&wacom->lock);

1678
	return 0;
1679 1680
}

1681
static int wacom_reset_resume(struct hid_device *hdev)
1682
{
1683
	return wacom_resume(hdev);
1684
}
1685
#endif /* CONFIG_PM */
1686

1687
static struct hid_driver wacom_driver = {
1688
	.name =		"wacom",
1689
	.id_table =	wacom_ids,
1690
	.probe =	wacom_probe,
1691
	.remove =	wacom_remove,
1692
	.report =	wacom_wac_report,
1693
#ifdef CONFIG_PM
1694 1695
	.resume =	wacom_resume,
	.reset_resume =	wacom_reset_resume,
1696 1697
#endif
	.raw_event =	wacom_raw_event,
1698
};
1699
module_hid_driver(wacom_driver);
1700 1701 1702 1703 1704

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