linux/drivers/hid/wacom_sys.c
<<
>>
Prefs
   1/*
   2 * drivers/input/tablet/wacom_sys.c
   3 *
   4 *  USB Wacom tablet support - system specific code
   5 */
   6
   7/*
   8 * This program is free software; you can redistribute it and/or modify
   9 * it under the terms of the GNU General Public License as published by
  10 * the Free Software Foundation; either version 2 of the License, or
  11 * (at your option) any later version.
  12 */
  13
  14#include "wacom_wac.h"
  15#include "wacom.h"
  16#include <linux/input/mt.h>
  17
  18#define WAC_MSG_RETRIES         5
  19
  20#define WAC_CMD_WL_LED_CONTROL  0x03
  21#define WAC_CMD_LED_CONTROL     0x20
  22#define WAC_CMD_ICON_START      0x21
  23#define WAC_CMD_ICON_XFER       0x23
  24#define WAC_CMD_ICON_BT_XFER    0x26
  25#define WAC_CMD_RETRIES         10
  26#define WAC_CMD_DELETE_PAIRING  0x20
  27#define WAC_CMD_UNPAIR_ALL      0xFF
  28
  29#define DEV_ATTR_RW_PERM (S_IRUGO | S_IWUSR | S_IWGRP)
  30#define DEV_ATTR_WO_PERM (S_IWUSR | S_IWGRP)
  31#define DEV_ATTR_RO_PERM (S_IRUSR | S_IRGRP)
  32
  33static int wacom_get_report(struct hid_device *hdev, u8 type, u8 *buf,
  34                            size_t size, unsigned int retries)
  35{
  36        int retval;
  37
  38        do {
  39                retval = hid_hw_raw_request(hdev, buf[0], buf, size, type,
  40                                HID_REQ_GET_REPORT);
  41        } while ((retval == -ETIMEDOUT || retval == -EAGAIN) && --retries);
  42
  43        if (retval < 0)
  44                hid_err(hdev, "wacom_get_report: ran out of retries "
  45                        "(last error = %d)\n", retval);
  46
  47        return retval;
  48}
  49
  50static int wacom_set_report(struct hid_device *hdev, u8 type, u8 *buf,
  51                            size_t size, unsigned int retries)
  52{
  53        int retval;
  54
  55        do {
  56                retval = hid_hw_raw_request(hdev, buf[0], buf, size, type,
  57                                HID_REQ_SET_REPORT);
  58        } while ((retval == -ETIMEDOUT || retval == -EAGAIN) && --retries);
  59
  60        if (retval < 0)
  61                hid_err(hdev, "wacom_set_report: ran out of retries "
  62                        "(last error = %d)\n", retval);
  63
  64        return retval;
  65}
  66
  67static int wacom_raw_event(struct hid_device *hdev, struct hid_report *report,
  68                u8 *raw_data, int size)
  69{
  70        struct wacom *wacom = hid_get_drvdata(hdev);
  71
  72        if (size > WACOM_PKGLEN_MAX)
  73                return 1;
  74
  75        memcpy(wacom->wacom_wac.data, raw_data, size);
  76
  77        wacom_wac_irq(&wacom->wacom_wac, size);
  78
  79        return 0;
  80}
  81
  82static int wacom_open(struct input_dev *dev)
  83{
  84        struct wacom *wacom = input_get_drvdata(dev);
  85
  86        return hid_hw_open(wacom->hdev);
  87}
  88
  89static void wacom_close(struct input_dev *dev)
  90{
  91        struct wacom *wacom = input_get_drvdata(dev);
  92
  93        /*
  94         * wacom->hdev should never be null, but surprisingly, I had the case
  95         * once while unplugging the Wacom Wireless Receiver.
  96         */
  97        if (wacom->hdev)
  98                hid_hw_close(wacom->hdev);
  99}
 100
 101/*
 102 * Calculate the resolution of the X or Y axis using hidinput_calc_abs_res.
 103 */
 104static int wacom_calc_hid_res(int logical_extents, int physical_extents,
 105                               unsigned unit, int exponent)
 106{
 107        struct hid_field field = {
 108                .logical_maximum = logical_extents,
 109                .physical_maximum = physical_extents,
 110                .unit = unit,
 111                .unit_exponent = exponent,
 112        };
 113
 114        return hidinput_calc_abs_res(&field, ABS_X);
 115}
 116
 117static void wacom_feature_mapping(struct hid_device *hdev,
 118                struct hid_field *field, struct hid_usage *usage)
 119{
 120        struct wacom *wacom = hid_get_drvdata(hdev);
 121        struct wacom_features *features = &wacom->wacom_wac.features;
 122        struct hid_data *hid_data = &wacom->wacom_wac.hid_data;
 123        u8 *data;
 124        int ret;
 125
 126        switch (usage->hid) {
 127        case HID_DG_CONTACTMAX:
 128                /* leave touch_max as is if predefined */
 129                if (!features->touch_max) {
 130                        /* read manually */
 131                        data = kzalloc(2, GFP_KERNEL);
 132                        if (!data)
 133                                break;
 134                        data[0] = field->report->id;
 135                        ret = wacom_get_report(hdev, HID_FEATURE_REPORT,
 136                                                data, 2, WAC_CMD_RETRIES);
 137                        if (ret == 2) {
 138                                features->touch_max = data[1];
 139                        } else {
 140                                features->touch_max = 16;
 141                                hid_warn(hdev, "wacom_feature_mapping: "
 142                                         "could not get HID_DG_CONTACTMAX, "
 143                                         "defaulting to %d\n",
 144                                          features->touch_max);
 145                        }
 146                        kfree(data);
 147                }
 148                break;
 149        case HID_DG_INPUTMODE:
 150                /* Ignore if value index is out of bounds. */
 151                if (usage->usage_index >= field->report_count) {
 152                        dev_err(&hdev->dev, "HID_DG_INPUTMODE out of range\n");
 153                        break;
 154                }
 155
 156                hid_data->inputmode = field->report->id;
 157                hid_data->inputmode_index = usage->usage_index;
 158                break;
 159
 160        case HID_UP_DIGITIZER:
 161                if (field->report->id == 0x0B &&
 162                    (field->application == WACOM_G9_DIGITIZER ||
 163                     field->application == WACOM_G11_DIGITIZER)) {
 164                        wacom->wacom_wac.mode_report = field->report->id;
 165                        wacom->wacom_wac.mode_value = 0;
 166                }
 167                break;
 168
 169        case WACOM_G9_PAGE:
 170        case WACOM_G11_PAGE:
 171                if (field->report->id == 0x03 &&
 172                    (field->application == WACOM_G9_TOUCHSCREEN ||
 173                     field->application == WACOM_G11_TOUCHSCREEN)) {
 174                        wacom->wacom_wac.mode_report = field->report->id;
 175                        wacom->wacom_wac.mode_value = 0;
 176                }
 177                break;
 178        }
 179}
 180
 181/*
 182 * Interface Descriptor of wacom devices can be incomplete and
 183 * inconsistent so wacom_features table is used to store stylus
 184 * device's packet lengths, various maximum values, and tablet
 185 * resolution based on product ID's.
 186 *
 187 * For devices that contain 2 interfaces, wacom_features table is
 188 * inaccurate for the touch interface.  Since the Interface Descriptor
 189 * for touch interfaces has pretty complete data, this function exists
 190 * to query tablet for this missing information instead of hard coding in
 191 * an additional table.
 192 *
 193 * A typical Interface Descriptor for a stylus will contain a
 194 * boot mouse application collection that is not of interest and this
 195 * function will ignore it.
 196 *
 197 * It also contains a digitizer application collection that also is not
 198 * of interest since any information it contains would be duplicate
 199 * of what is in wacom_features. Usually it defines a report of an array
 200 * of bytes that could be used as max length of the stylus packet returned.
 201 * If it happens to define a Digitizer-Stylus Physical Collection then
 202 * the X and Y logical values contain valid data but it is ignored.
 203 *
 204 * A typical Interface Descriptor for a touch interface will contain a
 205 * Digitizer-Finger Physical Collection which will define both logical
 206 * X/Y maximum as well as the physical size of tablet. Since touch
 207 * interfaces haven't supported pressure or distance, this is enough
 208 * information to override invalid values in the wacom_features table.
 209 *
 210 * Intuos5 touch interface and 3rd gen Bamboo Touch do not contain useful
 211 * data. We deal with them after returning from this function.
 212 */
 213static void wacom_usage_mapping(struct hid_device *hdev,
 214                struct hid_field *field, struct hid_usage *usage)
 215{
 216        struct wacom *wacom = hid_get_drvdata(hdev);
 217        struct wacom_features *features = &wacom->wacom_wac.features;
 218        bool finger = WACOM_FINGER_FIELD(field);
 219        bool pen = WACOM_PEN_FIELD(field);
 220
 221        /*
 222        * Requiring Stylus Usage will ignore boot mouse
 223        * X/Y values and some cases of invalid Digitizer X/Y
 224        * values commonly reported.
 225        */
 226        if (pen)
 227                features->device_type |= WACOM_DEVICETYPE_PEN;
 228        else if (finger)
 229                features->device_type |= WACOM_DEVICETYPE_TOUCH;
 230        else
 231                return;
 232
 233        /*
 234         * Bamboo models do not support HID_DG_CONTACTMAX.
 235         * And, Bamboo Pen only descriptor contains touch.
 236         */
 237        if (features->type > BAMBOO_PT) {
 238                /* ISDv4 touch devices at least supports one touch point */
 239                if (finger && !features->touch_max)
 240                        features->touch_max = 1;
 241        }
 242
 243        switch (usage->hid) {
 244        case HID_GD_X:
 245                features->x_max = field->logical_maximum;
 246                if (finger) {
 247                        features->x_phy = field->physical_maximum;
 248                        if ((features->type != BAMBOO_PT) &&
 249                            (features->type != BAMBOO_TOUCH)) {
 250                                features->unit = field->unit;
 251                                features->unitExpo = field->unit_exponent;
 252                        }
 253                }
 254                break;
 255        case HID_GD_Y:
 256                features->y_max = field->logical_maximum;
 257                if (finger) {
 258                        features->y_phy = field->physical_maximum;
 259                        if ((features->type != BAMBOO_PT) &&
 260                            (features->type != BAMBOO_TOUCH)) {
 261                                features->unit = field->unit;
 262                                features->unitExpo = field->unit_exponent;
 263                        }
 264                }
 265                break;
 266        case HID_DG_TIPPRESSURE:
 267                if (pen)
 268                        features->pressure_max = field->logical_maximum;
 269                break;
 270        }
 271
 272        if (features->type == HID_GENERIC)
 273                wacom_wac_usage_mapping(hdev, field, usage);
 274}
 275
 276static void wacom_post_parse_hid(struct hid_device *hdev,
 277                                 struct wacom_features *features)
 278{
 279        struct wacom *wacom = hid_get_drvdata(hdev);
 280        struct wacom_wac *wacom_wac = &wacom->wacom_wac;
 281
 282        if (features->type == HID_GENERIC) {
 283                /* Any last-minute generic device setup */
 284                if (features->touch_max > 1) {
 285                        input_mt_init_slots(wacom_wac->touch_input, wacom_wac->features.touch_max,
 286                                    INPUT_MT_DIRECT);
 287                }
 288        }
 289}
 290
 291static void wacom_parse_hid(struct hid_device *hdev,
 292                           struct wacom_features *features)
 293{
 294        struct hid_report_enum *rep_enum;
 295        struct hid_report *hreport;
 296        int i, j;
 297
 298        /* check features first */
 299        rep_enum = &hdev->report_enum[HID_FEATURE_REPORT];
 300        list_for_each_entry(hreport, &rep_enum->report_list, list) {
 301                for (i = 0; i < hreport->maxfield; i++) {
 302                        /* Ignore if report count is out of bounds. */
 303                        if (hreport->field[i]->report_count < 1)
 304                                continue;
 305
 306                        for (j = 0; j < hreport->field[i]->maxusage; j++) {
 307                                wacom_feature_mapping(hdev, hreport->field[i],
 308                                                hreport->field[i]->usage + j);
 309                        }
 310                }
 311        }
 312
 313        /* now check the input usages */
 314        rep_enum = &hdev->report_enum[HID_INPUT_REPORT];
 315        list_for_each_entry(hreport, &rep_enum->report_list, list) {
 316
 317                if (!hreport->maxfield)
 318                        continue;
 319
 320                for (i = 0; i < hreport->maxfield; i++)
 321                        for (j = 0; j < hreport->field[i]->maxusage; j++)
 322                                wacom_usage_mapping(hdev, hreport->field[i],
 323                                                hreport->field[i]->usage + j);
 324        }
 325
 326        wacom_post_parse_hid(hdev, features);
 327}
 328
 329static int wacom_hid_set_device_mode(struct hid_device *hdev)
 330{
 331        struct wacom *wacom = hid_get_drvdata(hdev);
 332        struct hid_data *hid_data = &wacom->wacom_wac.hid_data;
 333        struct hid_report *r;
 334        struct hid_report_enum *re;
 335
 336        if (hid_data->inputmode < 0)
 337                return 0;
 338
 339        re = &(hdev->report_enum[HID_FEATURE_REPORT]);
 340        r = re->report_id_hash[hid_data->inputmode];
 341        if (r) {
 342                r->field[0]->value[hid_data->inputmode_index] = 2;
 343                hid_hw_request(hdev, r, HID_REQ_SET_REPORT);
 344        }
 345        return 0;
 346}
 347
 348static int wacom_set_device_mode(struct hid_device *hdev,
 349                                 struct wacom_wac *wacom_wac)
 350{
 351        u8 *rep_data;
 352        struct hid_report *r;
 353        struct hid_report_enum *re;
 354        int length;
 355        int error = -ENOMEM, limit = 0;
 356
 357        if (wacom_wac->mode_report < 0)
 358                return 0;
 359
 360        re = &(hdev->report_enum[HID_FEATURE_REPORT]);
 361        r = re->report_id_hash[wacom_wac->mode_report];
 362        if (!r)
 363                return -EINVAL;
 364
 365        rep_data = hid_alloc_report_buf(r, GFP_KERNEL);
 366        if (!rep_data)
 367                return -ENOMEM;
 368
 369        length = hid_report_len(r);
 370
 371        do {
 372                rep_data[0] = wacom_wac->mode_report;
 373                rep_data[1] = wacom_wac->mode_value;
 374
 375                error = wacom_set_report(hdev, HID_FEATURE_REPORT, rep_data,
 376                                         length, 1);
 377                if (error >= 0)
 378                        error = wacom_get_report(hdev, HID_FEATURE_REPORT,
 379                                                 rep_data, length, 1);
 380        } while (error >= 0 &&
 381                 rep_data[1] != wacom_wac->mode_report &&
 382                 limit++ < WAC_MSG_RETRIES);
 383
 384        kfree(rep_data);
 385
 386        return error < 0 ? error : 0;
 387}
 388
 389static int wacom_bt_query_tablet_data(struct hid_device *hdev, u8 speed,
 390                struct wacom_features *features)
 391{
 392        struct wacom *wacom = hid_get_drvdata(hdev);
 393        int ret;
 394        u8 rep_data[2];
 395
 396        switch (features->type) {
 397        case GRAPHIRE_BT:
 398                rep_data[0] = 0x03;
 399                rep_data[1] = 0x00;
 400                ret = wacom_set_report(hdev, HID_FEATURE_REPORT, rep_data, 2,
 401                                        3);
 402
 403                if (ret >= 0) {
 404                        rep_data[0] = speed == 0 ? 0x05 : 0x06;
 405                        rep_data[1] = 0x00;
 406
 407                        ret = wacom_set_report(hdev, HID_FEATURE_REPORT,
 408                                                rep_data, 2, 3);
 409
 410                        if (ret >= 0) {
 411                                wacom->wacom_wac.bt_high_speed = speed;
 412                                return 0;
 413                        }
 414                }
 415
 416                /*
 417                 * Note that if the raw queries fail, it's not a hard failure
 418                 * and it is safe to continue
 419                 */
 420                hid_warn(hdev, "failed to poke device, command %d, err %d\n",
 421                         rep_data[0], ret);
 422                break;
 423        case INTUOS4WL:
 424                if (speed == 1)
 425                        wacom->wacom_wac.bt_features &= ~0x20;
 426                else
 427                        wacom->wacom_wac.bt_features |= 0x20;
 428
 429                rep_data[0] = 0x03;
 430                rep_data[1] = wacom->wacom_wac.bt_features;
 431
 432                ret = wacom_set_report(hdev, HID_FEATURE_REPORT, rep_data, 2,
 433                                        1);
 434                if (ret >= 0)
 435                        wacom->wacom_wac.bt_high_speed = speed;
 436                break;
 437        }
 438
 439        return 0;
 440}
 441
 442/*
 443 * Switch the tablet into its most-capable mode. Wacom tablets are
 444 * typically configured to power-up in a mode which sends mouse-like
 445 * reports to the OS. To get absolute position, pressure data, etc.
 446 * from the tablet, it is necessary to switch the tablet out of this
 447 * mode and into one which sends the full range of tablet data.
 448 */
 449static int wacom_query_tablet_data(struct hid_device *hdev,
 450                struct wacom_features *features)
 451{
 452        struct wacom *wacom = hid_get_drvdata(hdev);
 453        struct wacom_wac *wacom_wac = &wacom->wacom_wac;
 454
 455        if (hdev->bus == BUS_BLUETOOTH)
 456                return wacom_bt_query_tablet_data(hdev, 1, features);
 457
 458        if (features->type != HID_GENERIC) {
 459                if (features->device_type & WACOM_DEVICETYPE_TOUCH) {
 460                        if (features->type > TABLETPC) {
 461                                /* MT Tablet PC touch */
 462                                wacom_wac->mode_report = 3;
 463                                wacom_wac->mode_value = 4;
 464                        } else if (features->type == WACOM_24HDT) {
 465                                wacom_wac->mode_report = 18;
 466                                wacom_wac->mode_value = 2;
 467                        } else if (features->type == WACOM_27QHDT) {
 468                                wacom_wac->mode_report = 131;
 469                                wacom_wac->mode_value = 2;
 470                        } else if (features->type == BAMBOO_PAD) {
 471                                wacom_wac->mode_report = 2;
 472                                wacom_wac->mode_value = 2;
 473                        }
 474                } else if (features->device_type & WACOM_DEVICETYPE_PEN) {
 475                        if (features->type <= BAMBOO_PT) {
 476                                wacom_wac->mode_report = 2;
 477                                wacom_wac->mode_value = 2;
 478                        }
 479                }
 480        }
 481
 482        wacom_set_device_mode(hdev, wacom_wac);
 483
 484        if (features->type == HID_GENERIC)
 485                return wacom_hid_set_device_mode(hdev);
 486
 487        return 0;
 488}
 489
 490static void wacom_retrieve_hid_descriptor(struct hid_device *hdev,
 491                                         struct wacom_features *features)
 492{
 493        struct wacom *wacom = hid_get_drvdata(hdev);
 494        struct usb_interface *intf = wacom->intf;
 495
 496        /* default features */
 497        features->x_fuzz = 4;
 498        features->y_fuzz = 4;
 499        features->pressure_fuzz = 0;
 500        features->distance_fuzz = 1;
 501        features->tilt_fuzz = 1;
 502
 503        /*
 504         * The wireless device HID is basic and layout conflicts with
 505         * other tablets (monitor and touch interface can look like pen).
 506         * Skip the query for this type and modify defaults based on
 507         * interface number.
 508         */
 509        if (features->type == WIRELESS) {
 510                if (intf->cur_altsetting->desc.bInterfaceNumber == 0)
 511                        features->device_type = WACOM_DEVICETYPE_WL_MONITOR;
 512                else
 513                        features->device_type = WACOM_DEVICETYPE_NONE;
 514                return;
 515        }
 516
 517        wacom_parse_hid(hdev, features);
 518}
 519
 520struct wacom_hdev_data {
 521        struct list_head list;
 522        struct kref kref;
 523        struct hid_device *dev;
 524        struct wacom_shared shared;
 525};
 526
 527static LIST_HEAD(wacom_udev_list);
 528static DEFINE_MUTEX(wacom_udev_list_lock);
 529
 530static bool compare_device_paths(struct hid_device *hdev_a,
 531                struct hid_device *hdev_b, char separator)
 532{
 533        int n1 = strrchr(hdev_a->phys, separator) - hdev_a->phys;
 534        int n2 = strrchr(hdev_b->phys, separator) - hdev_b->phys;
 535
 536        if (n1 != n2 || n1 <= 0 || n2 <= 0)
 537                return false;
 538
 539        return !strncmp(hdev_a->phys, hdev_b->phys, n1);
 540}
 541
 542static bool wacom_are_sibling(struct hid_device *hdev,
 543                struct hid_device *sibling)
 544{
 545        struct wacom *wacom = hid_get_drvdata(hdev);
 546        struct wacom_features *features = &wacom->wacom_wac.features;
 547        struct wacom *sibling_wacom = hid_get_drvdata(sibling);
 548        struct wacom_features *sibling_features = &sibling_wacom->wacom_wac.features;
 549        __u32 oVid = features->oVid ? features->oVid : hdev->vendor;
 550        __u32 oPid = features->oPid ? features->oPid : hdev->product;
 551
 552        /* The defined oVid/oPid must match that of the sibling */
 553        if (features->oVid != HID_ANY_ID && sibling->vendor != oVid)
 554                return false;
 555        if (features->oPid != HID_ANY_ID && sibling->product != oPid)
 556                return false;
 557
 558        /*
 559         * Devices with the same VID/PID must share the same physical
 560         * device path, while those with different VID/PID must share
 561         * the same physical parent device path.
 562         */
 563        if (hdev->vendor == sibling->vendor && hdev->product == sibling->product) {
 564                if (!compare_device_paths(hdev, sibling, '/'))
 565                        return false;
 566        } else {
 567                if (!compare_device_paths(hdev, sibling, '.'))
 568                        return false;
 569        }
 570
 571        /* Skip the remaining heuristics unless you are a HID_GENERIC device */
 572        if (features->type != HID_GENERIC)
 573                return true;
 574
 575        /*
 576         * Direct-input devices may not be siblings of indirect-input
 577         * devices.
 578         */
 579        if ((features->device_type & WACOM_DEVICETYPE_DIRECT) &&
 580            !(sibling_features->device_type & WACOM_DEVICETYPE_DIRECT))
 581                return false;
 582
 583        /*
 584         * Indirect-input devices may not be siblings of direct-input
 585         * devices.
 586         */
 587        if (!(features->device_type & WACOM_DEVICETYPE_DIRECT) &&
 588            (sibling_features->device_type & WACOM_DEVICETYPE_DIRECT))
 589                return false;
 590
 591        /* Pen devices may only be siblings of touch devices */
 592        if ((features->device_type & WACOM_DEVICETYPE_PEN) &&
 593            !(sibling_features->device_type & WACOM_DEVICETYPE_TOUCH))
 594                return false;
 595
 596        /* Touch devices may only be siblings of pen devices */
 597        if ((features->device_type & WACOM_DEVICETYPE_TOUCH) &&
 598            !(sibling_features->device_type & WACOM_DEVICETYPE_PEN))
 599                return false;
 600
 601        /*
 602         * No reason could be found for these two devices to NOT be
 603         * siblings, so there's a good chance they ARE siblings
 604         */
 605        return true;
 606}
 607
 608static struct wacom_hdev_data *wacom_get_hdev_data(struct hid_device *hdev)
 609{
 610        struct wacom_hdev_data *data;
 611
 612        /* Try to find an already-probed interface from the same device */
 613        list_for_each_entry(data, &wacom_udev_list, list) {
 614                if (compare_device_paths(hdev, data->dev, '/'))
 615                        return data;
 616        }
 617
 618        /* Fallback to finding devices that appear to be "siblings" */
 619        list_for_each_entry(data, &wacom_udev_list, list) {
 620                if (wacom_are_sibling(hdev, data->dev)) {
 621                        kref_get(&data->kref);
 622                        return data;
 623                }
 624        }
 625
 626        return NULL;
 627}
 628
 629static void wacom_release_shared_data(struct kref *kref)
 630{
 631        struct wacom_hdev_data *data =
 632                container_of(kref, struct wacom_hdev_data, kref);
 633
 634        mutex_lock(&wacom_udev_list_lock);
 635        list_del(&data->list);
 636        mutex_unlock(&wacom_udev_list_lock);
 637
 638        kfree(data);
 639}
 640
 641static void wacom_remove_shared_data(void *res)
 642{
 643        struct wacom *wacom = res;
 644        struct wacom_hdev_data *data;
 645        struct wacom_wac *wacom_wac = &wacom->wacom_wac;
 646
 647        if (wacom_wac->shared) {
 648                data = container_of(wacom_wac->shared, struct wacom_hdev_data,
 649                                    shared);
 650
 651                if (wacom_wac->shared->touch == wacom->hdev)
 652                        wacom_wac->shared->touch = NULL;
 653                else if (wacom_wac->shared->pen == wacom->hdev)
 654                        wacom_wac->shared->pen = NULL;
 655
 656                kref_put(&data->kref, wacom_release_shared_data);
 657                wacom_wac->shared = NULL;
 658        }
 659}
 660
 661static int wacom_add_shared_data(struct hid_device *hdev)
 662{
 663        struct wacom *wacom = hid_get_drvdata(hdev);
 664        struct wacom_wac *wacom_wac = &wacom->wacom_wac;
 665        struct wacom_hdev_data *data;
 666        int retval = 0;
 667
 668        mutex_lock(&wacom_udev_list_lock);
 669
 670        data = wacom_get_hdev_data(hdev);
 671        if (!data) {
 672                data = kzalloc(sizeof(struct wacom_hdev_data), GFP_KERNEL);
 673                if (!data) {
 674                        retval = -ENOMEM;
 675                        goto out;
 676                }
 677
 678                kref_init(&data->kref);
 679                data->dev = hdev;
 680                list_add_tail(&data->list, &wacom_udev_list);
 681        }
 682
 683        wacom_wac->shared = &data->shared;
 684
 685        retval = devm_add_action(&hdev->dev, wacom_remove_shared_data, wacom);
 686        if (retval) {
 687                mutex_unlock(&wacom_udev_list_lock);
 688                wacom_remove_shared_data(wacom);
 689                return retval;
 690        }
 691
 692        if (wacom_wac->features.device_type & WACOM_DEVICETYPE_TOUCH)
 693                wacom_wac->shared->touch = hdev;
 694        else if (wacom_wac->features.device_type & WACOM_DEVICETYPE_PEN)
 695                wacom_wac->shared->pen = hdev;
 696
 697out:
 698        mutex_unlock(&wacom_udev_list_lock);
 699        return retval;
 700}
 701
 702static int wacom_led_control(struct wacom *wacom)
 703{
 704        unsigned char *buf;
 705        int retval;
 706        unsigned char report_id = WAC_CMD_LED_CONTROL;
 707        int buf_size = 9;
 708
 709        if (!hid_get_drvdata(wacom->hdev))
 710                return -ENODEV;
 711
 712        if (!wacom->led.groups)
 713                return -ENOTSUPP;
 714
 715        if (wacom->wacom_wac.pid) { /* wireless connected */
 716                report_id = WAC_CMD_WL_LED_CONTROL;
 717                buf_size = 13;
 718        }
 719        buf = kzalloc(buf_size, GFP_KERNEL);
 720        if (!buf)
 721                return -ENOMEM;
 722
 723        if (wacom->wacom_wac.features.type >= INTUOS5S &&
 724            wacom->wacom_wac.features.type <= INTUOSPL) {
 725                /*
 726                 * Touch Ring and crop mark LED luminance may take on
 727                 * one of four values:
 728                 *    0 = Low; 1 = Medium; 2 = High; 3 = Off
 729                 */
 730                int ring_led = wacom->led.groups[0].select & 0x03;
 731                int ring_lum = (((wacom->led.llv & 0x60) >> 5) - 1) & 0x03;
 732                int crop_lum = 0;
 733                unsigned char led_bits = (crop_lum << 4) | (ring_lum << 2) | (ring_led);
 734
 735                buf[0] = report_id;
 736                if (wacom->wacom_wac.pid) {
 737                        wacom_get_report(wacom->hdev, HID_FEATURE_REPORT,
 738                                         buf, buf_size, WAC_CMD_RETRIES);
 739                        buf[0] = report_id;
 740                        buf[4] = led_bits;
 741                } else
 742                        buf[1] = led_bits;
 743        }
 744        else {
 745                int led = wacom->led.groups[0].select | 0x4;
 746
 747                if (wacom->wacom_wac.features.type == WACOM_21UX2 ||
 748                    wacom->wacom_wac.features.type == WACOM_24HD)
 749                        led |= (wacom->led.groups[1].select << 4) | 0x40;
 750
 751                buf[0] = report_id;
 752                buf[1] = led;
 753                buf[2] = wacom->led.llv;
 754                buf[3] = wacom->led.hlv;
 755                buf[4] = wacom->led.img_lum;
 756        }
 757
 758        retval = wacom_set_report(wacom->hdev, HID_FEATURE_REPORT, buf, buf_size,
 759                                  WAC_CMD_RETRIES);
 760        kfree(buf);
 761
 762        return retval;
 763}
 764
 765static int wacom_led_putimage(struct wacom *wacom, int button_id, u8 xfer_id,
 766                const unsigned len, const void *img)
 767{
 768        unsigned char *buf;
 769        int i, retval;
 770        const unsigned chunk_len = len / 4; /* 4 chunks are needed to be sent */
 771
 772        buf = kzalloc(chunk_len + 3 , GFP_KERNEL);
 773        if (!buf)
 774                return -ENOMEM;
 775
 776        /* Send 'start' command */
 777        buf[0] = WAC_CMD_ICON_START;
 778        buf[1] = 1;
 779        retval = wacom_set_report(wacom->hdev, HID_FEATURE_REPORT, buf, 2,
 780                                  WAC_CMD_RETRIES);
 781        if (retval < 0)
 782                goto out;
 783
 784        buf[0] = xfer_id;
 785        buf[1] = button_id & 0x07;
 786        for (i = 0; i < 4; i++) {
 787                buf[2] = i;
 788                memcpy(buf + 3, img + i * chunk_len, chunk_len);
 789
 790                retval = wacom_set_report(wacom->hdev, HID_FEATURE_REPORT,
 791                                          buf, chunk_len + 3, WAC_CMD_RETRIES);
 792                if (retval < 0)
 793                        break;
 794        }
 795
 796        /* Send 'stop' */
 797        buf[0] = WAC_CMD_ICON_START;
 798        buf[1] = 0;
 799        wacom_set_report(wacom->hdev, HID_FEATURE_REPORT, buf, 2,
 800                         WAC_CMD_RETRIES);
 801
 802out:
 803        kfree(buf);
 804        return retval;
 805}
 806
 807static ssize_t wacom_led_select_store(struct device *dev, int set_id,
 808                                      const char *buf, size_t count)
 809{
 810        struct hid_device *hdev = to_hid_device(dev);
 811        struct wacom *wacom = hid_get_drvdata(hdev);
 812        unsigned int id;
 813        int err;
 814
 815        err = kstrtouint(buf, 10, &id);
 816        if (err)
 817                return err;
 818
 819        mutex_lock(&wacom->lock);
 820
 821        wacom->led.groups[set_id].select = id & 0x3;
 822        err = wacom_led_control(wacom);
 823
 824        mutex_unlock(&wacom->lock);
 825
 826        return err < 0 ? err : count;
 827}
 828
 829#define DEVICE_LED_SELECT_ATTR(SET_ID)                                  \
 830static ssize_t wacom_led##SET_ID##_select_store(struct device *dev,     \
 831        struct device_attribute *attr, const char *buf, size_t count)   \
 832{                                                                       \
 833        return wacom_led_select_store(dev, SET_ID, buf, count);         \
 834}                                                                       \
 835static ssize_t wacom_led##SET_ID##_select_show(struct device *dev,      \
 836        struct device_attribute *attr, char *buf)                       \
 837{                                                                       \
 838        struct hid_device *hdev = to_hid_device(dev);\
 839        struct wacom *wacom = hid_get_drvdata(hdev);                    \
 840        return scnprintf(buf, PAGE_SIZE, "%d\n",                        \
 841                         wacom->led.groups[SET_ID].select);             \
 842}                                                                       \
 843static DEVICE_ATTR(status_led##SET_ID##_select, DEV_ATTR_RW_PERM,       \
 844                    wacom_led##SET_ID##_select_show,                    \
 845                    wacom_led##SET_ID##_select_store)
 846
 847DEVICE_LED_SELECT_ATTR(0);
 848DEVICE_LED_SELECT_ATTR(1);
 849
 850static ssize_t wacom_luminance_store(struct wacom *wacom, u8 *dest,
 851                                     const char *buf, size_t count)
 852{
 853        unsigned int value;
 854        int err;
 855
 856        err = kstrtouint(buf, 10, &value);
 857        if (err)
 858                return err;
 859
 860        mutex_lock(&wacom->lock);
 861
 862        *dest = value & 0x7f;
 863        err = wacom_led_control(wacom);
 864
 865        mutex_unlock(&wacom->lock);
 866
 867        return err < 0 ? err : count;
 868}
 869
 870#define DEVICE_LUMINANCE_ATTR(name, field)                              \
 871static ssize_t wacom_##name##_luminance_store(struct device *dev,       \
 872        struct device_attribute *attr, const char *buf, size_t count)   \
 873{                                                                       \
 874        struct hid_device *hdev = to_hid_device(dev);\
 875        struct wacom *wacom = hid_get_drvdata(hdev);                    \
 876                                                                        \
 877        return wacom_luminance_store(wacom, &wacom->led.field,          \
 878                                     buf, count);                       \
 879}                                                                       \
 880static ssize_t wacom_##name##_luminance_show(struct device *dev,        \
 881        struct device_attribute *attr, char *buf)                       \
 882{                                                                       \
 883        struct wacom *wacom = dev_get_drvdata(dev);                     \
 884        return scnprintf(buf, PAGE_SIZE, "%d\n", wacom->led.field);     \
 885}                                                                       \
 886static DEVICE_ATTR(name##_luminance, DEV_ATTR_RW_PERM,                  \
 887                   wacom_##name##_luminance_show,                       \
 888                   wacom_##name##_luminance_store)
 889
 890DEVICE_LUMINANCE_ATTR(status0, llv);
 891DEVICE_LUMINANCE_ATTR(status1, hlv);
 892DEVICE_LUMINANCE_ATTR(buttons, img_lum);
 893
 894static ssize_t wacom_button_image_store(struct device *dev, int button_id,
 895                                        const char *buf, size_t count)
 896{
 897        struct hid_device *hdev = to_hid_device(dev);
 898        struct wacom *wacom = hid_get_drvdata(hdev);
 899        int err;
 900        unsigned len;
 901        u8 xfer_id;
 902
 903        if (hdev->bus == BUS_BLUETOOTH) {
 904                len = 256;
 905                xfer_id = WAC_CMD_ICON_BT_XFER;
 906        } else {
 907                len = 1024;
 908                xfer_id = WAC_CMD_ICON_XFER;
 909        }
 910
 911        if (count != len)
 912                return -EINVAL;
 913
 914        mutex_lock(&wacom->lock);
 915
 916        err = wacom_led_putimage(wacom, button_id, xfer_id, len, buf);
 917
 918        mutex_unlock(&wacom->lock);
 919
 920        return err < 0 ? err : count;
 921}
 922
 923#define DEVICE_BTNIMG_ATTR(BUTTON_ID)                                   \
 924static ssize_t wacom_btnimg##BUTTON_ID##_store(struct device *dev,      \
 925        struct device_attribute *attr, const char *buf, size_t count)   \
 926{                                                                       \
 927        return wacom_button_image_store(dev, BUTTON_ID, buf, count);    \
 928}                                                                       \
 929static DEVICE_ATTR(button##BUTTON_ID##_rawimg, DEV_ATTR_WO_PERM,        \
 930                   NULL, wacom_btnimg##BUTTON_ID##_store)
 931
 932DEVICE_BTNIMG_ATTR(0);
 933DEVICE_BTNIMG_ATTR(1);
 934DEVICE_BTNIMG_ATTR(2);
 935DEVICE_BTNIMG_ATTR(3);
 936DEVICE_BTNIMG_ATTR(4);
 937DEVICE_BTNIMG_ATTR(5);
 938DEVICE_BTNIMG_ATTR(6);
 939DEVICE_BTNIMG_ATTR(7);
 940
 941static struct attribute *cintiq_led_attrs[] = {
 942        &dev_attr_status_led0_select.attr,
 943        &dev_attr_status_led1_select.attr,
 944        NULL
 945};
 946
 947static struct attribute_group cintiq_led_attr_group = {
 948        .name = "wacom_led",
 949        .attrs = cintiq_led_attrs,
 950};
 951
 952static struct attribute *intuos4_led_attrs[] = {
 953        &dev_attr_status0_luminance.attr,
 954        &dev_attr_status1_luminance.attr,
 955        &dev_attr_status_led0_select.attr,
 956        &dev_attr_buttons_luminance.attr,
 957        &dev_attr_button0_rawimg.attr,
 958        &dev_attr_button1_rawimg.attr,
 959        &dev_attr_button2_rawimg.attr,
 960        &dev_attr_button3_rawimg.attr,
 961        &dev_attr_button4_rawimg.attr,
 962        &dev_attr_button5_rawimg.attr,
 963        &dev_attr_button6_rawimg.attr,
 964        &dev_attr_button7_rawimg.attr,
 965        NULL
 966};
 967
 968static struct attribute_group intuos4_led_attr_group = {
 969        .name = "wacom_led",
 970        .attrs = intuos4_led_attrs,
 971};
 972
 973static struct attribute *intuos5_led_attrs[] = {
 974        &dev_attr_status0_luminance.attr,
 975        &dev_attr_status_led0_select.attr,
 976        NULL
 977};
 978
 979static struct attribute_group intuos5_led_attr_group = {
 980        .name = "wacom_led",
 981        .attrs = intuos5_led_attrs,
 982};
 983
 984struct wacom_sysfs_group_devres {
 985        struct attribute_group *group;
 986        struct kobject *root;
 987};
 988
 989static void wacom_devm_sysfs_group_release(struct device *dev, void *res)
 990{
 991        struct wacom_sysfs_group_devres *devres = res;
 992        struct kobject *kobj = devres->root;
 993
 994        dev_dbg(dev, "%s: dropping reference to %s\n",
 995                __func__, devres->group->name);
 996        sysfs_remove_group(kobj, devres->group);
 997}
 998
 999static int __wacom_devm_sysfs_create_group(struct wacom *wacom,
1000                                           struct kobject *root,
1001                                           struct attribute_group *group)
1002{
1003        struct wacom_sysfs_group_devres *devres;
1004        int error;
1005
1006        devres = devres_alloc(wacom_devm_sysfs_group_release,
1007                              sizeof(struct wacom_sysfs_group_devres),
1008                              GFP_KERNEL);
1009        if (!devres)
1010                return -ENOMEM;
1011
1012        devres->group = group;
1013        devres->root = root;
1014
1015        error = sysfs_create_group(devres->root, group);
1016        if (error)
1017                return error;
1018
1019        devres_add(&wacom->hdev->dev, devres);
1020
1021        return 0;
1022}
1023
1024static int wacom_devm_sysfs_create_group(struct wacom *wacom,
1025                                         struct attribute_group *group)
1026{
1027        return __wacom_devm_sysfs_create_group(wacom, &wacom->hdev->dev.kobj,
1028                                               group);
1029}
1030
1031enum led_brightness wacom_leds_brightness_get(struct wacom_led *led)
1032{
1033        struct wacom *wacom = led->wacom;
1034
1035        if (wacom->led.max_hlv)
1036                return led->hlv * LED_FULL / wacom->led.max_hlv;
1037
1038        if (wacom->led.max_llv)
1039                return led->llv * LED_FULL / wacom->led.max_llv;
1040
1041        /* device doesn't support brightness tuning */
1042        return LED_FULL;
1043}
1044
1045static enum led_brightness __wacom_led_brightness_get(struct led_classdev *cdev)
1046{
1047        struct wacom_led *led = container_of(cdev, struct wacom_led, cdev);
1048        struct wacom *wacom = led->wacom;
1049
1050        if (wacom->led.groups[led->group].select != led->id)
1051                return LED_OFF;
1052
1053        return wacom_leds_brightness_get(led);
1054}
1055
1056static int wacom_led_brightness_set(struct led_classdev *cdev,
1057                                    enum led_brightness brightness)
1058{
1059        struct wacom_led *led = container_of(cdev, struct wacom_led, cdev);
1060        struct wacom *wacom = led->wacom;
1061        int error;
1062
1063        mutex_lock(&wacom->lock);
1064
1065        if (!wacom->led.groups || (brightness == LED_OFF &&
1066            wacom->led.groups[led->group].select != led->id)) {
1067                error = 0;
1068                goto out;
1069        }
1070
1071        led->llv = wacom->led.llv = wacom->led.max_llv * brightness / LED_FULL;
1072        led->hlv = wacom->led.hlv = wacom->led.max_hlv * brightness / LED_FULL;
1073
1074        wacom->led.groups[led->group].select = led->id;
1075
1076        error = wacom_led_control(wacom);
1077
1078out:
1079        mutex_unlock(&wacom->lock);
1080
1081        return error;
1082}
1083
1084static void wacom_led_readonly_brightness_set(struct led_classdev *cdev,
1085                                               enum led_brightness brightness)
1086{
1087}
1088
1089static int wacom_led_register_one(struct device *dev, struct wacom *wacom,
1090                                  struct wacom_led *led, unsigned int group,
1091                                  unsigned int id, bool read_only)
1092{
1093        int error;
1094        char *name;
1095
1096        name = devm_kasprintf(dev, GFP_KERNEL,
1097                              "%s::wacom-%d.%d",
1098                              dev_name(dev),
1099                              group,
1100                              id);
1101        if (!name)
1102                return -ENOMEM;
1103
1104        if (!read_only) {
1105                led->trigger.name = name;
1106                error = devm_led_trigger_register(dev, &led->trigger);
1107                if (error) {
1108                        hid_err(wacom->hdev,
1109                                "failed to register LED trigger %s: %d\n",
1110                                led->cdev.name, error);
1111                        return error;
1112                }
1113        }
1114
1115        led->group = group;
1116        led->id = id;
1117        led->wacom = wacom;
1118        led->llv = wacom->led.llv;
1119        led->hlv = wacom->led.hlv;
1120        led->cdev.name = name;
1121        led->cdev.max_brightness = LED_FULL;
1122        led->cdev.flags = LED_HW_PLUGGABLE;
1123        led->cdev.brightness_get = __wacom_led_brightness_get;
1124        if (!read_only) {
1125                led->cdev.brightness_set_blocking = wacom_led_brightness_set;
1126                led->cdev.default_trigger = led->cdev.name;
1127        } else {
1128                led->cdev.brightness_set = wacom_led_readonly_brightness_set;
1129        }
1130
1131        error = devm_led_classdev_register(dev, &led->cdev);
1132        if (error) {
1133                hid_err(wacom->hdev,
1134                        "failed to register LED %s: %d\n",
1135                        led->cdev.name, error);
1136                led->cdev.name = NULL;
1137                return error;
1138        }
1139
1140        return 0;
1141}
1142
1143static void wacom_led_groups_release_one(void *data)
1144{
1145        struct wacom_group_leds *group = data;
1146
1147        devres_release_group(group->dev, group);
1148}
1149
1150static int wacom_led_groups_alloc_and_register_one(struct device *dev,
1151                                                   struct wacom *wacom,
1152                                                   int group_id, int count,
1153                                                   bool read_only)
1154{
1155        struct wacom_led *leds;
1156        int i, error;
1157
1158        if (group_id >= wacom->led.count || count <= 0)
1159                return -EINVAL;
1160
1161        if (!devres_open_group(dev, &wacom->led.groups[group_id], GFP_KERNEL))
1162                return -ENOMEM;
1163
1164        leds = devm_kzalloc(dev, sizeof(struct wacom_led) * count, GFP_KERNEL);
1165        if (!leds) {
1166                error = -ENOMEM;
1167                goto err;
1168        }
1169
1170        wacom->led.groups[group_id].leds = leds;
1171        wacom->led.groups[group_id].count = count;
1172
1173        for (i = 0; i < count; i++) {
1174                error = wacom_led_register_one(dev, wacom, &leds[i],
1175                                               group_id, i, read_only);
1176                if (error)
1177                        goto err;
1178        }
1179
1180        wacom->led.groups[group_id].dev = dev;
1181
1182        devres_close_group(dev, &wacom->led.groups[group_id]);
1183
1184        /*
1185         * There is a bug (?) in devm_led_classdev_register() in which its
1186         * increments the refcount of the parent. If the parent is an input
1187         * device, that means the ref count never reaches 0 when
1188         * devm_input_device_release() gets called.
1189         * This means that the LEDs are still there after disconnect.
1190         * Manually force the release of the group so that the leds are released
1191         * once we are done using them.
1192         */
1193        error = devm_add_action_or_reset(&wacom->hdev->dev,
1194                                         wacom_led_groups_release_one,
1195                                         &wacom->led.groups[group_id]);
1196        if (error)
1197                return error;
1198
1199        return 0;
1200
1201err:
1202        devres_release_group(dev, &wacom->led.groups[group_id]);
1203        return error;
1204}
1205
1206struct wacom_led *wacom_led_find(struct wacom *wacom, unsigned int group_id,
1207                                 unsigned int id)
1208{
1209        struct wacom_group_leds *group;
1210
1211        if (group_id >= wacom->led.count)
1212                return NULL;
1213
1214        group = &wacom->led.groups[group_id];
1215
1216        if (!group->leds)
1217                return NULL;
1218
1219        id %= group->count;
1220
1221        return &group->leds[id];
1222}
1223
1224/**
1225 * wacom_led_next: gives the next available led with a wacom trigger.
1226 *
1227 * returns the next available struct wacom_led which has its default trigger
1228 * or the current one if none is available.
1229 */
1230struct wacom_led *wacom_led_next(struct wacom *wacom, struct wacom_led *cur)
1231{
1232        struct wacom_led *next_led;
1233        int group, next;
1234
1235        if (!wacom || !cur)
1236                return NULL;
1237
1238        group = cur->group;
1239        next = cur->id;
1240
1241        do {
1242                next_led = wacom_led_find(wacom, group, ++next);
1243                if (!next_led || next_led == cur)
1244                        return next_led;
1245        } while (next_led->cdev.trigger != &next_led->trigger);
1246
1247        return next_led;
1248}
1249
1250static void wacom_led_groups_release(void *data)
1251{
1252        struct wacom *wacom = data;
1253
1254        wacom->led.groups = NULL;
1255        wacom->led.count = 0;
1256}
1257
1258static int wacom_led_groups_allocate(struct wacom *wacom, int count)
1259{
1260        struct device *dev = &wacom->hdev->dev;
1261        struct wacom_group_leds *groups;
1262        int error;
1263
1264        groups = devm_kzalloc(dev, sizeof(struct wacom_group_leds) * count,
1265                              GFP_KERNEL);
1266        if (!groups)
1267                return -ENOMEM;
1268
1269        error = devm_add_action_or_reset(dev, wacom_led_groups_release, wacom);
1270        if (error)
1271                return error;
1272
1273        wacom->led.groups = groups;
1274        wacom->led.count = count;
1275
1276        return 0;
1277}
1278
1279static int wacom_leds_alloc_and_register(struct wacom *wacom, int group_count,
1280                                         int led_per_group, bool read_only)
1281{
1282        struct device *dev;
1283        int i, error;
1284
1285        if (!wacom->wacom_wac.pad_input)
1286                return -EINVAL;
1287
1288        dev = &wacom->wacom_wac.pad_input->dev;
1289
1290        error = wacom_led_groups_allocate(wacom, group_count);
1291        if (error)
1292                return error;
1293
1294        for (i = 0; i < group_count; i++) {
1295                error = wacom_led_groups_alloc_and_register_one(dev, wacom, i,
1296                                                                led_per_group,
1297                                                                read_only);
1298                if (error)
1299                        return error;
1300        }
1301
1302        return 0;
1303}
1304
1305static int wacom_initialize_leds(struct wacom *wacom)
1306{
1307        int error;
1308
1309        if (!(wacom->wacom_wac.features.device_type & WACOM_DEVICETYPE_PAD))
1310                return 0;
1311
1312        /* Initialize default values */
1313        switch (wacom->wacom_wac.features.type) {
1314        case INTUOS4S:
1315        case INTUOS4:
1316        case INTUOS4WL:
1317        case INTUOS4L:
1318                wacom->led.llv = 10;
1319                wacom->led.hlv = 20;
1320                wacom->led.max_llv = 127;
1321                wacom->led.max_hlv = 127;
1322                wacom->led.img_lum = 10;
1323
1324                error = wacom_leds_alloc_and_register(wacom, 1, 4, false);
1325                if (error) {
1326                        hid_err(wacom->hdev,
1327                                "cannot create leds err: %d\n", error);
1328                        return error;
1329                }
1330
1331                error = wacom_devm_sysfs_create_group(wacom,
1332                                                      &intuos4_led_attr_group);
1333                break;
1334
1335        case WACOM_24HD:
1336        case WACOM_21UX2:
1337                wacom->led.llv = 0;
1338                wacom->led.hlv = 0;
1339                wacom->led.img_lum = 0;
1340
1341                error = wacom_leds_alloc_and_register(wacom, 2, 4, false);
1342                if (error) {
1343                        hid_err(wacom->hdev,
1344                                "cannot create leds err: %d\n", error);
1345                        return error;
1346                }
1347
1348                error = wacom_devm_sysfs_create_group(wacom,
1349                                                      &cintiq_led_attr_group);
1350                break;
1351
1352        case INTUOS5S:
1353        case INTUOS5:
1354        case INTUOS5L:
1355        case INTUOSPS:
1356        case INTUOSPM:
1357        case INTUOSPL:
1358                wacom->led.llv = 32;
1359                wacom->led.max_llv = 96;
1360
1361                error = wacom_leds_alloc_and_register(wacom, 1, 4, false);
1362                if (error) {
1363                        hid_err(wacom->hdev,
1364                                "cannot create leds err: %d\n", error);
1365                        return error;
1366                }
1367
1368                error = wacom_devm_sysfs_create_group(wacom,
1369                                                      &intuos5_led_attr_group);
1370                break;
1371
1372        case REMOTE:
1373                wacom->led.llv = 255;
1374                wacom->led.max_llv = 255;
1375                error = wacom_led_groups_allocate(wacom, 5);
1376                if (error) {
1377                        hid_err(wacom->hdev,
1378                                "cannot create leds err: %d\n", error);
1379                        return error;
1380                }
1381                return 0;
1382
1383        default:
1384                return 0;
1385        }
1386
1387        if (error) {
1388                hid_err(wacom->hdev,
1389                        "cannot create sysfs group err: %d\n", error);
1390                return error;
1391        }
1392        wacom_led_control(wacom);
1393
1394        return 0;
1395}
1396
1397static enum power_supply_property wacom_battery_props[] = {
1398        POWER_SUPPLY_PROP_MODEL_NAME,
1399        POWER_SUPPLY_PROP_PRESENT,
1400        POWER_SUPPLY_PROP_STATUS,
1401        POWER_SUPPLY_PROP_SCOPE,
1402        POWER_SUPPLY_PROP_CAPACITY
1403};
1404
1405static int wacom_battery_get_property(struct power_supply *psy,
1406                                      enum power_supply_property psp,
1407                                      union power_supply_propval *val)
1408{
1409        struct wacom_battery *battery = power_supply_get_drvdata(psy);
1410        int ret = 0;
1411
1412        switch (psp) {
1413                case POWER_SUPPLY_PROP_MODEL_NAME:
1414                        val->strval = battery->wacom->wacom_wac.name;
1415                        break;
1416                case POWER_SUPPLY_PROP_PRESENT:
1417                        val->intval = battery->bat_connected;
1418                        break;
1419                case POWER_SUPPLY_PROP_SCOPE:
1420                        val->intval = POWER_SUPPLY_SCOPE_DEVICE;
1421                        break;
1422                case POWER_SUPPLY_PROP_CAPACITY:
1423                        val->intval = battery->battery_capacity;
1424                        break;
1425                case POWER_SUPPLY_PROP_STATUS:
1426                        if (battery->bat_charging)
1427                                val->intval = POWER_SUPPLY_STATUS_CHARGING;
1428                        else if (battery->battery_capacity == 100 &&
1429                                    battery->ps_connected)
1430                                val->intval = POWER_SUPPLY_STATUS_FULL;
1431                        else if (battery->ps_connected)
1432                                val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
1433                        else
1434                                val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
1435                        break;
1436                default:
1437                        ret = -EINVAL;
1438                        break;
1439        }
1440
1441        return ret;
1442}
1443
1444static int __wacom_initialize_battery(struct wacom *wacom,
1445                                      struct wacom_battery *battery)
1446{
1447        static atomic_t battery_no = ATOMIC_INIT(0);
1448        struct device *dev = &wacom->hdev->dev;
1449        struct power_supply_config psy_cfg = { .drv_data = battery, };
1450        struct power_supply *ps_bat;
1451        struct power_supply_desc *bat_desc = &battery->bat_desc;
1452        unsigned long n;
1453        int error;
1454
1455        if (!devres_open_group(dev, bat_desc, GFP_KERNEL))
1456                return -ENOMEM;
1457
1458        battery->wacom = wacom;
1459
1460        n = atomic_inc_return(&battery_no) - 1;
1461
1462        bat_desc->properties = wacom_battery_props;
1463        bat_desc->num_properties = ARRAY_SIZE(wacom_battery_props);
1464        bat_desc->get_property = wacom_battery_get_property;
1465        sprintf(battery->bat_name, "wacom_battery_%ld", n);
1466        bat_desc->name = battery->bat_name;
1467        bat_desc->type = POWER_SUPPLY_TYPE_USB;
1468        bat_desc->use_for_apm = 0;
1469
1470        ps_bat = devm_power_supply_register(dev, bat_desc, &psy_cfg);
1471        if (IS_ERR(ps_bat)) {
1472                error = PTR_ERR(ps_bat);
1473                goto err;
1474        }
1475
1476        power_supply_powers(ps_bat, &wacom->hdev->dev);
1477
1478        battery->battery = ps_bat;
1479
1480        devres_close_group(dev, bat_desc);
1481        return 0;
1482
1483err:
1484        devres_release_group(dev, bat_desc);
1485        return error;
1486}
1487
1488static int wacom_initialize_battery(struct wacom *wacom)
1489{
1490        if (wacom->wacom_wac.features.quirks & WACOM_QUIRK_BATTERY)
1491                return __wacom_initialize_battery(wacom, &wacom->battery);
1492
1493        return 0;
1494}
1495
1496static void wacom_destroy_battery(struct wacom *wacom)
1497{
1498        if (wacom->battery.battery) {
1499                devres_release_group(&wacom->hdev->dev,
1500                                     &wacom->battery.bat_desc);
1501                wacom->battery.battery = NULL;
1502        }
1503}
1504
1505static ssize_t wacom_show_speed(struct device *dev,
1506                                struct device_attribute
1507                                *attr, char *buf)
1508{
1509        struct hid_device *hdev = to_hid_device(dev);
1510        struct wacom *wacom = hid_get_drvdata(hdev);
1511
1512        return snprintf(buf, PAGE_SIZE, "%i\n", wacom->wacom_wac.bt_high_speed);
1513}
1514
1515static ssize_t wacom_store_speed(struct device *dev,
1516                                struct device_attribute *attr,
1517                                const char *buf, size_t count)
1518{
1519        struct hid_device *hdev = to_hid_device(dev);
1520        struct wacom *wacom = hid_get_drvdata(hdev);
1521        u8 new_speed;
1522
1523        if (kstrtou8(buf, 0, &new_speed))
1524                return -EINVAL;
1525
1526        if (new_speed != 0 && new_speed != 1)
1527                return -EINVAL;
1528
1529        wacom_bt_query_tablet_data(hdev, new_speed, &wacom->wacom_wac.features);
1530
1531        return count;
1532}
1533
1534static DEVICE_ATTR(speed, DEV_ATTR_RW_PERM,
1535                wacom_show_speed, wacom_store_speed);
1536
1537
1538static ssize_t wacom_show_remote_mode(struct kobject *kobj,
1539                                      struct kobj_attribute *kattr,
1540                                      char *buf, int index)
1541{
1542        struct device *dev = kobj_to_dev(kobj->parent);
1543        struct hid_device *hdev = to_hid_device(dev);
1544        struct wacom *wacom = hid_get_drvdata(hdev);
1545        u8 mode;
1546
1547        mode = wacom->led.groups[index].select;
1548        if (mode >= 0 && mode < 3)
1549                return snprintf(buf, PAGE_SIZE, "%d\n", mode);
1550        else
1551                return snprintf(buf, PAGE_SIZE, "%d\n", -1);
1552}
1553
1554#define DEVICE_EKR_ATTR_GROUP(SET_ID)                                   \
1555static ssize_t wacom_show_remote##SET_ID##_mode(struct kobject *kobj,   \
1556                               struct kobj_attribute *kattr, char *buf) \
1557{                                                                       \
1558        return wacom_show_remote_mode(kobj, kattr, buf, SET_ID);        \
1559}                                                                       \
1560static struct kobj_attribute remote##SET_ID##_mode_attr = {             \
1561        .attr = {.name = "remote_mode",                                 \
1562                .mode = DEV_ATTR_RO_PERM},                              \
1563        .show = wacom_show_remote##SET_ID##_mode,                       \
1564};                                                                      \
1565static struct attribute *remote##SET_ID##_serial_attrs[] = {            \
1566        &remote##SET_ID##_mode_attr.attr,                               \
1567        NULL                                                            \
1568};                                                                      \
1569static struct attribute_group remote##SET_ID##_serial_group = {         \
1570        .name = NULL,                                                   \
1571        .attrs = remote##SET_ID##_serial_attrs,                         \
1572}
1573
1574DEVICE_EKR_ATTR_GROUP(0);
1575DEVICE_EKR_ATTR_GROUP(1);
1576DEVICE_EKR_ATTR_GROUP(2);
1577DEVICE_EKR_ATTR_GROUP(3);
1578DEVICE_EKR_ATTR_GROUP(4);
1579
1580static int wacom_remote_create_attr_group(struct wacom *wacom, __u32 serial,
1581                                          int index)
1582{
1583        int error = 0;
1584        struct wacom_remote *remote = wacom->remote;
1585
1586        remote->remotes[index].group.name = devm_kasprintf(&wacom->hdev->dev,
1587                                                          GFP_KERNEL,
1588                                                          "%d", serial);
1589        if (!remote->remotes[index].group.name)
1590                return -ENOMEM;
1591
1592        error = __wacom_devm_sysfs_create_group(wacom, remote->remote_dir,
1593                                                &remote->remotes[index].group);
1594        if (error) {
1595                remote->remotes[index].group.name = NULL;
1596                hid_err(wacom->hdev,
1597                        "cannot create sysfs group err: %d\n", error);
1598                return error;
1599        }
1600
1601        return 0;
1602}
1603
1604static int wacom_cmd_unpair_remote(struct wacom *wacom, unsigned char selector)
1605{
1606        const size_t buf_size = 2;
1607        unsigned char *buf;
1608        int retval;
1609
1610        buf = kzalloc(buf_size, GFP_KERNEL);
1611        if (!buf)
1612                return -ENOMEM;
1613
1614        buf[0] = WAC_CMD_DELETE_PAIRING;
1615        buf[1] = selector;
1616
1617        retval = wacom_set_report(wacom->hdev, HID_OUTPUT_REPORT, buf,
1618                                  buf_size, WAC_CMD_RETRIES);
1619        kfree(buf);
1620
1621        return retval;
1622}
1623
1624static ssize_t wacom_store_unpair_remote(struct kobject *kobj,
1625                                         struct kobj_attribute *attr,
1626                                         const char *buf, size_t count)
1627{
1628        unsigned char selector = 0;
1629        struct device *dev = kobj_to_dev(kobj->parent);
1630        struct hid_device *hdev = to_hid_device(dev);
1631        struct wacom *wacom = hid_get_drvdata(hdev);
1632        int err;
1633
1634        if (!strncmp(buf, "*\n", 2)) {
1635                selector = WAC_CMD_UNPAIR_ALL;
1636        } else {
1637                hid_info(wacom->hdev, "remote: unrecognized unpair code: %s\n",
1638                         buf);
1639                return -1;
1640        }
1641
1642        mutex_lock(&wacom->lock);
1643
1644        err = wacom_cmd_unpair_remote(wacom, selector);
1645        mutex_unlock(&wacom->lock);
1646
1647        return err < 0 ? err : count;
1648}
1649
1650static struct kobj_attribute unpair_remote_attr = {
1651        .attr = {.name = "unpair_remote", .mode = 0200},
1652        .store = wacom_store_unpair_remote,
1653};
1654
1655static const struct attribute *remote_unpair_attrs[] = {
1656        &unpair_remote_attr.attr,
1657        NULL
1658};
1659
1660static void wacom_remotes_destroy(void *data)
1661{
1662        struct wacom *wacom = data;
1663        struct wacom_remote *remote = wacom->remote;
1664
1665        if (!remote)
1666                return;
1667
1668        kobject_put(remote->remote_dir);
1669        kfifo_free(&remote->remote_fifo);
1670        wacom->remote = NULL;
1671}
1672
1673static int wacom_initialize_remotes(struct wacom *wacom)
1674{
1675        int error = 0;
1676        struct wacom_remote *remote;
1677        int i;
1678
1679        if (wacom->wacom_wac.features.type != REMOTE)
1680                return 0;
1681
1682        remote = devm_kzalloc(&wacom->hdev->dev, sizeof(*wacom->remote),
1683                              GFP_KERNEL);
1684        if (!remote)
1685                return -ENOMEM;
1686
1687        wacom->remote = remote;
1688
1689        spin_lock_init(&remote->remote_lock);
1690
1691        error = kfifo_alloc(&remote->remote_fifo,
1692                        5 * sizeof(struct wacom_remote_data),
1693                        GFP_KERNEL);
1694        if (error) {
1695                hid_err(wacom->hdev, "failed allocating remote_fifo\n");
1696                return -ENOMEM;
1697        }
1698
1699        remote->remotes[0].group = remote0_serial_group;
1700        remote->remotes[1].group = remote1_serial_group;
1701        remote->remotes[2].group = remote2_serial_group;
1702        remote->remotes[3].group = remote3_serial_group;
1703        remote->remotes[4].group = remote4_serial_group;
1704
1705        remote->remote_dir = kobject_create_and_add("wacom_remote",
1706                                                    &wacom->hdev->dev.kobj);
1707        if (!remote->remote_dir)
1708                return -ENOMEM;
1709
1710        error = sysfs_create_files(remote->remote_dir, remote_unpair_attrs);
1711
1712        if (error) {
1713                hid_err(wacom->hdev,
1714                        "cannot create sysfs group err: %d\n", error);
1715                return error;
1716        }
1717
1718        for (i = 0; i < WACOM_MAX_REMOTES; i++) {
1719                wacom->led.groups[i].select = WACOM_STATUS_UNKNOWN;
1720                remote->remotes[i].serial = 0;
1721        }
1722
1723        error = devm_add_action_or_reset(&wacom->hdev->dev,
1724                                         wacom_remotes_destroy, wacom);
1725        if (error)
1726                return error;
1727
1728        return 0;
1729}
1730
1731static struct input_dev *wacom_allocate_input(struct wacom *wacom)
1732{
1733        struct input_dev *input_dev;
1734        struct hid_device *hdev = wacom->hdev;
1735        struct wacom_wac *wacom_wac = &(wacom->wacom_wac);
1736
1737        input_dev = devm_input_allocate_device(&hdev->dev);
1738        if (!input_dev)
1739                return NULL;
1740
1741        input_dev->name = wacom_wac->features.name;
1742        input_dev->phys = hdev->phys;
1743        input_dev->dev.parent = &hdev->dev;
1744        input_dev->open = wacom_open;
1745        input_dev->close = wacom_close;
1746        input_dev->uniq = hdev->uniq;
1747        input_dev->id.bustype = hdev->bus;
1748        input_dev->id.vendor  = hdev->vendor;
1749        input_dev->id.product = wacom_wac->pid ? wacom_wac->pid : hdev->product;
1750        input_dev->id.version = hdev->version;
1751        input_set_drvdata(input_dev, wacom);
1752
1753        return input_dev;
1754}
1755
1756static int wacom_allocate_inputs(struct wacom *wacom)
1757{
1758        struct wacom_wac *wacom_wac = &(wacom->wacom_wac);
1759
1760        wacom_wac->pen_input = wacom_allocate_input(wacom);
1761        wacom_wac->touch_input = wacom_allocate_input(wacom);
1762        wacom_wac->pad_input = wacom_allocate_input(wacom);
1763        if (!wacom_wac->pen_input ||
1764            !wacom_wac->touch_input ||
1765            !wacom_wac->pad_input)
1766                return -ENOMEM;
1767
1768        wacom_wac->pen_input->name = wacom_wac->pen_name;
1769        wacom_wac->touch_input->name = wacom_wac->touch_name;
1770        wacom_wac->pad_input->name = wacom_wac->pad_name;
1771
1772        return 0;
1773}
1774
1775static int wacom_register_inputs(struct wacom *wacom)
1776{
1777        struct input_dev *pen_input_dev, *touch_input_dev, *pad_input_dev;
1778        struct wacom_wac *wacom_wac = &(wacom->wacom_wac);
1779        int error = 0;
1780
1781        pen_input_dev = wacom_wac->pen_input;
1782        touch_input_dev = wacom_wac->touch_input;
1783        pad_input_dev = wacom_wac->pad_input;
1784
1785        if (!pen_input_dev || !touch_input_dev || !pad_input_dev)
1786                return -EINVAL;
1787
1788        error = wacom_setup_pen_input_capabilities(pen_input_dev, wacom_wac);
1789        if (error) {
1790                /* no pen in use on this interface */
1791                input_free_device(pen_input_dev);
1792                wacom_wac->pen_input = NULL;
1793                pen_input_dev = NULL;
1794        } else {
1795                error = input_register_device(pen_input_dev);
1796                if (error)
1797                        goto fail;
1798        }
1799
1800        error = wacom_setup_touch_input_capabilities(touch_input_dev, wacom_wac);
1801        if (error) {
1802                /* no touch in use on this interface */
1803                input_free_device(touch_input_dev);
1804                wacom_wac->touch_input = NULL;
1805                touch_input_dev = NULL;
1806        } else {
1807                error = input_register_device(touch_input_dev);
1808                if (error)
1809                        goto fail;
1810        }
1811
1812        error = wacom_setup_pad_input_capabilities(pad_input_dev, wacom_wac);
1813        if (error) {
1814                /* no pad in use on this interface */
1815                input_free_device(pad_input_dev);
1816                wacom_wac->pad_input = NULL;
1817                pad_input_dev = NULL;
1818        } else {
1819                error = input_register_device(pad_input_dev);
1820                if (error)
1821                        goto fail;
1822        }
1823
1824        return 0;
1825
1826fail:
1827        wacom_wac->pad_input = NULL;
1828        wacom_wac->touch_input = NULL;
1829        wacom_wac->pen_input = NULL;
1830        return error;
1831}
1832
1833/*
1834 * Not all devices report physical dimensions from HID.
1835 * Compute the default from hardcoded logical dimension
1836 * and resolution before driver overwrites them.
1837 */
1838static void wacom_set_default_phy(struct wacom_features *features)
1839{
1840        if (features->x_resolution) {
1841                features->x_phy = (features->x_max * 100) /
1842                                        features->x_resolution;
1843                features->y_phy = (features->y_max * 100) /
1844                                        features->y_resolution;
1845        }
1846}
1847
1848static void wacom_calculate_res(struct wacom_features *features)
1849{
1850        /* set unit to "100th of a mm" for devices not reported by HID */
1851        if (!features->unit) {
1852                features->unit = 0x11;
1853                features->unitExpo = -3;
1854        }
1855
1856        features->x_resolution = wacom_calc_hid_res(features->x_max,
1857                                                    features->x_phy,
1858                                                    features->unit,
1859                                                    features->unitExpo);
1860        features->y_resolution = wacom_calc_hid_res(features->y_max,
1861                                                    features->y_phy,
1862                                                    features->unit,
1863                                                    features->unitExpo);
1864}
1865
1866void wacom_battery_work(struct work_struct *work)
1867{
1868        struct wacom *wacom = container_of(work, struct wacom, battery_work);
1869
1870        if ((wacom->wacom_wac.features.quirks & WACOM_QUIRK_BATTERY) &&
1871             !wacom->battery.battery) {
1872                wacom_initialize_battery(wacom);
1873        }
1874        else if (!(wacom->wacom_wac.features.quirks & WACOM_QUIRK_BATTERY) &&
1875                 wacom->battery.battery) {
1876                wacom_destroy_battery(wacom);
1877        }
1878}
1879
1880static size_t wacom_compute_pktlen(struct hid_device *hdev)
1881{
1882        struct hid_report_enum *report_enum;
1883        struct hid_report *report;
1884        size_t size = 0;
1885
1886        report_enum = hdev->report_enum + HID_INPUT_REPORT;
1887
1888        list_for_each_entry(report, &report_enum->report_list, list) {
1889                size_t report_size = hid_report_len(report);
1890                if (report_size > size)
1891                        size = report_size;
1892        }
1893
1894        return size;
1895}
1896
1897static void wacom_update_name(struct wacom *wacom, const char *suffix)
1898{
1899        struct wacom_wac *wacom_wac = &wacom->wacom_wac;
1900        struct wacom_features *features = &wacom_wac->features;
1901        char name[WACOM_NAME_MAX];
1902
1903        /* Generic devices name unspecified */
1904        if ((features->type == HID_GENERIC) && !strcmp("Wacom HID", features->name)) {
1905                if (strstr(wacom->hdev->name, "Wacom") ||
1906                    strstr(wacom->hdev->name, "wacom") ||
1907                    strstr(wacom->hdev->name, "WACOM")) {
1908                        /* name is in HID descriptor, use it */
1909                        strlcpy(name, wacom->hdev->name, sizeof(name));
1910
1911                        /* strip out excess whitespaces */
1912                        while (1) {
1913                                char *gap = strstr(name, "  ");
1914                                if (gap == NULL)
1915                                        break;
1916                                /* shift everything including the terminator */
1917                                memmove(gap, gap+1, strlen(gap));
1918                        }
1919                        /* get rid of trailing whitespace */
1920                        if (name[strlen(name)-1] == ' ')
1921                                name[strlen(name)-1] = '\0';
1922                } else {
1923                        /* no meaningful name retrieved. use product ID */
1924                        snprintf(name, sizeof(name),
1925                                 "%s %X", features->name, wacom->hdev->product);
1926                }
1927        } else {
1928                strlcpy(name, features->name, sizeof(name));
1929        }
1930
1931        snprintf(wacom_wac->name, sizeof(wacom_wac->name), "%s%s",
1932                 name, suffix);
1933
1934        /* Append the device type to the name */
1935        snprintf(wacom_wac->pen_name, sizeof(wacom_wac->pen_name),
1936                "%s%s Pen", name, suffix);
1937        snprintf(wacom_wac->touch_name, sizeof(wacom_wac->touch_name),
1938                "%s%s Finger", name, suffix);
1939        snprintf(wacom_wac->pad_name, sizeof(wacom_wac->pad_name),
1940                "%s%s Pad", name, suffix);
1941}
1942
1943static void wacom_release_resources(struct wacom *wacom)
1944{
1945        struct hid_device *hdev = wacom->hdev;
1946
1947        if (!wacom->resources)
1948                return;
1949
1950        devres_release_group(&hdev->dev, wacom);
1951
1952        wacom->resources = false;
1953
1954        wacom->wacom_wac.pen_input = NULL;
1955        wacom->wacom_wac.touch_input = NULL;
1956        wacom->wacom_wac.pad_input = NULL;
1957}
1958
1959static int wacom_parse_and_register(struct wacom *wacom, bool wireless)
1960{
1961        struct wacom_wac *wacom_wac = &wacom->wacom_wac;
1962        struct wacom_features *features = &wacom_wac->features;
1963        struct hid_device *hdev = wacom->hdev;
1964        int error;
1965        unsigned int connect_mask = HID_CONNECT_HIDRAW;
1966
1967        features->pktlen = wacom_compute_pktlen(hdev);
1968        if (features->pktlen > WACOM_PKGLEN_MAX)
1969                return -EINVAL;
1970
1971        if (!devres_open_group(&hdev->dev, wacom, GFP_KERNEL))
1972                return -ENOMEM;
1973
1974        wacom->resources = true;
1975
1976        error = wacom_allocate_inputs(wacom);
1977        if (error)
1978                goto fail;
1979
1980        /*
1981         * Bamboo Pad has a generic hid handling for the Pen, and we switch it
1982         * into debug mode for the touch part.
1983         * We ignore the other interfaces.
1984         */
1985        if (features->type == BAMBOO_PAD) {
1986                if (features->pktlen == WACOM_PKGLEN_PENABLED) {
1987                        features->type = HID_GENERIC;
1988                } else if ((features->pktlen != WACOM_PKGLEN_BPAD_TOUCH) &&
1989                           (features->pktlen != WACOM_PKGLEN_BPAD_TOUCH_USB)) {
1990                        error = -ENODEV;
1991                        goto fail;
1992                }
1993        }
1994
1995        /* set the default size in case we do not get them from hid */
1996        wacom_set_default_phy(features);
1997
1998        /* Retrieve the physical and logical size for touch devices */
1999        wacom_retrieve_hid_descriptor(hdev, features);
2000        wacom_setup_device_quirks(wacom);
2001
2002        if (features->device_type == WACOM_DEVICETYPE_NONE &&
2003            features->type != WIRELESS) {
2004                error = features->type == HID_GENERIC ? -ENODEV : 0;
2005
2006                dev_warn(&hdev->dev, "Unknown device_type for '%s'. %s.",
2007                         hdev->name,
2008                         error ? "Ignoring" : "Assuming pen");
2009
2010                if (error)
2011                        goto fail;
2012
2013                features->device_type |= WACOM_DEVICETYPE_PEN;
2014        }
2015
2016        wacom_calculate_res(features);
2017
2018        wacom_update_name(wacom, wireless ? " (WL)" : "");
2019
2020        error = wacom_add_shared_data(hdev);
2021        if (error)
2022                goto fail;
2023
2024        if (!(features->device_type & WACOM_DEVICETYPE_WL_MONITOR) &&
2025             (features->quirks & WACOM_QUIRK_BATTERY)) {
2026                error = wacom_initialize_battery(wacom);
2027                if (error)
2028                        goto fail;
2029        }
2030
2031        error = wacom_register_inputs(wacom);
2032        if (error)
2033                goto fail;
2034
2035        if (wacom->wacom_wac.features.device_type & WACOM_DEVICETYPE_PAD) {
2036                error = wacom_initialize_leds(wacom);
2037                if (error)
2038                        goto fail;
2039
2040                error = wacom_initialize_remotes(wacom);
2041                if (error)
2042                        goto fail;
2043        }
2044
2045        if (features->type == HID_GENERIC)
2046                connect_mask |= HID_CONNECT_DRIVER;
2047
2048        /* Regular HID work starts now */
2049        error = hid_hw_start(hdev, connect_mask);
2050        if (error) {
2051                hid_err(hdev, "hw start failed\n");
2052                goto fail;
2053        }
2054
2055        if (!wireless) {
2056                /* Note that if query fails it is not a hard failure */
2057                wacom_query_tablet_data(hdev, features);
2058        }
2059
2060        /* touch only Bamboo doesn't support pen */
2061        if ((features->type == BAMBOO_TOUCH) &&
2062            (features->device_type & WACOM_DEVICETYPE_PEN)) {
2063                error = -ENODEV;
2064                goto fail_quirks;
2065        }
2066
2067        /* pen only Bamboo neither support touch nor pad */
2068        if ((features->type == BAMBOO_PEN) &&
2069            ((features->device_type & WACOM_DEVICETYPE_TOUCH) ||
2070            (features->device_type & WACOM_DEVICETYPE_PAD))) {
2071                error = -ENODEV;
2072                goto fail_quirks;
2073        }
2074
2075        if (features->device_type & WACOM_DEVICETYPE_WL_MONITOR)
2076                error = hid_hw_open(hdev);
2077
2078        if ((wacom_wac->features.type == INTUOSHT ||
2079             wacom_wac->features.type == INTUOSHT2) &&
2080            (wacom_wac->features.device_type & WACOM_DEVICETYPE_TOUCH)) {
2081                wacom_wac->shared->type = wacom_wac->features.type;
2082                wacom_wac->shared->touch_input = wacom_wac->touch_input;
2083        }
2084
2085        devres_close_group(&hdev->dev, wacom);
2086
2087        return 0;
2088
2089fail_quirks:
2090        hid_hw_stop(hdev);
2091fail:
2092        wacom_release_resources(wacom);
2093        return error;
2094}
2095
2096static void wacom_wireless_work(struct work_struct *work)
2097{
2098        struct wacom *wacom = container_of(work, struct wacom, wireless_work);
2099        struct usb_device *usbdev = wacom->usbdev;
2100        struct wacom_wac *wacom_wac = &wacom->wacom_wac;
2101        struct hid_device *hdev1, *hdev2;
2102        struct wacom *wacom1, *wacom2;
2103        struct wacom_wac *wacom_wac1, *wacom_wac2;
2104        int error;
2105
2106        /*
2107         * Regardless if this is a disconnect or a new tablet,
2108         * remove any existing input and battery devices.
2109         */
2110
2111        wacom_destroy_battery(wacom);
2112
2113        /* Stylus interface */
2114        hdev1 = usb_get_intfdata(usbdev->config->interface[1]);
2115        wacom1 = hid_get_drvdata(hdev1);
2116        wacom_wac1 = &(wacom1->wacom_wac);
2117        wacom_release_resources(wacom1);
2118
2119        /* Touch interface */
2120        hdev2 = usb_get_intfdata(usbdev->config->interface[2]);
2121        wacom2 = hid_get_drvdata(hdev2);
2122        wacom_wac2 = &(wacom2->wacom_wac);
2123        wacom_release_resources(wacom2);
2124
2125        if (wacom_wac->pid == 0) {
2126                hid_info(wacom->hdev, "wireless tablet disconnected\n");
2127        } else {
2128                const struct hid_device_id *id = wacom_ids;
2129
2130                hid_info(wacom->hdev, "wireless tablet connected with PID %x\n",
2131                         wacom_wac->pid);
2132
2133                while (id->bus) {
2134                        if (id->vendor == USB_VENDOR_ID_WACOM &&
2135                            id->product == wacom_wac->pid)
2136                                break;
2137                        id++;
2138                }
2139
2140                if (!id->bus) {
2141                        hid_info(wacom->hdev, "ignoring unknown PID.\n");
2142                        return;
2143                }
2144
2145                /* Stylus interface */
2146                wacom_wac1->features =
2147                        *((struct wacom_features *)id->driver_data);
2148
2149                wacom_wac1->pid = wacom_wac->pid;
2150                hid_hw_stop(hdev1);
2151                error = wacom_parse_and_register(wacom1, true);
2152                if (error)
2153                        goto fail;
2154
2155                /* Touch interface */
2156                if (wacom_wac1->features.touch_max ||
2157                    (wacom_wac1->features.type >= INTUOSHT &&
2158                    wacom_wac1->features.type <= BAMBOO_PT)) {
2159                        wacom_wac2->features =
2160                                *((struct wacom_features *)id->driver_data);
2161                        wacom_wac2->pid = wacom_wac->pid;
2162                        hid_hw_stop(hdev2);
2163                        error = wacom_parse_and_register(wacom2, true);
2164                        if (error)
2165                                goto fail;
2166                }
2167
2168                strlcpy(wacom_wac->name, wacom_wac1->name,
2169                        sizeof(wacom_wac->name));
2170                error = wacom_initialize_battery(wacom);
2171                if (error)
2172                        goto fail;
2173        }
2174
2175        return;
2176
2177fail:
2178        wacom_release_resources(wacom1);
2179        wacom_release_resources(wacom2);
2180        return;
2181}
2182
2183static void wacom_remote_destroy_one(struct wacom *wacom, unsigned int index)
2184{
2185        struct wacom_remote *remote = wacom->remote;
2186        u32 serial = remote->remotes[index].serial;
2187        int i;
2188        unsigned long flags;
2189
2190        spin_lock_irqsave(&remote->remote_lock, flags);
2191        remote->remotes[index].registered = false;
2192        spin_unlock_irqrestore(&remote->remote_lock, flags);
2193
2194        if (remote->remotes[index].battery.battery)
2195                devres_release_group(&wacom->hdev->dev,
2196                                     &remote->remotes[index].battery.bat_desc);
2197
2198        if (remote->remotes[index].group.name)
2199                devres_release_group(&wacom->hdev->dev,
2200                                     &remote->remotes[index]);
2201
2202        for (i = 0; i < WACOM_MAX_REMOTES; i++) {
2203                if (remote->remotes[i].serial == serial) {
2204                        remote->remotes[i].serial = 0;
2205                        remote->remotes[i].group.name = NULL;
2206                        remote->remotes[i].registered = false;
2207                        remote->remotes[i].battery.battery = NULL;
2208                        wacom->led.groups[i].select = WACOM_STATUS_UNKNOWN;
2209                }
2210        }
2211}
2212
2213static int wacom_remote_create_one(struct wacom *wacom, u32 serial,
2214                                   unsigned int index)
2215{
2216        struct wacom_remote *remote = wacom->remote;
2217        struct device *dev = &wacom->hdev->dev;
2218        int error, k;
2219
2220        /* A remote can pair more than once with an EKR,
2221         * check to make sure this serial isn't already paired.
2222         */
2223        for (k = 0; k < WACOM_MAX_REMOTES; k++) {
2224                if (remote->remotes[k].serial == serial)
2225                        break;
2226        }
2227
2228        if (k < WACOM_MAX_REMOTES) {
2229                remote->remotes[index].serial = serial;
2230                return 0;
2231        }
2232
2233        if (!devres_open_group(dev, &remote->remotes[index], GFP_KERNEL))
2234                return -ENOMEM;
2235
2236        error = wacom_remote_create_attr_group(wacom, serial, index);
2237        if (error)
2238                goto fail;
2239
2240        remote->remotes[index].input = wacom_allocate_input(wacom);
2241        if (!remote->remotes[index].input) {
2242                error = -ENOMEM;
2243                goto fail;
2244        }
2245        remote->remotes[index].input->uniq = remote->remotes[index].group.name;
2246        remote->remotes[index].input->name = wacom->wacom_wac.pad_name;
2247
2248        if (!remote->remotes[index].input->name) {
2249                error = -EINVAL;
2250                goto fail;
2251        }
2252
2253        error = wacom_setup_pad_input_capabilities(remote->remotes[index].input,
2254                                                   &wacom->wacom_wac);
2255        if (error)
2256                goto fail;
2257
2258        remote->remotes[index].serial = serial;
2259
2260        error = input_register_device(remote->remotes[index].input);
2261        if (error)
2262                goto fail;
2263
2264        error = wacom_led_groups_alloc_and_register_one(
2265                                        &remote->remotes[index].input->dev,
2266                                        wacom, index, 3, true);
2267        if (error)
2268                goto fail;
2269
2270        remote->remotes[index].registered = true;
2271
2272        devres_close_group(dev, &remote->remotes[index]);
2273        return 0;
2274
2275fail:
2276        devres_release_group(dev, &remote->remotes[index]);
2277        remote->remotes[index].serial = 0;
2278        return error;
2279}
2280
2281static int wacom_remote_attach_battery(struct wacom *wacom, int index)
2282{
2283        struct wacom_remote *remote = wacom->remote;
2284        int error;
2285
2286        if (!remote->remotes[index].registered)
2287                return 0;
2288
2289        if (remote->remotes[index].battery.battery)
2290                return 0;
2291
2292        if (wacom->led.groups[index].select == WACOM_STATUS_UNKNOWN)
2293                return 0;
2294
2295        error = __wacom_initialize_battery(wacom,
2296                                        &wacom->remote->remotes[index].battery);
2297        if (error)
2298                return error;
2299
2300        return 0;
2301}
2302
2303static void wacom_remote_work(struct work_struct *work)
2304{
2305        struct wacom *wacom = container_of(work, struct wacom, remote_work);
2306        struct wacom_remote *remote = wacom->remote;
2307        struct wacom_remote_data data;
2308        unsigned long flags;
2309        unsigned int count;
2310        u32 serial;
2311        int i;
2312
2313        spin_lock_irqsave(&remote->remote_lock, flags);
2314
2315        count = kfifo_out(&remote->remote_fifo, &data, sizeof(data));
2316
2317        if (count != sizeof(data)) {
2318                hid_err(wacom->hdev,
2319                        "workitem triggered without status available\n");
2320                spin_unlock_irqrestore(&remote->remote_lock, flags);
2321                return;
2322        }
2323
2324        if (!kfifo_is_empty(&remote->remote_fifo))
2325                wacom_schedule_work(&wacom->wacom_wac, WACOM_WORKER_REMOTE);
2326
2327        spin_unlock_irqrestore(&remote->remote_lock, flags);
2328
2329        for (i = 0; i < WACOM_MAX_REMOTES; i++) {
2330                serial = data.remote[i].serial;
2331                if (data.remote[i].connected) {
2332
2333                        if (remote->remotes[i].serial == serial) {
2334                                wacom_remote_attach_battery(wacom, i);
2335                                continue;
2336                        }
2337
2338                        if (remote->remotes[i].serial)
2339                                wacom_remote_destroy_one(wacom, i);
2340
2341                        wacom_remote_create_one(wacom, serial, i);
2342
2343                } else if (remote->remotes[i].serial) {
2344                        wacom_remote_destroy_one(wacom, i);
2345                }
2346        }
2347}
2348
2349static int wacom_probe(struct hid_device *hdev,
2350                const struct hid_device_id *id)
2351{
2352        struct usb_interface *intf = to_usb_interface(hdev->dev.parent);
2353        struct usb_device *dev = interface_to_usbdev(intf);
2354        struct wacom *wacom;
2355        struct wacom_wac *wacom_wac;
2356        struct wacom_features *features;
2357        int error;
2358
2359        if (!id->driver_data)
2360                return -EINVAL;
2361
2362        hdev->quirks |= HID_QUIRK_NO_INIT_REPORTS;
2363
2364        /* hid-core sets this quirk for the boot interface */
2365        hdev->quirks &= ~HID_QUIRK_NOGET;
2366
2367        wacom = devm_kzalloc(&hdev->dev, sizeof(struct wacom), GFP_KERNEL);
2368        if (!wacom)
2369                return -ENOMEM;
2370
2371        hid_set_drvdata(hdev, wacom);
2372        wacom->hdev = hdev;
2373
2374        wacom_wac = &wacom->wacom_wac;
2375        wacom_wac->features = *((struct wacom_features *)id->driver_data);
2376        features = &wacom_wac->features;
2377
2378        if (features->check_for_hid_type && features->hid_type != hdev->type) {
2379                error = -ENODEV;
2380                goto fail;
2381        }
2382
2383        wacom_wac->hid_data.inputmode = -1;
2384        wacom_wac->mode_report = -1;
2385
2386        wacom->usbdev = dev;
2387        wacom->intf = intf;
2388        mutex_init(&wacom->lock);
2389        INIT_WORK(&wacom->wireless_work, wacom_wireless_work);
2390        INIT_WORK(&wacom->battery_work, wacom_battery_work);
2391        INIT_WORK(&wacom->remote_work, wacom_remote_work);
2392
2393        /* ask for the report descriptor to be loaded by HID */
2394        error = hid_parse(hdev);
2395        if (error) {
2396                hid_err(hdev, "parse failed\n");
2397                goto fail;
2398        }
2399
2400        error = wacom_parse_and_register(wacom, false);
2401        if (error)
2402                goto fail;
2403
2404        if (hdev->bus == BUS_BLUETOOTH) {
2405                error = device_create_file(&hdev->dev, &dev_attr_speed);
2406                if (error)
2407                        hid_warn(hdev,
2408                                 "can't create sysfs speed attribute err: %d\n",
2409                                 error);
2410        }
2411
2412        return 0;
2413
2414fail:
2415        hid_set_drvdata(hdev, NULL);
2416        return error;
2417}
2418
2419static void wacom_remove(struct hid_device *hdev)
2420{
2421        struct wacom *wacom = hid_get_drvdata(hdev);
2422        struct wacom_wac *wacom_wac = &wacom->wacom_wac;
2423        struct wacom_features *features = &wacom_wac->features;
2424
2425        if (features->device_type & WACOM_DEVICETYPE_WL_MONITOR)
2426                hid_hw_close(hdev);
2427
2428        hid_hw_stop(hdev);
2429
2430        cancel_work_sync(&wacom->wireless_work);
2431        cancel_work_sync(&wacom->battery_work);
2432        cancel_work_sync(&wacom->remote_work);
2433        if (hdev->bus == BUS_BLUETOOTH)
2434                device_remove_file(&hdev->dev, &dev_attr_speed);
2435
2436        hid_set_drvdata(hdev, NULL);
2437}
2438
2439#ifdef CONFIG_PM
2440static int wacom_resume(struct hid_device *hdev)
2441{
2442        struct wacom *wacom = hid_get_drvdata(hdev);
2443        struct wacom_features *features = &wacom->wacom_wac.features;
2444
2445        mutex_lock(&wacom->lock);
2446
2447        /* switch to wacom mode first */
2448        wacom_query_tablet_data(hdev, features);
2449        wacom_led_control(wacom);
2450
2451        mutex_unlock(&wacom->lock);
2452
2453        return 0;
2454}
2455
2456static int wacom_reset_resume(struct hid_device *hdev)
2457{
2458        return wacom_resume(hdev);
2459}
2460#endif /* CONFIG_PM */
2461
2462static struct hid_driver wacom_driver = {
2463        .name =         "wacom",
2464        .id_table =     wacom_ids,
2465        .probe =        wacom_probe,
2466        .remove =       wacom_remove,
2467        .report =       wacom_wac_report,
2468#ifdef CONFIG_PM
2469        .resume =       wacom_resume,
2470        .reset_resume = wacom_reset_resume,
2471#endif
2472        .raw_event =    wacom_raw_event,
2473};
2474module_hid_driver(wacom_driver);
2475
2476MODULE_VERSION(DRIVER_VERSION);
2477MODULE_AUTHOR(DRIVER_AUTHOR);
2478MODULE_DESCRIPTION(DRIVER_DESC);
2479MODULE_LICENSE(DRIVER_LICENSE);
2480