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 = do_div(buffer_size, sizeof(__s32));
 222        if (buffer_size) {
 223                for (i = 0; i < buffer_size; ++i) {
 224                        hid_set_field(report->field[field_index], i,
 225                                      (__force __s32)cpu_to_le32(*buf32));
 226                        ++buf32;
 227                }
 228        }
 229        if (remaining_bytes) {
 230                value = 0;
 231                memcpy(&value, (u8 *)buf32, remaining_bytes);
 232                hid_set_field(report->field[field_index], i,
 233                              (__force __s32)cpu_to_le32(value));
 234        }
 235        hid_hw_request(hsdev->hdev, report, HID_REQ_SET_REPORT);
 236        hid_hw_wait(hsdev->hdev);
 237
 238done_proc:
 239        mutex_unlock(&data->mutex);
 240
 241        return ret;
 242}
 243EXPORT_SYMBOL_GPL(sensor_hub_set_feature);
 244
 245int sensor_hub_get_feature(struct hid_sensor_hub_device *hsdev, u32 report_id,
 246                           u32 field_index, int buffer_size, void *buffer)
 247{
 248        struct hid_report *report;
 249        struct sensor_hub_data *data = hid_get_drvdata(hsdev->hdev);
 250        int report_size;
 251        int ret = 0;
 252
 253        mutex_lock(&data->mutex);
 254        report = sensor_hub_report(report_id, hsdev->hdev, HID_FEATURE_REPORT);
 255        if (!report || (field_index >= report->maxfield) ||
 256            report->field[field_index]->report_count < 1) {
 257                ret = -EINVAL;
 258                goto done_proc;
 259        }
 260        hid_hw_request(hsdev->hdev, report, HID_REQ_GET_REPORT);
 261        hid_hw_wait(hsdev->hdev);
 262
 263        /* calculate number of bytes required to read this field */
 264        report_size = DIV_ROUND_UP(report->field[field_index]->report_size,
 265                                   8) *
 266                                   report->field[field_index]->report_count;
 267        if (!report_size) {
 268                ret = -EINVAL;
 269                goto done_proc;
 270        }
 271        ret = min(report_size, buffer_size);
 272        memcpy(buffer, report->field[field_index]->value, ret);
 273
 274done_proc:
 275        mutex_unlock(&data->mutex);
 276
 277        return ret;
 278}
 279EXPORT_SYMBOL_GPL(sensor_hub_get_feature);
 280
 281
 282int sensor_hub_input_attr_get_raw_value(struct hid_sensor_hub_device *hsdev,
 283                                        u32 usage_id,
 284                                        u32 attr_usage_id, u32 report_id,
 285                                        enum sensor_hub_read_flags flag)
 286{
 287        struct sensor_hub_data *data = hid_get_drvdata(hsdev->hdev);
 288        unsigned long flags;
 289        struct hid_report *report;
 290        int ret_val = 0;
 291
 292        report = sensor_hub_report(report_id, hsdev->hdev,
 293                                   HID_INPUT_REPORT);
 294        if (!report)
 295                return -EINVAL;
 296
 297        mutex_lock(hsdev->mutex_ptr);
 298        if (flag == SENSOR_HUB_SYNC) {
 299                memset(&hsdev->pending, 0, sizeof(hsdev->pending));
 300                init_completion(&hsdev->pending.ready);
 301                hsdev->pending.usage_id = usage_id;
 302                hsdev->pending.attr_usage_id = attr_usage_id;
 303                hsdev->pending.raw_size = 0;
 304
 305                spin_lock_irqsave(&data->lock, flags);
 306                hsdev->pending.status = true;
 307                spin_unlock_irqrestore(&data->lock, flags);
 308        }
 309        mutex_lock(&data->mutex);
 310        hid_hw_request(hsdev->hdev, report, HID_REQ_GET_REPORT);
 311        mutex_unlock(&data->mutex);
 312        if (flag == SENSOR_HUB_SYNC) {
 313                wait_for_completion_interruptible_timeout(
 314                                                &hsdev->pending.ready, HZ*5);
 315                switch (hsdev->pending.raw_size) {
 316                case 1:
 317                        ret_val = *(u8 *)hsdev->pending.raw_data;
 318                        break;
 319                case 2:
 320                        ret_val = *(u16 *)hsdev->pending.raw_data;
 321                        break;
 322                case 4:
 323                        ret_val = *(u32 *)hsdev->pending.raw_data;
 324                        break;
 325                default:
 326                        ret_val = 0;
 327                }
 328                kfree(hsdev->pending.raw_data);
 329                hsdev->pending.status = false;
 330        }
 331        mutex_unlock(hsdev->mutex_ptr);
 332
 333        return ret_val;
 334}
 335EXPORT_SYMBOL_GPL(sensor_hub_input_attr_get_raw_value);
 336
 337int hid_sensor_get_usage_index(struct hid_sensor_hub_device *hsdev,
 338                                u32 report_id, int field_index, u32 usage_id)
 339{
 340        struct hid_report *report;
 341        struct hid_field *field;
 342        int i;
 343
 344        report = sensor_hub_report(report_id, hsdev->hdev, HID_FEATURE_REPORT);
 345        if (!report || (field_index >= report->maxfield))
 346                goto done_proc;
 347
 348        field = report->field[field_index];
 349        for (i = 0; i < field->maxusage; ++i) {
 350                if (field->usage[i].hid == usage_id)
 351                        return field->usage[i].usage_index;
 352        }
 353
 354done_proc:
 355        return -EINVAL;
 356}
 357EXPORT_SYMBOL_GPL(hid_sensor_get_usage_index);
 358
 359int sensor_hub_input_get_attribute_info(struct hid_sensor_hub_device *hsdev,
 360                                u8 type,
 361                                u32 usage_id,
 362                                u32 attr_usage_id,
 363                                struct hid_sensor_hub_attribute_info *info)
 364{
 365        int ret = -1;
 366        int i;
 367        struct hid_report *report;
 368        struct hid_field *field;
 369        struct hid_report_enum *report_enum;
 370        struct hid_device *hdev = hsdev->hdev;
 371
 372        /* Initialize with defaults */
 373        info->usage_id = usage_id;
 374        info->attrib_id = attr_usage_id;
 375        info->report_id = -1;
 376        info->index = -1;
 377        info->units = -1;
 378        info->unit_expo = -1;
 379
 380        report_enum = &hdev->report_enum[type];
 381        list_for_each_entry(report, &report_enum->report_list, list) {
 382                for (i = 0; i < report->maxfield; ++i) {
 383                        field = report->field[i];
 384                        if (field->maxusage) {
 385                                if (field->physical == usage_id &&
 386                                        (field->logical == attr_usage_id ||
 387                                        field->usage[0].hid ==
 388                                                        attr_usage_id) &&
 389                                        (field->usage[0].collection_index >=
 390                                        hsdev->start_collection_index) &&
 391                                        (field->usage[0].collection_index <
 392                                        hsdev->end_collection_index)) {
 393
 394                                        sensor_hub_fill_attr_info(info, i,
 395                                                                report->id,
 396                                                                field);
 397                                        ret = 0;
 398                                        break;
 399                                }
 400                        }
 401                }
 402
 403        }
 404
 405        return ret;
 406}
 407EXPORT_SYMBOL_GPL(sensor_hub_input_get_attribute_info);
 408
 409#ifdef CONFIG_PM
 410static int sensor_hub_suspend(struct hid_device *hdev, pm_message_t message)
 411{
 412        struct sensor_hub_data *pdata = hid_get_drvdata(hdev);
 413        struct hid_sensor_hub_callbacks_list *callback;
 414        unsigned long flags;
 415
 416        hid_dbg(hdev, " sensor_hub_suspend\n");
 417        spin_lock_irqsave(&pdata->dyn_callback_lock, flags);
 418        list_for_each_entry(callback, &pdata->dyn_callback_list, list) {
 419                if (callback->usage_callback->suspend)
 420                        callback->usage_callback->suspend(
 421                                        callback->hsdev, callback->priv);
 422        }
 423        spin_unlock_irqrestore(&pdata->dyn_callback_lock, flags);
 424
 425        return 0;
 426}
 427
 428static int sensor_hub_resume(struct hid_device *hdev)
 429{
 430        struct sensor_hub_data *pdata = hid_get_drvdata(hdev);
 431        struct hid_sensor_hub_callbacks_list *callback;
 432        unsigned long flags;
 433
 434        hid_dbg(hdev, " sensor_hub_resume\n");
 435        spin_lock_irqsave(&pdata->dyn_callback_lock, flags);
 436        list_for_each_entry(callback, &pdata->dyn_callback_list, list) {
 437                if (callback->usage_callback->resume)
 438                        callback->usage_callback->resume(
 439                                        callback->hsdev, callback->priv);
 440        }
 441        spin_unlock_irqrestore(&pdata->dyn_callback_lock, flags);
 442
 443        return 0;
 444}
 445
 446static int sensor_hub_reset_resume(struct hid_device *hdev)
 447{
 448        return 0;
 449}
 450#endif
 451
 452/*
 453 * Handle raw report as sent by device
 454 */
 455static int sensor_hub_raw_event(struct hid_device *hdev,
 456                struct hid_report *report, u8 *raw_data, int size)
 457{
 458        int i;
 459        u8 *ptr;
 460        int sz;
 461        struct sensor_hub_data *pdata = hid_get_drvdata(hdev);
 462        unsigned long flags;
 463        struct hid_sensor_hub_callbacks *callback = NULL;
 464        struct hid_collection *collection = NULL;
 465        void *priv = NULL;
 466        struct hid_sensor_hub_device *hsdev = NULL;
 467
 468        hid_dbg(hdev, "sensor_hub_raw_event report id:0x%x size:%d type:%d\n",
 469                         report->id, size, report->type);
 470        hid_dbg(hdev, "maxfield:%d\n", report->maxfield);
 471        if (report->type != HID_INPUT_REPORT)
 472                return 1;
 473
 474        ptr = raw_data;
 475        ptr++; /* Skip report id */
 476
 477        spin_lock_irqsave(&pdata->lock, flags);
 478
 479        for (i = 0; i < report->maxfield; ++i) {
 480                hid_dbg(hdev, "%d collection_index:%x hid:%x sz:%x\n",
 481                                i, report->field[i]->usage->collection_index,
 482                                report->field[i]->usage->hid,
 483                                (report->field[i]->report_size *
 484                                        report->field[i]->report_count)/8);
 485                sz = (report->field[i]->report_size *
 486                                        report->field[i]->report_count)/8;
 487                collection = &hdev->collection[
 488                                report->field[i]->usage->collection_index];
 489                hid_dbg(hdev, "collection->usage %x\n",
 490                                        collection->usage);
 491
 492                callback = sensor_hub_get_callback(hdev,
 493                                report->field[i]->physical,
 494                                report->field[i]->usage[0].collection_index,
 495                                &hsdev, &priv);
 496                if (!callback) {
 497                        ptr += sz;
 498                        continue;
 499                }
 500                if (hsdev->pending.status && (hsdev->pending.attr_usage_id ==
 501                                              report->field[i]->usage->hid ||
 502                                              hsdev->pending.attr_usage_id ==
 503                                              report->field[i]->logical)) {
 504                        hid_dbg(hdev, "data was pending ...\n");
 505                        hsdev->pending.raw_data = kmemdup(ptr, sz, GFP_ATOMIC);
 506                        if (hsdev->pending.raw_data)
 507                                hsdev->pending.raw_size = sz;
 508                        else
 509                                hsdev->pending.raw_size = 0;
 510                        complete(&hsdev->pending.ready);
 511                }
 512                if (callback->capture_sample) {
 513                        if (report->field[i]->logical)
 514                                callback->capture_sample(hsdev,
 515                                        report->field[i]->logical, sz, ptr,
 516                                        callback->pdev);
 517                        else
 518                                callback->capture_sample(hsdev,
 519                                        report->field[i]->usage->hid, sz, ptr,
 520                                        callback->pdev);
 521                }
 522                ptr += sz;
 523        }
 524        if (callback && collection && callback->send_event)
 525                callback->send_event(hsdev, collection->usage,
 526                                callback->pdev);
 527        spin_unlock_irqrestore(&pdata->lock, flags);
 528
 529        return 1;
 530}
 531
 532int sensor_hub_device_open(struct hid_sensor_hub_device *hsdev)
 533{
 534        int ret = 0;
 535        struct sensor_hub_data *data =  hid_get_drvdata(hsdev->hdev);
 536
 537        mutex_lock(&data->mutex);
 538        if (!data->ref_cnt) {
 539                ret = hid_hw_open(hsdev->hdev);
 540                if (ret) {
 541                        hid_err(hsdev->hdev, "failed to open hid device\n");
 542                        mutex_unlock(&data->mutex);
 543                        return ret;
 544                }
 545        }
 546        data->ref_cnt++;
 547        mutex_unlock(&data->mutex);
 548
 549        return ret;
 550}
 551EXPORT_SYMBOL_GPL(sensor_hub_device_open);
 552
 553void sensor_hub_device_close(struct hid_sensor_hub_device *hsdev)
 554{
 555        struct sensor_hub_data *data =  hid_get_drvdata(hsdev->hdev);
 556
 557        mutex_lock(&data->mutex);
 558        data->ref_cnt--;
 559        if (!data->ref_cnt)
 560                hid_hw_close(hsdev->hdev);
 561        mutex_unlock(&data->mutex);
 562}
 563EXPORT_SYMBOL_GPL(sensor_hub_device_close);
 564
 565static __u8 *sensor_hub_report_fixup(struct hid_device *hdev, __u8 *rdesc,
 566                unsigned int *rsize)
 567{
 568        int index;
 569        struct sensor_hub_data *sd =  hid_get_drvdata(hdev);
 570        unsigned char report_block[] = {
 571                                0x0a,  0x16, 0x03, 0x15, 0x00, 0x25, 0x05};
 572        unsigned char power_block[] = {
 573                                0x0a,  0x19, 0x03, 0x15, 0x00, 0x25, 0x05};
 574
 575        if (!(sd->quirks & HID_SENSOR_HUB_ENUM_QUIRK)) {
 576                hid_dbg(hdev, "No Enum quirks\n");
 577                return rdesc;
 578        }
 579
 580        /* Looks for power and report state usage id and force to 1 */
 581        for (index = 0; index < *rsize; ++index) {
 582                if (((*rsize - index) > sizeof(report_block)) &&
 583                        !memcmp(&rdesc[index], report_block,
 584                                                sizeof(report_block))) {
 585                        rdesc[index + 4] = 0x01;
 586                        index += sizeof(report_block);
 587                }
 588                if (((*rsize - index) > sizeof(power_block)) &&
 589                        !memcmp(&rdesc[index], power_block,
 590                                                sizeof(power_block))) {
 591                        rdesc[index + 4] = 0x01;
 592                        index += sizeof(power_block);
 593                }
 594        }
 595
 596        return rdesc;
 597}
 598
 599static int sensor_hub_probe(struct hid_device *hdev,
 600                                const struct hid_device_id *id)
 601{
 602        int ret;
 603        struct sensor_hub_data *sd;
 604        int i;
 605        char *name;
 606        int dev_cnt;
 607        struct hid_sensor_hub_device *hsdev;
 608        struct hid_sensor_hub_device *last_hsdev = NULL;
 609        struct hid_sensor_hub_device *collection_hsdev = NULL;
 610
 611        sd = devm_kzalloc(&hdev->dev, sizeof(*sd), GFP_KERNEL);
 612        if (!sd) {
 613                hid_err(hdev, "cannot allocate Sensor data\n");
 614                return -ENOMEM;
 615        }
 616
 617        hid_set_drvdata(hdev, sd);
 618        sd->quirks = id->driver_data;
 619
 620        spin_lock_init(&sd->lock);
 621        spin_lock_init(&sd->dyn_callback_lock);
 622        mutex_init(&sd->mutex);
 623        ret = hid_parse(hdev);
 624        if (ret) {
 625                hid_err(hdev, "parse failed\n");
 626                return ret;
 627        }
 628        INIT_LIST_HEAD(&hdev->inputs);
 629
 630        ret = hid_hw_start(hdev, 0);
 631        if (ret) {
 632                hid_err(hdev, "hw start failed\n");
 633                return ret;
 634        }
 635        INIT_LIST_HEAD(&sd->dyn_callback_list);
 636        sd->hid_sensor_client_cnt = 0;
 637
 638        dev_cnt = sensor_hub_get_physical_device_count(hdev);
 639        if (dev_cnt > HID_MAX_PHY_DEVICES) {
 640                hid_err(hdev, "Invalid Physical device count\n");
 641                ret = -EINVAL;
 642                goto err_stop_hw;
 643        }
 644        sd->hid_sensor_hub_client_devs = devm_kzalloc(&hdev->dev, dev_cnt *
 645                                                      sizeof(struct mfd_cell),
 646                                                      GFP_KERNEL);
 647        if (sd->hid_sensor_hub_client_devs == NULL) {
 648                hid_err(hdev, "Failed to allocate memory for mfd cells\n");
 649                        ret = -ENOMEM;
 650                        goto err_stop_hw;
 651        }
 652
 653        for (i = 0; i < hdev->maxcollection; ++i) {
 654                struct hid_collection *collection = &hdev->collection[i];
 655
 656                if (collection->type == HID_COLLECTION_PHYSICAL ||
 657                    collection->type == HID_COLLECTION_APPLICATION) {
 658
 659                        hsdev = devm_kzalloc(&hdev->dev, sizeof(*hsdev),
 660                                             GFP_KERNEL);
 661                        if (!hsdev) {
 662                                hid_err(hdev, "cannot allocate hid_sensor_hub_device\n");
 663                                ret = -ENOMEM;
 664                                goto err_stop_hw;
 665                        }
 666                        hsdev->hdev = hdev;
 667                        hsdev->vendor_id = hdev->vendor;
 668                        hsdev->product_id = hdev->product;
 669                        hsdev->usage = collection->usage;
 670                        hsdev->mutex_ptr = devm_kzalloc(&hdev->dev,
 671                                                        sizeof(struct mutex),
 672                                                        GFP_KERNEL);
 673                        if (!hsdev->mutex_ptr) {
 674                                ret = -ENOMEM;
 675                                goto err_stop_hw;
 676                        }
 677                        mutex_init(hsdev->mutex_ptr);
 678                        hsdev->start_collection_index = i;
 679                        if (last_hsdev)
 680                                last_hsdev->end_collection_index = i;
 681                        last_hsdev = hsdev;
 682                        name = devm_kasprintf(&hdev->dev, GFP_KERNEL,
 683                                              "HID-SENSOR-%x",
 684                                              collection->usage);
 685                        if (name == NULL) {
 686                                hid_err(hdev, "Failed MFD device name\n");
 687                                        ret = -ENOMEM;
 688                                        goto err_stop_hw;
 689                        }
 690                        sd->hid_sensor_hub_client_devs[
 691                                sd->hid_sensor_client_cnt].name = name;
 692                        sd->hid_sensor_hub_client_devs[
 693                                sd->hid_sensor_client_cnt].platform_data =
 694                                                        hsdev;
 695                        sd->hid_sensor_hub_client_devs[
 696                                sd->hid_sensor_client_cnt].pdata_size =
 697                                                        sizeof(*hsdev);
 698                        hid_dbg(hdev, "Adding %s:%d\n", name,
 699                                        hsdev->start_collection_index);
 700                        sd->hid_sensor_client_cnt++;
 701                        if (collection_hsdev)
 702                                collection_hsdev->end_collection_index = i;
 703                        if (collection->type == HID_COLLECTION_APPLICATION &&
 704                            collection->usage == HID_USAGE_SENSOR_COLLECTION)
 705                                collection_hsdev = hsdev;
 706                }
 707        }
 708        if (last_hsdev)
 709                last_hsdev->end_collection_index = i;
 710        if (collection_hsdev)
 711                collection_hsdev->end_collection_index = i;
 712
 713        ret = mfd_add_hotplug_devices(&hdev->dev,
 714                        sd->hid_sensor_hub_client_devs,
 715                        sd->hid_sensor_client_cnt);
 716        if (ret < 0)
 717                goto err_stop_hw;
 718
 719        return ret;
 720
 721err_stop_hw:
 722        hid_hw_stop(hdev);
 723
 724        return ret;
 725}
 726
 727static void sensor_hub_remove(struct hid_device *hdev)
 728{
 729        struct sensor_hub_data *data = hid_get_drvdata(hdev);
 730        unsigned long flags;
 731        int i;
 732
 733        hid_dbg(hdev, " hardware removed\n");
 734        hid_hw_close(hdev);
 735        hid_hw_stop(hdev);
 736        spin_lock_irqsave(&data->lock, flags);
 737        for (i = 0; i < data->hid_sensor_client_cnt; ++i) {
 738                struct hid_sensor_hub_device *hsdev =
 739                        data->hid_sensor_hub_client_devs[i].platform_data;
 740                if (hsdev->pending.status)
 741                        complete(&hsdev->pending.ready);
 742        }
 743        spin_unlock_irqrestore(&data->lock, flags);
 744        mfd_remove_devices(&hdev->dev);
 745        hid_set_drvdata(hdev, NULL);
 746        mutex_destroy(&data->mutex);
 747}
 748
 749static const struct hid_device_id sensor_hub_devices[] = {
 750        { HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, USB_VENDOR_ID_INTEL_0,
 751                        USB_DEVICE_ID_INTEL_HID_SENSOR_0),
 752                        .driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
 753        { HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, USB_VENDOR_ID_INTEL_1,
 754                        USB_DEVICE_ID_INTEL_HID_SENSOR_0),
 755                        .driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
 756        { HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, USB_VENDOR_ID_INTEL_1,
 757                        USB_DEVICE_ID_INTEL_HID_SENSOR_1),
 758                        .driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
 759        { HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, USB_VENDOR_ID_MICROSOFT,
 760                        USB_DEVICE_ID_MS_SURFACE_PRO_2),
 761                        .driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
 762        { HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, USB_VENDOR_ID_MICROSOFT,
 763                        USB_DEVICE_ID_MS_TOUCH_COVER_2),
 764                        .driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
 765        { HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, USB_VENDOR_ID_MICROSOFT,
 766                        USB_DEVICE_ID_MS_TYPE_COVER_2),
 767                        .driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
 768        { HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, USB_VENDOR_ID_STM_0,
 769                        USB_DEVICE_ID_STM_HID_SENSOR),
 770                        .driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
 771        { HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, USB_VENDOR_ID_STM_0,
 772                        USB_DEVICE_ID_STM_HID_SENSOR_1),
 773                        .driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
 774        { HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, USB_VENDOR_ID_TEXAS_INSTRUMENTS,
 775                        USB_DEVICE_ID_TEXAS_INSTRUMENTS_LENOVO_YOGA),
 776                        .driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
 777        { HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, HID_ANY_ID,
 778                     HID_ANY_ID) },
 779        { }
 780};
 781MODULE_DEVICE_TABLE(hid, sensor_hub_devices);
 782
 783static struct hid_driver sensor_hub_driver = {
 784        .name = "hid-sensor-hub",
 785        .id_table = sensor_hub_devices,
 786        .probe = sensor_hub_probe,
 787        .remove = sensor_hub_remove,
 788        .raw_event = sensor_hub_raw_event,
 789        .report_fixup = sensor_hub_report_fixup,
 790#ifdef CONFIG_PM
 791        .suspend = sensor_hub_suspend,
 792        .resume = sensor_hub_resume,
 793        .reset_resume = sensor_hub_reset_resume,
 794#endif
 795};
 796module_hid_driver(sensor_hub_driver);
 797
 798MODULE_DESCRIPTION("HID Sensor Hub driver");
 799MODULE_AUTHOR("Srinivas Pandruvada <srinivas.pandruvada@intel.com>");
 800MODULE_LICENSE("GPL");
 801