linux/drivers/hid/hid-sensor-hub.c
<<
>>
Prefs
   1/*
   2 * HID Sensors Driver
   3 * Copyright (c) 2012, Intel Corporation.
   4 *
   5 * This program is free software; you can redistribute it and/or modify it
   6 * under the terms and conditions of the GNU General Public License,
   7 * version 2, as published by the Free Software Foundation.
   8 *
   9 * This program is distributed in the hope it will be useful, but WITHOUT
  10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  12 * more details.
  13 *
  14 * You should have received a copy of the GNU General Public License along with
  15 * this program; if not, write to the Free Software Foundation, Inc.,
  16 * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
  17 *
  18 */
  19#include <linux/device.h>
  20#include <linux/hid.h>
  21#include <linux/module.h>
  22#include <linux/slab.h>
  23#include <linux/mfd/core.h>
  24#include <linux/list.h>
  25#include <linux/hid-sensor-ids.h>
  26#include <linux/hid-sensor-hub.h>
  27#include "hid-ids.h"
  28
  29#define HID_SENSOR_HUB_ENUM_QUIRK       0x01
  30
  31/**
  32 * struct sensor_hub_data - Hold a instance data for a HID hub device
  33 * @hsdev:              Stored hid instance for current hub device.
  34 * @mutex:              Mutex to serialize synchronous request.
  35 * @lock:               Spin lock to protect pending request structure.
  36 * @dyn_callback_list:  Holds callback function
  37 * @dyn_callback_lock:  spin lock to protect callback list
  38 * @hid_sensor_hub_client_devs: Stores all MFD cells for a hub instance.
  39 * @hid_sensor_client_cnt: Number of MFD cells, (no of sensors attached).
  40 * @ref_cnt:            Number of MFD clients have opened this device
  41 */
  42struct sensor_hub_data {
  43        struct mutex mutex;
  44        spinlock_t lock;
  45        struct list_head dyn_callback_list;
  46        spinlock_t dyn_callback_lock;
  47        struct mfd_cell *hid_sensor_hub_client_devs;
  48        int hid_sensor_client_cnt;
  49        unsigned long quirks;
  50        int ref_cnt;
  51};
  52
  53/**
  54 * struct hid_sensor_hub_callbacks_list - Stores callback list
  55 * @list:               list head.
  56 * @usage_id:           usage id for a physical device.
  57 * @usage_callback:     Stores registered callback functions.
  58 * @priv:               Private data for a physical device.
  59 */
  60struct hid_sensor_hub_callbacks_list {
  61        struct list_head list;
  62        u32 usage_id;
  63        struct hid_sensor_hub_device *hsdev;
  64        struct hid_sensor_hub_callbacks *usage_callback;
  65        void *priv;
  66};
  67
  68static struct hid_report *sensor_hub_report(int id, struct hid_device *hdev,
  69                                                int dir)
  70{
  71        struct hid_report *report;
  72
  73        list_for_each_entry(report, &hdev->report_enum[dir].report_list, list) {
  74                if (report->id == id)
  75                        return report;
  76        }
  77        hid_warn(hdev, "No report with id 0x%x found\n", id);
  78
  79        return NULL;
  80}
  81
  82static int sensor_hub_get_physical_device_count(struct hid_device *hdev)
  83{
  84        int i;
  85        int count = 0;
  86
  87        for (i = 0; i < hdev->maxcollection; ++i) {
  88                struct hid_collection *collection = &hdev->collection[i];
  89                if (collection->type == HID_COLLECTION_PHYSICAL ||
  90                    collection->type == HID_COLLECTION_APPLICATION)
  91                        ++count;
  92        }
  93
  94        return count;
  95}
  96
  97static void sensor_hub_fill_attr_info(
  98                struct hid_sensor_hub_attribute_info *info,
  99                s32 index, s32 report_id, struct hid_field *field)
 100{
 101        info->index = index;
 102        info->report_id = report_id;
 103        info->units = field->unit;
 104        info->unit_expo = field->unit_exponent;
 105        info->size = (field->report_size * field->report_count)/8;
 106        info->logical_minimum = field->logical_minimum;
 107        info->logical_maximum = field->logical_maximum;
 108}
 109
 110static struct hid_sensor_hub_callbacks *sensor_hub_get_callback(
 111                                        struct hid_device *hdev,
 112                                        u32 usage_id,
 113                                        int collection_index,
 114                                        struct hid_sensor_hub_device **hsdev,
 115                                        void **priv)
 116{
 117        struct hid_sensor_hub_callbacks_list *callback;
 118        struct sensor_hub_data *pdata = hid_get_drvdata(hdev);
 119        unsigned long flags;
 120
 121        spin_lock_irqsave(&pdata->dyn_callback_lock, flags);
 122        list_for_each_entry(callback, &pdata->dyn_callback_list, list)
 123                if ((callback->usage_id == usage_id ||
 124                     callback->usage_id == HID_USAGE_SENSOR_COLLECTION) &&
 125                        (collection_index >=
 126                                callback->hsdev->start_collection_index) &&
 127                        (collection_index <
 128                                callback->hsdev->end_collection_index)) {
 129                        *priv = callback->priv;
 130                        *hsdev = callback->hsdev;
 131                        spin_unlock_irqrestore(&pdata->dyn_callback_lock,
 132                                               flags);
 133                        return callback->usage_callback;
 134                }
 135        spin_unlock_irqrestore(&pdata->dyn_callback_lock, flags);
 136
 137        return NULL;
 138}
 139
 140int sensor_hub_register_callback(struct hid_sensor_hub_device *hsdev,
 141                        u32 usage_id,
 142                        struct hid_sensor_hub_callbacks *usage_callback)
 143{
 144        struct hid_sensor_hub_callbacks_list *callback;
 145        struct sensor_hub_data *pdata = hid_get_drvdata(hsdev->hdev);
 146        unsigned long flags;
 147
 148        spin_lock_irqsave(&pdata->dyn_callback_lock, flags);
 149        list_for_each_entry(callback, &pdata->dyn_callback_list, list)
 150                if (callback->usage_id == usage_id &&
 151                                                callback->hsdev == hsdev) {
 152                        spin_unlock_irqrestore(&pdata->dyn_callback_lock, flags);
 153                        return -EINVAL;
 154                }
 155        callback = kzalloc(sizeof(*callback), GFP_ATOMIC);
 156        if (!callback) {
 157                spin_unlock_irqrestore(&pdata->dyn_callback_lock, flags);
 158                return -ENOMEM;
 159        }
 160        callback->hsdev = hsdev;
 161        callback->usage_callback = usage_callback;
 162        callback->usage_id = usage_id;
 163        callback->priv = NULL;
 164        /*
 165         * If there is a handler registered for the collection type, then
 166         * it will handle all reports for sensors in this collection. If
 167         * there is also an individual sensor handler registration, then
 168         * we want to make sure that the reports are directed to collection
 169         * handler, as this may be a fusion sensor. So add collection handlers
 170         * to the beginning of the list, so that they are matched first.
 171         */
 172        if (usage_id == HID_USAGE_SENSOR_COLLECTION)
 173                list_add(&callback->list, &pdata->dyn_callback_list);
 174        else
 175                list_add_tail(&callback->list, &pdata->dyn_callback_list);
 176        spin_unlock_irqrestore(&pdata->dyn_callback_lock, flags);
 177
 178        return 0;
 179}
 180EXPORT_SYMBOL_GPL(sensor_hub_register_callback);
 181
 182int sensor_hub_remove_callback(struct hid_sensor_hub_device *hsdev,
 183                                u32 usage_id)
 184{
 185        struct hid_sensor_hub_callbacks_list *callback;
 186        struct sensor_hub_data *pdata = hid_get_drvdata(hsdev->hdev);
 187        unsigned long flags;
 188
 189        spin_lock_irqsave(&pdata->dyn_callback_lock, flags);
 190        list_for_each_entry(callback, &pdata->dyn_callback_list, list)
 191                if (callback->usage_id == usage_id &&
 192                                                callback->hsdev == hsdev) {
 193                        list_del(&callback->list);
 194                        kfree(callback);
 195                        break;
 196                }
 197        spin_unlock_irqrestore(&pdata->dyn_callback_lock, flags);
 198
 199        return 0;
 200}
 201EXPORT_SYMBOL_GPL(sensor_hub_remove_callback);
 202
 203int sensor_hub_set_feature(struct hid_sensor_hub_device *hsdev, u32 report_id,
 204                           u32 field_index, int buffer_size, void *buffer)
 205{
 206        struct hid_report *report;
 207        struct sensor_hub_data *data = hid_get_drvdata(hsdev->hdev);
 208        __s32 *buf32 = buffer;
 209        int i = 0;
 210        int remaining_bytes;
 211        __s32 value;
 212        int ret = 0;
 213
 214        mutex_lock(&data->mutex);
 215        report = sensor_hub_report(report_id, hsdev->hdev, HID_FEATURE_REPORT);
 216        if (!report || (field_index >= report->maxfield)) {
 217                ret = -EINVAL;
 218                goto done_proc;
 219        }
 220
 221        remaining_bytes = buffer_size % sizeof(__s32);
 222        buffer_size = buffer_size / sizeof(__s32);
 223        if (buffer_size) {
 224                for (i = 0; i < buffer_size; ++i) {
 225                        hid_set_field(report->field[field_index], i,
 226                                      (__force __s32)cpu_to_le32(*buf32));
 227                        ++buf32;
 228                }
 229        }
 230        if (remaining_bytes) {
 231                value = 0;
 232                memcpy(&value, (u8 *)buf32, remaining_bytes);
 233                hid_set_field(report->field[field_index], i,
 234                              (__force __s32)cpu_to_le32(value));
 235        }
 236        hid_hw_request(hsdev->hdev, report, HID_REQ_SET_REPORT);
 237        hid_hw_wait(hsdev->hdev);
 238
 239done_proc:
 240        mutex_unlock(&data->mutex);
 241
 242        return ret;
 243}
 244EXPORT_SYMBOL_GPL(sensor_hub_set_feature);
 245
 246int sensor_hub_get_feature(struct hid_sensor_hub_device *hsdev, u32 report_id,
 247                           u32 field_index, int buffer_size, void *buffer)
 248{
 249        struct hid_report *report;
 250        struct sensor_hub_data *data = hid_get_drvdata(hsdev->hdev);
 251        int report_size;
 252        int ret = 0;
 253
 254        mutex_lock(&data->mutex);
 255        report = sensor_hub_report(report_id, hsdev->hdev, HID_FEATURE_REPORT);
 256        if (!report || (field_index >= report->maxfield) ||
 257            report->field[field_index]->report_count < 1) {
 258                ret = -EINVAL;
 259                goto done_proc;
 260        }
 261        hid_hw_request(hsdev->hdev, report, HID_REQ_GET_REPORT);
 262        hid_hw_wait(hsdev->hdev);
 263
 264        /* calculate number of bytes required to read this field */
 265        report_size = DIV_ROUND_UP(report->field[field_index]->report_size,
 266                                   8) *
 267                                   report->field[field_index]->report_count;
 268        if (!report_size) {
 269                ret = -EINVAL;
 270                goto done_proc;
 271        }
 272        ret = min(report_size, buffer_size);
 273        memcpy(buffer, report->field[field_index]->value, ret);
 274
 275done_proc:
 276        mutex_unlock(&data->mutex);
 277
 278        return ret;
 279}
 280EXPORT_SYMBOL_GPL(sensor_hub_get_feature);
 281
 282
 283int sensor_hub_input_attr_get_raw_value(struct hid_sensor_hub_device *hsdev,
 284                                        u32 usage_id,
 285                                        u32 attr_usage_id, u32 report_id,
 286                                        enum sensor_hub_read_flags flag)
 287{
 288        struct sensor_hub_data *data = hid_get_drvdata(hsdev->hdev);
 289        unsigned long flags;
 290        struct hid_report *report;
 291        int ret_val = 0;
 292
 293        report = sensor_hub_report(report_id, hsdev->hdev,
 294                                   HID_INPUT_REPORT);
 295        if (!report)
 296                return -EINVAL;
 297
 298        mutex_lock(hsdev->mutex_ptr);
 299        if (flag == SENSOR_HUB_SYNC) {
 300                memset(&hsdev->pending, 0, sizeof(hsdev->pending));
 301                init_completion(&hsdev->pending.ready);
 302                hsdev->pending.usage_id = usage_id;
 303                hsdev->pending.attr_usage_id = attr_usage_id;
 304                hsdev->pending.raw_size = 0;
 305
 306                spin_lock_irqsave(&data->lock, flags);
 307                hsdev->pending.status = true;
 308                spin_unlock_irqrestore(&data->lock, flags);
 309        }
 310        mutex_lock(&data->mutex);
 311        hid_hw_request(hsdev->hdev, report, HID_REQ_GET_REPORT);
 312        mutex_unlock(&data->mutex);
 313        if (flag == SENSOR_HUB_SYNC) {
 314                wait_for_completion_interruptible_timeout(
 315                                                &hsdev->pending.ready, HZ*5);
 316                switch (hsdev->pending.raw_size) {
 317                case 1:
 318                        ret_val = *(u8 *)hsdev->pending.raw_data;
 319                        break;
 320                case 2:
 321                        ret_val = *(u16 *)hsdev->pending.raw_data;
 322                        break;
 323                case 4:
 324                        ret_val = *(u32 *)hsdev->pending.raw_data;
 325                        break;
 326                default:
 327                        ret_val = 0;
 328                }
 329                kfree(hsdev->pending.raw_data);
 330                hsdev->pending.status = false;
 331        }
 332        mutex_unlock(hsdev->mutex_ptr);
 333
 334        return ret_val;
 335}
 336EXPORT_SYMBOL_GPL(sensor_hub_input_attr_get_raw_value);
 337
 338int hid_sensor_get_usage_index(struct hid_sensor_hub_device *hsdev,
 339                                u32 report_id, int field_index, u32 usage_id)
 340{
 341        struct hid_report *report;
 342        struct hid_field *field;
 343        int i;
 344
 345        report = sensor_hub_report(report_id, hsdev->hdev, HID_FEATURE_REPORT);
 346        if (!report || (field_index >= report->maxfield))
 347                goto done_proc;
 348
 349        field = report->field[field_index];
 350        for (i = 0; i < field->maxusage; ++i) {
 351                if (field->usage[i].hid == usage_id)
 352                        return field->usage[i].usage_index;
 353        }
 354
 355done_proc:
 356        return -EINVAL;
 357}
 358EXPORT_SYMBOL_GPL(hid_sensor_get_usage_index);
 359
 360int sensor_hub_input_get_attribute_info(struct hid_sensor_hub_device *hsdev,
 361                                u8 type,
 362                                u32 usage_id,
 363                                u32 attr_usage_id,
 364                                struct hid_sensor_hub_attribute_info *info)
 365{
 366        int ret = -1;
 367        int i;
 368        struct hid_report *report;
 369        struct hid_field *field;
 370        struct hid_report_enum *report_enum;
 371        struct hid_device *hdev = hsdev->hdev;
 372
 373        /* Initialize with defaults */
 374        info->usage_id = usage_id;
 375        info->attrib_id = attr_usage_id;
 376        info->report_id = -1;
 377        info->index = -1;
 378        info->units = -1;
 379        info->unit_expo = -1;
 380
 381        report_enum = &hdev->report_enum[type];
 382        list_for_each_entry(report, &report_enum->report_list, list) {
 383                for (i = 0; i < report->maxfield; ++i) {
 384                        field = report->field[i];
 385                        if (field->maxusage) {
 386                                if (field->physical == usage_id &&
 387                                        (field->logical == attr_usage_id ||
 388                                        field->usage[0].hid ==
 389                                                        attr_usage_id) &&
 390                                        (field->usage[0].collection_index >=
 391                                        hsdev->start_collection_index) &&
 392                                        (field->usage[0].collection_index <
 393                                        hsdev->end_collection_index)) {
 394
 395                                        sensor_hub_fill_attr_info(info, i,
 396                                                                report->id,
 397                                                                field);
 398                                        ret = 0;
 399                                        break;
 400                                }
 401                        }
 402                }
 403
 404        }
 405
 406        return ret;
 407}
 408EXPORT_SYMBOL_GPL(sensor_hub_input_get_attribute_info);
 409
 410#ifdef CONFIG_PM
 411static int sensor_hub_suspend(struct hid_device *hdev, pm_message_t message)
 412{
 413        struct sensor_hub_data *pdata = hid_get_drvdata(hdev);
 414        struct hid_sensor_hub_callbacks_list *callback;
 415        unsigned long flags;
 416
 417        hid_dbg(hdev, " sensor_hub_suspend\n");
 418        spin_lock_irqsave(&pdata->dyn_callback_lock, flags);
 419        list_for_each_entry(callback, &pdata->dyn_callback_list, list) {
 420                if (callback->usage_callback->suspend)
 421                        callback->usage_callback->suspend(
 422                                        callback->hsdev, callback->priv);
 423        }
 424        spin_unlock_irqrestore(&pdata->dyn_callback_lock, flags);
 425
 426        return 0;
 427}
 428
 429static int sensor_hub_resume(struct hid_device *hdev)
 430{
 431        struct sensor_hub_data *pdata = hid_get_drvdata(hdev);
 432        struct hid_sensor_hub_callbacks_list *callback;
 433        unsigned long flags;
 434
 435        hid_dbg(hdev, " sensor_hub_resume\n");
 436        spin_lock_irqsave(&pdata->dyn_callback_lock, flags);
 437        list_for_each_entry(callback, &pdata->dyn_callback_list, list) {
 438                if (callback->usage_callback->resume)
 439                        callback->usage_callback->resume(
 440                                        callback->hsdev, callback->priv);
 441        }
 442        spin_unlock_irqrestore(&pdata->dyn_callback_lock, flags);
 443
 444        return 0;
 445}
 446
 447static int sensor_hub_reset_resume(struct hid_device *hdev)
 448{
 449        return 0;
 450}
 451#endif
 452
 453/*
 454 * Handle raw report as sent by device
 455 */
 456static int sensor_hub_raw_event(struct hid_device *hdev,
 457                struct hid_report *report, u8 *raw_data, int size)
 458{
 459        int i;
 460        u8 *ptr;
 461        int sz;
 462        struct sensor_hub_data *pdata = hid_get_drvdata(hdev);
 463        unsigned long flags;
 464        struct hid_sensor_hub_callbacks *callback = NULL;
 465        struct hid_collection *collection = NULL;
 466        void *priv = NULL;
 467        struct hid_sensor_hub_device *hsdev = NULL;
 468
 469        hid_dbg(hdev, "sensor_hub_raw_event report id:0x%x size:%d type:%d\n",
 470                         report->id, size, report->type);
 471        hid_dbg(hdev, "maxfield:%d\n", report->maxfield);
 472        if (report->type != HID_INPUT_REPORT)
 473                return 1;
 474
 475        ptr = raw_data;
 476        ptr++; /* Skip report id */
 477
 478        spin_lock_irqsave(&pdata->lock, flags);
 479
 480        for (i = 0; i < report->maxfield; ++i) {
 481                hid_dbg(hdev, "%d collection_index:%x hid:%x sz:%x\n",
 482                                i, report->field[i]->usage->collection_index,
 483                                report->field[i]->usage->hid,
 484                                (report->field[i]->report_size *
 485                                        report->field[i]->report_count)/8);
 486                sz = (report->field[i]->report_size *
 487                                        report->field[i]->report_count)/8;
 488                collection = &hdev->collection[
 489                                report->field[i]->usage->collection_index];
 490                hid_dbg(hdev, "collection->usage %x\n",
 491                                        collection->usage);
 492
 493                callback = sensor_hub_get_callback(hdev,
 494                                report->field[i]->physical,
 495                                report->field[i]->usage[0].collection_index,
 496                                &hsdev, &priv);
 497                if (!callback) {
 498                        ptr += sz;
 499                        continue;
 500                }
 501                if (hsdev->pending.status && (hsdev->pending.attr_usage_id ==
 502                                              report->field[i]->usage->hid ||
 503                                              hsdev->pending.attr_usage_id ==
 504                                              report->field[i]->logical)) {
 505                        hid_dbg(hdev, "data was pending ...\n");
 506                        hsdev->pending.raw_data = kmemdup(ptr, sz, GFP_ATOMIC);
 507                        if (hsdev->pending.raw_data)
 508                                hsdev->pending.raw_size = sz;
 509                        else
 510                                hsdev->pending.raw_size = 0;
 511                        complete(&hsdev->pending.ready);
 512                }
 513                if (callback->capture_sample) {
 514                        if (report->field[i]->logical)
 515                                callback->capture_sample(hsdev,
 516                                        report->field[i]->logical, sz, ptr,
 517                                        callback->pdev);
 518                        else
 519                                callback->capture_sample(hsdev,
 520                                        report->field[i]->usage->hid, sz, ptr,
 521                                        callback->pdev);
 522                }
 523                ptr += sz;
 524        }
 525        if (callback && collection && callback->send_event)
 526                callback->send_event(hsdev, collection->usage,
 527                                callback->pdev);
 528        spin_unlock_irqrestore(&pdata->lock, flags);
 529
 530        return 1;
 531}
 532
 533int sensor_hub_device_open(struct hid_sensor_hub_device *hsdev)
 534{
 535        int ret = 0;
 536        struct sensor_hub_data *data =  hid_get_drvdata(hsdev->hdev);
 537
 538        mutex_lock(&data->mutex);
 539        if (!data->ref_cnt) {
 540                ret = hid_hw_open(hsdev->hdev);
 541                if (ret) {
 542                        hid_err(hsdev->hdev, "failed to open hid device\n");
 543                        mutex_unlock(&data->mutex);
 544                        return ret;
 545                }
 546        }
 547        data->ref_cnt++;
 548        mutex_unlock(&data->mutex);
 549
 550        return ret;
 551}
 552EXPORT_SYMBOL_GPL(sensor_hub_device_open);
 553
 554void sensor_hub_device_close(struct hid_sensor_hub_device *hsdev)
 555{
 556        struct sensor_hub_data *data =  hid_get_drvdata(hsdev->hdev);
 557
 558        mutex_lock(&data->mutex);
 559        data->ref_cnt--;
 560        if (!data->ref_cnt)
 561                hid_hw_close(hsdev->hdev);
 562        mutex_unlock(&data->mutex);
 563}
 564EXPORT_SYMBOL_GPL(sensor_hub_device_close);
 565
 566static __u8 *sensor_hub_report_fixup(struct hid_device *hdev, __u8 *rdesc,
 567                unsigned int *rsize)
 568{
 569        int index;
 570        struct sensor_hub_data *sd =  hid_get_drvdata(hdev);
 571        unsigned char report_block[] = {
 572                                0x0a,  0x16, 0x03, 0x15, 0x00, 0x25, 0x05};
 573        unsigned char power_block[] = {
 574                                0x0a,  0x19, 0x03, 0x15, 0x00, 0x25, 0x05};
 575
 576        if (!(sd->quirks & HID_SENSOR_HUB_ENUM_QUIRK)) {
 577                hid_dbg(hdev, "No Enum quirks\n");
 578                return rdesc;
 579        }
 580
 581        /* Looks for power and report state usage id and force to 1 */
 582        for (index = 0; index < *rsize; ++index) {
 583                if (((*rsize - index) > sizeof(report_block)) &&
 584                        !memcmp(&rdesc[index], report_block,
 585                                                sizeof(report_block))) {
 586                        rdesc[index + 4] = 0x01;
 587                        index += sizeof(report_block);
 588                }
 589                if (((*rsize - index) > sizeof(power_block)) &&
 590                        !memcmp(&rdesc[index], power_block,
 591                                                sizeof(power_block))) {
 592                        rdesc[index + 4] = 0x01;
 593                        index += sizeof(power_block);
 594                }
 595        }
 596
 597        /* Checks if the report descriptor of Thinkpad Helix 2 has a logical
 598         * minimum for magnetic flux axis greater than the maximum */
 599        if (hdev->product == USB_DEVICE_ID_TEXAS_INSTRUMENTS_LENOVO_YOGA &&
 600                *rsize == 2558 && rdesc[913] == 0x17 && rdesc[914] == 0x40 &&
 601                rdesc[915] == 0x81 && rdesc[916] == 0x08 &&
 602                rdesc[917] == 0x00 && rdesc[918] == 0x27 &&
 603                rdesc[921] == 0x07 && rdesc[922] == 0x00) {
 604                /* Sets negative logical minimum for mag x, y and z */
 605                rdesc[914] = rdesc[935] = rdesc[956] = 0xc0;
 606                rdesc[915] = rdesc[936] = rdesc[957] = 0x7e;
 607                rdesc[916] = rdesc[937] = rdesc[958] = 0xf7;
 608                rdesc[917] = rdesc[938] = rdesc[959] = 0xff;
 609        }
 610
 611        return rdesc;
 612}
 613
 614static int sensor_hub_probe(struct hid_device *hdev,
 615                                const struct hid_device_id *id)
 616{
 617        int ret;
 618        struct sensor_hub_data *sd;
 619        int i;
 620        char *name;
 621        int dev_cnt;
 622        struct hid_sensor_hub_device *hsdev;
 623        struct hid_sensor_hub_device *last_hsdev = NULL;
 624        struct hid_sensor_hub_device *collection_hsdev = NULL;
 625
 626        sd = devm_kzalloc(&hdev->dev, sizeof(*sd), GFP_KERNEL);
 627        if (!sd) {
 628                hid_err(hdev, "cannot allocate Sensor data\n");
 629                return -ENOMEM;
 630        }
 631
 632        hid_set_drvdata(hdev, sd);
 633        sd->quirks = id->driver_data;
 634
 635        spin_lock_init(&sd->lock);
 636        spin_lock_init(&sd->dyn_callback_lock);
 637        mutex_init(&sd->mutex);
 638        ret = hid_parse(hdev);
 639        if (ret) {
 640                hid_err(hdev, "parse failed\n");
 641                return ret;
 642        }
 643        INIT_LIST_HEAD(&hdev->inputs);
 644
 645        ret = hid_hw_start(hdev, 0);
 646        if (ret) {
 647                hid_err(hdev, "hw start failed\n");
 648                return ret;
 649        }
 650        INIT_LIST_HEAD(&sd->dyn_callback_list);
 651        sd->hid_sensor_client_cnt = 0;
 652
 653        dev_cnt = sensor_hub_get_physical_device_count(hdev);
 654        if (dev_cnt > HID_MAX_PHY_DEVICES) {
 655                hid_err(hdev, "Invalid Physical device count\n");
 656                ret = -EINVAL;
 657                goto err_stop_hw;
 658        }
 659        sd->hid_sensor_hub_client_devs = devm_kzalloc(&hdev->dev, dev_cnt *
 660                                                      sizeof(struct mfd_cell),
 661                                                      GFP_KERNEL);
 662        if (sd->hid_sensor_hub_client_devs == NULL) {
 663                hid_err(hdev, "Failed to allocate memory for mfd cells\n");
 664                ret = -ENOMEM;
 665                goto err_stop_hw;
 666        }
 667
 668        for (i = 0; i < hdev->maxcollection; ++i) {
 669                struct hid_collection *collection = &hdev->collection[i];
 670
 671                if (collection->type == HID_COLLECTION_PHYSICAL ||
 672                    collection->type == HID_COLLECTION_APPLICATION) {
 673
 674                        hsdev = devm_kzalloc(&hdev->dev, sizeof(*hsdev),
 675                                             GFP_KERNEL);
 676                        if (!hsdev) {
 677                                hid_err(hdev, "cannot allocate hid_sensor_hub_device\n");
 678                                ret = -ENOMEM;
 679                                goto err_stop_hw;
 680                        }
 681                        hsdev->hdev = hdev;
 682                        hsdev->vendor_id = hdev->vendor;
 683                        hsdev->product_id = hdev->product;
 684                        hsdev->usage = collection->usage;
 685                        hsdev->mutex_ptr = devm_kzalloc(&hdev->dev,
 686                                                        sizeof(struct mutex),
 687                                                        GFP_KERNEL);
 688                        if (!hsdev->mutex_ptr) {
 689                                ret = -ENOMEM;
 690                                goto err_stop_hw;
 691                        }
 692                        mutex_init(hsdev->mutex_ptr);
 693                        hsdev->start_collection_index = i;
 694                        if (last_hsdev)
 695                                last_hsdev->end_collection_index = i;
 696                        last_hsdev = hsdev;
 697                        name = devm_kasprintf(&hdev->dev, GFP_KERNEL,
 698                                              "HID-SENSOR-%x",
 699                                              collection->usage);
 700                        if (name == NULL) {
 701                                hid_err(hdev, "Failed MFD device name\n");
 702                                ret = -ENOMEM;
 703                                goto err_stop_hw;
 704                        }
 705                        sd->hid_sensor_hub_client_devs[
 706                                sd->hid_sensor_client_cnt].name = name;
 707                        sd->hid_sensor_hub_client_devs[
 708                                sd->hid_sensor_client_cnt].platform_data =
 709                                                        hsdev;
 710                        sd->hid_sensor_hub_client_devs[
 711                                sd->hid_sensor_client_cnt].pdata_size =
 712                                                        sizeof(*hsdev);
 713                        hid_dbg(hdev, "Adding %s:%d\n", name,
 714                                        hsdev->start_collection_index);
 715                        sd->hid_sensor_client_cnt++;
 716                        if (collection_hsdev)
 717                                collection_hsdev->end_collection_index = i;
 718                        if (collection->type == HID_COLLECTION_APPLICATION &&
 719                            collection->usage == HID_USAGE_SENSOR_COLLECTION)
 720                                collection_hsdev = hsdev;
 721                }
 722        }
 723        if (last_hsdev)
 724                last_hsdev->end_collection_index = i;
 725        if (collection_hsdev)
 726                collection_hsdev->end_collection_index = i;
 727
 728        ret = mfd_add_hotplug_devices(&hdev->dev,
 729                        sd->hid_sensor_hub_client_devs,
 730                        sd->hid_sensor_client_cnt);
 731        if (ret < 0)
 732                goto err_stop_hw;
 733
 734        return ret;
 735
 736err_stop_hw:
 737        hid_hw_stop(hdev);
 738
 739        return ret;
 740}
 741
 742static void sensor_hub_remove(struct hid_device *hdev)
 743{
 744        struct sensor_hub_data *data = hid_get_drvdata(hdev);
 745        unsigned long flags;
 746        int i;
 747
 748        hid_dbg(hdev, " hardware removed\n");
 749        hid_hw_close(hdev);
 750        hid_hw_stop(hdev);
 751        spin_lock_irqsave(&data->lock, flags);
 752        for (i = 0; i < data->hid_sensor_client_cnt; ++i) {
 753                struct hid_sensor_hub_device *hsdev =
 754                        data->hid_sensor_hub_client_devs[i].platform_data;
 755                if (hsdev->pending.status)
 756                        complete(&hsdev->pending.ready);
 757        }
 758        spin_unlock_irqrestore(&data->lock, flags);
 759        mfd_remove_devices(&hdev->dev);
 760        hid_set_drvdata(hdev, NULL);
 761        mutex_destroy(&data->mutex);
 762}
 763
 764static const struct hid_device_id sensor_hub_devices[] = {
 765        { HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, USB_VENDOR_ID_INTEL_0,
 766                        USB_DEVICE_ID_INTEL_HID_SENSOR_0),
 767                        .driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
 768        { HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, USB_VENDOR_ID_INTEL_1,
 769                        USB_DEVICE_ID_INTEL_HID_SENSOR_0),
 770                        .driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
 771        { HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, USB_VENDOR_ID_INTEL_1,
 772                        USB_DEVICE_ID_INTEL_HID_SENSOR_1),
 773                        .driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
 774        { HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, USB_VENDOR_ID_MICROSOFT,
 775                        USB_DEVICE_ID_MS_SURFACE_PRO_2),
 776                        .driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
 777        { HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, USB_VENDOR_ID_MICROSOFT,
 778                        USB_DEVICE_ID_MS_TOUCH_COVER_2),
 779                        .driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
 780        { HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, USB_VENDOR_ID_MICROSOFT,
 781                        USB_DEVICE_ID_MS_TYPE_COVER_2),
 782                        .driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
 783        { HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, USB_VENDOR_ID_STM_0,
 784                        USB_DEVICE_ID_STM_HID_SENSOR),
 785                        .driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
 786        { HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, USB_VENDOR_ID_STM_0,
 787                        USB_DEVICE_ID_STM_HID_SENSOR_1),
 788                        .driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
 789        { HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, USB_VENDOR_ID_TEXAS_INSTRUMENTS,
 790                        USB_DEVICE_ID_TEXAS_INSTRUMENTS_LENOVO_YOGA),
 791                        .driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
 792        { HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, USB_VENDOR_ID_ITE,
 793                        USB_DEVICE_ID_ITE_LENOVO_YOGA),
 794                        .driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
 795        { HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, USB_VENDOR_ID_ITE,
 796                        USB_DEVICE_ID_ITE_LENOVO_YOGA2),
 797                        .driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
 798        { HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, USB_VENDOR_ID_ITE,
 799                        USB_DEVICE_ID_ITE_LENOVO_YOGA900),
 800                        .driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
 801        { HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, HID_ANY_ID,
 802                     HID_ANY_ID) },
 803        { }
 804};
 805MODULE_DEVICE_TABLE(hid, sensor_hub_devices);
 806
 807static struct hid_driver sensor_hub_driver = {
 808        .name = "hid-sensor-hub",
 809        .id_table = sensor_hub_devices,
 810        .probe = sensor_hub_probe,
 811        .remove = sensor_hub_remove,
 812        .raw_event = sensor_hub_raw_event,
 813        .report_fixup = sensor_hub_report_fixup,
 814#ifdef CONFIG_PM
 815        .suspend = sensor_hub_suspend,
 816        .resume = sensor_hub_resume,
 817        .reset_resume = sensor_hub_reset_resume,
 818#endif
 819};
 820module_hid_driver(sensor_hub_driver);
 821
 822MODULE_DESCRIPTION("HID Sensor Hub driver");
 823MODULE_AUTHOR("Srinivas Pandruvada <srinivas.pandruvada@intel.com>");
 824MODULE_LICENSE("GPL");
 825