linux/drivers/bluetooth/hci_bcm.c
<<
>>
Prefs
   1/*
   2 *
   3 *  Bluetooth HCI UART driver for Broadcom devices
   4 *
   5 *  Copyright (C) 2015  Intel Corporation
   6 *
   7 *
   8 *  This program is free software; you can redistribute it and/or modify
   9 *  it under the terms of the GNU General Public License as published by
  10 *  the Free Software Foundation; either version 2 of the License, or
  11 *  (at your option) any later version.
  12 *
  13 *  This program is distributed in the hope that it will be useful,
  14 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  15 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16 *  GNU General Public License for more details.
  17 *
  18 *  You should have received a copy of the GNU General Public License
  19 *  along with this program; if not, write to the Free Software
  20 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  21 *
  22 */
  23
  24#include <linux/kernel.h>
  25#include <linux/errno.h>
  26#include <linux/skbuff.h>
  27#include <linux/firmware.h>
  28#include <linux/module.h>
  29#include <linux/acpi.h>
  30#include <linux/of.h>
  31#include <linux/property.h>
  32#include <linux/platform_device.h>
  33#include <linux/clk.h>
  34#include <linux/gpio/consumer.h>
  35#include <linux/tty.h>
  36#include <linux/interrupt.h>
  37#include <linux/dmi.h>
  38#include <linux/pm_runtime.h>
  39#include <linux/serdev.h>
  40
  41#include <net/bluetooth/bluetooth.h>
  42#include <net/bluetooth/hci_core.h>
  43
  44#include "btbcm.h"
  45#include "hci_uart.h"
  46
  47#define BCM_NULL_PKT 0x00
  48#define BCM_NULL_SIZE 0
  49
  50#define BCM_LM_DIAG_PKT 0x07
  51#define BCM_LM_DIAG_SIZE 63
  52
  53#define BCM_AUTOSUSPEND_DELAY   5000 /* default autosleep delay */
  54
  55/* platform device driver resources */
  56struct bcm_device {
  57        struct list_head        list;
  58
  59        struct platform_device  *pdev;
  60
  61        const char              *name;
  62        struct gpio_desc        *device_wakeup;
  63        struct gpio_desc        *shutdown;
  64
  65        struct clk              *clk;
  66        bool                    clk_enabled;
  67
  68        u32                     init_speed;
  69        u32                     oper_speed;
  70        int                     irq;
  71        u8                      irq_polarity;
  72
  73#ifdef CONFIG_PM
  74        struct hci_uart         *hu;
  75        bool                    is_suspended; /* suspend/resume flag */
  76#endif
  77};
  78
  79/* serdev driver resources */
  80struct bcm_serdev {
  81        struct hci_uart hu;
  82};
  83
  84/* generic bcm uart resources */
  85struct bcm_data {
  86        struct sk_buff          *rx_skb;
  87        struct sk_buff_head     txq;
  88
  89        struct bcm_device       *dev;
  90};
  91
  92/* List of BCM BT UART devices */
  93static DEFINE_MUTEX(bcm_device_lock);
  94static LIST_HEAD(bcm_device_list);
  95
  96static inline void host_set_baudrate(struct hci_uart *hu, unsigned int speed)
  97{
  98        if (hu->serdev)
  99                serdev_device_set_baudrate(hu->serdev, speed);
 100        else
 101                hci_uart_set_baudrate(hu, speed);
 102}
 103
 104static int bcm_set_baudrate(struct hci_uart *hu, unsigned int speed)
 105{
 106        struct hci_dev *hdev = hu->hdev;
 107        struct sk_buff *skb;
 108        struct bcm_update_uart_baud_rate param;
 109
 110        if (speed > 3000000) {
 111                struct bcm_write_uart_clock_setting clock;
 112
 113                clock.type = BCM_UART_CLOCK_48MHZ;
 114
 115                bt_dev_dbg(hdev, "Set Controller clock (%d)", clock.type);
 116
 117                /* This Broadcom specific command changes the UART's controller
 118                 * clock for baud rate > 3000000.
 119                 */
 120                skb = __hci_cmd_sync(hdev, 0xfc45, 1, &clock, HCI_INIT_TIMEOUT);
 121                if (IS_ERR(skb)) {
 122                        int err = PTR_ERR(skb);
 123                        bt_dev_err(hdev, "BCM: failed to write clock (%d)",
 124                                   err);
 125                        return err;
 126                }
 127
 128                kfree_skb(skb);
 129        }
 130
 131        bt_dev_dbg(hdev, "Set Controller UART speed to %d bit/s", speed);
 132
 133        param.zero = cpu_to_le16(0);
 134        param.baud_rate = cpu_to_le32(speed);
 135
 136        /* This Broadcom specific command changes the UART's controller baud
 137         * rate.
 138         */
 139        skb = __hci_cmd_sync(hdev, 0xfc18, sizeof(param), &param,
 140                             HCI_INIT_TIMEOUT);
 141        if (IS_ERR(skb)) {
 142                int err = PTR_ERR(skb);
 143                bt_dev_err(hdev, "BCM: failed to write update baudrate (%d)",
 144                           err);
 145                return err;
 146        }
 147
 148        kfree_skb(skb);
 149
 150        return 0;
 151}
 152
 153/* bcm_device_exists should be protected by bcm_device_lock */
 154static bool bcm_device_exists(struct bcm_device *device)
 155{
 156        struct list_head *p;
 157
 158        list_for_each(p, &bcm_device_list) {
 159                struct bcm_device *dev = list_entry(p, struct bcm_device, list);
 160
 161                if (device == dev)
 162                        return true;
 163        }
 164
 165        return false;
 166}
 167
 168static int bcm_gpio_set_power(struct bcm_device *dev, bool powered)
 169{
 170        if (powered && !IS_ERR(dev->clk) && !dev->clk_enabled)
 171                clk_prepare_enable(dev->clk);
 172
 173        gpiod_set_value(dev->shutdown, powered);
 174        gpiod_set_value(dev->device_wakeup, powered);
 175
 176        if (!powered && !IS_ERR(dev->clk) && dev->clk_enabled)
 177                clk_disable_unprepare(dev->clk);
 178
 179        dev->clk_enabled = powered;
 180
 181        return 0;
 182}
 183
 184#ifdef CONFIG_PM
 185static irqreturn_t bcm_host_wake(int irq, void *data)
 186{
 187        struct bcm_device *bdev = data;
 188
 189        bt_dev_dbg(bdev, "Host wake IRQ");
 190
 191        pm_runtime_get(&bdev->pdev->dev);
 192        pm_runtime_mark_last_busy(&bdev->pdev->dev);
 193        pm_runtime_put_autosuspend(&bdev->pdev->dev);
 194
 195        return IRQ_HANDLED;
 196}
 197
 198static int bcm_request_irq(struct bcm_data *bcm)
 199{
 200        struct bcm_device *bdev = bcm->dev;
 201        int err;
 202
 203        /* If this is not a platform device, do not enable PM functionalities */
 204        mutex_lock(&bcm_device_lock);
 205        if (!bcm_device_exists(bdev)) {
 206                err = -ENODEV;
 207                goto unlock;
 208        }
 209
 210        if (bdev->irq <= 0) {
 211                err = -EOPNOTSUPP;
 212                goto unlock;
 213        }
 214
 215        err = devm_request_irq(&bdev->pdev->dev, bdev->irq, bcm_host_wake,
 216                               IRQF_TRIGGER_RISING, "host_wake", bdev);
 217        if (err)
 218                goto unlock;
 219
 220        device_init_wakeup(&bdev->pdev->dev, true);
 221
 222        pm_runtime_set_autosuspend_delay(&bdev->pdev->dev,
 223                                         BCM_AUTOSUSPEND_DELAY);
 224        pm_runtime_use_autosuspend(&bdev->pdev->dev);
 225        pm_runtime_set_active(&bdev->pdev->dev);
 226        pm_runtime_enable(&bdev->pdev->dev);
 227
 228unlock:
 229        mutex_unlock(&bcm_device_lock);
 230
 231        return err;
 232}
 233
 234static const struct bcm_set_sleep_mode default_sleep_params = {
 235        .sleep_mode = 1,        /* 0=Disabled, 1=UART, 2=Reserved, 3=USB */
 236        .idle_host = 2,         /* idle threshold HOST, in 300ms */
 237        .idle_dev = 2,          /* idle threshold device, in 300ms */
 238        .bt_wake_active = 1,    /* BT_WAKE active mode: 1 = high, 0 = low */
 239        .host_wake_active = 0,  /* HOST_WAKE active mode: 1 = high, 0 = low */
 240        .allow_host_sleep = 1,  /* Allow host sleep in SCO flag */
 241        .combine_modes = 1,     /* Combine sleep and LPM flag */
 242        .tristate_control = 0,  /* Allow tri-state control of UART tx flag */
 243        /* Irrelevant USB flags */
 244        .usb_auto_sleep = 0,
 245        .usb_resume_timeout = 0,
 246        .pulsed_host_wake = 0,
 247        .break_to_host = 0
 248};
 249
 250static int bcm_setup_sleep(struct hci_uart *hu)
 251{
 252        struct bcm_data *bcm = hu->priv;
 253        struct sk_buff *skb;
 254        struct bcm_set_sleep_mode sleep_params = default_sleep_params;
 255
 256        sleep_params.host_wake_active = !bcm->dev->irq_polarity;
 257
 258        skb = __hci_cmd_sync(hu->hdev, 0xfc27, sizeof(sleep_params),
 259                             &sleep_params, HCI_INIT_TIMEOUT);
 260        if (IS_ERR(skb)) {
 261                int err = PTR_ERR(skb);
 262                bt_dev_err(hu->hdev, "Sleep VSC failed (%d)", err);
 263                return err;
 264        }
 265        kfree_skb(skb);
 266
 267        bt_dev_dbg(hu->hdev, "Set Sleep Parameters VSC succeeded");
 268
 269        return 0;
 270}
 271#else
 272static inline int bcm_request_irq(struct bcm_data *bcm) { return 0; }
 273static inline int bcm_setup_sleep(struct hci_uart *hu) { return 0; }
 274#endif
 275
 276static int bcm_set_diag(struct hci_dev *hdev, bool enable)
 277{
 278        struct hci_uart *hu = hci_get_drvdata(hdev);
 279        struct bcm_data *bcm = hu->priv;
 280        struct sk_buff *skb;
 281
 282        if (!test_bit(HCI_RUNNING, &hdev->flags))
 283                return -ENETDOWN;
 284
 285        skb = bt_skb_alloc(3, GFP_KERNEL);
 286        if (!skb)
 287                return -ENOMEM;
 288
 289        skb_put_u8(skb, BCM_LM_DIAG_PKT);
 290        skb_put_u8(skb, 0xf0);
 291        skb_put_u8(skb, enable);
 292
 293        skb_queue_tail(&bcm->txq, skb);
 294        hci_uart_tx_wakeup(hu);
 295
 296        return 0;
 297}
 298
 299static int bcm_open(struct hci_uart *hu)
 300{
 301        struct bcm_data *bcm;
 302        struct list_head *p;
 303
 304        bt_dev_dbg(hu->hdev, "hu %p", hu);
 305
 306        bcm = kzalloc(sizeof(*bcm), GFP_KERNEL);
 307        if (!bcm)
 308                return -ENOMEM;
 309
 310        skb_queue_head_init(&bcm->txq);
 311
 312        hu->priv = bcm;
 313
 314        /* If this is a serdev defined device, then only use
 315         * serdev open primitive and skip the rest.
 316         */
 317        if (hu->serdev) {
 318                serdev_device_open(hu->serdev);
 319                goto out;
 320        }
 321
 322        if (!hu->tty->dev)
 323                goto out;
 324
 325        mutex_lock(&bcm_device_lock);
 326        list_for_each(p, &bcm_device_list) {
 327                struct bcm_device *dev = list_entry(p, struct bcm_device, list);
 328
 329                /* Retrieve saved bcm_device based on parent of the
 330                 * platform device (saved during device probe) and
 331                 * parent of tty device used by hci_uart
 332                 */
 333                if (hu->tty->dev->parent == dev->pdev->dev.parent) {
 334                        bcm->dev = dev;
 335                        hu->init_speed = dev->init_speed;
 336                        hu->oper_speed = dev->oper_speed;
 337#ifdef CONFIG_PM
 338                        dev->hu = hu;
 339#endif
 340                        bcm_gpio_set_power(bcm->dev, true);
 341                        break;
 342                }
 343        }
 344
 345        mutex_unlock(&bcm_device_lock);
 346out:
 347        return 0;
 348}
 349
 350static int bcm_close(struct hci_uart *hu)
 351{
 352        struct bcm_data *bcm = hu->priv;
 353        struct bcm_device *bdev = bcm->dev;
 354
 355        bt_dev_dbg(hu->hdev, "hu %p", hu);
 356
 357        /* If this is a serdev defined device, only use serdev
 358         * close primitive and then continue as usual.
 359         */
 360        if (hu->serdev)
 361                serdev_device_close(hu->serdev);
 362
 363        /* Protect bcm->dev against removal of the device or driver */
 364        mutex_lock(&bcm_device_lock);
 365        if (bcm_device_exists(bdev)) {
 366                bcm_gpio_set_power(bdev, false);
 367#ifdef CONFIG_PM
 368                pm_runtime_disable(&bdev->pdev->dev);
 369                pm_runtime_set_suspended(&bdev->pdev->dev);
 370
 371                if (device_can_wakeup(&bdev->pdev->dev)) {
 372                        devm_free_irq(&bdev->pdev->dev, bdev->irq, bdev);
 373                        device_init_wakeup(&bdev->pdev->dev, false);
 374                }
 375
 376                bdev->hu = NULL;
 377#endif
 378        }
 379        mutex_unlock(&bcm_device_lock);
 380
 381        skb_queue_purge(&bcm->txq);
 382        kfree_skb(bcm->rx_skb);
 383        kfree(bcm);
 384
 385        hu->priv = NULL;
 386        return 0;
 387}
 388
 389static int bcm_flush(struct hci_uart *hu)
 390{
 391        struct bcm_data *bcm = hu->priv;
 392
 393        bt_dev_dbg(hu->hdev, "hu %p", hu);
 394
 395        skb_queue_purge(&bcm->txq);
 396
 397        return 0;
 398}
 399
 400static int bcm_setup(struct hci_uart *hu)
 401{
 402        struct bcm_data *bcm = hu->priv;
 403        char fw_name[64];
 404        const struct firmware *fw;
 405        unsigned int speed;
 406        int err;
 407
 408        bt_dev_dbg(hu->hdev, "hu %p", hu);
 409
 410        hu->hdev->set_diag = bcm_set_diag;
 411        hu->hdev->set_bdaddr = btbcm_set_bdaddr;
 412
 413        err = btbcm_initialize(hu->hdev, fw_name, sizeof(fw_name));
 414        if (err)
 415                return err;
 416
 417        err = request_firmware(&fw, fw_name, &hu->hdev->dev);
 418        if (err < 0) {
 419                bt_dev_info(hu->hdev, "BCM: Patch %s not found", fw_name);
 420                return 0;
 421        }
 422
 423        err = btbcm_patchram(hu->hdev, fw);
 424        if (err) {
 425                bt_dev_info(hu->hdev, "BCM: Patch failed (%d)", err);
 426                goto finalize;
 427        }
 428
 429        /* Init speed if any */
 430        if (hu->init_speed)
 431                speed = hu->init_speed;
 432        else if (hu->proto->init_speed)
 433                speed = hu->proto->init_speed;
 434        else
 435                speed = 0;
 436
 437        if (speed)
 438                host_set_baudrate(hu, speed);
 439
 440        /* Operational speed if any */
 441        if (hu->oper_speed)
 442                speed = hu->oper_speed;
 443        else if (hu->proto->oper_speed)
 444                speed = hu->proto->oper_speed;
 445        else
 446                speed = 0;
 447
 448        if (speed) {
 449                err = bcm_set_baudrate(hu, speed);
 450                if (!err)
 451                        host_set_baudrate(hu, speed);
 452        }
 453
 454finalize:
 455        release_firmware(fw);
 456
 457        err = btbcm_finalize(hu->hdev);
 458        if (err)
 459                return err;
 460
 461        if (!bcm_request_irq(bcm))
 462                err = bcm_setup_sleep(hu);
 463
 464        return err;
 465}
 466
 467#define BCM_RECV_LM_DIAG \
 468        .type = BCM_LM_DIAG_PKT, \
 469        .hlen = BCM_LM_DIAG_SIZE, \
 470        .loff = 0, \
 471        .lsize = 0, \
 472        .maxlen = BCM_LM_DIAG_SIZE
 473
 474#define BCM_RECV_NULL \
 475        .type = BCM_NULL_PKT, \
 476        .hlen = BCM_NULL_SIZE, \
 477        .loff = 0, \
 478        .lsize = 0, \
 479        .maxlen = BCM_NULL_SIZE
 480
 481static const struct h4_recv_pkt bcm_recv_pkts[] = {
 482        { H4_RECV_ACL,      .recv = hci_recv_frame },
 483        { H4_RECV_SCO,      .recv = hci_recv_frame },
 484        { H4_RECV_EVENT,    .recv = hci_recv_frame },
 485        { BCM_RECV_LM_DIAG, .recv = hci_recv_diag  },
 486        { BCM_RECV_NULL,    .recv = hci_recv_diag  },
 487};
 488
 489static int bcm_recv(struct hci_uart *hu, const void *data, int count)
 490{
 491        struct bcm_data *bcm = hu->priv;
 492
 493        if (!test_bit(HCI_UART_REGISTERED, &hu->flags))
 494                return -EUNATCH;
 495
 496        bcm->rx_skb = h4_recv_buf(hu->hdev, bcm->rx_skb, data, count,
 497                                  bcm_recv_pkts, ARRAY_SIZE(bcm_recv_pkts));
 498        if (IS_ERR(bcm->rx_skb)) {
 499                int err = PTR_ERR(bcm->rx_skb);
 500                bt_dev_err(hu->hdev, "Frame reassembly failed (%d)", err);
 501                bcm->rx_skb = NULL;
 502                return err;
 503        } else if (!bcm->rx_skb) {
 504                /* Delay auto-suspend when receiving completed packet */
 505                mutex_lock(&bcm_device_lock);
 506                if (bcm->dev && bcm_device_exists(bcm->dev)) {
 507                        pm_runtime_get(&bcm->dev->pdev->dev);
 508                        pm_runtime_mark_last_busy(&bcm->dev->pdev->dev);
 509                        pm_runtime_put_autosuspend(&bcm->dev->pdev->dev);
 510                }
 511                mutex_unlock(&bcm_device_lock);
 512        }
 513
 514        return count;
 515}
 516
 517static int bcm_enqueue(struct hci_uart *hu, struct sk_buff *skb)
 518{
 519        struct bcm_data *bcm = hu->priv;
 520
 521        bt_dev_dbg(hu->hdev, "hu %p skb %p", hu, skb);
 522
 523        /* Prepend skb with frame type */
 524        memcpy(skb_push(skb, 1), &hci_skb_pkt_type(skb), 1);
 525        skb_queue_tail(&bcm->txq, skb);
 526
 527        return 0;
 528}
 529
 530static struct sk_buff *bcm_dequeue(struct hci_uart *hu)
 531{
 532        struct bcm_data *bcm = hu->priv;
 533        struct sk_buff *skb = NULL;
 534        struct bcm_device *bdev = NULL;
 535
 536        mutex_lock(&bcm_device_lock);
 537
 538        if (bcm_device_exists(bcm->dev)) {
 539                bdev = bcm->dev;
 540                pm_runtime_get_sync(&bdev->pdev->dev);
 541                /* Shall be resumed here */
 542        }
 543
 544        skb = skb_dequeue(&bcm->txq);
 545
 546        if (bdev) {
 547                pm_runtime_mark_last_busy(&bdev->pdev->dev);
 548                pm_runtime_put_autosuspend(&bdev->pdev->dev);
 549        }
 550
 551        mutex_unlock(&bcm_device_lock);
 552
 553        return skb;
 554}
 555
 556#ifdef CONFIG_PM
 557static int bcm_suspend_device(struct device *dev)
 558{
 559        struct bcm_device *bdev = platform_get_drvdata(to_platform_device(dev));
 560
 561        bt_dev_dbg(bdev, "");
 562
 563        if (!bdev->is_suspended && bdev->hu) {
 564                hci_uart_set_flow_control(bdev->hu, true);
 565
 566                /* Once this returns, driver suspends BT via GPIO */
 567                bdev->is_suspended = true;
 568        }
 569
 570        /* Suspend the device */
 571        if (bdev->device_wakeup) {
 572                gpiod_set_value(bdev->device_wakeup, false);
 573                bt_dev_dbg(bdev, "suspend, delaying 15 ms");
 574                mdelay(15);
 575        }
 576
 577        return 0;
 578}
 579
 580static int bcm_resume_device(struct device *dev)
 581{
 582        struct bcm_device *bdev = platform_get_drvdata(to_platform_device(dev));
 583
 584        bt_dev_dbg(bdev, "");
 585
 586        if (bdev->device_wakeup) {
 587                gpiod_set_value(bdev->device_wakeup, true);
 588                bt_dev_dbg(bdev, "resume, delaying 15 ms");
 589                mdelay(15);
 590        }
 591
 592        /* When this executes, the device has woken up already */
 593        if (bdev->is_suspended && bdev->hu) {
 594                bdev->is_suspended = false;
 595
 596                hci_uart_set_flow_control(bdev->hu, false);
 597        }
 598
 599        return 0;
 600}
 601#endif
 602
 603#ifdef CONFIG_PM_SLEEP
 604/* Platform suspend callback */
 605static int bcm_suspend(struct device *dev)
 606{
 607        struct bcm_device *bdev = platform_get_drvdata(to_platform_device(dev));
 608        int error;
 609
 610        bt_dev_dbg(bdev, "suspend: is_suspended %d", bdev->is_suspended);
 611
 612        /* bcm_suspend can be called at any time as long as platform device is
 613         * bound, so it should use bcm_device_lock to protect access to hci_uart
 614         * and device_wake-up GPIO.
 615         */
 616        mutex_lock(&bcm_device_lock);
 617
 618        if (!bdev->hu)
 619                goto unlock;
 620
 621        if (pm_runtime_active(dev))
 622                bcm_suspend_device(dev);
 623
 624        if (device_may_wakeup(&bdev->pdev->dev)) {
 625                error = enable_irq_wake(bdev->irq);
 626                if (!error)
 627                        bt_dev_dbg(bdev, "BCM irq: enabled");
 628        }
 629
 630unlock:
 631        mutex_unlock(&bcm_device_lock);
 632
 633        return 0;
 634}
 635
 636/* Platform resume callback */
 637static int bcm_resume(struct device *dev)
 638{
 639        struct bcm_device *bdev = platform_get_drvdata(to_platform_device(dev));
 640
 641        bt_dev_dbg(bdev, "resume: is_suspended %d", bdev->is_suspended);
 642
 643        /* bcm_resume can be called at any time as long as platform device is
 644         * bound, so it should use bcm_device_lock to protect access to hci_uart
 645         * and device_wake-up GPIO.
 646         */
 647        mutex_lock(&bcm_device_lock);
 648
 649        if (!bdev->hu)
 650                goto unlock;
 651
 652        if (device_may_wakeup(&bdev->pdev->dev)) {
 653                disable_irq_wake(bdev->irq);
 654                bt_dev_dbg(bdev, "BCM irq: disabled");
 655        }
 656
 657        bcm_resume_device(dev);
 658
 659unlock:
 660        mutex_unlock(&bcm_device_lock);
 661
 662        pm_runtime_disable(dev);
 663        pm_runtime_set_active(dev);
 664        pm_runtime_enable(dev);
 665
 666        return 0;
 667}
 668#endif
 669
 670static const struct acpi_gpio_params int_last_device_wakeup_gpios = { 0, 0, false };
 671static const struct acpi_gpio_params int_last_shutdown_gpios = { 1, 0, false };
 672static const struct acpi_gpio_params int_last_host_wakeup_gpios = { 2, 0, false };
 673
 674static const struct acpi_gpio_mapping acpi_bcm_int_last_gpios[] = {
 675        { "device-wakeup-gpios", &int_last_device_wakeup_gpios, 1 },
 676        { "shutdown-gpios", &int_last_shutdown_gpios, 1 },
 677        { "host-wakeup-gpios", &int_last_host_wakeup_gpios, 1 },
 678        { },
 679};
 680
 681static const struct acpi_gpio_params int_first_host_wakeup_gpios = { 0, 0, false };
 682static const struct acpi_gpio_params int_first_device_wakeup_gpios = { 1, 0, false };
 683static const struct acpi_gpio_params int_first_shutdown_gpios = { 2, 0, false };
 684
 685static const struct acpi_gpio_mapping acpi_bcm_int_first_gpios[] = {
 686        { "device-wakeup-gpios", &int_first_device_wakeup_gpios, 1 },
 687        { "shutdown-gpios", &int_first_shutdown_gpios, 1 },
 688        { "host-wakeup-gpios", &int_first_host_wakeup_gpios, 1 },
 689        { },
 690};
 691
 692#ifdef CONFIG_ACPI
 693static u8 acpi_active_low = ACPI_ACTIVE_LOW;
 694
 695/* IRQ polarity of some chipsets are not defined correctly in ACPI table. */
 696static const struct dmi_system_id bcm_wrong_irq_dmi_table[] = {
 697        {
 698                .ident = "Asus T100TA",
 699                .matches = {
 700                        DMI_EXACT_MATCH(DMI_SYS_VENDOR,
 701                                        "ASUSTeK COMPUTER INC."),
 702                        DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "T100TA"),
 703                },
 704                .driver_data = &acpi_active_low,
 705        },
 706        {
 707                .ident = "Asus T100CHI",
 708                .matches = {
 709                        DMI_EXACT_MATCH(DMI_SYS_VENDOR,
 710                                        "ASUSTeK COMPUTER INC."),
 711                        DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "T100CHI"),
 712                },
 713                .driver_data = &acpi_active_low,
 714        },
 715        {       /* Handle ThinkPad 8 tablets with BCM2E55 chipset ACPI ID */
 716                .ident = "Lenovo ThinkPad 8",
 717                .matches = {
 718                        DMI_EXACT_MATCH(DMI_SYS_VENDOR, "LENOVO"),
 719                        DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "ThinkPad 8"),
 720                },
 721                .driver_data = &acpi_active_low,
 722        },
 723        { }
 724};
 725
 726static int bcm_resource(struct acpi_resource *ares, void *data)
 727{
 728        struct bcm_device *dev = data;
 729        struct acpi_resource_extended_irq *irq;
 730        struct acpi_resource_gpio *gpio;
 731        struct acpi_resource_uart_serialbus *sb;
 732
 733        switch (ares->type) {
 734        case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
 735                irq = &ares->data.extended_irq;
 736                dev->irq_polarity = irq->polarity;
 737                break;
 738
 739        case ACPI_RESOURCE_TYPE_GPIO:
 740                gpio = &ares->data.gpio;
 741                if (gpio->connection_type == ACPI_RESOURCE_GPIO_TYPE_INT)
 742                        dev->irq_polarity = gpio->polarity;
 743                break;
 744
 745        case ACPI_RESOURCE_TYPE_SERIAL_BUS:
 746                sb = &ares->data.uart_serial_bus;
 747                if (sb->type == ACPI_RESOURCE_SERIAL_TYPE_UART) {
 748                        dev->init_speed = sb->default_baud_rate;
 749                        dev->oper_speed = 4000000;
 750                }
 751                break;
 752
 753        default:
 754                break;
 755        }
 756
 757        /* Always tell the ACPI core to skip this resource */
 758        return 1;
 759}
 760#endif /* CONFIG_ACPI */
 761
 762static int bcm_platform_probe(struct bcm_device *dev)
 763{
 764        struct platform_device *pdev = dev->pdev;
 765
 766        dev->name = dev_name(&pdev->dev);
 767
 768        dev->clk = devm_clk_get(&pdev->dev, NULL);
 769
 770        dev->device_wakeup = devm_gpiod_get_optional(&pdev->dev,
 771                                                     "device-wakeup",
 772                                                     GPIOD_OUT_LOW);
 773        if (IS_ERR(dev->device_wakeup))
 774                return PTR_ERR(dev->device_wakeup);
 775
 776        dev->shutdown = devm_gpiod_get_optional(&pdev->dev, "shutdown",
 777                                                GPIOD_OUT_LOW);
 778        if (IS_ERR(dev->shutdown))
 779                return PTR_ERR(dev->shutdown);
 780
 781        /* IRQ can be declared in ACPI table as Interrupt or GpioInt */
 782        dev->irq = platform_get_irq(pdev, 0);
 783        if (dev->irq <= 0) {
 784                struct gpio_desc *gpio;
 785
 786                gpio = devm_gpiod_get_optional(&pdev->dev, "host-wakeup",
 787                                               GPIOD_IN);
 788                if (IS_ERR(gpio))
 789                        return PTR_ERR(gpio);
 790
 791                dev->irq = gpiod_to_irq(gpio);
 792        }
 793
 794        dev_info(&pdev->dev, "BCM irq: %d\n", dev->irq);
 795
 796        /* Make sure at-least one of the GPIO is defined and that
 797         * a name is specified for this instance
 798         */
 799        if ((!dev->device_wakeup && !dev->shutdown) || !dev->name) {
 800                dev_err(&pdev->dev, "invalid platform data\n");
 801                return -EINVAL;
 802        }
 803
 804        return 0;
 805}
 806
 807#ifdef CONFIG_ACPI
 808static int bcm_acpi_probe(struct bcm_device *dev)
 809{
 810        struct platform_device *pdev = dev->pdev;
 811        LIST_HEAD(resources);
 812        const struct dmi_system_id *dmi_id;
 813        const struct acpi_gpio_mapping *gpio_mapping = acpi_bcm_int_last_gpios;
 814        const struct acpi_device_id *id;
 815        int ret;
 816
 817        /* Retrieve GPIO data */
 818        id = acpi_match_device(pdev->dev.driver->acpi_match_table, &pdev->dev);
 819        if (id)
 820                gpio_mapping = (const struct acpi_gpio_mapping *) id->driver_data;
 821
 822        ret = devm_acpi_dev_add_driver_gpios(&pdev->dev, gpio_mapping);
 823        if (ret)
 824                return ret;
 825
 826        ret = bcm_platform_probe(dev);
 827        if (ret)
 828                return ret;
 829
 830        /* Retrieve UART ACPI info */
 831        ret = acpi_dev_get_resources(ACPI_COMPANION(&dev->pdev->dev),
 832                                     &resources, bcm_resource, dev);
 833        if (ret < 0)
 834                return ret;
 835        acpi_dev_free_resource_list(&resources);
 836
 837        dmi_id = dmi_first_match(bcm_wrong_irq_dmi_table);
 838        if (dmi_id) {
 839                bt_dev_warn(dev, "%s: Overwriting IRQ polarity to active low",
 840                            dmi_id->ident);
 841                dev->irq_polarity = *(u8 *)dmi_id->driver_data;
 842        }
 843
 844        return 0;
 845}
 846#else
 847static int bcm_acpi_probe(struct bcm_device *dev)
 848{
 849        return -EINVAL;
 850}
 851#endif /* CONFIG_ACPI */
 852
 853static int bcm_probe(struct platform_device *pdev)
 854{
 855        struct bcm_device *dev;
 856        int ret;
 857
 858        dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL);
 859        if (!dev)
 860                return -ENOMEM;
 861
 862        dev->pdev = pdev;
 863
 864        if (has_acpi_companion(&pdev->dev))
 865                ret = bcm_acpi_probe(dev);
 866        else
 867                ret = bcm_platform_probe(dev);
 868        if (ret)
 869                return ret;
 870
 871        platform_set_drvdata(pdev, dev);
 872
 873        dev_info(&pdev->dev, "%s device registered.\n", dev->name);
 874
 875        /* Place this instance on the device list */
 876        mutex_lock(&bcm_device_lock);
 877        list_add_tail(&dev->list, &bcm_device_list);
 878        mutex_unlock(&bcm_device_lock);
 879
 880        bcm_gpio_set_power(dev, false);
 881
 882        return 0;
 883}
 884
 885static int bcm_remove(struct platform_device *pdev)
 886{
 887        struct bcm_device *dev = platform_get_drvdata(pdev);
 888
 889        mutex_lock(&bcm_device_lock);
 890        list_del(&dev->list);
 891        mutex_unlock(&bcm_device_lock);
 892
 893        dev_info(&pdev->dev, "%s device unregistered.\n", dev->name);
 894
 895        return 0;
 896}
 897
 898static const struct hci_uart_proto bcm_proto = {
 899        .id             = HCI_UART_BCM,
 900        .name           = "Broadcom",
 901        .manufacturer   = 15,
 902        .init_speed     = 115200,
 903        .open           = bcm_open,
 904        .close          = bcm_close,
 905        .flush          = bcm_flush,
 906        .setup          = bcm_setup,
 907        .set_baudrate   = bcm_set_baudrate,
 908        .recv           = bcm_recv,
 909        .enqueue        = bcm_enqueue,
 910        .dequeue        = bcm_dequeue,
 911};
 912
 913#ifdef CONFIG_ACPI
 914static const struct acpi_device_id bcm_acpi_match[] = {
 915        { "BCM2E1A", (kernel_ulong_t)&acpi_bcm_int_last_gpios },
 916        { "BCM2E39", (kernel_ulong_t)&acpi_bcm_int_last_gpios },
 917        { "BCM2E3A", (kernel_ulong_t)&acpi_bcm_int_last_gpios },
 918        { "BCM2E3D", (kernel_ulong_t)&acpi_bcm_int_last_gpios },
 919        { "BCM2E3F", (kernel_ulong_t)&acpi_bcm_int_last_gpios },
 920        { "BCM2E40", (kernel_ulong_t)&acpi_bcm_int_last_gpios },
 921        { "BCM2E54", (kernel_ulong_t)&acpi_bcm_int_last_gpios },
 922        { "BCM2E55", (kernel_ulong_t)&acpi_bcm_int_last_gpios },
 923        { "BCM2E64", (kernel_ulong_t)&acpi_bcm_int_last_gpios },
 924        { "BCM2E65", (kernel_ulong_t)&acpi_bcm_int_last_gpios },
 925        { "BCM2E67", (kernel_ulong_t)&acpi_bcm_int_last_gpios },
 926        { "BCM2E71", (kernel_ulong_t)&acpi_bcm_int_last_gpios },
 927        { "BCM2E7B", (kernel_ulong_t)&acpi_bcm_int_last_gpios },
 928        { "BCM2E7C", (kernel_ulong_t)&acpi_bcm_int_last_gpios },
 929        { "BCM2E95", (kernel_ulong_t)&acpi_bcm_int_first_gpios },
 930        { "BCM2E96", (kernel_ulong_t)&acpi_bcm_int_first_gpios },
 931        { },
 932};
 933MODULE_DEVICE_TABLE(acpi, bcm_acpi_match);
 934#endif
 935
 936/* Platform suspend and resume callbacks */
 937static const struct dev_pm_ops bcm_pm_ops = {
 938        SET_SYSTEM_SLEEP_PM_OPS(bcm_suspend, bcm_resume)
 939        SET_RUNTIME_PM_OPS(bcm_suspend_device, bcm_resume_device, NULL)
 940};
 941
 942static struct platform_driver bcm_driver = {
 943        .probe = bcm_probe,
 944        .remove = bcm_remove,
 945        .driver = {
 946                .name = "hci_bcm",
 947                .acpi_match_table = ACPI_PTR(bcm_acpi_match),
 948                .pm = &bcm_pm_ops,
 949        },
 950};
 951
 952static int bcm_serdev_probe(struct serdev_device *serdev)
 953{
 954        struct bcm_serdev *bcmdev;
 955        u32 speed;
 956        int err;
 957
 958        bcmdev = devm_kzalloc(&serdev->dev, sizeof(*bcmdev), GFP_KERNEL);
 959        if (!bcmdev)
 960                return -ENOMEM;
 961
 962        bcmdev->hu.serdev = serdev;
 963        serdev_device_set_drvdata(serdev, bcmdev);
 964
 965        err = device_property_read_u32(&serdev->dev, "max-speed", &speed);
 966        if (!err)
 967                bcmdev->hu.oper_speed = speed;
 968
 969        return hci_uart_register_device(&bcmdev->hu, &bcm_proto);
 970}
 971
 972static void bcm_serdev_remove(struct serdev_device *serdev)
 973{
 974        struct bcm_serdev *bcmdev = serdev_device_get_drvdata(serdev);
 975
 976        hci_uart_unregister_device(&bcmdev->hu);
 977}
 978
 979#ifdef CONFIG_OF
 980static const struct of_device_id bcm_bluetooth_of_match[] = {
 981        { .compatible = "brcm,bcm43438-bt" },
 982        { },
 983};
 984MODULE_DEVICE_TABLE(of, bcm_bluetooth_of_match);
 985#endif
 986
 987static struct serdev_device_driver bcm_serdev_driver = {
 988        .probe = bcm_serdev_probe,
 989        .remove = bcm_serdev_remove,
 990        .driver = {
 991                .name = "hci_uart_bcm",
 992                .of_match_table = of_match_ptr(bcm_bluetooth_of_match),
 993        },
 994};
 995
 996int __init bcm_init(void)
 997{
 998        /* For now, we need to keep both platform device
 999         * driver (ACPI generated) and serdev driver (DT).
1000         */
1001        platform_driver_register(&bcm_driver);
1002        serdev_device_driver_register(&bcm_serdev_driver);
1003
1004        return hci_uart_register_proto(&bcm_proto);
1005}
1006
1007int __exit bcm_deinit(void)
1008{
1009        platform_driver_unregister(&bcm_driver);
1010        serdev_device_driver_unregister(&bcm_serdev_driver);
1011
1012        return hci_uart_unregister_proto(&bcm_proto);
1013}
1014