linux/drivers/hid/hid-sensor-hub.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * HID Sensors Driver
   4 * Copyright (c) 2012, Intel Corporation.
   5 */
   6
   7#include <linux/device.h>
   8#include <linux/hid.h>
   9#include <linux/module.h>
  10#include <linux/slab.h>
  11#include <linux/mfd/core.h>
  12#include <linux/list.h>
  13#include <linux/hid-sensor-ids.h>
  14#include <linux/hid-sensor-hub.h>
  15#include "hid-ids.h"
  16
  17#define HID_SENSOR_HUB_ENUM_QUIRK       0x01
  18
  19/**
  20 * struct sensor_hub_data - Hold a instance data for a HID hub device
  21 * @hsdev:              Stored hid instance for current hub device.
  22 * @mutex:              Mutex to serialize synchronous request.
  23 * @lock:               Spin lock to protect pending request structure.
  24 * @dyn_callback_list:  Holds callback function
  25 * @dyn_callback_lock:  spin lock to protect callback list
  26 * @hid_sensor_hub_client_devs: Stores all MFD cells for a hub instance.
  27 * @hid_sensor_client_cnt: Number of MFD cells, (no of sensors attached).
  28 * @ref_cnt:            Number of MFD clients have opened this device
  29 */
  30struct sensor_hub_data {
  31        struct mutex mutex;
  32        spinlock_t lock;
  33        struct list_head dyn_callback_list;
  34        spinlock_t dyn_callback_lock;
  35        struct mfd_cell *hid_sensor_hub_client_devs;
  36        int hid_sensor_client_cnt;
  37        unsigned long quirks;
  38        int ref_cnt;
  39};
  40
  41/**
  42 * struct hid_sensor_hub_callbacks_list - Stores callback list
  43 * @list:               list head.
  44 * @usage_id:           usage id for a physical device.
  45 * @usage_callback:     Stores registered callback functions.
  46 * @priv:               Private data for a physical device.
  47 */
  48struct hid_sensor_hub_callbacks_list {
  49        struct list_head list;
  50        u32 usage_id;
  51        struct hid_sensor_hub_device *hsdev;
  52        struct hid_sensor_hub_callbacks *usage_callback;
  53        void *priv;
  54};
  55
  56static struct hid_report *sensor_hub_report(int id, struct hid_device *hdev,
  57                                                int dir)
  58{
  59        struct hid_report *report;
  60
  61        list_for_each_entry(report, &hdev->report_enum[dir].report_list, list) {
  62                if (report->id == id)
  63                        return report;
  64        }
  65        hid_warn(hdev, "No report with id 0x%x found\n", id);
  66
  67        return NULL;
  68}
  69
  70static int sensor_hub_get_physical_device_count(struct hid_device *hdev)
  71{
  72        int i;
  73        int count = 0;
  74
  75        for (i = 0; i < hdev->maxcollection; ++i) {
  76                struct hid_collection *collection = &hdev->collection[i];
  77                if (collection->type == HID_COLLECTION_PHYSICAL ||
  78                    collection->type == HID_COLLECTION_APPLICATION)
  79                        ++count;
  80        }
  81
  82        return count;
  83}
  84
  85static void sensor_hub_fill_attr_info(
  86                struct hid_sensor_hub_attribute_info *info,
  87                s32 index, s32 report_id, struct hid_field *field)
  88{
  89        info->index = index;
  90        info->report_id = report_id;
  91        info->units = field->unit;
  92        info->unit_expo = field->unit_exponent;
  93        info->size = (field->report_size * field->report_count)/8;
  94        info->logical_minimum = field->logical_minimum;
  95        info->logical_maximum = field->logical_maximum;
  96}
  97
  98static struct hid_sensor_hub_callbacks *sensor_hub_get_callback(
  99                                        struct hid_device *hdev,
 100                                        u32 usage_id,
 101                                        int collection_index,
 102                                        struct hid_sensor_hub_device **hsdev,
 103                                        void **priv)
 104{
 105        struct hid_sensor_hub_callbacks_list *callback;
 106        struct sensor_hub_data *pdata = hid_get_drvdata(hdev);
 107        unsigned long flags;
 108
 109        spin_lock_irqsave(&pdata->dyn_callback_lock, flags);
 110        list_for_each_entry(callback, &pdata->dyn_callback_list, list)
 111                if ((callback->usage_id == usage_id ||
 112                     callback->usage_id == HID_USAGE_SENSOR_COLLECTION) &&
 113                        (collection_index >=
 114                                callback->hsdev->start_collection_index) &&
 115                        (collection_index <
 116                                callback->hsdev->end_collection_index)) {
 117                        *priv = callback->priv;
 118                        *hsdev = callback->hsdev;
 119                        spin_unlock_irqrestore(&pdata->dyn_callback_lock,
 120                                               flags);
 121                        return callback->usage_callback;
 122                }
 123        spin_unlock_irqrestore(&pdata->dyn_callback_lock, flags);
 124
 125        return NULL;
 126}
 127
 128int sensor_hub_register_callback(struct hid_sensor_hub_device *hsdev,
 129                        u32 usage_id,
 130                        struct hid_sensor_hub_callbacks *usage_callback)
 131{
 132        struct hid_sensor_hub_callbacks_list *callback;
 133        struct sensor_hub_data *pdata = hid_get_drvdata(hsdev->hdev);
 134        unsigned long flags;
 135
 136        spin_lock_irqsave(&pdata->dyn_callback_lock, flags);
 137        list_for_each_entry(callback, &pdata->dyn_callback_list, list)
 138                if (callback->usage_id == usage_id &&
 139                                                callback->hsdev == hsdev) {
 140                        spin_unlock_irqrestore(&pdata->dyn_callback_lock, flags);
 141                        return -EINVAL;
 142                }
 143        callback = kzalloc(sizeof(*callback), GFP_ATOMIC);
 144        if (!callback) {
 145                spin_unlock_irqrestore(&pdata->dyn_callback_lock, flags);
 146                return -ENOMEM;
 147        }
 148        callback->hsdev = hsdev;
 149        callback->usage_callback = usage_callback;
 150        callback->usage_id = usage_id;
 151        callback->priv = NULL;
 152        /*
 153         * If there is a handler registered for the collection type, then
 154         * it will handle all reports for sensors in this collection. If
 155         * there is also an individual sensor handler registration, then
 156         * we want to make sure that the reports are directed to collection
 157         * handler, as this may be a fusion sensor. So add collection handlers
 158         * to the beginning of the list, so that they are matched first.
 159         */
 160        if (usage_id == HID_USAGE_SENSOR_COLLECTION)
 161                list_add(&callback->list, &pdata->dyn_callback_list);
 162        else
 163                list_add_tail(&callback->list, &pdata->dyn_callback_list);
 164        spin_unlock_irqrestore(&pdata->dyn_callback_lock, flags);
 165
 166        return 0;
 167}
 168EXPORT_SYMBOL_GPL(sensor_hub_register_callback);
 169
 170int sensor_hub_remove_callback(struct hid_sensor_hub_device *hsdev,
 171                                u32 usage_id)
 172{
 173        struct hid_sensor_hub_callbacks_list *callback;
 174        struct sensor_hub_data *pdata = hid_get_drvdata(hsdev->hdev);
 175        unsigned long flags;
 176
 177        spin_lock_irqsave(&pdata->dyn_callback_lock, flags);
 178        list_for_each_entry(callback, &pdata->dyn_callback_list, list)
 179                if (callback->usage_id == usage_id &&
 180                                                callback->hsdev == hsdev) {
 181                        list_del(&callback->list);
 182                        kfree(callback);
 183                        break;
 184                }
 185        spin_unlock_irqrestore(&pdata->dyn_callback_lock, flags);
 186
 187        return 0;
 188}
 189EXPORT_SYMBOL_GPL(sensor_hub_remove_callback);
 190
 191int sensor_hub_set_feature(struct hid_sensor_hub_device *hsdev, u32 report_id,
 192                           u32 field_index, int buffer_size, void *buffer)
 193{
 194        struct hid_report *report;
 195        struct sensor_hub_data *data = hid_get_drvdata(hsdev->hdev);
 196        __s32 *buf32 = buffer;
 197        int i = 0;
 198        int remaining_bytes;
 199        __s32 value;
 200        int ret = 0;
 201
 202        mutex_lock(&data->mutex);
 203        report = sensor_hub_report(report_id, hsdev->hdev, HID_FEATURE_REPORT);
 204        if (!report || (field_index >= report->maxfield)) {
 205                ret = -EINVAL;
 206                goto done_proc;
 207        }
 208
 209        remaining_bytes = buffer_size % sizeof(__s32);
 210        buffer_size = buffer_size / sizeof(__s32);
 211        if (buffer_size) {
 212                for (i = 0; i < buffer_size; ++i) {
 213                        hid_set_field(report->field[field_index], i,
 214                                      (__force __s32)cpu_to_le32(*buf32));
 215                        ++buf32;
 216                }
 217        }
 218        if (remaining_bytes) {
 219                value = 0;
 220                memcpy(&value, (u8 *)buf32, remaining_bytes);
 221                hid_set_field(report->field[field_index], i,
 222                              (__force __s32)cpu_to_le32(value));
 223        }
 224        hid_hw_request(hsdev->hdev, report, HID_REQ_SET_REPORT);
 225        hid_hw_wait(hsdev->hdev);
 226
 227done_proc:
 228        mutex_unlock(&data->mutex);
 229
 230        return ret;
 231}
 232EXPORT_SYMBOL_GPL(sensor_hub_set_feature);
 233
 234int sensor_hub_get_feature(struct hid_sensor_hub_device *hsdev, u32 report_id,
 235                           u32 field_index, int buffer_size, void *buffer)
 236{
 237        struct hid_report *report;
 238        struct sensor_hub_data *data = hid_get_drvdata(hsdev->hdev);
 239        int report_size;
 240        int ret = 0;
 241        u8 *val_ptr;
 242        int buffer_index = 0;
 243        int i;
 244
 245        memset(buffer, 0, buffer_size);
 246
 247        mutex_lock(&data->mutex);
 248        report = sensor_hub_report(report_id, hsdev->hdev, HID_FEATURE_REPORT);
 249        if (!report || (field_index >= report->maxfield) ||
 250            report->field[field_index]->report_count < 1) {
 251                ret = -EINVAL;
 252                goto done_proc;
 253        }
 254        hid_hw_request(hsdev->hdev, report, HID_REQ_GET_REPORT);
 255        hid_hw_wait(hsdev->hdev);
 256
 257        /* calculate number of bytes required to read this field */
 258        report_size = DIV_ROUND_UP(report->field[field_index]->report_size,
 259                                   8) *
 260                                   report->field[field_index]->report_count;
 261        if (!report_size) {
 262                ret = -EINVAL;
 263                goto done_proc;
 264        }
 265        ret = min(report_size, buffer_size);
 266
 267        val_ptr = (u8 *)report->field[field_index]->value;
 268        for (i = 0; i < report->field[field_index]->report_count; ++i) {
 269                if (buffer_index >= ret)
 270                        break;
 271
 272                memcpy(&((u8 *)buffer)[buffer_index], val_ptr,
 273                       report->field[field_index]->report_size / 8);
 274                val_ptr += sizeof(__s32);
 275                buffer_index += (report->field[field_index]->report_size / 8);
 276        }
 277
 278done_proc:
 279        mutex_unlock(&data->mutex);
 280
 281        return ret;
 282}
 283EXPORT_SYMBOL_GPL(sensor_hub_get_feature);
 284
 285
 286int sensor_hub_input_attr_get_raw_value(struct hid_sensor_hub_device *hsdev,
 287                                        u32 usage_id,
 288                                        u32 attr_usage_id, u32 report_id,
 289                                        enum sensor_hub_read_flags flag,
 290                                        bool is_signed)
 291{
 292        struct sensor_hub_data *data = hid_get_drvdata(hsdev->hdev);
 293        unsigned long flags;
 294        struct hid_report *report;
 295        int ret_val = 0;
 296
 297        report = sensor_hub_report(report_id, hsdev->hdev,
 298                                   HID_INPUT_REPORT);
 299        if (!report)
 300                return -EINVAL;
 301
 302        mutex_lock(hsdev->mutex_ptr);
 303        if (flag == SENSOR_HUB_SYNC) {
 304                memset(&hsdev->pending, 0, sizeof(hsdev->pending));
 305                init_completion(&hsdev->pending.ready);
 306                hsdev->pending.usage_id = usage_id;
 307                hsdev->pending.attr_usage_id = attr_usage_id;
 308                hsdev->pending.raw_size = 0;
 309
 310                spin_lock_irqsave(&data->lock, flags);
 311                hsdev->pending.status = true;
 312                spin_unlock_irqrestore(&data->lock, flags);
 313        }
 314        mutex_lock(&data->mutex);
 315        hid_hw_request(hsdev->hdev, report, HID_REQ_GET_REPORT);
 316        mutex_unlock(&data->mutex);
 317        if (flag == SENSOR_HUB_SYNC) {
 318                wait_for_completion_interruptible_timeout(
 319                                                &hsdev->pending.ready, HZ*5);
 320                switch (hsdev->pending.raw_size) {
 321                case 1:
 322                        if (is_signed)
 323                                ret_val = *(s8 *)hsdev->pending.raw_data;
 324                        else
 325                                ret_val = *(u8 *)hsdev->pending.raw_data;
 326                        break;
 327                case 2:
 328                        if (is_signed)
 329                                ret_val = *(s16 *)hsdev->pending.raw_data;
 330                        else
 331                                ret_val = *(u16 *)hsdev->pending.raw_data;
 332                        break;
 333                case 4:
 334                        ret_val = *(u32 *)hsdev->pending.raw_data;
 335                        break;
 336                default:
 337                        ret_val = 0;
 338                }
 339                kfree(hsdev->pending.raw_data);
 340                hsdev->pending.status = false;
 341        }
 342        mutex_unlock(hsdev->mutex_ptr);
 343
 344        return ret_val;
 345}
 346EXPORT_SYMBOL_GPL(sensor_hub_input_attr_get_raw_value);
 347
 348int hid_sensor_get_usage_index(struct hid_sensor_hub_device *hsdev,
 349                                u32 report_id, int field_index, u32 usage_id)
 350{
 351        struct hid_report *report;
 352        struct hid_field *field;
 353        int i;
 354
 355        report = sensor_hub_report(report_id, hsdev->hdev, HID_FEATURE_REPORT);
 356        if (!report || (field_index >= report->maxfield))
 357                goto done_proc;
 358
 359        field = report->field[field_index];
 360        for (i = 0; i < field->maxusage; ++i) {
 361                if (field->usage[i].hid == usage_id)
 362                        return field->usage[i].usage_index;
 363        }
 364
 365done_proc:
 366        return -EINVAL;
 367}
 368EXPORT_SYMBOL_GPL(hid_sensor_get_usage_index);
 369
 370int sensor_hub_input_get_attribute_info(struct hid_sensor_hub_device *hsdev,
 371                                u8 type,
 372                                u32 usage_id,
 373                                u32 attr_usage_id,
 374                                struct hid_sensor_hub_attribute_info *info)
 375{
 376        int ret = -1;
 377        int i;
 378        struct hid_report *report;
 379        struct hid_field *field;
 380        struct hid_report_enum *report_enum;
 381        struct hid_device *hdev = hsdev->hdev;
 382
 383        /* Initialize with defaults */
 384        info->usage_id = usage_id;
 385        info->attrib_id = attr_usage_id;
 386        info->report_id = -1;
 387        info->index = -1;
 388        info->units = -1;
 389        info->unit_expo = -1;
 390
 391        report_enum = &hdev->report_enum[type];
 392        list_for_each_entry(report, &report_enum->report_list, list) {
 393                for (i = 0; i < report->maxfield; ++i) {
 394                        field = report->field[i];
 395                        if (field->maxusage) {
 396                                if (field->physical == usage_id &&
 397                                        (field->logical == attr_usage_id ||
 398                                        field->usage[0].hid ==
 399                                                        attr_usage_id) &&
 400                                        (field->usage[0].collection_index >=
 401                                        hsdev->start_collection_index) &&
 402                                        (field->usage[0].collection_index <
 403                                        hsdev->end_collection_index)) {
 404
 405                                        sensor_hub_fill_attr_info(info, i,
 406                                                                report->id,
 407                                                                field);
 408                                        ret = 0;
 409                                        break;
 410                                }
 411                        }
 412                }
 413
 414        }
 415
 416        return ret;
 417}
 418EXPORT_SYMBOL_GPL(sensor_hub_input_get_attribute_info);
 419
 420#ifdef CONFIG_PM
 421static int sensor_hub_suspend(struct hid_device *hdev, pm_message_t message)
 422{
 423        struct sensor_hub_data *pdata = hid_get_drvdata(hdev);
 424        struct hid_sensor_hub_callbacks_list *callback;
 425        unsigned long flags;
 426
 427        hid_dbg(hdev, " sensor_hub_suspend\n");
 428        spin_lock_irqsave(&pdata->dyn_callback_lock, flags);
 429        list_for_each_entry(callback, &pdata->dyn_callback_list, list) {
 430                if (callback->usage_callback->suspend)
 431                        callback->usage_callback->suspend(
 432                                        callback->hsdev, callback->priv);
 433        }
 434        spin_unlock_irqrestore(&pdata->dyn_callback_lock, flags);
 435
 436        return 0;
 437}
 438
 439static int sensor_hub_resume(struct hid_device *hdev)
 440{
 441        struct sensor_hub_data *pdata = hid_get_drvdata(hdev);
 442        struct hid_sensor_hub_callbacks_list *callback;
 443        unsigned long flags;
 444
 445        hid_dbg(hdev, " sensor_hub_resume\n");
 446        spin_lock_irqsave(&pdata->dyn_callback_lock, flags);
 447        list_for_each_entry(callback, &pdata->dyn_callback_list, list) {
 448                if (callback->usage_callback->resume)
 449                        callback->usage_callback->resume(
 450                                        callback->hsdev, callback->priv);
 451        }
 452        spin_unlock_irqrestore(&pdata->dyn_callback_lock, flags);
 453
 454        return 0;
 455}
 456
 457static int sensor_hub_reset_resume(struct hid_device *hdev)
 458{
 459        return 0;
 460}
 461#endif
 462
 463/*
 464 * Handle raw report as sent by device
 465 */
 466static int sensor_hub_raw_event(struct hid_device *hdev,
 467                struct hid_report *report, u8 *raw_data, int size)
 468{
 469        int i;
 470        u8 *ptr;
 471        int sz;
 472        struct sensor_hub_data *pdata = hid_get_drvdata(hdev);
 473        unsigned long flags;
 474        struct hid_sensor_hub_callbacks *callback = NULL;
 475        struct hid_collection *collection = NULL;
 476        void *priv = NULL;
 477        struct hid_sensor_hub_device *hsdev = NULL;
 478
 479        hid_dbg(hdev, "sensor_hub_raw_event report id:0x%x size:%d type:%d\n",
 480                         report->id, size, report->type);
 481        hid_dbg(hdev, "maxfield:%d\n", report->maxfield);
 482        if (report->type != HID_INPUT_REPORT)
 483                return 1;
 484
 485        ptr = raw_data;
 486        ptr++; /* Skip report id */
 487
 488        spin_lock_irqsave(&pdata->lock, flags);
 489
 490        for (i = 0; i < report->maxfield; ++i) {
 491                hid_dbg(hdev, "%d collection_index:%x hid:%x sz:%x\n",
 492                                i, report->field[i]->usage->collection_index,
 493                                report->field[i]->usage->hid,
 494                                (report->field[i]->report_size *
 495                                        report->field[i]->report_count)/8);
 496                sz = (report->field[i]->report_size *
 497                                        report->field[i]->report_count)/8;
 498                collection = &hdev->collection[
 499                                report->field[i]->usage->collection_index];
 500                hid_dbg(hdev, "collection->usage %x\n",
 501                                        collection->usage);
 502
 503                callback = sensor_hub_get_callback(hdev,
 504                                report->field[i]->physical,
 505                                report->field[i]->usage[0].collection_index,
 506                                &hsdev, &priv);
 507                if (!callback) {
 508                        ptr += sz;
 509                        continue;
 510                }
 511                if (hsdev->pending.status && (hsdev->pending.attr_usage_id ==
 512                                              report->field[i]->usage->hid ||
 513                                              hsdev->pending.attr_usage_id ==
 514                                              report->field[i]->logical)) {
 515                        hid_dbg(hdev, "data was pending ...\n");
 516                        hsdev->pending.raw_data = kmemdup(ptr, sz, GFP_ATOMIC);
 517                        if (hsdev->pending.raw_data)
 518                                hsdev->pending.raw_size = sz;
 519                        else
 520                                hsdev->pending.raw_size = 0;
 521                        complete(&hsdev->pending.ready);
 522                }
 523                if (callback->capture_sample) {
 524                        if (report->field[i]->logical)
 525                                callback->capture_sample(hsdev,
 526                                        report->field[i]->logical, sz, ptr,
 527                                        callback->pdev);
 528                        else
 529                                callback->capture_sample(hsdev,
 530                                        report->field[i]->usage->hid, sz, ptr,
 531                                        callback->pdev);
 532                }
 533                ptr += sz;
 534        }
 535        if (callback && collection && callback->send_event)
 536                callback->send_event(hsdev, collection->usage,
 537                                callback->pdev);
 538        spin_unlock_irqrestore(&pdata->lock, flags);
 539
 540        return 1;
 541}
 542
 543int sensor_hub_device_open(struct hid_sensor_hub_device *hsdev)
 544{
 545        int ret = 0;
 546        struct sensor_hub_data *data =  hid_get_drvdata(hsdev->hdev);
 547
 548        mutex_lock(&data->mutex);
 549        if (!data->ref_cnt) {
 550                ret = hid_hw_open(hsdev->hdev);
 551                if (ret) {
 552                        hid_err(hsdev->hdev, "failed to open hid device\n");
 553                        mutex_unlock(&data->mutex);
 554                        return ret;
 555                }
 556        }
 557        data->ref_cnt++;
 558        mutex_unlock(&data->mutex);
 559
 560        return ret;
 561}
 562EXPORT_SYMBOL_GPL(sensor_hub_device_open);
 563
 564void sensor_hub_device_close(struct hid_sensor_hub_device *hsdev)
 565{
 566        struct sensor_hub_data *data =  hid_get_drvdata(hsdev->hdev);
 567
 568        mutex_lock(&data->mutex);
 569        data->ref_cnt--;
 570        if (!data->ref_cnt)
 571                hid_hw_close(hsdev->hdev);
 572        mutex_unlock(&data->mutex);
 573}
 574EXPORT_SYMBOL_GPL(sensor_hub_device_close);
 575
 576static __u8 *sensor_hub_report_fixup(struct hid_device *hdev, __u8 *rdesc,
 577                unsigned int *rsize)
 578{
 579        /*
 580         * Checks if the report descriptor of Thinkpad Helix 2 has a logical
 581         * minimum for magnetic flux axis greater than the maximum.
 582         */
 583        if (hdev->product == USB_DEVICE_ID_TEXAS_INSTRUMENTS_LENOVO_YOGA &&
 584                *rsize == 2558 && rdesc[913] == 0x17 && rdesc[914] == 0x40 &&
 585                rdesc[915] == 0x81 && rdesc[916] == 0x08 &&
 586                rdesc[917] == 0x00 && rdesc[918] == 0x27 &&
 587                rdesc[921] == 0x07 && rdesc[922] == 0x00) {
 588                /* Sets negative logical minimum for mag x, y and z */
 589                rdesc[914] = rdesc[935] = rdesc[956] = 0xc0;
 590                rdesc[915] = rdesc[936] = rdesc[957] = 0x7e;
 591                rdesc[916] = rdesc[937] = rdesc[958] = 0xf7;
 592                rdesc[917] = rdesc[938] = rdesc[959] = 0xff;
 593        }
 594
 595        return rdesc;
 596}
 597
 598static int sensor_hub_probe(struct hid_device *hdev,
 599                                const struct hid_device_id *id)
 600{
 601        int ret;
 602        struct sensor_hub_data *sd;
 603        int i;
 604        char *name;
 605        int dev_cnt;
 606        struct hid_sensor_hub_device *hsdev;
 607        struct hid_sensor_hub_device *last_hsdev = NULL;
 608        struct hid_sensor_hub_device *collection_hsdev = NULL;
 609
 610        sd = devm_kzalloc(&hdev->dev, sizeof(*sd), GFP_KERNEL);
 611        if (!sd) {
 612                hid_err(hdev, "cannot allocate Sensor data\n");
 613                return -ENOMEM;
 614        }
 615
 616        hid_set_drvdata(hdev, sd);
 617        sd->quirks = id->driver_data;
 618
 619        spin_lock_init(&sd->lock);
 620        spin_lock_init(&sd->dyn_callback_lock);
 621        mutex_init(&sd->mutex);
 622        ret = hid_parse(hdev);
 623        if (ret) {
 624                hid_err(hdev, "parse failed\n");
 625                return ret;
 626        }
 627        INIT_LIST_HEAD(&hdev->inputs);
 628
 629        ret = hid_hw_start(hdev, 0);
 630        if (ret) {
 631                hid_err(hdev, "hw start failed\n");
 632                return ret;
 633        }
 634        INIT_LIST_HEAD(&sd->dyn_callback_list);
 635        sd->hid_sensor_client_cnt = 0;
 636
 637        dev_cnt = sensor_hub_get_physical_device_count(hdev);
 638        if (dev_cnt > HID_MAX_PHY_DEVICES) {
 639                hid_err(hdev, "Invalid Physical device count\n");
 640                ret = -EINVAL;
 641                goto err_stop_hw;
 642        }
 643        sd->hid_sensor_hub_client_devs = devm_kcalloc(&hdev->dev,
 644                                                      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, HID_ANY_ID,
 751                     HID_ANY_ID) },
 752        { }
 753};
 754MODULE_DEVICE_TABLE(hid, sensor_hub_devices);
 755
 756static struct hid_driver sensor_hub_driver = {
 757        .name = "hid-sensor-hub",
 758        .id_table = sensor_hub_devices,
 759        .probe = sensor_hub_probe,
 760        .remove = sensor_hub_remove,
 761        .raw_event = sensor_hub_raw_event,
 762        .report_fixup = sensor_hub_report_fixup,
 763#ifdef CONFIG_PM
 764        .suspend = sensor_hub_suspend,
 765        .resume = sensor_hub_resume,
 766        .reset_resume = sensor_hub_reset_resume,
 767#endif
 768};
 769module_hid_driver(sensor_hub_driver);
 770
 771MODULE_DESCRIPTION("HID Sensor Hub driver");
 772MODULE_AUTHOR("Srinivas Pandruvada <srinivas.pandruvada@intel.com>");
 773MODULE_LICENSE("GPL");
 774