hid-sensor-hub.c 20.8 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
/*
 * HID Sensors Driver
 * Copyright (c) 2012, Intel Corporation.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms and conditions of the GNU General Public License,
 * version 2, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
 *
 */
#include <linux/device.h>
#include <linux/hid.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/mfd/core.h>
#include <linux/list.h>
#include <linux/hid-sensor-ids.h>
#include <linux/hid-sensor-hub.h>
#include "hid-ids.h"

29 30
#define HID_SENSOR_HUB_ENUM_QUIRK	0x01

31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
/**
 * struct sensor_hub_pending - Synchronous read pending information
 * @status:		Pending status true/false.
 * @ready:		Completion synchronization data.
 * @usage_id:		Usage id for physical device, E.g. Gyro usage id.
 * @attr_usage_id:	Usage Id of a field, E.g. X-AXIS for a gyro.
 * @raw_size:		Response size for a read request.
 * @raw_data:		Place holder for received response.
 */
struct sensor_hub_pending {
	bool status;
	struct completion ready;
	u32 usage_id;
	u32 attr_usage_id;
	int raw_size;
	u8  *raw_data;
};

/**
 * struct sensor_hub_data - Hold a instance data for a HID hub device
 * @hsdev:		Stored hid instance for current hub device.
 * @mutex:		Mutex to serialize synchronous request.
 * @lock:		Spin lock to protect pending request structure.
 * @pending:		Holds information of pending sync read request.
 * @dyn_callback_list:	Holds callback function
 * @dyn_callback_lock:	spin lock to protect callback list
 * @hid_sensor_hub_client_devs:	Stores all MFD cells for a hub instance.
 * @hid_sensor_client_cnt: Number of MFD cells, (no of sensors attached).
59
 * @ref_cnt:		Number of MFD clients have opened this device
60 61 62 63 64 65 66 67 68
 */
struct sensor_hub_data {
	struct mutex mutex;
	spinlock_t lock;
	struct sensor_hub_pending pending;
	struct list_head dyn_callback_list;
	spinlock_t dyn_callback_lock;
	struct mfd_cell *hid_sensor_hub_client_devs;
	int hid_sensor_client_cnt;
69
	unsigned long quirks;
70
	int ref_cnt;
71 72 73 74 75 76 77 78 79 80 81 82
};

/**
 * struct hid_sensor_hub_callbacks_list - Stores callback list
 * @list:		list head.
 * @usage_id:		usage id for a physical device.
 * @usage_callback:	Stores registered callback functions.
 * @priv:		Private data for a physical device.
 */
struct hid_sensor_hub_callbacks_list {
	struct list_head list;
	u32 usage_id;
83
	struct hid_sensor_hub_device *hsdev;
84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
	struct hid_sensor_hub_callbacks *usage_callback;
	void *priv;
};

static struct hid_report *sensor_hub_report(int id, struct hid_device *hdev,
						int dir)
{
	struct hid_report *report;

	list_for_each_entry(report, &hdev->report_enum[dir].report_list, list) {
		if (report->id == id)
			return report;
	}
	hid_warn(hdev, "No report with id 0x%x found\n", id);

	return NULL;
}

102
static int sensor_hub_get_physical_device_count(struct hid_device *hdev)
103
{
104 105
	int i;
	int count = 0;
106

107 108 109 110
	for (i = 0; i < hdev->maxcollection; ++i) {
		struct hid_collection *collection = &hdev->collection[i];
		if (collection->type == HID_COLLECTION_PHYSICAL)
			++count;
111 112
	}

113
	return count;
114 115 116 117
}

static void sensor_hub_fill_attr_info(
		struct hid_sensor_hub_attribute_info *info,
118
		s32 index, s32 report_id, struct hid_field *field)
119 120 121
{
	info->index = index;
	info->report_id = report_id;
122 123 124 125 126
	info->units = field->unit;
	info->unit_expo = field->unit_exponent;
	info->size = (field->report_size * field->report_count)/8;
	info->logical_minimum = field->logical_minimum;
	info->logical_maximum = field->logical_maximum;
127 128 129 130
}

