2 * Bluetooth HCI UART H4 driver with Nokia Extensions AKA Nokia H4+
4 * Copyright (C) 2015 Marcel Holtmann <marcel@holtmann.org>
5 * Copyright (C) 2015-2017 Sebastian Reichel <sre@kernel.org>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
18 #include <linux/clk.h>
19 #include <linux/errno.h>
20 #include <linux/firmware.h>
21 #include <linux/gpio/consumer.h>
22 #include <linux/interrupt.h>
23 #include <linux/kernel.h>
24 #include <linux/module.h>
26 #include <linux/pm_runtime.h>
27 #include <linux/serdev.h>
28 #include <linux/skbuff.h>
29 #include <linux/slab.h>
30 #include <linux/string.h>
31 #include <linux/types.h>
32 #include <asm/unaligned.h>
33 #include <net/bluetooth/bluetooth.h>
34 #include <net/bluetooth/hci_core.h>
41 #define NOKIA_ID_BCM2048 0x04
42 #define NOKIA_ID_TI1271 0x31
44 #define FIRMWARE_BCM2048 "nokia/bcmfw.bin"
45 #define FIRMWARE_TI1271 "nokia/ti1273.bin"
47 #define HCI_NOKIA_NEG_PKT 0x06
48 #define HCI_NOKIA_ALIVE_PKT 0x07
49 #define HCI_NOKIA_RADIO_PKT 0x08
51 #define HCI_NOKIA_NEG_HDR_SIZE 1
52 #define HCI_NOKIA_MAX_NEG_SIZE 255
53 #define HCI_NOKIA_ALIVE_HDR_SIZE 1
54 #define HCI_NOKIA_MAX_ALIVE_SIZE 255
55 #define HCI_NOKIA_RADIO_HDR_SIZE 2
56 #define HCI_NOKIA_MAX_RADIO_SIZE 255
58 #define NOKIA_PROTO_PKT 0x44
59 #define NOKIA_PROTO_BYTE 0x4c
61 #define NOKIA_NEG_REQ 0x00
62 #define NOKIA_NEG_ACK 0x20
63 #define NOKIA_NEG_NAK 0x40
65 #define H4_TYPE_SIZE 1
67 #define NOKIA_RECV_ALIVE \
68 .type = HCI_NOKIA_ALIVE_PKT, \
69 .hlen = HCI_NOKIA_ALIVE_HDR_SIZE, \
72 .maxlen = HCI_NOKIA_MAX_ALIVE_SIZE \
74 #define NOKIA_RECV_NEG \
75 .type = HCI_NOKIA_NEG_PKT, \
76 .hlen = HCI_NOKIA_NEG_HDR_SIZE, \
79 .maxlen = HCI_NOKIA_MAX_NEG_SIZE \
81 #define NOKIA_RECV_RADIO \
82 .type = HCI_NOKIA_RADIO_PKT, \
83 .hlen = HCI_NOKIA_RADIO_HDR_SIZE, \
86 .maxlen = HCI_NOKIA_MAX_RADIO_SIZE \
88 struct hci_nokia_neg_hdr {
92 struct hci_nokia_neg_cmd
{
101 #define NOKIA_ALIVE_REQ 0x55
102 #define NOKIA_ALIVE_RESP 0xcc
104 struct hci_nokia_alive_hdr
{
108 struct hci_nokia_alive_pkt
{
113 struct hci_nokia_neg_evt
{
124 #define MAX_BAUD_RATE 3692300
125 #define SETUP_BAUD_RATE 921600
126 #define INIT_BAUD_RATE 120000
128 struct hci_nokia_radio_hdr
{
133 struct nokia_bt_dev
{
135 struct serdev_device
*serdev
;
137 struct gpio_desc
*reset
;
138 struct gpio_desc
*wakeup_host
;
139 struct gpio_desc
*wakeup_bt
;
140 unsigned long sysclk_speed
;
143 struct sk_buff
*rx_skb
;
144 struct sk_buff_head txq
;
148 struct completion init_completion
;
158 static int nokia_enqueue(struct hci_uart
*hu
, struct sk_buff
*skb
);
160 static void nokia_flow_control(struct serdev_device
*serdev
, bool enable
)
163 serdev_device_set_rts(serdev
, true);
164 serdev_device_set_flow_control(serdev
, true);
166 serdev_device_set_flow_control(serdev
, false);
167 serdev_device_set_rts(serdev
, false);
171 static irqreturn_t
wakeup_handler(int irq
, void *data
)
173 struct nokia_bt_dev
*btdev
= data
;
174 struct device
*dev
= &btdev
->serdev
->dev
;
175 int wake_state
= gpiod_get_value(btdev
->wakeup_host
);
177 if (btdev
->rx_enabled
== wake_state
)
185 btdev
->rx_enabled
= wake_state
;
190 static int nokia_reset(struct hci_uart
*hu
)
192 struct nokia_bt_dev
*btdev
= hu
->priv
;
193 struct device
*dev
= &btdev
->serdev
->dev
;
197 gpiod_set_value_cansleep(btdev
->reset
, 1);
198 gpiod_set_value_cansleep(btdev
->wakeup_bt
, 1);
203 err
= gpiod_get_value_cansleep(btdev
->wakeup_host
);
205 dev_err(dev
, "reset: host wakeup not low!");
210 serdev_device_write_flush(btdev
->serdev
);
213 nokia_flow_control(btdev
->serdev
, false);
214 serdev_device_set_baudrate(btdev
->serdev
, INIT_BAUD_RATE
);
216 gpiod_set_value_cansleep(btdev
->reset
, 0);
219 err
= serdev_device_wait_for_cts(btdev
->serdev
, true, 200);
221 dev_err(dev
, "CTS not received: %d", err
);
225 nokia_flow_control(btdev
->serdev
, true);
230 static int nokia_send_alive_packet(struct hci_uart
*hu
)
232 struct nokia_bt_dev
*btdev
= hu
->priv
;
233 struct device
*dev
= &btdev
->serdev
->dev
;
234 struct hci_nokia_alive_hdr
*hdr
;
235 struct hci_nokia_alive_pkt
*pkt
;
239 init_completion(&btdev
->init_completion
);
241 len
= H4_TYPE_SIZE
+ sizeof(*hdr
) + sizeof(*pkt
);
242 skb
= bt_skb_alloc(len
, GFP_KERNEL
);
246 hci_skb_pkt_type(skb
) = HCI_NOKIA_ALIVE_PKT
;
247 memset(skb
->data
, 0x00, len
);
249 hdr
= skb_put(skb
, sizeof(*hdr
));
250 hdr
->dlen
= sizeof(*pkt
);
251 pkt
= skb_put(skb
, sizeof(*pkt
));
252 pkt
->mid
= NOKIA_ALIVE_REQ
;
254 nokia_enqueue(hu
, skb
);
255 hci_uart_tx_wakeup(hu
);
257 dev_dbg(dev
, "Alive sent");
259 if (!wait_for_completion_interruptible_timeout(&btdev
->init_completion
,
260 msecs_to_jiffies(1000))) {
264 if (btdev
->init_error
< 0)
265 return btdev
->init_error
;
270 static int nokia_send_negotiation(struct hci_uart
*hu
)
272 struct nokia_bt_dev
*btdev
= hu
->priv
;
273 struct device
*dev
= &btdev
->serdev
->dev
;
274 struct hci_nokia_neg_cmd
*neg_cmd
;
275 struct hci_nokia_neg_hdr
*neg_hdr
;
278 u16 baud
= DIV_ROUND_CLOSEST(btdev
->sysclk_speed
* 10, SETUP_BAUD_RATE
);
279 int sysclk
= btdev
->sysclk_speed
/ 1000;
281 len
= H4_TYPE_SIZE
+ sizeof(*neg_hdr
) + sizeof(*neg_cmd
);
282 skb
= bt_skb_alloc(len
, GFP_KERNEL
);
286 hci_skb_pkt_type(skb
) = HCI_NOKIA_NEG_PKT
;
288 neg_hdr
= skb_put(skb
, sizeof(*neg_hdr
));
289 neg_hdr
->dlen
= sizeof(*neg_cmd
);
291 neg_cmd
= skb_put(skb
, sizeof(*neg_cmd
));
292 neg_cmd
->ack
= NOKIA_NEG_REQ
;
293 neg_cmd
->baud
= cpu_to_le16(baud
);
294 neg_cmd
->unused1
= 0x0000;
295 neg_cmd
->proto
= NOKIA_PROTO_BYTE
;
296 neg_cmd
->sys_clk
= cpu_to_le16(sysclk
);
297 neg_cmd
->unused2
= 0x0000;
299 btdev
->init_error
= 0;
300 init_completion(&btdev
->init_completion
);
302 nokia_enqueue(hu
, skb
);
303 hci_uart_tx_wakeup(hu
);
305 dev_dbg(dev
, "Negotiation sent");
307 if (!wait_for_completion_interruptible_timeout(&btdev
->init_completion
,
308 msecs_to_jiffies(10000))) {
312 if (btdev
->init_error
< 0)
313 return btdev
->init_error
;
315 /* Change to previously negotiated speed. Flow Control
316 * is disabled until bluetooth adapter is ready to avoid
317 * broken bytes being received.
319 nokia_flow_control(btdev
->serdev
, false);
320 serdev_device_set_baudrate(btdev
->serdev
, SETUP_BAUD_RATE
);
321 err
= serdev_device_wait_for_cts(btdev
->serdev
, true, 200);
323 dev_err(dev
, "CTS not received: %d", err
);
326 nokia_flow_control(btdev
->serdev
, true);
328 dev_dbg(dev
, "Negotiation successful");
333 static int nokia_setup_fw(struct hci_uart
*hu
)
335 struct nokia_bt_dev
*btdev
= hu
->priv
;
336 struct device
*dev
= &btdev
->serdev
->dev
;
338 const struct firmware
*fw
;
343 dev_dbg(dev
, "setup firmware");
345 if (btdev
->man_id
== NOKIA_ID_BCM2048
) {
346 fwname
= FIRMWARE_BCM2048
;
347 } else if (btdev
->man_id
== NOKIA_ID_TI1271
) {
348 fwname
= FIRMWARE_TI1271
;
350 dev_err(dev
, "Unsupported bluetooth device!");
354 err
= request_firmware(&fw
, fwname
, dev
);
356 dev_err(dev
, "%s: Failed to load Nokia firmware file (%d)",
357 hu
->hdev
->name
, err
);
364 while (fw_size
>= 4) {
365 u16 pkt_size
= get_unaligned_le16(fw_ptr
);
366 u8 pkt_type
= fw_ptr
[2];
367 const struct hci_command_hdr
*cmd
;
372 case HCI_COMMAND_PKT
:
373 cmd
= (struct hci_command_hdr
*)(fw_ptr
+ 3);
374 opcode
= le16_to_cpu(cmd
->opcode
);
376 skb
= __hci_cmd_sync(hu
->hdev
, opcode
, cmd
->plen
,
377 fw_ptr
+ 3 + HCI_COMMAND_HDR_SIZE
,
381 dev_err(dev
, "%s: FW command %04x failed (%d)",
382 hu
->hdev
->name
, opcode
, err
);
387 case HCI_NOKIA_RADIO_PKT
:
388 case HCI_NOKIA_NEG_PKT
:
389 case HCI_NOKIA_ALIVE_PKT
:
393 fw_ptr
+= pkt_size
+ 2;
394 fw_size
-= pkt_size
+ 2;
398 release_firmware(fw
);
402 static int nokia_setup(struct hci_uart
*hu
)
404 struct nokia_bt_dev
*btdev
= hu
->priv
;
405 struct device
*dev
= &btdev
->serdev
->dev
;
408 btdev
->initialized
= false;
410 nokia_flow_control(btdev
->serdev
, false);
412 pm_runtime_get_sync(dev
);
414 if (btdev
->tx_enabled
) {
415 gpiod_set_value_cansleep(btdev
->wakeup_bt
, 0);
416 pm_runtime_put(&btdev
->serdev
->dev
);
417 btdev
->tx_enabled
= false;
420 dev_dbg(dev
, "protocol setup");
422 /* 0. reset connection */
423 err
= nokia_reset(hu
);
425 dev_err(dev
, "Reset failed: %d", err
);
429 /* 1. negotiate speed etc */
430 err
= nokia_send_negotiation(hu
);
432 dev_err(dev
, "Negotiation failed: %d", err
);
436 /* 2. verify correct setup using alive packet */
437 err
= nokia_send_alive_packet(hu
);
439 dev_err(dev
, "Alive check failed: %d", err
);
443 /* 3. send firmware */
444 err
= nokia_setup_fw(hu
);
446 dev_err(dev
, "Could not setup FW: %d", err
);
450 nokia_flow_control(btdev
->serdev
, false);
451 serdev_device_set_baudrate(btdev
->serdev
, MAX_BAUD_RATE
);
452 nokia_flow_control(btdev
->serdev
, true);
454 if (btdev
->man_id
== NOKIA_ID_BCM2048
) {
455 hu
->hdev
->set_bdaddr
= btbcm_set_bdaddr
;
456 set_bit(HCI_QUIRK_INVALID_BDADDR
, &hu
->hdev
->quirks
);
457 dev_dbg(dev
, "bcm2048 has invalid bluetooth address!");
460 dev_dbg(dev
, "protocol setup done!");
462 gpiod_set_value_cansleep(btdev
->wakeup_bt
, 0);
464 btdev
->tx_enabled
= false;
465 btdev
->initialized
= true;
474 static int nokia_open(struct hci_uart
*hu
)
476 struct device
*dev
= &hu
->serdev
->dev
;
478 dev_dbg(dev
, "protocol open");
480 pm_runtime_enable(dev
);
485 static int nokia_flush(struct hci_uart
*hu
)
487 struct nokia_bt_dev
*btdev
= hu
->priv
;
489 dev_dbg(&btdev
->serdev
->dev
, "flush device");
491 skb_queue_purge(&btdev
->txq
);
496 static int nokia_close(struct hci_uart
*hu
)
498 struct nokia_bt_dev
*btdev
= hu
->priv
;
499 struct device
*dev
= &btdev
->serdev
->dev
;
501 dev_dbg(dev
, "close device");
503 btdev
->initialized
= false;
505 skb_queue_purge(&btdev
->txq
);
507 kfree_skb(btdev
->rx_skb
);
510 gpiod_set_value(btdev
->reset
, 1);
511 gpiod_set_value(btdev
->wakeup_bt
, 0);
513 pm_runtime_disable(&btdev
->serdev
->dev
);
518 /* Enqueue frame for transmittion (padding, crc, etc) */
519 static int nokia_enqueue(struct hci_uart
*hu
, struct sk_buff
*skb
)
521 struct nokia_bt_dev
*btdev
= hu
->priv
;
524 /* Prepend skb with frame type */
525 memcpy(skb_push(skb
, 1), &bt_cb(skb
)->pkt_type
, 1);
527 /* Packets must be word aligned */
529 err
= skb_pad(skb
, 1);
532 skb_put_u8(skb
, 0x00);
535 skb_queue_tail(&btdev
->txq
, skb
);
540 static int nokia_recv_negotiation_packet(struct hci_dev
*hdev
,
543 struct hci_uart
*hu
= hci_get_drvdata(hdev
);
544 struct nokia_bt_dev
*btdev
= hu
->priv
;
545 struct device
*dev
= &btdev
->serdev
->dev
;
546 struct hci_nokia_neg_hdr
*hdr
;
547 struct hci_nokia_neg_evt
*evt
;
550 hdr
= (struct hci_nokia_neg_hdr
*)skb
->data
;
551 if (hdr
->dlen
!= sizeof(*evt
)) {
552 btdev
->init_error
= -EIO
;
557 evt
= skb_pull(skb
, sizeof(*hdr
));
559 if (evt
->ack
!= NOKIA_NEG_ACK
) {
560 dev_err(dev
, "Negotiation received: wrong reply");
561 btdev
->init_error
= -EINVAL
;
566 btdev
->man_id
= evt
->man_id
;
567 btdev
->ver_id
= evt
->ver_id
;
569 dev_dbg(dev
, "Negotiation received: baud=%u:clk=%u:manu=%u:vers=%u",
570 evt
->baud
, evt
->sys_clk
, evt
->man_id
, evt
->ver_id
);
573 complete(&btdev
->init_completion
);
578 static int nokia_recv_alive_packet(struct hci_dev
*hdev
, struct sk_buff
*skb
)
580 struct hci_uart
*hu
= hci_get_drvdata(hdev
);
581 struct nokia_bt_dev
*btdev
= hu
->priv
;
582 struct device
*dev
= &btdev
->serdev
->dev
;
583 struct hci_nokia_alive_hdr
*hdr
;
584 struct hci_nokia_alive_pkt
*pkt
;
587 hdr
= (struct hci_nokia_alive_hdr
*)skb
->data
;
588 if (hdr
->dlen
!= sizeof(*pkt
)) {
589 dev_err(dev
, "Corrupted alive message");
590 btdev
->init_error
= -EIO
;
595 pkt
= skb_pull(skb
, sizeof(*hdr
));
597 if (pkt
->mid
!= NOKIA_ALIVE_RESP
) {
598 dev_err(dev
, "Alive received: invalid response: 0x%02x!",
600 btdev
->init_error
= -EINVAL
;
605 dev_dbg(dev
, "Alive received");
608 complete(&btdev
->init_completion
);
613 static int nokia_recv_radio(struct hci_dev
*hdev
, struct sk_buff
*skb
)
615 /* Packets received on the dedicated radio channel are
616 * HCI events and so feed them back into the core.
618 hci_skb_pkt_type(skb
) = HCI_EVENT_PKT
;
619 return hci_recv_frame(hdev
, skb
);
623 static const struct h4_recv_pkt nokia_recv_pkts
[] = {
624 { H4_RECV_ACL
, .recv
= hci_recv_frame
},
625 { H4_RECV_SCO
, .recv
= hci_recv_frame
},
626 { H4_RECV_EVENT
, .recv
= hci_recv_frame
},
627 { NOKIA_RECV_ALIVE
, .recv
= nokia_recv_alive_packet
},
628 { NOKIA_RECV_NEG
, .recv
= nokia_recv_negotiation_packet
},
629 { NOKIA_RECV_RADIO
, .recv
= nokia_recv_radio
},
632 static int nokia_recv(struct hci_uart
*hu
, const void *data
, int count
)
634 struct nokia_bt_dev
*btdev
= hu
->priv
;
635 struct device
*dev
= &btdev
->serdev
->dev
;
638 if (!test_bit(HCI_UART_REGISTERED
, &hu
->flags
))
641 btdev
->rx_skb
= h4_recv_buf(hu
->hdev
, btdev
->rx_skb
, data
, count
,
642 nokia_recv_pkts
, ARRAY_SIZE(nokia_recv_pkts
));
643 if (IS_ERR(btdev
->rx_skb
)) {
644 err
= PTR_ERR(btdev
->rx_skb
);
645 dev_err(dev
, "Frame reassembly failed (%d)", err
);
646 btdev
->rx_skb
= NULL
;
653 static struct sk_buff
*nokia_dequeue(struct hci_uart
*hu
)
655 struct nokia_bt_dev
*btdev
= hu
->priv
;
656 struct device
*dev
= &btdev
->serdev
->dev
;
657 struct sk_buff
*result
= skb_dequeue(&btdev
->txq
);
659 if (!btdev
->initialized
)
662 if (btdev
->tx_enabled
== !!result
)
666 pm_runtime_get_sync(dev
);
667 gpiod_set_value_cansleep(btdev
->wakeup_bt
, 1);
669 serdev_device_wait_until_sent(btdev
->serdev
, 0);
670 gpiod_set_value_cansleep(btdev
->wakeup_bt
, 0);
674 btdev
->tx_enabled
= !!result
;
679 static const struct hci_uart_proto nokia_proto
= {
680 .id
= HCI_UART_NOKIA
,
683 .close
= nokia_close
,
685 .enqueue
= nokia_enqueue
,
686 .dequeue
= nokia_dequeue
,
687 .flush
= nokia_flush
,
688 .setup
= nokia_setup
,
692 static int nokia_bluetooth_serdev_probe(struct serdev_device
*serdev
)
694 struct device
*dev
= &serdev
->dev
;
695 struct nokia_bt_dev
*btdev
;
699 btdev
= devm_kzalloc(dev
, sizeof(*btdev
), GFP_KERNEL
);
703 btdev
->hu
.serdev
= btdev
->serdev
= serdev
;
704 serdev_device_set_drvdata(serdev
, btdev
);
706 btdev
->reset
= devm_gpiod_get(dev
, "reset", GPIOD_OUT_HIGH
);
707 if (IS_ERR(btdev
->reset
)) {
708 err
= PTR_ERR(btdev
->reset
);
709 dev_err(dev
, "could not get reset gpio: %d", err
);
713 btdev
->wakeup_host
= devm_gpiod_get(dev
, "host-wakeup", GPIOD_IN
);
714 if (IS_ERR(btdev
->wakeup_host
)) {
715 err
= PTR_ERR(btdev
->wakeup_host
);
716 dev_err(dev
, "could not get host wakeup gpio: %d", err
);
720 btdev
->wake_irq
= gpiod_to_irq(btdev
->wakeup_host
);
722 err
= devm_request_threaded_irq(dev
, btdev
->wake_irq
, NULL
,
724 IRQF_TRIGGER_RISING
| IRQF_TRIGGER_FALLING
| IRQF_ONESHOT
,
727 dev_err(dev
, "could request wakeup irq: %d", err
);
731 btdev
->wakeup_bt
= devm_gpiod_get(dev
, "bluetooth-wakeup",
733 if (IS_ERR(btdev
->wakeup_bt
)) {
734 err
= PTR_ERR(btdev
->wakeup_bt
);
735 dev_err(dev
, "could not get BT wakeup gpio: %d", err
);
739 sysclk
= devm_clk_get(dev
, "sysclk");
740 if (IS_ERR(sysclk
)) {
741 err
= PTR_ERR(sysclk
);
742 dev_err(dev
, "could not get sysclk: %d", err
);
746 clk_prepare_enable(sysclk
);
747 btdev
->sysclk_speed
= clk_get_rate(sysclk
);
748 clk_disable_unprepare(sysclk
);
750 skb_queue_head_init(&btdev
->txq
);
752 btdev
->hu
.priv
= btdev
;
753 btdev
->hu
.alignment
= 2; /* Nokia H4+ is word aligned */
755 err
= hci_uart_register_device(&btdev
->hu
, &nokia_proto
);
757 dev_err(dev
, "could not register bluetooth uart: %d", err
);
764 static void nokia_bluetooth_serdev_remove(struct serdev_device
*serdev
)
766 struct nokia_bt_dev
*btdev
= serdev_device_get_drvdata(serdev
);
768 hci_uart_unregister_device(&btdev
->hu
);
771 static int nokia_bluetooth_runtime_suspend(struct device
*dev
)
773 struct serdev_device
*serdev
= to_serdev_device(dev
);
775 nokia_flow_control(serdev
, false);
779 static int nokia_bluetooth_runtime_resume(struct device
*dev
)
781 struct serdev_device
*serdev
= to_serdev_device(dev
);
783 nokia_flow_control(serdev
, true);
787 static const struct dev_pm_ops nokia_bluetooth_pm_ops
= {
788 SET_RUNTIME_PM_OPS(nokia_bluetooth_runtime_suspend
,
789 nokia_bluetooth_runtime_resume
,
794 static const struct of_device_id nokia_bluetooth_of_match
[] = {
795 { .compatible
= "nokia,h4p-bluetooth", },
798 MODULE_DEVICE_TABLE(of
, nokia_bluetooth_of_match
);
801 static struct serdev_device_driver nokia_bluetooth_serdev_driver
= {
802 .probe
= nokia_bluetooth_serdev_probe
,
803 .remove
= nokia_bluetooth_serdev_remove
,
805 .name
= "nokia-bluetooth",
806 .pm
= &nokia_bluetooth_pm_ops
,
807 .of_match_table
= of_match_ptr(nokia_bluetooth_of_match
),
811 module_serdev_device_driver(nokia_bluetooth_serdev_driver
);
813 MODULE_AUTHOR("Sebastian Reichel <sre@kernel.org>");
814 MODULE_DESCRIPTION("Bluetooth HCI UART Nokia H4+ driver ver " VERSION
);
815 MODULE_VERSION(VERSION
);
816 MODULE_LICENSE("GPL");