Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

bluetooth: btnxpuart: Support for controller wakeup gpio config

When using the out-of-band WAKE_IN and WAKE_OUT pins, we have to tell
the firmware which pins to use (from controller point of view). This
allows to report remote wakeup support when WAKE_OUT(c2h) is configured.

Signed-off-by: Loic Poulain <loic.poulain@linaro.org>
Reviewed-by: Neeraj Sanjay Kale <neeraj.sanjaykale@nxp.com>
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

authored by

Loic Poulain and committed by
Luiz Augusto von Dentz
873b6754 852cfdc7

+28 -4
+28 -4
drivers/bluetooth/btnxpuart.c
··· 447 447 return PTR_ERR(psdata->h2c_ps_gpio); 448 448 } 449 449 450 - if (!psdata->h2c_ps_gpio) 450 + if (device_property_read_u8(&serdev->dev, "nxp,wakein-pin", &psdata->h2c_wakeup_gpio)) { 451 + psdata->h2c_wakeup_gpio = 0xff; /* 0xff: use default pin/gpio */ 452 + } else if (!psdata->h2c_ps_gpio) { 453 + bt_dev_warn(hdev, "nxp,wakein-pin property without device-wakeup GPIO"); 451 454 psdata->h2c_wakeup_gpio = 0xff; 455 + } 456 + 457 + device_property_read_u8(&serdev->dev, "nxp,wakeout-pin", &psdata->c2h_wakeup_gpio); 452 458 453 459 psdata->hdev = hdev; 454 460 INIT_WORK(&psdata->work, ps_work_func); ··· 546 540 547 541 pcmd.c2h_wakeupmode = psdata->c2h_wakeupmode; 548 542 pcmd.c2h_wakeup_gpio = psdata->c2h_wakeup_gpio; 543 + pcmd.h2c_wakeup_gpio = 0xff; 549 544 switch (psdata->h2c_wakeupmode) { 550 545 case WAKEUP_METHOD_GPIO: 551 546 pcmd.h2c_wakeupmode = BT_CTRL_WAKEUP_METHOD_GPIO; 547 + pcmd.h2c_wakeup_gpio = psdata->h2c_wakeup_gpio; 552 548 break; 553 549 case WAKEUP_METHOD_DTR: 554 550 pcmd.h2c_wakeupmode = BT_CTRL_WAKEUP_METHOD_DSR; ··· 560 552 pcmd.h2c_wakeupmode = BT_CTRL_WAKEUP_METHOD_BREAK; 561 553 break; 562 554 } 563 - pcmd.h2c_wakeup_gpio = 0xff; 564 555 565 556 skb = nxp_drv_send_cmd(hdev, HCI_NXP_WAKEUP_METHOD, sizeof(pcmd), &pcmd); 566 557 if (IS_ERR(skb)) { ··· 593 586 usleep_range(5000, 10000); 594 587 595 588 psdata->ps_state = PS_STATE_AWAKE; 596 - psdata->c2h_wakeupmode = BT_HOST_WAKEUP_METHOD_NONE; 597 - psdata->c2h_wakeup_gpio = 0xff; 589 + 590 + if (psdata->c2h_wakeup_gpio) { 591 + psdata->c2h_wakeupmode = BT_HOST_WAKEUP_METHOD_GPIO; 592 + } else { 593 + psdata->c2h_wakeupmode = BT_HOST_WAKEUP_METHOD_NONE; 594 + psdata->c2h_wakeup_gpio = 0xff; 595 + } 598 596 599 597 psdata->cur_h2c_wakeupmode = WAKEUP_METHOD_INVALID; 600 598 if (psdata->h2c_ps_gpio) ··· 1278 1266 return 0; 1279 1267 } 1280 1268 1269 + static bool nxp_wakeup(struct hci_dev *hdev) 1270 + { 1271 + struct btnxpuart_dev *nxpdev = hci_get_drvdata(hdev); 1272 + struct ps_data *psdata = &nxpdev->psdata; 1273 + 1274 + if (psdata->c2h_wakeupmode != BT_HOST_WAKEUP_METHOD_NONE) 1275 + return true; 1276 + 1277 + return false; 1278 + } 1279 + 1281 1280 static int btnxpuart_queue_skb(struct hci_dev *hdev, struct sk_buff *skb) 1282 1281 { 1283 1282 struct btnxpuart_dev *nxpdev = hci_get_drvdata(hdev); ··· 1569 1546 hdev->send = nxp_enqueue; 1570 1547 hdev->hw_error = nxp_hw_err; 1571 1548 hdev->shutdown = nxp_shutdown; 1549 + hdev->wakeup = nxp_wakeup; 1572 1550 SET_HCIDEV_DEV(hdev, &serdev->dev); 1573 1551 1574 1552 if (hci_register_dev(hdev) < 0) {