static struct hid_sensor_hub_callbacks *sensor_hub_get_callback(
					struct hid_device *hdev,
131 132 133 134
					u32 usage_id,
					int collection_index,
					struct hid_sensor_hub_device **hsdev,
					void **priv)
135 136 137 138 139 140
{
	struct hid_sensor_hub_callbacks_list *callback;
	struct sensor_hub_data *pdata = hid_get_drvdata(hdev);

	spin_lock(&pdata->dyn_callback_lock);
	list_for_each_entry(callback, &pdata->dyn_callback_list, list)
141 142 143 144 145
		if (callback->usage_id == usage_id &&
			(collection_index >=
				callback->hsdev->start_collection_index) &&
			(collection_index <
				callback->hsdev->end_collection_index)) {
146
			*priv = callback->priv;
147
			*hsdev = callback->hsdev;
148 149 150 151 152 153 154 155 156 157 158 159 160 161
			spin_unlock(&pdata->dyn_callback_lock);
			return callback->usage_callback;
		}
	spin_unlock(&pdata->dyn_callback_lock);

	return NULL;
}

int sensor_hub_register_callback(struct hid_sensor_hub_device *hsdev,
			u32 usage_id,
			struct hid_sensor_hub_callbacks *usage_callback)
{
	struct hid_sensor_hub_callbacks_list *callback;
	struct sensor_hub_data *pdata = hid_get_drvdata(hsdev->hdev);
162
	unsigned long flags;
163

164
	spin_lock_irqsave(&pdata->dyn_callback_lock, flags);
165
	list_for_each_entry(callback, &pdata->dyn_callback_list, list)
166 167
		if (callback->usage_id == usage_id &&
						callback->hsdev == hsdev) {
168
			spin_unlock_irqrestore(&pdata->dyn_callback_lock, flags);
169 170
			return -EINVAL;
		}
171
	callback = kzalloc(sizeof(*callback), GFP_ATOMIC);
172
	if (!callback) {
173
		spin_unlock_irqrestore(&pdata->dyn_callback_lock, flags);
174 175
		return -ENOMEM;
	}
176
	callback->hsdev = hsdev;
177 178 179 180
	callback->usage_callback = usage_callback;
	callback->usage_id = usage_id;
	callback->priv = NULL;
	list_add_tail(&callback->list, &pdata->dyn_callback_list);
181
	spin_unlock_irqrestore(&pdata->dyn_callback_lock, flags);
182 183 184 185 186 187 188 189 190 191

	return 0;
}
EXPORT_SYMBOL_GPL(sensor_hub_register_callback);

int sensor_hub_remove_callback(struct hid_sensor_hub_device *hsdev,
				u32 usage_id)
{
	struct hid_sensor_hub_callbacks_list *callback;
	struct sensor_hub_data *pdata = hid_get_drvdata(hsdev->hdev);
192
	unsigned long flags;
193

194
	spin_lock_irqsave(&pdata->dyn_callback_lock, flags);
195
	list_for_each_entry(callback, &pdata->dyn_callback_list, list)
196 197
		if (callback->usage_id == usage_id &&
						callback->hsdev == hsdev) {
198 199 200 201
			list_del(&callback->list);
			kfree(callback);
			break;
		}
202
	spin_unlock_irqrestore(&pdata->dyn_callback_lock, flags);
203 204 205 206 207 208 209 210 211

	return 0;
}
EXPORT_SYMBOL_GPL(sensor_hub_remove_callback);

int sensor_hub_set_feature(struct hid_sensor_hub_device *hsdev, u32 report_id,
				u32 field_index, s32 value)
{
	struct hid_report *report;
212
	struct sensor_hub_data *data = hid_get_drvdata(hsdev->hdev);
213 214 215 216
	int ret = 0;

	mutex_lock(&data->mutex);
	report = sensor_hub_report(report_id, hsdev->hdev, HID_FEATURE_REPORT);
217
	if (!report || (field_index >= report->maxfield)) {
218 219 220 221
		ret = -EINVAL;
		goto done_proc;
	}
	hid_set_field(report->field[field_index], 0, value);
222
	hid_hw_request(hsdev->hdev, report, HID_REQ_SET_REPORT);
223
	hid_hw_wait(hsdev->hdev);
224 225 226 227 228 229 230 231 232 233 234 235

done_proc:
	mutex_unlock(&data->mutex);

	return ret;
}
EXPORT_SYMBOL_GPL(sensor_hub_set_feature);

