linux/drivers/hid/wacom_wac.c
<<
>>
Prefs
   1/*
   2 * drivers/input/tablet/wacom_wac.c
   3 *
   4 *  USB Wacom tablet support - Wacom specific code
   5 *
   6 */
   7
   8/*
   9 * This program is free software; you can redistribute it and/or modify
  10 * it under the terms of the GNU General Public License as published by
  11 * the Free Software Foundation; either version 2 of the License, or
  12 * (at your option) any later version.
  13 */
  14
  15#include "wacom_wac.h"
  16#include "wacom.h"
  17#include <linux/input/mt.h>
  18
  19/* resolution for penabled devices */
  20#define WACOM_PL_RES            20
  21#define WACOM_PENPRTN_RES       40
  22#define WACOM_VOLITO_RES        50
  23#define WACOM_GRAPHIRE_RES      80
  24#define WACOM_INTUOS_RES        100
  25#define WACOM_INTUOS3_RES       200
  26
  27/* Newer Cintiq and DTU have an offset between tablet and screen areas */
  28#define WACOM_DTU_OFFSET        200
  29#define WACOM_CINTIQ_OFFSET     400
  30
  31/*
  32 * Scale factor relating reported contact size to logical contact area.
  33 * 2^14/pi is a good approximation on Intuos5 and 3rd-gen Bamboo
  34 */
  35#define WACOM_CONTACT_AREA_SCALE 2607
  36
  37static void wacom_report_numbered_buttons(struct input_dev *input_dev,
  38                                int button_count, int mask);
  39
  40/*
  41 * Percent of battery capacity for Graphire.
  42 * 8th value means AC online and show 100% capacity.
  43 */
  44static unsigned short batcap_gr[8] = { 1, 15, 25, 35, 50, 70, 100, 100 };
  45
  46/*
  47 * Percent of battery capacity for Intuos4 WL, AC has a separate bit.
  48 */
  49static unsigned short batcap_i4[8] = { 1, 15, 30, 45, 60, 70, 85, 100 };
  50
  51static void wacom_notify_battery(struct wacom_wac *wacom_wac,
  52        int bat_capacity, bool bat_charging, bool bat_connected,
  53        bool ps_connected)
  54{
  55        struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac);
  56        bool changed = wacom_wac->battery_capacity != bat_capacity  ||
  57                       wacom_wac->bat_charging     != bat_charging  ||
  58                       wacom_wac->bat_connected    != bat_connected ||
  59                       wacom_wac->ps_connected     != ps_connected;
  60
  61        if (changed) {
  62                wacom_wac->battery_capacity = bat_capacity;
  63                wacom_wac->bat_charging = bat_charging;
  64                wacom_wac->bat_connected = bat_connected;
  65                wacom_wac->ps_connected = ps_connected;
  66
  67                if (wacom->battery)
  68                        power_supply_changed(wacom->battery);
  69        }
  70}
  71
  72static int wacom_penpartner_irq(struct wacom_wac *wacom)
  73{
  74        unsigned char *data = wacom->data;
  75        struct input_dev *input = wacom->pen_input;
  76
  77        switch (data[0]) {
  78        case 1:
  79                if (data[5] & 0x80) {
  80                        wacom->tool[0] = (data[5] & 0x20) ? BTN_TOOL_RUBBER : BTN_TOOL_PEN;
  81                        wacom->id[0] = (data[5] & 0x20) ? ERASER_DEVICE_ID : STYLUS_DEVICE_ID;
  82                        input_report_key(input, wacom->tool[0], 1);
  83                        input_report_abs(input, ABS_MISC, wacom->id[0]); /* report tool id */
  84                        input_report_abs(input, ABS_X, get_unaligned_le16(&data[1]));
  85                        input_report_abs(input, ABS_Y, get_unaligned_le16(&data[3]));
  86                        input_report_abs(input, ABS_PRESSURE, (signed char)data[6] + 127);
  87                        input_report_key(input, BTN_TOUCH, ((signed char)data[6] > -127));
  88                        input_report_key(input, BTN_STYLUS, (data[5] & 0x40));
  89                } else {
  90                        input_report_key(input, wacom->tool[0], 0);
  91                        input_report_abs(input, ABS_MISC, 0); /* report tool id */
  92                        input_report_abs(input, ABS_PRESSURE, -1);
  93                        input_report_key(input, BTN_TOUCH, 0);
  94                }
  95                break;
  96
  97        case 2:
  98                input_report_key(input, BTN_TOOL_PEN, 1);
  99                input_report_abs(input, ABS_MISC, STYLUS_DEVICE_ID); /* report tool id */
 100                input_report_abs(input, ABS_X, get_unaligned_le16(&data[1]));
 101                input_report_abs(input, ABS_Y, get_unaligned_le16(&data[3]));
 102                input_report_abs(input, ABS_PRESSURE, (signed char)data[6] + 127);
 103                input_report_key(input, BTN_TOUCH, ((signed char)data[6] > -80) && !(data[5] & 0x20));
 104                input_report_key(input, BTN_STYLUS, (data[5] & 0x40));
 105                break;
 106
 107        default:
 108                dev_dbg(input->dev.parent,
 109                        "%s: received unknown report #%d\n", __func__, data[0]);
 110                return 0;
 111        }
 112
 113        return 1;
 114}
 115
 116static int wacom_pl_irq(struct wacom_wac *wacom)
 117{
 118        struct wacom_features *features = &wacom->features;
 119        unsigned char *data = wacom->data;
 120        struct input_dev *input = wacom->pen_input;
 121        int prox, pressure;
 122
 123        if (data[0] != WACOM_REPORT_PENABLED) {
 124                dev_dbg(input->dev.parent,
 125                        "%s: received unknown report #%d\n", __func__, data[0]);
 126                return 0;
 127        }
 128
 129        prox = data[1] & 0x40;
 130
 131        if (!wacom->id[0]) {
 132                if ((data[0] & 0x10) || (data[4] & 0x20)) {
 133                        wacom->tool[0] = BTN_TOOL_RUBBER;
 134                        wacom->id[0] = ERASER_DEVICE_ID;
 135                }
 136                else {
 137                        wacom->tool[0] = BTN_TOOL_PEN;
 138                        wacom->id[0] = STYLUS_DEVICE_ID;
 139                }
 140        }
 141
 142        /* If the eraser is in prox, STYLUS2 is always set. If we
 143         * mis-detected the type and notice that STYLUS2 isn't set
 144         * then force the eraser out of prox and let the pen in.
 145         */
 146        if (wacom->tool[0] == BTN_TOOL_RUBBER && !(data[4] & 0x20)) {
 147                input_report_key(input, BTN_TOOL_RUBBER, 0);
 148                input_report_abs(input, ABS_MISC, 0);
 149                input_sync(input);
 150                wacom->tool[0] = BTN_TOOL_PEN;
 151                wacom->id[0] = STYLUS_DEVICE_ID;
 152        }
 153
 154        pressure = (signed char)((data[7] << 1) | ((data[4] >> 2) & 1));
 155        if (features->pressure_max > 255)
 156                pressure = (pressure << 1) | ((data[4] >> 6) & 1);
 157        pressure += (features->pressure_max + 1) / 2;
 158
 159        input_report_abs(input, ABS_X, data[3] | (data[2] << 7) | ((data[1] & 0x03) << 14));
 160        input_report_abs(input, ABS_Y, data[6] | (data[5] << 7) | ((data[4] & 0x03) << 14));
 161        input_report_abs(input, ABS_PRESSURE, pressure);
 162
 163        input_report_key(input, BTN_TOUCH, data[4] & 0x08);
 164        input_report_key(input, BTN_STYLUS, data[4] & 0x10);
 165        /* Only allow the stylus2 button to be reported for the pen tool. */
 166        input_report_key(input, BTN_STYLUS2, (wacom->tool[0] == BTN_TOOL_PEN) && (data[4] & 0x20));
 167
 168        if (!prox)
 169                wacom->id[0] = 0;
 170        input_report_key(input, wacom->tool[0], prox);
 171        input_report_abs(input, ABS_MISC, wacom->id[0]);
 172        return 1;
 173}
 174
 175static int wacom_ptu_irq(struct wacom_wac *wacom)
 176{
 177        unsigned char *data = wacom->data;
 178        struct input_dev *input = wacom->pen_input;
 179
 180        if (data[0] != WACOM_REPORT_PENABLED) {
 181                dev_dbg(input->dev.parent,
 182                        "%s: received unknown report #%d\n", __func__, data[0]);
 183                return 0;
 184        }
 185
 186        if (data[1] & 0x04) {
 187                input_report_key(input, BTN_TOOL_RUBBER, data[1] & 0x20);
 188                input_report_key(input, BTN_TOUCH, data[1] & 0x08);
 189                wacom->id[0] = ERASER_DEVICE_ID;
 190        } else {
 191                input_report_key(input, BTN_TOOL_PEN, data[1] & 0x20);
 192                input_report_key(input, BTN_TOUCH, data[1] & 0x01);
 193                wacom->id[0] = STYLUS_DEVICE_ID;
 194        }
 195        input_report_abs(input, ABS_MISC, wacom->id[0]); /* report tool id */
 196        input_report_abs(input, ABS_X, le16_to_cpup((__le16 *)&data[2]));
 197        input_report_abs(input, ABS_Y, le16_to_cpup((__le16 *)&data[4]));
 198        input_report_abs(input, ABS_PRESSURE, le16_to_cpup((__le16 *)&data[6]));
 199        input_report_key(input, BTN_STYLUS, data[1] & 0x02);
 200        input_report_key(input, BTN_STYLUS2, data[1] & 0x10);
 201        return 1;
 202}
 203
 204static int wacom_dtu_irq(struct wacom_wac *wacom)
 205{
 206        unsigned char *data = wacom->data;
 207        struct input_dev *input = wacom->pen_input;
 208        int prox = data[1] & 0x20;
 209
 210        dev_dbg(input->dev.parent,
 211                "%s: received report #%d", __func__, data[0]);
 212
 213        if (prox) {
 214                /* Going into proximity select tool */
 215                wacom->tool[0] = (data[1] & 0x0c) ? BTN_TOOL_RUBBER : BTN_TOOL_PEN;
 216                if (wacom->tool[0] == BTN_TOOL_PEN)
 217                        wacom->id[0] = STYLUS_DEVICE_ID;
 218                else
 219                        wacom->id[0] = ERASER_DEVICE_ID;
 220        }
 221        input_report_key(input, BTN_STYLUS, data[1] & 0x02);
 222        input_report_key(input, BTN_STYLUS2, data[1] & 0x10);
 223        input_report_abs(input, ABS_X, le16_to_cpup((__le16 *)&data[2]));
 224        input_report_abs(input, ABS_Y, le16_to_cpup((__le16 *)&data[4]));
 225        input_report_abs(input, ABS_PRESSURE, ((data[7] & 0x01) << 8) | data[6]);
 226        input_report_key(input, BTN_TOUCH, data[1] & 0x05);
 227        if (!prox) /* out-prox */
 228                wacom->id[0] = 0;
 229        input_report_key(input, wacom->tool[0], prox);
 230        input_report_abs(input, ABS_MISC, wacom->id[0]);
 231        return 1;
 232}
 233
 234static int wacom_dtus_irq(struct wacom_wac *wacom)
 235{
 236        char *data = wacom->data;
 237        struct input_dev *input = wacom->pen_input;
 238        unsigned short prox, pressure = 0;
 239
 240        if (data[0] != WACOM_REPORT_DTUS && data[0] != WACOM_REPORT_DTUSPAD) {
 241                dev_dbg(input->dev.parent,
 242                        "%s: received unknown report #%d", __func__, data[0]);
 243                return 0;
 244        } else if (data[0] == WACOM_REPORT_DTUSPAD) {
 245                input = wacom->pad_input;
 246                input_report_key(input, BTN_0, (data[1] & 0x01));
 247                input_report_key(input, BTN_1, (data[1] & 0x02));
 248                input_report_key(input, BTN_2, (data[1] & 0x04));
 249                input_report_key(input, BTN_3, (data[1] & 0x08));
 250                input_report_abs(input, ABS_MISC,
 251                                 data[1] & 0x0f ? PAD_DEVICE_ID : 0);
 252                return 1;
 253        } else {
 254                prox = data[1] & 0x80;
 255                if (prox) {
 256                        switch ((data[1] >> 3) & 3) {
 257                        case 1: /* Rubber */
 258                                wacom->tool[0] = BTN_TOOL_RUBBER;
 259                                wacom->id[0] = ERASER_DEVICE_ID;
 260                                break;
 261
 262                        case 2: /* Pen */
 263                                wacom->tool[0] = BTN_TOOL_PEN;
 264                                wacom->id[0] = STYLUS_DEVICE_ID;
 265                                break;
 266                        }
 267                }
 268
 269                input_report_key(input, BTN_STYLUS, data[1] & 0x20);
 270                input_report_key(input, BTN_STYLUS2, data[1] & 0x40);
 271                input_report_abs(input, ABS_X, get_unaligned_be16(&data[3]));
 272                input_report_abs(input, ABS_Y, get_unaligned_be16(&data[5]));
 273                pressure = ((data[1] & 0x03) << 8) | (data[2] & 0xff);
 274                input_report_abs(input, ABS_PRESSURE, pressure);
 275                input_report_key(input, BTN_TOUCH, pressure > 10);
 276
 277                if (!prox) /* out-prox */
 278                        wacom->id[0] = 0;
 279                input_report_key(input, wacom->tool[0], prox);
 280                input_report_abs(input, ABS_MISC, wacom->id[0]);
 281                return 1;
 282        }
 283}
 284
 285static int wacom_graphire_irq(struct wacom_wac *wacom)
 286{
 287        struct wacom_features *features = &wacom->features;
 288        unsigned char *data = wacom->data;
 289        struct input_dev *input = wacom->pen_input;
 290        struct input_dev *pad_input = wacom->pad_input;
 291        int battery_capacity, ps_connected;
 292        int prox;
 293        int rw = 0;
 294        int retval = 0;
 295
 296        if (features->type == GRAPHIRE_BT) {
 297                if (data[0] != WACOM_REPORT_PENABLED_BT) {
 298                        dev_dbg(input->dev.parent,
 299                                "%s: received unknown report #%d\n", __func__,
 300                                data[0]);
 301                        goto exit;
 302                }
 303        } else if (data[0] != WACOM_REPORT_PENABLED) {
 304                dev_dbg(input->dev.parent,
 305                        "%s: received unknown report #%d\n", __func__, data[0]);
 306                goto exit;
 307        }
 308
 309        prox = data[1] & 0x80;
 310        if (prox || wacom->id[0]) {
 311                if (prox) {
 312                        switch ((data[1] >> 5) & 3) {
 313
 314                        case 0: /* Pen */
 315                                wacom->tool[0] = BTN_TOOL_PEN;
 316                                wacom->id[0] = STYLUS_DEVICE_ID;
 317                                break;
 318
 319                        case 1: /* Rubber */
 320                                wacom->tool[0] = BTN_TOOL_RUBBER;
 321                                wacom->id[0] = ERASER_DEVICE_ID;
 322                                break;
 323
 324                        case 2: /* Mouse with wheel */
 325                                input_report_key(input, BTN_MIDDLE, data[1] & 0x04);
 326                                /* fall through */
 327
 328                        case 3: /* Mouse without wheel */
 329                                wacom->tool[0] = BTN_TOOL_MOUSE;
 330                                wacom->id[0] = CURSOR_DEVICE_ID;
 331                                break;
 332                        }
 333                }
 334                input_report_abs(input, ABS_X, le16_to_cpup((__le16 *)&data[2]));
 335                input_report_abs(input, ABS_Y, le16_to_cpup((__le16 *)&data[4]));
 336                if (wacom->tool[0] != BTN_TOOL_MOUSE) {
 337                        if (features->type == GRAPHIRE_BT)
 338                                input_report_abs(input, ABS_PRESSURE, data[6] |
 339                                        (((__u16) (data[1] & 0x08)) << 5));
 340                        else
 341                                input_report_abs(input, ABS_PRESSURE, data[6] |
 342                                        ((data[7] & 0x03) << 8));
 343                        input_report_key(input, BTN_TOUCH, data[1] & 0x01);
 344                        input_report_key(input, BTN_STYLUS, data[1] & 0x02);
 345                        input_report_key(input, BTN_STYLUS2, data[1] & 0x04);
 346                } else {
 347                        input_report_key(input, BTN_LEFT, data[1] & 0x01);
 348                        input_report_key(input, BTN_RIGHT, data[1] & 0x02);
 349                        if (features->type == WACOM_G4 ||
 350                                        features->type == WACOM_MO) {
 351                                input_report_abs(input, ABS_DISTANCE, data[6] & 0x3f);
 352                                rw = (data[7] & 0x04) - (data[7] & 0x03);
 353                        } else if (features->type == GRAPHIRE_BT) {
 354                                /* Compute distance between mouse and tablet */
 355                                rw = 44 - (data[6] >> 2);
 356                                rw = clamp_val(rw, 0, 31);
 357                                input_report_abs(input, ABS_DISTANCE, rw);
 358                                if (((data[1] >> 5) & 3) == 2) {
 359                                        /* Mouse with wheel */
 360                                        input_report_key(input, BTN_MIDDLE,
 361                                                        data[1] & 0x04);
 362                                        rw = (data[6] & 0x01) ? -1 :
 363                                                (data[6] & 0x02) ? 1 : 0;
 364                                } else {
 365                                        rw = 0;
 366                                }
 367                        } else {
 368                                input_report_abs(input, ABS_DISTANCE, data[7] & 0x3f);
 369                                rw = -(signed char)data[6];
 370                        }
 371                        input_report_rel(input, REL_WHEEL, rw);
 372                }
 373
 374                if (!prox)
 375                        wacom->id[0] = 0;
 376                input_report_abs(input, ABS_MISC, wacom->id[0]); /* report tool id */
 377                input_report_key(input, wacom->tool[0], prox);
 378                input_sync(input); /* sync last event */
 379        }
 380
 381        /* send pad data */
 382        switch (features->type) {
 383        case WACOM_G4:
 384                prox = data[7] & 0xf8;
 385                if (prox || wacom->id[1]) {
 386                        wacom->id[1] = PAD_DEVICE_ID;
 387                        input_report_key(pad_input, BTN_BACK, (data[7] & 0x40));
 388                        input_report_key(pad_input, BTN_FORWARD, (data[7] & 0x80));
 389                        rw = ((data[7] & 0x18) >> 3) - ((data[7] & 0x20) >> 3);
 390                        input_report_rel(pad_input, REL_WHEEL, rw);
 391                        if (!prox)
 392                                wacom->id[1] = 0;
 393                        input_report_abs(pad_input, ABS_MISC, wacom->id[1]);
 394                        retval = 1;
 395                }
 396                break;
 397
 398        case WACOM_MO:
 399                prox = (data[7] & 0xf8) || data[8];
 400                if (prox || wacom->id[1]) {
 401                        wacom->id[1] = PAD_DEVICE_ID;
 402                        input_report_key(pad_input, BTN_BACK, (data[7] & 0x08));
 403                        input_report_key(pad_input, BTN_LEFT, (data[7] & 0x20));
 404                        input_report_key(pad_input, BTN_FORWARD, (data[7] & 0x10));
 405                        input_report_key(pad_input, BTN_RIGHT, (data[7] & 0x40));
 406                        input_report_abs(pad_input, ABS_WHEEL, (data[8] & 0x7f));
 407                        if (!prox)
 408                                wacom->id[1] = 0;
 409                        input_report_abs(pad_input, ABS_MISC, wacom->id[1]);
 410                        retval = 1;
 411                }
 412                break;
 413        case GRAPHIRE_BT:
 414                prox = data[7] & 0x03;
 415                if (prox || wacom->id[1]) {
 416                        wacom->id[1] = PAD_DEVICE_ID;
 417                        input_report_key(pad_input, BTN_0, (data[7] & 0x02));
 418                        input_report_key(pad_input, BTN_1, (data[7] & 0x01));
 419                        if (!prox)
 420                                wacom->id[1] = 0;
 421                        input_report_abs(pad_input, ABS_MISC, wacom->id[1]);
 422                        retval = 1;
 423                }
 424                break;
 425        }
 426
 427        /* Store current battery capacity and power supply state */
 428        if (features->type == GRAPHIRE_BT) {
 429                rw = (data[7] >> 2 & 0x07);
 430                battery_capacity = batcap_gr[rw];
 431                ps_connected = rw == 7;
 432                wacom_notify_battery(wacom, battery_capacity, ps_connected,
 433                                     1, ps_connected);
 434        }
 435exit:
 436        return retval;
 437}
 438
 439static void wacom_intuos_schedule_prox_event(struct wacom_wac *wacom_wac)
 440{
 441        struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac);
 442        struct wacom_features *features = &wacom_wac->features;
 443        struct hid_report *r;
 444        struct hid_report_enum *re;
 445
 446        re = &(wacom->hdev->report_enum[HID_FEATURE_REPORT]);
 447        if (features->type == INTUOSHT2)
 448                r = re->report_id_hash[WACOM_REPORT_INTUOSHT2_ID];
 449        else
 450                r = re->report_id_hash[WACOM_REPORT_INTUOS_ID1];
 451        if (r) {
 452                hid_hw_request(wacom->hdev, r, HID_REQ_GET_REPORT);
 453        }
 454}
 455
 456static int wacom_intuos_pad(struct wacom_wac *wacom)
 457{
 458        struct wacom_features *features = &wacom->features;
 459        unsigned char *data = wacom->data;
 460        struct input_dev *input = wacom->pad_input;
 461        int i;
 462        int buttons = 0, nbuttons = features->numbered_buttons;
 463        int keys = 0, nkeys = 0;
 464        int ring1 = 0, ring2 = 0;
 465        int strip1 = 0, strip2 = 0;
 466        bool prox = false;
 467
 468        /* pad packets. Works as a second tool and is always in prox */
 469        if (!(data[0] == WACOM_REPORT_INTUOSPAD || data[0] == WACOM_REPORT_INTUOS5PAD ||
 470              data[0] == WACOM_REPORT_CINTIQPAD))
 471                return 0;
 472
 473        if (features->type >= INTUOS4S && features->type <= INTUOS4L) {
 474                buttons = (data[3] << 1) | (data[2] & 0x01);
 475                ring1 = data[1];
 476        } else if (features->type == DTK) {
 477                buttons = data[6];
 478        } else if (features->type == WACOM_13HD) {
 479                buttons = (data[4] << 1) | (data[3] & 0x01);
 480        } else if (features->type == WACOM_24HD) {
 481                buttons = (data[8] << 8) | data[6];
 482                ring1 = data[1];
 483                ring2 = data[2];
 484
 485                /*
 486                 * Three "buttons" are available on the 24HD which are
 487                 * physically implemented as a touchstrip. Each button
 488                 * is approximately 3 bits wide with a 2 bit spacing.
 489                 * The raw touchstrip bits are stored at:
 490                 *    ((data[3] & 0x1f) << 8) | data[4])
 491                 */
 492                nkeys = 3;
 493                keys = ((data[3] & 0x1C) ? 1<<2 : 0) |
 494                       ((data[4] & 0xE0) ? 1<<1 : 0) |
 495                       ((data[4] & 0x07) ? 1<<0 : 0);
 496        } else if (features->type == WACOM_27QHD) {
 497                nkeys = 3;
 498                keys = data[2] & 0x07;
 499
 500                input_report_abs(input, ABS_X, be16_to_cpup((__be16 *)&data[4]));
 501                input_report_abs(input, ABS_Y, be16_to_cpup((__be16 *)&data[6]));
 502                input_report_abs(input, ABS_Z, be16_to_cpup((__be16 *)&data[8]));
 503        } else if (features->type == CINTIQ_HYBRID) {
 504                /*
 505                 * Do not send hardware buttons under Android. They
 506                 * are already sent to the system through GPIO (and
 507                 * have different meaning).
 508                 *
 509                 * d-pad right  -> data[4] & 0x10
 510                 * d-pad up     -> data[4] & 0x20
 511                 * d-pad left   -> data[4] & 0x40
 512                 * d-pad down   -> data[4] & 0x80
 513                 * d-pad center -> data[3] & 0x01
 514                 */
 515                buttons = (data[4] << 1) | (data[3] & 0x01);
 516        } else if (features->type == CINTIQ_COMPANION_2) {
 517                /* d-pad right  -> data[4] & 0x10
 518                 * d-pad up     -> data[4] & 0x20
 519                 * d-pad left   -> data[4] & 0x40
 520                 * d-pad down   -> data[4] & 0x80
 521                 * d-pad center -> data[3] & 0x01
 522                 */
 523                buttons = ((data[2] >> 4) << 7) |
 524                          ((data[1] & 0x04) << 6) |
 525                          ((data[2] & 0x0F) << 2) |
 526                          (data[1] & 0x03);
 527        } else if (features->type >= INTUOS5S && features->type <= INTUOSPL) {
 528                /*
 529                 * ExpressKeys on Intuos5/Intuos Pro have a capacitive sensor in
 530                 * addition to the mechanical switch. Switch data is
 531                 * stored in data[4], capacitive data in data[5].
 532                 *
 533                 * Touch ring mode switch (data[3]) has no capacitive sensor
 534                 */
 535                buttons = (data[4] << 1) | (data[3] & 0x01);
 536                ring1 = data[2];
 537        } else {
 538                if (features->type == WACOM_21UX2 || features->type == WACOM_22HD) {
 539                        buttons = (data[8] << 10) | ((data[7] & 0x01) << 9) |
 540                                  (data[6] << 1) | (data[5] & 0x01);
 541
 542                        if (features->type == WACOM_22HD) {
 543                                nkeys = 3;
 544                                keys = data[9] & 0x07;
 545                        }
 546                } else {
 547                        buttons = ((data[6] & 0x10) << 10) |
 548                                  ((data[5] & 0x10) << 9)  |
 549                                  ((data[6] & 0x0F) << 4)  |
 550                                  (data[5] & 0x0F);
 551                }
 552                strip1 = ((data[1] & 0x1f) << 8) | data[2];
 553                strip2 = ((data[3] & 0x1f) << 8) | data[4];
 554        }
 555
 556        prox = (buttons & ~(~0 << nbuttons)) | (keys & ~(~0 << nkeys)) |
 557               (ring1 & 0x80) | (ring2 & 0x80) | strip1 | strip2;
 558
 559        wacom_report_numbered_buttons(input, nbuttons, buttons);
 560
 561        for (i = 0; i < nkeys; i++)
 562                input_report_key(input, KEY_PROG1 + i, keys & (1 << i));
 563
 564        input_report_abs(input, ABS_RX, strip1);
 565        input_report_abs(input, ABS_RY, strip2);
 566
 567        input_report_abs(input, ABS_WHEEL,    (ring1 & 0x80) ? (ring1 & 0x7f) : 0);
 568        input_report_abs(input, ABS_THROTTLE, (ring2 & 0x80) ? (ring2 & 0x7f) : 0);
 569
 570        input_report_key(input, wacom->tool[1], prox ? 1 : 0);
 571        input_report_abs(input, ABS_MISC, prox ? PAD_DEVICE_ID : 0);
 572
 573        input_event(input, EV_MSC, MSC_SERIAL, 0xffffffff);
 574
 575        return 1;
 576}
 577
 578static int wacom_intuos_get_tool_type(int tool_id)
 579{
 580        int tool_type;
 581
 582        switch (tool_id) {
 583        case 0x812: /* Inking pen */
 584        case 0x801: /* Intuos3 Inking pen */
 585        case 0x120802: /* Intuos4/5 Inking Pen */
 586        case 0x012:
 587                tool_type = BTN_TOOL_PENCIL;
 588                break;
 589
 590        case 0x822: /* Pen */
 591        case 0x842:
 592        case 0x852:
 593        case 0x823: /* Intuos3 Grip Pen */
 594        case 0x813: /* Intuos3 Classic Pen */
 595        case 0x885: /* Intuos3 Marker Pen */
 596        case 0x802: /* Intuos4/5 13HD/24HD General Pen */
 597        case 0x804: /* Intuos4/5 13HD/24HD Marker Pen */
 598        case 0x8e2: /* IntuosHT2 pen */
 599        case 0x022:
 600        case 0x100804: /* Intuos4/5 13HD/24HD Art Pen */
 601        case 0x140802: /* Intuos4/5 13HD/24HD Classic Pen */
 602        case 0x160802: /* Cintiq 13HD Pro Pen */
 603        case 0x180802: /* DTH2242 Pen */
 604        case 0x100802: /* Intuos4/5 13HD/24HD General Pen */
 605                tool_type = BTN_TOOL_PEN;
 606                break;
 607
 608        case 0x832: /* Stroke pen */
 609        case 0x032:
 610                tool_type = BTN_TOOL_BRUSH;
 611                break;
 612
 613        case 0x007: /* Mouse 4D and 2D */
 614        case 0x09c:
 615        case 0x094:
 616        case 0x017: /* Intuos3 2D Mouse */
 617        case 0x806: /* Intuos4 Mouse */
 618                tool_type = BTN_TOOL_MOUSE;
 619                break;
 620
 621        case 0x096: /* Lens cursor */
 622        case 0x097: /* Intuos3 Lens cursor */
 623        case 0x006: /* Intuos4 Lens cursor */
 624                tool_type = BTN_TOOL_LENS;
 625                break;
 626
 627        case 0x82a: /* Eraser */
 628        case 0x85a:
 629        case 0x91a:
 630        case 0xd1a:
 631        case 0x0fa:
 632        case 0x82b: /* Intuos3 Grip Pen Eraser */
 633        case 0x81b: /* Intuos3 Classic Pen Eraser */
 634        case 0x91b: /* Intuos3 Airbrush Eraser */
 635        case 0x80c: /* Intuos4/5 13HD/24HD Marker Pen Eraser */
 636        case 0x80a: /* Intuos4/5 13HD/24HD General Pen Eraser */
 637        case 0x90a: /* Intuos4/5 13HD/24HD Airbrush Eraser */
 638        case 0x14080a: /* Intuos4/5 13HD/24HD Classic Pen Eraser */
 639        case 0x10090a: /* Intuos4/5 13HD/24HD Airbrush Eraser */
 640        case 0x10080c: /* Intuos4/5 13HD/24HD Art Pen Eraser */
 641        case 0x16080a: /* Cintiq 13HD Pro Pen Eraser */
 642        case 0x18080a: /* DTH2242 Eraser */
 643        case 0x10080a: /* Intuos4/5 13HD/24HD General Pen Eraser */
 644                tool_type = BTN_TOOL_RUBBER;
 645                break;
 646
 647        case 0xd12:
 648        case 0x912:
 649        case 0x112:
 650        case 0x913: /* Intuos3 Airbrush */
 651        case 0x902: /* Intuos4/5 13HD/24HD Airbrush */
 652        case 0x100902: /* Intuos4/5 13HD/24HD Airbrush */
 653                tool_type = BTN_TOOL_AIRBRUSH;
 654                break;
 655
 656        default: /* Unknown tool */
 657                tool_type = BTN_TOOL_PEN;
 658                break;
 659        }
 660        return tool_type;
 661}
 662
 663static int wacom_intuos_inout(struct wacom_wac *wacom)
 664{
 665        struct wacom_features *features = &wacom->features;
 666        unsigned char *data = wacom->data;
 667        struct input_dev *input = wacom->pen_input;
 668        int idx = (features->type == INTUOS) ? (data[1] & 0x01) : 0;
 669
 670        if (!(((data[1] & 0xfc) == 0xc0) ||  /* in prox */
 671            ((data[1] & 0xfe) == 0x20) ||    /* in range */
 672            ((data[1] & 0xfe) == 0x80)))     /* out prox */
 673                return 0;
 674
 675        /* Enter report */
 676        if ((data[1] & 0xfc) == 0xc0) {
 677                /* serial number of the tool */
 678                wacom->serial[idx] = ((data[3] & 0x0f) << 28) +
 679                        (data[4] << 20) + (data[5] << 12) +
 680                        (data[6] << 4) + (data[7] >> 4);
 681
 682                wacom->id[idx] = (data[2] << 4) | (data[3] >> 4) |
 683                        ((data[7] & 0x0f) << 20) | ((data[8] & 0xf0) << 12);
 684
 685                wacom->tool[idx] = wacom_intuos_get_tool_type(wacom->id[idx]);
 686
 687                wacom->shared->stylus_in_proximity = true;
 688                return 1;
 689        }
 690
 691        /* in Range */
 692        if ((data[1] & 0xfe) == 0x20) {
 693                if (features->type != INTUOSHT2)
 694                        wacom->shared->stylus_in_proximity = true;
 695
 696                /* in Range while exiting */
 697                if (wacom->reporting_data) {
 698                        input_report_key(input, BTN_TOUCH, 0);
 699                        input_report_abs(input, ABS_PRESSURE, 0);
 700                        input_report_abs(input, ABS_DISTANCE, wacom->features.distance_max);
 701                        return 2;
 702                }
 703                return 1;
 704        }
 705
 706        /* Exit report */
 707        if ((data[1] & 0xfe) == 0x80) {
 708                wacom->shared->stylus_in_proximity = false;
 709                wacom->reporting_data = false;
 710
 711                /* don't report exit if we don't know the ID */
 712                if (!wacom->id[idx])
 713                        return 1;
 714
 715                /*
 716                 * Reset all states otherwise we lose the initial states
 717                 * when in-prox next time
 718                 */
 719                input_report_abs(input, ABS_X, 0);
 720                input_report_abs(input, ABS_Y, 0);
 721                input_report_abs(input, ABS_DISTANCE, 0);
 722                input_report_abs(input, ABS_TILT_X, 0);
 723                input_report_abs(input, ABS_TILT_Y, 0);
 724                if (wacom->tool[idx] >= BTN_TOOL_MOUSE) {
 725                        input_report_key(input, BTN_LEFT, 0);
 726                        input_report_key(input, BTN_MIDDLE, 0);
 727                        input_report_key(input, BTN_RIGHT, 0);
 728                        input_report_key(input, BTN_SIDE, 0);
 729                        input_report_key(input, BTN_EXTRA, 0);
 730                        input_report_abs(input, ABS_THROTTLE, 0);
 731                        input_report_abs(input, ABS_RZ, 0);
 732                } else {
 733                        input_report_abs(input, ABS_PRESSURE, 0);
 734                        input_report_key(input, BTN_STYLUS, 0);
 735                        input_report_key(input, BTN_STYLUS2, 0);
 736                        input_report_key(input, BTN_TOUCH, 0);
 737                        input_report_abs(input, ABS_WHEEL, 0);
 738                        if (features->type >= INTUOS3S)
 739                                input_report_abs(input, ABS_Z, 0);
 740                }
 741                input_report_key(input, wacom->tool[idx], 0);
 742                input_report_abs(input, ABS_MISC, 0); /* reset tool id */
 743                input_event(input, EV_MSC, MSC_SERIAL, wacom->serial[idx]);
 744                wacom->id[idx] = 0;
 745                return 2;
 746        }
 747
 748        return 0;
 749}
 750
 751static int wacom_remote_irq(struct wacom_wac *wacom_wac, size_t len)
 752{
 753        unsigned char *data = wacom_wac->data;
 754        struct input_dev *input = wacom_wac->pad_input;
 755        struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac);
 756        struct wacom_features *features = &wacom_wac->features;
 757        int bat_charging, bat_percent, touch_ring_mode;
 758        __u32 serial;
 759        int i;
 760
 761        if (data[0] != WACOM_REPORT_REMOTE) {
 762                dev_dbg(input->dev.parent,
 763                        "%s: received unknown report #%d", __func__, data[0]);
 764                return 0;
 765        }
 766
 767        serial = data[3] + (data[4] << 8) + (data[5] << 16);
 768        wacom_wac->id[0] = PAD_DEVICE_ID;
 769
 770        input_report_key(input, BTN_0, (data[9] & 0x01));
 771        input_report_key(input, BTN_1, (data[9] & 0x02));
 772        input_report_key(input, BTN_2, (data[9] & 0x04));
 773        input_report_key(input, BTN_3, (data[9] & 0x08));
 774        input_report_key(input, BTN_4, (data[9] & 0x10));
 775        input_report_key(input, BTN_5, (data[9] & 0x20));
 776        input_report_key(input, BTN_6, (data[9] & 0x40));
 777        input_report_key(input, BTN_7, (data[9] & 0x80));
 778
 779        input_report_key(input, BTN_8, (data[10] & 0x01));
 780        input_report_key(input, BTN_9, (data[10] & 0x02));
 781        input_report_key(input, BTN_A, (data[10] & 0x04));
 782        input_report_key(input, BTN_B, (data[10] & 0x08));
 783        input_report_key(input, BTN_C, (data[10] & 0x10));
 784        input_report_key(input, BTN_X, (data[10] & 0x20));
 785        input_report_key(input, BTN_Y, (data[10] & 0x40));
 786        input_report_key(input, BTN_Z, (data[10] & 0x80));
 787
 788        input_report_key(input, BTN_BASE, (data[11] & 0x01));
 789        input_report_key(input, BTN_BASE2, (data[11] & 0x02));
 790
 791        if (data[12] & 0x80)
 792                input_report_abs(input, ABS_WHEEL, (data[12] & 0x7f));
 793        else
 794                input_report_abs(input, ABS_WHEEL, 0);
 795
 796        bat_percent = data[7] & 0x7f;
 797        bat_charging = !!(data[7] & 0x80);
 798
 799        if (data[9] | data[10] | (data[11] & 0x03) | data[12])
 800                input_report_abs(input, ABS_MISC, PAD_DEVICE_ID);
 801        else
 802                input_report_abs(input, ABS_MISC, 0);
 803
 804        input_event(input, EV_MSC, MSC_SERIAL, serial);
 805
 806        /*Which mode select (LED light) is currently on?*/
 807        touch_ring_mode = (data[11] & 0xC0) >> 6;
 808
 809        for (i = 0; i < WACOM_MAX_REMOTES; i++) {
 810                if (wacom_wac->serial[i] == serial)
 811                        wacom->led.select[i] = touch_ring_mode;
 812        }
 813
 814        if (!wacom->battery &&
 815            !(features->quirks & WACOM_QUIRK_BATTERY)) {
 816                features->quirks |= WACOM_QUIRK_BATTERY;
 817                INIT_WORK(&wacom->work, wacom_battery_work);
 818                wacom_schedule_work(wacom_wac);
 819        }
 820
 821        wacom_notify_battery(wacom_wac, bat_percent, bat_charging, 1,
 822                             bat_charging);
 823
 824        return 1;
 825}
 826
 827static int wacom_remote_status_irq(struct wacom_wac *wacom_wac, size_t len)
 828{
 829        struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac);
 830        unsigned char *data = wacom_wac->data;
 831        int i;
 832
 833        if (data[0] != WACOM_REPORT_DEVICE_LIST)
 834                return 0;
 835
 836        for (i = 0; i < WACOM_MAX_REMOTES; i++) {
 837                int j = i * 6;
 838                int serial = (data[j+6] << 16) + (data[j+5] << 8) + data[j+4];
 839                bool connected = data[j+2];
 840
 841                if (connected) {
 842                        int k;
 843
 844                        if (wacom_wac->serial[i] == serial)
 845                                continue;
 846
 847                        if (wacom_wac->serial[i]) {
 848                                wacom_remote_destroy_attr_group(wacom,
 849                                                        wacom_wac->serial[i]);
 850                        }
 851
 852                        /* A remote can pair more than once with an EKR,
 853                         * check to make sure this serial isn't already paired.
 854                         */
 855                        for (k = 0; k < WACOM_MAX_REMOTES; k++) {
 856                                if (wacom_wac->serial[k] == serial)
 857                                        break;
 858                        }
 859
 860                        if (k < WACOM_MAX_REMOTES) {
 861                                wacom_wac->serial[i] = serial;
 862                                continue;
 863                        }
 864                        wacom_remote_create_attr_group(wacom, serial, i);
 865
 866                } else if (wacom_wac->serial[i]) {
 867                        wacom_remote_destroy_attr_group(wacom,
 868                                                        wacom_wac->serial[i]);
 869                }
 870        }
 871
 872        return 0;
 873}
 874
 875static int wacom_intuos_general(struct wacom_wac *wacom)
 876{
 877        struct wacom_features *features = &wacom->features;
 878        unsigned char *data = wacom->data;
 879        struct input_dev *input = wacom->pen_input;
 880        int idx = (features->type == INTUOS) ? (data[1] & 0x01) : 0;
 881        unsigned char type = (data[1] >> 1) & 0x0F;
 882        unsigned int x, y, distance, t;
 883
 884        if (data[0] != WACOM_REPORT_PENABLED && data[0] != WACOM_REPORT_CINTIQ &&
 885                data[0] != WACOM_REPORT_INTUOS_PEN)
 886                return 0;
 887
 888        if (wacom->shared->touch_down)
 889                return 1;
 890
 891        /* don't report events if we don't know the tool ID */
 892        if (!wacom->id[idx]) {
 893                /* but reschedule a read of the current tool */
 894                wacom_intuos_schedule_prox_event(wacom);
 895                return 1;
 896        }
 897
 898        /*
 899         * don't report events for invalid data
 900         */
 901        /* older I4 styli don't work with new Cintiqs */
 902        if ((!((wacom->id[idx] >> 20) & 0x01) &&
 903                        (features->type == WACOM_21UX2)) ||
 904            /* Only large Intuos support Lense Cursor */
 905            (wacom->tool[idx] == BTN_TOOL_LENS &&
 906                (features->type == INTUOS3 ||
 907                 features->type == INTUOS3S ||
 908                 features->type == INTUOS4 ||
 909                 features->type == INTUOS4S ||
 910                 features->type == INTUOS5 ||
 911                 features->type == INTUOS5S ||
 912                 features->type == INTUOSPM ||
 913                 features->type == INTUOSPS)) ||
 914           /* Cintiq doesn't send data when RDY bit isn't set */
 915           (features->type == CINTIQ && !(data[1] & 0x40)))
 916                return 1;
 917
 918        x = (be16_to_cpup((__be16 *)&data[2]) << 1) | ((data[9] >> 1) & 1);
 919        y = (be16_to_cpup((__be16 *)&data[4]) << 1) | (data[9] & 1);
 920        distance = data[9] >> 2;
 921        if (features->type < INTUOS3S) {
 922                x >>= 1;
 923                y >>= 1;
 924                distance >>= 1;
 925        }
 926        input_report_abs(input, ABS_X, x);
 927        input_report_abs(input, ABS_Y, y);
 928        input_report_abs(input, ABS_DISTANCE, distance);
 929
 930        switch (type) {
 931        case 0x00:
 932        case 0x01:
 933        case 0x02:
 934        case 0x03:
 935                /* general pen packet */
 936                t = (data[6] << 3) | ((data[7] & 0xC0) >> 5) | (data[1] & 1);
 937                if (features->pressure_max < 2047)
 938                        t >>= 1;
 939                input_report_abs(input, ABS_PRESSURE, t);
 940                if (features->type != INTUOSHT2) {
 941                    input_report_abs(input, ABS_TILT_X,
 942                                 (((data[7] << 1) & 0x7e) | (data[8] >> 7)) - 64);
 943                    input_report_abs(input, ABS_TILT_Y, (data[8] & 0x7f) - 64);
 944                }
 945                input_report_key(input, BTN_STYLUS, data[1] & 2);
 946                input_report_key(input, BTN_STYLUS2, data[1] & 4);
 947                input_report_key(input, BTN_TOUCH, t > 10);
 948                break;
 949
 950        case 0x0a:
 951                /* airbrush second packet */
 952                input_report_abs(input, ABS_WHEEL,
 953                                (data[6] << 2) | ((data[7] >> 6) & 3));
 954                input_report_abs(input, ABS_TILT_X,
 955                                 (((data[7] << 1) & 0x7e) | (data[8] >> 7)) - 64);
 956                input_report_abs(input, ABS_TILT_Y, (data[8] & 0x7f) - 64);
 957                break;
 958
 959        case 0x05:
 960                /* Rotation packet */
 961                if (features->type >= INTUOS3S) {
 962                        /* I3 marker pen rotation */
 963                        t = (data[6] << 3) | ((data[7] >> 5) & 7);
 964                        t = (data[7] & 0x20) ? ((t > 900) ? ((t-1) / 2 - 1350) :
 965                                ((t-1) / 2 + 450)) : (450 - t / 2) ;
 966                        input_report_abs(input, ABS_Z, t);
 967                } else {
 968                        /* 4D mouse 2nd packet */
 969                        t = (data[6] << 3) | ((data[7] >> 5) & 7);
 970                        input_report_abs(input, ABS_RZ, (data[7] & 0x20) ?
 971                                ((t - 1) / 2) : -t / 2);
 972                }
 973                break;
 974
 975        case 0x04:
 976                /* 4D mouse 1st packet */
 977                input_report_key(input, BTN_LEFT,   data[8] & 0x01);
 978                input_report_key(input, BTN_MIDDLE, data[8] & 0x02);
 979                input_report_key(input, BTN_RIGHT,  data[8] & 0x04);
 980
 981                input_report_key(input, BTN_SIDE,   data[8] & 0x20);
 982                input_report_key(input, BTN_EXTRA,  data[8] & 0x10);
 983                t = (data[6] << 2) | ((data[7] >> 6) & 3);
 984                input_report_abs(input, ABS_THROTTLE, (data[8] & 0x08) ? -t : t);
 985                break;
 986
 987        case 0x06:
 988                /* I4 mouse */
 989                input_report_key(input, BTN_LEFT,   data[6] & 0x01);
 990                input_report_key(input, BTN_MIDDLE, data[6] & 0x02);
 991                input_report_key(input, BTN_RIGHT,  data[6] & 0x04);
 992                input_report_rel(input, REL_WHEEL, ((data[7] & 0x80) >> 7)
 993                                 - ((data[7] & 0x40) >> 6));
 994                input_report_key(input, BTN_SIDE,   data[6] & 0x08);
 995                input_report_key(input, BTN_EXTRA,  data[6] & 0x10);
 996
 997                input_report_abs(input, ABS_TILT_X,
 998                        (((data[7] << 1) & 0x7e) | (data[8] >> 7)) - 64);
 999                input_report_abs(input, ABS_TILT_Y, (data[8] & 0x7f) - 64);
1000                break;
1001
1002        case 0x08:
1003                if (wacom->tool[idx] == BTN_TOOL_MOUSE) {
1004                        /* 2D mouse packet */
1005                        input_report_key(input, BTN_LEFT,   data[8] & 0x04);
1006                        input_report_key(input, BTN_MIDDLE, data[8] & 0x08);
1007                        input_report_key(input, BTN_RIGHT,  data[8] & 0x10);
1008                        input_report_rel(input, REL_WHEEL, (data[8] & 0x01)
1009                                         - ((data[8] & 0x02) >> 1));
1010
1011                        /* I3 2D mouse side buttons */
1012                        if (features->type >= INTUOS3S && features->type <= INTUOS3L) {
1013                                input_report_key(input, BTN_SIDE,   data[8] & 0x40);
1014                                input_report_key(input, BTN_EXTRA,  data[8] & 0x20);
1015                        }
1016                }
1017                else if (wacom->tool[idx] == BTN_TOOL_LENS) {
1018                        /* Lens cursor packets */
1019                        input_report_key(input, BTN_LEFT,   data[8] & 0x01);
1020                        input_report_key(input, BTN_MIDDLE, data[8] & 0x02);
1021                        input_report_key(input, BTN_RIGHT,  data[8] & 0x04);
1022                        input_report_key(input, BTN_SIDE,   data[8] & 0x10);
1023                        input_report_key(input, BTN_EXTRA,  data[8] & 0x08);
1024                }
1025                break;
1026
1027        case 0x07:
1028        case 0x09:
1029        case 0x0b:
1030        case 0x0c:
1031        case 0x0d:
1032        case 0x0e:
1033        case 0x0f:
1034                /* unhandled */
1035                break;
1036        }
1037
1038        input_report_abs(input, ABS_MISC, wacom->id[idx]); /* report tool id */
1039        input_report_key(input, wacom->tool[idx], 1);
1040        input_event(input, EV_MSC, MSC_SERIAL, wacom->serial[idx]);
1041        wacom->reporting_data = true;
1042        return 2;
1043}
1044
1045static int wacom_intuos_irq(struct wacom_wac *wacom)
1046{
1047        unsigned char *data = wacom->data;
1048        struct input_dev *input = wacom->pen_input;
1049        int result;
1050
1051        if (data[0] != WACOM_REPORT_PENABLED &&
1052            data[0] != WACOM_REPORT_INTUOS_ID1 &&
1053            data[0] != WACOM_REPORT_INTUOS_ID2 &&
1054            data[0] != WACOM_REPORT_INTUOSPAD &&
1055            data[0] != WACOM_REPORT_INTUOS_PEN &&
1056            data[0] != WACOM_REPORT_CINTIQ &&
1057            data[0] != WACOM_REPORT_CINTIQPAD &&
1058            data[0] != WACOM_REPORT_INTUOS5PAD) {
1059                dev_dbg(input->dev.parent,
1060                        "%s: received unknown report #%d\n", __func__, data[0]);
1061                return 0;
1062        }
1063
1064        /* process pad events */
1065        result = wacom_intuos_pad(wacom);
1066        if (result)
1067                return result;
1068
1069        /* process in/out prox events */
1070        result = wacom_intuos_inout(wacom);
1071        if (result)
1072                return result - 1;
1073
1074        /* process general packets */
1075        result = wacom_intuos_general(wacom);
1076        if (result)
1077                return result - 1;
1078
1079        return 0;
1080}
1081
1082static int int_dist(int x1, int y1, int x2, int y2)
1083{
1084        int x = x2 - x1;
1085        int y = y2 - y1;
1086
1087        return int_sqrt(x*x + y*y);
1088}
1089
1090static void wacom_intuos_bt_process_data(struct wacom_wac *wacom,
1091                unsigned char *data)
1092{
1093        memcpy(wacom->data, data, 10);
1094        wacom_intuos_irq(wacom);
1095
1096        input_sync(wacom->pen_input);
1097        if (wacom->pad_input)
1098                input_sync(wacom->pad_input);
1099}
1100
1101static int wacom_intuos_bt_irq(struct wacom_wac *wacom, size_t len)
1102{
1103        unsigned char data[WACOM_PKGLEN_MAX];
1104        int i = 1;
1105        unsigned power_raw, battery_capacity, bat_charging, ps_connected;
1106
1107        memcpy(data, wacom->data, len);
1108
1109        switch (data[0]) {
1110        case 0x04:
1111                wacom_intuos_bt_process_data(wacom, data + i);
1112                i += 10;
1113                /* fall through */
1114        case 0x03:
1115                wacom_intuos_bt_process_data(wacom, data + i);
1116                i += 10;
1117                wacom_intuos_bt_process_data(wacom, data + i);
1118                i += 10;
1119                power_raw = data[i];
1120                bat_charging = (power_raw & 0x08) ? 1 : 0;
1121                ps_connected = (power_raw & 0x10) ? 1 : 0;
1122                battery_capacity = batcap_i4[power_raw & 0x07];
1123                wacom_notify_battery(wacom, battery_capacity, bat_charging,
1124                                     battery_capacity || bat_charging,
1125                                     ps_connected);
1126                break;
1127        default:
1128                dev_dbg(wacom->pen_input->dev.parent,
1129                                "Unknown report: %d,%d size:%zu\n",
1130                                data[0], data[1], len);
1131                return 0;
1132        }
1133        return 0;
1134}
1135
1136static int wacom_wac_finger_count_touches(struct wacom_wac *wacom)
1137{
1138        struct input_dev *input = wacom->touch_input;
1139        unsigned touch_max = wacom->features.touch_max;
1140        int count = 0;
1141        int i;
1142
1143        if (!touch_max)
1144                return 0;
1145
1146        if (touch_max == 1)
1147                return test_bit(BTN_TOUCH, input->key) &&
1148                       !wacom->shared->stylus_in_proximity;
1149
1150        for (i = 0; i < input->mt->num_slots; i++) {
1151                struct input_mt_slot *ps = &input->mt->slots[i];
1152                int id = input_mt_get_value(ps, ABS_MT_TRACKING_ID);
1153                if (id >= 0)
1154                        count++;
1155        }
1156
1157        return count;
1158}
1159
1160static int wacom_24hdt_irq(struct wacom_wac *wacom)
1161{
1162        struct input_dev *input = wacom->touch_input;
1163        unsigned char *data = wacom->data;
1164        int i;
1165        int current_num_contacts = data[61];
1166        int contacts_to_send = 0;
1167        int num_contacts_left = 4; /* maximum contacts per packet */
1168        int byte_per_packet = WACOM_BYTES_PER_24HDT_PACKET;
1169        int y_offset = 2;
1170
1171        if (wacom->features.type == WACOM_27QHDT) {
1172                current_num_contacts = data[63];
1173                num_contacts_left = 10;
1174                byte_per_packet = WACOM_BYTES_PER_QHDTHID_PACKET;
1175                y_offset = 0;
1176        }
1177
1178        /*
1179         * First packet resets the counter since only the first
1180         * packet in series will have non-zero current_num_contacts.
1181         */
1182        if (current_num_contacts)
1183                wacom->num_contacts_left = current_num_contacts;
1184
1185        contacts_to_send = min(num_contacts_left, wacom->num_contacts_left);
1186
1187        for (i = 0; i < contacts_to_send; i++) {
1188                int offset = (byte_per_packet * i) + 1;
1189                bool touch = (data[offset] & 0x1) && !wacom->shared->stylus_in_proximity;
1190                int slot = input_mt_get_slot_by_key(input, data[offset + 1]);
1191
1192                if (slot < 0)
1193                        continue;
1194                input_mt_slot(input, slot);
1195                input_mt_report_slot_state(input, MT_TOOL_FINGER, touch);
1196
1197                if (touch) {
1198                        int t_x = get_unaligned_le16(&data[offset + 2]);
1199                        int t_y = get_unaligned_le16(&data[offset + 4 + y_offset]);
1200
1201                        input_report_abs(input, ABS_MT_POSITION_X, t_x);
1202                        input_report_abs(input, ABS_MT_POSITION_Y, t_y);
1203
1204                        if (wacom->features.type != WACOM_27QHDT) {
1205                                int c_x = get_unaligned_le16(&data[offset + 4]);
1206                                int c_y = get_unaligned_le16(&data[offset + 8]);
1207                                int w = get_unaligned_le16(&data[offset + 10]);
1208                                int h = get_unaligned_le16(&data[offset + 12]);
1209
1210                                input_report_abs(input, ABS_MT_TOUCH_MAJOR, min(w,h));
1211                                input_report_abs(input, ABS_MT_WIDTH_MAJOR,
1212                                                 min(w, h) + int_dist(t_x, t_y, c_x, c_y));
1213                                input_report_abs(input, ABS_MT_WIDTH_MINOR, min(w, h));
1214                                input_report_abs(input, ABS_MT_ORIENTATION, w > h);
1215                        }
1216                }
1217        }
1218        input_mt_sync_frame(input);
1219
1220        wacom->num_contacts_left -= contacts_to_send;
1221        if (wacom->num_contacts_left <= 0) {
1222                wacom->num_contacts_left = 0;
1223                wacom->shared->touch_down = wacom_wac_finger_count_touches(wacom);
1224        }
1225        return 1;
1226}
1227
1228static int wacom_mt_touch(struct wacom_wac *wacom)
1229{
1230        struct input_dev *input = wacom->touch_input;
1231        unsigned char *data = wacom->data;
1232        int i;
1233        int current_num_contacts = data[2];
1234        int contacts_to_send = 0;
1235        int x_offset = 0;
1236
1237        /* MTTPC does not support Height and Width */
1238        if (wacom->features.type == MTTPC || wacom->features.type == MTTPC_B)
1239                x_offset = -4;
1240
1241        /*
1242         * First packet resets the counter since only the first
1243         * packet in series will have non-zero current_num_contacts.
1244         */
1245        if (current_num_contacts)
1246                wacom->num_contacts_left = current_num_contacts;
1247
1248        /* There are at most 5 contacts per packet */
1249        contacts_to_send = min(5, wacom->num_contacts_left);
1250
1251        for (i = 0; i < contacts_to_send; i++) {
1252                int offset = (WACOM_BYTES_PER_MT_PACKET + x_offset) * i + 3;
1253                bool touch = (data[offset] & 0x1) && !wacom->shared->stylus_in_proximity;
1254                int id = get_unaligned_le16(&data[offset + 1]);
1255                int slot = input_mt_get_slot_by_key(input, id);
1256
1257                if (slot < 0)
1258                        continue;
1259
1260                input_mt_slot(input, slot);
1261                input_mt_report_slot_state(input, MT_TOOL_FINGER, touch);
1262                if (touch) {
1263                        int x = get_unaligned_le16(&data[offset + x_offset + 7]);
1264                        int y = get_unaligned_le16(&data[offset + x_offset + 9]);
1265                        input_report_abs(input, ABS_MT_POSITION_X, x);
1266                        input_report_abs(input, ABS_MT_POSITION_Y, y);
1267                }
1268        }
1269        input_mt_sync_frame(input);
1270
1271        wacom->num_contacts_left -= contacts_to_send;
1272        if (wacom->num_contacts_left <= 0) {
1273                wacom->num_contacts_left = 0;
1274                wacom->shared->touch_down = wacom_wac_finger_count_touches(wacom);
1275        }
1276        return 1;
1277}
1278
1279static int wacom_tpc_mt_touch(struct wacom_wac *wacom)
1280{
1281        struct input_dev *input = wacom->touch_input;
1282        unsigned char *data = wacom->data;
1283        int i;
1284
1285        for (i = 0; i < 2; i++) {
1286                int p = data[1] & (1 << i);
1287                bool touch = p && !wacom->shared->stylus_in_proximity;
1288
1289                input_mt_slot(input, i);
1290                input_mt_report_slot_state(input, MT_TOOL_FINGER, touch);
1291                if (touch) {
1292                        int x = le16_to_cpup((__le16 *)&data[i * 2 + 2]) & 0x7fff;
1293                        int y = le16_to_cpup((__le16 *)&data[i * 2 + 6]) & 0x7fff;
1294
1295                        input_report_abs(input, ABS_MT_POSITION_X, x);
1296                        input_report_abs(input, ABS_MT_POSITION_Y, y);
1297                }
1298        }
1299        input_mt_sync_frame(input);
1300
1301        /* keep touch state for pen event */
1302        wacom->shared->touch_down = wacom_wac_finger_count_touches(wacom);
1303
1304        return 1;
1305}
1306
1307static int wacom_tpc_single_touch(struct wacom_wac *wacom, size_t len)
1308{
1309        unsigned char *data = wacom->data;
1310        struct input_dev *input = wacom->touch_input;
1311        bool prox = !wacom->shared->stylus_in_proximity;
1312        int x = 0, y = 0;
1313
1314        if (wacom->features.touch_max > 1 || len > WACOM_PKGLEN_TPC2FG)
1315                return 0;
1316
1317        if (len == WACOM_PKGLEN_TPC1FG) {
1318                prox = prox && (data[0] & 0x01);
1319                x = get_unaligned_le16(&data[1]);
1320                y = get_unaligned_le16(&data[3]);
1321        } else if (len == WACOM_PKGLEN_TPC1FG_B) {
1322                prox = prox && (data[2] & 0x01);
1323                x = get_unaligned_le16(&data[3]);
1324                y = get_unaligned_le16(&data[5]);
1325        } else {
1326                prox = prox && (data[1] & 0x01);
1327                x = le16_to_cpup((__le16 *)&data[2]);
1328                y = le16_to_cpup((__le16 *)&data[4]);
1329        }
1330
1331        if (prox) {
1332                input_report_abs(input, ABS_X, x);
1333                input_report_abs(input, ABS_Y, y);
1334        }
1335        input_report_key(input, BTN_TOUCH, prox);
1336
1337        /* keep touch state for pen events */
1338        wacom->shared->touch_down = prox;
1339
1340        return 1;
1341}
1342
1343static int wacom_tpc_pen(struct wacom_wac *wacom)
1344{
1345        unsigned char *data = wacom->data;
1346        struct input_dev *input = wacom->pen_input;
1347        bool prox = data[1] & 0x20;
1348
1349        if (!wacom->shared->stylus_in_proximity) /* first in prox */
1350                /* Going into proximity select tool */
1351                wacom->tool[0] = (data[1] & 0x0c) ? BTN_TOOL_RUBBER : BTN_TOOL_PEN;
1352
1353        /* keep pen state for touch events */
1354        wacom->shared->stylus_in_proximity = prox;
1355
1356        /* send pen events only when touch is up or forced out */
1357        if (!wacom->shared->touch_down) {
1358                input_report_key(input, BTN_STYLUS, data[1] & 0x02);
1359                input_report_key(input, BTN_STYLUS2, data[1] & 0x10);
1360                input_report_abs(input, ABS_X, le16_to_cpup((__le16 *)&data[2]));
1361                input_report_abs(input, ABS_Y, le16_to_cpup((__le16 *)&data[4]));
1362                input_report_abs(input, ABS_PRESSURE, ((data[7] & 0x07) << 8) | data[6]);
1363                input_report_key(input, BTN_TOUCH, data[1] & 0x05);
1364                input_report_key(input, wacom->tool[0], prox);
1365                return 1;
1366        }
1367
1368        return 0;
1369}
1370
1371static int wacom_tpc_irq(struct wacom_wac *wacom, size_t len)
1372{
1373        unsigned char *data = wacom->data;
1374
1375        if (wacom->pen_input)
1376                dev_dbg(wacom->pen_input->dev.parent,
1377                        "%s: received report #%d\n", __func__, data[0]);
1378        else if (wacom->touch_input)
1379                dev_dbg(wacom->touch_input->dev.parent,
1380                        "%s: received report #%d\n", __func__, data[0]);
1381
1382        switch (len) {
1383        case WACOM_PKGLEN_TPC1FG:
1384                return wacom_tpc_single_touch(wacom, len);
1385
1386        case WACOM_PKGLEN_TPC2FG:
1387                return wacom_tpc_mt_touch(wacom);
1388
1389        case WACOM_PKGLEN_PENABLED:
1390                return wacom_tpc_pen(wacom);
1391
1392        default:
1393                switch (data[0]) {
1394                case WACOM_REPORT_TPC1FG:
1395                case WACOM_REPORT_TPCHID:
1396                case WACOM_REPORT_TPCST:
1397                case WACOM_REPORT_TPC1FGE:
1398                        return wacom_tpc_single_touch(wacom, len);
1399
1400                case WACOM_REPORT_TPCMT:
1401                case WACOM_REPORT_TPCMT2:
1402                        return wacom_mt_touch(wacom);
1403
1404                case WACOM_REPORT_PENABLED:
1405                        return wacom_tpc_pen(wacom);
1406                }
1407        }
1408
1409        return 0;
1410}
1411
1412static void wacom_map_usage(struct input_dev *input, struct hid_usage *usage,
1413                struct hid_field *field, __u8 type, __u16 code, int fuzz)
1414{
1415        int fmin = field->logical_minimum;
1416        int fmax = field->logical_maximum;
1417
1418        usage->type = type;
1419        usage->code = code;
1420
1421        set_bit(type, input->evbit);
1422
1423        switch (type) {
1424        case EV_ABS:
1425                input_set_abs_params(input, code, fmin, fmax, fuzz, 0);
1426                input_abs_set_res(input, code,
1427                                  hidinput_calc_abs_res(field, code));
1428                break;
1429        case EV_KEY:
1430                input_set_capability(input, EV_KEY, code);
1431                break;
1432        case EV_MSC:
1433                input_set_capability(input, EV_MSC, code);
1434                break;
1435        }
1436}
1437
1438static void wacom_wac_pen_usage_mapping(struct hid_device *hdev,
1439                struct hid_field *field, struct hid_usage *usage)
1440{
1441        struct wacom *wacom = hid_get_drvdata(hdev);
1442        struct wacom_wac *wacom_wac = &wacom->wacom_wac;
1443        struct input_dev *input = wacom_wac->pen_input;
1444
1445        switch (usage->hid) {
1446        case HID_GD_X:
1447                wacom_map_usage(input, usage, field, EV_ABS, ABS_X, 4);
1448                break;
1449        case HID_GD_Y:
1450                wacom_map_usage(input, usage, field, EV_ABS, ABS_Y, 4);
1451                break;
1452        case HID_DG_TIPPRESSURE:
1453                wacom_map_usage(input, usage, field, EV_ABS, ABS_PRESSURE, 0);
1454                break;
1455        case HID_DG_INRANGE:
1456                wacom_map_usage(input, usage, field, EV_KEY, BTN_TOOL_PEN, 0);
1457                break;
1458        case HID_DG_INVERT:
1459                wacom_map_usage(input, usage, field, EV_KEY,
1460                                BTN_TOOL_RUBBER, 0);
1461                break;
1462        case HID_DG_ERASER:
1463        case HID_DG_TIPSWITCH:
1464                wacom_map_usage(input, usage, field, EV_KEY, BTN_TOUCH, 0);
1465                break;
1466        case HID_DG_BARRELSWITCH:
1467                wacom_map_usage(input, usage, field, EV_KEY, BTN_STYLUS, 0);
1468                break;
1469        case HID_DG_BARRELSWITCH2:
1470                wacom_map_usage(input, usage, field, EV_KEY, BTN_STYLUS2, 0);
1471                break;
1472        case HID_DG_TOOLSERIALNUMBER:
1473                wacom_map_usage(input, usage, field, EV_MSC, MSC_SERIAL, 0);
1474                break;
1475        }
1476}
1477
1478static int wacom_wac_pen_event(struct hid_device *hdev, struct hid_field *field,
1479                struct hid_usage *usage, __s32 value)
1480{
1481        struct wacom *wacom = hid_get_drvdata(hdev);
1482        struct wacom_wac *wacom_wac = &wacom->wacom_wac;
1483        struct input_dev *input = wacom_wac->pen_input;
1484
1485        /* checking which Tool / tip switch to send */
1486        switch (usage->hid) {
1487        case HID_DG_INRANGE:
1488                wacom_wac->hid_data.inrange_state = value;
1489                return 0;
1490        case HID_DG_INVERT:
1491                wacom_wac->hid_data.invert_state = value;
1492                return 0;
1493        case HID_DG_ERASER:
1494        case HID_DG_TIPSWITCH:
1495                wacom_wac->hid_data.tipswitch |= value;
1496                return 0;
1497        }
1498
1499        /* send pen events only when touch is up or forced out */
1500        if (!usage->type || wacom_wac->shared->touch_down)
1501                return 0;
1502
1503        input_event(input, usage->type, usage->code, value);
1504
1505        return 0;
1506}
1507
1508static void wacom_wac_pen_pre_report(struct hid_device *hdev,
1509                struct hid_report *report)
1510{
1511        return;
1512}
1513
1514static void wacom_wac_pen_report(struct hid_device *hdev,
1515                struct hid_report *report)
1516{
1517        struct wacom *wacom = hid_get_drvdata(hdev);
1518        struct wacom_wac *wacom_wac = &wacom->wacom_wac;
1519        struct input_dev *input = wacom_wac->pen_input;
1520        bool prox = wacom_wac->hid_data.inrange_state;
1521
1522        if (!wacom_wac->shared->stylus_in_proximity) /* first in prox */
1523                /* Going into proximity select tool */
1524                wacom_wac->tool[0] = wacom_wac->hid_data.invert_state ?
1525                                                BTN_TOOL_RUBBER : BTN_TOOL_PEN;
1526
1527        /* keep pen state for touch events */
1528        wacom_wac->shared->stylus_in_proximity = prox;
1529
1530        /* send pen events only when touch is up or forced out */
1531        if (!wacom_wac->shared->touch_down) {
1532                input_report_key(input, BTN_TOUCH,
1533                                wacom_wac->hid_data.tipswitch);
1534                input_report_key(input, wacom_wac->tool[0], prox);
1535
1536                wacom_wac->hid_data.tipswitch = false;
1537
1538                input_sync(input);
1539        }
1540}
1541
1542static void wacom_wac_finger_usage_mapping(struct hid_device *hdev,
1543                struct hid_field *field, struct hid_usage *usage)
1544{
1545        struct wacom *wacom = hid_get_drvdata(hdev);
1546        struct wacom_wac *wacom_wac = &wacom->wacom_wac;
1547        struct wacom_features *features = &wacom_wac->features;
1548        struct input_dev *input = wacom_wac->touch_input;
1549        unsigned touch_max = wacom_wac->features.touch_max;
1550
1551        switch (usage->hid) {
1552        case HID_GD_X:
1553                features->last_slot_field = usage->hid;
1554                if (touch_max == 1)
1555                        wacom_map_usage(input, usage, field, EV_ABS, ABS_X, 4);
1556                else
1557                        wacom_map_usage(input, usage, field, EV_ABS,
1558                                        ABS_MT_POSITION_X, 4);
1559                break;
1560        case HID_GD_Y:
1561                features->last_slot_field = usage->hid;
1562                if (touch_max == 1)
1563                        wacom_map_usage(input, usage, field, EV_ABS, ABS_Y, 4);
1564                else
1565                        wacom_map_usage(input, usage, field, EV_ABS,
1566                                        ABS_MT_POSITION_Y, 4);
1567                break;
1568        case HID_DG_WIDTH:
1569        case HID_DG_HEIGHT:
1570                features->last_slot_field = usage->hid;
1571                wacom_map_usage(input, usage, field, EV_ABS, ABS_MT_TOUCH_MAJOR, 0);
1572                wacom_map_usage(input, usage, field, EV_ABS, ABS_MT_TOUCH_MINOR, 0);
1573                input_set_abs_params(input, ABS_MT_ORIENTATION, 0, 1, 0, 0);
1574                break;
1575        case HID_DG_CONTACTID:
1576                features->last_slot_field = usage->hid;
1577                break;
1578        case HID_DG_INRANGE:
1579                features->last_slot_field = usage->hid;
1580                break;
1581        case HID_DG_INVERT:
1582                features->last_slot_field = usage->hid;
1583                break;
1584        case HID_DG_TIPSWITCH:
1585                features->last_slot_field = usage->hid;
1586                wacom_map_usage(input, usage, field, EV_KEY, BTN_TOUCH, 0);
1587                break;
1588        case HID_DG_CONTACTCOUNT:
1589                wacom_wac->hid_data.cc_report = field->report->id;
1590                wacom_wac->hid_data.cc_index = field->index;
1591                wacom_wac->hid_data.cc_value_index = usage->usage_index;
1592                break;
1593        }
1594}
1595
1596static void wacom_wac_finger_slot(struct wacom_wac *wacom_wac,
1597                struct input_dev *input)
1598{
1599        struct hid_data *hid_data = &wacom_wac->hid_data;
1600        bool mt = wacom_wac->features.touch_max > 1;
1601        bool prox = hid_data->tipswitch &&
1602                    !wacom_wac->shared->stylus_in_proximity;
1603
1604        wacom_wac->hid_data.num_received++;
1605        if (wacom_wac->hid_data.num_received > wacom_wac->hid_data.num_expected)
1606                return;
1607
1608        if (mt) {
1609                int slot;
1610
1611                slot = input_mt_get_slot_by_key(input, hid_data->id);
1612                input_mt_slot(input, slot);
1613                input_mt_report_slot_state(input, MT_TOOL_FINGER, prox);
1614        }
1615        else {
1616                input_report_key(input, BTN_TOUCH, prox);
1617        }
1618
1619        if (prox) {
1620                input_report_abs(input, mt ? ABS_MT_POSITION_X : ABS_X,
1621                                 hid_data->x);
1622                input_report_abs(input, mt ? ABS_MT_POSITION_Y : ABS_Y,
1623                                 hid_data->y);
1624
1625                if (test_bit(ABS_MT_TOUCH_MAJOR, input->absbit)) {
1626                        input_report_abs(input, ABS_MT_TOUCH_MAJOR, max(hid_data->width, hid_data->height));
1627                        input_report_abs(input, ABS_MT_TOUCH_MINOR, min(hid_data->width, hid_data->height));
1628                        if (hid_data->width != hid_data->height)
1629                                input_report_abs(input, ABS_MT_ORIENTATION, hid_data->width <= hid_data->height ? 0 : 1);
1630                }
1631        }
1632}
1633
1634static int wacom_wac_finger_event(struct hid_device *hdev,
1635                struct hid_field *field, struct hid_usage *usage, __s32 value)
1636{
1637        struct wacom *wacom = hid_get_drvdata(hdev);
1638        struct wacom_wac *wacom_wac = &wacom->wacom_wac;
1639
1640        switch (usage->hid) {
1641        case HID_GD_X:
1642                wacom_wac->hid_data.x = value;
1643                break;
1644        case HID_GD_Y:
1645                wacom_wac->hid_data.y = value;
1646                break;
1647        case HID_DG_WIDTH:
1648                wacom_wac->hid_data.width = value;
1649                break;
1650        case HID_DG_HEIGHT:
1651                wacom_wac->hid_data.height = value;
1652                break;
1653        case HID_DG_CONTACTID:
1654                wacom_wac->hid_data.id = value;
1655                break;
1656        case HID_DG_TIPSWITCH:
1657                wacom_wac->hid_data.tipswitch = value;
1658                break;
1659        }
1660
1661
1662        if (usage->usage_index + 1 == field->report_count) {
1663                if (usage->hid == wacom_wac->features.last_slot_field)
1664                        wacom_wac_finger_slot(wacom_wac, wacom_wac->touch_input);
1665        }
1666
1667        return 0;
1668}
1669
1670static void wacom_wac_finger_pre_report(struct hid_device *hdev,
1671                struct hid_report *report)
1672{
1673        struct wacom *wacom = hid_get_drvdata(hdev);
1674        struct wacom_wac *wacom_wac = &wacom->wacom_wac;
1675        struct hid_data* hid_data = &wacom_wac->hid_data;
1676
1677        if (hid_data->cc_report != 0 &&
1678            hid_data->cc_report != report->id) {
1679                int i;
1680
1681                hid_data->cc_report = report->id;
1682                hid_data->cc_index = -1;
1683                hid_data->cc_value_index = -1;
1684
1685                for (i = 0; i < report->maxfield; i++) {
1686                        struct hid_field *field = report->field[i];
1687                        int j;
1688
1689                        for (j = 0; j < field->maxusage; j++) {
1690                                if (field->usage[j].hid == HID_DG_CONTACTCOUNT) {
1691                                        hid_data->cc_index = i;
1692                                        hid_data->cc_value_index = j;
1693
1694                                        /* break */
1695                                        i = report->maxfield;
1696                                        j = field->maxusage;
1697                                }
1698                        }
1699                }
1700        }
1701        if (hid_data->cc_report != 0 &&
1702            hid_data->cc_index >= 0) {
1703                struct hid_field *field = report->field[hid_data->cc_index];
1704                int value = field->value[hid_data->cc_value_index];
1705                if (value)
1706                        hid_data->num_expected = value;
1707        }
1708        else {
1709                hid_data->num_expected = wacom_wac->features.touch_max;
1710        }
1711}
1712
1713static void wacom_wac_finger_report(struct hid_device *hdev,
1714                struct hid_report *report)
1715{
1716        struct wacom *wacom = hid_get_drvdata(hdev);
1717        struct wacom_wac *wacom_wac = &wacom->wacom_wac;
1718        struct input_dev *input = wacom_wac->touch_input;
1719        unsigned touch_max = wacom_wac->features.touch_max;
1720
1721        /* If more packets of data are expected, give us a chance to
1722         * process them rather than immediately syncing a partial
1723         * update.
1724         */
1725        if (wacom_wac->hid_data.num_received < wacom_wac->hid_data.num_expected)
1726                return;
1727
1728        if (touch_max > 1)
1729                input_mt_sync_frame(input);
1730
1731        input_sync(input);
1732        wacom_wac->hid_data.num_received = 0;
1733
1734        /* keep touch state for pen event */
1735        wacom_wac->shared->touch_down = wacom_wac_finger_count_touches(wacom_wac);
1736}
1737
1738void wacom_wac_usage_mapping(struct hid_device *hdev,
1739                struct hid_field *field, struct hid_usage *usage)
1740{
1741        struct wacom *wacom = hid_get_drvdata(hdev);
1742        struct wacom_wac *wacom_wac = &wacom->wacom_wac;
1743
1744        /* currently, only direct devices have proper hid report descriptors */
1745        __set_bit(INPUT_PROP_DIRECT, wacom_wac->pen_input->propbit);
1746        __set_bit(INPUT_PROP_DIRECT, wacom_wac->touch_input->propbit);
1747
1748        if (WACOM_PEN_FIELD(field))
1749                return wacom_wac_pen_usage_mapping(hdev, field, usage);
1750
1751        if (WACOM_FINGER_FIELD(field))
1752                return wacom_wac_finger_usage_mapping(hdev, field, usage);
1753}
1754
1755int wacom_wac_event(struct hid_device *hdev, struct hid_field *field,
1756                struct hid_usage *usage, __s32 value)
1757{
1758        struct wacom *wacom = hid_get_drvdata(hdev);
1759
1760        if (wacom->wacom_wac.features.type != HID_GENERIC)
1761                return 0;
1762
1763        if (WACOM_PEN_FIELD(field))
1764                return wacom_wac_pen_event(hdev, field, usage, value);
1765
1766        if (WACOM_FINGER_FIELD(field))
1767                return wacom_wac_finger_event(hdev, field, usage, value);
1768
1769        return 0;
1770}
1771
1772static void wacom_report_events(struct hid_device *hdev, struct hid_report *report)
1773{
1774        int r;
1775
1776        for (r = 0; r < report->maxfield; r++) {
1777                struct hid_field *field;
1778                unsigned count, n;
1779
1780                field = report->field[r];
1781                count = field->report_count;
1782
1783                if (!(HID_MAIN_ITEM_VARIABLE & field->flags))
1784                        continue;
1785
1786                for (n = 0; n < count; n++)
1787                        wacom_wac_event(hdev, field, &field->usage[n], field->value[n]);
1788        }
1789}
1790
1791void wacom_wac_report(struct hid_device *hdev, struct hid_report *report)
1792{
1793        struct wacom *wacom = hid_get_drvdata(hdev);
1794        struct wacom_wac *wacom_wac = &wacom->wacom_wac;
1795        struct hid_field *field = report->field[0];
1796
1797        if (wacom_wac->features.type != HID_GENERIC)
1798                return;
1799
1800        if (WACOM_PEN_FIELD(field))
1801                wacom_wac_pen_pre_report(hdev, report);
1802
1803        if (WACOM_FINGER_FIELD(field))
1804                wacom_wac_finger_pre_report(hdev, report);
1805
1806        wacom_report_events(hdev, report);
1807
1808        if (WACOM_PEN_FIELD(field))
1809                return wacom_wac_pen_report(hdev, report);
1810
1811        if (WACOM_FINGER_FIELD(field))
1812                return wacom_wac_finger_report(hdev, report);
1813}
1814
1815static int wacom_bpt_touch(struct wacom_wac *wacom)
1816{
1817        struct wacom_features *features = &wacom->features;
1818        struct input_dev *input = wacom->touch_input;
1819        struct input_dev *pad_input = wacom->pad_input;
1820        unsigned char *data = wacom->data;
1821        int i;
1822
1823        if (data[0] != 0x02)
1824            return 0;
1825
1826        for (i = 0; i < 2; i++) {
1827                int offset = (data[1] & 0x80) ? (8 * i) : (9 * i);
1828                bool touch = data[offset + 3] & 0x80;
1829
1830                /*
1831                 * Touch events need to be disabled while stylus is
1832                 * in proximity because user's hand is resting on touchpad
1833                 * and sending unwanted events.  User expects tablet buttons
1834                 * to continue working though.
1835                 */
1836                touch = touch && !wacom->shared->stylus_in_proximity;
1837
1838                input_mt_slot(input, i);
1839                input_mt_report_slot_state(input, MT_TOOL_FINGER, touch);
1840                if (touch) {
1841                        int x = get_unaligned_be16(&data[offset + 3]) & 0x7ff;
1842                        int y = get_unaligned_be16(&data[offset + 5]) & 0x7ff;
1843                        if (features->quirks & WACOM_QUIRK_BBTOUCH_LOWRES) {
1844                                x <<= 5;
1845                                y <<= 5;
1846                        }
1847                        input_report_abs(input, ABS_MT_POSITION_X, x);
1848                        input_report_abs(input, ABS_MT_POSITION_Y, y);
1849                }
1850        }
1851
1852        input_mt_sync_frame(input);
1853
1854        input_report_key(pad_input, BTN_LEFT, (data[1] & 0x08) != 0);
1855        input_report_key(pad_input, BTN_FORWARD, (data[1] & 0x04) != 0);
1856        input_report_key(pad_input, BTN_BACK, (data[1] & 0x02) != 0);
1857        input_report_key(pad_input, BTN_RIGHT, (data[1] & 0x01) != 0);
1858        wacom->shared->touch_down = wacom_wac_finger_count_touches(wacom);
1859
1860        return 1;
1861}
1862
1863static void wacom_bpt3_touch_msg(struct wacom_wac *wacom, unsigned char *data)
1864{
1865        struct wacom_features *features = &wacom->features;
1866        struct input_dev *input = wacom->touch_input;
1867        bool touch = data[1] & 0x80;
1868        int slot = input_mt_get_slot_by_key(input, data[0]);
1869
1870        if (slot < 0)
1871                return;
1872
1873        touch = touch && !wacom->shared->stylus_in_proximity;
1874
1875        input_mt_slot(input, slot);
1876        input_mt_report_slot_state(input, MT_TOOL_FINGER, touch);
1877
1878        if (touch) {
1879                int x = (data[2] << 4) | (data[4] >> 4);
1880                int y = (data[3] << 4) | (data[4] & 0x0f);
1881                int width, height;
1882
1883                if (features->type >= INTUOSPS && features->type <= INTUOSHT2) {
1884                        width  = data[5] * 100;
1885                        height = data[6] * 100;
1886                } else {
1887                        /*
1888                         * "a" is a scaled-down area which we assume is
1889                         * roughly circular and which can be described as:
1890                         * a=(pi*r^2)/C.
1891                         */
1892                        int a = data[5];
1893                        int x_res = input_abs_get_res(input, ABS_MT_POSITION_X);
1894                        int y_res = input_abs_get_res(input, ABS_MT_POSITION_Y);
1895                        width = 2 * int_sqrt(a * WACOM_CONTACT_AREA_SCALE);
1896                        height = width * y_res / x_res;
1897                }
1898
1899                input_report_abs(input, ABS_MT_POSITION_X, x);
1900                input_report_abs(input, ABS_MT_POSITION_Y, y);
1901                input_report_abs(input, ABS_MT_TOUCH_MAJOR, width);
1902                input_report_abs(input, ABS_MT_TOUCH_MINOR, height);
1903        }
1904}
1905
1906static void wacom_bpt3_button_msg(struct wacom_wac *wacom, unsigned char *data)
1907{
1908        struct input_dev *input = wacom->pad_input;
1909        struct wacom_features *features = &wacom->features;
1910
1911        if (features->type == INTUOSHT || features->type == INTUOSHT2) {
1912                input_report_key(input, BTN_LEFT, (data[1] & 0x02) != 0);
1913                input_report_key(input, BTN_BACK, (data[1] & 0x08) != 0);
1914        } else {
1915                input_report_key(input, BTN_BACK, (data[1] & 0x02) != 0);
1916                input_report_key(input, BTN_LEFT, (data[1] & 0x08) != 0);
1917        }
1918        input_report_key(input, BTN_FORWARD, (data[1] & 0x04) != 0);
1919        input_report_key(input, BTN_RIGHT, (data[1] & 0x01) != 0);
1920}
1921
1922static int wacom_bpt3_touch(struct wacom_wac *wacom)
1923{
1924        unsigned char *data = wacom->data;
1925        int count = data[1] & 0x07;
1926        int  touch_changed = 0, i;
1927
1928        if (data[0] != 0x02)
1929            return 0;
1930
1931        /* data has up to 7 fixed sized 8-byte messages starting at data[2] */
1932        for (i = 0; i < count; i++) {
1933                int offset = (8 * i) + 2;
1934                int msg_id = data[offset];
1935
1936                if (msg_id >= 2 && msg_id <= 17) {
1937                        wacom_bpt3_touch_msg(wacom, data + offset);
1938                        touch_changed++;
1939                } else if (msg_id == 128)
1940                        wacom_bpt3_button_msg(wacom, data + offset);
1941
1942        }
1943
1944        /* only update touch if we actually have a touchpad and touch data changed */
1945        if (wacom->touch_registered && touch_changed) {
1946                input_mt_sync_frame(wacom->touch_input);
1947                wacom->shared->touch_down = wacom_wac_finger_count_touches(wacom);
1948        }
1949
1950        return 1;
1951}
1952
1953static int wacom_bpt_pen(struct wacom_wac *wacom)
1954{
1955        struct wacom_features *features = &wacom->features;
1956        struct input_dev *input = wacom->pen_input;
1957        unsigned char *data = wacom->data;
1958        int prox = 0, x = 0, y = 0, p = 0, d = 0, pen = 0, btn1 = 0, btn2 = 0;
1959
1960        if (data[0] != WACOM_REPORT_PENABLED)
1961            return 0;
1962
1963        prox = (data[1] & 0x20) == 0x20;
1964
1965        /*
1966         * All reports shared between PEN and RUBBER tool must be
1967         * forced to a known starting value (zero) when transitioning to
1968         * out-of-prox.
1969         *
1970         * If not reset then, to userspace, it will look like lost events
1971         * if new tool comes in-prox with same values as previous tool sent.
1972         *
1973         * Hardware does report zero in most out-of-prox cases but not all.
1974         */
1975        if (!wacom->shared->stylus_in_proximity) {
1976                if (data[1] & 0x08) {
1977                        wacom->tool[0] = BTN_TOOL_RUBBER;
1978                        wacom->id[0] = ERASER_DEVICE_ID;
1979                } else {
1980                        wacom->tool[0] = BTN_TOOL_PEN;
1981                        wacom->id[0] = STYLUS_DEVICE_ID;
1982                }
1983        }
1984
1985        wacom->shared->stylus_in_proximity = prox;
1986        if (wacom->shared->touch_down)
1987                return 0;
1988
1989        if (prox) {
1990                x = le16_to_cpup((__le16 *)&data[2]);
1991                y = le16_to_cpup((__le16 *)&data[4]);
1992                p = le16_to_cpup((__le16 *)&data[6]);
1993                /*
1994                 * Convert distance from out prox to distance from tablet.
1995                 * distance will be greater than distance_max once
1996                 * touching and applying pressure; do not report negative
1997                 * distance.
1998                 */
1999                if (data[8] <= features->distance_max)
2000                        d = features->distance_max - data[8];
2001
2002                pen = data[1] & 0x01;
2003                btn1 = data[1] & 0x02;
2004                btn2 = data[1] & 0x04;
2005        } else {
2006                wacom->id[0] = 0;
2007        }
2008
2009        input_report_key(input, BTN_TOUCH, pen);
2010        input_report_key(input, BTN_STYLUS, btn1);
2011        input_report_key(input, BTN_STYLUS2, btn2);
2012
2013        input_report_abs(input, ABS_X, x);
2014        input_report_abs(input, ABS_Y, y);
2015        input_report_abs(input, ABS_PRESSURE, p);
2016        input_report_abs(input, ABS_DISTANCE, d);
2017
2018        input_report_key(input, wacom->tool[0], prox); /* PEN or RUBBER */
2019        input_report_abs(input, ABS_MISC, wacom->id[0]); /* TOOL ID */
2020
2021        return 1;
2022}
2023
2024static int wacom_bpt_irq(struct wacom_wac *wacom, size_t len)
2025{
2026        struct wacom_features *features = &wacom->features;
2027
2028        if ((features->type == INTUOSHT2) &&
2029            (features->device_type & WACOM_DEVICETYPE_PEN))
2030                return wacom_intuos_irq(wacom);
2031        else if (len == WACOM_PKGLEN_BBTOUCH)
2032                return wacom_bpt_touch(wacom);
2033        else if (len == WACOM_PKGLEN_BBTOUCH3)
2034                return wacom_bpt3_touch(wacom);
2035        else if (len == WACOM_PKGLEN_BBFUN || len == WACOM_PKGLEN_BBPEN)
2036                return wacom_bpt_pen(wacom);
2037
2038        return 0;
2039}
2040
2041static void wacom_bamboo_pad_pen_event(struct wacom_wac *wacom,
2042                unsigned char *data)
2043{
2044        unsigned char prefix;
2045
2046        /*
2047         * We need to reroute the event from the debug interface to the
2048         * pen interface.
2049         * We need to add the report ID to the actual pen report, so we
2050         * temporary overwrite the first byte to prevent having to kzalloc/kfree
2051         * and memcpy the report.
2052         */
2053        prefix = data[0];
2054        data[0] = WACOM_REPORT_BPAD_PEN;
2055
2056        /*
2057         * actually reroute the event.
2058         * No need to check if wacom->shared->pen is valid, hid_input_report()
2059         * will check for us.
2060         */
2061        hid_input_report(wacom->shared->pen, HID_INPUT_REPORT, data,
2062                         WACOM_PKGLEN_PENABLED, 1);
2063
2064        data[0] = prefix;
2065}
2066
2067static int wacom_bamboo_pad_touch_event(struct wacom_wac *wacom,
2068                unsigned char *data)
2069{
2070        struct input_dev *input = wacom->touch_input;
2071        unsigned char *finger_data, prefix;
2072        unsigned id;
2073        int x, y;
2074        bool valid;
2075
2076        prefix = data[0];
2077
2078        for (id = 0; id < wacom->features.touch_max; id++) {
2079                valid = !!(prefix & BIT(id)) &&
2080                        !wacom->shared->stylus_in_proximity;
2081
2082                input_mt_slot(input, id);
2083                input_mt_report_slot_state(input, MT_TOOL_FINGER, valid);
2084
2085                if (!valid)
2086                        continue;
2087
2088                finger_data = data + 1 + id * 3;
2089                x = finger_data[0] | ((finger_data[1] & 0x0f) << 8);
2090                y = (finger_data[2] << 4) | (finger_data[1] >> 4);
2091
2092                input_report_abs(input, ABS_MT_POSITION_X, x);
2093                input_report_abs(input, ABS_MT_POSITION_Y, y);
2094        }
2095
2096        input_mt_sync_frame(input);
2097
2098        input_report_key(input, BTN_LEFT, prefix & 0x40);
2099        input_report_key(input, BTN_RIGHT, prefix & 0x80);
2100
2101        /* keep touch state for pen event */
2102        wacom->shared->touch_down = !!prefix &&
2103                                    !wacom->shared->stylus_in_proximity;
2104
2105        return 1;
2106}
2107
2108static int wacom_bamboo_pad_irq(struct wacom_wac *wacom, size_t len)
2109{
2110        unsigned char *data = wacom->data;
2111
2112        if (!((len == WACOM_PKGLEN_BPAD_TOUCH) ||
2113              (len == WACOM_PKGLEN_BPAD_TOUCH_USB)) ||
2114            (data[0] != WACOM_REPORT_BPAD_TOUCH))
2115                return 0;
2116
2117        if (data[1] & 0x01)
2118                wacom_bamboo_pad_pen_event(wacom, &data[1]);
2119
2120        if (data[1] & 0x02)
2121                return wacom_bamboo_pad_touch_event(wacom, &data[9]);
2122
2123        return 0;
2124}
2125
2126static int wacom_wireless_irq(struct wacom_wac *wacom, size_t len)
2127{
2128        unsigned char *data = wacom->data;
2129        int connected;
2130
2131        if (len != WACOM_PKGLEN_WIRELESS || data[0] != WACOM_REPORT_WL)
2132                return 0;
2133
2134        connected = data[1] & 0x01;
2135        if (connected) {
2136                int pid, battery, charging;
2137
2138                if ((wacom->shared->type == INTUOSHT ||
2139                    wacom->shared->type == INTUOSHT2) &&
2140                    wacom->shared->touch_input &&
2141                    wacom->shared->touch_max) {
2142                        input_report_switch(wacom->shared->touch_input,
2143                                        SW_MUTE_DEVICE, data[5] & 0x40);
2144                        input_sync(wacom->shared->touch_input);
2145                }
2146
2147                pid = get_unaligned_be16(&data[6]);
2148                battery = (data[5] & 0x3f) * 100 / 31;
2149                charging = !!(data[5] & 0x80);
2150                if (wacom->pid != pid) {
2151                        wacom->pid = pid;
2152                        wacom_schedule_work(wacom);
2153                }
2154
2155                if (wacom->shared->type)
2156                        wacom_notify_battery(wacom, battery, charging, 1, 0);
2157
2158        } else if (wacom->pid != 0) {
2159                /* disconnected while previously connected */
2160                wacom->pid = 0;
2161                wacom_schedule_work(wacom);
2162                wacom_notify_battery(wacom, 0, 0, 0, 0);
2163        }
2164
2165        return 0;
2166}
2167
2168static int wacom_status_irq(struct wacom_wac *wacom_wac, size_t len)
2169{
2170        struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac);
2171        struct wacom_features *features = &wacom_wac->features;
2172        unsigned char *data = wacom_wac->data;
2173
2174        if (data[0] != WACOM_REPORT_USB)
2175                return 0;
2176
2177        if ((features->type == INTUOSHT ||
2178            features->type == INTUOSHT2) &&
2179            wacom_wac->shared->touch_input &&
2180            features->touch_max) {
2181                input_report_switch(wacom_wac->shared->touch_input,
2182                                    SW_MUTE_DEVICE, data[8] & 0x40);
2183                input_sync(wacom_wac->shared->touch_input);
2184        }
2185
2186        if (data[9] & 0x02) { /* wireless module is attached */
2187                int battery = (data[8] & 0x3f) * 100 / 31;
2188                bool charging = !!(data[8] & 0x80);
2189
2190                wacom_notify_battery(wacom_wac, battery, charging,
2191                                     battery || charging, 1);
2192
2193                if (!wacom->battery &&
2194                    !(features->quirks & WACOM_QUIRK_BATTERY)) {
2195                        features->quirks |= WACOM_QUIRK_BATTERY;
2196                        INIT_WORK(&wacom->work, wacom_battery_work);
2197                        wacom_schedule_work(wacom_wac);
2198                }
2199        }
2200        else if ((features->quirks & WACOM_QUIRK_BATTERY) &&
2201                 wacom->battery) {
2202                features->quirks &= ~WACOM_QUIRK_BATTERY;
2203                INIT_WORK(&wacom->work, wacom_battery_work);
2204                wacom_schedule_work(wacom_wac);
2205                wacom_notify_battery(wacom_wac, 0, 0, 0, 0);
2206        }
2207        return 0;
2208}
2209
2210void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len)
2211{
2212        bool sync;
2213
2214        switch (wacom_wac->features.type) {
2215        case PENPARTNER:
2216                sync = wacom_penpartner_irq(wacom_wac);
2217                break;
2218
2219        case PL:
2220                sync = wacom_pl_irq(wacom_wac);
2221                break;
2222
2223        case WACOM_G4:
2224        case GRAPHIRE:
2225        case GRAPHIRE_BT:
2226        case WACOM_MO:
2227                sync = wacom_graphire_irq(wacom_wac);
2228                break;
2229
2230        case PTU:
2231                sync = wacom_ptu_irq(wacom_wac);
2232                break;
2233
2234        case DTU:
2235                sync = wacom_dtu_irq(wacom_wac);
2236                break;
2237
2238        case DTUS:
2239        case DTUSX:
2240                sync = wacom_dtus_irq(wacom_wac);
2241                break;
2242
2243        case INTUOS:
2244        case INTUOS3S:
2245        case INTUOS3:
2246        case INTUOS3L:
2247        case INTUOS4S:
2248        case INTUOS4:
2249        case INTUOS4L:
2250        case CINTIQ:
2251        case WACOM_BEE:
2252        case WACOM_13HD:
2253        case WACOM_21UX2:
2254        case WACOM_22HD:
2255        case WACOM_24HD:
2256        case WACOM_27QHD:
2257        case DTK:
2258        case CINTIQ_HYBRID:
2259        case CINTIQ_COMPANION_2:
2260                sync = wacom_intuos_irq(wacom_wac);
2261                break;
2262
2263        case INTUOS4WL:
2264                sync = wacom_intuos_bt_irq(wacom_wac, len);
2265                break;
2266
2267        case WACOM_24HDT:
2268        case WACOM_27QHDT:
2269                sync = wacom_24hdt_irq(wacom_wac);
2270                break;
2271
2272        case INTUOS5S:
2273        case INTUOS5:
2274        case INTUOS5L:
2275        case INTUOSPS:
2276        case INTUOSPM:
2277        case INTUOSPL:
2278                if (len == WACOM_PKGLEN_BBTOUCH3)
2279                        sync = wacom_bpt3_touch(wacom_wac);
2280                else if (wacom_wac->data[0] == WACOM_REPORT_USB)
2281                        sync = wacom_status_irq(wacom_wac, len);
2282                else
2283                        sync = wacom_intuos_irq(wacom_wac);
2284                break;
2285
2286        case TABLETPC:
2287        case TABLETPCE:
2288        case TABLETPC2FG:
2289        case MTSCREEN:
2290        case MTTPC:
2291        case MTTPC_B:
2292                sync = wacom_tpc_irq(wacom_wac, len);
2293                break;
2294
2295        case BAMBOO_PT:
2296        case BAMBOO_PEN:
2297        case BAMBOO_TOUCH:
2298        case INTUOSHT:
2299        case INTUOSHT2:
2300                if (wacom_wac->data[0] == WACOM_REPORT_USB)
2301                        sync = wacom_status_irq(wacom_wac, len);
2302                else
2303                        sync = wacom_bpt_irq(wacom_wac, len);
2304                break;
2305
2306        case BAMBOO_PAD:
2307                sync = wacom_bamboo_pad_irq(wacom_wac, len);
2308                break;
2309
2310        case WIRELESS:
2311                sync = wacom_wireless_irq(wacom_wac, len);
2312                break;
2313
2314        case REMOTE:
2315                if (wacom_wac->data[0] == WACOM_REPORT_DEVICE_LIST)
2316                        sync = wacom_remote_status_irq(wacom_wac, len);
2317                else
2318                        sync = wacom_remote_irq(wacom_wac, len);
2319                break;
2320
2321        default:
2322                sync = false;
2323                break;
2324        }
2325
2326        if (sync) {
2327                if (wacom_wac->pen_input)
2328                        input_sync(wacom_wac->pen_input);
2329                if (wacom_wac->touch_input)
2330                        input_sync(wacom_wac->touch_input);
2331                if (wacom_wac->pad_input)
2332                        input_sync(wacom_wac->pad_input);
2333        }
2334}
2335
2336static void wacom_setup_basic_pro_pen(struct wacom_wac *wacom_wac)
2337{
2338        struct input_dev *input_dev = wacom_wac->pen_input;
2339
2340        input_set_capability(input_dev, EV_MSC, MSC_SERIAL);
2341
2342        __set_bit(BTN_TOOL_PEN, input_dev->keybit);
2343        __set_bit(BTN_STYLUS, input_dev->keybit);
2344        __set_bit(BTN_STYLUS2, input_dev->keybit);
2345
2346        input_set_abs_params(input_dev, ABS_DISTANCE,
2347                             0, wacom_wac->features.distance_max, wacom_wac->features.distance_fuzz, 0);
2348}
2349
2350static void wacom_setup_cintiq(struct wacom_wac *wacom_wac)
2351{
2352        struct input_dev *input_dev = wacom_wac->pen_input;
2353        struct wacom_features *features = &wacom_wac->features;
2354
2355        wacom_setup_basic_pro_pen(wacom_wac);
2356
2357        __set_bit(BTN_TOOL_RUBBER, input_dev->keybit);
2358        __set_bit(BTN_TOOL_BRUSH, input_dev->keybit);
2359        __set_bit(BTN_TOOL_PENCIL, input_dev->keybit);
2360        __set_bit(BTN_TOOL_AIRBRUSH, input_dev->keybit);
2361
2362        input_set_abs_params(input_dev, ABS_WHEEL, 0, 1023, 0, 0);
2363        input_set_abs_params(input_dev, ABS_TILT_X, -64, 63, features->tilt_fuzz, 0);
2364        input_abs_set_res(input_dev, ABS_TILT_X, 57);
2365        input_set_abs_params(input_dev, ABS_TILT_Y, -64, 63, features->tilt_fuzz, 0);
2366        input_abs_set_res(input_dev, ABS_TILT_Y, 57);
2367}
2368
2369static void wacom_setup_intuos(struct wacom_wac *wacom_wac)
2370{
2371        struct input_dev *input_dev = wacom_wac->pen_input;
2372
2373        input_set_capability(input_dev, EV_REL, REL_WHEEL);
2374
2375        wacom_setup_cintiq(wacom_wac);
2376
2377        __set_bit(BTN_LEFT, input_dev->keybit);
2378        __set_bit(BTN_RIGHT, input_dev->keybit);
2379        __set_bit(BTN_MIDDLE, input_dev->keybit);
2380        __set_bit(BTN_SIDE, input_dev->keybit);
2381        __set_bit(BTN_EXTRA, input_dev->keybit);
2382        __set_bit(BTN_TOOL_MOUSE, input_dev->keybit);
2383        __set_bit(BTN_TOOL_LENS, input_dev->keybit);
2384
2385        input_set_abs_params(input_dev, ABS_RZ, -900, 899, 0, 0);
2386        input_abs_set_res(input_dev, ABS_RZ, 287);
2387        input_set_abs_params(input_dev, ABS_THROTTLE, -1023, 1023, 0, 0);
2388}
2389
2390void wacom_setup_device_quirks(struct wacom *wacom)
2391{
2392        struct wacom_features *features = &wacom->wacom_wac.features;
2393
2394        /* The pen and pad share the same interface on most devices */
2395        if (features->type == GRAPHIRE_BT || features->type == WACOM_G4 ||
2396            features->type == DTUS ||
2397            (features->type >= INTUOS3S && features->type <= WACOM_MO)) {
2398                if (features->device_type & WACOM_DEVICETYPE_PEN)
2399                        features->device_type |= WACOM_DEVICETYPE_PAD;
2400        }
2401
2402        /* touch device found but size is not defined. use default */
2403        if (features->device_type & WACOM_DEVICETYPE_TOUCH && !features->x_max) {
2404                features->x_max = 1023;
2405                features->y_max = 1023;
2406        }
2407
2408        /*
2409         * Intuos5/Pro and Bamboo 3rd gen have no useful data about its
2410         * touch interface in its HID descriptor. If this is the touch
2411         * interface (PacketSize of WACOM_PKGLEN_BBTOUCH3), override the
2412         * tablet values.
2413         */
2414        if ((features->type >= INTUOS5S && features->type <= INTUOSPL) ||
2415                (features->type >= INTUOSHT && features->type <= BAMBOO_PT)) {
2416                if (features->pktlen == WACOM_PKGLEN_BBTOUCH3) {
2417                        if (features->touch_max)
2418                                features->device_type |= WACOM_DEVICETYPE_TOUCH;
2419                        if (features->type >= INTUOSHT && features->type <= BAMBOO_PT)
2420                                features->device_type |= WACOM_DEVICETYPE_PAD;
2421
2422                        features->x_max = 4096;
2423                        features->y_max = 4096;
2424                }
2425                else if (features->pktlen == WACOM_PKGLEN_BBTOUCH) {
2426                        features->device_type |= WACOM_DEVICETYPE_PAD;
2427                }
2428        }
2429
2430        /*
2431         * Hack for the Bamboo One:
2432         * the device presents a PAD/Touch interface as most Bamboos and even
2433         * sends ghosts PAD data on it. However, later, we must disable this
2434         * ghost interface, and we can not detect it unless we set it here
2435         * to WACOM_DEVICETYPE_PAD or WACOM_DEVICETYPE_TOUCH.
2436         */
2437        if (features->type == BAMBOO_PEN &&
2438            features->pktlen == WACOM_PKGLEN_BBTOUCH3)
2439                features->device_type |= WACOM_DEVICETYPE_PAD;
2440
2441        /*
2442         * Raw Wacom-mode pen and touch events both come from interface
2443         * 0, whose HID descriptor has an application usage of 0xFF0D
2444         * (i.e., WACOM_VENDORDEFINED_PEN). We route pen packets back
2445         * out through the HID_GENERIC device created for interface 1,
2446         * so rewrite this one to be of type WACOM_DEVICETYPE_TOUCH.
2447         */
2448        if (features->type == BAMBOO_PAD)
2449                features->device_type = WACOM_DEVICETYPE_TOUCH;
2450
2451        if (features->type == REMOTE)
2452                features->device_type = WACOM_DEVICETYPE_PAD;
2453
2454        if (wacom->hdev->bus == BUS_BLUETOOTH)
2455                features->quirks |= WACOM_QUIRK_BATTERY;
2456
2457        /* quirk for bamboo touch with 2 low res touches */
2458        if ((features->type == BAMBOO_PT || features->type == BAMBOO_TOUCH) &&
2459            features->pktlen == WACOM_PKGLEN_BBTOUCH) {
2460                features->x_max <<= 5;
2461                features->y_max <<= 5;
2462                features->x_fuzz <<= 5;
2463                features->y_fuzz <<= 5;
2464                features->quirks |= WACOM_QUIRK_BBTOUCH_LOWRES;
2465        }
2466
2467        if (features->type == WIRELESS) {
2468                if (features->device_type == WACOM_DEVICETYPE_WL_MONITOR) {
2469                        features->quirks |= WACOM_QUIRK_BATTERY;
2470                }
2471        }
2472}
2473
2474int wacom_setup_pen_input_capabilities(struct input_dev *input_dev,
2475                                   struct wacom_wac *wacom_wac)
2476{
2477        struct wacom_features *features = &wacom_wac->features;
2478
2479        input_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
2480
2481        if (!(features->device_type & WACOM_DEVICETYPE_PEN))
2482                return -ENODEV;
2483
2484        if (features->type == HID_GENERIC)
2485                /* setup has already been done */
2486                return 0;
2487
2488        __set_bit(BTN_TOUCH, input_dev->keybit);
2489        __set_bit(ABS_MISC, input_dev->absbit);
2490
2491        input_set_abs_params(input_dev, ABS_X, features->x_min,
2492                             features->x_max, features->x_fuzz, 0);
2493        input_set_abs_params(input_dev, ABS_Y, features->y_min,
2494                             features->y_max, features->y_fuzz, 0);
2495        input_set_abs_params(input_dev, ABS_PRESSURE, 0,
2496                features->pressure_max, features->pressure_fuzz, 0);
2497
2498        /* penabled devices have fixed resolution for each model */
2499        input_abs_set_res(input_dev, ABS_X, features->x_resolution);
2500        input_abs_set_res(input_dev, ABS_Y, features->y_resolution);
2501
2502
2503        switch (features->type) {
2504        case GRAPHIRE_BT:
2505                __clear_bit(ABS_MISC, input_dev->absbit);
2506
2507        case WACOM_MO:
2508        case WACOM_G4:
2509                input_set_abs_params(input_dev, ABS_DISTANCE, 0,
2510                                              features->distance_max,
2511                                              features->distance_fuzz, 0);
2512                /* fall through */
2513
2514        case GRAPHIRE:
2515                input_set_capability(input_dev, EV_REL, REL_WHEEL);
2516
2517                __set_bit(BTN_LEFT, input_dev->keybit);
2518                __set_bit(BTN_RIGHT, input_dev->keybit);
2519                __set_bit(BTN_MIDDLE, input_dev->keybit);
2520
2521                __set_bit(BTN_TOOL_RUBBER, input_dev->keybit);
2522                __set_bit(BTN_TOOL_PEN, input_dev->keybit);
2523                __set_bit(BTN_TOOL_MOUSE, input_dev->keybit);
2524                __set_bit(BTN_STYLUS, input_dev->keybit);
2525                __set_bit(BTN_STYLUS2, input_dev->keybit);
2526
2527                __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
2528                break;
2529
2530        case WACOM_27QHD:
2531        case WACOM_24HD:
2532        case DTK:
2533        case WACOM_22HD:
2534        case WACOM_21UX2:
2535        case WACOM_BEE:
2536        case CINTIQ:
2537        case WACOM_13HD:
2538        case CINTIQ_HYBRID:
2539        case CINTIQ_COMPANION_2:
2540                input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0);
2541                input_abs_set_res(input_dev, ABS_Z, 287);
2542                __set_bit(INPUT_PROP_DIRECT, input_dev->propbit);
2543                wacom_setup_cintiq(wacom_wac);
2544                break;
2545
2546        case INTUOS3:
2547        case INTUOS3L:
2548        case INTUOS3S:
2549        case INTUOS4:
2550        case INTUOS4WL:
2551        case INTUOS4L:
2552        case INTUOS4S:
2553                input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0);
2554                input_abs_set_res(input_dev, ABS_Z, 287);
2555                /* fall through */
2556
2557        case INTUOS:
2558                __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
2559
2560                wacom_setup_intuos(wacom_wac);
2561                break;
2562
2563        case INTUOS5:
2564        case INTUOS5L:
2565        case INTUOSPM:
2566        case INTUOSPL:
2567        case INTUOS5S:
2568        case INTUOSPS:
2569                __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
2570
2571                input_set_abs_params(input_dev, ABS_DISTANCE, 0,
2572                                      features->distance_max,
2573                                      features->distance_fuzz, 0);
2574
2575                input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0);
2576                input_abs_set_res(input_dev, ABS_Z, 287);
2577
2578                wacom_setup_intuos(wacom_wac);
2579                break;
2580
2581        case WACOM_24HDT:
2582        case WACOM_27QHDT:
2583        case MTSCREEN:
2584        case MTTPC:
2585        case MTTPC_B:
2586        case TABLETPC2FG:
2587        case TABLETPC:
2588        case TABLETPCE:
2589                __clear_bit(ABS_MISC, input_dev->absbit);
2590                /* fall through */
2591
2592        case DTUS:
2593        case DTUSX:
2594        case PL:
2595        case DTU:
2596                __set_bit(BTN_TOOL_PEN, input_dev->keybit);
2597                __set_bit(BTN_TOOL_RUBBER, input_dev->keybit);
2598                __set_bit(BTN_STYLUS, input_dev->keybit);
2599                __set_bit(BTN_STYLUS2, input_dev->keybit);
2600
2601                __set_bit(INPUT_PROP_DIRECT, input_dev->propbit);
2602                break;
2603
2604        case PTU:
2605                __set_bit(BTN_STYLUS2, input_dev->keybit);
2606                /* fall through */
2607
2608        case PENPARTNER:
2609                __set_bit(BTN_TOOL_PEN, input_dev->keybit);
2610                __set_bit(BTN_TOOL_RUBBER, input_dev->keybit);
2611                __set_bit(BTN_STYLUS, input_dev->keybit);
2612
2613                __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
2614                break;
2615
2616        case INTUOSHT:
2617        case BAMBOO_PT:
2618        case BAMBOO_PEN:
2619        case INTUOSHT2:
2620                __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
2621
2622                if (features->type == INTUOSHT2) {
2623                        wacom_setup_basic_pro_pen(wacom_wac);
2624                } else {
2625                        __clear_bit(ABS_MISC, input_dev->absbit);
2626                        __set_bit(BTN_TOOL_PEN, input_dev->keybit);
2627                        __set_bit(BTN_TOOL_RUBBER, input_dev->keybit);
2628                        __set_bit(BTN_STYLUS, input_dev->keybit);
2629                        __set_bit(BTN_STYLUS2, input_dev->keybit);
2630                        input_set_abs_params(input_dev, ABS_DISTANCE, 0,
2631                                      features->distance_max,
2632                                      features->distance_fuzz, 0);
2633                }
2634                break;
2635        case BAMBOO_PAD:
2636                __clear_bit(ABS_MISC, input_dev->absbit);
2637                break;
2638        }
2639        return 0;
2640}
2641
2642int wacom_setup_touch_input_capabilities(struct input_dev *input_dev,
2643                                         struct wacom_wac *wacom_wac)
2644{
2645        struct wacom_features *features = &wacom_wac->features;
2646
2647        input_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
2648
2649        if (!(features->device_type & WACOM_DEVICETYPE_TOUCH))
2650                return -ENODEV;
2651
2652        if (features->type == HID_GENERIC)
2653                /* setup has already been done */
2654                return 0;
2655
2656        __set_bit(BTN_TOUCH, input_dev->keybit);
2657
2658        if (features->touch_max == 1) {
2659                input_set_abs_params(input_dev, ABS_X, 0,
2660                        features->x_max, features->x_fuzz, 0);
2661                input_set_abs_params(input_dev, ABS_Y, 0,
2662                        features->y_max, features->y_fuzz, 0);
2663                input_abs_set_res(input_dev, ABS_X,
2664                                  features->x_resolution);
2665                input_abs_set_res(input_dev, ABS_Y,
2666                                  features->y_resolution);
2667        }
2668        else if (features->touch_max > 1) {
2669                input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0,
2670                        features->x_max, features->x_fuzz, 0);
2671                input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0,
2672                        features->y_max, features->y_fuzz, 0);
2673                input_abs_set_res(input_dev, ABS_MT_POSITION_X,
2674                                  features->x_resolution);
2675                input_abs_set_res(input_dev, ABS_MT_POSITION_Y,
2676                                  features->y_resolution);
2677        }
2678
2679        switch (features->type) {
2680        case INTUOS5:
2681        case INTUOS5L:
2682        case INTUOSPM:
2683        case INTUOSPL:
2684        case INTUOS5S:
2685        case INTUOSPS:
2686                __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
2687
2688                input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, features->x_max, 0, 0);
2689                input_set_abs_params(input_dev, ABS_MT_TOUCH_MINOR, 0, features->y_max, 0, 0);
2690                input_mt_init_slots(input_dev, features->touch_max, INPUT_MT_POINTER);
2691                break;
2692
2693        case WACOM_24HDT:
2694                input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, features->x_max, 0, 0);
2695                input_set_abs_params(input_dev, ABS_MT_WIDTH_MAJOR, 0, features->x_max, 0, 0);
2696                input_set_abs_params(input_dev, ABS_MT_WIDTH_MINOR, 0, features->y_max, 0, 0);
2697                input_set_abs_params(input_dev, ABS_MT_ORIENTATION, 0, 1, 0, 0);
2698                /* fall through */
2699
2700        case WACOM_27QHDT:
2701        case MTSCREEN:
2702        case MTTPC:
2703        case MTTPC_B:
2704        case TABLETPC2FG:
2705                input_mt_init_slots(input_dev, features->touch_max, INPUT_MT_DIRECT);
2706                /*fall through */
2707
2708        case TABLETPC:
2709        case TABLETPCE:
2710                __set_bit(INPUT_PROP_DIRECT, input_dev->propbit);
2711                break;
2712
2713        case INTUOSHT:
2714        case INTUOSHT2:
2715                input_dev->evbit[0] |= BIT_MASK(EV_SW);
2716                __set_bit(SW_MUTE_DEVICE, input_dev->swbit);
2717                /* fall through */
2718
2719        case BAMBOO_PT:
2720        case BAMBOO_TOUCH:
2721                if (features->pktlen == WACOM_PKGLEN_BBTOUCH3) {
2722                        input_set_abs_params(input_dev,
2723                                     ABS_MT_TOUCH_MAJOR,
2724                                     0, features->x_max, 0, 0);
2725                        input_set_abs_params(input_dev,
2726                                     ABS_MT_TOUCH_MINOR,
2727                                     0, features->y_max, 0, 0);
2728                }
2729                input_mt_init_slots(input_dev, features->touch_max, INPUT_MT_POINTER);
2730                break;
2731
2732        case BAMBOO_PAD:
2733                input_mt_init_slots(input_dev, features->touch_max,
2734                                    INPUT_MT_POINTER);
2735                __set_bit(BTN_LEFT, input_dev->keybit);
2736                __set_bit(BTN_RIGHT, input_dev->keybit);
2737                break;
2738        }
2739        return 0;
2740}
2741
2742static void wacom_setup_numbered_buttons(struct input_dev *input_dev,
2743                                int button_count)
2744{
2745        int i;
2746
2747        for (i = 0; i < button_count && i < 10; i++)
2748                __set_bit(BTN_0 + i, input_dev->keybit);
2749        for (i = 10; i < button_count && i < 16; i++)
2750                __set_bit(BTN_A + (i-10), input_dev->keybit);
2751        for (i = 16; i < button_count && i < 18; i++)
2752                __set_bit(BTN_BASE + (i-16), input_dev->keybit);
2753}
2754
2755static void wacom_report_numbered_buttons(struct input_dev *input_dev,
2756                                int button_count, int mask)
2757{
2758        int i;
2759
2760        for (i = 0; i < button_count && i < 10; i++)
2761                input_report_key(input_dev, BTN_0 + i, mask & (1 << i));
2762        for (i = 10; i < button_count && i < 16; i++)
2763                input_report_key(input_dev, BTN_A + (i-10), mask & (1 << i));
2764        for (i = 16; i < button_count && i < 18; i++)
2765                input_report_key(input_dev, BTN_BASE + (i-16), mask & (1 << i));
2766}
2767
2768int wacom_setup_pad_input_capabilities(struct input_dev *input_dev,
2769                                   struct wacom_wac *wacom_wac)
2770{
2771        struct wacom_features *features = &wacom_wac->features;
2772
2773        if (!(features->device_type & WACOM_DEVICETYPE_PAD))
2774                return -ENODEV;
2775
2776        input_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
2777
2778        /* kept for making legacy xf86-input-wacom working with the wheels */
2779        __set_bit(ABS_MISC, input_dev->absbit);
2780
2781        /* kept for making legacy xf86-input-wacom accepting the pad */
2782        input_set_abs_params(input_dev, ABS_X, 0, 1, 0, 0);
2783        input_set_abs_params(input_dev, ABS_Y, 0, 1, 0, 0);
2784
2785        /* kept for making udev and libwacom accepting the pad */
2786        __set_bit(BTN_STYLUS, input_dev->keybit);
2787
2788        wacom_setup_numbered_buttons(input_dev, features->numbered_buttons);
2789
2790        switch (features->type) {
2791
2792        case CINTIQ_HYBRID:
2793        case CINTIQ_COMPANION_2:
2794        case DTK:
2795        case DTUS:
2796        case GRAPHIRE_BT:
2797                break;
2798
2799        case WACOM_MO:
2800                __set_bit(BTN_BACK, input_dev->keybit);
2801                __set_bit(BTN_LEFT, input_dev->keybit);
2802                __set_bit(BTN_FORWARD, input_dev->keybit);
2803                __set_bit(BTN_RIGHT, input_dev->keybit);
2804                input_set_abs_params(input_dev, ABS_WHEEL, 0, 71, 0, 0);
2805                break;
2806
2807        case WACOM_G4:
2808                __set_bit(BTN_BACK, input_dev->keybit);
2809                __set_bit(BTN_FORWARD, input_dev->keybit);
2810                input_set_capability(input_dev, EV_REL, REL_WHEEL);
2811                break;
2812
2813        case WACOM_24HD:
2814                __set_bit(KEY_PROG1, input_dev->keybit);
2815                __set_bit(KEY_PROG2, input_dev->keybit);
2816                __set_bit(KEY_PROG3, input_dev->keybit);
2817
2818                input_set_abs_params(input_dev, ABS_WHEEL, 0, 71, 0, 0);
2819                input_set_abs_params(input_dev, ABS_THROTTLE, 0, 71, 0, 0);
2820                break;
2821
2822        case WACOM_27QHD:
2823                __set_bit(KEY_PROG1, input_dev->keybit);
2824                __set_bit(KEY_PROG2, input_dev->keybit);
2825                __set_bit(KEY_PROG3, input_dev->keybit);
2826                input_set_abs_params(input_dev, ABS_X, -2048, 2048, 0, 0);
2827                input_abs_set_res(input_dev, ABS_X, 1024); /* points/g */
2828                input_set_abs_params(input_dev, ABS_Y, -2048, 2048, 0, 0);
2829                input_abs_set_res(input_dev, ABS_Y, 1024);
2830                input_set_abs_params(input_dev, ABS_Z, -2048, 2048, 0, 0);
2831                input_abs_set_res(input_dev, ABS_Z, 1024);
2832                __set_bit(INPUT_PROP_ACCELEROMETER, input_dev->propbit);
2833                break;
2834
2835        case WACOM_22HD:
2836                __set_bit(KEY_PROG1, input_dev->keybit);
2837                __set_bit(KEY_PROG2, input_dev->keybit);
2838                __set_bit(KEY_PROG3, input_dev->keybit);
2839                /* fall through */
2840
2841        case WACOM_21UX2:
2842        case WACOM_BEE:
2843        case CINTIQ:
2844                input_set_abs_params(input_dev, ABS_RX, 0, 4096, 0, 0);
2845                input_set_abs_params(input_dev, ABS_RY, 0, 4096, 0, 0);
2846                break;
2847
2848        case WACOM_13HD:
2849                input_set_abs_params(input_dev, ABS_WHEEL, 0, 71, 0, 0);
2850                break;
2851
2852        case INTUOS3:
2853        case INTUOS3L:
2854                input_set_abs_params(input_dev, ABS_RY, 0, 4096, 0, 0);
2855                /* fall through */
2856
2857        case INTUOS3S:
2858                input_set_abs_params(input_dev, ABS_RX, 0, 4096, 0, 0);
2859                break;
2860
2861        case INTUOS5:
2862        case INTUOS5L:
2863        case INTUOSPM:
2864        case INTUOSPL:
2865        case INTUOS5S:
2866        case INTUOSPS:
2867                input_set_abs_params(input_dev, ABS_WHEEL, 0, 71, 0, 0);
2868                break;
2869
2870        case INTUOS4WL:
2871                /*
2872                 * For Bluetooth devices, the udev rule does not work correctly
2873                 * for pads unless we add a stylus capability, which forces
2874                 * ID_INPUT_TABLET to be set.
2875                 */
2876                __set_bit(BTN_STYLUS, input_dev->keybit);
2877                /* fall through */
2878
2879        case INTUOS4:
2880        case INTUOS4L:
2881        case INTUOS4S:
2882                input_set_abs_params(input_dev, ABS_WHEEL, 0, 71, 0, 0);
2883                break;
2884
2885        case INTUOSHT:
2886        case BAMBOO_PT:
2887        case BAMBOO_TOUCH:
2888        case INTUOSHT2:
2889                __clear_bit(ABS_MISC, input_dev->absbit);
2890
2891                __set_bit(BTN_LEFT, input_dev->keybit);
2892                __set_bit(BTN_FORWARD, input_dev->keybit);
2893                __set_bit(BTN_BACK, input_dev->keybit);
2894                __set_bit(BTN_RIGHT, input_dev->keybit);
2895
2896                break;
2897
2898        case REMOTE:
2899                input_set_capability(input_dev, EV_MSC, MSC_SERIAL);
2900                input_set_abs_params(input_dev, ABS_WHEEL, 0, 71, 0, 0);
2901                break;
2902
2903        default:
2904                /* no pad supported */
2905                return -ENODEV;
2906        }
2907        return 0;
2908}
2909
2910static const struct wacom_features wacom_features_0x00 =
2911        { "Wacom Penpartner", 5040, 3780, 255, 0,
2912          PENPARTNER, WACOM_PENPRTN_RES, WACOM_PENPRTN_RES };
2913static const struct wacom_features wacom_features_0x10 =
2914        { "Wacom Graphire", 10206, 7422, 511, 63,
2915          GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES };
2916static const struct wacom_features wacom_features_0x81 =
2917        { "Wacom Graphire BT", 16704, 12064, 511, 32,
2918          GRAPHIRE_BT, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES, 2 };
2919static const struct wacom_features wacom_features_0x11 =
2920        { "Wacom Graphire2 4x5", 10206, 7422, 511, 63,
2921          GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES };
2922static const struct wacom_features wacom_features_0x12 =
2923        { "Wacom Graphire2 5x7", 13918, 10206, 511, 63,
2924          GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES };
2925static const struct wacom_features wacom_features_0x13 =
2926        { "Wacom Graphire3", 10208, 7424, 511, 63,
2927          GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES };
2928static const struct wacom_features wacom_features_0x14 =
2929        { "Wacom Graphire3 6x8", 16704, 12064, 511, 63,
2930          GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES };
2931static const struct wacom_features wacom_features_0x15 =
2932        { "Wacom Graphire4 4x5", 10208, 7424, 511, 63,
2933          WACOM_G4, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES };
2934static const struct wacom_features wacom_features_0x16 =
2935        { "Wacom Graphire4 6x8", 16704, 12064, 511, 63,
2936          WACOM_G4, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES };
2937static const struct wacom_features wacom_features_0x17 =
2938        { "Wacom BambooFun 4x5", 14760, 9225, 511, 63,
2939          WACOM_MO, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2940static const struct wacom_features wacom_features_0x18 =
2941        { "Wacom BambooFun 6x8", 21648, 13530, 511, 63,
2942          WACOM_MO, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2943static const struct wacom_features wacom_features_0x19 =
2944        { "Wacom Bamboo1 Medium", 16704, 12064, 511, 63,
2945          GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES };
2946static const struct wacom_features wacom_features_0x60 =
2947        { "Wacom Volito", 5104, 3712, 511, 63,
2948          GRAPHIRE, WACOM_VOLITO_RES, WACOM_VOLITO_RES };
2949static const struct wacom_features wacom_features_0x61 =
2950        { "Wacom PenStation2", 3250, 2320, 255, 63,
2951          GRAPHIRE, WACOM_VOLITO_RES, WACOM_VOLITO_RES };
2952static const struct wacom_features wacom_features_0x62 =
2953        { "Wacom Volito2 4x5", 5104, 3712, 511, 63,
2954          GRAPHIRE, WACOM_VOLITO_RES, WACOM_VOLITO_RES };
2955static const struct wacom_features wacom_features_0x63 =
2956        { "Wacom Volito2 2x3", 3248, 2320, 511, 63,
2957          GRAPHIRE, WACOM_VOLITO_RES, WACOM_VOLITO_RES };
2958static const struct wacom_features wacom_features_0x64 =
2959        { "Wacom PenPartner2", 3250, 2320, 511, 63,
2960          GRAPHIRE, WACOM_VOLITO_RES, WACOM_VOLITO_RES };
2961static const struct wacom_features wacom_features_0x65 =
2962        { "Wacom Bamboo", 14760, 9225, 511, 63,
2963          WACOM_MO, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2964static const struct wacom_features wacom_features_0x69 =
2965        { "Wacom Bamboo1", 5104, 3712, 511, 63,
2966          GRAPHIRE, WACOM_PENPRTN_RES, WACOM_PENPRTN_RES };
2967static const struct wacom_features wacom_features_0x6A =
2968        { "Wacom Bamboo1 4x6", 14760, 9225, 1023, 63,
2969          GRAPHIRE, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2970static const struct wacom_features wacom_features_0x6B =
2971        { "Wacom Bamboo1 5x8", 21648, 13530, 1023, 63,
2972          GRAPHIRE, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2973static const struct wacom_features wacom_features_0x20 =
2974        { "Wacom Intuos 4x5", 12700, 10600, 1023, 31,
2975          INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2976static const struct wacom_features wacom_features_0x21 =
2977        { "Wacom Intuos 6x8", 20320, 16240, 1023, 31,
2978          INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2979static const struct wacom_features wacom_features_0x22 =
2980        { "Wacom Intuos 9x12", 30480, 24060, 1023, 31,
2981          INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2982static const struct wacom_features wacom_features_0x23 =
2983        { "Wacom Intuos 12x12", 30480, 31680, 1023, 31,
2984          INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2985static const struct wacom_features wacom_features_0x24 =
2986        { "Wacom Intuos 12x18", 45720, 31680, 1023, 31,
2987          INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2988static const struct wacom_features wacom_features_0x30 =
2989        { "Wacom PL400", 5408, 4056, 255, 0,
2990          PL, WACOM_PL_RES, WACOM_PL_RES };
2991static const struct wacom_features wacom_features_0x31 =
2992        { "Wacom PL500", 6144, 4608, 255, 0,
2993          PL, WACOM_PL_RES, WACOM_PL_RES };
2994static const struct wacom_features wacom_features_0x32 =
2995        { "Wacom PL600", 6126, 4604, 255, 0,
2996          PL, WACOM_PL_RES, WACOM_PL_RES };
2997static const struct wacom_features wacom_features_0x33 =
2998        { "Wacom PL600SX", 6260, 5016, 255, 0,
2999          PL, WACOM_PL_RES, WACOM_PL_RES };
3000static const struct wacom_features wacom_features_0x34 =
3001        { "Wacom PL550", 6144, 4608, 511, 0,
3002          PL, WACOM_PL_RES, WACOM_PL_RES };
3003static const struct wacom_features wacom_features_0x35 =
3004        { "Wacom PL800", 7220, 5780, 511, 0,
3005          PL, WACOM_PL_RES, WACOM_PL_RES };
3006static const struct wacom_features wacom_features_0x37 =
3007        { "Wacom PL700", 6758, 5406, 511, 0,
3008          PL, WACOM_PL_RES, WACOM_PL_RES };
3009static const struct wacom_features wacom_features_0x38 =
3010        { "Wacom PL510", 6282, 4762, 511, 0,
3011          PL, WACOM_PL_RES, WACOM_PL_RES };
3012static const struct wacom_features wacom_features_0x39 =
3013        { "Wacom DTU710", 34080, 27660, 511, 0,
3014          PL, WACOM_PL_RES, WACOM_PL_RES };
3015static const struct wacom_features wacom_features_0xC4 =
3016        { "Wacom DTF521", 6282, 4762, 511, 0,
3017          PL, WACOM_PL_RES, WACOM_PL_RES };
3018static const struct wacom_features wacom_features_0xC0 =
3019        { "Wacom DTF720", 6858, 5506, 511, 0,
3020          PL, WACOM_PL_RES, WACOM_PL_RES };
3021static const struct wacom_features wacom_features_0xC2 =
3022        { "Wacom DTF720a", 6858, 5506, 511, 0,
3023          PL, WACOM_PL_RES, WACOM_PL_RES };
3024static const struct wacom_features wacom_features_0x03 =
3025        { "Wacom Cintiq Partner", 20480, 15360, 511, 0,
3026          PTU, WACOM_PL_RES, WACOM_PL_RES };
3027static const struct wacom_features wacom_features_0x41 =
3028        { "Wacom Intuos2 4x5", 12700, 10600, 1023, 31,
3029          INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3030static const struct wacom_features wacom_features_0x42 =
3031        { "Wacom Intuos2 6x8", 20320, 16240, 1023, 31,
3032          INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3033static const struct wacom_features wacom_features_0x43 =
3034        { "Wacom Intuos2 9x12", 30480, 24060, 1023, 31,
3035          INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3036static const struct wacom_features wacom_features_0x44 =
3037        { "Wacom Intuos2 12x12", 30480, 31680, 1023, 31,
3038          INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3039static const struct wacom_features wacom_features_0x45 =
3040        { "Wacom Intuos2 12x18", 45720, 31680, 1023, 31,
3041          INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3042static const struct wacom_features wacom_features_0xB0 =
3043        { "Wacom Intuos3 4x5", 25400, 20320, 1023, 63,
3044          INTUOS3S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 4 };
3045static const struct wacom_features wacom_features_0xB1 =
3046        { "Wacom Intuos3 6x8", 40640, 30480, 1023, 63,
3047          INTUOS3, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 8 };
3048static const struct wacom_features wacom_features_0xB2 =
3049        { "Wacom Intuos3 9x12", 60960, 45720, 1023, 63,
3050          INTUOS3, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 8 };
3051static const struct wacom_features wacom_features_0xB3 =
3052        { "Wacom Intuos3 12x12", 60960, 60960, 1023, 63,
3053          INTUOS3L, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 8 };
3054static const struct wacom_features wacom_features_0xB4 =
3055        { "Wacom Intuos3 12x19", 97536, 60960, 1023, 63,
3056          INTUOS3L, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 8 };
3057static const struct wacom_features wacom_features_0xB5 =
3058        { "Wacom Intuos3 6x11", 54204, 31750, 1023, 63,
3059          INTUOS3, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 8 };
3060static const struct wacom_features wacom_features_0xB7 =
3061        { "Wacom Intuos3 4x6", 31496, 19685, 1023, 63,
3062          INTUOS3S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 4 };
3063static const struct wacom_features wacom_features_0xB8 =
3064        { "Wacom Intuos4 4x6", 31496, 19685, 2047, 63,
3065          INTUOS4S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 7 };
3066static const struct wacom_features wacom_features_0xB9 =
3067        { "Wacom Intuos4 6x9", 44704, 27940, 2047, 63,
3068          INTUOS4, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 9 };
3069static const struct wacom_features wacom_features_0xBA =
3070        { "Wacom Intuos4 8x13", 65024, 40640, 2047, 63,
3071          INTUOS4L, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 9 };
3072static const struct wacom_features wacom_features_0xBB =
3073        { "Wacom Intuos4 12x19", 97536, 60960, 2047, 63,
3074          INTUOS4L, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 9 };
3075static const struct wacom_features wacom_features_0xBC =
3076        { "Wacom Intuos4 WL", 40640, 25400, 2047, 63,
3077          INTUOS4, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 9 };
3078static const struct wacom_features wacom_features_0xBD =
3079        { "Wacom Intuos4 WL", 40640, 25400, 2047, 63,
3080          INTUOS4WL, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 9 };
3081static const struct wacom_features wacom_features_0x26 =
3082        { "Wacom Intuos5 touch S", 31496, 19685, 2047, 63,
3083          INTUOS5S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 7, .touch_max = 16 };
3084static const struct wacom_features wacom_features_0x27 =
3085        { "Wacom Intuos5 touch M", 44704, 27940, 2047, 63,
3086          INTUOS5, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 9, .touch_max = 16 };
3087static const struct wacom_features wacom_features_0x28 =
3088        { "Wacom Intuos5 touch L", 65024, 40640, 2047, 63,
3089          INTUOS5L, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 9, .touch_max = 16 };
3090static const struct wacom_features wacom_features_0x29 =
3091        { "Wacom Intuos5 S", 31496, 19685, 2047, 63,
3092          INTUOS5S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 7 };
3093static const struct wacom_features wacom_features_0x2A =
3094        { "Wacom Intuos5 M", 44704, 27940, 2047, 63,
3095          INTUOS5, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 9 };
3096static const struct wacom_features wacom_features_0x314 =
3097        { "Wacom Intuos Pro S", 31496, 19685, 2047, 63,
3098          INTUOSPS, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 7, .touch_max = 16,
3099          .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
3100static const struct wacom_features wacom_features_0x315 =
3101        { "Wacom Intuos Pro M", 44704, 27940, 2047, 63,
3102          INTUOSPM, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 9, .touch_max = 16,
3103          .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
3104static const struct wacom_features wacom_features_0x317 =
3105        { "Wacom Intuos Pro L", 65024, 40640, 2047, 63,
3106          INTUOSPL, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 9, .touch_max = 16,
3107          .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
3108static const struct wacom_features wacom_features_0xF4 =
3109        { "Wacom Cintiq 24HD", 104080, 65200, 2047, 63,
3110          WACOM_24HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 16,
3111          WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET };
3112static const struct wacom_features wacom_features_0xF8 =
3113        { "Wacom Cintiq 24HD touch", 104080, 65200, 2047, 63, /* Pen */
3114          WACOM_24HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 16,
3115          WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
3116          .oVid = USB_VENDOR_ID_WACOM, .oPid = 0xf6 };
3117static const struct wacom_features wacom_features_0xF6 =
3118        { "Wacom Cintiq 24HD touch", .type = WACOM_24HDT, /* Touch */
3119          .oVid = USB_VENDOR_ID_WACOM, .oPid = 0xf8, .touch_max = 10,
3120          .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
3121static const struct wacom_features wacom_features_0x32A =
3122        { "Wacom Cintiq 27QHD", 119740, 67520, 2047, 63,
3123          WACOM_27QHD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 0,
3124          WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET };
3125static const struct wacom_features wacom_features_0x32B =
3126        { "Wacom Cintiq 27QHD touch", 119740, 67520, 2047, 63,
3127          WACOM_27QHD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 0,
3128          WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
3129          .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x32C };
3130static const struct wacom_features wacom_features_0x32C =
3131        { "Wacom Cintiq 27QHD touch", .type = WACOM_27QHDT,
3132          .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x32B, .touch_max = 10 };
3133static const struct wacom_features wacom_features_0x3F =
3134        { "Wacom Cintiq 21UX", 87200, 65600, 1023, 63,
3135          CINTIQ, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 8 };
3136static const struct wacom_features wacom_features_0xC5 =
3137        { "Wacom Cintiq 20WSX", 86680, 54180, 1023, 63,
3138          WACOM_BEE, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 10 };
3139static const struct wacom_features wacom_features_0xC6 =
3140        { "Wacom Cintiq 12WX", 53020, 33440, 1023, 63,
3141          WACOM_BEE, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 10 };
3142static const struct wacom_features wacom_features_0x304 =
3143        { "Wacom Cintiq 13HD", 59152, 33448, 1023, 63,
3144          WACOM_13HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 9,
3145          WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET };
3146static const struct wacom_features wacom_features_0x333 =
3147        { "Wacom Cintiq 13HD touch", 59152, 33448, 2047, 63,
3148          WACOM_13HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 9,
3149          WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
3150          .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x335 };
3151static const struct wacom_features wacom_features_0x335 =
3152        { "Wacom Cintiq 13HD touch", .type = WACOM_24HDT, /* Touch */
3153          .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x333, .touch_max = 10,
3154          .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
3155static const struct wacom_features wacom_features_0xC7 =
3156        { "Wacom DTU1931", 37832, 30305, 511, 0,
3157          PL, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3158static const struct wacom_features wacom_features_0xCE =
3159        { "Wacom DTU2231", 47864, 27011, 511, 0,
3160          DTU, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
3161          .check_for_hid_type = true, .hid_type = HID_TYPE_USBMOUSE };
3162static const struct wacom_features wacom_features_0xF0 =
3163        { "Wacom DTU1631", 34623, 19553, 511, 0,
3164          DTU, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3165static const struct wacom_features wacom_features_0xFB =
3166        { "Wacom DTU1031", 21896, 13760, 511, 0,
3167          DTUS, WACOM_INTUOS_RES, WACOM_INTUOS_RES, 4,
3168          WACOM_DTU_OFFSET, WACOM_DTU_OFFSET };
3169static const struct wacom_features wacom_features_0x32F =
3170        { "Wacom DTU1031X", 22472, 12728, 511, 0,
3171          DTUSX, WACOM_INTUOS_RES, WACOM_INTUOS_RES, 0,
3172          WACOM_DTU_OFFSET, WACOM_DTU_OFFSET };
3173static const struct wacom_features wacom_features_0x336 =
3174        { "Wacom DTU1141", 23472, 13203, 1023, 0,
3175          DTUS, WACOM_INTUOS_RES, WACOM_INTUOS_RES, 4,
3176          WACOM_DTU_OFFSET, WACOM_DTU_OFFSET };
3177static const struct wacom_features wacom_features_0x57 =
3178        { "Wacom DTK2241", 95640, 54060, 2047, 63,
3179          DTK, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 6,
3180          WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET };
3181static const struct wacom_features wacom_features_0x59 = /* Pen */
3182        { "Wacom DTH2242", 95640, 54060, 2047, 63,
3183          DTK, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 6,
3184          WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
3185          .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x5D };
3186static const struct wacom_features wacom_features_0x5D = /* Touch */
3187        { "Wacom DTH2242",       .type = WACOM_24HDT,
3188          .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x59, .touch_max = 10,
3189          .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
3190static const struct wacom_features wacom_features_0xCC =
3191        { "Wacom Cintiq 21UX2", 86800, 65200, 2047, 63,
3192          WACOM_21UX2, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 18,
3193          WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET };
3194static const struct wacom_features wacom_features_0xFA =
3195        { "Wacom Cintiq 22HD", 95440, 53860, 2047, 63,
3196          WACOM_22HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 18,
3197          WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET };
3198static const struct wacom_features wacom_features_0x5B =
3199        { "Wacom Cintiq 22HDT", 95440, 53860, 2047, 63,
3200          WACOM_22HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 18,
3201          WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
3202          .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x5e };
3203static const struct wacom_features wacom_features_0x5E =
3204        { "Wacom Cintiq 22HDT", .type = WACOM_24HDT,
3205          .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x5b, .touch_max = 10,
3206          .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
3207static const struct wacom_features wacom_features_0x90 =
3208        { "Wacom ISDv4 90", 26202, 16325, 255, 0,
3209          TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3210static const struct wacom_features wacom_features_0x93 =
3211        { "Wacom ISDv4 93", 26202, 16325, 255, 0,
3212          TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3213static const struct wacom_features wacom_features_0x97 =
3214        { "Wacom ISDv4 97", 26202, 16325, 511, 0,
3215          TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3216static const struct wacom_features wacom_features_0x9A =
3217        { "Wacom ISDv4 9A", 26202, 16325, 255, 0,
3218          TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3219static const struct wacom_features wacom_features_0x9F =
3220        { "Wacom ISDv4 9F", 26202, 16325, 255, 0,
3221          TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3222static const struct wacom_features wacom_features_0xE2 =
3223        { "Wacom ISDv4 E2", 26202, 16325, 255, 0,
3224          TABLETPC2FG, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 };
3225static const struct wacom_features wacom_features_0xE3 =
3226        { "Wacom ISDv4 E3", 26202, 16325, 255, 0,
3227          TABLETPC2FG, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 };
3228static const struct wacom_features wacom_features_0xE5 =
3229        { "Wacom ISDv4 E5", 26202, 16325, 255, 0,
3230          MTSCREEN, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3231static const struct wacom_features wacom_features_0xE6 =
3232        { "Wacom ISDv4 E6", 27760, 15694, 255, 0,
3233          TABLETPC2FG, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 };
3234static const struct wacom_features wacom_features_0xEC =
3235        { "Wacom ISDv4 EC", 25710, 14500, 255, 0,
3236          TABLETPC,    WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3237static const struct wacom_features wacom_features_0xED =
3238        { "Wacom ISDv4 ED", 26202, 16325, 255, 0,
3239          TABLETPCE, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3240static const struct wacom_features wacom_features_0xEF =
3241        { "Wacom ISDv4 EF", 26202, 16325, 255, 0,
3242          TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3243static const struct wacom_features wacom_features_0x100 =
3244        { "Wacom ISDv4 100", 26202, 16325, 255, 0,
3245          MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3246static const struct wacom_features wacom_features_0x101 =
3247        { "Wacom ISDv4 101", 26202, 16325, 255, 0,
3248          MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3249static const struct wacom_features wacom_features_0x10D =
3250        { "Wacom ISDv4 10D", 26202, 16325, 255, 0,
3251          MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3252static const struct wacom_features wacom_features_0x10E =
3253        { "Wacom ISDv4 10E", 27760, 15694, 255, 0,
3254          MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3255static const struct wacom_features wacom_features_0x10F =
3256        { "Wacom ISDv4 10F", 27760, 15694, 255, 0,
3257          MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3258static const struct wacom_features wacom_features_0x116 =
3259        { "Wacom ISDv4 116", 26202, 16325, 255, 0,
3260          TABLETPCE, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3261static const struct wacom_features wacom_features_0x12C =
3262        { "Wacom ISDv4 12C", 27848, 15752, 2047, 0,
3263          TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3264static const struct wacom_features wacom_features_0x4001 =
3265        { "Wacom ISDv4 4001", 26202, 16325, 255, 0,
3266          MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3267static const struct wacom_features wacom_features_0x4004 =
3268        { "Wacom ISDv4 4004", 11060, 6220, 255, 0,
3269          MTTPC_B, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3270static const struct wacom_features wacom_features_0x5000 =
3271        { "Wacom ISDv4 5000", 27848, 15752, 1023, 0,
3272          MTTPC_B, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3273static const struct wacom_features wacom_features_0x5002 =
3274        { "Wacom ISDv4 5002", 29576, 16724, 1023, 0,
3275          MTTPC_B, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3276static const struct wacom_features wacom_features_0x47 =
3277        { "Wacom Intuos2 6x8", 20320, 16240, 1023, 31,
3278          INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3279static const struct wacom_features wacom_features_0x84 =
3280        { "Wacom Wireless Receiver", .type = WIRELESS, .touch_max = 16 };
3281static const struct wacom_features wacom_features_0xD0 =
3282        { "Wacom Bamboo 2FG", 14720, 9200, 1023, 31,
3283          BAMBOO_TOUCH, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 };
3284static const struct wacom_features wacom_features_0xD1 =
3285        { "Wacom Bamboo 2FG 4x5", 14720, 9200, 1023, 31,
3286          BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 };
3287static const struct wacom_features wacom_features_0xD2 =
3288        { "Wacom Bamboo Craft", 14720, 9200, 1023, 31,
3289          BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 };
3290static const struct wacom_features wacom_features_0xD3 =
3291        { "Wacom Bamboo 2FG 6x8", 21648, 13700, 1023, 31,
3292          BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 };
3293static const struct wacom_features wacom_features_0xD4 =
3294        { "Wacom Bamboo Pen", 14720, 9200, 1023, 31,
3295          BAMBOO_PEN, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3296static const struct wacom_features wacom_features_0xD5 =
3297        { "Wacom Bamboo Pen 6x8", 21648, 13700, 1023, 31,
3298          BAMBOO_PEN, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3299static const struct wacom_features wacom_features_0xD6 =
3300        { "Wacom BambooPT 2FG 4x5", 14720, 9200, 1023, 31,
3301          BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 };
3302static const struct wacom_features wacom_features_0xD7 =
3303        { "Wacom BambooPT 2FG Small", 14720, 9200, 1023, 31,
3304          BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 };
3305static const struct wacom_features wacom_features_0xD8 =
3306        { "Wacom Bamboo Comic 2FG", 21648, 13700, 1023, 31,
3307          BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 };
3308static const struct wacom_features wacom_features_0xDA =
3309        { "Wacom Bamboo 2FG 4x5 SE", 14720, 9200, 1023, 31,
3310          BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 };
3311static const struct wacom_features wacom_features_0xDB =
3312        { "Wacom Bamboo 2FG 6x8 SE", 21648, 13700, 1023, 31,
3313          BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 };
3314static const struct wacom_features wacom_features_0xDD =
3315        { "Wacom Bamboo Connect", 14720, 9200, 1023, 31,
3316          BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3317static const struct wacom_features wacom_features_0xDE =
3318        { "Wacom Bamboo 16FG 4x5", 14720, 9200, 1023, 31,
3319          BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 16 };
3320static const struct wacom_features wacom_features_0xDF =
3321        { "Wacom Bamboo 16FG 6x8", 21648, 13700, 1023, 31,
3322          BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 16 };
3323static const struct wacom_features wacom_features_0x300 =
3324        { "Wacom Bamboo One S", 14720, 9225, 1023, 31,
3325          BAMBOO_PEN, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3326static const struct wacom_features wacom_features_0x301 =
3327        { "Wacom Bamboo One M", 21648, 13530, 1023, 31,
3328          BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3329static const struct wacom_features wacom_features_0x302 =
3330        { "Wacom Intuos PT S", 15200, 9500, 1023, 31,
3331          INTUOSHT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 16,
3332          .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
3333static const struct wacom_features wacom_features_0x303 =
3334        { "Wacom Intuos PT M", 21600, 13500, 1023, 31,
3335          INTUOSHT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 16,
3336          .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
3337static const struct wacom_features wacom_features_0x30E =
3338        { "Wacom Intuos S", 15200, 9500, 1023, 31,
3339          INTUOSHT, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
3340          .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
3341static const struct wacom_features wacom_features_0x6004 =
3342        { "ISD-V4", 12800, 8000, 255, 0,
3343          TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3344static const struct wacom_features wacom_features_0x307 =
3345        { "Wacom ISDv5 307", 59152, 33448, 2047, 63,
3346          CINTIQ_HYBRID, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 9,
3347          WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
3348          .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x309 };
3349static const struct wacom_features wacom_features_0x309 =
3350        { "Wacom ISDv5 309", .type = WACOM_24HDT, /* Touch */
3351          .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x0307, .touch_max = 10,
3352          .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
3353static const struct wacom_features wacom_features_0x30A =
3354        { "Wacom ISDv5 30A", 59152, 33448, 2047, 63,
3355          CINTIQ_HYBRID, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 9,
3356          WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
3357          .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x30C };
3358static const struct wacom_features wacom_features_0x30C =
3359        { "Wacom ISDv5 30C", .type = WACOM_24HDT, /* Touch */
3360          .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x30A, .touch_max = 10,
3361          .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
3362static const struct wacom_features wacom_features_0x318 =
3363        { "Wacom USB Bamboo PAD", 4095, 4095, /* Touch */
3364          .type = BAMBOO_PAD, 35, 48, .touch_max = 4 };
3365static const struct wacom_features wacom_features_0x319 =
3366        { "Wacom Wireless Bamboo PAD", 4095, 4095, /* Touch */
3367          .type = BAMBOO_PAD, 35, 48, .touch_max = 4 };
3368static const struct wacom_features wacom_features_0x325 =
3369        { "Wacom ISDv5 325", 59552, 33848, 2047, 63,
3370          CINTIQ_COMPANION_2, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 11,
3371          WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
3372          .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x326 };
3373static const struct wacom_features wacom_features_0x326 = /* Touch */
3374        { "Wacom ISDv5 326", .type = HID_GENERIC, .oVid = USB_VENDOR_ID_WACOM,
3375          .oPid = 0x325 };
3376static const struct wacom_features wacom_features_0x323 =
3377        { "Wacom Intuos P M", 21600, 13500, 1023, 31,
3378          INTUOSHT, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
3379          .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
3380static const struct wacom_features wacom_features_0x331 =
3381        { "Wacom Express Key Remote", .type = REMOTE,
3382          .numbered_buttons = 18, .check_for_hid_type = true,
3383          .hid_type = HID_TYPE_USBNONE };
3384static const struct wacom_features wacom_features_0x33B =
3385        { "Wacom Intuos S 2", 15200, 9500, 2047, 63,
3386          INTUOSHT2, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
3387          .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
3388static const struct wacom_features wacom_features_0x33C =
3389        { "Wacom Intuos PT S 2", 15200, 9500, 2047, 63,
3390          INTUOSHT2, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 16,
3391          .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
3392static const struct wacom_features wacom_features_0x33D =
3393        { "Wacom Intuos P M 2", 21600, 13500, 2047, 63,
3394          INTUOSHT2, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
3395          .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
3396static const struct wacom_features wacom_features_0x33E =
3397        { "Wacom Intuos PT M 2", 21600, 13500, 2047, 63,
3398          INTUOSHT2, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 16,
3399          .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
3400static const struct wacom_features wacom_features_0x343 =
3401        { "Wacom DTK1651", 34616, 19559, 1023, 0,
3402          DTUS, WACOM_INTUOS_RES, WACOM_INTUOS_RES, 4,
3403          WACOM_DTU_OFFSET, WACOM_DTU_OFFSET };
3404
3405static const struct wacom_features wacom_features_HID_ANY_ID =
3406        { "Wacom HID", .type = HID_GENERIC };
3407
3408#define USB_DEVICE_WACOM(prod)                                          \
3409        HID_DEVICE(BUS_USB, HID_GROUP_WACOM, USB_VENDOR_ID_WACOM, prod),\
3410        .driver_data = (kernel_ulong_t)&wacom_features_##prod
3411
3412#define BT_DEVICE_WACOM(prod)                                           \
3413        HID_DEVICE(BUS_BLUETOOTH, HID_GROUP_WACOM, USB_VENDOR_ID_WACOM, prod),\
3414        .driver_data = (kernel_ulong_t)&wacom_features_##prod
3415
3416#define I2C_DEVICE_WACOM(prod)                                          \
3417        HID_DEVICE(BUS_I2C, HID_GROUP_WACOM, USB_VENDOR_ID_WACOM, prod),\
3418        .driver_data = (kernel_ulong_t)&wacom_features_##prod
3419
3420#define USB_DEVICE_LENOVO(prod)                                 \
3421        HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, prod),                     \
3422        .driver_data = (kernel_ulong_t)&wacom_features_##prod
3423
3424const struct hid_device_id wacom_ids[] = {
3425        { USB_DEVICE_WACOM(0x00) },
3426        { USB_DEVICE_WACOM(0x03) },
3427        { USB_DEVICE_WACOM(0x10) },
3428        { USB_DEVICE_WACOM(0x11) },
3429        { USB_DEVICE_WACOM(0x12) },
3430        { USB_DEVICE_WACOM(0x13) },
3431        { USB_DEVICE_WACOM(0x14) },
3432        { USB_DEVICE_WACOM(0x15) },
3433        { USB_DEVICE_WACOM(0x16) },
3434        { USB_DEVICE_WACOM(0x17) },
3435        { USB_DEVICE_WACOM(0x18) },
3436        { USB_DEVICE_WACOM(0x19) },
3437        { USB_DEVICE_WACOM(0x20) },
3438        { USB_DEVICE_WACOM(0x21) },
3439        { USB_DEVICE_WACOM(0x22) },
3440        { USB_DEVICE_WACOM(0x23) },
3441        { USB_DEVICE_WACOM(0x24) },
3442        { USB_DEVICE_WACOM(0x26) },
3443        { USB_DEVICE_WACOM(0x27) },
3444        { USB_DEVICE_WACOM(0x28) },
3445        { USB_DEVICE_WACOM(0x29) },
3446        { USB_DEVICE_WACOM(0x2A) },
3447        { USB_DEVICE_WACOM(0x30) },
3448        { USB_DEVICE_WACOM(0x31) },
3449        { USB_DEVICE_WACOM(0x32) },
3450        { USB_DEVICE_WACOM(0x33) },
3451        { USB_DEVICE_WACOM(0x34) },
3452        { USB_DEVICE_WACOM(0x35) },
3453        { USB_DEVICE_WACOM(0x37) },
3454        { USB_DEVICE_WACOM(0x38) },
3455        { USB_DEVICE_WACOM(0x39) },
3456        { USB_DEVICE_WACOM(0x3F) },
3457        { USB_DEVICE_WACOM(0x41) },
3458        { USB_DEVICE_WACOM(0x42) },
3459        { USB_DEVICE_WACOM(0x43) },
3460        { USB_DEVICE_WACOM(0x44) },
3461        { USB_DEVICE_WACOM(0x45) },
3462        { USB_DEVICE_WACOM(0x47) },
3463        { USB_DEVICE_WACOM(0x57) },
3464        { USB_DEVICE_WACOM(0x59) },
3465        { USB_DEVICE_WACOM(0x5B) },
3466        { USB_DEVICE_WACOM(0x5D) },
3467        { USB_DEVICE_WACOM(0x5E) },
3468        { USB_DEVICE_WACOM(0x60) },
3469        { USB_DEVICE_WACOM(0x61) },
3470        { USB_DEVICE_WACOM(0x62) },
3471        { USB_DEVICE_WACOM(0x63) },
3472        { USB_DEVICE_WACOM(0x64) },
3473        { USB_DEVICE_WACOM(0x65) },
3474        { USB_DEVICE_WACOM(0x69) },
3475        { USB_DEVICE_WACOM(0x6A) },
3476        { USB_DEVICE_WACOM(0x6B) },
3477        { BT_DEVICE_WACOM(0x81) },
3478        { USB_DEVICE_WACOM(0x84) },
3479        { USB_DEVICE_WACOM(0x90) },
3480        { USB_DEVICE_WACOM(0x93) },
3481        { USB_DEVICE_WACOM(0x97) },
3482        { USB_DEVICE_WACOM(0x9A) },
3483        { USB_DEVICE_WACOM(0x9F) },
3484        { USB_DEVICE_WACOM(0xB0) },
3485        { USB_DEVICE_WACOM(0xB1) },
3486        { USB_DEVICE_WACOM(0xB2) },
3487        { USB_DEVICE_WACOM(0xB3) },
3488        { USB_DEVICE_WACOM(0xB4) },
3489        { USB_DEVICE_WACOM(0xB5) },
3490        { USB_DEVICE_WACOM(0xB7) },
3491        { USB_DEVICE_WACOM(0xB8) },
3492        { USB_DEVICE_WACOM(0xB9) },
3493        { USB_DEVICE_WACOM(0xBA) },
3494        { USB_DEVICE_WACOM(0xBB) },
3495        { USB_DEVICE_WACOM(0xBC) },
3496        { BT_DEVICE_WACOM(0xBD) },
3497        { USB_DEVICE_WACOM(0xC0) },
3498        { USB_DEVICE_WACOM(0xC2) },
3499        { USB_DEVICE_WACOM(0xC4) },
3500        { USB_DEVICE_WACOM(0xC5) },
3501        { USB_DEVICE_WACOM(0xC6) },
3502        { USB_DEVICE_WACOM(0xC7) },
3503        { USB_DEVICE_WACOM(0xCC) },
3504        { USB_DEVICE_WACOM(0xCE) },
3505        { USB_DEVICE_WACOM(0xD0) },
3506        { USB_DEVICE_WACOM(0xD1) },
3507        { USB_DEVICE_WACOM(0xD2) },
3508        { USB_DEVICE_WACOM(0xD3) },
3509        { USB_DEVICE_WACOM(0xD4) },
3510        { USB_DEVICE_WACOM(0xD5) },
3511        { USB_DEVICE_WACOM(0xD6) },
3512        { USB_DEVICE_WACOM(0xD7) },
3513        { USB_DEVICE_WACOM(0xD8) },
3514        { USB_DEVICE_WACOM(0xDA) },
3515        { USB_DEVICE_WACOM(0xDB) },
3516        { USB_DEVICE_WACOM(0xDD) },
3517        { USB_DEVICE_WACOM(0xDE) },
3518        { USB_DEVICE_WACOM(0xDF) },
3519        { USB_DEVICE_WACOM(0xE2) },
3520        { USB_DEVICE_WACOM(0xE3) },
3521        { USB_DEVICE_WACOM(0xE5) },
3522        { USB_DEVICE_WACOM(0xE6) },
3523        { USB_DEVICE_WACOM(0xEC) },
3524        { USB_DEVICE_WACOM(0xED) },
3525        { USB_DEVICE_WACOM(0xEF) },
3526        { USB_DEVICE_WACOM(0xF0) },
3527        { USB_DEVICE_WACOM(0xF4) },
3528        { USB_DEVICE_WACOM(0xF6) },
3529        { USB_DEVICE_WACOM(0xF8) },
3530        { USB_DEVICE_WACOM(0xFA) },
3531        { USB_DEVICE_WACOM(0xFB) },
3532        { USB_DEVICE_WACOM(0x100) },
3533        { USB_DEVICE_WACOM(0x101) },
3534        { USB_DEVICE_WACOM(0x10D) },
3535        { USB_DEVICE_WACOM(0x10E) },
3536        { USB_DEVICE_WACOM(0x10F) },
3537        { USB_DEVICE_WACOM(0x116) },
3538        { USB_DEVICE_WACOM(0x12C) },
3539        { USB_DEVICE_WACOM(0x300) },
3540        { USB_DEVICE_WACOM(0x301) },
3541        { USB_DEVICE_WACOM(0x302) },
3542        { USB_DEVICE_WACOM(0x303) },
3543        { USB_DEVICE_WACOM(0x304) },
3544        { USB_DEVICE_WACOM(0x307) },
3545        { USB_DEVICE_WACOM(0x309) },
3546        { USB_DEVICE_WACOM(0x30A) },
3547        { USB_DEVICE_WACOM(0x30C) },
3548        { USB_DEVICE_WACOM(0x30E) },
3549        { USB_DEVICE_WACOM(0x314) },
3550        { USB_DEVICE_WACOM(0x315) },
3551        { USB_DEVICE_WACOM(0x317) },
3552        { USB_DEVICE_WACOM(0x318) },
3553        { USB_DEVICE_WACOM(0x319) },
3554        { USB_DEVICE_WACOM(0x323) },
3555        { USB_DEVICE_WACOM(0x325) },
3556        { USB_DEVICE_WACOM(0x326) },
3557        { USB_DEVICE_WACOM(0x32A) },
3558        { USB_DEVICE_WACOM(0x32B) },
3559        { USB_DEVICE_WACOM(0x32C) },
3560        { USB_DEVICE_WACOM(0x32F) },
3561        { USB_DEVICE_WACOM(0x331) },
3562        { USB_DEVICE_WACOM(0x333) },
3563        { USB_DEVICE_WACOM(0x335) },
3564        { USB_DEVICE_WACOM(0x336) },
3565        { USB_DEVICE_WACOM(0x33B) },
3566        { USB_DEVICE_WACOM(0x33C) },
3567        { USB_DEVICE_WACOM(0x33D) },
3568        { USB_DEVICE_WACOM(0x33E) },
3569        { USB_DEVICE_WACOM(0x343) },
3570        { USB_DEVICE_WACOM(0x4001) },
3571        { USB_DEVICE_WACOM(0x4004) },
3572        { USB_DEVICE_WACOM(0x5000) },
3573        { USB_DEVICE_WACOM(0x5002) },
3574        { USB_DEVICE_LENOVO(0x6004) },
3575
3576        { USB_DEVICE_WACOM(HID_ANY_ID) },
3577        { I2C_DEVICE_WACOM(HID_ANY_ID) },
3578        { }
3579};
3580MODULE_DEVICE_TABLE(hid, wacom_ids);
3581