Lines Matching +full:pm +full:- +full:alive

1 // SPDX-License-Identifier: GPL-2.0-or-later
6 * Copyright (C) 2015-2017 Sebastian Reichel <[email protected]>
160 struct device *dev = &btdev->serdev->dev; in wakeup_handler()
161 int wake_state = gpiod_get_value(btdev->wakeup_host); in wakeup_handler()
163 if (btdev->rx_enabled == wake_state) in wakeup_handler()
171 btdev->rx_enabled = wake_state; in wakeup_handler()
178 struct nokia_bt_dev *btdev = hu->priv; in nokia_reset()
179 struct device *dev = &btdev->serdev->dev; in nokia_reset()
183 gpiod_set_value_cansleep(btdev->reset, 1); in nokia_reset()
184 gpiod_set_value_cansleep(btdev->wakeup_bt, 1); in nokia_reset()
189 err = gpiod_get_value_cansleep(btdev->wakeup_host); in nokia_reset()
192 return -EPROTO; in nokia_reset()
196 serdev_device_write_flush(btdev->serdev); in nokia_reset()
199 nokia_flow_control(btdev->serdev, false); in nokia_reset()
200 serdev_device_set_baudrate(btdev->serdev, INIT_BAUD_RATE); in nokia_reset()
202 gpiod_set_value_cansleep(btdev->reset, 0); in nokia_reset()
205 err = serdev_device_wait_for_cts(btdev->serdev, true, 200); in nokia_reset()
211 nokia_flow_control(btdev->serdev, true); in nokia_reset()
218 struct nokia_bt_dev *btdev = hu->priv; in nokia_send_alive_packet()
219 struct device *dev = &btdev->serdev->dev; in nokia_send_alive_packet()
225 init_completion(&btdev->init_completion); in nokia_send_alive_packet()
230 return -ENOMEM; in nokia_send_alive_packet()
233 memset(skb->data, 0x00, len); in nokia_send_alive_packet()
236 hdr->dlen = sizeof(*pkt); in nokia_send_alive_packet()
238 pkt->mid = NOKIA_ALIVE_REQ; in nokia_send_alive_packet()
243 dev_dbg(dev, "Alive sent"); in nokia_send_alive_packet()
245 if (!wait_for_completion_interruptible_timeout(&btdev->init_completion, in nokia_send_alive_packet()
247 return -ETIMEDOUT; in nokia_send_alive_packet()
250 if (btdev->init_error < 0) in nokia_send_alive_packet()
251 return btdev->init_error; in nokia_send_alive_packet()
258 struct nokia_bt_dev *btdev = hu->priv; in nokia_send_negotiation()
259 struct device *dev = &btdev->serdev->dev; in nokia_send_negotiation()
264 u16 baud = DIV_ROUND_CLOSEST(btdev->sysclk_speed * 10, SETUP_BAUD_RATE); in nokia_send_negotiation()
265 int sysclk = btdev->sysclk_speed / 1000; in nokia_send_negotiation()
270 return -ENOMEM; in nokia_send_negotiation()
275 neg_hdr->dlen = sizeof(*neg_cmd); in nokia_send_negotiation()
278 neg_cmd->ack = NOKIA_NEG_REQ; in nokia_send_negotiation()
279 neg_cmd->baud = cpu_to_le16(baud); in nokia_send_negotiation()
280 neg_cmd->unused1 = 0x0000; in nokia_send_negotiation()
281 neg_cmd->proto = NOKIA_PROTO_BYTE; in nokia_send_negotiation()
282 neg_cmd->sys_clk = cpu_to_le16(sysclk); in nokia_send_negotiation()
283 neg_cmd->unused2 = 0x0000; in nokia_send_negotiation()
285 btdev->init_error = 0; in nokia_send_negotiation()
286 init_completion(&btdev->init_completion); in nokia_send_negotiation()
293 if (!wait_for_completion_interruptible_timeout(&btdev->init_completion, in nokia_send_negotiation()
295 return -ETIMEDOUT; in nokia_send_negotiation()
298 if (btdev->init_error < 0) in nokia_send_negotiation()
299 return btdev->init_error; in nokia_send_negotiation()
305 nokia_flow_control(btdev->serdev, false); in nokia_send_negotiation()
306 serdev_device_set_baudrate(btdev->serdev, SETUP_BAUD_RATE); in nokia_send_negotiation()
307 err = serdev_device_wait_for_cts(btdev->serdev, true, 200); in nokia_send_negotiation()
312 nokia_flow_control(btdev->serdev, true); in nokia_send_negotiation()
321 struct nokia_bt_dev *btdev = hu->priv; in nokia_setup_fw()
322 struct device *dev = &btdev->serdev->dev; in nokia_setup_fw()
331 if (btdev->man_id == NOKIA_ID_BCM2048) { in nokia_setup_fw()
333 } else if (btdev->man_id == NOKIA_ID_TI1271) { in nokia_setup_fw()
337 return -ENODEV; in nokia_setup_fw()
343 hu->hdev->name, err); in nokia_setup_fw()
347 fw_ptr = fw->data; in nokia_setup_fw()
348 fw_size = fw->size; in nokia_setup_fw()
360 opcode = le16_to_cpu(cmd->opcode); in nokia_setup_fw()
362 skb = __hci_cmd_sync(hu->hdev, opcode, cmd->plen, in nokia_setup_fw()
368 hu->hdev->name, opcode, err); in nokia_setup_fw()
380 fw_size -= pkt_size + 2; in nokia_setup_fw()
390 struct nokia_bt_dev *btdev = hu->priv; in nokia_setup()
391 struct device *dev = &btdev->serdev->dev; in nokia_setup()
394 btdev->initialized = false; in nokia_setup()
396 nokia_flow_control(btdev->serdev, false); in nokia_setup()
400 if (btdev->tx_enabled) { in nokia_setup()
401 gpiod_set_value_cansleep(btdev->wakeup_bt, 0); in nokia_setup()
402 pm_runtime_put(&btdev->serdev->dev); in nokia_setup()
403 btdev->tx_enabled = false; in nokia_setup()
422 /* 2. verify correct setup using alive packet */ in nokia_setup()
425 dev_err(dev, "Alive check failed: %d", err); in nokia_setup()
436 nokia_flow_control(btdev->serdev, false); in nokia_setup()
437 serdev_device_set_baudrate(btdev->serdev, MAX_BAUD_RATE); in nokia_setup()
438 nokia_flow_control(btdev->serdev, true); in nokia_setup()
440 if (btdev->man_id == NOKIA_ID_BCM2048) { in nokia_setup()
441 hu->hdev->set_bdaddr = btbcm_set_bdaddr; in nokia_setup()
442 set_bit(HCI_QUIRK_INVALID_BDADDR, &hu->hdev->quirks); in nokia_setup()
448 gpiod_set_value_cansleep(btdev->wakeup_bt, 0); in nokia_setup()
450 btdev->tx_enabled = false; in nokia_setup()
451 btdev->initialized = true; in nokia_setup()
462 struct device *dev = &hu->serdev->dev; in nokia_open()
473 struct nokia_bt_dev *btdev = hu->priv; in nokia_flush()
475 dev_dbg(&btdev->serdev->dev, "flush device"); in nokia_flush()
477 skb_queue_purge(&btdev->txq); in nokia_flush()
484 struct nokia_bt_dev *btdev = hu->priv; in nokia_close()
485 struct device *dev = &btdev->serdev->dev; in nokia_close()
489 btdev->initialized = false; in nokia_close()
491 skb_queue_purge(&btdev->txq); in nokia_close()
493 kfree_skb(btdev->rx_skb); in nokia_close()
496 gpiod_set_value(btdev->reset, 1); in nokia_close()
497 gpiod_set_value(btdev->wakeup_bt, 0); in nokia_close()
499 pm_runtime_disable(&btdev->serdev->dev); in nokia_close()
507 struct nokia_bt_dev *btdev = hu->priv; in nokia_enqueue()
511 memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1); in nokia_enqueue()
514 if (skb->len % 2) { in nokia_enqueue()
521 skb_queue_tail(&btdev->txq, skb); in nokia_enqueue()
530 struct nokia_bt_dev *btdev = hu->priv; in nokia_recv_negotiation_packet()
531 struct device *dev = &btdev->serdev->dev; in nokia_recv_negotiation_packet()
536 hdr = (struct hci_nokia_neg_hdr *)skb->data; in nokia_recv_negotiation_packet()
537 if (hdr->dlen != sizeof(*evt)) { in nokia_recv_negotiation_packet()
538 btdev->init_error = -EIO; in nokia_recv_negotiation_packet()
539 ret = -EIO; in nokia_recv_negotiation_packet()
545 if (evt->ack != NOKIA_NEG_ACK) { in nokia_recv_negotiation_packet()
547 btdev->init_error = -EINVAL; in nokia_recv_negotiation_packet()
548 ret = -EINVAL; in nokia_recv_negotiation_packet()
552 btdev->man_id = evt->man_id; in nokia_recv_negotiation_packet()
553 btdev->ver_id = evt->ver_id; in nokia_recv_negotiation_packet()
556 evt->baud, evt->sys_clk, evt->man_id, evt->ver_id); in nokia_recv_negotiation_packet()
559 complete(&btdev->init_completion); in nokia_recv_negotiation_packet()
567 struct nokia_bt_dev *btdev = hu->priv; in nokia_recv_alive_packet()
568 struct device *dev = &btdev->serdev->dev; in nokia_recv_alive_packet()
573 hdr = (struct hci_nokia_alive_hdr *)skb->data; in nokia_recv_alive_packet()
574 if (hdr->dlen != sizeof(*pkt)) { in nokia_recv_alive_packet()
575 dev_err(dev, "Corrupted alive message"); in nokia_recv_alive_packet()
576 btdev->init_error = -EIO; in nokia_recv_alive_packet()
577 ret = -EIO; in nokia_recv_alive_packet()
583 if (pkt->mid != NOKIA_ALIVE_RESP) { in nokia_recv_alive_packet()
584 dev_err(dev, "Alive received: invalid response: 0x%02x!", in nokia_recv_alive_packet()
585 pkt->mid); in nokia_recv_alive_packet()
586 btdev->init_error = -EINVAL; in nokia_recv_alive_packet()
587 ret = -EINVAL; in nokia_recv_alive_packet()
591 dev_dbg(dev, "Alive received"); in nokia_recv_alive_packet()
594 complete(&btdev->init_completion); in nokia_recv_alive_packet()
620 struct nokia_bt_dev *btdev = hu->priv; in nokia_recv()
621 struct device *dev = &btdev->serdev->dev; in nokia_recv()
624 if (!test_bit(HCI_UART_REGISTERED, &hu->flags)) in nokia_recv()
625 return -EUNATCH; in nokia_recv()
627 btdev->rx_skb = h4_recv_buf(hu->hdev, btdev->rx_skb, data, count, in nokia_recv()
629 if (IS_ERR(btdev->rx_skb)) { in nokia_recv()
630 err = PTR_ERR(btdev->rx_skb); in nokia_recv()
632 btdev->rx_skb = NULL; in nokia_recv()
641 struct nokia_bt_dev *btdev = hu->priv; in nokia_dequeue()
642 struct device *dev = &btdev->serdev->dev; in nokia_dequeue()
643 struct sk_buff *result = skb_dequeue(&btdev->txq); in nokia_dequeue()
645 if (!btdev->initialized) in nokia_dequeue()
648 if (btdev->tx_enabled == !!result) in nokia_dequeue()
653 gpiod_set_value_cansleep(btdev->wakeup_bt, 1); in nokia_dequeue()
655 serdev_device_wait_until_sent(btdev->serdev, 0); in nokia_dequeue()
656 gpiod_set_value_cansleep(btdev->wakeup_bt, 0); in nokia_dequeue()
660 btdev->tx_enabled = !!result; in nokia_dequeue()
680 struct device *dev = &serdev->dev; in nokia_bluetooth_serdev_probe()
687 return -ENOMEM; in nokia_bluetooth_serdev_probe()
689 btdev->hu.serdev = btdev->serdev = serdev; in nokia_bluetooth_serdev_probe()
692 btdev->reset = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH); in nokia_bluetooth_serdev_probe()
693 if (IS_ERR(btdev->reset)) { in nokia_bluetooth_serdev_probe()
694 err = PTR_ERR(btdev->reset); in nokia_bluetooth_serdev_probe()
699 btdev->wakeup_host = devm_gpiod_get(dev, "host-wakeup", GPIOD_IN); in nokia_bluetooth_serdev_probe()
700 if (IS_ERR(btdev->wakeup_host)) { in nokia_bluetooth_serdev_probe()
701 err = PTR_ERR(btdev->wakeup_host); in nokia_bluetooth_serdev_probe()
706 btdev->wake_irq = gpiod_to_irq(btdev->wakeup_host); in nokia_bluetooth_serdev_probe()
708 err = devm_request_threaded_irq(dev, btdev->wake_irq, NULL, in nokia_bluetooth_serdev_probe()
717 btdev->wakeup_bt = devm_gpiod_get(dev, "bluetooth-wakeup", in nokia_bluetooth_serdev_probe()
719 if (IS_ERR(btdev->wakeup_bt)) { in nokia_bluetooth_serdev_probe()
720 err = PTR_ERR(btdev->wakeup_bt); in nokia_bluetooth_serdev_probe()
737 btdev->sysclk_speed = clk_get_rate(sysclk); in nokia_bluetooth_serdev_probe()
740 skb_queue_head_init(&btdev->txq); in nokia_bluetooth_serdev_probe()
742 btdev->hu.priv = btdev; in nokia_bluetooth_serdev_probe()
743 btdev->hu.alignment = 2; /* Nokia H4+ is word aligned */ in nokia_bluetooth_serdev_probe()
745 err = hci_uart_register_device(&btdev->hu, &nokia_proto); in nokia_bluetooth_serdev_probe()
758 hci_uart_unregister_device(&btdev->hu); in nokia_bluetooth_serdev_remove()
785 { .compatible = "nokia,h4p-bluetooth", },
795 .name = "nokia-bluetooth",
796 .pm = &nokia_bluetooth_pm_ops,