int sensor_hub_get_feature(struct hid_sensor_hub_device *hsdev, u32 report_id,
				u32 field_index, s32 *value)
{
	struct hid_report *report;
236
	struct sensor_hub_data *data = hid_get_drvdata(hsdev->hdev);
237 238 239 240
	int ret = 0;

	mutex_lock(&data->mutex);
	report = sensor_hub_report(report_id, hsdev->hdev, HID_FEATURE_REPORT);
241
	if (!report || (field_index >= report->maxfield) ||
242
	    report->field[field_index]->report_count < 1) {
243 244 245
		ret = -EINVAL;
		goto done_proc;
	}
246
	hid_hw_request(hsdev->hdev, report, HID_REQ_GET_REPORT);
247
	hid_hw_wait(hsdev->hdev);
248 249 250 251 252 253 254 255 256 257 258 259 260 261
	*value = report->field[field_index]->value[0];

done_proc:
	mutex_unlock(&data->mutex);

	return ret;
}
EXPORT_SYMBOL_GPL(sensor_hub_get_feature);


int sensor_hub_input_attr_get_raw_value(struct hid_sensor_hub_device *hsdev,
					u32 usage_id,
					u32 attr_usage_id, u32 report_id)
{
262
	struct sensor_hub_data *data = hid_get_drvdata(hsdev->hdev);
263 264 265 266 267 268 269 270 271 272 273 274 275
	unsigned long flags;
	struct hid_report *report;
	int ret_val = 0;

	mutex_lock(&data->mutex);
	memset(&data->pending, 0, sizeof(data->pending));
	init_completion(&data->pending.ready);
	data->pending.usage_id = usage_id;
	data->pending.attr_usage_id = attr_usage_id;
	data->pending.raw_size = 0;

	spin_lock_irqsave(&data->lock, flags);
	data->pending.status = true;
276
	spin_unlock_irqrestore(&data->lock, flags);
277
	report = sensor_hub_report(report_id, hsdev->hdev, HID_INPUT_REPORT);
278
	if (!report)
279
		goto err_free;
280

281
	hid_hw_request(hsdev->hdev, report, HID_REQ_GET_REPORT);
282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305
	wait_for_completion_interruptible_timeout(&data->pending.ready, HZ*5);
	switch (data->pending.raw_size) {
	case 1:
		ret_val = *(u8 *)data->pending.raw_data;
		break;
	case 2:
		ret_val = *(u16 *)data->pending.raw_data;
		break;
	case 4:
		ret_val = *(u32 *)data->pending.raw_data;
		break;
	default:
		ret_val = 0;
	}
	kfree(data->pending.raw_data);

err_free:
	data->pending.status = false;
	mutex_unlock(&data->mutex);

	return ret_val;
}
EXPORT_SYMBOL_GPL(sensor_hub_input_attr_get_raw_value);

306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327
int hid_sensor_get_usage_index(struct hid_sensor_hub_device *hsdev,
				u32 report_id, int field_index, u32 usage_id)
{
	struct hid_report *report;
	struct hid_field *field;
	int i;

	report = sensor_hub_report(report_id, hsdev->hdev, HID_FEATURE_REPORT);
	if (!report || (field_index >= report->maxfield))
		goto done_proc;

	field = report->field[field_index];
	for (i = 0; i < field->maxusage; ++i) {
		if (field->usage[i].hid == usage_id)
			return field->usage[i].usage_index;
	}

done_proc:
	return -EINVAL;
}
EXPORT_SYMBOL_GPL(hid_sensor_get_usage_index);

328 329 330 331 332 333 334
int sensor_hub_input_get_attribute_info(struct hid_sensor_hub_device *hsdev,
				u8 type,
				u32 usage_id,
				u32 attr_usage_id,
				struct hid_sensor_hub_attribute_info *info)
{
	int ret = -1;
335
	int i;
336 337 338 339 340 341 342
	struct hid_report *report;
	struct hid_field *field;
	struct hid_report_enum *report_enum;
	struct hid_device *hdev = hsdev->hdev;

