linux/drivers/hid/i2c-hid/i2c-hid.c
<<
>>
Prefs
   1/*
   2 * HID over I2C protocol implementation
   3 *
   4 * Copyright (c) 2012 Benjamin Tissoires <benjamin.tissoires@gmail.com>
   5 * Copyright (c) 2012 Ecole Nationale de l'Aviation Civile, France
   6 * Copyright (c) 2012 Red Hat, Inc
   7 *
   8 * This code is partly based on "USB HID support for Linux":
   9 *
  10 *  Copyright (c) 1999 Andreas Gal
  11 *  Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
  12 *  Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
  13 *  Copyright (c) 2007-2008 Oliver Neukum
  14 *  Copyright (c) 2006-2010 Jiri Kosina
  15 *
  16 * This file is subject to the terms and conditions of the GNU General Public
  17 * License.  See the file COPYING in the main directory of this archive for
  18 * more details.
  19 */
  20
  21#include <linux/module.h>
  22#include <linux/i2c.h>
  23#include <linux/interrupt.h>
  24#include <linux/input.h>
  25#include <linux/delay.h>
  26#include <linux/slab.h>
  27#include <linux/pm.h>
  28#include <linux/device.h>
  29#include <linux/wait.h>
  30#include <linux/err.h>
  31#include <linux/string.h>
  32#include <linux/list.h>
  33#include <linux/jiffies.h>
  34#include <linux/kernel.h>
  35#include <linux/hid.h>
  36#include <linux/mutex.h>
  37#include <linux/acpi.h>
  38
  39#include <linux/i2c/i2c-hid.h>
  40
  41/* flags */
  42#define I2C_HID_STARTED         (1 << 0)
  43#define I2C_HID_RESET_PENDING   (1 << 1)
  44#define I2C_HID_READ_PENDING    (1 << 2)
  45
  46#define I2C_HID_PWR_ON          0x00
  47#define I2C_HID_PWR_SLEEP       0x01
  48
  49/* debug option */
  50static bool debug;
  51module_param(debug, bool, 0444);
  52MODULE_PARM_DESC(debug, "print a lot of debug information");
  53
  54#define i2c_hid_dbg(ihid, fmt, arg...)                                    \
  55do {                                                                      \
  56        if (debug)                                                        \
  57                dev_printk(KERN_DEBUG, &(ihid)->client->dev, fmt, ##arg); \
  58} while (0)
  59
  60struct i2c_hid_desc {
  61        __le16 wHIDDescLength;
  62        __le16 bcdVersion;
  63        __le16 wReportDescLength;
  64        __le16 wReportDescRegister;
  65        __le16 wInputRegister;
  66        __le16 wMaxInputLength;
  67        __le16 wOutputRegister;
  68        __le16 wMaxOutputLength;
  69        __le16 wCommandRegister;
  70        __le16 wDataRegister;
  71        __le16 wVendorID;
  72        __le16 wProductID;
  73        __le16 wVersionID;
  74        __le32 reserved;
  75} __packed;
  76
  77struct i2c_hid_cmd {
  78        unsigned int registerIndex;
  79        __u8 opcode;
  80        unsigned int length;
  81        bool wait;
  82};
  83
  84union command {
  85        u8 data[0];
  86        struct cmd {
  87                __le16 reg;
  88                __u8 reportTypeID;
  89                __u8 opcode;
  90        } __packed c;
  91};
  92
  93#define I2C_HID_CMD(opcode_) \
  94        .opcode = opcode_, .length = 4, \
  95        .registerIndex = offsetof(struct i2c_hid_desc, wCommandRegister)
  96
  97/* fetch HID descriptor */
  98static const struct i2c_hid_cmd hid_descr_cmd = { .length = 2 };
  99/* fetch report descriptors */
 100static const struct i2c_hid_cmd hid_report_descr_cmd = {
 101                .registerIndex = offsetof(struct i2c_hid_desc,
 102                        wReportDescRegister),
 103                .opcode = 0x00,
 104                .length = 2 };
 105/* commands */
 106static const struct i2c_hid_cmd hid_reset_cmd =         { I2C_HID_CMD(0x01),
 107                                                          .wait = true };
 108static const struct i2c_hid_cmd hid_get_report_cmd =    { I2C_HID_CMD(0x02) };
 109static const struct i2c_hid_cmd hid_set_report_cmd =    { I2C_HID_CMD(0x03) };
 110static const struct i2c_hid_cmd hid_set_power_cmd =     { I2C_HID_CMD(0x08) };
 111
 112/*
 113 * These definitions are not used here, but are defined by the spec.
 114 * Keeping them here for documentation purposes.
 115 *
 116 * static const struct i2c_hid_cmd hid_get_idle_cmd = { I2C_HID_CMD(0x04) };
 117 * static const struct i2c_hid_cmd hid_set_idle_cmd = { I2C_HID_CMD(0x05) };
 118 * static const struct i2c_hid_cmd hid_get_protocol_cmd = { I2C_HID_CMD(0x06) };
 119 * static const struct i2c_hid_cmd hid_set_protocol_cmd = { I2C_HID_CMD(0x07) };
 120 */
 121
 122static DEFINE_MUTEX(i2c_hid_open_mut);
 123
 124/* The main device structure */
 125struct i2c_hid {
 126        struct i2c_client       *client;        /* i2c client */
 127        struct hid_device       *hid;   /* pointer to corresponding HID dev */
 128        union {
 129                __u8 hdesc_buffer[sizeof(struct i2c_hid_desc)];
 130                struct i2c_hid_desc hdesc;      /* the HID Descriptor */
 131        };
 132        __le16                  wHIDDescRegister; /* location of the i2c
 133                                                   * register of the HID
 134                                                   * descriptor. */
 135        unsigned int            bufsize;        /* i2c buffer size */
 136        char                    *inbuf;         /* Input buffer */
 137        char                    *cmdbuf;        /* Command buffer */
 138        char                    *argsbuf;       /* Command arguments buffer */
 139
 140        unsigned long           flags;          /* device flags */
 141
 142        wait_queue_head_t       wait;           /* For waiting the interrupt */
 143
 144        struct i2c_hid_platform_data pdata;
 145};
 146
 147static int __i2c_hid_command(struct i2c_client *client,
 148                const struct i2c_hid_cmd *command, u8 reportID,
 149                u8 reportType, u8 *args, int args_len,
 150                unsigned char *buf_recv, int data_len)
 151{
 152        struct i2c_hid *ihid = i2c_get_clientdata(client);
 153        union command *cmd = (union command *)ihid->cmdbuf;
 154        int ret;
 155        struct i2c_msg msg[2];
 156        int msg_num = 1;
 157
 158        int length = command->length;
 159        bool wait = command->wait;
 160        unsigned int registerIndex = command->registerIndex;
 161
 162        /* special case for hid_descr_cmd */
 163        if (command == &hid_descr_cmd) {
 164                cmd->c.reg = ihid->wHIDDescRegister;
 165        } else {
 166                cmd->data[0] = ihid->hdesc_buffer[registerIndex];
 167                cmd->data[1] = ihid->hdesc_buffer[registerIndex + 1];
 168        }
 169
 170        if (length > 2) {
 171                cmd->c.opcode = command->opcode;
 172                cmd->c.reportTypeID = reportID | reportType << 4;
 173        }
 174
 175        memcpy(cmd->data + length, args, args_len);
 176        length += args_len;
 177
 178        i2c_hid_dbg(ihid, "%s: cmd=%*ph\n", __func__, length, cmd->data);
 179
 180        msg[0].addr = client->addr;
 181        msg[0].flags = client->flags & I2C_M_TEN;
 182        msg[0].len = length;
 183        msg[0].buf = cmd->data;
 184        if (data_len > 0) {
 185                msg[1].addr = client->addr;
 186                msg[1].flags = client->flags & I2C_M_TEN;
 187                msg[1].flags |= I2C_M_RD;
 188                msg[1].len = data_len;
 189                msg[1].buf = buf_recv;
 190                msg_num = 2;
 191                set_bit(I2C_HID_READ_PENDING, &ihid->flags);
 192        }
 193
 194        if (wait)
 195                set_bit(I2C_HID_RESET_PENDING, &ihid->flags);
 196
 197        ret = i2c_transfer(client->adapter, msg, msg_num);
 198
 199        if (data_len > 0)
 200                clear_bit(I2C_HID_READ_PENDING, &ihid->flags);
 201
 202        if (ret != msg_num)
 203                return ret < 0 ? ret : -EIO;
 204
 205        ret = 0;
 206
 207        if (wait) {
 208                i2c_hid_dbg(ihid, "%s: waiting...\n", __func__);
 209                if (!wait_event_timeout(ihid->wait,
 210                                !test_bit(I2C_HID_RESET_PENDING, &ihid->flags),
 211                                msecs_to_jiffies(5000)))
 212                        ret = -ENODATA;
 213                i2c_hid_dbg(ihid, "%s: finished.\n", __func__);
 214        }
 215
 216        return ret;
 217}
 218
 219static int i2c_hid_command(struct i2c_client *client,
 220                const struct i2c_hid_cmd *command,
 221                unsigned char *buf_recv, int data_len)
 222{
 223        return __i2c_hid_command(client, command, 0, 0, NULL, 0,
 224                                buf_recv, data_len);
 225}
 226
 227static int i2c_hid_get_report(struct i2c_client *client, u8 reportType,
 228                u8 reportID, unsigned char *buf_recv, int data_len)
 229{
 230        struct i2c_hid *ihid = i2c_get_clientdata(client);
 231        u8 args[3];
 232        int ret;
 233        int args_len = 0;
 234        u16 readRegister = le16_to_cpu(ihid->hdesc.wDataRegister);
 235
 236        i2c_hid_dbg(ihid, "%s\n", __func__);
 237
 238        if (reportID >= 0x0F) {
 239                args[args_len++] = reportID;
 240                reportID = 0x0F;
 241        }
 242
 243        args[args_len++] = readRegister & 0xFF;
 244        args[args_len++] = readRegister >> 8;
 245
 246        ret = __i2c_hid_command(client, &hid_get_report_cmd, reportID,
 247                reportType, args, args_len, buf_recv, data_len);
 248        if (ret) {
 249                dev_err(&client->dev,
 250                        "failed to retrieve report from device.\n");
 251                return ret;
 252        }
 253
 254        return 0;
 255}
 256
 257static int i2c_hid_set_report(struct i2c_client *client, u8 reportType,
 258                u8 reportID, unsigned char *buf, size_t data_len)
 259{
 260        struct i2c_hid *ihid = i2c_get_clientdata(client);
 261        u8 *args = ihid->argsbuf;
 262        int ret;
 263        u16 dataRegister = le16_to_cpu(ihid->hdesc.wDataRegister);
 264
 265        /* hidraw already checked that data_len < HID_MAX_BUFFER_SIZE */
 266        u16 size =      2                       /* size */ +
 267                        (reportID ? 1 : 0)      /* reportID */ +
 268                        data_len                /* buf */;
 269        int args_len =  (reportID >= 0x0F ? 1 : 0) /* optional third byte */ +
 270                        2                       /* dataRegister */ +
 271                        size                    /* args */;
 272        int index = 0;
 273
 274        i2c_hid_dbg(ihid, "%s\n", __func__);
 275
 276        if (reportID >= 0x0F) {
 277                args[index++] = reportID;
 278                reportID = 0x0F;
 279        }
 280
 281        args[index++] = dataRegister & 0xFF;
 282        args[index++] = dataRegister >> 8;
 283
 284        args[index++] = size & 0xFF;
 285        args[index++] = size >> 8;
 286
 287        if (reportID)
 288                args[index++] = reportID;
 289
 290        memcpy(&args[index], buf, data_len);
 291
 292        ret = __i2c_hid_command(client, &hid_set_report_cmd, reportID,
 293                reportType, args, args_len, NULL, 0);
 294        if (ret) {
 295                dev_err(&client->dev, "failed to set a report to device.\n");
 296                return ret;
 297        }
 298
 299        return data_len;
 300}
 301
 302static int i2c_hid_set_power(struct i2c_client *client, int power_state)
 303{
 304        struct i2c_hid *ihid = i2c_get_clientdata(client);
 305        int ret;
 306
 307        i2c_hid_dbg(ihid, "%s\n", __func__);
 308
 309        ret = __i2c_hid_command(client, &hid_set_power_cmd, power_state,
 310                0, NULL, 0, NULL, 0);
 311        if (ret)
 312                dev_err(&client->dev, "failed to change power setting.\n");
 313
 314        return ret;
 315}
 316
 317static int i2c_hid_hwreset(struct i2c_client *client)
 318{
 319        struct i2c_hid *ihid = i2c_get_clientdata(client);
 320        int ret;
 321
 322        i2c_hid_dbg(ihid, "%s\n", __func__);
 323
 324        ret = i2c_hid_set_power(client, I2C_HID_PWR_ON);
 325        if (ret)
 326                return ret;
 327
 328        i2c_hid_dbg(ihid, "resetting...\n");
 329
 330        ret = i2c_hid_command(client, &hid_reset_cmd, NULL, 0);
 331        if (ret) {
 332                dev_err(&client->dev, "failed to reset device.\n");
 333                i2c_hid_set_power(client, I2C_HID_PWR_SLEEP);
 334                return ret;
 335        }
 336
 337        return 0;
 338}
 339
 340static void i2c_hid_get_input(struct i2c_hid *ihid)
 341{
 342        int ret, ret_size;
 343        int size = le16_to_cpu(ihid->hdesc.wMaxInputLength);
 344
 345        ret = i2c_master_recv(ihid->client, ihid->inbuf, size);
 346        if (ret != size) {
 347                if (ret < 0)
 348                        return;
 349
 350                dev_err(&ihid->client->dev, "%s: got %d data instead of %d\n",
 351                        __func__, ret, size);
 352                return;
 353        }
 354
 355        ret_size = ihid->inbuf[0] | ihid->inbuf[1] << 8;
 356
 357        if (!ret_size) {
 358                /* host or device initiated RESET completed */
 359                if (test_and_clear_bit(I2C_HID_RESET_PENDING, &ihid->flags))
 360                        wake_up(&ihid->wait);
 361                return;
 362        }
 363
 364        if (ret_size > size) {
 365                dev_err(&ihid->client->dev, "%s: incomplete report (%d/%d)\n",
 366                        __func__, size, ret_size);
 367                return;
 368        }
 369
 370        i2c_hid_dbg(ihid, "input: %*ph\n", ret_size, ihid->inbuf);
 371
 372        if (test_bit(I2C_HID_STARTED, &ihid->flags))
 373                hid_input_report(ihid->hid, HID_INPUT_REPORT, ihid->inbuf + 2,
 374                                ret_size - 2, 1);
 375
 376        return;
 377}
 378
 379static irqreturn_t i2c_hid_irq(int irq, void *dev_id)
 380{
 381        struct i2c_hid *ihid = dev_id;
 382
 383        if (test_bit(I2C_HID_READ_PENDING, &ihid->flags))
 384                return IRQ_HANDLED;
 385
 386        i2c_hid_get_input(ihid);
 387
 388        return IRQ_HANDLED;
 389}
 390
 391static int i2c_hid_get_report_length(struct hid_report *report)
 392{
 393        return ((report->size - 1) >> 3) + 1 +
 394                report->device->report_enum[report->type].numbered + 2;
 395}
 396
 397static void i2c_hid_init_report(struct hid_report *report, u8 *buffer,
 398        size_t bufsize)
 399{
 400        struct hid_device *hid = report->device;
 401        struct i2c_client *client = hid->driver_data;
 402        struct i2c_hid *ihid = i2c_get_clientdata(client);
 403        unsigned int size, ret_size;
 404
 405        size = i2c_hid_get_report_length(report);
 406        if (i2c_hid_get_report(client,
 407                        report->type == HID_FEATURE_REPORT ? 0x03 : 0x01,
 408                        report->id, buffer, size))
 409                return;
 410
 411        i2c_hid_dbg(ihid, "report (len=%d): %*ph\n", size, size, ihid->inbuf);
 412
 413        ret_size = buffer[0] | (buffer[1] << 8);
 414
 415        if (ret_size != size) {
 416                dev_err(&client->dev, "error in %s size:%d / ret_size:%d\n",
 417                        __func__, size, ret_size);
 418                return;
 419        }
 420
 421        /* hid->driver_lock is held as we are in probe function,
 422         * we just need to setup the input fields, so using
 423         * hid_report_raw_event is safe. */
 424        hid_report_raw_event(hid, report->type, buffer + 2, size - 2, 1);
 425}
 426
 427/*
 428 * Initialize all reports
 429 */
 430static void i2c_hid_init_reports(struct hid_device *hid)
 431{
 432        struct hid_report *report;
 433        struct i2c_client *client = hid->driver_data;
 434        struct i2c_hid *ihid = i2c_get_clientdata(client);
 435        u8 *inbuf = kzalloc(ihid->bufsize, GFP_KERNEL);
 436
 437        if (!inbuf) {
 438                dev_err(&client->dev, "can not retrieve initial reports\n");
 439                return;
 440        }
 441
 442        list_for_each_entry(report,
 443                &hid->report_enum[HID_INPUT_REPORT].report_list, list)
 444                i2c_hid_init_report(report, inbuf, ihid->bufsize);
 445
 446        list_for_each_entry(report,
 447                &hid->report_enum[HID_FEATURE_REPORT].report_list, list)
 448                i2c_hid_init_report(report, inbuf, ihid->bufsize);
 449
 450        kfree(inbuf);
 451}
 452
 453/*
 454 * Traverse the supplied list of reports and find the longest
 455 */
 456static void i2c_hid_find_max_report(struct hid_device *hid, unsigned int type,
 457                unsigned int *max)
 458{
 459        struct hid_report *report;
 460        unsigned int size;
 461
 462        /* We should not rely on wMaxInputLength, as some devices may set it to
 463         * a wrong length. */
 464        list_for_each_entry(report, &hid->report_enum[type].report_list, list) {
 465                size = i2c_hid_get_report_length(report);
 466                if (*max < size)
 467                        *max = size;
 468        }
 469}
 470
 471static void i2c_hid_free_buffers(struct i2c_hid *ihid)
 472{
 473        kfree(ihid->inbuf);
 474        kfree(ihid->argsbuf);
 475        kfree(ihid->cmdbuf);
 476        ihid->inbuf = NULL;
 477        ihid->cmdbuf = NULL;
 478        ihid->argsbuf = NULL;
 479        ihid->bufsize = 0;
 480}
 481
 482static int i2c_hid_alloc_buffers(struct i2c_hid *ihid, size_t report_size)
 483{
 484        /* the worst case is computed from the set_report command with a
 485         * reportID > 15 and the maximum report length */
 486        int args_len = sizeof(__u8) + /* optional ReportID byte */
 487                       sizeof(__u16) + /* data register */
 488                       sizeof(__u16) + /* size of the report */
 489                       report_size; /* report */
 490
 491        ihid->inbuf = kzalloc(report_size, GFP_KERNEL);
 492        ihid->argsbuf = kzalloc(args_len, GFP_KERNEL);
 493        ihid->cmdbuf = kzalloc(sizeof(union command) + args_len, GFP_KERNEL);
 494
 495        if (!ihid->inbuf || !ihid->argsbuf || !ihid->cmdbuf) {
 496                i2c_hid_free_buffers(ihid);
 497                return -ENOMEM;
 498        }
 499
 500        ihid->bufsize = report_size;
 501
 502        return 0;
 503}
 504
 505static int i2c_hid_get_raw_report(struct hid_device *hid,
 506                unsigned char report_number, __u8 *buf, size_t count,
 507                unsigned char report_type)
 508{
 509        struct i2c_client *client = hid->driver_data;
 510        struct i2c_hid *ihid = i2c_get_clientdata(client);
 511        size_t ret_count, ask_count;
 512        int ret;
 513
 514        if (report_type == HID_OUTPUT_REPORT)
 515                return -EINVAL;
 516
 517        /* +2 bytes to include the size of the reply in the query buffer */
 518        ask_count = min(count + 2, (size_t)ihid->bufsize);
 519
 520        ret = i2c_hid_get_report(client,
 521                        report_type == HID_FEATURE_REPORT ? 0x03 : 0x01,
 522                        report_number, ihid->inbuf, ask_count);
 523
 524        if (ret < 0)
 525                return ret;
 526
 527        ret_count = ihid->inbuf[0] | (ihid->inbuf[1] << 8);
 528
 529        if (ret_count <= 2)
 530                return 0;
 531
 532        ret_count = min(ret_count, ask_count);
 533
 534        /* The query buffer contains the size, dropping it in the reply */
 535        count = min(count, ret_count - 2);
 536        memcpy(buf, ihid->inbuf + 2, count);
 537
 538        return count;
 539}
 540
 541static int i2c_hid_output_raw_report(struct hid_device *hid, __u8 *buf,
 542                size_t count, unsigned char report_type)
 543{
 544        struct i2c_client *client = hid->driver_data;
 545        int report_id = buf[0];
 546        int ret;
 547
 548        if (report_type == HID_INPUT_REPORT)
 549                return -EINVAL;
 550
 551        if (report_id) {
 552                buf++;
 553                count--;
 554        }
 555
 556        ret = i2c_hid_set_report(client,
 557                                report_type == HID_FEATURE_REPORT ? 0x03 : 0x02,
 558                                report_id, buf, count);
 559
 560        if (report_id && ret >= 0)
 561                ret++; /* add report_id to the number of transfered bytes */
 562
 563        return ret;
 564}
 565
 566static int i2c_hid_parse(struct hid_device *hid)
 567{
 568        struct i2c_client *client = hid->driver_data;
 569        struct i2c_hid *ihid = i2c_get_clientdata(client);
 570        struct i2c_hid_desc *hdesc = &ihid->hdesc;
 571        unsigned int rsize;
 572        char *rdesc;
 573        int ret;
 574        int tries = 3;
 575
 576        i2c_hid_dbg(ihid, "entering %s\n", __func__);
 577
 578        rsize = le16_to_cpu(hdesc->wReportDescLength);
 579        if (!rsize || rsize > HID_MAX_DESCRIPTOR_SIZE) {
 580                dbg_hid("weird size of report descriptor (%u)\n", rsize);
 581                return -EINVAL;
 582        }
 583
 584        do {
 585                ret = i2c_hid_hwreset(client);
 586                if (ret)
 587                        msleep(1000);
 588        } while (tries-- > 0 && ret);
 589
 590        if (ret)
 591                return ret;
 592
 593        rdesc = kzalloc(rsize, GFP_KERNEL);
 594
 595        if (!rdesc) {
 596                dbg_hid("couldn't allocate rdesc memory\n");
 597                return -ENOMEM;
 598        }
 599
 600        i2c_hid_dbg(ihid, "asking HID report descriptor\n");
 601
 602        ret = i2c_hid_command(client, &hid_report_descr_cmd, rdesc, rsize);
 603        if (ret) {
 604                hid_err(hid, "reading report descriptor failed\n");
 605                kfree(rdesc);
 606                return -EIO;
 607        }
 608
 609        i2c_hid_dbg(ihid, "Report Descriptor: %*ph\n", rsize, rdesc);
 610
 611        ret = hid_parse_report(hid, rdesc, rsize);
 612        kfree(rdesc);
 613        if (ret) {
 614                dbg_hid("parsing report descriptor failed\n");
 615                return ret;
 616        }
 617
 618        return 0;
 619}
 620
 621static int i2c_hid_start(struct hid_device *hid)
 622{
 623        struct i2c_client *client = hid->driver_data;
 624        struct i2c_hid *ihid = i2c_get_clientdata(client);
 625        int ret;
 626        unsigned int bufsize = HID_MIN_BUFFER_SIZE;
 627
 628        i2c_hid_find_max_report(hid, HID_INPUT_REPORT, &bufsize);
 629        i2c_hid_find_max_report(hid, HID_OUTPUT_REPORT, &bufsize);
 630        i2c_hid_find_max_report(hid, HID_FEATURE_REPORT, &bufsize);
 631
 632        if (bufsize > ihid->bufsize) {
 633                i2c_hid_free_buffers(ihid);
 634
 635                ret = i2c_hid_alloc_buffers(ihid, bufsize);
 636
 637                if (ret)
 638                        return ret;
 639        }
 640
 641        if (!(hid->quirks & HID_QUIRK_NO_INIT_REPORTS))
 642                i2c_hid_init_reports(hid);
 643
 644        return 0;
 645}
 646
 647static void i2c_hid_stop(struct hid_device *hid)
 648{
 649        struct i2c_client *client = hid->driver_data;
 650        struct i2c_hid *ihid = i2c_get_clientdata(client);
 651
 652        hid->claimed = 0;
 653
 654        i2c_hid_free_buffers(ihid);
 655}
 656
 657static int i2c_hid_open(struct hid_device *hid)
 658{
 659        struct i2c_client *client = hid->driver_data;
 660        struct i2c_hid *ihid = i2c_get_clientdata(client);
 661        int ret = 0;
 662
 663        mutex_lock(&i2c_hid_open_mut);
 664        if (!hid->open++) {
 665                ret = i2c_hid_set_power(client, I2C_HID_PWR_ON);
 666                if (ret) {
 667                        hid->open--;
 668                        goto done;
 669                }
 670                set_bit(I2C_HID_STARTED, &ihid->flags);
 671        }
 672done:
 673        mutex_unlock(&i2c_hid_open_mut);
 674        return ret;
 675}
 676
 677static void i2c_hid_close(struct hid_device *hid)
 678{
 679        struct i2c_client *client = hid->driver_data;
 680        struct i2c_hid *ihid = i2c_get_clientdata(client);
 681
 682        /* protecting hid->open to make sure we don't restart
 683         * data acquistion due to a resumption we no longer
 684         * care about
 685         */
 686        mutex_lock(&i2c_hid_open_mut);
 687        if (!--hid->open) {
 688                clear_bit(I2C_HID_STARTED, &ihid->flags);
 689
 690                /* Save some power */
 691                i2c_hid_set_power(client, I2C_HID_PWR_SLEEP);
 692        }
 693        mutex_unlock(&i2c_hid_open_mut);
 694}
 695
 696static int i2c_hid_power(struct hid_device *hid, int lvl)
 697{
 698        struct i2c_client *client = hid->driver_data;
 699        struct i2c_hid *ihid = i2c_get_clientdata(client);
 700        int ret = 0;
 701
 702        i2c_hid_dbg(ihid, "%s lvl:%d\n", __func__, lvl);
 703
 704        switch (lvl) {
 705        case PM_HINT_FULLON:
 706                ret = i2c_hid_set_power(client, I2C_HID_PWR_ON);
 707                break;
 708        case PM_HINT_NORMAL:
 709                ret = i2c_hid_set_power(client, I2C_HID_PWR_SLEEP);
 710                break;
 711        }
 712        return ret;
 713}
 714
 715static int i2c_hid_hidinput_input_event(struct input_dev *dev,
 716                unsigned int type, unsigned int code, int value)
 717{
 718        struct hid_device *hid = input_get_drvdata(dev);
 719        struct hid_field *field;
 720        int offset;
 721
 722        if (type == EV_FF)
 723                return input_ff_event(dev, type, code, value);
 724
 725        if (type != EV_LED)
 726                return -1;
 727
 728        offset = hidinput_find_field(hid, type, code, &field);
 729
 730        if (offset == -1) {
 731                hid_warn(dev, "event field not found\n");
 732                return -1;
 733        }
 734
 735        return hid_set_field(field, offset, value);
 736}
 737
 738static struct hid_ll_driver i2c_hid_ll_driver = {
 739        .parse = i2c_hid_parse,
 740        .start = i2c_hid_start,
 741        .stop = i2c_hid_stop,
 742        .open = i2c_hid_open,
 743        .close = i2c_hid_close,
 744        .power = i2c_hid_power,
 745        .hidinput_input_event = i2c_hid_hidinput_input_event,
 746};
 747
 748static int i2c_hid_init_irq(struct i2c_client *client)
 749{
 750        struct i2c_hid *ihid = i2c_get_clientdata(client);
 751        int ret;
 752
 753        dev_dbg(&client->dev, "Requesting IRQ: %d\n", client->irq);
 754
 755        ret = request_threaded_irq(client->irq, NULL, i2c_hid_irq,
 756                        IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
 757                        client->name, ihid);
 758        if (ret < 0) {
 759                dev_warn(&client->dev,
 760                        "Could not register for %s interrupt, irq = %d,"
 761                        " ret = %d\n",
 762                        client->name, client->irq, ret);
 763
 764                return ret;
 765        }
 766
 767        return 0;
 768}
 769
 770static int i2c_hid_fetch_hid_descriptor(struct i2c_hid *ihid)
 771{
 772        struct i2c_client *client = ihid->client;
 773        struct i2c_hid_desc *hdesc = &ihid->hdesc;
 774        unsigned int dsize;
 775        int ret;
 776
 777        /* Fetch the length of HID description, retrieve the 4 first bytes:
 778         * bytes 0-1 -> length
 779         * bytes 2-3 -> bcdVersion (has to be 1.00) */
 780        ret = i2c_hid_command(client, &hid_descr_cmd, ihid->hdesc_buffer, 4);
 781
 782        i2c_hid_dbg(ihid, "%s, ihid->hdesc_buffer: %*ph\n",
 783                        __func__, 4, ihid->hdesc_buffer);
 784
 785        if (ret) {
 786                dev_err(&client->dev,
 787                        "unable to fetch the size of HID descriptor (ret=%d)\n",
 788                        ret);
 789                return -ENODEV;
 790        }
 791
 792        dsize = le16_to_cpu(hdesc->wHIDDescLength);
 793        /*
 794         * the size of the HID descriptor should at least contain
 795         * its size and the bcdVersion (4 bytes), and should not be greater
 796         * than sizeof(struct i2c_hid_desc) as we directly fill this struct
 797         * through i2c_hid_command.
 798         */
 799        if (dsize < 4 || dsize > sizeof(struct i2c_hid_desc)) {
 800                dev_err(&client->dev, "weird size of HID descriptor (%u)\n",
 801                        dsize);
 802                return -ENODEV;
 803        }
 804
 805        /* check bcdVersion == 1.0 */
 806        if (le16_to_cpu(hdesc->bcdVersion) != 0x0100) {
 807                dev_err(&client->dev,
 808                        "unexpected HID descriptor bcdVersion (0x%04hx)\n",
 809                        le16_to_cpu(hdesc->bcdVersion));
 810                return -ENODEV;
 811        }
 812
 813        i2c_hid_dbg(ihid, "Fetching the HID descriptor\n");
 814
 815        ret = i2c_hid_command(client, &hid_descr_cmd, ihid->hdesc_buffer,
 816                                dsize);
 817        if (ret) {
 818                dev_err(&client->dev, "hid_descr_cmd Fail\n");
 819                return -ENODEV;
 820        }
 821
 822        i2c_hid_dbg(ihid, "HID Descriptor: %*ph\n", dsize, ihid->hdesc_buffer);
 823
 824        return 0;
 825}
 826
 827#ifdef CONFIG_ACPI
 828static int i2c_hid_acpi_pdata(struct i2c_client *client,
 829                struct i2c_hid_platform_data *pdata)
 830{
 831        static u8 i2c_hid_guid[] = {
 832                0xF7, 0xF6, 0xDF, 0x3C, 0x67, 0x42, 0x55, 0x45,
 833                0xAD, 0x05, 0xB3, 0x0A, 0x3D, 0x89, 0x38, 0xDE,
 834        };
 835        struct acpi_buffer buf = { ACPI_ALLOCATE_BUFFER, NULL };
 836        union acpi_object params[4], *obj;
 837        struct acpi_object_list input;
 838        struct acpi_device *adev;
 839        acpi_handle handle;
 840
 841        handle = ACPI_HANDLE(&client->dev);
 842        if (!handle || acpi_bus_get_device(handle, &adev))
 843                return -ENODEV;
 844
 845        input.count = ARRAY_SIZE(params);
 846        input.pointer = params;
 847
 848        params[0].type = ACPI_TYPE_BUFFER;
 849        params[0].buffer.length = sizeof(i2c_hid_guid);
 850        params[0].buffer.pointer = i2c_hid_guid;
 851        params[1].type = ACPI_TYPE_INTEGER;
 852        params[1].integer.value = 1;
 853        params[2].type = ACPI_TYPE_INTEGER;
 854        params[2].integer.value = 1; /* HID function */
 855        params[3].type = ACPI_TYPE_INTEGER;
 856        params[3].integer.value = 0;
 857
 858        if (ACPI_FAILURE(acpi_evaluate_object(handle, "_DSM", &input, &buf))) {
 859                dev_err(&client->dev, "device _DSM execution failed\n");
 860                return -ENODEV;
 861        }
 862
 863        obj = (union acpi_object *)buf.pointer;
 864        if (obj->type != ACPI_TYPE_INTEGER) {
 865                dev_err(&client->dev, "device _DSM returned invalid type: %d\n",
 866                        obj->type);
 867                kfree(buf.pointer);
 868                return -EINVAL;
 869        }
 870
 871        pdata->hid_descriptor_address = obj->integer.value;
 872
 873        kfree(buf.pointer);
 874        return 0;
 875}
 876
 877static const struct acpi_device_id i2c_hid_acpi_match[] = {
 878        {"ACPI0C50", 0 },
 879        {"PNP0C50", 0 },
 880        { },
 881};
 882MODULE_DEVICE_TABLE(acpi, i2c_hid_acpi_match);
 883#else
 884static inline int i2c_hid_acpi_pdata(struct i2c_client *client,
 885                struct i2c_hid_platform_data *pdata)
 886{
 887        return -ENODEV;
 888}
 889#endif
 890
 891static int i2c_hid_probe(struct i2c_client *client,
 892                         const struct i2c_device_id *dev_id)
 893{
 894        int ret;
 895        struct i2c_hid *ihid;
 896        struct hid_device *hid;
 897        __u16 hidRegister;
 898        struct i2c_hid_platform_data *platform_data = client->dev.platform_data;
 899
 900        dbg_hid("HID probe called for i2c 0x%02x\n", client->addr);
 901
 902        if (!client->irq) {
 903                dev_err(&client->dev,
 904                        "HID over i2c has not been provided an Int IRQ\n");
 905                return -EINVAL;
 906        }
 907
 908        ihid = kzalloc(sizeof(struct i2c_hid), GFP_KERNEL);
 909        if (!ihid)
 910                return -ENOMEM;
 911
 912        if (!platform_data) {
 913                ret = i2c_hid_acpi_pdata(client, &ihid->pdata);
 914                if (ret) {
 915                        dev_err(&client->dev,
 916                                "HID register address not provided\n");
 917                        goto err;
 918                }
 919        } else {
 920                ihid->pdata = *platform_data;
 921        }
 922
 923        i2c_set_clientdata(client, ihid);
 924
 925        ihid->client = client;
 926
 927        hidRegister = ihid->pdata.hid_descriptor_address;
 928        ihid->wHIDDescRegister = cpu_to_le16(hidRegister);
 929
 930        init_waitqueue_head(&ihid->wait);
 931
 932        /* we need to allocate the command buffer without knowing the maximum
 933         * size of the reports. Let's use HID_MIN_BUFFER_SIZE, then we do the
 934         * real computation later. */
 935        ret = i2c_hid_alloc_buffers(ihid, HID_MIN_BUFFER_SIZE);
 936        if (ret < 0)
 937                goto err;
 938
 939        ret = i2c_hid_fetch_hid_descriptor(ihid);
 940        if (ret < 0)
 941                goto err;
 942
 943        ret = i2c_hid_init_irq(client);
 944        if (ret < 0)
 945                goto err;
 946
 947        hid = hid_allocate_device();
 948        if (IS_ERR(hid)) {
 949                ret = PTR_ERR(hid);
 950                goto err_irq;
 951        }
 952
 953        ihid->hid = hid;
 954
 955        hid->driver_data = client;
 956        hid->ll_driver = &i2c_hid_ll_driver;
 957        hid->hid_get_raw_report = i2c_hid_get_raw_report;
 958        hid->hid_output_raw_report = i2c_hid_output_raw_report;
 959        hid->dev.parent = &client->dev;
 960        ACPI_HANDLE_SET(&hid->dev, ACPI_HANDLE(&client->dev));
 961        hid->bus = BUS_I2C;
 962        hid->version = le16_to_cpu(ihid->hdesc.bcdVersion);
 963        hid->vendor = le16_to_cpu(ihid->hdesc.wVendorID);
 964        hid->product = le16_to_cpu(ihid->hdesc.wProductID);
 965
 966        snprintf(hid->name, sizeof(hid->name), "%s %04hX:%04hX",
 967                 client->name, hid->vendor, hid->product);
 968
 969        ret = hid_add_device(hid);
 970        if (ret) {
 971                if (ret != -ENODEV)
 972                        hid_err(client, "can't add hid device: %d\n", ret);
 973                goto err_mem_free;
 974        }
 975
 976        return 0;
 977
 978err_mem_free:
 979        hid_destroy_device(hid);
 980
 981err_irq:
 982        free_irq(client->irq, ihid);
 983
 984err:
 985        i2c_hid_free_buffers(ihid);
 986        kfree(ihid);
 987        return ret;
 988}
 989
 990static int i2c_hid_remove(struct i2c_client *client)
 991{
 992        struct i2c_hid *ihid = i2c_get_clientdata(client);
 993        struct hid_device *hid;
 994
 995        hid = ihid->hid;
 996        hid_destroy_device(hid);
 997
 998        free_irq(client->irq, ihid);
 999
1000        if (ihid->bufsize)
1001                i2c_hid_free_buffers(ihid);
1002
1003        kfree(ihid);
1004
1005        return 0;
1006}
1007
1008#ifdef CONFIG_PM_SLEEP
1009static int i2c_hid_suspend(struct device *dev)
1010{
1011        struct i2c_client *client = to_i2c_client(dev);
1012
1013        if (device_may_wakeup(&client->dev))
1014                enable_irq_wake(client->irq);
1015
1016        /* Save some power */
1017        i2c_hid_set_power(client, I2C_HID_PWR_SLEEP);
1018
1019        return 0;
1020}
1021
1022static int i2c_hid_resume(struct device *dev)
1023{
1024        int ret;
1025        struct i2c_client *client = to_i2c_client(dev);
1026
1027        ret = i2c_hid_hwreset(client);
1028        if (ret)
1029                return ret;
1030
1031        if (device_may_wakeup(&client->dev))
1032                disable_irq_wake(client->irq);
1033
1034        return 0;
1035}
1036#endif
1037
1038static SIMPLE_DEV_PM_OPS(i2c_hid_pm, i2c_hid_suspend, i2c_hid_resume);
1039
1040static const struct i2c_device_id i2c_hid_id_table[] = {
1041        { "hid", 0 },
1042        { },
1043};
1044MODULE_DEVICE_TABLE(i2c, i2c_hid_id_table);
1045
1046
1047static struct i2c_driver i2c_hid_driver = {
1048        .driver = {
1049                .name   = "i2c_hid",
1050                .owner  = THIS_MODULE,
1051                .pm     = &i2c_hid_pm,
1052                .acpi_match_table = ACPI_PTR(i2c_hid_acpi_match),
1053        },
1054
1055        .probe          = i2c_hid_probe,
1056        .remove         = i2c_hid_remove,
1057
1058        .id_table       = i2c_hid_id_table,
1059};
1060
1061module_i2c_driver(i2c_hid_driver);
1062
1063MODULE_DESCRIPTION("HID over I2C core driver");
1064MODULE_AUTHOR("Benjamin Tissoires <benjamin.tissoires@gmail.com>");
1065MODULE_LICENSE("GPL");
1066