1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Bluetooth HCI UART H4 driver with Nokia Extensions AKA Nokia H4+
5 * Copyright (C) 2015 Marcel Holtmann <marcel@holtmann.org>
6 * Copyright (C) 2015-2017 Sebastian Reichel <sre@kernel.org>
10 #include <linux/errno.h>
11 #include <linux/firmware.h>
12 #include <linux/gpio/consumer.h>
13 #include <linux/interrupt.h>
14 #include <linux/kernel.h>
15 #include <linux/module.h>
17 #include <linux/pm_runtime.h>
18 #include <linux/serdev.h>
19 #include <linux/skbuff.h>
20 #include <linux/slab.h>
21 #include <linux/string.h>
22 #include <linux/types.h>
23 #include <asm/unaligned.h>
24 #include <net/bluetooth/bluetooth.h>
25 #include <net/bluetooth/hci_core.h>
32 #define NOKIA_ID_BCM2048 0x04
33 #define NOKIA_ID_TI1271 0x31
35 #define FIRMWARE_BCM2048 "nokia/bcmfw.bin"
36 #define FIRMWARE_TI1271 "nokia/ti1273.bin"
38 #define HCI_NOKIA_NEG_PKT 0x06
39 #define HCI_NOKIA_ALIVE_PKT 0x07
40 #define HCI_NOKIA_RADIO_PKT 0x08
42 #define HCI_NOKIA_NEG_HDR_SIZE 1
43 #define HCI_NOKIA_MAX_NEG_SIZE 255
44 #define HCI_NOKIA_ALIVE_HDR_SIZE 1
45 #define HCI_NOKIA_MAX_ALIVE_SIZE 255
46 #define HCI_NOKIA_RADIO_HDR_SIZE 2
47 #define HCI_NOKIA_MAX_RADIO_SIZE 255
49 #define NOKIA_PROTO_PKT 0x44
50 #define NOKIA_PROTO_BYTE 0x4c
52 #define NOKIA_NEG_REQ 0x00
53 #define NOKIA_NEG_ACK 0x20
54 #define NOKIA_NEG_NAK 0x40
56 #define H4_TYPE_SIZE 1
58 #define NOKIA_RECV_ALIVE \
59 .type = HCI_NOKIA_ALIVE_PKT, \
60 .hlen = HCI_NOKIA_ALIVE_HDR_SIZE, \
63 .maxlen = HCI_NOKIA_MAX_ALIVE_SIZE \
65 #define NOKIA_RECV_NEG \
66 .type = HCI_NOKIA_NEG_PKT, \
67 .hlen = HCI_NOKIA_NEG_HDR_SIZE, \
70 .maxlen = HCI_NOKIA_MAX_NEG_SIZE \
72 #define NOKIA_RECV_RADIO \
73 .type = HCI_NOKIA_RADIO_PKT, \
74 .hlen = HCI_NOKIA_RADIO_HDR_SIZE, \
77 .maxlen = HCI_NOKIA_MAX_RADIO_SIZE \
79 struct hci_nokia_neg_hdr {
83 struct hci_nokia_neg_cmd
{
92 #define NOKIA_ALIVE_REQ 0x55
93 #define NOKIA_ALIVE_RESP 0xcc
95 struct hci_nokia_alive_hdr
{
99 struct hci_nokia_alive_pkt
{
104 struct hci_nokia_neg_evt
{
115 #define MAX_BAUD_RATE 3692300
116 #define SETUP_BAUD_RATE 921600
117 #define INIT_BAUD_RATE 120000
119 struct hci_nokia_radio_hdr
{
124 struct nokia_bt_dev
{
126 struct serdev_device
*serdev
;
128 struct gpio_desc
*reset
;
129 struct gpio_desc
*wakeup_host
;
130 struct gpio_desc
*wakeup_bt
;
131 unsigned long sysclk_speed
;
134 struct sk_buff
*rx_skb
;
135 struct sk_buff_head txq
;
139 struct completion init_completion
;
149 static int nokia_enqueue(struct hci_uart
*hu
, struct sk_buff
*skb
);
151 static void nokia_flow_control(struct serdev_device
*serdev
, bool enable
)
154 serdev_device_set_rts(serdev
, true);
155 serdev_device_set_flow_control(serdev
, true);
157 serdev_device_set_flow_control(serdev
, false);
158 serdev_device_set_rts(serdev
, false);
162 static irqreturn_t
wakeup_handler(int irq
, void *data
)
164 struct nokia_bt_dev
*btdev
= data
;
165 struct device
*dev
= &btdev
->serdev
->dev
;
166 int wake_state
= gpiod_get_value(btdev
->wakeup_host
);
168 if (btdev
->rx_enabled
== wake_state
)
176 btdev
->rx_enabled
= wake_state
;
181 static int nokia_reset(struct hci_uart
*hu
)
183 struct nokia_bt_dev
*btdev
= hu
->priv
;
184 struct device
*dev
= &btdev
->serdev
->dev
;
188 gpiod_set_value_cansleep(btdev
->reset
, 1);
189 gpiod_set_value_cansleep(btdev
->wakeup_bt
, 1);
194 err
= gpiod_get_value_cansleep(btdev
->wakeup_host
);
196 dev_err(dev
, "reset: host wakeup not low!");
201 serdev_device_write_flush(btdev
->serdev
);
204 nokia_flow_control(btdev
->serdev
, false);
205 serdev_device_set_baudrate(btdev
->serdev
, INIT_BAUD_RATE
);
207 gpiod_set_value_cansleep(btdev
->reset
, 0);
210 err
= serdev_device_wait_for_cts(btdev
->serdev
, true, 200);
212 dev_err(dev
, "CTS not received: %d", err
);
216 nokia_flow_control(btdev
->serdev
, true);
221 static int nokia_send_alive_packet(struct hci_uart
*hu
)
223 struct nokia_bt_dev
*btdev
= hu
->priv
;
224 struct device
*dev
= &btdev
->serdev
->dev
;
225 struct hci_nokia_alive_hdr
*hdr
;
226 struct hci_nokia_alive_pkt
*pkt
;
230 init_completion(&btdev
->init_completion
);
232 len
= H4_TYPE_SIZE
+ sizeof(*hdr
) + sizeof(*pkt
);
233 skb
= bt_skb_alloc(len
, GFP_KERNEL
);
237 hci_skb_pkt_type(skb
) = HCI_NOKIA_ALIVE_PKT
;
238 memset(skb
->data
, 0x00, len
);
240 hdr
= skb_put(skb
, sizeof(*hdr
));
241 hdr
->dlen
= sizeof(*pkt
);
242 pkt
= skb_put(skb
, sizeof(*pkt
));
243 pkt
->mid
= NOKIA_ALIVE_REQ
;
245 nokia_enqueue(hu
, skb
);
246 hci_uart_tx_wakeup(hu
);
248 dev_dbg(dev
, "Alive sent");
250 if (!wait_for_completion_interruptible_timeout(&btdev
->init_completion
,
251 msecs_to_jiffies(1000))) {
255 if (btdev
->init_error
< 0)
256 return btdev
->init_error
;
261 static int nokia_send_negotiation(struct hci_uart
*hu
)
263 struct nokia_bt_dev
*btdev
= hu
->priv
;
264 struct device
*dev
= &btdev
->serdev
->dev
;
265 struct hci_nokia_neg_cmd
*neg_cmd
;
266 struct hci_nokia_neg_hdr
*neg_hdr
;
269 u16 baud
= DIV_ROUND_CLOSEST(btdev
->sysclk_speed
* 10, SETUP_BAUD_RATE
);
270 int sysclk
= btdev
->sysclk_speed
/ 1000;
272 len
= H4_TYPE_SIZE
+ sizeof(*neg_hdr
) + sizeof(*neg_cmd
);
273 skb
= bt_skb_alloc(len
, GFP_KERNEL
);
277 hci_skb_pkt_type(skb
) = HCI_NOKIA_NEG_PKT
;
279 neg_hdr
= skb_put(skb
, sizeof(*neg_hdr
));
280 neg_hdr
->dlen
= sizeof(*neg_cmd
);
282 neg_cmd
= skb_put(skb
, sizeof(*neg_cmd
));
283 neg_cmd
->ack
= NOKIA_NEG_REQ
;
284 neg_cmd
->baud
= cpu_to_le16(baud
);
285 neg_cmd
->unused1
= 0x0000;
286 neg_cmd
->proto
= NOKIA_PROTO_BYTE
;
287 neg_cmd
->sys_clk
= cpu_to_le16(sysclk
);
288 neg_cmd
->unused2
= 0x0000;
290 btdev
->init_error
= 0;
291 init_completion(&btdev
->init_completion
);
293 nokia_enqueue(hu
, skb
);
294 hci_uart_tx_wakeup(hu
);
296 dev_dbg(dev
, "Negotiation sent");
298 if (!wait_for_completion_interruptible_timeout(&btdev
->init_completion
,
299 msecs_to_jiffies(10000))) {
303 if (btdev
->init_error
< 0)
304 return btdev
->init_error
;
306 /* Change to previously negotiated speed. Flow Control
307 * is disabled until bluetooth adapter is ready to avoid
308 * broken bytes being received.
310 nokia_flow_control(btdev
->serdev
, false);
311 serdev_device_set_baudrate(btdev
->serdev
, SETUP_BAUD_RATE
);
312 err
= serdev_device_wait_for_cts(btdev
->serdev
, true, 200);
314 dev_err(dev
, "CTS not received: %d", err
);
317 nokia_flow_control(btdev
->serdev
, true);
319 dev_dbg(dev
, "Negotiation successful");
324 static int nokia_setup_fw(struct hci_uart
*hu
)
326 struct nokia_bt_dev
*btdev
= hu
->priv
;
327 struct device
*dev
= &btdev
->serdev
->dev
;
329 const struct firmware
*fw
;
334 dev_dbg(dev
, "setup firmware");
336 if (btdev
->man_id
== NOKIA_ID_BCM2048
) {
337 fwname
= FIRMWARE_BCM2048
;
338 } else if (btdev
->man_id
== NOKIA_ID_TI1271
) {
339 fwname
= FIRMWARE_TI1271
;
341 dev_err(dev
, "Unsupported bluetooth device!");
345 err
= request_firmware(&fw
, fwname
, dev
);
347 dev_err(dev
, "%s: Failed to load Nokia firmware file (%d)",
348 hu
->hdev
->name
, err
);
355 while (fw_size
>= 4) {
356 u16 pkt_size
= get_unaligned_le16(fw_ptr
);
357 u8 pkt_type
= fw_ptr
[2];
358 const struct hci_command_hdr
*cmd
;
363 case HCI_COMMAND_PKT
:
364 cmd
= (struct hci_command_hdr
*)(fw_ptr
+ 3);
365 opcode
= le16_to_cpu(cmd
->opcode
);
367 skb
= __hci_cmd_sync(hu
->hdev
, opcode
, cmd
->plen
,
368 fw_ptr
+ 3 + HCI_COMMAND_HDR_SIZE
,
372 dev_err(dev
, "%s: FW command %04x failed (%d)",
373 hu
->hdev
->name
, opcode
, err
);
378 case HCI_NOKIA_RADIO_PKT
:
379 case HCI_NOKIA_NEG_PKT
:
380 case HCI_NOKIA_ALIVE_PKT
:
384 fw_ptr
+= pkt_size
+ 2;
385 fw_size
-= pkt_size
+ 2;
389 release_firmware(fw
);
393 static int nokia_setup(struct hci_uart
*hu
)
395 struct nokia_bt_dev
*btdev
= hu
->priv
;
396 struct device
*dev
= &btdev
->serdev
->dev
;
399 btdev
->initialized
= false;
401 nokia_flow_control(btdev
->serdev
, false);
403 pm_runtime_get_sync(dev
);
405 if (btdev
->tx_enabled
) {
406 gpiod_set_value_cansleep(btdev
->wakeup_bt
, 0);
407 pm_runtime_put(&btdev
->serdev
->dev
);
408 btdev
->tx_enabled
= false;
411 dev_dbg(dev
, "protocol setup");
413 /* 0. reset connection */
414 err
= nokia_reset(hu
);
416 dev_err(dev
, "Reset failed: %d", err
);
420 /* 1. negotiate speed etc */
421 err
= nokia_send_negotiation(hu
);
423 dev_err(dev
, "Negotiation failed: %d", err
);
427 /* 2. verify correct setup using alive packet */
428 err
= nokia_send_alive_packet(hu
);
430 dev_err(dev
, "Alive check failed: %d", err
);
434 /* 3. send firmware */
435 err
= nokia_setup_fw(hu
);
437 dev_err(dev
, "Could not setup FW: %d", err
);
441 nokia_flow_control(btdev
->serdev
, false);
442 serdev_device_set_baudrate(btdev
->serdev
, MAX_BAUD_RATE
);
443 nokia_flow_control(btdev
->serdev
, true);
445 if (btdev
->man_id
== NOKIA_ID_BCM2048
) {
446 hu
->hdev
->set_bdaddr
= btbcm_set_bdaddr
;
447 set_bit(HCI_QUIRK_INVALID_BDADDR
, &hu
->hdev
->quirks
);
448 dev_dbg(dev
, "bcm2048 has invalid bluetooth address!");
451 dev_dbg(dev
, "protocol setup done!");
453 gpiod_set_value_cansleep(btdev
->wakeup_bt
, 0);
455 btdev
->tx_enabled
= false;
456 btdev
->initialized
= true;
465 static int nokia_open(struct hci_uart
*hu
)
467 struct device
*dev
= &hu
->serdev
->dev
;
469 dev_dbg(dev
, "protocol open");
471 pm_runtime_enable(dev
);
476 static int nokia_flush(struct hci_uart
*hu
)
478 struct nokia_bt_dev
*btdev
= hu
->priv
;
480 dev_dbg(&btdev
->serdev
->dev
, "flush device");
482 skb_queue_purge(&btdev
->txq
);
487 static int nokia_close(struct hci_uart
*hu
)
489 struct nokia_bt_dev
*btdev
= hu
->priv
;
490 struct device
*dev
= &btdev
->serdev
->dev
;
492 dev_dbg(dev
, "close device");
494 btdev
->initialized
= false;
496 skb_queue_purge(&btdev
->txq
);
498 kfree_skb(btdev
->rx_skb
);
501 gpiod_set_value(btdev
->reset
, 1);
502 gpiod_set_value(btdev
->wakeup_bt
, 0);
504 pm_runtime_disable(&btdev
->serdev
->dev
);
509 /* Enqueue frame for transmittion (padding, crc, etc) */
510 static int nokia_enqueue(struct hci_uart
*hu
, struct sk_buff
*skb
)
512 struct nokia_bt_dev
*btdev
= hu
->priv
;
515 /* Prepend skb with frame type */
516 memcpy(skb_push(skb
, 1), &bt_cb(skb
)->pkt_type
, 1);
518 /* Packets must be word aligned */
520 err
= skb_pad(skb
, 1);
526 skb_queue_tail(&btdev
->txq
, skb
);
531 static int nokia_recv_negotiation_packet(struct hci_dev
*hdev
,
534 struct hci_uart
*hu
= hci_get_drvdata(hdev
);
535 struct nokia_bt_dev
*btdev
= hu
->priv
;
536 struct device
*dev
= &btdev
->serdev
->dev
;
537 struct hci_nokia_neg_hdr
*hdr
;
538 struct hci_nokia_neg_evt
*evt
;
541 hdr
= (struct hci_nokia_neg_hdr
*)skb
->data
;
542 if (hdr
->dlen
!= sizeof(*evt
)) {
543 btdev
->init_error
= -EIO
;
548 evt
= skb_pull(skb
, sizeof(*hdr
));
550 if (evt
->ack
!= NOKIA_NEG_ACK
) {
551 dev_err(dev
, "Negotiation received: wrong reply");
552 btdev
->init_error
= -EINVAL
;
557 btdev
->man_id
= evt
->man_id
;
558 btdev
->ver_id
= evt
->ver_id
;
560 dev_dbg(dev
, "Negotiation received: baud=%u:clk=%u:manu=%u:vers=%u",
561 evt
->baud
, evt
->sys_clk
, evt
->man_id
, evt
->ver_id
);
564 complete(&btdev
->init_completion
);
569 static int nokia_recv_alive_packet(struct hci_dev
*hdev
, struct sk_buff
*skb
)
571 struct hci_uart
*hu
= hci_get_drvdata(hdev
);
572 struct nokia_bt_dev
*btdev
= hu
->priv
;
573 struct device
*dev
= &btdev
->serdev
->dev
;
574 struct hci_nokia_alive_hdr
*hdr
;
575 struct hci_nokia_alive_pkt
*pkt
;
578 hdr
= (struct hci_nokia_alive_hdr
*)skb
->data
;
579 if (hdr
->dlen
!= sizeof(*pkt
)) {
580 dev_err(dev
, "Corrupted alive message");
581 btdev
->init_error
= -EIO
;
586 pkt
= skb_pull(skb
, sizeof(*hdr
));
588 if (pkt
->mid
!= NOKIA_ALIVE_RESP
) {
589 dev_err(dev
, "Alive received: invalid response: 0x%02x!",
591 btdev
->init_error
= -EINVAL
;
596 dev_dbg(dev
, "Alive received");
599 complete(&btdev
->init_completion
);
604 static int nokia_recv_radio(struct hci_dev
*hdev
, struct sk_buff
*skb
)
606 /* Packets received on the dedicated radio channel are
607 * HCI events and so feed them back into the core.
609 hci_skb_pkt_type(skb
) = HCI_EVENT_PKT
;
610 return hci_recv_frame(hdev
, skb
);
614 static const struct h4_recv_pkt nokia_recv_pkts
[] = {
615 { H4_RECV_ACL
, .recv
= hci_recv_frame
},
616 { H4_RECV_SCO
, .recv
= hci_recv_frame
},
617 { H4_RECV_EVENT
, .recv
= hci_recv_frame
},
618 { NOKIA_RECV_ALIVE
, .recv
= nokia_recv_alive_packet
},
619 { NOKIA_RECV_NEG
, .recv
= nokia_recv_negotiation_packet
},
620 { NOKIA_RECV_RADIO
, .recv
= nokia_recv_radio
},
623 static int nokia_recv(struct hci_uart
*hu
, const void *data
, int count
)
625 struct nokia_bt_dev
*btdev
= hu
->priv
;
626 struct device
*dev
= &btdev
->serdev
->dev
;
629 if (!test_bit(HCI_UART_REGISTERED
, &hu
->flags
))
632 btdev
->rx_skb
= h4_recv_buf(hu
->hdev
, btdev
->rx_skb
, data
, count
,
633 nokia_recv_pkts
, ARRAY_SIZE(nokia_recv_pkts
));
634 if (IS_ERR(btdev
->rx_skb
)) {
635 err
= PTR_ERR(btdev
->rx_skb
);
636 dev_err(dev
, "Frame reassembly failed (%d)", err
);
637 btdev
->rx_skb
= NULL
;
644 static struct sk_buff
*nokia_dequeue(struct hci_uart
*hu
)
646 struct nokia_bt_dev
*btdev
= hu
->priv
;
647 struct device
*dev
= &btdev
->serdev
->dev
;
648 struct sk_buff
*result
= skb_dequeue(&btdev
->txq
);
650 if (!btdev
->initialized
)
653 if (btdev
->tx_enabled
== !!result
)
657 pm_runtime_get_sync(dev
);
658 gpiod_set_value_cansleep(btdev
->wakeup_bt
, 1);
660 serdev_device_wait_until_sent(btdev
->serdev
, 0);
661 gpiod_set_value_cansleep(btdev
->wakeup_bt
, 0);
665 btdev
->tx_enabled
= !!result
;
670 static const struct hci_uart_proto nokia_proto
= {
671 .id
= HCI_UART_NOKIA
,
674 .close
= nokia_close
,
676 .enqueue
= nokia_enqueue
,
677 .dequeue
= nokia_dequeue
,
678 .flush
= nokia_flush
,
679 .setup
= nokia_setup
,
683 static int nokia_bluetooth_serdev_probe(struct serdev_device
*serdev
)
685 struct device
*dev
= &serdev
->dev
;
686 struct nokia_bt_dev
*btdev
;
690 btdev
= devm_kzalloc(dev
, sizeof(*btdev
), GFP_KERNEL
);
694 btdev
->hu
.serdev
= btdev
->serdev
= serdev
;
695 serdev_device_set_drvdata(serdev
, btdev
);
697 btdev
->reset
= devm_gpiod_get(dev
, "reset", GPIOD_OUT_HIGH
);
698 if (IS_ERR(btdev
->reset
)) {
699 err
= PTR_ERR(btdev
->reset
);
700 dev_err(dev
, "could not get reset gpio: %d", err
);
704 btdev
->wakeup_host
= devm_gpiod_get(dev
, "host-wakeup", GPIOD_IN
);
705 if (IS_ERR(btdev
->wakeup_host
)) {
706 err
= PTR_ERR(btdev
->wakeup_host
);
707 dev_err(dev
, "could not get host wakeup gpio: %d", err
);
711 btdev
->wake_irq
= gpiod_to_irq(btdev
->wakeup_host
);
713 err
= devm_request_threaded_irq(dev
, btdev
->wake_irq
, NULL
,
715 IRQF_TRIGGER_RISING
| IRQF_TRIGGER_FALLING
| IRQF_ONESHOT
,
718 dev_err(dev
, "could request wakeup irq: %d", err
);
722 btdev
->wakeup_bt
= devm_gpiod_get(dev
, "bluetooth-wakeup",
724 if (IS_ERR(btdev
->wakeup_bt
)) {
725 err
= PTR_ERR(btdev
->wakeup_bt
);
726 dev_err(dev
, "could not get BT wakeup gpio: %d", err
);
730 sysclk
= devm_clk_get(dev
, "sysclk");
731 if (IS_ERR(sysclk
)) {
732 err
= PTR_ERR(sysclk
);
733 dev_err(dev
, "could not get sysclk: %d", err
);
737 clk_prepare_enable(sysclk
);
738 btdev
->sysclk_speed
= clk_get_rate(sysclk
);
739 clk_disable_unprepare(sysclk
);
741 skb_queue_head_init(&btdev
->txq
);
743 btdev
->hu
.priv
= btdev
;
744 btdev
->hu
.alignment
= 2; /* Nokia H4+ is word aligned */
746 err
= hci_uart_register_device(&btdev
->hu
, &nokia_proto
);
748 dev_err(dev
, "could not register bluetooth uart: %d", err
);
755 static void nokia_bluetooth_serdev_remove(struct serdev_device
*serdev
)
757 struct nokia_bt_dev
*btdev
= serdev_device_get_drvdata(serdev
);
759 hci_uart_unregister_device(&btdev
->hu
);
762 static int nokia_bluetooth_runtime_suspend(struct device
*dev
)
764 struct serdev_device
*serdev
= to_serdev_device(dev
);
766 nokia_flow_control(serdev
, false);
770 static int nokia_bluetooth_runtime_resume(struct device
*dev
)
772 struct serdev_device
*serdev
= to_serdev_device(dev
);
774 nokia_flow_control(serdev
, true);
778 static const struct dev_pm_ops nokia_bluetooth_pm_ops
= {
779 SET_RUNTIME_PM_OPS(nokia_bluetooth_runtime_suspend
,
780 nokia_bluetooth_runtime_resume
,
785 static const struct of_device_id nokia_bluetooth_of_match
[] = {
786 { .compatible
= "nokia,h4p-bluetooth", },
789 MODULE_DEVICE_TABLE(of
, nokia_bluetooth_of_match
);
792 static struct serdev_device_driver nokia_bluetooth_serdev_driver
= {
793 .probe
= nokia_bluetooth_serdev_probe
,
794 .remove
= nokia_bluetooth_serdev_remove
,
796 .name
= "nokia-bluetooth",
797 .pm
= &nokia_bluetooth_pm_ops
,
798 .of_match_table
= of_match_ptr(nokia_bluetooth_of_match
),
802 module_serdev_device_driver(nokia_bluetooth_serdev_driver
);
804 MODULE_AUTHOR("Sebastian Reichel <sre@kernel.org>");
805 MODULE_DESCRIPTION("Bluetooth HCI UART Nokia H4+ driver ver " VERSION
);
806 MODULE_VERSION(VERSION
);
807 MODULE_LICENSE("GPL");