	/* Initialize with defaults */
	info->usage_id = usage_id;
343
	info->attrib_id = attr_usage_id;
344 345 346 347 348 349 350 351 352
	info->report_id = -1;
	info->index = -1;
	info->units = -1;
	info->unit_expo = -1;

	report_enum = &hdev->report_enum[type];
	list_for_each_entry(report, &report_enum->report_list, list) {
		for (i = 0; i < report->maxfield; ++i) {
			field = report->field[i];
353 354 355 356 357 358 359 360 361 362 363 364 365 366 367
			if (field->maxusage) {
				if (field->physical == usage_id &&
					(field->logical == attr_usage_id ||
					field->usage[0].hid ==
							attr_usage_id) &&
					(field->usage[0].collection_index >=
					hsdev->start_collection_index) &&
					(field->usage[0].collection_index <
					hsdev->end_collection_index)) {

					sensor_hub_fill_attr_info(info, i,
								report->id,
								field);
					ret = 0;
					break;
368 369 370
				}
			}
		}
371

372 373 374 375 376 377 378 379 380
	}

	return ret;
}
EXPORT_SYMBOL_GPL(sensor_hub_input_get_attribute_info);

#ifdef CONFIG_PM
static int sensor_hub_suspend(struct hid_device *hdev, pm_message_t message)
{
381
	struct sensor_hub_data *pdata = hid_get_drvdata(hdev);
382
	struct hid_sensor_hub_callbacks_list *callback;
383
	unsigned long flags;
384 385

	hid_dbg(hdev, " sensor_hub_suspend\n");
386
	spin_lock_irqsave(&pdata->dyn_callback_lock, flags);
387 388 389
	list_for_each_entry(callback, &pdata->dyn_callback_list, list) {
		if (callback->usage_callback->suspend)
			callback->usage_callback->suspend(
390
					callback->hsdev, callback->priv);
391
	}
392
	spin_unlock_irqrestore(&pdata->dyn_callback_lock, flags);
393 394 395 396 397 398

	return 0;
}

static int sensor_hub_resume(struct hid_device *hdev)
{
399
	struct sensor_hub_data *pdata = hid_get_drvdata(hdev);
400
	struct hid_sensor_hub_callbacks_list *callback;
401
	unsigned long flags;
402 403

	hid_dbg(hdev, " sensor_hub_resume\n");
404
	spin_lock_irqsave(&pdata->dyn_callback_lock, flags);
405 406 407
	list_for_each_entry(callback, &pdata->dyn_callback_list, list) {
		if (callback->usage_callback->resume)
			callback->usage_callback->resume(
408
					callback->hsdev, callback->priv);
409
	}
410
	spin_unlock_irqrestore(&pdata->dyn_callback_lock, flags);
411 412 413 414 415 416 417 418 419

	return 0;
}

static int sensor_hub_reset_resume(struct hid_device *hdev)
{
	return 0;
}
#endif
420

421 422 423 424 425 426 427 428 429 430 431 432 433 434
/*
 * Handle raw report as sent by device
 */
static int sensor_hub_raw_event(struct hid_device *hdev,
		struct hid_report *report, u8 *raw_data, int size)
{
	int i;
	u8 *ptr;
	int sz;
	struct sensor_hub_data *pdata = hid_get_drvdata(hdev);
	unsigned long flags;
	struct hid_sensor_hub_callbacks *callback = NULL;
	struct hid_collection *collection = NULL;
	void *priv = NULL;
435
	struct hid_sensor_hub_device *hsdev = NULL;
436 437 438 439 440 441 442 443

	hid_dbg(hdev, "sensor_hub_raw_event report id:0x%x size:%d type:%d\n",
			 report->id, size, report->type);
	hid_dbg(hdev, "maxfield:%d\n", report->maxfield);
	if (report->type != HID_INPUT_REPORT)
		return 1;

	ptr = raw_data;
444
	ptr++; /* Skip report id */
445 446 447 448 449 450 451

	spin_lock_irqsave(&pdata->lock, flags);

