Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a8a09c85 authored by Jason Gerecke's avatar Jason Gerecke Committed by Jiri Kosina
Browse files

HID: wacom: Replace magic masks and comparisons with switch cases



Reasoning through the conditions under which a particular block of code
in 'wacom_intuos_general' will be reached is not at all easy due to the
sheer number of magic masks and comparisons. Remove these and replace
them with a switch statement over the various 'types' of packets that
will be encountered.

Signed-off-by: default avatarJason Gerecke <jason.gerecke@wacom.com>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
parent 16e0a6a0
Loading
Loading
Loading
Loading
+49 −30
Original line number Diff line number Diff line
@@ -886,6 +886,7 @@ static int wacom_intuos_general(struct wacom_wac *wacom)
	unsigned char *data = wacom->data;
	struct input_dev *input = wacom->pen_input;
	int idx = (features->type == INTUOS) ? (data[1] & 0x01) : 0;
	unsigned char type = (data[1] >> 1) & 0x0F;
	unsigned int t;

	if (data[0] != WACOM_REPORT_PENABLED && data[0] != WACOM_REPORT_CINTIQ &&
@@ -902,8 +903,12 @@ static int wacom_intuos_general(struct wacom_wac *wacom)
		input_report_abs(input, ABS_DISTANCE, ((data[9] >> 3) & 0x1f));
	}

	switch (type) {
	case 0x00:
	case 0x01:
	case 0x02:
	case 0x03:
		/* general pen packet */
	if ((data[1] & 0xb8) == 0xa0) {
		t = (data[6] << 2) | ((data[7] >> 6) & 3);
		if (features->pressure_max == 2047) {
			t = (t << 1) | (data[1] & 1);
@@ -917,21 +922,20 @@ static int wacom_intuos_general(struct wacom_wac *wacom)
		input_report_key(input, BTN_STYLUS, data[1] & 2);
		input_report_key(input, BTN_STYLUS2, data[1] & 4);
		input_report_key(input, BTN_TOUCH, t > 10);
	}
		break;

	case 0x0a:
	case 0x0b:
		/* airbrush second packet */
	if ((data[1] & 0xbc) == 0xb4) {
		input_report_abs(input, ABS_WHEEL,
				(data[6] << 2) | ((data[7] >> 6) & 3));
		input_report_abs(input, ABS_TILT_X,
				 (((data[7] << 1) & 0x7e) | (data[8] >> 7)) - 64);
		input_report_abs(input, ABS_TILT_Y, (data[8] & 0x7f) - 64);
	}

	/* 4D mouse, 2D mouse, marker pen rotation, tilt mouse, or Lens cursor packets */
	if ((data[1] & 0xbc) == 0xa8 || (data[1] & 0xbe) == 0xb0 || (data[1] & 0xbc) == 0xac) {
		break;

		if (data[1] & 0x02) {
	case 0x05:
	case 0x07:
		/* Rotation packet */
		if (features->type >= INTUOS3S) {
			/* I3 marker pen rotation */
@@ -945,8 +949,13 @@ static int wacom_intuos_general(struct wacom_wac *wacom)
			input_report_abs(input, ABS_RZ, (data[7] & 0x20) ?
				((t - 1) / 2) : -t / 2);
		}
		break;

		} else if (!(data[1] & 0x10) && features->type < INTUOS3S) {
	/* 4D mouse, 2D mouse, marker pen rotation, tilt mouse, or Lens cursor packets */
	case 0x04:
	case 0x06:
	case 0x08:
		if (features->type < INTUOS3S && type != 0x08) {
			/* 4D mouse packet */
			input_report_key(input, BTN_LEFT,   data[8] & 0x01);
			input_report_key(input, BTN_MIDDLE, data[8] & 0x02);
@@ -956,8 +965,8 @@ static int wacom_intuos_general(struct wacom_wac *wacom)
			input_report_key(input, BTN_EXTRA,  data[8] & 0x10);
			t = (data[6] << 2) | ((data[7] >> 6) & 3);
			input_report_abs(input, ABS_THROTTLE, (data[8] & 0x08) ? -t : t);

		} else if (wacom->tool[idx] == BTN_TOOL_MOUSE) {
		}
		else if (wacom->tool[idx] == BTN_TOOL_MOUSE) {
			/* I4 mouse */
			if (features->type >= INTUOS4S && features->type <= INTUOSPL) {
				input_report_key(input, BTN_LEFT,   data[6] & 0x01);
@@ -985,7 +994,8 @@ static int wacom_intuos_general(struct wacom_wac *wacom)
					input_report_key(input, BTN_EXTRA,  data[8] & 0x20);
				}
			}
		} else if ((features->type < INTUOS3S || features->type == INTUOS3L ||
		}
		else if ((features->type < INTUOS3S || features->type == INTUOS3L ||
		          features->type == INTUOS4L || features->type == INTUOS5L ||
		          features->type == INTUOSPL) &&
		         wacom->tool[idx] == BTN_TOOL_LENS) {
@@ -996,6 +1006,15 @@ static int wacom_intuos_general(struct wacom_wac *wacom)
			input_report_key(input, BTN_SIDE,   data[8] & 0x10);
			input_report_key(input, BTN_EXTRA,  data[8] & 0x08);
		}
		break;

	case 0x09:
	case 0x0c:
	case 0x0d:
	case 0x0e:
	case 0x0f:
		/* unhandled */
		break;
	}

	input_report_abs(input, ABS_MISC, wacom->id[idx]); /* report tool id */