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