	for (i = 0; i < report->maxfield; ++i) {
		hid_dbg(hdev, "%d collection_index:%x hid:%x sz:%x\n",
				i, report->field[i]->usage->collection_index,
				report->field[i]->usage->hid,
452 453 454 455
				(report->field[i]->report_size *
					report->field[i]->report_count)/8);
		sz = (report->field[i]->report_size *
					report->field[i]->report_count)/8;
456 457 458
		if (pdata->pending.status && pdata->pending.attr_usage_id ==
				report->field[i]->usage->hid) {
			hid_dbg(hdev, "data was pending ...\n");
459 460
			pdata->pending.raw_data = kmemdup(ptr, sz, GFP_ATOMIC);
			if (pdata->pending.raw_data)
461
				pdata->pending.raw_size = sz;
462
			else
463 464 465 466 467 468 469
				pdata->pending.raw_size = 0;
			complete(&pdata->pending.ready);
		}
		collection = &hdev->collection[
				report->field[i]->usage->collection_index];
		hid_dbg(hdev, "collection->usage %x\n",
					collection->usage);
470 471 472 473 474 475

		callback = sensor_hub_get_callback(hdev,
				report->field[i]->physical,
				report->field[i]->usage[0].collection_index,
				&hsdev, &priv);

476 477
		if (callback && callback->capture_sample) {
			if (report->field[i]->logical)
478
				callback->capture_sample(hsdev,
479 480 481
					report->field[i]->logical, sz, ptr,
					callback->pdev);
			else
482
				callback->capture_sample(hsdev,
483 484 485 486 487 488
					report->field[i]->usage->hid, sz, ptr,
					callback->pdev);
		}
		ptr += sz;
	}
	if (callback && collection && callback->send_event)
489
		callback->send_event(hsdev, collection->usage,
490 491 492 493 494 495
				callback->pdev);
	spin_unlock_irqrestore(&pdata->lock, flags);

	return 1;
}

496 497 498 499 500 501
int sensor_hub_device_open(struct hid_sensor_hub_device *hsdev)
{
	int ret = 0;
	struct sensor_hub_data *data =  hid_get_drvdata(hsdev->hdev);

	mutex_lock(&data->mutex);
502
	if (!data->ref_cnt) {
503 504 505 506 507 508 509
		ret = hid_hw_open(hsdev->hdev);
		if (ret) {
			hid_err(hsdev->hdev, "failed to open hid device\n");
			mutex_unlock(&data->mutex);
			return ret;
		}
	}
510
	data->ref_cnt++;
511 512 513 514 515 516 517 518 519 520 521
	mutex_unlock(&data->mutex);

	return ret;
}
EXPORT_SYMBOL_GPL(sensor_hub_device_open);

void sensor_hub_device_close(struct hid_sensor_hub_device *hsdev)
{
	struct sensor_hub_data *data =  hid_get_drvdata(hsdev->hdev);

	mutex_lock(&data->mutex);
522 523
	data->ref_cnt--;
	if (!data->ref_cnt)
524 525 526 527 528
		hid_hw_close(hsdev->hdev);
	mutex_unlock(&data->mutex);
}
EXPORT_SYMBOL_GPL(sensor_hub_device_close);

529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562
static __u8 *sensor_hub_report_fixup(struct hid_device *hdev, __u8 *rdesc,
		unsigned int *rsize)
{
	int index;
	struct sensor_hub_data *sd =  hid_get_drvdata(hdev);
	unsigned char report_block[] = {
				0x0a,  0x16, 0x03, 0x15, 0x00, 0x25, 0x05};
	unsigned char power_block[] = {
				0x0a,  0x19, 0x03, 0x15, 0x00, 0x25, 0x05};

	if (!(sd->quirks & HID_SENSOR_HUB_ENUM_QUIRK)) {
		hid_dbg(hdev, "No Enum quirks\n");
		return rdesc;
	}

	/* Looks for power and report state usage id and force to 1 */
	for (index = 0; index < *rsize; ++index) {
		if (((*rsize - index) > sizeof(report_block)) &&
			!memcmp(&rdesc[index], report_block,
						sizeof(report_block))) {
			rdesc[index + 4] = 0x01;
			index += sizeof(report_block);
		}
		if (((*rsize - index) > sizeof(power_block)) &&
			!memcmp(&rdesc[index], power_block,
						sizeof(power_block))) {
			rdesc[index + 4] = 0x01;
			index += sizeof(power_block);
		}
	}

	return rdesc;
}

