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