Merge tag 'v3.15-rc5' into next
Merge with Linux 3.15-rc5 to sync up Wacom and other changes.
This commit is contained in:
@@ -22,23 +22,18 @@
|
||||
#define HID_USAGE_PAGE_DIGITIZER 0x0d
|
||||
#define HID_USAGE_PAGE_DESKTOP 0x01
|
||||
#define HID_USAGE 0x09
|
||||
#define HID_USAGE_X 0x30
|
||||
#define HID_USAGE_Y 0x31
|
||||
#define HID_USAGE_X_TILT 0x3d
|
||||
#define HID_USAGE_Y_TILT 0x3e
|
||||
#define HID_USAGE_FINGER 0x22
|
||||
#define HID_USAGE_STYLUS 0x20
|
||||
#define HID_USAGE_CONTACTMAX 0x55
|
||||
#define HID_USAGE_X ((HID_USAGE_PAGE_DESKTOP << 16) | 0x30)
|
||||
#define HID_USAGE_Y ((HID_USAGE_PAGE_DESKTOP << 16) | 0x31)
|
||||
#define HID_USAGE_PRESSURE ((HID_USAGE_PAGE_DIGITIZER << 16) | 0x30)
|
||||
#define HID_USAGE_X_TILT ((HID_USAGE_PAGE_DIGITIZER << 16) | 0x3d)
|
||||
#define HID_USAGE_Y_TILT ((HID_USAGE_PAGE_DIGITIZER << 16) | 0x3e)
|
||||
#define HID_USAGE_FINGER ((HID_USAGE_PAGE_DIGITIZER << 16) | 0x22)
|
||||
#define HID_USAGE_STYLUS ((HID_USAGE_PAGE_DIGITIZER << 16) | 0x20)
|
||||
#define HID_USAGE_CONTACTMAX ((HID_USAGE_PAGE_DIGITIZER << 16) | 0x55)
|
||||
#define HID_COLLECTION 0xa1
|
||||
#define HID_COLLECTION_LOGICAL 0x02
|
||||
#define HID_COLLECTION_END 0xc0
|
||||
|
||||
enum {
|
||||
WCM_UNDEFINED = 0,
|
||||
WCM_DESKTOP,
|
||||
WCM_DIGITIZER,
|
||||
};
|
||||
|
||||
struct hid_descriptor {
|
||||
struct usb_descriptor_header header;
|
||||
__le16 bcdHID;
|
||||
@@ -305,7 +300,7 @@ static int wacom_parse_hid(struct usb_interface *intf,
|
||||
char limit = 0;
|
||||
/* result has to be defined as int for some devices */
|
||||
int result = 0, touch_max = 0;
|
||||
int i = 0, usage = WCM_UNDEFINED, finger = 0, pen = 0;
|
||||
int i = 0, page = 0, finger = 0, pen = 0;
|
||||
unsigned char *report;
|
||||
|
||||
report = kzalloc(hid_desc->wDescriptorLength, GFP_KERNEL);
|
||||
@@ -332,134 +327,121 @@ static int wacom_parse_hid(struct usb_interface *intf,
|
||||
|
||||
switch (report[i]) {
|
||||
case HID_USAGE_PAGE:
|
||||
switch (report[i + 1]) {
|
||||
case HID_USAGE_PAGE_DIGITIZER:
|
||||
usage = WCM_DIGITIZER;
|
||||
i++;
|
||||
break;
|
||||
|
||||
case HID_USAGE_PAGE_DESKTOP:
|
||||
usage = WCM_DESKTOP;
|
||||
i++;
|
||||
break;
|
||||
}
|
||||
page = report[i + 1];
|
||||
i++;
|
||||
break;
|
||||
|
||||
case HID_USAGE:
|
||||
switch (report[i + 1]) {
|
||||
switch (page << 16 | report[i + 1]) {
|
||||
case HID_USAGE_X:
|
||||
if (usage == WCM_DESKTOP) {
|
||||
if (finger) {
|
||||
features->device_type = BTN_TOOL_FINGER;
|
||||
/* touch device at least supports one touch point */
|
||||
touch_max = 1;
|
||||
switch (features->type) {
|
||||
case TABLETPC2FG:
|
||||
features->pktlen = WACOM_PKGLEN_TPC2FG;
|
||||
break;
|
||||
if (finger) {
|
||||
features->device_type = BTN_TOOL_FINGER;
|
||||
/* touch device at least supports one touch point */
|
||||
touch_max = 1;
|
||||
switch (features->type) {
|
||||
case TABLETPC2FG:
|
||||
features->pktlen = WACOM_PKGLEN_TPC2FG;
|
||||
break;
|
||||
|
||||
case MTSCREEN:
|
||||
case WACOM_24HDT:
|
||||
features->pktlen = WACOM_PKGLEN_MTOUCH;
|
||||
break;
|
||||
case MTSCREEN:
|
||||
case WACOM_24HDT:
|
||||
features->pktlen = WACOM_PKGLEN_MTOUCH;
|
||||
break;
|
||||
|
||||
case MTTPC:
|
||||
features->pktlen = WACOM_PKGLEN_MTTPC;
|
||||
break;
|
||||
case MTTPC:
|
||||
features->pktlen = WACOM_PKGLEN_MTTPC;
|
||||
break;
|
||||
|
||||
case BAMBOO_PT:
|
||||
features->pktlen = WACOM_PKGLEN_BBTOUCH;
|
||||
break;
|
||||
case BAMBOO_PT:
|
||||
features->pktlen = WACOM_PKGLEN_BBTOUCH;
|
||||
break;
|
||||
|
||||
default:
|
||||
features->pktlen = WACOM_PKGLEN_GRAPHIRE;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
features->pktlen = WACOM_PKGLEN_GRAPHIRE;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (features->type) {
|
||||
case BAMBOO_PT:
|
||||
features->x_phy =
|
||||
get_unaligned_le16(&report[i + 5]);
|
||||
features->x_max =
|
||||
get_unaligned_le16(&report[i + 8]);
|
||||
i += 15;
|
||||
break;
|
||||
switch (features->type) {
|
||||
case BAMBOO_PT:
|
||||
features->x_phy =
|
||||
get_unaligned_le16(&report[i + 5]);
|
||||
features->x_max =
|
||||
get_unaligned_le16(&report[i + 8]);
|
||||
i += 15;
|
||||
break;
|
||||
|
||||
case WACOM_24HDT:
|
||||
features->x_max =
|
||||
get_unaligned_le16(&report[i + 3]);
|
||||
features->x_phy =
|
||||
get_unaligned_le16(&report[i + 8]);
|
||||
features->unit = report[i - 1];
|
||||
features->unitExpo = report[i - 3];
|
||||
i += 12;
|
||||
break;
|
||||
|
||||
default:
|
||||
features->x_max =
|
||||
get_unaligned_le16(&report[i + 3]);
|
||||
features->x_phy =
|
||||
get_unaligned_le16(&report[i + 6]);
|
||||
features->unit = report[i + 9];
|
||||
features->unitExpo = report[i + 11];
|
||||
i += 12;
|
||||
break;
|
||||
}
|
||||
} else if (pen) {
|
||||
/* penabled only accepts exact bytes of data */
|
||||
if (features->type >= TABLETPC)
|
||||
features->pktlen = WACOM_PKGLEN_GRAPHIRE;
|
||||
features->device_type = BTN_TOOL_PEN;
|
||||
case WACOM_24HDT:
|
||||
features->x_max =
|
||||
get_unaligned_le16(&report[i + 3]);
|
||||
i += 4;
|
||||
features->x_phy =
|
||||
get_unaligned_le16(&report[i + 8]);
|
||||
features->unit = report[i - 1];
|
||||
features->unitExpo = report[i - 3];
|
||||
i += 12;
|
||||
break;
|
||||
|
||||
default:
|
||||
features->x_max =
|
||||
get_unaligned_le16(&report[i + 3]);
|
||||
features->x_phy =
|
||||
get_unaligned_le16(&report[i + 6]);
|
||||
features->unit = report[i + 9];
|
||||
features->unitExpo = report[i + 11];
|
||||
i += 12;
|
||||
break;
|
||||
}
|
||||
} else if (pen) {
|
||||
/* penabled only accepts exact bytes of data */
|
||||
if (features->type >= TABLETPC)
|
||||
features->pktlen = WACOM_PKGLEN_GRAPHIRE;
|
||||
features->device_type = BTN_TOOL_PEN;
|
||||
features->x_max =
|
||||
get_unaligned_le16(&report[i + 3]);
|
||||
i += 4;
|
||||
}
|
||||
break;
|
||||
|
||||
case HID_USAGE_Y:
|
||||
if (usage == WCM_DESKTOP) {
|
||||
if (finger) {
|
||||
switch (features->type) {
|
||||
case TABLETPC2FG:
|
||||
case MTSCREEN:
|
||||
case MTTPC:
|
||||
features->y_max =
|
||||
get_unaligned_le16(&report[i + 3]);
|
||||
features->y_phy =
|
||||
get_unaligned_le16(&report[i + 6]);
|
||||
i += 7;
|
||||
break;
|
||||
|
||||
case WACOM_24HDT:
|
||||
features->y_max =
|
||||
get_unaligned_le16(&report[i + 3]);
|
||||
features->y_phy =
|
||||
get_unaligned_le16(&report[i - 2]);
|
||||
i += 7;
|
||||
break;
|
||||
|
||||
case BAMBOO_PT:
|
||||
features->y_phy =
|
||||
get_unaligned_le16(&report[i + 3]);
|
||||
features->y_max =
|
||||
get_unaligned_le16(&report[i + 6]);
|
||||
i += 12;
|
||||
break;
|
||||
|
||||
default:
|
||||
features->y_max =
|
||||
features->x_max;
|
||||
features->y_phy =
|
||||
get_unaligned_le16(&report[i + 3]);
|
||||
i += 4;
|
||||
break;
|
||||
}
|
||||
} else if (pen) {
|
||||
if (finger) {
|
||||
switch (features->type) {
|
||||
case TABLETPC2FG:
|
||||
case MTSCREEN:
|
||||
case MTTPC:
|
||||
features->y_max =
|
||||
get_unaligned_le16(&report[i + 3]);
|
||||
features->y_phy =
|
||||
get_unaligned_le16(&report[i + 6]);
|
||||
i += 7;
|
||||
break;
|
||||
|
||||
case WACOM_24HDT:
|
||||
features->y_max =
|
||||
get_unaligned_le16(&report[i + 3]);
|
||||
features->y_phy =
|
||||
get_unaligned_le16(&report[i - 2]);
|
||||
i += 7;
|
||||
break;
|
||||
|
||||
case BAMBOO_PT:
|
||||
features->y_phy =
|
||||
get_unaligned_le16(&report[i + 3]);
|
||||
features->y_max =
|
||||
get_unaligned_le16(&report[i + 6]);
|
||||
i += 12;
|
||||
break;
|
||||
|
||||
default:
|
||||
features->y_max =
|
||||
features->x_max;
|
||||
features->y_phy =
|
||||
get_unaligned_le16(&report[i + 3]);
|
||||
i += 4;
|
||||
break;
|
||||
}
|
||||
} else if (pen) {
|
||||
features->y_max =
|
||||
get_unaligned_le16(&report[i + 3]);
|
||||
i += 4;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -484,12 +466,20 @@ static int wacom_parse_hid(struct usb_interface *intf,
|
||||
wacom_retrieve_report_data(intf, features);
|
||||
i++;
|
||||
break;
|
||||
|
||||
case HID_USAGE_PRESSURE:
|
||||
if (pen) {
|
||||
features->pressure_max =
|
||||
get_unaligned_le16(&report[i + 3]);
|
||||
i += 4;
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case HID_COLLECTION_END:
|
||||
/* reset UsagePage and Finger */
|
||||
finger = usage = 0;
|
||||
finger = page = 0;
|
||||
break;
|
||||
|
||||
case HID_COLLECTION:
|
||||
|
@@ -178,10 +178,9 @@ static int wacom_ptu_irq(struct wacom_wac *wacom)
|
||||
|
||||
static int wacom_dtu_irq(struct wacom_wac *wacom)
|
||||
{
|
||||
struct wacom_features *features = &wacom->features;
|
||||
char *data = wacom->data;
|
||||
unsigned char *data = wacom->data;
|
||||
struct input_dev *input = wacom->input;
|
||||
int prox = data[1] & 0x20, pressure;
|
||||
int prox = data[1] & 0x20;
|
||||
|
||||
dev_dbg(input->dev.parent,
|
||||
"%s: received report #%d", __func__, data[0]);
|
||||
@@ -198,10 +197,7 @@ static int wacom_dtu_irq(struct wacom_wac *wacom)
|
||||
input_report_key(input, BTN_STYLUS2, data[1] & 0x10);
|
||||
input_report_abs(input, ABS_X, le16_to_cpup((__le16 *)&data[2]));
|
||||
input_report_abs(input, ABS_Y, le16_to_cpup((__le16 *)&data[4]));
|
||||
pressure = ((data[7] & 0x01) << 8) | data[6];
|
||||
if (pressure < 0)
|
||||
pressure = features->pressure_max + pressure + 1;
|
||||
input_report_abs(input, ABS_PRESSURE, pressure);
|
||||
input_report_abs(input, ABS_PRESSURE, ((data[7] & 0x01) << 8) | data[6]);
|
||||
input_report_key(input, BTN_TOUCH, data[1] & 0x05);
|
||||
if (!prox) /* out-prox */
|
||||
wacom->id[0] = 0;
|
||||
@@ -906,7 +902,7 @@ static int int_dist(int x1, int y1, int x2, int y2)
|
||||
static int wacom_24hdt_irq(struct wacom_wac *wacom)
|
||||
{
|
||||
struct input_dev *input = wacom->input;
|
||||
char *data = wacom->data;
|
||||
unsigned char *data = wacom->data;
|
||||
int i;
|
||||
int current_num_contacts = data[61];
|
||||
int contacts_to_send = 0;
|
||||
@@ -959,7 +955,7 @@ static int wacom_24hdt_irq(struct wacom_wac *wacom)
|
||||
static int wacom_mt_touch(struct wacom_wac *wacom)
|
||||
{
|
||||
struct input_dev *input = wacom->input;
|
||||
char *data = wacom->data;
|
||||
unsigned char *data = wacom->data;
|
||||
int i;
|
||||
int current_num_contacts = data[2];
|
||||
int contacts_to_send = 0;
|
||||
@@ -1038,7 +1034,7 @@ static int wacom_tpc_mt_touch(struct wacom_wac *wacom)
|
||||
|
||||
static int wacom_tpc_single_touch(struct wacom_wac *wacom, size_t len)
|
||||
{
|
||||
char *data = wacom->data;
|
||||
unsigned char *data = wacom->data;
|
||||
struct input_dev *input = wacom->input;
|
||||
bool prox;
|
||||
int x = 0, y = 0;
|
||||
@@ -1078,10 +1074,8 @@ static int wacom_tpc_single_touch(struct wacom_wac *wacom, size_t len)
|
||||
|
||||
static int wacom_tpc_pen(struct wacom_wac *wacom)
|
||||
{
|
||||
struct wacom_features *features = &wacom->features;
|
||||
char *data = wacom->data;
|
||||
unsigned char *data = wacom->data;
|
||||
struct input_dev *input = wacom->input;
|
||||
int pressure;
|
||||
bool prox = data[1] & 0x20;
|
||||
|
||||
if (!wacom->shared->stylus_in_proximity) /* first in prox */
|
||||
@@ -1097,10 +1091,7 @@ static int wacom_tpc_pen(struct wacom_wac *wacom)
|
||||
input_report_key(input, BTN_STYLUS2, data[1] & 0x10);
|
||||
input_report_abs(input, ABS_X, le16_to_cpup((__le16 *)&data[2]));
|
||||
input_report_abs(input, ABS_Y, le16_to_cpup((__le16 *)&data[4]));
|
||||
pressure = ((data[7] & 0x01) << 8) | data[6];
|
||||
if (pressure < 0)
|
||||
pressure = features->pressure_max + pressure + 1;
|
||||
input_report_abs(input, ABS_PRESSURE, pressure);
|
||||
input_report_abs(input, ABS_PRESSURE, ((data[7] & 0x03) << 8) | data[6]);
|
||||
input_report_key(input, BTN_TOUCH, data[1] & 0x05);
|
||||
input_report_key(input, wacom->tool[0], prox);
|
||||
return 1;
|
||||
@@ -1111,7 +1102,7 @@ static int wacom_tpc_pen(struct wacom_wac *wacom)
|
||||
|
||||
static int wacom_tpc_irq(struct wacom_wac *wacom, size_t len)
|
||||
{
|
||||
char *data = wacom->data;
|
||||
unsigned char *data = wacom->data;
|
||||
|
||||
dev_dbg(wacom->input->dev.parent,
|
||||
"%s: received report #%d\n", __func__, data[0]);
|
||||
@@ -1842,7 +1833,7 @@ int wacom_setup_input_capabilities(struct input_dev *input_dev,
|
||||
case DTU:
|
||||
if (features->type == DTUS) {
|
||||
input_set_capability(input_dev, EV_MSC, MSC_SERIAL);
|
||||
for (i = 0; i < 3; i++)
|
||||
for (i = 0; i < 4; i++)
|
||||
__set_bit(BTN_0 + i, input_dev->keybit);
|
||||
}
|
||||
__set_bit(BTN_TOOL_PEN, input_dev->keybit);
|
||||
|
Reference in New Issue
Block a user