563 564 565 566 567 568 569 570
static int sensor_hub_probe(struct hid_device *hdev,
				const struct hid_device_id *id)
{
	int ret;
	struct sensor_hub_data *sd;
	int i;
	char *name;
	int dev_cnt;
571 572
	struct hid_sensor_hub_device *hsdev;
	struct hid_sensor_hub_device *last_hsdev = NULL;
573

574
	sd = devm_kzalloc(&hdev->dev, sizeof(*sd), GFP_KERNEL);
575 576 577 578
	if (!sd) {
		hid_err(hdev, "cannot allocate Sensor data\n");
		return -ENOMEM;
	}
579

580
	hid_set_drvdata(hdev, sd);
581
	sd->quirks = id->driver_data;
582

583 584 585 586 587 588
	spin_lock_init(&sd->lock);
	spin_lock_init(&sd->dyn_callback_lock);
	mutex_init(&sd->mutex);
	ret = hid_parse(hdev);
	if (ret) {
		hid_err(hdev, "parse failed\n");
589
		return ret;
590 591 592 593 594 595
	}
	INIT_LIST_HEAD(&hdev->inputs);

	ret = hid_hw_start(hdev, 0);
	if (ret) {
		hid_err(hdev, "hw start failed\n");
596
		return ret;
597 598 599 600
	}
	INIT_LIST_HEAD(&sd->dyn_callback_list);
	sd->hid_sensor_client_cnt = 0;

601
	dev_cnt = sensor_hub_get_physical_device_count(hdev);
602 603 604
	if (dev_cnt > HID_MAX_PHY_DEVICES) {
		hid_err(hdev, "Invalid Physical device count\n");
		ret = -EINVAL;
605
		goto err_stop_hw;
606
	}
607 608 609
	sd->hid_sensor_hub_client_devs = devm_kzalloc(&hdev->dev, dev_cnt *
						      sizeof(struct mfd_cell),
						      GFP_KERNEL);
610
	if (sd->hid_sensor_hub_client_devs == NULL) {
611
		hid_err(hdev, "Failed to allocate memory for mfd cells\n");
612
			ret = -ENOMEM;
613
			goto err_stop_hw;
614
	}
615 616 617 618 619 620

	for (i = 0; i < hdev->maxcollection; ++i) {
		struct hid_collection *collection = &hdev->collection[i];

		if (collection->type == HID_COLLECTION_PHYSICAL) {

621 622
			hsdev = devm_kzalloc(&hdev->dev, sizeof(*hsdev),
					     GFP_KERNEL);
623 624 625
			if (!hsdev) {
				hid_err(hdev, "cannot allocate hid_sensor_hub_device\n");
				ret = -ENOMEM;
626
				goto err_stop_hw;
627 628 629 630 631 632 633 634
			}
			hsdev->hdev = hdev;
			hsdev->vendor_id = hdev->vendor;
			hsdev->product_id = hdev->product;
			hsdev->start_collection_index = i;
			if (last_hsdev)
				last_hsdev->end_collection_index = i;
			last_hsdev = hsdev;
635 636 637
			name = devm_kasprintf(&hdev->dev, GFP_KERNEL,
					      "HID-SENSOR-%x",
					      collection->usage);
638
			if (name == NULL) {
639
				hid_err(hdev, "Failed MFD device name\n");
640
					ret = -ENOMEM;
641
					goto err_stop_hw;
642 643
			}
			sd->hid_sensor_hub_client_devs[
644 645
				sd->hid_sensor_client_cnt].id =
							PLATFORM_DEVID_AUTO;
646
			sd->hid_sensor_hub_client_devs[
647 648 649
				sd->hid_sensor_client_cnt].name = name;
			sd->hid_sensor_hub_client_devs[
				sd->hid_sensor_client_cnt].platform_data =
650
							hsdev;
651 652
			sd->hid_sensor_hub_client_devs[
				sd->hid_sensor_client_cnt].pdata_size =
653 654 655
							sizeof(*hsdev);
			hid_dbg(hdev, "Adding %s:%d\n", name,
					hsdev->start_collection_index);
656 657 658
			sd->hid_sensor_client_cnt++;
		}
	}
659 660 661
	if (last_hsdev)
		last_hsdev->end_collection_index = i;

662
	ret = mfd_add_devices(&hdev->dev, 0, sd->hid_sensor_hub_client_devs,
663
		sd->hid_sensor_client_cnt, NULL, 0, NULL);
664
	if (ret < 0)
665
		goto err_stop_hw;
666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681

	return ret;

err_stop_hw:
	hid_hw_stop(hdev);

	return ret;
}

static void sensor_hub_remove(struct hid_device *hdev)
{
	struct sensor_hub_data *data = hid_get_drvdata(hdev);
	unsigned long flags;

	hid_dbg(hdev, " hardware removed\n");
	hid_hw_close(hdev);
682
	hid_hw_stop(hdev);
683 684 685 686 687 688 689 690 691 692
	spin_lock_irqsave(&data->lock, flags);
	if (data->pending.status)
		complete(&data->pending.ready);
	spin_unlock_irqrestore(&data->lock, flags);
	mfd_remove_devices(&hdev->dev);
	hid_set_drvdata(hdev, NULL);
	mutex_destroy(&data->mutex);
}

static const struct hid_device_id sensor_hub_devices[] = {
693
	{ HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, USB_VENDOR_ID_INTEL_0,
694
			USB_DEVICE_ID_INTEL_HID_SENSOR_0),
695 696
			.driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
	{ HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, USB_VENDOR_ID_INTEL_1,
697 698 699 700
			USB_DEVICE_ID_INTEL_HID_SENSOR_0),
			.driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
	{ HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, USB_VENDOR_ID_INTEL_1,
			USB_DEVICE_ID_INTEL_HID_SENSOR_1),
701
			.driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
702 703 704 705 706 707 708 709 710
	{ HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, USB_VENDOR_ID_MICROSOFT,
			USB_DEVICE_ID_MS_SURFACE_PRO_2),
			.driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
	{ HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, USB_VENDOR_ID_MICROSOFT,
			USB_DEVICE_ID_MS_TOUCH_COVER_2),
			.driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
	{ HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, USB_VENDOR_ID_MICROSOFT,
			USB_DEVICE_ID_MS_TYPE_COVER_2),
			.driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
711 712 713
	{ HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, USB_VENDOR_ID_STM_0,
			USB_DEVICE_ID_STM_HID_SENSOR),
			.driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
714
	{ HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, USB_VENDOR_ID_STM_0,
715
			USB_DEVICE_ID_STM_HID_SENSOR_1),
716
			.driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
717 718 719
	{ HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, USB_VENDOR_ID_TEXAS_INSTRUMENTS,
			USB_DEVICE_ID_TEXAS_INSTRUMENTS_LENOVO_YOGA),
			.driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
720 721
	{ HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, HID_ANY_ID,
		     HID_ANY_ID) },
722 723 724 725 726 727 728 729 730 731
	{ }
};
MODULE_DEVICE_TABLE(hid, sensor_hub_devices);

static struct hid_driver sensor_hub_driver = {
	.name = "hid-sensor-hub",
	.id_table = sensor_hub_devices,
	.probe = sensor_hub_probe,
	.remove = sensor_hub_remove,
	.raw_event = sensor_hub_raw_event,
732
	.report_fixup = sensor_hub_report_fixup,
733 734
#ifdef CONFIG_PM
	.suspend = sensor_hub_suspend,
735 736
	.resume = sensor_hub_resume,
	.reset_resume = sensor_hub_reset_resume,
737 738
#endif
};
739
module_hid_driver(sensor_hub_driver);
740 741 742 743

MODULE_DESCRIPTION("HID Sensor Hub driver");
MODULE_AUTHOR("Srinivas Pandruvada <srinivas.pandruvada@intel.com>");
MODULE_LICENSE("GPL");