These three devices share very similar pad report formats, so there is little reason to have a near-duplicate IRQ handler specific for the Intuos Pro. This commit merges the wacom_mspro_pad_irq and wacom_intuosp2_pad_irq functions into one.
Signed-off-by: Jason Gerecke <jason.gere...@wacom.com> --- 2.6.30/wacom_wac.c | 106 ++++++++++++----------------------------------------- 2.6.36/wacom_wac.c | 103 +++++++++++---------------------------------------- 2.6.38/wacom_wac.c | 103 +++++++++++---------------------------------------- 3.7/wacom_wac.c | 103 +++++++++++---------------------------------------- 4 files changed, 90 insertions(+), 325 deletions(-) diff --git a/2.6.30/wacom_wac.c b/2.6.30/wacom_wac.c index 31629c7..78d6858 100644 --- a/2.6.30/wacom_wac.c +++ b/2.6.30/wacom_wac.c @@ -1516,11 +1516,13 @@ static int wacom_tpc_irq(struct wacom_wac *wacom, size_t len) static int wacom_mspro_pad_irq(struct wacom_wac *wacom) { + struct wacom_features *features = &wacom->features; unsigned char *data = wacom->data; struct input_dev *input = wacom->input; - int nbuttons = wacom->features.numbered_buttons; - bool prox, ringstatus; - int buttons, ring; + int nbuttons = features->numbered_buttons; + bool prox; + int buttons, ring, ringvalue; + bool active = false; switch (nbuttons) { case 11: @@ -1529,53 +1531,6 @@ static int wacom_mspro_pad_irq(struct wacom_wac *wacom) case 13: buttons = data[1] | (data[3] << 8); break; - default: - if (nbuttons) - dev_warn(input->dev.parent, "%s: unsupported device #%d\n", __func__, data[0]); - return 0; - } - - ring = le16_to_cpup((__le16 *)&data[4]); - ringstatus = ring & 0x80; - - if (input->id.product == 0x34d || input->id.product == 0x34e) { - /* MobileStudio Pro */ - ring = 35 - (ring & 0x7F); - ring += 36/2; - if (ring > 35) - ring -= 36; - } - else { - /* "Standard" devices */ - ring = 71 - (ring & 0x7F); - ring += 72/4; - if (ring > 71) - ring -= 72; - } - - prox = buttons || ringstatus; - - wacom_report_numbered_buttons(input, nbuttons, buttons); - input_report_abs(input, ABS_WHEEL, ringstatus ? ring : 0); - - input_report_key(input, wacom->tool[1], prox ? 1 : 0); - input_report_abs(input, ABS_MISC, prox ? PAD_DEVICE_ID : 0); - - input_event(input, EV_MSC, MSC_SERIAL, 0xffffffff); - - return 1; -} - -static int wacom_intuosp2_pad_irq(struct wacom_wac *wacom) -{ - unsigned char *data = wacom->data; - struct input_dev *input = wacom->input; - int nbuttons = wacom->features.numbered_buttons; - bool prox; - int buttons, ring, ringvalue; - bool active = false; - - switch (nbuttons) { case 9: buttons = (data[1]) | (data[3] << 8); break; @@ -1586,17 +1541,27 @@ static int wacom_intuosp2_pad_irq(struct wacom_wac *wacom) ring = le16_to_cpup((__le16 *)&data[4]); /* Fix touchring data: userspace expects 0 at left and increasing clockwise */ - ringvalue = 71 - (ring & 0x7F); if (input->id.product == 0x357 || input->id.product == 0x358) { /* 2nd-gen Intuos Pro */ + ringvalue = 71 - (ring & 0x7F); ringvalue += 3*72/16; + if (ringvalue > 71) + ringvalue -= 72; + } + else if (input->id.product == 0x34d || input->id.product == 0x34e) { + /* MobileStudio Pro */ + ringvalue = 35 - (ring & 0x7F); + ringvalue += 36/2; + if (ringvalue > 35) + ringvalue -= 36; } else { /* "Standard" devices */ + ringvalue = 71 - (ring & 0x7F); ringvalue += 72/4; + if (ringvalue > 71) + ringvalue -= 72; } - if (ringvalue > 71) - ringvalue -= 72; if (ring != WACOM_INTUOSP2_RING_UNTOUCHED) prox = buttons || ring; @@ -1726,26 +1691,6 @@ static int wacom_mspro_irq(struct wacom_wac *wacom) return 0; } -static int wacom_intuosp2_irq(struct wacom_wac *wacom) -{ - unsigned char *data = wacom->data; - struct input_dev *input = wacom->input; - - switch (data[0]) { - case WACOM_REPORT_MSPRO: - return wacom_mspro_pen_irq(wacom); - case WACOM_REPORT_MSPROPAD: - return wacom_intuosp2_pad_irq(wacom); - case WACOM_REPORT_MSPRODEVICE: - return 0; - default: - dev_dbg(input->dev.parent, - "%s: received unknown report #%d\n", __func__, data[0]); - break; - } - return 0; -} - void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len) { bool sync; @@ -1807,7 +1752,12 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len) break; case WACOM_MSPRO: - sync = wacom_mspro_irq(wacom_wac); + case INTUOSP2: + if (len == WACOM_PKGLEN_INTUOSP2T && + wacom_wac->data[0] == WACOM_REPORT_VENDOR_DEF_TOUCH) + sync = wacom_multitouch_generic(wacom_wac); + else + sync = wacom_mspro_irq(wacom_wac); break; case DTH1152T: @@ -1827,14 +1777,6 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len) sync = wacom_intuos_irq(wacom_wac); break; - case INTUOSP2: - if (len == WACOM_PKGLEN_INTUOSP2T && - wacom_wac->data[0] == WACOM_REPORT_VENDOR_DEF_TOUCH) - sync = wacom_multitouch_generic(wacom_wac); - else - sync = wacom_intuosp2_irq(wacom_wac); - break; - case TABLETPC: case TABLETPC2FG: case MTTPC: diff --git a/2.6.36/wacom_wac.c b/2.6.36/wacom_wac.c index 0339618..9be5390 100644 --- a/2.6.36/wacom_wac.c +++ b/2.6.36/wacom_wac.c @@ -1366,8 +1366,9 @@ static int wacom_mspro_pad_irq(struct wacom_wac *wacom) unsigned char *data = wacom->data; struct input_dev *input = wacom->input; int nbuttons = features->numbered_buttons; - bool prox, ringstatus; - int buttons, ring; + bool prox; + int buttons, ring, ringvalue; + bool active = false; switch (nbuttons) { case 11: @@ -1376,53 +1377,6 @@ static int wacom_mspro_pad_irq(struct wacom_wac *wacom) case 13: buttons = data[1] | (data[3] << 8); break; - default: - if (nbuttons) - dev_warn(input->dev.parent, "%s: unsupported device #%d\n", __func__, data[0]); - return 0; - } - - ring = le16_to_cpup((__le16 *)&data[4]); - ringstatus = ring & 0x80; - - if (input->id.product == 0x34d || input->id.product == 0x34e) { - /* MobileStudio Pro */ - ring = 35 - (ring & 0x7F); - ring += 36/2; - if (ring > 35) - ring -= 36; - } - else { - /* "Standard" devices */ - ring = 71 - (ring & 0x7F); - ring += 72/4; - if (ring > 71) - ring -= 72; - } - - prox = buttons || ringstatus; - - wacom_report_numbered_buttons(input, nbuttons, buttons); - input_report_abs(input, ABS_WHEEL, ringstatus ? ring : 0); - - input_report_key(input, wacom->tool[1], prox ? 1 : 0); - input_report_abs(input, ABS_MISC, prox ? PAD_DEVICE_ID : 0); - - input_event(input, EV_MSC, MSC_SERIAL, 0xffffffff); - - return 1; -} - -static int wacom_intuosp2_pad_irq(struct wacom_wac *wacom) -{ - unsigned char *data = wacom->data; - struct input_dev *input = wacom->input; - int nbuttons = wacom->features.numbered_buttons; - bool prox; - int buttons, ring, ringvalue; - bool active = false; - - switch (nbuttons) { case 9: buttons = (data[1]) | (data[3] << 8); break; @@ -1433,17 +1387,27 @@ static int wacom_intuosp2_pad_irq(struct wacom_wac *wacom) ring = le16_to_cpup((__le16 *)&data[4]); /* Fix touchring data: userspace expects 0 at left and increasing clockwise */ - ringvalue = 71 - (ring & 0x7F); if (input->id.product == 0x357 || input->id.product == 0x358) { /* 2nd-gen Intuos Pro */ + ringvalue = 71 - (ring & 0x7F); ringvalue += 3*72/16; + if (ringvalue > 71) + ringvalue -= 72; + } + else if (input->id.product == 0x34d || input->id.product == 0x34e) { + /* MobileStudio Pro */ + ringvalue = 35 - (ring & 0x7F); + ringvalue += 36/2; + if (ringvalue > 35) + ringvalue -= 36; } else { /* "Standard" devices */ + ringvalue = 71 - (ring & 0x7F); ringvalue += 72/4; + if (ringvalue > 71) + ringvalue -= 72; } - if (ringvalue > 71) - ringvalue -= 72; if (ring != WACOM_INTUOSP2_RING_UNTOUCHED) prox = buttons || ring; @@ -1571,26 +1535,6 @@ static int wacom_mspro_irq(struct wacom_wac *wacom) return 0; } -static int wacom_intuosp2_irq(struct wacom_wac *wacom) -{ - unsigned char *data = wacom->data; - struct input_dev *input = wacom->input; - - switch (data[0]) { - case WACOM_REPORT_MSPRO: - return wacom_mspro_pen_irq(wacom); - case WACOM_REPORT_MSPROPAD: - return wacom_intuosp2_pad_irq(wacom); - case WACOM_REPORT_MSPRODEVICE: - return 0; - default: - dev_dbg(input->dev.parent, - "%s: received unknown report #%d\n", __func__, data[0]); - break; - } - return 0; -} - void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len) { bool sync; @@ -1651,20 +1595,17 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len) break; case WACOM_MSPRO: - sync = wacom_mspro_irq(wacom_wac); - break; - - case DTH1152T: - case WACOM_MSPROT: - sync = wacom_multitouch_generic(wacom_wac); - break; - case INTUOSP2: if (len == WACOM_PKGLEN_INTUOSP2T && wacom_wac->data[0] == WACOM_REPORT_VENDOR_DEF_TOUCH) sync = wacom_multitouch_generic(wacom_wac); else - sync = wacom_intuosp2_irq(wacom_wac); + sync = wacom_mspro_irq(wacom_wac); + break; + + case DTH1152T: + case WACOM_MSPROT: + sync = wacom_multitouch_generic(wacom_wac); break; case TABLETPC: diff --git a/2.6.38/wacom_wac.c b/2.6.38/wacom_wac.c index 6454465..c7ceb3d 100644 --- a/2.6.38/wacom_wac.c +++ b/2.6.38/wacom_wac.c @@ -1828,8 +1828,9 @@ static int wacom_mspro_pad_irq(struct wacom_wac *wacom) unsigned char *data = wacom->data; struct input_dev *input = wacom->input; int nbuttons = features->numbered_buttons; - bool prox, ringstatus; - int buttons, ring; + bool prox; + int buttons, ring, ringvalue; + bool active = false; switch (nbuttons) { case 11: @@ -1838,53 +1839,6 @@ static int wacom_mspro_pad_irq(struct wacom_wac *wacom) case 13: buttons = data[1] | (data[3] << 8); break; - default: - if (nbuttons) - dev_warn(input->dev.parent, "%s: unsupported device #%d\n", __func__, data[0]); - return 0; - } - - ring = le16_to_cpup((__le16 *)&data[4]); - ringstatus = ring & 0x80; - - if (input->id.product == 0x34d || input->id.product == 0x34e) { - /* MobileStudio Pro */ - ring = 35 - (ring & 0x7F); - ring += 36/2; - if (ring > 35) - ring -= 36; - } - else { - /* "Standard" devices */ - ring = 71 - (ring & 0x7F); - ring += 72/4; - if (ring > 71) - ring -= 72; - } - - prox = buttons || ringstatus; - - wacom_report_numbered_buttons(input, nbuttons, buttons); - input_report_abs(input, ABS_WHEEL, ringstatus ? ring : 0); - - input_report_key(input, wacom->tool[1], prox ? 1 : 0); - input_report_abs(input, ABS_MISC, prox ? PAD_DEVICE_ID : 0); - - input_event(input, EV_MSC, MSC_SERIAL, 0xffffffff); - - return 1; -} - -static int wacom_intuosp2_pad_irq(struct wacom_wac *wacom) -{ - unsigned char *data = wacom->data; - struct input_dev *input = wacom->input; - int nbuttons = wacom->features.numbered_buttons; - bool prox; - int buttons, ring, ringvalue; - bool active = false; - - switch (nbuttons) { case 9: buttons = (data[1]) | (data[3] << 8); break; @@ -1895,17 +1849,27 @@ static int wacom_intuosp2_pad_irq(struct wacom_wac *wacom) ring = le16_to_cpup((__le16 *)&data[4]); /* Fix touchring data: userspace expects 0 at left and increasing clockwise */ - ringvalue = 71 - (ring & 0x7F); if (input->id.product == 0x357 || input->id.product == 0x358) { /* 2nd-gen Intuos Pro */ + ringvalue = 71 - (ring & 0x7F); ringvalue += 3*72/16; + if (ringvalue > 71) + ringvalue -= 72; + } + else if (input->id.product == 0x34d || input->id.product == 0x34e) { + /* MobileStudio Pro */ + ringvalue = 35 - (ring & 0x7F); + ringvalue += 36/2; + if (ringvalue > 35) + ringvalue -= 36; } else { /* "Standard" devices */ + ringvalue = 71 - (ring & 0x7F); ringvalue += 72/4; + if (ringvalue > 71) + ringvalue -= 72; } - if (ringvalue > 71) - ringvalue -= 72; if (ring != WACOM_INTUOSP2_RING_UNTOUCHED) prox = buttons || ring; @@ -2033,26 +1997,6 @@ static int wacom_mspro_irq(struct wacom_wac *wacom) return 0; } -static int wacom_intuosp2_irq(struct wacom_wac *wacom) -{ - unsigned char *data = wacom->data; - struct input_dev *input = wacom->input; - - switch (data[0]) { - case WACOM_REPORT_MSPRO: - return wacom_mspro_pen_irq(wacom); - case WACOM_REPORT_MSPROPAD: - return wacom_intuosp2_pad_irq(wacom); - case WACOM_REPORT_MSPRODEVICE: - return 0; - default: - dev_dbg(input->dev.parent, - "%s: received unknown report #%d\n", __func__, data[0]); - break; - } - return 0; -} - void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len) { bool sync; @@ -2110,7 +2054,12 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len) break; case WACOM_MSPRO: - sync = wacom_mspro_irq(wacom_wac); + case INTUOSP2: + if (len == WACOM_PKGLEN_INTUOSP2T && + wacom_wac->data[0] == WACOM_REPORT_VENDOR_DEF_TOUCH) + sync = wacom_multitouch_generic(wacom_wac); + else + sync = wacom_mspro_irq(wacom_wac); break; case DTH1152T: @@ -2137,14 +2086,6 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len) sync = wacom_intuos_irq(wacom_wac); break; - case INTUOSP2: - if (len == WACOM_PKGLEN_INTUOSP2T && - wacom_wac->data[0] == WACOM_REPORT_VENDOR_DEF_TOUCH) - sync = wacom_multitouch_generic(wacom_wac); - else - sync = wacom_intuosp2_irq(wacom_wac); - break; - case TABLETPC: case TABLETPCE: case TABLETPC2FG: diff --git a/3.7/wacom_wac.c b/3.7/wacom_wac.c index 070b07c..14548f1 100644 --- a/3.7/wacom_wac.c +++ b/3.7/wacom_wac.c @@ -1808,8 +1808,9 @@ static int wacom_mspro_pad_irq(struct wacom_wac *wacom) unsigned char *data = wacom->data; struct input_dev *input = wacom->input; int nbuttons = features->numbered_buttons; - bool prox, ringstatus; - int buttons, ring; + bool prox; + int buttons, ring, ringvalue; + bool active = false; switch (nbuttons) { case 11: @@ -1818,53 +1819,6 @@ static int wacom_mspro_pad_irq(struct wacom_wac *wacom) case 13: buttons = data[1] | (data[3] << 8); break; - default: - if (nbuttons) - dev_warn(input->dev.parent, "%s: unsupported device #%d\n", __func__, data[0]); - return 0; - } - - ring = le16_to_cpup((__le16 *)&data[4]); - ringstatus = ring & 0x80; - - if (input->id.product == 0x34d || input->id.product == 0x34e) { - /* MobileStudio Pro */ - ring = 35 - (ring & 0x7F); - ring += 36/2; - if (ring > 35) - ring -= 36; - } - else { - /* "Standard" devices */ - ring = 71 - (ring & 0x7F); - ring += 72/4; - if (ring > 71) - ring -= 72; - } - - prox = buttons || ringstatus; - - wacom_report_numbered_buttons(input, nbuttons, buttons); - input_report_abs(input, ABS_WHEEL, ringstatus ? ring : 0); - - input_report_key(input, wacom->tool[1], prox ? 1 : 0); - input_report_abs(input, ABS_MISC, prox ? PAD_DEVICE_ID : 0); - - input_event(input, EV_MSC, MSC_SERIAL, 0xffffffff); - - return 1; -} - -static int wacom_intuosp2_pad_irq(struct wacom_wac *wacom) -{ - unsigned char *data = wacom->data; - struct input_dev *input = wacom->input; - int nbuttons = wacom->features.numbered_buttons; - bool prox; - int buttons, ring, ringvalue; - bool active = false; - - switch (nbuttons) { case 9: buttons = (data[1]) | (data[3] << 8); break; @@ -1875,17 +1829,27 @@ static int wacom_intuosp2_pad_irq(struct wacom_wac *wacom) ring = le16_to_cpup((__le16 *)&data[4]); /* Fix touchring data: userspace expects 0 at left and increasing clockwise */ - ringvalue = 71 - (ring & 0x7F); if (input->id.product == 0x357 || input->id.product == 0x358) { /* 2nd-gen Intuos Pro */ + ringvalue = 71 - (ring & 0x7F); ringvalue += 3*72/16; + if (ringvalue > 71) + ringvalue -= 72; + } + else if (input->id.product == 0x34d || input->id.product == 0x34e) { + /* MobileStudio Pro */ + ringvalue = 35 - (ring & 0x7F); + ringvalue += 36/2; + if (ringvalue > 35) + ringvalue -= 36; } else { /* "Standard" devices */ + ringvalue = 71 - (ring & 0x7F); ringvalue += 72/4; + if (ringvalue > 71) + ringvalue -= 72; } - if (ringvalue > 71) - ringvalue -= 72; if (ring != WACOM_INTUOSP2_RING_UNTOUCHED) prox = buttons || ring; @@ -2013,26 +1977,6 @@ static int wacom_mspro_irq(struct wacom_wac *wacom) return 0; } -static int wacom_intuosp2_irq(struct wacom_wac *wacom) -{ - unsigned char *data = wacom->data; - struct input_dev *input = wacom->input; - - switch (data[0]) { - case WACOM_REPORT_MSPRO: - return wacom_mspro_pen_irq(wacom); - case WACOM_REPORT_MSPROPAD: - return wacom_intuosp2_pad_irq(wacom); - case WACOM_REPORT_MSPRODEVICE: - return 0; - default: - dev_dbg(input->dev.parent, - "%s: received unknown report #%d\n", __func__, data[0]); - break; - } - return 0; -} - void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len) { bool sync; @@ -2090,7 +2034,12 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len) break; case WACOM_MSPRO: - sync = wacom_mspro_irq(wacom_wac); + case INTUOSP2: + if (len == WACOM_PKGLEN_INTUOSP2T && + wacom_wac->data[0] == WACOM_REPORT_VENDOR_DEF_TOUCH) + sync = wacom_multitouch_generic(wacom_wac); + else + sync = wacom_mspro_irq(wacom_wac); break; case DTH1152T: @@ -2117,14 +2066,6 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len) sync = wacom_intuos_irq(wacom_wac); break; - case INTUOSP2: - if (len == WACOM_PKGLEN_INTUOSP2T && - wacom_wac->data[0] == WACOM_REPORT_VENDOR_DEF_TOUCH) - sync = wacom_multitouch_generic(wacom_wac); - else - sync = wacom_intuosp2_irq(wacom_wac); - break; - case TABLETPC: case TABLETPCE: case TABLETPC2FG: -- 2.14.2 ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Linuxwacom-devel mailing list Linuxwacom-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel