hci_bcm.c 16.1 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
/*
 *
 *  Bluetooth HCI UART driver for Broadcom devices
 *
 *  Copyright (C) 2015  Intel Corporation
 *
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */

#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/skbuff.h>
27
#include <linux/firmware.h>
28 29 30 31 32 33
#include <linux/module.h>
#include <linux/acpi.h>
#include <linux/platform_device.h>
#include <linux/clk.h>
#include <linux/gpio/consumer.h>
#include <linux/tty.h>
34
#include <linux/interrupt.h>
35 36 37 38

#include <net/bluetooth/bluetooth.h>
#include <net/bluetooth/hci_core.h>

39
#include "btbcm.h"
40
#include "hci_uart.h"
41

42 43 44 45 46 47 48 49 50 51 52
struct bcm_device {
	struct list_head	list;

	struct platform_device	*pdev;

	const char		*name;
	struct gpio_desc	*device_wakeup;
	struct gpio_desc	*shutdown;

	struct clk		*clk;
	bool			clk_enabled;
53 54

	u32			init_speed;
55 56
	int			irq;
	u8			irq_polarity;
57 58 59 60 61

#ifdef CONFIG_PM_SLEEP
	struct hci_uart		*hu;
	bool			is_suspended; /* suspend/resume flag */
#endif
62 63
};

64
struct bcm_data {
65 66 67 68
	struct sk_buff		*rx_skb;
	struct sk_buff_head	txq;

	struct bcm_device	*dev;
69 70
};

71
/* List of BCM BT UART devices */
72
static DEFINE_MUTEX(bcm_device_lock);
73 74
static LIST_HEAD(bcm_device_list);

75 76 77 78 79 80 81 82 83 84 85
static int bcm_set_baudrate(struct hci_uart *hu, unsigned int speed)
{
	struct hci_dev *hdev = hu->hdev;
	struct sk_buff *skb;
	struct bcm_update_uart_baud_rate param;

	if (speed > 3000000) {
		struct bcm_write_uart_clock_setting clock;

		clock.type = BCM_UART_CLOCK_48MHZ;

86
		bt_dev_dbg(hdev, "Set Controller clock (%d)", clock.type);
87 88 89 90 91 92 93

		/* This Broadcom specific command changes the UART's controller
		 * clock for baud rate > 3000000.
		 */
		skb = __hci_cmd_sync(hdev, 0xfc45, 1, &clock, HCI_INIT_TIMEOUT);
		if (IS_ERR(skb)) {
			int err = PTR_ERR(skb);
94 95
			bt_dev_err(hdev, "BCM: failed to write clock (%d)",
				   err);
96 97 98 99 100 101
			return err;
		}

		kfree_skb(skb);
	}

102
	bt_dev_dbg(hdev, "Set Controller UART speed to %d bit/s", speed);
103 104 105 106 107 108 109 110 111 112 113

	param.zero = cpu_to_le16(0);
	param.baud_rate = cpu_to_le32(speed);

	/* This Broadcom specific command changes the UART's controller baud
	 * rate.
	 */
	skb = __hci_cmd_sync(hdev, 0xfc18, sizeof(param), &param,
			     HCI_INIT_TIMEOUT);
	if (IS_ERR(skb)) {
		int err = PTR_ERR(skb);
114 115
		bt_dev_err(hdev, "BCM: failed to write update baudrate (%d)",
			   err);
116 117 118 119 120 121 122 123
		return err;
	}

	kfree_skb(skb);

	return 0;
}

124
/* bcm_device_exists should be protected by bcm_device_lock */
125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
static bool bcm_device_exists(struct bcm_device *device)
{
	struct list_head *p;

	list_for_each(p, &bcm_device_list) {
		struct bcm_device *dev = list_entry(p, struct bcm_device, list);

		if (device == dev)
			return true;
	}

	return false;
}

static int bcm_gpio_set_power(struct bcm_device *dev, bool powered)
{
	if (powered && !IS_ERR(dev->clk) && !dev->clk_enabled)
		clk_enable(dev->clk);

144 145
	gpiod_set_value(dev->shutdown, powered);
	gpiod_set_value(dev->device_wakeup, powered);
146 147 148 149 150 151 152 153 154

	if (!powered && !IS_ERR(dev->clk) && dev->clk_enabled)
		clk_disable(dev->clk);

	dev->clk_enabled = powered;

	return 0;
}

155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234
#ifdef CONFIG_PM_SLEEP
static irqreturn_t bcm_host_wake(int irq, void *data)
{
	struct bcm_device *bdev = data;

	bt_dev_dbg(bdev, "Host wake IRQ");

	return IRQ_HANDLED;
}

static int bcm_request_irq(struct bcm_data *bcm)
{
	struct bcm_device *bdev = bcm->dev;
	int err = 0;

	/* If this is not a platform device, do not enable PM functionalities */
	mutex_lock(&bcm_device_lock);
	if (!bcm_device_exists(bdev)) {
		err = -ENODEV;
		goto unlock;
	}

	if (bdev->irq > 0) {
		err = devm_request_irq(&bdev->pdev->dev, bdev->irq,
				       bcm_host_wake, IRQF_TRIGGER_RISING,
				       "host_wake", bdev);
		if (err)
			goto unlock;

		device_init_wakeup(&bdev->pdev->dev, true);
	}

unlock:
	mutex_unlock(&bcm_device_lock);

	return err;
}

static const struct bcm_set_sleep_mode default_sleep_params = {
	.sleep_mode = 1,	/* 0=Disabled, 1=UART, 2=Reserved, 3=USB */
	.idle_host = 2,		/* idle threshold HOST, in 300ms */
	.idle_dev = 2,		/* idle threshold device, in 300ms */
	.bt_wake_active = 1,	/* BT_WAKE active mode: 1 = high, 0 = low */
	.host_wake_active = 0,	/* HOST_WAKE active mode: 1 = high, 0 = low */
	.allow_host_sleep = 1,	/* Allow host sleep in SCO flag */
	.combine_modes = 0,	/* Combine sleep and LPM flag */
	.tristate_control = 0,	/* Allow tri-state control of UART tx flag */
	/* Irrelevant USB flags */
	.usb_auto_sleep = 0,
	.usb_resume_timeout = 0,
	.pulsed_host_wake = 0,
	.break_to_host = 0
};

static int bcm_setup_sleep(struct hci_uart *hu)
{
	struct bcm_data *bcm = hu->priv;
	struct sk_buff *skb;
	struct bcm_set_sleep_mode sleep_params = default_sleep_params;

	sleep_params.host_wake_active = !bcm->dev->irq_polarity;

	skb = __hci_cmd_sync(hu->hdev, 0xfc27, sizeof(sleep_params),
			     &sleep_params, HCI_INIT_TIMEOUT);
	if (IS_ERR(skb)) {
		int err = PTR_ERR(skb);
		bt_dev_err(hu->hdev, "Sleep VSC failed (%d)", err);
		return err;
	}
	kfree_skb(skb);

	bt_dev_dbg(hu->hdev, "Set Sleep Parameters VSC succeeded");

	return 0;
}
#else
static inline int bcm_request_irq(struct bcm_data *bcm) { return 0; }
static inline int bcm_setup_sleep(struct hci_uart *hu) { return 0; }
#endif

235 236 237
static int bcm_open(struct hci_uart *hu)
{
	struct bcm_data *bcm;
238
	struct list_head *p;
239

240
	bt_dev_dbg(hu->hdev, "hu %p", hu);
241 242 243 244 245 246 247 248

	bcm = kzalloc(sizeof(*bcm), GFP_KERNEL);
	if (!bcm)
		return -ENOMEM;

	skb_queue_head_init(&bcm->txq);

	hu->priv = bcm;
249

250
	mutex_lock(&bcm_device_lock);
251 252 253 254 255 256 257 258 259
	list_for_each(p, &bcm_device_list) {
		struct bcm_device *dev = list_entry(p, struct bcm_device, list);

		/* Retrieve saved bcm_device based on parent of the
		 * platform device (saved during device probe) and
		 * parent of tty device used by hci_uart
		 */
		if (hu->tty->dev->parent == dev->pdev->dev.parent) {
			bcm->dev = dev;
260
			hu->init_speed = dev->init_speed;
261 262 263
#ifdef CONFIG_PM_SLEEP
			dev->hu = hu;
#endif
264
			bcm_gpio_set_power(bcm->dev, true);
265 266 267 268
			break;
		}
	}

269
	mutex_unlock(&bcm_device_lock);
270

271 272 273 274 275 276
	return 0;
}

static int bcm_close(struct hci_uart *hu)
{
	struct bcm_data *bcm = hu->priv;
277
	struct bcm_device *bdev = bcm->dev;
278

279
	bt_dev_dbg(hu->hdev, "hu %p", hu);
280

281
	/* Protect bcm->dev against removal of the device or driver */
282
	mutex_lock(&bcm_device_lock);
283 284
	if (bcm_device_exists(bdev)) {
		bcm_gpio_set_power(bdev, false);
285
#ifdef CONFIG_PM_SLEEP
286 287 288 289 290 291
		if (device_can_wakeup(&bdev->pdev->dev)) {
			devm_free_irq(&bdev->pdev->dev, bdev->irq, bdev);
			device_init_wakeup(&bdev->pdev->dev, false);
		}

		bdev->hu = NULL;
292 293
#endif
	}
294
	mutex_unlock(&bcm_device_lock);
295

296 297 298 299 300 301 302 303 304 305 306 307
	skb_queue_purge(&bcm->txq);
	kfree_skb(bcm->rx_skb);
	kfree(bcm);

	hu->priv = NULL;
	return 0;
}

static int bcm_flush(struct hci_uart *hu)
{
	struct bcm_data *bcm = hu->priv;

308
	bt_dev_dbg(hu->hdev, "hu %p", hu);
309 310 311 312 313 314 315 316

	skb_queue_purge(&bcm->txq);

	return 0;
}

static int bcm_setup(struct hci_uart *hu)
{
317
	struct bcm_data *bcm = hu->priv;
318 319
	char fw_name[64];
	const struct firmware *fw;
320
	unsigned int speed;
321 322
	int err;

323
	bt_dev_dbg(hu->hdev, "hu %p", hu);
324 325 326

	hu->hdev->set_bdaddr = btbcm_set_bdaddr;

327 328 329 330 331 332
	err = btbcm_initialize(hu->hdev, fw_name, sizeof(fw_name));
	if (err)
		return err;

	err = request_firmware(&fw, fw_name, &hu->hdev->dev);
	if (err < 0) {
333
		bt_dev_info(hu->hdev, "BCM: Patch %s not found", fw_name);
334 335 336 337 338
		return 0;
	}

	err = btbcm_patchram(hu->hdev, fw);
	if (err) {
339
		bt_dev_info(hu->hdev, "BCM: Patch failed (%d)", err);
340 341 342
		goto finalize;
	}

343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363
	/* Init speed if any */
	if (hu->init_speed)
		speed = hu->init_speed;
	else if (hu->proto->init_speed)
		speed = hu->proto->init_speed;
	else
		speed = 0;

	if (speed)
		hci_uart_set_baudrate(hu, speed);

	/* Operational speed if any */
	if (hu->oper_speed)
		speed = hu->oper_speed;
	else if (hu->proto->oper_speed)
		speed = hu->proto->oper_speed;
	else
		speed = 0;

	if (speed) {
		err = bcm_set_baudrate(hu, speed);
364
		if (!err)
365
			hci_uart_set_baudrate(hu, speed);
366 367
	}

368 369 370 371
finalize:
	release_firmware(fw);

	err = btbcm_finalize(hu->hdev);
372 373 374 375 376 377
	if (err)
		return err;

	err = bcm_request_irq(bcm);
	if (!err)
		err = bcm_setup_sleep(hu);
378 379

	return err;
380 381
}

382 383 384 385 386 387
static const struct h4_recv_pkt bcm_recv_pkts[] = {
	{ H4_RECV_ACL,   .recv = hci_recv_frame },
	{ H4_RECV_SCO,   .recv = hci_recv_frame },
	{ H4_RECV_EVENT, .recv = hci_recv_frame },
};

388 389 390 391 392 393 394
static int bcm_recv(struct hci_uart *hu, const void *data, int count)
{
	struct bcm_data *bcm = hu->priv;

	if (!test_bit(HCI_UART_REGISTERED, &hu->flags))
		return -EUNATCH;

395 396
	bcm->rx_skb = h4_recv_buf(hu->hdev, bcm->rx_skb, data, count,
				  bcm_recv_pkts, ARRAY_SIZE(bcm_recv_pkts));
397 398
	if (IS_ERR(bcm->rx_skb)) {
		int err = PTR_ERR(bcm->rx_skb);
399
		bt_dev_err(hu->hdev, "Frame reassembly failed (%d)", err);
400
		bcm->rx_skb = NULL;
401 402 403 404 405 406 407 408 409 410
		return err;
	}

	return count;
}

static int bcm_enqueue(struct hci_uart *hu, struct sk_buff *skb)
{
	struct bcm_data *bcm = hu->priv;

411
	bt_dev_dbg(hu->hdev, "hu %p skb %p", hu, skb);
412 413 414 415 416 417 418 419 420 421 422 423 424 425 426

	/* Prepend skb with frame type */
	memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1);
	skb_queue_tail(&bcm->txq, skb);

	return 0;
}

static struct sk_buff *bcm_dequeue(struct hci_uart *hu)
{
	struct bcm_data *bcm = hu->priv;

	return skb_dequeue(&bcm->txq);
}

427 428 429 430 431
#ifdef CONFIG_PM_SLEEP
/* Platform suspend callback */
static int bcm_suspend(struct device *dev)
{
	struct bcm_device *bdev = platform_get_drvdata(to_platform_device(dev));
432
	int error;
433

434
	bt_dev_dbg(bdev, "suspend: is_suspended %d", bdev->is_suspended);
435

436
	mutex_lock(&bcm_device_lock);
437 438 439 440

	if (!bdev->hu)
		goto unlock;

441 442 443 444 445 446 447 448 449 450
	if (!bdev->is_suspended) {
		hci_uart_set_flow_control(bdev->hu, true);

		/* Once this callback returns, driver suspends BT via GPIO */
		bdev->is_suspended = true;
	}

	/* Suspend the device */
	if (bdev->device_wakeup) {
		gpiod_set_value(bdev->device_wakeup, false);
451
		bt_dev_dbg(bdev, "suspend, delaying 15 ms");
452 453 454
		mdelay(15);
	}

455 456 457 458 459 460
	if (device_may_wakeup(&bdev->pdev->dev)) {
		error = enable_irq_wake(bdev->irq);
		if (!error)
			bt_dev_dbg(bdev, "BCM irq: enabled");
	}

461
unlock:
462
	mutex_unlock(&bcm_device_lock);
463

464 465 466 467 468 469 470 471
	return 0;
}

/* Platform resume callback */
static int bcm_resume(struct device *dev)
{
	struct bcm_device *bdev = platform_get_drvdata(to_platform_device(dev));

472
	bt_dev_dbg(bdev, "resume: is_suspended %d", bdev->is_suspended);
473

474
	mutex_lock(&bcm_device_lock);
475 476 477 478

	if (!bdev->hu)
		goto unlock;

479 480 481 482 483
	if (device_may_wakeup(&bdev->pdev->dev)) {
		disable_irq_wake(bdev->irq);
		bt_dev_dbg(bdev, "BCM irq: disabled");
	}

484 485
	if (bdev->device_wakeup) {
		gpiod_set_value(bdev->device_wakeup, true);
486
		bt_dev_dbg(bdev, "resume, delaying 15 ms");
487 488 489 490 491 492 493 494 495 496
		mdelay(15);
	}

	/* When this callback executes, the device has woken up already */
	if (bdev->is_suspended) {
		bdev->is_suspended = false;

		hci_uart_set_flow_control(bdev->hu, false);
	}

497
unlock:
498
	mutex_unlock(&bcm_device_lock);
499

500 501 502 503
	return 0;
}
#endif

504 505
static const struct acpi_gpio_params device_wakeup_gpios = { 0, 0, false };
static const struct acpi_gpio_params shutdown_gpios = { 1, 0, false };
506
static const struct acpi_gpio_params host_wakeup_gpios = { 2, 0, false };
507 508 509 510

static const struct acpi_gpio_mapping acpi_bcm_default_gpios[] = {
	{ "device-wakeup-gpios", &device_wakeup_gpios, 1 },
	{ "shutdown-gpios", &shutdown_gpios, 1 },
511
	{ "host-wakeup-gpios", &host_wakeup_gpios, 1 },
512 513 514
	{ },
};

515
#ifdef CONFIG_ACPI
516 517 518
static int bcm_resource(struct acpi_resource *ares, void *data)
{
	struct bcm_device *dev = data;
519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535
	struct acpi_resource_extended_irq *irq;
	struct acpi_resource_gpio *gpio;
	struct acpi_resource_uart_serialbus *sb;

	switch (ares->type) {
	case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
		irq = &ares->data.extended_irq;
		dev->irq_polarity = irq->polarity;
		break;

	case ACPI_RESOURCE_TYPE_GPIO:
		gpio = &ares->data.gpio;
		if (gpio->connection_type == ACPI_RESOURCE_GPIO_TYPE_INT)
			dev->irq_polarity = gpio->polarity;
		break;

	case ACPI_RESOURCE_TYPE_SERIAL_BUS:
536 537 538
		sb = &ares->data.uart_serial_bus;
		if (sb->type == ACPI_RESOURCE_SERIAL_TYPE_UART)
			dev->init_speed = sb->default_baud_rate;
539 540 541 542
		break;

	default:
		break;
543 544 545 546 547 548
	}

	/* Always tell the ACPI core to skip this resource */
	return 1;
}

549 550 551 552
static int bcm_acpi_probe(struct bcm_device *dev)
{
	struct platform_device *pdev = dev->pdev;
	const struct acpi_device_id *id;
553 554
	struct acpi_device *adev;
	LIST_HEAD(resources);
555 556 557 558 559 560 561 562 563 564 565 566 567 568 569
	int ret;

	id = acpi_match_device(pdev->dev.driver->acpi_match_table, &pdev->dev);
	if (!id)
		return -ENODEV;

	/* Retrieve GPIO data */
	dev->name = dev_name(&pdev->dev);
	ret = acpi_dev_add_driver_gpios(ACPI_COMPANION(&pdev->dev),
					acpi_bcm_default_gpios);
	if (ret)
		return ret;

	dev->clk = devm_clk_get(&pdev->dev, NULL);

570 571 572 573 574
	dev->device_wakeup = devm_gpiod_get_optional(&pdev->dev,
						     "device-wakeup",
						     GPIOD_OUT_LOW);
	if (IS_ERR(dev->device_wakeup))
		return PTR_ERR(dev->device_wakeup);
575

576 577 578 579
	dev->shutdown = devm_gpiod_get_optional(&pdev->dev, "shutdown",
						GPIOD_OUT_LOW);
	if (IS_ERR(dev->shutdown))
		return PTR_ERR(dev->shutdown);
580

581 582 583 584 585 586 587 588 589 590 591 592 593 594 595
	/* IRQ can be declared in ACPI table as Interrupt or GpioInt */
	dev->irq = platform_get_irq(pdev, 0);
	if (dev->irq <= 0) {
		struct gpio_desc *gpio;

		gpio = devm_gpiod_get_optional(&pdev->dev, "host-wakeup",
					       GPIOD_IN);
		if (IS_ERR(gpio))
			return PTR_ERR(gpio);

		dev->irq = gpiod_to_irq(gpio);
	}

	dev_info(&pdev->dev, "BCM irq: %d\n", dev->irq);

596 597 598 599 600 601 602 603
	/* Make sure at-least one of the GPIO is defined and that
	 * a name is specified for this instance
	 */
	if ((!dev->device_wakeup && !dev->shutdown) || !dev->name) {
		dev_err(&pdev->dev, "invalid platform data\n");
		return -EINVAL;
	}

604 605 606 607 608 609 610
	/* Retrieve UART ACPI info */
	adev = ACPI_COMPANION(&dev->pdev->dev);
	if (!adev)
		return 0;

	acpi_dev_get_resources(adev, &resources, bcm_resource, dev);

611 612
	return 0;
}
613 614 615 616 617 618
#else
static int bcm_acpi_probe(struct bcm_device *dev)
{
	return -EINVAL;
}
#endif /* CONFIG_ACPI */
619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646

static int bcm_probe(struct platform_device *pdev)
{
	struct bcm_device *dev;
	struct acpi_device_id *pdata = pdev->dev.platform_data;
	int ret;

	dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL);
	if (!dev)
		return -ENOMEM;

	dev->pdev = pdev;

	if (ACPI_HANDLE(&pdev->dev)) {
		ret = bcm_acpi_probe(dev);
		if (ret)
			return ret;
	} else if (pdata) {
		dev->name = pdata->id;
	} else {
		return -ENODEV;
	}

	platform_set_drvdata(pdev, dev);

	dev_info(&pdev->dev, "%s device registered.\n", dev->name);

	/* Place this instance on the device list */
647
	mutex_lock(&bcm_device_lock);
648
	list_add_tail(&dev->list, &bcm_device_list);
649
	mutex_unlock(&bcm_device_lock);
650 651 652 653 654 655 656 657 658 659

	bcm_gpio_set_power(dev, false);

	return 0;
}

static int bcm_remove(struct platform_device *pdev)
{
	struct bcm_device *dev = platform_get_drvdata(pdev);

660
	mutex_lock(&bcm_device_lock);
661
	list_del(&dev->list);
662
	mutex_unlock(&bcm_device_lock);
663 664 665 666 667 668 669 670

	acpi_dev_remove_driver_gpios(ACPI_COMPANION(&pdev->dev));

	dev_info(&pdev->dev, "%s device unregistered.\n", dev->name);

	return 0;
}

671 672 673
static const struct hci_uart_proto bcm_proto = {
	.id		= HCI_UART_BCM,
	.name		= "BCM",
674 675
	.init_speed	= 115200,
	.oper_speed	= 4000000,
676 677 678 679
	.open		= bcm_open,
	.close		= bcm_close,
	.flush		= bcm_flush,
	.setup		= bcm_setup,
680
	.set_baudrate	= bcm_set_baudrate,
681 682 683 684 685
	.recv		= bcm_recv,
	.enqueue	= bcm_enqueue,
	.dequeue	= bcm_dequeue,
};

686 687 688 689 690 691 692 693 694
#ifdef CONFIG_ACPI
static const struct acpi_device_id bcm_acpi_match[] = {
	{ "BCM2E39", 0 },
	{ "BCM2E67", 0 },
	{ },
};
MODULE_DEVICE_TABLE(acpi, bcm_acpi_match);
#endif

695 696 697
/* Platform suspend and resume callbacks */
static SIMPLE_DEV_PM_OPS(bcm_pm_ops, bcm_suspend, bcm_resume);

698 699 700 701 702 703
static struct platform_driver bcm_driver = {
	.probe = bcm_probe,
	.remove = bcm_remove,
	.driver = {
		.name = "hci_bcm",
		.acpi_match_table = ACPI_PTR(bcm_acpi_match),
704
		.pm = &bcm_pm_ops,
705 706 707
	},
};

708 709
int __init bcm_init(void)
{
710 711
	platform_driver_register(&bcm_driver);

712 713 714 715 716
	return hci_uart_register_proto(&bcm_proto);
}

int __exit bcm_deinit(void)
{
717 718
	platform_driver_unregister(&bcm_driver);

719 720
	return hci_uart_unregister_proto(&bcm_proto);
}